using SharpDX; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Xml; using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; using CodeWalker.World; namespace CodeWalker.GameFiles { //this is a helper class for parsing the data. public static class MetaTypes { public static Dictionary EnumDict = new Dictionary(); public static Dictionary StructDict = new Dictionary(); public static void Clear() { StructDict.Clear(); } public static void EnsureMetaTypes(Meta meta) { if (meta.EnumInfos != null) { foreach (MetaEnumInfo mei in meta.EnumInfos) { if (!EnumDict.ContainsKey(mei.EnumKey)) { EnumDict.Add(mei.EnumKey, mei); } else { MetaEnumInfo oldei = EnumDict[mei.EnumKey]; if (!CompareMetaEnumInfos(oldei, mei)) { } } } } if (meta.StructureInfos != null) { foreach (MetaStructureInfo msi in meta.StructureInfos) { if (!StructDict.ContainsKey(msi.StructureKey)) { StructDict.Add(msi.StructureKey, msi); } else { MetaStructureInfo oldsi = StructDict[msi.StructureKey]; if (!CompareMetaStructureInfos(oldsi, msi)) { } } } } } public static bool CompareMetaEnumInfos(MetaEnumInfo a, MetaEnumInfo b) { //returns true if they are the same. if (a.Entries.Length != b.Entries.Length) { return false; } for (int i = 0; i < a.Entries.Length; i++) { if ((a.Entries[i].EntryNameHash != b.Entries[i].EntryNameHash) || (a.Entries[i].EntryValue != b.Entries[i].EntryValue)) { return false; } } return true; } public static bool CompareMetaStructureInfos(MetaStructureInfo a, MetaStructureInfo b) { //returns true if they are the same. if (a.Entries.Length != b.Entries.Length) { return false; } for (int i = 0; i < a.Entries.Length; i++) { if ((a.Entries[i].EntryNameHash != b.Entries[i].EntryNameHash) || (a.Entries[i].DataOffset != b.Entries[i].DataOffset) || (a.Entries[i].DataType != b.Entries[i].DataType)) { return false; } } return true; } public static string GetTypesString() { StringBuilder sbe = new StringBuilder(); StringBuilder sbs = new StringBuilder(); sbe.AppendLine("//Enum infos"); sbs.AppendLine("//Struct infos"); foreach (var kvp in EnumDict) { var mei = kvp.Value; string name = GetSafeName(mei.EnumNameHash, mei.EnumKey); sbe.AppendLine("public enum " + name + " //Key:" + mei.EnumKey.ToString()); sbe.AppendLine("{"); foreach (var entry in mei.Entries) { string eename = GetSafeName(entry.EntryNameHash, (uint)entry.EntryValue); sbe.AppendFormat(" {0} = {1},", eename, entry.EntryValue); sbe.AppendLine(); } sbe.AppendLine("}"); sbe.AppendLine(); } foreach (var kvp in StructDict) { var msi = kvp.Value; string name = GetSafeName(msi.StructureNameHash, msi.StructureKey); sbs.AppendLine("public struct " + name + " //" + msi.StructureSize.ToString() + " bytes, Key:" + msi.StructureKey.ToString()); sbs.AppendLine("{"); for (int i = 0; i < msi.Entries.Length; i++) { var entry = msi.Entries[i]; if ((entry.DataOffset == 0) && (entry.EntryNameHash == MetaName.ARRAYINFO)) //referred to by array { } else { string sename = GetSafeName(entry.EntryNameHash, (uint)entry.ReferenceKey); string fmt = " public {0} {1}; //{2} {3}"; if (entry.DataType == MetaStructureEntryDataType.Array) { if (entry.ReferenceTypeIndex >= msi.Entries.Length) { } else { var structentry = msi.Entries[entry.ReferenceTypeIndex]; var typename = "Array_" + MetaStructureEntryDataTypes.GetCSharpTypeName(structentry.DataType); sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry.ToString() + " {" + structentry.ToString() + "}"); sbs.AppendLine(); } } else if (entry.DataType == MetaStructureEntryDataType.Structure) { var typename = GetSafeName(entry.ReferenceKey, (uint)entry.ReferenceTypeIndex); sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry.ToString()); sbs.AppendLine(); } else { var typename = MetaStructureEntryDataTypes.GetCSharpTypeName(entry.DataType); sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry); sbs.AppendLine(); } } } sbs.AppendLine("}"); sbs.AppendLine(); } sbe.AppendLine(); sbe.AppendLine(); sbe.AppendLine(); sbe.AppendLine(); sbe.AppendLine(); sbe.Append(sbs.ToString()); string result = sbe.ToString(); return result; } public static string GetTypesInitString(Meta meta) { StringBuilder sb = new StringBuilder(); foreach (var si in meta.StructureInfos) { sb.AppendFormat("return new MetaStructureInfo(MetaName.{0}, {1}, {2}, {3},", si.StructureNameHash, si.StructureKey, si.Unknown_8h, si.StructureSize); sb.AppendLine(); for (int i = 0; i < si.Entries.Length; i++) { var e = si.Entries[i]; string refkey = "0"; if (e.ReferenceKey != 0) { refkey = "MetaName." + e.ReferenceKey.ToString(); } sb.AppendFormat("new MetaStructureEntryInfo_s(MetaName.{0}, {1}, MetaStructureEntryDataType.{2}, {3}, {4}, {5})", e.EntryNameHash, e.DataOffset, e.DataType, e.Unknown_9h, e.ReferenceTypeIndex, refkey); if (i < si.Entries.Length - 1) sb.Append(","); sb.AppendLine(); } sb.AppendFormat(");"); sb.AppendLine(); } sb.AppendLine(); foreach (var ei in meta.EnumInfos) { sb.AppendFormat("return new MetaEnumInfo(MetaName.{0}, {1},", ei.EnumNameHash, ei.EnumKey); sb.AppendLine(); for (int i = 0; i < ei.Entries.Length; i++) { var e = ei.Entries[i]; sb.AppendFormat("new MetaEnumEntryInfo_s(MetaName.{0}, {1})", e.EntryNameHash, e.EntryValue); if (i < ei.Entries.Length - 1) sb.Append(","); sb.AppendLine(); } sb.AppendFormat(");"); sb.AppendLine(); } string str = sb.ToString(); return str; } public static MetaStructureInfo GetStructureInfo(MetaName name) { //to generate structinfos switch (name) { /* YMAP types */ case MetaName.rage__fwInstancedMapData: return new MetaStructureInfo(MetaName.rage__fwInstancedMapData, 1836780118, 768, 48, new MetaStructureEntryInfo_s(MetaName.ImapLink, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwPropInstanceListDef), new MetaStructureEntryInfo_s(MetaName.PropInstanceList, 16, MetaStructureEntryDataType.Array, 0, 1, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwGrassInstanceListDef), new MetaStructureEntryInfo_s(MetaName.GrassInstanceList, 32, MetaStructureEntryDataType.Array, 0, 3, 0) ); case MetaName.CLODLight: return new MetaStructureInfo(MetaName.CLODLight, 2325189228, 768, 136, new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.VECTOR3), new MetaStructureEntryInfo_s(MetaName.direction, 8, MetaStructureEntryDataType.Array, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.falloff, 24, MetaStructureEntryDataType.Array, 0, 2, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.falloffExponent, 40, MetaStructureEntryDataType.Array, 0, 4, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.timeAndStateFlags, 56, MetaStructureEntryDataType.Array, 0, 6, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.hash, 72, MetaStructureEntryDataType.Array, 0, 8, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.coneInnerAngle, 88, MetaStructureEntryDataType.Array, 0, 10, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.coneOuterAngleOrCapExt, 104, MetaStructureEntryDataType.Array, 0, 12, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.coronaIntensity, 120, MetaStructureEntryDataType.Array, 0, 14, 0) ); case MetaName.CDistantLODLight: return new MetaStructureInfo(MetaName.CDistantLODLight, 2820908419, 768, 48, new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.VECTOR3), new MetaStructureEntryInfo_s(MetaName.position, 8, MetaStructureEntryDataType.Array, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.RGBI, 24, MetaStructureEntryDataType.Array, 0, 2, 0), new MetaStructureEntryInfo_s(MetaName.numStreetLights, 40, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.category, 42, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0) ); case MetaName.CBlockDesc: return new MetaStructureInfo(MetaName.CBlockDesc, 2015795449, 768, 72, new MetaStructureEntryInfo_s(MetaName.version, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.flags, 4, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.CharPointer, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.exportedBy, 24, MetaStructureEntryDataType.CharPointer, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.owner, 40, MetaStructureEntryDataType.CharPointer, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.time, 56, MetaStructureEntryDataType.CharPointer, 0, 0, 0) ); case MetaName.CMapData: return new MetaStructureInfo(MetaName.CMapData, 3448101671, 1024, 512, new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.parent, 12, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.flags, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.contentFlags, 20, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.streamingExtentsMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.streamingExtentsMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.entitiesExtentsMin, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.entitiesExtentsMax, 80, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.entities, 96, MetaStructureEntryDataType.Array, 0, 8, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)372253349), new MetaStructureEntryInfo_s(MetaName.containerLods, 112, MetaStructureEntryDataType.Array, 0, 10, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)975711773/*.SectionUNKNOWN7*/), new MetaStructureEntryInfo_s(MetaName.boxOccluders, 128, MetaStructureEntryDataType.Array, 4, 12, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)2741784237/*.SectionUNKNOWN5*/), new MetaStructureEntryInfo_s(MetaName.occludeModels, 144, MetaStructureEntryDataType.Array, 4, 14, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.physicsDictionaries, 160, MetaStructureEntryDataType.Array, 0, 16, 0), new MetaStructureEntryInfo_s(MetaName.instancedData, 176, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwInstancedMapData), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CTimeCycleModifier), new MetaStructureEntryInfo_s(MetaName.timeCycleModifiers, 224, MetaStructureEntryDataType.Array, 0, 19, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CCarGen), new MetaStructureEntryInfo_s(MetaName.carGenerators, 240, MetaStructureEntryDataType.Array, 0, 21, 0), new MetaStructureEntryInfo_s(MetaName.LODLightsSOA, 256, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CLODLight), new MetaStructureEntryInfo_s(MetaName.DistantLODLightsSOA, 392, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CDistantLODLight), new MetaStructureEntryInfo_s(MetaName.block, 440, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CBlockDesc) ); case MetaName.CEntityDef: return new MetaStructureInfo(MetaName.CEntityDef, 1825799514, 1024, 128, new MetaStructureEntryInfo_s(MetaName.archetypeName, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.flags, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.guid, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.position, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.rotation, 48, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.scaleXY, 64, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.scaleZ, 68, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.parentIndex, 72, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.lodDist, 76, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.childLodDist, 80, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.lodLevel, 84, MetaStructureEntryDataType.IntEnum, 0, 0, (MetaName)1264241711), new MetaStructureEntryInfo_s(MetaName.numChildren, 88, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.priorityLevel, 92, MetaStructureEntryDataType.IntEnum, 0, 0, (MetaName)648413703), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.extensions, 96, MetaStructureEntryDataType.Array, 0, 13, 0), new MetaStructureEntryInfo_s(MetaName.ambientOcclusionMultiplier, 112, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.artificialAmbientOcclusion, 116, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.tintValue, 120, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) ); case MetaName.CTimeCycleModifier: return new MetaStructureInfo(MetaName.CTimeCycleModifier, 2683420777, 1024, 64, new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.minExtents, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.maxExtents, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.percentage, 48, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.range, 52, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.startHour, 56, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.endHour, 60, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) ); case MetaName.CCarGen: return new MetaStructureInfo(MetaName.CCarGen, 2345238261, 1024, 80, new MetaStructureEntryInfo_s(MetaName.position, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.orientX, 32, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.orientY, 36, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.perpendicularLength, 40, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.carModel, 44, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.flags, 48, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.bodyColorRemap1, 52, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.bodyColorRemap2, 56, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.bodyColorRemap3, 60, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.bodyColorRemap4, 64, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.popGroup, 68, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.livery, 72, MetaStructureEntryDataType.SignedByte, 0, 0, 0) ); case MetaName.CExtensionDefLightEffect: return new MetaStructureInfo(MetaName.CExtensionDefLightEffect, 2436199897, 1024, 48, new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.offsetPosition, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CLightAttrDef), new MetaStructureEntryInfo_s(MetaName.instances, 32, MetaStructureEntryDataType.Array, 0, 2, 0) ); case MetaName.CLightAttrDef: return new MetaStructureInfo(MetaName.CLightAttrDef, 2363260268, 768, 160, new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.posn, 8, MetaStructureEntryDataType.ArrayOfBytes, 0, 0, (MetaName)3), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.colour, 20, MetaStructureEntryDataType.ArrayOfBytes, 0, 2, (MetaName)3), new MetaStructureEntryInfo_s(MetaName.flashiness, 23, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.intensity, 24, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.flags, 28, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.boneTag, 32, MetaStructureEntryDataType.SignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.lightType, 34, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.groupId, 35, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.timeFlags, 36, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.falloff, 40, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.falloffExponent, 44, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.cullingPlane, 48, MetaStructureEntryDataType.ArrayOfBytes, 0, 13, (MetaName)4), new MetaStructureEntryInfo_s(MetaName.shadowBlur, 64, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.padding1, 65, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.padding2, 66, MetaStructureEntryDataType.SignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.padding3, 68, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.volIntensity, 72, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.volSizeScale, 76, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.volOuterColour, 80, MetaStructureEntryDataType.ArrayOfBytes, 0, 21, (MetaName)3), new MetaStructureEntryInfo_s(MetaName.lightHash, 83, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.volOuterIntensity, 84, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.coronaSize, 88, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.volOuterExponent, 92, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.lightFadeDistance, 96, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.shadowFadeDistance, 97, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.specularFadeDistance, 98, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.volumetricFadeDistance, 99, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.shadowNearClip, 100, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.coronaIntensity, 104, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.coronaZBias, 108, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.direction, 112, MetaStructureEntryDataType.ArrayOfBytes, 0, 34, (MetaName)3), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.tangent, 124, MetaStructureEntryDataType.ArrayOfBytes, 0, 36, (MetaName)3), new MetaStructureEntryInfo_s(MetaName.coneInnerAngle, 136, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.coneOuterAngle, 140, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.extents, 144, MetaStructureEntryDataType.ArrayOfBytes, 0, 40, (MetaName)3), new MetaStructureEntryInfo_s(MetaName.projectedTextureKey, 156, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) ); case MetaName.CExtensionDefSpawnPointOverride: return new MetaStructureInfo(MetaName.CExtensionDefSpawnPointOverride, 2551875873, 1024, 64, new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.offsetPosition, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ScenarioType, 32, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iTimeStartOverride, 36, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iTimeEndOverride, 37, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.Group, 40, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ModelSet, 44, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.AvailabilityInMpSp, 48, MetaStructureEntryDataType.IntEnum, 0, 0, (MetaName)3573596290), new MetaStructureEntryInfo_s(MetaName.Flags, 52, MetaStructureEntryDataType.IntFlags2, 0, 32, (MetaName)700327466), new MetaStructureEntryInfo_s(MetaName.Radius, 56, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.TimeTillPedLeaves, 60, MetaStructureEntryDataType.Float, 0, 0, 0) ); case MetaName.CExtensionDefDoor: return new MetaStructureInfo(MetaName.CExtensionDefDoor, 2671601385, 1024, 48, new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.offsetPosition, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.enableLimitAngle, 32, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.startsLocked, 33, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.canBreak, 34, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.limitAngle, 36, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.doorTargetRatio, 40, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.audioHash, 44, MetaStructureEntryDataType.Hash, 0, 0, 0) ); case MetaName.rage__phVerletClothCustomBounds: return new MetaStructureInfo(MetaName.rage__phVerletClothCustomBounds, 2075461750, 768, 32, new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)1701774085/*.SectionUNKNOWN1*/), new MetaStructureEntryInfo_s(MetaName.CollisionData, 16, MetaStructureEntryDataType.Array, 0, 1, 0) ); case (MetaName)1701774085/*.SectionUNKNOWN1*/: return new MetaStructureInfo((MetaName)1701774085/*.SectionUNKNOWN1*/, 2859775340, 1024, 96, new MetaStructureEntryInfo_s(MetaName.OwnerName, 0, MetaStructureEntryDataType.CharPointer, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.Rotation, 16, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.Position, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.Normal, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.CapsuleRadius, 64, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.CapsuleLen, 68, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.CapsuleHalfHeight, 72, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.CapsuleHalfWidth, 76, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.Flags, 80, MetaStructureEntryDataType.IntFlags2, 0, 32, (MetaName)3044470860) ); /* SCENARIO types */ case MetaName.CScenarioPointContainer: return new MetaStructureInfo(MetaName.CScenarioPointContainer, 2489654897, 768, 48, new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CExtensionDefSpawnPoint), new MetaStructureEntryInfo_s(MetaName.LoadSavePoints, 0, MetaStructureEntryDataType.Array, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioPoint), new MetaStructureEntryInfo_s(MetaName.MyPoints, 16, MetaStructureEntryDataType.Array, 0, 2, 0) ); case (MetaName)4023740759: return new MetaStructureInfo((MetaName)4023740759, 88255871, 768, 88, new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChainingNode), new MetaStructureEntryInfo_s(MetaName.Nodes, 0, MetaStructureEntryDataType.Array, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChainingEdge), new MetaStructureEntryInfo_s(MetaName.Edges, 16, MetaStructureEntryDataType.Array, 0, 2, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChain), new MetaStructureEntryInfo_s(MetaName.Chains, 32, MetaStructureEntryDataType.Array, 0, 4, 0) ); case MetaName.rage__spdGrid2D: return new MetaStructureInfo(MetaName.rage__spdGrid2D, 894636096, 768, 64, new MetaStructureEntryInfo_s((MetaName)860552138, 12, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)3824598937, 16, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)496029782, 20, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)3374647798, 24, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)2690909759, 44, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)3691675019, 48, MetaStructureEntryDataType.Float, 0, 0, 0) ); case MetaName.CScenarioPointLookUps: return new MetaStructureInfo(MetaName.CScenarioPointLookUps, 2669361587, 768, 96, new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.TypeNames, 0, MetaStructureEntryDataType.Array, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.PedModelSetNames, 16, MetaStructureEntryDataType.Array, 0, 2, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.VehicleModelSetNames, 32, MetaStructureEntryDataType.Array, 0, 4, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.GroupNames, 48, MetaStructureEntryDataType.Array, 0, 6, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.InteriorNames, 64, MetaStructureEntryDataType.Array, 0, 8, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.RequiredIMapNames, 80, MetaStructureEntryDataType.Array, 0, 10, 0) ); case MetaName.CScenarioPointRegion: return new MetaStructureInfo(MetaName.CScenarioPointRegion, 3501351821, 768, 376, new MetaStructureEntryInfo_s(MetaName.VersionNumber, 0, MetaStructureEntryDataType.SignedInt, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.Points, 8, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioPointContainer), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioEntityOverride), new MetaStructureEntryInfo_s(MetaName.EntityOverrides, 72, MetaStructureEntryDataType.Array, 0, 2, 0), new MetaStructureEntryInfo_s((MetaName)3696045377, 96, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)4023740759), new MetaStructureEntryInfo_s(MetaName.AccelGrid, 184, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__spdGrid2D), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)3844724227, 248, MetaStructureEntryDataType.Array, 0, 6, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioPointCluster), new MetaStructureEntryInfo_s(MetaName.Clusters, 264, MetaStructureEntryDataType.Array, 0, 8, 0), new MetaStructureEntryInfo_s(MetaName.LookUps, 280, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioPointLookUps) ); case MetaName.CScenarioPoint: return new MetaStructureInfo(MetaName.CScenarioPoint, 402442150, 1024, 64, new MetaStructureEntryInfo_s(MetaName.iType, 21, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ModelSetId, 22, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iInterior, 23, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iRequiredIMapId, 24, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iProbability, 25, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)717991212, 26, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iTimeStartOverride, 27, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iTimeEndOverride, 28, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iRadius, 29, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iTimeTillPedLeaves, 30, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.iScenarioGroup, 32, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.Flags, 36, MetaStructureEntryDataType.IntFlags2, 0, 32, (MetaName)700327466), new MetaStructureEntryInfo_s(MetaName.vPositionAndDirection, 48, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0) ); case MetaName.CScenarioEntityOverride: return new MetaStructureInfo(MetaName.CScenarioEntityOverride, 1271200492, 1024, 80, new MetaStructureEntryInfo_s(MetaName.EntityPosition, 0, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.EntityType, 16, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CExtensionDefSpawnPoint), new MetaStructureEntryInfo_s(MetaName.ScenarioPoints, 24, MetaStructureEntryDataType.Array, 0, 2, 0), new MetaStructureEntryInfo_s((MetaName)538733109, 64, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)1035513142, 65, MetaStructureEntryDataType.Boolean, 0, 0, 0) ); case MetaName.CExtensionDefSpawnPoint: return new MetaStructureInfo(MetaName.CExtensionDefSpawnPoint, 3077340721, 1024, 96, new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.offsetPosition, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.offsetRotation, 32, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.spawnType, 48, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.pedType, 52, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.group, 56, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.interior, 60, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.requiredImap, 64, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.availableInMpSp, 68, MetaStructureEntryDataType.IntEnum, 0, 0, (MetaName)3573596290), new MetaStructureEntryInfo_s(MetaName.probability, 72, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.timeTillPedLeaves, 76, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.radius, 80, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.start, 84, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.end, 85, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.flags, 88, MetaStructureEntryDataType.IntFlags2, 0, 32, (MetaName)700327466), new MetaStructureEntryInfo_s(MetaName.highPri, 92, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.extendedRange, 93, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.shortRange, 94, MetaStructureEntryDataType.Boolean, 0, 0, 0) ); case MetaName.CScenarioChainingNode: return new MetaStructureInfo(MetaName.CScenarioChainingNode, 1811784424, 1024, 32, new MetaStructureEntryInfo_s(MetaName.Position, 0, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)2602393771, 16, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ScenarioType, 20, MetaStructureEntryDataType.Hash, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)407126079, 24, MetaStructureEntryDataType.Boolean, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)1308720135, 25, MetaStructureEntryDataType.Boolean, 0, 0, 0) ); case MetaName.CScenarioChainingEdge: return new MetaStructureInfo(MetaName.CScenarioChainingEdge, 2004985940, 256, 8, new MetaStructureEntryInfo_s(MetaName.NodeIndexFrom, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.NodeIndexTo, 2, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.Action, 4, MetaStructureEntryDataType.ByteEnum, 0, 0, (MetaName)3609807418), new MetaStructureEntryInfo_s(MetaName.NavMode, 5, MetaStructureEntryDataType.ByteEnum, 0, 0, (MetaName)3971773454), new MetaStructureEntryInfo_s(MetaName.NavSpeed, 6, MetaStructureEntryDataType.ByteEnum, 0, 0, (MetaName)941086046) ); case MetaName.CScenarioChain: return new MetaStructureInfo(MetaName.CScenarioChain, 2751910366, 768, 40, new MetaStructureEntryInfo_s((MetaName)1156691834, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), new MetaStructureEntryInfo_s(MetaName.EdgeIds, 8, MetaStructureEntryDataType.Array, 0, 1, 0) ); case MetaName.rage__spdSphere: return new MetaStructureInfo(MetaName.rage__spdSphere, 1189037266, 1024, 16, new MetaStructureEntryInfo_s(MetaName.centerAndRadius, 0, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0) ); case MetaName.CScenarioPointCluster: return new MetaStructureInfo(MetaName.CScenarioPointCluster, 3622480419, 1024, 80, new MetaStructureEntryInfo_s(MetaName.Points, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioPointContainer), new MetaStructureEntryInfo_s(MetaName.ClusterSphere, 48, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__spdSphere), new MetaStructureEntryInfo_s((MetaName)1095875445, 64, MetaStructureEntryDataType.Float, 0, 0, 0), new MetaStructureEntryInfo_s((MetaName)3129415068, 68, MetaStructureEntryDataType.Boolean, 0, 0, 0) ); default: return null; } } public static MetaEnumInfo GetEnumInfo(MetaName name) { //to generate enuminfos switch (name) { case (MetaName)1264241711: return new MetaEnumInfo((MetaName)1264241711, 1856311430, new MetaEnumEntryInfo_s(MetaName.LODTYPES_DEPTH_HD, 0), new MetaEnumEntryInfo_s(MetaName.LODTYPES_DEPTH_LOD, 1), new MetaEnumEntryInfo_s(MetaName.LODTYPES_DEPTH_SLOD1, 2), new MetaEnumEntryInfo_s(MetaName.LODTYPES_DEPTH_SLOD2, 3), new MetaEnumEntryInfo_s(MetaName.LODTYPES_DEPTH_SLOD3, 4), new MetaEnumEntryInfo_s(MetaName.LODTYPES_DEPTH_ORPHANHD, 5), new MetaEnumEntryInfo_s(MetaName.LODTYPES_DEPTH_SLOD4, 6) ); case (MetaName)648413703: return new MetaEnumInfo((MetaName)648413703, 2200357711, new MetaEnumEntryInfo_s(MetaName.PRI_REQUIRED, 0), new MetaEnumEntryInfo_s(MetaName.PRI_OPTIONAL_HIGH, 1), new MetaEnumEntryInfo_s(MetaName.PRI_OPTIONAL_MEDIUM, 2), new MetaEnumEntryInfo_s(MetaName.PRI_OPTIONAL_LOW, 3) ); case (MetaName)3573596290: return new MetaEnumInfo((MetaName)3573596290, 671739257, new MetaEnumEntryInfo_s(MetaName.kBoth, 0), new MetaEnumEntryInfo_s(MetaName.kOnlySp, 1), new MetaEnumEntryInfo_s(MetaName.kOnlyMp, 2) ); case (MetaName)700327466: return new MetaEnumInfo((MetaName)700327466, 2814596095, new MetaEnumEntryInfo_s(MetaName.IgnoreMaxInRange, 0), new MetaEnumEntryInfo_s(MetaName.NoSpawn, 1), new MetaEnumEntryInfo_s(MetaName.StationaryReactions, 2), new MetaEnumEntryInfo_s((MetaName)3257836369, 3), new MetaEnumEntryInfo_s((MetaName)2165609255, 4), new MetaEnumEntryInfo_s(MetaName.ActivateVehicleSiren, 5), new MetaEnumEntryInfo_s((MetaName)2626064871, 6), new MetaEnumEntryInfo_s((MetaName)2004780781, 7), new MetaEnumEntryInfo_s((MetaName)536864854, 8), new MetaEnumEntryInfo_s((MetaName)3441065168, 9), new MetaEnumEntryInfo_s(MetaName.AerialVehiclePoint, 10), new MetaEnumEntryInfo_s(MetaName.TerritorialScenario, 11), new MetaEnumEntryInfo_s((MetaName)3690227693, 12), new MetaEnumEntryInfo_s((MetaName)1601179199, 13), new MetaEnumEntryInfo_s((MetaName)2583152330, 14), new MetaEnumEntryInfo_s((MetaName)3490317520, 15), new MetaEnumEntryInfo_s(MetaName.InWater, 16), new MetaEnumEntryInfo_s((MetaName)1269249358, 17), new MetaEnumEntryInfo_s(MetaName.OpenDoor, 18), new MetaEnumEntryInfo_s(MetaName.PreciseUseTime, 19), new MetaEnumEntryInfo_s((MetaName)2247631388, 20), new MetaEnumEntryInfo_s((MetaName)4100708934, 21), new MetaEnumEntryInfo_s(MetaName.ExtendedRange, 22), new MetaEnumEntryInfo_s(MetaName.ShortRange, 23), new MetaEnumEntryInfo_s(MetaName.HighPriority, 24), new MetaEnumEntryInfo_s(MetaName.IgnoreLoitering, 25), new MetaEnumEntryInfo_s((MetaName)1524211135, 26), new MetaEnumEntryInfo_s(MetaName.ResetNoCollisionOnCleanUp, 27), new MetaEnumEntryInfo_s((MetaName)3304563391, 28), new MetaEnumEntryInfo_s((MetaName)1111379709, 29), new MetaEnumEntryInfo_s((MetaName)176469077, 30) ); case (MetaName)3044470860: return new MetaEnumInfo((MetaName)3044470860, 1585854303, new MetaEnumEntryInfo_s((MetaName)997866013, 0) ); case (MetaName)3609807418: return new MetaEnumInfo((MetaName)3609807418, 3326075799, new MetaEnumEntryInfo_s(MetaName.Move, 0), new MetaEnumEntryInfo_s((MetaName)7865678, 1), new MetaEnumEntryInfo_s(MetaName.MoveFollowMaster, 2) ); case (MetaName)3971773454: return new MetaEnumInfo((MetaName)3971773454, 3016128742, new MetaEnumEntryInfo_s(MetaName.Direct, 0), new MetaEnumEntryInfo_s(MetaName.NavMesh, 1), new MetaEnumEntryInfo_s(MetaName.Roads, 2) ); case (MetaName)941086046: return new MetaEnumInfo((MetaName)941086046, 1112851290, new MetaEnumEntryInfo_s((MetaName)3279574318, 0), new MetaEnumEntryInfo_s((MetaName)2212923970, 1), new MetaEnumEntryInfo_s((MetaName)4022799658, 2), new MetaEnumEntryInfo_s((MetaName)1425672334, 3), new MetaEnumEntryInfo_s((MetaName)957720931, 4), new MetaEnumEntryInfo_s((MetaName)3795195414, 5), new MetaEnumEntryInfo_s((MetaName)2834622009, 6), new MetaEnumEntryInfo_s((MetaName)1876554076, 7), new MetaEnumEntryInfo_s((MetaName)698543797, 8), new MetaEnumEntryInfo_s((MetaName)1544199634, 9), new MetaEnumEntryInfo_s((MetaName)2725613303, 10), new MetaEnumEntryInfo_s((MetaName)4033265820, 11), new MetaEnumEntryInfo_s((MetaName)3054809929, 12), new MetaEnumEntryInfo_s((MetaName)3911005380, 13), new MetaEnumEntryInfo_s((MetaName)3717649022, 14), new MetaEnumEntryInfo_s((MetaName)3356026130, 15) ); default: return null; } } private static string GetSafeName(MetaName namehash, uint key) { string name = namehash.ToString(); if (string.IsNullOrEmpty(name)) { name = "Unk_" + key; } if (!char.IsLetter(name[0])) { name = "Unk_" + name; } return name; } public static byte[] ConvertToBytes(T item) where T : struct { int size = Marshal.SizeOf(typeof(T)); int offset = 0; byte[] arr = new byte[size]; IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(item, ptr, true); Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr); offset += size; return arr; } public static byte[] ConvertArrayToBytes(params T[] items) where T : struct { if (items == null) return null; int size = Marshal.SizeOf(typeof(T)); int sizetot = size * items.Length; byte[] arrout = new byte[sizetot]; int offset = 0; for (int i = 0; i < items.Length; i++) { byte[] arr = new byte[size]; IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(items[i], ptr, true); Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr); Buffer.BlockCopy(arr, 0, arrout, offset, size); offset += size; } return arrout; } public static T ConvertData(byte[] data) where T : struct { GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); var h = handle.AddrOfPinnedObject(); var r = Marshal.PtrToStructure(h); handle.Free(); return r; } public static T ConvertData(byte[] data, int offset) where T : struct { GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); var h = handle.AddrOfPinnedObject(); var r = Marshal.PtrToStructure(h + offset); handle.Free(); return r; } public static T[] ConvertDataArray(byte[] data, int offset, int count) where T : struct { T[] items = new T[count]; int itemsize = Marshal.SizeOf(typeof(T)); for (int i = 0; i < count; i++) { int off = offset + i * itemsize; items[i] = ConvertData(data, off); } return items; } public static T[] ConvertDataArray(Meta meta, MetaName name, Array_StructurePointer array) where T : struct { //return ConvertDataArray(meta, name, array.Pointer, array.Count1); uint count = array.Count1; if (count == 0) return null; MetaPOINTER[] ptrs = GetPointerArray(meta, array); if (ptrs == null) return null; if (ptrs.Length < count) { return null; } T[] items = new T[count]; int itemsize = Marshal.SizeOf(typeof(T)); int itemsleft = (int)count; //large arrays get split into chunks... //MetaName blocktype = 0; for (int i = 0; i < count; i++) { var sptr = ptrs[i]; int blocki = sptr.BlockID - 1; int offset = sptr.ItemOffset * 16;//block data size... if (blocki >= meta.DataBlocks.Count) { continue; } var block = meta.DataBlocks[blocki]; //if (blocktype == 0) //{ blocktype = block.StructureNameHash; } //else if (block.StructureNameHash != blocktype) //{ } //not all the same type..! if (block.StructureNameHash != name) { return null; } //type mismatch - don't return anything... if ((offset < 0) || (block.Data == null) || (offset >= block.Data.Length)) { continue; } items[i] = ConvertData(block.Data, offset); } return items; } public static T[] ConvertDataArray(Meta meta, MetaName name, Array_Structure array) where T : struct { return ConvertDataArray(meta, name, array.Pointer, array.Count1); } public static T[] ConvertDataArray(Meta meta, MetaName name, uint pointer, uint count) where T : struct { if (count == 0) return null; T[] items = new T[count]; int itemsize = Marshal.SizeOf(typeof(T)); int itemsleft = (int)count; //large arrays get split into chunks... uint ptrindex = (pointer & 0xFFF) - 1; uint ptroffset = ((pointer >> 12) & 0xFFFFF); var ptrblock = (ptrindex < meta.DataBlocks.Count) ? meta.DataBlocks[(int)ptrindex] : null; if ((ptrblock == null) || (ptrblock.Data == null) || (ptrblock.StructureNameHash != name)) { return null; } //no block or wrong block? shouldn't happen! int byteoffset = (int)ptroffset;// (ptroffset * 16 + ptrunkval); int itemoffset = byteoffset / itemsize; int curi = 0; while (itemsleft > 0) { int blockcount = ptrblock.DataLength / itemsize; int itemcount = blockcount - itemoffset; if (itemcount > itemsleft) { itemcount = itemsleft; } //don't try to read too many items.. for (int i = 0; i < itemcount; i++) { int offset = (itemoffset + i) * itemsize; int index = curi + i; items[index] = ConvertData(ptrblock.Data, offset); } itemoffset = 0; //start at beginning of next block.. curi += itemcount; itemsleft -= itemcount; if (itemsleft <= 0) { return items; }//all done! ptrindex++; ptrblock = (ptrindex < meta.DataBlocks.Count) ? meta.DataBlocks[(int)ptrindex] : null; if ((ptrblock == null) || (ptrblock.Data == null)) { break; } //not enough items..? if (ptrblock.StructureNameHash != name) { break; } //type mismatch.. } return null; #region old version /* //old version int currentp = (int)pointer - 1; var datablock = ((currentp>=0)&&(currentp < meta.DataBlocks.Count)) ? meta.DataBlocks[currentp] : null; if ((datablock == null) || (datablock.StructureNameHash != name)) //no match. look for the first match { currentp = -1; for (int i = 0; i < meta.DataBlocks.Count; i++) { if (meta.DataBlocks[i].StructureNameHash == name) { currentp = i; break; } } if (currentp < 0) //couldn't find the right type. { return null; } } int curindex = 0; while (itemsleft > 0) { if ((currentp >= meta.DataBlocks.Count) || (meta.DataBlocks[currentp].StructureNameHash != name)) { //wasn't enough data to read... problem.. (no next block to read from), just return whatever we got T[] newitems = new T[curindex]; //have to return a smaller array.. for (int n = 0; n < curindex; n++) newitems[n] = items[n]; return newitems; } datablock = meta.DataBlocks[currentp]; int curitemcount = datablock.DataLength / itemsize; int totusedbytes = curitemcount * itemsize; if (totusedbytes < datablock.DataLength) { //didn't use all the bytes in the block... potential problem! if (totusedbytes == 0) { //not big enough for one item.. if (curindex == 0) return null; //nothing read if on first iteration. T[] newitems = new T[curindex]; //have to return a smaller array.. just return whatever we got for (int n = 0; n < curindex; n++) newitems[n] = items[n]; return newitems; } else //there was something... how to know if it's right though?? { //break; //just keep going.. at least parse what we got } } for (int i = 0; i < curitemcount; i++) { int offset = i * itemsize; int index = curindex + i; if (index >= items.Length) { //too much data! grow the output? break; } items[index] = ConvertData(datablock.Data, offset); } itemsleft -= curitemcount; curindex += curitemcount; currentp++; } return items; */ #endregion } public static MetaPOINTER[] GetPointerArray(Meta meta, Array_StructurePointer array) { uint count = array.Count1; if (count == 0) return null; MetaPOINTER[] ptrs = new MetaPOINTER[count]; int ptrsize = Marshal.SizeOf(typeof(MetaPOINTER)); //int itemsleft = (int)count; //large arrays get split into chunks... uint ptr = array.Pointer; int ptrindex = (int)(ptr & 0xFFF) - 1; int ptroffset = (int)((ptr >> 12) & 0xFFFFF); var ptrblock = (ptrindex < meta.DataBlocks.Count) ? meta.DataBlocks[ptrindex] : null; if ((ptrblock == null) || (ptrblock.Data == null) || (ptrblock.StructureNameHash != MetaName.POINTER)) { return null; } for (int i = 0; i < count; i++) { int offset = ptroffset + (i * ptrsize); if (offset >= ptrblock.Data.Length) { break; } ptrs[i] = ConvertData(ptrblock.Data, offset); } return ptrs; } public static MetaHash[] GetHashArray(Meta meta, Array_uint array) { return ConvertDataArray(meta, MetaName.HASH, array.Pointer, array.Count1); } public static uint[] GetUintArray(Meta meta, Array_uint array) { return ConvertDataArray(meta, MetaName.UINT, array.Pointer, array.Count1); } public static ushort[] GetUshortArray(Meta meta, Array_ushort array) { return ConvertDataArray(meta, MetaName.USHORT, array.Pointer, array.Count1); } public static short[] GetShortArray(Meta meta, Array_ushort array) { return ConvertDataArray(meta, MetaName.USHORT, array.Pointer, array.Count1); } public static float[] GetFloatArray(Meta meta, Array_float array) { return ConvertDataArray(meta, MetaName.FLOAT, array.Pointer, array.Count1); } public static byte[] GetByteArray(Meta meta, Array_byte array) { var pointer = array.Pointer; uint ptrindex = (pointer & 0xFFF) - 1; uint ptroffset = ((pointer >> 12) & 0xFFFFF); var ptrblock = (ptrindex < meta.DataBlocks.Count) ? meta.DataBlocks[(int)ptrindex] : null; if ((ptrblock == null) || (ptrblock.Data == null))// || (ptrblock.StructureNameHash != name)) { return null; } //no block or wrong block? shouldn't happen! var count = array.Count1; if ((ptroffset + count) > ptrblock.Data.Length) { return null; } byte[] data = new byte[count]; Buffer.BlockCopy(ptrblock.Data, (int)ptroffset, data, 0, count); return data; } public static T[] GetTypedDataArray(Meta meta, MetaName name) where T : struct { if ((meta == null) || (meta.DataBlocks == null)) return null; var datablocks = meta.DataBlocks.Data; MetaDataBlock startblock = null; int startblockind = -1; for (int i = 0; i < datablocks.Count; i++) { var block = datablocks[i]; if (block.StructureNameHash == name) { startblock = block; startblockind = i; break; } } if (startblock == null) { return null; //couldn't find the data. } int count = 0; //try figure out how many items there are, from the block size(s). int itemsize = Marshal.SizeOf(typeof(T)); var currentblock = startblock; int currentblockind = startblockind; while (currentblock != null) { int blockitems = currentblock.DataLength / itemsize; count += blockitems; currentblockind++; if (currentblockind >= datablocks.Count) break; //last block, can't go any further currentblock = datablocks[currentblockind]; if (currentblock.StructureNameHash != name) break; //not the right block type, can't go further } if (count <= 0) { return null; //didn't find anything... } return ConvertDataArray(meta, name, (uint)startblockind + 1, (uint)count); } public static T GetTypedData(Meta meta, MetaName name) where T : struct { foreach (var block in meta.DataBlocks) { if (block.StructureNameHash == name) { return MetaTypes.ConvertData(block.Data); } } throw new Exception("Couldn't find " + name.ToString() + " block."); } public static string[] GetStrings(Meta meta) { //look for strings in the sectionSTRINGS data block(s) if ((meta == null) || (meta.DataBlocks == null)) return null; var datablocks = meta.DataBlocks.Data; MetaDataBlock startblock = null; int startblockind = -1; for (int i = 0; i < datablocks.Count; i++) { var block = datablocks[i]; if (block.StructureNameHash == MetaName.STRING) { startblock = block; startblockind = i; break; } } if (startblock == null) { return null; //couldn't find the strings data section. } List strings = new List(); StringBuilder sb = new StringBuilder(); var currentblock = startblock; int currentblockind = startblockind; while (currentblock != null) { //read strings from the block. sb.Clear(); int startindex = 0; int endindex = 0; var data = currentblock.Data; for (int b = 0; b < data.Length; b++) { if (data[b] == 0) { startindex = endindex; endindex = b; if (endindex > startindex) { string str = Encoding.ASCII.GetString(data, startindex, endindex - startindex); strings.Add(str); endindex++; //start next string after the 0. } } } if (endindex != data.Length - 1) { startindex = endindex; endindex = data.Length - 1; if (endindex > startindex) { string str = Encoding.ASCII.GetString(data, startindex, endindex - startindex); strings.Add(str); } } currentblockind++; if (currentblockind >= datablocks.Count) break; //last block, can't go any further currentblock = datablocks[currentblockind]; if (currentblock.StructureNameHash != MetaName.STRING) break; //not the right block type, can't go further } if (strings.Count <= 0) { return null; //don't return empty array... } return strings.ToArray(); } public static string GetString(Meta meta, CharPointer ptr) { var blocki = (int)ptr.PointerDataIndex;// (ptr.Pointer & 0xFFF) - 1; var offset = (int)ptr.PointerDataOffset;// (ptr.Pointer >> 12) & 0xFFFFF; if ((blocki < 0) || (blocki >= meta.DataBlocks.BlockLength)) { return null; } var block = meta.DataBlocks[blocki]; if (block.StructureNameHash != MetaName.STRING) { return null; } //var byteoffset = offset * 16 + offset2; var length = ptr.Count1; var lastbyte = offset + length; if (lastbyte >= block.DataLength) { return null; } string s = Encoding.ASCII.GetString(block.Data, offset, length); //if (meta.Strings == null) return null; //if (offset < 0) return null; //if (offset >= meta.Strings.Length) return null; //string s = meta.Strings[offset]; return s; } public static MetaWrapper[] GetExtensions(Meta meta, Array_StructurePointer ptr) { if (ptr.Count1 == 0) return null; var result = new MetaWrapper[ptr.Count1]; var extptrs = GetPointerArray(meta, ptr); if (extptrs != null) { for (int i = 0; i < extptrs.Length; i++) { var extptr = extptrs[i]; MetaWrapper ext = null; var block = GetDataBlock(meta, extptr); var h = block.StructureNameHash; switch (h) { //archetype extension types case MetaName.CExtensionDefParticleEffect: ext = new MCExtensionDefParticleEffect();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefAudioCollisionSettings: ext = new MCExtensionDefAudioCollisionSettings();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefAudioEmitter: ext = new MCExtensionDefAudioEmitter();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefSpawnPoint: ext = new MCExtensionDefSpawnPoint();// new MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefExplosionEffect: ext = new MCExtensionDefExplosionEffect();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefLadder: ext = new MCExtensionDefLadder();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefBuoyancy: ext = new MCExtensionDefBuoyancy();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefExpression: ext = new MCExtensionDefExpression();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefLightShaft: ext = new MCExtensionDefLightShaft();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefWindDisturbance: ext = new MCExtensionDefWindDisturbance();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefProcObject: ext = new MCExtensionDefProcObject();// MetaExtension(h, GetData(block, extptr)); break; //entity extension types case MetaName.CExtensionDefLightEffect: ext = new MCExtensionDefLightEffect();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefSpawnPointOverride: ext = new MCExtensionDefSpawnPointOverride();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.CExtensionDefDoor: ext = new MCExtensionDefDoor();// MetaExtension(h, GetData(block, extptr)); break; case MetaName.rage__phVerletClothCustomBounds: //rage__phVerletClothCustomBounds ext = new Mrage__phVerletClothCustomBounds();// MetaExtension(h, GetData(block, extptr)); break; default: break; } //string ts = GetTypesInitString(meta); if (ext != null) { ext.Load(meta, extptr); } if (i < result.Length) { result[i] = ext; } } } return result; } public static MetaDataBlock GetDataBlock(Meta meta, MetaPOINTER ptr) { int blocki = ptr.BlockID - 1; if ((blocki < 0) || (blocki >= meta.DataBlocks.Count)) { return null; } var block = meta.DataBlocks[blocki]; return block; } public static int GetDataOffset(MetaDataBlock block, MetaPOINTER ptr) { if (block == null) return -1; int offset = ptr.ItemOffset * 16;//block data size... if (ptr.ExtraOffset != 0) { } //offset += (int)ptr.ExtraOffset; if ((offset < 0) || (block.Data == null) || (offset >= block.Data.Length)) { return -1; } return offset; } public static T GetData(Meta meta, MetaPOINTER ptr) where T : struct { var block = GetDataBlock(meta, ptr); var offset = GetDataOffset(block, ptr); if (offset < 0) return new T(); return ConvertData(block.Data, offset); } public static T GetData(MetaDataBlock block, MetaPOINTER ptr) where T : struct { var offset = GetDataOffset(block, ptr); if (offset < 0) return new T(); return ConvertData(block.Data, offset); } public static ushort SwapBytes(ushort x) { return (ushort)(((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)); } public static uint SwapBytes(uint x) { // swap adjacent 16-bit blocks x = (x >> 16) | (x << 16); // swap adjacent 8-bit blocks return ((x & 0xFF00FF00) >> 8) | ((x & 0x00FF00FF) << 8); } public static int SwapBytes(int x) { return (int)SwapBytes((uint)x); } public static ulong SwapBytes(ulong x) { // swap adjacent 32-bit blocks x = (x >> 32) | (x << 32); // swap adjacent 16-bit blocks x = ((x & 0xFFFF0000FFFF0000) >> 16) | ((x & 0x0000FFFF0000FFFF) << 16); // swap adjacent 8-bit blocks return ((x & 0xFF00FF00FF00FF00) >> 8) | ((x & 0x00FF00FF00FF00FF) << 8); } public static float SwapBytes(float f) { var a = BitConverter.GetBytes(f); Array.Reverse(a); return BitConverter.ToSingle(a, 0); } public static Vector2 SwapBytes(Vector2 v) { var x = SwapBytes(v.X); var y = SwapBytes(v.Y); return new Vector2(x, y); } public static Vector3 SwapBytes(Vector3 v) { var x = SwapBytes(v.X); var y = SwapBytes(v.Y); var z = SwapBytes(v.Z); return new Vector3(x, y, z); } public static Vector4 SwapBytes(Vector4 v) { var x = SwapBytes(v.X); var y = SwapBytes(v.Y); var z = SwapBytes(v.Z); var w = SwapBytes(v.W); return new Vector4(x, y, z, w); } } [TC(typeof(EXP))] public abstract class MetaWrapper { public virtual string Name { get { return ToString(); } } public abstract void Load(Meta meta, MetaPOINTER ptr); public abstract MetaPOINTER Save(MetaBuilder mb); } //derived types - manually created (array & pointer structs) [TC(typeof(EXP))] public struct Array_StructurePointer //16 bytes - pointer for a structure pointer array { public uint Pointer { get; set; } public uint Unk0 { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } public uint Unk1 { get; set; } public uint PointerDataId { get { return (Pointer & 0xFFF); } } public uint PointerDataIndex { get { return (Pointer & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Pointer >> 12) & 0xFFFFF); } } public void SwapEnd() { Pointer = MetaTypes.SwapBytes(Pointer); Count1 = MetaTypes.SwapBytes(Count1); Count2 = MetaTypes.SwapBytes(Count2); Unk1 = MetaTypes.SwapBytes(Unk1); } public override string ToString() { return "Array_StructurePointer: " + PointerDataIndex.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; } } [TC(typeof(EXP))] public struct Array_Structure //16 bytes - pointer for a structure array { public uint Pointer { get; set; } public uint Unk0 { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } public uint Unk1 { get; set; } public uint PointerDataId { get { return (Pointer & 0xFFF); } } public uint PointerDataIndex { get { return (Pointer & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Pointer >> 12) & 0xFFFFF); } } public Array_Structure(uint ptr, int cnt) { Pointer = ptr; Unk0 = 0; Count1 = (ushort)cnt; Count2 = Count1; Unk1 = 0; } public Array_Structure(MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Unk0 = 0; Count1 = (ushort)ptr.Length; Count2 = Count1; Unk1 = 0; } public void SwapEnd() { Pointer = MetaTypes.SwapBytes(Pointer); Unk0 = MetaTypes.SwapBytes(Unk0); Count1 = MetaTypes.SwapBytes(Count1); Count2 = MetaTypes.SwapBytes(Count2); Unk1 = MetaTypes.SwapBytes(Unk1); } public override string ToString() { return "Array_Structure: " + PointerDataIndex.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; } } [TC(typeof(EXP))] public struct Array_uint //16 bytes - pointer for a uint array { public uint Pointer { get; set; } public uint Unk0 { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } public uint Unk1 { get; set; } public uint PointerDataId { get { return (Pointer & 0xFFF); } } public uint PointerDataIndex { get { return (Pointer & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Pointer >> 12) & 0xFFFFF); } } public Array_uint(uint ptr, int cnt) { Pointer = ptr; Unk0 = 0; Count1 = (ushort)cnt; Count2 = Count1; Unk1 = 0; } public Array_uint(MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Unk0 = 0; Count1 = (ushort)ptr.Length; Count2 = Count1; Unk1 = 0; } public void SwapEnd() { Pointer = MetaTypes.SwapBytes(Pointer); Unk0 = MetaTypes.SwapBytes(Unk0); Count1 = MetaTypes.SwapBytes(Count1); Count2 = MetaTypes.SwapBytes(Count2); Unk1 = MetaTypes.SwapBytes(Unk1); } public override string ToString() { return "Array_uint: " + PointerDataIndex.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; } } [TC(typeof(EXP))] public struct Array_ushort //16 bytes - pointer for a ushort array { public uint Pointer { get; set; } public uint Unk0 { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } public uint Unk1 { get; set; } public uint PointerDataId { get { return (Pointer & 0xFFF); } } public uint PointerDataIndex { get { return (Pointer & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Pointer >> 12) & 0xFFFFF); } } public Array_ushort(uint ptr, int cnt) { Pointer = ptr; Unk0 = 0; Count1 = (ushort)cnt; Count2 = Count1; Unk1 = 0; } public Array_ushort(MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Unk0 = 0; Count1 = (ushort)ptr.Length; Count2 = Count1; Unk1 = 0; } public void SwapEnd() { Pointer = MetaTypes.SwapBytes(Pointer); Unk0 = MetaTypes.SwapBytes(Unk0); Count1 = MetaTypes.SwapBytes(Count1); Count2 = MetaTypes.SwapBytes(Count2); Unk1 = MetaTypes.SwapBytes(Unk1); } public override string ToString() { return "Array_ushort: " + PointerDataIndex.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; } } [TC(typeof(EXP))] public struct Array_byte //16 bytes - pointer for a byte array { public uint Pointer { get; set; } public uint Unk0 { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } public uint Unk1 { get; set; } public uint PointerDataId { get { return (Pointer & 0xFFF); } } public uint PointerDataIndex { get { return (Pointer & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Pointer >> 12) & 0xFFFFF); } } public void SwapEnd() { Pointer = MetaTypes.SwapBytes(Pointer); Unk0 = MetaTypes.SwapBytes(Unk0); Count1 = MetaTypes.SwapBytes(Count1); Count2 = MetaTypes.SwapBytes(Count2); Unk1 = MetaTypes.SwapBytes(Unk1); } public override string ToString() { return "Array_byte: " + PointerDataIndex.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; } } [TC(typeof(EXP))] public struct Array_float //16 bytes - pointer for a float array { public uint Pointer { get; set; } public uint Unk0 { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } public uint Unk1 { get; set; } public uint PointerDataId { get { return (Pointer & 0xFFF); } } public uint PointerDataIndex { get { return (Pointer & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Pointer >> 12) & 0xFFFFF); } } public void SwapEnd() { Pointer = MetaTypes.SwapBytes(Pointer); Unk0 = MetaTypes.SwapBytes(Unk0); Count1 = MetaTypes.SwapBytes(Count1); Count2 = MetaTypes.SwapBytes(Count2); Unk1 = MetaTypes.SwapBytes(Unk1); } public override string ToString() { return "Array_float: " + PointerDataIndex.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; } } [TC(typeof(EXP))] public struct Array_Vector3 //16 bytes - pointer for a Vector3 array { public uint Pointer { get; set; } public uint Unk0 { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } public uint Unk1 { get; set; } public uint PointerDataId { get { return (Pointer & 0xFFF); } } public uint PointerDataIndex { get { return (Pointer & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Pointer >> 12) & 0xFFFFF); } } public void SwapEnd() { Pointer = MetaTypes.SwapBytes(Pointer); Unk0 = MetaTypes.SwapBytes(Unk0); Count1 = MetaTypes.SwapBytes(Count1); Count2 = MetaTypes.SwapBytes(Count2); Unk1 = MetaTypes.SwapBytes(Unk1); } public override string ToString() { return "Array_Vector3: " + PointerDataIndex.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; } } [TC(typeof(EXP))] public struct CharPointer //16 bytes - pointer for a char array { public uint Pointer { get; set; } public uint Unk0 { get; set; } public ushort Count1 { get; set; } public ushort Count2 { get; set; } public uint Unk1 { get; set; } public uint PointerDataId { get { return (Pointer & 0xFFF); } } public uint PointerDataIndex { get { return (Pointer & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Pointer >> 12) & 0xFFFFF); } } public CharPointer(uint ptr, int len) { Pointer = ptr; Unk0 = 0; Count1 = (ushort)len; Count2 = Count1; Unk1 = 0; } public CharPointer(MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Unk0 = 0; Count1 = (ushort)ptr.Length; Count2 = Count1; Unk1 = 0; } public void SwapEnd() { Pointer = MetaTypes.SwapBytes(Pointer); Unk0 = MetaTypes.SwapBytes(Unk0); Count1 = MetaTypes.SwapBytes(Count1); Count2 = MetaTypes.SwapBytes(Count2); Unk1 = MetaTypes.SwapBytes(Unk1); } public override string ToString() { return "CharPointer: " + Pointer.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; } } [TC(typeof(EXP))] public struct DataBlockPointer //8 bytes - pointer to data block { public uint Ptr0 { get; set; } public uint Ptr1 { get; set; } public uint PointerDataId { get { return (Ptr0 & 0xFFF); } } public uint PointerDataIndex { get { return (Ptr0 & 0xFFF) - 1; } } public uint PointerDataOffset { get { return ((Ptr0 >> 12) & 0xFFFFF); } } public override string ToString() { return "DataBlockPointer: " + Ptr0.ToString() + ", " + Ptr1.ToString(); } public void SwapEnd() { Ptr0 = MetaTypes.SwapBytes(Ptr0); Ptr1 = MetaTypes.SwapBytes(Ptr1); } } public struct ArrayOfUshorts3 //array of 3 bytes { public ushort u0, u1, u2; public override string ToString() { return u0.ToString() + ", " + u1.ToString() + ", " + u2.ToString(); } } public struct ArrayOfBytes3 //array of 3 bytes { public byte b0,b1,b2; public override string ToString() { return b0.ToString() + ", " + b1.ToString() + ", " + b2.ToString(); } } public struct ArrayOfBytes4 //array of 4 bytes { public byte b0,b1,b2,b3; public override string ToString() { return b0.ToString() + ", " + b1.ToString() + ", " + b2.ToString() + ", " + b3.ToString(); } } public struct ArrayOfBytes5 //array of 5 bytes { public byte b0, b1, b2, b3, b4; } public struct ArrayOfBytes6 //array of 6 bytes { public byte b0, b1, b2, b3, b4, b5; } public struct ArrayOfBytes12 //array of 12 bytes { public byte b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11; } public struct ArrayOfChars64 //array of 64 chars (bytes) { public byte b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49, b50, b51, b52, b53, b54, b55, b56, b57, b58, b59, b60, b61, b62, b63; public override string ToString() { byte[] bytes = { b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49, b50, b51, b52, b53, b54, b55, b56, b57, b58, b59, b60, b61, b62, b63 }; StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { if (bytes[i] == 0) break; sb.Append((char)bytes[i]); } return sb.ToString(); } } public struct MetaVECTOR3 //12 bytes, Key:2751397072 { public float x { get; set; } //0 0: Float: 0: x public float y { get; set; } //4 4: Float: 0: y public float z { get; set; } //8 8: Float: 0: z public override string ToString() { return x.ToString() + ", " + y.ToString() + ", " + z.ToString(); } public Vector3 ToVector3() { return new Vector3(x, y, z); } } public struct MetaPOINTER //8 bytes - pointer to data item //SectionUNKNOWN10 { public ushort BlockID { get; set; } //1-based ID public ushort ItemOffset { get; set; } //byte offset / 16 public uint ExtraOffset { get; set; } public MetaPOINTER(ushort blockID, ushort itemOffset, uint extra) { BlockID = blockID; ItemOffset = itemOffset; ExtraOffset = extra; } public override string ToString() { return BlockID.ToString() + ", " + ItemOffset.ToString() + ", " + ExtraOffset.ToString(); } } //generated enums //Enum infos [Flags] public enum Unk_700327466 //SCENARIO point flags / extension spawn point flags : int //Key:2814596095 { IgnoreMaxInRange = 1,//0, NoSpawn = 2,//1, StationaryReactions = 4,//2, Unk_3257836369 = 8,//3, Unk_2165609255 = 16,//4, ActivateVehicleSiren = 32,//5, Unk_2626064871 = 64,//6, // AggressiveVehicleDriving ? Unk_2004780781 = 128,//7, Unk_536864854 = 256,//8, Unk_3441065168 = 512,//9, AerialVehiclePoint = 1024,//10, TerritorialScenario = 2048,//11, Unk_3690227693 = 4096,//12, Unk_1601179199 = 8192,//13, Unk_2583152330 = 16384,//14, Unk_3490317520 = 32768,//15, InWater = 65536,//16, Unk_1269249358 = 131072,//17, // AllowInvestigation ? OpenDoor = 262144,//18, PreciseUseTime = 524288,//19, Unk_2247631388 = 1048576,//20, Unk_4100708934 = 2097152,//21, ExtendedRange = 4194304,//22, ShortRange = 8388608,//23, HighPriority = 16777216,//24, IgnoreLoitering = 33554432,//25, Unk_1524211135 = 67108864,//26, // UseSearchlight ? ResetNoCollisionOnCleanUp = 134217728,//27, Unk_3304563391 = 268435456,//28, Unk_1111379709 = 536870912,//29, Unk_176469077 = 1073741824,//30, // IgnoreWeatherRestrictions ? } public enum Unk_3573596290 //SCENARIO Spawn point availability availableInMpSp : int //Key:671739257 { kBoth = 0, kOnlySp = 1, kOnlyMp = 2, } public enum Unk_3609807418 //SCENARIO (Path) Edge Action : byte //Key:3326075799 { Move = 0, Unk_7865678 = 1, MoveFollowMaster = 2, } public enum Unk_3971773454 //SCENARIO (Path) Edge nav mode : byte //Key:3016128742 { Direct = 0, NavMesh = 1, Roads = 2, } public enum Unk_941086046 //SCENARIO (Path) Edge nav speed : byte //Key:1112851290 { Unk_00_3279574318 = 0, Unk_01_2212923970 = 1, Unk_02_4022799658 = 2, Unk_03_1425672334 = 3, Unk_04_957720931 = 4, Unk_05_3795195414 = 5, Unk_06_2834622009 = 6, Unk_07_1876554076 = 7, Unk_08_698543797 = 8, Unk_09_1544199634 = 9, Unk_10_2725613303 = 10, Unk_11_4033265820 = 11, Unk_12_3054809929 = 12, Unk_13_3911005380 = 13, Unk_14_3717649022 = 14, Unk_15_3356026130 = 15, } public enum Unk_1991964615 //archetype assetType : int //Key:1866031916 { ASSET_TYPE_UNINITIALIZED = 0, //189734893 ASSET_TYPE_FRAGMENT = 1, //571047911 ASSET_TYPE_DRAWABLE = 2, //130075505 ASSET_TYPE_DRAWABLEDICTIONARY = 3, //1580165652 ASSET_TYPE_ASSETLESS = 4, //4161085041 } public enum Unk_1264241711 //entity lodLevel : int //Key:1856311430 { LODTYPES_DEPTH_HD = 0, LODTYPES_DEPTH_LOD = 1, LODTYPES_DEPTH_SLOD1 = 2, LODTYPES_DEPTH_SLOD2 = 3, LODTYPES_DEPTH_SLOD3 = 4, //thanks Tadden :D LODTYPES_DEPTH_ORPHANHD = 5, LODTYPES_DEPTH_SLOD4 = 6, } public enum Unk_648413703 //entity priorityLevel : int //Key:2200357711 { PRI_REQUIRED = 0, //1943361227 PRI_OPTIONAL_HIGH = 1, //3993616791 PRI_OPTIONAL_MEDIUM = 2, //515598709 PRI_OPTIONAL_LOW = 3, //329627604 } public enum Unk_1294270217 //archetype CExtensionDefLadder materialType : int //Key:3514570158 { METAL_SOLID_LADDER = 0, //Unk_1101797524 = 0, METAL_LIGHT_LADDER = 1, Unk_3202617440 = 2, } public enum Unk_1931949281 //archetype CExtensionDefLightShaft densityType : int //Key:3539601182 { Unk_676250331 = 0, Unk_2399586564 = 1, Unk_2057886646 = 2, Unk_1816804348 = 3, Unk_152140774 = 4, Unk_2088805984 = 5, Unk_1098824079 = 6, Unk_1492299290 = 7, } public enum Unk_2266515059 //archetype CExtensionDefLightShaft volumeType : int //Key:4287472345 { Unk_665241531 = 0, Unk_462992848 = 1, } public enum Unk_884254308 //component peds CComponentInfo ped accessory / variations slot : short //Key:3472084374 { PV_COMP_INVALID = -1, PV_COMP_HEAD = 0, PV_COMP_BERD = 1, PV_COMP_HAIR = 2, PV_COMP_UPPR = 4,//3, PV_COMP_LOWR = 8,//4, PV_COMP_HAND = 16,//5, PV_COMP_FEET = 32,//6, PV_COMP_TEEF = 64,//7, PV_COMP_ACCS = 128,//8, PV_COMP_TASK = 256,//9, PV_COMP_DECL = 512,//10, PV_COMP_JBIB = 1024,//11, PV_COMP_MAX = 2048,//12, } public enum Unk_4212977111 //component peds Unk_94549140 renderFlags : int //Key:1551913633 { Unk_3757767268 = 0, Unk_3735238938 = 1, Unk_3395845123 = 2, } public enum Unk_2834549053 //component peds CAnchorProps anchor : int //Key:1309372691 { ANCHOR_HEAD = 0, ANCHOR_EYES = 1, ANCHOR_EARS = 2, ANCHOR_MOUTH = 3, ANCHOR_LEFT_HAND = 4, ANCHOR_RIGHT_HAND = 5, ANCHOR_LEFT_WRIST = 6, ANCHOR_RIGHT_WRIST = 7, ANCHOR_HIP = 8, ANCHOR_LEFT_FOOT = 9, ANCHOR_RIGHT_FOOT = 10, Unk_604819740 = 11, Unk_2358626934 = 12, NUM_ANCHORS = 13, } public enum Unk_3044470860 //cloth collision data SectionUNKNOWN1/1701774085 Flags : int //Key:1585854303 { Unk_997866013 = 0, } //generated + adjusted structs code (UnusedX padding vars manually added) from here down //Struct infos [TC(typeof(EXP))] public struct CMapTypes //80 bytes, Key:2608875220 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public Array_StructurePointer extensions { get; set; } //8 8: Array: 0: extensions {0: StructurePointer: 0: 256} public Array_StructurePointer archetypes { get; set; } //24 24: Array: 0: archetypes {0: StructurePointer: 0: 256} public MetaHash name { get; set; } //40 40: Hash: 0: name public uint Unused2 { get; set; }//44 public Array_uint dependencies { get; set; } //48 48: Array: 0: dependencies//1013942340 {0: Hash: 0: 256} public Array_Structure compositeEntityTypes { get; set; } //64 64: Array: 0: compositeEntityTypes {0: Structure: SectionUNKNOWN2: 256} public override string ToString() { return name.ToString(); } } [TC(typeof(EXP))] public struct CBaseArchetypeDef //144 bytes, Key:2411387556 { public uint Unused00 { get; set; }//0 public uint Unused01 { get; set; }//4 public float lodDist { get; set; } //8 8: Float: 0: lodDist public uint flags { get; set; } //12 12: UnsignedInt: 0: flags public uint specialAttribute { get; set; } //16 16: UnsignedInt: 0: specialAttribute public uint Unused02 { get; set; }//20 public uint Unused03 { get; set; }//24 public uint Unused04 { get; set; }//28 public Vector3 bbMin { get; set; } //32 32: Float_XYZ: 0: bbMin public float Unused05 { get; set; }//44 public Vector3 bbMax { get; set; } //48 48: Float_XYZ: 0: bbMax public float Unused06 { get; set; }//60 public Vector3 bsCentre { get; set; } //64 64: Float_XYZ: 0: bsCentre public float Unused07 { get; set; }//76 public float bsRadius { get; set; } //80 80: Float: 0: bsRadius public float hdTextureDist { get; set; } //84 84: Float: 0: hdTextureDist//2908576588 public MetaHash name { get; set; } //88 88: Hash: 0: name public MetaHash textureDictionary { get; set; } //92 92: Hash: 0: textureDictionary public MetaHash clipDictionary { get; set; } //96 96: Hash: 0: clipDictionary//424089489 public MetaHash drawableDictionary { get; set; } //100 100: Hash: 0: drawableDictionary public MetaHash physicsDictionary { get; set; } //104 104: Hash: 0: physicsDictionary//3553040380 public Unk_1991964615 assetType { get; set; } //108 108: IntEnum: 1991964615: assetType public MetaHash assetName { get; set; } //112 112: Hash: 0: assetName public uint Unused08 { get; set; }//116 public Array_StructurePointer extensions { get; set; } //120 120: Array: 0: extensions {0: StructurePointer: 0: 256} public uint Unused09 { get; set; }//136 public uint Unused10 { get; set; }//140 public override string ToString() { return name.ToString() + ", " + assetName.ToString() + ", " + drawableDictionary.ToString() + ", " + textureDictionary.ToString(); } } [TC(typeof(EXP))] public struct CTimeArchetypeDef //160 bytes, Key:2520619910 { public CBaseArchetypeDef CBaseArchetypeDef { get; set; } public uint timeFlags { get; set; } //144 144: UnsignedInt: 0: timeFlags//2248791340 public uint Unused11 { get; set; }//148 public uint Unused12 { get; set; }//152 public uint Unused13 { get; set; }//156 public override string ToString() { return CBaseArchetypeDef.ToString(); } } [TC(typeof(EXP))] public struct CMloArchetypeDef //240 bytes, Key:937664754 { public CBaseArchetypeDef CBaseArchetypeDef { get; set; } public uint mloFlags { get; set; } //144 144: UnsignedInt: 0: mloFlags//3590839912 public uint Unused11 { get; set; }//148 public Array_StructurePointer entities { get; set; } //152 152: Array: 0: entities {0: StructurePointer: 0: 256} public Array_Structure rooms { get; set; } //168 168: Array: 0: rooms {0: Structure: CMloRoomDef: 256} public Array_Structure portals { get; set; } //184 184: Array: 0: portals//2314725778 {0: Structure: CMloPortalDef: 256} public Array_Structure entitySets { get; set; } //200 200: Array: 0: entitySets//1169996080 {0: Structure: CMloEntitySet: 256} public Array_Structure timeCycleModifiers { get; set; } //216 216: Array: 0: timeCycleModifiers {0: Structure: CMloTimeCycleModifier: 256} public uint Unused12 { get; set; }//232 public uint Unused13 { get; set; }//236 public override string ToString() { return CBaseArchetypeDef.ToString(); } } [TC(typeof(EXP))] public struct CLODLight //136 bytes, Key:2325189228 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public Array_Structure direction { get; set; } //8 8: Array: 0: direction {0: Structure: SectionUNKNOWN9: 256} public Array_float falloff { get; set; } //24 24: Array: 0: falloff {0: Float: 0: 256} public Array_float falloffExponent { get; set; } //40 40: Array: 0: falloffExponent {0: Float: 0: 256} public Array_uint timeAndStateFlags { get; set; } //56 56: Array: 0: timeAndStateFlags=3112418278 {0: UnsignedInt: 0: 256} public Array_uint hash { get; set; } //72 72: Array: 0: hash {0: UnsignedInt: 0: 256} public Array_byte coneInnerAngle { get; set; } //88 88: Array: 0: coneInnerAngle//1163671864 {0: UnsignedByte: 0: 256} public Array_byte coneOuterAngleOrCapExt { get; set; } //104 104: Array: 0: coneOuterAngleOrCapExt=3161894080 {0: UnsignedByte: 0: 256} public Array_byte coronaIntensity { get; set; } //120 120: Array: 0: coronaIntensity//2292363771 {0: UnsignedByte: 0: 256} } [TC(typeof(EXP))] public struct CDistantLODLight //48 bytes, Key:2820908419 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public Array_Structure position { get; set; } //8 8: Array: 0: position {0: Structure: SectionUNKNOWN9: 256} public Array_uint RGBI { get; set; } //24 24: Array: 0: RGBI {0: UnsignedInt: 0: 256} public ushort numStreetLights { get; set; } //40 40: UnsignedShort: 0: numStreetLights//3708891211 public ushort category { get; set; } //42 42: UnsignedShort: 0: category//2052871693 public uint Unused2 { get; set; }//44 } [TC(typeof(EXP))] public struct CBlockDesc //72 bytes, Key:2015795449 { public uint version { get; set; } //0 0: UnsignedInt: 0: version public uint flags { get; set; } //4 4: UnsignedInt: 0: flags public CharPointer name { get; set; } //8 8: CharPointer: 0: name public CharPointer exportedBy { get; set; } //24 24: CharPointer: 0: exportedBy//1983184981 public CharPointer owner { get; set; } //40 40: CharPointer: 0: owner public CharPointer time { get; set; } //56 56: CharPointer: 0: time } [TC(typeof(EXP))] public struct CMapData //512 bytes, Key:3448101671 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public MetaHash parent { get; set; } //12 12: Hash: 0: parent public uint flags { get; set; } //16 16: UnsignedInt: 0: flags public uint contentFlags { get; set; } //20 20: UnsignedInt: 0: contentFlags//1785155637 public uint Unused2 { get; set; }//24 public uint Unused3 { get; set; }//28 public Vector3 streamingExtentsMin { get; set; } //32 32: Float_XYZ: 0: streamingExtentsMin//3710026271 public float Unused4 { get; set; }//44 public Vector3 streamingExtentsMax { get; set; } //48 48: Float_XYZ: 0: streamingExtentsMax//2720965429 public float Unused5 { get; set; }//60 public Vector3 entitiesExtentsMin { get; set; } //64 64: Float_XYZ: 0: entitiesExtentsMin//477478129 public float Unused6 { get; set; }//76 public Vector3 entitiesExtentsMax { get; set; } //80 80: Float_XYZ: 0: entitiesExtentsMax//1829192759 public float Unused7 { get; set; }//92 public Array_StructurePointer entities { get; set; } //96 96: Array: 0: entities {0: StructurePointer: 0: 256} public Array_Structure containerLods { get; set; } //112 112: Array: 0: containerLods//2935983381 {0: Structure: 372253349: 256} public Array_Structure boxOccluders { get; set; } //128 128: Array: 0: boxOccluders//3983590932 {0: Structure: SectionUNKNOWN7: 256} public Array_Structure occludeModels { get; set; } //144 144: Array: 0: occludeModels//2132383965 {0: Structure: SectionUNKNOWN5: 256} public Array_uint physicsDictionaries { get; set; } //160 160: Array: 0: physicsDictionaries//949589348 {0: Hash: 0: 256} public rage__fwInstancedMapData instancedData { get; set; } //176 176: Structure: rage__fwInstancedMapData: instancedData//2569067561 public Array_Structure timeCycleModifiers { get; set; } //224 224: Array: 0: timeCycleModifiers {0: Structure: CTimeCycleModifier: 256} public Array_Structure carGenerators { get; set; } //240 240: Array: 0: carGenerators//3254823756 {0: Structure: CCarGen: 256} public CLODLight LODLightsSOA { get; set; } //256 256: Structure: CLODLight: LODLightsSOA//1774371066 public CDistantLODLight DistantLODLightsSOA { get; set; } //392 392: Structure: CDistantLODLight: DistantLODLightsSOA//2954466641 public CBlockDesc block { get; set; } //440 440: Structure: CBlockDesc//3072355914: block //notes: //CMapData.flags: // flag 1 = SCRIPTED flag (eg destruction) // flag 2 = LOD flag? reflection proxy flag? public override string ToString() { return name.ToString() + ": " + parent.ToString(); } } [TC(typeof(EXP))] public struct CEntityDef //128 bytes, Key:1825799514 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash archetypeName { get; set; } //8 8: Hash: 0: archetypeName public uint flags { get; set; } //12 12: UnsignedInt: 0: flags public uint guid { get; set; } //16 16: UnsignedInt: 0: guid public uint Unused2 { get; set; }//20 public uint Unused3 { get; set; }//24 public uint Unused4 { get; set; }//28 public Vector3 position { get; set; } //32 32: Float_XYZ: 0: position public float Unused5 { get; set; }//44 public Vector4 rotation { get; set; } //48 48: Float_XYZW: 0: rotation public float scaleXY { get; set; } //64 64: Float: 0: 2627937847 public float scaleZ { get; set; } //68 68: Float: 0: 284916802 public int parentIndex { get; set; } //72 72: SignedInt: 0: parentIndex public float lodDist { get; set; } //76 76: Float: 0: lodDist public float childLodDist { get; set; } //80 80: Float: 0: childLodDist//3398912973 public Unk_1264241711 lodLevel { get; set; } //84 84: IntEnum: 1264241711: lodLevel //LODTYPES_DEPTH_ public uint numChildren { get; set; } //88 88: UnsignedInt: 0: numChildren//2793909385 public Unk_648413703 priorityLevel { get; set; } //92 92: IntEnum: 648413703: priorityLevel//647098393 public Array_StructurePointer extensions { get; set; } //96 96: Array: 0: extensions {0: StructurePointer: 0: 256} public int ambientOcclusionMultiplier { get; set; } //112 112: SignedInt: 0: ambientOcclusionMultiplier//415356295 public int artificialAmbientOcclusion { get; set; } //116 116: SignedInt: 0: artificialAmbientOcclusion//599844163 public uint tintValue { get; set; } //120 120: UnsignedInt: 0: tintValue//1015358759 public uint Unused6 { get; set; }//124 public override string ToString() { return JenkIndex.GetString(archetypeName) + ": " + JenkIndex.GetString(guid) + ": " + position.ToString(); } } [TC(typeof(EXP))] public struct CTimeCycleModifier //64 bytes, Key:2683420777 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 minExtents { get; set; } //16 16: Float_XYZ: 0: minExtents=1731020657 public float Unused3 { get; set; }//28 public Vector3 maxExtents { get; set; } //32 32: Float_XYZ: 0: maxExtents=2554806840 public float Unused4 { get; set; }//44 public float percentage { get; set; } //48 48: Float: 0: percentage public float range { get; set; } //52 52: Float: 0: range public uint startHour { get; set; } //56 56: UnsignedInt: 0: startHour public uint endHour { get; set; } //60 60: UnsignedInt: 0: endHour //regarding name in OpenIV: //2633803310 = NoAmbientmult //2003616884 = INT_NoAmbientMult public override string ToString() { return name.ToString() + ": startHour " + startHour.ToString() + ", endHour " + endHour.ToString() + ", range " + range.ToString() + ", percentage " + percentage.ToString(); } } [TC(typeof(EXP))] public struct CMloInstanceDef //160 bytes, Key:2151576752 { public CEntityDef CEntityDef { get; set; } public uint groupId { get; set; } //128 128: UnsignedInt: 0: 2501631252 public uint floorId { get; set; } //132 132: UnsignedInt: 0: floorId//2187650609 public Array_uint Unk_1407157833 { get; set; } //136 136: Array: 0: 1407157833 {0: Hash: 0: 256} public uint Unk_528711607 { get; set; } //152 152: UnsignedInt: 0: 528711607 public uint Unk_3761966250 { get; set; } //156 156: UnsignedInt: 0: 3761966250 } [TC(typeof(EXP))] public struct CMloRoomDef //112 bytes, Key:3885428245 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public CharPointer name { get; set; } //8 8: CharPointer: 0: name public uint Unused2 { get; set; }//24 public uint Unused3 { get; set; }//28 public Vector3 bbMin { get; set; } //32 32: Float_XYZ: 0: bbMin public float Unused4 { get; set; }//44 public Vector3 bbMax { get; set; } //48 48: Float_XYZ: 0: bbMax public float Unused5 { get; set; }//60 public float blend { get; set; } //64 64: Float: 0: blend public MetaHash timecycleName { get; set; } //68 68: Hash: 0: timecycleName//2724323497 public MetaHash secondaryTimecycleName { get; set; } //72 72: Hash: 0: secondaryTimecycleName//3255324828 public uint flags { get; set; } //76 76: UnsignedInt: 0: flags public uint portalCount { get; set; } //80 80: UnsignedInt: 0: portalCount//1105339827 public int floorId { get; set; } //84 84: SignedInt: 0: floorId//2187650609 public int Unk_552849982 { get; set; } //88 88: SignedInt: 0: exteriorVisibiltyDepth//552849982 public uint Unused6 { get; set; }//92 public Array_uint attachedObjects { get; set; } //96 96: Array: 0: attachedObjects//2382704940 {0: UnsignedInt: 0: 256} } [TC(typeof(EXP))] public struct CMloPortalDef //64 bytes, Key:1110221513 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public uint roomFrom { get; set; } //8 8: UnsignedInt: 0: 4101034749 public uint roomTo { get; set; } //12 12: UnsignedInt: 0: 2607060513 public uint flags { get; set; } //16 16: UnsignedInt: 0: flags public uint mirrorPriority { get; set; } //20 20: UnsignedInt: 0: 1185490713 public uint opacity { get; set; } //24 24: UnsignedInt: 0: opacity public uint audioOcclusion { get; set; } //28 28: UnsignedInt: 0: 1093790004 public Array_Vector3 corners { get; set; } //32 32: Array: 0: corners {0: Float_XYZ: 0: 256} public Array_uint attachedObjects { get; set; } //48 48: Array: 0: attachedObjects//2382704940 {0: UnsignedInt: 0: 256} } [TC(typeof(EXP))] public struct CMloTimeCycleModifier //48 bytes, Key:838874674 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector4 sphere { get; set; } //16 16: Float_XYZW: 0: sphere public float percentage { get; set; } //32 32: Float: 0: percentage public float range { get; set; } //36 36: Float: 0: range public uint startHour { get; set; } //40 40: UnsignedInt: 0: startHour public uint endHour { get; set; } //44 44: UnsignedInt: 0: vlink87812 } [TC(typeof(EXP))] public struct CMloEntitySet //48 bytes, Key:4180211587 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Array_uint locations { get; set; } //16 16: Array: 0: locations {0: UnsignedInt: 0: 256} public Array_StructurePointer entities { get; set; } //32 32: Array: 0: entities {0: StructurePointer: 0: 256} } [TC(typeof(EXP))] public struct rage__spdGrid2D //64 bytes, Key:894636096 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public uint Unused2 { get; set; }//8 public int Unk_MinX_860552138 { get; set; } //12 12: SignedInt: 0: 860552138 //MIN X public int Unk_MaxX_3824598937 { get; set; } //16 16: SignedInt: 0: 3824598937 //MAX X public int Unk_MinY_496029782 { get; set; } //20 20: SignedInt: 0: 496029782 //MIN Y public int Unk_MaxY_3374647798 { get; set; } //24 24: SignedInt: 0: 3374647798 //MAX Y public uint Unused3 { get; set; }//28 public uint Unused4 { get; set; }//32 public uint Unused5 { get; set; }//36 public uint Unused6 { get; set; }//40 public float Unk_X_2690909759 { get; set; } //44 44: Float: 0: 2690909759 //grid scale X (cell size) public float Unk_Y_3691675019 { get; set; } //48 48: Float: 0: 3691675019 //grid scale Y (cell size) public uint Unused7 { get; set; }//52 public uint Unused8 { get; set; }//56 public uint Unused9 { get; set; }//60 public Vector2I Dimensions { get { return new Vector2I((Unk_MaxX_3824598937 - Unk_MinX_860552138)+1, (Unk_MaxY_3374647798 - Unk_MinY_496029782)+1); } } public Vector2 Scale { get { return new Vector2(Unk_X_2690909759, Unk_Y_3691675019); } set { Unk_X_2690909759 = value.X; Unk_Y_3691675019 = value.Y; } } public Vector2 Min { get { return new Vector2(Unk_MinX_860552138, Unk_MinY_496029782) * Scale; } set { var gv = value / Scale; Unk_MinX_860552138 = (int)Math.Floor(gv.X); Unk_MinY_496029782 = (int)Math.Floor(gv.Y); } } public Vector2 Max { get { return new Vector2(Unk_MaxX_3824598937, Unk_MaxY_3374647798) * Scale; } set { var gv = value / Scale; Unk_MaxX_3824598937 = (int)Math.Floor(gv.X); Unk_MaxY_3374647798 = (int)Math.Floor(gv.Y); } } } [TC(typeof(EXP))] public struct rage__spdAABB //32 bytes, Key:1158138379 //WAS: Unk_4084721864 { public Vector4 min { get; set; } //0 0: Float_XYZW: 0: min public Vector4 max { get; set; } //16 16: Float_XYZW: 0: max public override string ToString() { return "min: " + min.ToString() + ", max: " + max.ToString(); } public void SwapEnd() { min = MetaTypes.SwapBytes(min); max = MetaTypes.SwapBytes(max); } } [TC(typeof(EXP))] public struct rage__spdSphere //16 bytes, Key:1189037266 //Sphere - used in scenario parts { public Vector4 centerAndRadius { get; set; } //0 0: Float_XYZW: 0: centerAndRadius public override string ToString() { return centerAndRadius.ToString(); } } [TC(typeof(EXP))] public struct rage__phVerletClothCustomBounds //32 bytes, Key:2075461750 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Array_Structure CollisionData { get; set; } //16 16: Array: 0: CollisionData {0: Structure: SectionUNKNOWN1: 256} } [TC(typeof(EXP))] public class Mrage__phVerletClothCustomBounds : MetaWrapper { public rage__phVerletClothCustomBounds _Data; public rage__phVerletClothCustomBounds Data { get { return _Data; } } public MUnk_1701774085[] CollisionData { get; set; } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); var cdata = MetaTypes.ConvertDataArray(meta, (MetaName)1701774085/*.SectionUNKNOWN1*/, _Data.CollisionData); if (cdata != null) { CollisionData = new MUnk_1701774085[cdata.Length]; for (int i = 0; i < cdata.Length; i++) { CollisionData[i] = new MUnk_1701774085(meta, cdata[i]); } } } public override MetaPOINTER Save(MetaBuilder mb) { if (CollisionData != null) { _Data.CollisionData = mb.AddWrapperArray(CollisionData); } mb.AddStructureInfo(MetaName.rage__phVerletClothCustomBounds); return mb.AddItemPtr(MetaName.rage__phVerletClothCustomBounds, _Data); } public override string ToString() { return "rage__phVerletClothCustomBounds - " + _Data.name.ToString() + " (" + (CollisionData?.Length ?? 0).ToString() + " CollisionData)"; } } [TC(typeof(EXP))] public struct rage__fwInstancedMapData //48 bytes, Key:1836780118 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash ImapLink { get; set; } //8 8: Hash: 0: ImapLink//2142127586 public uint Unused2 { get; set; }//12 public Array_Structure PropInstanceList { get; set; } //16 16: Array: 0: PropInstanceList//3551474528 {0: Structure: rage__fwPropInstanceListDef: 256} public Array_Structure GrassInstanceList { get; set; } //32 32: Array: 0: GrassInstanceList//255292381 {0: Structure: rage__fwGrassInstanceListDef: 256} public override string ToString() { return ImapLink.ToString() + ", " + PropInstanceList.Count1.ToString() + " props, " + GrassInstanceList.Count1.ToString() + " grasses"; } } [TC(typeof(EXP))] public struct rage__fwGrassInstanceListDef //96 bytes, Key:941808164 rage__fwGrassInstanceListDef//2085051229 { public rage__spdAABB BatchAABB { get; set; } //0 0: Structure: 4084721864: BatchAABB//1859041902 public Vector3 ScaleRange { get; set; } //32 32: Float_XYZ: 0: ScaleRange public float Unused0 { get; set; }//44 public MetaHash archetypeName { get; set; } //48 48: Hash: 0: archetypeName public uint lodDist { get; set; } //52 52: UnsignedInt: 0: lodDist public float LodFadeStartDist { get; set; } //56 56: Float: 0: LodFadeStartDist//2216273066 public float LodInstFadeRange { get; set; } //60 60: Float: 0: LodInstFadeRange//1405992723 public float OrientToTerrain { get; set; } //64 64: Float: 0: OrientToTerrain//3341475578 public uint Unused1 { get; set; }//68 public Array_Structure InstanceList { get; set; } //72 72: Array: 0: InstanceList//470289337 {0: Structure: rage__fwGrassInstanceListDef__InstanceData: 256} public uint Unused2 { get; set; }//88 public uint Unused3 { get; set; }//92 public override string ToString() { return archetypeName.ToString() + " (" + InstanceList.Count1.ToString() + " instances)"; } } [TC(typeof(EXP))] public struct rage__fwGrassInstanceListDef__InstanceData //16 bytes, Key:2740378365 rage__fwGrassInstanceListDef__InstanceData//3985044770 // Tom: Something to do with placing foliage { public ArrayOfUshorts3 Position { get; set; } //0 0: ArrayOfBytes: 3: Position - Ushorts public byte NormalX { get; set; } //6 6: UnsignedByte: 0: NormalX//3138065392 public byte NormalY { get; set; } //7 7: UnsignedByte: 0: NormalY//273792636 public ArrayOfBytes3 Color { get; set; } //8 8: ArrayOfBytes: 3: Color public byte Scale { get; set; } //11 11: UnsignedByte: 0: Scale public byte Ao { get; set; } //12 12: UnsignedByte: 0: Ao//2996378564 public ArrayOfBytes3 Pad { get; set; } //13 13: ArrayOfBytes: 3: Pad public override string ToString() { return Position.ToString() + " : " + Color.ToString() + " : " + Scale.ToString(); } } public struct CBaseArchetypeDef_v2 //128 bytes, Key:2352343492 { public uint Unused00 { get; set; }//0 public uint Unused01 { get; set; }//4 public float lodDist { get; set; } //8 8: Float: 0: lodDist public uint flags { get; set; } //12 12: UnsignedInt: 0: flags public uint specialAttribute { get; set; } //16 16: UnsignedInt: 0: specialAttribute public uint Unused02 { get; set; }//20 public uint Unused03 { get; set; }//24 public uint Unused04 { get; set; }//28 public Vector3 bbMin { get; set; } //32 32: Float_XYZ: 0: bbMin public float Unused05 { get; set; }//44 public Vector3 bbMax { get; set; } //48 48: Float_XYZ: 0: bbMax public float Unused06 { get; set; }//60 public Vector3 bsCentre { get; set; } //64 64: Float_XYZ: 0: bsCentre public float Unused07 { get; set; }//76 public float bsRadius { get; set; } //80 80: Float: 0: bsRadius public float hdTextureDist { get; set; } //84 84: Float: 0: hdTextureDist//2908576588 public MetaHash name { get; set; } //88 88: Hash: 0: name public MetaHash textureDictionary { get; set; } //92 92: Hash: 0: textureDictionary public MetaHash clipDictionary { get; set; } //96 96: Hash: 0: clipDictionary//424089489 public MetaHash drawableDictionary { get; set; } //100 100: Hash: 0: drawableDictionary public MetaHash physicsDictionary { get; set; } //104 104: Hash: 0: physicsDictionary//3553040380 public uint Unused08 { get; set; }//108 public Array_StructurePointer extensions { get; set; } //112 112: Array: 0: extensions {0: StructurePointer: 0: 256} } public struct CCreatureMetaData //56 bytes, Key:2181653572 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public Array_Structure shaderVariableComponents { get; set; } //8 8: Array: 0: shaderVariableComponents {0: Structure: CShaderVariableComponent: 256} public Array_Structure pedPropExpressions { get; set; } //24 24: Array: 0: pedPropExpressions {0: Structure: CPedPropExpressionData: 256} public Array_Structure pedCompExpressions { get; set; } //40 40: Array: 0: pedCompExpressions {0: Structure: CPedCompExpressionData: 256} } public struct CShaderVariableComponent //72 bytes, Key:3085831725 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public uint pedcompID { get; set; } //8 8: UnsignedInt: 0: pedcompID public uint maskID { get; set; } //12 12: UnsignedInt: 0: maskID public uint shaderVariableHashString { get; set; } //16 16: Hash: 0: shaderVariableHashString public uint Unused2 { get; set; }//20 public Array_byte tracks { get; set; } //24 24: Array: 0: tracks {0: UnsignedByte: 0: 256} public Array_ushort ids { get; set; } //40 40: Array: 0: ids {0: UnsignedShort: 0: 256} public Array_byte components { get; set; } //56 56: Array: 0: components {0: UnsignedByte: 0: 256} } public struct CPedPropExpressionData //88 bytes, Key:1355135810 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public uint pedPropID { get; set; } //8 8: UnsignedInt: 0: pedPropID public int pedPropVarIndex { get; set; } //12 12: SignedInt: 0: pedPropVarIndex public uint pedPropExpressionIndex { get; set; } //16 16: UnsignedInt: 0: pedPropExpressionIndex public uint Unused2 { get; set; }//20 public Array_byte tracks { get; set; } //24 24: Array: 0: tracks {0: UnsignedByte: 0: 256} public Array_ushort ids { get; set; } //40 40: Array: 0: ids {0: UnsignedShort: 0: 256} public Array_byte types { get; set; } //56 56: Array: 0: types {0: UnsignedByte: 0: 256} public Array_byte components { get; set; } //72 72: Array: 0: components {0: UnsignedByte: 0: 256} } public struct CPedCompExpressionData //88 bytes, Key:3458164745 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public uint pedCompID { get; set; } //8 8: UnsignedInt: 0: pedCompID public int pedCompVarIndex { get; set; } //12 12: SignedInt: 0: pedCompVarIndex public uint pedCompExpressionIndex { get; set; } //16 16: UnsignedInt: 0: pedCompExpressionIndex public uint Unused2 { get; set; }//20 public Array_byte tracks { get; set; } //24 24: Array: 0: tracks {0: UnsignedByte: 0: 256} public Array_ushort ids { get; set; } //40 40: Array: 0: ids {0: UnsignedShort: 0: 256} public Array_byte types { get; set; } //56 56: Array: 0: types {0: UnsignedByte: 0: 256} public Array_byte components { get; set; } //72 72: Array: 0: components {0: UnsignedByte: 0: 256} } [TC(typeof(EXP))] public struct CLightAttrDef //160 bytes, Key:2363260268 { public uint Unused00 { get; set; }//0 public uint Unused01 { get; set; }//4 public Vector3 posn { get; set; } //8 8: ArrayOfBytes: 3: posn //actually ArrayOfFloats3 (Vector3!) public ArrayOfBytes3 colour { get; set; } //20 20: ArrayOfBytes: 3: colour public byte flashiness { get; set; } //23 23: UnsignedByte: 0: 3829693202 public float intensity { get; set; } //24 24: Float: 0: intensity public uint flags { get; set; } //28 28: UnsignedInt: 0: flags public short boneTag { get; set; } //32 32: SignedShort: 0: boneTag public byte lightType { get; set; } //34 34: UnsignedByte: 0: 482065968 public byte groupId { get; set; } //35 35: UnsignedByte: 0: 2501631252 public uint timeFlags { get; set; } //36 36: UnsignedInt: 0: timeFlags//2248791340 public float falloff { get; set; } //40 40: Float: 0: falloff public float falloffExponent { get; set; } //44 44: Float: 0: falloffExponent public Vector4 cullingPlane { get; set; } //48 48: ArrayOfBytes: 4: 1689591312 //48: 1689591312//cullingPlane - actually ArrayOfFloats4! public byte shadowBlur { get; set; } //64 64: UnsignedByte: 0: shadowBlur public byte padding1 { get; set; } //65 65: UnsignedByte: 0: padding1//3180641850 public short padding2 { get; set; } //66 66: SignedShort: 0: padding2//2346113727 public uint padding3 { get; set; } //68 68: UnsignedInt: 0: padding3//3521603295 public float volIntensity { get; set; } //72 72: Float: 0: volIntensity//689780512 public float volSizeScale { get; set; } //76 76: Float: 0: volSizeScale//2029533327 public ArrayOfBytes3 volOuterColour { get; set; } //80 80: ArrayOfBytes: 3: volOuterColour//2283994062 public byte lightHash { get; set; } //83 83: UnsignedByte: 0: lightHash//643049222 public float volOuterIntensity { get; set; } //84 84: Float: 0: volOuterIntensity//3008198647 public float coronaSize { get; set; } //88 88: Float: 0: coronaSize//1705000075 public float volOuterExponent { get; set; } //92 92: Float: 0: volOuterExponent//2758849250 public byte lightFadeDistance { get; set; } //96 96: UnsignedByte: 0: lightFadeDistance//1307926275 public byte shadowFadeDistance { get; set; } //97 97: UnsignedByte: 0: shadowFadeDistance//1944267876 public byte specularFadeDistance { get; set; } //98 98: UnsignedByte: 0: specularFadeDistance//4150887048 public byte volumetricFadeDistance { get; set; } //99 99: UnsignedByte: 0: volumetricFadeDistance//2066998816 public float shadowNearClip { get; set; } //100 100: Float: 0: shadowNearClip//954647178 public float coronaIntensity { get; set; } //104 104: Float: 0: coronaIntensity//2292363771 public float coronaZBias { get; set; } //108 108: Float: 0: coronaZBias//2520359283 public Vector3 direction { get; set; } //112 112: ArrayOfBytes: 3: direction //actually ArrayOfFloats3 (Vector3!) public Vector3 tangent { get; set; } //124 124: ArrayOfBytes: 3: tangent //actually ArrayOfFloats3 (Vector3!) public float coneInnerAngle { get; set; } //136 136: Float: 0: coneInnerAngle//1163671864 public float coneOuterAngle { get; set; } //140 140: Float: 0: coneOuterAngle//4175029060 public Vector3 extents { get; set; } //144 144: ArrayOfBytes: 3: extents//759134656 //actually ArrayOfFloats3 (Vector3!) public uint projectedTextureKey { get; set; } //156 156: UnsignedInt: 0: projectedTextureKey//1076718994 } [TC(typeof(EXP))] public struct CCarGen //80 bytes, Key:2345238261 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public uint Unused2 { get; set; }//8 public uint Unused3 { get; set; }//12 public Vector3 position { get; set; } //16 16: Float_XYZ: 0: position public float Unused4 { get; set; }//28 public float orientX { get; set; } //32 32: Float: 0: orientX=735213009 public float orientY { get; set; } //36 36: Float: 0: orientY=979440342 public float perpendicularLength { get; set; } //40 40: Float: 0: perpendicularLength=124715667 public MetaHash carModel { get; set; } //44 44: Hash: 0: carModel public uint flags { get; set; } //48 48: UnsignedInt: 0: flags /// _CP_: looks like flag 1879051873 in cargens forces to spawn a vehicle public int bodyColorRemap1 { get; set; } //52 52: SignedInt: 0: bodyColorRemap1=1429703670 public int bodyColorRemap2 { get; set; } //56 56: SignedInt: 0: bodyColorRemap2=1254848286 public int bodyColorRemap3 { get; set; } //60 60: SignedInt: 0: bodyColorRemap3=1880965569 public int bodyColorRemap4 { get; set; } //64 64: SignedInt: 0: bodyColorRemap4=1719152247 public MetaHash popGroup { get; set; } //68 68: Hash: 0: popGroup=911358791 public sbyte livery { get; set; } //72 72: SignedByte: 0: livery public byte Unused5 { get; set; }//73 public ushort Unused6 { get; set; }//74 public uint Unused7 { get; set; }//76 public override string ToString() { return carModel.ToString() + ", " + position.ToString() + ", " + popGroup.ToString() + ", " + livery.ToString(); } } [TC(typeof(EXP))] public struct Unk_1701774085 //96 bytes, Key:2859775340 //dexy: cloth CollisionData (child of rage__phVerletClothCustomBounds) ... eg josh house // Tom: explosions? { public CharPointer OwnerName { get; set; } //0 0: CharPointer: 0: OwnerName public Vector4 Rotation { get; set; } //16 16: Float_XYZW: 0: Rotation public Vector3 Position { get; set; } //32 32: Float_XYZ: 0: Position public float Unused0 { get; set; }//44 public Vector3 Normal { get; set; } //48 48: Float_XYZ: 0: Normal public float Unused1 { get; set; }//60 public float CapsuleRadius { get; set; } //64 64: Float: 0: CapsuleRadius public float CapsuleLen { get; set; } //68 68: Float: 0: CapsuleLen public float CapsuleHalfHeight { get; set; } //72 72: Float: 0: CapsuleHalfHeight public float CapsuleHalfWidth { get; set; } //76 76: Float: 0: CapsuleHalfWidth public Unk_3044470860 Flags { get; set; } //80 80: IntFlags2: 3044470860: Flags public uint Unused2 { get; set; }//84 public uint Unused3 { get; set; }//88 public uint Unused4 { get; set; }//92 } [TC(typeof(EXP))] public class MUnk_1701774085 : MetaWrapper { public Unk_1701774085 _Data; public Unk_1701774085 Data { get { return _Data; } } public string OwnerName { get; set; } public MUnk_1701774085() { } public MUnk_1701774085(Meta meta, Unk_1701774085 s) { _Data = s; OwnerName = MetaTypes.GetString(meta, _Data.OwnerName); } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); OwnerName = MetaTypes.GetString(meta, _Data.OwnerName); } public override MetaPOINTER Save(MetaBuilder mb) { if (OwnerName != null) { _Data.OwnerName = mb.AddStringPtr(OwnerName); } mb.AddEnumInfo((MetaName)3044470860); mb.AddStructureInfo((MetaName)1701774085/*.SectionUNKNOWN1*/); return mb.AddItemPtr((MetaName)1701774085/*.SectionUNKNOWN1*/, _Data); } public override string ToString() { return "Unk_1701774085 - " + OwnerName; } } [TC(typeof(EXP))] public struct CCompositeEntityType //304 bytes, Key:659539004 dex: composite entity type - ytyp // Tom: des_ destruction { public ArrayOfChars64 Name { get; set; } //0 0: ArrayOfChars: 64: Name public float lodDist { get; set; } //64 64: Float: 0: lodDist public uint flags { get; set; } //68 68: UnsignedInt: 0: flags public uint specialAttribute { get; set; } //72 72: UnsignedInt: 0: specialAttribute public uint Unused0 { get; set; }//76 public Vector3 bbMin { get; set; } //80 80: Float_XYZ: 0: bbMin public float Unused1 { get; set; }//92 public Vector3 bbMax { get; set; } //96 96: Float_XYZ: 0: bbMax public float Unused2 { get; set; }//108 public Vector3 bsCentre { get; set; } //112 112: Float_XYZ: 0: bsCentre public float Unused3 { get; set; }//124 public float bsRadius { get; set; } //128 128: Float: 0: bsRadius public uint Unused4 { get; set; }//132 public ArrayOfChars64 StartModel { get; set; } //136 136: ArrayOfChars: 64: StartModel public ArrayOfChars64 EndModel { get; set; } //200 200: ArrayOfChars: 64: EndModel public MetaHash StartImapFile { get; set; } //264 264: Hash: 0: StartImapFile//2462971690 public MetaHash EndImapFile { get; set; } //268 268: Hash: 0: EndImapFile//2059586669 public MetaHash PtFxAssetName { get; set; } //272 272: Hash: 0: PtFxAssetName//2497993358 public uint Unused5 { get; set; }//276 public Array_Structure Animations { get; set; } //280 280: Array: 0: Animations {0: Structure: 1980345114: 256} public uint Unused6 { get; set; }//296 public uint Unused7 { get; set; }//300 public override string ToString() { return Name.ToString() + ", " + StartModel.ToString() + ", " + EndModel.ToString() + ", " + StartImapFile.ToString() + ", " + EndImapFile.ToString() + ", " + PtFxAssetName.ToString(); } } [TC(typeof(EXP))] public struct Unk_1980345114 //216 bytes, Key:4110496011 //destruction animations? { public ArrayOfChars64 AnimDict { get; set; } //0 0: ArrayOfChars: 64: AnimDict public ArrayOfChars64 AnimName { get; set; } //64 64: ArrayOfChars: 64: AnimName public ArrayOfChars64 AnimatedModel { get; set; } //128 128: ArrayOfChars: 64: AnimatedModel public float punchInPhase { get; set; } //192 192: Float: 0: punchInPhase//3142377407 public float punchOutPhase { get; set; } //196 196: Float: 0: punchOutPhase//2164219370 public Array_Structure effectsData { get; set; } //200 200: Array: 0: effectsData {0: Structure: 3430328684: 256} } [TC(typeof(EXP))] public struct Unk_2741784237 //64 bytes, Key:1172796107 //occludeModels { public Vector3 bmin { get; set; } //0 0: Float_XYZ: 0: bmin public float Unused0 { get; set; }//12 public Vector3 bmax { get; set; } //16 16: Float_XYZ: 0: bmax public float Unused1 { get; set; }//28 public uint dataSize { get; set; } //32 32: UnsignedInt: 0: dataSize//2442753371 public uint Unused2 { get; set; }//36 public DataBlockPointer verts { get; set; } //40 40: DataBlockPointer: 2: verts public ushort Unk_853977995 { get; set; } //48 48: UnsignedShort: 0: 853977995 public ushort Unk_2337695078 { get; set; } //50 50: UnsignedShort: 0: 2337695078 public uint flags { get; set; } //52 52: UnsignedInt: 0: flags public uint Unused3 { get; set; }//56 public uint Unused4 { get; set; }//60 } [TC(typeof(EXP))] public struct Unk_975711773 //16 bytes, Key:1831736438 //boxOccluders { public short iCenterX { get; set; } //0 0: SignedShort: 0: 48026296 public short iCenterY { get; set; } //2 2: SignedShort: 0: 896907229 public short iCenterZ { get; set; } //4 4: SignedShort: 0: 1597508449 public short iCosZ { get; set; } //6 6: SignedShort: 0: iCosZ public short iLength { get; set; } //8 8: SignedShort: 0: 2854610661 public short iWidth { get; set; } //10 10: SignedShort: 0: 168013536 public short iHeight { get; set; } //12 12: SignedShort: 0: 3485277993 public short iSinZ { get; set; } //14 14: SignedShort: 0: iSinZ } [TC(typeof(EXP))] public struct Unk_3430328684 //160 bytes, Key:1724963966 //destruction animation effects { public uint fxType { get; set; } //0 0: UnsignedInt: 0: fxType public uint Unused0 { get; set; }//4 public uint Unused1 { get; set; }//8 public uint Unused2 { get; set; }//12 public Vector3 fxOffsetPos { get; set; } //16 16: Float_XYZ: 0: fxOffsetPos public float Unused3 { get; set; }//28 public Vector4 fxOffsetRot { get; set; } //32 32: Float_XYZW: 0: fxOffsetRot public uint boneTag { get; set; } //48 48: UnsignedInt: 0: boneTag public float startPhase { get; set; } //52 52: Float: 0: startPhase public float endPhase { get; set; } //56 56: Float: 0: endPhase public byte ptFxIsTriggered { get; set; } //60 60: Boolean: 0: ptFxIsTriggered public ArrayOfChars64 ptFxTag { get; set; } //61 61: ArrayOfChars: 64: ptFxTag public byte Unused4 { get; set; }//125 public ushort Unused5 { get; set; }//126 public float ptFxScale { get; set; } //128 128: Float: 0: ptFxScale public float ptFxProbability { get; set; } //132 132: Float: 0: ptFxProbability public byte ptFxHasTint { get; set; } //136 136: Boolean: 0: ptFxHasTint public byte ptFxTintR { get; set; } //137 137: UnsignedByte: 0: ptFxTintR public byte ptFxTintG { get; set; } //138 138: UnsignedByte: 0: ptFxTintG public byte ptFxTintB { get; set; } //139 139: UnsignedByte: 0: ptFxTintB public uint Unused6 { get; set; }//140 public Vector3 ptFxSize { get; set; } //144 144: Float_XYZ: 0: ptFxSize public uint Unused7 { get; set; }//156 } [TC(typeof(EXP))] public struct CExtensionDefParticleEffect //96 bytes, Key:466596385 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public uint Unused3 { get; set; }//28 public Vector4 offsetRotation { get; set; } //32 32: Float_XYZW: 0: offsetRotation public CharPointer fxName { get; set; } //48 48: CharPointer: 0: fxName public int fxType { get; set; } //64 64: SignedInt: 0: fxType public int boneTag { get; set; } //68 68: SignedInt: 0: boneTag public float scale { get; set; } //72 72: Float: 0: scale public int probability { get; set; } //76 76: SignedInt: 0: probability public int flags { get; set; } //80 80: SignedInt: 0: flags public uint color { get; set; } //84 84: UnsignedInt: 0: color public uint Unused4 { get; set; }//88 public uint Unused5 { get; set; }//92 public override string ToString() { return "CExtensionDefParticleEffect - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefParticleEffect : MetaWrapper { public CExtensionDefParticleEffect _Data; public CExtensionDefParticleEffect Data { get { return _Data; } } public string fxName { get; set; } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); fxName = MetaTypes.GetString(meta, _Data.fxName); } public override MetaPOINTER Save(MetaBuilder mb) { if (fxName != null) { _Data.fxName = mb.AddStringPtr(fxName); } mb.AddStructureInfo(MetaName.CExtensionDefParticleEffect); return mb.AddItemPtr(MetaName.CExtensionDefParticleEffect, _Data); } public override string Name { get { return fxName; } } public override string ToString() { return _Data.ToString() + " - " + fxName; } } [TC(typeof(EXP))] public struct CExtensionDefLightEffect //48 bytes, Key:2436199897 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public Array_Structure instances { get; set; } //32 32: Array: 0: 274177522 {0: Structure: CLightAttrDef: 256} public override string ToString() { return "CExtensionDefLightEffect - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefLightEffect : MetaWrapper { public CExtensionDefLightEffect _Data; public CExtensionDefLightEffect Data { get { return _Data; } } public CLightAttrDef[] instances { get; set; } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); instances = MetaTypes.ConvertDataArray(meta, MetaName.CLightAttrDef, _Data.instances); } public override MetaPOINTER Save(MetaBuilder mb) { if (instances != null) { _Data.instances = mb.AddItemArrayPtr(MetaName.CLightAttrDef, instances); } mb.AddStructureInfo(MetaName.CLightAttrDef); mb.AddStructureInfo(MetaName.CExtensionDefLightEffect); return mb.AddItemPtr(MetaName.CExtensionDefLightEffect, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString() + " (" + (instances?.Length ?? 0).ToString() + " Attributes)"; } } [TC(typeof(EXP))] public struct CExtensionDefAudioCollisionSettings //48 bytes, Key:2701897500 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public MetaHash settings { get; set; } //32 32: Hash: 0: settings public uint Unused4 { get; set; }//36 public uint Unused5 { get; set; }//40 public uint Unused6 { get; set; }//44 public override string ToString() { return "CExtensionDefAudioCollisionSettings - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefAudioCollisionSettings : MetaWrapper { public CExtensionDefAudioCollisionSettings _Data; public CExtensionDefAudioCollisionSettings Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefAudioCollisionSettings); return mb.AddItemPtr(MetaName.CExtensionDefAudioCollisionSettings, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefAudioEmitter //64 bytes, Key:15929839 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public Vector4 offsetRotation { get; set; } //32 32: Float_XYZW: 0: offsetRotation public MetaHash effectHash { get; set; } //48 48: UnsignedInt: 0: effectHash//2982223448 public uint Unused4 { get; set; }//52 public uint Unused5 { get; set; }//56 public uint Unused6 { get; set; }//60 public override string ToString() { return "CExtensionDefAudioEmitter - " + name.ToString() + ": " + effectHash.ToString() + ": " + offsetPosition.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefAudioEmitter : MetaWrapper { public CExtensionDefAudioEmitter _Data; public CExtensionDefAudioEmitter Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefAudioEmitter); return mb.AddItemPtr(MetaName.CExtensionDefAudioEmitter, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefExplosionEffect //80 bytes, Key:2840366784 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public Vector4 offsetRotation { get; set; } //32 32: Float_XYZW: 0: offsetRotation public CharPointer explosionName { get; set; } //48 48: CharPointer: 0: explosionName//3301388915 public int boneTag { get; set; } //64 64: SignedInt: 0: boneTag public int explosionTag { get; set; } //68 68: SignedInt: 0: explosionTag//2653034051 public int explosionType { get; set; } //72 72: SignedInt: 0: explosionType//3379115010 public uint flags { get; set; } //76 76: UnsignedInt: 0: flags public override string ToString() { return "CExtensionDefExplosionEffect - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefExplosionEffect : MetaWrapper { public CExtensionDefExplosionEffect _Data; public CExtensionDefExplosionEffect Data { get { return _Data; } } public string explosionName { get; set; } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); explosionName = MetaTypes.GetString(meta, _Data.explosionName); } public override MetaPOINTER Save(MetaBuilder mb) { if (explosionName != null) { _Data.explosionName = mb.AddStringPtr(explosionName); } mb.AddStructureInfo(MetaName.CExtensionDefExplosionEffect); return mb.AddItemPtr(MetaName.CExtensionDefExplosionEffect, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString() + " - " + explosionName; } } [TC(typeof(EXP))] public struct CExtensionDefLadder //96 bytes, Key:1978210597 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public Vector3 bottom { get; set; } //32 32: Float_XYZ: 0: bottom public float Unused4 { get; set; }//44 public Vector3 top { get; set; } //48 48: Float_XYZ: 0: top public float Unused5 { get; set; }//60 public Vector3 normal { get; set; } //64 64: Float_XYZ: 0: normal public float Unused6 { get; set; }//76 public Unk_1294270217 materialType { get; set; } //80 80: IntEnum: 1294270217: materialType//932754174 public MetaHash template { get; set; } //84 84: Hash: 0: template public byte canGetOffAtTop { get; set; } //88 88: Boolean: 0: canGetOffAtTop//564839673 public byte canGetOffAtBottom { get; set; } //89 89: Boolean: 0: canGetOffAtBottom//923729576 public ushort Unused7 { get; set; }//90 public uint Unused8 { get; set; }//92 public override string ToString() { return "CExtensionDefLadder - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefLadder : MetaWrapper { public CExtensionDefLadder _Data; public CExtensionDefLadder Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddEnumInfo((MetaName)1294270217); mb.AddStructureInfo(MetaName.CExtensionDefLadder); return mb.AddItemPtr(MetaName.CExtensionDefLadder, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefBuoyancy //32 bytes, Key:2383039928 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public override string ToString() { return "CExtensionDefBuoyancy - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefBuoyancy : MetaWrapper { public CExtensionDefBuoyancy _Data; public CExtensionDefBuoyancy Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefBuoyancy); return mb.AddItemPtr(MetaName.CExtensionDefBuoyancy, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefExpression //48 bytes, Key:24441706 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public MetaHash Unk_1095612811 { get; set; } //32 32: Hash: 0: 1095612811 public MetaHash expressionName { get; set; } //36 36: Hash: 0: expressionName public MetaHash Unk_2766477159 { get; set; } //40 40: Hash: 0: 2766477159 public byte Unk_1562817888 { get; set; } //44 44: Boolean: 0: 1562817888 public byte Unused4 { get; set; }//45 public ushort Unused5 { get; set; }//46 public override string ToString() { return "CExtensionDefExpression - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefExpression : MetaWrapper { public CExtensionDefExpression _Data; public CExtensionDefExpression Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefExpression); return mb.AddItemPtr(MetaName.CExtensionDefExpression, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefLightShaft //176 bytes, Key:2526429398 { public uint Unused00 { get; set; }//0 public uint Unused01 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused02 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused03 { get; set; }//28 public Vector3 cornerA { get; set; } //32 32: Float_XYZ: 0: 3302595027 public float Unused04 { get; set; }//44 public Vector3 cornerB { get; set; } //48 48: Float_XYZ: 0: 2393877884 public float Unused05 { get; set; }//60 public Vector3 cornerC { get; set; } //64 64: Float_XYZ: 0: 2692731164 public float Unused06 { get; set; }//76 public Vector3 cornerD { get; set; } //80 80: Float_XYZ: 0: 4250372814 public float Unused07 { get; set; }//92 public Vector3 direction { get; set; } //96 96: Float_XYZ: 0: direction public float Unused08 { get; set; }//108 public float directionAmount { get; set; } //112 112: Float: 0: 1441249296 public float length { get; set; } //116 116: Float: 0: length public float Unk_1616789093 { get; set; } //120 120: Float: 0: 1616789093 public float Unk_120454521 { get; set; } //124 124: Float: 0: 120454521 public float Unk_1297365553 { get; set; } //128 128: Float: 0: 1297365553 public float Unk_75548206 { get; set; } //132 132: Float: 0: 75548206 public float Unk_40301253 { get; set; } //136 136: Float: 0: 40301253 public float Unk_475013030 { get; set; } //140 140: Float: 0: 475013030 public uint color { get; set; } //144 144: UnsignedInt: 0: color public float intensity { get; set; } //148 148: Float: 0: intensity public byte flashiness { get; set; } //152 152: UnsignedByte: 0: 3829693202 public byte Unused09 { get; set; }//153 public ushort Unused10 { get; set; }//154 public uint flags { get; set; } //156 156: UnsignedInt: 0: flags public Unk_1931949281 densityType { get; set; } //160 160: IntEnum: 1931949281: densityType//235100599 public Unk_2266515059 volumeType { get; set; } //164 164: IntEnum: 2266515059: volumeType//4021175589 public float softness { get; set; } //168 168: Float: 0: softness//187712958 public byte Unk_59101696 { get; set; } //172 172: Boolean: 0: 59101696 public byte Unused11 { get; set; }//173 public ushort Unused12 { get; set; }//174 public override string ToString() { return "CExtensionDefLightShaft - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefLightShaft : MetaWrapper { public CExtensionDefLightShaft _Data; public CExtensionDefLightShaft Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddEnumInfo((MetaName)1931949281); mb.AddEnumInfo((MetaName)2266515059); mb.AddStructureInfo(MetaName.CExtensionDefLightShaft); return mb.AddItemPtr(MetaName.CExtensionDefLightShaft, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefDoor //48 bytes, Key:2671601385 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public byte enableLimitAngle { get; set; } //32 32: Boolean: 0: enableLimitAngle=1979299226 public byte startsLocked { get; set; } //33 33: Boolean: 0: startsLocked=3204572347 public byte canBreak { get; set; } //34 34: Boolean: 0: canBreak=2756786344 public byte Unused4 { get; set; }//35 public float limitAngle { get; set; } //36 36: Float: 0: limitAngle public float doorTargetRatio { get; set; } //40 40: Float: 0: doorTargetRatio=770433283 public MetaHash audioHash { get; set; } //44 44: Hash: 0: audioHash=224069936 public override string ToString() { return "CExtensionDefDoor - " + name.ToString() + ", " + audioHash.ToString() + ", " + offsetPosition.ToString() + ", " + limitAngle.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefDoor : MetaWrapper { public CExtensionDefDoor _Data; public CExtensionDefDoor Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefDoor); return mb.AddItemPtr(MetaName.CExtensionDefDoor, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefSpawnPoint //96 bytes, Key:3077340721 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public Vector4 offsetRotation { get; set; } //32 32: Float_XYZW: 0: offsetRotation public MetaHash spawnType { get; set; } //48 48: Hash: 0: spawnType public MetaHash pedType { get; set; } //52 52: Hash: 0: pedType public MetaHash group { get; set; } //56 56: Hash: 0: group public MetaHash interior { get; set; } //60 60: Hash: 0: interior public MetaHash requiredImap { get; set; } //64 64: Hash: 0: requiredImap public Unk_3573596290 availableInMpSp { get; set; } //68 68: IntEnum: 3573596290: availableInMpSp public float probability { get; set; } //72 72: Float: 0: probability public float timeTillPedLeaves { get; set; } //76 76: Float: 0: timeTillPedLeaves public float radius { get; set; } //80 80: Float: 0: radius public byte start { get; set; } //84 84: UnsignedByte: 0: start public byte end { get; set; } //85 85: UnsignedByte: 0: end public ushort Unused4 { get; set; }//86 public Unk_700327466 flags { get; set; } //88 88: IntFlags2: 700327466: flags public byte highPri { get; set; } //92 92: Boolean: 0: highPri public byte extendedRange { get; set; } //93 93: Boolean: 0: extendedRange public byte shortRange { get; set; } //94 94: Boolean: 0: shortRange public byte Unused5 { get; set; }//95 public override string ToString() { return spawnType.ToString() + ": " + name.ToString() + ", " + pedType.ToString();// + ", " + flags.ToString() + ", " + offsetPosition.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefSpawnPoint : MetaWrapper { [TC(typeof(EXP))] public object Parent { get; set; } public MCScenarioPointRegion ScenarioRegion { get; private set; } public CExtensionDefSpawnPoint _Data; public CExtensionDefSpawnPoint Data { get { return _Data; } } public Vector3 ParentPosition { get; set; } = Vector3.Zero; public Vector3 OffsetPosition { get { return _Data.offsetPosition; } set { _Data.offsetPosition = value; } } public Vector4 OffsetRotation { get { return _Data.offsetRotation; } set { _Data.offsetRotation = value; } } public MetaHash NameHash { get { return _Data.name; } set { _Data.name = value; } } public MetaHash SpawnType { get { return _Data.spawnType; } set { _Data.spawnType = value; } } public MetaHash PedType { get { return _Data.pedType; } set { _Data.pedType = value; } } public MetaHash Group { get { return _Data.group; } set { _Data.group = value; } } public MetaHash Interior { get { return _Data.interior; } set { _Data.interior = value; } } public MetaHash RequiredImap { get { return _Data.requiredImap; } set { _Data.requiredImap = value; } } public Unk_3573596290 AvailableInMpSp { get { return _Data.availableInMpSp; } set { _Data.availableInMpSp = value; } } public float Probability { get { return _Data.probability; } set { _Data.probability = value; } } public float TimeTillPedLeaves { get { return _Data.timeTillPedLeaves; } set { _Data.timeTillPedLeaves = value; } } public float Radius { get { return _Data.radius; } set { _Data.radius = value; } } public byte StartTime { get { return _Data.start; } set { _Data.start = value; } } public byte EndTime { get { return _Data.end; } set { _Data.end = value; } } public Unk_700327466 Flags { get { return _Data.flags; } set { _Data.flags = value; } } public bool HighPri { get { return _Data.highPri == 1; } set { _Data.highPri = (byte)(value ? 1 : 0); } } public bool ExtendedRange { get { return _Data.extendedRange == 1; } set { _Data.extendedRange = (byte)(value ? 1 : 0); } } public bool ShortRange { get { return _Data.shortRange == 1; } set { _Data.shortRange = (byte)(value ? 1 : 0); } } public Vector3 Position { get { return _Data.offsetPosition + ParentPosition; } set { _Data.offsetPosition = value - ParentPosition; } } public Quaternion Orientation { get { return new Quaternion(_Data.offsetRotation); } set { _Data.offsetRotation = value.ToVector4(); } } public MCExtensionDefSpawnPoint() { } public MCExtensionDefSpawnPoint(MCScenarioPointRegion region, Meta meta, CExtensionDefSpawnPoint data, object parent) { ScenarioRegion = region; Parent = parent; _Data = data; } public MCExtensionDefSpawnPoint(MCScenarioPointRegion region, MCExtensionDefSpawnPoint copy) { ScenarioRegion = region; if (copy != null) { _Data = copy.Data; Parent = copy.Parent; ParentPosition = copy.ParentPosition; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddEnumInfo((MetaName)3573596290); mb.AddEnumInfo((MetaName)700327466); mb.AddStructureInfo(MetaName.CExtensionDefSpawnPoint); return mb.AddItemPtr(MetaName.CExtensionDefSpawnPoint, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefSpawnPointOverride //64 bytes, Key:2551875873 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public MetaHash ScenarioType { get; set; } //32 32: Hash: 0: ScenarioType public byte iTimeStartOverride { get; set; } //36 36: UnsignedByte: 0: iTimeStartOverride//591476992 public byte iTimeEndOverride { get; set; } //37 37: UnsignedByte: 0: iTimeEndOverride//2688038523 public ushort Unused4 { get; set; }//38 public MetaHash Group { get; set; } //40 40: Hash: 0: Group public MetaHash ModelSet { get; set; } //44 44: Hash: 0: ModelSet public Unk_3573596290 AvailabilityInMpSp { get; set; } //48 48: IntEnum: 3573596290: AvailabilityInMpSp//2932681318 public Unk_700327466 Flags { get; set; } //52 52: IntFlags2: 700327466: Flags public float Radius { get; set; } //56 56: Float: 0: Radius public float TimeTillPedLeaves { get; set; } //60 60: Float: 0: TimeTillPedLeaves//4073598194 public override string ToString() { return "CExtensionDefSpawnPointOverride - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefSpawnPointOverride : MetaWrapper { public CExtensionDefSpawnPointOverride _Data; public CExtensionDefSpawnPointOverride Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddEnumInfo((MetaName)3573596290); mb.AddEnumInfo((MetaName)700327466); mb.AddStructureInfo(MetaName.CExtensionDefSpawnPointOverride); return mb.AddItemPtr(MetaName.CExtensionDefSpawnPointOverride, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefWindDisturbance //96 bytes, Key:3971538917 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public Vector4 offsetRotation { get; set; } //32 32: Float_XYZW: 0: offsetRotation public int disturbanceType { get; set; } //48 48: SignedInt: 0: disturbanceType//3802708370 public int boneTag { get; set; } //52 52: SignedInt: 0: boneTag public uint Unused4 { get; set; }//56 public uint Unused5 { get; set; }//60 public Vector4 size { get; set; } //64 64: Float_XYZW: 0: size public float strength { get; set; } //80 80: Float: 0: strength public int flags { get; set; } //84 84: SignedInt: 0: flags public uint Unused6 { get; set; }//88 public uint Unused7 { get; set; }//92 public override string ToString() { return "CExtensionDefWindDisturbance - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefWindDisturbance : MetaWrapper { public CExtensionDefWindDisturbance _Data; public CExtensionDefWindDisturbance Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefWindDisturbance); return mb.AddItemPtr(MetaName.CExtensionDefWindDisturbance, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CExtensionDefProcObject //80 bytes, Key:3965391891 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public MetaHash name { get; set; } //8 8: Hash: 0: name public uint Unused2 { get; set; }//12 public Vector3 offsetPosition { get; set; } //16 16: Float_XYZ: 0: offsetPosition public float Unused3 { get; set; }//28 public float radiusInner { get; set; } //32 32: Float: 0: radiusInner//406390660 public float radiusOuter { get; set; } //36 36: Float: 0: radiusOuter//1814053978 public float spacing { get; set; } //40 40: Float: 0: spacing public float minScale { get; set; } //44 44: Float: 0: minScale//3662913353 public float maxScale { get; set; } //48 48: Float: 0: maxScale//803384552 public float Unk_3913056845 { get; set; } //52 52: Float: 0: 3913056845 public float Unk_147400493 { get; set; } //56 56: Float: 0: 147400493 public float Unk_2591582364 { get; set; } //60 60: Float: 0: 2591582364 public float Unk_3889902555 { get; set; } //64 64: Float: 0: 3889902555 public uint objectHash { get; set; } //68 68: UnsignedInt: 0: objectHash//1951307499 public uint flags { get; set; } //72 72: UnsignedInt: 0: flags public uint Unused4 { get; set; }//76 public override string ToString() { return "CExtensionDefProcObject - " + name.ToString(); } } [TC(typeof(EXP))] public class MCExtensionDefProcObject : MetaWrapper { public CExtensionDefProcObject _Data; public CExtensionDefProcObject Data { get { return _Data; } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefProcObject); return mb.AddItemPtr(MetaName.CExtensionDefProcObject, _Data); } public override string Name { get { return _Data.name.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CScenarioPointRegion //SCENARIO YMT ROOT - in /scenario/ folder //376 bytes, Key:3501351821 { public int VersionNumber { get; set; } //0 0: SignedInt: 0: VersionNumber public uint Unused0 { get; set; }//4 public CScenarioPointContainer Points { get; set; } //8 8: Structure: CScenarioPointContainer//2380938603: Points//702683191 public uint Unused1 { get; set; }//56 public uint Unused2 { get; set; }//60 public uint Unused3 { get; set; }//64 public uint Unused4 { get; set; }//68 public Array_Structure EntityOverrides { get; set; } //72 72: Array: 0: EntityOverrides//697469539 {0: Structure: CScenarioEntityOverride//4213733800: 256} public uint Unused5 { get; set; }//88 public uint Unused6 { get; set; }//92 public Unk_4023740759 Unk_3696045377 { get; set; } //[PATHS] 96 96: Structure: 4023740759: 3696045377 public rage__spdGrid2D AccelGrid { get; set; } //184 184: Structure: rage__spdGrid2D: AccelGrid//3053155275 public Array_ushort Unk_3844724227 { get; set; } //248 248: Array: 0: 3844724227 {0: UnsignedShort: 0: 256} public Array_Structure Clusters { get; set; } //264 264: Array: 0: Clusters//3587988394 {0: Structure: CScenarioPointCluster//750308016: 256} public CScenarioPointLookUps LookUps { get; set; } //280 280: Structure: CScenarioPointLookUps//3019621867: LookUps//1097626284 } [TC(typeof(EXP))] public class MCScenarioPointRegion : MetaWrapper { public YmtFile Ymt { get; set; } public CScenarioPointRegion _Data; public CScenarioPointRegion Data { get { return _Data; } } public MCScenarioPointContainer Points { get; set; } public MCScenarioEntityOverride[] EntityOverrides { get; set; } public MUnk_4023740759 Paths { get; set; } public ushort[] Unk_3844724227 { get; set; } //GRID DATA - 2d dimensions - AccelGrid ((MaxX-MinX)+1)*((MaxY-MinY)+1) public MCScenarioPointCluster[] Clusters { get; set; } public MCScenarioPointLookUps LookUps { get; set; } public int VersionNumber { get { return _Data.VersionNumber; } set { _Data.VersionNumber = value; } } public override void Load(Meta meta, MetaPOINTER ptr) { var data = MetaTypes.GetData(meta, ptr); Load(meta, data); } public void Load(Meta meta, CScenarioPointRegion data) { _Data = data; Points = new MCScenarioPointContainer(this, meta, _Data.Points); var entOverrides = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioEntityOverride, _Data.EntityOverrides); if (entOverrides != null) { EntityOverrides = new MCScenarioEntityOverride[entOverrides.Length]; for (int i = 0; i < entOverrides.Length; i++) { EntityOverrides[i] = new MCScenarioEntityOverride(this, meta, entOverrides[i]); } } Paths = new MUnk_4023740759(this, meta, _Data.Unk_3696045377); var clusters = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioPointCluster, _Data.Clusters); if (clusters != null) { Clusters = new MCScenarioPointCluster[clusters.Length]; for (int i = 0; i < clusters.Length; i++) { Clusters[i] = new MCScenarioPointCluster(this, meta, clusters[i]); } } Unk_3844724227 = MetaTypes.GetUshortArray(meta, _Data.Unk_3844724227); LookUps = new MCScenarioPointLookUps(this, meta, _Data.LookUps); #region data analysis ////data analysis //if (Points.LoadSavePoints != null) //{ } //no hits here! //if (Unk_3844724227 != null) //{ // var grid = _Data.AccelGrid; // var minx = grid.Unk_MinX_860552138; // var maxx = grid.Unk_MaxX_3824598937; // var miny = grid.Unk_MinY_496029782; // var maxy = grid.Unk_MaxY_3374647798; // var len = Unk_3844724227.Length; // var calclen = ((maxx - minx) + 1) * ((maxy - miny) + 1); // if (len != calclen) // { } //no hits here! // int pointcount = 0; // if (Points.MyPoints != null) pointcount += Points.MyPoints.Length; // //if (Points.LoadSavePoints != null) pointcount += Points.LoadSavePoints.Length;//not necessary! // int lastuval = 0; // for (int i = 0; i < Unk_3844724227.Length; i++) // { // var uval = Unk_3844724227[i]; // var uval2 = uval & 0x7FFF; // var uval3 = uval >> 15; //what does this bit mean? // if (uval3 > 0) // { } // lastuval = uval2; // if (uval2 > pointcount) // { } //no hits here! // } // if (lastuval != pointcount) // { } //no hits here! //} #endregion } public override MetaPOINTER Save(MetaBuilder mb) { var sprb = mb.EnsureBlock(MetaName.CScenarioPointRegion); //var hashb = mb.EnsureBlock(MetaName.HASH); //var ushb = mb.EnsureBlock(MetaName.USHORT); //var pntb = mb.EnsureBlock(MetaName.CScenarioPoint); mb.AddStructureInfo(MetaName.CScenarioPointContainer); mb.AddStructureInfo((MetaName)4023740759); mb.AddStructureInfo(MetaName.rage__spdGrid2D); mb.AddStructureInfo(MetaName.CScenarioPointLookUps); mb.AddStructureInfo(MetaName.CScenarioPointRegion); if (Points != null) { var scp = new CScenarioPointContainer(); var loadSavePoints = Points.GetCLoadSavePoints(); if (loadSavePoints != null)//this never seems to be used... { mb.AddStructureInfo(MetaName.CExtensionDefSpawnPoint); mb.AddEnumInfo((MetaName)3573596290); mb.AddEnumInfo((MetaName)700327466); scp.LoadSavePoints = mb.AddItemArrayPtr(MetaName.CExtensionDefSpawnPoint, loadSavePoints); } var myPoints = Points.GetCMyPoints(); if (myPoints != null) { mb.AddStructureInfo(MetaName.CScenarioPoint); mb.AddEnumInfo((MetaName)700327466); scp.MyPoints = mb.AddItemArrayPtr(MetaName.CScenarioPoint, myPoints); } _Data.Points = scp; } else { _Data.Points = new CScenarioPointContainer(); } if ((EntityOverrides != null) && (EntityOverrides.Length > 0)) { //mb.AddStructureInfo(MetaName.CScenarioEntityOverride); //will get added by MCScenarioEntityOverride //mb.AddStructureInfo(MetaName.CExtensionDefSpawnPoint); _Data.EntityOverrides = mb.AddWrapperArray(EntityOverrides); } else { _Data.EntityOverrides = new Array_Structure(); } if (Paths != null) { var pd = new Unk_4023740759(); var nodes = Paths.GetCNodes(); if (nodes != null) { mb.AddStructureInfo(MetaName.CScenarioChainingNode); pd.Nodes = mb.AddItemArrayPtr(MetaName.CScenarioChainingNode, nodes); } var edges = Paths.GetCEdges(); if (edges != null) { mb.AddStructureInfo(MetaName.CScenarioChainingEdge); mb.AddEnumInfo((MetaName)3609807418); mb.AddEnumInfo((MetaName)3971773454); mb.AddEnumInfo((MetaName)941086046); pd.Edges = mb.AddItemArrayPtr(MetaName.CScenarioChainingEdge, edges); } if (Paths.Chains != null) { foreach (var chain in Paths.Chains) { if (chain.EdgeIds != null) { chain._Data.EdgeIds = mb.AddUshortArrayPtr(chain.EdgeIds); } else { chain._Data.EdgeIds = new Array_ushort(); } } } var chains = Paths.GetCChains(); if (chains != null) { mb.AddStructureInfo(MetaName.CScenarioChain); pd.Chains = mb.AddItemArrayPtr(MetaName.CScenarioChain, chains); } _Data.Unk_3696045377 = pd; } else { _Data.Unk_3696045377 = new Unk_4023740759(); } if ((Clusters != null) && (Clusters.Length > 0)) { //mb.AddStructureInfo(MetaName.rage__spdSphere); //mb.AddStructureInfo(MetaName.CScenarioPointCluster); _Data.Clusters = mb.AddWrapperArray(Clusters); } else { _Data.Clusters = new Array_Structure(); } if ((Unk_3844724227 != null) && (Unk_3844724227.Length > 0)) { _Data.Unk_3844724227 = mb.AddUshortArrayPtr(Unk_3844724227); } else { _Data.Unk_3844724227 = new Array_ushort(); } if (LookUps != null) { var spl = new CScenarioPointLookUps(); if ((LookUps.TypeNames != null) && (LookUps.TypeNames.Length > 0)) { spl.TypeNames = mb.AddHashArrayPtr(LookUps.TypeNames); } if ((LookUps.PedModelSetNames != null) && (LookUps.PedModelSetNames.Length > 0)) { spl.PedModelSetNames = mb.AddHashArrayPtr(LookUps.PedModelSetNames); } if ((LookUps.VehicleModelSetNames != null) && (LookUps.VehicleModelSetNames.Length > 0)) { spl.VehicleModelSetNames = mb.AddHashArrayPtr(LookUps.VehicleModelSetNames); } if ((LookUps.GroupNames != null) && (LookUps.GroupNames.Length > 0)) { spl.GroupNames = mb.AddHashArrayPtr(LookUps.GroupNames); } if ((LookUps.InteriorNames != null) && (LookUps.InteriorNames.Length > 0)) { spl.InteriorNames = mb.AddHashArrayPtr(LookUps.InteriorNames); } if ((LookUps.RequiredIMapNames != null) && (LookUps.RequiredIMapNames.Length > 0)) { spl.RequiredIMapNames = mb.AddHashArrayPtr(LookUps.RequiredIMapNames); } _Data.LookUps = spl; } else { _Data.LookUps = new CScenarioPointLookUps(); //this shouldn't happen... } return mb.AddItemPtr(MetaName.CScenarioPointRegion, _Data); } public void AddCluster(MCScenarioPointCluster cluster) { List newclusters = new List(); if (Clusters != null) { newclusters.AddRange(Clusters); } cluster.Region = this; //cluster.ClusterIndex = newclusters.Count; newclusters.Add(cluster); Clusters = newclusters.ToArray(); } public void AddEntity(MCScenarioEntityOverride ent) { List newents = new List(); if (EntityOverrides != null) { newents.AddRange(EntityOverrides); } ent.Region = this; //ent.EntityIndex = newents.Count; newents.Add(ent); EntityOverrides = newents.ToArray(); } public bool RemoveCluster(MCScenarioPointCluster cluster) { bool r = false; if (Clusters != null) { List newclusters = new List(); foreach (var nc in Clusters) { if (nc == cluster) { r = true; } else { //nc.ClusterIndex = newclusters.Count; newclusters.Add(nc); } } if (r) { Clusters = newclusters.ToArray(); } } return r; } public bool RemoveEntity(MCScenarioEntityOverride ent) { bool r = false; if (EntityOverrides != null) { List newents = new List(); foreach (var nc in EntityOverrides) { if (nc == ent) { r = true; } else { //nc.EntityIndex = newents.Count; newents.Add(nc); } } if (r) { EntityOverrides = newents.ToArray(); } } return r; } public override string Name { get { return Ymt?.ToString() ?? "CScenarioPointRegion"; } } public override string ToString() { return Name; } } [TC(typeof(EXP))] public struct CScenarioPointContainer //SCENARIO Region Points arrays // 48 bytes, Key:2489654897 { public Array_Structure LoadSavePoints { get; set; } //0 0: Array: 0: LoadSavePoints//3016741991 {0: Structure: CExtensionDefSpawnPoint: 256} public Array_Structure MyPoints { get; set; } //16 16: Array: 0: MyPoints//1170781136 {0: Structure: CScenarioPoint//4103049490: 256} public uint Unused0 { get; set; }//32 public uint Unused1 { get; set; }//36 public uint Unused2 { get; set; }//40 public uint Unused3 { get; set; }//44 public override string ToString() { return LoadSavePoints.Count1.ToString() + " LoadSavePoints, " + MyPoints.Count1.ToString() + " MyPoints"; } } [TC(typeof(EXP))] public class MCScenarioPointContainer : MetaWrapper { [TC(typeof(EXP))] public object Parent { get; set; } public MCScenarioPointRegion Region { get; private set; } public CScenarioPointContainer _Data; public CScenarioPointContainer Data { get { return _Data; } set { _Data = value; } } public MCExtensionDefSpawnPoint[] LoadSavePoints { get; set; } public MCScenarioPoint[] MyPoints { get; set; } public MCScenarioPointContainer() { } public MCScenarioPointContainer(MCScenarioPointRegion region) { Region = region; } public MCScenarioPointContainer(MCScenarioPointRegion region, Meta meta, CScenarioPointContainer d) { Region = region; _Data = d; Init(meta); } public void Init(Meta meta) { var vLoadSavePoints = MetaTypes.ConvertDataArray(meta, MetaName.CExtensionDefSpawnPoint, _Data.LoadSavePoints); if (vLoadSavePoints != null) { LoadSavePoints = new MCExtensionDefSpawnPoint[vLoadSavePoints.Length]; for (int i = 0; i < vLoadSavePoints.Length; i++) { LoadSavePoints[i] = new MCExtensionDefSpawnPoint(Region, meta, vLoadSavePoints[i], this); } } var vMyPoints = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioPoint, _Data.MyPoints); if (vMyPoints != null) { MyPoints = new MCScenarioPoint[vMyPoints.Length]; for (int i = 0; i < vMyPoints.Length; i++) { MyPoints[i] = new MCScenarioPoint(Region, meta, vMyPoints[i], this); MyPoints[i].PointIndex = i; } } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); Init(meta); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioPointContainer); return mb.AddItemPtr(MetaName.CScenarioPointContainer, _Data); } public CExtensionDefSpawnPoint[] GetCLoadSavePoints() { if ((LoadSavePoints == null) || (LoadSavePoints.Length == 0)) return null; CExtensionDefSpawnPoint[] r = new CExtensionDefSpawnPoint[LoadSavePoints.Length]; for (int i = 0; i < LoadSavePoints.Length; i++) { r[i] = LoadSavePoints[i].Data; } return r; } public CScenarioPoint[] GetCMyPoints() { if ((MyPoints == null) || (MyPoints.Length == 0)) return null; CScenarioPoint[] r = new CScenarioPoint[MyPoints.Length]; for (int i = 0; i < MyPoints.Length; i++) { r[i] = MyPoints[i].Data; } return r; } public void AddMyPoint(MCScenarioPoint p) { List newpoints = new List(); if (MyPoints != null) { newpoints.AddRange(MyPoints); } p.PointIndex = newpoints.Count; newpoints.Add(p); p.Container = this; MyPoints = newpoints.ToArray(); } public void AddLoadSavePoint(MCExtensionDefSpawnPoint p) { List newpoints = new List(); if (LoadSavePoints != null) { newpoints.AddRange(LoadSavePoints); } newpoints.Add(p); p.Parent = this; LoadSavePoints = newpoints.ToArray(); } public bool RemoveMyPoint(MCScenarioPoint p) { bool r = false; if (MyPoints != null) { List newpoints = new List(); foreach (var mp in MyPoints) { if (mp == p) { r = true; } else { newpoints.Add(mp); } } if (r) { MyPoints = newpoints.ToArray(); for (int i = 0; i < MyPoints.Length; i++) { MyPoints[i].PointIndex = i; } } } return r; } public bool RemoveLoadSavePoint(MCExtensionDefSpawnPoint p) { bool r = false; if (LoadSavePoints != null) { List newpoints = new List(); foreach (var mp in LoadSavePoints) { if (mp == p) { r = true; } else { newpoints.Add(mp); } } if (r) { LoadSavePoints = newpoints.ToArray(); } } return r; } public override string Name { get { return "CScenarioPointContainer"; } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CScenarioPoint //SCENARIO Point, similar to CExtensionDefSpawnPointOverride //64 bytes, Key:402442150 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 public uint Unused2 { get; set; }//8 public uint Unused3 { get; set; }//12 public uint Unused4 { get; set; }//16 public byte Unused5 { get; set; }//20 public byte iType { get; set; } //21 21: UnsignedByte: 0: iType public byte ModelSetId { get; set; } //22 22: UnsignedByte: 0: ModelSetId//3361647288 public byte iInterior { get; set; } //23 23: UnsignedByte: 0: 1975994103 public byte iRequiredIMapId { get; set; } //24 24: UnsignedByte: 0: iRequiredIMapId//1229525587 public byte iProbability { get; set; } //25 25: UnsignedByte: 0: iProbability//2974610960 public byte Unk_717991212_SpOnly { get; set; } //26 26: UnsignedByte: 0: 717991212 // animal point, or a ped with a pet? public byte iTimeStartOverride { get; set; } //27 27: UnsignedByte: 0: 591476992 public byte iTimeEndOverride { get; set; } //28 28: UnsignedByte: 0: 2688038523 public byte iRadius { get; set; } //29 29: UnsignedByte: 0: iRadius public byte iTimeTillPedLeaves { get; set; } //30 30: UnsignedByte: 0: 2296188475 //in game minutes? public byte Unused6 { get; set; }//31 public ushort iScenarioGroup { get; set; } //32 32: UnsignedShort: 0: iScenarioGroup//2180252673 public ushort Unused7 { get; set; }//34 public Unk_700327466 Flags { get; set; } //36 36: IntFlags2: 700327466: Flags public uint Unused8 { get; set; }//40 public uint Unused9 { get; set; }//44 public Vector4 vPositionAndDirection { get; set; } //48 48: Float_XYZW: 0: vPositionAndDirection//4685037 public override string ToString() { return FloatUtil.GetVector4String(vPositionAndDirection); //iTimeStartOverride.ToString() + "-" + iTimeEndOverride.ToString();// + ", " + Flags.ToString(); } } [TC(typeof(EXP))] public class MCScenarioPoint : MetaWrapper { [TC(typeof(EXP))] public MCScenarioPointContainer Container { get; set; } public MCScenarioPointRegion Region { get; set; } public CScenarioPoint _Data; public CScenarioPoint Data { get { return _Data; } set { _Data = value; } } public Vector3 Position { get { return _Data.vPositionAndDirection.XYZ(); } set { _Data.vPositionAndDirection = new Vector4(value, Direction); } } public float Direction { get { return _Data.vPositionAndDirection.W; } set { _Data.vPositionAndDirection = new Vector4(Position, value); } } public Quaternion Orientation { get { return Quaternion.RotationAxis(Vector3.UnitZ, Direction); } set { Vector3 dir = value.Multiply(Vector3.UnitX); float dira = (float)Math.Atan2(dir.Y, dir.X); Direction = dira; } } public byte TypeId { get { return _Data.iType; } set { _Data.iType = value; } } public ScenarioType Type { get; set; } public byte ModelSetId { get { return _Data.ModelSetId; } set { _Data.ModelSetId = value; } } public AmbientModelSet ModelSet { get; set; } public byte InteriorId { get { return _Data.iInterior; } set { _Data.iInterior = value; } } public MetaHash InteriorName { get; set; } public ushort GroupId { get { return _Data.iScenarioGroup; } set { _Data.iScenarioGroup = value; } } public MetaHash GroupName { get; set; } public byte IMapId { get { return _Data.iRequiredIMapId; } set { _Data.iRequiredIMapId = value; } } public MetaHash IMapName { get; set; } public string TimeRange { get { return _Data.iTimeStartOverride.ToString().PadLeft(2, '0') + ":00 - " + _Data.iTimeEndOverride.ToString().PadLeft(2, '0') + ":00"; } } public byte TimeStart { get { return _Data.iTimeStartOverride; } set { _Data.iTimeStartOverride = value; } } public byte TimeEnd { get { return _Data.iTimeEndOverride; } set { _Data.iTimeEndOverride = value; } } public byte Probability { get { return _Data.iProbability; } set { _Data.iProbability = value; } } public byte SpOnlyFlag { get { return _Data.Unk_717991212_SpOnly; } set { _Data.Unk_717991212_SpOnly = value; } } public byte Radius { get { return _Data.iRadius; } set { _Data.iRadius = value; } } public byte WaitTime { get { return _Data.iTimeTillPedLeaves; } set { _Data.iTimeTillPedLeaves = value; } } public Unk_700327466 Flags { get { return _Data.Flags; } set { _Data.Flags = value; } } public int PointIndex { get; set; } public MCScenarioPoint(MCScenarioPointRegion region) { Region = region; } public MCScenarioPoint(MCScenarioPointRegion region, Meta meta, CScenarioPoint d, MCScenarioPointContainer container) { Region = region; Container = container; _Data = d; } public MCScenarioPoint(MCScenarioPointRegion region, MCScenarioPoint copy) { Region = region; if (copy != null) { _Data = copy.Data; Type = copy.Type; ModelSet = copy.ModelSet; InteriorName = copy.InteriorName; GroupName = copy.GroupName; IMapName = copy.IMapName; } } public void CopyFrom(MCScenarioPoint copy) { _Data = copy.Data; Type = copy.Type; ModelSet = copy.ModelSet; InteriorName = copy.InteriorName; GroupName = copy.GroupName; IMapName = copy.IMapName; } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioPoint); return mb.AddItemPtr(MetaName.CScenarioPoint, _Data); } public override string Name { get { return (Type?.ToString() ?? "") + ": " + (ModelSet?.ToString() ?? ""); } } public override string ToString() { return Name + ": " + TimeRange; } } [TC(typeof(EXP))] public struct CScenarioEntityOverride //SCENARIO Entity Override //80 bytes, Key:1271200492 { public Vector3 EntityPosition { get; set; } //0 0: Float_XYZ: 0: EntityPosition//642078041 public float Unused00 { get; set; }//12 public MetaHash EntityType { get; set; } //16 16: Hash: 0: EntityType//1374199246 public uint Unused01 { get; set; }//20 public Array_Structure ScenarioPoints { get; set; } //24 24: Array: 0: ScenarioPoints {0: Structure: CExtensionDefSpawnPoint: 256} public uint Unused02 { get; set; }//40 public uint Unused03 { get; set; }//44 public uint Unused04 { get; set; }//48 public uint Unused05 { get; set; }//52 public uint Unused06 { get; set; }//56 public uint Unused07 { get; set; }//60 public byte Unk_538733109 { get; set; } //64 64: Boolean: 0: 538733109 public byte Unk_1035513142 { get; set; } //65 65: Boolean: 0: 1035513142 public ushort Unused08 { get; set; }//66 public uint Unused09 { get; set; }//68 public uint Unused10 { get; set; }//72 public uint Unused11 { get; set; }//76 public override string ToString() { return EntityType.ToString() + ", " + ScenarioPoints.Count1.ToString() + " ScenarioPoints"; } } [TC(typeof(EXP))] public class MCScenarioEntityOverride : MetaWrapper { [TC(typeof(EXP))] public object Parent { get; set; } public MCScenarioPointRegion Region { get; set; } public CScenarioEntityOverride _Data; public CScenarioEntityOverride Data { get { return _Data; } set { _Data = value; } } public Vector3 Position { get { return _Data.EntityPosition; } set { _Data.EntityPosition = value; } } public MetaHash TypeName { get { return _Data.EntityType; } set { _Data.EntityType = value; } } public byte Unk1 { get { return _Data.Unk_538733109; } set { _Data.Unk_538733109 = value; } } public byte Unk2 { get { return _Data.Unk_1035513142; } set { _Data.Unk_1035513142 = value; } } public MCExtensionDefSpawnPoint[] ScenarioPoints { get; set; } public MCScenarioEntityOverride() { } public MCScenarioEntityOverride(MCScenarioPointRegion region, MCScenarioEntityOverride copy) { Region = region; if (copy != null) { _Data = copy.Data; } } public MCScenarioEntityOverride(MCScenarioPointRegion region, Meta meta, CScenarioEntityOverride d) { Region = region; _Data = d; Init(meta); } public void Init(Meta meta) { var scenarioPoints = MetaTypes.ConvertDataArray(meta, MetaName.CExtensionDefSpawnPoint, _Data.ScenarioPoints); if (scenarioPoints != null) { ScenarioPoints = new MCExtensionDefSpawnPoint[scenarioPoints.Length]; for (int i = 0; i < scenarioPoints.Length; i++) { ScenarioPoints[i] = new MCExtensionDefSpawnPoint(Region, meta, scenarioPoints[i], this); ScenarioPoints[i].ParentPosition = Position; } } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); Init(meta); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioEntityOverride); if (ScenarioPoints != null) { mb.AddStructureInfo(MetaName.CExtensionDefSpawnPoint); mb.AddEnumInfo((MetaName)3573596290); mb.AddEnumInfo((MetaName)700327466); _Data.ScenarioPoints = mb.AddWrapperArray(ScenarioPoints); } return mb.AddItemPtr(MetaName.CScenarioEntityOverride, _Data); } public void AddScenarioPoint(MCExtensionDefSpawnPoint p) { List newpoints = new List(); if (ScenarioPoints != null) { newpoints.AddRange(ScenarioPoints); } newpoints.Add(p); p.Parent = this; ScenarioPoints = newpoints.ToArray(); } public bool RemoveScenarioPoint(MCExtensionDefSpawnPoint p) { bool r = false; if (ScenarioPoints != null) { List newpoints = new List(); foreach (var mp in ScenarioPoints) { if (mp == p) { r = true; } else { newpoints.Add(mp); } } if (r) { ScenarioPoints = newpoints.ToArray(); } } return r; } public override string Name { get { return "CScenarioEntityOverride " + _Data.EntityType.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct Unk_4023740759 //SCENARIO PATH ARRAYS //88 bytes, Key:88255871 { public Array_Structure Nodes { get; set; } //0 0: Array: 0: Nodes {0: Structure: CScenarioChainingNode//3340683255: 256} public Array_Structure Edges { get; set; } //16 16: Array: 0: Edges {0: Structure: CScenarioChainingEdge//4255409560: 256} public Array_Structure Chains { get; set; } //32 32: Array: 0: Chains {0: Structure: CScenarioChain: 256} public uint Unused0 { get; set; }//48 public uint Unused1 { get; set; }//52 public uint Unused2 { get; set; }//56 public uint Unused3 { get; set; }//60 public uint Unused4 { get; set; }//64 public uint Unused5 { get; set; }//68 public uint Unused6 { get; set; }//72 public uint Unused7 { get; set; }//76 public uint Unused8 { get; set; }//80 public uint Unused9 { get; set; }//84 public override string ToString() { return Nodes.Count1.ToString() + " Nodes, " + Edges.Count1.ToString() + " Edges, " + Chains.Count1.ToString() + " Chains"; } } [TC(typeof(EXP))] public class MUnk_4023740759 : MetaWrapper { public MCScenarioPointRegion Region { get; private set; } public Unk_4023740759 _Data; public Unk_4023740759 Data { get { return _Data; } set { _Data = value; } } public MCScenarioChainingNode[] Nodes { get; set; } public MCScenarioChainingEdge[] Edges { get; set; } public MCScenarioChain[] Chains { get; set; } public MUnk_4023740759() { } public MUnk_4023740759(MCScenarioPointRegion region) { Region = region; } public MUnk_4023740759(MCScenarioPointRegion region, Meta meta, Unk_4023740759 d) { Region = region; _Data = d; Init(meta); } public void Init(Meta meta) { var pathnodes = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChainingNode, _Data.Nodes); if (pathnodes != null) { Nodes = new MCScenarioChainingNode[pathnodes.Length]; for (int i = 0; i < pathnodes.Length; i++) { Nodes[i] = new MCScenarioChainingNode(Region, meta, pathnodes[i], this, i); } } var pathedges = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChainingEdge, _Data.Edges); if (pathedges != null) { Edges = new MCScenarioChainingEdge[pathedges.Length]; for (int i = 0; i < pathedges.Length; i++) { Edges[i] = new MCScenarioChainingEdge(Region, meta, pathedges[i], i); } } var pathchains = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChain, _Data.Chains); if (pathchains != null) { Chains = new MCScenarioChain[pathchains.Length]; for (int i = 0; i < pathchains.Length; i++) { Chains[i] = new MCScenarioChain(Region, meta, pathchains[i]); } } } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); Init(meta); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo((MetaName)4023740759); return mb.AddItemPtr((MetaName)4023740759, _Data); } public CScenarioChainingNode[] GetCNodes() { if ((Nodes == null) || (Nodes.Length == 0)) return null; CScenarioChainingNode[] r = new CScenarioChainingNode[Nodes.Length]; for (int i = 0; i < Nodes.Length; i++) { r[i] = Nodes[i].Data; } return r; } public CScenarioChainingEdge[] GetCEdges() { if ((Edges == null) || (Edges.Length == 0)) return null; CScenarioChainingEdge[] r = new CScenarioChainingEdge[Edges.Length]; for (int i = 0; i < Edges.Length; i++) { r[i] = Edges[i].Data; } return r; } public CScenarioChain[] GetCChains() { if ((Chains == null) || (Chains.Length == 0)) return null; CScenarioChain[] r = new CScenarioChain[Chains.Length]; for (int i = 0; i < Chains.Length; i++) { r[i] = Chains[i].Data; } return r; } public void AddNode(MCScenarioChainingNode node) { List newnodes = new List(); if (Nodes != null) { newnodes.AddRange(Nodes); } node.Parent = this; node.Region = Region; node.NodeIndex = newnodes.Count; newnodes.Add(node); Nodes = newnodes.ToArray(); } public void AddEdge(MCScenarioChainingEdge edge) { List newedges = new List(); if (Edges != null) { newedges.AddRange(Edges); } edge.Region = Region; edge.EdgeIndex = newedges.Count; newedges.Add(edge); Edges = newedges.ToArray(); } public void AddChain(MCScenarioChain chain) { List newchains = new List(); if (Chains != null) { newchains.AddRange(Chains); } chain.Region = Region; chain.ChainIndex = newchains.Count; newchains.Add(chain); Chains = newchains.ToArray(); } public bool RemoveNode(MCScenarioChainingNode n) { bool r = false; if (Edges != null) { //first remove any edges referencing this node... List remedges = new List(); if (Chains != null) { foreach (var chain in Chains) { if (chain.Edges == null) continue; remedges.Clear(); foreach (var edge in chain.Edges) { if ((edge.NodeFrom == n) || (edge.NodeTo == n)) { remedges.Add(edge); } } foreach (var edge in remedges) { chain.RemoveEdge(edge); } } } remedges.Clear(); foreach (var edge in Edges) { if ((edge.NodeFrom == n) || (edge.NodeTo == n)) { remedges.Add(edge); } } foreach (var edge in remedges) { RemoveEdge(edge); } } if (Nodes != null) { List newnodes = new List(); foreach (var nn in Nodes) { if (nn == n) { r = true; } else { nn.NodeIndex = newnodes.Count; newnodes.Add(nn); } } if (r) { Nodes = newnodes.ToArray(); foreach (var e in Edges) { e.NodeIndexFrom = (ushort)e.NodeFrom.NodeIndex; e.NodeIndexTo = (ushort)e.NodeTo.NodeIndex; } } } return r; } public bool RemoveEdge(MCScenarioChainingEdge e) { bool r = false; if (Edges != null) { List newedges = new List(); foreach (var ne in Edges) { if (ne == e) { r = true; } else { ne.EdgeIndex = newedges.Count; newedges.Add(ne); } } if (r) { Edges = newedges.ToArray(); foreach (var c in Chains) { for (int i = 0; i < c.Edges.Length; i++) { c.EdgeIds[i] = (ushort)c.Edges[i].EdgeIndex; } } } } return r; } public bool RemoveChain(MCScenarioChain c) { bool r = false; if (Chains != null) { List newchains = new List(); foreach (var nc in Chains) { if (nc == c) { r = true; } else { nc.ChainIndex = newchains.Count; newchains.Add(nc); } } if (r) { Chains = newchains.ToArray(); } } return r; } public override string Name { get { return "Unk_4023740759 (Scenario paths) " + _Data.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CScenarioChainingNode //SCENARIO PATH NODE //32 bytes, Key:1811784424 { public Vector3 Position { get; set; } //0 0: Float_XYZ: 0: Position public float Unused0 { get; set; }//12 public MetaHash Unk_2602393771 { get; set; } //16 16: Hash: 0: 2602393771 public MetaHash ScenarioType { get; set; } //20 20: Hash: 0: ScenarioType public byte Unk_407126079_NotFirst { get; set; } //24 24: Boolean: 0: 407126079 //can move backwards? (not first node) public byte Unk_1308720135_NotLast { get; set; } //25 25: Boolean: 0: 1308720135 //can move forwards? (not last node) public ushort Unused1 { get; set; }//26 public uint Unused2 { get; set; }//28 public override string ToString() { return //Unk_407126079.ToString() + ", " + Unk_1308720135.ToString() + ", " + ScenarioType.ToString() + ", " + Unk_2602393771.ToString(); } } [TC(typeof(EXP))] public class MCScenarioChainingNode : MetaWrapper { [TC(typeof(EXP))] public MUnk_4023740759 Parent { get; set; } public MCScenarioPointRegion Region { get; set; } public CScenarioChainingNode _Data; public CScenarioChainingNode Data { get { return _Data; } set { _Data = value; } } public Vector3 Position { get { return _Data.Position; } set { _Data.Position = value; } } public MetaHash Unk1 { get { return _Data.Unk_2602393771; } set { _Data.Unk_2602393771 = value; } } public MetaHash TypeHash { get { return _Data.ScenarioType; } set { _Data.ScenarioType = value; } } public ScenarioType Type { get; set; } public bool NotFirst { get { return _Data.Unk_407126079_NotFirst == 1; } set { _Data.Unk_407126079_NotFirst = (byte)(value ? 1 : 0); } } public bool NotLast { get { return _Data.Unk_1308720135_NotLast == 1; } set { _Data.Unk_1308720135_NotLast = (byte)(value ? 1 : 0); } } public int NodeIndex { get; set; } public MCScenarioChain Chain { get; set; } public MCScenarioChainingNode() { } public MCScenarioChainingNode(MCScenarioPointRegion region, Meta meta, CScenarioChainingNode d, MUnk_4023740759 parent, int index) { Region = region; Parent = parent; _Data = d; NodeIndex = index; } public MCScenarioChainingNode(MCScenarioPointRegion region, MCScenarioChainingNode copy) { Region = region; _Data = copy._Data; Type = copy.Type; } public void CopyFrom(MCScenarioChainingNode copy) { _Data = copy._Data; Type = copy.Type; } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioChainingNode); return mb.AddItemPtr(MetaName.CScenarioChainingNode, _Data); } public override string Name { get { return "CScenarioChainingNode";// + _Data.Unk_2602393771.ToString(); } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CScenarioChainingEdge //SCENARIO PATH EDGE //8 bytes, Key:2004985940 { public ushort NodeIndexFrom { get; set; } //0 0: UnsignedShort: 0: NodeIndexFrom//3236798246 public ushort NodeIndexTo { get; set; } //2 2: UnsignedShort: 0: NodeIndexTo//2851806039 public Unk_3609807418 Action { get; set; } //4 4: ByteEnum: 3609807418: Action public Unk_3971773454 NavMode { get; set; } //5 5: ByteEnum: 3971773454: NavMode//859022269 public Unk_941086046 NavSpeed { get; set; } //6 6: ByteEnum: 941086046: NavSpeed//1419316113 public byte Unused0 { get; set; }//7 public override string ToString() { return NodeIndexFrom.ToString() + ", " + NodeIndexTo.ToString() + ", " + Action.ToString() + ", " + NavMode.ToString() + ", " + NavSpeed.ToString(); } } [TC(typeof(EXP))] public class MCScenarioChainingEdge : MetaWrapper { public MCScenarioPointRegion Region { get; set; } public CScenarioChainingEdge _Data; public CScenarioChainingEdge Data { get { return _Data; } set { _Data = value; } } public MCScenarioChainingNode NodeFrom { get; set; } public MCScenarioChainingNode NodeTo { get; set; } public ushort NodeIndexFrom { get { return _Data.NodeIndexFrom; } set { _Data.NodeIndexFrom = value; } } public ushort NodeIndexTo { get { return _Data.NodeIndexTo; } set { _Data.NodeIndexTo = value; } } public Unk_3609807418 Action { get { return _Data.Action; } set { _Data.Action = value; } } public Unk_3971773454 NavMode { get { return _Data.NavMode; } set { _Data.NavMode = value; } } public Unk_941086046 NavSpeed { get { return _Data.NavSpeed; } set { _Data.NavSpeed = value; } } public int EdgeIndex { get; set; } public MCScenarioChainingEdge() { } public MCScenarioChainingEdge(MCScenarioPointRegion region, Meta meta, CScenarioChainingEdge d, int index) { Region = region; _Data = d; EdgeIndex = index; } public MCScenarioChainingEdge(MCScenarioPointRegion region, MCScenarioChainingEdge copy) { Region = region; _Data = copy._Data; NodeFrom = copy.NodeFrom; NodeTo = copy.NodeTo;//these should be updated later... } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioChainingEdge); return mb.AddItemPtr(MetaName.CScenarioChainingEdge, _Data); } public override string Name { get { return "CScenarioChainingEdge"; } } public override string ToString() { return Action.ToString() + ", " + NavMode.ToString() + ", " + NavSpeed.ToString(); } } [TC(typeof(EXP))] public struct CScenarioChain //SCENARIO PATH CHAIN //40 bytes, Key:2751910366 { public byte Unk_1156691834 { get; set; } //0 0: UnsignedByte: 0: 1156691834 public byte Unused0 { get; set; }//1 public ushort Unused1 { get; set; }//2 public uint Unused2 { get; set; }//4 public Array_ushort EdgeIds { get; set; } //8 8: Array: 0: EdgeIds {0: UnsignedShort: 0: 256} public uint Unused3 { get; set; }//24 public uint Unused4 { get; set; }//28 public uint Unused5 { get; set; }//32 public uint Unused6 { get; set; }//36 public override string ToString() { return Unk_1156691834.ToString() + ": " + EdgeIds.Count1.ToString() + " EdgeIds"; } } [TC(typeof(EXP))] public class MCScenarioChain : MetaWrapper { public MCScenarioPointRegion Region { get; set; } public CScenarioChain _Data; public CScenarioChain Data { get { return _Data; } set { _Data = value; } } public byte Unk1 { get { return _Data.Unk_1156691834; } set { _Data.Unk_1156691834 = value; } } public ushort[] EdgeIds { get; set; } public MCScenarioChainingEdge[] Edges { get; set; } public int ChainIndex { get; set; } public MCScenarioChain() { } public MCScenarioChain(MCScenarioPointRegion region, Meta meta, CScenarioChain d) { Region = region; _Data = d; EdgeIds = MetaTypes.GetUshortArray(meta, _Data.EdgeIds); } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); EdgeIds = MetaTypes.GetUshortArray(meta, _Data.EdgeIds); } public void AddEdge(MCScenarioChainingEdge edge) { List newedges = new List(); List newedgeids = new List(); if (Edges != null) { newedges.AddRange(Edges); } if (EdgeIds != null) { newedgeids.AddRange(EdgeIds); } edge.Region = Region; newedges.Add(edge); newedgeids.Add((ushort)edge.EdgeIndex); Edges = newedges.ToArray(); EdgeIds = newedgeids.ToArray(); } public bool RemoveEdge(MCScenarioChainingEdge e) { bool r = false; if (Edges != null) { List newedges = new List(); List newedgeids = new List(); foreach (var ne in Edges) { if (ne == e) { r = true; } else { newedges.Add(ne); newedgeids.Add((ushort)ne.EdgeIndex); } } if (r) { Edges = newedges.ToArray(); EdgeIds = newedgeids.ToArray(); } } return r; } public override MetaPOINTER Save(MetaBuilder mb) { //TODO! //if (EdgeIds != null) //{ // mb.AddStructureInfo(MetaName.ushort); // _Data.EdgeIds = mb.AddItemArrayPtr(MetaName.ushort, EdgeIds); //} mb.AddStructureInfo(MetaName.CScenarioChain); return mb.AddItemPtr(MetaName.CScenarioChain, _Data); } public override string Name { get { return "CScenarioChain"; } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CScenarioPointCluster //SCENARIO spawn cluster - all things spawn together //80 bytes, Key:3622480419 { public CScenarioPointContainer Points { get; set; } //0 0: Structure: CScenarioPointContainer//2380938603: Points//702683191 public rage__spdSphere ClusterSphere { get; set; } //48 48: Structure: 1062159465: ClusterSphere//352461053 public float Unk_1095875445 { get; set; } //64 64: Float: 0: 1095875445 //spawn chance? eg 5, 30 public byte Unk_3129415068 { get; set; } //68 68: Boolean: 0: 3129415068 public uint Unused0 { get; set; }//72 public uint Unused1 { get; set; }//76 public override string ToString() { return Points.ToString();// + ", Sphere: " + ClusterSphere.ToString(); } } [TC(typeof(EXP))] public class MCScenarioPointCluster : MetaWrapper { public MCScenarioPointRegion Region { get; set; } public CScenarioPointCluster _Data; public CScenarioPointCluster Data { get { return _Data; } set { _Data = value; } } public MCScenarioPointContainer Points { get; set; } public Vector3 Position //is separate from Points... { get { return _Data.ClusterSphere.centerAndRadius.XYZ(); } set { var v4 = new Vector4(value, _Data.ClusterSphere.centerAndRadius.W); _Data.ClusterSphere = new rage__spdSphere() { centerAndRadius = v4 }; } } public float Radius { get { return _Data.ClusterSphere.centerAndRadius.W; } set { var v4 = new Vector4(_Data.ClusterSphere.centerAndRadius.XYZ(), value); _Data.ClusterSphere = new rage__spdSphere() { centerAndRadius = v4 }; } } public float Unk1 { get { return _Data.Unk_1095875445; } set { _Data.Unk_1095875445 = value; } } public bool Unk2 { get { return _Data.Unk_3129415068==1; } set { _Data.Unk_3129415068 = (byte)(value?1:0); } } public MCScenarioPointCluster() { } public MCScenarioPointCluster(MCScenarioPointRegion region) { Region = region; } public MCScenarioPointCluster(MCScenarioPointRegion region, MCScenarioPointCluster copy) { Region = region; if (copy != null) { _Data = copy.Data; } Points = new MCScenarioPointContainer(region); Points.Parent = this; } public MCScenarioPointCluster(MCScenarioPointRegion region, Meta meta, CScenarioPointCluster d) { Region = region; _Data = d; Points = new MCScenarioPointContainer(region, meta, d.Points); Points.Parent = this; } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); Points = new MCScenarioPointContainer(Region, meta, _Data.Points); Points.Parent = this; } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.rage__spdSphere); mb.AddStructureInfo(MetaName.CScenarioPointCluster); if (Points != null) { var scp = new CScenarioPointContainer(); ////meta version //if ((Points.LoadSavePoints != null) && (Points.LoadSavePoints.Length > 0)) //{ // scp.LoadSavePoints = mb.AddWrapperArray(Points.LoadSavePoints); //} //if ((Points.MyPoints != null) && (Points.MyPoints.Length > 0)) //{ // scp.MyPoints = mb.AddWrapperArray(Points.MyPoints); //} //optimised version... var loadSavePoints = Points.GetCLoadSavePoints(); if (loadSavePoints != null)//this never seems to be used... { mb.AddStructureInfo(MetaName.CExtensionDefSpawnPoint); mb.AddEnumInfo((MetaName)3573596290); mb.AddEnumInfo((MetaName)700327466); scp.LoadSavePoints = mb.AddItemArrayPtr(MetaName.CExtensionDefSpawnPoint, loadSavePoints); } var myPoints = Points.GetCMyPoints(); if (myPoints != null) { mb.AddStructureInfo(MetaName.CScenarioPoint); mb.AddEnumInfo((MetaName)700327466); scp.MyPoints = mb.AddItemArrayPtr(MetaName.CScenarioPoint, myPoints); } _Data.Points = scp; } else { _Data.Points = new CScenarioPointContainer(); } return mb.AddItemPtr(MetaName.CScenarioPointCluster, _Data); } public override string Name { get { return "CScenarioPointCluster"; } } public override string ToString() { return _Data.ToString(); } } [TC(typeof(EXP))] public struct CScenarioPointLookUps //SCENARIO hash arrays //96 bytes, Key:2669361587 { public Array_uint TypeNames { get; set; } //0 0: Array: 0: TypeNames//3057471271 {0: Hash: 0: 256} public Array_uint PedModelSetNames { get; set; } //16 16: Array: 0: PedModelSetNames//3020866217 {0: Hash: 0: 256} public Array_uint VehicleModelSetNames { get; set; } //32 32: Array: 0: VehicleModelSetNames//3827910541 {0: Hash: 0: 256} public Array_uint GroupNames { get; set; } //48 48: Array: 0: GroupNames//2506712617 {0: Hash: 0: 256} public Array_uint InteriorNames { get; set; } //64 64: Array: 0: InteriorNames {0: Hash: 0: 256} public Array_uint RequiredIMapNames { get; set; } //[ymap names] //80 80: Array: 0: RequiredIMapNames//1767860162 {0: Hash: 0: 256} public override string ToString() { return "CScenarioPointLookUps"; } } [TC(typeof(EXP))] public class MCScenarioPointLookUps : MetaWrapper { public MCScenarioPointRegion Region { get; set; } public CScenarioPointLookUps _Data; public CScenarioPointLookUps Data { get { return _Data; } set { _Data = value; } } public MetaHash[] TypeNames { get; set; } //scenario type hashes used by points public MetaHash[] PedModelSetNames { get; set; } //ped names public MetaHash[] VehicleModelSetNames { get; set; } //vehicle names public MetaHash[] GroupNames { get; set; } //scenario group names? public MetaHash[] InteriorNames { get; set; } public MetaHash[] RequiredIMapNames { get; set; } //ymap names public MCScenarioPointLookUps() { } public MCScenarioPointLookUps(MCScenarioPointRegion region) { Region = region; } public MCScenarioPointLookUps(MCScenarioPointRegion region, Meta meta, CScenarioPointLookUps d) { Region = region; _Data = d; Init(meta); } public void Init(Meta meta) { TypeNames = MetaTypes.GetHashArray(meta, _Data.TypeNames); PedModelSetNames = MetaTypes.GetHashArray(meta, _Data.PedModelSetNames); VehicleModelSetNames = MetaTypes.GetHashArray(meta, _Data.VehicleModelSetNames); GroupNames = MetaTypes.GetHashArray(meta, _Data.GroupNames); InteriorNames = MetaTypes.GetHashArray(meta, _Data.InteriorNames); RequiredIMapNames = MetaTypes.GetHashArray(meta, _Data.RequiredIMapNames); } public override void Load(Meta meta, MetaPOINTER ptr) { _Data = MetaTypes.GetData(meta, ptr); Init(meta); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioPointLookUps); return mb.AddItemPtr(MetaName.CScenarioPointLookUps, _Data); } public override string Name { get { return "CScenarioPointLookUps"; } } public override string ToString() { return _Data.ToString(); } } 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 byte Unused0 { get; set; }//33 public ushort Unused1 { get; set; }//34 public uint Unused2 { get; set; }//36 } public struct CStreamingRequestFrame //112 bytes, Key:1112444512 //SRL frame... { public Array_uint AddList { get; set; } //0 0: Array: 0: AddList//327274266 {0: Hash: 0: 256} public Array_uint RemoveList { get; set; } //16 16: Array: 0: RemoveList//3372321331 {0: Hash: 0: 256} public Array_uint Unk_896120921 { get; set; } //32 32: Array: 0: 896120921 {0: Hash: 0: 256} public Vector3 CamPos { get; set; } //48 48: Float_XYZ: 0: CamPos//357008256 public float Unused0 { get; set; }//60 public Vector3 CamDir { get; set; } //64 64: Float_XYZ: 0: CamDir//210316193 public float Unused1 { get; set; }//76 public Array_byte Unk_1762439591 { get; set; } //80 80: Array: 0: 1762439591 {0: UnsignedByte: 0: 256} public uint Flags { get; set; } //96 96: UnsignedInt: 0: Flags public uint Unused2 { get; set; }//100 public uint Unused3 { get; set; }//104 public uint Unused4 { get; set; }//108 } public struct CStreamingRequestFrame_v2 //96 bytes, Key:3672937465 //SRL frame... { public Array_uint AddList { get; set; } //0 0: Array: 0: AddList//327274266 {0: Hash: 0: 256} public Array_uint RemoveList { get; set; } //16 16: Array: 0: RemoveList//3372321331 {0: Hash: 0: 256} public Vector3 CamPos { get; set; } //32 32: Float_XYZ: 0: CamPos//357008256 public float Unused0 { get; set; }//44 public Vector3 CamDir { get; set; } //48 48: Float_XYZ: 0: CamDir//210316193 public float Unused1 { get; set; }//60 public Array_byte Unk_1762439591 { get; set; } //64 64: Array: 0: 1762439591 {0: UnsignedByte: 0: 256} public uint Flags { get; set; } //80 80: UnsignedInt: 0: Flags public uint Unused2 { get; set; }//84 public uint Unused3 { get; set; }//88 public uint Unused4 { get; set; }//92 } public struct Unk_1358189812 //16 bytes, Key:3710200606 //SRL hashes list? { public Array_uint Requests { get; set; } //0 0: Array: 0: Requests//2743119154 {0: Hash: 0: 256} } public struct Unk_376833625 //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 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 Unk_2131007641 { get; set; } //32 32: Array: 0: 2131007641 {0: Structure: 253191135: 256} public Array_Structure compInfos { get; set; } //48 48: Array: 0: compInfos//592652859 {0: Structure: CComponentInfo//1866571721: 256} public Unk_2858946626 propInfo { get; set; } //64 64: Structure: 2858946626: propInfo//2240851416 public MetaHash dlcName { get; set; } //104 104: Hash: 0: dlcName public uint Unused0 { get; set; }//108 } public struct Unk_3538495220 //24 bytes, Key:2024084511 //COMPONENT PEDS unknown { public byte Unk_3371516811 { get; set; } //0 0: UnsignedByte: 0: 3371516811 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 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 struct Unk_1036962405 //3 bytes, Key:4272717794 //COMPONENT PEDS (cloth?) TexData { public byte texId { get; set; } //0 0: UnsignedByte: 0: texId public byte distribution { get; set; } //1 1: UnsignedByte: 0: distribution//914976023 public byte Unused0 { get; set; }//2 } public struct Unk_2236980467 //24 bytes, Key:508935687 //COMPONENT PEDS clothData { public byte Unk_2828247905 { get; set; } //0 0: Boolean: 0: 2828247905 public byte Unused0 { get; set; }//1 public ushort Unused1 { get; set; }//2 public uint Unused2 { get; set; }//4 public uint Unused3 { get; set; }//8 public uint Unused4 { get; set; }//12 public uint Unused5 { get; set; }//16 public uint Unused6 { get; set; }//20 } public struct Unk_253191135 //48 bytes, Key:3120284999 //COMPONENT PEDS unknown { public MetaHash name { get; set; } //0 0: Hash: 0: name public ArrayOfBytes12 Unk_173599222 { get; set; } //4 4: ArrayOfBytes: 12: 173599222 public ArrayOfBytes12 Unk_2991454271 { get; set; } //16 16: ArrayOfBytes: 12: 2991454271 public ArrayOfBytes6 Unk_3598106198 { get; set; } //28 28: ArrayOfBytes: 6: 3598106198 public ArrayOfBytes6 Unk_2095974912 { get; set; } //34 34: ArrayOfBytes: 6: 2095974912 public ArrayOfBytes6 Unk_672172037 { get; set; } //40 40: ArrayOfBytes: 6: 672172037 public ushort Unused0 { get; set; }//46 } public struct CComponentInfo //48 bytes, Key:3693847250 //COMPONENT PEDS CComponentInfo { public MetaHash Unk_802196719 { get; set; } //0 0: Hash: 0: 802196719 public MetaHash Unk_4233133352 { get; set; } //4 4: Hash: 0: 4233133352 public ArrayOfBytes5 Unk_128864925 { get; set; } //8 8: ArrayOfBytes: 5: 128864925 public byte Unused0 { get; set; }//13 public ushort Unused1 { get; set; }//14 public uint Unused2 { get; set; }//16 public uint Unused3 { get; set; }//20 public uint Unused4 { get; set; }//24 public uint flags { get; set; } //28 28: UnsignedInt: 0: flags public int inclusions { get; set; } //32 32: IntFlags2: 0: inclusions//2172318933 public int exclusions { get; set; } //36 36: IntFlags2: 0: exclusions public Unk_884254308 Unk_1613922652 { get; set; } //40 40: ShortFlags: 884254308: 1613922652 public ushort Unk_2114993291 { get; set; } //42 42: UnsignedShort: 0: 2114993291 public byte Unk_3509540765 { get; set; } //44 44: UnsignedByte: 0: 3509540765 public byte Unk_4196345791 { get; set; } //45 45: UnsignedByte: 0: 4196345791 public ushort Unused5 { get; set; }//46 } public struct Unk_2858946626 //40 bytes, Key:1792487819 //COMPONENT PEDS unknown { public byte Unk_2598445407 { get; set; } //0 0: UnsignedByte: 0: 2598445407 public byte Unused0 { get; set; }//1 public ushort Unused1 { get; set; }//2 public uint Unused2 { get; set; }//4 public Array_Structure Unk_3902803273 { get; set; } //8 8: Array: 0: 3902803273 {0: Structure: 94549140: 256} public Array_Structure aAnchors { get; set; } //24 24: Array: 0: aAnchors//162345210 {0: Structure: CAnchorProps//2170383875: 256} } public struct Unk_94549140 //56 bytes, Key:2029738350 //COMPONENT PEDS unknown { public MetaHash audioId { get; set; } //0 0: Hash: 0: audioId public ArrayOfBytes5 expressionMods { get; set; } //4 4: ArrayOfBytes: 5: expressionMods//942761829 public byte Unused0 { get; set; }//9 public ushort Unused1 { get; set; }//10 public uint Unused2 { get; set; }//12 public uint Unused3 { get; set; }//16 public uint Unused4 { get; set; }//20 public Array_Structure texData { get; set; } //24 24: Array: 0: texData//4088935562 {0: Structure: 254518642: 256} public Unk_4212977111 renderFlags { get; set; } //40 40: IntFlags1: 4212977111: renderFlags//4239582912 public uint propFlags { get; set; } //44 44: UnsignedInt: 0: propFlags//1066841901 public ushort flags { get; set; } //48 48: UnsignedShort: 0: flags public byte anchorId { get; set; } //50 50: UnsignedByte: 0: anchorId//2731224028 public byte propId { get; set; } //51 51: UnsignedByte: 0: propId//3817142252 public byte Unk_2894625425 { get; set; } //52 52: UnsignedByte: 0: 2894625425 public byte Unused5 { get; set; }//53 public ushort Unused6 { get; set; }//54 } public struct Unk_254518642 //12 bytes, Key:2767296137 //COMPONENT PEDS (expression?) texData { public int inclusions { get; set; } //0 0: IntFlags2: 0: inclusions//2172318933 public int exclusions { get; set; } //4 4: IntFlags2: 0: exclusions public byte texId { get; set; } //8 8: UnsignedByte: 0: texId public byte inclusionId { get; set; } //9 9: UnsignedByte: 0: inclusionId//1938349561 public byte exclusionId { get; set; } //10 10: UnsignedByte: 0: exclusionId//3819522186 public byte distribution { get; set; } //11 11: UnsignedByte: 0: distribution//914976023 } 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 uint Unused0 { get; set; }//20 } }