From 528ab1a98cacde7f209fd12f3854ea471085dd4d Mon Sep 17 00:00:00 2001 From: Niek Schoemaker <32094562+niekschoemaker@users.noreply.github.com> Date: Sat, 6 Jan 2024 19:41:10 +0100 Subject: [PATCH] Another big commit, updated to .NET 8.0 and a lot more refactoring and optimizations --- .editorconfig | 76 + CodeWalker.Benchmarks/Benchmarks.cs | 447 +- .../CodeWalker.Benchmarks.csproj | 60 +- CodeWalker.Benchmarks/Program.cs | 7 +- CodeWalker.Core/CodeWalker.Core.csproj | 24 +- .../GameFiles/FileTypes/AwcFile.cs | 87 +- .../FileTypes/Builders/YnvBuilder.cs | 80 +- .../GameFiles/FileTypes/CacheDatFile.cs | 118 +- .../GameFiles/FileTypes/CarColsFile.cs | 5 +- .../GameFiles/FileTypes/CarVariationsFile.cs | 70 +- .../GameFiles/FileTypes/CutFile.cs | 19 +- .../GameFiles/FileTypes/DlcContentFile.cs | 283 +- .../GameFiles/FileTypes/DlcSetupFile.cs | 4 +- .../GameFiles/FileTypes/FxcFile.cs | 38 +- .../GameFiles/FileTypes/GtxdFile.cs | 82 +- .../GameFiles/FileTypes/Gxt2File.cs | 134 +- .../GameFiles/FileTypes/HeightmapFile.cs | 65 +- .../GameFiles/FileTypes/JPsoFile.cs | 3 - .../GameFiles/FileTypes/MrfFile.cs | 2 +- .../GameFiles/FileTypes/PedFile.cs | 29 +- .../GameFiles/FileTypes/PedShopMetaFile.cs | 112 + .../GameFiles/FileTypes/PedsFile.cs | 83 +- .../GameFiles/FileTypes/RelFile.cs | 5879 ++++-- .../GameFiles/FileTypes/VehiclesFile.cs | 486 +- .../GameFiles/FileTypes/WatermapFile.cs | 4 +- .../GameFiles/FileTypes/YbnFile.cs | 41 +- .../GameFiles/FileTypes/YcdFile.cs | 8 +- .../GameFiles/FileTypes/YddFile.cs | 46 +- .../GameFiles/FileTypes/YdrFile.cs | 48 +- .../GameFiles/FileTypes/YedFile.cs | 6 +- .../GameFiles/FileTypes/YfdFile.cs | 8 +- .../GameFiles/FileTypes/YftFile.cs | 31 +- .../GameFiles/FileTypes/YldFile.cs | 8 +- .../GameFiles/FileTypes/YmapFile.cs | 6648 +++--- .../GameFiles/FileTypes/YmfFile.cs | 80 +- .../GameFiles/FileTypes/YmtFile.cs | 100 +- .../GameFiles/FileTypes/YndFile.cs | 319 +- .../GameFiles/FileTypes/YnvFile.cs | 187 +- .../GameFiles/FileTypes/YptFile.cs | 6 +- .../GameFiles/FileTypes/YtdFile.cs | 24 +- .../GameFiles/FileTypes/YtypFile.cs | 217 +- .../GameFiles/FileTypes/YvrFile.cs | 6 +- .../GameFiles/FileTypes/YwrFile.cs | 6 +- CodeWalker.Core/GameFiles/GameFile.cs | 169 +- CodeWalker.Core/GameFiles/GameFileCache.cs | 1117 +- .../GameFiles/MetaTypes/Archetype.cs | 441 +- CodeWalker.Core/GameFiles/MetaTypes/Meta.cs | 1089 +- .../GameFiles/MetaTypes/MetaBuilder.cs | 190 +- .../GameFiles/MetaTypes/MetaNames.cs | 49 +- .../GameFiles/MetaTypes/MetaTypes.cs | 4545 ++-- .../GameFiles/MetaTypes/MetaXml.cs | 963 +- CodeWalker.Core/GameFiles/MetaTypes/Pso.cs | 650 +- .../GameFiles/MetaTypes/PsoBuilder.cs | 81 +- .../GameFiles/MetaTypes/PsoTypes.cs | 17402 +--------------- .../MetaTypes/PsoTypes/GetEnumInfo.cs | 1453 ++ .../MetaTypes/PsoTypes/GetStructureInfo.cs | 14000 +++++++++++++ CodeWalker.Core/GameFiles/MetaTypes/Rbf.cs | 266 +- .../GameFiles/MetaTypes/XmlMeta.cs | 87 +- CodeWalker.Core/GameFiles/MetaTypes/XmlPso.cs | 115 +- CodeWalker.Core/GameFiles/MetaTypes/XmlRbf.cs | 69 +- CodeWalker.Core/GameFiles/Resources/Bounds.cs | 897 +- CodeWalker.Core/GameFiles/Resources/Clip.cs | 537 +- .../GameFiles/Resources/Clothes.cs | 171 +- .../GameFiles/Resources/Drawable.cs | 1216 +- .../GameFiles/Resources/Expression.cs | 20 +- CodeWalker.Core/GameFiles/Resources/Filter.cs | 28 +- CodeWalker.Core/GameFiles/Resources/Frag.cs | 15 +- CodeWalker.Core/GameFiles/Resources/Nav.cs | 319 +- CodeWalker.Core/GameFiles/Resources/Node.cs | 59 +- .../GameFiles/Resources/Particle.cs | 366 +- .../GameFiles/Resources/PedsFiles.cs | 158 + .../GameFiles/Resources/ResourceAnalyzer.cs | 2 + .../GameFiles/Resources/ResourceBaseTypes.cs | 1031 +- .../GameFiles/Resources/ResourceBuilder.cs | 15 +- .../GameFiles/Resources/ResourceData.cs | 288 +- .../GameFiles/Resources/ResourceFile.cs | 54 +- .../GameFiles/Resources/Texture.cs | 94 +- .../GameFiles/Resources/VehicleRecord.cs | 6 +- .../GameFiles/Resources/VertexType.cs | 11 +- .../GameFiles/Resources/WaypointRecord.cs | 15 +- CodeWalker.Core/GameFiles/RpfFile.cs | 942 +- CodeWalker.Core/GameFiles/RpfManager.cs | 404 +- CodeWalker.Core/GameFiles/Utils/DDSIO.cs | 76 +- CodeWalker.Core/GameFiles/Utils/Data.cs | 121 +- CodeWalker.Core/GameFiles/Utils/GTACrypto.cs | 82 +- CodeWalker.Core/GameFiles/Utils/GTAKeys.cs | 38 +- CodeWalker.Core/GameFiles/Utils/Jenk.cs | 264 +- CodeWalker.Core/GlobalSuppressions.cs | 8 + .../PublishProfiles/FolderProfile.pubxml | 15 + CodeWalker.Core/Tests/GameFileCache.cs | 220 +- CodeWalker.Core/Utils/BoundingBoxes.cs | 14 +- CodeWalker.Core/Utils/Cache.cs | 55 +- CodeWalker.Core/Utils/ETWEvents.cs | 33 +- CodeWalker.Core/Utils/Fbx.cs | 11 +- CodeWalker.Core/Utils/FbxConverter.cs | 48 +- CodeWalker.Core/Utils/FileUtils.cs | 48 + CodeWalker.Core/Utils/Matrices.cs | 26 +- CodeWalker.Core/Utils/Quaternions.cs | 8 +- CodeWalker.Core/Utils/SharedObjectPool.cs | 59 + CodeWalker.Core/Utils/SplitEnumerator.cs | 184 +- CodeWalker.Core/Utils/StreamingExtensions.cs | 444 +- CodeWalker.Core/Utils/ThrowHelper.cs | 40 +- CodeWalker.Core/Utils/Timer.cs | 19 +- CodeWalker.Core/Utils/TriangleBVH.cs | 104 +- CodeWalker.Core/Utils/Utils.cs | 194 +- CodeWalker.Core/Utils/Vectors.cs | 208 +- CodeWalker.Core/Utils/Xml.cs | 348 +- CodeWalker.Core/World/AudioZones.cs | 47 +- CodeWalker.Core/World/Camera.cs | 6 +- CodeWalker.Core/World/Clouds.cs | 15 +- CodeWalker.Core/World/Entity.cs | 6 +- CodeWalker.Core/World/Heightmaps.cs | 50 +- CodeWalker.Core/World/Ped.cs | 220 +- CodeWalker.Core/World/PopZones.cs | 79 +- CodeWalker.Core/World/Scenarios.cs | 741 +- CodeWalker.Core/World/Space.cs | 805 +- CodeWalker.Core/World/Timecycle.cs | 59 +- CodeWalker.Core/World/TimecycleMods.cs | 20 +- CodeWalker.Core/World/Trains.cs | 46 +- CodeWalker.Core/World/Water.cs | 25 +- CodeWalker.Core/World/Watermaps.cs | 161 +- CodeWalker.Core/World/Weather.cs | 4 +- CodeWalker.Peds/CodeWalker.Peds.csproj | 2 +- CodeWalker.Peds/Program.cs | 16 +- .../PublishProfiles/FolderProfile.pubxml | 18 + .../CodeWalker.RPFExplorer.csproj | 6 +- CodeWalker.RPFExplorer/Program.cs | 5 +- .../PublishProfiles/FolderProfile.pubxml | 18 + CodeWalker.Shaders/CodeWalker.Shaders.vcxproj | 7 +- CodeWalker.Shaders/LightPS.hlsl | 3 +- CodeWalker.Shaders/LightPS.hlsli | 25 + CodeWalker.Shaders/LightPS_MS.hlsl | 3 +- CodeWalker.Shaders/LodLightsVS.hlsl | 1 + CodeWalker.Shaders/Shadowmap.hlsli | 9 +- CodeWalker.Test/CodeWalker.Test.csproj | 10 +- CodeWalker.Test/Files/content.xml | 382 + CodeWalker.Test/FloatUtilTests.cs | 35 + CodeWalker.Test/GTACryptTests.cs | 2 +- CodeWalker.Test/GameFileTests.cs | 70 + CodeWalker.Test/MetaTypesTests.cs | 716 + CodeWalker.Test/ResourceBaseTypesTests.cs | 37 + CodeWalker.Test/RpfFileTests.cs | 58 + CodeWalker.Test/SequenceReaderTests.cs | 34 + CodeWalker.Test/TestBinaryConversions.cs | 534 - CodeWalker.Test/XmlTests.cs | 46 +- .../CodeWalker.Vehicles.csproj | 2 +- .../CodeWalker.WinForms.csproj | 3 +- CodeWalker.WinForms/FormUtils.cs | 135 +- .../PropertyGridFix.Designer.cs | 6 +- .../ReadOnlyPropertyGrid.Designer.cs | 2 +- CodeWalker.WinForms/ReadOnlyPropertyGrid.resx | 120 + CodeWalker.sln | 6 +- CodeWalker/.editorconfig | 0 CodeWalker/CodeWalker.csproj | 43 +- CodeWalker/ExploreForm.cs | 849 +- CodeWalker/Forms/HexForm.cs | 10 +- CodeWalker/Forms/MetaForm.cs | 162 +- CodeWalker/Forms/ModelForm.cs | 469 +- CodeWalker/Forms/ModelLightForm.cs | 16 +- CodeWalker/Forms/ModelMatForm.cs | 26 +- CodeWalker/Forms/RelForm.Designer.cs | 942 +- CodeWalker/Forms/RelForm.cs | 94 +- CodeWalker/Forms/RelForm.resx | 114 +- CodeWalker/Forms/TextForm.cs | 2 +- CodeWalker/Forms/YtdForm.cs | 5 +- CodeWalker/GameFiles/GameFileCacheFactory.cs | 5 - CodeWalker/GameFiles/TextureFormats.cs | 2 + CodeWalker/PedsForm.Designer.cs | 2168 +- CodeWalker/PedsForm.cs | 608 +- CodeWalker/PedsForm.resx | 50 +- CodeWalker/Program.cs | 66 +- CodeWalker/Project/MenyooXml.cs | 5 +- .../Panels/EditAudioEmitterListPanel.cs | 8 +- .../Project/Panels/EditAudioEmitterPanel.cs | 166 +- .../Project/Panels/EditAudioZonePanel.cs | 11 +- CodeWalker/Project/Panels/EditMultiPanel.cs | 6 +- .../Panels/EditProjectManifestPanel.cs | 17 +- .../Project/Panels/EditScenarioNodePanel.cs | 15 +- .../Project/Panels/EditYmapGrassPanel.cs | 7 +- CodeWalker/Project/Panels/EditYmapPanel.cs | 161 +- .../Panels/EditYtypArchetypePanel.Designer.cs | 895 +- .../Project/Panels/EditYtypArchetypePanel.cs | 50 +- .../Panels/EditYtypArchetypePanel.resx | 50 +- .../Project/Panels/EditYtypMloEntSetPanel.cs | 6 +- .../Project/Panels/GenerateLODLightsPanel.cs | 26 +- .../Project/Panels/GenerateNavMeshPanel.cs | 20 +- .../Project/Panels/ProjectExplorerPanel.cs | 1443 +- CodeWalker/Project/ProjectFile.cs | 1042 +- CodeWalker/Project/ProjectForm.cs | 1837 +- CodeWalker/Project/UndoStep.cs | 13 +- .../PublishProfiles/ClickOnceProfile.pubxml | 43 + .../PublishProfiles/FolderProfile.pubxml | 18 + CodeWalker/Properties/Settings.Designer.cs | 76 +- CodeWalker/Properties/Settings.settings | 12 +- CodeWalker/Rendering/DirectX/DXForm.cs | 5 +- CodeWalker/Rendering/DirectX/DXManager.cs | 146 +- CodeWalker/Rendering/DirectX/DXUtility.cs | 6 +- CodeWalker/Rendering/Renderable.cs | 409 +- CodeWalker/Rendering/RenderableCache.cs | 83 +- CodeWalker/Rendering/Renderer.cs | 953 +- CodeWalker/Rendering/ShaderManager.cs | 205 +- CodeWalker/Rendering/Shaders/BasicShader.cs | 96 +- CodeWalker/Rendering/Shaders/BoundsShader.cs | 4 +- CodeWalker/Rendering/Shaders/CableShader.cs | 9 +- CodeWalker/Rendering/Shaders/CloudsShader.cs | 4 +- CodeWalker/Rendering/Shaders/DeferredScene.cs | 239 +- .../Rendering/Shaders/DistantLightsShader.cs | 6 +- CodeWalker/Rendering/Shaders/MarkerShader.cs | 4 +- CodeWalker/Rendering/Shaders/PathShader.cs | 4 +- CodeWalker/Rendering/Shaders/PostProcessor.cs | 275 +- CodeWalker/Rendering/Shaders/Shader.cs | 2 +- CodeWalker/Rendering/Shaders/ShadowShader.cs | 53 +- CodeWalker/Rendering/Shaders/SkydomeShader.cs | 7 +- CodeWalker/Rendering/Shaders/TerrainShader.cs | 11 +- .../Rendering/Shaders/TreesLodShader.cs | 4 +- CodeWalker/Rendering/Shaders/WaterShader.cs | 24 +- CodeWalker/Rendering/Shaders/WidgetShader.cs | 6 +- CodeWalker/Rendering/Utils/GpuBuffers.cs | 271 +- .../Rendering/Utils/ShaderExtensions.cs | 57 + CodeWalker/Rendering/Utils/Shadowmap.cs | 6 +- CodeWalker/Rendering/Utils/UnitCylinder.cs | 23 +- CodeWalker/Rendering/Utils/UnitSphere.cs | 33 +- CodeWalker/Rendering/VertexTypes.cs | 2 +- CodeWalker/Settings.cs | 11 +- CodeWalker/Tools/AudioExplorerForm.cs | 127 +- CodeWalker/Tools/BinarySearchForm.cs | 65 +- CodeWalker/Tools/BrowseForm.cs | 70 +- CodeWalker/Tools/ExtractKeysForm.cs | 6 +- CodeWalker/Tools/ExtractRawForm.cs | 9 +- CodeWalker/Tools/ExtractScriptsForm.cs | 12 +- CodeWalker/Tools/ExtractShadersForm.cs | 7 +- CodeWalker/Tools/ExtractTexForm.cs | 22 +- CodeWalker/Tools/ImportFbxForm.cs | 14 +- CodeWalker/Tools/JenkIndForm.cs | 18 +- CodeWalker/Utils/AudioUtils.cs | 20 +- CodeWalker/Utils/ConsoleWindow.cs | 49 +- CodeWalker/Utils/GTAFolder.cs | 3 +- CodeWalker/Utils/MapUtils.cs | 35 +- CodeWalker/Utils/NamedPipe.cs | 128 +- CodeWalker/Utils/OpenAnyFile.cs | 4 +- CodeWalker/Utils/Synthesizer.cs | 16 +- CodeWalker/VehicleForm.cs | 196 +- CodeWalker/World/CutsceneForm.cs | 185 +- CodeWalker/World/MapSelection.cs | 801 +- CodeWalker/World/Widget.cs | 2 +- CodeWalker/World/WorldInfoForm.cs | 19 +- CodeWalker/World/WorldSearchForm.cs | 322 +- CodeWalker/WorldForm.Designer.cs | 7266 ++++--- CodeWalker/WorldForm.cs | 1269 +- CodeWalker/WorldForm.resx | 110 +- Shaders/BasicPS.cso | Bin 11084 -> 121072 bytes Shaders/BasicPS_Deferred.cso | Bin 6744 -> 73828 bytes Shaders/BasicVS_Box.cso | Bin 4548 -> 125712 bytes Shaders/BasicVS_Capsule.cso | Bin 5208 -> 126388 bytes Shaders/BasicVS_Cylinder.cso | Bin 5256 -> 126436 bytes Shaders/BasicVS_PBBNCCT.cso | Bin 11832 -> 142404 bytes Shaders/BasicVS_PBBNCCTTX.cso | Bin 12556 -> 147224 bytes Shaders/BasicVS_PBBNCCTX.cso | Bin 12532 -> 145152 bytes Shaders/BasicVS_PBBNCT.cso | Bin 11800 -> 142372 bytes Shaders/BasicVS_PBBNCTT.cso | Bin 11824 -> 142396 bytes Shaders/BasicVS_PBBNCTTT.cso | Bin 11848 -> 142420 bytes Shaders/BasicVS_PBBNCTTX.cso | Bin 12524 -> 145144 bytes Shaders/BasicVS_PBBNCTX.cso | Bin 12500 -> 145120 bytes Shaders/BasicVS_PNCCT.cso | Bin 10120 -> 137888 bytes Shaders/BasicVS_PNCCTT.cso | Bin 10144 -> 137912 bytes Shaders/BasicVS_PNCCTTT.cso | Bin 10168 -> 137936 bytes Shaders/BasicVS_PNCCTTTX.cso | Bin 10716 -> 140532 bytes Shaders/BasicVS_PNCCTTX.cso | Bin 10692 -> 140508 bytes Shaders/BasicVS_PNCCTX.cso | Bin 10668 -> 140484 bytes Shaders/BasicVS_PNCT.cso | Bin 10088 -> 136564 bytes Shaders/BasicVS_PNCTT.cso | Bin 10112 -> 136588 bytes Shaders/BasicVS_PNCTTT.cso | Bin 10136 -> 136612 bytes Shaders/BasicVS_PNCTTTX.cso | Bin 10684 -> 140500 bytes Shaders/BasicVS_PNCTTX.cso | Bin 10660 -> 140476 bytes Shaders/BasicVS_PNCTX.cso | Bin 10636 -> 140452 bytes Shaders/BasicVS_Sphere.cso | Bin 4456 -> 123560 bytes Shaders/BoundingBoxVS.cso | Bin 1524 -> 30000 bytes Shaders/BoundingSphereVS.cso | Bin 1352 -> 27752 bytes Shaders/BoundsPS.cso | Bin 504 -> 12404 bytes Shaders/CablePS.cso | Bin 7116 -> 71744 bytes Shaders/CablePS_Deferred.cso | Bin 3076 -> 57872 bytes Shaders/CableVS.cso | Bin 9864 -> 135584 bytes Shaders/CloudsPS.cso | Bin 2772 -> 48268 bytes Shaders/CloudsVS.cso | Bin 4716 -> 70784 bytes Shaders/DirLightPS.cso | Bin 7484 -> 87508 bytes Shaders/DirLightPS_MS.cso | Bin 40892 -> 176680 bytes Shaders/DirLightVS.cso | Bin 996 -> 27120 bytes Shaders/DistantLightsPS.cso | Bin 660 -> 14572 bytes Shaders/DistantLightsVS.cso | Bin 1892 -> 30312 bytes Shaders/LightPS.cso | Bin 5968 -> 79196 bytes Shaders/LightPS_MS.cso | Bin 33608 -> 143700 bytes Shaders/LightVS.cso | Bin 2500 -> 30672 bytes Shaders/LodLightsPS.cso | Bin 5984 -> 79212 bytes Shaders/LodLightsPS_MS.cso | Bin 34656 -> 148844 bytes Shaders/LodLightsVS.cso | Bin 2600 -> 32820 bytes Shaders/MarkerPS.cso | Bin 584 -> 14496 bytes Shaders/MarkerVS.cso | Bin 1360 -> 27732 bytes Shaders/PPBloomFilterBPHCS.cso | Bin 3256 -> 21188 bytes Shaders/PPBloomFilterVCS.cso | Bin 2556 -> 22536 bytes Shaders/PPCopyPixelsPS.cso | Bin 884 -> 14856 bytes Shaders/PPFinalPassPS.cso | Bin 1456 -> 15444 bytes Shaders/PPFinalPassVS.cso | Bin 532 -> 12388 bytes Shaders/PPLumBlendCS.cso | Bin 976 -> 14812 bytes Shaders/PPReduceTo0DCS.cso | Bin 2224 -> 18108 bytes Shaders/PPReduceTo1DCS.cso | Bin 2136 -> 20068 bytes Shaders/PPSSAAPS.cso | Bin 1420 -> 17304 bytes Shaders/PathBoxPS.cso | Bin 504 -> 12360 bytes Shaders/PathBoxVS.cso | Bin 1316 -> 15344 bytes Shaders/PathDynVS.cso | Bin 1420 -> 27764 bytes Shaders/PathPS.cso | Bin 472 -> 12328 bytes Shaders/PathVS.cso | Bin 984 -> 14992 bytes Shaders/ShadowPS.cso | Bin 1156 -> 15156 bytes Shaders/ShadowVS.cso | Bin 2588 -> 35292 bytes Shaders/ShadowVS_Skin.cso | Bin 4220 -> 42632 bytes Shaders/SkyMoonPS.cso | Bin 780 -> 14736 bytes Shaders/SkyMoonVS.cso | Bin 1144 -> 27496 bytes Shaders/SkySunPS.cso | Bin 508 -> 12408 bytes Shaders/SkySunVS.cso | Bin 1104 -> 27456 bytes Shaders/SkydomePS.cso | Bin 3720 -> 53252 bytes Shaders/SkydomeVS.cso | Bin 5408 -> 83592 bytes Shaders/TerrainPS.cso | Bin 13328 -> 102712 bytes Shaders/TerrainPS_Deferred.cso | Bin 9300 -> 88672 bytes Shaders/TerrainVS_PNCCT.cso | Bin 4912 -> 64632 bytes Shaders/TerrainVS_PNCCTT.cso | Bin 4936 -> 64656 bytes Shaders/TerrainVS_PNCCTTTX.cso | Bin 5508 -> 65228 bytes Shaders/TerrainVS_PNCCTTX.cso | Bin 5484 -> 65204 bytes Shaders/TerrainVS_PNCCTX.cso | Bin 5460 -> 65180 bytes Shaders/TerrainVS_PNCTTTX.cso | Bin 5484 -> 65204 bytes Shaders/TerrainVS_PNCTTX.cso | Bin 5460 -> 65180 bytes Shaders/TreesLodPS.cso | Bin 2072 -> 32596 bytes Shaders/TreesLodPS_Deferred.cso | Bin 1340 -> 29512 bytes Shaders/TreesLodVS.cso | Bin 3012 -> 37748 bytes Shaders/WaterPS.cso | Bin 9896 -> 138292 bytes Shaders/WaterPS_Deferred.cso | Bin 5824 -> 74956 bytes Shaders/WaterVS_PCT.cso | Bin 4600 -> 91020 bytes Shaders/WaterVS_PNCT.cso | Bin 4604 -> 91024 bytes Shaders/WaterVS_PNCTX.cso | Bin 5020 -> 91440 bytes Shaders/WaterVS_PT.cso | Bin 4096 -> 88468 bytes Shaders/WidgetPS.cso | Bin 544 -> 12400 bytes Shaders/WidgetVS.cso | Bin 2068 -> 18412 bytes 340 files changed, 52838 insertions(+), 45035 deletions(-) create mode 100644 .editorconfig create mode 100644 CodeWalker.Core/GameFiles/FileTypes/PedShopMetaFile.cs create mode 100644 CodeWalker.Core/GameFiles/MetaTypes/PsoTypes/GetEnumInfo.cs create mode 100644 CodeWalker.Core/GameFiles/MetaTypes/PsoTypes/GetStructureInfo.cs create mode 100644 CodeWalker.Core/GameFiles/Resources/PedsFiles.cs create mode 100644 CodeWalker.Core/GlobalSuppressions.cs create mode 100644 CodeWalker.Core/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 CodeWalker.Core/Utils/FileUtils.cs create mode 100644 CodeWalker.Core/Utils/SharedObjectPool.cs create mode 100644 CodeWalker.Peds/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 CodeWalker.RPFExplorer/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 CodeWalker.Test/Files/content.xml create mode 100644 CodeWalker.Test/FloatUtilTests.cs create mode 100644 CodeWalker.Test/GameFileTests.cs create mode 100644 CodeWalker.Test/MetaTypesTests.cs create mode 100644 CodeWalker.Test/ResourceBaseTypesTests.cs create mode 100644 CodeWalker.Test/RpfFileTests.cs create mode 100644 CodeWalker.Test/SequenceReaderTests.cs delete mode 100644 CodeWalker.Test/TestBinaryConversions.cs create mode 100644 CodeWalker.WinForms/ReadOnlyPropertyGrid.resx create mode 100644 CodeWalker/.editorconfig create mode 100644 CodeWalker/Properties/PublishProfiles/ClickOnceProfile.pubxml create mode 100644 CodeWalker/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 CodeWalker/Rendering/Utils/ShaderExtensions.cs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a975f0c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,76 @@ +[*.cs] + +# CS8618: Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + +error_prone.large_struct_threshold = 128 +csharp_indent_labels = one_less_than_current +csharp_using_directive_placement = outside_namespace:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_braces = true:silent +csharp_style_namespace_declarations = block_scoped:silent +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_primary_constructors = true:suggestion +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +[*.{cs,vb}] +dotnet_style_operator_placement_when_wrapping = beginning_of_line +tab_width = 4 +indent_size = 4 +end_of_line = crlf +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +[*.{cs,vb}] +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case diff --git a/CodeWalker.Benchmarks/Benchmarks.cs b/CodeWalker.Benchmarks/Benchmarks.cs index acf4ff9..6aa2e6c 100644 --- a/CodeWalker.Benchmarks/Benchmarks.cs +++ b/CodeWalker.Benchmarks/Benchmarks.cs @@ -1,189 +1,199 @@ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Disassemblers; using BenchmarkDotNet.Environments; using BenchmarkDotNet.Jobs; using CodeWalker.Core.Utils; using CodeWalker.GameFiles; +using Collections.Pooled; +using CommunityToolkit.HighPerformance; +using SharpDX; using System; using System.Buffers.Binary; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Runtime.Intrinsics; using System.Text; using System.Threading.Tasks; using System.Web; using System.Xml; using System.Xml.Linq; +using static System.Net.Mime.MediaTypeNames; namespace CodeWalker.Benchmarks { + //[InProcess] + [ShortRunJob] [MemoryDiagnoser] public class Benchmarks { - public const string markup = @" - vehshare - - - - brabusgt600brabusgt600 - brabusgt600 - GT 600 - BRABUS - null - null - null - null - - null - ta176m177 - LAYOUT_LOW - BULLET_COVER_OFFSET_INFO - EXPLOSION_INFO_DEFAULT - - DEFAULT_FOLLOW_VEHICLE_CAMERA - MID_BOX_VEHICLE_AIM_CAMERA - VEHICLE_BONNET_CAMERA_NEAR_EXTRA_HIGH - DEFAULT_POV_CAMERA - - - - - - - - - - - - - - VFXVEHICLEINFO_CAR_BULLET - - - - - - - - - - - - - - - - - - - - - - 60.000000 - 80.000000 - 100.000000 - 120.000000 - 500.000000 - 500.000000 - - - - - - - - - - - SWANKNESS_3 - - FLAG_SPORTS FLAG_RICH_CAR FLAG_NO_BROKEN_DOWN_SCENARIO FLAG_RECESSED_TAILLIGHT_CORONAS FLAG_NO_HEAVY_BRAKE_ANIMATION - VEHICLE_TYPE_CAR - VPT_FRONT_AND_BACK_PLATES - VDT_BANSHEE - VC_SPORT - VWT_HIEND - - docktrailer - trailers - trailers2 - trailers3 - trailers4 - tanker - trailerlogs - tr2 - trflat - - - - - S_M_Y_Cop_01 - - - - - - - - - - - - WHEEL_FRONT_RIGHT_CAMERA - WHEEL_FRONT_LEFT_CAMERA - WHEEL_REAR_RIGHT_CAMERA - WHEEL_REAR_LEFT_CAMERA - - - - - - - - - - - LOW_BULLET_FRONT_LEFT - LOW_BULLET_FRONT_RIGHT - - - + //private class Config : ManualConfig + //{ + // public Config() + // { + // AddDiagnoser(new MemoryDiagnoser(new MemoryDiagnoserConfig(true))); + // AddDiagnoser(new DisassemblyDiagnoser(new DisassemblyDiagnoserConfig())); + + + // } + //} + private static string markup = "\r\n"; + private List listClass; + private List listStruct; + private PooledList pooledListClass; + private PooledList pooledListStruct; + + public class SimpleType + { + public int Value1; + } + + public class SimpleType2 : SimpleType + { + public int Value2; + } + + public class SimpleType3 + { + public long Value1; + public long Value2; + public long Value3; + + public SimpleType3() + { + Value1 = random.Next(); + Value2 = random.Next(); + Value3 = random.Next(); + } + } + + private SimpleType[] intArr; + private List intList; + private static Random random = new Random(42); + public struct BigStruct + { + public long Value1; + public long Value2; + public long Value3; + public long Value4; + public long Value5; + public long Value6; + public long Value7; + public long Value8; + public BigStruct() + { + Value1 = random.Next(); + Value2 = random.Next(); + Value3 = random.Next(); + Value4 = random.Next(); + Value5 = random.Next(); + Value6 = random.Next(); + Value7 = random.Next(); + Value8 = random.Next(); + } + public BigStruct(long value1, long value2, long value3, long value4, long value5, long value6, long value7, long value8) + { + Value1 = value1; + Value2 = value2; + Value3 = value3; + Value4 = value4; + Value5 = value5; + Value6 = value6; + Value7 = value7; + Value8 = value8; + } + public static BigStruct operator +(in BigStruct left, in BigStruct right) + { + return new BigStruct( + left.Value1 + right.Value1, + left.Value2 + right.Value2, + left.Value3 + right.Value3, + left.Value4 + right.Value4, + left.Value5 + right.Value5, + left.Value6 + right.Value6, + left.Value7 + right.Value7, + left.Value8 + right.Value8 + ); + } + } + [Params(10, 100, 1000)] + public int Length { get; set; } = 10000; + [Params(100)] + public int Chance { get; set; } = 25; + public ArrayOfChars64 chars64; + private BigStruct[] vectors = new BigStruct[0]; + private BigStruct vector; - - - - vehicles_banshee_interior - brabusgt600 - + private byte valueByte; + private uint valueUint; + private uint[] data; + private MetaName[] Values; - - -"; + private int randomValue; - private byte[] data; - private RpfFileEntry fileEntry; + private uint[] ushorts = new uint[0]; + + private string Str = "iakslgbhfibnrihbderpiugaehigoI BIHGVUIVDSOUFVBOUADGBOIUYfgiuywetrg872q13rh9872`134tgyihsbaopuJGUIYODGBFIOUFgvbouailksdbhnfp"; [GlobalSetup] public void Setup() { - data = new byte[2048]; - var random = new Random(42); - for (int i = 0; i < data.Length; i++) + random = new Random(42); + + valueByte = 0; + valueUint = 0; + + ushorts = new uint[Length]; + + for (int i = 0; i < Length; i++) { - data[i] = (byte)random.Next(byte.MinValue, byte.MaxValue); + ushorts[i] = (uint)random.Next(0, int.MaxValue); } - GTA5Keys.LoadFromPath("C:\\Program Files\\Rockstar Games\\Grand Theft Auto V", ""); + + var hashes = MemoryMarshal.Cast(ushorts); + + for (int i = 0; i < Length; i++) + { + Console.WriteLine($"{ushorts[i]} -> {hashes[i]}"); + } + + //Console.WriteLine("Setup done"); + + //XElement? result = null; + //var _doc = new XmlDocument(); + //_doc.LoadXml(markup); + + //var doc = XDocument.Load(new XmlNodeReader(_doc)); + //Console.WriteLine(doc.Root); + + //data = new byte[2048]; + //var random = new Random(42); + //for (int i = 0; i < data.Length; i++) + //{ + // data[i] = (byte)random.Next(byte.MinValue, byte.MaxValue); + //} + //GTA5Keys.LoadFromPath("C:\\Program Files\\Rockstar Games\\Grand Theft Auto V", ""); + + //rotation = new Quaternion(random.NextFloat(-1.0f, 1.0f), random.NextFloat(-1.0f, 1.0f), random.NextFloat(-1.0f, 1.0f), random.NextFloat(-1.0f, 1.0f)); + //translation = new Vector3(random.NextFloat(-1.0f, 1.0f), random.NextFloat(-1.0f, 1.0f), random.NextFloat(-1.0f, 1.0f)); + //scale = random.NextFloat(-1.0f, 1.0f); + //matrix = Matrix.AffineTransformation(scale, rotation, translation); } //[Benchmark(Baseline = true)] @@ -200,16 +210,155 @@ namespace CodeWalker.Benchmarks // vehiclesFile.Load(data, fileEntry); //} - [Benchmark] - public void DecryptNGSpan() + //[Benchmark(Baseline = true)] + //public uint SwapBytes() + //{ + // var result = test; + // for (int i = 0; i < 1000; i++) + // { + // result = MetaTypes.SwapBytes(result); + // } + // return result; + //} + + //[Benchmark] + //public uint ReverseEndianness() + //{ + // var result = test; + // for (int i = 0; i < 1000; i++) + // { + // result = BinaryPrimitives.ReverseEndianness(result); + // } + + // return result; + //} + + //[Benchmark] + //public int IndexOf() + //{ + // return Str.IndexOf('\0'); + //} + + //[Benchmark] + //public int IndexOfAsSpan() + //{ + // return Str.AsSpan().IndexOf('\0'); + //} + + private PooledList getPooledListClass() { - GTACrypto.DecryptNG(data.AsSpan(), "kaas", 2048); + var list = new PooledList(); + for (int i = 0; i < Length; i++) + { + list.Add(new SimpleType3()); + } + + return list; + } + + private PooledList getPooledListStruct() + { + var list = new PooledList(); + for (int i = 0; i < Length; i++) + { + list.Add(new BigStruct()); + } + + return list; + } + + private List getListClass() + { + var list = new List(); + for (int i = 0; i < Length; i++) + { + list.Add(new SimpleType3()); + } + + return list; + } + + private List getListStruct() + { + var list = new List(); + for (int i = 0; i < Length; i++) + { + list.Add(new BigStruct()); + } + + return list; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void inVectorOperator() + { + var vect = Vector256.Create(data.AsSpan()); + var shiftVect = Vector256.Create(10); + var leftShiftVect = Vector256.Create(6); + + + } + + private uint joaatLower(Span span) + { + uint h = 0; + for (int i = 0; i < span.Length; i++) + { + h += toLower(span[i]); + h += h << 10; + h ^= h >> 6; + } + + return h; + } + + private uint joaat(Span span) + { + uint h = 0; + for (int i = 0; i < span.Length; i++) + { + h += span[i]; + h += h << 10; + h ^= h >> 6; + } + + return h; + } + + private void toLowerVectorized(Span span) + { + Ascii.ToLowerInPlace(span, out _); + } + + private char toLower(char c) + { + return ('A' <= c && c <= 'Z') ? (char)(c | 0x20) : c; + } + + private void toLowerPleb(Span span) + { + for (int i = 0; i < span.Length; i++) + { + span[i] = toLower(span[i]); + } + } + + + + [Benchmark] + public void ReverseEndianness() + { + //BinaryPrimitives.ReverseEndianness(MemoryMarshal.Cast(ushorts), MemoryMarshal.Cast(ushorts)); } [Benchmark] - public void DecryptNG() + public void SwapBytes() { - GTACrypto.DecryptNG(data, "kaas", 2048); + var _ushorts = ushorts; + for (int i = 0; i < _ushorts.Length; i++) + { + _ushorts[i] = MetaTypes.SwapBytes(_ushorts[i]); + } } } } diff --git a/CodeWalker.Benchmarks/CodeWalker.Benchmarks.csproj b/CodeWalker.Benchmarks/CodeWalker.Benchmarks.csproj index 69ad967..abffe71 100644 --- a/CodeWalker.Benchmarks/CodeWalker.Benchmarks.csproj +++ b/CodeWalker.Benchmarks/CodeWalker.Benchmarks.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 Exe false CodeWalker.Benchmarks @@ -8,8 +8,12 @@ Copyright © 2023 1.0.0.0 1.0.0.0 - latest - true + latest + true + enable + AnyCPU + pdbonly + true @@ -19,37 +23,37 @@ - - + + - - - - - - - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + - + \ No newline at end of file diff --git a/CodeWalker.Benchmarks/Program.cs b/CodeWalker.Benchmarks/Program.cs index 4966c50..1267ce1 100644 --- a/CodeWalker.Benchmarks/Program.cs +++ b/CodeWalker.Benchmarks/Program.cs @@ -16,6 +16,10 @@ namespace CodeWalker.Benchmarks static void Main(string[] args) { +#if DEBUG + var benchmarks = new Benchmarks(); + benchmarks.Setup(); + //var benchmarks = new Benchmarks(); //benchmarks.Setup(); @@ -28,8 +32,9 @@ namespace CodeWalker.Benchmarks //benchmarks.GlobalCleanup(); //ParseBuffer(); - +#else BenchmarkRunner.Run(); +#endif } } } diff --git a/CodeWalker.Core/CodeWalker.Core.csproj b/CodeWalker.Core/CodeWalker.Core.csproj index b5b3626..83a03f1 100644 --- a/CodeWalker.Core/CodeWalker.Core.csproj +++ b/CodeWalker.Core/CodeWalker.Core.csproj @@ -1,22 +1,28 @@  - net6.0 + net8.0 latest true - annotations + enable + + + - + - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers + + diff --git a/CodeWalker.Core/GameFiles/FileTypes/AwcFile.cs b/CodeWalker.Core/GameFiles/FileTypes/AwcFile.cs index 0ed6b34..58db58a 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/AwcFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/AwcFile.cs @@ -8,6 +8,7 @@ using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; using System.Xml; using System.Runtime.InteropServices; +using CodeWalker.Core.Utils; namespace CodeWalker.GameFiles { @@ -345,7 +346,8 @@ namespace CodeWalker.GameFiles } public static void WriteXmlNode(AwcFile f, StringBuilder sb, int indent, string wavfolder, string name = "AudioWaveContainer") { - if (f == null) return; + if (f == null) + return; AwcXml.OpenTag(sb, indent, name); f.WriteXml(sb, indent + 1, wavfolder); AwcXml.CloseTag(sb, indent, name); @@ -1014,7 +1016,7 @@ namespace CodeWalker.GameFiles { var export = !string.IsNullOrEmpty(wavfolder); var fname = Name?.Replace("/", "")?.Replace("\\", "") ?? "0x0"; - byte[] fdata = null; + byte[] fdata; if (MidiChunk != null) { fname += ".midi"; @@ -1038,8 +1040,10 @@ namespace CodeWalker.GameFiles File.WriteAllBytes(filepath, fdata); } } - catch - { } + catch(Exception ex) + { + Console.WriteLine(ex); + } } if (StreamFormat != null) { @@ -1107,8 +1111,10 @@ namespace CodeWalker.GameFiles } } } - catch - { } + catch(Exception ex) + { + Console.WriteLine(ex); + } } @@ -1363,7 +1369,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - var hash = "0x" + (StreamInfo?.Id.ToString("X") ?? "0").PadLeft(8, '0') + ": "; + var hash = "0x" + (StreamInfo?.Id.ToString("X8") ?? "0000000") + ": "; if (FormatChunk != null) { return hash + FormatChunk?.ToString() ?? "AwcAudio"; @@ -1876,7 +1882,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Id.ToString() + ", " + Codec.ToString() + ": " + Samples.ToString() + " samples, " + SamplesPerSecond.ToString() + " samples/sec, headroom: " + Headroom.ToString(); + return $"{Id}, {Codec}: {Samples} samples, {SamplesPerSecond} samples/sec, headroom: {Headroom}"; } } @@ -1905,7 +1911,7 @@ namespace CodeWalker.GameFiles resentry.SystemFlags = BitConverter.ToUInt32(data, 8); resentry.GraphicsFlags = BitConverter.ToUInt32(data, 12); - if (rsc7 != 0x37435352) + if (rsc7 != (uint)FileHeader.RSC7) { } //testing.. if (version != 46) //46 is Clip Dictionary... { } @@ -2163,7 +2169,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "gesture: " + (Gestures?.Length ?? 0).ToString() + " items"; + return $"gesture: {Gestures?.Length ?? 0} items"; } } @@ -2198,32 +2204,26 @@ namespace CodeWalker.GameFiles public void WriteLine(StringBuilder sb) { sb.Append(UnkUint1.ToString()); - sb.Append(" "); + sb.Append(' '); sb.Append(FloatUtil.ToString(UnkFloat1)); - sb.Append(" "); + sb.Append(' '); sb.Append(UnkUshort1.ToString()); - sb.Append(" "); + sb.Append(' '); sb.Append(UnkUshort2.ToString()); sb.AppendLine(); } public void ReadLine(string s) { - var split = s.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); - var list = new List(); - foreach (var str in split) + Span ranges = stackalloc Range[5]; + var span = s.AsSpan(); + span.Split(ranges, ' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + if (ranges.Length >= 4) { - var tstr = str.Trim(); - if (!string.IsNullOrEmpty(tstr)) - { - list.Add(tstr); - } - } - if (list.Count >= 4) - { - uint.TryParse(list[0], out uint u1); - FloatUtil.TryParse(list[1], out float f1); - ushort.TryParse(list[2], out ushort s1); - ushort.TryParse(list[3], out ushort s2); + uint.TryParse(span[ranges[0]], out uint u1); + FloatUtil.TryParse(span[ranges[1]], out float f1); + ushort.TryParse(span[ranges[2]], out ushort s1); + ushort.TryParse(span[ranges[3]], out ushort s2); UnkUint1 = u1; UnkFloat1 = f1; UnkUshort1 = s1; @@ -2247,7 +2247,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return UnkUint1.ToString() + ", " + UnkFloat1.ToString() + ", " + UnkUshort1.ToString() + ", " + UnkUshort2.ToString(); + return $"{UnkUint1}, {UnkFloat1}, {UnkUshort1}, {UnkUshort2}"; } } @@ -2326,7 +2326,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "granulargrains: " + (GranularGrains?.Length ?? 0).ToString() + " items"; + return $"granulargrains: {(GranularGrains?.Length ?? 0)} items"; } } @@ -2410,7 +2410,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Identifier.ToString() + ": " + UnkUint1.ToString() + ": " + GrainCount.ToString() + " items"; + return $"{Identifier}: {UnkUint1}: {GrainCount} items"; } } @@ -2456,7 +2456,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "granularloops: " + (GranularLoops?.Length ?? 0).ToString() + " items"; + return $"granularloops: {GranularLoops?.Length ?? 0} items"; } } @@ -2576,7 +2576,7 @@ namespace CodeWalker.GameFiles break; } - return Name.ToString() + ": " + valstr + ", " + SampleOffset.ToString() + ", " + Unused.ToString(); + return $"{Name}: {valstr}, {SampleOffset}, {Unused}"; } } @@ -3029,15 +3029,22 @@ namespace CodeWalker.GameFiles public static string GetXml(AwcFile awc, string outputFolder = "") { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if (awc != null) + StringBuilder sb = StringBuilderPool.Get(); + try { - AwcFile.WriteXmlNode(awc, sb, 0, outputFolder); - } + sb.AppendLine(XmlHeader); - return sb.ToString(); + if (awc != null) + { + AwcFile.WriteXmlNode(awc, sb, 0, outputFolder); + } + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); + } } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/Builders/YnvBuilder.cs b/CodeWalker.Core/GameFiles/FileTypes/Builders/YnvBuilder.cs index 37c97ec..0363214 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/Builders/YnvBuilder.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/Builders/YnvBuilder.cs @@ -109,10 +109,10 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders foreach (var poly in polys) //split along borders { var verts = poly.Vertices; - if (verts == null) - { continue; }//ignore empty polys.. + if (verts is null) + continue;//ignore empty polys.. if (verts.Length < 3) - { continue; }//not enough verts for a triangle! + continue;//not enough verts for a triangle! Vector2I gprev = NavGrid.GetCellPos(verts[0]); int split1 = 0; @@ -156,13 +156,18 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders verts1.Clear(); verts2.Clear(); - for (int i = 0; i < split1; i++) verts1.Add(verts[i]); + for (int i = 0; i < split1; i++) + verts1.Add(verts[i]); + verts1.Add(sp1); verts1.Add(sp2); - for (int i = split2end; i < verts.Length; i++) verts1.Add(verts[i]); + + for (int i = split2end; i < verts.Length; i++) + verts1.Add(verts[i]); verts2.Add(sp1); - for (int i = split1; i < split2end; i++) verts2.Add(verts[i]); + for (int i = split1; i < split2end; i++) + verts2.Add(verts[i]); verts2.Add(sp2); poly1.Vertices = verts1.ToArray(); @@ -203,9 +208,9 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders var verts = poly.Vertices; var ec = edges?.Length ?? 0; if (ec <= 0) - { continue; }//shouldn't happen - no edges? + continue;//shouldn't happen - no edges? if (ec != poly.Vertices?.Length) - { continue; }//shouldn't happen + continue;//shouldn't happen var split1beg = polysplit.Split1 - 1; var split1end = polysplit.Split1; @@ -256,22 +261,22 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders foreach (var poly in newpolys) //fix any untouched edges that joined to split polys { - if (poly.Edges?.Length != poly.Vertices?.Length) - { continue; }//shouldn't happen (no edges?) + if (poly.Edges is null || poly.Vertices is null || poly.Edges.Length != poly.Vertices.Length) + continue;//shouldn't happen (no edges?) + for (int i = 0; i < poly.Edges.Length; i++) { var edge = poly.Edges[i]; var vert = poly.Vertices[i]; if (edge == null) - { continue; }//shouldn't happen + continue;//shouldn't happen if (edge.Poly1 != edge.Poly2) - { continue; }//shouldn't happen? + continue;//shouldn't happen? if (edge.Poly1 == null) - { continue; }//probably this edge joins to nothing + continue;//probably this edge joins to nothing - YnvPolySplit polysplit; - if (polysplits.TryGetValue(edge.Poly1, out polysplit)) + if (polysplits.TryGetValue(edge.Poly1, out var polysplit)) { var newpoly = polysplit.GetNearest(vert); if (newpoly == null) @@ -287,7 +292,7 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders return newpolys; } - private Vector3 GetSplitPos(Vector3 a, Vector3 b, bool xaxis) + private Vector3 GetSplitPos(in Vector3 a, in Vector3 b, bool xaxis) { Vector3 ca = NavGrid.GetCellRel(a); Vector3 cb = NavGrid.GetCellRel(b); @@ -311,19 +316,19 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders return a + (b - a) * Math.Min(Math.Max(f, 0.0f), 1.0f); } - private bool IsValidSplit(Vector3 s1, Vector3 s2, Vector3 v1a, Vector3 v1b, Vector3 v2a, Vector3 v2b) + private bool IsValidSplit(in Vector3 s1, in Vector3 s2, in Vector3 v1a, in Vector3 v1b, in Vector3 v2a, in Vector3 v2b) { - if (XYEqual(s1, s2)) return false; - if (XYEqual(s1, v1a)) return false; - if (XYEqual(s1, v1b)) return false; - if (XYEqual(s2, v2a)) return false; - if (XYEqual(s2, v2b)) return false; + if (XYEqual(in s1, in s2)) return false; + if (XYEqual(in s1, in v1a)) return false; + if (XYEqual(in s1, in v1b)) return false; + if (XYEqual(in s2, in v2a)) return false; + if (XYEqual(in s2, in v2b)) return false; return true; } - private bool XYEqual(Vector3 v1, Vector3 v2) + private bool XYEqual(in Vector3 v1, in Vector3 v2) { - return ((v1.X == v2.X) && (v1.Y == v2.Y)); + return v1.X == v2.X && v1.Y == v2.Y; } private class YnvPolySplit @@ -335,8 +340,8 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders public int Split2; public YnvPoly GetNearest(Vector3 v) { - if (New1?.Vertices == null) return New2; - if (New2?.Vertices == null) return New1; + if (New1?.Vertices is null) return New2; + if (New2?.Vertices is null) return New1; float len1 = float.MaxValue; float len2 = float.MaxValue; for (int i = 0; i < New1.Vertices.Length; i++) @@ -357,11 +362,11 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders return New1; } } - private YnvPolySplit TryGetSplit(Dictionary polysplits, YnvPoly poly) + private YnvPolySplit? TryGetSplit(Dictionary polysplits, YnvPoly poly) { - if (poly == null) return null; - YnvPolySplit r = null; - polysplits.TryGetValue(poly, out r); + if (poly == null) + return null; + _ = polysplits.TryGetValue(poly, out var r); return r; } @@ -379,7 +384,7 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders if (ynv == null) { ynv = new YnvFile(); - ynv.Name = "navmesh[" + cell.FileX.ToString() + "][" + cell.FileY.ToString() + "]"; + ynv.Name = $"navmesh[{cell.FileX}][{cell.FileY}]"; ynv.Nav = new NavMesh(); ynv.Nav.SetDefaults(false); ynv.Nav.AABBSize = new Vector3(NavGrid.CellSize, NavGrid.CellSize, 0.0f); @@ -411,14 +416,13 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders foreach (var poly in polys) { poly.CalculatePosition(); - var pos = poly.Position; var verts = poly.Vertices; - if (verts != null) + if (verts is not null) { - foreach (var vert in verts) + foreach (ref var vert in verts.AsSpan()) { - bbmin = Vector3.Min(bbmin, vert); - bbmax = Vector3.Max(bbmax, vert); + Vector3.Min(ref bbmin, ref vert, out bbmin); + Vector3.Max(ref bbmax, ref vert, out bbmax); } } } @@ -460,7 +464,9 @@ namespace CodeWalker.Core.GameFiles.FileTypes.Builders float zmax = float.MinValue; foreach (var poly in ynv.Polys) { - foreach (var vert in poly.Vertices) + if (poly.Vertices is null) + continue; + foreach (ref var vert in poly.Vertices.AsSpan()) { zmin = Math.Min(zmin, vert.Z); zmax = Math.Max(zmax, vert.Z); diff --git a/CodeWalker.Core/GameFiles/FileTypes/CacheDatFile.cs b/CodeWalker.Core/GameFiles/FileTypes/CacheDatFile.cs index 7ff9866..7b78075 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/CacheDatFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/CacheDatFile.cs @@ -1,4 +1,5 @@ -using SharpDX; +using Collections.Pooled; +using SharpDX; using System; using System.Collections.Generic; using System.ComponentModel; @@ -28,6 +29,7 @@ namespace CodeWalker.GameFiles public CInteriorProxy[] AllCInteriorProxies { get; set; } public BoundsStoreItem[] AllBoundsStoreItems { get; set; } + [SkipLocalsInit] public void Load(byte[] data, RpfFileEntry entry) { FileEntry = entry; @@ -36,6 +38,7 @@ namespace CodeWalker.GameFiles using BinaryReader br = new BinaryReader(ms); Span charArr = stackalloc char[100]; + var length = 0; for (int i = 0; (i < 100) && (i < data.Length); i++) { @@ -56,10 +59,10 @@ namespace CodeWalker.GameFiles uint structcount = 0; uint modlen; bool indates = false; - var dates = new List(); - var allMapNodes = new List(); - var allCInteriorProxies = new List(); - var allBoundsStoreItems = new List(); + using var dates = new PooledList(); + using var allMapNodes = new PooledList(); + using var allCInteriorProxies = new PooledList(); + using var allBoundsStoreItems = new PooledList(); for (int i = 100; i < data.Length; i++) { byte b = data[i]; @@ -68,7 +71,6 @@ namespace CodeWalker.GameFiles if (b == 0xA) { lastn = i; - string line = new string(charArr.Slice(0, length)); switch (charArr.Slice(0, length)) { case "": @@ -125,6 +127,7 @@ namespace CodeWalker.GameFiles { } //just testing else { + string line = new string(charArr.Slice(0, length)); dates.Add(new CacheFileDate(line));//eg: 2740459947 (hash of: platform:/data/cdimages/scaleform_frontend.rpf) 130680580712018938 8944 } break; @@ -204,7 +207,6 @@ namespace CodeWalker.GameFiles mapnode.InteriorProxyListToArray(); } - br.Dispose(); ms.Dispose(); @@ -407,7 +409,7 @@ namespace CodeWalker.GameFiles public string ToCacheFileString() { - return FileName.Hash.ToString() + " " + TimeStamp.ToFileTimeUtc().ToString() + " " + FileID.ToString(); + return $"{FileName.Hash} {TimeStamp.ToFileTimeUtc()} {FileID}"; } public void WriteXml(StringBuilder sb, int indent) @@ -425,7 +427,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return FileName.ToString() + ", " + TimeStamp.ToString() + ", " + FileID.ToString(); + return $"{FileName}, {TimeStamp}, {FileID}"; } } @@ -478,10 +480,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Name.ToString() + ", " + - Min.ToString() + ", " + - Max.ToString() + ", " + - Layer.ToString(); + return $"{Name}, {Min}, {Max}, {Layer}"; } } @@ -775,19 +774,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Unk01.ToString() + ", " + - Unk02.ToString() + ", " + - Unk03.ToString() + ", " + - Name.ToString() + ", " + - Parent.ToString() + ", " + - Position.ToString() + ", " + - Orientation.ToString() + ", " + - BBMin.ToString() + ", " + - BBMax.ToString() + ", " + - Unk11.ToString() + ", " + - Unk12.ToString() + ", " + - Unk13.ToString() + ", " + - Unk14.ToString(); + return $"{Unk01}, {Unk02}, {Unk03}, {Name}, {Parent}, {Position}, {Orientation}, {BBMin}, {BBMax}, {Unk11}, {Unk12}, {Unk13}, {Unk14}"; } } @@ -796,10 +783,10 @@ namespace CodeWalker.GameFiles public MetaHash Name { get; set; } public MetaHash ParentName { get; set; } public uint ContentFlags { get; set; } - public Vector3 streamingExtentsMin { get; set; } - public Vector3 streamingExtentsMax { get; set; } - public Vector3 entitiesExtentsMin { get; set; } - public Vector3 entitiesExtentsMax { get; set; } + public Vector3 streamingExtentsMin; + public Vector3 streamingExtentsMax; + public Vector3 entitiesExtentsMin; + public Vector3 entitiesExtentsMax; public byte Unk1 { get; set; } public byte Unk2 { get; set; } public byte Unk3 { get; set; } @@ -912,15 +899,12 @@ namespace CodeWalker.GameFiles public void AddChildToList(MapDataStoreNode child) { - if (ChildrenList == null) - { - ChildrenList = new List(); - } + ChildrenList ??= new List(); ChildrenList.Add(child); } public void ChildrenListToArray() { - if (ChildrenList != null) + if (ChildrenList is not null) { Children = ChildrenList.ToArray(); ChildrenList = null; //plz get this GC @@ -928,15 +912,12 @@ namespace CodeWalker.GameFiles } public void AddInteriorToList(CInteriorProxy iprx) { - if (InteriorProxyList == null) - { - InteriorProxyList = new List(); - } + InteriorProxyList ??= new List(); InteriorProxyList.Add(iprx); } public void InteriorProxyListToArray() { - if (InteriorProxyList != null) + if (InteriorProxyList is not null) { InteriorProxies = InteriorProxyList.ToArray(); InteriorProxyList = null; //plz get this GC @@ -945,13 +926,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Name.ToString() + ", " + - ParentName.ToString() + ", " + - ContentFlags.ToString() + ", " + - streamingExtentsMin.ToString() + ", " + - streamingExtentsMax.ToString() + ", " + - entitiesExtentsMin.ToString() + ", " + - entitiesExtentsMax.ToString();// + ", " + + return $"{Name}, {ParentName}, {ContentFlags}, {streamingExtentsMin}, {streamingExtentsMax}, {entitiesExtentsMin}, {entitiesExtentsMax}";// + ", " + } } @@ -972,16 +947,24 @@ namespace CodeWalker.GameFiles { get { - StringBuilder sb = new StringBuilder(); - if (Unk02 != null) + if (Unk02 is null) + return string.Empty; + + StringBuilder sb = MetaXmlBase.StringBuilderPool.Get(); + try { - for (int i = 0; i < Unk02.Length; i++) + foreach (var b in Unk02) { - if (Unk02[i] == 0) break; - sb.Append((char)Unk02[i]); + if (b == 0) + break; + sb.Append((char)b); } + return sb.ToString(); + } + finally + { + MetaXmlBase.StringBuilderPool.Return(sb); } - return sb.ToString(); } } @@ -1027,7 +1010,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Unk01.ToString() + ", " + Unk02str; + return $"{Unk01}, {Unk02str}"; } } @@ -1038,21 +1021,28 @@ namespace CodeWalker.GameFiles public static string GetXml(CacheDatFile cdf) { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if (cdf != null) + StringBuilder sb = StringBuilderPool.Get(); + try { - var name = "CacheFile"; + sb.AppendLine(XmlHeader); - OpenTag(sb, 0, name); + if (cdf != null) + { + var name = "CacheFile"; - cdf.WriteXml(sb, 1); + OpenTag(sb, 0, name); - CloseTag(sb, 0, name); + cdf.WriteXml(sb, 1); + + CloseTag(sb, 0, name); + } + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); } - - return sb.ToString(); } diff --git a/CodeWalker.Core/GameFiles/FileTypes/CarColsFile.cs b/CodeWalker.Core/GameFiles/FileTypes/CarColsFile.cs index 689ce78..654dee3 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/CarColsFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/CarColsFile.cs @@ -35,8 +35,7 @@ namespace CodeWalker.GameFiles //can be PSO .ymt or XML .meta - MemoryStream ms = new MemoryStream(data); - if (PsoFile.IsPSO(ms)) + if (PsoFile.IsPSO(data.AsSpan(0, 4))) { Pso = new PsoFile(); Pso.Load(data); @@ -59,8 +58,6 @@ namespace CodeWalker.GameFiles var msg = ex.Message; } } - else - { } if (xdoc.DocumentElement != null) diff --git a/CodeWalker.Core/GameFiles/FileTypes/CarVariationsFile.cs b/CodeWalker.Core/GameFiles/FileTypes/CarVariationsFile.cs index b092b39..6325e7b 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/CarVariationsFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/CarVariationsFile.cs @@ -10,6 +10,7 @@ using System.Xml; using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; +using CodeWalker.Core.Utils; namespace CodeWalker.GameFiles { @@ -78,12 +79,11 @@ namespace CodeWalker.GameFiles public CVehicleModelInfoVariation(XmlNode node) { - XmlNode cnode; - cnode = node.SelectSingleNode("variationData"); - if (cnode != null) + var variationNode = node.SelectSingleNode("variationData"); + if (variationNode is not null) { - var items = cnode.SelectNodes("Item"); - if (items.Count > 0) + var items = variationNode.SelectNodes("Item"); + if (items is not null && items.Count > 0) { variationData = new CVehicleModelInfoVariation_418053801[items.Count]; for (int i = 0; i < items.Count; i++) @@ -107,12 +107,11 @@ namespace CodeWalker.GameFiles public CVehicleModelInfoVariation_418053801(XmlNode node) { modelName = Xml.GetChildInnerText(node, "modelName"); - XmlNode cnode; - cnode = node.SelectSingleNode("colors"); - if (cnode != null) + var colorsNode = node.SelectSingleNode("colors"); + if (colorsNode is not null) { - var items = cnode.SelectNodes("Item"); - if (items.Count > 0) + var items = colorsNode.SelectNodes("Item"); + if (items is not null && items.Count > 0) { colors = new CVehicleModelInfoVariation_2575850962[items.Count]; for (int i = 0; i < items.Count; i++) @@ -121,11 +120,11 @@ namespace CodeWalker.GameFiles } } } - cnode = node.SelectSingleNode("kits"); - if (cnode != null) + var kitsNode = node.SelectSingleNode("kits"); + if (kitsNode is not null) { - var items = cnode.SelectNodes("Item"); - if (items.Count > 0) + var items = kitsNode.SelectNodes("Item"); + if (items is not null && items.Count > 0) { kits = new MetaHash[items.Count]; for (int i = 0; i < items.Count; i++) @@ -134,11 +133,11 @@ namespace CodeWalker.GameFiles } } } - cnode = node.SelectSingleNode("windowsWithExposedEdges"); - if (cnode != null) + var windowsNodes = node.SelectSingleNode("windowsWithExposedEdges"); + if (windowsNodes is not null) { - var items = cnode.SelectNodes("Item"); - if (items.Count > 0) + var items = windowsNodes.SelectNodes("Item"); + if (items is not null && items.Count > 0) { windowsWithExposedEdges = new MetaHash[items.Count]; for (int i = 0; i < items.Count; i++) @@ -147,10 +146,10 @@ namespace CodeWalker.GameFiles } } } - cnode = node.SelectSingleNode("plateProbabilities"); - if (cnode != null) + var plateProbabilitiesNode = node.SelectSingleNode("plateProbabilities"); + if (plateProbabilitiesNode is not null) { - plateProbabilities = new PlateProbabilities(cnode); + plateProbabilities = new PlateProbabilities(plateProbabilitiesNode); } lightSettings = (byte)Xml.GetChildIntAttribute(node, "lightSettings", "value"); sirenSettings = (byte)Xml.GetChildIntAttribute(node, "sirenSettings", "value"); @@ -168,28 +167,25 @@ namespace CodeWalker.GameFiles public CVehicleModelInfoVariation_2575850962(XmlNode node) { - XmlNode cnode; - cnode = node.SelectSingleNode("indices"); - if (cnode != null) + var indicesNode = node.SelectSingleNode("indices"); + if (indicesNode is not null) { - var astr = cnode.InnerText; - var arrr = astr.Split(new[] { '\n', ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + var astr = indicesNode.InnerText; var alist = new List(); - foreach (var item in arrr) + foreach (var item in astr.EnumerateSplitAny(['\n', ' ', '\t'])) { var titem = item.Trim(); - byte v; - if (byte.TryParse(titem, out v)) + if (byte.TryParse(titem, out var v)) { alist.Add(v); } } indices = alist.ToArray(); } - cnode = node.SelectSingleNode("liveries"); - if (cnode != null) + var liveriesNode = node.SelectSingleNode("liveries"); + if (liveriesNode is not null) { - var items = cnode.SelectNodes("Item"); + var items = liveriesNode.SelectNodes("Item"); if (items.Count > 0) { liveries = new bool[items.Count]; @@ -200,14 +196,12 @@ namespace CodeWalker.GameFiles } else { - var astr = cnode.InnerText; - var arrr = astr.Split(new[] { '\n', ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + var astr = liveriesNode.InnerText; var alist = new List(); - foreach (var item in arrr) + foreach (var item in astr.EnumerateSplitAny(['\n', ' ', '\t'])) { var titem = item.Trim(); - byte v; - if (byte.TryParse(titem, out v)) + if (byte.TryParse(titem, out var v)) { alist.Add(v > 0); } @@ -254,7 +248,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Name.ToString() + ": " + Value.ToString(); + return $"{Name}: {Value}"; } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/CutFile.cs b/CodeWalker.Core/GameFiles/FileTypes/CutFile.cs index 627c871..fbbc1ee 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/CutFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/CutFile.cs @@ -9,6 +9,7 @@ using System.Xml; using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; +using Collections.Pooled; namespace CodeWalker.GameFiles { @@ -33,12 +34,10 @@ namespace CodeWalker.GameFiles { FileEntry = entry; - MemoryStream ms = new MemoryStream(data); - - if (PsoFile.IsPSO(ms)) + if (PsoFile.IsPSO(data.AsSpan(0, 4))) { Pso = new PsoFile(); - Pso.Load(ms); + Pso.Load(data); var xml = PsoXml.GetXml(Pso); XmlDocument doc = new XmlDocument(); @@ -48,10 +47,6 @@ namespace CodeWalker.GameFiles CutsceneFile2 = new CutsceneFile2(); CutsceneFile2.ReadXml(node); - } - else - { - } } @@ -228,7 +223,7 @@ namespace CodeWalker.GameFiles - public static CutBase ConstructObject(string type) + public static CutBase? ConstructObject(string type) { switch (type) { @@ -279,7 +274,7 @@ namespace CodeWalker.GameFiles default: return null; } } - public static T ReadObject(XmlNode node, string name) where T : IMetaXmlItem, new() + public static T? ReadObject(XmlNode node, string name) where T : IMetaXmlItem, new() { var onode = node.SelectSingleNode(name); if (onode != null) @@ -288,7 +283,7 @@ namespace CodeWalker.GameFiles o.ReadXml(onode); return o; } - return default(T); + return default; } public static object[] ReadObjectArray(XmlNode node, string name) { @@ -298,7 +293,7 @@ namespace CodeWalker.GameFiles var inodes = aNode.SelectNodes("Item"); if (inodes?.Count > 0) { - var oList = new List(); + using var oList = new PooledList(); foreach (XmlNode inode in inodes) { var type = Xml.GetStringAttribute(inode, "type"); diff --git a/CodeWalker.Core/GameFiles/FileTypes/DlcContentFile.cs b/CodeWalker.Core/GameFiles/FileTypes/DlcContentFile.cs index 078c89b..124df79 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/DlcContentFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/DlcContentFile.cs @@ -1,24 +1,76 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; +using System.Reflection.PortableExecutable; using System.Text; using System.Threading.Tasks; using System.Xml; +using System.Xml.Linq; namespace CodeWalker.GameFiles { public class DlcContentFile { - public List dataFiles { get; set; } = new List(); public List contentChangeSets { get; set; } = new List(); public RpfFile DlcFile { get; set; } //used by GameFileCache - public Dictionary ExtraMounts { get; set; } = new Dictionary(); - public Dictionary RpfDataFiles { get; set; } = new Dictionary(); + public Dictionary ExtraMounts { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + public Dictionary RpfDataFiles { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); public DlcExtraTitleUpdateFile ExtraTitleUpdates { get; set; } + public void Load(XmlReader reader) + { + reader.MoveToStartElement("CDataFileMgr__ContentsOfDataFileXml"); + while (reader.Read()) + { + switch (reader.MoveToContent()) + { + case XmlNodeType.Element: + ReadElement(reader); + break; + case XmlNodeType.EndElement: + if (reader.Name == "CDataFileMgr__ContentsOfDataFileXml") + { + //Reached end of file + return; + } + break; + default: + break; + } + } + } + + public void ReadElement(XmlReader reader) + { + switch(reader.Name) + { + case "disabledFiles": + case "includedXmlFiles": + case "includedDataFiles": + case "patchFiles": + reader.Skip(); + return; + + case "dataFiles": + foreach(var item in reader.IterateItems("dataFiles")) + { + dataFiles.Add(new DlcContentDataFile(item)); + } + return; + + case "contentChangeSets": + foreach(var item in reader.IterateItems("contentChangeSets")) + { + contentChangeSets.Add(new DlcContentChangeSet(item)); + } + return; + } + } + public void Load(XmlDocument doc) { @@ -32,16 +84,16 @@ namespace CodeWalker.GameFiles switch (node.Name) { case "disabledFiles": - foreach (XmlNode disabledFile in node.ChildNodes) - { } //nothing to see here.. + //foreach (XmlNode disabledFile in node.ChildNodes) + //{ } //nothing to see here.. break; case "includedXmlFiles": - foreach (XmlNode includedXmlFile in node.ChildNodes) - { } //nothing to see here.. + //foreach (XmlNode includedXmlFile in node.ChildNodes) + //{ } //nothing to see here.. break; case "includedDataFiles": - foreach (XmlNode includedDataFile in node.ChildNodes) - { } //nothing to see here.. + //foreach (XmlNode includedDataFile in node.ChildNodes) + //{ } //nothing to see here.. break; case "dataFiles": foreach (XmlNode dataFile in node.ChildNodes) @@ -62,8 +114,8 @@ namespace CodeWalker.GameFiles } break; case "patchFiles": - foreach (XmlNode patchFile in node.ChildNodes) - { } //nothing to see here.. + //foreach (XmlNode patchFile in node.ChildNodes) + //{ } //nothing to see here.. break; default: break; @@ -82,21 +134,21 @@ namespace CodeWalker.GameFiles foreach (var datafile in dataFiles) { - string dfn = GameFileCache.GetDlcPlatformPath(datafile.filename).ToLowerInvariant(); + string dlcPlatformPath = GameFileCache.GetDlcPlatformPath(datafile.filename); if (datafile.fileType == "EXTRA_FOLDER_MOUNT_DATA") { - string efmdxmlpath = datafile.filename.Replace(setupfile.deviceName + ":", DlcFile.Path).Replace('/', '\\'); + string efmdxmlpath = datafile.filename.Replace($"{setupfile.deviceName}:", DlcFile.Path).Replace('/', '\\'); efmdxmlpath = gfc.GetDlcPatchedPath(efmdxmlpath); XmlDocument efmdxml = rpfman.GetFileXml(efmdxmlpath); DlcExtraFolderMountFile efmf = new DlcExtraFolderMountFile(); efmf.Load(efmdxml); - ExtraMounts[dfn] = efmf; + ExtraMounts[dlcPlatformPath] = efmf; } if (datafile.fileType == "EXTRA_TITLE_UPDATE_DATA") { - string etudxmlpath = datafile.filename.Replace(setupfile.deviceName + ":", DlcFile.Path).Replace('/', '\\'); + string etudxmlpath = datafile.filename.Replace($"{setupfile.deviceName}:", DlcFile.Path).Replace('/', '\\'); etudxmlpath = gfc.GetDlcPatchedPath(etudxmlpath); XmlDocument etudxml = rpfman.GetFileXml(etudxmlpath); @@ -107,7 +159,7 @@ namespace CodeWalker.GameFiles } if (datafile.fileType == "RPF_FILE") { - RpfDataFiles[dfn] = datafile; + RpfDataFiles[dlcPlatformPath] = datafile; } } @@ -115,7 +167,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return dataFiles.Count.ToString() + " dataFiles, " + contentChangeSets.Count.ToString() + " contentChangeSets"; + return $"{dataFiles.Count} dataFiles, {contentChangeSets.Count} contentChangeSets"; } } @@ -135,6 +187,52 @@ namespace CodeWalker.GameFiles { Load(node); } + + public DlcContentDataFile(XElement xElement) + { + Load(xElement); + } + + public void Load(XElement xElement) + { + foreach(var child in xElement.Elements()) + { + switch(child.Name.LocalName) + { + case "filename": + filename = child.Value; + break; + case "fileType": + fileType = child.Value; + break; + case "contents": + contents = child.Value; + break; + case "installPartition": + installPartition = child.Value; + break; + case "overlay": + overlay = child.GetBoolAttribute("value"); + break; + case "disabled": + disabled = child.GetBoolAttribute("value"); + break; + case "persistent": + persistent = child.GetBoolAttribute("value"); + break; + case "loadCompletely": + loadCompletely = child.GetBoolAttribute("value"); + break; + case "locked": + locked = child.GetBoolAttribute("value"); + break; + default: + break; + + } + } + } + public void Load(XmlNode node) { foreach (XmlNode child in node.ChildNodes) @@ -176,36 +274,98 @@ namespace CodeWalker.GameFiles public override string ToString() { - return filename + ": " + fileType + ": " + contents + ": " + installPartition + - (overlay ? ", overlay" : "") + - (disabled ? ", disabled" : "") + - (persistent ? ", persistent" : "") + - (loadCompletely ? ", loadCompletely" : "") + - (locked ? ", locked" : ""); + return $"{filename}: {fileType}: {contents}: {installPartition}{(overlay ? ", overlay" : "")}{(disabled ? ", disabled" : "")}{(persistent ? ", persistent" : "")}{(loadCompletely ? ", loadCompletely" : "")}{(locked ? ", locked" : "")}"; } } public class DlcContentChangeSet { public string changeSetName { get; set; } - public List filesToInvalidate { get; set; } - public List filesToDisable { get; set; } - public List filesToEnable { get; set; } - public List txdToLoad { get; set; } - public List txdToUnload { get; set; } - public List residentResources { get; set; } - public List unregisterResources { get; set; } - public List mapChangeSetData { get; set; } + public List? filesToInvalidate { get; set; } + public List? filesToDisable { get; set; } + public List? filesToEnable { get; set; } + public List? txdToLoad { get; set; } + public List? txdToUnload { get; set; } + public List? residentResources { get; set; } + public List? unregisterResources { get; set; } + public List? mapChangeSetData { get; set; } public string associatedMap { get; set; } public bool requiresLoadingScreen { get; set; } public string loadingScreenContext { get; set; } public bool useCacheLoader { get; set; } public DlcContentChangeSetExecutionConditions executionConditions { get; set; } + public DlcContentChangeSet(XElement element) + { + Load(element); + } + public DlcContentChangeSet(XmlNode node) { Load(node); } + + public void Load(XElement element) + { + foreach(var child in element.Elements()) + { + switch (child.Name.LocalName) + { + case "changeSetName": + changeSetName = child.Value; + break; + case "filesToInvalidate": + filesToInvalidate = GetChildStringArray(child); + break; + case "filesToDisable": + filesToDisable = GetChildStringArray(child); + break; + case "filesToEnable": + filesToEnable = GetChildStringArray(child); + break; + case "txdToLoad": + txdToLoad = GetChildStringArray(child); + break; + case "txdToUnload": + txdToUnload = GetChildStringArray(child); + break; + case "residentResources": + residentResources = GetChildStringArray(child); + break; + case "unregisterResources": + unregisterResources = GetChildStringArray(child); + break; + case "mapChangeSetData": + if (child.HasElements) + { + mapChangeSetData = new List(); + foreach (XElement childElement in child.Elements()) + { + mapChangeSetData.Add(new DlcContentChangeSet(childElement)); + } + } + break; + case "associatedMap": + associatedMap = child.Value; + break; + case "requiresLoadingScreen": + requiresLoadingScreen = Xml.GetBoolAttribute(child, "value"); + break; + case "loadingScreenContext": + loadingScreenContext = child.Value; + break; + case "useCacheLoader": + useCacheLoader = Xml.GetBoolAttribute(child, "value"); + break; + case "executionConditions": + executionConditions = new DlcContentChangeSetExecutionConditions(child); + break; + default: + break; + } + } + } + public void Load(XmlNode node) { foreach (XmlNode child in node.ChildNodes) @@ -217,44 +377,33 @@ namespace CodeWalker.GameFiles break; case "filesToInvalidate": filesToInvalidate = GetChildStringArray(child); - if (filesToInvalidate != null) - { } break; case "filesToDisable": filesToDisable = GetChildStringArray(child); - if (filesToDisable != null) - { } break; case "filesToEnable": filesToEnable = GetChildStringArray(child); - if (filesToEnable != null) - { } break; case "txdToLoad": txdToLoad = GetChildStringArray(child); - if (txdToLoad != null) - { } break; case "txdToUnload": txdToUnload = GetChildStringArray(child); - if (txdToUnload != null) - { } break; case "residentResources": residentResources = GetChildStringArray(child); - if (residentResources != null) - { } break; case "unregisterResources": unregisterResources = GetChildStringArray(child); - if (unregisterResources != null) - { } break; case "mapChangeSetData": - mapChangeSetData = new List(); - foreach (XmlNode mapChangeSetDataItem in child.ChildNodes) + if (child.HasChildNodes) { - mapChangeSetData.Add(new DlcContentChangeSet(mapChangeSetDataItem)); + mapChangeSetData = new List(); + foreach (XmlNode mapChangeSetDataItem in child.ChildNodes) + { + mapChangeSetData.Add(new DlcContentChangeSet(mapChangeSetDataItem)); + } } break; case "associatedMap": @@ -292,6 +441,20 @@ namespace CodeWalker.GameFiles return result; } + private List? GetChildStringArray(XElement node) + { + if (!node.HasElements) return null; + + var result = new List(); + foreach(XElement childNode in node.Elements()) + { + result.Add(childNode.Value); + } + + return result; + } + + public override string ToString() { return (changeSetName != null) ? changeSetName : (associatedMap != null) ? associatedMap : null; @@ -308,6 +471,30 @@ namespace CodeWalker.GameFiles { Load(node); } + + public DlcContentChangeSetExecutionConditions(XElement element) + { + Load(element); + } + + public void Load(XElement element) + { + foreach (XElement child in element.Elements()) + { + switch (child.Name.LocalName) + { + case "activeChangesetConditions": + activeChangesetConditions = child.Value; + break; + case "genericConditions": + genericConditions = child.Value; + break; + default: + break; + } + } + } + public void Load(XmlNode node) { foreach (XmlNode child in node.ChildNodes) diff --git a/CodeWalker.Core/GameFiles/FileTypes/DlcSetupFile.cs b/CodeWalker.Core/GameFiles/FileTypes/DlcSetupFile.cs index 760453a..705ff9e 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/DlcSetupFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/DlcSetupFile.cs @@ -53,7 +53,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return deviceName + ", " + datFile + ", " + nameHash + ", " + type + ", " + order.ToString() + ", " + ((contentChangeSetGroups != null) ? contentChangeSetGroups.Count.ToString() : "0") + " groups, " + timeStamp; + return $"{deviceName}, {datFile}, {nameHash}, {type}, {order}, {contentChangeSetGroups?.Count ?? 0} groups, {timeStamp}"; } } @@ -77,7 +77,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return NameHash + " (" + ((ContentChangeSets != null) ? ContentChangeSets.Count.ToString() : "0") + " changesets)"; + return $"{NameHash} ({ContentChangeSets?.Count ?? 0} changesets)"; } } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/FxcFile.cs b/CodeWalker.Core/GameFiles/FileTypes/FxcFile.cs index 49c0517..3668327 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/FxcFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/FxcFile.cs @@ -683,7 +683,8 @@ namespace CodeWalker.GameFiles public static string ReadString(BinaryReader br) { byte sl = br.ReadByte(); - if (sl == 0) return string.Empty; + if (sl == 0) + return string.Empty; byte[] ba = br.ReadBytes(sl); return (sl > 1) ? Encoding.ASCII.GetString(ba, 0, sl - 1) : string.Empty; } @@ -1073,8 +1074,10 @@ namespace CodeWalker.GameFiles var filepath = Path.Combine(csofolder, fname); File.WriteAllBytes(filepath, ByteCode); } - catch - { } + catch(Exception ex) + { + Console.WriteLine(ex); + } } } } @@ -1840,7 +1843,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Type.ToString() + ", " + Value.ToString(); + return $"{Type}, {Value}"; } } @@ -1856,18 +1859,25 @@ namespace CodeWalker.GameFiles public static string GetXml(FxcFile fxc, string outputFolder = "") { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if ((fxc != null) && (fxc.Shaders != null)) + StringBuilder sb = StringBuilderPool.Get(); + try { - var name = "Effects"; - OpenTag(sb, 0, name); - fxc.WriteXml(sb, 1, outputFolder); - CloseTag(sb, 0, name); - } + sb.AppendLine(XmlHeader); - return sb.ToString(); + if ((fxc != null) && (fxc.Shaders != null)) + { + var name = "Effects"; + OpenTag(sb, 0, name); + fxc.WriteXml(sb, 1, outputFolder); + CloseTag(sb, 0, name); + } + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); + } } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/GtxdFile.cs b/CodeWalker.Core/GameFiles/FileTypes/GtxdFile.cs index 3c5c319..8ecb54d 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/GtxdFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/GtxdFile.cs @@ -1,4 +1,7 @@ -using System; +using Collections.Pooled; +using CommunityToolkit.HighPerformance; +using System; +using System.Buffers; using System.Collections.Generic; using System.ComponentModel; using System.IO; @@ -9,16 +12,12 @@ using System.Xml; namespace CodeWalker.GameFiles { - [TypeConverter(typeof(ExpandableObjectConverter))] public class GtxdFile : GameFile, PackedFile + [TypeConverter(typeof(ExpandableObjectConverter))] + public class GtxdFile : GameFile, PackedFile { - public RbfFile Rbf { get; set; } - - public Dictionary TxdRelationships { get; set; } - - - + public PooledDictionary TxdRelationships { get; set; } public GtxdFile() : base(null, GameFileType.Gtxd) { @@ -36,13 +35,15 @@ namespace CodeWalker.GameFiles FilePath = Name; - if (entry.Name.EndsWith(".ymt", StringComparison.OrdinalIgnoreCase)) + if (entry.IsExtension(".ymt")) { - MemoryStream ms = new MemoryStream(data); - if (RbfFile.IsRBF(ms)) + if (RbfFile.IsRBF(data.AsSpan(0, 4))) { + //using MemoryStream ms = new MemoryStream(data); + var sequence = new ReadOnlySequence(data); + var reader = new SequenceReader(sequence); Rbf = new RbfFile(); - var rbfstruct = Rbf.Load(ms); + var rbfstruct = Rbf.Load(ref reader); if (rbfstruct.Name == "CMapParentTxds") { @@ -52,12 +53,8 @@ namespace CodeWalker.GameFiles Loaded = true; return; } - else - { - //not an RBF file... - } } - else if (entry.Name.EndsWith(".meta", StringComparison.OrdinalIgnoreCase)) + else if (entry.IsExtension(".meta")) { //required for update\x64\dlcpacks\mpheist\dlc.rpf\common\data\gtxd.meta and update\x64\dlcpacks\mpluxe\dlc.rpf\common\data\gtxd.meta string xml = TextUtil.GetUTF8Text(data); @@ -73,30 +70,31 @@ namespace CodeWalker.GameFiles private void LoadTxdRelationships(RbfStructure rbfstruct) { - TxdRelationships = new Dictionary(); + TxdRelationships?.Clear(); + if (rbfstruct.Children is null) + return; + + TxdRelationships ??= new PooledDictionary(); //StringBuilder sblist = new StringBuilder(); - foreach (var child in rbfstruct.Children) + foreach (var child in rbfstruct.Children.Span) { - var childstruct = child as RbfStructure; - if ((childstruct != null) && (childstruct.Name == "txdRelationships")) + if (child is RbfStructure childstruct && childstruct.Name == "txdRelationships" && childstruct.Children is not null) { + TxdRelationships.EnsureCapacity(TxdRelationships.Count + childstruct.Children.Count); foreach (var txdrel in childstruct.Children) { - var txdrelstruct = txdrel as RbfStructure; - if ((txdrelstruct != null) && (txdrelstruct.Name == "item")) + if (txdrel is RbfStructure txdrelstruct && txdrelstruct.Name == "item" && txdrelstruct.Children is not null) { string parentstr = string.Empty; string childstr = string.Empty; foreach (var item in txdrelstruct.Children) { - var itemstruct = item as RbfStructure; - if ((itemstruct != null)) + if (item is RbfStructure itemstruct) { - var strbytes = itemstruct.Children[0] as RbfBytes; string thisstr = string.Empty; - if (strbytes != null) + if (itemstruct.Children is not null && itemstruct.Children.Count > 0 && itemstruct.Children[0] is RbfBytes strbytes) { - thisstr = Encoding.ASCII.GetString(strbytes.Value).Replace("\0", ""); + thisstr = strbytes.GetNullTerminatedString(); } switch (item.Name) { @@ -108,17 +106,10 @@ namespace CodeWalker.GameFiles break; } } - } - if ((!string.IsNullOrEmpty(parentstr)) && (!string.IsNullOrEmpty(childstr))) + if (!string.IsNullOrEmpty(parentstr) && !string.IsNullOrEmpty(childstr)) { - if (!TxdRelationships.ContainsKey(childstr)) - { - TxdRelationships.Add(childstr, parentstr); - } - else - { - } + _ = TxdRelationships.TryAdd(childstr, parentstr); //sblist.AppendLine(childstr + ": " + parentstr); } } @@ -140,21 +131,26 @@ namespace CodeWalker.GameFiles xmldoc.LoadXml(xml); //maybe better load xml.ToLower() and use "cmapparenttxds/txdrelationships/item" as xpath? XmlNodeList items = xmldoc.SelectNodes("CMapParentTxds/txdRelationships/Item | CMapParentTxds/txdRelationships/item"); - TxdRelationships = new Dictionary(); + TxdRelationships = new PooledDictionary(items.Count); for (int i = 0; i < items.Count; i++) { string parentstr = Xml.GetChildInnerText(items[i], "parent"); string childstr = Xml.GetChildInnerText(items[i], "child"); - if ((!string.IsNullOrEmpty(parentstr)) && (!string.IsNullOrEmpty(childstr))) + if (!string.IsNullOrEmpty(parentstr) && !string.IsNullOrEmpty(childstr)) { - if (!TxdRelationships.ContainsKey(childstr)) - { - TxdRelationships.Add(childstr, parentstr); - } + _ = TxdRelationships.TryAdd(childstr, parentstr); } } } + public override void Dispose() + { + TxdRelationships?.Dispose(); + Rbf?.Dispose(); + GC.SuppressFinalize(this); + base.Dispose(); + } + } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/Gxt2File.cs b/CodeWalker.Core/GameFiles/FileTypes/Gxt2File.cs index 58f656c..d82f03a 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/Gxt2File.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/Gxt2File.cs @@ -1,8 +1,11 @@ using System; +using System.Buffers; +using System.Buffers.Binary; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; +using CodeWalker.Core.Utils; using System.IO; using System.Linq; using System.Text; @@ -26,52 +29,45 @@ namespace CodeWalker.GameFiles FileEntry = entry; //Dict = new Dictionary(); - using (BinaryReader br = new BinaryReader(new MemoryStream(data))) + var sequence = new ReadOnlySequence(data); + var reader = new SequenceReader(sequence); + reader.TryReadLittleEndian(out uint gxt2); + if (gxt2 != 1196971058) { - uint gxt2 = br.ReadUInt32(); //"GXT2" - 1196971058 - if (gxt2 != 1196971058) - { return; } + return; + } - EntryCount = br.ReadUInt32(); - TextEntries = new Gxt2Entry[EntryCount]; - for (uint i = 0; i < EntryCount; i++) - { - var e = new Gxt2Entry(); - e.Hash = br.ReadUInt32(); - e.Offset = br.ReadUInt32(); - TextEntries[i] = e; - } + reader.TryReadLittleEndian(out uint entryCount); + EntryCount = entryCount; + TextEntries = new Gxt2Entry[EntryCount]; + for (uint i = 0; i < EntryCount; i++) + { + + reader.TryReadLittleEndian(out uint hash); + reader.TryReadLittleEndian(out uint offset); + TextEntries[i] = new Gxt2Entry(hash, string.Empty, offset); + } - gxt2 = br.ReadUInt32(); //another "GXT2" - if (gxt2 != 1196971058) - { return; } + reader.TryReadLittleEndian(out gxt2); //another "GXT2" + if (gxt2 != 1196971058) + { + return; + } - uint endpos = br.ReadUInt32(); - - List buf = new List(); - - for (uint i = 0; i < EntryCount; i++) - { - var e = TextEntries[i]; - br.BaseStream.Position = e.Offset; - - buf.Clear(); - byte b = br.ReadByte(); - while ((b != 0) && (br.BaseStream.Position(new ReadOnlySequence(data, (int)e.Offset, data.Length - (int)e.Offset)); + strReader.TryReadTo(out ReadOnlySpan str, 0); + e = new Gxt2Entry(e.Hash, Encoding.UTF8.GetString(str), e.Offset); } } public byte[] Save() { - if (TextEntries == null) TextEntries = new Gxt2Entry[0]; + if (TextEntries == null) + TextEntries = []; EntryCount = (uint)TextEntries.Length; uint offset = 16 + (EntryCount * 8); List datas = new List(); @@ -81,10 +77,10 @@ namespace CodeWalker.GameFiles bw.Write(1196971058); //"GXT2" bw.Write(EntryCount); - foreach (var e in TextEntries) + foreach (ref var e in TextEntries.AsSpan()) { - e.Offset = offset; - var d = Encoding.UTF8.GetBytes(e.Text + "\0"); + e = new Gxt2Entry(e.Hash, e.Text, offset); + var d = Encoding.UTF8.GetBytes($"{e.Text}\0"); datas.Add(d); offset += (uint)d.Length; bw.Write(e.Hash); @@ -113,11 +109,7 @@ namespace CodeWalker.GameFiles { foreach (var entry in TextEntries) { - sb.Append("0x"); - sb.Append(entry.Hash.ToString("X").PadLeft(8, '0')); - sb.Append(" = "); - sb.Append(entry.Text); - sb.AppendLine(); + sb.AppendLine($"0x{entry.Hash:X8} = {entry.Text}"); } } return sb.ToString(); @@ -125,17 +117,15 @@ namespace CodeWalker.GameFiles public static Gxt2File FromText(string text) { var gxt = new Gxt2File(); - var lines = text?.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries) ?? new string[0]; var entries = new List(); - foreach (var line in lines) + foreach (var line in text.EnumerateSplit('\n')) { var tline = line.Trim(); - if (tline.Length < 13) continue; - if (uint.TryParse(tline.Substring(2, 8), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint hash)) + if (tline.Length < 13) + continue; + if (uint.TryParse(tline.Slice(2, 8), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint hash)) { - var entry = new Gxt2Entry(); - entry.Hash = hash; - entry.Text = (tline.Length > 13) ? tline.Substring(13) : ""; + var entry = new Gxt2Entry(hash, (tline.Length > 13) ? tline.Slice(13).ToString() : ""); entries.Add(entry); } else @@ -152,15 +142,34 @@ namespace CodeWalker.GameFiles } - [TypeConverter(typeof(ExpandableObjectConverter))] public class Gxt2Entry + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct Gxt2Entry { - public uint Hash { get; set; } - public uint Offset { get; set; } - public string Text { get; set; } + public uint Hash { get; init; } + public uint Offset { get; init; } + public string Text { get; init; } - public override string ToString() + public Gxt2Entry() { - return Convert.ToString(Hash, 16).ToUpper().PadLeft(8, '0') + ": " + Text; + + } + + public Gxt2Entry(uint hash, string text) + { + Hash = hash; + Text = text; + } + + public Gxt2Entry(uint hash, string text, uint offset) + { + Hash = hash; + Text = text; + Offset = offset; + } + + public override readonly string ToString() + { + return $"{Hash:X8}: {Text}"; } } @@ -190,10 +199,11 @@ namespace CodeWalker.GameFiles return !Index.TryAdd(hash, str); } - public static bool Ensure(string str, uint hash) + public static void Ensure(string str, uint hash) { - if (hash == 0) return true; - return !Index.TryAdd(hash, str); + if (hash == 0) + return; + _ = Index.TryAdd(hash, str); } public static string GetString(uint hash) @@ -215,6 +225,8 @@ namespace CodeWalker.GameFiles return res; } + public static bool TryGetString(uint hash, out string res) => Index.TryGetValue(hash, out res); + public static uint TryFindHash(string text) { lock (syncRoot) diff --git a/CodeWalker.Core/GameFiles/FileTypes/HeightmapFile.cs b/CodeWalker.Core/GameFiles/FileTypes/HeightmapFile.cs index d29525c..38cf4ba 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/HeightmapFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/HeightmapFile.cs @@ -99,7 +99,7 @@ namespace CodeWalker.GameFiles CompHeaders = new CompHeader[Height]; for (int i = 0; i < Height; i++) { - CompHeaders[i].Read(r); + CompHeaders[i] = new CompHeader(r); } dlen -= (Height * 8); } @@ -173,8 +173,7 @@ namespace CodeWalker.GameFiles d1.Add(MaxHeights[n]); d2.Add(MinHeights[n]); } - var h = new CompHeader() { Start = (ushort)start, Count = (ushort)count, DataOffset = offset }; - ch[y] = h; + ch[y] = new CompHeader((ushort)start, (ushort)count, offset); } d1.AddRange(d2);//the 2 sets of compressed data are just smushed together d = d1.ToArray(); @@ -243,7 +242,7 @@ namespace CodeWalker.GameFiles - private byte[] InvertImage(byte[] i, int w, int h) + private static byte[] InvertImage(byte[] i, int w, int h) { //inverts the image vertically byte[] o = new byte[i.Length]; @@ -262,7 +261,8 @@ namespace CodeWalker.GameFiles public string GetPGM() { - if (MaxHeights == null) return string.Empty; + if (MaxHeights == null) + return string.Empty; var sb = new StringBuilder(); sb.AppendFormat("P2\n{0} {1}\n255\n", Width, Height); @@ -272,10 +272,10 @@ namespace CodeWalker.GameFiles for (int x = 0; x < Width; x++) { var h = MaxHeights[y * Width + x]; - sb.Append(h.ToString()); - sb.Append(" "); + sb.Append(h); + sb.Append(' '); } - sb.Append("\n"); + sb.Append('\n'); } return sb.ToString(); @@ -283,18 +283,20 @@ namespace CodeWalker.GameFiles - public struct CompHeader + public readonly struct CompHeader(ushort start, ushort count, int dataOffset) { - public ushort Start; - public ushort Count; - public int DataOffset; + public readonly ushort Start = start; + public readonly ushort Count = count; + public readonly int DataOffset = dataOffset; - public void Read(DataReader r) + public CompHeader(DataReader r) : this(r.ReadUInt16(), r.ReadUInt16(), r.ReadInt32()) + { } + + public static CompHeader Read(DataReader r) { - Start = r.ReadUInt16(); - Count = r.ReadUInt16(); - DataOffset = r.ReadInt32(); + return new CompHeader(r); } + public void Write(DataWriter w) { w.Write(Start); @@ -304,7 +306,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Start.ToString() + ", " + Count.ToString() + ", " + DataOffset.ToString(); + return $"{Start}, {Count}, {DataOffset}"; } } @@ -316,24 +318,29 @@ namespace CodeWalker.GameFiles public static string GetXml(HeightmapFile hmf) { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if ((hmf != null) && (hmf.MaxHeights != null)) + StringBuilder sb = StringBuilderPool.Get(); + try { - var name = "Heightmap"; + sb.AppendLine(XmlHeader); - OpenTag(sb, 0, name); + if ((hmf != null) && (hmf.MaxHeights != null)) + { + var name = "Heightmap"; - hmf.WriteXml(sb, 1); + OpenTag(sb, 0, name); - CloseTag(sb, 0, name); + hmf.WriteXml(sb, 1); + + CloseTag(sb, 0, name); + } + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); } - - return sb.ToString(); } - - } diff --git a/CodeWalker.Core/GameFiles/FileTypes/JPsoFile.cs b/CodeWalker.Core/GameFiles/FileTypes/JPsoFile.cs index 8062e5f..24caa9d 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/JPsoFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/JPsoFile.cs @@ -29,9 +29,6 @@ namespace CodeWalker.GameFiles //PsoTypes.EnsurePsoTypes(Pso); var root = PsoTypes.GetRootEntry(Pso); - if (root != null) - { - } return; } else diff --git a/CodeWalker.Core/GameFiles/FileTypes/MrfFile.cs b/CodeWalker.Core/GameFiles/FileTypes/MrfFile.cs index 12827ca..6a0a6c7 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/MrfFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/MrfFile.cs @@ -5384,7 +5384,7 @@ namespace CodeWalker.GameFiles public static void WriteNodeRef(StringBuilder sb, int indent, string name, MrfNode node) { Indent(sb, indent); - sb.Append("<"); + sb.Append('<'); sb.Append(name); sb.Append(" ref=\""); sb.Append(HashString(node.Name)); diff --git a/CodeWalker.Core/GameFiles/FileTypes/PedFile.cs b/CodeWalker.Core/GameFiles/FileTypes/PedFile.cs index 82f0788..670e2d5 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/PedFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/PedFile.cs @@ -8,6 +8,8 @@ using System.Xml; using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; +using System.Buffers.Binary; +using System.Buffers; namespace CodeWalker.GameFiles { @@ -18,6 +20,8 @@ namespace CodeWalker.GameFiles public RbfFile Rbf { get; set; } public string Xml { get; set; } + public MetaHash DlcName => VariationInfo.Data.dlcName; + public string GameDlcName { get; set; } public MCPedVariationInfo VariationInfo { get; set; } @@ -39,8 +43,7 @@ namespace CodeWalker.GameFiles FilePath = Name; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { NonMetaLoad(data); Loaded = true; @@ -66,10 +69,10 @@ namespace CodeWalker.GameFiles { var vVariationInfo = MetaTypes.GetTypedData(Meta, MetaName.CPedVariationInfo); VariationInfo = new MCPedVariationInfo(); - VariationInfo.Load(Meta, vVariationInfo); + VariationInfo.Load(Meta, in vVariationInfo); Strings = MetaTypes.GetStrings(Meta); - if (Strings != null) + if (Strings is not null) { foreach (string str in Strings) { @@ -82,7 +85,7 @@ namespace CodeWalker.GameFiles var vVariationInfo = PsoTypes.GetRootItem(Pso); VariationInfo = new MCPedVariationInfo(); - VariationInfo.Load(Pso, vVariationInfo); + VariationInfo.Load(Pso, in vVariationInfo); } @@ -90,18 +93,24 @@ namespace CodeWalker.GameFiles private void NonMetaLoad(byte[] data) { //non meta not supported yet! but see what's in there... - MemoryStream ms = new MemoryStream(data); - if (RbfFile.IsRBF(ms)) + if (RbfFile.IsRBF(data.AsSpan(0, 4))) { Rbf = new RbfFile(); - Rbf.Load(ms); + var sequence = new ReadOnlySequence(data); + var reader = new SequenceReader(sequence); + Rbf.Load(ref reader); } - else if (PsoFile.IsPSO(ms)) + else if (PsoFile.IsPSO(data.AsSpan(0, 4))) { Pso = new PsoFile(); - Pso.Load(ms); + Pso.Load(data); LoadPso(); } } + + public override string ToString() + { + return Path.GetFileName(RpfFileEntry.Parent.Path); + } } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/PedShopMetaFile.cs b/CodeWalker.Core/GameFiles/FileTypes/PedShopMetaFile.cs new file mode 100644 index 0000000..b5fdb32 --- /dev/null +++ b/CodeWalker.Core/GameFiles/FileTypes/PedShopMetaFile.cs @@ -0,0 +1,112 @@ +using CodeWalker.GameFiles; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TC = System.ComponentModel.TypeConverterAttribute; +using EXP = System.ComponentModel.ExpandableObjectConverter; +using System.Xml; +using System.IO; + +namespace CodeWalker.Core.GameFiles.FileTypes +{ + [TC(typeof(EXP))] + public class PedShopMetaFile : GameFile, PackedFile + { + public static XmlNameTableThreadSafe nameTable = new XmlNameTableThreadSafe(); + public string PedName { get; set; } + public string DlcName { get; set; } + public string FullDlcName { get; set; } + public string Character { get; set; } + public string CreateMetaData { get; set; } + + public PedShopMetaFile() : base(null, GameFileType.PedShopMeta) + { } + public PedShopMetaFile(RpfFileEntry entry) : base(entry, GameFileType.PedShopMeta) + { } + + public void Load(byte[] data, RpfFileEntry entry) + { + var xml = TextUtil.GetUTF8Text(data); + + using var xmlReader = XmlReader.Create(new StringReader(xml), new XmlReaderSettings { NameTable = nameTable }); + + Load(xmlReader); + } + + public void Load(XmlReader reader) + { + reader.MoveToStartElement("ShopPedApparel"); + var startDepth = reader.Depth; + reader.ReadStartElement("ShopPedApparel"); + while (reader.Read() && startDepth < reader.Depth) + { + switch(reader.MoveToContent()) + { + case XmlNodeType.Element: + LoadElement(reader); + break; + case XmlNodeType.EndElement: + if (reader.Name == "ShopPedApparel") + { + return; + } + break; + } + } + } + + public void LoadElement(XmlReader reader) + { + switch(reader.Name) + { + case "pedName": + PedName = reader.ReadElementContentAsString(); + if (!string.IsNullOrEmpty(PedName)) + { + JenkIndex.EnsureBoth(PedName); + } + break; + case "dlcName": + DlcName = reader.ReadElementContentAsString(); + if (!string.IsNullOrEmpty(DlcName)) + { + JenkIndex.EnsureBoth(DlcName); + } + break; + case "fullDlcName": + FullDlcName = reader.ReadElementContentAsString(); + if (!string.IsNullOrEmpty(FullDlcName)) + { + JenkIndex.EnsureBoth(FullDlcName); + } + break; + case "eCharacter": + Character = reader.ReadElementContentAsString(); + if (!string.IsNullOrEmpty(Character)) + { + JenkIndex.EnsureBoth(Character); + } + break; + case "createMetaData": + CreateMetaData = reader.ReadElementContentAsString(); + if (!string.IsNullOrEmpty(CreateMetaData)) + { + JenkIndex.EnsureBoth(CreateMetaData); + } + break; + case "pedOutfits": + reader.Skip(); + break; + case "pedComponents": + reader.Skip(); + break; + case "pedProps": + reader.Skip(); + break; + + } + } + } +} diff --git a/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs b/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs index 1f0e295..e4eb9a2 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs @@ -10,13 +10,14 @@ using System.Xml; using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; using System.Xml.Linq; +using Collections.Pooled; namespace CodeWalker.GameFiles { [TC(typeof(EXP))] public class PedsFile : GameFile, PackedFile { - private static XmlNameTable cachedNameTable = new System.Xml.NameTable(); + private static XmlNameTable cachedNameTable = new XmlNameTableThreadSafe(); public PsoFile Pso { get; set; } public string Xml { get; set; } @@ -36,8 +37,8 @@ namespace CodeWalker.GameFiles //can be PSO .ymt or XML .meta - using MemoryStream ms = new MemoryStream(data); - if (PsoFile.IsPSO(ms)) + //using MemoryStream ms = new MemoryStream(data); + if (PsoFile.IsPSO(data.AsSpan(0, 4))) { Pso = new PsoFile(); Pso.Load(data); @@ -63,7 +64,7 @@ namespace CodeWalker.GameFiles // } //} - using var xmlReader = XmlReader.Create(textReader, new XmlReaderSettings { NameTable = cachedNameTable, }); + using var xmlReader = XmlReader.Create(textReader, new XmlReaderSettings { NameTable = cachedNameTable }); //if (xdoc.DocumentElement != null) @@ -114,16 +115,18 @@ namespace CodeWalker.GameFiles break; } reader.ReadStartElement(); - var initDatasList = new List(); + using (var initDatasList = new PooledList()) + { + while (reader.IsItemElement()) + { + initDatasList.Add(new CPedModelInfo__InitData(reader)); + } + if (initDatasList.Count > 0) + { + InitDatas = initDatasList.ToArray(); + } + } - while (reader.IsItemElement()) - { - initDatasList.Add(new CPedModelInfo__InitData(reader)); - } - if (initDatasList.Count > 0) - { - InitDatas = initDatasList.ToArray(); - } reader.ReadEndElement(); break; case string Name when Name.Equals("txdRelationships", StringComparison.OrdinalIgnoreCase): @@ -133,17 +136,19 @@ namespace CodeWalker.GameFiles break; } reader.ReadStartElement(); - var txdRelationshipsList = new List(); + using (var txdRelationshipsList = new PooledList()) + { + while (reader.IsItemElement()) + { + txdRelationshipsList.Add(new CTxdRelationship(reader)); + } + reader.ReadEndElement(); + if (txdRelationshipsList.Count > 0) + { + txdRelationships = txdRelationshipsList.ToArray(); + } + } - while (reader.IsItemElement()) - { - txdRelationshipsList.Add(new CTxdRelationship(reader)); - } - reader.ReadEndElement(); - if (txdRelationshipsList.Count > 0) - { - txdRelationships = txdRelationshipsList.ToArray(); - } break; case string Name when Name.Equals("multiTxdRelationships", StringComparison.OrdinalIgnoreCase): if (reader.IsEmptyElement) @@ -152,16 +157,19 @@ namespace CodeWalker.GameFiles break; } reader.ReadStartElement(); - var multiTxdList = new List(); - while (reader.IsItemElement()) + using (var multiTxdList = new PooledList()) { - multiTxdList.Add(new CMultiTxdRelationship(reader)); - } - reader.ReadEndElement(); - if (multiTxdList.Count > 0) - { - multiTxdRelationships = multiTxdList.ToArray(); + while (reader.IsItemElement()) + { + multiTxdList.Add(new CMultiTxdRelationship(reader)); + } + reader.ReadEndElement(); + if (multiTxdList.Count > 0) + { + multiTxdRelationships = multiTxdList.ToArray(); + } } + break; default: break; @@ -334,13 +342,16 @@ namespace CodeWalker.GameFiles MovementClipSet = Xml.GetChildInnerText(reader, "MovementClipSet"); break; case "MovementClipSets": - var clipSetsList = new List(); - foreach(var item in Xml.IterateItems(reader, "MovementClipSets")) + using (var clipSetsList = new PooledList()) { - clipSetsList.Add(item.Value); + foreach (var item in Xml.IterateItems(reader, "MovementClipSets")) + { + clipSetsList.Add(item.Value); + } + + MovementClipSets = clipSetsList.ToArray(); } - MovementClipSets = clipSetsList.ToArray(); break; case "StrafeClipSet": StrafeClipSet = Xml.GetChildInnerText(reader, "StrafeClipSet"); @@ -707,7 +718,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return parent + ": " + (children?.Length ?? 0).ToString() + " children"; + return $"{parent}: {(children?.Length ?? 0)} children"; } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/RelFile.cs b/CodeWalker.Core/GameFiles/FileTypes/RelFile.cs index 947c542..8ab0eb4 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/RelFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/RelFile.cs @@ -10,6 +10,13 @@ using EXP = System.ComponentModel.ExpandableObjectConverter; using SharpDX; using System.Xml; using System.Text.RegularExpressions; +using System.Buffers; +using CodeWalker.Core.Utils; +using System.Threading; +using System.Diagnostics.CodeAnalysis; +using Collections.Pooled; +using System.Globalization; +using System.Runtime.CompilerServices; @@ -63,7 +70,8 @@ namespace CodeWalker.GameFiles Dat151 = 151 } - [TC(typeof(EXP))] public class RelFile : GameFile, PackedFile + [TC(typeof(EXP))] + public class RelFile : GameFile, PackedFile { public byte[] RawFileData { get; set; } public RelDatFileType RelType { get; set; } @@ -86,7 +94,9 @@ namespace CodeWalker.GameFiles public MetaHash[] PackTable { get; set; } public RelData[] RelDatas { get; set; } - public IEnumerable RelDatasSorted { get => RelDatas.OrderBy(p => p.DataOffset); } + + [NotNullIfNotNull(nameof(RelDatas))] + public IEnumerable? RelDatasSorted => RelDatas?.OrderBy(p => p.DataOffset); public Dictionary RelDataDict { get; set; } = new Dictionary(); public bool IsAudioConfig { get; set; } @@ -105,6 +115,7 @@ namespace CodeWalker.GameFiles RpfFileEntry = entry; } + [SkipLocalsInit] public unsafe string ReadString(BinaryReader br, int length, bool ignoreNullTerminator = false) { var bytes = stackalloc char[length]; @@ -133,23 +144,23 @@ namespace CodeWalker.GameFiles Name = entry.Name; } - using MemoryStream ms = new MemoryStream(data); - using BinaryReader br = new BinaryReader(ms); - StringBuilder sb = new StringBuilder(); - RelType = (RelDatFileType)br.ReadUInt32(); //type + var sequence = new ReadOnlySequence(data); + var reader = new SequenceReader(sequence); - DataLength = br.ReadUInt32(); //length of data block - DataBlock = br.ReadBytes((int)DataLength); //main data block... + RelType = (RelDatFileType)reader.ReadUInt32(); //type - NameTableLength = br.ReadUInt32(); //length of this nametable block - NameTableCount = br.ReadUInt32(); + DataLength = reader.ReadUInt32(); //length of data block + DataBlock = reader.ReadBytes((int)DataLength).ToArray(); //main data block... + + NameTableLength = reader.ReadUInt32(); //length of this nametable block + NameTableCount = reader.ReadUInt32(); if (NameTableCount > 0) { uint[] ntoffsets = new uint[NameTableCount]; //string offsets for (uint i = 0; i < NameTableCount; i++) { - ntoffsets[i] = br.ReadUInt32(); + ntoffsets[i] = reader.ReadUInt32(); } NameTableOffsets = ntoffsets; string[] names = new string[NameTableCount]; @@ -167,7 +178,7 @@ namespace CodeWalker.GameFiles length = remainingLength; } - names[i] = ReadString(br, length); + names[i] = reader.ReadString(length); //JenkIndex.Ensure(names[i]); //really need both here..? JenkIndex.EnsureLower(names[i]); @@ -176,26 +187,25 @@ namespace CodeWalker.GameFiles NameTable = names; } - IndexCount = br.ReadUInt32(); //count of index items + IndexCount = reader.ReadUInt32(); //count of index items if (IndexCount > 0) { if ((RelType == RelDatFileType.Dat4) && (NameTableLength == 4))//audioconfig.dat4.rel //checking NameTableLength here doesn't make sense! { IsAudioConfig = true; - IndexStringFlags = br.ReadUInt32(); //what is this? 2524 - if (IndexStringFlags != 2524) - { } + IndexStringFlags = reader.ReadUInt32(); //what is this? 2524 RelIndexString[] indexstrs = new RelIndexString[IndexCount]; for (uint i = 0; i < IndexCount; i++) { - byte sl = br.ReadByte(); - var str = ReadString(br, (int)sl, true); - RelIndexString ristr = new RelIndexString(); - ristr.Name = str; - ristr.Offset = br.ReadUInt32(); - ristr.Length = br.ReadUInt32(); - indexstrs[i] = ristr; - JenkIndex.EnsureLower(ristr.Name); + byte sl = reader.ReadByte(); + var str = reader.ReadStringLength((int)sl); + indexstrs[i] = new RelIndexString + { + Name = str, + Offset = reader.ReadUInt32(), + Length = reader.ReadUInt32() + }; + JenkIndex.EnsureLower(indexstrs[i].Name); } IndexStrings = indexstrs; } @@ -204,55 +214,53 @@ namespace CodeWalker.GameFiles RelIndexHash[] indexhashes = new RelIndexHash[IndexCount]; for (uint i = 0; i < IndexCount; i++) { - RelIndexHash rihash = new RelIndexHash(); - rihash.Name = new MetaHash(br.ReadUInt32()); - rihash.Offset = br.ReadUInt32(); - rihash.Length = br.ReadUInt32(); - indexhashes[i] = rihash; + indexhashes[i] = new RelIndexHash + { + Name = new MetaHash(reader.ReadUInt32()), + Offset = reader.ReadUInt32(), + Length = reader.ReadUInt32() + }; } IndexHashes = indexhashes; } } - HashTableCount = br.ReadUInt32(); + HashTableCount = reader.ReadUInt32(); if (HashTableCount != 0) { uint[] htoffsets = new uint[HashTableCount]; MetaHash[] hthashes = new MetaHash[HashTableCount]; for (uint i = 0; i < HashTableCount; i++) { - htoffsets[i] = br.ReadUInt32(); + htoffsets[i] = reader.ReadUInt32(); - var pos = ms.Position; - ms.Position = htoffsets[i]; - hthashes[i] = new MetaHash(br.ReadUInt32()); - ms.Position = pos; + var pos = reader.Consumed; + reader.SetPosition(htoffsets[i]); + hthashes[i] = new MetaHash(reader.ReadUInt32()); + reader.SetPosition(pos); } HashTableOffsets = htoffsets; HashTable = hthashes; } - PackTableCount = br.ReadUInt32(); + PackTableCount = reader.ReadUInt32(); if (PackTableCount != 0) { uint[] ptoffsets = new uint[PackTableCount]; MetaHash[] pthashes = new MetaHash[PackTableCount]; for (uint i = 0; i < PackTableCount; i++) { - ptoffsets[i] = br.ReadUInt32(); + ptoffsets[i] = reader.ReadUInt32(); - var pos = ms.Position; - ms.Position = ptoffsets[i]; - pthashes[i] = new MetaHash(br.ReadUInt32()); - ms.Position = pos; + var pos = reader.Consumed; + reader.SetPosition(ptoffsets[i]); + pthashes[i] = new MetaHash(reader.ReadUInt32()); + reader.SetPosition(pos); } PackTableOffsets = ptoffsets; PackTable = pthashes; } - - if (ms.Position != ms.Length) - { } //EOF! @@ -267,9 +275,6 @@ namespace CodeWalker.GameFiles private void ParseDataBlock() { - - - using MemoryStream ms = new MemoryStream(DataBlock); using BinaryReader br = new BinaryReader(ms); @@ -313,24 +318,23 @@ namespace CodeWalker.GameFiles if (IndexHashes != null) { - var reldatas = new List(IndexHashes.Length); - foreach (var indexhash in IndexHashes) + RelDatas = new RelData[IndexHashes.Length]; + for (int i = 0; i < IndexHashes.Length; i++) { - reldatas.Add(ReadRelData(br, indexhash)); + RelDatas[i] = ReadRelData(br, IndexHashes[i]); } - RelDatas = reldatas.ToArray(); } else if (IndexStrings != null) { - var reldatas = new List(IndexStrings.Length); - foreach (var indexstr in IndexStrings) + RelDatas = new RelData[IndexStrings.Length]; + for (int i = 0; i < IndexStrings.Length; i++) { - reldatas.Add(ReadRelData(br, indexstr)); + RelDatas[i] = ReadRelData(br, IndexStrings[i]); } - RelDatas = reldatas.ToArray(); - } else + } + else { - RelDatas = Array.Empty(); + RelDatas = []; } @@ -340,36 +344,29 @@ namespace CodeWalker.GameFiles RelDataDict.Clear(); - foreach (var reldata in RelDatas) + RelDataDict.EnsureCapacity(RelDatas.Length); + + foreach(var reldata in RelDatas.AsSpan()) { if ((reldata.NameHash == 0) && !string.IsNullOrEmpty(reldata.Name)) { reldata.NameHash = JenkHash.GenHash(reldata.Name); //should this be lower case? - JenkIndex.Ensure(reldata.Name); + JenkIndex.Ensure(reldata.Name, reldata.NameHash); JenkIndex.EnsureLower(reldata.Name); //which one to use? } - //if (reldata.NameHash == 0) - //{ }//no hits here - //if (RelDataDict.ContainsKey(reldata.NameHash)) - //{ }//no hits here - RelDataDict[reldata.NameHash] = reldata; - } - foreach (var reldata in RelDatas) - { - RelSound snd = reldata as RelSound; - if (snd != null) + if (reldata is RelSound snd) { if (snd.ChildSoundsCount > 0) { snd.ChildSounds = new RelData[snd.ChildSoundsCount]; - for (int i = 0; i < snd.ChildSoundsCount; i++) + for (int j = 0; j < snd.ChildSoundsCount; j++) { - var audhash = snd.ChildSoundsHashes[i]; + var audhash = snd.ChildSoundsHashes[j]; if (RelDataDict.TryGetValue(audhash, out var auddata)) { - snd.ChildSounds[i] = auddata; + snd.ChildSounds[j] = auddata; } } } @@ -382,24 +379,21 @@ namespace CodeWalker.GameFiles //speech.dat4.rel var speechDict = new Dictionary(); - foreach (var reldata in RelDatasSorted) + foreach(var data in RelDatas.AsSpan()) { - var speechData = reldata as Dat4SpeechData; - if (speechData != null) + if (data is Dat4SpeechData speechData) { speechDict[speechData.DataOffset] = speechData; + speechData.Type = Dat4SpeechType.ByteArray; + speechData.TypeID = 0; //will be set again after this } - - speechData.Type = Dat4SpeechType.ByteArray; - speechData.TypeID = 0; //will be set again after this - } for (uint i = 0; i < HashTableCount; i++) { var hashOffset = HashTableOffsets[i]; var hash = HashTable[i]; var itemOffset = hashOffset - 8; - if (speechDict.TryGetValue(itemOffset, out var speechData) && speechData != null) + if (speechDict.TryGetValue(itemOffset, out var speechData) && speechData is not null) { speechData.Type = Dat4SpeechType.Hash; speechData.TypeID = 4; @@ -411,7 +405,7 @@ namespace CodeWalker.GameFiles var packOffset = PackTableOffsets[i]; var pack = PackTable[i]; var itemOffset = packOffset - 12; - if (speechDict.TryGetValue(itemOffset, out var speechData) && speechData != null) + if (speechDict.TryGetValue(itemOffset, out var speechData) && speechData is not null) { speechData.Type = Dat4SpeechType.Container; speechData.TypeID = 8; @@ -425,9 +419,6 @@ namespace CodeWalker.GameFiles } - - - private RelData ReadRelData(BinaryReader br, RelIndexHash h) { return ReadRelData(br, null, h.Name, h.Offset, h.Length); @@ -444,304 +435,331 @@ namespace CodeWalker.GameFiles br.BaseStream.Position = oldPosition; - RelData d = new RelData(this); //use this base object to construct the derived one... - d.Name = name; - d.NameHash = hash; - d.DataOffset = offset; - d.DataLength = length; - d.Data = data; + TempRelData d = new TempRelData(this) + { + Name = name, + NameHash = hash, + DataOffset = offset, + DataLength = length, + Data = data + }; //use this base object to construct the derived one... //using BinaryReader dbr = new BinaryReader(new MemoryStream(data)); d.ReadType(br); - switch (RelType) + return RelType switch { - case RelDatFileType.Dat4: //speech.dat4.rel, audioconfig.dat4.rel - return ReadData4(d, br); - case RelDatFileType.Dat10ModularSynth: //amp.dat10.rel - return ReadData10(d, br); - case RelDatFileType.Dat15DynamicMixer: //mix.dat15.rel - return ReadData15(d, br); - case RelDatFileType.Dat16Curves: //curves.dat16.rel - return ReadData16(d, br); - case RelDatFileType.Dat22Categories: //categories.dat22.rel - return ReadData22(d, br); - case RelDatFileType.Dat54DataEntries: //sounds.dat54.rel - return ReadData54(d, br); - case RelDatFileType.Dat149: //game.dat149.rel - return ReadData149(d, br); - case RelDatFileType.Dat150: //game.dat150.rel - return ReadData150(d, br); - case RelDatFileType.Dat151: //game.dat151.rel - return ReadData151(d, br); - default: - return d; //shouldn't get here... - } + //speech.dat4.rel, audioconfig.dat4.rel + RelDatFileType.Dat4 => ReadData4(in d, br), + //amp.dat10.rel + RelDatFileType.Dat10ModularSynth => ReadData10(in d, br), + //mix.dat15.rel + RelDatFileType.Dat15DynamicMixer => ReadData15(in d, br), + //curves.dat16.rel + RelDatFileType.Dat16Curves => ReadData16(in d, br), + //categories.dat22.rel + RelDatFileType.Dat22Categories => ReadData22(in d, br), + //sounds.dat54.rel + RelDatFileType.Dat54DataEntries => ReadData54(in d, br), + //game.dat149.rel + RelDatFileType.Dat149 => ReadData149(in d, br), + //game.dat150.rel + RelDatFileType.Dat150 => ReadData150(in d, br), + //game.dat151.rel + RelDatFileType.Dat151 => ReadData151(in d, br), + _ => new RelData(in d),//shouldn't get here... + }; } - private RelData ReadData4(RelData d, BinaryReader br) + private RelData ReadData4(in TempRelData d, BinaryReader br) { if (IsAudioConfig) //(for audioconfig.dat4.rel) { - switch ((Dat4ConfigType)d.TypeID) + return (Dat4ConfigType)d.TypeID switch { - case Dat4ConfigType.Int: return new Dat4ConfigInt(d, br); - case Dat4ConfigType.UnsignedInt: return new Dat4ConfigUnsignedInt(d, br); - case Dat4ConfigType.Float: return new Dat4ConfigFloat(d, br); - case Dat4ConfigType.String: return new Dat4ConfigString(d, br); - case Dat4ConfigType.Vector3: return new Dat4ConfigVector3(d, br); - case Dat4ConfigType.VariableList: return new Dat4ConfigVariableList(d, br); - case Dat4ConfigType.WaveSlot: return new Dat4ConfigWaveSlot(d, br); - case Dat4ConfigType.WaveSlotsList: return new Dat4ConfigWaveSlotsList(d, br); - case Dat4ConfigType.ERSettings: return new Dat4ConfigERSettings(d, br); - default: - break; - } + Dat4ConfigType.Int => new Dat4ConfigInt(in d, br), + Dat4ConfigType.UnsignedInt => new Dat4ConfigUnsignedInt(in d, br), + Dat4ConfigType.Float => new Dat4ConfigFloat(in d, br), + Dat4ConfigType.String => new Dat4ConfigString(in d, br), + Dat4ConfigType.Vector3 => new Dat4ConfigVector3(in d, br), + Dat4ConfigType.VariableList => new Dat4ConfigVariableList(in d, br), + Dat4ConfigType.WaveSlot => new Dat4ConfigWaveSlot(in d, br), + Dat4ConfigType.WaveSlotsList => new Dat4ConfigWaveSlotsList(in d, br), + Dat4ConfigType.ERSettings => new Dat4ConfigERSettings(in d, br), + _ => new RelData(in d), + }; } else //(for eg speech.dat4.rel) { - return new Dat4SpeechData(d, br); + return new Dat4SpeechData(in d, br); } - return d; } - private RelData ReadData10(RelData d, BinaryReader br) + private static RelData ReadData10(in TempRelData d, BinaryReader br) { - switch ((Dat10RelType)d.TypeID) + return (Dat10RelType)d.TypeID switch { - case Dat10RelType.SynthPreset: return new Dat10SynthPreset(d, br); - case Dat10RelType.Synth: return new Dat10Synth(d, br); - default: - break; - } + Dat10RelType.SynthPreset => new Dat10SynthPreset(in d, br), + Dat10RelType.Synth => new Dat10Synth(in d, br), + _ => new RelData(in d), + }; + } - return d; - } - private RelData ReadData15(RelData d, BinaryReader br) + private static RelData ReadData10(in TempRelData d, ref SequenceReader br) { - switch ((Dat15RelType)d.TypeID) + return (Dat10RelType)d.TypeID switch { - case Dat15RelType.Patch: return new Dat15Patch(d, br); - case Dat15RelType.SceneState: return new Dat15SceneState(d, br); - case Dat15RelType.Scene: return new Dat15Scene(d, br); - case Dat15RelType.Group: return new Dat15Group(d, br); - case Dat15RelType.GroupList: return new Dat15GroupList(d, br); - case Dat15RelType.DynamicMixModuleSettings: return new Dat15DynamicMixModuleSettings(d, br); - case Dat15RelType.SceneVariableModuleSettings: return new Dat15SceneVariableModuleSettings(d, br); - case Dat15RelType.SceneTransitionModuleSettings: return new Dat15SceneTransitionModuleSettings(d, br); - case Dat15RelType.VehicleCollisionModuleSettings: return new Dat15VehicleCollisionModuleSettings(d, br); - case Dat15RelType.GroupMap: return new Dat15GroupMap(d, br); - default: - break; - } + Dat10RelType.SynthPreset => new Dat10SynthPreset(in d, ref br), + Dat10RelType.Synth => new Dat10Synth(in d, ref br), + _ => new RelData(in d), + }; + } - return d; - } - private RelData ReadData16(RelData d, BinaryReader br) + private static RelData ReadData15(in TempRelData d, BinaryReader br) { - switch ((Dat16RelType)d.TypeID) + return (Dat15RelType)d.TypeID switch { - case Dat16RelType.ConstantCurve: return new Dat16ConstantCurve(d, br); - case Dat16RelType.LinearCurve: return new Dat16LinearCurve(d, br); - case Dat16RelType.LinearDbCurve: return new Dat16LinearDbCurve(d, br); - case Dat16RelType.PiecewiseLinearCurve: return new Dat16PiecewiseLinearCurve(d, br); - case Dat16RelType.EqualPowerCurve: return new Dat16EqualPowerCurve(d, br); - case Dat16RelType.ValueTableCurve: return new Dat16ValueTableCurve(d, br); - case Dat16RelType.ExponentialCurve: return new Dat16ExponentialCurve(d, br); - case Dat16RelType.DecayingExponentialCurve: return new Dat16DecayingExponentialCurve(d, br); - case Dat16RelType.DecayingSquaredExponentialCurve: return new Dat16DecayingSquaredExponentialCurve(d, br); - case Dat16RelType.SineCurve: return new Dat16SineCurve(d, br); - case Dat16RelType.OneOverXSquaredCurve: return new Dat16OneOverXSquaredCurve(d, br); - case Dat16RelType.DefaultDistanceAttenuationCurve: return new Dat16DefaultDistanceAttenuationCurve(d, br); - case Dat16RelType.DistanceAttenuationValueTableCurve: return new Dat16DistanceAttenuationValueTableCurve(d, br); - default: - break; - } + Dat15RelType.Patch => new Dat15Patch(in d, br), + Dat15RelType.SceneState => new Dat15SceneState(in d, br), + Dat15RelType.Scene => new Dat15Scene(in d, br), + Dat15RelType.Group => new Dat15Group(in d, br), + Dat15RelType.GroupList => new Dat15GroupList(in d, br), + Dat15RelType.DynamicMixModuleSettings => new Dat15DynamicMixModuleSettings(in d, br), + Dat15RelType.SceneVariableModuleSettings => new Dat15SceneVariableModuleSettings(in d, br), + Dat15RelType.SceneTransitionModuleSettings => new Dat15SceneTransitionModuleSettings(in d, br), + Dat15RelType.VehicleCollisionModuleSettings => new Dat15VehicleCollisionModuleSettings(in d, br), + Dat15RelType.GroupMap => new Dat15GroupMap(in d, br), + _ => new RelData(in d), + }; + } - return d; - } - private RelData ReadData22(RelData d, BinaryReader br) + private static RelData ReadData15(in TempRelData d, ref SequenceReader br) { - switch ((Dat22RelType)d.TypeID) + return (Dat16RelType)d.TypeID switch { - case Dat22RelType.Category: return new Dat22Category(d, br); - default: - break; - } + Dat16RelType.ConstantCurve => new Dat16ConstantCurve(in d, ref br), + Dat16RelType.LinearCurve => new Dat16LinearCurve(in d, ref br), + Dat16RelType.LinearDbCurve => new Dat16LinearDbCurve(in d, ref br), + Dat16RelType.PiecewiseLinearCurve => new Dat16PiecewiseLinearCurve(in d, ref br), + Dat16RelType.EqualPowerCurve => new Dat16EqualPowerCurve(in d, ref br), + Dat16RelType.ValueTableCurve => new Dat16ValueTableCurve(in d, ref br), + Dat16RelType.ExponentialCurve => new Dat16ExponentialCurve(in d, ref br), + Dat16RelType.DecayingExponentialCurve => new Dat16DecayingExponentialCurve(in d, ref br), + Dat16RelType.DecayingSquaredExponentialCurve => new Dat16DecayingSquaredExponentialCurve(in d, ref br), + Dat16RelType.SineCurve => new Dat16SineCurve(in d, ref br), + Dat16RelType.OneOverXSquaredCurve => new Dat16OneOverXSquaredCurve(in d, ref br), + Dat16RelType.DefaultDistanceAttenuationCurve => new Dat16DefaultDistanceAttenuationCurve(in d, ref br), + Dat16RelType.DistanceAttenuationValueTableCurve => new Dat16DistanceAttenuationValueTableCurve(in d, ref br), + _ => new RelData(in d), + }; + } + private static RelData ReadData16(in TempRelData d, BinaryReader br) + { + return (Dat16RelType)d.TypeID switch + { + Dat16RelType.ConstantCurve => new Dat16ConstantCurve(in d, br), + Dat16RelType.LinearCurve => new Dat16LinearCurve(in d, br), + Dat16RelType.LinearDbCurve => new Dat16LinearDbCurve(in d, br), + Dat16RelType.PiecewiseLinearCurve => new Dat16PiecewiseLinearCurve(in d, br), + Dat16RelType.EqualPowerCurve => new Dat16EqualPowerCurve(in d, br), + Dat16RelType.ValueTableCurve => new Dat16ValueTableCurve(in d, br), + Dat16RelType.ExponentialCurve => new Dat16ExponentialCurve(in d, br), + Dat16RelType.DecayingExponentialCurve => new Dat16DecayingExponentialCurve(in d, br), + Dat16RelType.DecayingSquaredExponentialCurve => new Dat16DecayingSquaredExponentialCurve(in d, br), + Dat16RelType.SineCurve => new Dat16SineCurve(in d, br), + Dat16RelType.OneOverXSquaredCurve => new Dat16OneOverXSquaredCurve(in d, br), + Dat16RelType.DefaultDistanceAttenuationCurve => new Dat16DefaultDistanceAttenuationCurve(in d, br), + Dat16RelType.DistanceAttenuationValueTableCurve => new Dat16DistanceAttenuationValueTableCurve(in d, br), + _ => new RelData(in d), + }; + } + private static RelData ReadData22(in TempRelData d, BinaryReader br) + { + return (Dat22RelType)d.TypeID switch + { + Dat22RelType.Category => new Dat22Category(in d, br), + _ => new RelData(in d) + }; + } - return d; - } - private RelData ReadData54(RelData d, BinaryReader br) + private static RelData ReadData22(in TempRelData d, ref SequenceReader br) { - switch ((Dat54SoundType)d.TypeID) + return (Dat22RelType)d.TypeID switch { - case Dat54SoundType.LoopingSound: return new Dat54LoopingSound(d, br); - case Dat54SoundType.EnvelopeSound: return new Dat54EnvelopeSound(d, br); - case Dat54SoundType.TwinLoopSound: return new Dat54TwinLoopSound(d, br); - case Dat54SoundType.SpeechSound: return new Dat54SpeechSound(d, br); - case Dat54SoundType.OnStopSound: return new Dat54OnStopSound(d, br); - case Dat54SoundType.WrapperSound: return new Dat54WrapperSound(d, br); - case Dat54SoundType.SequentialSound: return new Dat54SequentialSound(d, br); - case Dat54SoundType.StreamingSound: return new Dat54StreamingSound(d, br); - case Dat54SoundType.RetriggeredOverlappedSound: return new Dat54RetriggeredOverlappedSound(d, br); - case Dat54SoundType.CrossfadeSound: return new Dat54CrossfadeSound(d, br); - case Dat54SoundType.CollapsingStereoSound: return new Dat54CollapsingStereoSound(d, br); - case Dat54SoundType.SimpleSound: return new Dat54SimpleSound(d, br); - case Dat54SoundType.MultitrackSound: return new Dat54MultitrackSound(d, br); - case Dat54SoundType.RandomizedSound: return new Dat54RandomizedSound(d, br); - case Dat54SoundType.EnvironmentSound: return new Dat54EnvironmentSound(d, br); - case Dat54SoundType.DynamicEntitySound: return new Dat54DynamicEntitySound(d, br); - case Dat54SoundType.SequentialOverlapSound: return new Dat54SequentialOverlapSound(d, br); - case Dat54SoundType.ModularSynthSound: return new Dat54ModularSynthSound(d, br); - case Dat54SoundType.GranularSound: return new Dat54GranularSound(d, br); - case Dat54SoundType.DirectionalSound: return new Dat54DirectionalSound(d, br); - case Dat54SoundType.KineticSound: return new Dat54KineticSound(d, br); - case Dat54SoundType.SwitchSound: return new Dat54SwitchSound(d, br); - case Dat54SoundType.VariableCurveSound: return new Dat54VariableCurveSound(d, br); - case Dat54SoundType.VariablePrintValueSound: return new Dat54VariablePrintValueSound(d, br); - case Dat54SoundType.VariableBlockSound: return new Dat54VariableBlockSound(d, br); - case Dat54SoundType.IfSound: return new Dat54IfSound(d, br); - case Dat54SoundType.MathOperationSound: return new Dat54MathOperationSound(d, br); - case Dat54SoundType.ParameterTransformSound: return new Dat54ParameterTransformSound(d, br); - case Dat54SoundType.FluctuatorSound: return new Dat54FluctuatorSound(d, br); - case Dat54SoundType.AutomationSound: return new Dat54AutomationSound(d, br); - case Dat54SoundType.ExternalStreamSound: return new Dat54ExternalStreamSound(d, br); - case Dat54SoundType.SoundSet: return new Dat54SoundSet(d, br); - case Dat54SoundType.AutomationNoteMapSound: return new Dat54AutomationNoteMapSound(d, br); - case Dat54SoundType.SoundSetList: return new Dat54SoundSetList(d, br); - case Dat54SoundType.SoundHashList: return new Dat54SoundHashList(d, br); - default: - return new Dat54Sound(d, br); //shouldn't get here - } + Dat22RelType.Category => new Dat22Category(in d, ref br), + _ => new RelData(in d) + }; } - private RelData ReadData149(RelData d, BinaryReader br) + + private static RelData ReadData54(in TempRelData d, BinaryReader br) { - return ReadData151(d, br);//same as 151? - } - private RelData ReadData150(RelData d, BinaryReader br) - { - return ReadData151(d, br);//same as 151? - } - private RelData ReadData151(RelData d, BinaryReader br) - { - switch ((Dat151RelType)d.TypeID) + return (Dat54SoundType)d.TypeID switch { - case Dat151RelType.StaticEmitterList: return new Dat151StaticEmitterList(d, br); - case Dat151RelType.AmbientZone: return new Dat151AmbientZone(d, br); - case Dat151RelType.AmbientRule: return new Dat151AmbientRule(d, br); - case Dat151RelType.AmbientZoneList: return new Dat151AmbientZoneList(d, br); - case Dat151RelType.VehicleCollision: return new Dat151VehicleCollision(d, br); - case Dat151RelType.WeaponAudioItem: return new Dat151WeaponAudioItem(d, br); - case Dat151RelType.StartTrackAction: return new Dat151StartTrackAction(d, br); - case Dat151RelType.StopTrackAction: return new Dat151StopTrackAction(d, br); - case Dat151RelType.Mood: return new Dat151Mood(d, br); - case Dat151RelType.SetMoodAction: return new Dat151SetMoodAction(d, br); - case Dat151RelType.PlayerAction: return new Dat151PlayerAction(d, br); - case Dat151RelType.StartOneShotAction: return new Dat151StartOneShotAction(d, br); - case Dat151RelType.StopOneShotAction: return new Dat151StopOneShotAction(d, br); - case Dat151RelType.FadeOutRadioAction: return new Dat151FadeOutRadioAction(d, br); - case Dat151RelType.FadeInRadioAction: return new Dat151FadeInRadioAction(d, br); - case Dat151RelType.ModelAudioCollisionSettings: return new Dat151ModelAudioCollisionSettings (d, br); - case Dat151RelType.Interior: return new Dat151Interior(d, br); - case Dat151RelType.InteriorRoom: return new Dat151InteriorRoom(d, br); - case Dat151RelType.DoorModel: return new Dat151DoorModel(d, br); - case Dat151RelType.AudioMaterial: return new Dat151AudioMaterial(d, br); - case Dat151RelType.Door: return new Dat151Door(d, br); - case Dat151RelType.AnimalFootstepsList: return new Dat151AnimalFootstepsList(d, br); - case Dat151RelType.RadioDJSpeechAction: return new Dat151RadioDjSpeechAction(d, br); - case Dat151RelType.ForceRadioTrackAction: return new Dat151ForceRadioTrackAction(d, br); - case Dat151RelType.MicrophoneList: return new Dat151MicrophoneList(d, br); - case Dat151RelType.RadioStationList: return new Dat151RadioStationList(d, br); - case Dat151RelType.RadioStation: return new Dat151RadioStation(d, br); - case Dat151RelType.RadioTrack: return new Dat151RadioTrack(d, br); - case Dat151RelType.TrackList: return new Dat151TrackList(d, br); - case Dat151RelType.DoorList: return new Dat151DoorList(d, br); - case Dat151RelType.ShoeList: return new Dat151ShoeList(d, br); - case Dat151RelType.ClothList: return new Dat151ClothList(d, br); - case Dat151RelType.VehicleRecordingList: return new Dat151VehicleRecordingList(d, br); - case Dat151RelType.WeatherTypeList: return new Dat151WeatherTypeList(d, br); - case Dat151RelType.ShoreLinePool: return new Dat151ShoreLinePool(d, br); - case Dat151RelType.ShoreLineLake: return new Dat151ShoreLineLake(d, br); - case Dat151RelType.ShoreLineRiver: return new Dat151ShoreLineRiver(d, br); - case Dat151RelType.ShoreLineOcean: return new Dat151ShoreLineOcean(d, br); - case Dat151RelType.ShoreLineList: return new Dat151ShoreLineList(d, br); - case Dat151RelType.RadioTrackEvents: return new Dat151RadioTrackEvents(d, br); - case Dat151RelType.VehicleEngineGranular: return new Dat151VehicleEngineGranular(d, br); - case Dat151RelType.Vehicle: return new Dat151Vehicle(d, br); - case Dat151RelType.VehicleEngine: return new Dat151VehicleEngine(d, br); - case Dat151RelType.VehicleScannerParams: return new Dat151VehicleScannerParams(d, br); - case Dat151RelType.StaticEmitter: return new Dat151StaticEmitter(d, br); - case Dat151RelType.Weapon: return new Dat151Weapon(d, br); - case Dat151RelType.Explosion: return new Dat151Explosion(d, br); - case Dat151RelType.PedVoiceGroup: return new Dat151PedVoiceGroup(d, br); - case Dat151RelType.EntityEmitter: return new Dat151EntityEmitter(d, br); - case Dat151RelType.Boat: return new Dat151Boat(d, br); - case Dat151RelType.Bicycle: return new Dat151Bicycle(d, br); - case Dat151RelType.Aeroplane: return new Dat151Aeroplane(d, br); - case Dat151RelType.Helicopter: return new Dat151Helicopter(d, br); - case Dat151RelType.VehicleTrailer: return new Dat151VehicleTrailer(d, br); - case Dat151RelType.Train: return new Dat151Train(d, br); - case Dat151RelType.AnimalParams: return new Dat151AnimalParams(d, br); - case Dat151RelType.SpeechParams: return new Dat151SpeechParams(d, br); - case Dat151RelType.MeleeCombat: return new Dat151MeleeCombat(d, br); - case Dat151RelType.SpeechContext: return new Dat151SpeechContext(d, br); - case Dat151RelType.SpeechChoice: return new Dat151SpeechChoice(d, br); - case Dat151RelType.VirtualSpeechChoice: return new Dat151VirtualSpeechChoice(d, br); - case Dat151RelType.SpeechContextList: return new Dat151SpeechContextList(d, br); - case Dat151RelType.Shoe: return new Dat151Shoe(d, br); - case Dat151RelType.Unk22: return new Dat151Unk22(d, br); - case Dat151RelType.Skis: return new Dat151Skis(d, br); - case Dat151RelType.RadioTrackCategory: return new Dat151RadioTrackCategory(d, br); - case Dat151RelType.PoliceScannerCrime: return new Dat151PoliceScannerCrime(d, br); - case Dat151RelType.RaceToPedVoiceGroup: return new Dat151RaceToPedVoiceGroup(d, br); - case Dat151RelType.PedType: return new Dat151PedType(d, br); - case Dat151RelType.PoliceScannerReport: return new Dat151PoliceScannerReport(d, br); - case Dat151RelType.PoliceScannerLocation: return new Dat151PoliceScannerLocation(d, br); - case Dat151RelType.PoliceScannerLocationList: return new Dat151PoliceScannerLocationList(d, br); - case Dat151RelType.AmbienceSlotMap: return new Dat151AmbienceSlotMap(d, br); - case Dat151RelType.AmbienceBankMap: return new Dat151AmbienceBankMap(d, br); - case Dat151RelType.AmbientZoneParams: return new Dat151AmbientZoneParams(d, br); - case Dat151RelType.InteriorRoomParams: return new Dat151InteriorRoomParams(d, br); - case Dat151RelType.DoorParams: return new Dat151DoorParams(d, br); - case Dat151RelType.Climbing: return new Dat151Climbing(d, br); - case Dat151RelType.WeatherType: return new Dat151WeatherType(d, br); - case Dat151RelType.StemMix: return new Dat151StemMix(d, br); - case Dat151RelType.MusicBeat: return new Dat151MusicBeat(d, br); - case Dat151RelType.MusicBar: return new Dat151MusicBar(d, br); - case Dat151RelType.DependentAmbience: return new Dat151DependentAmbience(d, br); - case Dat151RelType.ConductorState: return new Dat151ConductorState(d, br); - case Dat151RelType.AnimalSounds: return new Dat151AnimalSounds(d, br); - case Dat151RelType.VehicleScannerColourList: return new Dat151VehicleScannerColourList(d, br); - case Dat151RelType.Unk77: return new Dat151Unk77(d, br); - case Dat151RelType.Microphone: return new Dat151Microphone(d, br); - case Dat151RelType.VehicleRecording: return new Dat151VehicleRecording(d, br); - case Dat151RelType.AnimalFootsteps: return new Dat151AnimalFootsteps(d, br); - case Dat151RelType.Cloth: return new Dat151Cloth(d, br); - case Dat151RelType.RadioTrackSettings: return new Dat151RadioTrackSettings(d, br); - case Dat151RelType.StealthSettings: return new Dat151StealthSettings(d, br); - case Dat151RelType.Unk99: return new Dat151Unk99(d, br); - case Dat151RelType.Tunnel: return new Dat151Tunnel(d, br); - case Dat151RelType.Alarm: return new Dat151Alarm(d, br); - case Dat151RelType.SlowMoSettings: return new Dat151SlowMoSettings(d, br); - case Dat151RelType.Scenario: return new Dat151Scenario(d, br); - case Dat151RelType.PortalSettings: return new Dat151PortalSettings(d, br); - case Dat151RelType.ElectricEngine: return new Dat151ElectricEngine(d, br); - case Dat151RelType.BreathSettings: return new Dat151BreathSettings(d, br); - case Dat151RelType.WallaSpeech: return new Dat151WallaSpeech(d, br); - case Dat151RelType.AircraftWarningSettings: return new Dat151AircraftWarningSettings(d, br); - case Dat151RelType.WallaSpeechList: return new Dat151WallaSpeechList(d, br); - case Dat151RelType.CopDispatchInteractionSettings: return new Dat151CopDispatchInteractionSettings(d, br); - case Dat151RelType.Unk115: return new Dat151Unk115(d, br); - case Dat151RelType.TennisVFXSettings: return new Dat151TennisVFXSettings(d, br); - case Dat151RelType.Unk118: return new Dat151Unk118(d, br); - case Dat151RelType.Foliage: return new Dat151Foliage(d, br); - case Dat151RelType.ModelAudioCollisionSettingsOverride: return new Dat151ModelAudioCollisionSettingsOverride(d, br); - case Dat151RelType.RadioStationList2: return new Dat151RadioStationList2(d, br); - default: - return new Dat151RelData(d, br); //shouldn't get here - } + Dat54SoundType.LoopingSound => new Dat54LoopingSound(in d, br), + Dat54SoundType.EnvelopeSound => new Dat54EnvelopeSound(in d, br), + Dat54SoundType.TwinLoopSound => new Dat54TwinLoopSound(in d, br), + Dat54SoundType.SpeechSound => new Dat54SpeechSound(in d, br), + Dat54SoundType.OnStopSound => new Dat54OnStopSound(in d, br), + Dat54SoundType.WrapperSound => new Dat54WrapperSound(in d, br), + Dat54SoundType.SequentialSound => new Dat54SequentialSound(in d, br), + Dat54SoundType.StreamingSound => new Dat54StreamingSound(in d, br), + Dat54SoundType.RetriggeredOverlappedSound => new Dat54RetriggeredOverlappedSound(in d, br), + Dat54SoundType.CrossfadeSound => new Dat54CrossfadeSound(in d, br), + Dat54SoundType.CollapsingStereoSound => new Dat54CollapsingStereoSound(in d, br), + Dat54SoundType.SimpleSound => new Dat54SimpleSound(in d, br), + Dat54SoundType.MultitrackSound => new Dat54MultitrackSound(in d, br), + Dat54SoundType.RandomizedSound => new Dat54RandomizedSound(in d, br), + Dat54SoundType.EnvironmentSound => new Dat54EnvironmentSound(in d, br), + Dat54SoundType.DynamicEntitySound => new Dat54DynamicEntitySound(in d, br), + Dat54SoundType.SequentialOverlapSound => new Dat54SequentialOverlapSound(in d, br), + Dat54SoundType.ModularSynthSound => new Dat54ModularSynthSound(in d, br), + Dat54SoundType.GranularSound => new Dat54GranularSound(in d, br), + Dat54SoundType.DirectionalSound => new Dat54DirectionalSound(in d, br), + Dat54SoundType.KineticSound => new Dat54KineticSound(in d, br), + Dat54SoundType.SwitchSound => new Dat54SwitchSound(in d, br), + Dat54SoundType.VariableCurveSound => new Dat54VariableCurveSound(in d, br), + Dat54SoundType.VariablePrintValueSound => new Dat54VariablePrintValueSound(in d, br), + Dat54SoundType.VariableBlockSound => new Dat54VariableBlockSound(in d, br), + Dat54SoundType.IfSound => new Dat54IfSound(in d, br), + Dat54SoundType.MathOperationSound => new Dat54MathOperationSound(in d, br), + Dat54SoundType.ParameterTransformSound => new Dat54ParameterTransformSound(in d, br), + Dat54SoundType.FluctuatorSound => new Dat54FluctuatorSound(in d, br), + Dat54SoundType.AutomationSound => new Dat54AutomationSound(in d, br), + Dat54SoundType.ExternalStreamSound => new Dat54ExternalStreamSound(in d, br), + Dat54SoundType.SoundSet => new Dat54SoundSet(in d, br), + Dat54SoundType.AutomationNoteMapSound => new Dat54AutomationNoteMapSound(in d, br), + Dat54SoundType.SoundSetList => new Dat54SoundSetList(in d, br), + Dat54SoundType.SoundHashList => new Dat54SoundHashList(in d, br), + _ => new Dat54Sound(in d, br), + }; + } + private static RelData ReadData149(in TempRelData d, BinaryReader br) + { + return ReadData151(in d, br);//same as 151? + } + private static RelData ReadData150(in TempRelData d, BinaryReader br) + { + return ReadData151(in d, br);//same as 151? + } + private static RelData ReadData151(in TempRelData d, BinaryReader br) + { + return (Dat151RelType)d.TypeID switch + { + Dat151RelType.StaticEmitterList => new Dat151StaticEmitterList(in d, br), + Dat151RelType.AmbientZone => new Dat151AmbientZone(in d, br), + Dat151RelType.AmbientRule => new Dat151AmbientRule(in d, br), + Dat151RelType.AmbientZoneList => new Dat151AmbientZoneList(in d, br), + Dat151RelType.VehicleCollision => new Dat151VehicleCollision(in d, br), + Dat151RelType.WeaponAudioItem => new Dat151WeaponAudioItem(in d, br), + Dat151RelType.StartTrackAction => new Dat151StartTrackAction(in d, br), + Dat151RelType.StopTrackAction => new Dat151StopTrackAction(in d, br), + Dat151RelType.Mood => new Dat151Mood(in d, br), + Dat151RelType.SetMoodAction => new Dat151SetMoodAction(in d, br), + Dat151RelType.PlayerAction => new Dat151PlayerAction(in d, br), + Dat151RelType.StartOneShotAction => new Dat151StartOneShotAction(in d, br), + Dat151RelType.StopOneShotAction => new Dat151StopOneShotAction(in d, br), + Dat151RelType.FadeOutRadioAction => new Dat151FadeOutRadioAction(in d, br), + Dat151RelType.FadeInRadioAction => new Dat151FadeInRadioAction(in d, br), + Dat151RelType.ModelAudioCollisionSettings => new Dat151ModelAudioCollisionSettings(in d, br), + Dat151RelType.Interior => new Dat151Interior(in d, br), + Dat151RelType.InteriorRoom => new Dat151InteriorRoom(in d, br), + Dat151RelType.DoorModel => new Dat151DoorModel(in d, br), + Dat151RelType.AudioMaterial => new Dat151AudioMaterial(in d, br), + Dat151RelType.Door => new Dat151Door(in d, br), + Dat151RelType.AnimalFootstepsList => new Dat151AnimalFootstepsList(in d, br), + Dat151RelType.RadioDJSpeechAction => new Dat151RadioDjSpeechAction(in d, br), + Dat151RelType.ForceRadioTrackAction => new Dat151ForceRadioTrackAction(in d, br), + Dat151RelType.MicrophoneList => new Dat151MicrophoneList(in d, br), + Dat151RelType.RadioStationList => new Dat151RadioStationList(in d, br), + Dat151RelType.RadioStation => new Dat151RadioStation(in d, br), + Dat151RelType.RadioTrack => new Dat151RadioTrack(in d, br), + Dat151RelType.TrackList => new Dat151TrackList(in d, br), + Dat151RelType.DoorList => new Dat151DoorList(in d, br), + Dat151RelType.ShoeList => new Dat151ShoeList(in d, br), + Dat151RelType.ClothList => new Dat151ClothList(d, br), + Dat151RelType.VehicleRecordingList => new Dat151VehicleRecordingList(in d, br), + Dat151RelType.WeatherTypeList => new Dat151WeatherTypeList(in d, br), + Dat151RelType.ShoreLinePool => new Dat151ShoreLinePool(in d, br), + Dat151RelType.ShoreLineLake => new Dat151ShoreLineLake(in d, br), + Dat151RelType.ShoreLineRiver => new Dat151ShoreLineRiver(in d, br), + Dat151RelType.ShoreLineOcean => new Dat151ShoreLineOcean(in d, br), + Dat151RelType.ShoreLineList => new Dat151ShoreLineList(in d, br), + Dat151RelType.RadioTrackEvents => new Dat151RadioTrackEvents(in d, br), + Dat151RelType.VehicleEngineGranular => new Dat151VehicleEngineGranular(in d, br), + Dat151RelType.Vehicle => new Dat151Vehicle(in d, br), + Dat151RelType.VehicleEngine => new Dat151VehicleEngine(in d, br), + Dat151RelType.VehicleScannerParams => new Dat151VehicleScannerParams(in d, br), + Dat151RelType.StaticEmitter => new Dat151StaticEmitter(in d, br), + Dat151RelType.Weapon => new Dat151Weapon(in d, br), + Dat151RelType.Explosion => new Dat151Explosion(in d, br), + Dat151RelType.PedVoiceGroup => new Dat151PedVoiceGroup(in d, br), + Dat151RelType.EntityEmitter => new Dat151EntityEmitter(in d, br), + Dat151RelType.Boat => new Dat151Boat(in d, br), + Dat151RelType.Bicycle => new Dat151Bicycle(in d, br), + Dat151RelType.Aeroplane => new Dat151Aeroplane(in d, br), + Dat151RelType.Helicopter => new Dat151Helicopter(in d, br), + Dat151RelType.VehicleTrailer => new Dat151VehicleTrailer(in d, br), + Dat151RelType.Train => new Dat151Train(in d, br), + Dat151RelType.AnimalParams => new Dat151AnimalParams(in d, br), + Dat151RelType.SpeechParams => new Dat151SpeechParams(in d, br), + Dat151RelType.MeleeCombat => new Dat151MeleeCombat(in d, br), + Dat151RelType.SpeechContext => new Dat151SpeechContext(in d, br), + Dat151RelType.SpeechChoice => new Dat151SpeechChoice(in d, br), + Dat151RelType.VirtualSpeechChoice => new Dat151VirtualSpeechChoice(in d, br), + Dat151RelType.SpeechContextList => new Dat151SpeechContextList(in d, br), + Dat151RelType.Shoe => new Dat151Shoe(in d, br), + Dat151RelType.Unk22 => new Dat151Unk22(in d, br), + Dat151RelType.Skis => new Dat151Skis(in d, br), + Dat151RelType.RadioTrackCategory => new Dat151RadioTrackCategory(in d, br), + Dat151RelType.PoliceScannerCrime => new Dat151PoliceScannerCrime(in d, br), + Dat151RelType.RaceToPedVoiceGroup => new Dat151RaceToPedVoiceGroup(in d, br), + Dat151RelType.PedType => new Dat151PedType(in d, br), + Dat151RelType.PoliceScannerReport => new Dat151PoliceScannerReport(in d, br), + Dat151RelType.PoliceScannerLocation => new Dat151PoliceScannerLocation(in d, br), + Dat151RelType.PoliceScannerLocationList => new Dat151PoliceScannerLocationList(in d, br), + Dat151RelType.AmbienceSlotMap => new Dat151AmbienceSlotMap(in d, br), + Dat151RelType.AmbienceBankMap => new Dat151AmbienceBankMap(in d, br), + Dat151RelType.AmbientZoneParams => new Dat151AmbientZoneParams(in d, br), + Dat151RelType.InteriorRoomParams => new Dat151InteriorRoomParams(in d, br), + Dat151RelType.DoorParams => new Dat151DoorParams(in d, br), + Dat151RelType.Climbing => new Dat151Climbing(in d, br), + Dat151RelType.WeatherType => new Dat151WeatherType(in d, br), + Dat151RelType.StemMix => new Dat151StemMix(in d, br), + Dat151RelType.MusicBeat => new Dat151MusicBeat(in d, br), + Dat151RelType.MusicBar => new Dat151MusicBar(in d, br), + Dat151RelType.DependentAmbience => new Dat151DependentAmbience(in d, br), + Dat151RelType.ConductorState => new Dat151ConductorState(in d, br), + Dat151RelType.AnimalSounds => new Dat151AnimalSounds(in d, br), + Dat151RelType.VehicleScannerColourList => new Dat151VehicleScannerColourList(in d, br), + Dat151RelType.Unk77 => new Dat151Unk77(in d, br), + Dat151RelType.Microphone => new Dat151Microphone(in d, br), + Dat151RelType.VehicleRecording => new Dat151VehicleRecording(in d, br), + Dat151RelType.AnimalFootsteps => new Dat151AnimalFootsteps(in d, br), + Dat151RelType.Cloth => new Dat151Cloth(in d, br), + Dat151RelType.RadioTrackSettings => new Dat151RadioTrackSettings(in d, br), + Dat151RelType.StealthSettings => new Dat151StealthSettings(in d, br), + Dat151RelType.Unk99 => new Dat151Unk99(in d, br), + Dat151RelType.Tunnel => new Dat151Tunnel(in d, br), + Dat151RelType.Alarm => new Dat151Alarm(in d, br), + Dat151RelType.SlowMoSettings => new Dat151SlowMoSettings(in d, br), + Dat151RelType.Scenario => new Dat151Scenario(in d, br), + Dat151RelType.PortalSettings => new Dat151PortalSettings(in d, br), + Dat151RelType.ElectricEngine => new Dat151ElectricEngine(in d, br), + Dat151RelType.BreathSettings => new Dat151BreathSettings(in d, br), + Dat151RelType.WallaSpeech => new Dat151WallaSpeech(in d, br), + Dat151RelType.AircraftWarningSettings => new Dat151AircraftWarningSettings(in d, br), + Dat151RelType.WallaSpeechList => new Dat151WallaSpeechList(in d, br), + Dat151RelType.CopDispatchInteractionSettings => new Dat151CopDispatchInteractionSettings(in d, br), + Dat151RelType.Unk115 => new Dat151Unk115(in d, br), + Dat151RelType.TennisVFXSettings => new Dat151TennisVFXSettings(in d, br), + Dat151RelType.Unk118 => new Dat151Unk118(in d, br), + Dat151RelType.Foliage => new Dat151Foliage(in d, br), + Dat151RelType.ModelAudioCollisionSettingsOverride => new Dat151ModelAudioCollisionSettingsOverride(in d, br), + Dat151RelType.RadioStationList2 => new Dat151RadioStationList2(in d, br), + _ => new Dat151RelData(in d, br),//shouldn't get here + }; } @@ -751,165 +769,163 @@ namespace CodeWalker.GameFiles switch (relType) { case RelDatFileType.Dat54DataEntries: - switch ((Dat54SoundType)dataType) + return (Dat54SoundType)dataType switch { - case Dat54SoundType.LoopingSound: return new Dat54LoopingSound(this); - case Dat54SoundType.EnvelopeSound: return new Dat54EnvelopeSound(this); - case Dat54SoundType.TwinLoopSound: return new Dat54TwinLoopSound(this); - case Dat54SoundType.SpeechSound: return new Dat54SpeechSound(this); - case Dat54SoundType.OnStopSound: return new Dat54OnStopSound(this); - case Dat54SoundType.WrapperSound: return new Dat54WrapperSound(this); - case Dat54SoundType.SequentialSound: return new Dat54SequentialSound(this); - case Dat54SoundType.StreamingSound: return new Dat54StreamingSound(this); - case Dat54SoundType.RetriggeredOverlappedSound: return new Dat54RetriggeredOverlappedSound(this); - case Dat54SoundType.CrossfadeSound: return new Dat54CrossfadeSound(this); - case Dat54SoundType.CollapsingStereoSound: return new Dat54CollapsingStereoSound(this); - case Dat54SoundType.SimpleSound: return new Dat54SimpleSound(this); - case Dat54SoundType.MultitrackSound: return new Dat54MultitrackSound(this); - case Dat54SoundType.RandomizedSound: return new Dat54RandomizedSound(this); - case Dat54SoundType.EnvironmentSound: return new Dat54EnvironmentSound(this); - case Dat54SoundType.DynamicEntitySound: return new Dat54DynamicEntitySound(this); - case Dat54SoundType.SequentialOverlapSound: return new Dat54SequentialOverlapSound(this); - case Dat54SoundType.ModularSynthSound: return new Dat54ModularSynthSound(this); - case Dat54SoundType.GranularSound: return new Dat54GranularSound(this); - case Dat54SoundType.DirectionalSound: return new Dat54DirectionalSound(this); - case Dat54SoundType.KineticSound: return new Dat54KineticSound(this); - case Dat54SoundType.SwitchSound: return new Dat54SwitchSound(this); - case Dat54SoundType.VariableCurveSound: return new Dat54VariableCurveSound(this); - case Dat54SoundType.VariablePrintValueSound: return new Dat54VariablePrintValueSound(this); - case Dat54SoundType.VariableBlockSound: return new Dat54VariableBlockSound(this); - case Dat54SoundType.IfSound: return new Dat54IfSound(this); - case Dat54SoundType.MathOperationSound: return new Dat54MathOperationSound(this); - case Dat54SoundType.ParameterTransformSound: return new Dat54ParameterTransformSound(this); - case Dat54SoundType.FluctuatorSound: return new Dat54FluctuatorSound(this); - case Dat54SoundType.AutomationSound: return new Dat54AutomationSound(this); - case Dat54SoundType.ExternalStreamSound: return new Dat54ExternalStreamSound(this); - case Dat54SoundType.SoundSet: return new Dat54SoundSet(this); - case Dat54SoundType.AutomationNoteMapSound: return new Dat54AutomationNoteMapSound(this); - case Dat54SoundType.SoundSetList: return new Dat54SoundSetList(this); - case Dat54SoundType.SoundHashList: return new Dat54SoundHashList(this); - default: - return new Dat54Sound(this, (Dat54SoundType)d.TypeID); //shouldn't get here - } + Dat54SoundType.LoopingSound => new Dat54LoopingSound(this), + Dat54SoundType.EnvelopeSound => new Dat54EnvelopeSound(this), + Dat54SoundType.TwinLoopSound => new Dat54TwinLoopSound(this), + Dat54SoundType.SpeechSound => new Dat54SpeechSound(this), + Dat54SoundType.OnStopSound => new Dat54OnStopSound(this), + Dat54SoundType.WrapperSound => new Dat54WrapperSound(this), + Dat54SoundType.SequentialSound => new Dat54SequentialSound(this), + Dat54SoundType.StreamingSound => new Dat54StreamingSound(this), + Dat54SoundType.RetriggeredOverlappedSound => new Dat54RetriggeredOverlappedSound(this), + Dat54SoundType.CrossfadeSound => new Dat54CrossfadeSound(this), + Dat54SoundType.CollapsingStereoSound => new Dat54CollapsingStereoSound(this), + Dat54SoundType.SimpleSound => new Dat54SimpleSound(this), + Dat54SoundType.MultitrackSound => new Dat54MultitrackSound(this), + Dat54SoundType.RandomizedSound => new Dat54RandomizedSound(this), + Dat54SoundType.EnvironmentSound => new Dat54EnvironmentSound(this), + Dat54SoundType.DynamicEntitySound => new Dat54DynamicEntitySound(this), + Dat54SoundType.SequentialOverlapSound => new Dat54SequentialOverlapSound(this), + Dat54SoundType.ModularSynthSound => new Dat54ModularSynthSound(this), + Dat54SoundType.GranularSound => new Dat54GranularSound(this), + Dat54SoundType.DirectionalSound => new Dat54DirectionalSound(this), + Dat54SoundType.KineticSound => new Dat54KineticSound(this), + Dat54SoundType.SwitchSound => new Dat54SwitchSound(this), + Dat54SoundType.VariableCurveSound => new Dat54VariableCurveSound(this), + Dat54SoundType.VariablePrintValueSound => new Dat54VariablePrintValueSound(this), + Dat54SoundType.VariableBlockSound => new Dat54VariableBlockSound(this), + Dat54SoundType.IfSound => new Dat54IfSound(this), + Dat54SoundType.MathOperationSound => new Dat54MathOperationSound(this), + Dat54SoundType.ParameterTransformSound => new Dat54ParameterTransformSound(this), + Dat54SoundType.FluctuatorSound => new Dat54FluctuatorSound(this), + Dat54SoundType.AutomationSound => new Dat54AutomationSound(this), + Dat54SoundType.ExternalStreamSound => new Dat54ExternalStreamSound(this), + Dat54SoundType.SoundSet => new Dat54SoundSet(this), + Dat54SoundType.AutomationNoteMapSound => new Dat54AutomationNoteMapSound(this), + Dat54SoundType.SoundSetList => new Dat54SoundSetList(this), + Dat54SoundType.SoundHashList => new Dat54SoundHashList(this), + _ => new Dat54Sound(this, (Dat54SoundType)d.TypeID),//shouldn't get here + }; case RelDatFileType.Dat149: case RelDatFileType.Dat150: case RelDatFileType.Dat151: - switch ((Dat151RelType)dataType) + return (Dat151RelType)dataType switch { - case Dat151RelType.StaticEmitterList: return new Dat151StaticEmitterList(this); - case Dat151RelType.AmbientZone: return new Dat151AmbientZone(this); - case Dat151RelType.AmbientRule: return new Dat151AmbientRule(this); - case Dat151RelType.AmbientZoneList: return new Dat151AmbientZoneList(this); - case Dat151RelType.VehicleCollision: return new Dat151VehicleCollision(this); - case Dat151RelType.WeaponAudioItem: return new Dat151WeaponAudioItem(this); - case Dat151RelType.StartTrackAction: return new Dat151StartTrackAction(this); - case Dat151RelType.StopTrackAction: return new Dat151StopTrackAction(this); - case Dat151RelType.Mood: return new Dat151Mood(this); - case Dat151RelType.SetMoodAction: return new Dat151SetMoodAction(this); - case Dat151RelType.PlayerAction: return new Dat151PlayerAction(this); - case Dat151RelType.StartOneShotAction: return new Dat151StartOneShotAction(this); - case Dat151RelType.StopOneShotAction: return new Dat151StopOneShotAction(this); - case Dat151RelType.FadeOutRadioAction: return new Dat151FadeOutRadioAction(this); - case Dat151RelType.FadeInRadioAction: return new Dat151FadeInRadioAction(this); - case Dat151RelType.ModelAudioCollisionSettings: return new Dat151ModelAudioCollisionSettings(this); - case Dat151RelType.Interior: return new Dat151Interior(this); - case Dat151RelType.InteriorRoom: return new Dat151InteriorRoom(this); - case Dat151RelType.DoorModel: return new Dat151DoorModel(this); - case Dat151RelType.AudioMaterial: return new Dat151AudioMaterial(this); - case Dat151RelType.Door: return new Dat151Door(this); - case Dat151RelType.AnimalFootstepsList: return new Dat151AnimalFootstepsList(this); - case Dat151RelType.RadioDJSpeechAction: return new Dat151RadioDjSpeechAction(this); - case Dat151RelType.ForceRadioTrackAction: return new Dat151ForceRadioTrackAction(this); - case Dat151RelType.MicrophoneList: return new Dat151MicrophoneList(this); - case Dat151RelType.RadioStationList: return new Dat151RadioStationList(this); - case Dat151RelType.RadioStation: return new Dat151RadioStation(this); - case Dat151RelType.RadioTrack: return new Dat151RadioTrack(this); - case Dat151RelType.TrackList: return new Dat151TrackList(this); - case Dat151RelType.DoorList: return new Dat151DoorList(this); - case Dat151RelType.ShoeList: return new Dat151ShoeList(this); - case Dat151RelType.ClothList: return new Dat151ClothList(this); - case Dat151RelType.VehicleRecordingList: return new Dat151VehicleRecordingList(this); - case Dat151RelType.WeatherTypeList: return new Dat151WeatherTypeList(this); - case Dat151RelType.ShoreLinePool: return new Dat151ShoreLinePool(this); - case Dat151RelType.ShoreLineLake: return new Dat151ShoreLineLake(this); - case Dat151RelType.ShoreLineRiver: return new Dat151ShoreLineRiver(this); - case Dat151RelType.ShoreLineOcean: return new Dat151ShoreLineOcean(this); - case Dat151RelType.ShoreLineList: return new Dat151ShoreLineList(this); - case Dat151RelType.RadioTrackEvents: return new Dat151RadioTrackEvents(this); - case Dat151RelType.VehicleEngineGranular: return new Dat151VehicleEngineGranular(this); - case Dat151RelType.Vehicle: return new Dat151Vehicle(this); - case Dat151RelType.VehicleEngine: return new Dat151VehicleEngine(this); - case Dat151RelType.VehicleScannerParams: return new Dat151VehicleScannerParams(this); - case Dat151RelType.StaticEmitter: return new Dat151StaticEmitter(this); - case Dat151RelType.Weapon: return new Dat151Weapon(this); - case Dat151RelType.Explosion: return new Dat151Explosion(this); - case Dat151RelType.PedVoiceGroup: return new Dat151PedVoiceGroup(this); - case Dat151RelType.EntityEmitter: return new Dat151EntityEmitter(this); - case Dat151RelType.Boat: return new Dat151Boat(this); - case Dat151RelType.Bicycle: return new Dat151Bicycle(this); - case Dat151RelType.Aeroplane: return new Dat151Aeroplane(this); - case Dat151RelType.Helicopter: return new Dat151Helicopter(this); - case Dat151RelType.VehicleTrailer: return new Dat151VehicleTrailer(this); - case Dat151RelType.Train: return new Dat151Train(this); - case Dat151RelType.AnimalParams: return new Dat151AnimalParams(this); - case Dat151RelType.SpeechParams: return new Dat151SpeechParams(this); - case Dat151RelType.MeleeCombat: return new Dat151MeleeCombat(this); - case Dat151RelType.SpeechContext: return new Dat151SpeechContext(this); - case Dat151RelType.SpeechChoice: return new Dat151SpeechChoice(this); - case Dat151RelType.VirtualSpeechChoice: return new Dat151VirtualSpeechChoice(this); - case Dat151RelType.SpeechContextList: return new Dat151SpeechContextList(this); - case Dat151RelType.Shoe: return new Dat151Shoe(this); - case Dat151RelType.Unk22: return new Dat151Unk22(this); - case Dat151RelType.Skis: return new Dat151Skis(this); - case Dat151RelType.RadioTrackCategory: return new Dat151RadioTrackCategory(this); - case Dat151RelType.PoliceScannerCrime: return new Dat151PoliceScannerCrime(this); - case Dat151RelType.RaceToPedVoiceGroup: return new Dat151RaceToPedVoiceGroup(this); - case Dat151RelType.PedType: return new Dat151PedType(this); - case Dat151RelType.PoliceScannerReport: return new Dat151PoliceScannerReport(this); - case Dat151RelType.PoliceScannerLocation: return new Dat151PoliceScannerLocation(this); - case Dat151RelType.PoliceScannerLocationList: return new Dat151PoliceScannerLocationList(this); - case Dat151RelType.AmbienceSlotMap: return new Dat151AmbienceSlotMap(this); - case Dat151RelType.AmbienceBankMap: return new Dat151AmbienceBankMap(this); - case Dat151RelType.AmbientZoneParams: return new Dat151AmbientZoneParams(this); - case Dat151RelType.InteriorRoomParams: return new Dat151InteriorRoomParams(this); - case Dat151RelType.DoorParams: return new Dat151DoorParams(this); - case Dat151RelType.Climbing: return new Dat151Climbing(this); - case Dat151RelType.WeatherType: return new Dat151WeatherType(this); - case Dat151RelType.StemMix: return new Dat151StemMix(this); - case Dat151RelType.MusicBeat: return new Dat151MusicBeat(this); - case Dat151RelType.MusicBar: return new Dat151MusicBar(this); - case Dat151RelType.DependentAmbience: return new Dat151DependentAmbience(this); - case Dat151RelType.ConductorState: return new Dat151ConductorState(this); - case Dat151RelType.AnimalSounds: return new Dat151AnimalSounds(this); - case Dat151RelType.VehicleScannerColourList: return new Dat151VehicleScannerColourList(this); - case Dat151RelType.Unk77: return new Dat151Unk77(this); - case Dat151RelType.Microphone: return new Dat151Microphone(this); - case Dat151RelType.VehicleRecording: return new Dat151VehicleRecording(this); - case Dat151RelType.AnimalFootsteps: return new Dat151AnimalFootsteps(this); - case Dat151RelType.Cloth: return new Dat151Cloth(this); - case Dat151RelType.RadioTrackSettings: return new Dat151RadioTrackSettings(this); - case Dat151RelType.StealthSettings: return new Dat151StealthSettings(this); - case Dat151RelType.Unk99: return new Dat151Unk99(this); - case Dat151RelType.Tunnel: return new Dat151Tunnel(this); - case Dat151RelType.Alarm: return new Dat151Alarm(this); - case Dat151RelType.SlowMoSettings: return new Dat151SlowMoSettings(this); - case Dat151RelType.Scenario: return new Dat151Scenario(this); - case Dat151RelType.PortalSettings: return new Dat151PortalSettings(this); - case Dat151RelType.ElectricEngine: return new Dat151ElectricEngine(this); - case Dat151RelType.BreathSettings: return new Dat151BreathSettings(this); - case Dat151RelType.WallaSpeech: return new Dat151WallaSpeech(this); - case Dat151RelType.AircraftWarningSettings: return new Dat151AircraftWarningSettings(this); - case Dat151RelType.WallaSpeechList: return new Dat151WallaSpeechList(this); - case Dat151RelType.CopDispatchInteractionSettings: return new Dat151CopDispatchInteractionSettings(this); - case Dat151RelType.Unk115: return new Dat151Unk115(this); - case Dat151RelType.TennisVFXSettings: return new Dat151TennisVFXSettings(this); - case Dat151RelType.Unk118: return new Dat151Unk118(this); - case Dat151RelType.Foliage: return new Dat151Foliage(this); - case Dat151RelType.ModelAudioCollisionSettingsOverride: return new Dat151ModelAudioCollisionSettingsOverride(this); - case Dat151RelType.RadioStationList2: return new Dat151RadioStationList2(this); - default: - return new Dat151RelData(this, (Dat151RelType)dataType); //shouldn't get here - } + Dat151RelType.StaticEmitterList => new Dat151StaticEmitterList(this), + Dat151RelType.AmbientZone => new Dat151AmbientZone(this), + Dat151RelType.AmbientRule => new Dat151AmbientRule(this), + Dat151RelType.AmbientZoneList => new Dat151AmbientZoneList(this), + Dat151RelType.VehicleCollision => new Dat151VehicleCollision(this), + Dat151RelType.WeaponAudioItem => new Dat151WeaponAudioItem(this), + Dat151RelType.StartTrackAction => new Dat151StartTrackAction(this), + Dat151RelType.StopTrackAction => new Dat151StopTrackAction(this), + Dat151RelType.Mood => new Dat151Mood(this), + Dat151RelType.SetMoodAction => new Dat151SetMoodAction(this), + Dat151RelType.PlayerAction => new Dat151PlayerAction(this), + Dat151RelType.StartOneShotAction => new Dat151StartOneShotAction(this), + Dat151RelType.StopOneShotAction => new Dat151StopOneShotAction(this), + Dat151RelType.FadeOutRadioAction => new Dat151FadeOutRadioAction(this), + Dat151RelType.FadeInRadioAction => new Dat151FadeInRadioAction(this), + Dat151RelType.ModelAudioCollisionSettings => new Dat151ModelAudioCollisionSettings(this), + Dat151RelType.Interior => new Dat151Interior(this), + Dat151RelType.InteriorRoom => new Dat151InteriorRoom(this), + Dat151RelType.DoorModel => new Dat151DoorModel(this), + Dat151RelType.AudioMaterial => new Dat151AudioMaterial(this), + Dat151RelType.Door => new Dat151Door(this), + Dat151RelType.AnimalFootstepsList => new Dat151AnimalFootstepsList(this), + Dat151RelType.RadioDJSpeechAction => new Dat151RadioDjSpeechAction(this), + Dat151RelType.ForceRadioTrackAction => new Dat151ForceRadioTrackAction(this), + Dat151RelType.MicrophoneList => new Dat151MicrophoneList(this), + Dat151RelType.RadioStationList => new Dat151RadioStationList(this), + Dat151RelType.RadioStation => new Dat151RadioStation(this), + Dat151RelType.RadioTrack => new Dat151RadioTrack(this), + Dat151RelType.TrackList => new Dat151TrackList(this), + Dat151RelType.DoorList => new Dat151DoorList(this), + Dat151RelType.ShoeList => new Dat151ShoeList(this), + Dat151RelType.ClothList => new Dat151ClothList(this), + Dat151RelType.VehicleRecordingList => new Dat151VehicleRecordingList(this), + Dat151RelType.WeatherTypeList => new Dat151WeatherTypeList(this), + Dat151RelType.ShoreLinePool => new Dat151ShoreLinePool(this), + Dat151RelType.ShoreLineLake => new Dat151ShoreLineLake(this), + Dat151RelType.ShoreLineRiver => new Dat151ShoreLineRiver(this), + Dat151RelType.ShoreLineOcean => new Dat151ShoreLineOcean(this), + Dat151RelType.ShoreLineList => new Dat151ShoreLineList(this), + Dat151RelType.RadioTrackEvents => new Dat151RadioTrackEvents(this), + Dat151RelType.VehicleEngineGranular => new Dat151VehicleEngineGranular(this), + Dat151RelType.Vehicle => new Dat151Vehicle(this), + Dat151RelType.VehicleEngine => new Dat151VehicleEngine(this), + Dat151RelType.VehicleScannerParams => new Dat151VehicleScannerParams(this), + Dat151RelType.StaticEmitter => new Dat151StaticEmitter(this), + Dat151RelType.Weapon => new Dat151Weapon(this), + Dat151RelType.Explosion => new Dat151Explosion(this), + Dat151RelType.PedVoiceGroup => new Dat151PedVoiceGroup(this), + Dat151RelType.EntityEmitter => new Dat151EntityEmitter(this), + Dat151RelType.Boat => new Dat151Boat(this), + Dat151RelType.Bicycle => new Dat151Bicycle(this), + Dat151RelType.Aeroplane => new Dat151Aeroplane(this), + Dat151RelType.Helicopter => new Dat151Helicopter(this), + Dat151RelType.VehicleTrailer => new Dat151VehicleTrailer(this), + Dat151RelType.Train => new Dat151Train(this), + Dat151RelType.AnimalParams => new Dat151AnimalParams(this), + Dat151RelType.SpeechParams => new Dat151SpeechParams(this), + Dat151RelType.MeleeCombat => new Dat151MeleeCombat(this), + Dat151RelType.SpeechContext => new Dat151SpeechContext(this), + Dat151RelType.SpeechChoice => new Dat151SpeechChoice(this), + Dat151RelType.VirtualSpeechChoice => new Dat151VirtualSpeechChoice(this), + Dat151RelType.SpeechContextList => new Dat151SpeechContextList(this), + Dat151RelType.Shoe => new Dat151Shoe(this), + Dat151RelType.Unk22 => new Dat151Unk22(this), + Dat151RelType.Skis => new Dat151Skis(this), + Dat151RelType.RadioTrackCategory => new Dat151RadioTrackCategory(this), + Dat151RelType.PoliceScannerCrime => new Dat151PoliceScannerCrime(this), + Dat151RelType.RaceToPedVoiceGroup => new Dat151RaceToPedVoiceGroup(this), + Dat151RelType.PedType => new Dat151PedType(this), + Dat151RelType.PoliceScannerReport => new Dat151PoliceScannerReport(this), + Dat151RelType.PoliceScannerLocation => new Dat151PoliceScannerLocation(this), + Dat151RelType.PoliceScannerLocationList => new Dat151PoliceScannerLocationList(this), + Dat151RelType.AmbienceSlotMap => new Dat151AmbienceSlotMap(this), + Dat151RelType.AmbienceBankMap => new Dat151AmbienceBankMap(this), + Dat151RelType.AmbientZoneParams => new Dat151AmbientZoneParams(this), + Dat151RelType.InteriorRoomParams => new Dat151InteriorRoomParams(this), + Dat151RelType.DoorParams => new Dat151DoorParams(this), + Dat151RelType.Climbing => new Dat151Climbing(this), + Dat151RelType.WeatherType => new Dat151WeatherType(this), + Dat151RelType.StemMix => new Dat151StemMix(this), + Dat151RelType.MusicBeat => new Dat151MusicBeat(this), + Dat151RelType.MusicBar => new Dat151MusicBar(this), + Dat151RelType.DependentAmbience => new Dat151DependentAmbience(this), + Dat151RelType.ConductorState => new Dat151ConductorState(this), + Dat151RelType.AnimalSounds => new Dat151AnimalSounds(this), + Dat151RelType.VehicleScannerColourList => new Dat151VehicleScannerColourList(this), + Dat151RelType.Unk77 => new Dat151Unk77(this), + Dat151RelType.Microphone => new Dat151Microphone(this), + Dat151RelType.VehicleRecording => new Dat151VehicleRecording(this), + Dat151RelType.AnimalFootsteps => new Dat151AnimalFootsteps(this), + Dat151RelType.Cloth => new Dat151Cloth(this), + Dat151RelType.RadioTrackSettings => new Dat151RadioTrackSettings(this), + Dat151RelType.StealthSettings => new Dat151StealthSettings(this), + Dat151RelType.Unk99 => new Dat151Unk99(this), + Dat151RelType.Tunnel => new Dat151Tunnel(this), + Dat151RelType.Alarm => new Dat151Alarm(this), + Dat151RelType.SlowMoSettings => new Dat151SlowMoSettings(this), + Dat151RelType.Scenario => new Dat151Scenario(this), + Dat151RelType.PortalSettings => new Dat151PortalSettings(this), + Dat151RelType.ElectricEngine => new Dat151ElectricEngine(this), + Dat151RelType.BreathSettings => new Dat151BreathSettings(this), + Dat151RelType.WallaSpeech => new Dat151WallaSpeech(this), + Dat151RelType.AircraftWarningSettings => new Dat151AircraftWarningSettings(this), + Dat151RelType.WallaSpeechList => new Dat151WallaSpeechList(this), + Dat151RelType.CopDispatchInteractionSettings => new Dat151CopDispatchInteractionSettings(this), + Dat151RelType.Unk115 => new Dat151Unk115(this), + Dat151RelType.TennisVFXSettings => new Dat151TennisVFXSettings(this), + Dat151RelType.Unk118 => new Dat151Unk118(this), + Dat151RelType.Foliage => new Dat151Foliage(this), + Dat151RelType.ModelAudioCollisionSettingsOverride => new Dat151ModelAudioCollisionSettingsOverride(this), + Dat151RelType.RadioStationList2 => new Dat151RadioStationList2(this), + _ => new Dat151RelData(this, (Dat151RelType)dataType),//shouldn't get here + }; case RelDatFileType.Dat4: if (IsAudioConfig) { @@ -946,47 +962,44 @@ namespace CodeWalker.GameFiles return new Dat10RelData(this);//shouldn't get here } case RelDatFileType.Dat15DynamicMixer: - switch ((Dat15RelType)dataType) + return (Dat15RelType)dataType switch { - case Dat15RelType.Patch: return new Dat15Patch(this); - case Dat15RelType.SceneState: return new Dat15SceneState(this); - case Dat15RelType.Scene: return new Dat15Scene(this); - case Dat15RelType.Group: return new Dat15Group(this); - case Dat15RelType.GroupList: return new Dat15GroupList(this); - case Dat15RelType.DynamicMixModuleSettings: return new Dat15DynamicMixModuleSettings(this); - case Dat15RelType.SceneVariableModuleSettings: return new Dat15SceneVariableModuleSettings(this); - case Dat15RelType.SceneTransitionModuleSettings: return new Dat15SceneTransitionModuleSettings(this); - case Dat15RelType.VehicleCollisionModuleSettings: return new Dat15VehicleCollisionModuleSettings(this); - case Dat15RelType.GroupMap: return new Dat15GroupMap(this); - default: - return new Dat15RelData(this);//shouldn't get here - } + Dat15RelType.Patch => new Dat15Patch(this), + Dat15RelType.SceneState => new Dat15SceneState(this), + Dat15RelType.Scene => new Dat15Scene(this), + Dat15RelType.Group => new Dat15Group(this), + Dat15RelType.GroupList => new Dat15GroupList(this), + Dat15RelType.DynamicMixModuleSettings => new Dat15DynamicMixModuleSettings(this), + Dat15RelType.SceneVariableModuleSettings => new Dat15SceneVariableModuleSettings(this), + Dat15RelType.SceneTransitionModuleSettings => new Dat15SceneTransitionModuleSettings(this), + Dat15RelType.VehicleCollisionModuleSettings => new Dat15VehicleCollisionModuleSettings(this), + Dat15RelType.GroupMap => new Dat15GroupMap(this), + _ => new Dat15RelData(this),//shouldn't get here + }; case RelDatFileType.Dat16Curves: - switch ((Dat16RelType)dataType) + return (Dat16RelType)dataType switch { - case Dat16RelType.ConstantCurve: return new Dat16ConstantCurve(this); - case Dat16RelType.LinearCurve: return new Dat16LinearCurve(this); - case Dat16RelType.LinearDbCurve: return new Dat16LinearDbCurve(this); - case Dat16RelType.PiecewiseLinearCurve: return new Dat16PiecewiseLinearCurve(this); - case Dat16RelType.EqualPowerCurve: return new Dat16EqualPowerCurve(this); - case Dat16RelType.ValueTableCurve: return new Dat16ValueTableCurve(this); - case Dat16RelType.ExponentialCurve: return new Dat16ExponentialCurve(this); - case Dat16RelType.DecayingExponentialCurve: return new Dat16DecayingExponentialCurve(this); - case Dat16RelType.DecayingSquaredExponentialCurve: return new Dat16DecayingSquaredExponentialCurve(this); - case Dat16RelType.SineCurve: return new Dat16SineCurve(this); - case Dat16RelType.OneOverXSquaredCurve: return new Dat16OneOverXSquaredCurve(this); - case Dat16RelType.DefaultDistanceAttenuationCurve: return new Dat16DefaultDistanceAttenuationCurve(this); - case Dat16RelType.DistanceAttenuationValueTableCurve: return new Dat16DistanceAttenuationValueTableCurve(this); - default: - return new Dat16RelData(this);//shouldn't get here - } + Dat16RelType.ConstantCurve => new Dat16ConstantCurve(this), + Dat16RelType.LinearCurve => new Dat16LinearCurve(this), + Dat16RelType.LinearDbCurve => new Dat16LinearDbCurve(this), + Dat16RelType.PiecewiseLinearCurve => new Dat16PiecewiseLinearCurve(this), + Dat16RelType.EqualPowerCurve => new Dat16EqualPowerCurve(this), + Dat16RelType.ValueTableCurve => new Dat16ValueTableCurve(this), + Dat16RelType.ExponentialCurve => new Dat16ExponentialCurve(this), + Dat16RelType.DecayingExponentialCurve => new Dat16DecayingExponentialCurve(this), + Dat16RelType.DecayingSquaredExponentialCurve => new Dat16DecayingSquaredExponentialCurve(this), + Dat16RelType.SineCurve => new Dat16SineCurve(this), + Dat16RelType.OneOverXSquaredCurve => new Dat16OneOverXSquaredCurve(this), + Dat16RelType.DefaultDistanceAttenuationCurve => new Dat16DefaultDistanceAttenuationCurve(this), + Dat16RelType.DistanceAttenuationValueTableCurve => new Dat16DistanceAttenuationValueTableCurve(this), + _ => new Dat16RelData(this),//shouldn't get here + }; case RelDatFileType.Dat22Categories: - switch ((Dat22RelType)dataType) + return (Dat22RelType)dataType switch { - case Dat22RelType.Category: return new Dat22Category(this); - default: - return new Dat22RelData(this);//shouldn't get here - } + Dat22RelType.Category => new Dat22Category(this), + _ => new Dat22RelData(this),//shouldn't get here + }; default: d = new RelData(this); d.TypeID = (byte)dataType; @@ -1014,14 +1027,10 @@ namespace CodeWalker.GameFiles { ntlength += (uint)name.Length + 1; } - if ((NameTableLength != ntlength)&&(NameTableLength!=0)) - { } NameTableLength = ntlength; } else { - if ((NameTableLength != 4)&& (NameTableLength != 0)) - { } NameTableCount = 0; NameTableLength = 4; } @@ -1030,8 +1039,8 @@ namespace CodeWalker.GameFiles } private void BuildDataBlock() { - if (RelDatas == null) return; - if (RelDatasSorted == null) return; + if (RelDatas == null) + return; @@ -1125,22 +1134,19 @@ namespace CodeWalker.GameFiles ms.Position = 0; ms.Read(buf, 0, buf.Length); - if ((DataBlock!=null)&&(DataBlock.Length != buf.Length)) - { } - DataBlock = buf; DataLength = (uint)(DataBlock?.Length ?? 0); } private void BuildIndex() { - if (RelDatas == null) return; - if (RelDatasSorted == null) return; + if (RelDatas == null) + return; //for the correct index ordering, needs to be in order of hashes, but with bits rotated right by 8 (why!?) - var sorted = RelDatasSorted.ToList(); + var sorted = RelDatasSorted.ToArray(); switch (RelType) { case RelDatFileType.Dat15DynamicMixer: @@ -1151,7 +1157,7 @@ namespace CodeWalker.GameFiles case RelDatFileType.Dat22Categories: case RelDatFileType.Dat16Curves: case RelDatFileType.Dat54DataEntries: - sorted.Sort((a, b) => + Array.Sort(sorted, (a, b) => { var ah = (uint)a.NameHash; var bh = (uint)b.NameHash; @@ -1163,11 +1169,11 @@ namespace CodeWalker.GameFiles default: if (!IsAudioConfig)//don't sort audioconfig (only sort speech dat4's) { - sorted.Sort((a, b) => { return ((uint)a.NameHash).CompareTo((uint)b.NameHash); }); + Array.Sort(sorted, (a, b) => ((uint)a.NameHash).CompareTo((uint)b.NameHash)); } break; } - RelDatas = sorted.ToArray(); + RelDatas = sorted; if (IsAudioConfig) @@ -1190,60 +1196,40 @@ namespace CodeWalker.GameFiles var rd = RelDatas[i]; hashes[i] = new RelIndexHash() { Name = rd.NameHash, Offset = rd.DataOffset, Length = rd.DataLength }; } - //if (hashes.Length != IndexHashes.Length) - //{ } IndexHashes = hashes; IndexCount = (uint)(IndexHashes?.Length ?? 0); } } + private void BuildHashTable() { - if (RelDatasSorted == null) return; + if (RelDatas == null) + return; var htoffsets = new List(); foreach (var rd in RelDatasSorted) { var offsets = rd.GetHashTableOffsets(); - if (offsets == null) continue; + if (offsets == null || offsets.Length == 0) + continue; var rdoffset = rd.DataOffset + 8; var rs = rd as RelSound; - var ss = rd as Dat4SpeechData; - if (rs?.Header != null) + if (rs?.Header is not null) { rdoffset += 1 + rs.Header.CalcHeaderLength(); } - else if (ss == null)//don't add 4 for speech! + else if (rd is not Dat4SpeechData ss)//don't add 4 for speech! { rdoffset += 4; //typeid + nt offset } for (int i = 0; i < offsets.Length; i++) { htoffsets.Add(rdoffset + offsets[i]); - - int idx = htoffsets.Count - 1; - if ((HashTableOffsets != null) && (idx < HashTableOffsets.Length)) - { - if (htoffsets[idx] != HashTableOffsets[idx]) - { } - } } } if (htoffsets.Count > 0) { - if (HashTableOffsets != null) - { - if (HashTableOffsets.Length != htoffsets.Count) - { } - else - { - for (int i = 0; i < htoffsets.Count; i++) - { - if (htoffsets[i] != HashTableOffsets[i]) - { } - } - } - } HashTableOffsets = htoffsets.ToArray(); } else @@ -1253,6 +1239,7 @@ namespace CodeWalker.GameFiles HashTableCount = (uint)(HashTableOffsets?.Length ?? 0); } + private void BuildPackTable() { @@ -1260,15 +1247,15 @@ namespace CodeWalker.GameFiles foreach (var rd in RelDatasSorted) { var offsets = rd.GetPackTableOffsets(); - if (offsets == null) continue; + if (offsets.Length == 0) + continue; var rdoffset = rd.DataOffset + 8; var rs = rd as RelSound; - var ss = rd as Dat4SpeechData; - if (rs?.Header != null) + if (rs?.Header is not null) { rdoffset += 1 + rs.Header.CalcHeaderLength(); } - else if (ss == null)//don't add 4 for speech! + else if (rd is not Dat4SpeechData ss)//don't add 4 for speech! { rdoffset += 4; //typeid + nt offset } @@ -1279,19 +1266,6 @@ namespace CodeWalker.GameFiles } if (ptoffsets.Count > 0) { - if (PackTableOffsets != null) - { - if (PackTableOffsets.Length != ptoffsets.Count) - { } - else - { - for (int i = 0; i < ptoffsets.Count; i++) - { - if (ptoffsets[i] != PackTableOffsets[i]) - { } - } - } - } PackTableOffsets = ptoffsets.ToArray(); } else @@ -1321,10 +1295,12 @@ namespace CodeWalker.GameFiles } if (relType != RelDatFileType.Dat4) - { return; } + { + return; + } - if (HashTableOffsets != null) + if (HashTableOffsets != null && HashTableOffsets.Length > 0) { foreach (var htoffset in HashTableOffsets) { @@ -1334,8 +1310,7 @@ namespace CodeWalker.GameFiles if ((dboffset >= rd.DataOffset) && (dboffset < rd.DataOffset + rd.DataLength)) { var rdoffset = rd.DataOffset; - var rs = rd as RelSound; - if (rs != null) + if (rd is RelSound rs) { rdoffset += 1 + rs.Header.HeaderLength; } @@ -1358,7 +1333,7 @@ namespace CodeWalker.GameFiles } } } - if (PackTableOffsets != null) + if (PackTableOffsets != null && PackTableOffsets.Length > 0) { foreach (var wcoffset in PackTableOffsets) { @@ -1368,8 +1343,7 @@ namespace CodeWalker.GameFiles if ((dboffset >= rd.DataOffset) && (dboffset < rd.DataOffset + rd.DataLength)) { var rdoffset = rd.DataOffset; - var rs = rd as RelSound; - if (rs != null) + if (rd is RelSound rs) { rdoffset += 1 + rs.Header.HeaderLength; } @@ -1395,7 +1369,7 @@ namespace CodeWalker.GameFiles } - public struct HashesMapKey + public struct HashesMapKey : IEquatable { public RelDatFileType FileType { get; set; } public uint ItemType { get; set; } @@ -1417,6 +1391,33 @@ namespace CodeWalker.GameFiles return fcstr + ItemType.ToString(); } + + public static bool operator ==(HashesMapKey left, HashesMapKey right) + { + return left.Equals(right); + } + + public static bool operator !=(HashesMapKey left, HashesMapKey right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + return obj is HashesMapKey key && Equals(key); + } + + public bool Equals(HashesMapKey other) + { + return FileType == other.FileType && + ItemType == other.ItemType && + IsContainer == other.IsContainer; + } + + public override int GetHashCode() + { + return HashCode.Combine(FileType, ItemType, IsContainer); + } } public class HashesMapValue { @@ -1427,32 +1428,27 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Offset.ToString() + ": " + Count.ToString(); + return $"{Offset}: {Count}"; } } public static Dictionary> HashesMap { get; set; } = new Dictionary>(); private static void AddHashesMapItem(ref HashesMapKey key, HashesMapValue val) { - List values = null; - if (!HashesMap.TryGetValue(key, out values)) + if (!HashesMap.TryGetValue(key, out var values)) { values = new List(); HashesMap[key] = values; } - if (values != null) + + foreach (var xval in values) { - foreach (var xval in values) + if (xval.Offset == val.Offset) { - if (xval.Offset == val.Offset) - { - xval.Count++; - return;//same key, same offset, it's a match... - } + xval.Count++; + return;//same key, same offset, it's a match... } - values.Add(val); } - else - { } + values.Add(val); } @@ -1468,7 +1464,8 @@ namespace CodeWalker.GameFiles BuildPackTable(); - if (DataBlock == null) return null; + if (DataBlock == null) + return Array.Empty(); @@ -1557,15 +1554,9 @@ namespace CodeWalker.GameFiles ms.Position = 0; ms.Read(buf, 0, buf.Length); return buf; - } - - - - - public void AddRelData(RelData d) { var newRelDatas = new List(); @@ -1581,7 +1572,7 @@ namespace CodeWalker.GameFiles { var newRelDatas = new List(); - if (RelDatas != null) + if (RelDatas is not null && RelDatas.Length > 0) { foreach (var relData in RelDatas) { @@ -1590,13 +1581,13 @@ namespace CodeWalker.GameFiles newRelDatas.Add(relData); } } - } - if (newRelDatas.Count < RelDatas.Length) - { - RelDatas = newRelDatas.ToArray(); - RelDataDict.Remove(d.NameHash); - return true; + if (newRelDatas.Count < RelDatas.Length) + { + RelDatas = newRelDatas.ToArray(); + RelDataDict.Remove(d.NameHash); + return true; + } } return false; @@ -1604,39 +1595,86 @@ namespace CodeWalker.GameFiles - public override string ToString() - { - return Name; - } + public override string ToString() => Name; } - [TC(typeof(EXP))] public struct RelIndexHash + [TC(typeof(EXP))] + public readonly struct RelIndexHash { - public MetaHash Name { get; set; } - public uint Offset { get; set; } - public uint Length { get; set; } + public MetaHash Name { get; init; } + public uint Offset { get; init; } + public uint Length { get; init; } - public override string ToString() + public override readonly string ToString() { - return Name.ToString() + ", " + Offset.ToString() + ", " + Length.ToString(); + return $"{Name}, {Offset}, {Length}"; } } - [TC(typeof(EXP))] public struct RelIndexString + [TC(typeof(EXP))] + public readonly struct RelIndexString { - public string Name { get; set; } - public uint Offset { get; set; } - public uint Length { get; set; } + public string Name { get; init; } + public uint Offset { get; init; } + public uint Length { get; init; } - public override string ToString() + public override readonly string ToString() { - return Name + ", " + Offset.ToString() + ", " + Length.ToString(); + return $"{Name}, {Offset}, {Length}"; + } + } + + public ref struct TempRelData + { + public MetaHash NameHash; + public string Name; + public uint DataOffset; + public uint DataLength; + public byte[] Data; + public byte TypeID; + public RelFile Rel; + + public TempRelData(RelFile rel) + { + Rel = rel; + } + public TempRelData(RelData relData) + { + NameHash = relData.NameHash; + Name = relData.Name; + DataOffset = relData.DataOffset; + DataLength = relData.DataLength; + Data = relData.Data; + TypeID = relData.TypeID; + Rel = relData.Rel; + } + + public TempRelData(in TempRelData relData) + { + NameHash = relData.NameHash; + Name = relData.Name; + DataOffset = relData.DataOffset; + DataLength = relData.DataLength; + Data = relData.Data; + TypeID = relData.TypeID; + Rel = relData.Rel; + } + + public void ReadType(BinaryReader br) + { + TypeID = br.ReadByte(); + } + + public void ReadType(ref SequenceReader br) + { + TypeID = br.ReadByte(); } } - [TC(typeof(EXP))] public class RelData + [TC(typeof(EXP))] + public class RelData { public MetaHash NameHash { get; set; } public string Name { get; set; } @@ -1647,7 +1685,10 @@ namespace CodeWalker.GameFiles public RelFile Rel { get; set; } - public RelData(RelFile rel) { Rel = rel; } + public RelData(RelFile rel) + { + Rel = rel; + } public RelData(RelData d) { NameHash = d.NameHash; @@ -1659,48 +1700,37 @@ namespace CodeWalker.GameFiles Rel = d.Rel; } + public RelData(in TempRelData d) + { + NameHash = d.NameHash; + Name = d.Name; + DataOffset = d.DataOffset; + DataLength = d.DataLength; + Data = d.Data; + TypeID = d.TypeID; + Rel = d.Rel; + } + public void ReadType(BinaryReader br) { TypeID = br.ReadByte(); } - public virtual uint[] GetHashTableOffsets() + public void ReadType(ref SequenceReader br) { - return null; - } - public virtual uint[] GetPackTableOffsets() - { - return null; + TypeID = br.ReadByte(); } - public virtual MetaHash[] GetSpeechHashes() - { - return null; - } - public virtual MetaHash[] GetSynthHashes() - { - return null; - } - public virtual MetaHash[] GetMixerHashes() - { - return null; - } - public virtual MetaHash[] GetCurveHashes() - { - return null; - } - public virtual MetaHash[] GetCategoryHashes() - { - return null; - } - public virtual MetaHash[] GetSoundHashes() - { - return null; - } - public virtual MetaHash[] GetGameHashes() - { - return null; - } + public virtual uint[] GetHashTableOffsets() => []; + public virtual uint[] GetPackTableOffsets() => []; + + public virtual MetaHash[] GetSpeechHashes() => []; + public virtual MetaHash[] GetSynthHashes() => []; + public virtual MetaHash[] GetMixerHashes() => []; + public virtual MetaHash[] GetCurveHashes() => []; + public virtual MetaHash[] GetCategoryHashes() => []; + public virtual MetaHash[] GetSoundHashes() => []; + public virtual MetaHash[] GetGameHashes() => []; public virtual void Write(BinaryWriter bw) @@ -1729,15 +1759,15 @@ namespace CodeWalker.GameFiles public string GetNameString() { - return (string.IsNullOrEmpty(Name)) ? NameHash.ToString() : Name; + return string.IsNullOrEmpty(Name) ? NameHash.ToString() : Name; } public string GetBaseString() { - return DataOffset.ToString() + ", " + DataLength.ToString() + ": " + GetNameString(); + return $"{DataOffset}, {DataLength}: {GetNameString()}"; } public override string ToString() { - return GetBaseString() + ": " + TypeID.ToString(); + return $"{GetBaseString()}: {TypeID}"; } public static bool Bit(uint f, int b) @@ -1748,6 +1778,17 @@ namespace CodeWalker.GameFiles { return ((f < -15000) || (f > 15000)); } + + + public static explicit operator RelData(TempRelData h) + { + return new RelData(in h); //implicit conversion + } + + public static explicit operator TempRelData(RelData d) + { + return new TempRelData(d); + } } @@ -1757,50 +1798,98 @@ namespace CodeWalker.GameFiles - [TC(typeof(EXP))] public class RelSoundHeader + [TC(typeof(EXP))] + public class RelSoundHeader : IEquatable { - public FlagsUint Flags { get; set; } + public FlagsUint Flags { get; init; } - public FlagsUint Flags2 { get; set; } - public ushort Unk01 { get; set; } - public short Volume { get; set; } - public ushort VolumeVariance { get; set; } //0xD-0xF - public short Pitch { get; set; } //0xF-0x11 - public ushort PitchVariance { get; set; } //0x11-0x13 - public ushort Pan { get; set; } //0x13-0x15 - public ushort PanVariance { get; set; } //0x15-0x17 - public short PreDelay { get; set; } //0x17-0x19 - public ushort PreDelayVariance { get; set; } //0x19-0x1B - public int StartOffset { get; set; } //0x1B-0x1F - public int StartOffsetVariance { get; set; } //0x1F-0x23 - public ushort AttackTime { get; set; } //0x23-0x25 - public ushort ReleaseTime { get; set; } //0x25-0x27 - public ushort DopplerFactor { get; set; } //0x27-0x29 - public MetaHash Category { get; set; } //0x29-0x2D - public ushort LPFCutoff { get; set; } //0x2D-0x2F - public ushort LPFCutoffVariance { get; set; } //0x2F-0x31 - public ushort HPFCutoff { get; set; } //0x31-0x33 - public ushort HPFCutoffVariance { get; set; } //0x33-0x35 - public MetaHash VolumeCurve { get; set; } //0x35-0x39 - public short VolumeCurveScale { get; set; } //0x39-0x3B - public byte VolumeCurvePlateau { get; set; } //0x3B-0x3C - public byte Unk20 { get; set; } //0x3C-0x3D - public byte Unk21 { get; set; } //0x3D-0x3E - public MetaHash PreDelayVariable { get; set; } //0x3E-0x42 - public MetaHash StartOffsetVariable { get; set; } //0x42-0x46 - public ushort Unk22 { get; set; } //0x46-0x48 - public ushort Unk23 { get; set; } //0x48-0x4A - public ushort Unk24 { get; set; } //0x4A-0x4C - public ushort Unk25 { get; set; } //0x4A-0x4C - public ushort Unk26 { get; set; } //0x4A-0x4C + public FlagsUint Flags2 { get; init; } + public ushort Unk01 { get; init; } + public short Volume { get; init; } + public ushort VolumeVariance { get; init; } //0xD-0xF + public short Pitch { get; init; } //0xF-0x11 + public ushort PitchVariance { get; init; } //0x11-0x13 + public ushort Pan { get; init; } //0x13-0x15 + public ushort PanVariance { get; init; } //0x15-0x17 + public short PreDelay { get; init; } //0x17-0x19 + public ushort PreDelayVariance { get; init; } //0x19-0x1B + public int StartOffset { get; init; } //0x1B-0x1F + public int StartOffsetVariance { get; init; } //0x1F-0x23 + public ushort AttackTime { get; init; } //0x23-0x25 + public ushort ReleaseTime { get; init; } //0x25-0x27 + public ushort DopplerFactor { get; init; } //0x27-0x29 + public MetaHash Category { get; init; } //0x29-0x2D + public ushort LPFCutoff { get; init; } //0x2D-0x2F + public ushort LPFCutoffVariance { get; init; } //0x2F-0x31 + public ushort HPFCutoff { get; init; } //0x31-0x33 + public ushort HPFCutoffVariance { get; init; } //0x33-0x35 + public MetaHash VolumeCurve { get; init; } //0x35-0x39 + public short VolumeCurveScale { get; init; } //0x39-0x3B + public byte VolumeCurvePlateau { get; init; } //0x3B-0x3C + public byte Unk20 { get; init; } //0x3C-0x3D + public byte Unk21 { get; init; } //0x3D-0x3E + public MetaHash PreDelayVariable { get; init; } //0x3E-0x42 + public MetaHash StartOffsetVariable { get; init; } //0x42-0x46 + public ushort Unk22 { get; init; } //0x46-0x48 + public ushort Unk23 { get; init; } //0x48-0x4A + public ushort Unk24 { get; init; } //0x4A-0x4C + public ushort Unk25 { get; init; } //0x4A-0x4C + public ushort Unk26 { get; init; } //0x4A-0x4C - public uint HeaderLength { get; set; } = 0; + public uint HeaderLength { get; init; } = 0; public RelSoundHeader(XmlNode node) { ReadXml(node); HeaderLength = CalcHeaderLength(); + + Flags = Xml.GetChildUIntAttribute(node, "Flags", "value"); + + if ((Flags & 0xFF) != 0xAA) + { + if (Bit(0)) Flags2 = Xml.GetChildUIntAttribute(node, "Flags2", "value"); + if (Bit(1)) Unk01 = (ushort)Xml.GetChildUIntAttribute(node, "Unk01", "value"); + if (Bit(2)) Volume = (short)Xml.GetChildIntAttribute(node, "Volume", "value"); + if (Bit(3)) VolumeVariance = (ushort)Xml.GetChildUIntAttribute(node, "VolumeVariance", "value"); + if (Bit(4)) Pitch = (short)Xml.GetChildIntAttribute(node, "Pitch", "value"); + if (Bit(5)) PitchVariance = (ushort)Xml.GetChildUIntAttribute(node, "PitchVariance", "value"); + if (Bit(6)) Pan = (ushort)Xml.GetChildUIntAttribute(node, "Pan", "value"); + if (Bit(7)) PanVariance = (ushort)Xml.GetChildUIntAttribute(node, "PanVariance", "value"); + } + if ((Flags & 0xFF00) != 0xAA00) + { + if (Bit(8)) PreDelay = (short)Xml.GetChildIntAttribute(node, "PreDelay", "value"); + if (Bit(9)) PreDelayVariance = (ushort)Xml.GetChildUIntAttribute(node, "PreDelayVariance", "value"); + if (Bit(10)) StartOffset = Xml.GetChildIntAttribute(node, "StartOffset", "value"); + if (Bit(11)) StartOffsetVariance = Xml.GetChildIntAttribute(node, "StartOffsetVariance", "value"); + if (Bit(12)) AttackTime = (ushort)Xml.GetChildUIntAttribute(node, "AttackTime", "value"); + if (Bit(13)) ReleaseTime = (ushort)Xml.GetChildUIntAttribute(node, "ReleaseTime", "value"); + if (Bit(14)) DopplerFactor = (ushort)Xml.GetChildUIntAttribute(node, "DopplerFactor", "value"); + if (Bit(15)) Category = XmlRel.GetHash(Xml.GetChildInnerText(node, "Category")); + } + if ((Flags & 0xFF0000) != 0xAA0000) + { + if (Bit(16)) LPFCutoff = (ushort)Xml.GetChildUIntAttribute(node, "LPFCutoff", "value"); + if (Bit(17)) LPFCutoffVariance = (ushort)Xml.GetChildUIntAttribute(node, "LPFCutoffVariance", "value"); + if (Bit(18)) HPFCutoff = (ushort)Xml.GetChildUIntAttribute(node, "HPFCutoff", "value"); + if (Bit(19)) HPFCutoffVariance = (ushort)Xml.GetChildUIntAttribute(node, "HPFCutoffVariance", "value"); + if (Bit(20)) VolumeCurve = XmlRel.GetHash(Xml.GetChildInnerText(node, "VolumeCurve")); + if (Bit(21)) VolumeCurveScale = (short)Xml.GetChildIntAttribute(node, "VolumeCurveScale", "value"); + if (Bit(22)) VolumeCurvePlateau = (byte)Xml.GetChildUIntAttribute(node, "VolumeCurvePlateau", "value"); + if (Bit(23)) Unk20 = (byte)Xml.GetChildUIntAttribute(node, "Unk20", "value"); + } + if ((Flags & 0xFF000000) != 0xAA000000) + { + if (Bit(24)) Unk21 = (byte)Xml.GetChildUIntAttribute(node, "Unk21", "value"); + if (Bit(25)) PreDelayVariable = XmlRel.GetHash(Xml.GetChildInnerText(node, "PreDelayVariable")); + if (Bit(26)) StartOffsetVariable = XmlRel.GetHash(Xml.GetChildInnerText(node, "StartOffsetVariable")); + if (Bit(27)) Unk22 = (ushort)Xml.GetChildUIntAttribute(node, "Unk22", "value"); + if (Bit(28)) Unk23 = (ushort)Xml.GetChildUIntAttribute(node, "Unk23", "value"); + if (Bit(29)) Unk24 = (ushort)Xml.GetChildUIntAttribute(node, "Unk24", "value"); + if (Bit(30)) Unk25 = (ushort)Xml.GetChildUIntAttribute(node, "Unk25", "value"); + if (Bit(31)) Unk26 = (ushort)Xml.GetChildUIntAttribute(node, "Unk26", "value"); + } } public RelSoundHeader(BinaryReader br) { @@ -1858,6 +1947,61 @@ namespace CodeWalker.GameFiles } + public RelSoundHeader(ref SequenceReader br) + { + var pos = br.Consumed; + + Flags = br.ReadUInt32(); + + //if (Flags.Value != 0xAAAAAAAA) + if ((Flags & 0xFF) != 0xAA) + { + if (Bit(0)) Flags2 = br.ReadUInt32(); + if (Bit(1)) Unk01 = br.ReadUInt16(); + if (Bit(2)) Volume = br.ReadInt16(); + if (Bit(3)) VolumeVariance = br.ReadUInt16(); + if (Bit(4)) Pitch = br.ReadInt16(); + if (Bit(5)) PitchVariance = br.ReadUInt16(); + if (Bit(6)) Pan = br.ReadUInt16(); + if (Bit(7)) PanVariance = br.ReadUInt16(); + } + if ((Flags & 0xFF00) != 0xAA00) + { + if (Bit(8)) PreDelay = br.ReadInt16(); + if (Bit(9)) PreDelayVariance = br.ReadUInt16(); + if (Bit(10)) StartOffset = br.ReadInt32(); + if (Bit(11)) StartOffsetVariance = br.ReadInt32(); + if (Bit(12)) AttackTime = br.ReadUInt16(); + if (Bit(13)) ReleaseTime = br.ReadUInt16(); + if (Bit(14)) DopplerFactor = br.ReadUInt16(); + if (Bit(15)) Category = br.ReadUInt32(); + } + if ((Flags & 0xFF0000) != 0xAA0000) + { + if (Bit(16)) LPFCutoff = br.ReadUInt16(); + if (Bit(17)) LPFCutoffVariance = br.ReadUInt16(); + if (Bit(18)) HPFCutoff = br.ReadUInt16(); + if (Bit(19)) HPFCutoffVariance = br.ReadUInt16(); + if (Bit(20)) VolumeCurve = br.ReadUInt32(); + if (Bit(21)) VolumeCurveScale = br.ReadInt16(); + if (Bit(22)) VolumeCurvePlateau = br.ReadByte(); + if (Bit(23)) Unk20 = br.ReadByte(); + } + if ((Flags & 0xFF000000) != 0xAA000000) + { + if (Bit(24)) Unk21 = br.ReadByte(); + if (Bit(25)) PreDelayVariable = br.ReadUInt32(); + if (Bit(26)) StartOffsetVariable = br.ReadUInt32(); + if (Bit(27)) Unk22 = br.ReadUInt16(); + if (Bit(28)) Unk23 = br.ReadUInt16(); + if (Bit(29)) Unk24 = br.ReadUInt16(); + if (Bit(30)) Unk25 = br.ReadUInt16(); //maybe not + if (Bit(31)) Unk26 = br.ReadUInt16(); //maybe not + } + + HeaderLength = (uint)(br.Consumed - pos); + } + public void Write(BinaryWriter bw) { bw.Write(Flags); @@ -1962,52 +2106,7 @@ namespace CodeWalker.GameFiles } public void ReadXml(XmlNode node) { - Flags = Xml.GetChildUIntAttribute(node, "Flags", "value"); - if ((Flags & 0xFF) != 0xAA) - { - if (Bit(0)) Flags2 = Xml.GetChildUIntAttribute(node, "Flags2", "value"); - if (Bit(1)) Unk01 = (ushort)Xml.GetChildUIntAttribute(node, "Unk01", "value"); - if (Bit(2)) Volume = (short)Xml.GetChildIntAttribute(node, "Volume", "value"); - if (Bit(3)) VolumeVariance = (ushort)Xml.GetChildUIntAttribute(node, "VolumeVariance", "value"); - if (Bit(4)) Pitch = (short)Xml.GetChildIntAttribute(node, "Pitch", "value"); - if (Bit(5)) PitchVariance = (ushort)Xml.GetChildUIntAttribute(node, "PitchVariance", "value"); - if (Bit(6)) Pan = (ushort)Xml.GetChildUIntAttribute(node, "Pan", "value"); - if (Bit(7)) PanVariance = (ushort)Xml.GetChildUIntAttribute(node, "PanVariance", "value"); - } - if ((Flags & 0xFF00) != 0xAA00) - { - if (Bit(8)) PreDelay = (short)Xml.GetChildIntAttribute(node, "PreDelay", "value"); - if (Bit(9)) PreDelayVariance = (ushort)Xml.GetChildUIntAttribute(node, "PreDelayVariance", "value"); - if (Bit(10)) StartOffset = Xml.GetChildIntAttribute(node, "StartOffset", "value"); - if (Bit(11)) StartOffsetVariance = Xml.GetChildIntAttribute(node, "StartOffsetVariance", "value"); - if (Bit(12)) AttackTime = (ushort)Xml.GetChildUIntAttribute(node, "AttackTime", "value"); - if (Bit(13)) ReleaseTime = (ushort)Xml.GetChildUIntAttribute(node, "ReleaseTime", "value"); - if (Bit(14)) DopplerFactor = (ushort)Xml.GetChildUIntAttribute(node, "DopplerFactor", "value"); - if (Bit(15)) Category = XmlRel.GetHash(Xml.GetChildInnerText(node, "Category")); - } - if ((Flags & 0xFF0000) != 0xAA0000) - { - if (Bit(16)) LPFCutoff = (ushort)Xml.GetChildUIntAttribute(node, "LPFCutoff", "value"); - if (Bit(17)) LPFCutoffVariance = (ushort)Xml.GetChildUIntAttribute(node, "LPFCutoffVariance", "value"); - if (Bit(18)) HPFCutoff = (ushort)Xml.GetChildUIntAttribute(node, "HPFCutoff", "value"); - if (Bit(19)) HPFCutoffVariance = (ushort)Xml.GetChildUIntAttribute(node, "HPFCutoffVariance", "value"); - if (Bit(20)) VolumeCurve = XmlRel.GetHash(Xml.GetChildInnerText(node, "VolumeCurve")); - if (Bit(21)) VolumeCurveScale = (short)Xml.GetChildIntAttribute(node, "VolumeCurveScale", "value"); - if (Bit(22)) VolumeCurvePlateau = (byte)Xml.GetChildUIntAttribute(node, "VolumeCurvePlateau", "value"); - if (Bit(23)) Unk20 = (byte)Xml.GetChildUIntAttribute(node, "Unk20", "value"); - } - if ((Flags & 0xFF000000) != 0xAA000000) - { - if (Bit(24)) Unk21 = (byte)Xml.GetChildUIntAttribute(node, "Unk21", "value"); - if (Bit(25)) PreDelayVariable = XmlRel.GetHash(Xml.GetChildInnerText(node, "PreDelayVariable")); - if (Bit(26)) StartOffsetVariable = XmlRel.GetHash(Xml.GetChildInnerText(node, "StartOffsetVariable")); - if (Bit(27)) Unk22 = (ushort)Xml.GetChildUIntAttribute(node, "Unk22", "value"); - if (Bit(28)) Unk23 = (ushort)Xml.GetChildUIntAttribute(node, "Unk23", "value"); - if (Bit(29)) Unk24 = (ushort)Xml.GetChildUIntAttribute(node, "Unk24", "value"); - if (Bit(30)) Unk25 = (ushort)Xml.GetChildUIntAttribute(node, "Unk25", "value"); - if (Bit(31)) Unk26 = (ushort)Xml.GetChildUIntAttribute(node, "Unk26", "value"); - } } @@ -2070,7 +2169,100 @@ namespace CodeWalker.GameFiles public override string ToString() { - return string.Format("{0}: {1}, {2}, {3}, {4}, {5}, {6}, {7}", Flags.Hex, Flags2.Hex, Category, StartOffset, StartOffsetVariance, VolumeCurve, PreDelayVariable, StartOffsetVariable); + return $"{Flags.Hex}: {Flags2.Hex}, {Category}, {StartOffset}, {StartOffsetVariance}, {VolumeCurve}, {PreDelayVariable}, {StartOffsetVariable}"; + } + + public override bool Equals(object? obj) + { + return obj is RelSoundHeader header && Equals(header); + } + + public bool Equals(RelSoundHeader other) + { + return Flags.Equals(other.Flags) && + Flags2.Equals(other.Flags2) && + Unk01 == other.Unk01 && + Volume == other.Volume && + VolumeVariance == other.VolumeVariance && + Pitch == other.Pitch && + PitchVariance == other.PitchVariance && + Pan == other.Pan && + PanVariance == other.PanVariance && + PreDelay == other.PreDelay && + PreDelayVariance == other.PreDelayVariance && + StartOffset == other.StartOffset && + StartOffsetVariance == other.StartOffsetVariance && + AttackTime == other.AttackTime && + ReleaseTime == other.ReleaseTime && + DopplerFactor == other.DopplerFactor && + Category.Equals(other.Category) && + LPFCutoff == other.LPFCutoff && + LPFCutoffVariance == other.LPFCutoffVariance && + HPFCutoff == other.HPFCutoff && + HPFCutoffVariance == other.HPFCutoffVariance && + VolumeCurve.Equals(other.VolumeCurve) && + VolumeCurveScale == other.VolumeCurveScale && + VolumeCurvePlateau == other.VolumeCurvePlateau && + Unk20 == other.Unk20 && + Unk21 == other.Unk21 && + PreDelayVariable.Equals(other.PreDelayVariable) && + StartOffsetVariable.Equals(other.StartOffsetVariable) && + Unk22 == other.Unk22 && + Unk23 == other.Unk23 && + Unk24 == other.Unk24 && + Unk25 == other.Unk25 && + Unk26 == other.Unk26 && + HeaderLength == other.HeaderLength; + } + + public override int GetHashCode() + { + HashCode hash = new HashCode(); + hash.Add(Flags); + hash.Add(Flags2); + hash.Add(Unk01); + hash.Add(Volume); + hash.Add(VolumeVariance); + hash.Add(Pitch); + hash.Add(PitchVariance); + hash.Add(Pan); + hash.Add(PanVariance); + hash.Add(PreDelay); + hash.Add(PreDelayVariance); + hash.Add(StartOffset); + hash.Add(StartOffsetVariance); + hash.Add(AttackTime); + hash.Add(ReleaseTime); + hash.Add(DopplerFactor); + hash.Add(Category); + hash.Add(LPFCutoff); + hash.Add(LPFCutoffVariance); + hash.Add(HPFCutoff); + hash.Add(HPFCutoffVariance); + hash.Add(VolumeCurve); + hash.Add(VolumeCurveScale); + hash.Add(VolumeCurvePlateau); + hash.Add(Unk20); + hash.Add(Unk21); + hash.Add(PreDelayVariable); + hash.Add(StartOffsetVariable); + hash.Add(Unk22); + hash.Add(Unk23); + hash.Add(Unk24); + hash.Add(Unk25); + hash.Add(Unk26); + hash.Add(HeaderLength); + return hash.ToHashCode(); + } + + public static bool operator ==(RelSoundHeader left, RelSoundHeader right) + { + return left.Equals(right); + } + + public static bool operator !=(RelSoundHeader left, RelSoundHeader right) + { + return !(left == right); } } @@ -2080,25 +2272,51 @@ namespace CodeWalker.GameFiles public byte ChildSoundsCount { get; set; } public RelData[] ChildSounds { get; set; } public MetaHash[] ChildSoundsHashes { get; set; } - public MetaHash[] AudioContainers { get; set; } //Relative path to parent wave container (i.e. "RESIDENT/animals") + public virtual MetaHash[] AudioContainers => []; //Relative path to parent wave container (i.e. "RESIDENT/animals") public RelSound(RelFile rel) : base(rel) { } - public RelSound(RelData d, BinaryReader br) : base(d) + public RelSound(in TempRelData d, BinaryReader br) : base(in d) { Header = new RelSoundHeader(br); } + public RelSound(in TempRelData d, ref SequenceReader reader) : base(in d) + { + Header = new RelSoundHeader(ref reader); + } + public void ReadChildSoundsHashes(BinaryReader br) { ChildSoundsCount = br.ReadByte(); + if (ChildSoundsCount == 0) + { + ChildSoundsHashes = []; + return; + } ChildSoundsHashes = new MetaHash[ChildSoundsCount]; for (int i = 0; i < ChildSoundsCount; i++) { ChildSoundsHashes[i] = br.ReadUInt32(); } } + + public void ReadChildSoundsHashes(ref SequenceReader reader) + { + ChildSoundsCount = reader.ReadByte(); + if (ChildSoundsCount == 0) + { + ChildSoundsHashes = []; + return; + } + ChildSoundsHashes = new MetaHash[ChildSoundsCount]; + for (int i = 0; i < ChildSoundsCount; i++) + { + ChildSoundsHashes[i] = reader.ReadUInt32(); + } + } + public void WriteChildSoundsHashes(BinaryWriter bw) { bw.Write(ChildSoundsCount); @@ -2111,7 +2329,10 @@ namespace CodeWalker.GameFiles public override void Write(BinaryWriter bw) { bw.Write(TypeID); - Header?.Write(bw); + if (Header is not null) + { + Header.Write(bw); + } } public override void WriteXml(StringBuilder sb, int indent) @@ -2122,7 +2343,7 @@ namespace CodeWalker.GameFiles public void WriteHeaderXml(StringBuilder sb, int indent) { - if (Header == null) return; + if (Header is null) return; RelXml.OpenTag(sb, indent, "Header");// flags=\"0x" + Header.Flags.Hex + "\""); Header.WriteXml(sb, indent + 1); RelXml.CloseTag(sb, indent, "Header"); @@ -2130,7 +2351,8 @@ namespace CodeWalker.GameFiles public void WriteChildSoundsXml(StringBuilder sb, int indent, string nodeName = "ChildSounds") { - if (ChildSoundsHashes == null) return; + if (ChildSoundsHashes is null) + return; if (ChildSoundsHashes.Length > 0) { RelXml.OpenTag(sb, indent, nodeName); @@ -2151,7 +2373,8 @@ namespace CodeWalker.GameFiles public void ReadHeaderXml(XmlNode node) { var hnode = node.SelectSingleNode("Header"); - if (hnode == null) return; + if (hnode is null) + return; Header = new RelSoundHeader(hnode); } @@ -2159,10 +2382,11 @@ namespace CodeWalker.GameFiles public void ReadChildSoundsXml(XmlNode node, string nodeName = "ChildSounds") { var atnode = node.SelectSingleNode(nodeName); - if (atnode == null) return; + if (atnode is null) + return; var childnodes = atnode.SelectNodes("Item"); - var childlist = new List(); + using var childlist = new PooledList(); foreach (XmlNode childnode in childnodes) { childlist.Add(XmlRel.GetHash(childnode.InnerText)); @@ -2173,12 +2397,16 @@ namespace CodeWalker.GameFiles public uint[] GetChildSoundsHashTableOffsets(uint offset = 0) { - var offsets = new List(); + if (ChildSoundsCount == 0) + return []; + + var offsets = new uint[ChildSoundsCount]; for (uint i = 0; i < ChildSoundsCount; i++) { - offsets.Add(offset + 1 + i * 4); + offsets[i] = offset + 1 + i * 4; } - return offsets.ToArray(); + + return offsets; } public override MetaHash[] GetSoundHashes() @@ -2187,12 +2415,14 @@ namespace CodeWalker.GameFiles } public override MetaHash[] GetCurveHashes() { - if ((Header != null) && (Header.VolumeCurve != 0)) return new[] { Header.VolumeCurve }; + if (Header is not null && Header.VolumeCurve != 0) + return new[] { Header.VolumeCurve }; return null; } public override MetaHash[] GetCategoryHashes() { - if ((Header != null) && (Header.Category != 0)) return new[] { Header.Category }; + if (Header is not null && Header.Category != 0) + return new[] { Header.Category }; return null; } } @@ -2247,7 +2477,12 @@ namespace CodeWalker.GameFiles Type = t; TypeID = (byte)t; } - public Dat54Sound(RelData d, BinaryReader br) : base(d, br) + public Dat54Sound(in TempRelData d, BinaryReader br) : base(in d, br) + { + Type = (Dat54SoundType)TypeID; + } + + public Dat54Sound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) { Type = (Dat54SoundType)TypeID; } @@ -2281,7 +2516,7 @@ namespace CodeWalker.GameFiles public Dat54LoopingSound(RelFile rel) : base(rel, Dat54SoundType.LoopingSound) { } - public Dat54LoopingSound(RelData d, BinaryReader br) : base(d, br) + public Dat54LoopingSound(in TempRelData d, BinaryReader br) : base(in d, br) { LoopCount = br.ReadInt16(); LoopCountVariance = br.ReadInt16(); @@ -2290,6 +2525,17 @@ namespace CodeWalker.GameFiles ChildSoundsHashes = new[] { ChildSound }; LoopCountVariable = br.ReadUInt32(); } + + public Dat54LoopingSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + LoopCount = reader.ReadInt16(); + LoopCountVariance = reader.ReadInt16(); + LoopPoint = reader.ReadInt16(); + ChildSound = reader.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound }; + LoopCountVariable = reader.ReadUInt32(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2350,7 +2596,7 @@ namespace CodeWalker.GameFiles public Dat54EnvelopeSound(RelFile rel) : base(rel, Dat54SoundType.EnvelopeSound) { } - public Dat54EnvelopeSound(RelData d, BinaryReader br) : base(d, br) + public Dat54EnvelopeSound(in TempRelData d, BinaryReader br) : base(in d, br) { Attack = br.ReadUInt16(); //0x0-0x2 AttackVariance = br.ReadUInt16(); //0x2-0x4 @@ -2377,6 +2623,35 @@ namespace CodeWalker.GameFiles OutputRangeMax = br.ReadSingle(); //0x48-0x4C ChildSoundsHashes = new[] { ChildSound }; } + + public Dat54EnvelopeSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + Attack = reader.ReadUInt16(); //0x0-0x2 + AttackVariance = reader.ReadUInt16(); //0x2-0x4 + Decay = reader.ReadUInt16(); //0x4-0x6 + DecayVariance = reader.ReadUInt16(); //0x6-0x8 + Sustain = reader.ReadByte(); //0x8-0x9 + SustainVariance = reader.ReadByte(); //0x9-0xA + Hold = reader.ReadInt32(); //0xA-0xE + HoldVariance = reader.ReadUInt16(); //0xE-0x10 + Release = reader.ReadInt32(); //0x10-0x14 + ReleaseVariance = reader.ReadInt32(); //0x14-0x18 + AttackCurve = reader.ReadUInt32(); //0x18-0x1C + DecayCurve = reader.ReadUInt32(); //0x1C-0x20 + ReleaseCurve = reader.ReadUInt32(); //0x20-0x24 + AttackVariable = reader.ReadUInt32(); //0x24-0x28 + DecayVariable = reader.ReadUInt32(); //0x28-0x2C + SustainVariable = reader.ReadUInt32(); //0x2C-0x30 + HoldVariable = reader.ReadUInt32(); //0x30-0x34 + ReleaseVariable = reader.ReadUInt32(); //0x34-0x38 + ChildSound = reader.ReadUInt32(); //0x38-0x3C + Mode = reader.ReadInt32(); //0x3C-0x40 + OutputVariable = reader.ReadUInt32(); //0x40-0x44 + OutputRangeMin = reader.ReadSingle(); //0x44-0x48 + OutputRangeMax = reader.ReadSingle(); //0x48-0x4C + ChildSoundsHashes = new[] { ChildSound }; + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2481,7 +2756,7 @@ namespace CodeWalker.GameFiles public Dat54TwinLoopSound(RelFile rel) : base(rel, Dat54SoundType.TwinLoopSound) { } - public Dat54TwinLoopSound(RelData d, BinaryReader br) : base(d, br) + public Dat54TwinLoopSound(in TempRelData d, BinaryReader br) : base(in d, br) { MinSwapTime = br.ReadUInt16(); MaxSwapTime = br.ReadUInt16(); @@ -2495,6 +2770,22 @@ namespace CodeWalker.GameFiles ReadChildSoundsHashes(br); } + + public Dat54TwinLoopSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + MinSwapTime = reader.ReadUInt16(); + MaxSwapTime = reader.ReadUInt16(); + MinCrossfadeTime = reader.ReadUInt16(); + MaxCrossfadeTime = reader.ReadUInt16(); + CrossfadeCurve = reader.ReadUInt32(); + MinSwapTimeVariable = reader.ReadUInt32(); + MaxSwapTimeVariable = reader.ReadUInt32(); + MinCrossfadeTimeVariable = reader.ReadUInt32(); + MaxCrossfadeTimeVariable = reader.ReadUInt32(); + + ReadChildSoundsHashes(ref reader); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2556,13 +2847,22 @@ namespace CodeWalker.GameFiles public Dat54SpeechSound(RelFile rel) : base(rel, Dat54SoundType.SpeechSound) { } - public Dat54SpeechSound(RelData d, BinaryReader br) : base(d, br) + public Dat54SpeechSound(in TempRelData d, BinaryReader br) : base(in d, br) { LastVariation = br.ReadInt32(); SpeechUnkInt1 = br.ReadInt32(); VoiceName = br.ReadUInt32(); ContextName = br.ReadString(); } + + public Dat54SpeechSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + LastVariation = br.ReadInt32(); + SpeechUnkInt1 = br.ReadInt32(); + VoiceName = br.ReadUInt32(); + ContextName = br.ReadString(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2596,13 +2896,22 @@ namespace CodeWalker.GameFiles public Dat54OnStopSound(RelFile rel) : base(rel, Dat54SoundType.OnStopSound) { } - public Dat54OnStopSound(RelData d, BinaryReader br) : base(d, br) + public Dat54OnStopSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChildSound = br.ReadUInt32(); StopSound = br.ReadUInt32(); FinishedSound = br.ReadUInt32(); ChildSoundsHashes = new[] { ChildSound, StopSound, FinishedSound }; } + + public Dat54OnStopSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ChildSound = br.ReadUInt32(); + StopSound = br.ReadUInt32(); + FinishedSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound, StopSound, FinishedSound }; + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2641,13 +2950,22 @@ namespace CodeWalker.GameFiles public Dat54WrapperSound(RelFile rel) : base(rel, Dat54SoundType.WrapperSound) { } - public Dat54WrapperSound(RelData d, BinaryReader br) : base(d, br) + public Dat54WrapperSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChildSound = br.ReadUInt32(); LastPlayTime = br.ReadInt32(); FallBackSound = br.ReadUInt32(); MinRepeatTime = br.ReadInt16(); VariableCount = br.ReadByte(); + ChildSoundsHashes = [ChildSound, FallBackSound]; + + if (VariableCount == 0) + { + VariableNames = []; + VariableValues = []; + return; + } + VariableNames = new MetaHash[VariableCount]; VariableValues = new byte[VariableCount]; for (int i = 0; i < VariableCount; i++) @@ -2655,9 +2973,33 @@ namespace CodeWalker.GameFiles VariableNames[i] = br.ReadUInt32(); VariableValues[i] = br.ReadByte(); } - - ChildSoundsHashes = new[] { ChildSound, FallBackSound }; } + + public Dat54WrapperSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + ChildSound = reader.ReadUInt32(); + LastPlayTime = reader.ReadInt32(); + FallBackSound = reader.ReadUInt32(); + MinRepeatTime = reader.ReadInt16(); + VariableCount = reader.ReadByte(); + ChildSoundsHashes = [ChildSound, FallBackSound]; + + if (VariableCount == 0) + { + VariableNames = []; + VariableValues = []; + return; + } + + VariableNames = new MetaHash[VariableCount]; + VariableValues = new byte[VariableCount]; + for (int i = 0; i < VariableCount; i++) + { + VariableNames[i] = reader.ReadUInt32(); + VariableValues[i] = reader.ReadByte(); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2666,13 +3008,13 @@ namespace CodeWalker.GameFiles FallBackSound = XmlRel.GetHash(Xml.GetChildInnerText(node, "FallBackSound")); MinRepeatTime = (short)Xml.GetChildIntAttribute(node, "MinRepeatTime", "value"); var vnode = node.SelectSingleNode("Variables"); - if (vnode != null) + if (vnode is not null) { var inodes = vnode.SelectNodes("Item"); if (inodes?.Count > 0) { - var nlist = new List(); - var vlist = new List(); + using var nlist = new PooledList(); + using var vlist = new PooledList(); foreach (XmlNode inode in inodes) { nlist.Add(XmlRel.GetHash(Xml.GetStringAttribute(inode, "name"))); @@ -2725,17 +3067,23 @@ namespace CodeWalker.GameFiles } public override uint[] GetHashTableOffsets() { - return new uint[] { 0, 8 }; + return [ 0, 8 ]; } } [TC(typeof(EXP))] public class Dat54SequentialSound : Dat54Sound { public Dat54SequentialSound(RelFile rel) : base(rel, Dat54SoundType.SequentialSound) { } - public Dat54SequentialSound(RelData d, BinaryReader br) : base(d, br) + public Dat54SequentialSound(in TempRelData d, BinaryReader br) : base(in d, br) { ReadChildSoundsHashes(br); } + + public Dat54SequentialSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ReadChildSoundsHashes(ref br); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2762,12 +3110,20 @@ namespace CodeWalker.GameFiles public Dat54StreamingSound(RelFile rel) : base(rel, Dat54SoundType.StreamingSound) { } - public Dat54StreamingSound(RelData d, BinaryReader br) : base(d, br) + public Dat54StreamingSound(in TempRelData d, BinaryReader br) : base(in d, br) { Duration = br.ReadInt32(); ReadChildSoundsHashes(br); } + + public Dat54StreamingSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + Duration = reader.ReadInt32(); + + ReadChildSoundsHashes(ref reader); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2805,7 +3161,7 @@ namespace CodeWalker.GameFiles public Dat54RetriggeredOverlappedSound(RelFile rel) : base(rel, Dat54SoundType.RetriggeredOverlappedSound) { } - public Dat54RetriggeredOverlappedSound(RelData d, BinaryReader br) : base(d, br) + public Dat54RetriggeredOverlappedSound(in TempRelData d, BinaryReader br) : base(in d, br) { LoopCount = br.ReadInt16(); LoopCountVariance = br.ReadUInt16(); @@ -2818,6 +3174,21 @@ namespace CodeWalker.GameFiles StopSound = br.ReadUInt32(); ChildSoundsHashes = new[] { StartSound, RetriggerSound, StopSound }; } + + public Dat54RetriggeredOverlappedSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + LoopCount = reader.ReadInt16(); + LoopCountVariance = reader.ReadUInt16(); + DelayTime = reader.ReadUInt16(); + DelayTimeVariance = reader.ReadUInt16(); + LoopCountVariable = reader.ReadUInt32(); + DelayTimeVariable = reader.ReadUInt32(); + StartSound = reader.ReadUInt32(); + RetriggerSound = reader.ReadUInt32(); + StopSound = reader.ReadUInt32(); + ChildSoundsHashes = new[] { StartSound, RetriggerSound, StopSound }; + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2879,7 +3250,7 @@ namespace CodeWalker.GameFiles public Dat54CrossfadeSound(RelFile rel) : base(rel, Dat54SoundType.CrossfadeSound) { } - public Dat54CrossfadeSound(RelData d, BinaryReader br) : base(d, br) + public Dat54CrossfadeSound(in TempRelData d, BinaryReader br) : base(in d, br) { NearSound = br.ReadUInt32(); FarSound = br.ReadUInt32(); @@ -2895,6 +3266,24 @@ namespace CodeWalker.GameFiles HysteresisVariable = br.ReadUInt32(); CrossfadeVariable = br.ReadUInt32(); } + + public Dat54CrossfadeSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + NearSound = br.ReadUInt32(); + FarSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { NearSound, FarSound }; + Mode = br.ReadByte(); + MinDistance = br.ReadSingle(); + MaxDistance = br.ReadSingle(); + Hysteresis = br.ReadInt32(); + CrossfadeCurve = br.ReadUInt32(); + DistanceVariable = br.ReadUInt32(); + MinDistanceVariable = br.ReadUInt32(); + MaxDistanceVariable = br.ReadUInt32(); + HysteresisVariable = br.ReadUInt32(); + CrossfadeVariable = br.ReadUInt32(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -2969,7 +3358,7 @@ namespace CodeWalker.GameFiles public Dat54CollapsingStereoSound(RelFile rel) : base(rel, Dat54SoundType.CollapsingStereoSound) { } - public Dat54CollapsingStereoSound(RelData d, BinaryReader br) : base(d, br) + public Dat54CollapsingStereoSound(in TempRelData d, BinaryReader br) : base(in d, br) { LeftSound = br.ReadUInt32(); RightSound = br.ReadUInt32(); @@ -2985,6 +3374,24 @@ namespace CodeWalker.GameFiles ParameterHash5 = br.ReadUInt32(); //0x28-0x2C Mode = br.ReadByte(); //0x2C-0x2D } + + public Dat54CollapsingStereoSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + LeftSound = reader.ReadUInt32(); + RightSound = reader.ReadUInt32(); + ChildSoundsHashes = new[] { LeftSound, RightSound }; + MinDistance = reader.ReadSingle(); //0x8 + MaxDistance = reader.ReadSingle(); //0xC + MinDistanceVariable = reader.ReadUInt32(); //0x10 + MaxDistanceVariable = reader.ReadUInt32(); //0x14 + CrossfadeOverrideVariable = reader.ReadUInt32(); //0x18 + ParameterHash3 = reader.ReadUInt32(); //0x1C + ParameterHash4 = reader.ReadUInt32(); //0x20 + UnkFloat = reader.ReadSingle(); //0x24-0x28 + ParameterHash5 = reader.ReadUInt32(); //0x28-0x2C + Mode = reader.ReadByte(); //0x2C-0x2D + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3035,7 +3442,7 @@ namespace CodeWalker.GameFiles } public override uint[] GetHashTableOffsets() { - return new uint[] { 0, 4 }; + return [0, 4]; } } [TC(typeof(EXP))] public class Dat54SimpleSound : Dat54Sound @@ -3044,15 +3451,24 @@ namespace CodeWalker.GameFiles public MetaHash FileName { get; set; } //Name of the .wav file public byte WaveSlotIndex { get; set; } //Internal index of wave (.awc) container + public override MetaHash[] AudioContainers => [ ContainerName ]; + public Dat54SimpleSound(RelFile rel) : base(rel, Dat54SoundType.SimpleSound) { } - public Dat54SimpleSound(RelData d, BinaryReader br) : base(d, br) + public Dat54SimpleSound(in TempRelData d, BinaryReader br) : base(in d, br) { ContainerName = br.ReadUInt32(); - AudioContainers = new[] { ContainerName }; FileName = br.ReadUInt32(); WaveSlotIndex = br.ReadByte(); } + + public Dat54SimpleSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + ContainerName = reader.ReadUInt32(); + FileName = reader.ReadUInt32(); + WaveSlotIndex = reader.ReadByte(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3076,17 +3492,23 @@ namespace CodeWalker.GameFiles } public override uint[] GetPackTableOffsets() { - return new uint[] { 0 }; + return [0]; } } [TC(typeof(EXP))] public class Dat54MultitrackSound : Dat54Sound { public Dat54MultitrackSound(RelFile rel) : base(rel, Dat54SoundType.MultitrackSound) { } - public Dat54MultitrackSound(RelData d, BinaryReader br) : base(d, br) + public Dat54MultitrackSound(in TempRelData d, BinaryReader br) : base(in d, br) { ReadChildSoundsHashes(br); } + + public Dat54MultitrackSound(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + ReadChildSoundsHashes(ref reader); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3117,12 +3539,20 @@ namespace CodeWalker.GameFiles public Dat54RandomizedSound(RelFile rel) : base(rel, Dat54SoundType.RandomizedSound) { } - public Dat54RandomizedSound(RelData d, BinaryReader br) : base(d, br) + public Dat54RandomizedSound(in TempRelData d, BinaryReader br) : base(in d, br) { HistoryIndex = br.ReadByte(); HistorySpaceCount = br.ReadByte(); HistorySpace = br.ReadBytes(HistorySpaceCount); VariationsCount = br.ReadByte(); + + if (VariationsCount == 0) + { + ChildSoundsHashes = []; + VariationsValues = []; + return; + } + ChildSoundsHashes = new MetaHash[VariationsCount]; VariationsValues = new float[VariationsCount]; for (int i = 0; i < VariationsCount; i++) @@ -3131,6 +3561,30 @@ namespace CodeWalker.GameFiles VariationsValues[i] = br.ReadSingle(); } } + + public Dat54RandomizedSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + HistoryIndex = br.ReadByte(); + HistorySpaceCount = br.ReadByte(); + HistorySpace = br.ReadBytes(HistorySpaceCount).ToArray(); + VariationsCount = br.ReadByte(); + + if (VariationsCount == 0) + { + ChildSoundsHashes = []; + VariationsValues = []; + return; + } + + ChildSoundsHashes = new MetaHash[VariationsCount]; + VariationsValues = new float[VariationsCount]; + for (int i = 0; i < VariationsCount; i++) + { + ChildSoundsHashes[i] = br.ReadUInt32(); + VariationsValues[i] = br.ReadSingle(); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3143,8 +3597,8 @@ namespace CodeWalker.GameFiles var inodes = vnode.SelectNodes("Item"); if (inodes?.Count > 0) { - var nlist = new List(); - var vlist = new List(); + using var nlist = new PooledList(); + using var vlist = new PooledList(); foreach (XmlNode inode in inodes) { nlist.Add(XmlRel.GetHash(Xml.GetStringAttribute(inode, "name"))); @@ -3203,16 +3657,24 @@ namespace CodeWalker.GameFiles return offsets.ToArray(); } } - [TC(typeof(EXP))] public class Dat54EnvironmentSound : Dat54Sound + + [TC(typeof(EXP))] + public class Dat54EnvironmentSound : Dat54Sound { public byte ChannelID { get; set; } public Dat54EnvironmentSound(RelFile rel) : base(rel, Dat54SoundType.EnvironmentSound) { } - public Dat54EnvironmentSound(RelData d, BinaryReader br) : base(d, br) + public Dat54EnvironmentSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChannelID = br.ReadByte(); } + + public Dat54EnvironmentSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ChannelID = br.ReadByte(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3229,14 +3691,33 @@ namespace CodeWalker.GameFiles bw.Write(ChannelID); } } - [TC(typeof(EXP))] public class Dat54DynamicEntitySound : Dat54Sound + + [TC(typeof(EXP))] + public class Dat54DynamicEntitySound : Dat54Sound { public byte EntitiesCount { get; set; } public MetaHash[] Entities { get; set; } public Dat54DynamicEntitySound(RelFile rel) : base(rel, Dat54SoundType.DynamicEntitySound) { } - public Dat54DynamicEntitySound(RelData d, BinaryReader br) : base(d, br) + public Dat54DynamicEntitySound(in TempRelData d, BinaryReader br) : base(in d, br) + { + EntitiesCount = br.ReadByte(); + if (EntitiesCount > 0) + { + Entities = new MetaHash[EntitiesCount]; + for (int i = 0; i < EntitiesCount; i++) + { + Entities[i] = br.ReadUInt32(); + } + } + else + { + Entities = []; + } + } + + public Dat54DynamicEntitySound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) { EntitiesCount = br.ReadByte(); Entities = new MetaHash[EntitiesCount]; @@ -3245,6 +3726,7 @@ namespace CodeWalker.GameFiles Entities[i] = br.ReadUInt32(); } } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3266,7 +3748,8 @@ namespace CodeWalker.GameFiles } } } - [TC(typeof(EXP))] public class Dat54SequentialOverlapSound : Dat54Sound + [TC(typeof(EXP))] + public class Dat54SequentialOverlapSound : Dat54Sound { public ushort DelayTime { get; set; } public MetaHash DelayTimeVariable { get; set; } //0x2-0x6 @@ -3274,7 +3757,7 @@ namespace CodeWalker.GameFiles public Dat54SequentialOverlapSound(RelFile rel) : base(rel, Dat54SoundType.SequentialOverlapSound) { } - public Dat54SequentialOverlapSound(RelData d, BinaryReader br) : base(d, br) + public Dat54SequentialOverlapSound(in TempRelData d, BinaryReader br) : base(in d, br) { DelayTime = br.ReadUInt16(); DelayTimeVariable = br.ReadUInt32(); @@ -3282,6 +3765,16 @@ namespace CodeWalker.GameFiles ReadChildSoundsHashes(br); } + + public Dat54SequentialOverlapSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + DelayTime = br.ReadUInt16(); + DelayTimeVariable = br.ReadUInt32(); + SequenceDirection = br.ReadUInt32(); + + ReadChildSoundsHashes(ref br); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3325,7 +3818,7 @@ namespace CodeWalker.GameFiles public Dat54ModularSynthSound(RelFile rel) : base(rel, Dat54SoundType.ModularSynthSound) { } - public Dat54ModularSynthSound(RelData d, BinaryReader br) : base(d, br) + public Dat54ModularSynthSound(in TempRelData d, BinaryReader br) : base(in d, br) { SynthSound = br.ReadUInt32(); //0x0-0x4 SynthPreset = br.ReadUInt32(); //0x4-0x8 @@ -3338,12 +3831,47 @@ namespace CodeWalker.GameFiles ChildSoundsHashes[i] = br.ReadUInt32(); } ExposedVariablesCount = br.ReadInt32(); + + if (ExposedVariablesCount == 0) + { + ExposedVariables = []; + return; + } + ExposedVariables = new Dat54ModularSynthSoundVariable[ExposedVariablesCount]; for (int i = 0; i < ExposedVariablesCount; i++) { ExposedVariables[i] = new Dat54ModularSynthSoundVariable(br); } } + + public Dat54ModularSynthSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + SynthSound = br.ReadUInt32(); //0x0-0x4 + SynthPreset = br.ReadUInt32(); //0x4-0x8 + PlaybackTimeLimit = br.ReadSingle(); //0x8-0xC + UnkInt = br.ReadInt32(); //0xC-0x10 + TrackCount = br.ReadInt32(); //0x10-0x14 + ChildSoundsHashes = new MetaHash[4]; + for (int i = 0; i < 4; i++) + { + ChildSoundsHashes[i] = br.ReadUInt32(); + } + ExposedVariablesCount = br.ReadInt32(); + + if (ExposedVariablesCount == 0) + { + ExposedVariables = []; + return; + } + + ExposedVariables = new Dat54ModularSynthSoundVariable[ExposedVariablesCount]; + for (int i = 0; i < ExposedVariablesCount; i++) + { + ExposedVariables[i] = new Dat54ModularSynthSoundVariable(ref br); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3399,7 +3927,8 @@ namespace CodeWalker.GameFiles return new[] { SynthSound, SynthPreset }; } } - [TC(typeof(EXP))] public class Dat54ModularSynthSoundVariable : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat54ModularSynthSoundVariable : IMetaXmlItem { public MetaHash VariableName { get; set; } public MetaHash ParameterName { get; set; } @@ -3413,30 +3942,39 @@ namespace CodeWalker.GameFiles ParameterName = br.ReadUInt32(); Value = br.ReadSingle(); } + + public Dat54ModularSynthSoundVariable(ref SequenceReader br) + { + VariableName = br.ReadUInt32(); + ParameterName = br.ReadUInt32(); + Value = br.ReadSingle(); + } + public void ReadXml(XmlNode node) { VariableName = XmlRel.GetHash(Xml.GetChildInnerText(node, "VariableName")); ParameterName = XmlRel.GetHash(Xml.GetChildInnerText(node, "ParameterName")); Value = Xml.GetChildFloatAttribute(node, "Value", "value"); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "VariableName", RelXml.HashString(VariableName)); RelXml.StringTag(sb, indent, "ParameterName", RelXml.HashString(ParameterName)); RelXml.ValueTag(sb, indent, "Value", FloatUtil.ToString(Value)); } - public void Write(BinaryWriter bw) + public readonly void Write(BinaryWriter bw) { bw.Write(VariableName); bw.Write(ParameterName); bw.Write(Value); } - public override string ToString() + public override readonly string ToString() { - return VariableName.ToString() + ": " + ParameterName.ToString() + ": " + FloatUtil.ToString(Value); + return $"{VariableName}: {ParameterName}: {FloatUtil.ToString(Value)}"; } } - [TC(typeof(EXP))] public class Dat54GranularSound : Dat54Sound + [TC(typeof(EXP))] + public class Dat54GranularSound : Dat54Sound { public int WaveSlotIndex { get; set; } //0x0-0x4 public Dat54GranularSoundFile Channel0 { get; set; } @@ -3463,9 +4001,11 @@ namespace CodeWalker.GameFiles public byte GranularClockCount { get; set; } //0x7C-0x7D public Vector2[] GranularClock { get; set; } //0x7D-... + public override MetaHash[] AudioContainers => [Channel0.ContainerName, Channel1.ContainerName, Channel2.ContainerName, Channel3.ContainerName, Channel4.ContainerName, Channel5.ContainerName]; + public Dat54GranularSound(RelFile rel) : base(rel, Dat54SoundType.GranularSound) { } - public Dat54GranularSound(RelData d, BinaryReader br) : base(d, br) + public Dat54GranularSound(in TempRelData d, BinaryReader br) : base(in d, br) { WaveSlotIndex = br.ReadInt32(); @@ -3476,15 +4016,6 @@ namespace CodeWalker.GameFiles Channel4 = new Dat54GranularSoundFile(br); Channel5 = new Dat54GranularSoundFile(br); - AudioContainers = new[] { - Channel0.ContainerName, - Channel1.ContainerName, - Channel2.ContainerName, - Channel3.ContainerName, - Channel4.ContainerName, - Channel5.ContainerName - }; - ChannelSettings0 = new Dat54GranularSoundData(br); ChannelSettings1 = new Dat54GranularSoundData(br); ChannelSettings2 = new Dat54GranularSoundData(br); @@ -3506,12 +4037,65 @@ namespace CodeWalker.GameFiles ChildSoundsHashes = new[] { ParentSound }; GranularClockCount = br.ReadByte(); + + if (GranularClockCount == 0) + { + GranularClock = []; + return; + } + GranularClock = new Vector2[GranularClockCount]; for (int i = 0; i < GranularClockCount; i++) { GranularClock[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); } } + + public Dat54GranularSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + WaveSlotIndex = br.ReadInt32(); + + Channel0 = new Dat54GranularSoundFile(ref br); + Channel1 = new Dat54GranularSoundFile(ref br); + Channel2 = new Dat54GranularSoundFile(ref br); + Channel3 = new Dat54GranularSoundFile(ref br); + Channel4 = new Dat54GranularSoundFile(ref br); + Channel5 = new Dat54GranularSoundFile(ref br); + + ChannelSettings0 = new Dat54GranularSoundData(ref br); + ChannelSettings1 = new Dat54GranularSoundData(ref br); + ChannelSettings2 = new Dat54GranularSoundData(ref br); + ChannelSettings3 = new Dat54GranularSoundData(ref br); + ChannelSettings4 = new Dat54GranularSoundData(ref br); + ChannelSettings5 = new Dat54GranularSoundData(ref br); + + UnkFloat0 = br.ReadSingle(); + UnkFloat1 = br.ReadSingle(); + ChannelVolume0 = br.ReadInt16(); + ChannelVolume1 = br.ReadInt16(); + ChannelVolume2 = br.ReadInt16(); + ChannelVolume3 = br.ReadInt16(); + ChannelVolume4 = br.ReadInt16(); + ChannelVolume5 = br.ReadInt16(); + + ParentSound = br.ReadUInt32(); + + ChildSoundsHashes = new[] { ParentSound }; + + GranularClockCount = br.ReadByte(); + + if (GranularClockCount == 0) + { + GranularClock = []; + return; + } + GranularClock = new Vector2[GranularClockCount]; + for (int i = 0; i < GranularClockCount; i++) + { + GranularClock[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3614,26 +4198,29 @@ namespace CodeWalker.GameFiles return new uint[] { 4, 12, 20, 28, 36, 44 }; } } - [TC(typeof(EXP))] public class Dat54GranularSoundFile + [TC(typeof(EXP))] + public readonly struct Dat54GranularSoundFile { - public MetaHash ContainerName { get; set; } //0x0-0x4 - public MetaHash FileName { get; set; } //0x4-0x8 + public readonly MetaHash ContainerName; //0x0-0x4 + public readonly MetaHash FileName; //0x4-0x8 public Dat54GranularSoundFile(XmlNode node, string varName) { - ReadXml(node, varName); + var cnode = node.SelectSingleNode(varName); + ContainerName = XmlRel.GetHash(Xml.GetChildInnerText(cnode, "ContainerName")); + FileName = XmlRel.GetHash(Xml.GetChildInnerText(cnode, "FileName")); } public Dat54GranularSoundFile(BinaryReader br) { ContainerName = br.ReadUInt32(); FileName = br.ReadUInt32(); } - public void ReadXml(XmlNode node, string varName) + public Dat54GranularSoundFile(ref SequenceReader br) { - var cnode = node.SelectSingleNode(varName); - ContainerName = XmlRel.GetHash(Xml.GetChildInnerText(cnode, "ContainerName")); - FileName = XmlRel.GetHash(Xml.GetChildInnerText(cnode, "FileName")); + ContainerName = br.ReadUInt32(); + FileName = br.ReadUInt32(); } + public void WriteXml(StringBuilder sb, int indent, string varName) { var cind = indent + 1; @@ -3649,20 +4236,26 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return ContainerName.ToString() + ": " + FileName.ToString(); + return $"{ContainerName}: {FileName}"; } } - [TC(typeof(EXP))] public class Dat54GranularSoundData + [TC(typeof(EXP))] + public readonly struct Dat54GranularSoundData { - public byte UnkFlags0 { get; set; } //0x0-0x1 - public byte UnkFlags1 { get; set; } //0x1-0x2 - public byte UnkByte0 { get; set; } //0x2-0x3 - public byte UnkByte1 { get; set; } //0x3-0x4 - public float UnkFloat { get; set; } //0x4-0x8 + public readonly byte UnkFlags0; //0x0-0x1 + public readonly byte UnkFlags1; //0x1-0x2 + public readonly byte UnkByte0; //0x2-0x3 + public readonly byte UnkByte1; //0x3-0x4 + public readonly float UnkFloat; //0x4-0x8 public Dat54GranularSoundData(XmlNode node, string varName) { - ReadXml(node, varName); + var cnode = node.SelectSingleNode(varName); + UnkFlags0 = (byte)Xml.GetChildIntAttribute(cnode, "UnkFlags0", "value"); + UnkFlags1 = (byte)Xml.GetChildIntAttribute(cnode, "UnkFlags1", "value"); + UnkByte0 = (byte)Xml.GetChildIntAttribute(cnode, "UnkByte0", "value"); + UnkByte1 = (byte)Xml.GetChildIntAttribute(cnode, "UnkByte1", "value"); + UnkFloat = Xml.GetChildFloatAttribute(cnode, "UnkFloat", "value"); } public Dat54GranularSoundData(BinaryReader br) { @@ -3672,15 +4265,16 @@ namespace CodeWalker.GameFiles UnkByte1 = br.ReadByte(); UnkFloat = br.ReadSingle(); } - public void ReadXml(XmlNode node, string varName) + + public Dat54GranularSoundData(ref SequenceReader br) { - var cnode = node.SelectSingleNode(varName); - UnkFlags0 = (byte)Xml.GetChildIntAttribute(cnode, "UnkFlags0", "value"); - UnkFlags1 = (byte)Xml.GetChildIntAttribute(cnode, "UnkFlags1", "value"); - UnkByte0 = (byte)Xml.GetChildIntAttribute(cnode, "UnkByte0", "value"); - UnkByte1 = (byte)Xml.GetChildIntAttribute(cnode, "UnkByte1", "value"); - UnkFloat = Xml.GetChildFloatAttribute(cnode, "UnkFloat", "value"); + UnkFlags0 = br.ReadByte(); + UnkFlags1 = br.ReadByte(); + UnkByte0 = br.ReadByte(); + UnkByte1 = br.ReadByte(); + UnkFloat = br.ReadSingle(); } + public void WriteXml(StringBuilder sb, int indent, string varName) { var cind = indent + 1; @@ -3702,10 +4296,12 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return UnkFlags0.ToString() + ": " + UnkFlags1.ToString() + ": " + UnkByte0.ToString() + ": " + UnkByte1.ToString() + ": " + FloatUtil.ToString(UnkFloat); + return $"{UnkFlags0}: {UnkFlags1}: {UnkByte0}: {UnkByte1}: {FloatUtil.ToString(UnkFloat)}"; } } - [TC(typeof(EXP))] public class Dat54DirectionalSound : Dat54Sound + + [TC(typeof(EXP))] + public class Dat54DirectionalSound : Dat54Sound { public MetaHash ChildSound { get; set; } public float InnerAngle { get; set; } //0x4-0x8 @@ -3716,7 +4312,7 @@ namespace CodeWalker.GameFiles public Dat54DirectionalSound(RelFile rel) : base(rel, Dat54SoundType.DirectionalSound) { } - public Dat54DirectionalSound(RelData d, BinaryReader br) : base(d, br) + public Dat54DirectionalSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChildSound = br.ReadUInt32(); ChildSoundsHashes = new[] { ChildSound }; @@ -3726,6 +4322,18 @@ namespace CodeWalker.GameFiles YawAngle = br.ReadSingle(); PitchAngle = br.ReadSingle(); } + + public Dat54DirectionalSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ChildSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound }; + InnerAngle = br.ReadSingle(); + OuterAngle = br.ReadSingle(); + RearAttenuation = br.ReadSingle(); + YawAngle = br.ReadSingle(); + PitchAngle = br.ReadSingle(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3770,7 +4378,7 @@ namespace CodeWalker.GameFiles public Dat54KineticSound(RelFile rel) : base(rel, Dat54SoundType.KineticSound) { } - public Dat54KineticSound(RelData d, BinaryReader br) : base(d, br) + public Dat54KineticSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChildSound = br.ReadUInt32(); ChildSoundsHashes = new[] { ChildSound }; @@ -3778,6 +4386,16 @@ namespace CodeWalker.GameFiles YawAngle = br.ReadSingle(); PitchAngle = br.ReadSingle(); } + + public Dat54KineticSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ChildSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound }; + Mass = br.ReadSingle(); + YawAngle = br.ReadSingle(); + PitchAngle = br.ReadSingle(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3813,12 +4431,20 @@ namespace CodeWalker.GameFiles public Dat54SwitchSound(RelFile rel) : base(rel, Dat54SoundType.SwitchSound) { } - public Dat54SwitchSound(RelData d, BinaryReader br) : base(d, br) + public Dat54SwitchSound(in TempRelData d, BinaryReader br) : base(in d, br) { Variable = br.ReadUInt32(); ReadChildSoundsHashes(br); } + + public Dat54SwitchSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Variable = br.ReadUInt32(); + + ReadChildSoundsHashes(ref br); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3851,7 +4477,7 @@ namespace CodeWalker.GameFiles public Dat54VariableCurveSound(RelFile rel) : base(rel, Dat54SoundType.VariableCurveSound) { } - public Dat54VariableCurveSound(RelData d, BinaryReader br) : base(d, br) + public Dat54VariableCurveSound(in TempRelData d, BinaryReader br) : base(d, br) { ChildSound = br.ReadUInt32(); ChildSoundsHashes = new[] { ChildSound }; @@ -3859,6 +4485,16 @@ namespace CodeWalker.GameFiles OutputVariable = br.ReadUInt32(); Curve = br.ReadUInt32(); } + + public Dat54VariableCurveSound(in TempRelData d, ref SequenceReader br) : base(d, ref br) + { + ChildSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound }; + InputVariable = br.ReadUInt32(); + OutputVariable = br.ReadUInt32(); + Curve = br.ReadUInt32(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3899,7 +4535,13 @@ namespace CodeWalker.GameFiles public Dat54VariablePrintValueSound(RelFile rel) : base(rel, Dat54SoundType.VariablePrintValueSound) { } - public Dat54VariablePrintValueSound(RelData d, BinaryReader br) : base(d, br) + public Dat54VariablePrintValueSound(in TempRelData d, BinaryReader br) : base(in d, br) + { + Variable = br.ReadUInt32(); + Value = br.ReadString(); + } + + public Dat54VariablePrintValueSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) { Variable = br.ReadUInt32(); Value = br.ReadString(); @@ -3931,7 +4573,7 @@ namespace CodeWalker.GameFiles public Dat54VariableBlockSound(RelFile rel) : base(rel, Dat54SoundType.VariableBlockSound) { } - public Dat54VariableBlockSound(RelData d, BinaryReader br) : base(d, br) + public Dat54VariableBlockSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChildSound = br.ReadUInt32(); ChildSoundsHashes = new[] { ChildSound }; @@ -3942,6 +4584,19 @@ namespace CodeWalker.GameFiles Variables[i] = new Dat54VariableData(br); } } + + public Dat54VariableBlockSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ChildSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound }; + VariableCount = br.ReadByte(); + Variables = new Dat54VariableData[VariableCount]; + for (int i = 0; i < VariableCount; i++) + { + Variables[i] = new Dat54VariableData(ref br); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -3970,7 +4625,8 @@ namespace CodeWalker.GameFiles return new uint[] { 0 }; } } - [TC(typeof(EXP))] public class Dat54VariableData : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat54VariableData : IMetaXmlItem { public MetaHash Name { get; set; } public float Value { get; set; } //the value this variable is set to. @@ -3986,6 +4642,15 @@ namespace CodeWalker.GameFiles ValueVariance = br.ReadSingle(); VariableType = br.ReadByte(); } + + public Dat54VariableData(ref SequenceReader br) + { + Name = br.ReadUInt32(); + Value = br.ReadSingle(); + ValueVariance = br.ReadSingle(); + VariableType = br.ReadByte(); + } + public void ReadXml(XmlNode node) { Name = XmlRel.GetHash(Xml.GetChildInnerText(node, "Name")); @@ -3993,26 +4658,28 @@ namespace CodeWalker.GameFiles ValueVariance = Xml.GetChildFloatAttribute(node, "ValueVariance", "value"); VariableType = (byte)Xml.GetChildIntAttribute(node, "VariableType", "value"); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "Name", RelXml.HashString(Name)); RelXml.ValueTag(sb, indent, "Value", FloatUtil.ToString(Value)); RelXml.ValueTag(sb, indent, "ValueVariance", FloatUtil.ToString(ValueVariance)); RelXml.ValueTag(sb, indent, "VariableType", VariableType.ToString()); } - public void Write(BinaryWriter bw) + public readonly void Write(BinaryWriter bw) { bw.Write(Name); bw.Write(Value); bw.Write(ValueVariance); bw.Write(VariableType); } - public override string ToString() + public override readonly string ToString() { - return Name + ": " + FloatUtil.ToString(Value) + ": " + FloatUtil.ToString(ValueVariance) + ": " + VariableType.ToString(); + return $"{Name}: {FloatUtil.ToString(Value)}: {FloatUtil.ToString(ValueVariance)}: {VariableType}"; } } - [TC(typeof(EXP))] public class Dat54IfSound : Dat54Sound + + [TC(typeof(EXP))] + public class Dat54IfSound : Dat54Sound { public MetaHash TrueSound { get; set; } //sound played if the condition is true public MetaHash FalseSound { get; set; } //sound played if the condition is false/invalid @@ -4023,7 +4690,7 @@ namespace CodeWalker.GameFiles public Dat54IfSound(RelFile rel) : base(rel, Dat54SoundType.IfSound) { } - public Dat54IfSound(RelData d, BinaryReader br) : base(d, br) + public Dat54IfSound(in TempRelData d, BinaryReader br) : base(in d, br) { TrueSound = br.ReadUInt32(); FalseSound = br.ReadUInt32(); @@ -4033,6 +4700,18 @@ namespace CodeWalker.GameFiles ConditionValue = br.ReadSingle(); IfParameterHash1 = br.ReadUInt32(); } + + public Dat54IfSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + TrueSound = br.ReadUInt32(); + FalseSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { TrueSound, FalseSound }; + ConditionVariable = br.ReadUInt32(); + ConditionType = br.ReadByte(); + ConditionValue = br.ReadSingle(); + IfParameterHash1 = br.ReadUInt32(); + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -4068,25 +4747,52 @@ namespace CodeWalker.GameFiles return new uint[] { 0, 4 }; } } - [TC(typeof(EXP))] public class Dat54MathOperationSound : Dat54Sound + + [TC(typeof(EXP))] + public class Dat54MathOperationSound : Dat54Sound { public MetaHash ChildSound { get; set; } public byte OperationsCount { get; set; } public Dat54MathOperationSoundData[] Operations { get; set; } public Dat54MathOperationSound(RelFile rel) : base(rel, Dat54SoundType.MathOperationSound) - { } - public Dat54MathOperationSound(RelData d, BinaryReader br) : base(d, br) + { + Operations = []; + } + public Dat54MathOperationSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChildSound = br.ReadUInt32(); ChildSoundsHashes = new[] { ChildSound }; OperationsCount = br.ReadByte(); + if (OperationsCount == 0) + { + Operations = []; + return; + } Operations = new Dat54MathOperationSoundData[OperationsCount]; for (int i = 0; i < OperationsCount; i++) { Operations[i] = new Dat54MathOperationSoundData(br); } } + + public Dat54MathOperationSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ChildSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound }; + OperationsCount = br.ReadByte(); + if (OperationsCount == 0) + { + Operations = []; + return; + } + Operations = new Dat54MathOperationSoundData[OperationsCount]; + for (int i = 0; i < OperationsCount; i++) + { + Operations[i] = new Dat54MathOperationSoundData(ref br); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -4115,7 +4821,8 @@ namespace CodeWalker.GameFiles return new uint[] { 0 }; } } - [TC(typeof(EXP))] public class Dat54MathOperationSoundData : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat54MathOperationSoundData : IMetaXmlItem { public byte OperationType { get; set; } //0x0-0x1 public float InputImmediate1 { get; set; } //0x1-0x5 @@ -4139,6 +4846,19 @@ namespace CodeWalker.GameFiles InputParameter3 = br.ReadUInt32(); OutputParameter = br.ReadUInt32(); } + + public Dat54MathOperationSoundData(ref SequenceReader br) + { + OperationType = br.ReadByte(); + InputImmediate1 = br.ReadSingle(); + InputParameter1 = br.ReadUInt32(); + InputImmediate2 = br.ReadSingle(); + InputParameter2 = br.ReadUInt32(); + InputImmediate3 = br.ReadSingle(); + InputParameter3 = br.ReadUInt32(); + OutputParameter = br.ReadUInt32(); + } + public void ReadXml(XmlNode node) { OperationType = (byte)Xml.GetChildIntAttribute(node, "OperationType", "value"); @@ -4150,7 +4870,7 @@ namespace CodeWalker.GameFiles InputParameter3 = XmlRel.GetHash(Xml.GetChildInnerText(node, "InputParameter3")); OutputParameter = XmlRel.GetHash(Xml.GetChildInnerText(node, "OutputParameter")); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.ValueTag(sb, indent, "OperationType", OperationType.ToString()); RelXml.ValueTag(sb, indent, "InputImmediate1", FloatUtil.ToString(InputImmediate1)); @@ -4161,7 +4881,7 @@ namespace CodeWalker.GameFiles RelXml.StringTag(sb, indent, "InputParameter3", RelXml.HashString(InputParameter3)); RelXml.StringTag(sb, indent, "OutputParameter", RelXml.HashString(OutputParameter)); } - public void Write(BinaryWriter bw) + public readonly void Write(BinaryWriter bw) { bw.Write(OperationType); bw.Write(InputImmediate1); @@ -4172,9 +4892,9 @@ namespace CodeWalker.GameFiles bw.Write(InputParameter3); bw.Write(OutputParameter); } - public override string ToString() + public override readonly string ToString() { - return InputParameter3.ToString() + ", " + OutputParameter.ToString(); + return $"{InputParameter3}, {OutputParameter}"; } } [TC(typeof(EXP))] public class Dat54ParameterTransformSound : Dat54Sound @@ -4185,7 +4905,7 @@ namespace CodeWalker.GameFiles public Dat54ParameterTransformSound(RelFile rel) : base(rel, Dat54SoundType.ParameterTransformSound) { } - public Dat54ParameterTransformSound(RelData d, BinaryReader br) : base(d, br) + public Dat54ParameterTransformSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChildSound = br.ReadUInt32(); ChildSoundsHashes = new[] { ChildSound }; @@ -4196,6 +4916,19 @@ namespace CodeWalker.GameFiles ParameterTransforms[i] = new Dat54ParameterTransformSoundData(br); } } + + public Dat54ParameterTransformSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ChildSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound }; + ParameterTransformsCount = br.ReadInt32(); //0x4-0x8 + ParameterTransforms = new Dat54ParameterTransformSoundData[ParameterTransformsCount]; + for (int i = 0; i < ParameterTransformsCount; i++) + { + ParameterTransforms[i] = new Dat54ParameterTransformSoundData(ref br); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -4224,7 +4957,9 @@ namespace CodeWalker.GameFiles return new uint[] { 0 }; } } - [TC(typeof(EXP))] public class Dat54ParameterTransformSoundData : IMetaXmlItem + + [TC(typeof(EXP))] + public struct Dat54ParameterTransformSoundData : IMetaXmlItem { public MetaHash InputParameter { get; set; } //0x0-0x4 public float InputRangeMin { get; set; } //0x4-0x8 @@ -4240,12 +4975,40 @@ namespace CodeWalker.GameFiles InputRangeMin = br.ReadSingle(); InputRangeMax = br.ReadSingle(); TransformsCount = br.ReadInt32(); + + if (TransformsCount == 0) + { + Transforms = []; + return; + } + Transforms = new Dat54ParameterTransformSoundData2[TransformsCount]; for (int i = 0; i < TransformsCount; i++) { Transforms[i] = new Dat54ParameterTransformSoundData2(br); } } + + public Dat54ParameterTransformSoundData(ref SequenceReader br) + { + InputParameter = br.ReadUInt32(); + InputRangeMin = br.ReadSingle(); + InputRangeMax = br.ReadSingle(); + TransformsCount = br.ReadInt32(); + + if (TransformsCount == 0) + { + Transforms = []; + return; + } + + Transforms = new Dat54ParameterTransformSoundData2[TransformsCount]; + for (int i = 0; i < TransformsCount; i++) + { + Transforms[i] = new Dat54ParameterTransformSoundData2(ref br); + } + } + public void ReadXml(XmlNode node) { InputParameter = XmlRel.GetHash(Xml.GetChildInnerText(node, "InputParameter")); @@ -4254,14 +5017,14 @@ namespace CodeWalker.GameFiles Transforms = XmlRel.ReadItemArray(node, "Transforms"); TransformsCount = Transforms?.Length ?? 0; } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "InputParameter", RelXml.HashString(InputParameter)); RelXml.ValueTag(sb, indent, "InputRangeMin", FloatUtil.ToString(InputRangeMin)); RelXml.ValueTag(sb, indent, "InputRangeMax", FloatUtil.ToString(InputRangeMax)); RelXml.WriteItemArray(sb, Transforms, indent, "Transforms"); } - public void Write(BinaryWriter bw) + public readonly void Write(BinaryWriter bw) { bw.Write(InputParameter); bw.Write(InputRangeMin); @@ -4272,12 +5035,12 @@ namespace CodeWalker.GameFiles Transforms[i].Write(bw); } } - public override string ToString() + public override readonly string ToString() { - return InputParameter.ToString() + ", " + TransformsCount.ToString(); + return $"{InputParameter}, {TransformsCount}"; } } - [TC(typeof(EXP))] public class Dat54ParameterTransformSoundData2 : IMetaXmlItem + [TC(typeof(EXP))] public struct Dat54ParameterTransformSoundData2 : IMetaXmlItem { public float SmoothRate { get; set; } //0x0-0x4 public int TransformType { get; set; } //0x4 //type of transform; volume, pitch, etc @@ -4297,12 +5060,38 @@ namespace CodeWalker.GameFiles OutputRangeMin = br.ReadSingle(); OutputRangeMax = br.ReadSingle(); VectorCount = br.ReadInt32(); + if (VectorCount == 0) + { + Vectors = []; + return; + } Vectors = new Vector2[VectorCount]; for (int i = 0; i < VectorCount; i++) { Vectors[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); } } + + public Dat54ParameterTransformSoundData2(ref SequenceReader br) + { + SmoothRate = br.ReadSingle(); + TransformType = br.ReadInt32(); + TransformTypeParameter = br.ReadUInt32(); + OutputRangeMin = br.ReadSingle(); + OutputRangeMax = br.ReadSingle(); + VectorCount = br.ReadInt32(); + if (VectorCount == 0) + { + Vectors = []; + return; + } + Vectors = new Vector2[VectorCount]; + for (int i = 0; i < VectorCount; i++) + { + Vectors[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); + } + } + public void ReadXml(XmlNode node) { SmoothRate = Xml.GetChildFloatAttribute(node, "SmoothRate", "value"); @@ -4313,7 +5102,7 @@ namespace CodeWalker.GameFiles Vectors = Xml.GetChildRawVector2Array(node, "Vectors"); VectorCount = Vectors?.Length ?? 0; } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.ValueTag(sb, indent, "SmoothRate", FloatUtil.ToString(SmoothRate)); RelXml.ValueTag(sb, indent, "TransformType", TransformType.ToString()); @@ -4322,7 +5111,7 @@ namespace CodeWalker.GameFiles RelXml.ValueTag(sb, indent, "OutputRangeMax", FloatUtil.ToString(OutputRangeMax)); RelXml.WriteRawArray(sb, Vectors, indent, "Vectors", "", RelXml.FormatVector2, 1); } - public void Write(BinaryWriter bw) + public readonly void Write(BinaryWriter bw) { bw.Write(SmoothRate); bw.Write(TransformType); @@ -4336,12 +5125,13 @@ namespace CodeWalker.GameFiles bw.Write(Vectors[i].Y); } } - public override string ToString() + public override readonly string ToString() { - return TransformTypeParameter.ToString() + ", " + VectorCount.ToString(); + return $"{TransformTypeParameter}, {VectorCount}"; } } - [TC(typeof(EXP))] public class Dat54FluctuatorSound : Dat54Sound + [TC(typeof(EXP))] + public class Dat54FluctuatorSound : Dat54Sound { public MetaHash ChildSound { get; set; } public int FluctuatorsCount { get; set; } @@ -4349,17 +5139,40 @@ namespace CodeWalker.GameFiles public Dat54FluctuatorSound(RelFile rel) : base(rel, Dat54SoundType.FluctuatorSound) { } - public Dat54FluctuatorSound(RelData d, BinaryReader br) : base(d, br) + public Dat54FluctuatorSound(in TempRelData d, BinaryReader br) : base(in d, br) { ChildSound = br.ReadUInt32(); ChildSoundsHashes = new[] { ChildSound }; FluctuatorsCount = br.ReadInt32(); //0x4-0x8 + if (FluctuatorsCount == 0) + { + Fluctuators = []; + return; + } Fluctuators = new Dat54FluctuatorSoundData[FluctuatorsCount]; for (int i = 0; i < FluctuatorsCount; i++) { Fluctuators[i] = new Dat54FluctuatorSoundData(br); } } + + public Dat54FluctuatorSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ChildSound = br.ReadUInt32(); + ChildSoundsHashes = new[] { ChildSound }; + FluctuatorsCount = br.ReadInt32(); //0x4-0x8 + if (FluctuatorsCount == 0) + { + Fluctuators = []; + return; + } + Fluctuators = new Dat54FluctuatorSoundData[FluctuatorsCount]; + for (int i = 0; i < FluctuatorsCount; i++) + { + Fluctuators[i] = new Dat54FluctuatorSoundData(ref br); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -4388,7 +5201,8 @@ namespace CodeWalker.GameFiles return new uint[] { 0 }; } } - [TC(typeof(EXP))] public class Dat54FluctuatorSoundData : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat54FluctuatorSoundData : IMetaXmlItem { public byte FluctuatorType { get; set; } //0x0-0x1 //type of fluctuator; probability-based, time-based public byte UnkByte1 { get; set; } //0x1-0x2 @@ -4424,6 +5238,25 @@ namespace CodeWalker.GameFiles UnkFloat09 = br.ReadSingle(); UnkFloat10 = br.ReadSingle(); } + + public Dat54FluctuatorSoundData(ref SequenceReader br) + { + FluctuatorType = br.ReadByte(); + UnkByte1 = br.ReadByte(); + ParameterHash = br.ReadUInt32(); + UnkFloat00 = br.ReadSingle(); + UnkFloat01 = br.ReadSingle(); + UnkFloat02 = br.ReadSingle(); + UnkFloat03 = br.ReadSingle(); + UnkFloat04 = br.ReadSingle(); + UnkFloat05 = br.ReadSingle(); + UnkFloat06 = br.ReadSingle(); + UnkFloat07 = br.ReadSingle(); + UnkFloat08 = br.ReadSingle(); + UnkFloat09 = br.ReadSingle(); + UnkFloat10 = br.ReadSingle(); + } + public void ReadXml(XmlNode node) { FluctuatorType = (byte)Xml.GetChildIntAttribute(node, "FluctuatorType", "value"); @@ -4441,7 +5274,7 @@ namespace CodeWalker.GameFiles UnkFloat09 = Xml.GetChildFloatAttribute(node, "UnkFloat09", "value"); UnkFloat10 = Xml.GetChildFloatAttribute(node, "UnkFloat10", "value"); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.ValueTag(sb, indent, "FluctuatorType", FluctuatorType.ToString()); RelXml.ValueTag(sb, indent, "UnkByte1", UnkByte1.ToString()); @@ -4458,7 +5291,7 @@ namespace CodeWalker.GameFiles RelXml.ValueTag(sb, indent, "UnkFloat09", FloatUtil.ToString(UnkFloat09)); RelXml.ValueTag(sb, indent, "UnkFloat10", FloatUtil.ToString(UnkFloat10)); } - public void Write(BinaryWriter bw) + public readonly void Write(BinaryWriter bw) { bw.Write(FluctuatorType); bw.Write(UnkByte1); @@ -4475,7 +5308,7 @@ namespace CodeWalker.GameFiles bw.Write(UnkFloat09); bw.Write(UnkFloat10); } - public override string ToString() + public override readonly string ToString() { return ParameterHash.ToString(); } @@ -4494,7 +5327,7 @@ namespace CodeWalker.GameFiles public Dat54AutomationSound(RelFile rel) : base(rel, Dat54SoundType.AutomationSound) { } - public Dat54AutomationSound(RelData d, BinaryReader br) : base(d, br) + public Dat54AutomationSound(in TempRelData d, BinaryReader br) : base(in d, br) { FallBackSound = br.ReadUInt32(); PlaybackRate = br.ReadSingle(); @@ -4505,12 +5338,41 @@ namespace CodeWalker.GameFiles ContainerName = br.ReadUInt32(); FileName = br.ReadUInt32(); VariableOutputsCount = br.ReadInt32(); + if (VariableOutputsCount == 0) + { + VariableOutputs = []; + return; + } VariableOutputs = new Dat54AutomationSoundVariableOutput[VariableOutputsCount]; for (int i = 0; i < VariableOutputsCount; i++) { VariableOutputs[i] = new Dat54AutomationSoundVariableOutput(br); } } + + public Dat54AutomationSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + FallBackSound = br.ReadUInt32(); + PlaybackRate = br.ReadSingle(); + PlaybackRateVariance = br.ReadSingle(); + PlaybackRateVariable = br.ReadUInt32(); + NoteMap = br.ReadUInt32(); + ChildSoundsHashes = new[] { FallBackSound, NoteMap }; + ContainerName = br.ReadUInt32(); + FileName = br.ReadUInt32(); + VariableOutputsCount = br.ReadInt32(); + if (VariableOutputsCount == 0) + { + VariableOutputs = []; + return; + } + VariableOutputs = new Dat54AutomationSoundVariableOutput[VariableOutputsCount]; + for (int i = 0; i < VariableOutputsCount; i++) + { + VariableOutputs[i] = new Dat54AutomationSoundVariableOutput(ref br); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -4561,7 +5423,7 @@ namespace CodeWalker.GameFiles return new uint[] { 20 }; } } - [TC(typeof(EXP))] public class Dat54AutomationSoundVariableOutput : IMetaXmlItem + [TC(typeof(EXP))] public struct Dat54AutomationSoundVariableOutput : IMetaXmlItem { public int Channel { get; set; } //0x0-0x1 public MetaHash Variable { get; set; } //0x2-0x6 @@ -4572,28 +5434,32 @@ namespace CodeWalker.GameFiles { Channel = br.ReadInt32(); Variable = br.ReadUInt32(); - - if (Channel != 0)//should be pack hash? - { } } + + public Dat54AutomationSoundVariableOutput(ref SequenceReader br) + { + Channel = br.ReadInt32(); + Variable = br.ReadUInt32(); + } + public void ReadXml(XmlNode node) { Channel = Xml.GetChildIntAttribute(node, "Channel", "value"); Variable = XmlRel.GetHash(Xml.GetChildInnerText(node, "Variable")); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.ValueTag(sb, indent, "Channel", Channel.ToString()); RelXml.StringTag(sb, indent, "Variable", RelXml.HashString(Variable)); } - public void Write(BinaryWriter bw) + public readonly void Write(BinaryWriter bw) { bw.Write(Channel); bw.Write(Variable); } - public override string ToString() + public override readonly string ToString() { - return Channel.ToString() + ", " + Variable.ToString(); + return $"{Channel}, {Variable}"; } } [TC(typeof(EXP))] public class Dat54ExternalStreamSound : Dat54Sound @@ -4605,7 +5471,7 @@ namespace CodeWalker.GameFiles public Dat54ExternalStreamSound(RelFile rel) : base(rel, Dat54SoundType.ExternalStreamSound) { } - public Dat54ExternalStreamSound(RelData d, BinaryReader br) : base(d, br) + public Dat54ExternalStreamSound(in TempRelData d, BinaryReader br) : base(in d, br) { ReadChildSoundsHashes(br); @@ -4618,6 +5484,21 @@ namespace CodeWalker.GameFiles Unk3 = br.ReadUInt32(); } } + + public Dat54ExternalStreamSound(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ReadChildSoundsHashes(ref br); + + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadUInt32(); + + if (ChildSoundsCount == 0) + { + Unk2 = br.ReadUInt32(); + Unk3 = br.ReadUInt32(); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -4679,9 +5560,14 @@ namespace CodeWalker.GameFiles public Dat54SoundSet(RelFile rel) : base(rel, Dat54SoundType.SoundSet) { } - public Dat54SoundSet(RelData d, BinaryReader br) : base(d, br) + public Dat54SoundSet(in TempRelData d, BinaryReader br) : base(in d, br) { SoundSetsCount = br.ReadInt32(); + if (SoundSetsCount == 0) + { + SoundSets = []; + return; + } SoundSets = new Dat54SoundSetItem[SoundSetsCount]; ChildSoundsHashes = new MetaHash[SoundSetsCount]; for (int i = 0; i < SoundSetsCount; i++) @@ -4690,6 +5576,24 @@ namespace CodeWalker.GameFiles ChildSoundsHashes[i] = SoundSets[i].ChildSound; } } + + public Dat54SoundSet(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + SoundSetsCount = br.ReadInt32(); + if (SoundSetsCount == 0) + { + SoundSets = []; + return; + } + SoundSets = new Dat54SoundSetItem[SoundSetsCount]; + ChildSoundsHashes = new MetaHash[SoundSetsCount]; + for (int i = 0; i < SoundSetsCount; i++) + { + SoundSets[i] = new Dat54SoundSetItem(ref br); + ChildSoundsHashes[i] = SoundSets[i].ChildSound; + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -4725,7 +5629,7 @@ namespace CodeWalker.GameFiles return offsets.ToArray(); } } - [TC(typeof(EXP))] public class Dat54SoundSetItem : IMetaXmlItem + [TC(typeof(EXP))] public struct Dat54SoundSetItem : IMetaXmlItem { public MetaHash ScriptName { get; set; } public MetaHash ChildSound { get; set; } @@ -4737,6 +5641,13 @@ namespace CodeWalker.GameFiles ScriptName = br.ReadUInt32(); ChildSound = br.ReadUInt32(); } + + public Dat54SoundSetItem(ref SequenceReader br) + { + ScriptName = br.ReadUInt32(); + ChildSound = br.ReadUInt32(); + } + public void ReadXml(XmlNode node) { ScriptName = XmlRel.GetHash(Xml.GetChildInnerText(node, "ScriptName")); @@ -4754,7 +5665,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return ScriptName.ToString() + ": " + ChildSound.ToString(); + return $"{ScriptName}: {ChildSound}"; } } [TC(typeof(EXP))] public class Dat54AutomationNoteMapSound : Dat54Sound @@ -4764,9 +5675,16 @@ namespace CodeWalker.GameFiles public Dat54AutomationNoteMapSound(RelFile rel) : base(rel, Dat54SoundType.AutomationNoteMapSound) { } - public Dat54AutomationNoteMapSound(RelData d, BinaryReader br) : base(d, br) + public Dat54AutomationNoteMapSound(in TempRelData d, BinaryReader br) : base(in d, br) { MapsCount = br.ReadByte(); + if (MapsCount == 0) + { + Maps = []; + ChildSoundsHashes = []; + return; + } + Maps = new Dat54AutomationNoteMapSoundData[MapsCount]; ChildSoundsHashes = new MetaHash[MapsCount]; for (int i = 0; i < MapsCount; i++) @@ -4805,7 +5723,7 @@ namespace CodeWalker.GameFiles return offsets.ToArray(); } } - [TC(typeof(EXP))] public class Dat54AutomationNoteMapSoundData : IMetaXmlItem + [TC(typeof(EXP))] public struct Dat54AutomationNoteMapSoundData : IMetaXmlItem { public byte NoteRangeMin { get; set; } public byte NoteRangeMax { get; set; } @@ -4821,6 +5739,15 @@ namespace CodeWalker.GameFiles NoteRangeType = br.ReadByte(); ChildSound = br.ReadUInt32(); } + + public Dat54AutomationNoteMapSoundData(ref SequenceReader br) + { + NoteRangeMin = br.ReadByte(); + NoteRangeMax = br.ReadByte(); + NoteRangeType = br.ReadByte(); + ChildSound = br.ReadUInt32(); + } + public void ReadXml(XmlNode node) { NoteRangeMin = (byte)Xml.GetChildIntAttribute(node, "NoteRangeMin", "value"); @@ -4844,7 +5771,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return NoteRangeMin.ToString() + ": " + NoteRangeMax.ToString() + ": " + NoteRangeType.ToString(); + return $"{NoteRangeMin}: {NoteRangeMax}: {NoteRangeType}"; } } [TC(typeof(EXP))] public class Dat54SoundSetList : Dat54Sound @@ -4854,7 +5781,7 @@ namespace CodeWalker.GameFiles public Dat54SoundSetList(RelFile rel) : base(rel, Dat54SoundType.SoundSetList) { } - public Dat54SoundSetList(RelData d, BinaryReader br) : base(d, br) + public Dat54SoundSetList(in TempRelData d, BinaryReader br) : base(d, br) { SoundSetsCount = br.ReadUInt32(); SoundSets = new MetaHash[SoundSetsCount]; @@ -4863,6 +5790,17 @@ namespace CodeWalker.GameFiles SoundSets[i] = br.ReadUInt32(); } } + + public Dat54SoundSetList(in TempRelData d, ref SequenceReader br) : base(d, ref br) + { + SoundSetsCount = br.ReadUInt32(); + SoundSets = new MetaHash[SoundSetsCount]; + for (int i = 0; i < SoundSetsCount; i++) + { + SoundSets[i] = br.ReadUInt32(); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -4905,7 +5843,7 @@ namespace CodeWalker.GameFiles public Dat54SoundHashList(RelFile rel) : base(rel, Dat54SoundType.SoundHashList) { } - public Dat54SoundHashList(RelData d, BinaryReader br) : base(d, br) + public Dat54SoundHashList(in TempRelData d, BinaryReader br) : base(in d, br) { UnkShort = br.ReadUInt16(); SoundHashesCount = br.ReadUInt32(); @@ -4915,6 +5853,18 @@ namespace CodeWalker.GameFiles SoundHashes[i] = br.ReadUInt32(); } } + + public Dat54SoundHashList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + UnkShort = br.ReadUInt16(); + SoundHashesCount = br.ReadUInt32(); + SoundHashes = new MetaHash[SoundHashesCount]; + for (int i = 0; i < SoundHashesCount; i++) + { + SoundHashes[i] = br.ReadUInt32(); + } + } + public override void ReadXml(XmlNode node) { base.ReadXml(node); @@ -5079,7 +6029,7 @@ namespace CodeWalker.GameFiles Type = type; TypeID = (byte)type; } - public Dat151RelData(RelData d, BinaryReader br) : base(d) + public Dat151RelData(in TempRelData d, BinaryReader br) : base(in d) { Type = (Dat151RelType)TypeID; @@ -5087,6 +6037,14 @@ namespace CodeWalker.GameFiles NameTableOffset = ((br.ReadUInt32() >> 8) & 0xFFFFFF); } + public Dat151RelData(in TempRelData d, ref SequenceReader br) : base(in d) + { + Type = (Dat151RelType)TypeID; + + br.Rewind(1); //1 byte was read already (TypeID) + + NameTableOffset = ((br.ReadUInt32() >> 8) & 0xFFFFFF); + } public void WriteTypeAndOffset(BinaryWriter bw) @@ -5098,11 +6056,12 @@ namespace CodeWalker.GameFiles public override string ToString() { - return GetBaseString() + ": " + Type.ToString(); + return $"{GetBaseString()}: {Type}"; } } - [TC(typeof(EXP))] public struct Dat151HashPair : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat151HashPair : IMetaXmlItem { public MetaHash Hash0 { get; set; } public MetaHash Hash1 { get; set; } @@ -5112,12 +6071,19 @@ namespace CodeWalker.GameFiles Hash0 = br.ReadUInt32(); Hash1 = br.ReadUInt32(); } - public void Write(BinaryWriter bw) + + public Dat151HashPair(ref SequenceReader br) + { + Hash0 = br.ReadUInt32(); + Hash1 = br.ReadUInt32(); + } + + public readonly void Write(BinaryWriter bw) { bw.Write(Hash0); bw.Write(Hash1); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "Hash0", RelXml.HashString(Hash0)); RelXml.StringTag(sb, indent, "Hash1", RelXml.HashString(Hash1)); @@ -5127,9 +6093,9 @@ namespace CodeWalker.GameFiles Hash0 = XmlRel.GetHash(Xml.GetChildInnerText(node, "Hash0")); Hash1 = XmlRel.GetHash(Xml.GetChildInnerText(node, "Hash1")); } - public override string ToString() + public override readonly string ToString() { - return Hash0.ToString() + ": " + Hash1.ToString(); + return $"{Hash0}: {Hash1}"; } } [TC(typeof(EXP))] public struct Dat151HashFloat : IMetaXmlItem @@ -5159,7 +6125,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Hash.ToString() + ": " + Value.ToString(); + return $"{Hash}: {Value}"; } } @@ -5181,7 +6147,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.StaticEmitterList; TypeID = (byte)Type; } - public Dat151StaticEmitterList(RelData d, BinaryReader br) : base(d, br) + public Dat151StaticEmitterList(in TempRelData d, BinaryReader br) : base(in d, br) { EmitterCount = br.ReadUInt32(); EmitterHashes = new MetaHash[EmitterCount]; @@ -5190,6 +6156,17 @@ namespace CodeWalker.GameFiles EmitterHashes[i] = br.ReadUInt32(); } } + + public Dat151StaticEmitterList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + EmitterCount = br.ReadUInt32(); + EmitterHashes = new MetaHash[EmitterCount]; + for (int i = 0; i < EmitterCount; i++) + { + EmitterHashes[i] = br.ReadUInt32(); + } + } + public override void Write(BinaryWriter bw) { //base.Write(bw); @@ -5260,6 +6237,13 @@ namespace CodeWalker.GameFiles Name = br.ReadUInt32(); Value = br.ReadSingle(); } + + public DependentAmbience(ref SequenceReader br) + { + Name = br.ReadUInt32(); + Value = br.ReadSingle(); + } + public void Write(BinaryWriter bw) { bw.Write(Name); @@ -5288,7 +6272,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AmbientZone; TypeID = (byte)Type; } - public Dat151AmbientZone(RelData d, BinaryReader br) : base(d, br) + public Dat151AmbientZone(in TempRelData d, BinaryReader br) : base(in d, br) { Flags0 = br.ReadUInt32(); Shape = (Dat151ZoneShape)br.ReadUInt32(); @@ -5331,9 +6315,53 @@ namespace CodeWalker.GameFiles { DependentAmbiences[i] = new DependentAmbience(br); } - if (DependentAmbiencesCount != 0) - { } } + + public Dat151AmbientZone(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Flags0 = br.ReadUInt32(); + Shape = (Dat151ZoneShape)br.ReadUInt32(); + Flags1 = br.ReadUInt32(); + ActivationZonePosition = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Unused01 = br.ReadSingle(); + ActivationZoneSize = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Unused02 = br.ReadSingle(); + ActivationZoneVec1 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + ActivationZoneVec2 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + ActivationZoneAngle = br.ReadUInt32();//### + ActivationZoneVec3 = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + PlaybackZonePosition = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Unused06 = br.ReadSingle(); + PlaybackZoneSize = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Unused07 = br.ReadSingle(); + PlaybackZoneVec1 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + PlaybackZoneVec2 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + PlaybackZoneAngle = br.ReadUInt32();//### + PlaybackZoneVec3 = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + UnkVec1 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + UnkVec2 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + UnkHash0 = br.ReadUInt32(); + Scene = br.ReadUInt32(); + UnkVec3 = new Vector2(br.ReadSingle(), br.ReadSingle()); + Unk13 = br.ReadUInt32(); + Unk14 = br.ReadByte(); + Unk15 = br.ReadByte(); + RulesCount = br.ReadByte(); + Unk16 = br.ReadByte(); + Rules = new MetaHash[RulesCount]; + for (int i = 0; i < RulesCount; i++) + { + Rules[i] = br.ReadUInt32(); + } + + DependentAmbiencesCount = br.ReadUInt32(); + DependentAmbiences = new DependentAmbience[DependentAmbiencesCount]; + for (int i = 0; i < DependentAmbiencesCount; i++) + { + DependentAmbiences[i] = new DependentAmbience(ref br); + } + } + public override void Write(BinaryWriter bw) { //base.Write(bw); @@ -5530,6 +6558,14 @@ namespace CodeWalker.GameFiles Value = br.ReadSingle(); Flags = br.ReadUInt32(); } + + public Variable(ref SequenceReader br) + { + Name = br.ReadUInt32(); + Value = br.ReadSingle(); + Flags = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(Name); @@ -5550,7 +6586,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Name.ToString() + ": " + FloatUtil.ToString(Value) + ": " + Flags.ToString(); + return $"{Name}: {FloatUtil.ToString(Value)}: {Flags}"; } } @@ -5560,7 +6596,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AmbientRule; TypeID = (byte)Type; } - public Dat151AmbientRule(RelData d, BinaryReader br) : base(d, br) + public Dat151AmbientRule(in TempRelData d, BinaryReader br) : base(in d, br) { Flags0 = br.ReadUInt32(); Flags1 = br.ReadUInt32(); @@ -5598,7 +6634,8 @@ namespace CodeWalker.GameFiles int brem = (16 - ((VariablesCount * 12) % 16)) % 16; if (brem > 0) { - byte[] brema = br.ReadBytes(brem); + br.BaseStream.Position += brem; // Skip over padding + //byte[] brema = br.ReadBytes(brem); //for (int i = 0; i < brem; i++) //{ // if (brema[i] != 0) @@ -5606,202 +6643,61 @@ namespace CodeWalker.GameFiles //} } } - - - #region testing - - switch (Frequency.Value) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 18: - case 20: - case 22: - case 24: - case 25: - case 26: - case 30: - case 32: - case 35: - case 40: - case 45: - case 48: - case 50: - case 51: - case 54: - case 55: - case 57: - case 60: - case 64: - case 65: - case 70: - case 75: - case 80: - case 90: - case 95: - case 97: - case 100: - case 120: - case 125: - case 130: - case 135: - case 140: - case 145: - case 150: - case 160: - case 170: - case 178: - case 180: - case 190: - case 200: - case 220: - case 225: - case 240: - case 245: - case 250: - case 300: - case 350: - case 500: - case 600: - break; - default: - break; - } - switch (Unk07.Value) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 12: - case 15: - case 17: - case 20: - case 21: - case 22: - case 25: - case 27: - case 30: - case 32: - case 35: - case 40: - case 50: - case 60: - case 100: - case 150: - break; - default: - break; - } - switch (Unk08.Value) - { - case 0: - case 1: - case 2: - break; - default: - break; - } - switch (Unk09.Value) - { - case 0: - case 1: - case 2: - break; - default: - break; - } - switch (Unk10.Value) - { - case 1: - case 2: - case 3: - case 4: - case 8: - case 255: - break; - default: - break; - } - switch (Unk11.Value) - { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 8: - case 10: - case 255: - break; - default: - break; - } - switch (Unk12.Value) - { - case 0: - case 50: - case 80: - case 100: - break; - default: - break; - } - switch (Unk13.Value) - { - case 1: - case 2: - case 3: - case 5: - break; - default: - break; - } - switch (VariablesCount) - { - case 0: - case 1: - case 2: - case 4: - break; - default: - break; - } - - - - //if ((Position.X != 0) || (Position.Y != 0) || (Position.Z != 0)) - //{ - // FoundCoords.Add(FloatUtil.GetVector3String(Position) + ", " + GetNameString()); - //} - - - #endregion - } + + public Dat151AmbientRule(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Flags0 = br.ReadUInt32(); + Flags1 = br.ReadUInt32(); + Flags2 = br.ReadUInt32(); + Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Flags3 = br.ReadUInt32(); //0 + ChildSound = br.ReadUInt32(); + Category = br.ReadUInt32(); + Flags4 = br.ReadUInt32(); //0 + Flags5 = br.ReadUInt32(); //0xFFFFFFFF + Flags6 = br.ReadUInt32(); //0 + Unk01 = br.ReadSingle(); //1, 5, 100, ... + InnerRadius = br.ReadSingle(); //inner radius of volume (playback bound) + OuterRadius = br.ReadSingle(); //outer radius of volume (activation bound) + StartTime = br.ReadUInt16(); //time allows to start playing, in mins + EndTime = br.ReadUInt16(); //time to stop playing, in mins (max 1440) + Frequency = br.ReadUInt16(); //0..600 + Unk07 = br.ReadUInt16(); //0..150 + Unk08 = br.ReadByte(); //0,1,2 + Unk09 = br.ReadByte(); //0,1,2 + Unk10 = br.ReadByte(); //1,2,3,4,8,255 + Unk11 = br.ReadByte(); //1,2,3,4,5,6,8,10,255 + Unk12 = br.ReadByte(); //0, 50, 80, 100 + Unk13 = br.ReadByte(); //1,2,3,5 + VariablesCount = br.ReadUInt16(); //0,1,2,4 + + if (VariablesCount > 0) + { + Variables = new Variable[VariablesCount]; + for (int i = 0; i < VariablesCount; i++) + { + Variables[i] = new Variable(ref br); + } + //array seems to be padded to multiples of 16 bytes. (read the rest here) + int brem = (16 - ((VariablesCount * 12) % 16)) % 16; + if (brem > 0) + { + br.Advance(brem); // Skip over padding + //byte[] brema = br.ReadBytes(brem); + //for (int i = 0; i < brem; i++) + //{ + // if (brema[i] != 0) + // { } //check all remaining bytes are 0 - never hit here + //} + } + } + else + { + Variables = Array.Empty(); + } + } + public override void Write(BinaryWriter bw) { //base.Write(bw); @@ -5919,7 +6815,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AmbientZoneList; TypeID = (byte)Type; } - public Dat151AmbientZoneList(RelData d, BinaryReader br) : base(d, br) + public Dat151AmbientZoneList(in TempRelData d, BinaryReader br) : base(in d, br) { ZoneCount = br.ReadUInt32(); ZoneHashes = new MetaHash[ZoneCount]; @@ -5928,6 +6824,17 @@ namespace CodeWalker.GameFiles ZoneHashes[i] = br.ReadUInt32(); } } + + public Dat151AmbientZoneList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ZoneCount = br.ReadUInt32(); + ZoneHashes = new MetaHash[ZoneCount]; + for (int i = 0; i < ZoneCount; i++) + { + ZoneHashes[i] = br.ReadUInt32(); + } + } + public override void Write(BinaryWriter bw) { //base.Write(bw); @@ -5984,7 +6891,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.StaticEmitter; TypeID = (byte)Type; } - public Dat151StaticEmitter(RelData d, BinaryReader br) : base(d, br) + public Dat151StaticEmitter(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32();//flags ChildSound = br.ReadUInt32(); @@ -6109,7 +7016,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Interior; TypeID = (byte)Type; } - public Dat151Interior(RelData d, BinaryReader br) : base(d, br) + public Dat151Interior(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Walla = br.ReadUInt32(); @@ -6122,6 +7029,26 @@ namespace CodeWalker.GameFiles } Rooms = rooms; } + + public Dat151Interior(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Flags = br.ReadUInt32(); + Walla = br.ReadUInt32(); + Tunnel = br.ReadUInt32(); + RoomsCount = br.ReadUInt32(); + if (RoomsCount == 0) + { + Rooms = []; + return; + } + var rooms = new MetaHash[RoomsCount]; + for (int i = 0; i < RoomsCount; i++) + { + rooms[i] = br.ReadUInt32(); + } + Rooms = rooms; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6199,7 +7126,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.InteriorRoom; TypeID = (byte)Type; } - public Dat151InteriorRoom(RelData d, BinaryReader br) : base(d, br) + public Dat151InteriorRoom(in TempRelData d, BinaryReader br) : base(in d, br) { Flags0 = br.ReadUInt32(); MloRoom = br.ReadUInt32(); @@ -6218,6 +7145,27 @@ namespace CodeWalker.GameFiles Unk13 = br.ReadUInt32(); SoundSet = br.ReadUInt32(); } + + public Dat151InteriorRoom(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Flags0 = br.ReadUInt32(); + MloRoom = br.ReadUInt32(); + Zone = br.ReadUInt32(); + Unk02 = br.ReadUInt32(); + Unk03 = br.ReadSingle(); + Reverb = br.ReadSingle(); + Echo = br.ReadSingle(); + Sound = br.ReadUInt32(); + Unk07 = br.ReadSingle(); + Unk08 = br.ReadSingle(); + Unk09 = br.ReadSingle(); + Unk10 = br.ReadSingle(); + Unk11 = br.ReadSingle(); + Unk12 = br.ReadSingle(); + Unk13 = br.ReadUInt32(); + SoundSet = br.ReadUInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6300,9 +7248,14 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RadioStationList; TypeID = (byte)Type; } - public Dat151RadioStationList(RelData d, BinaryReader br) : base(d, br) + public Dat151RadioStationList(in TempRelData d, BinaryReader br) : base(in d, br) { StationsCount = br.ReadUInt32(); + if (StationsCount == 0) + { + Stations = []; + return; + } var tracks = new MetaHash[StationsCount]; for (int i = 0; i < StationsCount; i++) { @@ -6310,6 +7263,23 @@ namespace CodeWalker.GameFiles } Stations = tracks; } + + public Dat151RadioStationList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + StationsCount = br.ReadUInt32(); + if (StationsCount == 0) + { + Stations = []; + return; + } + var tracks = new MetaHash[StationsCount]; + for (int i = 0; i < StationsCount; i++) + { + tracks[i] = br.ReadUInt32(); + } + Stations = tracks; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6360,21 +7330,21 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RadioStation; TypeID = (byte)Type; } - public Dat151RadioStation(RelData d, BinaryReader br) : base(d, br) + public Dat151RadioStation(in TempRelData d, BinaryReader br) : base(in d, br) { Unk00 = br.ReadUInt32(); WheelPosition = br.ReadUInt32(); Unk02 = br.ReadUInt32(); MusicGenre = br.ReadUInt16(); - var data = br.ReadBytes(32); - RadioName = Encoding.ASCII.GetString(data).Replace("\0", ""); + var arr = ArrayPool.Shared.Rent(32); + _ = br.Read(arr.AsSpan(0, 32)); + //var data = br.ReadBytes(32); + ArrayPool.Shared.Return(arr); + RadioName = Encoding.ASCII.GetString(arr.AsSpan().ReadTill((byte)0)); Unk04 = br.ReadUInt16(); - if (Unk04 != 0) - { } - MusicListCount = br.ReadUInt32(); var tracks = new MetaHash[MusicListCount]; for (int i = 0; i < MusicListCount; i++) @@ -6383,6 +7353,27 @@ namespace CodeWalker.GameFiles } MusicList = tracks; } + + public Dat151RadioStation(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk00 = br.ReadUInt32(); + WheelPosition = br.ReadUInt32(); + Unk02 = br.ReadUInt32(); + MusicGenre = br.ReadUInt16(); + + RadioName = br.ReadStringLength(32, false); + + Unk04 = br.ReadUInt16(); + + MusicListCount = br.ReadUInt32(); + var tracks = new MetaHash[MusicListCount]; + for (int i = 0; i < MusicListCount; i++) + { + tracks[i] = br.ReadUInt32(); + } + MusicList = tracks; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6472,7 +7463,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RadioTrack; TypeID = (byte)Type; } - public Dat151RadioTrack(RelData d, BinaryReader br) : base(d, br) + public Dat151RadioTrack(in TempRelData d, BinaryReader br) : base(in d, br) { Unk00 = br.ReadUInt32(); TrackType = br.ReadByte(); @@ -6501,6 +7492,37 @@ namespace CodeWalker.GameFiles } this.Tracks = items; } + + public Dat151RadioTrack(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk00 = br.ReadUInt32(); + TrackType = br.ReadByte(); + Unk01 = br.ReadUInt32(); + Unk02 = br.ReadUInt32(); + Unk03 = br.ReadByte(); + Unk04 = br.ReadUInt32(); + Unk05 = br.ReadUInt32(); + Unk06 = br.ReadUInt32(); + Unk07 = br.ReadUInt32(); + Unk08 = br.ReadUInt32(); + Unk09 = br.ReadUInt32(); + Unk10 = br.ReadUInt32(); + Unk11 = br.ReadUInt32(); + Unk12 = br.ReadUInt32(); + Unk13 = br.ReadUInt32(); + Unk14 = br.ReadUInt32(); + Unk15 = br.ReadUInt32(); + Unk16 = br.ReadUInt16(); + TracksCount = br.ReadUInt32(); + + Dat151HashPair[] items = new Dat151HashPair[TracksCount]; + for (int i = 0; i < TracksCount; i++) + { + items[i] = new Dat151HashPair(ref br); + } + this.Tracks = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6599,7 +7621,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.TrackList; TypeID = (byte)Type; } - public Dat151TrackList(RelData d, BinaryReader br) : base(d, br) + public Dat151TrackList(in TempRelData d, BinaryReader br) : base(in d, br) { Unk00 = br.ReadUInt32(); TrackCount = br.ReadUInt32(); @@ -6609,6 +7631,18 @@ namespace CodeWalker.GameFiles Tracks[i] = new Dat151HashPair(br); } } + + public Dat151TrackList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk00 = br.ReadUInt32(); + TrackCount = br.ReadUInt32(); + Tracks = new Dat151HashPair[TrackCount]; + for (int i = 0; i < TrackCount; i++) + { + Tracks[i] = new Dat151HashPair(ref br); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6656,7 +7690,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.WeaponAudioItem; TypeID = (byte)Type; } - public Dat151WeaponAudioItem(RelData d, BinaryReader br) : base(d, br) + public Dat151WeaponAudioItem(in TempRelData d, BinaryReader br) : base(in d, br) { FallBackWeapon = br.ReadUInt32(); WeaponsCount = br.ReadUInt32(); @@ -6668,6 +7702,20 @@ namespace CodeWalker.GameFiles } this.Weapons = items; } + + public Dat151WeaponAudioItem(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + FallBackWeapon = br.ReadUInt32(); + WeaponsCount = br.ReadUInt32(); + + Dat151WeaponAudioItemItem[] items = new Dat151WeaponAudioItemItem[WeaponsCount]; + for (int i = 0; i < WeaponsCount; i++) + { + items[i] = new Dat151WeaponAudioItemItem(ref br); + } + this.Weapons = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6701,7 +7749,7 @@ namespace CodeWalker.GameFiles } public override MetaHash[] GetCategoryHashes() { - var list = new List(); + using var list = new PooledList(); if (Weapons != null) { foreach (var w in Weapons) @@ -6713,22 +7761,24 @@ namespace CodeWalker.GameFiles } public override MetaHash[] GetGameHashes() { - var list = new List(); + using var list = new PooledList(); if (Weapons != null) { - foreach (var w in Weapons) + foreach (ref var w in Weapons.AsSpan()) { list.Add(w.Weapon); } - } - if ((Weapons?.Count(w => (w.Weapon == FallBackWeapon)) ?? 0) == 0) - { - list.Add(FallBackWeapon); + + if (!Weapons.Any(w => (w.Weapon == FallBackWeapon))) + { + list.Add(FallBackWeapon); + } } return list.ToArray(); } } - [TC(typeof(EXP))] public struct Dat151WeaponAudioItemItem : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat151WeaponAudioItemItem : IMetaXmlItem { public MetaHash Category { get; set; } public MetaHash Weapon { get; set; } @@ -6738,6 +7788,12 @@ namespace CodeWalker.GameFiles Category = br.ReadUInt32(); Weapon = br.ReadUInt32(); } + + public Dat151WeaponAudioItemItem(ref SequenceReader br) + { + Category = br.ReadUInt32(); + Weapon = br.ReadUInt32(); + } public void Write(BinaryWriter bw) { bw.Write(Category); @@ -6755,7 +7811,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Category.ToString() + ": " + Weapon.ToString(); + return $"{Category}: {Weapon}"; } } [TC(typeof(EXP))] public class Dat151StartTrackAction : Dat151RelData @@ -6782,7 +7838,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.StartTrackAction; TypeID = (byte)Type; } - public Dat151StartTrackAction(RelData d, BinaryReader br) : base(d, br) + public Dat151StartTrackAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -6799,6 +7855,11 @@ namespace CodeWalker.GameFiles Unk9 = br.ReadInt32(); TracksCount = br.ReadUInt32(); + if (TracksCount == 0) + { + this.Tracks = []; + return; + } Dat151StartTrackActionItem[] items = new Dat151StartTrackActionItem[TracksCount]; for (int i = 0; i < TracksCount; i++) { @@ -6806,6 +7867,38 @@ namespace CodeWalker.GameFiles } this.Tracks = items; } + + public Dat151StartTrackAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadInt32(); + Unk2 = br.ReadInt32(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + Unk3 = br.ReadSingle(); + Track = br.ReadUInt32(); + Mood = br.ReadUInt32(); + Unk5 = br.ReadSingle(); + Unk6 = br.ReadInt32(); + Unk7 = br.ReadInt32(); + Unk8 = br.ReadSingle(); + Unk9 = br.ReadInt32(); + TracksCount = br.ReadUInt32(); + + if (TracksCount == 0) + { + this.Tracks = []; + return; + } + + Dat151StartTrackActionItem[] items = new Dat151StartTrackActionItem[TracksCount]; + for (int i = 0; i < TracksCount; i++) + { + items[i] = new Dat151StartTrackActionItem(ref br); + } + this.Tracks = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6868,24 +7961,26 @@ namespace CodeWalker.GameFiles } public override uint[] GetHashTableOffsets() { - return new uint[] { 12, 16, 28 }; + return [12, 16, 28]; } public override MetaHash[] GetGameHashes() { - return new[] { Bar, Beat, Mood }; + return [Bar, Beat, Mood]; } public override MetaHash[] GetSoundHashes() { - var list = new List(); - list.Add(Track); - if (Tracks != null) + var tracks = Tracks; + if (tracks is null) + return [Track]; + + var arr = new MetaHash[tracks.Length + 1]; + arr[0] = Track; + + for (int i = 0; i < tracks.Length; i++) { - foreach (var t in Tracks) - { - list.Add(t.Track); - } + arr[i + 1] = tracks[i].Track; } - return list.ToArray(); + return arr; } } [TC(typeof(EXP))] public struct Dat151StartTrackActionItem : IMetaXmlItem @@ -6898,6 +7993,12 @@ namespace CodeWalker.GameFiles Track = br.ReadUInt32(); Flags = br.ReadUInt32(); } + + public Dat151StartTrackActionItem(ref SequenceReader br) + { + Track = br.ReadUInt32(); + Flags = br.ReadUInt32(); + } public void Write(BinaryWriter bw) { bw.Write(Track); @@ -6933,7 +8034,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.StopTrackAction; TypeID = (byte)Type; } - public Dat151StopTrackAction(RelData d, BinaryReader br) : base(d, br) + public Dat151StopTrackAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -6943,6 +8044,18 @@ namespace CodeWalker.GameFiles Unk3 = br.ReadSingle(); Unk4 = br.ReadInt32(); } + + public Dat151StopTrackAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadInt32(); + Unk2 = br.ReadInt32(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + Unk3 = br.ReadSingle(); + Unk4 = br.ReadInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -6999,13 +8112,18 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Mood; TypeID = (byte)Type; } - public Dat151Mood(RelData d, BinaryReader br) : base(d, br) + public Dat151Mood(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); FadeIn = br.ReadUInt16(); FadeOut = br.ReadUInt16(); Unk3 = br.ReadSingle(); MoodsCount = br.ReadUInt32(); + if (MoodsCount == 0) + { + Moods = []; + return; + } var items = new Dat151MoodItem[MoodsCount]; for (int i = 0; i < MoodsCount; i++) { @@ -7013,6 +8131,27 @@ namespace CodeWalker.GameFiles } Moods = items; } + + public Dat151Mood(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + FadeIn = br.ReadUInt16(); + FadeOut = br.ReadUInt16(); + Unk3 = br.ReadSingle(); + MoodsCount = br.ReadUInt32(); + if (MoodsCount == 0) + { + Moods = []; + return; + } + var items = new Dat151MoodItem[MoodsCount]; + for (int i = 0; i < MoodsCount; i++) + { + items[i] = new Dat151MoodItem(ref br); + } + Moods = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7046,36 +8185,38 @@ namespace CodeWalker.GameFiles } public override uint[] GetHashTableOffsets() { - var offsets = new List(); + var offsets = new uint[MoodsCount * 4]; for (uint i = 0; i < MoodsCount; i++) { + var index = i * 4; var offs = 16 + i * 32; //offsets for each mood item's subitems - offsets.Add(offs); - offsets.Add(offs + 4); - offsets.Add(offs + 24); - offsets.Add(offs + 28); + offsets[index] = offs; + offsets[index + 1] = offs + 4; + offsets[index + 2] = offs + 24; + offsets[index + 3] = offs + 28; } - return offsets.ToArray(); + return offsets; } public override MetaHash[] GetGameHashes() { - var list = new List(); - if (Moods != null) + if (Moods is null || Moods.Length == 0) + return []; + + using var list = new PooledList(); + + foreach (ref var item in Moods.AsSpan()) { - foreach (var item in Moods) - { - list.Add(item.StemMix); - list.Add(item.StopAction); - list.Add(item.Bar); - list.Add(item.Beat); - } + list.Add(item.StemMix); + list.Add(item.StopAction); + list.Add(item.Bar); + list.Add(item.Beat); } return list.ToArray(); } } [TC(typeof(EXP))] - public class Dat151MoodItem : IMetaXmlItem + public struct Dat151MoodItem : IMetaXmlItem { public MetaHash StemMix { get; set; } public MetaHash StopAction { get; set; } @@ -7086,7 +8227,7 @@ namespace CodeWalker.GameFiles public MetaHash Bar { get; set; }//MusicBar public MetaHash Beat { get; set; }//not used but follows same pattern as TrackAction items. - public override string ToString() + public override readonly string ToString() { return StemMix.ToString(); } @@ -7094,6 +8235,7 @@ namespace CodeWalker.GameFiles public Dat151MoodItem() { } + public Dat151MoodItem(BinaryReader br) { StemMix = br.ReadUInt32(); @@ -7105,7 +8247,20 @@ namespace CodeWalker.GameFiles Bar = br.ReadUInt32(); Beat = br.ReadUInt32(); } - public void Write(BinaryWriter bw) + + public Dat151MoodItem(ref SequenceReader br) + { + StemMix = br.ReadUInt32(); + StopAction = br.ReadUInt32(); + Unk1 = br.ReadSingle(); + Unk2 = br.ReadSingle(); + Unk3 = br.ReadSingle(); + Unk4 = br.ReadSingle(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + } + + public readonly void Write(BinaryWriter bw) { bw.Write(StemMix); bw.Write(StopAction); @@ -7116,7 +8271,7 @@ namespace CodeWalker.GameFiles bw.Write(Bar); bw.Write(Beat); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "StemMix", RelXml.HashString(StemMix)); RelXml.StringTag(sb, indent, "StopAction", RelXml.HashString(StopAction)); @@ -7158,7 +8313,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.SetMoodAction; TypeID = (byte)Type; } - public Dat151SetMoodAction(RelData d, BinaryReader br) : base(d, br) + public Dat151SetMoodAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -7171,6 +8326,21 @@ namespace CodeWalker.GameFiles FadeIn = br.ReadInt32(); FadeOut = br.ReadInt32(); } + + public Dat151SetMoodAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadInt32(); + Unk2 = br.ReadInt32(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + Unk3 = br.ReadSingle(); + Mood = br.ReadUInt32(); + Unk4 = br.ReadSingle(); + FadeIn = br.ReadInt32(); + FadeOut = br.ReadInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7231,9 +8401,14 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.PlayerAction; TypeID = (byte)Type; } - public Dat151PlayerAction(RelData d, BinaryReader br) : base(d, br) + public Dat151PlayerAction(in TempRelData d, BinaryReader br) : base(d, br) { AudioTrackCount = br.ReadUInt32(); + if (AudioTrackCount == 0) + { + AudioTracks = []; + return; + } var tracks = new MetaHash[AudioTrackCount]; for (int i = 0; i < AudioTrackCount; i++) { @@ -7241,6 +8416,23 @@ namespace CodeWalker.GameFiles } AudioTracks = tracks; } + + public Dat151PlayerAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + AudioTrackCount = br.ReadUInt32(); + if (AudioTrackCount == 0) + { + AudioTracks = []; + return; + } + var tracks = new MetaHash[AudioTrackCount]; + for (int i = 0; i < AudioTrackCount; i++) + { + tracks[i] = br.ReadUInt32(); + } + AudioTracks = tracks; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7295,7 +8487,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.StartOneShotAction; TypeID = (byte)Type; } - public Dat151StartOneShotAction(RelData d, BinaryReader br) : base(d, br) + public Dat151StartOneShotAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -7309,6 +8501,22 @@ namespace CodeWalker.GameFiles Unk7 = br.ReadInt32(); Unk8 = br.ReadInt32(); } + + public Dat151StartOneShotAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadInt32(); + Unk2 = br.ReadInt32(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + Unk3 = br.ReadSingle(); + Sound = br.ReadUInt32(); + Unk5 = br.ReadInt32(); + Unk6 = br.ReadInt32(); + Unk7 = br.ReadInt32(); + Unk8 = br.ReadInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7380,7 +8588,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.StopOneShotAction; TypeID = (byte)Type; } - public Dat151StopOneShotAction(RelData d, BinaryReader br) : base(d, br) + public Dat151StopOneShotAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -7389,6 +8597,17 @@ namespace CodeWalker.GameFiles Beat = br.ReadUInt32(); Unk3 = br.ReadInt32(); } + + public Dat151StopOneShotAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadInt32(); + Unk2 = br.ReadInt32(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + Unk3 = br.ReadInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7420,14 +8639,16 @@ namespace CodeWalker.GameFiles } public override uint[] GetHashTableOffsets() { - return new uint[] { 12, 16 }; + return [12, 16]; } public override MetaHash[] GetGameHashes() { - return new[] { Bar, Beat }; + return [Bar, Beat]; } } - [TC(typeof(EXP))] public class Dat151FadeInRadioAction : Dat151RelData + + [TC(typeof(EXP))] + public class Dat151FadeInRadioAction : Dat151RelData { public FlagsUint Unk0 { get; set; } public int Unk1 { get; set; } @@ -7442,7 +8663,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.FadeInRadioAction; TypeID = (byte)Type; } - public Dat151FadeInRadioAction(RelData d, BinaryReader br) : base(d, br) + public Dat151FadeInRadioAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -7452,6 +8673,18 @@ namespace CodeWalker.GameFiles Unk3 = br.ReadSingle(); Unk4 = br.ReadSingle(); } + + public Dat151FadeInRadioAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadInt32(); + Unk2 = br.ReadInt32(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + Unk3 = br.ReadSingle(); + Unk4 = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7486,11 +8719,11 @@ namespace CodeWalker.GameFiles } public override uint[] GetHashTableOffsets() { - return new uint[] { 12, 16 }; + return [12, 16]; } public override MetaHash[] GetGameHashes() { - return new[] { Bar, Beat }; + return [Bar, Beat]; } } [TC(typeof(EXP))] public class Dat151FadeOutRadioAction : Dat151RelData @@ -7508,7 +8741,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.FadeOutRadioAction; TypeID = (byte)Type; } - public Dat151FadeOutRadioAction(RelData d, BinaryReader br) : base(d, br) + public Dat151FadeOutRadioAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -7518,6 +8751,18 @@ namespace CodeWalker.GameFiles Unk3 = br.ReadSingle(); Unk4 = br.ReadSingle(); } + + public Dat151FadeOutRadioAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadInt32(); + Unk2 = br.ReadInt32(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + Unk3 = br.ReadSingle(); + Unk4 = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7552,11 +8797,11 @@ namespace CodeWalker.GameFiles } public override uint[] GetHashTableOffsets() { - return new uint[] { 12, 16 }; + return [12, 16]; } public override MetaHash[] GetGameHashes() { - return new[] { Bar, Beat }; + return [Bar, Beat]; } } [TC(typeof(EXP))] public class Dat151ModelAudioCollisionSettings : Dat151RelData @@ -7591,7 +8836,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ModelAudioCollisionSettings; TypeID = (byte)Type; } - public Dat151ModelAudioCollisionSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151ModelAudioCollisionSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadInt32(); @@ -7618,19 +8863,6 @@ namespace CodeWalker.GameFiles //byte tc3 = (byte)((Unk15 >> 16) & 0xFF); //byte tc4 = (byte)((Unk15 >> 24) & 0xFF); - switch (Unk15)//not sure what this is - { - case 0: - case 1: - case 2: - case 3: - case 4: - break; - default: - break; - } - - if (MaterialsCount == 0) { Material = br.ReadUInt32(); @@ -7647,14 +8879,82 @@ namespace CodeWalker.GameFiles PhysicsCount = br.ReadUInt32(); - var tracks2 = new MetaHash[PhysicsCount]; - for (int i = 0; i < PhysicsCount; i++) + if (PhysicsCount > 0) { - tracks2[i] = br.ReadUInt32(); + var tracks2 = new MetaHash[PhysicsCount]; + for (int i = 0; i < PhysicsCount; i++) + { + tracks2[i] = br.ReadUInt32(); + } + Physics = tracks2; } - Physics = tracks2; + else + { + Physics = []; + } + } } + + public Dat151ModelAudioCollisionSettings(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Flags = br.ReadUInt32(); + Unk01 = br.ReadInt32(); + Unk02 = br.ReadInt32(); + Unk03 = br.ReadInt32(); + Break = br.ReadUInt32(); + Unk05 = br.ReadUInt32(); + Unk06 = br.ReadUInt32(); + Wind = br.ReadUInt32(); + Unk08 = br.ReadUInt32(); + Unk09 = br.ReadSingle(); + Unk10 = br.ReadSingle(); + Rain = br.ReadUInt32(); + Rattle = br.ReadUInt32(); + Unk13 = br.ReadUInt32(); + Resonance = br.ReadUInt32(); + Unk15 = br.ReadByte(); + MaterialsCount = br.ReadByte(); + Unk16 = br.ReadByte(); + Unk17 = br.ReadByte(); + + //byte tc1 = (byte)((Unk15) & 0xFF); + //byte tc2 = (byte)((Unk15 >> 8) & 0xFF); + //byte tc3 = (byte)((Unk15 >> 16) & 0xFF); + //byte tc4 = (byte)((Unk15 >> 24) & 0xFF); + + if (MaterialsCount == 0) + { + Material = br.ReadUInt32(); + //Physics = new MetaHash[] { Material }; + } + else //if (MaterialsCount > 0) + { + var tracks1 = new Dat151ModelAudioCollisionSettingsMaterialItem[MaterialsCount]; + for (int i = 0; i < MaterialsCount; i++) + { + tracks1[i] = new Dat151ModelAudioCollisionSettingsMaterialItem(ref br); + } + Materials = tracks1; + + PhysicsCount = br.ReadUInt32(); + + if (PhysicsCount > 0) + { + var tracks2 = new MetaHash[PhysicsCount]; + for (int i = 0; i < PhysicsCount; i++) + { + tracks2[i] = br.ReadUInt32(); + } + Physics = tracks2; + } + else + { + Physics = []; + } + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7754,9 +9054,10 @@ namespace CodeWalker.GameFiles Physics = XmlRel.ReadHashItemArray(node, "Physics"); PhysicsCount = (uint)(Physics?.Length ?? 0); } + public override uint[] GetHashTableOffsets() { - var offsets = new List(); + using var offsets = new PooledList(); uint offs = 64; if (MaterialsCount == 0) { @@ -7779,13 +9080,15 @@ namespace CodeWalker.GameFiles return offsets.ToArray(); } + public override MetaHash[] GetSoundHashes() { - return new[] { Break, Unk05, Unk06, Wind, Unk08, Rain, Rattle, Unk13, Resonance }; + return [Break, Unk05, Unk06, Wind, Unk08, Rain, Rattle, Unk13, Resonance]; } + public override MetaHash[] GetGameHashes() { - var list = new List(); + using var list = new PooledList(); list.Add(Material); if (Materials != null) { @@ -7813,12 +9116,19 @@ namespace CodeWalker.GameFiles InputMaterial = br.ReadUInt32(); OutputMaterial = br.ReadUInt32(); } - public void Write(BinaryWriter bw) + + public Dat151ModelAudioCollisionSettingsMaterialItem(ref SequenceReader br) + { + InputMaterial = br.ReadUInt32(); + OutputMaterial = br.ReadUInt32(); + } + + public readonly void Write(BinaryWriter bw) { bw.Write(InputMaterial); bw.Write(OutputMaterial); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "InputMaterial", RelXml.HashString(InputMaterial)); RelXml.StringTag(sb, indent, "OutputMaterial", RelXml.HashString(OutputMaterial)); @@ -7828,9 +9138,9 @@ namespace CodeWalker.GameFiles InputMaterial = XmlRel.GetHash(Xml.GetChildInnerText(node, "InputMaterial")); OutputMaterial = XmlRel.GetHash(Xml.GetChildInnerText(node, "OutputMaterial")); } - public override string ToString() + public override readonly string ToString() { - return InputMaterial.ToString() + ": " + OutputMaterial.ToString(); + return $"{InputMaterial}: {OutputMaterial}"; } } [TC(typeof(EXP))] public class Dat151DoorModel : Dat151RelData @@ -7842,10 +9152,16 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.DoorModel; TypeID = (byte)Type; } - public Dat151DoorModel(RelData d, BinaryReader br) : base(d, br) + public Dat151DoorModel(in TempRelData d, BinaryReader br) : base(in d, br) { Door = br.ReadUInt32(); } + + public Dat151DoorModel(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Door = br.ReadUInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -7970,7 +9286,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AudioMaterial; TypeID = (byte)Type; } - public Dat151AudioMaterial(RelData d, BinaryReader br) : base(d, br) + public Dat151AudioMaterial(in TempRelData d, BinaryReader br) : base(in d, br) { Unk00 = br.ReadUInt32(); Unk01 = br.ReadUInt32(); @@ -8066,6 +9382,104 @@ namespace CodeWalker.GameFiles Unk88 = br.ReadUInt32(); Unk89 = br.ReadInt32(); } + + public Dat151AudioMaterial(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk00 = br.ReadUInt32(); + Unk01 = br.ReadUInt32(); + Unk02 = br.ReadUInt32(); + Unk03 = br.ReadUInt32(); + Unk04 = br.ReadUInt32(); + Unk05 = br.ReadUInt32(); + Unk06 = br.ReadUInt32(); + Unk07 = br.ReadUInt32(); + Unk08 = br.ReadUInt32(); + Unk09 = br.ReadUInt32(); + Unk10 = br.ReadUInt32(); + Unk11 = br.ReadUInt32(); + Unk12 = br.ReadUInt32(); + Unk13 = br.ReadUInt32(); + Unk14 = br.ReadUInt32(); + Unk15 = br.ReadInt32(); + Unk16 = br.ReadInt32(); + Unk17 = br.ReadInt32(); + Unk18 = br.ReadInt32(); + Unk19 = br.ReadSingle(); + Unk20 = br.ReadInt32(); + Unk21 = br.ReadSingle(); + Unk22 = br.ReadSingle(); + Unk23 = br.ReadSingle(); + Unk24 = br.ReadSingle(); + Unk25 = br.ReadSingle(); + Unk26 = br.ReadSingle(); + Unk27 = br.ReadInt32(); + Unk28 = br.ReadUInt32(); + Unk29 = br.ReadSingle(); + Unk30 = br.ReadSingle(); + Footsteps = br.ReadUInt32(); + Unk31 = br.ReadInt32(); + Unk32 = br.ReadUInt32(); + AnimalFootsteps = br.ReadUInt32(); + AudioTrack2 = br.ReadUInt32(); + Unk33 = br.ReadUInt32(); + Unk34 = br.ReadUInt32(); + Unk35 = br.ReadUInt32(); + Unk36 = br.ReadUInt32(); + Unk37 = br.ReadUInt32(); + Unk38 = br.ReadUInt32(); + Unk39 = br.ReadUInt32(); + Unk40 = br.ReadUInt32(); + Unk41 = br.ReadUInt32(); + Unk42 = br.ReadUInt32(); + Unk43 = br.ReadUInt32(); + Unk44 = br.ReadUInt32(); + Unk45 = br.ReadUInt32(); + Unk46 = br.ReadUInt32(); + Unk47 = br.ReadUInt32(); + Unk48 = br.ReadUInt32(); + Unk49 = br.ReadUInt32(); + Unk50 = br.ReadUInt32(); + Unk51 = br.ReadUInt32(); + Unk52 = br.ReadUInt32(); + Unk53 = br.ReadUInt32(); + Unk54 = br.ReadUInt32(); + Unk55 = br.ReadSingle(); + Unk56 = br.ReadUInt32(); + Unk57 = br.ReadUInt32(); + Unk58 = br.ReadInt32(); + Unk59 = br.ReadInt32(); + Unk60 = br.ReadSingle(); + Unk61 = br.ReadInt32(); + Unk62 = br.ReadInt32(); + Unk63 = br.ReadUInt32(); + Unk64 = br.ReadUInt32(); + Unk65 = br.ReadUInt32(); + Unk66 = br.ReadInt32(); + Unk67 = br.ReadUInt32(); + Unk68 = br.ReadUInt32(); + Unk69 = br.ReadUInt32(); + Unk70 = br.ReadUInt32(); + Unk71 = br.ReadUInt32(); + Unk72 = br.ReadInt32(); + Unk73 = br.ReadUInt32(); + Unk74 = br.ReadUInt32(); + Unk75 = br.ReadUInt32(); + Unk76 = br.ReadUInt32(); + Unk77 = br.ReadSingle(); + Unk78 = br.ReadUInt32(); + Unk79 = br.ReadUInt32(); + Unk80 = br.ReadUInt32(); + Unk81 = br.ReadUInt32(); + Unk82 = br.ReadUInt32(); + Unk83 = br.ReadUInt32(); + Unk84 = br.ReadUInt32(); + Unk85 = br.ReadInt32(); + Unk86 = br.ReadUInt32(); + Unk87 = br.ReadInt32(); + Unk88 = br.ReadUInt32(); + Unk89 = br.ReadInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -8438,7 +9852,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VehicleCollision; TypeID = (byte)Type; } - public Dat151VehicleCollision(RelData d, BinaryReader br) : base(d, br) + public Dat151VehicleCollision(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadUInt32(); @@ -8505,6 +9919,67 @@ namespace CodeWalker.GameFiles break; } } + + public Dat151VehicleCollision(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Flags = br.ReadUInt32(); + Unk01 = br.ReadUInt32(); + Scrape = br.ReadUInt32(); + SlowScrape = br.ReadUInt32(); + ScrapeImpact = br.ReadUInt32(); + SlowScrapeImpact = br.ReadUInt32(); + Unk06 = br.ReadUInt32(); + Unk07 = br.ReadUInt32(); + Unk08 = br.ReadSingle(); + ScrapePitch = br.ReadUInt32(); + ScrapeVolume = br.ReadUInt32(); + SlowScrapeVolume = br.ReadUInt32(); + ScrapeImpactVolume = br.ReadUInt32(); + SlowScrapeImpactVolume = br.ReadUInt32(); + Unk14 = br.ReadUInt32(); + Unk15 = br.ReadUInt32(); + Unk16 = br.ReadUInt32(); + Unk17 = br.ReadUInt32(); + Unk18 = br.ReadUInt32(); + Unk19 = br.ReadUInt32(); + Unk20 = br.ReadUInt32(); + Unk21 = br.ReadSingle(); + Unk22 = br.ReadSingle(); + Unk23 = br.ReadSingle(); + Unk24 = br.ReadSingle(); + Unk25 = br.ReadSingle(); + Unk26 = br.ReadSingle(); + Unk27 = br.ReadUInt32(); + Unk28 = br.ReadUInt32(); + Unk29 = br.ReadUInt32(); + Unk30 = br.ReadUInt32(); + Unk31 = br.ReadUInt32(); + Unk32 = br.ReadUInt32(); + Unk33 = br.ReadUInt32(); + Unk34 = br.ReadSingle(); + Unk35 = br.ReadSingle(); + Unk36 = br.ReadSingle(); + Unk37 = br.ReadSingle(); + Unk38 = br.ReadUInt32(); + Unk39 = br.ReadSingle(); + Unk40 = br.ReadSingle(); + Unk41 = br.ReadSingle(); + Unk42 = br.ReadSingle(); + Unk43 = br.ReadSingle(); + Unk44 = br.ReadSingle(); + Unk45 = br.ReadUInt32(); + Unk46 = br.ReadUInt32(); + Unk47 = br.ReadUInt32(); + Unk48 = br.ReadUInt32(); + Unk49 = br.ReadUInt32(); + HasAudioTracks = br.ReadUInt32(); + if (HasAudioTracks > 0) + { + AudioTrack0 = br.ReadUInt32(); + AudioTrack1 = br.ReadUInt32(); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -8713,12 +10188,20 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Door; TypeID = (byte)Type; } - public Dat151Door(RelData d, BinaryReader br) : base(d, br) + public Dat151Door(in TempRelData d, BinaryReader br) : base(in d, br) { SoundSet = br.ReadUInt32(); Params = br.ReadUInt32(); Unk1 = br.ReadSingle(); } + + public Dat151Door(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + SoundSet = br.ReadUInt32(); + Params = br.ReadUInt32(); + Unk1 = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -8762,9 +10245,14 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AnimalFootstepsList; TypeID = (byte)Type; } - public Dat151AnimalFootstepsList(RelData d, BinaryReader br) : base(d, br) + public Dat151AnimalFootstepsList(in TempRelData d, BinaryReader br) : base(in d, br) { AnimalFootstepsCount = br.ReadUInt32(); + if (AnimalFootstepsCount == 0) + { + AnimalFootsteps = []; + return; + } var items = new Dat151AnimalFootstepsListItem[AnimalFootstepsCount]; for (uint i = 0; i < AnimalFootstepsCount; i++) { @@ -8772,6 +10260,23 @@ namespace CodeWalker.GameFiles } AnimalFootsteps = items; } + + public Dat151AnimalFootstepsList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + AnimalFootstepsCount = br.ReadUInt32(); + if (AnimalFootstepsCount == 0) + { + AnimalFootsteps = []; + return; + } + var items = new Dat151AnimalFootstepsListItem[AnimalFootstepsCount]; + for (uint i = 0; i < AnimalFootstepsCount; i++) + { + items[i] = new Dat151AnimalFootstepsListItem(ref br); + } + AnimalFootsteps = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -8822,6 +10327,13 @@ namespace CodeWalker.GameFiles Animal = br.ReadUInt32(); Footsteps = br.ReadUInt32(); } + + public Dat151AnimalFootstepsListItem(ref SequenceReader br) + { + Animal = br.ReadUInt32(); + Footsteps = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(Animal); @@ -8839,7 +10351,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Animal.ToString() + ": " + Footsteps.ToString(); + return $"{Animal}: {Footsteps}"; } } @@ -8861,7 +10373,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ForceRadioTrackAction; TypeID = (byte)Type; } - public Dat151ForceRadioTrackAction(RelData d, BinaryReader br) : base(d, br) + public Dat151ForceRadioTrackAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -8872,6 +10384,11 @@ namespace CodeWalker.GameFiles RadioStation = br.ReadUInt32(); Unk5 = br.ReadInt32(); AudioTracksCount = br.ReadUInt32(); + if (AudioTracksCount == 0) + { + AudioTracks = []; + return; + } var tracks = new MetaHash[AudioTracksCount]; for (var i = 0; i < AudioTracksCount; i++) { @@ -8962,7 +10479,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RadioDJSpeechAction; TypeID = (byte)Type; } - public Dat151RadioDjSpeechAction(RelData d, BinaryReader br) : base(d, br) + public Dat151RadioDjSpeechAction(in TempRelData d, BinaryReader br) : base(in d, br) { Unk0 = br.ReadUInt32(); Unk1 = br.ReadInt32(); @@ -8973,6 +10490,19 @@ namespace CodeWalker.GameFiles RadioStation = br.ReadUInt32(); Unk5 = br.ReadInt32(); } + + public Dat151RadioDjSpeechAction(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk0 = br.ReadUInt32(); + Unk1 = br.ReadInt32(); + Unk2 = br.ReadInt32(); + Bar = br.ReadUInt32(); + Beat = br.ReadUInt32(); + Unk3 = br.ReadSingle(); + RadioStation = br.ReadUInt32(); + Unk5 = br.ReadInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9027,19 +10557,22 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.MicrophoneList; TypeID = (byte)Type; } - public Dat151MicrophoneList(RelData d, BinaryReader br) : base(d, br) + public Dat151MicrophoneList(in TempRelData d, BinaryReader br) : base(in d, br) { MicrophonesCount = br.ReadUInt32(); + + if (MicrophonesCount == 0) + { + Microphones = []; + return; + } + var items = new Dat151MicrophoneListItem[MicrophonesCount]; for (var i = 0; i < MicrophonesCount; i++) { items[i] = new Dat151MicrophoneListItem(br); } Microphones = items; - - var bytesleft = br.BaseStream.Length - br.BaseStream.Position; - if (bytesleft != 0) - { } } public override void Write(BinaryWriter bw) { @@ -9125,7 +10658,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.DoorList; TypeID = (byte)Type; } - public Dat151DoorList(RelData d, BinaryReader br) : base(d, br) + public Dat151DoorList(in TempRelData d, BinaryReader br) : base(in d, br) { DoorsCount = br.ReadUInt32(); var items = new Dat151DoorListItem[DoorsCount]; @@ -9134,11 +10667,19 @@ namespace CodeWalker.GameFiles items[i] = new Dat151DoorListItem(br); } Doors = items; - - var bytesleft = br.BaseStream.Length - br.BaseStream.Position; - if (bytesleft != 0) - { } } + + public Dat151DoorList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + DoorsCount = br.ReadUInt32(); + var items = new Dat151DoorListItem[DoorsCount]; + for (var i = 0; i < DoorsCount; i++) + { + items[i] = new Dat151DoorListItem(ref br); + } + Doors = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9192,6 +10733,13 @@ namespace CodeWalker.GameFiles Prop = br.ReadUInt32(); Door = br.ReadUInt32(); } + + public Dat151DoorListItem(ref SequenceReader br) + { + Prop = br.ReadUInt32(); + Door = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(Prop); @@ -9209,7 +10757,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Prop.ToString() + ": " + Door.ToString(); + return $"{Prop}: {Door}"; } } @@ -9223,20 +10771,38 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ShoeList; TypeID = (byte)Type; } - public Dat151ShoeList(RelData d, BinaryReader br) : base(d, br) + public Dat151ShoeList(in TempRelData d, BinaryReader br) : base(in d, br) { ShoesCount = br.ReadUInt32(); + if (ShoesCount == 0) + { + Shoes = []; + return; + } var items = new Dat151ShoeListItem[ShoesCount]; for (var i = 0; i < ShoesCount; i++) { items[i] = new Dat151ShoeListItem(br); } Shoes = items; - - var bytesleft = br.BaseStream.Length - br.BaseStream.Position; - if (bytesleft != 0) - { } } + + public Dat151ShoeList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ShoesCount = br.ReadUInt32(); + if (ShoesCount == 0) + { + Shoes = []; + return; + } + var items = new Dat151ShoeListItem[ShoesCount]; + for (var i = 0; i < ShoesCount; i++) + { + items[i] = new Dat151ShoeListItem(ref br); + } + Shoes = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9290,6 +10856,13 @@ namespace CodeWalker.GameFiles ShoeType = br.ReadUInt32(); Shoe = br.ReadUInt32(); } + + public Dat151ShoeListItem(ref SequenceReader br) + { + ShoeType = br.ReadUInt32(); + Shoe = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(ShoeType); @@ -9307,7 +10880,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return ShoeType.ToString() + ": " + Shoe.ToString(); + return $"{ShoeType}: {Shoe}"; } } @@ -9321,20 +10894,33 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ClothList; TypeID = (byte)Type; } - public Dat151ClothList(RelData d, BinaryReader br) : base(d, br) + public Dat151ClothList(in TempRelData d, BinaryReader br) : base(in d, br) { ClothesCount = br.ReadUInt32(); + if (ClothesCount == 0) + { + Clothes = []; + return; + } var items = new Dat151ClothListItem[ClothesCount]; for (var i = 0; i < ClothesCount; i++) { items[i] = new Dat151ClothListItem(br); } Clothes = items; - - var bytesleft = br.BaseStream.Length - br.BaseStream.Position; - if (bytesleft != 0) - { } } + + public Dat151ClothList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ClothesCount = br.ReadUInt32(); + var items = new Dat151ClothListItem[ClothesCount]; + for (var i = 0; i < ClothesCount; i++) + { + items[i] = new Dat151ClothListItem(ref br); + } + Clothes = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9388,6 +10974,13 @@ namespace CodeWalker.GameFiles ClothType = br.ReadUInt32(); Cloth = br.ReadUInt32(); } + + public Dat151ClothListItem(ref SequenceReader br) + { + ClothType = br.ReadUInt32(); + Cloth = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(ClothType); @@ -9405,11 +10998,12 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return ClothType.ToString() + ": " + Cloth.ToString(); + return $"{ClothType}: {Cloth}"; } } - [TC(typeof(EXP))] public class Dat151VehicleRecordingList : Dat151RelData + [TC(typeof(EXP))] + public class Dat151VehicleRecordingList : Dat151RelData { public uint VehicleRecordingsCount { get; set; } public Dat151VehicleRecordingListItem[] VehicleRecordings { get; set; }//types: ???, VehicleRecording @@ -9419,7 +11013,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VehicleRecordingList; TypeID = (byte)Type; } - public Dat151VehicleRecordingList(RelData d, BinaryReader br) : base(d, br) + public Dat151VehicleRecordingList(in TempRelData d, BinaryReader br) : base(in d, br) { VehicleRecordingsCount = br.ReadUInt32(); var items = new Dat151VehicleRecordingListItem[VehicleRecordingsCount]; @@ -9428,11 +11022,19 @@ namespace CodeWalker.GameFiles items[i] = new Dat151VehicleRecordingListItem(br); } VehicleRecordings = items; - - var bytesleft = br.BaseStream.Length - br.BaseStream.Position; - if (bytesleft != 0) - { } } + + public Dat151VehicleRecordingList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + VehicleRecordingsCount = br.ReadUInt32(); + var items = new Dat151VehicleRecordingListItem[VehicleRecordingsCount]; + for (var i = 0; i < VehicleRecordingsCount; i++) + { + items[i] = new Dat151VehicleRecordingListItem(ref br); + } + VehicleRecordings = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9484,6 +11086,13 @@ namespace CodeWalker.GameFiles ID = br.ReadUInt32(); Recording = br.ReadUInt32(); } + + public Dat151VehicleRecordingListItem(ref SequenceReader br) + { + ID = br.ReadUInt32(); + Recording = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(ID); @@ -9501,7 +11110,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return ID.ToString() + ": " + Recording.ToString(); + return $"{ID}: {Recording}"; } } @@ -9515,7 +11124,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.WeatherTypeList; TypeID = (byte)Type; } - public Dat151WeatherTypeList(RelData d, BinaryReader br) : base(d, br) + public Dat151WeatherTypeList(in TempRelData d, BinaryReader br) : base(in d, br) { WeatherTypesCount = br.ReadUInt32(); var items = new Dat151WeatherTypeListItem[WeatherTypesCount]; @@ -9524,11 +11133,19 @@ namespace CodeWalker.GameFiles items[i] = new Dat151WeatherTypeListItem(br); } WeatherTypes = items; - - var bytesleft = br.BaseStream.Length - br.BaseStream.Position; - if (bytesleft != 0) - { } } + + public Dat151WeatherTypeList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + WeatherTypesCount = br.ReadUInt32(); + var items = new Dat151WeatherTypeListItem[WeatherTypesCount]; + for (var i = 0; i < WeatherTypesCount; i++) + { + items[i] = new Dat151WeatherTypeListItem(ref br); + } + WeatherTypes = items; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9582,6 +11199,13 @@ namespace CodeWalker.GameFiles WeatherType = br.ReadUInt32(); Weather = br.ReadUInt32(); } + + public Dat151WeatherTypeListItem(ref SequenceReader br) + { + WeatherType = br.ReadUInt32(); + Weather = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(WeatherType); @@ -9599,7 +11223,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return WeatherType.ToString() + ": " + Weather.ToString(); + return $"{WeatherType}: {Weather}"; } } @@ -9626,7 +11250,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ShoreLinePool; TypeID = (byte)Type; } - public Dat151ShoreLinePool(RelData d, BinaryReader br) : base(d, br) + public Dat151ShoreLinePool(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); @@ -9648,20 +11272,32 @@ namespace CodeWalker.GameFiles points[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); } Points = points; - - //switch (Unk12) - //{ - // case 4.267251f: - // case 2.055879f: - // break; - // default: - // break; - //} - - var bytesleft = br.BaseStream.Length - br.BaseStream.Position; - if (bytesleft != 0) - { } } + + public Dat151ShoreLinePool(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk01 = br.ReadUInt32(); + Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Unk03 = br.ReadInt32(); + Unk04 = br.ReadInt32(); + Unk05 = br.ReadInt32(); + Unk06 = br.ReadInt32(); + Unk07 = br.ReadInt32(); + Unk08 = br.ReadInt32(); + Unk09 = br.ReadInt32(); + Unk10 = br.ReadInt32(); + Unk11 = br.ReadInt32(); + Unk12 = br.ReadSingle(); + + PointsCount = br.ReadInt32(); + var points = new Vector2[PointsCount]; + for (int i = 0; i < PointsCount; i++) + { + points[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); + } + Points = points; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9740,7 +11376,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ShoreLineLake; TypeID = (byte)Type; } - public Dat151ShoreLineLake(RelData d, BinaryReader br) : base(d, br) + public Dat151ShoreLineLake(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); @@ -9748,7 +11384,7 @@ namespace CodeWalker.GameFiles Unk04 = br.ReadInt32(); Unk05 = br.ReadUInt32(); - byte b1 = (byte)((Unk05) & 0xFF); + //byte b1 = (byte)((Unk05) & 0xFF); byte b2 = (byte)((Unk05>>8) & 0xFF); PointsCount = b2; @@ -9758,11 +11394,28 @@ namespace CodeWalker.GameFiles points[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); } Points = points; - - var bytesleft = br.BaseStream.Length - br.BaseStream.Position; - if (bytesleft != 0) - { } } + + public Dat151ShoreLineLake(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk01 = br.ReadUInt32(); + Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Unk03 = br.ReadInt32(); + Unk04 = br.ReadInt32(); + Unk05 = br.ReadUInt32(); + + //byte b1 = (byte)((Unk05) & 0xFF); + byte b2 = (byte)((Unk05 >> 8) & 0xFF); + PointsCount = b2; + + var points = new Vector2[PointsCount]; + for (int i = 0; i < PointsCount; i++) + { + points[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); + } + Points = points; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9822,7 +11475,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ShoreLineRiver; TypeID = (byte)Type; } - public Dat151ShoreLineRiver(RelData d, BinaryReader br) : base(d, br) + public Dat151ShoreLineRiver(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); @@ -9839,6 +11492,25 @@ namespace CodeWalker.GameFiles } Points = points; } + + public Dat151ShoreLineRiver(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk01 = br.ReadUInt32(); + Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Unk03 = br.ReadSingle(); + Unk04 = br.ReadUInt32(); + Unk05 = br.ReadUInt32(); + Unk06 = br.ReadUInt32(); + PointsCount = br.ReadUInt32(); + + var points = new Vector3[PointsCount]; + for (int i = 0; i < PointsCount; i++) + { + points[i] = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + } + Points = points; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -9905,7 +11577,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ShoreLineOcean; TypeID = (byte)Type; } - public Dat151ShoreLineOcean(RelData d, BinaryReader br) : base(d, br) + public Dat151ShoreLineOcean(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); @@ -9929,6 +11601,32 @@ namespace CodeWalker.GameFiles } Points = points; } + + public Dat151ShoreLineOcean(in TempRelData d, ref SequenceReader br) : base(d, ref br) + { + Unk01 = br.ReadUInt32(); + Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + Unk03 = br.ReadSingle(); + Unk04 = br.ReadUInt32(); + Unk05 = br.ReadUInt32(); + Unk06 = br.ReadSingle(); + Unk07 = br.ReadSingle(); + Unk08 = br.ReadSingle(); + Unk09 = br.ReadSingle(); + Unk10 = br.ReadSingle(); + Unk11 = br.ReadSingle(); + Unk12 = br.ReadSingle(); + + PointsCount = br.ReadUInt32(); + + var points = new Vector2[PointsCount]; + for (int i = 0; i < PointsCount; i++) + { + points[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); + } + Points = points; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -10001,7 +11699,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ShoreLineList; TypeID = (byte)Type; } - public Dat151ShoreLineList(RelData d, BinaryReader br) : base(d, br) + public Dat151ShoreLineList(in TempRelData d, BinaryReader br) : base(in d, br) { ShoreLineCount = br.ReadUInt32(); var shorelines = new MetaHash[ShoreLineCount]; @@ -10011,6 +11709,18 @@ namespace CodeWalker.GameFiles } ShoreLines = shorelines; } + + public Dat151ShoreLineList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ShoreLineCount = br.ReadUInt32(); + var shorelines = new MetaHash[ShoreLineCount]; + for (int i = 0; i < ShoreLineCount; i++) + { + shorelines[i] = br.ReadUInt32(); + } + ShoreLines = shorelines; + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -10050,6 +11760,13 @@ namespace CodeWalker.GameFiles Time = br.ReadUInt32(); Event = br.ReadUInt32(); } + + public EventData(ref SequenceReader br) + { + Time = br.ReadUInt32(); + Event = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(Time); @@ -10077,7 +11794,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RadioTrackEvents; TypeID = (byte)Type; } - public Dat151RadioTrackEvents(RelData d, BinaryReader br) : base(d, br) + public Dat151RadioTrackEvents(in TempRelData d, BinaryReader br) : base(in d, br) { EventCount = br.ReadUInt32(); Events = new EventData[EventCount]; @@ -10086,6 +11803,17 @@ namespace CodeWalker.GameFiles Events[i] = new EventData(br); } } + + public Dat151RadioTrackEvents(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + EventCount = br.ReadUInt32(); + Events = new EventData[EventCount]; + for (int i = 0; i < EventCount; i++) + { + Events[i] = new EventData(ref br); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -10174,7 +11902,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VehicleEngineGranular; TypeID = (byte)Type; } - public Dat151VehicleEngineGranular(RelData d, BinaryReader br) : base(d, br) + public Dat151VehicleEngineGranular(in TempRelData d, BinaryReader br) : base(in d, br) { var basePosition = br.BaseStream.Position; Flags = br.ReadUInt32(); @@ -10236,62 +11964,6 @@ namespace CodeWalker.GameFiles Unk56 = br.ReadInt32(); Unk57 = br.ReadInt32(); - - - switch (this.Flags) - { - case 0xAAAAA905: - case 0xAAAAA955: - case 0xAAAAA954: - case 0xAAAAA914: - case 0xAAAAA904: - case 0xAAAAA805: - case 0xAAAAA915: - case 0xAAAAA945: - case 0xAAAAA815: - case 0xAAAAA944: - case 0xAAAAA854: - break; - default: - break; - } - switch (this.Unk40) - { - case 1225003942: - break; - default: - break; - } - switch (this.Unk41) - { - case 1479769906: - break; - default: - break; - } - switch (this.Unk43) - { - case 5: - case 3: - case 4: - case 2: - case 6: - case 1: - break; - default: - break; - } - switch (this.Unk44) - { - case 2: - case 1: - case 3: - case 4: - break; - default: - break; - } - var bytesleft = d.Data.Length - (br.BaseStream.Position - basePosition); switch (bytesleft) //any other way to tell?? { @@ -10300,22 +11972,88 @@ namespace CodeWalker.GameFiles case 8: Unk58 = br.ReadInt32(); Unk59 = br.ReadSingle(); - switch (Unk58) - { - case 1: - case 2: - case 0: - break; - default: - break;//no hit here - } - if ((Unk58 == 0) && (Unk59 == 0)) - { }//no hit here break; default: break;//no hit here } } + + public Dat151VehicleEngineGranular(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + var basePosition = br.Consumed; + Flags = br.ReadUInt32(); + MasterVolume = br.ReadInt32(); + EngineAccel = br.ReadUInt32(); + ExhaustAccel = br.ReadUInt32(); + Unk04 = br.ReadInt32(); + Unk05 = br.ReadInt32(); + Unk06 = br.ReadInt32(); + Unk07 = br.ReadInt32(); + Unk08 = br.ReadInt32(); + Unk09 = br.ReadInt32(); + Unk10 = br.ReadInt32(); + Unk11 = br.ReadInt32(); + Unk12 = br.ReadInt32(); + EngineVolume = br.ReadInt32(); + ExhaustVolume = br.ReadInt32(); + EngineIdleVolume = br.ReadInt32(); + ExhaustIdleVolume = br.ReadInt32(); + Unk17 = br.ReadInt32(); + Unk18 = br.ReadInt32(); + EngineAccelVolume = br.ReadInt32(); + ExhaustAccelVolume = br.ReadInt32(); + Unk21 = br.ReadInt32(); + Unk22 = br.ReadSingle(); + Unk23 = br.ReadSingle(); + Unk24 = br.ReadSingle(); + Unk25 = br.ReadSingle(); + Unk26 = br.ReadSingle(); + Unk27 = br.ReadSingle(); + Unk28 = br.ReadSingle(); + Unk29 = br.ReadInt32(); + Unk30 = br.ReadInt32(); + EngineSubmix = br.ReadUInt32(); + EngineSubmixPreset = br.ReadUInt32(); + ExhaustSubmix = br.ReadUInt32(); + ExhaustSubmixPreset = br.ReadUInt32(); + EngineAccelNPC = br.ReadUInt32(); + ExhaustAccelNPC = br.ReadUInt32(); + LimiterPops = br.ReadUInt32(); + Unk38 = br.ReadInt32(); + Unk39 = br.ReadInt32(); + Unk40 = br.ReadUInt32(); + Unk41 = br.ReadUInt32(); + Unk42 = br.ReadInt32(); + Unk43 = br.ReadInt32(); + Unk44 = br.ReadInt32(); + IdleSub = br.ReadUInt32(); + Unk46 = br.ReadInt32(); + Unk47 = br.ReadInt32(); + Unk48 = br.ReadInt32(); + Unk49 = br.ReadInt32(); + Unk50 = br.ReadUInt32(); + Unk51 = br.ReadUInt32(); + EngineDamage = br.ReadUInt32(); + LimiterPopsUpgraded = br.ReadUInt32(); + Unk54 = br.ReadInt32(); + Unk55 = br.ReadInt32(); + Unk56 = br.ReadInt32(); + Unk57 = br.ReadInt32(); + + var bytesleft = d.Data.Length - (br.Consumed - basePosition); + switch (bytesleft) //any other way to tell?? + { + case 0: + break; + case 8: + Unk58 = br.ReadInt32(); + Unk59 = br.ReadSingle(); + break; + default: + break;//no hit here + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffset(bw); @@ -10600,7 +12338,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Vehicle; TypeID = (byte)Type; } - public Dat151Vehicle(RelData d, BinaryReader br) : base(d, br) + public Dat151Vehicle(in TempRelData d, BinaryReader br) : base(in d, br) { var basePosition = br.BaseStream.Position; Flags = br.ReadUInt32(); //2432719400 0x91005A28 @@ -10675,8 +12413,6 @@ namespace CodeWalker.GameFiles break; case 4: Unk63 = br.ReadUInt32();//flags?? 0xE38FCF16 - if (Unk63 == 0) - { } break; case 36: Unk63 = br.ReadUInt32();//flags?? 0xE38FCF16 @@ -10689,82 +12425,105 @@ namespace CodeWalker.GameFiles Unk70 = br.ReadInt32(); Unk71 = br.ReadUInt32();//flags?? 0xE38FCF16 Unk72 = br.ReadUInt32();//flags?? 0xE38FCF16 - if (Unk70 != 0) - { } - if (Unk68 == 0) - { } - if (Unk71 == 0) - { } - if (Unk72 == 0) - { } - break; default: break; } - if (bytesleft != 0) - { } - - - - if (Unk15 != 0) - { } - if (Unk16 != 0) - { } - if (Unk17 != 0) - { } - if (Unk40 != 0) - { } - if (Unk42 != 0) - { } - if (Unk43 != 0) - { } - if (Unk44 != 0) - { } - - switch (Unk21) - { - case 31: - case 0: - break; - default: - break; - } - switch (Unk22) - { - case 36: - case 100: - case 1: - break; - default: - break; - } - switch (Unk49) - { - case 8: - case 5: - case 3: - case 1: - case 4: - case 0: - case 6: - case 7: - break; - default: - break; - } - switch (EngineHealth) - { - case 2: - case 3: - case 0: - case 1: - break; - default: - break; - } - } + + public Dat151Vehicle(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + var basePosition = br.Consumed; + Flags = br.ReadUInt32(); //2432719400 0x91005A28 + Engine = br.ReadUInt32(); + EngineGranular = br.ReadUInt32(); + Horns = br.ReadUInt32(); + DoorOpen = br.ReadUInt32(); + DoorClose = br.ReadUInt32(); + TrunkOpen = br.ReadUInt32(); + TrunkClose = br.ReadUInt32(); + Unk08 = br.ReadUInt32(); + Unk09 = br.ReadSingle(); + SuspensionUp = br.ReadUInt32(); + SuspensionDown = br.ReadUInt32(); + SuspensionUpFrequency = br.ReadSingle(); + SuspensionDownFrequency = br.ReadSingle(); + Collision = br.ReadUInt32(); + Unk15 = br.ReadInt32(); + Unk16 = br.ReadInt32(); + Unk17 = br.ReadInt32(); + PoliceScannerParams = br.ReadUInt32(); + JumpLandIntact = br.ReadUInt32(); + JumpLandLoose = br.ReadUInt32(); + Unk21 = br.ReadInt32(); + Unk22 = br.ReadInt32(); + RadioFlags = br.ReadUInt32(); + IndicatorOn = br.ReadUInt32(); + IndicatorOff = br.ReadUInt32(); + Handbrake = br.ReadUInt32(); + Unk27 = br.ReadUInt16(); + Unk28 = br.ReadUInt16(); + ParkingTones = br.ReadUInt32(); + Unk29 = br.ReadUInt32(); + Unk30 = br.ReadUInt32(); + Unk31 = br.ReadUInt32(); + Fire = br.ReadUInt32(); + StartupSequence = br.ReadUInt32(); + Unk34 = br.ReadUInt32(); + Unk35 = br.ReadUInt32(); + Unk36 = br.ReadUInt32(); + Unk37 = br.ReadSingle(); + Unk38 = br.ReadSingle(); + Unk39 = br.ReadUInt32(); + Unk40 = br.ReadInt32(); + Sirens = br.ReadUInt32(); + Unk42 = br.ReadInt32(); + Unk43 = br.ReadInt32(); + Unk44 = br.ReadInt32(); + Unk45 = br.ReadUInt32(); + Unk46 = br.ReadUInt32(); + Fork = br.ReadUInt32(); + Turret = br.ReadUInt32(); + Unk49 = br.ReadInt32(); + Scoop = br.ReadUInt32(); + TowArm = br.ReadUInt32(); + Unk52 = br.ReadInt32(); + ElectricEngine = br.ReadUInt32(); + Unk54 = br.ReadSingle(); + ReverseWarning = br.ReadUInt32(); + EngineHealth = br.ReadInt32(); + Cloth = br.ReadUInt32(); + ShutdownBeep = br.ReadUInt32(); + Unk59 = br.ReadSingle(); + Unk60 = br.ReadInt32(); + Unk61 = br.ReadSingle(); + Unk62 = br.ReadInt32(); + + var bytesleft = d.Data.Length - (br.Consumed - basePosition); + switch (bytesleft) //any other way to tell..? + { + case 0: + break; + case 4: + Unk63 = br.ReadUInt32();//flags?? 0xE38FCF16 + break; + case 36: + Unk63 = br.ReadUInt32();//flags?? 0xE38FCF16 + Unk64 = br.ReadInt32(); + Unk65 = br.ReadUInt16(); + Unk66 = br.ReadUInt16(); + ConvertibleRoof = br.ReadUInt32();//flags? 0x536F6CAC + Unk68 = br.ReadUInt32();//flags?? 0xE38FCF16 + InteriorTones = br.ReadUInt32();//flags? 0x7C9B8D8C + Unk70 = br.ReadInt32(); + Unk71 = br.ReadUInt32();//flags?? 0xE38FCF16 + Unk72 = br.ReadUInt32();//flags?? 0xE38FCF16 + break; + default: + break; + } + } + public override void Write(BinaryWriter bw) { //base.Write(bw); @@ -11087,7 +12846,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VehicleEngine; TypeID = (byte)Type; } - public Dat151VehicleEngine(RelData d, BinaryReader br) : base(d, br) + public Dat151VehicleEngine(in TempRelData d, BinaryReader br) : base(in d, br) { MasterVolume = br.ReadInt32(); EngineLowVolume = br.ReadInt32(); @@ -11407,7 +13166,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VehicleScannerParams; TypeID = (byte)Type; } - public Dat151VehicleScannerParams(RelData d, BinaryReader br) : base(d, br) + public Dat151VehicleScannerParams(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); ParamCount = br.ReadInt32(); @@ -11539,7 +13298,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Weapon; TypeID = (byte)Type; } - public Dat151Weapon(RelData d, BinaryReader br) : base(d, br) + public Dat151Weapon(in TempRelData d, BinaryReader br) : base(in d, br) { var basePosition = br.BaseStream.Position; Flags = br.ReadUInt32(); @@ -11928,7 +13687,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Explosion; TypeID = (byte)Type; } - public Dat151Explosion(RelData d, BinaryReader br) : base(d, br) + public Dat151Explosion(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32();//flags Main = br.ReadUInt32();//hash @@ -11995,7 +13754,8 @@ namespace CodeWalker.GameFiles return new[] { Main, Debris, SlowMotion, Unk10 }; } } - [TC(typeof(EXP))] public class Dat151PedVoiceGroupItem : IMetaXmlItem + [TC(typeof(EXP))] + public class Dat151PedVoiceGroupItem : IMetaXmlItem { public MetaHash Name { get; set; } public FlagsUint Unk1 { get; set; } @@ -12008,11 +13768,6 @@ namespace CodeWalker.GameFiles Name = br.ReadUInt32(); Unk1 = br.ReadUInt32(); Unk2 = br.ReadUInt32(); - - if (Unk1 != 0) - { }//no hit - if (Unk2 != 0) - { }//no hit } public void Write(BinaryWriter bw) { @@ -12034,7 +13789,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Name.ToString() + ", " + Unk1.Value.ToString() + ", " + Unk2.Value.ToString(); + return $"{Name}, {Unk1.Value}, {Unk2.Value}"; } } [TC(typeof(EXP))] public class Dat151PedVoiceGroup : Dat151RelData @@ -12058,7 +13813,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.PedVoiceGroup; TypeID = (byte)Type; } - public Dat151PedVoiceGroup(RelData d, BinaryReader br) : base(d, br) + public Dat151PedVoiceGroup(in TempRelData d, BinaryReader br) : base(in d, br) { Unk00 = br.ReadUInt32();//flags? Unk01 = br.ReadByte();//94 @@ -12066,25 +13821,49 @@ namespace CodeWalker.GameFiles Unk03 = br.ReadByte();//245 FullCount = br.ReadByte(); - Full = new Dat151PedVoiceGroupItem[FullCount]; - for (int i = 0; i < FullCount; i++) + if (FullCount > 0) { - Full[i] = new Dat151PedVoiceGroupItem(br); + Full = new Dat151PedVoiceGroupItem[FullCount]; + for (int i = 0; i < FullCount; i++) + { + Full[i] = new Dat151PedVoiceGroupItem(br); + } } + else + { + Full = []; + } + MiniCount = br.ReadByte(); - Mini = new Dat151PedVoiceGroupItem[MiniCount]; - for (int i = 0; i < MiniCount; i++) + if (MiniCount > 0) { - Mini[i] = new Dat151PedVoiceGroupItem(br); + Mini = new Dat151PedVoiceGroupItem[MiniCount]; + for (int i = 0; i < MiniCount; i++) + { + Mini[i] = new Dat151PedVoiceGroupItem(br); + } + } + else + { + Mini = []; } + UnkItemsCount = br.ReadByte(); - UnkItems = new Dat151PedVoiceGroupItem[UnkItemsCount]; - for (int i = 0; i < UnkItemsCount; i++) + if (UnkItemsCount > 0) { - UnkItems[i] = new Dat151PedVoiceGroupItem(br); + UnkItems = new Dat151PedVoiceGroupItem[UnkItemsCount]; + for (int i = 0; i < UnkItemsCount; i++) + { + UnkItems[i] = new Dat151PedVoiceGroupItem(br); + } } + else + { + UnkItems = []; + } + Unk07 = br.ReadByte(); } @@ -12185,7 +13964,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.EntityEmitter; TypeID = (byte)Type; } - public Dat151EntityEmitter(RelData d, BinaryReader br) : base(d, br) + public Dat151EntityEmitter(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); ChildSound = br.ReadUInt32(); @@ -12325,7 +14104,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Boat; TypeID = (byte)Type; } - public Dat151Boat(RelData d, BinaryReader br) : base(d, br) + public Dat151Boat(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Engine = br.ReadUInt32(); @@ -12644,7 +14423,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Bicycle; TypeID = (byte)Type; } - public Dat151Bicycle(RelData d, BinaryReader br) : base(d, br) + public Dat151Bicycle(in TempRelData d, BinaryReader br) : base(in d, br) { Chain = br.ReadUInt32(); Sprocket = br.ReadUInt32(); @@ -12847,7 +14626,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Aeroplane; TypeID = (byte)Type; } - public Dat151Aeroplane(RelData d, BinaryReader br) : base(d, br) + public Dat151Aeroplane(in TempRelData d, BinaryReader br) : base(in d, br) { var basePosition = br.BaseStream.Position; Flags = br.ReadUInt32(); @@ -13402,7 +15181,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Helicopter; TypeID = (byte)Type; } - public Dat151Helicopter(RelData d, BinaryReader br) : base(d, br) + public Dat151Helicopter(in TempRelData d, BinaryReader br) : base(in d, br) { var basePosition = br.BaseStream.Position; Flags = br.ReadUInt32(); @@ -13848,7 +15627,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VehicleTrailer; TypeID = (byte)Type; } - public Dat151VehicleTrailer(RelData d, BinaryReader br) : base(d, br) + public Dat151VehicleTrailer(in TempRelData d, BinaryReader br) : base(in d, br) { Suspension = br.ReadUInt32(); Unk02 = br.ReadInt32(); @@ -13966,7 +15745,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Train; TypeID = (byte)Type; } - public Dat151Train(RelData d, BinaryReader br) : base(d, br) + public Dat151Train(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = br.ReadUInt32(); @@ -14243,7 +16022,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AnimalParams; TypeID = (byte)Type; } - public Dat151AnimalParams(RelData d, BinaryReader br) : base(d, br) + public Dat151AnimalParams(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); @@ -14341,7 +16120,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.SpeechParams; TypeID = (byte)Type; } - public Dat151SpeechParams(RelData d, BinaryReader br) : base(d, br) + public Dat151SpeechParams(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadInt32(); @@ -14414,7 +16193,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.MeleeCombat; TypeID = (byte)Type; } - public Dat151MeleeCombat(RelData d, BinaryReader br) : base(d, br) + public Dat151MeleeCombat(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = br.ReadUInt32(); @@ -14526,7 +16305,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.SpeechContext; TypeID = (byte)Type; } - public Dat151SpeechContext(RelData d, BinaryReader br) : base(d, br) + public Dat151SpeechContext(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadInt32(); @@ -14634,7 +16413,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.SpeechChoice; TypeID = (byte)Type; } - public Dat151SpeechChoice(RelData d, BinaryReader br) : base(d, br) + public Dat151SpeechChoice(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadUInt32(); @@ -14754,7 +16533,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VirtualSpeechChoice; TypeID = (byte)Type; } - public Dat151VirtualSpeechChoice(RelData d, BinaryReader br) : base(d, br) + public Dat151VirtualSpeechChoice(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadUInt32(); @@ -14837,7 +16616,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.SpeechContextList; TypeID = (byte)Type; } - public Dat151SpeechContextList(RelData d, BinaryReader br) : base(d, br) + public Dat151SpeechContextList(in TempRelData d, BinaryReader br) : base(in d, br) { SpeechContextsCount = br.ReadInt32(); SpeechContexts = new MetaHash[SpeechContextsCount]; @@ -14899,7 +16678,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Shoe; TypeID = (byte)Type; } - public Dat151Shoe(RelData d, BinaryReader br) : base(d, br) + public Dat151Shoe(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = br.ReadUInt32(); @@ -15082,7 +16861,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Unk22; TypeID = (byte)Type; } - public Dat151Unk22(RelData d, BinaryReader br) : base(d, br) + public Dat151Unk22(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); Unk02 = br.ReadInt32(); @@ -15158,7 +16937,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Skis; TypeID = (byte)Type; } - public Dat151Skis(RelData d, BinaryReader br) : base(d, br) + public Dat151Skis(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = br.ReadUInt32();//0 @@ -15223,7 +17002,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RadioTrackCategory; TypeID = (byte)Type; } - public Dat151RadioTrackCategory(RelData d, BinaryReader br) : base(d, br) + public Dat151RadioTrackCategory(in TempRelData d, BinaryReader br) : base(in d, br) { ItemCount = br.ReadInt32(); Items = new Dat151RadioTrackCategoryItem[ItemCount]; @@ -15283,11 +17062,12 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Track.ToString() + ": " + PreDelay.ToString(); + return $"{Track}: {PreDelay}"; } } - [TC(typeof(EXP))] public class Dat151PoliceScannerCrime : Dat151RelData + [TC(typeof(EXP))] + public class Dat151PoliceScannerCrime : Dat151RelData { public MetaHash ReportedBy { get; set; } public MetaHash ReportedByPed { get; set; } @@ -15303,7 +17083,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.PoliceScannerCrime; TypeID = (byte)Type; } - public Dat151PoliceScannerCrime(RelData d, BinaryReader br) : base(d, br) + public Dat151PoliceScannerCrime(in TempRelData d, BinaryReader br) : base(in d, br) { ReportedBy = br.ReadUInt32(); ReportedByPed = br.ReadUInt32(); @@ -15376,7 +17156,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RaceToPedVoiceGroup; TypeID = (byte)Type; } - public Dat151RaceToPedVoiceGroup(RelData d, BinaryReader br) : base(d, br) + public Dat151RaceToPedVoiceGroup(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Universal = br.ReadUInt32();//0 @@ -15469,7 +17249,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.PedType; TypeID = (byte)Type; } - public Dat151PedType(RelData d, BinaryReader br) : base(d, br) + public Dat151PedType(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); } @@ -15500,7 +17280,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.PoliceScannerReport; TypeID = (byte)Type; } - public Dat151PoliceScannerReport(RelData d, BinaryReader br) : base(d, br) + public Dat151PoliceScannerReport(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); ReportsCount = br.ReadInt32(); @@ -15581,7 +17361,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Unk1.ToString() + ": " + Unk2.ToString() + ", " + Unk3.ToString(); + return $"{Unk1}: {Unk2}, {Unk3}"; } } @@ -15606,7 +17386,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.PoliceScannerLocation; TypeID = (byte)Type; } - public Dat151PoliceScannerLocation(RelData d, BinaryReader br) : base(d, br) + public Dat151PoliceScannerLocation(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32();//0 Unk02 = br.ReadUInt32();//0 @@ -15689,7 +17469,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.PoliceScannerLocationList; TypeID = (byte)Type; } - public Dat151PoliceScannerLocationList(RelData d, BinaryReader br) : base(d, br) + public Dat151PoliceScannerLocationList(in TempRelData d, BinaryReader br) : base(in d, br) { LocationsCount = br.ReadInt32(); Locations = new MetaHash[LocationsCount]; @@ -15756,10 +17536,12 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return WaveSlot.ToString() + ", " + BankName.ToString() + ", " + Unk3.ToString(); + return $"{WaveSlot}, {BankName}, {Unk3}"; } } - [TC(typeof(EXP))] public class Dat151AmbienceSlotMap : Dat151RelData //contains eg amb_stream_bird_01 + + [TC(typeof(EXP))] + public class Dat151AmbienceSlotMap : Dat151RelData //contains eg amb_stream_bird_01 { public int AmbienceSlotsCount { get; set; } public Dat151AmbienceSlotMapItem[] AmbienceSlots { get; set; } @@ -15769,7 +17551,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AmbienceSlotMap; TypeID = (byte)Type; } - public Dat151AmbienceSlotMap(RelData d, BinaryReader br) : base(d, br) + public Dat151AmbienceSlotMap(in TempRelData d, BinaryReader br) : base(in d, br) { AmbienceSlotsCount = br.ReadInt32(); AmbienceSlots = new Dat151AmbienceSlotMapItem[AmbienceSlotsCount]; @@ -15808,7 +17590,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AmbienceBankMap; TypeID = (byte)Type; } - public Dat151AmbienceBankMap(RelData d, BinaryReader br) : base(d, br) + public Dat151AmbienceBankMap(in TempRelData d, BinaryReader br) : base(in d, br) { AmbienceBanksCount = br.ReadInt32(); AmbienceBanks = new Dat151AmbienceBankMapItem[AmbienceBanksCount]; @@ -15838,7 +17620,8 @@ namespace CodeWalker.GameFiles } } - [TC(typeof(EXP))] public struct Dat151AmbienceBankMapItem : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat151AmbienceBankMapItem : IMetaXmlItem { public MetaHash AudioBank { get; set; } public MetaHash BankName { get; set; } @@ -15865,11 +17648,12 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return AudioBank.ToString() + ": " + BankName.ToString(); + return $"{AudioBank}: {BankName}"; } } - [TC(typeof(EXP))] public class Dat151AmbientZoneParams : Dat151RelData + [TC(typeof(EXP))] + public class Dat151AmbientZoneParams : Dat151RelData { public FlagsUint Flags { get; set; } public MetaHash Unk01 { get; set; }//0 @@ -15888,7 +17672,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AmbientZoneParams; TypeID = (byte)Type; } - public Dat151AmbientZoneParams(RelData d, BinaryReader br) : base(d, br) + public Dat151AmbientZoneParams(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadUInt32();//0 @@ -15960,7 +17744,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.InteriorRoomParams; TypeID = (byte)Type; } - public Dat151InteriorRoomParams(RelData d, BinaryReader br) : base(d, br) + public Dat151InteriorRoomParams(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadSingle(); Unk02 = br.ReadSingle(); @@ -16012,7 +17796,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.DoorParams; TypeID = (byte)Type; } - public Dat151DoorParams(RelData d, BinaryReader br) : base(d, br) + public Dat151DoorParams(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadSingle(); @@ -16076,7 +17860,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Climbing; TypeID = (byte)Type; } - public Dat151Climbing(RelData d, BinaryReader br) : base(d, br) + public Dat151Climbing(in TempRelData d, BinaryReader br) : base(in d, br) { Launch = br.ReadUInt32(); Foot = br.ReadUInt32(); @@ -16133,7 +17917,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.WeatherType; TypeID = (byte)Type; } - public Dat151WeatherType(RelData d, BinaryReader br) : base(d, br) + public Dat151WeatherType(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadSingle(); Unk02 = br.ReadSingle(); @@ -16225,7 +18009,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.StemMix; TypeID = (byte)Type; } - public Dat151StemMix(RelData d, BinaryReader br) : base(d, br) + public Dat151StemMix(in TempRelData d, BinaryReader br) : base(in d, br) { Stem1Volume = br.ReadInt16(); Stem2Volume = br.ReadInt16(); @@ -16281,7 +18065,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.MusicBeat; TypeID = (byte)Type; } - public Dat151MusicBeat(RelData d, BinaryReader br) : base(d, br) + public Dat151MusicBeat(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt16(); } @@ -16310,7 +18094,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.MusicBar; TypeID = (byte)Type; } - public Dat151MusicBar(RelData d, BinaryReader br) : base(d, br) + public Dat151MusicBar(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); Unk02 = br.ReadInt32(); @@ -16360,7 +18144,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.DependentAmbience; TypeID = (byte)Type; } - public Dat151DependentAmbience(RelData d, BinaryReader br) : base(d, br) + public Dat151DependentAmbience(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); ChildSound1 = br.ReadUInt32(); @@ -16482,7 +18266,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ConductorState; TypeID = (byte)Type; } - public Dat151ConductorState(RelData d, BinaryReader br) : base(d, br) + public Dat151ConductorState(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); Unk02 = br.ReadSingle(); @@ -16620,7 +18404,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Unk1.ToString() + ": " + ItemCount1.ToString() + ", " + ItemCount2.ToString(); + return $"{Unk1}: {ItemCount1}, {ItemCount2}"; } } [TC(typeof(EXP))] public class Dat151AnimalSounds : Dat151RelData @@ -16633,7 +18417,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AnimalSounds; TypeID = (byte)Type; } - public Dat151AnimalSounds(RelData d, BinaryReader br) : base(d, br) + public Dat151AnimalSounds(in TempRelData d, BinaryReader br) : base(in d, br) { ItemCount = br.ReadByte();//1 Items = new Dat151AnimalSoundsItem[ItemCount]; @@ -16736,7 +18520,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VehicleScannerColourList; TypeID = (byte)Type; } - public Dat151VehicleScannerColourList(RelData d, BinaryReader br) : base(d, br) + public Dat151VehicleScannerColourList(in TempRelData d, BinaryReader br) : base(in d, br) { Black = br.ReadUInt32(); Blue = br.ReadUInt32(); @@ -17033,7 +18817,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Unk77; TypeID = (byte)Type; } - public Dat151Unk77(RelData d, BinaryReader br) : base(d, br) + public Dat151Unk77(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32();//0 Unk02 = br.ReadSingle(); @@ -17120,7 +18904,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return string.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}", Unk01, Unk02, Unk03, Unk04, Unk05, Unk06, Unk07, Unk08, Unk09); + return $"{Unk01}, {Unk02}, {Unk03}, {Unk04}, {Unk05}, {Unk06}, {Unk07}, {Unk08}, {Unk09}"; } } [TC(typeof(EXP))] public class Dat151Microphone : Dat151RelData @@ -17137,7 +18921,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Microphone; TypeID = (byte)Type; } - public Dat151Microphone(RelData d, BinaryReader br) : base(d, br) + public Dat151Microphone(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadByte(); @@ -17197,7 +18981,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.VehicleRecording; TypeID = (byte)Type; } - public Dat151VehicleRecording(RelData d, BinaryReader br) : base(d, br) + public Dat151VehicleRecording(in TempRelData d, BinaryReader br) : base(in d, br) { Group = br.ReadUInt32(); Duration = br.ReadInt32(); @@ -17299,7 +19083,7 @@ namespace CodeWalker.GameFiles } [TC(typeof(EXP))] - public class Dat151VehicleRecordingItem : IMetaXmlItem + public struct Dat151VehicleRecordingItem : IMetaXmlItem { public float Time { get; set; } public MetaHash Sound { get; set; } @@ -17333,11 +19117,11 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Time.ToString() + ", " + Sound.ToString() + ", " + Scene.ToString(); + return $"{Time}, {Sound}, {Scene}"; } } [TC(typeof(EXP))] - public class Dat151VehicleRecordingItem2 : IMetaXmlItem + public struct Dat151VehicleRecordingItem2 : IMetaXmlItem { public MetaHash Scene { get; set; } public float FadeIn { get; set; } @@ -17392,7 +19176,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AnimalFootsteps; TypeID = (byte)Type; } - public Dat151AnimalFootsteps(RelData d, BinaryReader br) : base(d, br) + public Dat151AnimalFootsteps(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = br.ReadUInt32(); @@ -17474,7 +19258,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Cloth; TypeID = (byte)Type; } - public Dat151Cloth(RelData d, BinaryReader br) : base(d, br) + public Dat151Cloth(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadUInt32(); @@ -17569,7 +19353,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RadioTrackSettings; TypeID = (byte)Type; } - public Dat151RadioTrackSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151RadioTrackSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = br.ReadInt32(); @@ -17604,7 +19388,8 @@ namespace CodeWalker.GameFiles return new[] { Unk01, Unk03 }; } } - [TC(typeof(EXP))] public class Dat151StealthSettingsItem : IMetaXmlItem + [TC(typeof(EXP))] + public class Dat151StealthSettingsItem : IMetaXmlItem { public MetaHash Unk01 { get; set; }//name eg. default, good_stealth, bad_stealth, soft_steps, drunk public float Unk02 { get; set; } @@ -17661,15 +19446,6 @@ namespace CodeWalker.GameFiles Unk23 = br.ReadInt32(); Unk24 = br.ReadUInt32();//0 Unk25 = br.ReadSingle(); - - if (Unk08 != 0) - { } - if (Unk12 != 0) - { } - if (Unk16 != 0) - { } - if (Unk24 != 0) - { } } public void Write(BinaryWriter bw) { @@ -17775,7 +19551,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.StealthSettings; TypeID = (byte)Type; } - public Dat151StealthSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151StealthSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadSingle(); Unk02 = br.ReadSingle(); @@ -17833,7 +19609,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Unk99; TypeID = (byte)Type; } - public Dat151Unk99(RelData d, BinaryReader br) : base(d, br) + public Dat151Unk99(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadSingle(); } @@ -17879,7 +19655,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Tunnel; TypeID = (byte)Type; } - public Dat151Tunnel(RelData d, BinaryReader br) : base(d, br) + public Dat151Tunnel(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadSingle(); @@ -17991,7 +19767,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Alarm; TypeID = (byte)Type; } - public Dat151Alarm(RelData d, BinaryReader br) : base(d, br) + public Dat151Alarm(in TempRelData d, BinaryReader br) : base(in d, br) { DistantAlarm = br.ReadUInt32(); Curve = br.ReadUInt32(); @@ -18064,7 +19840,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.SlowMoSettings; TypeID = (byte)Type; } - public Dat151SlowMoSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151SlowMoSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Scene = br.ReadUInt32(); Unk02 = br.ReadInt32(); @@ -18117,13 +19893,19 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Scenario; TypeID = (byte)Type; } - public Dat151Scenario(RelData d, BinaryReader br) : base(d, br) + public Dat151Scenario(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadInt32(); Sound = br.ReadUInt32(); Unk03 = br.ReadSingle(); VariationsCount = br.ReadInt32(); + if (VariationsCount == 0) + { + Variations = []; + return; + } + Variations = new Dat151ScenarioItem[VariationsCount]; for (int i = 0; i < VariationsCount; i++) { @@ -18204,7 +19986,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Prop.ToString() + ": " + Sound.ToString(); + return $"{Prop}: {Sound}"; } } [TC(typeof(EXP))] public class Dat151PortalSettings : Dat151RelData @@ -18219,7 +20001,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.PortalSettings; TypeID = (byte)Type; } - public Dat151PortalSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151PortalSettings(in TempRelData d, BinaryReader br) : base(in d, br) { MaxOcclusion = br.ReadSingle(); } @@ -18262,7 +20044,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ElectricEngine; TypeID = (byte)Type; } - public Dat151ElectricEngine(RelData d, BinaryReader br) : base(d, br) + public Dat151ElectricEngine(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); Transmission = br.ReadUInt32(); @@ -18371,7 +20153,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.BreathSettings; TypeID = (byte)Type; } - public Dat151BreathSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151BreathSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); Unk02 = br.ReadInt32(); @@ -18458,14 +20240,15 @@ namespace CodeWalker.GameFiles Unk18 = Xml.GetChildIntAttribute(node, "Unk18", "value"); } } - [TC(typeof(EXP))] public class Dat151WallaSpeechItem : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat151WallaSpeechItem : IMetaXmlItem { public string Name { get; set; } //eg AGREE_ACROSS_STREET public byte Unk1 { get; set; }// 1 or 255(-1?) public override string ToString() { - return Name + ", " + Unk1.ToString(); + return $"{Name}, {Unk1}"; } public Dat151WallaSpeechItem() @@ -18513,7 +20296,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.WallaSpeech; TypeID = (byte)Type; } - public Dat151WallaSpeech(RelData d, BinaryReader br) : base(d, br) + public Dat151WallaSpeech(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = br.ReadInt16(); @@ -18639,7 +20422,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.AircraftWarningSettings; TypeID = (byte)Type; } - public Dat151AircraftWarningSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151AircraftWarningSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); Unk02 = br.ReadUInt32();//0 @@ -18886,7 +20669,8 @@ namespace CodeWalker.GameFiles Unk58 = Xml.GetChildIntAttribute(node, "Unk58", "value"); } } - [TC(typeof(EXP))] public class Dat151WallaSpeechListItem : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat151WallaSpeechListItem : IMetaXmlItem { public MetaHash Unk01 { get; set; } public float Unk02 { get; set; } @@ -18905,9 +20689,6 @@ namespace CodeWalker.GameFiles Unk04 = br.ReadByte(); Unk05 = br.ReadByte(); Unk06 = br.ReadInt16(); - - if (Unk06 != 0) - { } } public void Write(BinaryWriter bw) { @@ -18938,10 +20719,11 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Unk01.ToString() + ": " + Unk02.ToString() + ", " + Unk03.ToString() + ", " + Unk04.ToString() + ", " + Unk05.ToString(); + return $"{Unk01}: {Unk02}, {Unk03}, {Unk04}, {Unk05}"; } } - [TC(typeof(EXP))] public class Dat151WallaSpeechList : Dat151RelData + [TC(typeof(EXP))] + public class Dat151WallaSpeechList : Dat151RelData { public int ItemCount { get; set; } public Dat151WallaSpeechListItem[] Items { get; set; } @@ -18951,7 +20733,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.WallaSpeechList; TypeID = (byte)Type; } - public Dat151WallaSpeechList(RelData d, BinaryReader br) : base(d, br) + public Dat151WallaSpeechList(in TempRelData d, BinaryReader br) : base(in d, br) { ItemCount = br.ReadInt32(); Items = new Dat151WallaSpeechListItem[ItemCount]; @@ -19042,7 +20824,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.CopDispatchInteractionSettings; TypeID = (byte)Type; } - public Dat151CopDispatchInteractionSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151CopDispatchInteractionSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); Unk02 = br.ReadInt32(); @@ -19255,7 +21037,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Unk115; TypeID = (byte)Type; } - public Dat151Unk115(RelData d, BinaryReader br) : base(d, br) + public Dat151Unk115(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); Unk01 = br.ReadSingle(); @@ -19382,7 +21164,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.TennisVFXSettings; TypeID = (byte)Type; } - public Dat151TennisVFXSettings(RelData d, BinaryReader br) : base(d, br) + public Dat151TennisVFXSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32();//0 Unk02 = br.ReadSingle(); @@ -19473,7 +21255,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Unk118; TypeID = (byte)Type; } - public Dat151Unk118(RelData d, BinaryReader br) : base(d, br) + public Dat151Unk118(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt32(); Unk02 = br.ReadInt32(); @@ -19579,7 +21361,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.Foliage; TypeID = (byte)Type; } - public Dat151Foliage(RelData d, BinaryReader br) : base(d, br) + public Dat151Foliage(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadUInt32(); Unk02 = br.ReadUInt32(); @@ -19620,7 +21402,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.ModelAudioCollisionSettingsOverride; TypeID = (byte)Type; } - public Dat151ModelAudioCollisionSettingsOverride(RelData d, BinaryReader br) : base(d, br) + public Dat151ModelAudioCollisionSettingsOverride(in TempRelData d, BinaryReader br) : base(in d, br) { ItemCount = br.ReadInt32(); Items = new Dat151ModelAudioCollisionSettingsOverrideItem[ItemCount]; @@ -19689,7 +21471,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return Prop.ToString() + ": " + ModelAudioCollisionSettings.ToString(); + return $"{Prop}: {ModelAudioCollisionSettings}"; } } [TC(typeof(EXP))] public class Dat151RadioStationList2 : Dat151RelData @@ -19703,7 +21485,7 @@ namespace CodeWalker.GameFiles Type = Dat151RelType.RadioStationList2; TypeID = (byte)Type; } - public Dat151RadioStationList2(RelData d, BinaryReader br) : base(d, br) + public Dat151RadioStationList2(in TempRelData d, BinaryReader br) : base(in d, br) { Flags = br.ReadUInt32(); ItemCount = br.ReadUInt32(); @@ -19779,7 +21561,8 @@ namespace CodeWalker.GameFiles Type = type; TypeID = (byte)type; } - public Dat4ConfigData(RelData d, BinaryReader br) : base(d) + + public Dat4ConfigData(in TempRelData d, BinaryReader br) : base(in d) { Type = (Dat4ConfigType)TypeID; @@ -19787,9 +21570,16 @@ namespace CodeWalker.GameFiles NameTableOffset = ((br.ReadUInt32() >> 8) & 0xFFFFFF); Flags = br.ReadUInt32(); + } - if (Flags != 0xAAAAAAAA) - { } + public Dat4ConfigData(in TempRelData d, ref SequenceReader reader) : base(in d) + { + Type = (Dat4ConfigType)TypeID; + + reader.Rewind(1); //1 byte was read already (TypeID) + + NameTableOffset = ((reader.ReadUInt32() >> 8) & 0xFFFFFF); + Flags = reader.ReadUInt32(); } public override void Write(BinaryWriter bw) @@ -19815,7 +21605,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return GetBaseString() + ": " + Type.ToString(); + return $"{GetBaseString()}: {Type}"; } } @@ -19828,10 +21618,16 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.Int; TypeID = (byte)Type; } - public Dat4ConfigInt(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigInt(in TempRelData d, BinaryReader br) : base(d, br) { Value = br.ReadInt32(); } + + public Dat4ConfigInt(in TempRelData d, ref SequenceReader reader) : base(d, ref reader) + { + Value = reader.ReadInt32(); + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -19857,10 +21653,16 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.UnsignedInt; TypeID = (byte)Type; } - public Dat4ConfigUnsignedInt(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigUnsignedInt(in TempRelData d, BinaryReader br) : base(in d, br) { Value = br.ReadUInt32(); } + + public Dat4ConfigUnsignedInt(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + Value = reader.ReadUInt32(); + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -19886,10 +21688,16 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.Float; TypeID = (byte)Type; } - public Dat4ConfigFloat(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigFloat(in TempRelData d, BinaryReader br) : base(in d, br) { Value = br.ReadSingle(); } + + public Dat4ConfigFloat(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + Value = reader.ReadSingle(); + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -19915,11 +21723,22 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.String; TypeID = (byte)Type; } - public Dat4ConfigString(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigString(in TempRelData d, BinaryReader br) : base(in d, br) { var data = br.ReadBytes(64); Value = Encoding.ASCII.GetString(data).Replace("\0", ""); } + + public Dat4ConfigString(in TempRelData d, ref SequenceReader reader) : base(in d, ref reader) + { + reader.TryReadTo(out ReadOnlySpan data, 0, false); + Value = Encoding.ASCII.GetString(data); + if (data.Length < 64) + { + reader.Advance(64 - data.Length); + } + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -19952,12 +21771,20 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.Vector3; TypeID = (byte)Type; } - public Dat4ConfigVector3(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigVector3(in TempRelData d, BinaryReader br) : base(in d, br) { - br.ReadBytes(8); // alignment padding + br.BaseStream.Position += 8; Value = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());//0x10-0x1C - br.ReadBytes(4); // alignment padding + br.BaseStream.Position += 4; } + + public Dat4ConfigVector3(in TempRelData d, ref SequenceReader br) : base(d, ref br) + { + br.Advance(8); // alignment padding + Value = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());//0x10-0x1C + br.Advance(4); // alignment padding + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -19982,7 +21809,7 @@ namespace CodeWalker.GameFiles { public int VariableCount { get; set; } public VariableValue[] Variables { get; set; } - public class VariableValue : IMetaXmlItem + public struct VariableValue : IMetaXmlItem { public MetaHash Name { get; set; } public float Value { get; set; } @@ -19993,12 +21820,19 @@ namespace CodeWalker.GameFiles Name = br.ReadUInt32(); Value = br.ReadSingle(); } - public void Write(BinaryWriter bw) + + public VariableValue(ref SequenceReader br) + { + Name = br.ReadUInt32(); + Value = br.ReadSingle(); + } + + public readonly void Write(BinaryWriter bw) { bw.Write(Name); bw.Write(Value); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "Name", RelXml.HashString(Name)); RelXml.ValueTag(sb, indent, "Value", FloatUtil.ToString(Value)); @@ -20008,9 +21842,9 @@ namespace CodeWalker.GameFiles Name = XmlRel.GetHash(Xml.GetChildInnerText(node, "Name")); Value = Xml.GetChildFloatAttribute(node, "Value", "value"); } - public override string ToString() + public override readonly string ToString() { - return Name + ": " + Value.ToString(); + return $"{Name}: {Value}"; } } @@ -20019,15 +21853,37 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.VariableList; TypeID = (byte)Type; } - public Dat4ConfigVariableList(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigVariableList(in TempRelData d, BinaryReader br) : base(in d, br) { VariableCount = br.ReadInt32(); + if (VariableCount == 0) + { + Variables = []; + return; + } Variables = new VariableValue[VariableCount]; for (int i = 0; i < VariableCount; i++) { Variables[i] = new VariableValue(br); } } + + public Dat4ConfigVariableList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + VariableCount = br.ReadInt32(); + if (VariableCount == 0) + { + Variables = []; + return; + } + + Variables = new VariableValue[VariableCount]; + for (int i = 0; i < VariableCount; i++) + { + Variables[i] = new VariableValue(ref br); + } + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -20063,7 +21919,7 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.WaveSlot; TypeID = (byte)Type; } - public Dat4ConfigWaveSlot(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigWaveSlot(in TempRelData d, BinaryReader br) : base(in d, br) { Unk1 = br.ReadInt32(); MaxHeaderSize = br.ReadInt32(); @@ -20072,6 +21928,17 @@ namespace CodeWalker.GameFiles MaxDataSize = br.ReadInt32(); Unk6 = br.ReadInt32(); } + + public Dat4ConfigWaveSlot(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk1 = br.ReadInt32(); + MaxHeaderSize = br.ReadInt32(); + Size = br.ReadInt32(); + StaticBank = br.ReadUInt32(); + MaxDataSize = br.ReadInt32(); + Unk6 = br.ReadInt32(); + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -20113,15 +21980,37 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.WaveSlotsList; TypeID = (byte)Type; } - public Dat4ConfigWaveSlotsList(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigWaveSlotsList(in TempRelData d, BinaryReader br) : base(in d, br) { WaveSlotsCount = br.ReadInt32(); + if (WaveSlotsCount == 0) + { + WaveSlots = Array.Empty(); + return; + } WaveSlots = new MetaHash[WaveSlotsCount]; for (int i = 0; i < WaveSlotsCount; i++) { WaveSlots[i] = br.ReadUInt32(); } } + + public Dat4ConfigWaveSlotsList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + WaveSlotsCount = br.ReadInt32(); + if (WaveSlotsCount == 0) + { + WaveSlots = Array.Empty(); + return; + } + + WaveSlots = new MetaHash[WaveSlotsCount]; + for (int i = 0; i < WaveSlotsCount; i++) + { + WaveSlots[i] = br.ReadUInt32(); + } + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -20172,7 +22061,7 @@ namespace CodeWalker.GameFiles Vector4[] hash_EACC7FE3 { get; set; } - public class Pass : IMetaXmlItem + public struct Pass : IMetaXmlItem { public float UnkFloat { get; set; } public int UnkInt { get; set; } @@ -20183,6 +22072,13 @@ namespace CodeWalker.GameFiles UnkFloat = br.ReadSingle(); UnkInt = br.ReadInt32(); } + + public Pass(ref SequenceReader br) + { + UnkFloat = br.ReadSingle(); + UnkInt = br.ReadInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(UnkFloat); @@ -20200,7 +22096,7 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return FloatUtil.ToString(UnkFloat) + ", " + UnkInt.ToString(); + return $"{FloatUtil.ToString(UnkFloat)}, {UnkInt}"; } } @@ -20210,7 +22106,7 @@ namespace CodeWalker.GameFiles Type = Dat4ConfigType.ERSettings; TypeID = (byte)Type; } - public Dat4ConfigERSettings(RelData d, BinaryReader br) : base(d, br) + public Dat4ConfigERSettings(in TempRelData d, BinaryReader br) : base(in d, br) { RoomSize = br.ReadSingle(); hash_1F616274 = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); @@ -20248,6 +22144,46 @@ namespace CodeWalker.GameFiles hash_EACC7FE3[i] = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); } } + + public Dat4ConfigERSettings(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + RoomSize = br.ReadSingle(); + hash_1F616274 = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + ListenerPos = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + AllPassesCount = br.ReadInt32(); + AllPasses = new Pass[AllPassesCount]; + for (int i = 0; i < AllPassesCount; i++) + { + AllPasses[i] = new Pass(ref br); + } + hash_84F123DC = new Vector4[6]; + for (int i = 0; i < hash_84F123DC.Length; i++) + { + hash_84F123DC[i] = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + } + hash_526F5F8A = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + hash_5071232B = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + hash_7D4AA574 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + hash_0776BC75_Count = br.ReadInt32(); + hash_0776BC75 = new Vector4[hash_0776BC75_Count]; + for (int i = 0; i < hash_0776BC75_Count; i++) + { + hash_0776BC75[i] = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + } + hash_7475AA16_Count = br.ReadInt32(); + hash_7475AA16 = new Vector4[hash_0776BC75_Count]; + for (int i = 0; i < hash_7475AA16_Count; i++) + { + hash_7475AA16[i] = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + } + hash_EACC7FE3_Count = br.ReadInt32(); + hash_EACC7FE3 = new Vector4[hash_0776BC75_Count]; + for (int i = 0; i < hash_EACC7FE3_Count; i++) + { + hash_EACC7FE3[i] = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); + } + } + public override void Write(BinaryWriter bw) { base.Write(bw); @@ -20388,7 +22324,8 @@ namespace CodeWalker.GameFiles Container = 8, } - [TC(typeof(EXP))] public class Dat4SpeechData : RelData + [TC(typeof(EXP))] + public class Dat4SpeechData : RelData { public Dat4SpeechType Type { get; set; } @@ -20399,10 +22336,21 @@ namespace CodeWalker.GameFiles public Dat4SpeechData(RelFile rel) : base(rel) { } - public Dat4SpeechData(RelData d, BinaryReader br) : base(d) + public Dat4SpeechData(in TempRelData d, BinaryReader br) : base(in d) { br.BaseStream.Position--; //1 byte was read already (TypeID) + if ((TypeID == 4) && (d.Data.Length == 8)) + { + NameTableOffset = ((br.ReadUInt32() >> 8) & 0xFFFFFF); + ContainerHash = br.ReadUInt32(); + } + } + + public Dat4SpeechData(in TempRelData d, ref SequenceReader br) : base(in d) + { + br.Rewind(1); //1 byte was read already (TypeID) + if ((TypeID == 4) && (d.Data.Length == 8)) { @@ -20464,21 +22412,21 @@ namespace CodeWalker.GameFiles } } - public override uint[] GetHashTableOffsets() + public override uint[]? GetHashTableOffsets() { switch (Type) { case Dat4SpeechType.Hash: - return new uint[] { 0 }; + return [0]; } return null; } - public override uint[] GetPackTableOffsets() + public override uint[]? GetPackTableOffsets() { switch (Type) { case Dat4SpeechType.Container: - return new uint[] { 4 }; + return [4]; } return null; } @@ -20488,9 +22436,9 @@ namespace CodeWalker.GameFiles switch (Type) { case Dat4SpeechType.Hash: - return GetBaseString() + ": " + Type.ToString() + ": " + Hash.ToString(); + return $"{GetBaseString()}: {Type}: {Hash}"; case Dat4SpeechType.Container: - return GetBaseString() + ": " + Type.ToString() + ": " + ContainerHash.ToString(); + return $"{GetBaseString()}: {Type}: {ContainerHash}"; } return GetBaseString(); } @@ -20524,7 +22472,7 @@ namespace CodeWalker.GameFiles Type = type; TypeID = (byte)type; } - public Dat10RelData(RelData d, BinaryReader br) : base(d) + public Dat10RelData(in TempRelData d, BinaryReader br) : base(in d) { Type = (Dat10RelType)TypeID; @@ -20534,6 +22482,16 @@ namespace CodeWalker.GameFiles Flags = br.ReadUInt32(); } + public Dat10RelData(in TempRelData d, ref SequenceReader br) : base(in d) + { + Type = (Dat10RelType)TypeID; + + br.Rewind(1); //1 byte was read already (TypeID) + + NameTableOffset = ((br.ReadUInt32() >> 8) & 0xFFFFFF); + Flags = br.ReadUInt32(); + } + public void WriteTypeAndOffsetAndFlags(BinaryWriter bw) { var val = ((NameTableOffset & 0xFFFFFF) << 8) + TypeID; @@ -20543,11 +22501,12 @@ namespace CodeWalker.GameFiles public override string ToString() { - return GetBaseString() + ": " + Type.ToString(); + return $"{GetBaseString()}: {Type}"; } } - [TC(typeof(EXP))] public class Dat10SynthPresetVariable : IMetaXmlItem + [TC(typeof(EXP))] + public struct Dat10SynthPresetVariable : IMetaXmlItem { public MetaHash Name { get; set; } public float Value1 { get; set; } @@ -20561,13 +22520,21 @@ namespace CodeWalker.GameFiles Value1 = br.ReadSingle(); Value2 = br.ReadSingle(); } - public void Write(BinaryWriter bw) + + public Dat10SynthPresetVariable(ref SequenceReader br) + { + Name = br.ReadUInt32(); + Value1 = br.ReadSingle(); + Value2 = br.ReadSingle(); + } + + public readonly void Write(BinaryWriter bw) { bw.Write(Name); bw.Write(Value1); bw.Write(Value2); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "Name", RelXml.HashString(Name)); RelXml.ValueTag(sb, indent, "Value1", FloatUtil.ToString(Value1)); @@ -20579,9 +22546,9 @@ namespace CodeWalker.GameFiles Value1 = Xml.GetChildFloatAttribute(node, "Value1", "value"); Value2 = Xml.GetChildFloatAttribute(node, "Value2", "value"); } - public override string ToString() + public override readonly string ToString() { - return Name.ToString() + ": " + Value1.ToString() + ", " + Value2.ToString(); + return $"{Name}: {Value1}, {Value2}"; } } [TC(typeof(EXP))] public class Dat10SynthPreset : Dat10RelData @@ -20594,15 +22561,36 @@ namespace CodeWalker.GameFiles Type = Dat10RelType.SynthPreset; TypeID = (byte)Type; } - public Dat10SynthPreset(RelData d, BinaryReader br) : base(d, br) + public Dat10SynthPreset(in TempRelData d, BinaryReader br) : base(in d, br) { VariableCount = br.ReadByte(); + if (VariableCount == 0) + { + Variables = []; + return; + } Variables = new Dat10SynthPresetVariable[VariableCount]; for (int i = 0; i < VariableCount; i++) { Variables[i] = new Dat10SynthPresetVariable(br); } } + + public Dat10SynthPreset(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + VariableCount = br.ReadByte(); + if (VariableCount == 0) + { + Variables = []; + return; + } + Variables = new Dat10SynthPresetVariable[VariableCount]; + for (int i = 0; i < VariableCount; i++) + { + Variables[i] = new Dat10SynthPresetVariable(ref br); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -20625,7 +22613,7 @@ namespace CodeWalker.GameFiles VariableCount = (byte)(Variables?.Length ?? 0); } } - [TC(typeof(EXP))] public class Dat10SynthVariable : IMetaXmlItem + [TC(typeof(EXP))] public struct Dat10SynthVariable : IMetaXmlItem { public MetaHash Name { get; set; } public float Value { get; set; } @@ -20637,12 +22625,19 @@ namespace CodeWalker.GameFiles Name = br.ReadUInt32(); Value = br.ReadSingle(); } - public void Write(BinaryWriter bw) + + public Dat10SynthVariable(ref SequenceReader br) + { + Name = br.ReadUInt32(); + Value = br.ReadSingle(); + } + + public readonly void Write(BinaryWriter bw) { bw.Write(Name); bw.Write(Value); } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { RelXml.StringTag(sb, indent, "Name", RelXml.HashString(Name)); RelXml.ValueTag(sb, indent, "Value", FloatUtil.ToString(Value)); @@ -20652,12 +22647,13 @@ namespace CodeWalker.GameFiles Name = XmlRel.GetHash(Xml.GetChildInnerText(node, "Name")); Value = Xml.GetChildFloatAttribute(node, "Value", "value"); } - public override string ToString() + public override readonly string ToString() { - return Name.ToString() + ": " + Value.ToString(); + return $"{Name}: {Value}"; } } - [TC(typeof(EXP))] public class Dat10Synth : Dat10RelData + [TC(typeof(EXP))] + public class Dat10Synth : Dat10RelData { // limits hardcoded in the .exe public const int MaxStateBlocks = 64; @@ -20683,7 +22679,7 @@ namespace CodeWalker.GameFiles Type = Dat10RelType.Synth; TypeID = (byte)Type; } - public Dat10Synth(RelData d, BinaryReader br) : base(d, br) + public Dat10Synth(in TempRelData d, BinaryReader br) : base(in d, br) { BuffersCount = br.ReadInt32();//buffers count (4) (for synth_ambient_aircon_full) RegistersCount = br.ReadInt32();//registers count (21) @@ -20694,6 +22690,46 @@ namespace CodeWalker.GameFiles RuntimeCost = br.ReadInt32();//runtime cost (50) Bytecode = br.ReadBytes(BytecodeLength); ConstantsCount = br.ReadInt32(); //constants count (21) + if (ConstantsCount == 0) + { + Constants = []; + } + else + { + Constants = new float[ConstantsCount];//constants (floats) + for (int i = 0; i < ConstantsCount; i++) + { + Constants[i] = br.ReadSingle(); + } + } + + VariablesCount = br.ReadInt32(); //variables count (8) + if (VariablesCount == 0) + { + Variables = []; + } + else + { + Variables = new Dat10SynthVariable[VariablesCount];//variables + for (int i = 0; i < VariablesCount; i++) + { + Variables[i] = new Dat10SynthVariable(br); + } + } + + } + + public Dat10Synth(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + BuffersCount = br.ReadInt32();//buffers count (4) (for synth_ambient_aircon_full) + RegistersCount = br.ReadInt32();//registers count (21) + OutputsCount = br.ReadInt32();//outputs count (1) + OutputsIndices = br.ReadBytes(MaxOutputs).ToArray();//outputs indices (1, 0, 0, 0) + BytecodeLength = br.ReadInt32();//bytecode length (504) + StateBlocksCount = br.ReadInt32();//state blocks count (18) + RuntimeCost = br.ReadInt32();//runtime cost (50) + Bytecode = br.ReadBytes(BytecodeLength).ToArray(); + ConstantsCount = br.ReadInt32(); //constants count (21) Constants = new float[ConstantsCount];//constants (floats) for (int i = 0; i < ConstantsCount; i++) { @@ -20703,9 +22739,10 @@ namespace CodeWalker.GameFiles Variables = new Dat10SynthVariable[VariablesCount];//variables for (int i = 0; i < VariablesCount; i++) { - Variables[i] = new Dat10SynthVariable(br); + Variables[i] = new Dat10SynthVariable(ref br); } } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -21397,7 +23434,7 @@ namespace CodeWalker.GameFiles } catch (Exception e) // XmlMeta.GetHash throws an exception if the hash is not a valid hex number { - onError($"Invalid variable name '{str}': {e.Message}"); + onError($"Invalid variable name '{str}': {e}"); return 0; } } @@ -22411,7 +24448,7 @@ namespace CodeWalker.GameFiles Type = type; TypeID = (byte)type; } - public Dat15RelData(RelData d, BinaryReader br) : base(d) + public Dat15RelData(in TempRelData d, BinaryReader br) : base(in d) { Type = (Dat15RelType)TypeID; @@ -22421,6 +24458,16 @@ namespace CodeWalker.GameFiles Flags = br.ReadUInt32(); } + public Dat15RelData(in TempRelData d, ref SequenceReader br) : base(in d) + { + Type = (Dat15RelType)TypeID; + + br.Rewind(1); //1 byte was read already (TypeID) + + NameTableOffset = ((br.ReadUInt32() >> 8) & 0xFFFFFF); + Flags = br.ReadUInt32(); + } + public void WriteTypeAndOffsetAndFlags(BinaryWriter bw) { var val = ((NameTableOffset & 0xFFFFFF) << 8) + TypeID; @@ -22430,7 +24477,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return GetBaseString() + ": " + Type.ToString(); + return $"{GetBaseString()}: {Type}"; } } @@ -22451,7 +24498,7 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.Patch; TypeID = (byte)Type; } - public Dat15Patch(RelData d, BinaryReader br) : base(d, br) + public Dat15Patch(in TempRelData d, BinaryReader br) : base(in d, br) { FadeIn = br.ReadInt16(); FadeOut = br.ReadInt16(); @@ -22461,12 +24508,44 @@ namespace CodeWalker.GameFiles ApplyVariable = br.ReadUInt32(); ApplySmoothRate = br.ReadSingle(); MixCategoriesCount = br.ReadByte(); - MixCategories = new Dat15PatchItem[MixCategoriesCount]; - for (int i = 0; i < MixCategoriesCount; i++) + if (MixCategoriesCount == 0) { - MixCategories[i] = new Dat15PatchItem(br); + MixCategories = []; + } + else + { + MixCategories = new Dat15PatchItem[MixCategoriesCount]; + for (int i = 0; i < MixCategoriesCount; i++) + { + MixCategories[i] = new Dat15PatchItem(br); + } } } + + public Dat15Patch(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + FadeIn = br.ReadInt16(); + FadeOut = br.ReadInt16(); + PreDelay = br.ReadSingle(); + Duration = br.ReadSingle(); + ApplyFactorCurve = br.ReadUInt32(); + ApplyVariable = br.ReadUInt32(); + ApplySmoothRate = br.ReadSingle(); + MixCategoriesCount = br.ReadByte(); + if (MixCategoriesCount == 0) + { + MixCategories = []; + } + else + { + MixCategories = new Dat15PatchItem[MixCategoriesCount]; + for (int i = 0; i < MixCategoriesCount; i++) + { + MixCategories[i] = new Dat15PatchItem(ref br); + } + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -22512,24 +24591,27 @@ namespace CodeWalker.GameFiles } public override MetaHash[] GetCategoryHashes() { - var list = new List(); - if (MixCategories != null) + var mixCategories = MixCategories; + if (mixCategories is null) { - foreach (var item in MixCategories) - { - list.Add(item.Category); - } + return []; } - return list.ToArray(); + + var arr = new MetaHash[mixCategories.Length]; + for (int i = 0; i < mixCategories.Length; i++) + { + arr[i] = mixCategories[i].Category; + } + return arr; } public override MetaHash[] GetCurveHashes() { - return new[] { ApplyFactorCurve }; + return [ApplyFactorCurve]; } } [TC(typeof(EXP))] - public class Dat15PatchItem : IMetaXmlItem + public struct Dat15PatchItem : IMetaXmlItem { public MetaHash Category { get; set; } public short Volume { get; set; } @@ -22555,6 +24637,20 @@ namespace CodeWalker.GameFiles Unk10 = br.ReadByte(); DistanceRollOffScale = br.ReadSingle(); } + + public Dat15PatchItem(ref SequenceReader br) + { + Category = br.ReadUInt32(); + Volume = br.ReadInt16(); + Unk03 = br.ReadByte(); + LPFCutoff = br.ReadInt16(); + HPFCutoff = br.ReadInt16(); + Pitch = br.ReadInt16(); + Unk09 = br.ReadSingle(); + Unk10 = br.ReadByte(); + DistanceRollOffScale = br.ReadSingle(); + } + public void Write(BinaryWriter bw) { bw.Write(Category); @@ -22615,7 +24711,7 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.SceneState; TypeID = (byte)Type; } - public Dat15SceneState(RelData d, BinaryReader br) : base(d, br) + public Dat15SceneState(in TempRelData d, BinaryReader br) : base(in d, br) { ItemCount = br.ReadByte(); Items = new Dat151HashPair[ItemCount]; @@ -22624,6 +24720,17 @@ namespace CodeWalker.GameFiles Items[i] = new Dat151HashPair(br); } } + + public Dat15SceneState(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ItemCount = br.ReadByte(); + Items = new Dat151HashPair[ItemCount]; + for (int i = 0; i < ItemCount; i++) + { + Items[i] = new Dat151HashPair(ref br); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -22669,7 +24776,7 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.Scene; TypeID = (byte)Type; } - public Dat15Scene(RelData d, BinaryReader br) : base(d, br) + public Dat15Scene(in TempRelData d, BinaryReader br) : base(in d, br) { OnStopScene = br.ReadUInt32(); PatchGroupsCount = br.ReadByte(); @@ -22679,6 +24786,18 @@ namespace CodeWalker.GameFiles PatchGroups[i] = new Dat15SceneItem(br); } } + + public Dat15Scene(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + OnStopScene = br.ReadUInt32(); + PatchGroupsCount = br.ReadByte(); + PatchGroups = new Dat15SceneItem[PatchGroupsCount]; + for (int i = 0; i < PatchGroupsCount; i++) + { + PatchGroups[i] = new Dat15SceneItem(ref br); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -22719,7 +24838,7 @@ namespace CodeWalker.GameFiles } [TC(typeof(EXP))] - public class Dat15SceneItem : IMetaXmlItem + public struct Dat15SceneItem : IMetaXmlItem { public MetaHash Patch { get; set; } public MetaHash Group { get; set; } @@ -22731,6 +24850,13 @@ namespace CodeWalker.GameFiles Patch = br.ReadUInt32(); Group = br.ReadUInt32(); } + + public Dat15SceneItem(ref SequenceReader br) + { + Patch = br.ReadUInt32(); + Group = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(Patch); @@ -22763,12 +24889,20 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.Group; TypeID = (byte)Type; } - public Dat15Group(RelData d, BinaryReader br) : base(d, br) + public Dat15Group(in TempRelData d, BinaryReader br) : base(in d, br) { ReferenceCount = br.ReadUInt32(); FadeTime = br.ReadSingle(); Map = br.ReadUInt32(); } + + public Dat15Group(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ReferenceCount = br.ReadUInt32(); + FadeTime = br.ReadSingle(); + Map = br.ReadUInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -22806,7 +24940,7 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.GroupList; TypeID = (byte)Type; } - public Dat15GroupList(RelData d, BinaryReader br) : base(d, br) + public Dat15GroupList(in TempRelData d, BinaryReader br) : base(in d, br) { GroupCount = br.ReadByte(); Groups = new MetaHash[GroupCount]; @@ -22815,6 +24949,17 @@ namespace CodeWalker.GameFiles Groups[i] = br.ReadUInt32(); } } + + public Dat15GroupList(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + GroupCount = br.ReadByte(); + Groups = new MetaHash[GroupCount]; + for (int i = 0; i < GroupCount; i++) + { + Groups[i] = br.ReadUInt32(); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -22854,7 +24999,7 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.DynamicMixModuleSettings; TypeID = (byte)Type; } - public Dat15DynamicMixModuleSettings(RelData d, BinaryReader br) : base(d, br) + public Dat15DynamicMixModuleSettings(in TempRelData d, BinaryReader br) : base(in d, br) { FadeIn = br.ReadUInt16();//0 FadeOut = br.ReadUInt16();//0 @@ -22862,6 +25007,16 @@ namespace CodeWalker.GameFiles Duration = br.ReadUInt32();//0 ModuleTypeSettings = br.ReadUInt32(); } + + public Dat15DynamicMixModuleSettings(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + FadeIn = br.ReadUInt16();//0 + FadeOut = br.ReadUInt16();//0 + ApplyVariable = br.ReadUInt32(); + Duration = br.ReadUInt32();//0 + ModuleTypeSettings = br.ReadUInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -22907,7 +25062,7 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.SceneVariableModuleSettings; TypeID = (byte)Type; } - public Dat15SceneVariableModuleSettings(RelData d, BinaryReader br) : base(d, br) + public Dat15SceneVariableModuleSettings(in TempRelData d, BinaryReader br) : base(in d, br) { SceneVariable = br.ReadUInt32(); InputOutputCurve = br.ReadUInt32(); @@ -22918,6 +25073,19 @@ namespace CodeWalker.GameFiles Items[i] = br.ReadSingle(); } } + + public Dat15SceneVariableModuleSettings(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + SceneVariable = br.ReadUInt32(); + InputOutputCurve = br.ReadUInt32(); + ItemCount = br.ReadByte(); + Items = new float[ItemCount]; + for (int i = 0; i < ItemCount; i++) + { + Items[i] = br.ReadSingle(); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -22961,21 +25129,20 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.SceneTransitionModuleSettings; TypeID = (byte)Type; } - public Dat15SceneTransitionModuleSettings(RelData d, BinaryReader br) : base(d, br) + public Dat15SceneTransitionModuleSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadByte(); Unk02 = br.ReadSingle(); Unk03 = br.ReadUInt32(); - - //byte ItemCount = br.ReadByte(); - //var Items = new MetaHash[ItemCount]; - //for (int i = 0; i < ItemCount; i++) - //{ - // Items[i] = br.ReadUInt32(); - //} - //if (ItemCount != 2) - //{ } } + + public Dat15SceneTransitionModuleSettings(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk01 = br.ReadByte(); + Unk02 = br.ReadSingle(); + Unk03 = br.ReadUInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23009,11 +25176,18 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.VehicleCollisionModuleSettings; TypeID = (byte)Type; } - public Dat15VehicleCollisionModuleSettings(RelData d, BinaryReader br) : base(d, br) + public Dat15VehicleCollisionModuleSettings(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadByte(); Unk02 = br.ReadUInt32(); } + + public Dat15VehicleCollisionModuleSettings(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk01 = br.ReadByte(); + Unk02 = br.ReadUInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23048,7 +25222,7 @@ namespace CodeWalker.GameFiles Type = Dat15RelType.GroupMap; TypeID = (byte)Type; } - public Dat15GroupMap(RelData d, BinaryReader br) : base(d, br) + public Dat15GroupMap(in TempRelData d, BinaryReader br) : base(in d, br) { ItemCount = br.ReadUInt16(); Items = new Dat151GroupMapItem[ItemCount]; @@ -23057,6 +25231,17 @@ namespace CodeWalker.GameFiles Items[i] = new Dat151GroupMapItem(br); } } + + public Dat15GroupMap(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + ItemCount = br.ReadUInt16(); + Items = new Dat151GroupMapItem[ItemCount]; + for (int i = 0; i < ItemCount; i++) + { + Items[i] = new Dat151GroupMapItem(ref br); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23104,6 +25289,13 @@ namespace CodeWalker.GameFiles Category = br.ReadUInt32(); MapToCategory = br.ReadUInt32(); } + + public Dat151GroupMapItem(ref SequenceReader br) + { + Category = br.ReadUInt32(); + MapToCategory = br.ReadUInt32(); + } + public void Write(BinaryWriter bw) { bw.Write(Category); @@ -23155,7 +25347,8 @@ namespace CodeWalker.GameFiles //BezierCurve = 17, } - [TC(typeof(EXP))] public class Dat16RelData : RelData + [TC(typeof(EXP))] + public class Dat16RelData : RelData { public Dat16RelType Type { get; set; } public uint NameTableOffset { get; set; } @@ -23167,7 +25360,7 @@ namespace CodeWalker.GameFiles Type = type; TypeID = (byte)type; } - public Dat16RelData(RelData d, BinaryReader br) : base(d) + public Dat16RelData(in TempRelData d, BinaryReader br) : base(in d) { Type = (Dat16RelType)TypeID; @@ -23177,6 +25370,16 @@ namespace CodeWalker.GameFiles Flags = br.ReadUInt32(); } + public Dat16RelData(in TempRelData d, ref SequenceReader br) : base(in d) + { + Type = (Dat16RelType)TypeID; + + br.Rewind(1); //1 byte was read already (TypeID) + + NameTableOffset = ((br.ReadUInt32() >> 8) & 0xFFFFFF); + Flags = br.ReadUInt32(); + } + public void WriteTypeAndOffsetAndFlags(BinaryWriter bw) { var val = ((NameTableOffset & 0xFFFFFF) << 8) + TypeID; @@ -23186,11 +25389,12 @@ namespace CodeWalker.GameFiles public override string ToString() { - return GetBaseString() + ": " + Type.ToString(); + return $"{GetBaseString()}: {Type}"; } } - [TC(typeof(EXP))] public class Dat16ConstantCurve : Dat16RelData + [TC(typeof(EXP))] + public class Dat16ConstantCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23201,12 +25405,20 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.ConstantCurve; TypeID = (byte)Type; } - public Dat16ConstantCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16ConstantCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); Value = br.ReadSingle(); } + + public Dat16ConstantCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + Value = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23230,7 +25442,9 @@ namespace CodeWalker.GameFiles Value = Xml.GetChildFloatAttribute(node, "Value", "value"); } } - [TC(typeof(EXP))] public class Dat16LinearCurve : Dat16RelData + + [TC(typeof(EXP))] + public class Dat16LinearCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23244,7 +25458,7 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.LinearCurve; TypeID = (byte)Type; } - public Dat16LinearCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16LinearCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); @@ -23253,6 +25467,17 @@ namespace CodeWalker.GameFiles Unk05 = br.ReadSingle(); Unk06 = br.ReadSingle(); } + + public Dat16LinearCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + Unk03 = br.ReadSingle(); + Unk04 = br.ReadSingle(); + Unk05 = br.ReadSingle(); + Unk06 = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23285,7 +25510,9 @@ namespace CodeWalker.GameFiles Unk06 = Xml.GetChildFloatAttribute(node, "Unk06", "value"); } } - [TC(typeof(EXP))] public class Dat16LinearDbCurve : Dat16RelData + + [TC(typeof(EXP))] + public class Dat16LinearDbCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23299,7 +25526,7 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.LinearDbCurve; TypeID = (byte)Type; } - public Dat16LinearDbCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16LinearDbCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); @@ -23308,6 +25535,17 @@ namespace CodeWalker.GameFiles Unk05 = br.ReadSingle(); Unk06 = br.ReadSingle(); } + + public Dat16LinearDbCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + Unk03 = br.ReadSingle();//0 + Unk04 = br.ReadSingle();//0 + Unk05 = br.ReadSingle(); + Unk06 = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23340,7 +25578,9 @@ namespace CodeWalker.GameFiles Unk06 = Xml.GetChildFloatAttribute(node, "Unk06", "value"); } } - [TC(typeof(EXP))] public class Dat16PiecewiseLinearCurve : Dat16RelData + + [TC(typeof(EXP))] + public class Dat16PiecewiseLinearCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23352,17 +25592,40 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.PiecewiseLinearCurve; TypeID = (byte)Type; } - public Dat16PiecewiseLinearCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16PiecewiseLinearCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); PointCount = br.ReadInt32(); + if (PointCount == 0) + { + Points = []; + return; + } Points = new Vector2[PointCount]; for (int i = 0; i < PointCount; i++) { Points[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); } } + + public Dat16PiecewiseLinearCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + PointCount = br.ReadInt32(); + if (PointCount == 0) + { + Points = []; + return; + } + Points = new Vector2[PointCount]; + for (int i = 0; i < PointCount; i++) + { + Points[i] = new Vector2(br.ReadSingle(), br.ReadSingle()); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23392,7 +25655,9 @@ namespace CodeWalker.GameFiles PointCount = Points?.Length ?? 0; } } - [TC(typeof(EXP))] public class Dat16EqualPowerCurve : Dat16RelData + + [TC(typeof(EXP))] + public class Dat16EqualPowerCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23403,12 +25668,20 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.EqualPowerCurve; TypeID = (byte)Type; } - public Dat16EqualPowerCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16EqualPowerCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); Flip = br.ReadInt32(); } + + public Dat16EqualPowerCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + Flip = br.ReadInt32(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23432,7 +25705,9 @@ namespace CodeWalker.GameFiles Flip = Xml.GetChildIntAttribute(node, "Flip", "value"); } } - [TC(typeof(EXP))] public class Dat16ValueTableCurve : Dat16RelData + + [TC(typeof(EXP))] + public class Dat16ValueTableCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23444,17 +25719,40 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.ValueTableCurve; TypeID = (byte)Type; } - public Dat16ValueTableCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16ValueTableCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); ValueCount = br.ReadInt32(); + if (ValueCount == 0) + { + Values = []; + return; + } Values = new float[ValueCount]; for (int i = 0; i < ValueCount; i++) { Values[i] = br.ReadSingle(); } } + + public Dat16ValueTableCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + ValueCount = br.ReadInt32(); + if (ValueCount == 0) + { + Values = []; + return; + } + Values = new float[ValueCount]; + for (int i = 0; i < ValueCount; i++) + { + Values[i] = br.ReadSingle(); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23483,7 +25781,9 @@ namespace CodeWalker.GameFiles ValueCount = (Values?.Length ?? 0); } } - [TC(typeof(EXP))] public class Dat16ExponentialCurve : Dat16RelData + + [TC(typeof(EXP))] + public class Dat16ExponentialCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23495,13 +25795,22 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.ExponentialCurve; TypeID = (byte)Type; } - public Dat16ExponentialCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16ExponentialCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); Flip = br.ReadInt32(); Exponent = br.ReadSingle(); } + + public Dat16ExponentialCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + Flip = br.ReadInt32(); + Exponent = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23528,7 +25837,9 @@ namespace CodeWalker.GameFiles Exponent = Xml.GetChildFloatAttribute(node, "Exponent", "value"); } } - [TC(typeof(EXP))] public class Dat16DecayingExponentialCurve : Dat16RelData + + [TC(typeof(EXP))] + public class Dat16DecayingExponentialCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23539,12 +25850,20 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.DecayingExponentialCurve; TypeID = (byte)Type; } - public Dat16DecayingExponentialCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16DecayingExponentialCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); HorizontalScaling = br.ReadSingle(); } + + public Dat16DecayingExponentialCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + HorizontalScaling = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23568,7 +25887,9 @@ namespace CodeWalker.GameFiles HorizontalScaling = Xml.GetChildFloatAttribute(node, "HorizontalScaling", "value"); } } - [TC(typeof(EXP))] public class Dat16DecayingSquaredExponentialCurve : Dat16RelData + + [TC(typeof(EXP))] + public class Dat16DecayingSquaredExponentialCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23579,12 +25900,20 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.DecayingSquaredExponentialCurve; TypeID = (byte)Type; } - public Dat16DecayingSquaredExponentialCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16DecayingSquaredExponentialCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); HorizontalScaling = br.ReadSingle(); } + + public Dat16DecayingSquaredExponentialCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + HorizontalScaling = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23608,7 +25937,8 @@ namespace CodeWalker.GameFiles HorizontalScaling = Xml.GetChildFloatAttribute(node, "HorizontalScaling", "value"); } } - [TC(typeof(EXP))] public class Dat16SineCurve : Dat16RelData + [TC(typeof(EXP))] + public class Dat16SineCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23623,7 +25953,7 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.SineCurve; TypeID = (byte)Type; } - public Dat16SineCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16SineCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); @@ -23633,6 +25963,18 @@ namespace CodeWalker.GameFiles VerticalScaling = br.ReadSingle(); VerticalOffset = br.ReadSingle(); } + + public Dat16SineCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + StartPhase = br.ReadSingle(); + EndPhase = br.ReadSingle(); + Frequency = br.ReadSingle(); + VerticalScaling = br.ReadSingle(); + VerticalOffset = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23668,7 +26010,8 @@ namespace CodeWalker.GameFiles VerticalOffset = Xml.GetChildFloatAttribute(node, "VerticalOffset", "value"); } } - [TC(typeof(EXP))] public class Dat16OneOverXSquaredCurve : Dat16RelData + [TC(typeof(EXP))] + public class Dat16OneOverXSquaredCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23679,12 +26022,20 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.OneOverXSquaredCurve; TypeID = (byte)Type; } - public Dat16OneOverXSquaredCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16OneOverXSquaredCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); HorizontalScaling = br.ReadSingle(); } + + public Dat16OneOverXSquaredCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + HorizontalScaling = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23708,7 +26059,8 @@ namespace CodeWalker.GameFiles HorizontalScaling = Xml.GetChildFloatAttribute(node, "HorizontalScaling", "value"); } } - [TC(typeof(EXP))] public class Dat16DefaultDistanceAttenuationCurve : Dat16RelData + [TC(typeof(EXP))] + public class Dat16DefaultDistanceAttenuationCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23718,11 +26070,18 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.DefaultDistanceAttenuationCurve; TypeID = (byte)Type; } - public Dat16DefaultDistanceAttenuationCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16DefaultDistanceAttenuationCurve(in TempRelData d, BinaryReader br) : base(in d, br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); } + + public Dat16DefaultDistanceAttenuationCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23743,7 +26102,8 @@ namespace CodeWalker.GameFiles MaxInput = Xml.GetChildFloatAttribute(node, "MaxInput", "value"); } } - [TC(typeof(EXP))] public class Dat16DistanceAttenuationValueTableCurve : Dat16RelData + [TC(typeof(EXP))] + public class Dat16DistanceAttenuationValueTableCurve : Dat16RelData { public float MinInput { get; set; } public float MaxInput { get; set; } @@ -23755,7 +26115,24 @@ namespace CodeWalker.GameFiles Type = Dat16RelType.DistanceAttenuationValueTableCurve; TypeID = (byte)Type; } - public Dat16DistanceAttenuationValueTableCurve(RelData d, BinaryReader br) : base(d, br) + public Dat16DistanceAttenuationValueTableCurve(in TempRelData d, BinaryReader br) : base(in d, br) + { + MinInput = br.ReadSingle(); + MaxInput = br.ReadSingle(); + ValueCount = br.ReadInt32(); + if (ValueCount == 0) + { + Values = []; + return; + } + Values = new float[ValueCount]; + for (int i = 0; i < ValueCount; i++) + { + Values[i] = br.ReadSingle(); + } + } + + public Dat16DistanceAttenuationValueTableCurve(in TempRelData d, ref SequenceReader br) : base(in d, ref br) { MinInput = br.ReadSingle(); MaxInput = br.ReadSingle(); @@ -23766,6 +26143,7 @@ namespace CodeWalker.GameFiles Values[i] = br.ReadSingle(); } } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -23809,7 +26187,8 @@ namespace CodeWalker.GameFiles Category = 0, } - [TC(typeof(EXP))] public class Dat22RelData : RelData + [TC(typeof(EXP))] + public class Dat22RelData : RelData { public Dat22RelType Type { get; set; } public uint NameTableOffset { get; set; } @@ -23821,7 +26200,7 @@ namespace CodeWalker.GameFiles Type = type; TypeID = (byte)type; } - public Dat22RelData(RelData d, BinaryReader br) : base(d) + public Dat22RelData(in TempRelData d, BinaryReader br) : base(in d) { Type = (Dat22RelType)TypeID; @@ -23831,6 +26210,16 @@ namespace CodeWalker.GameFiles Flags = br.ReadUInt32(); } + public Dat22RelData(in TempRelData d, ref SequenceReader br) : base(in d) + { + Type = (Dat22RelType)TypeID; + + br.Rewind(1); //1 byte was read already (TypeID) + + NameTableOffset = ((br.ReadUInt32() >> 8) & 0xFFFFFF); + Flags = br.ReadUInt32(); + } + public void WriteTypeAndOffsetAndFlags(BinaryWriter bw) { var val = ((NameTableOffset & 0xFFFFFF) << 8) + TypeID; @@ -23840,11 +26229,12 @@ namespace CodeWalker.GameFiles public override string ToString() { - return GetBaseString() + ": " + Type.ToString(); + return $"{GetBaseString()}: {Type}"; } } - [TC(typeof(EXP))] public class Dat22Category : Dat22RelData + [TC(typeof(EXP))] + public class Dat22Category : Dat22RelData { public short Unk01 { get; set; } public short Volume { get; set; } @@ -23872,7 +26262,7 @@ namespace CodeWalker.GameFiles Type = Dat22RelType.Category; TypeID = (byte)Type; } - public Dat22Category(RelData d, BinaryReader br) : base(d, br) + public Dat22Category(in TempRelData d, BinaryReader br) : base(in d, br) { Unk01 = br.ReadInt16(); Volume = br.ReadInt16(); @@ -23899,6 +26289,35 @@ namespace CodeWalker.GameFiles SubCategories[i] = br.ReadUInt32(); } } + + public Dat22Category(in TempRelData d, ref SequenceReader br) : base(in d, ref br) + { + Unk01 = br.ReadInt16(); + Volume = br.ReadInt16(); + Unk03 = br.ReadInt16(); + LPFCutoff = br.ReadInt16(); + LPFCutoffCurve = br.ReadUInt32();//1757063444 + HPFCutoff = br.ReadInt16(); + HPFCutoffCurve = br.ReadUInt32();//741353067 + Unk08 = br.ReadInt16(); + Unk09 = br.ReadInt16(); + Unk10 = br.ReadInt16(); + Unk11 = br.ReadInt16(); + Unk12 = br.ReadInt16(); + Unk13 = br.ReadInt16(); + Unk14 = br.ReadInt16(); + Unk15 = br.ReadInt16(); + Unk16 = br.ReadInt16(); + Unk17 = br.ReadInt16(); + Unk18 = br.ReadByte(); + SubCategoryCount = br.ReadByte(); + SubCategories = new MetaHash[SubCategoryCount]; + for (int i = 0; i < SubCategoryCount; i++) + { + SubCategories[i] = br.ReadUInt32(); + } + } + public override void Write(BinaryWriter bw) { WriteTypeAndOffsetAndFlags(bw); @@ -24005,52 +26424,59 @@ namespace CodeWalker.GameFiles public static string GetXml(RelFile rel) { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if ((rel != null) && (rel.RelDatasSorted != null)) + StringBuilder sb = StringBuilderPool.Get(); + try { - int indent = 0; - int cindent = 1; - var iindent = 2; - var name = "Dat" + ((uint)rel.RelType).ToString(); + sb.AppendLine(XmlHeader); - OpenTag(sb, indent, name); - - ValueTag(sb, cindent, "Version", rel.DataUnkVal.ToString()); - - if (rel.IsAudioConfig) + if ((rel != null) && (rel.RelDatas != null)) { - ValueTag(sb, cindent, "IsAudioConfig", "true"); - ValueTag(sb, cindent, "IndexStringFlags", rel.IndexStringFlags.ToString()); - } + int indent = 0; + int cindent = 1; + var iindent = 2; + var name = $"Dat{(uint)rel.RelType}"; - if (rel.NameTable != null) - { - OpenTag(sb, cindent, "ContainerPaths"); + OpenTag(sb, indent, name); - foreach (var ntval in rel.NameTable) + ValueTag(sb, cindent, "Version", rel.DataUnkVal.ToString()); + + if (rel.IsAudioConfig) { - StringTag(sb, iindent, "Item", ntval); + ValueTag(sb, cindent, "IsAudioConfig", "true"); + ValueTag(sb, cindent, "IndexStringFlags", rel.IndexStringFlags.ToString()); } - CloseTag(sb, cindent, "ContainerPaths"); + if (rel.NameTable != null) + { + OpenTag(sb, cindent, "ContainerPaths"); + + foreach (var ntval in rel.NameTable) + { + StringTag(sb, iindent, "Item", ntval); + } + + CloseTag(sb, cindent, "ContainerPaths"); + } + + OpenTag(sb, cindent, "Items"); + + foreach (var item in rel.RelDatasSorted) + { + GetXml(item, sb, iindent); + } + + CloseTag(sb, cindent, "Items"); + + CloseTag(sb, indent, name); + } - OpenTag(sb, cindent, "Items"); - - foreach (var item in rel.RelDatasSorted) - { - GetXml(item, sb, iindent); - } - - CloseTag(sb, cindent, "Items"); - - CloseTag(sb, indent, name); - + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); } - - return sb.ToString(); } public static void GetXml(RelData item, StringBuilder sb, int iindent) @@ -24089,46 +26515,39 @@ namespace CodeWalker.GameFiles } var ntoffset = ""; - var dat151item = item as Dat151RelData; - if (dat151item != null) + if (item is Dat151RelData dat151item) { - ntoffset = " ntOffset=\"" + dat151item.NameTableOffset.ToString() + "\""; + ntoffset = $" ntOffset=\"{dat151item.NameTableOffset}\""; } - var dat4config = item as Dat4ConfigData; - if (dat4config != null) + if (item is Dat4ConfigData dat4config) { - ntoffset = " ntOffset=\"" + dat4config.NameTableOffset.ToString() + "\""; + ntoffset = $" ntOffset=\"{dat4config.NameTableOffset}\""; } - var dat4Speech = item as Dat4SpeechData; - if (dat4Speech != null) + if (item is Dat4SpeechData dat4Speech) { if (dat4Speech.Type == Dat4SpeechType.Container) { - ntoffset = " ntOffset=\"" + dat4Speech.NameTableOffset.ToString() + "\""; + ntoffset = $" ntOffset=\"{dat4Speech.NameTableOffset}\""; } } - var dat10item = item as Dat10RelData; - if (dat10item != null) + if (item is Dat10RelData dat10item) { - ntoffset = " ntOffset=\"" + dat10item.NameTableOffset.ToString() + "\""; + ntoffset = $" ntOffset=\"{dat10item.NameTableOffset}\""; } - var dat15item = item as Dat15RelData; - if (dat15item != null) + if (item is Dat15RelData dat15item) { - ntoffset = " ntOffset=\"" + dat15item.NameTableOffset.ToString() + "\""; + ntoffset = $" ntOffset=\"{dat15item.NameTableOffset}\""; } - var dat16item = item as Dat16RelData; - if (dat16item != null) + if (item is Dat16RelData dat16item) { - ntoffset = " ntOffset=\"" + dat16item.NameTableOffset.ToString() + "\""; + ntoffset = $" ntOffset=\"{dat16item.NameTableOffset}\""; } - var dat22item = item as Dat22RelData; - if (dat22item != null) + if (item is Dat22RelData dat22item) { - ntoffset = " ntOffset=\"" + dat22item.NameTableOffset.ToString() + "\""; + ntoffset = $" ntOffset=\"{dat22item.NameTableOffset}\""; } - OpenTag(sb, iindent, "Item type=\"" + typeid + "\"" + ntoffset); + OpenTag(sb, iindent, $"Item type=\"{typeid}\"{ntoffset}"); StringTag(sb, icindent, "Name", item.Name ?? RelXml.HashString(item.NameHash)); @@ -24283,38 +26702,31 @@ namespace CodeWalker.GameFiles itemslist.Add(rd); - var dat151data = rd as Dat151RelData; - if (dat151data != null) + if (rd is Dat151RelData dat151data) { dat151data.NameTableOffset = ntoffset; } - var dat4config = rd as Dat4ConfigData; - if (dat4config != null) + if (rd is Dat4ConfigData dat4config) { dat4config.NameTableOffset = ntoffset; } - var dat4speech = rd as Dat4SpeechData; - if (dat4speech != null) + if (rd is Dat4SpeechData dat4speech) { dat4speech.NameTableOffset = ntoffset; } - var dat10item = rd as Dat10RelData; - if (dat10item != null) + if (rd is Dat10RelData dat10item) { dat10item.NameTableOffset = ntoffset; } - var dat15item = rd as Dat15RelData; - if (dat15item != null) + if (rd is Dat15RelData dat15item) { dat15item.NameTableOffset = ntoffset; } - var dat16item = rd as Dat16RelData; - if (dat16item != null) + if (rd is Dat16RelData dat16item) { dat16item.NameTableOffset = ntoffset; } - var dat22item = rd as Dat22RelData; - if (dat22item != null) + if (rd is Dat22RelData dat22item) { dat22item.NameTableOffset = ntoffset; } @@ -24328,7 +26740,7 @@ namespace CodeWalker.GameFiles } - public static MetaHash GetHash(string str) + public static MetaHash GetHash(string? str) { if (string.IsNullOrEmpty(str)) { @@ -24336,18 +26748,19 @@ namespace CodeWalker.GameFiles } if (str.StartsWith("hash_", StringComparison.OrdinalIgnoreCase)) { - return Convert.ToUInt32(str.Substring(5), 16); + return uint.Parse(str.AsSpan(5), NumberStyles.HexNumber, CultureInfo.InvariantCulture); } else { - JenkIndex.Ensure(str); - return JenkHash.GenHash(str); + var hash = JenkHash.GenHash(str); + JenkIndex.Ensure(str, hash); + return hash; } } - public static T[] ReadItemArray(XmlNode node, string name) where T : IMetaXmlItem, new() + public static T[]? ReadItemArray(XmlNode node, string name) where T : IMetaXmlItem, new() { var vnode2 = node.SelectSingleNode(name); if (vnode2 != null) @@ -24355,7 +26768,7 @@ namespace CodeWalker.GameFiles var inodes = vnode2.SelectNodes("Item"); if (inodes?.Count > 0) { - var vlist = new List(); + using var vlist = new PooledList(); foreach (XmlNode inode in inodes) { var v = new T(); @@ -24367,7 +26780,7 @@ namespace CodeWalker.GameFiles } return null; } - public static MetaHash[] ReadHashItemArray(XmlNode node, string name) + public static MetaHash[]? ReadHashItemArray(XmlNode node, string name) { var vnode = node.SelectSingleNode(name); if (vnode != null) @@ -24375,7 +26788,7 @@ namespace CodeWalker.GameFiles var inodes = vnode.SelectNodes("Item"); if (inodes?.Count > 0) { - var vlist = new List(); + using var vlist = new PooledList(); foreach (XmlNode inode in inodes) { vlist.Add(GetHash(inode.InnerText)); diff --git a/CodeWalker.Core/GameFiles/FileTypes/VehiclesFile.cs b/CodeWalker.Core/GameFiles/FileTypes/VehiclesFile.cs index 0bf6ea2..9fd2493 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/VehiclesFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/VehiclesFile.cs @@ -1,4 +1,9 @@ -using CodeWalker.World; +using CodeWalker.Core.Utils; +using CodeWalker.World; +using Collections.Pooled; +using CommunityToolkit.Diagnostics; +using CommunityToolkit.HighPerformance; +using Microsoft.Extensions.ObjectPool; using SharpDX; using System; using System.Collections; @@ -16,11 +21,11 @@ namespace CodeWalker.GameFiles { public class VehiclesFile : GameFile, PackedFile { - private static XmlNameTable cachedNameTable = new NameTable(); + private static XmlNameTableThreadSafe cachedNameTable = new XmlNameTableThreadSafe(256); public string ResidentTxd { get; set; } - public List InitDatas { get; set; } - public Dictionary TxdRelationships { get; set; } + public PooledList InitDatas { get; set; } + public PooledDictionary TxdRelationships { get; set; } @@ -114,9 +119,14 @@ namespace CodeWalker.GameFiles private void LoadInitDatas(XmlDocument xmldoc) { - XmlNodeList items = xmldoc.SelectNodes("CVehicleModelInfo__InitDataList/InitDatas/Item | CVehicleModelInfo__InitDataList/InitDatas/item"); + XmlNodeList? items = xmldoc.SelectNodes("CVehicleModelInfo__InitDataList/InitDatas/Item | CVehicleModelInfo__InitDataList/InitDatas/item"); - InitDatas = new List(items.Count); + if (items is null) + { + return; + } + + InitDatas = new PooledList(items.Count); for (int i = 0; i < items.Count; i++) { var node = items[i]; @@ -130,10 +140,11 @@ namespace CodeWalker.GameFiles { if (!reader.IsStartElement() || reader.Name != "InitDatas") { - throw new InvalidOperationException("XmlReader is not at start element of \"InitDatas\""); + ThrowHelper.ThrowInvalidOperationException("XmlReader is not at start element of \"InitDatas\""); + return; } - InitDatas = new List(); + InitDatas = new PooledList(); reader.ReadStartElement("InitDatas"); @@ -152,52 +163,58 @@ namespace CodeWalker.GameFiles { if (reader.IsEmptyElement) { - TxdRelationships = new Dictionary(); reader.ReadStartElement(); return; } - TxdRelationships = new Dictionary(); + TxdRelationships ??= new PooledDictionary(); + TxdRelationships.Clear(); - foreach(var item in Xml.IterateItems(reader, "txdRelationships")) + foreach (var item in Xml.IterateItems(reader, "txdRelationships")) { var childstr = item.Element("child")?.Value; var parentstr = item.Element("parent")?.Value; - if ((!string.IsNullOrEmpty(parentstr)) && (!string.IsNullOrEmpty(childstr))) + if (!string.IsNullOrEmpty(parentstr) && !string.IsNullOrEmpty(childstr)) { - if (!TxdRelationships.ContainsKey(childstr)) - { - TxdRelationships.Add(childstr, parentstr); - } + _ = TxdRelationships.TryAdd(childstr, parentstr); } } } private void LoadTxdRelationships(XmlDocument xmldoc) { - XmlNodeList items = xmldoc.SelectNodes("CVehicleModelInfo__InitDataList/txdRelationships/Item | CVehicleModelInfo__InitDataList/txdRelationships/item"); + XmlNodeList? items = xmldoc.SelectNodes("CVehicleModelInfo__InitDataList/txdRelationships/Item | CVehicleModelInfo__InitDataList/txdRelationships/item"); + if (items is null || items.Count == 0) + { + TxdRelationships.Clear(); + return; + } - TxdRelationships = new Dictionary(); + TxdRelationships ??= new PooledDictionary(); + TxdRelationships.Clear(); for (int i = 0; i < items.Count; i++) { string parentstr = Xml.GetChildInnerText(items[i], "parent"); string childstr = Xml.GetChildInnerText(items[i], "child"); - if ((!string.IsNullOrEmpty(parentstr)) && (!string.IsNullOrEmpty(childstr))) + if (!string.IsNullOrEmpty(parentstr) && !string.IsNullOrEmpty(childstr)) { - if (!TxdRelationships.ContainsKey(childstr)) - { - TxdRelationships.Add(childstr, parentstr); - } - else - { } + _ = TxdRelationships.TryAdd(childstr, parentstr); } } } + + public override void Dispose() + { + InitDatas?.Dispose(); + TxdRelationships?.Dispose(); + base.Dispose(); + GC.SuppressFinalize(this); + } } - public class VehicleInitData + public record VehicleInitData { public string modelName { get; set; } //impaler3 @@ -455,7 +472,20 @@ namespace CodeWalker.GameFiles damageOffsetScale = Xml.GetChildFloatAttribute(reader, "damageOffsetScale"); break; case "diffuseTint": - diffuseTint = new Color4(Convert.ToUInt32(Xml.GetChildStringAttribute(reader, "diffuseTint", "value").Replace("0x", ""), 16)); ; + var str = Xml.GetChildStringAttribute(reader, "diffuseTint", "value").AsSpan(); + if (str.StartsWith("0x")) + { + str = str.Slice(2); + } + + if (str.IsEmpty) + { + diffuseTint = new Color4(); + } else + { + diffuseTint = new Color4(uint.Parse(str, System.Globalization.NumberStyles.HexNumber)); + } + break; case "steerWheelMult": steerWheelMult = Xml.GetChildFloatAttribute(reader, "steerWheelMult"); @@ -530,20 +560,25 @@ namespace CodeWalker.GameFiles break; } - var _drivers = new List(); - - foreach (var item in Xml.IterateItems(reader, "drivers")) + using (var _drivers = new PooledList()) { - var driver = new VehicleDriver(); - driver.driverName = item.Element("driverName")?.Value ?? string.Empty; - driver.npcName = item.Element("npcName")?.Value ?? string.Empty; - - if (!string.IsNullOrEmpty(driver.npcName) || !string.IsNullOrEmpty(driver.driverName)) + foreach (var item in Xml.IterateItems(reader, "drivers")) { - _drivers.Add(driver); + var driver = new VehicleDriver + { + DriverName = item.Element("driverName")?.Value ?? string.Empty, + NpcName = item.Element("npcName")?.Value ?? string.Empty, + }; + + + if (!string.IsNullOrEmpty(driver.NpcName) || !string.IsNullOrEmpty(driver.DriverName)) + { + _drivers.Add(driver); + } } + drivers = _drivers.ToArray(); } - drivers = _drivers.ToArray(); + break; case "doorsWithCollisionWhenClosed": doorsWithCollisionWhenClosed = GetStringItemArray(reader, "doorsWithCollisionWhenClosed"); @@ -602,7 +637,8 @@ namespace CodeWalker.GameFiles else if (reader.Name == "ThresholdMult") { pOverrideRagdollThreshold.ThresholdMult = Xml.GetChildFloatAttribute(reader, "ThresholdMult", "value"); - } else + } + else { break; } @@ -722,10 +758,11 @@ namespace CodeWalker.GameFiles for (int i = 0; i < items.Count; i++) { var item = items[i]; - var driver = new VehicleDriver(); - driver.driverName = Xml.GetChildInnerText(item, "driverName"); - driver.npcName = Xml.GetChildInnerText(item, "npcName"); - drivers[i] = driver; + drivers[i] = new VehicleDriver + { + DriverName = Xml.GetChildInnerText(item, "driverName"), + NpcName = Xml.GetChildInnerText(item, "npcName") + }; } } } @@ -760,26 +797,34 @@ namespace CodeWalker.GameFiles firstPersonDrivebyData = GetStringItemArray(node, "firstPersonDrivebyData"); } - private string[] GetStringItemArray(XmlNode node, string childName) + private string[]? GetStringItemArray(XmlNode node, string childName) { var cnode = node.SelectSingleNode(childName); - if (cnode == null) return null; + if (cnode == null) + return null; var items = cnode.SelectNodes("Item"); - if (items == null) return null; - getStringArrayList.Clear(); - foreach (XmlNode inode in items) + if (items == null) + return null; + + lock(getStringArrayList) { - var istr = inode.InnerText; - if (!string.IsNullOrEmpty(istr)) + getStringArrayList.Clear(); + foreach (XmlNode inode in items) { - getStringArrayList.Add(istr); + var istr = inode.InnerText; + if (!string.IsNullOrEmpty(istr)) + { + getStringArrayList.Add(istr); + } } + + if (getStringArrayList.Count == 0) + return null; + return getStringArrayList.ToArray(); } - if (getStringArrayList.Count == 0) return null; - return getStringArrayList.ToArray(); } - private string[] GetStringItemArray(XmlReader node, string childName) + private string[]? GetStringItemArray(XmlReader node, string childName) { if (node.IsEmptyElement) { @@ -807,70 +852,79 @@ namespace CodeWalker.GameFiles } } - private string[] GetStringArray(string ldastr, char delimiter) + private string[]? GetStringArray(string ldastr, char delimiter) { - var ldarr = ldastr?.Split(delimiter); - if (ldarr == null) return null; + if (string.IsNullOrEmpty(ldastr)) + { + return null; + } lock(getStringArrayList) { getStringArrayList.Clear(); - foreach (var ldstr in ldarr) + foreach (var ldstr in ldastr.EnumerateSplit(delimiter)) { - var ldt = ldstr?.Trim(); - if (!string.IsNullOrEmpty(ldt)) + var ldt = ldstr.Trim(); + if (!ldt.IsEmpty) { - getStringArrayList.Add(ldt); + getStringArrayList.Add(ldt.ToString()); } } - if (getStringArrayList.Count == 0) return null; + if (getStringArrayList.Count == 0) + return null; return getStringArrayList.ToArray(); } } - private string[] GetStringArray(XmlNode node, string childName, char delimiter) + private string[]? GetStringArray(XmlNode node, string childName, char delimiter) { var ldastr = Xml.GetChildInnerText(node, childName); return GetStringArray(ldastr, delimiter); } - private string[] GetStringArray(XmlReader reader, string childName, char delimiter) + private string[]? GetStringArray(XmlReader reader, string childName, char delimiter) { var ldastr = Xml.GetChildInnerText(reader, childName); return GetStringArray(ldastr, delimiter); } - [SkipLocalsInit] - private float[] GetFloatArray(string ldastr, char delimiter) + private float[]? GetFloatArray(string ldastr, char delimiter) { - var ldarr = ldastr?.Split(delimiter); - if (ldarr == null) return null; - Span floats = stackalloc float[ldarr.Length]; - var i = 0; - foreach (var ldstr in ldarr) + if (string.IsNullOrEmpty(ldastr)) { - var ldt = ldstr?.Trim(); - if (!string.IsNullOrEmpty(ldt) && FloatUtil.TryParse(ldt, out var f)) - { - floats[i] = f; - i++; - } + return []; } - if (i == 0) return null; + var ldarr = ldastr.Split(delimiter); + if (ldarr == null) + return []; - var result = new float[i]; + lock (getFloatArrayList) + { + getFloatArrayList.Clear(); + foreach (var ldstr in ldastr.EnumerateSplit(delimiter)) + { + var ldt = ldstr.Trim(); + if (!ldt.IsEmpty && FloatUtil.TryParse(ldt, out var f)) + { + getFloatArrayList.Add(f); + } + } - floats.Slice(0, i).CopyTo(result); + if (getFloatArrayList.Count == 0) + { + return []; + } - return result; + return getFloatArrayList.ToArray(); + } } - private float[] GetFloatArray(XmlNode node, string childName, char delimiter) + private float[]? GetFloatArray(XmlNode node, string childName, char delimiter) { var ldastr = Xml.GetChildInnerText(node, childName); return GetFloatArray(ldastr, delimiter); } - private float[] GetFloatArray(XmlReader reader, string childName, char delimiter) + private float[]? GetFloatArray(XmlReader reader, string childName, char delimiter) { var ldastr = Xml.GetChildInnerText(reader, childName); return GetFloatArray(ldastr, delimiter); @@ -884,282 +938,28 @@ namespace CodeWalker.GameFiles { return modelName; } - - public override bool Equals(object obj) - { - return obj is VehicleInitData data && - modelName == data.modelName && - txdName == data.txdName && - handlingId == data.handlingId && - gameName == data.gameName && - vehicleMakeName == data.vehicleMakeName && - expressionDictName == data.expressionDictName && - expressionName == data.expressionName && - animConvRoofDictName == data.animConvRoofDictName && - animConvRoofName == data.animConvRoofName && - animConvRoofWindowsAffected == data.animConvRoofWindowsAffected && - ptfxAssetName == data.ptfxAssetName && - audioNameHash == data.audioNameHash && - layout == data.layout && - coverBoundOffsets == data.coverBoundOffsets && - explosionInfo == data.explosionInfo && - scenarioLayout == data.scenarioLayout && - cameraName == data.cameraName && - aimCameraName == data.aimCameraName && - bonnetCameraName == data.bonnetCameraName && - povCameraName == data.povCameraName && - FirstPersonDriveByIKOffset.Equals(data.FirstPersonDriveByIKOffset) && - FirstPersonDriveByUnarmedIKOffset.Equals(data.FirstPersonDriveByUnarmedIKOffset) && - FirstPersonProjectileDriveByIKOffset.Equals(data.FirstPersonProjectileDriveByIKOffset) && - FirstPersonProjectileDriveByPassengerIKOffset.Equals(data.FirstPersonProjectileDriveByPassengerIKOffset) && - FirstPersonDriveByRightPassengerIKOffset.Equals(data.FirstPersonDriveByRightPassengerIKOffset) && - FirstPersonDriveByRightPassengerUnarmedIKOffset.Equals(data.FirstPersonDriveByRightPassengerUnarmedIKOffset) && - FirstPersonMobilePhoneOffset.Equals(data.FirstPersonMobilePhoneOffset) && - FirstPersonPassengerMobilePhoneOffset.Equals(data.FirstPersonPassengerMobilePhoneOffset) && - PovCameraOffset.Equals(data.PovCameraOffset) && - PovCameraVerticalAdjustmentForRollCage.Equals(data.PovCameraVerticalAdjustmentForRollCage) && - PovPassengerCameraOffset.Equals(data.PovPassengerCameraOffset) && - PovRearPassengerCameraOffset.Equals(data.PovRearPassengerCameraOffset) && - vfxInfoName == data.vfxInfoName && - shouldUseCinematicViewMode == data.shouldUseCinematicViewMode && - shouldCameraTransitionOnClimbUpDown == data.shouldCameraTransitionOnClimbUpDown && - shouldCameraIgnoreExiting == data.shouldCameraIgnoreExiting && - AllowPretendOccupants == data.AllowPretendOccupants && - AllowJoyriding == data.AllowJoyriding && - AllowSundayDriving == data.AllowSundayDriving && - AllowBodyColorMapping == data.AllowBodyColorMapping && - wheelScale == data.wheelScale && - wheelScaleRear == data.wheelScaleRear && - dirtLevelMin == data.dirtLevelMin && - dirtLevelMax == data.dirtLevelMax && - envEffScaleMin == data.envEffScaleMin && - envEffScaleMax == data.envEffScaleMax && - envEffScaleMin2 == data.envEffScaleMin2 && - envEffScaleMax2 == data.envEffScaleMax2 && - damageMapScale == data.damageMapScale && - damageOffsetScale == data.damageOffsetScale && - diffuseTint.Equals(data.diffuseTint) && - steerWheelMult == data.steerWheelMult && - HDTextureDist == data.HDTextureDist && - StructuralComparisons.StructuralEqualityComparer.Equals(lodDistances, data.lodDistances) && - minSeatHeight == data.minSeatHeight && - identicalModelSpawnDistance == data.identicalModelSpawnDistance && - maxNumOfSameColor == data.maxNumOfSameColor && - defaultBodyHealth == data.defaultBodyHealth && - pretendOccupantsScale == data.pretendOccupantsScale && - visibleSpawnDistScale == data.visibleSpawnDistScale && - trackerPathWidth == data.trackerPathWidth && - weaponForceMult == data.weaponForceMult && - frequency == data.frequency && - swankness == data.swankness && - maxNum == data.maxNum && - StructuralComparisons.StructuralEqualityComparer.Equals(flags, data.flags) && - type == data.type && - plateType == data.plateType && - dashboardType == data.dashboardType && - vehicleClass == data.vehicleClass && - wheelType == data.wheelType && - StructuralComparisons.StructuralEqualityComparer.Equals(trailers, data.trailers) && - StructuralComparisons.StructuralEqualityComparer.Equals(additionalTrailers, data.additionalTrailers) && - StructuralComparisons.StructuralEqualityComparer.Equals(drivers, data.drivers) && - StructuralComparisons.StructuralEqualityComparer.Equals(extraIncludes, data.extraIncludes) && - StructuralComparisons.StructuralEqualityComparer.Equals(doorsWithCollisionWhenClosed, data.doorsWithCollisionWhenClosed) && - StructuralComparisons.StructuralEqualityComparer.Equals(driveableDoors, data.driveableDoors) && - bumpersNeedToCollideWithMap == data.bumpersNeedToCollideWithMap && - needsRopeTexture == data.needsRopeTexture && - StructuralComparisons.StructuralEqualityComparer.Equals(requiredExtras, data.requiredExtras) && - StructuralComparisons.StructuralEqualityComparer.Equals(rewards, data.rewards) && - StructuralComparisons.StructuralEqualityComparer.Equals(cinematicPartCamera, data.cinematicPartCamera) && - NmBraceOverrideSet == data.NmBraceOverrideSet && - buoyancySphereOffset.Equals(data.buoyancySphereOffset) && - buoyancySphereSizeScale == data.buoyancySphereSizeScale && - EqualityComparer.Default.Equals(pOverrideRagdollThreshold, data.pOverrideRagdollThreshold) && - StructuralComparisons.StructuralEqualityComparer.Equals(firstPersonDrivebyData, data.firstPersonDrivebyData); - } - - public override int GetHashCode() - { - int hashCode = 1102137281; - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(modelName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(txdName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(handlingId); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(gameName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(vehicleMakeName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(expressionDictName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(expressionName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(animConvRoofDictName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(animConvRoofName); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(animConvRoofWindowsAffected); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ptfxAssetName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(audioNameHash); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(layout); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(coverBoundOffsets); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(explosionInfo); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(scenarioLayout); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(cameraName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(aimCameraName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(bonnetCameraName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(povCameraName); - hashCode = hashCode * -1521134295 + FirstPersonDriveByIKOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + FirstPersonDriveByUnarmedIKOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + FirstPersonProjectileDriveByIKOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + FirstPersonProjectileDriveByPassengerIKOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + FirstPersonDriveByRightPassengerIKOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + FirstPersonDriveByRightPassengerUnarmedIKOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + FirstPersonMobilePhoneOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + FirstPersonPassengerMobilePhoneOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + PovCameraOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + PovCameraVerticalAdjustmentForRollCage.GetHashCode(); - hashCode = hashCode * -1521134295 + PovPassengerCameraOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + PovRearPassengerCameraOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(vfxInfoName); - hashCode = hashCode * -1521134295 + shouldUseCinematicViewMode.GetHashCode(); - hashCode = hashCode * -1521134295 + shouldCameraTransitionOnClimbUpDown.GetHashCode(); - hashCode = hashCode * -1521134295 + shouldCameraIgnoreExiting.GetHashCode(); - hashCode = hashCode * -1521134295 + AllowPretendOccupants.GetHashCode(); - hashCode = hashCode * -1521134295 + AllowJoyriding.GetHashCode(); - hashCode = hashCode * -1521134295 + AllowSundayDriving.GetHashCode(); - hashCode = hashCode * -1521134295 + AllowBodyColorMapping.GetHashCode(); - hashCode = hashCode * -1521134295 + wheelScale.GetHashCode(); - hashCode = hashCode * -1521134295 + wheelScaleRear.GetHashCode(); - hashCode = hashCode * -1521134295 + dirtLevelMin.GetHashCode(); - hashCode = hashCode * -1521134295 + dirtLevelMax.GetHashCode(); - hashCode = hashCode * -1521134295 + envEffScaleMin.GetHashCode(); - hashCode = hashCode * -1521134295 + envEffScaleMax.GetHashCode(); - hashCode = hashCode * -1521134295 + envEffScaleMin2.GetHashCode(); - hashCode = hashCode * -1521134295 + envEffScaleMax2.GetHashCode(); - hashCode = hashCode * -1521134295 + damageMapScale.GetHashCode(); - hashCode = hashCode * -1521134295 + damageOffsetScale.GetHashCode(); - hashCode = hashCode * -1521134295 + diffuseTint.GetHashCode(); - hashCode = hashCode * -1521134295 + steerWheelMult.GetHashCode(); - hashCode = hashCode * -1521134295 + HDTextureDist.GetHashCode(); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(lodDistances); - hashCode = hashCode * -1521134295 + minSeatHeight.GetHashCode(); - hashCode = hashCode * -1521134295 + identicalModelSpawnDistance.GetHashCode(); - hashCode = hashCode * -1521134295 + maxNumOfSameColor.GetHashCode(); - hashCode = hashCode * -1521134295 + defaultBodyHealth.GetHashCode(); - hashCode = hashCode * -1521134295 + pretendOccupantsScale.GetHashCode(); - hashCode = hashCode * -1521134295 + visibleSpawnDistScale.GetHashCode(); - hashCode = hashCode * -1521134295 + trackerPathWidth.GetHashCode(); - hashCode = hashCode * -1521134295 + weaponForceMult.GetHashCode(); - hashCode = hashCode * -1521134295 + frequency.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(swankness); - hashCode = hashCode * -1521134295 + maxNum.GetHashCode(); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(flags); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(type); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(plateType); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(dashboardType); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(vehicleClass); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(wheelType); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(trailers); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(additionalTrailers); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(drivers); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(extraIncludes); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(doorsWithCollisionWhenClosed); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(driveableDoors); - hashCode = hashCode * -1521134295 + bumpersNeedToCollideWithMap.GetHashCode(); - hashCode = hashCode * -1521134295 + needsRopeTexture.GetHashCode(); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(requiredExtras); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(rewards); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(cinematicPartCamera); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(NmBraceOverrideSet); - hashCode = hashCode * -1521134295 + buoyancySphereOffset.GetHashCode(); - hashCode = hashCode * -1521134295 + buoyancySphereSizeScale.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(pOverrideRagdollThreshold); - hashCode = hashCode * -1521134295 + StructuralComparisons.StructuralEqualityComparer.GetHashCode(firstPersonDrivebyData); - return hashCode; - } - - public static bool operator ==(VehicleInitData left, VehicleInitData right) - { - return EqualityComparer.Default.Equals(left, right); - } - - public static bool operator !=(VehicleInitData left, VehicleInitData right) - { - return !(left == right); - } } - public class VehicleOverrideRagdollThreshold : IEquatable + public record VehicleOverrideRagdollThreshold : IEquatable { public int MinComponent { get; set; } public int MaxComponent { get; set; } public float ThresholdMult { get; set; } - public override bool Equals(object obj) - { - return obj is VehicleOverrideRagdollThreshold threshold && Equals(threshold); - } - - public bool Equals(VehicleOverrideRagdollThreshold other) - { - return MinComponent == other.MinComponent && - MaxComponent == other.MaxComponent && - ThresholdMult == other.ThresholdMult; - } - - public override int GetHashCode() - { - int hashCode = 1172526364; - hashCode = hashCode * -1521134295 + MinComponent.GetHashCode(); - hashCode = hashCode * -1521134295 + MaxComponent.GetHashCode(); - hashCode = hashCode * -1521134295 + ThresholdMult.GetHashCode(); - return hashCode; - } - public override string ToString() { - return MinComponent.ToString() + ", " + MaxComponent.ToString() + ", " + ThresholdMult.ToString(); - } - - public static bool operator ==(VehicleOverrideRagdollThreshold left, VehicleOverrideRagdollThreshold right) - { - return left.Equals(right); - } - - public static bool operator !=(VehicleOverrideRagdollThreshold left, VehicleOverrideRagdollThreshold right) - { - return !(left == right); + return $"{MinComponent}, {MaxComponent}, {ThresholdMult}"; } } - public class VehicleDriver : IEquatable + + public readonly record struct VehicleDriver : IEquatable { - public string driverName { get; set; } - public string npcName { get; set; } - - public override bool Equals(object obj) - { - return obj is VehicleDriver driver && Equals(driver); - } - - public bool Equals(VehicleDriver other) - { - return driverName == other.driverName && - npcName == other.npcName; - } - - public override int GetHashCode() - { - int hashCode = -1906737521; - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(driverName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(npcName); - return hashCode; - } + public string DriverName { get; init; } + public string NpcName { get; init; } public override string ToString() { - return driverName + ", " + npcName; - } - - public static bool operator ==(VehicleDriver left, VehicleDriver right) - { - return left.Equals(right); - } - - public static bool operator !=(VehicleDriver left, VehicleDriver right) - { - return !(left == right); + return $"{DriverName}, {NpcName}"; } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/WatermapFile.cs b/CodeWalker.Core/GameFiles/FileTypes/WatermapFile.cs index e98e8d4..e2d568c 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/WatermapFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/WatermapFile.cs @@ -488,9 +488,9 @@ namespace CodeWalker.GameFiles { var h = GridWatermapInds[y * Width + x]; sb.Append(h.ToString()); - sb.Append(" "); + sb.Append(' '); } - sb.Append("\n"); + sb.Append('\n'); } return sb.ToString(); diff --git a/CodeWalker.Core/GameFiles/FileTypes/YbnFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YbnFile.cs index ec05eba..2c46386 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YbnFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YbnFile.cs @@ -1,4 +1,5 @@ -using System; +using CommunityToolkit.Diagnostics; +using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; @@ -45,10 +46,10 @@ namespace CodeWalker.GameFiles RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); @@ -105,26 +106,34 @@ namespace CodeWalker.GameFiles public static string GetXml(YbnFile ybn) { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - var name = "BoundsFile"; - OpenTag(sb, 0, name); - - if (ybn?.Bounds != null) + StringBuilder sb = StringBuilderPool.Get(); + try { - Bounds.WriteXmlNode(ybn.Bounds, sb, 1); + sb.AppendLine(XmlHeader); + + var name = "BoundsFile"; + OpenTag(sb, 0, name); + + if (ybn?.Bounds != null) + { + Bounds.WriteXmlNode(ybn.Bounds, sb, 1); + } + + CloseTag(sb, 0, name); + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); } - CloseTag(sb, 0, name); - - return sb.ToString(); } public static string FormatBoundMaterialColour(BoundMaterialColour c) //for use with WriteItemArray { - return c.R.ToString() + ", " + c.G.ToString() + ", " + c.B.ToString() + ", " + c.A.ToString(); + return $"{c.R}, {c.G}, {c.B}, {c.A}"; } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/YcdFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YcdFile.cs index 89a58b4..e52a0a6 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YcdFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YcdFile.cs @@ -38,13 +38,13 @@ namespace CodeWalker.GameFiles //Hash = entry.ShortNameHash; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } - + try { using ResourceDataReader rd = new ResourceDataReader(resentry, data); diff --git a/CodeWalker.Core/GameFiles/FileTypes/YddFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YddFile.cs index 8acbfcf..8609ebd 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YddFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YddFile.cs @@ -31,16 +31,26 @@ namespace CodeWalker.GameFiles Loaded = true; } + + public async Task LoadAsync(byte[] data) + { + //direct load from a raw, compressed ydd file + + await RpfFile.LoadResourceFileAsync(this, data, 165); + + Loaded = true; + } + public void Load(byte[] data, RpfFileEntry entry) { Name = entry.Name; RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); @@ -99,12 +109,8 @@ namespace CodeWalker.GameFiles return data; } - new public long MemoryUsage { - get { - return DrawableDict.MemoryUsage; - } - } - + public long PhysicalMemoryUsage => DrawableDict.PhysicalMemoryUsage; + public long VirtualMemoryUsage => DrawableDict.VirtualMemoryUsage; } @@ -112,18 +118,24 @@ namespace CodeWalker.GameFiles public class YddXml : MetaXmlBase { - public static string GetXml(YddFile ydd, string outputFolder = "") { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if (ydd?.DrawableDict != null) + StringBuilder sb = StringBuilderPool.Get(); + try { - DrawableDictionary.WriteXmlNode(ydd.DrawableDict, sb, 0, outputFolder); - } + sb.AppendLine(XmlHeader); - return sb.ToString(); + if (ydd?.DrawableDict != null) + { + DrawableDictionary.WriteXmlNode(ydd.DrawableDict, sb, 0, outputFolder); + } + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); + } } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/YdrFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YdrFile.cs index 213fffd..9903d09 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YdrFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YdrFile.cs @@ -27,16 +27,26 @@ namespace CodeWalker.GameFiles Loaded = true; } + + public async Task LoadAsync(byte[] data) + { + //direct load from a raw, compressed ydr file + + await RpfFile.LoadResourceFileAsync(this, data, 165); + + Loaded = true; + } + public void Load(byte[] data, RpfFileEntry entry) { Name = entry.Name; RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); @@ -70,13 +80,8 @@ namespace CodeWalker.GameFiles return data; } - new public long MemoryUsage - { - get - { - return Drawable.MemoryUsage; - } - } + public long PhysicalMemoryUsage => Drawable.PhysicalMemoryUsage; + public long VirtualMemoryUsage => Drawable.VirtualMemoryUsage; } @@ -84,20 +89,25 @@ namespace CodeWalker.GameFiles public class YdrXml : MetaXmlBase { - public static string GetXml(YdrFile ydr, string outputFolder = "") { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if (ydr?.Drawable != null) + StringBuilder sb = StringBuilderPool.Get(); + try { - Drawable.WriteXmlNode(ydr.Drawable, sb, 0, outputFolder); + sb.AppendLine(XmlHeader); + + if (ydr?.Drawable != null) + { + Drawable.WriteXmlNode(ydr.Drawable, sb, 0, outputFolder); + } + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); } - - return sb.ToString(); } - } public class XmlYdr diff --git a/CodeWalker.Core/GameFiles/FileTypes/YedFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YedFile.cs index d236e70..5a37092 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YedFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YedFile.cs @@ -35,10 +35,10 @@ namespace CodeWalker.GameFiles //Hash = entry.ShortNameHash; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } try diff --git a/CodeWalker.Core/GameFiles/FileTypes/YfdFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YfdFile.cs index 9bfb7ba..49de8a8 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YfdFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YfdFile.cs @@ -30,13 +30,13 @@ namespace CodeWalker.GameFiles //Hash = entry.ShortNameHash; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } - + try { using var rd = new ResourceDataReader(resentry, data); diff --git a/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs index 4283bef..35d2600 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YftFile.cs @@ -34,10 +34,10 @@ namespace CodeWalker.GameFiles Name = entry.Name; RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); @@ -68,7 +68,8 @@ namespace CodeWalker.GameFiles return data; } - + public long PhysicalMemoryUsage => Fragment.Drawable.PhysicalMemoryUsage; + public long VirtualMemoryUsage => Fragment.Drawable.VirtualMemoryUsage; } @@ -80,17 +81,23 @@ namespace CodeWalker.GameFiles public static string GetXml(YftFile yft, string outputFolder = "") { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if (yft?.Fragment != null) + StringBuilder sb = StringBuilderPool.Get(); + try { - FragType.WriteXmlNode(yft.Fragment, sb, 0, outputFolder); + sb.AppendLine(XmlHeader); + + if (yft?.Fragment != null) + { + FragType.WriteXmlNode(yft.Fragment, sb, 0, outputFolder); + } + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); } - - return sb.ToString(); } - } public class XmlYft diff --git a/CodeWalker.Core/GameFiles/FileTypes/YldFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YldFile.cs index a849a14..94b429a 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YldFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YldFile.cs @@ -34,13 +34,13 @@ namespace CodeWalker.GameFiles //Hash = entry.ShortNameHash; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } - + try { using var rd = new ResourceDataReader(resentry, data); diff --git a/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs index 1cb19d9..c7ad1bf 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs @@ -9,3601 +9,3559 @@ using System.Text; using System.Threading.Tasks; using CodeWalker.Core.Utils; using CodeWalker.World; +using System.Diagnostics.CodeAnalysis; +using CommunityToolkit.HighPerformance; +using Collections.Pooled; +using System.Threading; -namespace CodeWalker.GameFiles +namespace CodeWalker.GameFiles; + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapFile : GameFile, PackedFile { - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapFile : GameFile, PackedFile + public Meta Meta { get; set; } + public PsoFile Pso { get; set; } + public RbfFile Rbf { get; set; } + + public CMapData _CMapData; + public CMapData CMapData { get => _CMapData; set => _CMapData = value; } + + public CEntityDef[]? CEntityDefs { get; set; } + public CMloInstanceDef[]? CMloInstanceDefs { get; set; } + public CCarGen[]? CCarGens { get; set; } + public CTimeCycleModifier[]? CTimeCycleModifiers { get; set; } + public MetaHash[] physicsDictionaries { get; set; } + + public BoxOccluder[] CBoxOccluders { get; set; } + public OccludeModel[] COccludeModels { get; set; } + + + public string[] Strings { get; set; } + public YmapEntityDef[] AllEntities { get; set; } = []; + public YmapEntityDef[] RootEntities { get; set; } = []; + public YmapEntityDef[] MloEntities { get; set; } = []; + + private WeakReference parent = new WeakReference(null); + + public YmapFile? Parent { - - public Meta Meta { get; set; } - public PsoFile Pso { get; set; } - public RbfFile Rbf { get; set; } - - public CMapData _CMapData; - - public CMapData CMapData { get { return _CMapData; } set { _CMapData = value; } } - public CEntityDef[] CEntityDefs { get; set; } - public CMloInstanceDef[] CMloInstanceDefs { get; set; } - public CCarGen[] CCarGens { get; set; } - public CTimeCycleModifier[] CTimeCycleModifiers { get; set; } - public MetaHash[] physicsDictionaries { get; set; } - - public BoxOccluder[] CBoxOccluders { get; set; } - public OccludeModel[] COccludeModels { get; set; } - - - public string[] Strings { get; set; } - public YmapEntityDef[] AllEntities; - public YmapEntityDef[] RootEntities; - public YmapEntityDef[] MloEntities; - - public YmapFile Parent { get; set; } - public YmapFile[] ChildYmaps = null; - public bool MergedWithParent = false; - - public bool IsScripted { get { return (_CMapData.flags & 1) > 0; } } - - public YmapGrassInstanceBatch[] GrassInstanceBatches { get; set; } - public YmapPropInstanceBatch[] PropInstanceBatches { get; set; } - - public YmapDistantLODLights DistantLODLights { get; set; } - - public YmapLODLights LODLights { get; set; } - - public YmapTimeCycleModifier[] TimeCycleModifiers { get; set; } - - public YmapCarGen[] CarGenerators { get; set; } - - public YmapBoxOccluder[] BoxOccluders { get; set; } - public YmapOccludeModel[] OccludeModels { get; set; } - - - //fields used by the editor: - public bool HasChanged { get; set; } = false; - public List SaveWarnings = null; - public bool LodManagerUpdate = false; //forces the LOD manager to refresh this ymap when rendering - public YmapEntityDef[] LodManagerOldEntities = null; //when entities are removed, need the old ones to remove from lod manager - - - public YmapFile() : base(null, GameFileType.Ymap) + get { + if (!parent.TryGetTarget(out var target)) + { + return null; + } + + return target; } - public YmapFile(RpfFileEntry entry) : base(entry, GameFileType.Ymap) + set { - RpfFileEntry = entry; + parent.SetTarget(value); } + } + public YmapFile[]? ChildYmaps { get; set; } + public bool MergedWithParent = false; - public void Load(byte[] data) + public bool IsScripted => (_CMapData.flags & 1) > 0; + + public YmapGrassInstanceBatch[] GrassInstanceBatches { get; set; } + public YmapPropInstanceBatch[] PropInstanceBatches { get; set; } + + public YmapDistantLODLights DistantLODLights { get; set; } + + public YmapLODLights LODLights { get; set; } + + public YmapTimeCycleModifier[] TimeCycleModifiers { get; set; } + + public YmapCarGen[] CarGenerators { get; set; } + + public YmapBoxOccluder[] BoxOccluders { get; set; } + public YmapOccludeModel[] OccludeModels { get; set; } + + + //fields used by the editor: + public bool HasChanged { get; set; } = false; + public List? SaveWarnings = null; + public bool LodManagerUpdate = false; //forces the LOD manager to refresh this ymap when rendering + public YmapEntityDef[]? LodManagerOldEntities = null; //when entities are removed, need the old ones to remove from lod manager + + + public YmapFile() : base(null, GameFileType.Ymap) + { + } + public YmapFile(RpfFileEntry entry) : base(entry, GameFileType.Ymap) + { + RpfFileEntry = entry; + } + + public void Load(byte[] data) + { + //direct load from a raw, compressed ymap file (openIV-compatible format) + + RpfFile.LoadResourceFile(this, data, 2); + + Loaded = true; + } + + public async ValueTask LoadAsync(byte[] data) + { + await RpfFile.LoadResourceFileAsync(this, data, 2); + + Loaded = true; + } + + public void Load(byte[] data, RpfFileEntry entry) + { + Name = entry.Name; + RpfFileEntry = entry; + + if (entry is not RpfResourceFileEntry resentry) { - //direct load from a raw, compressed ymap file (openIV-compatible format) - - RpfFile.LoadResourceFile(this, data, 2); - + NonMetaLoad(data); Loaded = true; + return; } - public void Load(byte[] data, RpfFileEntry entry) + using var rd = new ResourceDataReader(resentry, data); + + Meta = rd.ReadBlock();//maybe null this after load to reduce memory consumption? + + + + CMapData = MetaTypes.GetTypedData(Meta, MetaName.CMapData); + + + + Strings = MetaTypes.GetStrings(Meta) ?? Array.Empty(); + + foreach(var str in Strings) { - Name = entry.Name; - RpfFileEntry = entry; + JenkIndex.Ensure(str); //just shove them in there + } - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) - { - NonMetaLoad(data); - Loaded = true; - return; - } + physicsDictionaries = MetaTypes.GetHashArray(Meta, in _CMapData.physicsDictionaries) ?? Array.Empty(); - using var rd = new ResourceDataReader(resentry, data); - Meta = rd.ReadBlock();//maybe null this after load to reduce memory consumption? + EnsureEntities(); //load all the entity data and create the YmapEntityDefs + + EnsureInstances(); + + EnsureLODLights(); + + EnsureDistantLODLights(); + + EnsureTimeCycleModifiers(); + + EnsureCarGens(); + + EnsureBoxOccluders(); + + EnsureOccludeModels(); + + EnsureContainerLods(); + + + #region data block test and old code + + //foreach (var block in Meta.DataBlocks) + //{ + // switch (block.StructureNameHash) + // { + // case (MetaName)MetaTypeName.STRING: + // case (MetaName)MetaTypeName.POINTER: + // case (MetaName)MetaTypeName.HASH: + // case (MetaName)MetaTypeName.UINT: + // case (MetaName)MetaTypeName.VECTOR3: //distant lod lights uses this + // case MetaName.CMapData: + // case MetaName.CEntityDef: + // case MetaName.CTimeCycleModifier: //these sections are handled already + // case MetaName.CCarGen: + // case MetaName.CLightAttrDef: + // case MetaName.CMloInstanceDef: + // case MetaName.CExtensionDefDoor: + // case MetaName.CExtensionDefLightEffect: + // case MetaName.CExtensionDefSpawnPointOverride: + // case MetaName.rage__fwGrassInstanceListDef: //grass instance buffer + // case MetaName.rage__fwGrassInstanceListDef__InstanceData: //grass instance buffer data + // break; + // case MetaName.PhVerletClothCustomBounds: //these sections still todo.. + // case MetaName.SectionUNKNOWN1: + // case MetaName.SectionUNKNOWN5://occlusion vertex data container + // case MetaName.SectionUNKNOWN7://occlusion related? + // break; + // case (MetaName)17: //vertex data - occlusion related - SectionUNKNOWN5 + // break; + // case (MetaName)33: //what is this? maybe lodlights related + // break; + // default: + // break; + // } + //} - CMapData = MetaTypes.GetTypedData(Meta, MetaName.CMapData); + //MetaTypes.ParseMetaData(Meta); - - - Strings = MetaTypes.GetStrings(Meta); - if (Strings != null) - { - foreach (string str in Strings) - { - JenkIndex.Ensure(str); //just shove them in there - } - } - - physicsDictionaries = MetaTypes.GetHashArray(Meta, _CMapData.physicsDictionaries); - - - EnsureEntities(Meta); //load all the entity data and create the YmapEntityDefs - - EnsureInstances(Meta); - - EnsureLODLights(Meta); - - EnsureDistantLODLights(Meta); - - EnsureTimeCycleModifiers(Meta); - - EnsureCarGens(Meta); - - EnsureBoxOccluders(Meta); - - EnsureOccludeModels(Meta); - - EnsureContainerLods(Meta); - - - #region data block test and old code - - //foreach (var block in Meta.DataBlocks) - //{ - // switch (block.StructureNameHash) - // { - // case (MetaName)MetaTypeName.STRING: - // case (MetaName)MetaTypeName.POINTER: - // case (MetaName)MetaTypeName.HASH: - // case (MetaName)MetaTypeName.UINT: - // case (MetaName)MetaTypeName.VECTOR3: //distant lod lights uses this - // case MetaName.CMapData: - // case MetaName.CEntityDef: - // case MetaName.CTimeCycleModifier: //these sections are handled already - // case MetaName.CCarGen: - // case MetaName.CLightAttrDef: - // case MetaName.CMloInstanceDef: - // case MetaName.CExtensionDefDoor: - // case MetaName.CExtensionDefLightEffect: - // case MetaName.CExtensionDefSpawnPointOverride: - // case MetaName.rage__fwGrassInstanceListDef: //grass instance buffer - // case MetaName.rage__fwGrassInstanceListDef__InstanceData: //grass instance buffer data - // break; - // case MetaName.PhVerletClothCustomBounds: //these sections still todo.. - // case MetaName.SectionUNKNOWN1: - // case MetaName.SectionUNKNOWN5://occlusion vertex data container - // case MetaName.SectionUNKNOWN7://occlusion related? - // break; - // case (MetaName)17: //vertex data - occlusion related - SectionUNKNOWN5 - // break; - // case (MetaName)33: //what is this? maybe lodlights related - // break; - // default: - // break; - // } - //} - - - - //MetaTypes.ParseMetaData(Meta); - - //string shortname = resentry.Name.Substring(0, resentry.Name.LastIndexOf('.')); - //uint namehash = JenkHash.GenHash(shortname); + //string shortname = resentry.Name.Substring(0, resentry.Name.LastIndexOf('.')); + //uint namehash = JenkHash.GenHash(shortname); - //CLightAttrDefs = MetaTypes.GetTypedDataArray(Meta, MetaName.CLightAttrDef); - //if (CLightAttrDefs != null) - //{ } + //CLightAttrDefs = MetaTypes.GetTypedDataArray(Meta, MetaName.CLightAttrDef); + //if (CLightAttrDefs != null) + //{ } - //var unk5s = MetaTypes.GetTypedDataArray(Meta, MetaName.SectionUNKNOWN5); - //if (unk5s != null) //used in occlusion ymaps - //{ - // foreach (var unk5 in unk5s) - // { - // if ((unk5.verts.Ptr > 0) && (unk5.verts.Ptr <= (ulong)Meta.DataBlocks.Length)) - // { - // var indicesoffset = unk5.numVertsInBytes; - // var datablock = Meta.DataBlocks[((int)unk5.verts.Ptr) - 1]; - // if (datablock != null) - // { }//vertex data... occlusion mesh? - // } - // } - //} + //var unk5s = MetaTypes.GetTypedDataArray(Meta, MetaName.SectionUNKNOWN5); + //if (unk5s != null) //used in occlusion ymaps + //{ + // foreach (var unk5 in unk5s) + // { + // if ((unk5.verts.Ptr > 0) && (unk5.verts.Ptr <= (ulong)Meta.DataBlocks.Length)) + // { + // var indicesoffset = unk5.numVertsInBytes; + // var datablock = Meta.DataBlocks[((int)unk5.verts.Ptr) - 1]; + // if (datablock != null) + // { }//vertex data... occlusion mesh? + // } + // } + //} - //var unk7s = MetaTypes.GetTypedDataArray(Meta, MetaName.SectionUNKNOWN7); - //if (unk7s != null) - //{ } //used in occlusion ymaps + //var unk7s = MetaTypes.GetTypedDataArray(Meta, MetaName.SectionUNKNOWN7); + //if (unk7s != null) + //{ } //used in occlusion ymaps - //var unk10s = MetaTypes.GetTypedDataArray(Meta, MetaName.SectionUNKNOWN10); - //if (unk10s != null) - //{ } //entity pointer array.. + //var unk10s = MetaTypes.GetTypedDataArray(Meta, MetaName.SectionUNKNOWN10); + //if (unk10s != null) + //{ } //entity pointer array.. - //CDoors = MetaTypes.GetTypedDataArray(Meta, MetaName.CExtensionDefDoor); - //if (CDoors != null) - //{ } //needs work - doors can be different types? not enough bytes for one + //CDoors = MetaTypes.GetTypedDataArray(Meta, MetaName.CExtensionDefDoor); + //if (CDoors != null) + //{ } //needs work - doors can be different types? not enough bytes for one - //CExtLightEffects = MetaTypes.GetTypedDataArray(Meta, MetaName.CExtensionDefLightEffect); - //if (CExtLightEffects != null) - //{ } + //CExtLightEffects = MetaTypes.GetTypedDataArray(Meta, MetaName.CExtensionDefLightEffect); + //if (CExtLightEffects != null) + //{ } - //CSpawnOverrides = MetaTypes.GetTypedDataArray(Meta, MetaName.CExtensionDefSpawnPointOverride); - //if (CSpawnOverrides != null) - //{ } + //CSpawnOverrides = MetaTypes.GetTypedDataArray(Meta, MetaName.CExtensionDefSpawnPointOverride); + //if (CSpawnOverrides != null) + //{ } - #endregion + #endregion //#if !DEBUG // Meta = null; //this object is required for XML conversion! can't just let go of it here //#endif + } + + + + private void NonMetaLoad(byte[] data) + { + Console.WriteLine($"Loading NonMeta ymap {RpfFileEntry.Path}"); + //non meta not supported yet! but see what's in there... + if (RbfFile.IsRBF(data.AsSpan(0, 4))) + { + Rbf = new RbfFile(); + Rbf.Load(data); + } + else if (PsoFile.IsPSO(data.AsSpan(0, 4))) + { + Pso = new PsoFile(); + Pso.Load(data); + //PsoTypes.EnsurePsoTypes(Pso); + } + else + { + } + + } + + + + private void EnsureEntities() + { + //CMloInstanceDefs = MetaTypes.ConvertDataArray(Meta, MetaName.CMloInstanceDef, CMapData.entities); + CMloInstanceDefs = MetaTypes.GetTypedDataArray(Meta, MetaName.CMloInstanceDef) ?? []; + + //var eptrs = MetaTypes.GetPointerArray(Meta, _CMapData.entities); + //CEntityDefs = MetaTypes.ConvertDataArray(Meta, MetaName.CEntityDef, CMapData.entities); + CEntityDefs = MetaTypes.GetTypedDataArray(Meta, MetaName.CEntityDef) ?? []; + + int instcount = CEntityDefs.Length + CMloInstanceDefs.Length; + + if (instcount > 0) + { + + //build the entity hierarchy. + List roots = new List(instcount); + List alldefs = new List(instcount); + List mlodefs = null; + + if (CEntityDefs.Length > 0) + { + for (int i = 0; i < CEntityDefs.Length; i++) + { + YmapEntityDef d = new YmapEntityDef(this, i, CEntityDefs[i]); + alldefs.Add(d); + } + } + if (CMloInstanceDefs.Length > 0) + { + mlodefs = new List(CMloInstanceDefs.Length); + for (int i = 0; i < CMloInstanceDefs.Length; i++) + { + YmapEntityDef d = new YmapEntityDef(this, i, CMloInstanceDefs[i]); + uint[] defentsets = MetaTypes.GetUintArray(Meta, in CMloInstanceDefs[i].defaultEntitySets); + if (d.MloInstance is not null) + { + d.MloInstance.defaultEntitySets = defentsets; + } + alldefs.Add(d); + mlodefs.Add(d); + } + } + + + for (int i = 0; i < alldefs.Count; i++) + { + YmapEntityDef d = alldefs[i]; + int pind = d._CEntityDef.parentIndex; + bool isroot = false; + if ((pind < 0) || (pind >= alldefs.Count) || d.LodInParentYmap) + { + isroot = true; + } + else + { + YmapEntityDef p = alldefs[pind]; + if ((p._CEntityDef.lodLevel <= d._CEntityDef.lodLevel) || + ((p._CEntityDef.lodLevel == rage__eLodType.LODTYPES_DEPTH_ORPHANHD) && + (d._CEntityDef.lodLevel != rage__eLodType.LODTYPES_DEPTH_ORPHANHD))) + { + isroot = true; + p = null; + } + } + + if (isroot) + { + roots.Add(d); + } + else + { + YmapEntityDef p = alldefs[pind]; + p.AddChild(d); + } + } + for (int i = 0; i < alldefs.Count; i++) + { + alldefs[i].ChildListToArray(); + } + + AllEntities = alldefs.ToArray(); + RootEntities = roots.ToArray(); + MloEntities = mlodefs?.ToArray() ?? Array.Empty(); + + foreach(var ent in AllEntities) + { + ent.Extensions = MetaTypes.GetExtensions(Meta, in ent._CEntityDef.extensions) ?? Array.Empty(); + } + } + + } + + private void EnsureInstances() + { + if (_CMapData.instancedData.GrassInstanceList.Count1 != 0) + { + rage__fwGrassInstanceListDef[] batches = MetaTypes.ConvertDataArray(Meta, MetaName.rage__fwGrassInstanceListDef, in _CMapData.instancedData.GrassInstanceList) ?? Array.Empty(); + + + if (batches.Length == 0) + return; + + YmapGrassInstanceBatch[] gbatches = new YmapGrassInstanceBatch[batches.Length]; + for (int i = 0; i < batches.Length; i++) + { + var batch = batches[i]; + rage__fwGrassInstanceListDef__InstanceData[] instdatas = MetaTypes.ConvertDataArray(Meta, MetaName.rage__fwGrassInstanceListDef__InstanceData, in batch.InstanceList); + YmapGrassInstanceBatch gbatch = new YmapGrassInstanceBatch(); + gbatch.Ymap = this; + gbatch.Batch = batch; + gbatch.Instances = instdatas; + gbatch.Position = (batch.BatchAABB.min.XYZ() + batch.BatchAABB.max.XYZ()) * 0.5f; + gbatch.Radius = (batch.BatchAABB.max.XYZ() - gbatch.Position).Length(); + gbatch.AABBMin = (batch.BatchAABB.min.XYZ()); + gbatch.AABBMax = (batch.BatchAABB.max.XYZ()); + gbatches[i] = gbatch; + } + GrassInstanceBatches = gbatches; + } + if (_CMapData.instancedData.PropInstanceList.Count1 != 0) + { + } + } + + private void EnsureLODLights() + { + if (_CMapData.LODLightsSOA.direction.Count1 != 0) + { + var soa = _CMapData.LODLightsSOA; + LODLights = new YmapLODLights(); + LODLights.Ymap = this; + LODLights.CLODLight = soa; + LODLights.direction = MetaTypes.ConvertDataArray(Meta, MetaName.FloatXYZ, in soa.direction); + LODLights.falloff = MetaTypes.GetFloatArray(Meta, in soa.falloff); + LODLights.falloffExponent = MetaTypes.GetFloatArray(Meta, in soa.falloffExponent); + LODLights.timeAndStateFlags = MetaTypes.GetUintArray(Meta, in soa.timeAndStateFlags); + LODLights.hash = MetaTypes.GetUintArray(Meta, in soa.hash); + LODLights.coneInnerAngle = MetaTypes.GetByteArray(Meta, in soa.coneInnerAngle); + LODLights.coneOuterAngleOrCapExt = MetaTypes.GetByteArray(Meta, in soa.coneOuterAngleOrCapExt); + LODLights.coronaIntensity = MetaTypes.GetByteArray(Meta, in soa.coronaIntensity); + LODLights.CalcBB(); + } + } + + private void EnsureDistantLODLights() + { + if (_CMapData.DistantLODLightsSOA.position.Count1 != 0) + { + var soa = _CMapData.DistantLODLightsSOA; + DistantLODLights = new YmapDistantLODLights(); + DistantLODLights.Ymap = this; + DistantLODLights.CDistantLODLight = soa; + DistantLODLights.colours = MetaTypes.GetUintArray(Meta, in soa.RGBI); + DistantLODLights.positions = MetaTypes.ConvertDataArray(Meta, MetaName.FloatXYZ, in soa.position); + DistantLODLights.CalcBB(); + } + } + + private void EnsureTimeCycleModifiers() + { + CTimeCycleModifiers = MetaTypes.ConvertDataArray(Meta, MetaName.CTimeCycleModifier, in _CMapData.timeCycleModifiers); + if (CTimeCycleModifiers is null || CTimeCycleModifiers.Length == 0) + return; + + TimeCycleModifiers = new YmapTimeCycleModifier[CTimeCycleModifiers.Length]; + for (int i = 0; i < CTimeCycleModifiers.Length; i++) + { + YmapTimeCycleModifier tcm = new YmapTimeCycleModifier(); + tcm.Ymap = this; + tcm.CTimeCycleModifier = CTimeCycleModifiers[i]; + tcm.BBMin = tcm.CTimeCycleModifier.minExtents; + tcm.BBMax = tcm.CTimeCycleModifier.maxExtents; + TimeCycleModifiers[i] = tcm; + } + } + + private void EnsureCarGens() + { + CCarGens = MetaTypes.ConvertDataArray(Meta, MetaName.CCarGen, in _CMapData.carGenerators); + if (CCarGens is null || CCarGens.Length == 0) + return; + + //string str = MetaTypes.GetTypesInitString(resentry, Meta); //to generate structinfos and enuminfos + CarGenerators = new YmapCarGen[CCarGens.Length]; + for (int i = 0; i < CCarGens.Length; i++) + { + CarGenerators[i] = new YmapCarGen(this, CCarGens[i]); + } + } + + private void EnsureBoxOccluders() + { + CBoxOccluders = MetaTypes.ConvertDataArray(Meta, MetaName.BoxOccluder, in _CMapData.boxOccluders); + if (CBoxOccluders is null || CBoxOccluders.Length == 0) + return; + + BoxOccluders = new YmapBoxOccluder[CBoxOccluders.Length]; + for (int i = 0; i < CBoxOccluders.Length; i++) + { + BoxOccluders[i] = new YmapBoxOccluder(this, CBoxOccluders[i]); + BoxOccluders[i].Index = i; + } + } + + private void EnsureOccludeModels() + { + COccludeModels = MetaTypes.ConvertDataArray(Meta, MetaName.OccludeModel, in _CMapData.occludeModels); + + if (COccludeModels is null || COccludeModels.Length == 0) + return; + + OccludeModels = new YmapOccludeModel[COccludeModels.Length]; + for (int i = 0; i < COccludeModels.Length; i++) + { + OccludeModels[i] = new YmapOccludeModel(this, COccludeModels[i]); + OccludeModels[i].Index = i; + OccludeModels[i].Load(Meta); + + } + } + + private void EnsureContainerLods() + { + + //TODO: containerLods + if (_CMapData.containerLods.Count1 > 0) + { + //string str = MetaTypes.GetTypesInitString(Meta); //to generate structinfos and enuminfos + + + } + + } + + + public void BuildCEntityDefs() + { + //recreates the CEntityDefs and CMloInstanceDefs arrays from AllEntities. + //TODO: save entity extensions!!? + + CEntityDefs = Array.Empty(); + CMloInstanceDefs = Array.Empty(); + if (AllEntities.Length == 0) + { + return; } + List centdefs = new List(); + List cmlodefs = new List(); - private void NonMetaLoad(byte[] data) + foreach(var ent in AllEntities) { - //non meta not supported yet! but see what's in there... - MemoryStream ms = new MemoryStream(data); - if (RbfFile.IsRBF(ms)) + if (ent.MloInstance != null) { - Rbf = new RbfFile(); - Rbf.Load(ms); - } - else if (PsoFile.IsPSO(ms)) - { - Pso = new PsoFile(); - Pso.Load(ms); - //PsoTypes.EnsurePsoTypes(Pso); + cmlodefs.Add(ent.MloInstance._Instance); } else { - } - - } - - - - private void EnsureEntities(Meta Meta) - { - //CMloInstanceDefs = MetaTypes.ConvertDataArray(Meta, MetaName.CMloInstanceDef, CMapData.entities); - CMloInstanceDefs = MetaTypes.GetTypedDataArray(Meta, MetaName.CMloInstanceDef); - if (CMloInstanceDefs != null) - { } - - var eptrs = MetaTypes.GetPointerArray(Meta, _CMapData.entities); - //CEntityDefs = MetaTypes.ConvertDataArray(Meta, MetaName.CEntityDef, CMapData.entities); - CEntityDefs = MetaTypes.GetTypedDataArray(Meta, MetaName.CEntityDef); - if (CEntityDefs != null) - { } - - - - - int instcount = 0; - if (CEntityDefs != null) instcount += CEntityDefs.Length; - if (CMloInstanceDefs != null) instcount += CMloInstanceDefs.Length; - - if (instcount > 0) - { - - //build the entity hierarchy. - List roots = new List(instcount); - List alldefs = new List(instcount); - List mlodefs = null; - - if (CEntityDefs != null) - { - for (int i = 0; i < CEntityDefs.Length; i++) - { - YmapEntityDef d = new YmapEntityDef(this, i, ref CEntityDefs[i]); - alldefs.Add(d); - } - } - if (CMloInstanceDefs != null) - { - mlodefs = new List(); - for (int i = 0; i < CMloInstanceDefs.Length; i++) - { - YmapEntityDef d = new YmapEntityDef(this, i, ref CMloInstanceDefs[i]); - uint[] defentsets = MetaTypes.GetUintArray(Meta, CMloInstanceDefs[i].defaultEntitySets); - if (d.MloInstance != null) - { - d.MloInstance.defaultEntitySets = defentsets; - } - alldefs.Add(d); - mlodefs.Add(d); - } - } - - - for (int i = 0; i < alldefs.Count; i++) - { - YmapEntityDef d = alldefs[i]; - int pind = d._CEntityDef.parentIndex; - bool isroot = false; - if ((pind < 0) || (pind >= alldefs.Count) || d.LodInParentYmap) - { - isroot = true; - } - else - { - YmapEntityDef p = alldefs[pind]; - if ((p._CEntityDef.lodLevel <= d._CEntityDef.lodLevel) || - ((p._CEntityDef.lodLevel == rage__eLodType.LODTYPES_DEPTH_ORPHANHD) && - (d._CEntityDef.lodLevel != rage__eLodType.LODTYPES_DEPTH_ORPHANHD))) - { - isroot = true; - p = null; - } - } - - if (isroot) - { - roots.Add(d); - } - else - { - YmapEntityDef p = alldefs[pind]; - p.AddChild(d); - } - } - for (int i = 0; i < alldefs.Count; i++) - { - alldefs[i].ChildListToArray(); - } - - AllEntities = alldefs.ToArray(); - RootEntities = roots.ToArray(); - if (mlodefs != null) - { - MloEntities = mlodefs.ToArray(); - } - - - foreach (var ent in AllEntities) - { - ent.Extensions = MetaTypes.GetExtensions(Meta, ent._CEntityDef.extensions); - } - } - - } - - private void EnsureInstances(Meta Meta) - { - if (_CMapData.instancedData.GrassInstanceList.Count1 != 0) - { - rage__fwGrassInstanceListDef[] batches = MetaTypes.ConvertDataArray(Meta, MetaName.rage__fwGrassInstanceListDef, _CMapData.instancedData.GrassInstanceList); - YmapGrassInstanceBatch[] gbatches = new YmapGrassInstanceBatch[batches.Length]; - for (int i = 0; i < batches.Length; i++) - { - var batch = batches[i]; - rage__fwGrassInstanceListDef__InstanceData[] instdatas = MetaTypes.ConvertDataArray(Meta, MetaName.rage__fwGrassInstanceListDef__InstanceData, batch.InstanceList); - YmapGrassInstanceBatch gbatch = new YmapGrassInstanceBatch(); - gbatch.Ymap = this; - gbatch.Batch = batch; - gbatch.Instances = instdatas; - gbatch.Position = (batch.BatchAABB.min.XYZ() + batch.BatchAABB.max.XYZ()) * 0.5f; - gbatch.Radius = (batch.BatchAABB.max.XYZ() - gbatch.Position).Length(); - gbatch.AABBMin = (batch.BatchAABB.min.XYZ()); - gbatch.AABBMax = (batch.BatchAABB.max.XYZ()); - gbatches[i] = gbatch; - } - GrassInstanceBatches = gbatches; - } - if (_CMapData.instancedData.PropInstanceList.Count1 != 0) - { + centdefs.Add(ent._CEntityDef); } } - private void EnsureLODLights(Meta Meta) + if (centdefs.Count > 0) { - if (_CMapData.LODLightsSOA.direction.Count1 != 0) - { - var soa = _CMapData.LODLightsSOA; - LODLights = new YmapLODLights(); - LODLights.Ymap = this; - LODLights.CLODLight = soa; - LODLights.direction = MetaTypes.ConvertDataArray(Meta, MetaName.FloatXYZ, soa.direction); - LODLights.falloff = MetaTypes.GetFloatArray(Meta, soa.falloff); - LODLights.falloffExponent = MetaTypes.GetFloatArray(Meta, soa.falloffExponent); - LODLights.timeAndStateFlags = MetaTypes.GetUintArray(Meta, soa.timeAndStateFlags); - LODLights.hash = MetaTypes.GetUintArray(Meta, soa.hash); - LODLights.coneInnerAngle = MetaTypes.GetByteArray(Meta, soa.coneInnerAngle); - LODLights.coneOuterAngleOrCapExt = MetaTypes.GetByteArray(Meta, soa.coneOuterAngleOrCapExt); - LODLights.coronaIntensity = MetaTypes.GetByteArray(Meta, soa.coronaIntensity); - LODLights.CalcBB(); - } + CEntityDefs = centdefs.ToArray(); + } + if (cmlodefs.Count > 0) + { + CMloInstanceDefs = cmlodefs.ToArray(); + } + } + public void BuildCCarGens() + { + //recreates the CCarGens array from CarGenerators. + if (CarGenerators == null) + { + CCarGens = null; + return; } - private void EnsureDistantLODLights(Meta Meta) + int count = CarGenerators.Length; + CCarGens = new CCarGen[count]; + for (int i = 0; i < count; i++) { - if (_CMapData.DistantLODLightsSOA.position.Count1 != 0) - { - var soa = _CMapData.DistantLODLightsSOA; - DistantLODLights = new YmapDistantLODLights(); - DistantLODLights.Ymap = this; - DistantLODLights.CDistantLODLight = soa; - DistantLODLights.colours = MetaTypes.GetUintArray(Meta, soa.RGBI); - DistantLODLights.positions = MetaTypes.ConvertDataArray(Meta, MetaName.FloatXYZ, soa.position); - DistantLODLights.CalcBB(); - } + CCarGens[i] = CarGenerators[i].CCarGen; + } + } + public void BuildInstances() + { + if (GrassInstanceBatches == null || GrassInstanceBatches.Length == 0) + { + return; } - private void EnsureTimeCycleModifiers(Meta Meta) + //int count = GrassInstanceBatches.Length; + + foreach(var g in GrassInstanceBatches) { - CTimeCycleModifiers = MetaTypes.ConvertDataArray(Meta, MetaName.CTimeCycleModifier, _CMapData.timeCycleModifiers); - if (CTimeCycleModifiers != null) - { - TimeCycleModifiers = new YmapTimeCycleModifier[CTimeCycleModifiers.Length]; - for (int i = 0; i < CTimeCycleModifiers.Length; i++) - { - YmapTimeCycleModifier tcm = new YmapTimeCycleModifier(); - tcm.Ymap = this; - tcm.CTimeCycleModifier = CTimeCycleModifiers[i]; - tcm.BBMin = tcm.CTimeCycleModifier.minExtents; - tcm.BBMax = tcm.CTimeCycleModifier.maxExtents; - TimeCycleModifiers[i] = tcm; - } - } + ref var b = ref g.Batch; + + b.BatchAABB = new rage__spdAABB(in g.AABBMin, in g.AABBMax); + } + //for (int i = 0; i < count; i++) + //{ + + //} + } + public void BuildLodLights() + { + if (LODLights == null) + return; + LODLights.RebuildFromLodLights(); + } + public void BuildDistantLodLights() + { + //how to rebuild these here? the LODlights array is on the child ymap... + //for now, they are being updated as they are edited in project window + } + public void BuildBoxOccluders() + { + if (BoxOccluders is null || BoxOccluders.Length == 0) + return; + + var boxes = new BoxOccluder[BoxOccluders.Length]; + for (int i = 0; i < BoxOccluders.Length; i++) + { + var box = BoxOccluders[i]; + box.UpdateBoxStruct(); + boxes[i] = box._Box; } - private void EnsureCarGens(Meta Meta) + CBoxOccluders = boxes; + + } + public void BuildOccludeModels() + { + if (OccludeModels is null || OccludeModels.Length == 0) + return; + //nothing to do here, has to be done later due to embedded data + } + + public byte[] Save() + { + //direct save to a raw, compressed ymap file (openIV-compatible format) + + + //since Ymap object contents have been modified, need to recreate the arrays which are what is saved. + BuildCEntityDefs(); //technically this isn't required anymore since the CEntityDefs is no longer used for saving. + BuildCCarGens(); + BuildInstances(); + BuildLodLights(); + BuildDistantLodLights(); + BuildBoxOccluders(); + BuildOccludeModels(); + + //TODO: + //BuildTimecycleModifiers(); //already being saved - update them.. + //BuildContainerLods(); + + + + MetaBuilder mb = new MetaBuilder(); + + + var mdb = mb.EnsureBlock(MetaName.CMapData); + + CMapData mapdata = CMapData; + + + + if (AllEntities.Length > 0) { - - CCarGens = MetaTypes.ConvertDataArray(Meta, MetaName.CCarGen, _CMapData.carGenerators); - if (CCarGens != null) + for (int i = 0; i < AllEntities.Length; i++) { - //string str = MetaTypes.GetTypesInitString(resentry, Meta); //to generate structinfos and enuminfos - CarGenerators = new YmapCarGen[CCarGens.Length]; - for (int i = 0; i < CCarGens.Length; i++) - { - CarGenerators[i] = new YmapCarGen(this, CCarGens[i]); - } - } - } - - private void EnsureBoxOccluders(Meta meta) - { - CBoxOccluders = MetaTypes.ConvertDataArray(Meta, MetaName.BoxOccluder, _CMapData.boxOccluders); - if (CBoxOccluders != null) - { - BoxOccluders = new YmapBoxOccluder[CBoxOccluders.Length]; - for (int i = 0; i < CBoxOccluders.Length; i++) - { - BoxOccluders[i] = new YmapBoxOccluder(this, CBoxOccluders[i]); - BoxOccluders[i].Index = i; - } - } - } - - private void EnsureOccludeModels(Meta meta) - { - COccludeModels = MetaTypes.ConvertDataArray(Meta, MetaName.OccludeModel, _CMapData.occludeModels); - if (COccludeModels != null) - { - OccludeModels = new YmapOccludeModel[COccludeModels.Length]; - for (int i = 0; i < COccludeModels.Length; i++) - { - OccludeModels[i] = new YmapOccludeModel(this, COccludeModels[i]); - OccludeModels[i].Index = i; - OccludeModels[i].Load(Meta); - - } - } - } - - private void EnsureContainerLods(Meta meta) - { - - //TODO: containerLods - if (_CMapData.containerLods.Count1 > 0) - { - //string str = MetaTypes.GetTypesInitString(Meta); //to generate structinfos and enuminfos - - + var ent = AllEntities[i]; //save the extensions first.. + ent._CEntityDef.extensions = mb.AddWrapperArrayPtr(ent.Extensions); } - } - - - public void BuildCEntityDefs() - { - //recreates the CEntityDefs and CMloInstanceDefs arrays from AllEntities. - //TODO: save entity extensions!!? - - CEntityDefs = null; - CMloInstanceDefs = null; - if (AllEntities == null) - { - return; - } - - - List centdefs = new List(); - List cmlodefs = new List(); - + MetaPOINTER[] ptrs = new MetaPOINTER[AllEntities.Length]; for (int i = 0; i < AllEntities.Length; i++) { var ent = AllEntities[i]; if (ent.MloInstance != null) { - cmlodefs.Add(ent.MloInstance.Instance); + ent.MloInstance.UpdateDefaultEntitySets(); + + ent.MloInstance._Instance.CEntityDef = ent.CEntityDef; //overwrite with all the updated values.. + ent.MloInstance._Instance.defaultEntitySets = mb.AddUintArrayPtr(ent.MloInstance.defaultEntitySets); + + ptrs[i] = mb.AddItemPtr(MetaName.CMloInstanceDef, in ent.MloInstance._Instance); } else { - centdefs.Add(ent._CEntityDef); + ptrs[i] = mb.AddItemPtr(MetaName.CEntityDef, in ent._CEntityDef); } } - - if (centdefs.Count > 0) - { - CEntityDefs = centdefs.ToArray(); - } - if (cmlodefs.Count > 0) - { - CMloInstanceDefs = cmlodefs.ToArray(); - } + mapdata.entities = mb.AddPointerArray(ptrs); } - public void BuildCCarGens() + else { - //recreates the CCarGens array from CarGenerators. - if (CarGenerators == null) - { - CCarGens = null; - return; - } - - int count = CarGenerators.Length; - CCarGens = new CCarGen[count]; - for (int i = 0; i < count; i++) - { - CCarGens[i] = CarGenerators[i].CCarGen; - } - } - public void BuildInstances() - { - if (GrassInstanceBatches == null) - { - return; - } - - if (PropInstanceBatches == null) - { } - - int count = GrassInstanceBatches.Length; - for (int i = 0; i < count; i++) - { - var g = GrassInstanceBatches[i]; - var b = g.Batch; - - var aabb = new rage__spdAABB(); - aabb.min = new Vector4(g.AABBMin, 0); - aabb.max = new Vector4(g.AABBMax, 0); - - b.BatchAABB = aabb; - - GrassInstanceBatches[i].Batch = b; - } - } - public void BuildLodLights() - { - if (LODLights == null) return; - LODLights.RebuildFromLodLights(); - } - public void BuildDistantLodLights() - { - //how to rebuild these here? the LODlights array is on the child ymap... - //for now, they are being updated as they are edited in project window - } - public void BuildBoxOccluders() - { - if (BoxOccluders == null) return; - if (BoxOccluders.Length == 0) return; - - var boxes = new BoxOccluder[BoxOccluders.Length]; - for (int i = 0; i < BoxOccluders.Length; i++) - { - var box = BoxOccluders[i]; - box.UpdateBoxStruct(); - boxes[i] = box._Box; - } - - CBoxOccluders = boxes; - - } - public void BuildOccludeModels() - { - if (OccludeModels == null) return; - if (OccludeModels.Length == 0) return; - //nothing to do here, has to be done later due to embedded data + mapdata.entities = new Array_StructurePointer(); } - public byte[] Save() + mapdata.timeCycleModifiers = mb.AddItemArrayPtr(MetaName.CTimeCycleModifier, CTimeCycleModifiers); + + mapdata.physicsDictionaries = mb.AddHashArrayPtr(physicsDictionaries); + + mapdata.carGenerators = mb.AddItemArrayPtr(MetaName.CCarGen, CCarGens); + + + + //clear everything else out for now - TODO: fix + if (mapdata.containerLods.Count1 != 0) LogSaveWarning("containerLods were not saved. (TODO!)"); + if (mapdata.instancedData.PropInstanceList.Count1 != 0) LogSaveWarning("instancedData.PropInstanceList was not saved. (TODO!)"); + mapdata.containerLods = new Array_Structure(); + + if ((GrassInstanceBatches != null) && (GrassInstanceBatches.Length > 0)) { - //direct save to a raw, compressed ymap file (openIV-compatible format) - - - //since Ymap object contents have been modified, need to recreate the arrays which are what is saved. - BuildCEntityDefs(); //technically this isn't required anymore since the CEntityDefs is no longer used for saving. - BuildCCarGens(); - BuildInstances(); - BuildLodLights(); - BuildDistantLodLights(); - BuildBoxOccluders(); - BuildOccludeModels(); - - //TODO: - //BuildTimecycleModifiers(); //already being saved - update them.. - //BuildContainerLods(); - - - - MetaBuilder mb = new MetaBuilder(); - - - var mdb = mb.EnsureBlock(MetaName.CMapData); - - CMapData mapdata = CMapData; - - - - if ((AllEntities != null) && (AllEntities.Length > 0)) + var instancedData = new rage__fwInstancedMapData(); + rage__fwGrassInstanceListDef[] batches = new rage__fwGrassInstanceListDef[GrassInstanceBatches.Length]; + for (int i = 0; i < GrassInstanceBatches.Length; i++) { - for (int i = 0; i < AllEntities.Length; i++) + var batch = GrassInstanceBatches[i]; + + if (batch != null) { - var ent = AllEntities[i]; //save the extensions first.. - ent._CEntityDef.extensions = mb.AddWrapperArrayPtr(ent.Extensions); + var b = batch.Batch; + b.InstanceList = mb.AddItemArrayPtr(MetaName.rage__fwGrassInstanceListDef__InstanceData, batch.Instances); + batches[i] = b; } - - MetaPOINTER[] ptrs = new MetaPOINTER[AllEntities.Length]; - for (int i = 0; i < AllEntities.Length; i++) - { - var ent = AllEntities[i]; - if (ent.MloInstance != null) - { - ent.MloInstance.UpdateDefaultEntitySets(); - - ent.MloInstance._Instance.CEntityDef = ent.CEntityDef; //overwrite with all the updated values.. - ent.MloInstance._Instance.defaultEntitySets = mb.AddUintArrayPtr(ent.MloInstance.defaultEntitySets); - - ptrs[i] = mb.AddItemPtr(MetaName.CMloInstanceDef, ent.MloInstance.Instance); - } - else - { - ptrs[i] = mb.AddItemPtr(MetaName.CEntityDef, ent.CEntityDef); - } - } - mapdata.entities = mb.AddPointerArray(ptrs); - } - else - { - mapdata.entities = new Array_StructurePointer(); } - mapdata.timeCycleModifiers = mb.AddItemArrayPtr(MetaName.CTimeCycleModifier, CTimeCycleModifiers); - - mapdata.physicsDictionaries = mb.AddHashArrayPtr(physicsDictionaries); - - mapdata.carGenerators = mb.AddItemArrayPtr(MetaName.CCarGen, CCarGens); - - - - //clear everything else out for now - TODO: fix - if (mapdata.containerLods.Count1 != 0) LogSaveWarning("containerLods were not saved. (TODO!)"); - if (mapdata.instancedData.PropInstanceList.Count1 != 0) LogSaveWarning("instancedData.PropInstanceList was not saved. (TODO!)"); - mapdata.containerLods = new Array_Structure(); - - if ((GrassInstanceBatches != null) && (GrassInstanceBatches.Length > 0)) - { - var instancedData = new rage__fwInstancedMapData(); - rage__fwGrassInstanceListDef[] batches = new rage__fwGrassInstanceListDef[GrassInstanceBatches.Length]; - for (int i = 0; i < GrassInstanceBatches.Length; i++) - { - var batch = GrassInstanceBatches[i]; - - if (batch != null) - { - var b = batch.Batch; - b.InstanceList = mb.AddItemArrayPtr(MetaName.rage__fwGrassInstanceListDef__InstanceData, batch.Instances); - batches[i] = b; - } - } - - instancedData.GrassInstanceList = mb.AddItemArrayPtr(MetaName.rage__fwGrassInstanceListDef, batches); - mapdata.instancedData = instancedData; - } - else - { - mapdata.instancedData = new rage__fwInstancedMapData(); - } - - if ((LODLights != null) && (LODLights.direction != null)) - { - var soa = new CLODLight(); - soa.direction = mb.AddItemArrayPtr(MetaName.FloatXYZ, LODLights.direction); - soa.falloff = mb.AddFloatArrayPtr(LODLights.falloff); - soa.falloffExponent = mb.AddFloatArrayPtr(LODLights.falloffExponent); - soa.timeAndStateFlags = mb.AddUintArrayPtr(LODLights.timeAndStateFlags); - soa.hash = mb.AddUintArrayPtr(LODLights.hash); - soa.coneInnerAngle = mb.AddByteArrayPtr(LODLights.coneInnerAngle); - soa.coneOuterAngleOrCapExt = mb.AddByteArrayPtr(LODLights.coneOuterAngleOrCapExt); - soa.coronaIntensity = mb.AddByteArrayPtr(LODLights.coronaIntensity); - mapdata.LODLightsSOA = soa; - } - else - { - mapdata.LODLightsSOA = new CLODLight(); - } - if ((DistantLODLights != null) && (DistantLODLights.positions != null)) - { - var soa = DistantLODLights.CDistantLODLight;//to copy base vars - soa.position = mb.AddItemArrayPtr(MetaName.FloatXYZ, DistantLODLights.positions); - soa.RGBI = mb.AddUintArrayPtr(DistantLODLights.colours); - mapdata.DistantLODLightsSOA = soa; - } - else - { - mapdata.DistantLODLightsSOA = new CDistantLODLight(); - } - - if ((CBoxOccluders != null) && (CBoxOccluders.Length > 0)) - { - mapdata.boxOccluders = mb.AddItemArrayPtr(MetaName.BoxOccluder, CBoxOccluders); - } - else - { - mapdata.boxOccluders = new Array_Structure(); - } - if ((OccludeModels != null) && (OccludeModels.Length > 0)) - { - COccludeModels = new OccludeModel[OccludeModels.Length]; - for (int i = 0; i < OccludeModels.Length; i++) - { - var model = OccludeModels[i]; - model.BuildVertices(); - model.BuildData(); - var cocc = model._OccludeModel; - cocc.verts = mb.AddDataBlockPtr(model.Data, (MetaName)MetaStructureEntryDataType.UnsignedByte);//17 - COccludeModels[i] = cocc; - } - mapdata.occludeModels = mb.AddItemArrayPtr(MetaName.OccludeModel, COccludeModels); - } - else - { - mapdata.occludeModels = new Array_Structure(); - } - - - var block = new CBlockDesc(); - block.name = mb.AddStringPtr(Path.GetFileNameWithoutExtension(Name)); - block.exportedBy = mb.AddStringPtr("CodeWalker"); - block.time = mb.AddStringPtr(DateTime.UtcNow.ToString("dd MMMM yyyy HH:mm")); - - mapdata.block = block; - - - string name = Path.GetFileNameWithoutExtension(Name); - uint nameHash = JenkHash.GenHash(name); - mapdata.name = new MetaHash(nameHash);//make sure name is upto date... - - - mb.AddItem(MetaName.CMapData, mapdata); - - - - //make sure all the relevant structure and enum infos are present. - if ((GrassInstanceBatches != null) && (GrassInstanceBatches.Length > 0)) - { - mb.AddStructureInfo(MetaName.rage__spdAABB); - mb.AddStructureInfo(MetaName.rage__fwGrassInstanceListDef__InstanceData); - mb.AddStructureInfo(MetaName.rage__fwGrassInstanceListDef); - } - mb.AddStructureInfo(MetaName.rage__fwInstancedMapData); - mb.AddStructureInfo(MetaName.CLODLight); - mb.AddStructureInfo(MetaName.CDistantLODLight); - mb.AddStructureInfo(MetaName.CBlockDesc); - mb.AddStructureInfo(MetaName.CMapData); - if ((AllEntities != null) && (AllEntities.Length > 0)) - { - mb.AddStructureInfo(MetaName.CEntityDef); - mb.AddStructureInfo(MetaName.CMloInstanceDef); - mb.AddEnumInfo(MetaName.rage__eLodType); //LODTYPES_ - mb.AddEnumInfo(MetaName.rage__ePriorityLevel); //PRI_ - } - if ((CTimeCycleModifiers != null) && (CTimeCycleModifiers.Length > 0)) - { - mb.AddStructureInfo(MetaName.CTimeCycleModifier); - } - if ((CCarGens != null) && (CCarGens.Length > 0)) - { - mb.AddStructureInfo(MetaName.CCarGen); - } - if ((LODLights != null) && (LODLights.direction != null)) - { - mb.AddStructureInfo(MetaName.FloatXYZ); - } - if ((DistantLODLights != null) && (DistantLODLights.positions != null)) - { - mb.AddStructureInfo(MetaName.FloatXYZ); - } - if ((CBoxOccluders != null) && (CBoxOccluders.Length > 0)) - { - mb.AddStructureInfo(MetaName.BoxOccluder); - } - if ((COccludeModels != null) && (COccludeModels.Length > 0)) - { - mb.AddStructureInfo(MetaName.OccludeModel); - } - - - Meta meta = mb.GetMeta(); - - byte[] data = ResourceBuilder.Build(meta, 2); //ymap is version 2... - - - return data; + instancedData.GrassInstanceList = mb.AddItemArrayPtr(MetaName.rage__fwGrassInstanceListDef, batches); + mapdata.instancedData = instancedData; + } + else + { + mapdata.instancedData = new rage__fwInstancedMapData(); } - private void LogSaveWarning(string w) + if ((LODLights != null) && (LODLights.direction != null)) { - if (SaveWarnings == null) SaveWarnings = new List(); - SaveWarnings.Add(w); + var soa = new CLODLight(); + soa.direction = mb.AddItemArrayPtr(MetaName.FloatXYZ, LODLights.direction); + soa.falloff = mb.AddFloatArrayPtr(LODLights.falloff); + soa.falloffExponent = mb.AddFloatArrayPtr(LODLights.falloffExponent); + soa.timeAndStateFlags = mb.AddUintArrayPtr(LODLights.timeAndStateFlags); + soa.hash = mb.AddUintArrayPtr(LODLights.hash); + soa.coneInnerAngle = mb.AddByteArrayPtr(LODLights.coneInnerAngle); + soa.coneOuterAngleOrCapExt = mb.AddByteArrayPtr(LODLights.coneOuterAngleOrCapExt); + soa.coronaIntensity = mb.AddByteArrayPtr(LODLights.coronaIntensity); + mapdata.LODLightsSOA = soa; + } + else + { + mapdata.LODLightsSOA = new CLODLight(); + } + if ((DistantLODLights != null) && (DistantLODLights.positions != null)) + { + var soa = DistantLODLights.CDistantLODLight;//to copy base vars + soa.position = mb.AddItemArrayPtr(MetaName.FloatXYZ, DistantLODLights.positions); + soa.RGBI = mb.AddUintArrayPtr(DistantLODLights.colours); + mapdata.DistantLODLightsSOA = soa; + } + else + { + mapdata.DistantLODLightsSOA = new CDistantLODLight(); + } + + if ((CBoxOccluders != null) && (CBoxOccluders.Length > 0)) + { + mapdata.boxOccluders = mb.AddItemArrayPtr(MetaName.BoxOccluder, CBoxOccluders); + } + else + { + mapdata.boxOccluders = new Array_Structure(); + } + if ((OccludeModels != null) && (OccludeModels.Length > 0)) + { + COccludeModels = new OccludeModel[OccludeModels.Length]; + for (int i = 0; i < OccludeModels.Length; i++) + { + var model = OccludeModels[i]; + model.BuildVertices(); + model.BuildData(); + var cocc = model._OccludeModel; + cocc.verts = mb.AddDataBlockPtr(model.Data, (MetaName)MetaStructureEntryDataType.UnsignedByte);//17 + COccludeModels[i] = cocc; + } + mapdata.occludeModels = mb.AddItemArrayPtr(MetaName.OccludeModel, COccludeModels); + } + else + { + mapdata.occludeModels = new Array_Structure(); } + var block = new CBlockDesc(); + block.name = mb.AddStringPtr(Path.GetFileNameWithoutExtension(Name)); + block.exportedBy = mb.AddStringPtr("CodeWalker"); + block.time = mb.AddStringPtr(DateTime.UtcNow.ToString("dd MMMM yyyy HH:mm")); + + mapdata.block = block; - public void EnsureChildYmaps(GameFileCache gfc) + string name = Path.GetFileNameWithoutExtension(Name); + uint nameHash = JenkHash.GenHash(name); + mapdata.name = new MetaHash(nameHash);//make sure name is upto date... + + + mb.AddItem(MetaName.CMapData, in mapdata); + + + + //make sure all the relevant structure and enum infos are present. + if ((GrassInstanceBatches != null) && (GrassInstanceBatches.Length > 0)) { - if (ChildYmaps == null) - { - //no children here... look for child ymap.... - var node = gfc.GetMapNode(RpfFileEntry.ShortNameHash); - if ((node != null) && (node.Children != null) && (node.Children.Length > 0)) - { - ChildYmaps = new YmapFile[node.Children.Length]; - for (int i = 0; i < ChildYmaps.Length; i++) - { - var chash = node.Children[i].Name; - ChildYmaps[i] = gfc.GetYmap(chash); - if (ChildYmaps[i] == null) - { - Console.WriteLine($"Couldn't find child ymap! {chash} for {Name}"); - //couldn't find child ymap.. - } - } - } - } + mb.AddStructureInfo(MetaName.rage__spdAABB); + mb.AddStructureInfo(MetaName.rage__fwGrassInstanceListDef__InstanceData); + mb.AddStructureInfo(MetaName.rage__fwGrassInstanceListDef); + } + mb.AddStructureInfo(MetaName.rage__fwInstancedMapData); + mb.AddStructureInfo(MetaName.CLODLight); + mb.AddStructureInfo(MetaName.CDistantLODLight); + mb.AddStructureInfo(MetaName.CBlockDesc); + mb.AddStructureInfo(MetaName.CMapData); + if (AllEntities.Length > 0) + { + mb.AddStructureInfo(MetaName.CEntityDef); + mb.AddStructureInfo(MetaName.CMloInstanceDef); + mb.AddEnumInfo(MetaName.rage__eLodType); //LODTYPES_ + mb.AddEnumInfo(MetaName.rage__ePriorityLevel); //PRI_ + } + if ((CTimeCycleModifiers != null) && (CTimeCycleModifiers.Length > 0)) + { + mb.AddStructureInfo(MetaName.CTimeCycleModifier); + } + if ((CCarGens != null) && (CCarGens.Length > 0)) + { + mb.AddStructureInfo(MetaName.CCarGen); + } + if ((LODLights != null) && (LODLights.direction != null)) + { + mb.AddStructureInfo(MetaName.FloatXYZ); + } + if (DistantLODLights != null && DistantLODLights.positions.Length > 0) + { + mb.AddStructureInfo(MetaName.FloatXYZ); + } + if ((CBoxOccluders != null) && (CBoxOccluders.Length > 0)) + { + mb.AddStructureInfo(MetaName.BoxOccluder); + } + if ((COccludeModels != null) && (COccludeModels.Length > 0)) + { + mb.AddStructureInfo(MetaName.OccludeModel); + } - bool needupd = false; - if (ChildYmaps != null) + Meta meta = mb.GetMeta(); + + byte[] data = ResourceBuilder.Build(meta, 2); //ymap is version 2... + + + return data; + } + + private void LogSaveWarning(string w) + { + SaveWarnings ??= new List(); + SaveWarnings.Add(w); + } + + + + + public void EnsureChildYmaps(GameFileCache gfc) + { + if (ChildYmaps is null) + { + //no children here... look for child ymap.... + var node = gfc.GetMapNode(RpfFileEntry.ShortNameHash); + if (node?.Children is not null && node.Children.Length > 0) { + ChildYmaps = new YmapFile[node.Children.Length]; for (int i = 0; i < ChildYmaps.Length; i++) { - var cmap = ChildYmaps[i]; - if (cmap == null) continue; //nothing here.. - if (!cmap.Loaded) + var chash = node.Children[i].Name; + ChildYmaps[i] = gfc.GetYmap(chash); + if (ChildYmaps[i] is null) { - //ChildYmaps[i] = gfc.GetYmap(cmap.Hash); //incase no load was requested. - cmap = gfc.GetYmap(cmap.Key.Hash); - ChildYmaps[i] = cmap; - } - if ((cmap.Loaded) && (!cmap.MergedWithParent)) - { - needupd = true; + Console.WriteLine($"Couldn't find child ymap! {chash} for {Name}"); + //couldn't find child ymap.. } } } - - if ((ChildYmaps != null) && needupd) - { - List newroots = new List(RootEntities); - for (int i = 0; i < ChildYmaps.Length; i++) - { - var cmap = ChildYmaps[i]; - if (cmap == null) - { - continue; //nothing here.. - } - //cmap.EnsureChildYmaps(); - if ((cmap.Loaded) && (!cmap.MergedWithParent)) - { - cmap.MergedWithParent = true; - if (cmap.RootEntities != null) - { - foreach (var rcent in cmap.RootEntities) - { - int pind = rcent._CEntityDef.parentIndex; - if (pind < 0) - { - if (rcent._CEntityDef.lodLevel != rage__eLodType.LODTYPES_DEPTH_ORPHANHD) - { - } - //pind = 0; - } - if ((pind >= 0) && (pind < AllEntities.Length) && !rcent.LodInParentYmap) - { - var pentity = AllEntities[pind]; - pentity.AddChild(rcent); - } - else - { - //TODO: fix this!! - //newroots.Add(rcent); //not sure this is the right approach. - //////rcent.Owner = this; - } - } - } - } - } - if (AllEntities != null) - { - for (int i = 0; i < AllEntities.Length; i++) - { - AllEntities[i].ChildListToMergedArray(); - } - } - - RootEntities = newroots.ToArray(); - } - - } - public void ConnectToParent(YmapFile pymap) + bool needupd = false; + if (ChildYmaps is not null) { - Parent = pymap; - if (RootEntities != null) //parent changed or first set, make sure to link entities hierarchy + for (int i = 0; i < ChildYmaps.Length; i++) { - for (int i = 0; i < RootEntities.Length; i++) + var cmap = ChildYmaps[i]; + if (cmap is null) + continue; //nothing here.. + if (!cmap.Loaded) { - var ent = RootEntities[i]; - int pind = ent._CEntityDef.parentIndex; - if (pind >= 0) //connect root entities to parents if they have them.. + //ChildYmaps[i] = gfc.GetYmap(cmap.Hash); //incase no load was requested. + cmap = gfc.GetYmap(cmap.Key.Hash); + if (cmap is null) + continue; + ChildYmaps[i] = cmap; + } + if (cmap.Loaded && !cmap.MergedWithParent) + { + needupd = true; + } + } + } + + if (ChildYmaps is not null && needupd) + { + using PooledList newroots = new PooledList(RootEntities); + for (int i = 0; i < ChildYmaps.Length; i++) + { + var cmap = ChildYmaps[i]; + if (cmap is null) + { + continue; //nothing here.. + } + //cmap.EnsureChildYmaps(); + if (cmap.Loaded && !cmap.MergedWithParent) + { + cmap.MergedWithParent = true; + foreach (var rcent in cmap.RootEntities) { - YmapEntityDef p = null; - if ((pymap != null) && (pymap.AllEntities != null)) + int pind = rcent._CEntityDef.parentIndex; + //if (pind < 0) + //{ + // if (rcent._CEntityDef.lodLevel != rage__eLodType.LODTYPES_DEPTH_ORPHANHD) + // { + // } + // //pind = 0; + //} + if (pind >= 0 && pind < AllEntities.Length && !rcent.LodInParentYmap) { - if (pind < pymap.AllEntities.Length) - { - p = pymap.AllEntities[pind]; - ent.Parent = p; - ent.ParentName = p._CEntityDef.archetypeName; - } + var pentity = AllEntities[pind]; + pentity.AddChild(rcent); } else { - Console.WriteLine($"Parent not loaded yet for {pymap.Name}"); + //TODO: fix this!! + //newroots.Add(rcent); //not sure this is the right approach. + //////rcent.Owner = this; } } } } - if (LODLights != null) + foreach(var ent in AllEntities) { - if (Parent?.DistantLODLights != null) - { - LODLights.Init(Parent.DistantLODLights); - } + ent.ChildListToMergedArray(); } + + RootEntities = newroots.ToArray(); } - - - - public void AddEntity(YmapEntityDef ent) - { - //used by the editor to add to the ymap. - - List allents; - if (AllEntities != null) - allents = new List(AllEntities); - else - allents = new List(); - ent.Index = allents.Count; - ent.Ymap = this; - allents.Add(ent); - AllEntities = allents.ToArray(); - - - if ((ent.Parent == null) || (ent.Parent.Ymap != this)) - { - //root entity, add to roots. - - List rootents; - if (RootEntities != null) - rootents = new List(RootEntities); - else - rootents = new List(); - rootents.Add(ent); - RootEntities = rootents.ToArray(); - } - - HasChanged = true; - LodManagerUpdate = true; - } - - public bool RemoveEntity(YmapEntityDef ent) - { - //used by the editor to remove from the ymap. - if (ent == null) - return false; - - var res = true; - - int idx = ent.Index; - List newAllEntities = new List(); - List newRootEntities = new List(); - - if (AllEntities != null) - { - for (int i = 0; i < AllEntities.Length; i++) - { - var oent = AllEntities[i]; - oent.Index = newAllEntities.Count; - if (oent != ent) - { - newAllEntities.Add(oent); - } - else if (i != idx) - { - res = false; //indexes didn't match.. this shouldn't happen! - } - } - } - if (RootEntities != null) - { - for (int i = 0; i < RootEntities.Length; i++) - { - var oent = RootEntities[i]; - if (oent != ent) newRootEntities.Add(oent); - } - } - - if (AllEntities == null || AllEntities.Length == newAllEntities.Count || RootEntities == null || RootEntities.Length == newRootEntities.Count) - { - res = false; - } - - LodManagerOldEntities = AllEntities; - AllEntities = newAllEntities.ToArray(); - RootEntities = newRootEntities.ToArray(); - - HasChanged = true; - LodManagerUpdate = true; - - return res; - } - - - public void AddCarGen(YmapCarGen cargen) - { - List cargens = new List(); - if (CarGenerators != null) - cargens.AddRange(CarGenerators); - cargen.Ymap = this; - cargens.Add(cargen); - CarGenerators = cargens.ToArray(); - - HasChanged = true; - } - - public bool RemoveCarGen(YmapCarGen cargen) - { - if (cargen == null) return false; - - List newcargens = new List(); - - if (CarGenerators != null) - { - for (int i = 0; i < CarGenerators.Length; i++) - { - var cg = CarGenerators[i]; - if (cg != cargen) - { - newcargens.Add(cg); - } - } - if (newcargens.Count == CarGenerators.Length) - { - return false; //nothing removed... wasn't present? - } - } - - - CarGenerators = newcargens.ToArray(); - - HasChanged = true; - - return true; - } - - - public void AddLodLight(YmapLODLight lodlight) - { - if (LODLights == null) - { - LODLights = new YmapLODLights(); - LODLights.Ymap = this; - } - List lodlights = new List(); - if (LODLights?.LodLights != null) lodlights.AddRange(LODLights.LodLights); - lodlight.LodLights = this.LODLights; - lodlight.Index = lodlights.Count; - lodlights.Add(lodlight); - LODLights.LodLights = lodlights.ToArray(); - - HasChanged = true; - - if (Parent?.DistantLODLights != null) - { - Parent.DistantLODLights.RebuildFromLodLights(LODLights.LodLights); - Parent.HasChanged = true; - } - } - - public bool RemoveLodLight(YmapLODLight lodlight) - { - if (lodlight == null) return false; - - List newlodlights = new List(); - - var lodlights = LODLights?.LodLights; - if (lodlights != null) - { - for (int i = 0; i < lodlights.Length; i++) - { - var ll = lodlights[i]; - if (ll != lodlight) - { - newlodlights.Add(ll); - } - } - if (newlodlights.Count == lodlights.Length) - { - return false; //nothing removed... wasn't present? - } - } - - for (int i = 0; i < newlodlights.Count; i++) - { - newlodlights[i].Index = i; - } - - LODLights.LodLights = newlodlights.ToArray(); - - HasChanged = true; - - if (Parent?.DistantLODLights != null) - { - Parent.DistantLODLights.RebuildFromLodLights(LODLights.LodLights); - Parent.HasChanged = true; - } - - return true; - } - - - public void AddBoxOccluder(YmapBoxOccluder box) - { - if (box == null) return; - var boxes = new List(); - if (BoxOccluders != null) boxes.AddRange(BoxOccluders); - box.Ymap = this; - box.Index = boxes.Count; - boxes.Add(box); - BoxOccluders = boxes.ToArray(); - - HasChanged = true; - } - - public bool RemoveBoxOccluder(YmapBoxOccluder box) - { - if (box == null) return false; - var newboxes = new List(); - if (BoxOccluders != null) - { - foreach (var oldbox in BoxOccluders) - { - if (oldbox != box) - { - oldbox.Index = newboxes.Count; - newboxes.Add(oldbox); - } - } - if (newboxes.Count == BoxOccluders.Length) - { - return false;//nothing removed... wasn't present? - } - } - - BoxOccluders = newboxes.ToArray(); - - HasChanged = true; - - return true; - } - - - public void AddOccludeModel(YmapOccludeModel model) - { - if (model == null) return; - var models = new List(); - if (OccludeModels != null) models.AddRange(OccludeModels); - model.Ymap = this; - models.Add(model); - OccludeModels = models.ToArray(); - - HasChanged = true; - } - - public bool RemoveOccludeModel(YmapOccludeModel model) - { - if (model == null) return false; - var newmodels = new List(); - if (OccludeModels != null) - { - foreach (var oldmodel in OccludeModels) - { - if (oldmodel != model) - { - oldmodel.Index = newmodels.Count; - newmodels.Add(oldmodel); - } - } - if (newmodels.Count == OccludeModels.Length) - { - return false;//nothing removed... wasn't present? - } - } - - OccludeModels = newmodels.ToArray(); - - HasChanged = true; - - return true; - } - - - public void AddOccludeModelTriangle(YmapOccludeModelTriangle tri) - { - if (tri == null) return; - if (tri.Model == null) return; - - var tris = tri.Model.Triangles.ToList(); - tri.Index = tris.Count; - tris.Add(tri); - tri.Model.Triangles = tris.ToArray(); - - //tri.Model.BuildBVH(); - //... - - HasChanged = true; - } - - public bool RemoveOccludeModelTriangle(YmapOccludeModelTriangle tri) - { - if (tri == null) return false; - if (tri.Model == null) return false; - - var newtris = new List(); - if (tri.Model.Triangles != null) - { - foreach (var oldtri in tri.Model.Triangles) - { - if (oldtri != tri) - { - oldtri.Index = newtris.Count; - newtris.Add(oldtri); - } - } - } - tri.Model.Triangles = newtris.ToArray(); - //tri.Model.BuildBVH(); - //... - - HasChanged = true; - - return true; - } - - - public void AddGrassBatch(YmapGrassInstanceBatch newbatch) - { - List batches = new List(); - if (GrassInstanceBatches != null) batches.AddRange(GrassInstanceBatches); - newbatch.Ymap = this; - batches.Add(newbatch); - GrassInstanceBatches = batches.ToArray(); - - HasChanged = true; - UpdateGrassPhysDict(true); - } - - public bool RemoveGrassBatch(YmapGrassInstanceBatch batch) - { - if (batch == null) return false; - - List batches = new List(); - - if (GrassInstanceBatches != null) - { - for (int i = 0; i < GrassInstanceBatches.Length; i++) - { - var gb = GrassInstanceBatches[i]; - if (gb != batch) - { - batches.Add(gb); - } - } - if (batches.Count == GrassInstanceBatches.Length) - { - return false; //nothing removed... wasn't present? - } - } - - if (batches.Count <= 0) - { - UpdateGrassPhysDict(false); - } - - GrassInstanceBatches = batches.ToArray(); - - HasChanged = true; - - return true; - } - - - - - public void SetName(string newname) - { - var newnamex = newname + ".ymap"; - var newhash = JenkHash.GenHashLower(newname); - JenkIndex.EnsureLower(newname); - if (RpfFileEntry != null) - { - RpfFileEntry.Name = newnamex; - } - Name = newnamex; - _CMapData.name = newhash; - } - public void SetFilePath(string filepath) - { - FilePath = filepath.ToLowerInvariant(); - var newname = Path.GetFileNameWithoutExtension(filepath); - SetName(newname); - } - - - public bool CalcFlags() - { - uint flags = 0; - uint contentFlags = 0; - - if (AllEntities != null) - { - foreach (var yent in AllEntities) - { - switch (yent._CEntityDef.lodLevel) - { - case rage__eLodType.LODTYPES_DEPTH_ORPHANHD: - case rage__eLodType.LODTYPES_DEPTH_HD: - contentFlags = SetBit(contentFlags, 0); //1 - break; - case rage__eLodType.LODTYPES_DEPTH_LOD: - contentFlags = SetBit(contentFlags, 1); //2 - flags = SetBit(flags, 1); //2 - break; - case rage__eLodType.LODTYPES_DEPTH_SLOD1: - contentFlags = SetBit(contentFlags, 4); //16 - flags = SetBit(flags, 1); //2 - break; - case rage__eLodType.LODTYPES_DEPTH_SLOD2: - case rage__eLodType.LODTYPES_DEPTH_SLOD3: - case rage__eLodType.LODTYPES_DEPTH_SLOD4: - contentFlags = SetBit(contentFlags, 2); //4 - contentFlags = SetBit(contentFlags, 4); //16 - flags = SetBit(flags, 1); //2 - break; - } - if (yent.MloInstance != null) - { - contentFlags = SetBit(contentFlags, 3); //8 //(interior instance) - } - } - } - - if ((CMloInstanceDefs != null) && (CMloInstanceDefs.Length > 0)) - { - contentFlags = SetBit(contentFlags, 3); //8 //(interior instance) //is this still necessary? - } - if ((physicsDictionaries != null) && (physicsDictionaries.Length > 0)) - { - contentFlags = SetBit(contentFlags, 6); //64 - } - if ((GrassInstanceBatches != null) && (GrassInstanceBatches.Length > 0)) - { - contentFlags = SetBit(contentFlags, 10); //64 - } - if ((LODLights != null) && ((LODLights.direction?.Length ?? 0) > 0)) - { - contentFlags = SetBit(contentFlags, 7); //128 - } - if ((DistantLODLights != null) && ((DistantLODLights.positions?.Length ?? 0) > 0)) - { - flags = SetBit(flags, 1); //2 - contentFlags = SetBit(contentFlags, 8); //256 - } - if ((BoxOccluders != null) || (OccludeModels != null)) - { - contentFlags = SetBit(contentFlags, 5); //32 - } - - - bool change = false; - if (_CMapData.flags != flags) - { - _CMapData.flags = flags; - change = true; - } - if (_CMapData.contentFlags != contentFlags) - { - _CMapData.contentFlags = contentFlags; - change = true; - } - return change; - } - - public bool CalcExtents() - { - Vector3 emin = new Vector3(float.MaxValue); - Vector3 emax = new Vector3(float.MinValue); - Vector3 smin = new Vector3(float.MaxValue); - Vector3 smax = new Vector3(float.MinValue); - Vector3[] c = new Vector3[8]; - Vector3[] s = new Vector3[8]; - - if (AllEntities != null) - { - for (int i = 0; i < AllEntities.Length; i++) - { - var ent = AllEntities[i]; - var arch = ent.Archetype; - var ori = ent.Orientation; - float loddist = ent._CEntityDef.lodDist; - - Vector3 bbmin = ent.Position - ent.BSRadius; //sphere - Vector3 bbmax = ent.Position + ent.BSRadius; - Vector3 sbmin = bbmin - loddist; - Vector3 sbmax = bbmax + loddist; - if (arch != null) - { - if (loddist <= 0.0f) - { - loddist = arch.LodDist; - } - - Vector3 abmin = arch.BBMin * ent.Scale; //entity box - Vector3 abmax = arch.BBMax * ent.Scale; - c[0] = abmin; - c[1] = new Vector3(abmin.X, abmin.Y, abmax.Z); - c[2] = new Vector3(abmin.X, abmax.Y, abmin.Z); - c[3] = new Vector3(abmin.X, abmax.Y, abmax.Z); - c[4] = new Vector3(abmax.X, abmin.Y, abmin.Z); - c[5] = new Vector3(abmax.X, abmin.Y, abmax.Z); - c[6] = new Vector3(abmax.X, abmax.Y, abmin.Z); - c[7] = abmax; - - abmin = arch.BBMin * ent.Scale - loddist; //streaming box - abmax = arch.BBMax * ent.Scale + loddist; - s[0] = abmin; - s[1] = new Vector3(abmin.X, abmin.Y, abmax.Z); - s[2] = new Vector3(abmin.X, abmax.Y, abmin.Z); - s[3] = new Vector3(abmin.X, abmax.Y, abmax.Z); - s[4] = new Vector3(abmax.X, abmin.Y, abmin.Z); - s[5] = new Vector3(abmax.X, abmin.Y, abmax.Z); - s[6] = new Vector3(abmax.X, abmax.Y, abmin.Z); - s[7] = abmax; - - bbmin = new Vector3(float.MaxValue); - bbmax = new Vector3(float.MinValue); - sbmin = new Vector3(float.MaxValue); - sbmax = new Vector3(float.MinValue); - for (int j = 0; j < 8; j++) - { - Vector3 corn = ori.Multiply(c[j]) + ent.Position; - bbmin = Vector3.Min(bbmin, corn); - bbmax = Vector3.Max(bbmax, corn); - - corn = ori.Multiply(s[j]) + ent.Position; - sbmin = Vector3.Min(sbmin, corn); - sbmax = Vector3.Max(sbmax, corn); - } - } - - emin = Vector3.Min(emin, bbmin); - emax = Vector3.Max(emax, bbmax); - smin = Vector3.Min(smin, sbmin); - smax = Vector3.Max(smax, sbmax); - } - } - - if (GrassInstanceBatches != null) - { - //var lodoffset = Vector3.Zero;// new Vector3(0, 0, 100); //IDK WHY -neos7 //dexy: i guess it's not completely necessary... //blame neos - foreach (var batch in GrassInstanceBatches) //thanks to Neos7 - { - emin = Vector3.Min(emin, batch.AABBMin); - emax = Vector3.Max(emax, batch.AABBMax); - smin = Vector3.Min(smin, (batch.AABBMin - batch.Batch.lodDist)); // + lodoffset - smax = Vector3.Max(smax, (batch.AABBMax + batch.Batch.lodDist)); // - lodoffset - } - } - - if (CarGenerators != null) - { - foreach (var cargen in CarGenerators) - { - var len = cargen._CCarGen.perpendicularLength; - emin = Vector3.Min(emin, cargen.Position - len); - emax = Vector3.Max(emax, cargen.Position + len); - smin = Vector3.Min(smin, cargen.Position - len*2.0f); //just a random guess, maybe should be more? - smax = Vector3.Max(smax, cargen.Position + len*2.0f); - } - } - - if (LODLights != null) - { - LODLights.CalcBB(); - emin = Vector3.Min(emin, LODLights.BBMin - 20.0f); //about right - emax = Vector3.Max(emax, LODLights.BBMax + 20.0f); - smin = Vector3.Min(smin, (LODLights.BBMin - 950.0f)); //seems correct - smax = Vector3.Max(smax, (LODLights.BBMax + 950.0f)); - } - - if (DistantLODLights != null) - { - DistantLODLights.CalcBB(); - emin = Vector3.Min(emin, DistantLODLights.BBMin - 20.0f); //not exact, but probably close enough - emax = Vector3.Max(emax, DistantLODLights.BBMax + 20.0f); - smin = Vector3.Min(smin, (DistantLODLights.BBMin - 3000.0f)); //seems correct - smax = Vector3.Max(smax, (DistantLODLights.BBMax + 3000.0f)); - } - - if (BoxOccluders != null) - { - foreach (var box in BoxOccluders) - { - var siz = box.Size.Length() * 0.5f;//should really use box rotation instead.... - emin = Vector3.Min(emin, box.Position - siz); - emax = Vector3.Max(emax, box.Position + siz); - smin = Vector3.Min(smin, box.Position - siz);//check this! for some vanilla ymaps it seems right, others not - smax = Vector3.Max(smax, box.Position + siz);//occluders don't seem to have a loddist - } - } - - if (OccludeModels != null) - { - foreach (var model in OccludeModels) - { - emin = Vector3.Min(emin, (model.BVH?.Box.Minimum ?? model._OccludeModel.bmin));//this needs to be updated! - emax = Vector3.Max(emax, (model.BVH?.Box.Maximum ?? model._OccludeModel.bmax)); - smin = Vector3.Min(smin, (model.BVH?.Box.Minimum ?? model._OccludeModel.bmin));//check this! for some vanilla ymaps it seems right, others not - smax = Vector3.Max(smax, (model.BVH?.Box.Maximum ?? model._OccludeModel.bmax));//occluders don't seem to have a loddist - } - } - - bool change = false; - if (_CMapData.entitiesExtentsMin != emin) - { - _CMapData.entitiesExtentsMin = emin; - change = true; - } - if (_CMapData.entitiesExtentsMax != emax) - { - _CMapData.entitiesExtentsMax = emax; - change = true; - } - if (_CMapData.streamingExtentsMin != smin) - { - _CMapData.streamingExtentsMin = smin; - change = true; - } - if (_CMapData.streamingExtentsMax != smax) - { - _CMapData.streamingExtentsMax = smax; - change = true; - } - return change; - } - - - private void UpdateGrassPhysDict(bool add) - { - var physDict = physicsDictionaries?.ToList() ?? new List(); - var vproc1 = JenkHash.GenHash("v_proc1"); - var vproc2 = JenkHash.GenHash("v_proc2"); // I think you need vproc2 as well. - var change = false; - if (!physDict.Contains(vproc1)) - { - change = true; - if (add) physDict.Add(vproc1); - else physDict.Remove(vproc1); - } - if (!physDict.Contains(vproc2)) - { - change = true; - if (add) physDict.Add(vproc2); - else physDict.Remove(vproc2); - } - if (change) physicsDictionaries = physDict.ToArray(); - } - - public void InitYmapEntityArchetypes(GameFileCache gfc) - { - if (AllEntities != null) - { - for (int i = 0; i < AllEntities.Length; i++) - { - var ent = AllEntities[i]; - var arch = gfc.GetArchetype(ent._CEntityDef.archetypeName); - ent.SetArchetype(arch); - if (ent.IsMlo) ent.MloInstance.InitYmapEntityArchetypes(gfc); - } - } - if (GrassInstanceBatches != null) - { - for (int i = 0; i < GrassInstanceBatches.Length; i++) - { - var batch = GrassInstanceBatches[i]; - batch.Archetype = gfc.GetArchetype(batch.Batch.archetypeName); - } - } - - if (TimeCycleModifiers != null) - { - for (int i = 0; i < TimeCycleModifiers.Length; i++) - { - var tcm = TimeCycleModifiers[i]; - World.TimecycleMod wtcm; - if (gfc.TimeCycleModsDict.TryGetValue(tcm.CTimeCycleModifier.name.Hash, out wtcm)) - { - tcm.TimeCycleModData = wtcm; - } - } - } - - } - - private static uint SetBit(uint value, int bit) - { - return (value | (1u << bit)); - } - } - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapEntityDef + public void ConnectToParent(YmapFile pymap) { - public Archetype Archetype { get; set; } //cached by GameFileCache on loading... - public Vector3 BBMin;//oriented archetype AABBmin - public Vector3 BBMax;//oriented archetype AABBmax - public Vector3 BBCenter; //oriented archetype AABB center - public Vector3 BBExtent; //oriented archetype AABB extent - public Vector3 BSCenter; //oriented archetype BS center - public float BSRadius;//cached from archetype - public float LodDist; - public float ChildLodDist; - - public CEntityDef _CEntityDef; - public CEntityDef CEntityDef { get { return _CEntityDef; } set { _CEntityDef = value; } } - private List ChildList { get; set; } - public YmapEntityDef[] Children { get; set; } - public YmapEntityDef[] ChildrenMerged;// { get; set; } - public Vector3 Position { get; set; } - public Quaternion Orientation { get; set; } - public Vector3 Scale { get; set; } - public bool IsMlo { get; set; } - public MloInstanceData MloInstance { get; set; } - public YmapEntityDef MloParent { get; set; } - public MloInstanceEntitySet MloEntitySet { get; set; } - public Vector3 MloRefPosition { get; set; } - public Quaternion MloRefOrientation { get; set; } - public MetaWrapper[] Extensions { get; set; } - - public int Index { get; set; } - public float Distance { get; set; } //used for rendering - public bool IsWithinLodDist; //used for rendering - public bool ChildrenVisible; //used for rendering - public bool ChildrenRendered; //used when rendering ymap mode to reduce LOD flashing... - public YmapEntityDef Parent { get; set; } //for browsing convenience, also used/updated for rendering - public MetaHash ParentName { get; set; } //just for browsing convenience - - public YmapFile Ymap { get; set; } - - public Vector3 PivotPosition = Vector3.Zero; - public Quaternion PivotOrientation = Quaternion.Identity; - public Vector3 WidgetPosition = Vector3.Zero; - public Quaternion WidgetOrientation = Quaternion.Identity; - - public uint EntityHash { get; set; } = 0; //used by CW as a unique position+name identifier - - public LinkedList LodManagerChildren = null; - public object LodManagerRenderable = null; - - - public LightInstance[] Lights { get; set; } - //public uint[] LightHashTest { get; set; } - - public bool LodInParentYmap { get { return ((_CEntityDef.flags >> 3) & 1) > 0; } } - - - public string Name + Parent = pymap; + foreach(var ent in RootEntities) { - get + int pind = ent._CEntityDef.parentIndex; + if (pind >= 0) //connect root entities to parents if they have them.. { - return _CEntityDef.archetypeName.ToString(); - } - } - - - public YmapEntityDef() - { - Scale = Vector3.One; - Position = Vector3.One; - Orientation = Quaternion.Identity; - } - public YmapEntityDef(YmapFile ymap, int index, ref CEntityDef def) - { - Ymap = ymap; - Index = index; - CEntityDef = def; - Scale = new Vector3(new Vector2(_CEntityDef.scaleXY), _CEntityDef.scaleZ); - Position = _CEntityDef.position; - Orientation = new Quaternion(_CEntityDef.rotation); - if (Orientation != Quaternion.Identity) - { - Orientation = Quaternion.Invert(Orientation); - } - IsMlo = false; - - UpdateWidgetPosition(); - UpdateWidgetOrientation(); - UpdateEntityHash(); - } - - public YmapEntityDef(YmapFile ymap, int index, ref CMloInstanceDef mlo) - { - Ymap = ymap; - Index = index; - CEntityDef = mlo.CEntityDef; - Scale = new Vector3(new Vector2(_CEntityDef.scaleXY), _CEntityDef.scaleZ); - Position = _CEntityDef.position; - Orientation = new Quaternion(_CEntityDef.rotation); - //if (Orientation != Quaternion.Identity) - //{ - // Orientation = Quaternion.Invert(Orientation); - //} - IsMlo = true; - - MloInstance = new MloInstanceData(this, null);//is this necessary..? will get created in SetArchetype.. - MloInstance.Instance = mlo; - - UpdateWidgetPosition(); - UpdateWidgetOrientation(); - UpdateEntityHash(); - } - - - public void SetArchetype(Archetype arch) - { - Archetype = arch; - if (Archetype != null) - { - UpdateBB(); - - if (Archetype.Type == MetaName.CMloArchetypeDef) + + if (pymap.AllEntities != null && pymap.AllEntities.Length > 0) { - //transform interior entities into world space... - var mloa = Archetype as MloArchetype; - MloInstance = new MloInstanceData(this, mloa); - MloInstance._Instance = new CMloInstanceDef { CEntityDef = _CEntityDef }; - if (mloa != null) + if (pind < pymap.AllEntities.Length) { - if (!IsMlo) - { - IsMlo = true; - List mloEntities = Ymap.MloEntities?.ToList() ?? new List(); - mloEntities.Add(this); - Ymap.MloEntities = mloEntities.ToArray(); - } - - MloInstance.CreateYmapEntities(); + var p = pymap.AllEntities[pind]; + ent.Parent = p; + ent.ParentName = p._CEntityDef.archetypeName; } - - if (BSRadius == 0.0f) - { - BSRadius = LodDist;//need something so it doesn't get culled... - } - if (BBMin == BBMax) - { - BBMin = Position - BSRadius; - BBMax = Position + BSRadius;//it's not ideal - BBCenter = (BBMax + BBMin) * 0.5f; - BBExtent = (BBMax - BBMin) * 0.5f; - } - } - else if (IsMlo) // archetype is no longer an mlo - { - IsMlo = false; - MloInstance = null; - - if (Ymap.MloEntities != null) - { - List mloEntities = Ymap.MloEntities.ToList(); - if (mloEntities.Remove(this)) - { - Ymap.MloEntities = mloEntities.ToArray(); - } - } - } - } - } - - public void SetPosition(Vector3 pos) - { - Position = pos; - if (MloParent != null) - { - _CEntityDef.position = Quaternion.Normalize(Quaternion.Invert(MloParent.Orientation)).Multiply(pos - MloParent.Position); - MloRefPosition = _CEntityDef.position; - UpdateBB(); - UpdateMloArchetype(); - } - else - { - _CEntityDef.position = pos; - UpdateBB(); - } - - - if (MloInstance != null) - { - MloInstance.SetPosition(Position); - MloInstance.UpdateEntities(); - } - - UpdateEntityHash(); - UpdateWidgetPosition(); - } - - private void UpdateBB() - { - if (Archetype != null) - { - BSCenter = Orientation.Multiply(Archetype.BSCenter) * Scale; - BSRadius = Archetype.BSRadius * Math.Max(Scale.X, Scale.Z); - if (Orientation == Quaternion.Identity) - { - BBMin = (Vector3.Min(Archetype.BBMin, Archetype.BBMax) * Scale) + Position; - BBMax = (Vector3.Max(Archetype.BBMin, Archetype.BBMax) * Scale) + Position; - BBCenter = (BBMax + BBMin) * 0.5f; - BBExtent = (BBMax - BBMin) * 0.5f; } else { - var mat = Matrix.Transformation(Vector3.Zero, Quaternion.Identity, Scale, Vector3.Zero, Orientation, Position); - var matabs = mat; - matabs.Column1 = mat.Column1.Abs(); - matabs.Column2 = mat.Column2.Abs(); - matabs.Column3 = mat.Column3.Abs(); - matabs.Column4 = mat.Column4.Abs(); - var bbcenter = (Archetype.BBMax + Archetype.BBMin) * 0.5f; - var bbextent = (Archetype.BBMax - Archetype.BBMin) * 0.5f; - var ncenter = Vector3.TransformCoordinate(bbcenter, mat); - var nextent = Vector3.TransformNormal(bbextent, matabs).Abs(); - BBCenter = ncenter; - BBExtent = nextent; - BBMin = ncenter - nextent; - BBMax = ncenter + nextent; - } - LodDist = _CEntityDef.lodDist; - if (LodDist <= 0) - { - LodDist = Archetype.LodDist; - } - ChildLodDist = _CEntityDef.childLodDist; - if (ChildLodDist < 0) - { - ChildLodDist = LodDist * 0.5f; + Console.WriteLine($"Parent not loaded yet for {pymap.Name}"); } } } - - public void UpdateEntityHash() + if (LODLights is not null) { - uint xhash = (uint)(Position.X * 100); - uint yhash = (uint)(Position.Y * 100); - uint zhash = (uint)(Position.Z * 100); - EntityHash = _CEntityDef.archetypeName.Hash ^ xhash ^ yhash ^ zhash & 0xffffffff; - } - - public void SetOrientation(Quaternion ori, bool inverse = false) - { - if (MloParent != null) + var parent = Parent; + if (parent?.DistantLODLights is not null) { - var mloInv = Quaternion.Normalize(Quaternion.Invert(MloParent.Orientation)); - Quaternion rel = Quaternion.Normalize(Quaternion.Multiply(mloInv, ori)); - Quaternion inv = Quaternion.Normalize(Quaternion.Invert(rel)); - Orientation = ori; - _CEntityDef.rotation = inv.ToVector4(); - } - else - { - Orientation = inverse ? Quaternion.Normalize(Quaternion.Invert(ori)) : ori; - if (MloInstance != null) - { - _CEntityDef.rotation = Orientation.ToVector4(); - } - else - { - Quaternion inv = inverse ? ori : Quaternion.Normalize(Quaternion.Invert(ori)); - _CEntityDef.rotation = inv.ToVector4(); - } - } - - if (MloInstance != null) - { - MloInstance.SetOrientation(ori); - MloInstance.UpdateEntities(); - } - - UpdateBB(); - UpdateWidgetPosition(); - UpdateWidgetOrientation(); - } - - public void SetScale(Vector3 s) - { - Scale = new Vector3(s.X, s.X, s.Z); - _CEntityDef.scaleXY = s.X; - _CEntityDef.scaleZ = s.Z; - - MloInstanceData mloInstance = MloParent?.MloInstance; - if (mloInstance != null) - { - var mcEntity = mloInstance.TryGetArchetypeEntity(this); - if (mcEntity != null) - { - mcEntity._Data.scaleXY = s.X; - mcEntity._Data.scaleZ = s.Z; - } - } - if (Archetype != null) - { - float smax = Math.Max(Scale.X, Scale.Z); - BSRadius = Archetype.BSRadius * smax; - } - - SetPosition(Position);//update the BB - } - - private void UpdateMloArchetype() - { - if (!(MloParent.Archetype is MloArchetype mloArchetype)) return; - - MCEntityDef entity = null; - if ((MloEntitySet?.Entities != null) && (MloEntitySet?.EntitySet?.Entities != null)) - { - var idx = MloEntitySet.Entities.IndexOf(this); - if ((idx < 0) || (idx >= MloEntitySet.EntitySet.Entities.Length)) return; - entity = MloEntitySet.EntitySet.Entities[idx]; - } - else - { - if (Index >= mloArchetype.entities.Length) return; - entity = mloArchetype.entities[Index]; - } - - entity._Data.position = _CEntityDef.position; - entity._Data.rotation = _CEntityDef.rotation; - } - - - public void SetPivotPosition(Vector3 pos) - { - PivotPosition = pos; - - UpdateWidgetPosition(); - } - - public void SetPivotOrientation(Quaternion ori) - { - PivotOrientation = ori; - - UpdateWidgetOrientation(); - } - - - public void SetPositionFromWidget(Vector3 pos) - { - SetPosition(pos - Orientation.Multiply(PivotPosition)); - } - public void SetOrientationFromWidget(Quaternion ori) - { - var newori = Quaternion.Normalize(Quaternion.Multiply(ori, Quaternion.Invert(PivotOrientation))); - var newpos = WidgetPosition - newori.Multiply(PivotPosition); - SetOrientation(newori); - SetPosition(newpos); - } - public void SetPivotPositionFromWidget(Vector3 pos) - { - var orinv = Quaternion.Invert(Orientation); - SetPivotPosition(orinv.Multiply(pos - Position)); - } - public void SetPivotOrientationFromWidget(Quaternion ori) - { - var orinv = Quaternion.Invert(Orientation); - SetPivotOrientation(Quaternion.Multiply(orinv, ori)); - } - - - public void UpdateWidgetPosition() - { - WidgetPosition = Position + Orientation.Multiply(PivotPosition); - } - public void UpdateWidgetOrientation() - { - WidgetOrientation = Quaternion.Multiply(Orientation, PivotOrientation); - } - - - public void AddChild(YmapEntityDef c) - { - if (ChildList == null) - { - ChildList = new List(); - } - c.Parent = this; - c.ParentName = _CEntityDef.archetypeName; - - ChildList.Add(c); - } - - public void ChildListToArray() - { - if (ChildList == null) return; - //if (Children == null) - //{ - Children = ChildList.ToArray(); - ChildrenMerged = Children;//include these by default in merged array - //} - //else - //{ - // List newc = new List(Children.Length + ChildList.Count); - // newc.AddRange(Children); - // newc.AddRange(ChildList); - // Children = newc.ToArray(); - //} - ChildList.Clear(); - ChildList = null; - } - public void ChildListToMergedArray() - { - if (ChildList == null) return; - if (ChildrenMerged == null) - { - ChildrenMerged = ChildList.ToArray(); - } - else - { - List newc = new List(ChildrenMerged.Length + ChildList.Count); - newc.AddRange(ChildrenMerged); - newc.AddRange(ChildList); - ChildrenMerged = newc.ToArray(); - } - ChildList.Clear(); - ChildList = null; - } - - - public void LodManagerAddChild(YmapEntityDef child) - { - if (LodManagerChildren == null) - { - LodManagerChildren = new LinkedList(); - } - LodManagerChildren.AddLast(child); - } - public void LodManagerRemoveChild(YmapEntityDef child) - { - LodManagerChildren?.Remove(child);//could improve this by caching the list node.... - } - - - public override string ToString() - { - return _CEntityDef.ToString() + ((ChildList != null) ? (" (" + ChildList.Count.ToString() + " children) ") : " ") + _CEntityDef.lodLevel.ToString(); - } - - - - public void EnsureLights(DrawableBase db) - { - if (Lights != null) return; - if (Archetype == null) return; - if (db == null) return; - - var dd = db as Drawable; - var fd = db as FragDrawable; - var skel = db.Skeleton; - LightAttributes[] lightAttrs = null; - Bounds b = null; - if (dd != null) - { - lightAttrs = dd.LightAttributes?.data_items; - b = dd.Bound; - } - else if (fd != null) - { - var frag = fd?.OwnerFragment; - skel = skel ?? frag?.Drawable?.Skeleton; - lightAttrs = frag?.LightAttributes?.data_items; - b = frag?.PhysicsLODGroup?.PhysicsLOD1?.Bound; - } - if (lightAttrs == null) return; - - var abmin = Vector3.Min(Archetype.BBMin, db.BoundingBoxMin); - var abmax = Vector3.Max(Archetype.BBMax, db.BoundingBoxMax); - if (b != null) - { - abmin = Vector3.Min(abmin, b.BoxMin); - abmax = Vector3.Max(abmax, b.BoxMax); - } - var bb = new BoundingBox(abmin, abmax).Transform(Position, Orientation, Scale); - var ints = new uint[7]; - ints[0] = (uint)(bb.Minimum.X * 10.0f); - ints[1] = (uint)(bb.Minimum.Y * 10.0f); - ints[2] = (uint)(bb.Minimum.Z * 10.0f); - ints[3] = (uint)(bb.Maximum.X * 10.0f); - ints[4] = (uint)(bb.Maximum.Y * 10.0f); - ints[5] = (uint)(bb.Maximum.Z * 10.0f); - - var bones = skel?.BonesMap; - var exts = (Archetype.Extensions?.Length ?? 0);// + (Extensions?.Length ?? 0);//seems entity extensions aren't included in this - //todo: create extension light instances - - var lightInsts = new LightInstance[lightAttrs.Length]; - for (int i = 0; i < lightAttrs.Length; i++) - { - ints[6] = (uint)(exts + i); - var la = lightAttrs[i]; - - var xform = Matrix.Identity; - if ((bones != null) && (bones.TryGetValue(la.BoneId, out Bone bone))) - { - xform = bone.AbsTransform; - } - - var li = new LightInstance(); - li.Attributes = la; - li.Hash = ComputeLightHash(ints); - li.Position = Orientation.Multiply(xform.Multiply(la.Position)) + Position; - li.Direction = Orientation.Multiply(xform.MultiplyRot(la.Direction)); - lightInsts[i] = li; - } - Lights = lightInsts; - - //LightHashTest = new uint[25]; - //for (int i = 0; i < 25; i++) - //{ - // ints[6] = (uint)(i); - // LightHashTest[i] = ComputeLightHash(ints); - //} - - } - - - public static uint ComputeLightHash(uint[] ints, uint seed = 0) - { - var a2 = ints.Length; - var v3 = a2; - var v5 = (uint)(seed + 0xDEADBEEF + 4 * ints.Length); - var v6 = v5; - var v7 = v5; - - var c = 0; - for (var i = 0; i < (ints.Length - 4) / 3 + 1; i++, v3 -= 3, c += 3) - { - var v9 = ints[c + 2] + v5; - var v10 = ints[c + 1] + v6; - var v11 = ints[c] - v9; - var v13 = v10 + v9; - var v14 = (v7 + v11) ^ BitUtil.RotateLeft(v9, 4); - var v15 = v10 - v14; - var v17 = v13 + v14; - var v18 = v15 ^ BitUtil.RotateLeft(v14, 6); - var v19 = v13 - v18; - var v21 = v17 + v18; - var v22 = v19 ^ BitUtil.RotateLeft(v18, 8); - var v23 = v17 - v22; - var v25 = v21 + v22; - var v26 = v23 ^ BitUtil.RotateLeft(v22, 16); - var v27 = v21 - v26; - var v29 = v27 ^ BitUtil.RotateRight(v26, 13); - var v30 = v25 - v29; - v7 = v25 + v26; - v6 = v7 + v29; - v5 = v30 ^ BitUtil.RotateLeft(v29, 4); - } - - if (v3 == 3) - { - v5 += ints[c + 2]; - } - - if (v3 >= 2) - { - v6 += ints[c + 1]; - } - - if (v3 >= 1) - { - var v34 = (v6 ^ v5) - BitUtil.RotateLeft(v6, 14); - var v35 = (v34 ^ (v7 + ints[c])) - BitUtil.RotateLeft(v34, 11); - var v36 = (v35 ^ v6) - BitUtil.RotateRight(v35, 7); - var v37 = (v36 ^ v34) - BitUtil.RotateLeft(v36, 16); - var v38 = BitUtil.RotateLeft(v37, 4); - var v39 = (((v35 ^ v37) - v38) ^ v36) - BitUtil.RotateLeft((v35 ^ v37) - v38, 14); - return (v39 ^ v37) - BitUtil.RotateRight(v39, 8); - } - - return v5; - } - - - [TypeConverter(typeof(ExpandableObjectConverter))] - public class LightInstance - { - public LightAttributes Attributes { get; set; } //just for display purposes! - public uint Hash { get; set; } - public Vector3 Position { get; set; } - public Vector3 Direction { get; set; } - - public override string ToString() - { - return Hash.ToString() + ": " + Attributes.Type.ToString(); + LODLights.Init(parent.DistantLODLights); } } } - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapGrassInstanceBatch + + + + public void AddEntity(YmapEntityDef ent) { - private const float BatchVertMultiplier = 0.00001525878f; + //used by the editor to add to the ymap. - public Archetype Archetype { get; set; } //cached by GameFileCache on loading... - public rage__fwGrassInstanceListDef Batch { get; set; } - public rage__fwGrassInstanceListDef__InstanceData[] Instances { get; set; } - public Vector3 Position { get; set; } //calculated from AABB - public float Radius { get; set; } //calculated from AABB - public Vector3 AABBMin { get; set; } - public Vector3 AABBMax { get; set; } - public Vector3 CamRel; //used for rendering... - public float Distance; //used for rendering - public YmapFile Ymap { get; set; } + var allents = new List(AllEntities); - private List grassBounds; // for brush - public bool BrushEnabled; // for brush - public float BrushRadius = 5f; // for brush - public bool HasChanged; // for brush and renderer + ent.Index = allents.Count; + ent.Ymap = this; + allents.Add(ent); + AllEntities = allents.ToArray(); - // TODO: Make configurable. - const float BoundingSize = 0.3F; - static readonly Vector3 GrassMinMax = Vector3.One * BoundingSize; - public override string ToString() + if (ent.Parent is null || ent.Parent.Ymap != this) { - return Batch.ToString(); + //root entity, add to roots. + + List rootents = new List(RootEntities); + rootents.Add(ent); + RootEntities = rootents.ToArray(); } - public void UpdateInstanceCount() + HasChanged = true; + LodManagerUpdate = true; + } + + public bool RemoveEntity(YmapEntityDef ent) + { + //used by the editor to remove from the ymap. + if (ent is null) + return false; + + var res = true; + + int idx = ent.Index; + List newAllEntities = new List(); + List newRootEntities = new List(); + + if (AllEntities.Length > 0) { - var b = Batch; - var ins = b.InstanceList; - ins.Count1 = (ushort)Instances.Length; - b.InstanceList = ins; - Batch = b; - } - - public bool IsPointBlockedByInstance(Vector3 point) - { - return grassBounds.Any(bb => bb.Contains(point) == ContainmentType.Contains); - } - - private void ReInitializeBoundingCache() - { - // cache is already initialized correctly. - if (grassBounds != null && (grassBounds.Count == Instances.Length)) - return; - - // Clear the current bounding cache. - if (grassBounds == null) - grassBounds = new List(); - else grassBounds?.Clear(); - - foreach (var inst in Instances) + for (int i = 0; i < AllEntities.Length; i++) { - // create bounding box for this instance. - var worldPos = GetGrassWorldPos(inst.Position, new BoundingBox(AABBMin, AABBMax)); - var bb = new BoundingBox(worldPos - GrassMinMax, worldPos + GrassMinMax); - grassBounds.Add(bb); - } - } - - public bool EraseInstancesAtMouse( - YmapGrassInstanceBatch batch, - SpaceRayIntersectResult mouseRay, - float radius) - { - rage__spdAABB batchAABB = batch.Batch.BatchAABB; - var oldInstanceBounds = new BoundingBox - ( - batchAABB.min.XYZ(), - batchAABB.max.XYZ() - ); - var deleteSphere = new BoundingSphere(mouseRay.Position, radius); - - // check each instance to see if it's in the delete sphere - // thankfully we've just avoided an O(n^2) op using this bounds stuff (doesn't mean it's super fast though, - // but it's not super slow either, even at like 50,000 instances) - var insList = new List(); - foreach (var instance in batch.Instances) - { - // get the world pos - var worldPos = GetGrassWorldPos(instance.Position, oldInstanceBounds); - - // create a boundary around the instance. - var instanceBounds = new BoundingBox(worldPos - GrassMinMax, worldPos + GrassMinMax); - - // check if the sphere contains the boundary. - var bb = new BoundingBox(instanceBounds.Minimum, instanceBounds.Maximum); - var ct = deleteSphere.Contains(ref bb); - if (ct == ContainmentType.Contains || ct == ContainmentType.Intersects) + var oent = AllEntities[i]; + oent.Index = newAllEntities.Count; + if (oent != ent) { - //delInstances.Add(instance); // Add a copy of this instance - continue; + newAllEntities.Add(oent); } - insList.Add(instance); - } - if (insList.Count == Instances.Length) - return false; - - var newBounds = GetNewGrassBounds(insList, oldInstanceBounds); - // recalc instances - var b = RecalcBatch(newBounds, batch); - batch.Batch = b; - insList = RecalculateInstances(insList, oldInstanceBounds, newBounds); - batch.Instances = insList.ToArray(); - return true; - } - - public void CreateInstancesAtMouse( - YmapGrassInstanceBatch batch, - SpaceRayIntersectResult mouseRay, - float radius, - int amount, - Func spawnRayFunc, - Color color, - int ao, - int scale, - Vector3 pad, - bool randomScale) - { - - ReInitializeBoundingCache(); - var spawnPosition = mouseRay.Position; - var positions = new List(); - var normals = new List(); - - // Get rand positions. - GetSpawns(spawnPosition, spawnRayFunc, positions, normals, radius, amount); - if (positions.Count <= 0) return; - - // get the instance list - var instances = - batch.Instances?.ToList() ?? new List(); - var batchAABB = batch.Batch.BatchAABB; - - // make sure to store the old instance bounds for the original - // grass instances - var oldInstanceBounds = new BoundingBox(batchAABB.min.XYZ(), batchAABB.max.XYZ()); - - if (positions.Count <= 0) - return; - - // Begin the spawn bounds. - var grassBound = new BoundingBox(positions[0] - GrassMinMax, positions[0] + GrassMinMax); - grassBound = EncapsulatePositions(positions, grassBound); - - // Calculate the new spawn bounds. - var newInstanceBounds = new BoundingBox(oldInstanceBounds.Minimum, oldInstanceBounds.Maximum); - newInstanceBounds = instances.Count > 0 - ? newInstanceBounds.Encapsulate(grassBound) - : new BoundingBox(grassBound.Minimum, grassBound.Maximum); - - // now we need to recalculate the position of each instance - instances = RecalculateInstances(instances, oldInstanceBounds, newInstanceBounds); - - // Add new instances at each spawn position with - // the parameters in the brush. - SpawnInstances(positions, normals, instances, newInstanceBounds, color, ao, scale, pad, randomScale); - - // then recalc the bounds of the grass batch - var b = RecalcBatch(newInstanceBounds, batch); - - // plug our values back in and refresh the ymap. - batch.Batch = b; - - // Give back the new intsances - batch.Instances = instances.ToArray(); - grassBounds.Clear(); - } - - // bhv approach recommended by dexy. - public YmapGrassInstanceBatch[] OptimizeInstances(YmapGrassInstanceBatch batch, float minRadius) - { - // this function will return an array of grass instance batches - // that are split up into sectors (groups) with a specific size. - // say for instance we have 30,000 instances spread across a large - // distance. We will split those instances into a grid-like group - // and return the groups as an array of batches. - var oldInstanceBounds = new BoundingBox(batch.Batch.BatchAABB.min.XYZ(), batch.Batch.BatchAABB.max.XYZ()); - - if (oldInstanceBounds.Radius() < minRadius) - { - return new [] { batch }; - } - - // Get our optimized grassInstances - var split = SplitGrassRecursive(batch.Instances.ToList(), oldInstanceBounds, minRadius); - - // Initiate a new batch list. - var newBatches = new List(); - - foreach (var grassList in split) - { - // Create a new batch - var newBatch = new YmapGrassInstanceBatch + else if (i != idx) { - Archetype = batch.Archetype, - Ymap = batch.Ymap - }; - - // Get the boundary of the grassInstances - var newInstanceBounds = GetNewGrassBounds(grassList, oldInstanceBounds); - - // Recalculate the batch boundaries. - var b = RecalcBatch(newInstanceBounds, newBatch); - newBatch.Batch = b; - - var ins = RecalculateInstances(grassList, oldInstanceBounds, newInstanceBounds); - newBatch.Instances = ins.ToArray(); - newBatches.Add(newBatch); - } - - return newBatches.ToArray(); - } - - private List> SplitGrassRecursive( - IReadOnlyList grassInstances, - BoundingBox batchAABB, - float minRadius = 15F - ) - { - var ret = new List>(); - var oldPoints = SplitGrass(grassInstances, batchAABB); - while (true) - { - var stop = true; - var newPoints = new List>(); - foreach (var mb in oldPoints) - { - // for some reason we got a null group? - if (mb == null) - continue; - - // Get the bounds of the grassInstances list - var radius = GetNewGrassBounds(mb, batchAABB).Radius(); - - // check if the radius of the grassInstances - if (radius <= minRadius) - { - // this point list is within the minimum - // radius. - ret.Add(mb); - continue; // we don't need to continue. - } - - // since we're here let's keep going - stop = false; - - // split the grassInstances again - var s = SplitGrass(mb, batchAABB); - - // add it into the new grassInstances list. - newPoints.AddRange(s); + res = false; //indexes didn't match.. this shouldn't happen! } - - // set the old grassInstances to the new grassInstances. - oldPoints = newPoints.ToArray(); - - // if we're done, and all grassInstances are within the desired size - // then end the loop. - if (stop) break; - } - return ret; - } - - private List[] SplitGrass( - IReadOnlyList points, - BoundingBox batchAABB) - { - var pointGroup = new List[2]; - - // Calculate the bounds of these grassInstances. - var m = GetNewGrassBounds(points, batchAABB); - - // Get the center and size - var mm = new Vector3 - { - X = Math.Abs(m.Minimum.X - m.Maximum.X), - Y = Math.Abs(m.Minimum.Y - m.Maximum.Y), - Z = Math.Abs(m.Minimum.Z - m.Maximum.Z) - }; - - // x is the greatest axis... - if (mm.X > mm.Y && mm.X > mm.Z) - { - // Calculate both boundaries. - var lhs = new BoundingBox(m.Minimum, m.Maximum - new Vector3(mm.X * 0.5F, 0, 0)); - var rhs = new BoundingBox(m.Minimum + new Vector3(mm.X * 0.5F, 0, 0), m.Maximum); - - // Set the grassInstances accordingly. - pointGroup[0] = points - .Where(p => lhs.Contains(GetGrassWorldPos(p.Position, batchAABB)) == ContainmentType.Contains).ToList(); - pointGroup[1] = points - .Where(p => rhs.Contains(GetGrassWorldPos(p.Position, batchAABB)) == ContainmentType.Contains).ToList(); - } - // y is the greatest axis... - else if (mm.Y > mm.X && mm.Y > mm.Z) - { - // Calculate both boundaries. - var lhs = new BoundingBox(m.Minimum, m.Maximum - new Vector3(0, mm.Y * 0.5F, 0)); - var rhs = new BoundingBox(m.Minimum + new Vector3(0, mm.Y * 0.5F, 0), m.Maximum); - - // Set the grassInstances accordingly. - pointGroup[0] = points - .Where(p => lhs.Contains(GetGrassWorldPos(p.Position, batchAABB)) == ContainmentType.Contains).ToList(); - pointGroup[1] = points - .Where(p => rhs.Contains(GetGrassWorldPos(p.Position, batchAABB)) == ContainmentType.Contains).ToList(); - } - // z is the greatest axis... - else if (mm.Z > mm.X && mm.Z > mm.Y) - { - // Calculate both boundaries. - var lhs = new BoundingBox(m.Minimum, m.Maximum - new Vector3(0, 0, mm.Z * 0.5F)); - var rhs = new BoundingBox(m.Minimum + new Vector3(0, 0, mm.Z * 0.5F), m.Maximum); - - // Set the grassInstances accordingly. - pointGroup[0] = points - .Where(p => lhs.Contains(GetGrassWorldPos(p.Position, batchAABB)) == ContainmentType.Contains).ToList(); - pointGroup[1] = points - .Where(p => rhs.Contains(GetGrassWorldPos(p.Position, batchAABB)) == ContainmentType.Contains).ToList(); - } - return pointGroup; - } - - private static BoundingBox GetNewGrassBounds(IReadOnlyList newGrass, BoundingBox oldAABB) - { - var grassPositions = newGrass.Select(x => GetGrassWorldPos(x.Position, oldAABB)).ToArray(); - return BoundingBox.FromPoints(grassPositions).Expand(1f); - } - - private void SpawnInstances( - IReadOnlyList positions, - IReadOnlyList normals, - ICollection instanceList, - BoundingBox instanceBounds, - Color color, - int ao, - int scale, - Vector3 pad, - bool randomScale) - { - for (var i = 0; i < positions.Count; i++) - { - var pos = positions[i]; - // create the new instance. - var newInstance = CreateNewInstance(normals[i], color, ao, scale, pad, randomScale); - - // get the grass position of the new instance and add it to the - // instance list - var grassPosition = GetGrassPos(pos, instanceBounds); - newInstance.Position = grassPosition; - instanceList.Add(newInstance); } } - - private rage__fwGrassInstanceListDef__InstanceData CreateNewInstance(Vector3 normal, Color color, int ao, int scale, Vector3 pad, - bool randomScale = false) + foreach(var oent in RootEntities) { - //Vector3 pad = FloatUtil.ParseVector3String(PadTextBox.Text); - //int scale = (int)ScaleNumericUpDown.Value; - var rand = new Random(); - if (randomScale) - scale = rand.Next(scale / 2, scale); - var newInstance = new rage__fwGrassInstanceListDef__InstanceData - { - Ao = (byte)ao, - Scale = (byte)scale, - Color = new ArrayOfBytes3 { b0 = color.R, b1 = color.G, b2 = color.B }, - Pad = new ArrayOfBytes3 { b0 = (byte)pad.X, b1 = (byte)pad.Y, b2 = (byte)pad.Z }, - NormalX = (byte)((normal.X + 1) * 0.5F * 255F), - NormalY = (byte)((normal.Y + 1) * 0.5F * 255F) - }; - return newInstance; + if (oent != ent) + newRootEntities.Add(oent); } - private rage__fwGrassInstanceListDef RecalcBatch(BoundingBox newInstanceBounds, YmapGrassInstanceBatch batch) + if (AllEntities.Length == newAllEntities.Count || RootEntities.Length == newRootEntities.Count) { - batch.AABBMax = newInstanceBounds.Maximum; - batch.AABBMin = newInstanceBounds.Minimum; - batch.Position = newInstanceBounds.Center(); - batch.Radius = newInstanceBounds.Radius(); - var b = batch.Batch; - b.BatchAABB = new rage__spdAABB - { - min = - new Vector4(newInstanceBounds.Minimum, - 0), // Let's pass the new stuff into the batchabb as well just because. - max = new Vector4(newInstanceBounds.Maximum, 0) - }; - return b; + res = false; } - private void GetSpawns( - Vector3 origin, Func spawnRayFunc, - ICollection positions, - ICollection normals, - float radius, - int resolution = 28) + LodManagerOldEntities = AllEntities; + AllEntities = newAllEntities.ToArray(); + RootEntities = newRootEntities.ToArray(); + + HasChanged = true; + LodManagerUpdate = true; + + return res; + } + + + public void AddCarGen(YmapCarGen cargen) + { + List cargens = new List(); + if (CarGenerators != null) + cargens.AddRange(CarGenerators); + cargen.Ymap = this; + cargens.Add(cargen); + CarGenerators = cargens.ToArray(); + + HasChanged = true; + } + + public bool RemoveCarGen(YmapCarGen cargen) + { + if (cargen == null) return false; + + List newcargens = new List(); + + if (CarGenerators != null) { - var rand = new Random(); - for (var i = 0; i < resolution; i++) + foreach(var cg in CarGenerators) { - var randX = (float)rand.NextDouble(-radius, radius); - var randY = (float)rand.NextDouble(-radius, radius); - if (Math.Abs(randX) > 0 && Math.Abs(randY) > 0) + if (cg != cargen) { - randX *= .7071f; - randY *= .7071f; + newcargens.Add(cg); } - var posOffset = origin + new Vector3(randX, randY, 2f); - var spaceRay = spawnRayFunc.Invoke(posOffset); - if (!spaceRay.Hit) continue; - // not truly O(n^2) but may be slow... - // actually just did some testing, not slow at all. - if (IsPointBlockedByInstance(spaceRay.Position)) continue; - normals.Add(spaceRay.Normal); - positions.Add(spaceRay.Position); + } + if (newcargens.Count == CarGenerators.Length) + { + return false; //nothing removed... wasn't present? } } - private static List RecalculateInstances( - List instances, - BoundingBox oldInstanceBounds, - BoundingBox newInstanceBounds) - { - var refreshList = new List(); - foreach (var inst in instances) - { - // Copy instance - var copy = - new rage__fwGrassInstanceListDef__InstanceData - { - Position = inst.Position, - Ao = inst.Ao, - Color = inst.Color, - NormalX = inst.NormalX, - NormalY = inst.NormalY, - Pad = inst.Pad, - Scale = inst.Scale - }; - // get the position from where we would be in the old bounds, and move it to - // the position it needs to be in the new bounds. - var oldPos = GetGrassWorldPos(copy.Position, oldInstanceBounds); - //var oldPos = oldInstanceBounds.min + oldInstanceBounds.Size * (grassPos * BatchVertMultiplier); - copy.Position = GetGrassPos(oldPos, newInstanceBounds); - refreshList.Add(copy); - } - instances = refreshList.ToList(); - return instances; - } - private static BoundingBox EncapsulatePositions(IEnumerable positions, BoundingBox bounds) - { - foreach (var pos in positions) - { - var posBounds = new BoundingBox(pos - (GrassMinMax + 0.1f), pos + (GrassMinMax + 0.1f)); - bounds = bounds.Encapsulate(posBounds); - } - return bounds; - } + CarGenerators = newcargens.ToArray(); - private static ArrayOfUshorts3 GetGrassPos(Vector3 worldPos, BoundingBox batchAABB) - { - var offset = worldPos - batchAABB.Minimum; - var size = batchAABB.Size(); - var percentage = - new Vector3( - offset.X / size.X, - offset.Y / size.Y, - offset.Z / size.Z - ); - var instancePos = percentage / BatchVertMultiplier; - return new ArrayOfUshorts3 - { - u0 = (ushort)instancePos.X, - u1 = (ushort)instancePos.Y, - u2 = (ushort)instancePos.Z - }; - } + HasChanged = true; - private static Vector3 GetGrassWorldPos(ArrayOfUshorts3 grassPos, BoundingBox batchAABB) + return true; + } + + + public void AddLodLight(YmapLODLight lodlight) + { + if (LODLights == null) { - return batchAABB.Minimum + batchAABB.Size() * (grassPos.XYZ() * BatchVertMultiplier); + LODLights = new YmapLODLights(); + LODLights.Ymap = this; + } + List lodlights = new List(); + if (LODLights?.LodLights != null) + lodlights.AddRange(LODLights.LodLights); + lodlight.LodLights = this.LODLights; + lodlight.Index = lodlights.Count; + lodlights.Add(lodlight); + LODLights.LodLights = lodlights.ToArray(); + + HasChanged = true; + + var parent = Parent; + if (parent?.DistantLODLights is not null) + { + parent.DistantLODLights.RebuildFromLodLights(LODLights.LodLights); + parent.HasChanged = true; } } - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapPropInstanceBatch + public bool RemoveLodLight(YmapLODLight lodlight) { - public YmapFile Ymap { get; set; } + if (lodlight == null) + return false; + List newlodlights = new List(); + + var lodlights = LODLights?.LodLights; + if (lodlights != null) + { + foreach(var ll in lodlights) + { + if (ll != lodlight) + { + newlodlights.Add(ll); + } + } + if (newlodlights.Count == lodlights.Length) + { + return false; //nothing removed... wasn't present? + } + } + + for (int i = 0; i < newlodlights.Count; i++) + { + newlodlights[i].Index = i; + } + + LODLights.LodLights = newlodlights.ToArray(); + + HasChanged = true; + + var parent = Parent; + if (parent?.DistantLODLights != null) + { + parent.DistantLODLights.RebuildFromLodLights(LODLights.LodLights); + parent.HasChanged = true; + } + + return true; } - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapDistantLODLights + + public void AddBoxOccluder(YmapBoxOccluder box) { - public CDistantLODLight CDistantLODLight { get; set; } - public uint[] colours { get; set; } - public MetaVECTOR3[] positions { get; set; } + if (box is null) + return; + var boxes = new List(); + if (BoxOccluders is not null) + boxes.AddRange(BoxOccluders); + box.Ymap = this; + box.Index = boxes.Count; + boxes.Add(box); + BoxOccluders = boxes.ToArray(); - public Vector3 BBMin { get; set; } - public Vector3 BBMax { get; set; } - public YmapFile Ymap { get; set; } - - public void CalcBB() - { - if (positions != null) - { - Vector3 min = new Vector3(float.MaxValue); - Vector3 max = new Vector3(float.MinValue); - for (int i = 0; i < positions.Length; i++) - { - var p = positions[i]; - Vector3 pv = p.ToVector3(); - min = Vector3.Min(min, pv); - max = Vector3.Max(max, pv); - } - BBMin = min; - BBMax = max; - } - - } - - - public void RebuildFromLodLights(YmapLODLight[] lodlights) - { - var n = lodlights?.Length ?? 0; - if (n == 0) return; - - colours = new uint[n]; - positions = new MetaVECTOR3[n]; - var nstreetlights = 0; - for (int i = 0; i < n; i++) - { - var ll = lodlights[i]; - colours[i] = (uint)(ll.Colour.ToBgra()); - positions[i] = new MetaVECTOR3(ll.Position); - if ((ll.StateFlags1 & 1) > 0) - { - nstreetlights++; - } - } - - var cdll = CDistantLODLight; - cdll.numStreetLights = (ushort)nstreetlights; - - CalcBB(); - - } - - - public override string ToString() - { - if (Ymap != null) - { - return Ymap.ToString(); - } - return base.ToString(); - } + HasChanged = true; } - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapLODLights + public bool RemoveBoxOccluder(YmapBoxOccluder box) { - public CLODLight CLODLight { get; set; } - public MetaVECTOR3[] direction { get; set; } - public float[] falloff { get; set; } - public float[] falloffExponent { get; set; } - public uint[] timeAndStateFlags { get; set; } - public uint[] hash { get; set; } - public byte[] coneInnerAngle { get; set; } - public byte[] coneOuterAngleOrCapExt { get; set; } - public byte[] coronaIntensity { get; set; } - - public Vector3 BBMin { get; set; } - public Vector3 BBMax { get; set; } - public YmapFile Ymap { get; set; } - - public YmapLODLight[] LodLights { get; set; } - - public PathBVH BVH { get; set; } - - public void Init(YmapDistantLODLights parent) + if (box == null) return false; + var newboxes = new List(); + if (BoxOccluders != null) { - if (parent == null) return; - - BuildLodLights(parent); - CalcBB(); - BuildBVH(); - } - - public void BuildLodLights(YmapDistantLODLights parent) - { - var n = direction?.Length ?? 0; - n = Math.Min(n, parent.positions?.Length ?? 0); - n = Math.Min(n, parent.colours?.Length ?? 0); - n = Math.Min(n, falloff?.Length ?? 0); - n = Math.Min(n, falloffExponent?.Length ?? 0); - n = Math.Min(n, timeAndStateFlags?.Length ?? 0); - n = Math.Min(n, hash?.Length ?? 0); - n = Math.Min(n, coneInnerAngle?.Length ?? 0); - n = Math.Min(n, coneOuterAngleOrCapExt?.Length ?? 0); - n = Math.Min(n, coronaIntensity?.Length ?? 0); - if (n == 0) return; - - LodLights = new YmapLODLight[n]; - for (int i = 0; i < n; i++) + foreach (var oldbox in BoxOccluders) { - var l = new YmapLODLight(); - l.Init(this, parent, i); - LodLights[i] = l; - } - } - - public void BuildBVH() - { - BVH = new PathBVH(LodLights, 10, 10); - } - - - public void CalcBB() - { - var positions = Ymap?.Parent?.DistantLODLights?.positions; - if (positions != null) - { - Vector3 min = new Vector3(float.MaxValue); - Vector3 max = new Vector3(float.MinValue); - for (int i = 0; i < positions.Length; i++) + if (oldbox != box) { - var p = positions[i]; - Vector3 pv = p.ToVector3(); - min = Vector3.Min(min, pv); - max = Vector3.Max(max, pv); - } - BBMin = min; - BBMax = max; - } - else if (Ymap != null) - { - BBMin = Ymap._CMapData.entitiesExtentsMin; - BBMax = Ymap._CMapData.entitiesExtentsMax; - } - else - { } - } - - public void RebuildFromLodLights() - { - var n = LodLights?.Length ?? 0; - if (n <= 0) - { - direction = null; - falloff = null; - falloffExponent = null; - timeAndStateFlags = null; - hash = null; - coneInnerAngle = null; - coneOuterAngleOrCapExt = null; - coronaIntensity = null; - } - else - { - direction = new MetaVECTOR3[n]; - falloff = new float[n]; - falloffExponent = new float[n]; - timeAndStateFlags = new uint[n]; - hash = new uint[n]; - coneInnerAngle = new byte[n]; - coneOuterAngleOrCapExt = new byte[n]; - coronaIntensity = new byte[n]; - - for (int i = 0; i < n; i++) - { - var ll = LodLights[i]; - direction[i] = new MetaVECTOR3(ll.Direction); - falloff[i] = ll.Falloff; - falloffExponent[i] = ll.FalloffExponent; - timeAndStateFlags[i] = ll.TimeAndStateFlags; - hash[i] = ll.Hash; - coneInnerAngle[i] = ll.ConeInnerAngle; - coneOuterAngleOrCapExt[i] = ll.ConeOuterAngleOrCapExt; - coronaIntensity[i] = ll.CoronaIntensity; + oldbox.Index = newboxes.Count; + newboxes.Add(oldbox); } } - - } - - - public override string ToString() - { - if (Ymap != null) + if (newboxes.Count == BoxOccluders.Length) { - return Ymap.ToString(); + return false;//nothing removed... wasn't present? } - return base.ToString(); } + + BoxOccluders = newboxes.ToArray(); + + HasChanged = true; + + return true; } - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapLODLight : BasePathNode + + public void AddOccludeModel(YmapOccludeModel model) { - public YmapFile Ymap { get { return LodLights?.Ymap ?? DistLodLights?.Ymap; } } - public YmapLODLights LodLights { get; set; } - public YmapDistantLODLights DistLodLights { get; set; } - public int Index { get; set; } - public Color Colour { get; set; } - public Vector3 Position { get; set; } - public Vector3 Direction { get; set; } - public float Falloff { get; set; } - public float FalloffExponent { get; set; } - public uint TimeAndStateFlags { get; set; } - public uint Hash { get; set; } - public byte ConeInnerAngle { get; set; } - public byte ConeOuterAngleOrCapExt { get; set; } - public byte CoronaIntensity { get; set; } + if (model is null) + return; + var models = new List(); + if (OccludeModels != null) + models.AddRange(OccludeModels); + model.Ymap = this; + models.Add(model); + OccludeModels = models.ToArray(); - public Quaternion Orientation { get; set; } - public Vector3 Scale { get; set; } + HasChanged = true; + } - public Vector3 TangentX { get; set; } - public Vector3 TangentY { get; set; } - - public LightType Type + public bool RemoveOccludeModel(YmapOccludeModel model) + { + if (model == null) return false; + var newmodels = new List(); + if (OccludeModels != null) { - get + foreach (var oldmodel in OccludeModels) { - return (LightType)((TimeAndStateFlags >> 26) & 7); + if (oldmodel != model) + { + oldmodel.Index = newmodels.Count; + newmodels.Add(oldmodel); + } } - set + if (newmodels.Count == OccludeModels.Length) { - TimeAndStateFlags = (TimeAndStateFlags & 0xE3FFFFFF) + (((uint)value & 7) << 26); - } - } - public FlagsUint TimeFlags - { - get - { - return (TimeAndStateFlags & 0xFFFFFF); - } - set - { - TimeAndStateFlags = (TimeAndStateFlags & 0xFF000000) + (value & 0xFFFFFF); - } - } - public uint StateFlags1 - { - get - { - return (TimeAndStateFlags >> 24) & 3; - } - set - { - TimeAndStateFlags = (TimeAndStateFlags & 0xFCFFFFFF) + ((value & 3) << 24); - } - } - public uint StateFlags2 - { - get - { - return (TimeAndStateFlags >> 29) & 7; - } - set - { - TimeAndStateFlags = (TimeAndStateFlags & 0x1FFFFFFF) + ((value & 7) << 29); + return false;//nothing removed... wasn't present? } } - public bool Enabled { get; set; } = true; + OccludeModels = newmodels.ToArray(); - public bool Visible { get; set; } = true; + HasChanged = true; - public void Init(YmapLODLights l, YmapDistantLODLights p, int i) + return true; + } + + + public void AddOccludeModelTriangle(YmapOccludeModelTriangle tri) + { + if (tri?.Model is null) + return; + + var tris = tri.Model.Triangles.ToList(); + tri.Index = tris.Count; + tris.Add(tri); + tri.Model.Triangles = tris.ToArray(); + + //tri.Model.BuildBVH(); + //... + + HasChanged = true; + } + + public bool RemoveOccludeModelTriangle(YmapOccludeModelTriangle tri) + { + if (tri?.Model is null) + return false; + + var newtris = new List(); + if (tri.Model.Triangles is not null) { - LodLights = l; - DistLodLights = p; - Index = i; + newtris.EnsureCapacity(tri.Model.Triangles.Length); + foreach (var oldtri in tri.Model.Triangles) + { + if (oldtri != tri) + { + oldtri.Index = newtris.Count; + newtris.Add(oldtri); + } + } + } + tri.Model.Triangles = newtris.ToArray(); + //tri.Model.BuildBVH(); + //... - if (p.colours == null) return; - if ((i < 0) || (i >= p.colours.Length)) return; + HasChanged = true; - Colour = Color.FromBgra(p.colours[i]); - Position = p.positions[i].ToVector3(); - Direction = l.direction[i].ToVector3(); - Falloff = l.falloff[i]; - FalloffExponent = l.falloffExponent[i]; - TimeAndStateFlags = l.timeAndStateFlags[i]; - Hash = l.hash[i]; - ConeInnerAngle = l.coneInnerAngle[i]; - ConeOuterAngleOrCapExt = l.coneOuterAngleOrCapExt[i]; - CoronaIntensity = l.coronaIntensity[i]; + return true; + } - UpdateTangentsAndOrientation(); - Scale = new Vector3(Falloff); + public void AddGrassBatch(YmapGrassInstanceBatch newbatch) + { + List batches = new List(); + if (GrassInstanceBatches is not null && GrassInstanceBatches.Length > 0) + batches.AddRange(GrassInstanceBatches); + newbatch.Ymap = this; + batches.Add(newbatch); + GrassInstanceBatches = batches.ToArray(); + + HasChanged = true; + UpdateGrassPhysDict(true); + } + + public bool RemoveGrassBatch(YmapGrassInstanceBatch batch) + { + if (batch is null) + return false; + + List batches = new List(GrassInstanceBatches.Length); + + if (GrassInstanceBatches is not null) + { + foreach(var gb in GrassInstanceBatches) + { + if (gb != batch) + { + batches.Add(gb); + } + } + if (batches.Count == GrassInstanceBatches.Length) + { + return false; //nothing removed... wasn't present? + } } - public void UpdateTangentsAndOrientation() + if (batches.Count <= 0) { - switch (Type) + UpdateGrassPhysDict(false); + } + + GrassInstanceBatches = batches.ToArray(); + + HasChanged = true; + + return true; + } + + + + + public void SetName(string newname) + { + var newnamex = newname + ".ymap"; + var newhash = JenkHash.GenHashLower(newname); + JenkIndex.EnsureLower(newname); + if (RpfFileEntry is not null) + { + RpfFileEntry.Name = newnamex; + } + Name = newnamex; + _CMapData.name = newhash; + } + public void SetFilePath(string filepath) + { + FilePath = filepath.ToLowerInvariant(); + var newname = Path.GetFileNameWithoutExtension(filepath); + SetName(newname); + } + + + public bool CalcFlags() + { + uint flags = 0; + uint contentFlags = 0; + + foreach (var yent in AllEntities) + { + switch (yent._CEntityDef.lodLevel) { - default: - case LightType.Point: - TangentX = Vector3.UnitX; - TangentY = Vector3.UnitY; - Orientation = Quaternion.Identity; + case rage__eLodType.LODTYPES_DEPTH_ORPHANHD: + case rage__eLodType.LODTYPES_DEPTH_HD: + contentFlags = SetBit(contentFlags, 0); //1 break; - case LightType.Spot: - TangentX = Vector3.Normalize(Direction.GetPerpVec()); - TangentY = Vector3.Normalize(Vector3.Cross(Direction, TangentX)); + case rage__eLodType.LODTYPES_DEPTH_LOD: + contentFlags = SetBit(contentFlags, 1); //2 + flags = SetBit(flags, 1); //2 break; - case LightType.Capsule: - TangentX = -Vector3.Normalize(Direction.GetPerpVec()); - TangentY = Vector3.Normalize(Vector3.Cross(Direction, TangentX)); + case rage__eLodType.LODTYPES_DEPTH_SLOD1: + contentFlags = SetBit(contentFlags, 4); //16 + flags = SetBit(flags, 1); //2 + break; + case rage__eLodType.LODTYPES_DEPTH_SLOD2: + case rage__eLodType.LODTYPES_DEPTH_SLOD3: + case rage__eLodType.LODTYPES_DEPTH_SLOD4: + contentFlags = SetBit(contentFlags, 2); //4 + contentFlags = SetBit(contentFlags, 4); //16 + flags = SetBit(flags, 1); //2 break; } - - if (Type == LightType.Point) + if (yent.MloInstance != null) { - Orientation = Quaternion.Identity; + contentFlags = SetBit(contentFlags, 3); //8 //(interior instance) } + } + + if (CMloInstanceDefs.Length > 0) + { + contentFlags = SetBit(contentFlags, 3); //8 //(interior instance) //is this still necessary? + } + if (physicsDictionaries.Length > 0) + { + contentFlags = SetBit(contentFlags, 6); //64 + } + if ((GrassInstanceBatches != null) && (GrassInstanceBatches.Length > 0)) + { + contentFlags = SetBit(contentFlags, 10); //64 + } + if ((LODLights != null) && ((LODLights.direction?.Length ?? 0) > 0)) + { + contentFlags = SetBit(contentFlags, 7); //128 + } + if ((DistantLODLights != null) && ((DistantLODLights.positions?.Length ?? 0) > 0)) + { + flags = SetBit(flags, 1); //2 + contentFlags = SetBit(contentFlags, 8); //256 + } + if ((BoxOccluders != null) || (OccludeModels != null)) + { + contentFlags = SetBit(contentFlags, 5); //32 + } + + + bool change = false; + if (_CMapData.flags != flags) + { + _CMapData.flags = flags; + change = true; + } + if (_CMapData.contentFlags != contentFlags) + { + _CMapData.contentFlags = contentFlags; + change = true; + } + return change; + } + + public bool CalcExtents() + { + Vector3 emin = new Vector3(float.MaxValue); + Vector3 emax = new Vector3(float.MinValue); + Vector3 smin = new Vector3(float.MaxValue); + Vector3 smax = new Vector3(float.MinValue); + Vector3[] c = new Vector3[8]; + Vector3[] s = new Vector3[8]; + + foreach(var ent in AllEntities) + { + var arch = ent.Archetype; + var ori = ent.Orientation; + float loddist = ent._CEntityDef.lodDist; + + Vector3 bbmin = ent.Position - ent.BSRadius; //sphere + Vector3 bbmax = ent.Position + ent.BSRadius; + Vector3 sbmin = bbmin - loddist; + Vector3 sbmax = bbmax + loddist; + if (arch != null) + { + if (loddist <= 0.0f) + { + loddist = arch.LodDist; + } + + Vector3 abmin = arch.BBMin * ent.Scale; //entity box + Vector3 abmax = arch.BBMax * ent.Scale; + c[0] = abmin; + c[1] = new Vector3(abmin.X, abmin.Y, abmax.Z); + c[2] = new Vector3(abmin.X, abmax.Y, abmin.Z); + c[3] = new Vector3(abmin.X, abmax.Y, abmax.Z); + c[4] = new Vector3(abmax.X, abmin.Y, abmin.Z); + c[5] = new Vector3(abmax.X, abmin.Y, abmax.Z); + c[6] = new Vector3(abmax.X, abmax.Y, abmin.Z); + c[7] = abmax; + + abmin = arch.BBMin * ent.Scale - loddist; //streaming box + abmax = arch.BBMax * ent.Scale + loddist; + s[0] = abmin; + s[1] = new Vector3(abmin.X, abmin.Y, abmax.Z); + s[2] = new Vector3(abmin.X, abmax.Y, abmin.Z); + s[3] = new Vector3(abmin.X, abmax.Y, abmax.Z); + s[4] = new Vector3(abmax.X, abmin.Y, abmin.Z); + s[5] = new Vector3(abmax.X, abmin.Y, abmax.Z); + s[6] = new Vector3(abmax.X, abmax.Y, abmin.Z); + s[7] = abmax; + + bbmin = new Vector3(float.MaxValue); + bbmax = new Vector3(float.MinValue); + sbmin = new Vector3(float.MaxValue); + sbmax = new Vector3(float.MinValue); + for (int j = 0; j < 8; j++) + { + Vector3 corn = ori.Multiply(in c[j]) + ent.Position; + Vectors.Min(in bbmin, in corn, out bbmin); + Vectors.Max(in bbmax, in corn, out bbmax); + + corn = ori.Multiply(in s[j]) + ent.Position; + Vectors.Min(in sbmin, in corn, out sbmin); + Vectors.Max(in sbmax, in corn, out sbmax); + } + } + + Vectors.Min(in emin, in bbmin, out emin); + Vectors.Max(in emax, in bbmax, out emax); + Vectors.Min(in smin, in sbmin, out smin); + Vectors.Max(in smax, in sbmax, out smax); + } + + if (GrassInstanceBatches != null) + { + //var lodoffset = Vector3.Zero;// new Vector3(0, 0, 100); //IDK WHY -neos7 //dexy: i guess it's not completely necessary... //blame neos + foreach (var batch in GrassInstanceBatches) //thanks to Neos7 + { + Vectors.Min(in emin, in batch.AABBMin, out emin); + Vectors.Max(in emax, in batch.AABBMax, out emax); + Vectors.Min(in smin, (batch.AABBMin - batch.Batch.lodDist), out smin); // + lodoffset + Vectors.Max(in smax, (batch.AABBMax + batch.Batch.lodDist), out smax); // - lodoffset + } + } + + if (CarGenerators != null) + { + foreach (var cargen in CarGenerators) + { + var len = cargen._CCarGen.perpendicularLength; + Vectors.Min(in emin, cargen.Position - len, out emin); + Vectors.Max(in emax, cargen.Position + len, out emax); + Vectors.Min(in smin, cargen.Position - len*2.0f, out smin); //just a random guess, maybe should be more? + Vectors.Max(in smax, cargen.Position + len*2.0f, out smax); + } + } + + if (LODLights != null) + { + LODLights.CalcBB(); + Vectors.Min(in emin, LODLights.BBMin - 20.0f, out emin); //about right + Vectors.Max(in emax, LODLights.BBMax + 20.0f, out emax); + Vectors.Min(in smin, LODLights.BBMin - 950.0f, out smin); //seems correct + Vectors.Max(in smax, LODLights.BBMax + 950.0f, out smax); + } + + if (DistantLODLights != null) + { + DistantLODLights.CalcBB(); + Vectors.Min(in emin, DistantLODLights.BBMin - 20.0f, out emin); //not exact, but probably close enough + Vectors.Max(in emax, DistantLODLights.BBMax + 20.0f, out emax); + Vectors.Min(in smin, (DistantLODLights.BBMin - 3000.0f), out smin); //seems correct + Vectors.Max(in smax, (DistantLODLights.BBMax + 3000.0f), out smax); + } + + if (BoxOccluders != null) + { + foreach (var box in BoxOccluders) + { + var siz = box.Size.Length() * 0.5f;//should really use box rotation instead.... + Vectors.Min(in emin, box.Position - siz, out emin); + Vectors.Max(in emax, box.Position + siz, out emax); + Vectors.Min(in smin, box.Position - siz, out smin);//check this! for some vanilla ymaps it seems right, others not + Vectors.Max(in smax, box.Position + siz, out smax);//occluders don't seem to have a loddist + } + } + + if (OccludeModels != null) + { + foreach (var model in OccludeModels) + { + var boundingBox = model.BVH?._Box ?? model._OccludeModel.BoundingBox; + Vectors.Min(in emin, in boundingBox.Minimum, out emin);//this needs to be updated! + Vectors.Max(in emax, in boundingBox.Maximum, out emax); + Vectors.Min(in smin, in boundingBox.Minimum, out smin);//check this! for some vanilla ymaps it seems right, others not + Vectors.Max(in smax, in boundingBox.Maximum, out smax);//occluders don't seem to have a loddist + } + } + + bool change = false; + if (_CMapData.entitiesExtentsMin != emin) + { + _CMapData.entitiesExtentsMin = emin; + change = true; + } + if (_CMapData.entitiesExtentsMax != emax) + { + _CMapData.entitiesExtentsMax = emax; + change = true; + } + if (_CMapData.streamingExtentsMin != smin) + { + _CMapData.streamingExtentsMin = smin; + change = true; + } + if (_CMapData.streamingExtentsMax != smax) + { + _CMapData.streamingExtentsMax = smax; + change = true; + } + return change; + } + + + private void UpdateGrassPhysDict(bool add) + { + var physDict = physicsDictionaries?.ToList() ?? new List(); + var vproc1 = JenkHash.GenHash("v_proc1"); + var vproc2 = JenkHash.GenHash("v_proc2"); // I think you need vproc2 as well. + var change = false; + if (!physDict.Contains(vproc1)) + { + change = true; + if (add) + physDict.Add(vproc1); else - { - var m = new Matrix(); - m.Row1 = new Vector4(TangentX, 0); - m.Row2 = new Vector4(TangentY, 0); - m.Row3 = new Vector4(Direction, 0); - Orientation = Quaternion.RotationMatrix(m); - } + physDict.Remove(vproc1); } - - public void SetColour(Color c) + if (!physDict.Contains(vproc2)) { - Colour = c; - - if ((DistLodLights?.colours != null) && (DistLodLights.colours.Length >= Index)) - { - DistLodLights.colours[Index] = (uint)(c.ToBgra()); - } - - } - public void SetPosition(Vector3 pos) - { - Position = pos; - - if ((DistLodLights?.positions != null) && (DistLodLights.positions.Length >= Index)) - { - DistLodLights.positions[Index] = new MetaVECTOR3(pos); - } - - } - public void SetOrientation(Quaternion ori) - { - var inv = Quaternion.Invert(Orientation); - var delta = ori * inv; - TangentX = Vector3.Normalize(delta.Multiply(TangentX)); - TangentY = Vector3.Normalize(delta.Multiply(TangentY)); - Direction = Vector3.Normalize(delta.Multiply(Direction)); - Orientation = ori; - } - public void SetScale(Vector3 scale) - { - switch (Type) - { - case LightType.Point: - case LightType.Spot: - Falloff = scale.Z; - break; - case LightType.Capsule: - Falloff = scale.X; - ConeOuterAngleOrCapExt = (byte)Math.Min(255, Math.Max(0, Math.Round(Math.Max((uint)ConeOuterAngleOrCapExt, 2) * Math.Abs(scale.Z / Math.Max(Scale.Z, 0.01f)))));//lols - break; - } - Scale = scale; - } - - - - public void CopyFrom(YmapLODLight l) - { - Colour = l.Colour; - Position = l.Position; - Direction = l.Direction; - Falloff = l.Falloff; - FalloffExponent = l.FalloffExponent; - TimeAndStateFlags = l.TimeAndStateFlags; - Hash = l.Hash; - ConeInnerAngle = l.ConeInnerAngle; - ConeOuterAngleOrCapExt = l.ConeOuterAngleOrCapExt; - CoronaIntensity = l.CoronaIntensity; - - Orientation = l.Orientation; - Scale = l.Scale; - TangentX = l.TangentX; - TangentY = l.TangentY; - } - - - public override string ToString() - { - return Index.ToString() + ": " + Position.ToString(); + change = true; + if (add) + physDict.Add(vproc2); + else + physDict.Remove(vproc2); } + if (change) + physicsDictionaries = physDict.ToArray(); } - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapTimeCycleModifier + public void InitYmapEntityArchetypes(GameFileCache gfc) { - public CTimeCycleModifier CTimeCycleModifier { get; set; } - public World.TimecycleMod TimeCycleModData { get; set; } - - public Vector3 BBMin { get; set; } - public Vector3 BBMax { get; set; } - - public YmapFile Ymap { get; set; } - } - - - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapCarGen - { - public CCarGen _CCarGen; - public CCarGen CCarGen { get { return _CCarGen; } set { _CCarGen = value; } } - - public Vector3 Position { get; set; } - public Quaternion Orientation { get; set; } - public Vector3 BBMin { get; set; } - public Vector3 BBMax { get; set; } - - public YmapFile Ymap { get; set; } - - - public YmapCarGen(YmapFile ymap, CCarGen cargen) + if (AllEntities.Length > 0) { - float hlen = cargen.perpendicularLength * 0.5f; - Ymap = ymap; - CCarGen = cargen; - Position = cargen.position; - CalcOrientation(); - BBMin = new Vector3(-hlen); - BBMax = new Vector3(hlen); - } - - - public void CalcOrientation() - { - float angl = (float)Math.Atan2(_CCarGen.orientY, _CCarGen.orientX); - Orientation = Quaternion.RotationYawPitchRoll(0.0f, 0.0f, angl); - } - - public void SetPosition(Vector3 pos) - { - Position = pos; - _CCarGen.position = pos; - } - public void SetOrientation(Quaternion ori) - { - Orientation = ori; - - float len = Math.Max(_CCarGen.perpendicularLength * 1.5f, 5.0f); - Vector3 v = new Vector3(len, 0, 0); - Vector3 t = ori.Multiply(v); - - _CCarGen.orientX = t.X; - _CCarGen.orientY = t.Y; - } - public void SetScale(Vector3 scale) - { - float s = scale.X; - float hlen = s * 0.5f; - _CCarGen.perpendicularLength = s; - - BBMin = new Vector3(-hlen); - BBMax = new Vector3(hlen); - } - - public void SetLength(float length) - { - _CCarGen.perpendicularLength = length; - float hlen = length * 0.5f; - - BBMin = new Vector3(-hlen); - BBMax = new Vector3(hlen); - } - - public string NameString() - { - MetaHash mh = _CCarGen.carModel; - if ((mh == 0) && (_CCarGen.popGroup != 0)) + foreach(var ent in AllEntities) { - mh = _CCarGen.popGroup; + var arch = gfc.GetArchetype(ent._CEntityDef.archetypeName); + ent.SetArchetype(arch); + if (ent.IsMlo) + ent.MloInstance.InitYmapEntityArchetypes(gfc); } - return mh.ToString(); } - - public override string ToString() + if (GrassInstanceBatches != null && GrassInstanceBatches.Length > 0) { - return _CCarGen.carModel.ToString() + ", " + Position.ToString() + ", " + _CCarGen.popGroup.ToString() + ", " + _CCarGen.livery.ToString(); - } - } - - - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapOccludeModel : BasePathData - { - public OccludeModel _OccludeModel; - - public OccludeModel OccludeModel { get { return _OccludeModel; } set { _OccludeModel = value; } } - - public YmapFile Ymap { get; set; } - - public byte[] Data { get; set; } - private int vertexCount; - private int indicesOffset { get => vertexCount * 12; } - public Span Vertices { get => MetaTypes.ConvertDataArray(Data, 0, vertexCount); } - public Span Indices { get => Data.AsSpan(indicesOffset); } - public int Index { get; set; } - - public YmapOccludeModelTriangle[] Triangles { get; set; } - public TriangleBVH BVH { get; set; } - - public FlagsUint Flags - { - get + foreach(var batch in GrassInstanceBatches) { - return _OccludeModel.flags; - } - set - { - _OccludeModel.flags = value; + batch.Archetype = gfc.GetArchetype(batch.Batch.archetypeName); } } - public YmapOccludeModel(YmapFile ymap, OccludeModel model) + if (TimeCycleModifiers != null && TimeCycleModifiers.Length > 0) { - Ymap = ymap; - _OccludeModel = model; - } - - - public void Load(Meta meta) - { - var vptr = _OccludeModel.verts; - var dataSize = _OccludeModel.dataSize; - var indicesOffset = _OccludeModel.numVertsInBytes; - vertexCount = indicesOffset / 12; - var indexCount = (int)(dataSize - indicesOffset);// / 4; - Data = MetaTypes.GetByteArray(meta, vptr, dataSize); - //Vertices = MetaTypes.ConvertDataArray(Data, 0, vertexCount).ToArray(); - //Indices = new byte[indexCount]; - //Buffer.BlockCopy(Data, indicesOffset, Indices, 0, indexCount); - BuildTriangles(); - } - - - public void BuildTriangles() - { - if ((Vertices == null) || (Indices == null)) + foreach(var tcm in TimeCycleModifiers) { - Triangles = null; - return; - } - var tris = new List(); - for (int i = 0; i < Indices.Length; i += 3) - { - var tri = new YmapOccludeModelTriangle(this, Vertices[Indices[i]], Vertices[Indices[i+1]], Vertices[Indices[i+2]], tris.Count); - tris.Add(tri); - } - Triangles = tris.ToArray(); - } - public void BuildBVH() - { - if (Triangles == null) - { - BVH = null; - return; - } - - BVH = new TriangleBVH(Triangles); - - } - public void BuildVertices() - { - //create vertices and indices arrays from Triangles - if (Triangles == null) - { - return; - } - - - - var vdict = new Dictionary(); - var verts = new List(); - var inds = new List(); - byte ensureVert(Vector3 v) - { - if (vdict.TryGetValue(v, out byte b)) + World.TimecycleMod wtcm; + if (gfc.TimeCycleModsDict.TryGetValue(tcm.CTimeCycleModifier.name.Hash, out wtcm)) { - return b; + tcm.TimeCycleModData = wtcm; } - if (verts.Count > 255) - { - return 0; - } - var i = (byte)verts.Count; - vdict[v] = i; - verts.Add(v); - return i; } - for (int i = 0; i < Triangles.Length; i++) - { - var tri = Triangles[i]; - inds.Add(ensureVert(tri.Corner1)); - inds.Add(ensureVert(tri.Corner2)); - inds.Add(ensureVert(tri.Corner3)); - } - - var newVertsSize = Vector3.SizeInBytes * verts.Count; - var newIndicesSize = Marshal.SizeOf() * inds.Count; - - if (newVertsSize + newIndicesSize != Data.Length) - { - Data = new byte[newVertsSize + newIndicesSize]; - } - vertexCount = verts.Count; - for (int i = 0; i < verts.Count; i++) - { - Vertices[i] = verts[i]; - } - for (int i = 0; i < inds.Count; i++) - { - Indices[i] = inds[i]; - } - } - public void BuildData() - { - //create Data from vertices and indices arrays - if (Vertices == null) return; - if (Indices == null) return; - var dlen = (Vertices.Length * Vector3.SizeInBytes) + (Indices.Length * 1); - if (dlen != Data.Length) - { - throw new InvalidOperationException("Size mismatch in YmapOccludeModel BuildData"); - } - //var d = new byte[dlen]; - //var vbytes = MetaTypes.ConvertArrayToBytes(Vertices); - //var ibytes = Indices; - //Buffer.BlockCopy(vbytes, 0, d, 0, vbytes.Length); - //Buffer.BlockCopy(ibytes, 0, d, vbytes.Length, ibytes.Length); - //Data = d; - var min = new Vector3(float.MaxValue); - var max = new Vector3(float.MinValue); - for (int i = 0; i < Vertices.Length; i++) - { - min = Vector3.Min(min, Vertices[i]); - max = Vector3.Max(max, Vertices[i]); - } - _OccludeModel.bmin = min; - _OccludeModel.bmax = max; - _OccludeModel.Unused0 = min.X; - _OccludeModel.Unused1 = max.X; - _OccludeModel.dataSize = (uint)dlen; - _OccludeModel.numVertsInBytes = (ushort)(vertexCount * Vector3.SizeInBytes); - _OccludeModel.numTris = (ushort)((Indices.Length / 3) + 32768);//is this actually a flag lurking..? - //_OccludeModel.flags = ... } - public YmapOccludeModelTriangle RayIntersect(ref Ray ray, ref float hitdist) - { - if (Triangles == null) - { - BuildTriangles(); - BuildBVH(); - } - else if (BVH == null) - { - BuildBVH(); - } - if (BVH == null) return null; - return BVH.RayIntersect(ref ray, ref hitdist) as YmapOccludeModelTriangle; - } - - public EditorVertex[] GetTriangleVertices() - { - if ((Vertices == null) || (Indices == null)) return null; - EditorVertex[] res = new EditorVertex[Indices.Length];//changing from indexed to nonindexed triangle list - var colour = new Color4(1.0f, 0.0f, 0.0f, 0.8f); //todo: colours for occluders? - var colourval = (uint)colour.ToRgba(); - for (int i = 0; i < Indices.Length; i++) - { - res[i].Position = Vertices[Indices[i]]; - res[i].Colour = colourval; - } - return res; - } - public EditorVertex[] GetPathVertices() - { - return null; - } - public Vector4[] GetNodePositions() - { - return null; - } - - public override string ToString() - { - return Index.ToString() + ": " + Vertices.Length.ToString() + " vertices, " + (Triangles?.Length ?? 0).ToString() + " triangles"; - } } - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapOccludeModelTriangle : TriangleBVHItem + private static uint SetBit(uint value, int bit) { - public YmapOccludeModel Model { get; set; } - public YmapFile Ymap { get { return Model?.Ymap; } } - public int Index { get; set; } - - public YmapOccludeModelTriangle(YmapOccludeModel model, Vector3 v1, Vector3 v2, Vector3 v3, int i) - { - Model = model; - Corner1 = v1; - Corner2 = v2; - Corner3 = v3; - Index = i; - } - } - - [TypeConverter(typeof(ExpandableObjectConverter))] - public class YmapBoxOccluder : BasePathData - { - public BoxOccluder _Box; - public BoxOccluder Box { get { return _Box; } set { _Box = value; } } - - public YmapFile Ymap { get; set; } - - - public Vector3 Position { get; set; } - public Vector3 Size { get; set; } - public Vector3 BBMin { get; set; } - public Vector3 BBMax { get; set; } - public Quaternion Orientation { get; set; } - public int Index { get; set; } - - - - public YmapBoxOccluder(YmapFile ymap, BoxOccluder box) - { - Ymap = ymap; - _Box = box; - - Position = new Vector3(box.iCenterX, box.iCenterY, box.iCenterZ) / 4.0f; - Size = new Vector3(box.iLength, box.iWidth, box.iHeight) / 4.0f; - BBMin = Size * -0.5f; - BBMax = Size * 0.5f; - - float cosz = box.iCosZ / 32767.0f;// ((float)short.MaxValue) - float sinz = box.iSinZ / 32767.0f; - - float angl = (float)Math.Atan2(cosz, sinz); - Orientation = Quaternion.RotationYawPitchRoll(0.0f, 0.0f, angl); - - } - - public void UpdateBoxStruct() - { - _Box.iCenterX = (short)Math.Round(Position.X * 4.0f); - _Box.iCenterY = (short)Math.Round(Position.Y * 4.0f); - _Box.iCenterZ = (short)Math.Round(Position.Z * 4.0f); - _Box.iLength = (short)Math.Round(Size.X * 4.0f); - _Box.iWidth = (short)Math.Round(Size.Y * 4.0f); - _Box.iHeight = (short)Math.Round(Size.Z * 4.0f); - - var dir = Orientation.Multiply(Vector3.UnitX) * 0.5f; - _Box.iSinZ = (short)Math.Round(dir.X * 32767.0f); - _Box.iCosZ = (short)Math.Round(dir.Y * 32767.0f); - } - - - public void SetSize(Vector3 s) - { - Size = s; - BBMin = Size * -0.5f; - BBMax = Size * 0.5f; - } - - - public EditorVertex[] GetTriangleVertices() - { - Vector3 xform(float x, float y, float z) - { - return Orientation.Multiply(new Vector3(x, y, z)) + Position; - } - EditorVertex[] res = new EditorVertex[36]; - var colour = new Color4(0.0f, 0.0f, 1.0f, 0.8f); //todo: colours for occluders? - var c = (uint)colour.ToRgba(); - var s = Size * 0.5f; - var v0 = new EditorVertex() { Position = xform(-s.X, -s.Y, -s.Z), Colour = c }; - var v1 = new EditorVertex() { Position = xform(-s.X, -s.Y, +s.Z), Colour = c }; - var v2 = new EditorVertex() { Position = xform(-s.X, +s.Y, -s.Z), Colour = c }; - var v3 = new EditorVertex() { Position = xform(-s.X, +s.Y, +s.Z), Colour = c }; - var v4 = new EditorVertex() { Position = xform(+s.X, -s.Y, -s.Z), Colour = c }; - var v5 = new EditorVertex() { Position = xform(+s.X, -s.Y, +s.Z), Colour = c }; - var v6 = new EditorVertex() { Position = xform(+s.X, +s.Y, -s.Z), Colour = c }; - var v7 = new EditorVertex() { Position = xform(+s.X, +s.Y, +s.Z), Colour = c }; - res[00] = v0; res[01] = v1; res[02] = v2; res[03] = v2; res[04] = v1; res[05] = v3; - res[06] = v2; res[07] = v3; res[08] = v6; res[09] = v6; res[10] = v3; res[11] = v7; - res[12] = v1; res[13] = v5; res[14] = v3; res[15] = v3; res[16] = v5; res[17] = v7; - res[18] = v6; res[19] = v7; res[20] = v4; res[21] = v4; res[22] = v7; res[23] = v5; - res[24] = v4; res[25] = v5; res[26] = v0; res[27] = v0; res[28] = v5; res[29] = v1; - res[30] = v2; res[31] = v6; res[32] = v0; res[33] = v0; res[34] = v6; res[35] = v4; - return res; - } - public EditorVertex[] GetPathVertices() - { - return null; - } - public Vector4[] GetNodePositions() - { - return null; - } - - public override string ToString() - { - return Index.ToString() + ": " + FloatUtil.GetVector3String(Position); - } + return (value | (1u << bit)); } } + + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapEntityDef +{ + public Archetype Archetype { get; set; } //cached by GameFileCache on loading... + public Vector3 BBMin;//oriented archetype AABBmin + public Vector3 BBMax;//oriented archetype AABBmax + public Vector3 BBCenter; //oriented archetype AABB center + public Vector3 BBExtent; //oriented archetype AABB extent + public Vector3 BSCenter; //oriented archetype BS center + public float BSRadius;//cached from archetype + public float LodDist; + public float ChildLodDist; + + public CEntityDef _CEntityDef; + [TypeConverter(typeof(ExpandableObjectConverter))] + public ref CEntityDef CEntityDef => ref _CEntityDef; + + [TypeConverter(typeof(CollectionConverter))] + private List? ChildList { get; set; } + public YmapEntityDef[] Children { get; set; } + public YmapEntityDef[] ChildrenMerged { get; set; }// { get; set; } + + public Vector3 _Position; + public Vector3 Position { get => _Position; set => _Position = value; } + public Quaternion _Orientation; + public Quaternion Orientation { get => _Orientation; set => _Orientation = value; } + public Vector3 _Scale; + public Vector3 Scale { get => _Scale; set => _Scale = value; } + public bool IsMlo { get; set; } + public MloInstanceData MloInstance { get; set; } + public YmapEntityDef MloParent { get; set; } + public MloInstanceEntitySet MloEntitySet { get; set; } + public Vector3 MloRefPosition { get; set; } + public Quaternion MloRefOrientation { get; set; } + public MetaWrapper[] Extensions { get; set; } + + public int Index { get; set; } + + [NotifyParentProperty(true)] + public float Distance { get; set; } //used for rendering + public bool IsWithinLodDist { get; set; } //used for rendering + + [NotifyParentProperty(true)] + public bool ChildrenVisible { get; set; } //used for rendering + + [NotifyParentProperty(true)] + public bool ChildrenRendered { get; set; } //used when rendering ymap mode to reduce LOD flashing... + public YmapEntityDef Parent { get; set; } //for browsing convenience, also used/updated for rendering + public MetaHash ParentName { get; set; } //just for browsing convenience + + public YmapFile Ymap { get; set; } + + public Vector3 PivotPosition = Vector3.Zero; + public Quaternion PivotOrientation = Quaternion.Identity; + public Vector3 WidgetPosition = Vector3.Zero; + public Quaternion WidgetOrientation = Quaternion.Identity; + + public uint EntityHash { get; set; } = 0; //used by CW as a unique position+name identifier + + public LinkedList LodManagerChildren { get; set; } = null; + public object LodManagerRenderable = null; + + + public LightInstance[] Lights { get; set; } + //public uint[] LightHashTest { get; set; } + + public bool LodInParentYmap => ((_CEntityDef.flags >> 3) & 1) > 0; + + + public string Name => _CEntityDef.archetypeName.ToString(); + + + public YmapEntityDef() + { + Scale = Vector3.One; + Position = Vector3.One; + Orientation = Quaternion.Identity; + } + public YmapEntityDef(YmapFile ymap, int index, CEntityDef def) + { + Ymap = ymap; + Index = index; + _CEntityDef = def; + Scale = new Vector3(new Vector2(_CEntityDef.scaleXY), _CEntityDef.scaleZ); + Position = _CEntityDef.position; + Orientation = new Quaternion(_CEntityDef.rotation); + if (Orientation != Quaternion.Identity) + { + Orientation = Quaternion.Invert(Orientation); + } + IsMlo = false; + + UpdateWidgetPosition(); + UpdateWidgetOrientation(); + UpdateEntityHash(); + } + + public YmapEntityDef(YmapFile ymap, int index, CMloInstanceDef mlo) + { + Ymap = ymap; + Index = index; + _CEntityDef = mlo.CEntityDef; + Scale = new Vector3(new Vector2(_CEntityDef.scaleXY), _CEntityDef.scaleZ); + Position = _CEntityDef.position; + Orientation = new Quaternion(_CEntityDef.rotation); + //if (Orientation != Quaternion.Identity) + //{ + // Orientation = Quaternion.Invert(Orientation); + //} + IsMlo = true; + + MloInstance = new MloInstanceData(this, null);//is this necessary..? will get created in SetArchetype.. + MloInstance._Instance = mlo; + + UpdateWidgetPosition(); + UpdateWidgetOrientation(); + UpdateEntityHash(); + } + + + public void SetArchetype(Archetype arch) + { + Archetype = arch; + if (Archetype is null) + return; + + + UpdateBB(); + + if (Archetype.Type == MetaName.CMloArchetypeDef) + { + //transform interior entities into world space... + var mloa = Archetype as MloArchetype; + MloInstance = new MloInstanceData(this, mloa); + MloInstance._Instance = new CMloInstanceDef { CEntityDef = _CEntityDef }; + if (mloa != null) + { + if (!IsMlo) + { + IsMlo = true; + List mloEntities = Ymap.MloEntities.ToList(); + mloEntities.Add(this); + Ymap.MloEntities = mloEntities.ToArray(); + } + + MloInstance.CreateYmapEntities(); + } + + if (BSRadius == 0.0f) + { + BSRadius = LodDist;//need something so it doesn't get culled... + } + if (BBMin == BBMax) + { + BBMin = Position - BSRadius; + BBMax = Position + BSRadius;//it's not ideal + BBCenter = (BBMax + BBMin) * 0.5f; + BBExtent = (BBMax - BBMin) * 0.5f; + } + } + else if (IsMlo) // archetype is no longer an mlo + { + IsMlo = false; + MloInstance = null; + + if (Ymap.MloEntities.Length > 0) + { + List mloEntities = Ymap.MloEntities.ToList(); + if (mloEntities.Remove(this)) + { + Ymap.MloEntities = mloEntities.ToArray(); + } + } + } + } + + public void SetPosition(Vector3 pos) + { + Position = pos; + if (MloParent != null) + { + _CEntityDef.position = Quaternion.Normalize(Quaternion.Invert(MloParent.Orientation)).Multiply(pos - MloParent.Position); + MloRefPosition = _CEntityDef.position; + UpdateBB(); + UpdateMloArchetype(); + } + else + { + _CEntityDef.position = pos; + UpdateBB(); + } + + + if (MloInstance != null) + { + MloInstance.SetPosition(Position); + MloInstance.UpdateEntities(); + } + + UpdateEntityHash(); + UpdateWidgetPosition(); + } + + private void UpdateBB() + { + if (Archetype != null) + { + BSCenter = _Orientation.Multiply(Archetype.BSCenter) * Scale; + BSRadius = Archetype.BSRadius * Math.Max(Scale.X, Scale.Z); + if (_Orientation == Quaternion.Identity) + { + BBMin = (Vector3.Min(Archetype.BBMin, Archetype.BBMax) * _Scale) + _Position; + BBMax = (Vector3.Max(Archetype.BBMin, Archetype.BBMax) * _Scale) + _Position; + BBCenter = (BBMax + BBMin) * 0.5f; + BBExtent = (BBMax - BBMin) * 0.5f; + } + else + { + var mat = Matrix.Transformation(Vector3.Zero, Quaternion.Identity, _Scale, Vector3.Zero, _Orientation, _Position); + var matabs = mat; + matabs.Column1 = mat.Column1.Abs(); + matabs.Column2 = mat.Column2.Abs(); + matabs.Column3 = mat.Column3.Abs(); + matabs.Column4 = mat.Column4.Abs(); + var bbcenter = (Archetype.BBMax + Archetype.BBMin) * 0.5f; + var bbextent = (Archetype.BBMax - Archetype.BBMin) * 0.5f; + Vector3.TransformCoordinate(ref bbcenter, ref mat, out var ncenter); + var nextent = Vector3.TransformNormal(bbextent, matabs).Abs(); + BBCenter = ncenter; + BBExtent = nextent; + BBMin = ncenter - nextent; + BBMax = ncenter + nextent; + } + LodDist = _CEntityDef.lodDist; + if (LodDist <= 0) + { + LodDist = Archetype.LodDist; + } + ChildLodDist = _CEntityDef.childLodDist; + if (ChildLodDist < 0) + { + ChildLodDist = LodDist * 0.5f; + } + } + } + + public void UpdateEntityHash() + { + uint xhash = (uint)(Position.X * 100); + uint yhash = (uint)(Position.Y * 100); + uint zhash = (uint)(Position.Z * 100); + EntityHash = _CEntityDef.archetypeName.Hash ^ xhash ^ yhash ^ zhash & 0xffffffff; + } + + public void SetOrientation(Quaternion ori, bool inverse = false) + { + if (MloParent != null) + { + var mloInv = Quaternion.Normalize(Quaternion.Invert(MloParent.Orientation)); + Quaternion rel = Quaternion.Normalize(Quaternion.Multiply(mloInv, ori)); + Quaternion inv = Quaternion.Normalize(Quaternion.Invert(rel)); + Orientation = ori; + _CEntityDef.rotation = inv.ToVector4(); + } + else + { + Orientation = inverse ? Quaternion.Normalize(Quaternion.Invert(ori)) : ori; + if (MloInstance != null) + { + _CEntityDef.rotation = Orientation.ToVector4(); + } + else + { + Quaternion inv = inverse ? ori : Quaternion.Normalize(Quaternion.Invert(ori)); + _CEntityDef.rotation = inv.ToVector4(); + } + } + + if (MloInstance != null) + { + MloInstance.SetOrientation(ori); + MloInstance.UpdateEntities(); + } + + UpdateBB(); + UpdateWidgetPosition(); + UpdateWidgetOrientation(); + } + + public void SetScale(Vector3 s) + { + Scale = new Vector3(s.X, s.X, s.Z); + _CEntityDef.scaleXY = s.X; + _CEntityDef.scaleZ = s.Z; + + MloInstanceData mloInstance = MloParent?.MloInstance; + if (mloInstance != null) + { + var mcEntity = mloInstance.TryGetArchetypeEntity(this); + if (mcEntity != null) + { + mcEntity._Data.scaleXY = s.X; + mcEntity._Data.scaleZ = s.Z; + } + } + if (Archetype != null) + { + float smax = Math.Max(Scale.X, Scale.Z); + BSRadius = Archetype.BSRadius * smax; + } + + SetPosition(Position);//update the BB + } + + private void UpdateMloArchetype() + { + if (!(MloParent.Archetype is MloArchetype mloArchetype)) + return; + + MCEntityDef entity; + if ((MloEntitySet?.Entities != null) && (MloEntitySet?.EntitySet?.Entities != null)) + { + var idx = MloEntitySet.Entities.IndexOf(this); + if ((idx < 0) || (idx >= MloEntitySet.EntitySet.Entities.Length)) + return; + entity = MloEntitySet.EntitySet.Entities[idx]; + } + else + { + if (Index >= mloArchetype.entities.Length) + return; + entity = mloArchetype.entities[Index]; + } + + entity._Data.position = _CEntityDef.position; + entity._Data.rotation = _CEntityDef.rotation; + } + + + public void SetPivotPosition(Vector3 pos) + { + PivotPosition = pos; + + UpdateWidgetPosition(); + } + + public void SetPivotOrientation(Quaternion ori) + { + PivotOrientation = ori; + + UpdateWidgetOrientation(); + } + + + public void SetPositionFromWidget(Vector3 pos) + { + SetPosition(pos - Orientation.Multiply(in PivotPosition)); + } + public void SetOrientationFromWidget(Quaternion ori) + { + var newori = Quaternion.Normalize(Quaternion.Multiply(ori, Quaternion.Invert(PivotOrientation))); + var newpos = WidgetPosition - newori.Multiply(in PivotPosition); + SetOrientation(newori); + SetPosition(newpos); + } + public void SetPivotPositionFromWidget(Vector3 pos) + { + var orinv = Quaternion.Invert(Orientation); + SetPivotPosition(orinv.Multiply(pos - Position)); + } + public void SetPivotOrientationFromWidget(Quaternion ori) + { + var orinv = Quaternion.Invert(Orientation); + SetPivotOrientation(Quaternion.Multiply(orinv, ori)); + } + + + public void UpdateWidgetPosition() + { + WidgetPosition = Position + Orientation.Multiply(in PivotPosition); + } + public void UpdateWidgetOrientation() + { + WidgetOrientation = Quaternion.Multiply(Orientation, PivotOrientation); + } + + + public void AddChild(YmapEntityDef c) + { + ChildList ??= new List(); + c.Parent = this; + c.ParentName = _CEntityDef.archetypeName; + + ChildList.Add(c); + } + + public void ChildListToArray() + { + if (ChildList == null) return; + //if (Children == null) + //{ + Children = ChildList.ToArray(); + ChildrenMerged = Children;//include these by default in merged array + //} + //else + //{ + // List newc = new List(Children.Length + ChildList.Count); + // newc.AddRange(Children); + // newc.AddRange(ChildList); + // Children = newc.ToArray(); + //} + ChildList.Clear(); + ChildList = null; + } + public void ChildListToMergedArray() + { + if (ChildList is null) + return; + + if (ChildList.Count == 0) + { + ChildList = null; + return; + } + + if (ChildrenMerged is null) + { + ChildrenMerged = ChildList.ToArray(); + } + else + { + var newcArr = new YmapEntityDef[ChildrenMerged.Length + ChildList.Count]; + ChildrenMerged.CopyTo(newcArr, 0); + ChildList.CopyTo(newcArr, ChildrenMerged.Length); + ChildrenMerged = newcArr; + } + + ChildList.Clear(); + ChildList = null; + } + + + public void LodManagerAddChild(YmapEntityDef child) + { + LodManagerChildren ??= new LinkedList(); + LodManagerChildren.AddLast(child); + } + public void LodManagerRemoveChild(YmapEntityDef child) + { + LodManagerChildren?.Remove(child);//could improve this by caching the list node.... + } + + + public override string ToString() + { + return $"{_CEntityDef}{(ChildList is not null ? $" ({ChildList.Count} children)" : "")} {_CEntityDef.lodLevel}"; + } + + + + public void EnsureLights(DrawableBase db) + { + if (Lights is not null) + return; + if (Archetype is null) + return; + if (db == null) + return; + var skel = db.Skeleton; + LightAttributes[] lightAttrs = null; + Bounds b = null; + if (db is Drawable dd) + { + lightAttrs = dd.LightAttributes?.data_items; + b = dd.Bound; + } + else if (db is FragDrawable fd) + { + var frag = fd?.OwnerFragment; + skel = skel ?? frag?.Drawable?.Skeleton; + lightAttrs = frag?.LightAttributes?.data_items; + b = frag?.PhysicsLODGroup?.PhysicsLOD1?.Bound; + } + if (lightAttrs == null) return; + + Vector3.Min(ref Archetype.BBMin, ref db.BoundingBoxMin, out var abmin); + Vector3.Max(ref Archetype.BBMax, ref db.BoundingBoxMax, out var abmax); + if (b != null) + { + Vector3.Min(ref abmin, ref b.BoxMin, out abmin); + Vector3.Max(ref abmax, ref b.BoxMax, out abmax); + } + var bb = new BoundingBox(abmin, abmax).Transform(in _Position, in _Orientation, in _Scale); + var ints = new uint[7]; + ints[0] = (uint)(bb.Minimum.X * 10.0f); + ints[1] = (uint)(bb.Minimum.Y * 10.0f); + ints[2] = (uint)(bb.Minimum.Z * 10.0f); + ints[3] = (uint)(bb.Maximum.X * 10.0f); + ints[4] = (uint)(bb.Maximum.Y * 10.0f); + ints[5] = (uint)(bb.Maximum.Z * 10.0f); + + var bones = skel?.BonesMap; + var exts = Archetype.Extensions.Length;// + (Extensions?.Length ?? 0);//seems entity extensions aren't included in this + //todo: create extension light instances + + var lightInsts = new LightInstance[lightAttrs.Length]; + for (int i = 0; i < lightAttrs.Length; i++) + { + ints[6] = (uint)(exts + i); + var la = lightAttrs[i]; + + var xform = Matrix.Identity; + if ((bones != null) && (bones.TryGetValue(la.BoneId, out Bone bone))) + { + xform = bone.AbsTransform; + } + + var li = new LightInstance(); + li.Attributes = la; + li.Hash = ComputeLightHash(ints); + li.Position = Orientation.Multiply(xform.Multiply(la.Position)) + Position; + li.Direction = Orientation.Multiply(xform.MultiplyRot(la.Direction)); + lightInsts[i] = li; + } + Lights = lightInsts; + + //LightHashTest = new uint[25]; + //for (int i = 0; i < 25; i++) + //{ + // ints[6] = (uint)(i); + // LightHashTest[i] = ComputeLightHash(ints); + //} + + } + + + public static uint ComputeLightHash(uint[] ints, uint seed = 0) + { + var a2 = ints.Length; + var v3 = a2; + var v5 = (uint)(seed + 0xDEADBEEF + 4 * ints.Length); + var v6 = v5; + var v7 = v5; + + var c = 0; + for (var i = 0; i < (ints.Length - 4) / 3 + 1; i++, v3 -= 3, c += 3) + { + var v9 = ints[c + 2] + v5; + var v10 = ints[c + 1] + v6; + var v11 = ints[c] - v9; + var v13 = v10 + v9; + var v14 = (v7 + v11) ^ BitUtil.RotateLeft(v9, 4); + var v15 = v10 - v14; + var v17 = v13 + v14; + var v18 = v15 ^ BitUtil.RotateLeft(v14, 6); + var v19 = v13 - v18; + var v21 = v17 + v18; + var v22 = v19 ^ BitUtil.RotateLeft(v18, 8); + var v23 = v17 - v22; + var v25 = v21 + v22; + var v26 = v23 ^ BitUtil.RotateLeft(v22, 16); + var v27 = v21 - v26; + var v29 = v27 ^ BitUtil.RotateRight(v26, 13); + var v30 = v25 - v29; + v7 = v25 + v26; + v6 = v7 + v29; + v5 = v30 ^ BitUtil.RotateLeft(v29, 4); + } + + if (v3 == 3) + { + v5 += ints[c + 2]; + } + + if (v3 >= 2) + { + v6 += ints[c + 1]; + } + + if (v3 >= 1) + { + var v34 = (v6 ^ v5) - BitUtil.RotateLeft(v6, 14); + var v35 = (v34 ^ (v7 + ints[c])) - BitUtil.RotateLeft(v34, 11); + var v36 = (v35 ^ v6) - BitUtil.RotateRight(v35, 7); + var v37 = (v36 ^ v34) - BitUtil.RotateLeft(v36, 16); + var v38 = BitUtil.RotateLeft(v37, 4); + var v39 = (((v35 ^ v37) - v38) ^ v36) - BitUtil.RotateLeft((v35 ^ v37) - v38, 14); + return (v39 ^ v37) - BitUtil.RotateRight(v39, 8); + } + + return v5; + } + + + [TypeConverter(typeof(ExpandableObjectConverter))] + public class LightInstance + { + public LightAttributes Attributes { get; set; } //just for display purposes! + public uint Hash { get; set; } + public Vector3 Position { get; set; } + public Vector3 Direction { get; set; } + + public override string ToString() + { + return $"{Hash}: {Attributes.Type}"; + } + } +} + + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapGrassInstanceBatch +{ + private const float BatchVertMultiplier = 0.00001525878f; + + public Archetype Archetype { get; set; } //cached by GameFileCache on loading... + public rage__fwGrassInstanceListDef Batch; + public rage__fwGrassInstanceListDef__InstanceData[] Instances { get; set; } + public Vector3 Position { get; set; } //calculated from AABB + public float Radius { get; set; } //calculated from AABB + public Vector3 AABBMin; + public Vector3 AABBMax; + public Vector3 CamRel; //used for rendering... + public float Distance; //used for rendering + public YmapFile Ymap { get; set; } + + private BoundingBox[] grassBounds; // for brush + public bool BrushEnabled; // for brush + public float BrushRadius = 5f; // for brush + public bool HasChanged; // for brush and renderer + + // TODO: Make configurable. + const float BoundingSize = 0.3F; + static readonly Vector3 GrassMinMax = Vector3.One * BoundingSize; + + public override string ToString() + { + return Batch.ToString(); + } + + public void UpdateInstanceCount() + { + var b = Batch; + b.InstanceList = b.InstanceList with { Count1 = (ushort)Instances.Length }; + Batch = b; + } + + public bool IsPointBlockedByInstance(Vector3 point) + { + for (int i = 0; i < grassBounds.Length; i++) + { + if (grassBounds[i].Contains(ref point) == ContainmentType.Contains) + { + return true; + } + } + + return false; + } + + private void ReInitializeBoundingCache() + { + // cache is already initialized correctly. + if (grassBounds is not null && grassBounds.Length == Instances.Length) + return; + + // Clear the current bounding cache. + grassBounds = new BoundingBox[Instances.Length]; + + for (int i = 0; i < Instances.Length; i++) + { + var inst = Instances[i]; + // create bounding box for this instance. + var worldPos = GetGrassWorldPos(in inst.Position, new BoundingBox(AABBMin, AABBMax)); + var bb = new BoundingBox(worldPos - GrassMinMax, worldPos + GrassMinMax); + grassBounds[i] = bb; + } + } + + public bool EraseInstancesAtMouse( + YmapGrassInstanceBatch batch, + in SpaceRayIntersectResult mouseRay, + float radius) + { + rage__spdAABB batchAABB = batch.Batch.BatchAABB; + var oldInstanceBounds = new BoundingBox + ( + batchAABB.min.XYZ(), + batchAABB.max.XYZ() + ); + var deleteSphere = new BoundingSphere(mouseRay.Position, radius); + + // check each instance to see if it's in the delete sphere + // thankfully we've just avoided an O(n^2) op using this bounds stuff (doesn't mean it's super fast though, + // but it's not super slow either, even at like 50,000 instances) + var insList = new List(); + foreach (var instance in batch.Instances) + { + // get the world pos + var worldPos = GetGrassWorldPos(in instance.Position, in oldInstanceBounds); + + // create a boundary around the instance. + var instanceBounds = new BoundingBox(worldPos - GrassMinMax, worldPos + GrassMinMax); + + // check if the sphere contains the boundary. + var bb = new BoundingBox(instanceBounds.Minimum, instanceBounds.Maximum); + var ct = deleteSphere.Contains(ref bb); + if (ct == ContainmentType.Contains || ct == ContainmentType.Intersects) + { + //delInstances.Add(instance); // Add a copy of this instance + continue; + } + insList.Add(instance); + } + if (insList.Count == Instances.Length) + return false; + + var newBounds = GetNewGrassBounds(insList, oldInstanceBounds); + // recalc instances + RecalcBatch(newBounds, batch); + insList = RecalculateInstances(insList, oldInstanceBounds, newBounds); + batch.Instances = insList.ToArray(); + return true; + } + + public void CreateInstancesAtMouse( + YmapGrassInstanceBatch batch, + SpaceRayIntersectResult mouseRay, + float radius, + int amount, + Func spawnRayFunc, + Color color, + int ao, + int scale, + Vector3 pad, + bool randomScale) + { + + ReInitializeBoundingCache(); + var spawnPosition = mouseRay.Position; + var positions = new List(); + var normals = new List(); + + // Get rand positions. + GetSpawns(spawnPosition, spawnRayFunc, positions, normals, radius, amount); + if (positions.Count <= 0) + return; + + // get the instance list + var instances = + batch.Instances?.ToList() ?? new List(); + var batchAABB = batch.Batch.BatchAABB; + + // make sure to store the old instance bounds for the original + // grass instances + var oldInstanceBounds = new BoundingBox(batchAABB.min.XYZ(), batchAABB.max.XYZ()); + + if (positions.Count <= 0) + return; + + // Begin the spawn bounds. + var grassBound = new BoundingBox(positions[0] - GrassMinMax, positions[0] + GrassMinMax); + grassBound = EncapsulatePositions(positions, grassBound); + + // Calculate the new spawn bounds. + var newInstanceBounds = new BoundingBox(oldInstanceBounds.Minimum, oldInstanceBounds.Maximum); + newInstanceBounds = instances.Count > 0 + ? newInstanceBounds.Encapsulate(ref grassBound) + : new BoundingBox(grassBound.Minimum, grassBound.Maximum); + + // now we need to recalculate the position of each instance + instances = RecalculateInstances(instances, oldInstanceBounds, newInstanceBounds); + + // Add new instances at each spawn position with + // the parameters in the brush. + SpawnInstances(positions, normals, instances, newInstanceBounds, color, ao, scale, pad, randomScale); + + // then recalc the bounds of the grass batch + RecalcBatch(newInstanceBounds, batch); + + // Give back the new intsances + batch.Instances = instances.ToArray(); + grassBounds = Array.Empty(); + } + + // bhv approach recommended by dexy. + public YmapGrassInstanceBatch[] OptimizeInstances(YmapGrassInstanceBatch batch, float minRadius) + { + // this function will return an array of grass instance batches + // that are split up into sectors (groups) with a specific size. + // say for instance we have 30,000 instances spread across a large + // distance. We will split those instances into a grid-like group + // and return the groups as an array of batches. + var oldInstanceBounds = new BoundingBox(batch.Batch.BatchAABB.min.XYZ(), batch.Batch.BatchAABB.max.XYZ()); + + if (oldInstanceBounds.Radius() < minRadius) + { + return new [] { batch }; + } + + // Get our optimized grassInstances + var split = SplitGrassRecursive(batch.Instances.ToList(), oldInstanceBounds, minRadius); + + // Initiate a new batch list. + var newBatches = new List(); + + foreach (var grassList in split) + { + // Create a new batch + var newBatch = new YmapGrassInstanceBatch + { + Archetype = batch.Archetype, + Ymap = batch.Ymap + }; + + // Get the boundary of the grassInstances + var newInstanceBounds = GetNewGrassBounds(grassList, oldInstanceBounds); + + // Recalculate the batch boundaries. + RecalcBatch(newInstanceBounds, newBatch); + + var ins = RecalculateInstances(grassList, oldInstanceBounds, newInstanceBounds); + newBatch.Instances = ins.ToArray(); + newBatches.Add(newBatch); + } + + return newBatches.ToArray(); + } + + private List> SplitGrassRecursive( + IReadOnlyList grassInstances, + BoundingBox batchAABB, + float minRadius = 15F + ) + { + var ret = new List>(); + var oldPoints = SplitGrass(grassInstances, batchAABB); + while (true) + { + var stop = true; + var newPoints = new List>(); + foreach (var mb in oldPoints) + { + // for some reason we got a null group? + if (mb == null) + continue; + + // Get the bounds of the grassInstances list + var radius = GetNewGrassBounds(mb, batchAABB).Radius(); + + // check if the radius of the grassInstances + if (radius <= minRadius) + { + // this point list is within the minimum + // radius. + ret.Add(mb); + continue; // we don't need to continue. + } + + // since we're here let's keep going + stop = false; + + // split the grassInstances again + var s = SplitGrass(mb, batchAABB); + + // add it into the new grassInstances list. + newPoints.AddRange(s); + } + + // set the old grassInstances to the new grassInstances. + oldPoints = newPoints.ToArray(); + + // if we're done, and all grassInstances are within the desired size + // then end the loop. + if (stop) break; + } + return ret; + } + + private List[] SplitGrass( + IReadOnlyList points, + BoundingBox batchAABB) + { + var pointGroup = new List[2]; + + // Calculate the bounds of these grassInstances. + var m = GetNewGrassBounds(points, batchAABB); + + // Get the center and size + var mm = new Vector3 + { + X = Math.Abs(m.Minimum.X - m.Maximum.X), + Y = Math.Abs(m.Minimum.Y - m.Maximum.Y), + Z = Math.Abs(m.Minimum.Z - m.Maximum.Z) + }; + + // x is the greatest axis... + if (mm.X > mm.Y && mm.X > mm.Z) + { + // Calculate both boundaries. + var lhs = new BoundingBox(m.Minimum, m.Maximum - new Vector3(mm.X * 0.5F, 0, 0)); + var rhs = new BoundingBox(m.Minimum + new Vector3(mm.X * 0.5F, 0, 0), m.Maximum); + + // Set the grassInstances accordingly. + pointGroup[0] = points + .Where(p => lhs.Contains(GetGrassWorldPos(in p.Position, in batchAABB)) == ContainmentType.Contains).ToList(); + pointGroup[1] = points + .Where(p => rhs.Contains(GetGrassWorldPos(in p.Position, in batchAABB)) == ContainmentType.Contains).ToList(); + } + // y is the greatest axis... + else if (mm.Y > mm.X && mm.Y > mm.Z) + { + // Calculate both boundaries. + var lhs = new BoundingBox(m.Minimum, m.Maximum - new Vector3(0, mm.Y * 0.5F, 0)); + var rhs = new BoundingBox(m.Minimum + new Vector3(0, mm.Y * 0.5F, 0), m.Maximum); + + // Set the grassInstances accordingly. + pointGroup[0] = points + .Where(p => lhs.Contains(GetGrassWorldPos(in p.Position, in batchAABB)) == ContainmentType.Contains).ToList(); + pointGroup[1] = points + .Where(p => rhs.Contains(GetGrassWorldPos(in p.Position, in batchAABB)) == ContainmentType.Contains).ToList(); + } + // z is the greatest axis... + else if (mm.Z > mm.X && mm.Z > mm.Y) + { + // Calculate both boundaries. + var lhs = new BoundingBox(m.Minimum, m.Maximum - new Vector3(0, 0, mm.Z * 0.5F)); + var rhs = new BoundingBox(m.Minimum + new Vector3(0, 0, mm.Z * 0.5F), m.Maximum); + + // Set the grassInstances accordingly. + pointGroup[0] = points + .Where(p => lhs.Contains(GetGrassWorldPos(in p.Position, in batchAABB)) == ContainmentType.Contains).ToList(); + pointGroup[1] = points + .Where(p => rhs.Contains(GetGrassWorldPos(in p.Position, in batchAABB)) == ContainmentType.Contains).ToList(); + } + return pointGroup; + } + + private static BoundingBox GetNewGrassBounds(IReadOnlyList newGrass, BoundingBox oldAABB) + { + var grassPositions = newGrass.Select(x => GetGrassWorldPos(in x.Position, in oldAABB)).ToArray(); + var bounds = BoundingBox.FromPoints(grassPositions); + return bounds.Expand(1f); + } + + private void SpawnInstances( + IReadOnlyList positions, + IReadOnlyList normals, + ICollection instanceList, + BoundingBox instanceBounds, + Color color, + int ao, + int scale, + Vector3 pad, + bool randomScale) + { + for (var i = 0; i < positions.Count; i++) + { + var pos = positions[i]; + // create the new instance. + var newInstance = CreateNewInstance(normals[i], color, ao, scale, pad, randomScale); + + // get the grass position of the new instance and add it to the + // instance list + var grassPosition = GetGrassPos(in pos, in instanceBounds); + newInstance.Position = grassPosition; + instanceList.Add(newInstance); + } + } + + private rage__fwGrassInstanceListDef__InstanceData CreateNewInstance(in Vector3 normal, in Color color, int ao, int scale, in Vector3 pad, + bool randomScale = false) + { + //Vector3 pad = FloatUtil.ParseVector3String(PadTextBox.Text); + //int scale = (int)ScaleNumericUpDown.Value; + var rand = new Random(); + if (randomScale) + scale = rand.Next(scale / 2, scale); + var newInstance = new rage__fwGrassInstanceListDef__InstanceData + { + Ao = (byte)ao, + Scale = (byte)scale, + Color = new ArrayOfBytes3(color.R, color.G, color.B), + Pad = new ArrayOfBytes3((byte)pad.X,(byte)pad.Y, (byte)pad.Z), + NormalX = (byte)((normal.X + 1) * 0.5F * 255F), + NormalY = (byte)((normal.Y + 1) * 0.5F * 255F) + }; + return newInstance; + } + + private void RecalcBatch(in BoundingBox newInstanceBounds, YmapGrassInstanceBatch batch) + { + batch.AABBMax = newInstanceBounds.Maximum; + batch.AABBMin = newInstanceBounds.Minimum; + batch.Position = newInstanceBounds.Center(); + batch.Radius = newInstanceBounds.Radius(); + batch.Batch.BatchAABB = new rage__spdAABB(in newInstanceBounds.Minimum, in newInstanceBounds.Maximum); + } + + private void GetSpawns( + Vector3 origin, + Func spawnRayFunc, + List positions, + List normals, + float radius, + int resolution = 28) + { + var rand = new Random(); + for (var i = 0; i < resolution; i++) + { + var randX = (float)rand.NextDouble(-radius, radius); + var randY = (float)rand.NextDouble(-radius, radius); + if (Math.Abs(randX) > 0 && Math.Abs(randY) > 0) + { + randX *= .7071f; + randY *= .7071f; + } + var posOffset = origin + new Vector3(randX, randY, 2f); + var spaceRay = spawnRayFunc.Invoke(posOffset); + if (!spaceRay.Hit) + continue; + // not truly O(n^2) but may be slow... + // actually just did some testing, not slow at all. + if (IsPointBlockedByInstance(spaceRay.Position)) + continue; + normals.Add(spaceRay.Normal); + positions.Add(spaceRay.Position); + } + } + + private static List RecalculateInstances( + List instances, + BoundingBox oldInstanceBounds, + BoundingBox newInstanceBounds) + { + var refreshList = new List(); + foreach (var inst in instances) + { + // Copy instance + var copy = + new rage__fwGrassInstanceListDef__InstanceData + { + Position = inst.Position, + Ao = inst.Ao, + Color = inst.Color, + NormalX = inst.NormalX, + NormalY = inst.NormalY, + Pad = inst.Pad, + Scale = inst.Scale + }; + // get the position from where we would be in the old bounds, and move it to + // the position it needs to be in the new bounds. + var oldPos = GetGrassWorldPos(in copy.Position, in oldInstanceBounds); + //var oldPos = oldInstanceBounds.min + oldInstanceBounds.Size * (grassPos * BatchVertMultiplier); + copy.Position = GetGrassPos(in oldPos, in newInstanceBounds); + refreshList.Add(copy); + } + instances = refreshList.ToList(); + return instances; + } + + private static BoundingBox EncapsulatePositions(IEnumerable positions, BoundingBox bounds) + { + foreach (var pos in positions) + { + var posBounds = new BoundingBox(pos - (GrassMinMax + 0.1f), pos + (GrassMinMax + 0.1f)); + bounds = bounds.Encapsulate(ref posBounds); + } + return bounds; + } + + private static ArrayOfUshorts3 GetGrassPos(in Vector3 worldPos, in BoundingBox batchAABB) + { + var offset = worldPos - batchAABB.Minimum; + var size = batchAABB.Size(); + var percentage = + new Vector3( + offset.X / size.X, + offset.Y / size.Y, + offset.Z / size.Z + ); + var instancePos = percentage / BatchVertMultiplier; + return new ArrayOfUshorts3((ushort)instancePos.X, (ushort)instancePos.Y, (ushort)instancePos.Z); + } + + private static Vector3 GetGrassWorldPos(in ArrayOfUshorts3 grassPos, in BoundingBox batchAABB) + { + return batchAABB.Minimum + batchAABB.Size() * (grassPos.XYZ() * BatchVertMultiplier); + } +} + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapPropInstanceBatch +{ + public YmapFile Ymap { get; set; } + +} + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapDistantLODLights +{ + public CDistantLODLight CDistantLODLight; + public uint[] colours { get; set; } = Array.Empty(); + public MetaVECTOR3[] positions { get; set; } = Array.Empty(); + + public Vector3 BBMin; + public Vector3 BBMax; + public YmapFile Ymap { get; set; } + + public void CalcBB() + { + if (positions.Length > 0) + { + Vector3 min = new Vector3(float.MaxValue); + Vector3 max = new Vector3(float.MinValue); + + foreach(ref var position in positions.AsSpan()) + { + Vectors.Min(in min, in position, out min); + Vectors.Max(in max, in position, out max); + } + BBMin = min; + BBMax = max; + } + + } + + + public void RebuildFromLodLights(YmapLODLight[] lodlights) + { + var n = lodlights.Length; + if (n == 0) + return; + + colours = new uint[n]; + positions = new MetaVECTOR3[n]; + var nstreetlights = 0; + for (int i = 0; i < n; i++) + { + var ll = lodlights[i]; + colours[i] = (uint)(ll.Colour.ToBgra()); + positions[i] = new MetaVECTOR3(ll.Position); + if ((ll.StateFlags1 & 1) > 0) + { + nstreetlights++; + } + } + + var cdll = CDistantLODLight; + cdll.numStreetLights = (ushort)nstreetlights; + + CalcBB(); + } + + + public override string ToString() + { + if (Ymap != null) + { + return Ymap.ToString(); + } + return base.ToString(); + } +} + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapLODLights +{ + public CLODLight CLODLight { get; set; } + public MetaVECTOR3[] direction { get; set; } + public float[] falloff { get; set; } + public float[] falloffExponent { get; set; } + public uint[] timeAndStateFlags { get; set; } + public uint[] hash { get; set; } + public byte[] coneInnerAngle { get; set; } + public byte[] coneOuterAngleOrCapExt { get; set; } + public byte[] coronaIntensity { get; set; } + + public Vector3 BBMin { get; set; } + public Vector3 BBMax { get; set; } + public YmapFile Ymap { get; set; } + + public YmapLODLight[] LodLights { get; set; } + + public PathBVH BVH { get; set; } + + public void Init(YmapDistantLODLights parent) + { + if (parent == null) + return; + + BuildLodLights(parent); + CalcBB(); + BuildBVH(); + } + + public void BuildLodLights(YmapDistantLODLights parent) + { + var n = direction?.Length ?? 0; + n = Math.Min(n, parent.positions.Length); + n = Math.Min(n, parent.colours.Length); + n = Math.Min(n, falloff?.Length ?? 0); + n = Math.Min(n, falloffExponent?.Length ?? 0); + n = Math.Min(n, timeAndStateFlags?.Length ?? 0); + n = Math.Min(n, hash?.Length ?? 0); + n = Math.Min(n, coneInnerAngle?.Length ?? 0); + n = Math.Min(n, coneOuterAngleOrCapExt?.Length ?? 0); + n = Math.Min(n, coronaIntensity?.Length ?? 0); + if (n == 0) + return; + + LodLights = new YmapLODLight[n]; + for (int i = 0; i < n; i++) + { + var l = new YmapLODLight(); + l.Init(this, parent, i); + LodLights[i] = l; + } + } + + public void BuildBVH() + { + BVH = new PathBVH(LodLights, 10, 10); + } + + + public void CalcBB() + { + var positions = Ymap?.Parent?.DistantLODLights?.positions; + if (positions != null) + { + Vector3 min = new Vector3(float.MaxValue); + Vector3 max = new Vector3(float.MinValue); + foreach(ref var position in positions.AsSpan()) + { + Vectors.Min(in min, in position, out min); + Vectors.Max(in min, in position, out max); + } + BBMin = min; + BBMax = max; + } + else if (Ymap != null) + { + BBMin = Ymap._CMapData.entitiesExtentsMin; + BBMax = Ymap._CMapData.entitiesExtentsMax; + } + } + + public void RebuildFromLodLights() + { + var n = LodLights.Length; + if (n <= 0) + { + direction = null; + falloff = null; + falloffExponent = null; + timeAndStateFlags = null; + hash = null; + coneInnerAngle = null; + coneOuterAngleOrCapExt = null; + coronaIntensity = null; + } + else + { + direction = new MetaVECTOR3[n]; + falloff = new float[n]; + falloffExponent = new float[n]; + timeAndStateFlags = new uint[n]; + hash = new uint[n]; + coneInnerAngle = new byte[n]; + coneOuterAngleOrCapExt = new byte[n]; + coronaIntensity = new byte[n]; + + for (int i = 0; i < n; i++) + { + var ll = LodLights[i]; + direction[i] = new MetaVECTOR3(ll.Direction); + falloff[i] = ll.Falloff; + falloffExponent[i] = ll.FalloffExponent; + timeAndStateFlags[i] = ll.TimeAndStateFlags; + hash[i] = ll.Hash; + coneInnerAngle[i] = ll.ConeInnerAngle; + coneOuterAngleOrCapExt[i] = ll.ConeOuterAngleOrCapExt; + coronaIntensity[i] = ll.CoronaIntensity; + } + } + + } + + + public override string ToString() + { + if (Ymap != null) + { + return Ymap.ToString(); + } + return base.ToString(); + } +} + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapLODLight : BasePathNode +{ + public YmapFile? Ymap => LodLights?.Ymap ?? DistLodLights?.Ymap; + public YmapLODLights LodLights { get; set; } + public YmapDistantLODLights DistLodLights { get; set; } + public int Index { get; set; } + public Color Colour; + public Vector3 _Position; + public ref Vector3 Position => ref _Position; + public Vector3 Direction; + public float Falloff { get; set; } + public float FalloffExponent { get; set; } + public uint TimeAndStateFlags { get; set; } + public uint Hash { get; set; } + public byte ConeInnerAngle { get; set; } + public byte ConeOuterAngleOrCapExt { get; set; } + public byte CoronaIntensity { get; set; } + + public Quaternion Orientation; + public Vector3 Scale; + + public Vector3 TangentX; + public Vector3 TangentY; + + public LightType Type + { + get => (LightType)((TimeAndStateFlags >> 26) & 7); + set => TimeAndStateFlags = (TimeAndStateFlags & 0xE3FFFFFF) + (((uint)value & 7) << 26); + } + public FlagsUint TimeFlags + { + get => TimeAndStateFlags & 0xFFFFFF; + set => TimeAndStateFlags = (TimeAndStateFlags & 0xFF000000) + (value & 0xFFFFFF); + } + public uint StateFlags1 + { + get => (TimeAndStateFlags >> 24) & 3; + set => TimeAndStateFlags = (TimeAndStateFlags & 0xFCFFFFFF) + ((value & 3) << 24); + } + public uint StateFlags2 + { + get => (TimeAndStateFlags >> 29) & 7; + set => TimeAndStateFlags = (TimeAndStateFlags & 0x1FFFFFFF) + ((value & 7) << 29); + } + + public bool Enabled { get; set; } = true; + + public bool Visible { get; set; } = true; + + public void Init(YmapLODLights l, YmapDistantLODLights p, int i) + { + LodLights = l; + DistLodLights = p; + Index = i; + + if (p.colours == null) return; + if ((i < 0) || (i >= p.colours.Length)) return; + + Colour = Color.FromBgra(p.colours[i]); + Position = p.positions[i].ToVector3(); + Direction = l.direction[i].ToVector3(); + Falloff = l.falloff[i]; + FalloffExponent = l.falloffExponent[i]; + TimeAndStateFlags = l.timeAndStateFlags[i]; + Hash = l.hash[i]; + ConeInnerAngle = l.coneInnerAngle[i]; + ConeOuterAngleOrCapExt = l.coneOuterAngleOrCapExt[i]; + CoronaIntensity = l.coronaIntensity[i]; + + UpdateTangentsAndOrientation(); + + Scale = new Vector3(Falloff); + } + + public void UpdateTangentsAndOrientation() + { + switch (Type) + { + default: + case LightType.Point: + TangentX = Vector3.UnitX; + TangentY = Vector3.UnitY; + Orientation = Quaternion.Identity; + break; + case LightType.Spot: + TangentX = Vector3.Normalize(Direction.GetPerpVec()); + TangentY = Vector3.Normalize(Vector3.Cross(Direction, TangentX)); + break; + case LightType.Capsule: + TangentX = -Vector3.Normalize(Direction.GetPerpVec()); + TangentY = Vector3.Normalize(Vector3.Cross(Direction, TangentX)); + break; + } + + if (Type == LightType.Point) + { + Orientation = Quaternion.Identity; + } + else + { + var m = new Matrix(); + m.Row1 = new Vector4(TangentX, 0); + m.Row2 = new Vector4(TangentY, 0); + m.Row3 = new Vector4(Direction, 0); + Orientation = Quaternion.RotationMatrix(m); + } + } + + public void SetColour(in Color c) + { + Colour = c; + + if (DistLodLights is not null && DistLodLights.colours.Length >= Index) + { + DistLodLights.colours[Index] = (uint)(c.ToBgra()); + } + + } + public void SetPosition(in Vector3 pos) + { + Position = pos; + + if (DistLodLights is not null && DistLodLights.positions.Length >= Index) + { + DistLodLights.positions[Index] = new MetaVECTOR3(pos); + } + + } + public void SetOrientation(in Quaternion ori) + { + Quaternion.Invert(ref Orientation, out var inv); + var delta = ori * inv; + TangentX = Vector3.Normalize(delta.Multiply(in TangentX)); + TangentY = Vector3.Normalize(delta.Multiply(in TangentY)); + Direction = Vector3.Normalize(delta.Multiply(in Direction)); + Orientation = ori; + } + public void SetScale(in Vector3 scale) + { + switch (Type) + { + case LightType.Point: + case LightType.Spot: + Falloff = scale.Z; + break; + case LightType.Capsule: + Falloff = scale.X; + ConeOuterAngleOrCapExt = (byte)Math.Min(255, Math.Max(0, Math.Round(Math.Max((uint)ConeOuterAngleOrCapExt, 2) * Math.Abs(scale.Z / Math.Max(Scale.Z, 0.01f)))));//lols + break; + } + Scale = scale; + } + + + + public void CopyFrom(YmapLODLight l) + { + Colour = l.Colour; + Position = l.Position; + Direction = l.Direction; + Falloff = l.Falloff; + FalloffExponent = l.FalloffExponent; + TimeAndStateFlags = l.TimeAndStateFlags; + Hash = l.Hash; + ConeInnerAngle = l.ConeInnerAngle; + ConeOuterAngleOrCapExt = l.ConeOuterAngleOrCapExt; + CoronaIntensity = l.CoronaIntensity; + + Orientation = l.Orientation; + Scale = l.Scale; + TangentX = l.TangentX; + TangentY = l.TangentY; + } + + + public override string ToString() + { + return $"{Index}: {Position}"; + } +} + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapTimeCycleModifier +{ + public CTimeCycleModifier CTimeCycleModifier; + public World.TimecycleMod TimeCycleModData { get; set; } + + public Vector3 BBMin; + public Vector3 BBMax; + + public YmapFile Ymap { get; set; } +} + + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapCarGen +{ + public CCarGen _CCarGen; + public CCarGen CCarGen { get => _CCarGen; set => _CCarGen = value; } + + public Vector3 Position; + public Quaternion Orientation; + public Vector3 BBMin; + public Vector3 BBMax; + + public YmapFile Ymap { get; set; } + + + public YmapCarGen(YmapFile ymap, CCarGen cargen) + { + float hlen = cargen.perpendicularLength * 0.5f; + Ymap = ymap; + CCarGen = cargen; + Position = cargen.position; + CalcOrientation(); + BBMin = new Vector3(-hlen); + BBMax = new Vector3(hlen); + } + + + public void CalcOrientation() + { + float angl = (float)Math.Atan2(_CCarGen.orientY, _CCarGen.orientX); + Orientation = Quaternion.RotationYawPitchRoll(0.0f, 0.0f, angl); + } + + public void SetPosition(in Vector3 pos) + { + Position = pos; + _CCarGen.position = pos; + } + public void SetOrientation(in Quaternion ori) + { + Orientation = ori; + + float len = Math.Max(_CCarGen.perpendicularLength * 1.5f, 5.0f); + Vector3 v = new Vector3(len, 0, 0); + Vector3 t = ori.Multiply(in v); + + _CCarGen.orientX = t.X; + _CCarGen.orientY = t.Y; + } + public void SetScale(in Vector3 scale) + { + float s = scale.X; + float hlen = s * 0.5f; + _CCarGen.perpendicularLength = s; + + BBMin = new Vector3(-hlen); + BBMax = new Vector3(hlen); + } + + public void SetLength(float length) + { + _CCarGen.perpendicularLength = length; + float hlen = length * 0.5f; + + BBMin = new Vector3(-hlen); + BBMax = new Vector3(hlen); + } + + public string NameString() + { + MetaHash mh = _CCarGen.carModel; + if ((mh == 0) && (_CCarGen.popGroup != 0)) + { + mh = _CCarGen.popGroup; + } + return mh.ToString(); + } + + public override string ToString() + { + return $"{_CCarGen.carModel}, {Position}, {_CCarGen.popGroup}, {_CCarGen.livery}"; + } +} + + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapOccludeModel : BasePathData +{ + public OccludeModel _OccludeModel; + + public OccludeModel OccludeModel { get => _OccludeModel; set => _OccludeModel = value; } + + public YmapFile Ymap { get; set; } + + public byte[]? Data { get; set; } + private int vertexCount; + private int indicesOffset => vertexCount * 12; + [NotNullIfNotNull(nameof(Data))] + public Span Vertices => Data is not null ? MetaTypes.ConvertDataArray(Data, 0, vertexCount) : Span.Empty; + [NotNullIfNotNull(nameof(Data))] + public Span Indices => Data is not null ? Data.AsSpan(indicesOffset) : Span.Empty; + public int Index { get; set; } + + public YmapOccludeModelTriangle[]? Triangles { get; set; } + public TriangleBVH? BVH { get; set; } + + public FlagsUint Flags + { + get => _OccludeModel.flags; + set => _OccludeModel.flags = value; + } + + public YmapOccludeModel(YmapFile ymap, OccludeModel model) + { + Ymap = ymap; + _OccludeModel = model; + } + + + public void Load(Meta meta) + { + var vptr = _OccludeModel.verts; + var dataSize = _OccludeModel.dataSize; + var indicesOffset = _OccludeModel.numVertsInBytes; + vertexCount = indicesOffset / 12; + Data = MetaTypes.GetByteArray(meta, in vptr, dataSize); + BuildTriangles(); + } + + + public void BuildTriangles() + { + if (Data is null) + { + Triangles = null; + return; + } + using var tris = new PooledList(); + for (int i = 0; i < Indices.Length; i += 3) + { + var tri = new YmapOccludeModelTriangle(this, Vertices[Indices[i]], Vertices[Indices[i+1]], Vertices[Indices[i+2]], tris.Count); + tris.Add(tri); + } + Triangles = tris.ToArray(); + } + public void BuildBVH() + { + if (Triangles is null) + { + BVH = null; + return; + } + + BVH = new TriangleBVH(Triangles); + + } + public void BuildVertices() + { + //create vertices and indices arrays from Triangles + if (Triangles is null) + { + return; + } + + + + var vdict = new Dictionary(); + var verts = new List(); + var inds = new List(); + byte ensureVert(in Vector3 v) + { + ref var b = ref CollectionsMarshal.GetValueRefOrAddDefault(vdict, v, out var exists); + if (exists) + { + return b; + } + if (verts.Count > 255) + { + return 0; + } + var i = (byte)verts.Count; + b = i; + verts.Add(v); + return i; + } + foreach(var tri in Triangles.AsSpan()) + { + inds.Add(ensureVert(tri.Corner1)); + inds.Add(ensureVert(tri.Corner2)); + inds.Add(ensureVert(tri.Corner3)); + } + + var newVertsSize = Vector3.SizeInBytes * verts.Count; + var newIndicesSize = Marshal.SizeOf() * inds.Count; + + if (newVertsSize + newIndicesSize != Data.Length) + { + Data = new byte[newVertsSize + newIndicesSize]; + } + vertexCount = verts.Count; + var _verts = verts.AsSpan(); + for (int i = 0; i < _verts.Length; i++) + { + Vertices[i] = _verts[i]; + } + var _inds = inds.AsSpan(); + for (int i = 0; i < _inds.Length; i++) + { + Indices[i] = _inds[i]; + } + } + public void BuildData() + { + //create Data from vertices and indices arrays + if (Data is null) + return; + var dlen = (Vertices.Length * Vector3.SizeInBytes) + (Indices.Length * 1); + if (dlen != Data.Length) + { + throw new InvalidOperationException("Size mismatch in YmapOccludeModel BuildData"); + } + //var d = new byte[dlen]; + //var vbytes = MetaTypes.ConvertArrayToBytes(Vertices); + //var ibytes = Indices; + //Buffer.BlockCopy(vbytes, 0, d, 0, vbytes.Length); + //Buffer.BlockCopy(ibytes, 0, d, vbytes.Length, ibytes.Length); + //Data = d; + var min = new Vector3(float.MaxValue); + var max = new Vector3(float.MinValue); + for (int i = 0; i < Vertices.Length; i++) + { + Vector3.Min(ref min, ref Vertices[i], out min); + Vector3.Max(ref max, ref Vertices[i], out max); + } + _OccludeModel.bmin = min; + _OccludeModel.bmax = max; + _OccludeModel.Unused0 = min.X; + _OccludeModel.Unused1 = max.X; + _OccludeModel.dataSize = (uint)dlen; + _OccludeModel.numVertsInBytes = (ushort)(vertexCount * Vector3.SizeInBytes); + _OccludeModel.numTris = (ushort)((Indices.Length / 3) + 32768);//is this actually a flag lurking..? + //_OccludeModel.flags = ... + } + + public YmapOccludeModelTriangle? RayIntersect(ref Ray ray, ref float hitdist) + { + if (Triangles is null) + { + BuildTriangles(); + BuildBVH(); + } + else if (BVH is null) + { + BuildBVH(); + } + + if (BVH is null) + return null; + return BVH.RayIntersect(ref ray, ref hitdist) as YmapOccludeModelTriangle; + } + + public EditorVertex[] GetTriangleVertices() + { + if (Data is null) + return Array.Empty(); + EditorVertex[] res = new EditorVertex[Indices.Length];//changing from indexed to nonindexed triangle list + var colour = new Color4(1.0f, 0.0f, 0.0f, 0.8f); //todo: colours for occluders? + var colourval = (uint)colour.ToRgba(); + for (int i = 0; i < Indices.Length; i++) + { + res[i].Position = Vertices[Indices[i]]; + res[i].Colour = colourval; + } + return res; + } + + public override string ToString() + { + return $"{Index}: {Vertices.Length} vertices, {Triangles?.Length ?? 0} triangles"; + } +} + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapOccludeModelTriangle : TriangleBVHItem +{ + public YmapOccludeModel Model { get; set; } + public YmapFile? Ymap => Model?.Ymap; + public int Index { get; set; } + + public YmapOccludeModelTriangle(YmapOccludeModel model, Vector3 v1, Vector3 v2, Vector3 v3, int i) + { + Model = model; + Corner1 = v1; + Corner2 = v2; + Corner3 = v3; + Index = i; + } +} + +[TypeConverter(typeof(ExpandableObjectConverter))] +public class YmapBoxOccluder : BasePathData +{ + public BoxOccluder _Box; + public ref BoxOccluder Box => ref _Box; + + public YmapFile Ymap { get; set; } + + + public Vector3 Position { get; set; } + public Vector3 Size { get; set; } + public Vector3 BBMin { get; set; } + public Vector3 BBMax { get; set; } + public Quaternion Orientation { get; set; } + public int Index { get; set; } + + + + public YmapBoxOccluder(YmapFile ymap, BoxOccluder box) + { + Ymap = ymap; + _Box = box; + + Position = new Vector3(box.iCenterX, box.iCenterY, box.iCenterZ) / 4.0f; + Size = new Vector3(box.iLength, box.iWidth, box.iHeight) / 4.0f; + BBMin = Size * -0.5f; + BBMax = Size * 0.5f; + + float cosz = box.iCosZ / 32767.0f;// ((float)short.MaxValue) + float sinz = box.iSinZ / 32767.0f; + + float angl = (float)Math.Atan2(cosz, sinz); + Orientation = Quaternion.RotationYawPitchRoll(0.0f, 0.0f, angl); + + } + + public void UpdateBoxStruct() + { + _Box.iCenterX = (short)Math.Round(Position.X * 4.0f); + _Box.iCenterY = (short)Math.Round(Position.Y * 4.0f); + _Box.iCenterZ = (short)Math.Round(Position.Z * 4.0f); + _Box.iLength = (short)Math.Round(Size.X * 4.0f); + _Box.iWidth = (short)Math.Round(Size.Y * 4.0f); + _Box.iHeight = (short)Math.Round(Size.Z * 4.0f); + + var dir = Orientation.Multiply(in Vector3.UnitX) * 0.5f; + _Box.iSinZ = (short)Math.Round(dir.X * 32767.0f); + _Box.iCosZ = (short)Math.Round(dir.Y * 32767.0f); + } + + + public void SetSize(Vector3 s) + { + Size = s; + BBMin = Size * -0.5f; + BBMax = Size * 0.5f; + } + + + public EditorVertex[] GetTriangleVertices() + { + Vector3 xform(float x, float y, float z) + { + return Orientation.Multiply(new Vector3(x, y, z)) + Position; + } + EditorVertex[] res = new EditorVertex[36]; + var colour = new Color4(0.0f, 0.0f, 1.0f, 0.8f); //todo: colours for occluders? + var c = (uint)colour.ToRgba(); + var s = Size * 0.5f; + var v0 = new EditorVertex(xform(-s.X, -s.Y, -s.Z), c); + var v1 = new EditorVertex(xform(-s.X, -s.Y, +s.Z), c); + var v2 = new EditorVertex(xform(-s.X, +s.Y, -s.Z), c); + var v3 = new EditorVertex(xform(-s.X, +s.Y, +s.Z), c); + var v4 = new EditorVertex(xform(+s.X, -s.Y, -s.Z), c); + var v5 = new EditorVertex(xform(+s.X, -s.Y, +s.Z), c); + var v6 = new EditorVertex(xform(+s.X, +s.Y, -s.Z), c); + var v7 = new EditorVertex(xform(+s.X, +s.Y, +s.Z), c); + res[00] = v0; res[01] = v1; res[02] = v2; res[03] = v2; res[04] = v1; res[05] = v3; + res[06] = v2; res[07] = v3; res[08] = v6; res[09] = v6; res[10] = v3; res[11] = v7; + res[12] = v1; res[13] = v5; res[14] = v3; res[15] = v3; res[16] = v5; res[17] = v7; + res[18] = v6; res[19] = v7; res[20] = v4; res[21] = v4; res[22] = v7; res[23] = v5; + res[24] = v4; res[25] = v5; res[26] = v0; res[27] = v0; res[28] = v5; res[29] = v1; + res[30] = v2; res[31] = v6; res[32] = v0; res[33] = v0; res[34] = v6; res[35] = v4; + return res; + } + + public override string ToString() + { + return $"{Index}: {FloatUtil.GetVector3String(Position)}"; + } +} diff --git a/CodeWalker.Core/GameFiles/FileTypes/YmfFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YmfFile.cs index ff34af6..4b780c1 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YmfFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YmfFile.cs @@ -10,31 +10,29 @@ namespace CodeWalker.GameFiles { public class YmfFile : PackedFile { - public RpfFileEntry FileEntry { get; set; } + public RpfFileEntry? FileEntry { get; set; } - public Meta Meta { get; set; } - public PsoFile Pso { get; set; } - public RbfFile Rbf { get; set; } + public Meta? Meta { get; set; } + public PsoFile? Pso { get; set; } + public RbfFile? Rbf { get; set; } - public YmfMapDataGroup[] MapDataGroups { get; set; } - public CImapDependency[] imapDependencies { get; set; } - public YmfImapDependency2[] imapDependencies2 { get; set; } - public YmfItypDependency2[] itypDependencies2 { get; set; } - public CHDTxdAssetBinding[] HDTxdAssetBindings { get; set; } - public YmfInterior[] Interiors { get; set; } + public YmfMapDataGroup[] MapDataGroups { get; set; } = Array.Empty(); + public CImapDependency[] imapDependencies { get; set; } = Array.Empty(); + public YmfImapDependency2[] imapDependencies2 { get; set; } = Array.Empty(); + public YmfItypDependency2[] itypDependencies2 { get; set; } = Array.Empty(); + public CHDTxdAssetBinding[] HDTxdAssetBindings { get; set; } = Array.Empty(); + public YmfInterior[] Interiors { get; set; } = Array.Empty(); public void Load(byte[] data, RpfFileEntry entry) { FileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - MemoryStream ms = new MemoryStream(data); - if (RbfFile.IsRBF(ms)) + if (RbfFile.IsRBF(data.AsSpan(0, 4))) { Rbf = new RbfFile(); - Rbf.Load(ms); + Rbf.Load(data); //x64j.rpf\\levels\\gta5\\_citye\\indust_01\\id1_props.rpf\\_manifest.ymf //x64j.rpf\\levels\\gta5\\_citye\\indust_02\\id2_props.rpf\\_manifest.ymf @@ -43,10 +41,10 @@ namespace CodeWalker.GameFiles return; } - if (PsoFile.IsPSO(ms)) + if (PsoFile.IsPSO(data.AsSpan(0, 4))) { Pso = new PsoFile(); - Pso.Load(ms); + Pso.Load(data); //PsoTypes.EnsurePsoTypes(Pso); @@ -56,21 +54,14 @@ namespace CodeWalker.GameFiles } else { - + Console.WriteLine("Neither"); } return; } - else - { }//doesn't get here - - - - using var rd = new ResourceDataReader(resentry, data); Meta = rd.ReadBlock(); - } @@ -81,22 +72,22 @@ namespace CodeWalker.GameFiles //for TIMED YMAP stuff!!!! //check CMapDataGroup.HoursOnOff + ArgumentNullException.ThrowIfNull(Pso, nameof(Pso)); + var d = PsoTypes.GetRootItem(Pso); - MapDataGroups = PsoTypes.GetObjectArray(Pso, d.MapDataGroups); + MapDataGroups = PsoTypes.GetObjectArray(Pso, in d._MapDataGroups) ?? Array.Empty(); - imapDependencies = PsoTypes.GetItemArray(Pso, d.imapDependencies).ToArray(); + imapDependencies = PsoTypes.GetItemArray(Pso, in d._imapDependencies)?.ToArray() ?? Array.Empty(); - imapDependencies2 = PsoTypes.GetObjectArray(Pso, d.imapDependencies_2); + imapDependencies2 = PsoTypes.GetObjectArray(Pso, in d._imapDependencies_2) ?? Array.Empty(); - itypDependencies2 = PsoTypes.GetObjectArray(Pso, d.itypDependencies_2); - - HDTxdAssetBindings = PsoTypes.GetItemArray(Pso, d.HDTxdBindingArray).ToArray(); - - Interiors = PsoTypes.GetObjectArray(Pso, d.Interiors); + itypDependencies2 = PsoTypes.GetObjectArray(Pso, in d._itypDependencies_2) ?? Array.Empty(); + HDTxdAssetBindings = PsoTypes.GetItemArray(Pso, in d._HDTxdBindingArray)?.ToArray() ?? Array.Empty(); + Interiors = PsoTypes.GetObjectArray(Pso, in d._Interiors) ?? Array.Empty(); } @@ -109,8 +100,8 @@ namespace CodeWalker.GameFiles [TypeConverter(typeof(ExpandableObjectConverter))] public class YmfMapDataGroup : PsoClass { public CMapDataGroup DataGroup { get; set; } //ymap name - public MetaHash[] Bounds { get; set; } - public MetaHash[] WeatherTypes { get; set; } + public MetaHash[] Bounds { get; set; } = Array.Empty(); + public MetaHash[] WeatherTypes { get; set; } = Array.Empty(); public MetaHash Name { get; set; } public ushort Flags { get; set; } public uint HoursOnOff { get; set; } @@ -120,11 +111,11 @@ namespace CodeWalker.GameFiles return DataGroup.ToString(); } - public override void Init(PsoFile pso, ref CMapDataGroup v) + public override void Init(PsoFile pso, in CMapDataGroup v) { DataGroup = v; - Bounds = PsoTypes.GetHashArray(pso, v.Bounds); - WeatherTypes = PsoTypes.GetHashArray(pso, v.WeatherTypes); + Bounds = PsoTypes.GetHashArray(pso, v.Bounds) ?? Array.Empty(); + WeatherTypes = PsoTypes.GetHashArray(pso, v.WeatherTypes) ?? Array.Empty(); Name = v.Name; Flags = v.Flags; HoursOnOff = v.HoursOnOff; @@ -136,7 +127,7 @@ namespace CodeWalker.GameFiles public CImapDependencies Dep { get; set; } public MetaHash[] itypDepArray { get; set; }//ybn hashes? - public override void Init(PsoFile pso, ref CImapDependencies v) + public override void Init(PsoFile pso, in CImapDependencies v) { Dep = v; itypDepArray = PsoTypes.GetHashArray(pso, v.itypDepArray); @@ -153,7 +144,7 @@ namespace CodeWalker.GameFiles public CItypDependencies Dep { get; set; } public MetaHash[] itypDepArray { get; set; }//ytyp hashes? - public override void Init(PsoFile pso, ref CItypDependencies v) + public override void Init(PsoFile pso, in CItypDependencies v) { Dep = v; itypDepArray = PsoTypes.GetHashArray(pso, v.itypDepArray); @@ -170,15 +161,12 @@ namespace CodeWalker.GameFiles public CInteriorBoundsFiles Interior { get; set; } public MetaHash[] Bounds { get; set; }//ybn hashes? - public override string ToString() - { - return Interior.ToString(); - } + public override string ToString() => Interior.ToString(); - public override void Init(PsoFile pso, ref CInteriorBoundsFiles v) + public override void Init(PsoFile pso, in CInteriorBoundsFiles v) { Interior = v; - Bounds = PsoTypes.GetHashArray(pso, v.Bounds); + Bounds = PsoTypes.GetHashArray(pso, in v._Bounds); } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/YmtFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YmtFile.cs index bd92886..9bc85c9 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YmtFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YmtFile.cs @@ -59,8 +59,7 @@ namespace CodeWalker.GameFiles FilePath = Name; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry != null) + if (entry is RpfResourceFileEntry resentry) { using var rd = new ResourceDataReader(resentry, data); @@ -80,12 +79,10 @@ namespace CodeWalker.GameFiles } - MemoryStream ms = new MemoryStream(data); - - if (RbfFile.IsRBF(ms)) + if (RbfFile.IsRBF(data.AsSpan(0, 4))) { Rbf = new RbfFile(); - var rbfstruct = Rbf.Load(ms); + var rbfstruct = Rbf.Load(data); if (rbfstruct.Name == "CMapParentTxds") { @@ -97,30 +94,24 @@ namespace CodeWalker.GameFiles Loaded = true; return; } - if (PsoFile.IsPSO(ms)) + else if (PsoFile.IsPSO(data.AsSpan(0, 4))) { Pso = new PsoFile(); - Pso.Load(ms); + Pso.Load(data); //PsoTypes.EnsurePsoTypes(Pso); var root = PsoTypes.GetRootEntry(Pso); - if (root != null) + + if (root.NameHash == MetaName.CScenarioPointManifest) { - if (root.NameHash == MetaName.CScenarioPointManifest) - { - LoadScenarioPointManifest(Pso); - } + LoadScenarioPointManifest(Pso); } Loaded = true; return; } - else - { - - } @@ -134,29 +125,29 @@ namespace CodeWalker.GameFiles ContentType = YmtFileContentType.MapParentTxds; CMapParentTxds = new Dictionary(); + + if (rbfstruct.Children is null || rbfstruct.Children.Count == 0) + return; + //StringBuilder sblist = new StringBuilder(); foreach(var child in rbfstruct.Children) { - var childstruct = child as RbfStructure; - if ((childstruct != null) && (childstruct.Name == "txdRelationships")) + if (child is RbfStructure childstruct && childstruct.Name == "txdRelationships" && childstruct.Children is not null) { foreach (var txdrel in childstruct.Children) { - var txdrelstruct = txdrel as RbfStructure; - if ((txdrelstruct != null) && (txdrelstruct.Name == "item")) + if (txdrel is RbfStructure txdrelstruct && txdrelstruct.Name == "item" && txdrelstruct.Children is not null) { string parentstr = string.Empty; string childstr = string.Empty; - foreach(var item in txdrelstruct.Children) + foreach (var item in txdrelstruct.Children) { - var itemstruct = item as RbfStructure; - if ((itemstruct != null)) + if (item is RbfStructure itemstruct) { - var strbytes = itemstruct.Children[0] as RbfBytes; string thisstr = string.Empty; - if (strbytes != null) + if (itemstruct.Children is not null && itemstruct.Children[0] is RbfBytes strbytes) { - thisstr = Encoding.ASCII.GetString(strbytes.Value).Replace("\0", ""); + thisstr = strbytes.GetNullTerminatedString(); } switch (item.Name) { @@ -170,15 +161,9 @@ namespace CodeWalker.GameFiles } } - if((!string.IsNullOrEmpty(parentstr)) && (!string.IsNullOrEmpty(childstr))) + if (!string.IsNullOrEmpty(parentstr) && !string.IsNullOrEmpty(childstr)) { - if (!CMapParentTxds.ContainsKey(childstr)) - { - CMapParentTxds.Add(childstr, parentstr); - } - else - { - } + _ = CMapParentTxds.TryAdd(childstr, parentstr); //sblist.AppendLine(childstr + ": " + parentstr); } } @@ -211,7 +196,7 @@ namespace CodeWalker.GameFiles CScenarioPointRegion = new MCScenarioPointRegion(); CScenarioPointRegion.Ymt = this; - CScenarioPointRegion.Load(meta, cdata); + CScenarioPointRegion.Load(meta, in cdata); ScenarioRegion = new ScenarioRegion(); @@ -225,33 +210,32 @@ namespace CodeWalker.GameFiles - public byte[] Save() + public byte[]? Save() { - switch (ContentType) + return ContentType switch { - case YmtFileContentType.MapParentTxds: return SaveMapParentTxds(); - case YmtFileContentType.ScenarioPointManifest: return SaveScenarioPointManifest(); - case YmtFileContentType.ScenarioPointRegion: return SaveScenarioPointRegion(); - } - - return null; + YmtFileContentType.MapParentTxds => SaveMapParentTxds(), + YmtFileContentType.ScenarioPointManifest => SaveScenarioPointManifest(), + YmtFileContentType.ScenarioPointRegion => SaveScenarioPointRegion(), + _ => null, + }; } - private byte[] SaveMapParentTxds() + private byte[]? SaveMapParentTxds() { return null; } - private byte[] SaveScenarioPointManifest() + private byte[]? SaveScenarioPointManifest() { return null; } - private byte[] SaveScenarioPointRegion() + private byte[]? SaveScenarioPointRegion() { - if (ScenarioRegion != null) + if (ScenarioRegion is not null) { return ScenarioRegion.Save(); } @@ -267,7 +251,7 @@ namespace CodeWalker.GameFiles private void LogSaveWarning(string w) { - if (SaveWarnings == null) SaveWarnings = new List(); + SaveWarnings ??= new List(); SaveWarnings.Add(w); } @@ -276,10 +260,7 @@ namespace CodeWalker.GameFiles - public override string ToString() - { - return RpfFileEntry.ToString(); - } + public override string? ToString() => RpfFileEntry?.ToString(); } @@ -300,10 +281,11 @@ namespace CodeWalker.GameFiles - [TypeConverter(typeof(ExpandableObjectConverter))] public class YmtScenarioPointManifest + [TypeConverter(typeof(ExpandableObjectConverter))] + public class YmtScenarioPointManifest { public CScenarioPointManifest _Data; - public CScenarioPointManifest Data { get { return _Data; } set { _Data = value; } } + public CScenarioPointManifest Data { get => _Data; init => _Data = value; } public CScenarioPointRegionDef[] RegionDefs { get; set; } public CScenarioPointGroup[] Groups { get; set; } @@ -312,10 +294,10 @@ namespace CodeWalker.GameFiles public void Load(PsoFile pso) { - Data = PsoTypes.GetRootItem(pso); - RegionDefs = PsoTypes.ConvertDataArray(pso, _Data.RegionDefs); - Groups = PsoTypes.ConvertDataArray(pso, _Data.Groups); - InteriorNames = PsoTypes.GetHashArray(pso, _Data.InteriorNames); + _Data = PsoTypes.GetRootItem(pso); + RegionDefs = PsoTypes.ConvertDataArray(pso, in _Data._RegionDefs); + Groups = PsoTypes.ConvertDataArray(pso, in _Data._Groups); + InteriorNames = PsoTypes.GetHashArray(pso, in _Data._InteriorNames); } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/YndFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YndFile.cs index 24b924d..8c61526 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YndFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YndFile.cs @@ -1,8 +1,10 @@ using CodeWalker.World; +using Collections.Pooled; using SharpDX; using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using System.Xml; @@ -18,9 +20,9 @@ namespace CodeWalker.GameFiles public YndLink[] Links { get; set; } public YndJunction[] Junctions { get; set; } - public EditorVertex[] LinkedVerts { get; set; }//populated by the space (needs to use grid of all ynd's!) - public EditorVertex[] TriangleVerts { get; set; } //used for junctions display - public Vector4[] NodePositions { get; set; } + public EditorVertex[] LinkedVerts { get; set; } = [];//populated by the space (needs to use grid of all ynd's!) + public EditorVertex[] TriangleVerts { get; set; } = []; //used for junctions display + public Vector4[] NodePositions { get; set; } = []; public Vector3 BBMin { get; set; } public Vector3 BBMax { get; set; } @@ -31,10 +33,7 @@ namespace CodeWalker.GameFiles public int AreaID { - get - { - return CellY * 32 + CellX; - } + get => CellY * 32 + CellX; set { CellX = value % 32; @@ -78,10 +77,10 @@ namespace CodeWalker.GameFiles Name = entry.Name; RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); @@ -219,9 +218,9 @@ namespace CodeWalker.GameFiles public void InitNodesFromDictionary() { - if (NodeDictionary != null) + if (NodeDictionary is not null) { - if (NodeDictionary.Nodes != null) + if (NodeDictionary.Nodes is not null) { var nodes = NodeDictionary.Nodes; Nodes = new YndNode[nodes.Length]; @@ -230,11 +229,9 @@ namespace CodeWalker.GameFiles var n = new YndNode(); n.Init(this, nodes[i]); Nodes[i] = n; - if (n.NodeID != i) - { } //never hit here - nodeid's have to match the index! } } - if ((NodeDictionary.JunctionRefs != null) && (NodeDictionary.Junctions != null)) + if (NodeDictionary.JunctionRefs is not null && NodeDictionary.Junctions is not null) { var juncrefs = NodeDictionary.JunctionRefs; var juncs = NodeDictionary.Junctions; @@ -243,7 +240,7 @@ namespace CodeWalker.GameFiles { var juncref = juncrefs[i]; if (juncref.JunctionID >= juncs.Length) - { continue; } + continue; var j = new YndJunction(); j.Init(this, juncs[juncref.JunctionID], juncref); @@ -295,7 +292,7 @@ namespace CodeWalker.GameFiles Nodes = nnodes; NodeDictionary.NodesCount = (uint)ncnt; - var links = new List(); + using var links = new PooledList(); if (Links != null) { links.AddRange(Links); @@ -343,7 +340,7 @@ namespace CodeWalker.GameFiles return; } // Sort nodes so ped nodes are at the end - var nodes = new List(Nodes.Length); + using var nodes = new PooledList(Nodes.Length); var affectedNodesList = new List(); var vehicleNodes = Nodes.Where(n => !n.IsPedNode).OrderBy(n => n.NodeID).ToArray(); var pedNodes = Nodes.Where(n => n.IsPedNode).OrderBy(n => n.NodeID).ToArray(); @@ -395,7 +392,7 @@ namespace CodeWalker.GameFiles rmLinks.AddRange(nodeRmLinks); } - if (rmLinks.Any()) + if (rmLinks.Count != 0) { Links = Links.Where(l => !rmLinks.Contains(l)).ToArray(); return true; @@ -420,12 +417,12 @@ namespace CodeWalker.GameFiles public void UpdateAllNodePositions() { - int cnt = Nodes?.Length ?? 0; - if (cnt <= 0) + if (Nodes is null || Nodes.Length == 0) { - NodePositions = null; + NodePositions = Array.Empty(); return; } + int cnt = Nodes.Length; var np = new Vector4[cnt]; for (int i = 0; i < cnt; i++) { @@ -451,12 +448,12 @@ namespace CodeWalker.GameFiles vc = Links.Length * 6; } - List verts = new List(vc); - EditorVertex v0 = new EditorVertex(); - EditorVertex v1 = new EditorVertex(); - EditorVertex v2 = new EditorVertex(); - EditorVertex v3 = new EditorVertex(); - if ((Links != null) && (Nodes != null)) + using PooledList verts = new PooledList(vc); + //EditorVertex v0 = new EditorVertex(); + //EditorVertex v1 = new EditorVertex(); + //EditorVertex v2 = new EditorVertex(); + //EditorVertex v3 = new EditorVertex(); + if (Links is not null && Nodes is not null) { foreach (var node in Nodes) { @@ -496,16 +493,13 @@ namespace CodeWalker.GameFiles outer += halfwidth; } - - v0.Position = p1 + ax * inner; - v1.Position = p0 + ax * inner; - v2.Position = p1 + ax * outer; - v3.Position = p0 + ax * outer; var c = (uint)link.GetColour().ToRgba(); - v0.Colour = c; - v1.Colour = c; - v2.Colour = c; - v3.Colour = c; + + var v0 = new EditorVertex(p1 + ax * inner, c); + var v1 = new EditorVertex(p0 + ax * inner, c); + var v2 = new EditorVertex(p1 + ax * outer, c); + var v3 = new EditorVertex(p0 + ax * outer, c); + verts.Add(v0); verts.Add(v1); verts.Add(v2); @@ -523,31 +517,34 @@ namespace CodeWalker.GameFiles } else { - TriangleVerts = null; + TriangleVerts = []; } } - private void UpdateJunctionTriangleVertices(YndNode[] selectedNodes) + private void UpdateJunctionTriangleVertices(YndNode[]? selectedNodes) { - if (selectedNodes == null) + if (selectedNodes is null) { return; } //build triangles for the junctions bytes display.... - List verts = new List(); - EditorVertex v0 = new EditorVertex(); - EditorVertex v1 = new EditorVertex(); - EditorVertex v2 = new EditorVertex(); - EditorVertex v3 = new EditorVertex(); + using PooledList verts = new PooledList(); + EditorVertex v0; + EditorVertex v1; + EditorVertex v2; + EditorVertex v3; foreach (var node in selectedNodes) { - if (node.Ynd != this) continue; - if (node.Junction == null) continue; + if (node.Ynd != this) + continue; + if (node.Junction is null) + continue; var j = node.Junction; var d = j.Heightmap; - if (d == null) continue; + if (d is null) + continue; float maxz = j.MaxZ / 32.0f; float minz = j.MinZ / 32.0f; @@ -576,14 +573,10 @@ namespace CodeWalker.GameFiles var val2 = row1.Values[x - 1] / 255.0f; var val3 = row1.Values[x] / 255.0f; float offx = x * 2.0f; - v0.Position = cnr + new Vector3(offx - 2.0f, offy - 2.0f, val0 * rngz); - v1.Position = cnr + new Vector3(offx + 0.0f, offy - 2.0f, val1 * rngz); - v2.Position = cnr + new Vector3(offx - 2.0f, offy + 0.0f, val2 * rngz); - v3.Position = cnr + new Vector3(offx + 0.0f, offy + 0.0f, val3 * rngz); - v0.Colour = (uint)new Color4(val0, 1.0f - val0, 0.0f, 0.3f).ToRgba(); - v1.Colour = (uint)new Color4(val1, 1.0f - val1, 0.0f, 0.3f).ToRgba(); - v2.Colour = (uint)new Color4(val2, 1.0f - val2, 0.0f, 0.3f).ToRgba(); - v3.Colour = (uint)new Color4(val3, 1.0f - val3, 0.0f, 0.3f).ToRgba(); + v0 = new EditorVertex(cnr + new Vector3(offx - 2.0f, offy - 2.0f, val0 * rngz), (uint)new Color4(val0, 1.0f - val0, 0.0f, 0.3f).ToRgba()); + v1 = new EditorVertex(cnr + new Vector3(offx + 0.0f, offy - 2.0f, val1 * rngz), (uint)new Color4(val1, 1.0f - val1, 0.0f, 0.3f).ToRgba()); + v2 = new EditorVertex(cnr + new Vector3(offx - 2.0f, offy + 0.0f, val2 * rngz), (uint)new Color4(val2, 1.0f - val2, 0.0f, 0.3f).ToRgba()); + v3 = new EditorVertex(cnr + new Vector3(offx + 0.0f, offy + 0.0f, val3 * rngz), (uint)new Color4(val3, 1.0f - val3, 0.0f, 0.3f).ToRgba()); verts.Add(v0); verts.Add(v1); verts.Add(v2); @@ -597,7 +590,7 @@ namespace CodeWalker.GameFiles if (verts.Count > 0) { var vertsarr = verts.ToArray(); - if (TriangleVerts != null) + if (TriangleVerts.Length > 0) { var nvc = vertsarr.Length; var tvc = TriangleVerts.Length; @@ -689,18 +682,13 @@ namespace CodeWalker.GameFiles return true; } - affectedFiles = Array.Empty(); + affectedFiles = []; return false; } - - - public override string ToString() - { - return RpfFileEntry?.ToString() ?? string.Empty; - } + public override string ToString() => RpfFileEntry?.ToString() ?? string.Empty; } public enum YndNodeSpeed @@ -725,26 +713,29 @@ namespace CodeWalker.GameFiles OffRoadJunction = 20 } - [TypeConverter(typeof(ExpandableObjectConverter))] public class YndNode : BasePathNode + [TypeConverter(typeof(ExpandableObjectConverter))] + public class YndNode : BasePathNode { public Node _RawData; public YndFile Ynd { get; set; } - public Node RawData { get { return _RawData; } set { _RawData = value; } } - public Vector3 Position { get; set; } + public Node RawData { get => _RawData; set => _RawData = value; } + + public Vector3 _Position; + public ref Vector3 Position => ref _Position; public int LinkCount { get; set; } public int LinkCountUnk { get; set; } - public YndLink[] Links { get; set; } + public YndLink[]? Links { get; set; } - public ushort AreaID { get { return _RawData.AreaID; } set { _RawData.AreaID = value; } } - public ushort NodeID { get { return _RawData.NodeID; } set { _RawData.NodeID = value; } } - public ushort LinkID { get { return _RawData.LinkID; } set { _RawData.LinkID = value; } } - public FlagsByte Flags0 { get { return _RawData.Flags0; } set { _RawData.Flags0 = value; } } - public FlagsByte Flags1 { get { return _RawData.Flags1; } set { _RawData.Flags1 = value; } } - public FlagsByte Flags2 { get { return _RawData.Flags2; } set { _RawData.Flags2 = value; } } - public FlagsByte Flags3 { get { return _RawData.Flags3; } set { _RawData.Flags3 = value; } } - public FlagsByte Flags4 { get { return _RawData.Flags4; } set { _RawData.Flags4 = value; } } - public TextHash StreetName { get { return _RawData.StreetName; } set { _RawData.StreetName = value; } } + public ushort AreaID { get => _RawData.AreaID; set => _RawData.AreaID = value; } + public ushort NodeID { get => _RawData.NodeID; set => _RawData.NodeID = value; } + public ushort LinkID { get => _RawData.LinkID; set => _RawData.LinkID = value; } + public FlagsByte Flags0 { get => _RawData.Flags0; set => _RawData.Flags0 = value; } + public FlagsByte Flags1 { get => _RawData.Flags1; set => _RawData.Flags1 = value; } + public FlagsByte Flags2 { get => _RawData.Flags2; set => _RawData.Flags2 = value; } + public FlagsByte Flags3 { get => _RawData.Flags3; set => _RawData.Flags3 = value; } + public FlagsByte Flags4 { get => _RawData.Flags4; set => _RawData.Flags4 = value; } + public TextHash StreetName { get => _RawData.StreetName; set => _RawData.StreetName = value; } public Color4 Colour { get; set; } @@ -754,14 +745,8 @@ namespace CodeWalker.GameFiles public YndNodeSpeed Speed { - get - { - return (YndNodeSpeed)((LinkCountUnk >> 1) & 3); - } - set - { - LinkCountUnk = (LinkCountUnk &~ 6) | (((int)value & 3) << 1); - } + get => (YndNodeSpeed)((LinkCountUnk >> 1) & 3); + set => LinkCountUnk = (LinkCountUnk & ~6) | (((int)value & 3) << 1); } //// Flag0 Properties @@ -843,14 +828,14 @@ namespace CodeWalker.GameFiles } public bool IsDisabledUnk1 { - get { return (Flags2.Value & 16) > 0; } + get => (Flags2.Value & 16) > 0; set => Flags2 = (byte)(value ? Flags2 | 16 : Flags2 &~ 16); } // Flag3 Properties public bool Tunnel { - get { return (Flags3 & 1) > 0; } + get => (Flags3 & 1) > 0; set => Flags3 = (byte)(value ? Flags3 | 1 : Flags3 &~ 1); } public int HeuristicValue @@ -894,11 +879,7 @@ namespace CodeWalker.GameFiles { Ynd = ynd; RawData = node; - Vector3 p = new Vector3(); - p.X = node.PositionX / 4.0f; - p.Y = node.PositionY / 4.0f; - p.Z = node.PositionZ / 32.0f; - Position = p; + Position = new Vector3(node.PositionX / 4.0f, node.PositionY / 4.0f, node.PositionZ / 32.0f); LinkCount = node.LinkCountFlags.Value >> 3; LinkCountUnk = node.LinkCountFlags.Value & 7; @@ -947,7 +928,8 @@ namespace CodeWalker.GameFiles public void UpdateLinkLengths() { - if (Links == null) return; + if (Links is null) + return; for (int i = 0; i < Links.Length; i++) { var link = Links[i]; @@ -1011,7 +993,7 @@ namespace CodeWalker.GameFiles } - public YndLink AddLink(YndNode tonode = null, bool bidirectional = true) + public YndLink AddLink(YndNode? tonode = null, bool bidirectional = true) { if (Links == null) { @@ -1027,13 +1009,13 @@ namespace CodeWalker.GameFiles YndLink l = new YndLink(); l._RawData.AreaID = AreaID; l.Node1 = this; - if (tonode != null) + if (tonode is not null) { l.Node2 = tonode; l._RawData.AreaID = tonode.AreaID; l._RawData.NodeID = tonode.NodeID; } - else if ((Ynd.Nodes != null) && (Ynd.Nodes.Length > 0)) + else if (Ynd.Nodes is not null && Ynd.Nodes.Length > 0) { l.Node2 = Ynd.Nodes[0]; } @@ -1066,8 +1048,13 @@ namespace CodeWalker.GameFiles return l; } - public bool TryGetLinkForNode(YndNode node, out YndLink link) + public bool TryGetLinkForNode(YndNode node, [MaybeNullWhen(false)] out YndLink link) { + if (Links is null) + { + link = null; + return false; + } for (int i = 0; i < Links.Length; i++) { if (Links[i].Node2 == node) @@ -1114,15 +1101,15 @@ namespace CodeWalker.GameFiles private void FloodCopyFlags(YndNode basis, List seenNodes, out YndFile[] affectedFiles) { var affectedFilesList = new List(); - if (Links == null || !Links.Any()) + if (Links == null || Links.Length == 0) { - affectedFiles = Array.Empty(); + affectedFiles = []; return; } if (seenNodes.Contains(this)) { - affectedFiles = Array.Empty(); + affectedFiles = []; return; } @@ -1177,20 +1164,20 @@ namespace CodeWalker.GameFiles var oldPosition = Position; SetPosition(newPosition); - var expectedArea = space.NodeGrid.GetCellForPosition(newPosition); + var expectedArea = space.NodeGrid.GetCellForPosition(in newPosition); - if (AreaID != expectedArea.ID) + if (AreaID != expectedArea?.ID) { var nodeYnd = space.NodeGrid.GetCell(AreaID).Ynd; - var newYnd = expectedArea.Ynd; - if (newYnd == null) + var newYnd = expectedArea?.Ynd; + if (newYnd is null) { SetPosition(oldPosition); affectedFiles = Array.Empty(); return; } - if ((nodeYnd == null) || + if ((nodeYnd is null) || nodeYnd.RemoveYndNode(space, this, false, out var affectedFilesFromDelete)) { totalAffectedFiles.Add(nodeYnd); @@ -1249,7 +1236,8 @@ namespace CodeWalker.GameFiles for (int x = 0; x < sizeX; x++) { var offx = x * 2.0f; - var result = space.RayIntersect(new Ray(start + new Vector3(offx, offy, 0f), new Vector3(0f, 0f, -1f)), maxDist, layers); + var ray = new Ray(start + new Vector3(offx, offy, 0f), new Vector3(0f, 0f, -1f)); + var result = space.RayIntersect(ref ray, maxDist, layers); var p = start + new Vector3(offx, offy, 0f); //t.AppendLine($"{p.X}, {p.Y}, {p.Z}"); @@ -1287,7 +1275,7 @@ namespace CodeWalker.GameFiles public override string ToString() { //return AreaID.ToString() + "." + NodeID.ToString(); - return StreetName.ToString() + ", " + Position.X.ToString() + ", " + Position.Y.ToString() + ", " + Position.Z.ToString() + ", " + NodeID.ToString(); + return $"{StreetName}, {Position.X}, {Position.Y}, {Position.Z}, {NodeID}"; } } @@ -1357,8 +1345,8 @@ namespace CodeWalker.GameFiles public void UpdateLength() { - if (Node1 == null) return; - if (Node2 == null) return; + if (Node1 is null || Node2 is null) + return; LinkLength = (byte)Math.Min(255, (Node2.Position - Node1.Position).Length()); } @@ -1366,7 +1354,8 @@ namespace CodeWalker.GameFiles public void CopyFlags(YndLink link) { - if (link == null) return; + if (link is null) + return; Flags0 = link.Flags0; Flags1 = link.Flags1; Flags2 = link.Flags2; @@ -1678,7 +1667,7 @@ namespace CodeWalker.GameFiles StringBuilder sb = new StringBuilder(); for (int i = 0; i < Values.Length; i++) { - if (i > 0) sb.Append(" "); + if (i > 0) sb.Append(' '); sb.Append(Values[i].ToString().PadLeft(3, '0')); //sb.Append(Convert.ToString(Values[i], 16).ToUpper().PadLeft(2, '0')); } @@ -1694,7 +1683,7 @@ namespace CodeWalker.GameFiles public int Depth; public int MaxDepth; public int Threshold; - public List Nodes; + public BasePathNode[] Nodes; public BoundingBox Box; public BoundingSphere Sphere; public PathBVHNode Node1; @@ -1703,14 +1692,15 @@ namespace CodeWalker.GameFiles public void CalcBounds() { - if ((Nodes == null) || (Nodes.Count <= 0)) return; + if (Nodes is null || Nodes.Length == 0) + return; Box.Minimum = new Vector3(float.MaxValue); Box.Maximum = new Vector3(float.MinValue); foreach (var node in Nodes) { - Box.Minimum = Vector3.Min(Box.Minimum, node.Position); - Box.Maximum = Vector3.Max(Box.Maximum, node.Position); + Vectors.Min(in Box.Minimum, in node.Position, out Box.Minimum); + Vectors.Max(in Box.Maximum, in node.Position, out Box.Maximum); } Sphere.Center = (Box.Minimum + Box.Maximum) * 0.5f; Sphere.Radius = (Box.Maximum - Box.Minimum).Length() * 0.5f; @@ -1719,24 +1709,28 @@ namespace CodeWalker.GameFiles public void Build() { - if ((Nodes == null) || (Nodes.Count <= Threshold) || (Depth >= MaxDepth)) return; + if (Nodes == null || Nodes.Length == 0 || Nodes.Length <= Threshold || Depth >= MaxDepth) + return; Vector3 avgsum = Vector3.Zero; foreach (var node in Nodes) { avgsum += node.Position; } - Vector3 avg = avgsum * (1.0f / Nodes.Count); + Vector3 avg = avgsum * Nodes.Length; int countx = 0, county = 0, countz = 0; foreach (var node in Nodes) { - if (node.Position.X < avg.X) countx++; - if (node.Position.Y < avg.Y) county++; - if (node.Position.Z < avg.Z) countz++; + if (node.Position.X < avg.X) + countx++; + if (node.Position.Y < avg.Y) + county++; + if (node.Position.Z < avg.Z) + countz++; } - int target = Nodes.Count / 2; + int target = Nodes.Length / 2; int dx = Math.Abs(target - countx); int dy = Math.Abs(target - county); int dz = Math.Abs(target - countz); @@ -1747,37 +1741,41 @@ namespace CodeWalker.GameFiles else axis = 2; //z seems best - List l1 = new List(); - List l2 = new List(); + using PooledList l1 = new PooledList(Nodes.Length); + using PooledList l2 = new PooledList(Nodes.Length); foreach (var node in Nodes) { - bool s = false; - switch (axis) + var s = axis switch { - default: - case 0: s = (node.Position.X > avg.X); break; - case 1: s = (node.Position.Y > avg.Y); break; - case 2: s = (node.Position.Z > avg.Z); break; - } - if (s) l1.Add(node); - else l2.Add(node); + 1 => (node.Position.Y > avg.Y), + 2 => (node.Position.Z > avg.Z), + _ => (node.Position.X > avg.X), + }; + if (s) + l1.Add(node); + else + l2.Add(node); } var cdepth = Depth + 1; - Node1 = new PathBVHNode(); - Node1.Depth = cdepth; - Node1.MaxDepth = MaxDepth; - Node1.Threshold = Threshold; - Node1.Nodes = new List(l1); + Node1 = new PathBVHNode + { + Depth = cdepth, + MaxDepth = MaxDepth, + Threshold = Threshold, + Nodes = l1.ToArray(), + }; Node1.CalcBounds(); Node1.Build(); - Node2 = new PathBVHNode(); - Node2.Depth = cdepth; - Node2.MaxDepth = MaxDepth; - Node2.Threshold = Threshold; - Node2.Nodes = new List(l2); + Node2 = new PathBVHNode + { + Depth = cdepth, + MaxDepth = MaxDepth, + Threshold = Threshold, + Nodes = l2.ToArray(), + }; Node2.CalcBounds(); Node2.Build(); } @@ -1785,12 +1783,13 @@ namespace CodeWalker.GameFiles public void UpdateForNode(BasePathNode node) { - if (!Nodes.Contains(node)) return; - Box.Minimum = Vector3.Min(Box.Minimum, node.Position); - Box.Maximum = Vector3.Max(Box.Maximum, node.Position); + if (!Nodes.Contains(node)) + return; + Vectors.Min(in Box.Minimum, in node.Position, out Box.Minimum); + Vectors.Max(in Box.Maximum, in node.Position, out Box.Maximum); - if (Node1 != null) Node1.UpdateForNode(node); - if (Node2 != null) Node2.UpdateForNode(node); + Node1?.UpdateForNode(node); + Node2?.UpdateForNode(node); } } @@ -1802,11 +1801,19 @@ namespace CodeWalker.GameFiles { Threshold = threshold; MaxDepth = maxdepth; - Nodes = (nodes != null) ? new List(nodes) : new List(); + Nodes = nodes?.ToArray() ?? []; CalcBounds(); Build(); } + public PathBVH(BasePathNode[] nodes, int threshold, int maxdepth) + { + Threshold = threshold; + MaxDepth = maxdepth; + Nodes = nodes; + CalcBounds(); + Build(); + } } @@ -1814,27 +1821,19 @@ namespace CodeWalker.GameFiles public interface BasePathNode { - Vector3 Position { get; set; } + ref Vector3 Position { get; } } public interface BasePathData { //reuse this interface for file types that need to get paths rendered... - EditorVertex[] GetPathVertices(); - EditorVertex[] GetTriangleVertices(); - Vector4[] GetNodePositions(); + EditorVertex[] GetPathVertices() => Array.Empty(); + EditorVertex[] GetTriangleVertices() => Array.Empty(); + Vector4[] GetNodePositions() => Array.Empty(); } - - - - - - - - public class YndXml : MetaXmlBase { diff --git a/CodeWalker.Core/GameFiles/FileTypes/YnvFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YnvFile.cs index a2ac2b4..bcf0f07 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YnvFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YnvFile.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Xml; +using Collections.Pooled; using SharpDX; namespace CodeWalker.GameFiles @@ -28,7 +30,7 @@ namespace CodeWalker.GameFiles //fields used by the editor: public bool HasChanged { get; set; } = false; - public List SaveWarnings = null; + public List? SaveWarnings = null; public bool BuildStructsOnSave { get; set; } = true; @@ -38,13 +40,11 @@ namespace CodeWalker.GameFiles public int AreaID { - get - { - return (int)(Nav?.AreaID ?? 0); - } + get => (int)(Nav?.AreaID ?? 0); set { - if (Nav != null) Nav.AreaID = (uint)value; + if (Nav is not null) + Nav.AreaID = (uint)value; } } public int CellX { get { return AreaID % 100; } set { AreaID = (CellY * 100) + value; } } @@ -53,12 +53,12 @@ namespace CodeWalker.GameFiles //getters for property grids viewing of the lists - public Vector3[] AllVertices { get { return Vertices?.ToArray(); } } - public ushort[] AllIndices { get { return Indices?.ToArray(); } } - public YnvEdge[] AllEdges { get { return Edges?.ToArray(); } } - public YnvPoly[] AllPolys { get { return Polys?.ToArray(); } } - public YnvPortal[] AllPortals { get { return Portals?.ToArray(); } } - public YnvPoint[] AllPoints { get { return Points?.ToArray(); } } + public Vector3[] AllVertices => Vertices?.ToArray(); + public ushort[] AllIndices => Indices?.ToArray(); + public YnvEdge[] AllEdges => Edges?.ToArray(); + public YnvPoly[] AllPolys => Polys?.ToArray(); + public YnvPortal[] AllPortals => Portals?.ToArray(); + public YnvPoint[] AllPoints => Points?.ToArray(); @@ -84,10 +84,10 @@ namespace CodeWalker.GameFiles Name = entry.Name; RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); @@ -104,14 +104,13 @@ namespace CodeWalker.GameFiles BuildBVH(); - Loaded = true; LoadQueued = true; } public void InitFromNav() { - if (Nav == null) return; + if (Nav is null) return; Vector3 posoffset = Nav.SectorTree?.AABBMin.XYZ() ?? Vector3.Zero; Vector3 aabbsize = Nav.AABBSize; @@ -294,7 +293,7 @@ namespace CodeWalker.GameFiles { }//debug e._RawData._Poly1.AreaIDInd = EnsureEdgeAreaID(e.AreaID1, areadict, arealist); e._RawData._Poly2.AreaIDInd = EnsureEdgeAreaID(e.AreaID2, areadict, arealist); - edge = e.RawData; + edge = e._RawData; } else { @@ -597,7 +596,7 @@ namespace CodeWalker.GameFiles (bmax.Y >= min.Y) && (bmin.Y <= max.Y);// && //(bmax.Z >= min.Z) && (bmin.Z <= max.Z); } - private bool BoxOverlaps(NavMeshAABB a, NavMeshAABB b) + private bool BoxOverlaps(in NavMeshAABB a, in NavMeshAABB b) { return (a.MaxX >= b.MinX) && (a.MinX <= b.MaxX) && (a.MaxY >= b.MinY) && (a.MinY <= b.MaxY); @@ -622,11 +621,8 @@ namespace CodeWalker.GameFiles public void UpdateAllNodePositions() { - if (Nav == null) return; - - - Vector3 posoffset = Nav.SectorTree.AABBMin.XYZ(); - Vector3 aabbsize = Nav.AABBSize; + if (Nav is null) + return; EditorVertex v = new EditorVertex(); v.Colour = 0xFF0000FF; @@ -635,9 +631,9 @@ namespace CodeWalker.GameFiles ////### add portal positions to the node list, also add links to the link vertex array - int cnt = Portals?.Count ?? 0; - if (cnt > 0) + if (Portals is not null && Portals.Count > 0) { + int cnt = Portals.Count; for (int i = 0; i < cnt; i++) { var portal = Portals[i]; @@ -649,9 +645,10 @@ namespace CodeWalker.GameFiles ////### add point positions to the node list - cnt = Points?.Count ?? 0; - if (cnt >= 0) + + if (Points is not null && Points.Count > 0) { + int cnt = Points.Count; for (int i = 0; i < cnt; i++) { var point = Points[i]; @@ -660,8 +657,8 @@ namespace CodeWalker.GameFiles } - NodePositions = (nv.Count > 0) ? nv.ToArray() : null; - PathVertices = (lv.Count > 0) ? lv.ToArray() : null; + NodePositions = (nv.Count > 0) ? nv.ToArray() : Array.Empty(); + PathVertices = (lv.Count > 0) ? lv.ToArray() : Array.Empty(); } @@ -673,10 +670,8 @@ namespace CodeWalker.GameFiles //go through the nav mesh polys and generate verts to render... - if ((Polys == null) || (Polys.Count == 0)) return; - - - int vc = Vertices.Count; + if (Polys is null || Polys.Count == 0) + return; List rverts = new List(); EditorVertex p0 = new EditorVertex(); @@ -708,6 +703,12 @@ namespace CodeWalker.GameFiles } } + if (rverts.Count == 0) + { + TriangleVerts = Array.Empty(); + return; + } + TriangleVerts = rverts.ToArray(); } @@ -717,10 +718,16 @@ namespace CodeWalker.GameFiles public void UpdateContentFlags(bool vehicle) { NavMeshFlags f = NavMeshFlags.None; - if (Polys?.Count > 0) f = f | NavMeshFlags.Polygons; - if (Portals?.Count > 0) f = f | NavMeshFlags.Portals; - if (vehicle) f = f | NavMeshFlags.Vehicle; - else f = f | NavMeshFlags.Unknown8; //what exactly is this? + if (Polys?.Count > 0) + f |= NavMeshFlags.Polygons; + if (Portals?.Count > 0) + f |= NavMeshFlags.Portals; + + if (vehicle) + f |= NavMeshFlags.Vehicle; + else + f |= NavMeshFlags.Unknown8; //what exactly is this? + Nav.ContentFlags = f; } @@ -729,10 +736,14 @@ namespace CodeWalker.GameFiles public void BuildBVH() { - var nodes = new List(); - if (Portals != null) nodes.AddRange(Portals); - if (Points != null) nodes.AddRange(Points); - BVH = new PathBVH(nodes, 10, 10); + using var nodes = new PooledList(); + if (Portals is not null && Portals.Count > 0) + nodes.AddRange(Portals); + + if (Points is not null && Points.Count > 0) + nodes.AddRange(Points); + + BVH = new PathBVH(nodes.ToArray(), 10, 10); } @@ -809,7 +820,7 @@ namespace CodeWalker.GameFiles public int Index { get; set; } public ushort[] Indices { get; set; } - public Vector3[] Vertices { get; set; } + public Vector3[]? Vertices { get; set; } public YnvEdge[] Edges { get; set; } public ushort[] PortalLinks { get; set; } @@ -831,18 +842,18 @@ namespace CodeWalker.GameFiles var indices = Ynv.Indices; var vertices = Ynv.Vertices; var edges = Ynv.Edges; - if ((indices == null) || (vertices == null) || (edges == null)) - { return; } + if (indices == null || vertices == null || edges == null) + return; var vc = vertices.Count; var ic = _RawData.IndexCount; var startid = _RawData.IndexID; var endid = startid + ic; if (startid >= indices.Count) - { return; } + return; if (endid > indices.Count) - { return; } + return; if (endid > edges.Count) - { return; } + return; Indices = new ushort[ic]; Vertices = new Vector3[ic]; @@ -864,10 +875,10 @@ namespace CodeWalker.GameFiles public void LoadPortalLinks() { if (PortalLinkCount == 0) - { return; } + return; var links = Ynv.Nav?.PortalLinks; - if (links == null) - { return; } + if (links is null) + return; var ll = links.Length; @@ -879,16 +890,12 @@ namespace CodeWalker.GameFiles int idx = offset + i; PortalLinks[i] = (idx < ll) ? links[idx] : (ushort)0; } - - if (PortalLinkCount != 2) - { }//debug - } public void SetPosition(Vector3 pos) { - Vector3 delta = pos - Position; + //Vector3 delta = pos - Position; Position = pos; //TODO: update vertex positions!!! } @@ -962,17 +969,18 @@ namespace CodeWalker.GameFiles public void CalculatePosition() { + if (Vertices is null || Vertices.Length == 0) + { + Position = Vector3.Zero; + return; + } //calc poly center for display purposes. Vector3 pcenter = Vector3.Zero; - if (Vertices != null) + for (int i = 0; i < Vertices.Length; i++) { - for (int i = 0; i < Vertices.Length; i++) - { - pcenter += Vertices[i]; - } + pcenter += Vertices[i]; } - float c = ((float)Vertices?.Length); - if (c == 0.0f) c = 1.0f; + float c = Vertices.Length; Position = pcenter * (1.0f / c); } @@ -980,18 +988,18 @@ namespace CodeWalker.GameFiles { Vector3 min = Vector3.Zero; Vector3 max = Vector3.Zero; - if ((Vertices != null) && (Vertices.Length > 0)) + if (Vertices is not null && Vertices.Length > 0) { min = new Vector3(float.MaxValue); max = new Vector3(float.MinValue); for (int i = 0; i < Vertices.Length; i++) { - min = Vector3.Min(min, Vertices[i]); - max = Vector3.Max(max, Vertices[i]); + Vector3.Min(ref min, ref Vertices[i], out min); + Vector3.Max(ref max, ref Vertices[i], out max); } } - _RawData.CellAABB = new NavMeshAABB() { Min = min, Max = max }; + _RawData.CellAABB = new NavMeshAABB(in min, in max); } @@ -1005,7 +1013,7 @@ namespace CodeWalker.GameFiles foreach (var e in Edges) { YnvXml.Indent(sb, cind); - sb.AppendFormat("{0}:{1}, {2}:{3}", e.AreaID1, e.PolyID1, e.AreaID2, e.PolyID2); + sb.AppendFormat($"{e.AreaID1}:{e.PolyID1}, {e.AreaID2}:{e.PolyID2}"); sb.AppendLine(); } YnvXml.CloseTag(sb, indent, "Edges"); @@ -1078,9 +1086,12 @@ namespace CodeWalker.GameFiles public YnvFile Ynv { get; set; } public NavMeshPortal RawData { get { return _RawData; } set { _RawData = value; } } - public Vector3 Position { get { return PositionFrom; } set { PositionFrom = value; } } - public Vector3 PositionFrom { get; set; } - public Vector3 PositionTo { get; set; } + public ref Vector3 Position => ref PositionFrom; + + public Vector3 _PositionFrom; + public ref Vector3 PositionFrom => ref _PositionFrom; + public Vector3 _PositionTo; + public ref Vector3 PositionTo => ref _PositionTo; public byte Angle { get { return _RawData.Angle; } set { _RawData.Angle = value; } } public float Direction @@ -1099,7 +1110,7 @@ namespace CodeWalker.GameFiles get { return Quaternion.RotationAxis(Vector3.UnitZ, Direction); } set { - Vector3 dir = value.Multiply(Vector3.UnitX); + Vector3 dir = value.Multiply(in Vector3.UnitX); float dira = (float)Math.Atan2(dir.Y, dir.X); Direction = dira; } @@ -1160,14 +1171,16 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class YnvPoint : BasePathNode, IMetaXmlItem + [TypeConverter(typeof(ExpandableObjectConverter))] + public class YnvPoint : BasePathNode, IMetaXmlItem { public NavMeshPoint _RawData; public YnvFile Ynv { get; set; } public NavMeshPoint RawData { get { return _RawData; } set { _RawData = value; } } - public Vector3 Position { get; set; } + public Vector3 _Position; + public ref Vector3 Position => ref _Position; public byte Angle { get { return _RawData.Angle; } set { _RawData.Angle = value; } } public float Direction { @@ -1185,7 +1198,7 @@ namespace CodeWalker.GameFiles get { return Quaternion.RotationAxis(Vector3.UnitZ, Direction); } set { - Vector3 dir = value.Multiply(Vector3.UnitX); + Vector3 dir = value.Multiply(in Vector3.UnitX); float dira = (float)Math.Atan2(dir.Y, dir.X); Direction = dira; } @@ -1223,18 +1236,16 @@ namespace CodeWalker.GameFiles Position = Xml.GetChildVector3Attributes(node, "Position"); } - public override string ToString() - { - return Index.ToString() + ": " + Type.ToString(); - } + public override string ToString() => $"{Index}: {Type} ({Position})"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class YnvEdge + [TypeConverter(typeof(ExpandableObjectConverter))] + public class YnvEdge { public NavMeshEdge _RawData; - public NavMeshEdge RawData { get { return _RawData; } set { _RawData = value; } } + public NavMeshEdge RawData => _RawData; public YnvFile Ynv { get; set; } @@ -1261,26 +1272,20 @@ namespace CodeWalker.GameFiles public void Init(YnvFile ynv, NavMeshEdge edge) { Ynv = ynv; - RawData = edge; + _RawData = edge; if (ynv.Nav == null) return; var n = ynv.Nav; - var ai1 = edge.Poly1.AreaIDInd; - var ai2 = edge.Poly2.AreaIDInd; + var ai1 = edge._Poly1.AreaIDInd; + var ai2 = edge._Poly2.AreaIDInd; AreaID1 = (ai1 < n.AdjAreaIDs.Count) ? n.AdjAreaIDs.Get(ai1) : 16383; AreaID2 = (ai2 < n.AdjAreaIDs.Count) ? n.AdjAreaIDs.Get(ai2) : 16383; } - public override string ToString() - { - return AreaID1.ToString() + ", " + AreaID2.ToString() + ", " + PolyID1.ToString() + ", " + PolyID2.ToString() + ", " + - _RawData._Poly1.Unk2.ToString() + ", " + _RawData._Poly2.Unk2.ToString() + ", " + - _RawData._Poly1.Unk3.ToString() + ", " + _RawData._Poly2.Unk3.ToString(); - } - + public override string ToString() => $"{AreaID1}, {AreaID2}, {PolyID1}, {PolyID2}, {_RawData._Poly1.Unk2}, {_RawData._Poly2.Unk2}, {_RawData._Poly1.Unk3}, {_RawData.Poly2.Unk3}"; } diff --git a/CodeWalker.Core/GameFiles/FileTypes/YptFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YptFile.cs index c56164e..0e64d95 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YptFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YptFile.cs @@ -38,10 +38,10 @@ namespace CodeWalker.GameFiles RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); diff --git a/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs index 19356c8..9919b91 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YtdFile.cs @@ -32,16 +32,25 @@ namespace CodeWalker.GameFiles Loaded = true; } + public async Task LoadAsync(byte[] data) + { + //direct load from a raw, compressed ytd file + + await RpfFile.LoadResourceFileAsync(this, data, 13); + + Loaded = true; + } + public void Load(byte[] data, RpfFileEntry entry) { Name = entry.Name; RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); @@ -65,13 +74,8 @@ namespace CodeWalker.GameFiles return data; } - new public long MemoryUsage - { - get - { - return TextureDict.MemoryUsage; - } - } + public long PhysicalMemoryUsage => TextureDict.MemoryUsage; + public long VirtualMemoryUsage => 0; } diff --git a/CodeWalker.Core/GameFiles/FileTypes/YtypFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YtypFile.cs index ed79a47..b401ce0 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YtypFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YtypFile.cs @@ -1,54 +1,55 @@ -using System; +using SharpDX.Win32; +using System; +using System.Buffers.Binary; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace CodeWalker.GameFiles { [TypeConverter(typeof(ExpandableObjectConverter))] + [SkipLocalsInit] public class YtypFile : GameFile, PackedFile { - - - public Meta Meta { get; set; } - public PsoFile Pso { get; set; } - public RbfFile Rbf { get; set; } + public Meta? Meta { get; set; } + public PsoFile? Pso { get; set; } + public RbfFile? Rbf { get; set; } public uint NameHash { get; set; } - public string[] Strings { get; set; } + public string[] Strings => Meta?.GetStrings() ?? []; public CMapTypes _CMapTypes; - public CMapTypes CMapTypes { get { return _CMapTypes; } set { _CMapTypes = value; } } + public CMapTypes CMapTypes => _CMapTypes; - public Archetype[] AllArchetypes { get; set; } + public Archetype[] AllArchetypes { get => allArchetypes; set => allArchetypes = value; } + public MetaWrapper[] Extensions { get; set; } = []; - public MetaWrapper[] Extensions { get; set; } + public MloArchetype[] MloArchetypes => allArchetypes.Where(p => p is MloArchetype).Select(p => (p as MloArchetype)!).ToArray(); - public CCompositeEntityType[] CompositeEntityTypes { get; set; } + public CCompositeEntityType[] CompositeEntityTypes { get; set; } = []; //fields used by the editor: public bool HasChanged { get; set; } = false; - public List SaveWarnings = null; - - + public List? SaveWarnings = null; + private Archetype[] allArchetypes = []; public YtypFile() : base(null, GameFileType.Ytyp) { } + public YtypFile(RpfFileEntry entry) : base(entry, GameFileType.Ytyp) { } - public override string ToString() - { - return (RpfFileEntry != null) ? RpfFileEntry.Name : string.Empty; - } + public override string ToString() => RpfFileEntry?.Name ?? string.Empty; public byte[] Save() { @@ -58,30 +59,25 @@ namespace CodeWalker.GameFiles CMapTypes mapTypes = _CMapTypes; - if (Extensions == null || Extensions.Length <= 0) + if (Extensions.Length == 0) mapTypes.extensions = new Array_StructurePointer(); else mapTypes.extensions = mb.AddWrapperArrayPtr(Extensions); - if ((AllArchetypes != null) && (AllArchetypes.Length > 0)) + if (AllArchetypes.Length > 0) { - for (int i = 0; i < AllArchetypes.Length; i++) + MetaPOINTER[] ptrs = new MetaPOINTER[AllArchetypes.Length]; + var i = 0; + foreach(var arch in AllArchetypes) { - var arch = AllArchetypes[i]; //save the extensions first.. if (arch._BaseArchetypeDef.extensions.Count1 > 0) { arch._BaseArchetypeDef.extensions = mb.AddWrapperArrayPtr(arch.Extensions); } - } - - MetaPOINTER[] ptrs = new MetaPOINTER[AllArchetypes.Length]; - for (int i = 0; i < AllArchetypes.Length; i++) - { - var arch = AllArchetypes[i]; switch (arch) { case TimeArchetype t: - ptrs[i] = mb.AddItemPtr(MetaName.CTimeArchetypeDef, t._TimeArchetypeDef); + ptrs[i] = mb.AddItemPtr(MetaName.CTimeArchetypeDef, in t._TimeArchetypeDef); break; case MloArchetype m: try @@ -92,16 +88,17 @@ namespace CodeWalker.GameFiles m._MloArchetypeDef._MloArchetypeDef.entitySets = mb.AddWrapperArray(m.entitySets); m._MloArchetypeDef._MloArchetypeDef.timeCycleModifiers = mb.AddItemArrayPtr(MetaName.CMloTimeCycleModifier, m.timeCycleModifiers); } - catch/* (Exception e)*/ + catch(Exception ex) { - //todo: log save error. + Console.WriteLine(ex); } - ptrs[i] = mb.AddItemPtr(MetaName.CMloArchetypeDef, m._MloArchetypeDef); + ptrs[i] = mb.AddItemPtr(MetaName.CMloArchetypeDef, in m._MloArchetypeDef); break; case Archetype a: - ptrs[i] = mb.AddItemPtr(MetaName.CBaseArchetypeDef, a._BaseArchetypeDef); + ptrs[i] = mb.AddItemPtr(MetaName.CBaseArchetypeDef, in a._BaseArchetypeDef); break; } + i++; } mapTypes.archetypes = mb.AddPointerArray(ptrs); } @@ -110,14 +107,14 @@ namespace CodeWalker.GameFiles mapTypes.archetypes = new Array_StructurePointer(); } - if (CompositeEntityTypes != null && CompositeEntityTypes.Length > 0) + if (CompositeEntityTypes.Length > 0) { var cptrs = new MetaPOINTER[CompositeEntityTypes.Length]; for (int i = 0; i < cptrs.Length; i++) { var cet = CompositeEntityTypes[i]; - cptrs[i] = mb.AddItemPtr(MetaName.CCompositeEntityType, cet); + cptrs[i] = mb.AddItemPtr(MetaName.CCompositeEntityType, in cet); } mapTypes.compositeEntityTypes = mb.AddItemArrayPtr(MetaName.CCompositeEntityType, cptrs); } @@ -127,13 +124,13 @@ namespace CodeWalker.GameFiles mb.AddStructureInfo(MetaName.CMapTypes); - if ((AllArchetypes != null && AllArchetypes.Length > 0)) + if (AllArchetypes is not null && AllArchetypes.Length > 0) { mb.AddStructureInfo(MetaName.CBaseArchetypeDef); mb.AddEnumInfo(MetaName.rage__fwArchetypeDef__eAssetType); // ASSET_TYPE_ } - if ((AllArchetypes != null) && (AllArchetypes.Any(x => x is MloArchetype))) + if (AllArchetypes is not null && AllArchetypes.Any(x => x is MloArchetype)) { mb.AddStructureInfo(MetaName.CMloArchetypeDef); mb.AddStructureInfo(MetaName.CMloRoomDef); @@ -142,25 +139,24 @@ namespace CodeWalker.GameFiles mb.AddStructureInfo(MetaName.CMloTimeCycleModifier); } - if ((AllArchetypes != null) && (AllArchetypes.Any(x => x is MloArchetype m && m.entities.Length > 0))) + if (AllArchetypes is not null && AllArchetypes.Any(x => x is MloArchetype m && m.entities.Length > 0)) { mb.AddStructureInfo(MetaName.CEntityDef); mb.AddEnumInfo(MetaName.rage__eLodType); //LODTYPES_ mb.AddEnumInfo(MetaName.rage__ePriorityLevel); //PRI_ } - if ((AllArchetypes != null) && (AllArchetypes.Any(x => x is TimeArchetype))) + if (AllArchetypes is not null && AllArchetypes.Any(x => x is TimeArchetype)) { mb.AddStructureInfo(MetaName.CTimeArchetypeDef); } - if (CompositeEntityTypes?.Length > 0) + if (CompositeEntityTypes.Length > 0) { mb.AddStructureInfo(MetaName.CCompositeEntityType); } - - mb.AddItem(MetaName.CMapTypes, mapTypes); + mb.AddItem(MetaName.CMapTypes, in mapTypes); Meta meta = mb.GetMeta(); byte[] data = ResourceBuilder.Build(meta, 2); @@ -179,101 +175,117 @@ namespace CodeWalker.GameFiles Loaded = true; } + public async ValueTask LoadAsync(byte[] data) + { + //direct load from a raw, compressed ytyp file (openIV-compatible format) + + await RpfFile.LoadResourceFileAsync(this, data, 2); + + Loaded = true; + } + public void Load(byte[] data, RpfFileEntry entry) { Name = entry.Name; RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - MemoryStream ms = new MemoryStream(data); - if (RbfFile.IsRBF(ms)) + if (RbfFile.IsRBF(data.AsSpan(0, 4))) { Rbf = new RbfFile(); - Rbf.Load(ms); + Rbf.Load(data); } - else if (PsoFile.IsPSO(ms)) + else if (PsoFile.IsPSO(data.AsSpan(0, 4))) { Pso = new PsoFile(); - Pso.Load(ms); - //PsoTypes.EnsurePsoTypes(Pso); - } - else - { + Pso.Load(data); } return; } - - - - using var rd = new ResourceDataReader(resentry, data); - Meta = rd.ReadBlock(); + var meta = rd.ReadBlock(); + Meta = meta; - _CMapTypes = MetaTypes.GetTypedData(Meta, MetaName.CMapTypes); + _CMapTypes = MetaTypes.GetTypedData(meta, MetaName.CMapTypes); + var ptrs = MetaTypes.GetPointerArray(meta, in _CMapTypes.archetypes); + //List allarchs = new List(ptrs.Length); - List allarchs = new List(); - - var ptrs = MetaTypes.GetPointerArray(Meta, _CMapTypes.archetypes); - if (ptrs != null) + if (ptrs.Length > 0) { + Archetype[] allarchs = new Archetype[ptrs.Length]; + var count = 0; for (int i = 0; i < ptrs.Length; i++) { - var ptr = ptrs[i]; + ref var ptr = ref ptrs[i]; var offset = ptr.Offset; var block = Meta.GetBlock(ptr.BlockID); if (block == null) - { continue; } + { + continue; + } if ((offset < 0) || (block.Data == null) || (offset >= block.Data.Length)) - { continue; } + { + continue; + } - Archetype a = null; + Archetype? a; switch (block.StructureNameHash) { case MetaName.CBaseArchetypeDef: - var basearch = PsoTypes.ConvertDataRaw(block.Data, offset); + //PsoTypes.TryConvertDataRaw(block.Data, offset, out var basearch); a = new Archetype(); - a.Init(this, ref basearch); - a.Extensions = MetaTypes.GetExtensions(Meta, basearch.extensions); + a.Init(this, block.Data.AsSpan(offset)); + a.Extensions = MetaTypes.GetExtensions(meta, in a._BaseArchetypeDef.extensions) ?? []; break; case MetaName.CTimeArchetypeDef: - var timearch = PsoTypes.ConvertDataRaw(block.Data, offset); + //PsoTypes.TryConvertDataRaw(block.Data, offset, out var timearch); var ta = new TimeArchetype(); - ta.Init(this, ref timearch); - ta.Extensions = MetaTypes.GetExtensions(Meta, timearch._BaseArchetypeDef.extensions); + ta.Init(this, block.Data.AsSpan(offset)); + ta.Extensions = MetaTypes.GetExtensions(meta, in ta._BaseArchetypeDef.extensions) ?? []; a = ta; break; case MetaName.CMloArchetypeDef: - var mloarch = PsoTypes.ConvertDataRaw(block.Data, offset); + //PsoTypes.TryConvertDataRaw(block.Data, offset, out var mloarch); var ma = new MloArchetype(); - ma.Init(this, ref mloarch); - ma.Extensions = MetaTypes.GetExtensions(Meta, mloarch._BaseArchetypeDef.extensions); + ma.Init(this, block.Data.AsSpan(offset)); + ma.Extensions = MetaTypes.GetExtensions(meta, in ma._BaseArchetypeDef.extensions) ?? []; ma.LoadChildren(Meta); a = ma; break; default: + a = null; continue; } - if (a != null) + if (a is not null) { - allarchs.Add(a); + allarchs[count] = a; + count++; } } + + + if (allarchs.Length != count) + { + Console.WriteLine("Resizing array"); + Array.Resize(ref allarchs, count); + } + + allArchetypes = allarchs; + } + else + { + allArchetypes = []; } - AllArchetypes = allarchs.ToArray(); - Extensions = MetaTypes.GetExtensions(Meta, _CMapTypes.extensions); - - if (Extensions != null) - { } + Extensions = MetaTypes.GetExtensions(Meta, in _CMapTypes.extensions) ?? Array.Empty(); //AudioEmitters = MetaTypes.GetTypedDataArray(Meta, MetaName.CExtensionDefAudioEmitter); @@ -283,12 +295,10 @@ namespace CodeWalker.GameFiles //CEntityDefs = MetaTypes.GetTypedDataArray(Meta, MetaName.CEntityDef); - CompositeEntityTypes = MetaTypes.ConvertDataArray(Meta, MetaName.CCompositeEntityType, _CMapTypes.compositeEntityTypes); - if (CompositeEntityTypes != null) - { } + CompositeEntityTypes = MetaTypes.ConvertDataArray(Meta, MetaName.CCompositeEntityType, in _CMapTypes.compositeEntityTypes) ?? Array.Empty(); NameHash = _CMapTypes.name; - if ((NameHash == 0) && (entry.Name != null)) + if (NameHash == 0 && entry.Name is not null) { int ind = entry.Name.LastIndexOf('.'); if (ind > 0) @@ -301,16 +311,11 @@ namespace CodeWalker.GameFiles } } - Strings = MetaTypes.GetStrings(Meta); - if (Strings != null) + foreach(var str in Strings) { - foreach (string str in Strings) - { - JenkIndex.Ensure(str); //just shove them in there - } + JenkIndex.Ensure(str); //just shove them in there } - //foreach (var block in Meta.DataBlocks) //{ // switch(block.StructureNameHash) @@ -364,22 +369,26 @@ namespace CodeWalker.GameFiles public void AddArchetype(Archetype archetype) { - if (AllArchetypes == null) - AllArchetypes = new Archetype[0]; + allArchetypes ??= Array.Empty(); - List archetypes = AllArchetypes.ToList(); + Array.Resize(ref allArchetypes, allArchetypes.Length + 1); + allArchetypes[allArchetypes.Length - 1] = archetype; archetype.Ytyp = this; - archetypes.Add(archetype); - AllArchetypes = archetypes.ToArray(); } public Archetype AddArchetype() { - var a = new Archetype(); - a._BaseArchetypeDef.assetType = rage__fwArchetypeDef__eAssetType.ASSET_TYPE_DRAWABLE; - a._BaseArchetypeDef.lodDist = 60; - a._BaseArchetypeDef.hdTextureDist = 15; - a.Ytyp = this; + var a = new Archetype + { + _BaseArchetypeDef = new CBaseArchetypeDef + { + assetType = rage__fwArchetypeDef__eAssetType.ASSET_TYPE_DRAWABLE, + lodDist = 60, + hdTextureDist = 15, + }, + Ytyp = this + }; + AddArchetype(a); return a; } diff --git a/CodeWalker.Core/GameFiles/FileTypes/YvrFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YvrFile.cs index c0f7ecb..7d50fa2 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YvrFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YvrFile.cs @@ -25,10 +25,10 @@ namespace CodeWalker.GameFiles RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); diff --git a/CodeWalker.Core/GameFiles/FileTypes/YwrFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YwrFile.cs index 7f8a0f1..d3f3ce0 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YwrFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YwrFile.cs @@ -25,10 +25,10 @@ namespace CodeWalker.GameFiles RpfFileEntry = entry; - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - if (resentry == null) + if (entry is not RpfResourceFileEntry resentry) { - throw new Exception("File entry wasn't a resource! (is it binary data?)"); + ThrowFileIsNotAResourceException(); + return; } using var rd = new ResourceDataReader(resentry, data); diff --git a/CodeWalker.Core/GameFiles/GameFile.cs b/CodeWalker.Core/GameFiles/GameFile.cs index aa115a1..b6b01f8 100644 --- a/CodeWalker.Core/GameFiles/GameFile.cs +++ b/CodeWalker.Core/GameFiles/GameFile.cs @@ -1,58 +1,159 @@  using System; using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace CodeWalker.GameFiles { - public abstract class GameFile : Cacheable + + // This would make more sense as a enum, but that would cause lots of bloat casting values + public static class LoadState { - public volatile bool Loaded = false; - public volatile bool LoadQueued = false; + public const int None = 0; + public const int Loaded = 1; + public const int LoadQueued = 2; + } + public abstract class GameFile : Cacheable, IDisposable + { + public byte LoadAttempts = 0; + + public int loadState = (int)LoadState.None; + + [NotifyParentProperty(true)] + public bool LoadQueued { + get => (loadState & LoadState.LoadQueued) == LoadState.LoadQueued; + set { + if (value) + { + Interlocked.Or(ref loadState, LoadState.LoadQueued); + } + else + { + Interlocked.And(ref loadState, ~LoadState.LoadQueued); + } + } + } + + [NotifyParentProperty(true)] + public bool Loaded + { + get => (loadState & LoadState.Loaded) == LoadState.Loaded; + set + { + if (value) + { + Interlocked.Or(ref loadState, LoadState.Loaded); + } + else + { + Interlocked.And(ref loadState, ~LoadState.Loaded); + } + } + } + public DateTime LastLoadTime = DateTime.MinValue; - public RpfFileEntry RpfFileEntry { get; set; } + public RpfFileEntry? RpfFileEntry { get; set; } public string Name { get; set; } public string FilePath { get; set; } //used by the project form. public GameFileType Type { get; set; } + public bool IsDisposed { get; set; } = false; - public GameFile(RpfFileEntry entry, GameFileType type) + public GameFile(RpfFileEntry? entry, GameFileType type) { RpfFileEntry = entry; Type = type; MemoryUsage = (entry != null) ? entry.GetFileSize() : 0; - if (entry is RpfResourceFileEntry) + if (entry is RpfResourceFileEntry resent) { - var resent = entry as RpfResourceFileEntry; var newuse = resent.SystemSize + resent.GraphicsSize; MemoryUsage = newuse; } - else if (entry is RpfBinaryFileEntry) + else if (entry is RpfBinaryFileEntry binent) { - var binent = entry as RpfBinaryFileEntry; var newuse = binent.FileUncompressedSize; if (newuse > MemoryUsage) { MemoryUsage = newuse; } } + } + + public bool SetLoadQueued(bool value) + { + if (value) + { + return (Interlocked.Or(ref loadState, LoadState.LoadQueued) & LoadState.LoadQueued) == 0; + } else { + return (Interlocked.And(ref loadState, ~LoadState.LoadQueued) & LoadState.LoadQueued) == LoadState.LoadQueued; } } - public override string ToString() + public bool SetLoaded(bool value) { - return (string.IsNullOrEmpty(Name)) ? JenkIndex.GetString(Key.Hash) : Name; + if (value) + { + return (Interlocked.Or(ref loadState, LoadState.Loaded) & LoadState.Loaded) == 0; + } + else + { + return (Interlocked.And(ref loadState, ~LoadState.Loaded) & LoadState.Loaded) == LoadState.Loaded; + } } + public override string ToString() => string.IsNullOrEmpty(Name) ? JenkIndex.GetString(Key.Hash) : Name; + public virtual void Dispose() + { + IsDisposed = true; + GC.SuppressFinalize(this); + } + + [DoesNotReturn] + public static void ThrowFileIsNotAResourceException() + { + throw new Exception("File entry wasn't a resource! (is it binary data?)"); + } + } + + public class GameFileByPathComparer : IEqualityComparer + { + public static readonly GameFileByPathComparer Instance = new GameFileByPathComparer(); + public bool Equals(GameFile? x, GameFile? y) + { + if (x is null && y is null) + return true; + if (x is null || y is null) + return false; + if (ReferenceEquals(x, y)) + return true; + + if (x.Type != y.Type) + return false; + + if (x.RpfFileEntry is null && y.RpfFileEntry is null) + return true; + if (x.RpfFileEntry is null || y.RpfFileEntry is null) + return false; + + return x.RpfFileEntry.Path.Equals(y.RpfFileEntry.Path, StringComparison.OrdinalIgnoreCase); + } + + public int GetHashCode([DisallowNull] GameFile obj) + { + return HashCode.Combine(obj.RpfFileEntry?.Path.GetHashCode(StringComparison.OrdinalIgnoreCase) ?? 0, obj.Type); + } } - public enum GameFileType : int + public enum GameFileType : byte { Ydd = 0, Ydr = 1, @@ -86,52 +187,12 @@ namespace CodeWalker.GameFiles Mrf = 29, DistantLights = 30, Ypdb = 31, + PedShopMeta = 32, } - public struct GameFileCacheKey : IEquatable - { - public uint Hash { get; set; } - public GameFileType Type { get; set; } - - public GameFileCacheKey(uint hash, GameFileType type) - { - Hash = hash; - Type = type; - } - - public override readonly bool Equals(object obj) - { - if (obj == null) - return false; - if (obj is not GameFileCacheKey gameFileCacheKey) - return false; - return gameFileCacheKey.Hash == Hash && gameFileCacheKey.Type == Type; - } - - public readonly bool Equals(GameFileCacheKey obj) - { - if (obj == null) - return false; - return obj.Hash == Hash && obj.Type == Type; - } - - public static bool operator ==(GameFileCacheKey first, GameFileCacheKey second) - { - return first.Equals(second); - } - - public static bool operator !=(GameFileCacheKey first, GameFileCacheKey second) - { - return !first.Equals(second); - } - - public override readonly int GetHashCode() - { - return (int)Hash; - } - } + public readonly record struct GameFileCacheKey(uint Hash, GameFileType Type); } diff --git a/CodeWalker.Core/GameFiles/GameFileCache.cs b/CodeWalker.Core/GameFiles/GameFileCache.cs index dc38797..b28d248 100644 --- a/CodeWalker.Core/GameFiles/GameFileCache.cs +++ b/CodeWalker.Core/GameFiles/GameFileCache.cs @@ -1,10 +1,17 @@ -using CodeWalker.Core.Utils; +using CodeWalker.Core.GameFiles.FileTypes; +using CodeWalker.Core.GameFiles.Resources; +using CodeWalker.Core.Utils; +using CodeWalker.World; +using Collections.Pooled; +using CommunityToolkit.HighPerformance; using SharpDX; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -14,6 +21,7 @@ namespace CodeWalker.GameFiles { public partial class GameFileCache { + public static GameFileCache Instance; public RpfManager RpfMan; public event Action UpdateStatus; public event Action ErrorLog; @@ -23,13 +31,16 @@ namespace CodeWalker.GameFiles ////dynamic cache private Cache mainCache; + + public Cache MainCache => mainCache; + public volatile bool IsInited = false; private volatile bool archetypesLoaded = false; - private ConcurrentDictionary archetypeDict = new ConcurrentDictionary(); + private Dictionary archetypeDict; private ConcurrentDictionary textureLookup = new ConcurrentDictionary(); private Dictionary textureParents; - private Dictionary hdtexturelookup; + private ConcurrentDictionary hdtexturelookup; private object updateSyncRoot = new object(); private object requestSyncRoot = new object(); @@ -73,21 +84,23 @@ namespace CodeWalker.GameFiles public List DlcActiveRpfs { get; set; } = new List(); public List DlcSetupFiles { get; set; } = new List(); public List DlcExtraFolderMounts { get; set; } = new List(); - public Dictionary DlcPatchedPaths { get; set; } = new Dictionary(); + public Dictionary DlcPatchedPaths { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); public List DlcCacheFileList { get; set; } = new List(); public List DlcNameList { get; set; } = new List(); + public Dictionary DlcNameLookup { get; set; } = new Dictionary(); public string SelectedDlc { get; set; } = string.Empty; - public Dictionary ActiveMapRpfFiles { get; set; } = new Dictionary(); + public Dictionary ActiveMapRpfFiles { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); public Dictionary TimeCycleModsDict = new Dictionary(); public Dictionary VehiclesInitDict { get; set; } public Dictionary PedsInitDict { get; set; } - public Dictionary PedVariationsDict { get; set; } + public Dictionary> PedVariationsDict { get; set; } public Dictionary> PedDrawableDicts { get; set; } public Dictionary> PedTextureDicts { get; set; } public Dictionary> PedClothDicts { get; set; } + public Dictionary PedsFiles { get; set; } public List AudioDatRelFiles; @@ -124,35 +137,11 @@ namespace CodeWalker.GameFiles - public int QueueLength - { - get - { - return requestQueue.Count; - } - } - public int ItemCount - { - get - { - return mainCache.Count; - } - } - public long MemoryUsage - { - get - { - return mainCache.CurrentMemoryUsage; - } - } + public int QueueLength => requestQueue.Count; + public int ItemCount => mainCache.Count; + public long MemoryUsage => mainCache.CurrentMemoryUsage; - public long MaxMemoryUsage - { - get - { - return mainCache.MaxMemoryUsage; - } - } + public long MaxMemoryUsage => mainCache.MaxMemoryUsage; @@ -165,6 +154,8 @@ namespace CodeWalker.GameFiles GTAFolder = folder; ExcludeFolders = excludeFolders; Key = key; + + Instance = this; } @@ -176,7 +167,7 @@ namespace CodeWalker.GameFiles //textureLookup.Clear(); - requestQueue.Clear(); + //requestQueue.Clear(); } public void SetGtaFolder(string folder) @@ -187,7 +178,7 @@ namespace CodeWalker.GameFiles } public volatile bool IsIniting = false; - public void Init(Action updateStatus = null, Action errorLog = null, bool force = true) + public async Task InitAsync(Action updateStatus = null, Action errorLog = null, bool force = true) { if (IsIniting) { @@ -215,7 +206,7 @@ namespace CodeWalker.GameFiles InitGlobal(); - InitDlc(); + await InitDlcAsync(); @@ -274,7 +265,7 @@ namespace CodeWalker.GameFiles IsIniting = false; } } - public void Init(Action updateStatus, Action errorLog, List allRpfs, bool force = true) + public async Task InitAsync(Action? updateStatus, Action? errorLog, List allRpfs, bool force = true) { if (IsIniting) { @@ -285,12 +276,13 @@ namespace CodeWalker.GameFiles IsIniting = true; try { + ETWEvents.Log.InitFileCacheStart(); using var _ = new DisposableTimer("GameFileCache.Init"); - if (updateStatus != null) + if (updateStatus is not null) { UpdateStatus += updateStatus; } - if (errorLog != null) + if (errorLog is not null) { ErrorLog += errorLog; } @@ -307,18 +299,24 @@ namespace CodeWalker.GameFiles BaseRpfs = allRpfs; DlcRpfs = new List(); - - Task.WhenAll( - Task.Run(() => InitGlobalDicts(force)), - Task.Run(() => InitManifestDicts(force)), - Task.Run(() => InitGtxds(force)), - Task.Run(() => InitArchetypeDicts(force)), - Task.Run(() => InitStringDictsAsync(force)), - Task.Run(() => InitAudio(force)) - ).GetAwaiter().GetResult(); + InitGlobalDicts(force); + await InitManifestDicts(force); + await InitGtxds(force); + await InitArchetypeDicts(force); + await InitStringDictsAsync(force); + await InitAudio(force); + //await Task.WhenAll( + // Task.Run(() => InitGlobalDicts(force)), + // InitManifestDicts(force), + // InitGtxds(force), + // InitArchetypeDicts(force), + // InitStringDictsAsync(force), + // InitAudio(force) + //); vehicleFiles.Clear(); + ETWEvents.Log.InitFileCacheStop(); IsInited = true; } catch (Exception ex) { @@ -341,25 +339,35 @@ namespace CodeWalker.GameFiles InitGlobalDicts(); } - private void InitDlc(bool force = true) + private async Task InitDlcAsync(bool force = true) { InitDlcList(); InitActiveMapRpfFiles(); - Task.WhenAll( - Task.Run(() => { - InitMapDicts(force); - InitMapCaches(force); - }), - Task.Run(() => InitManifestDicts(force)), - Task.Run(() => InitArchetypeDicts(force)), - Task.Run(() => InitStringDictsAsync(force)), - Task.Run(() => InitVehicles(force)), - Task.Run(() => InitPeds(force)), - Task.Run(() => InitAudio(force)), - Task.Run(() => InitGtxds(force)) - ).GetAwaiter().GetResult(); + InitMapDicts(force); + InitMapCaches(force); + await InitManifestDicts(force); + await InitArchetypeDicts(force); + await InitStringDictsAsync(force); + await InitVehicles(force); + await InitPeds(force); + await InitAudio(force); + await InitGtxds(force); + + //await Task.WhenAll( + // Task.Run(() => { + // InitMapDicts(force); + // InitMapCaches(force); + // }), + // Task.Run(() => InitManifestDicts(force)), + // Task.Run(() => InitArchetypeDicts(force)), + // Task.Run(() => InitStringDictsAsync(force)), + // Task.Run(() => InitVehicles(force)), + // Task.Run(() => InitPeds(force)), + // Task.Run(() => InitAudio(force)), + // Task.Run(() => InitGtxds(force)) + //); vehicleFiles.Clear(); } @@ -381,6 +389,7 @@ namespace CodeWalker.GameFiles if ((dlclistxml == null) || (dlclistxml.DocumentElement == null)) { ErrorLog?.Invoke("InitDlcList: Couldn't load " + dlclistpath + "."); + Console.WriteLine("InitDlcList: Couldn't load " + dlclistpath + "."); } else { @@ -410,6 +419,8 @@ namespace CodeWalker.GameFiles } } + var xmlContentFileNameTable = new NameTable(); + //find all the paths for patched files in update.rpf and build the dict @@ -417,13 +428,13 @@ namespace CodeWalker.GameFiles string updrpfpath = "update\\update.rpf"; var updrpffile = RpfMan.FindRpfFile(updrpfpath); - if (updrpffile != null) + if (updrpffile is not null) { XmlDocument updsetupdoc = RpfMan.GetFileXml(updrpfpath + "\\setup2.xml"); DlcSetupFile updsetupfile = new DlcSetupFile(); updsetupfile.Load(updsetupdoc); - XmlDocument updcontentdoc = RpfMan.GetFileXml(updrpfpath + "\\" + updsetupfile.datFile); + using XmlReader updcontentdoc = RpfMan.GetFileXmlReader($"{updrpfpath}\\{updsetupfile.datFile}", xmlContentFileNameTable); DlcContentFile updcontentfile = new DlcContentFile(); updcontentfile.Load(updcontentdoc); @@ -447,11 +458,12 @@ namespace CodeWalker.GameFiles { continue; } - var dlcpath = dlcfile.Path + "\\"; + var dlcpath = $"{dlcfile.Path}\\"; var files = updrpffile.GetFiles(relpath, true); foreach (var file in files) { - if (file == null) continue; + if (file is null) + continue; var fpath = file.Path; var frelpath = fpath.Replace(updrpfpath, "update:").Replace('\\', '/').Replace(lpath, dlcpath).Replace('/', '\\'); if (frelpath.StartsWith("mods\\", StringComparison.OrdinalIgnoreCase)) @@ -465,7 +477,8 @@ namespace CodeWalker.GameFiles } else { - ErrorLog("InitDlcList: update.rpf not found!"); + ErrorLog?.Invoke("InitDlcList: update.rpf not found!"); + Console.WriteLine("InitDlcList: update.rpf not found!"); } @@ -481,13 +494,13 @@ namespace CodeWalker.GameFiles { try { - string setuppath = GetDlcPatchedPath(dlcfile.Path + "\\setup2.xml"); + string setuppath = GetDlcPatchedPath($"{dlcfile.Path}\\setup2.xml"); XmlDocument setupdoc = RpfMan.GetFileXml(setuppath); DlcSetupFile setupfile = new DlcSetupFile(); setupfile.Load(setupdoc); - string contentpath = GetDlcPatchedPath(dlcfile.Path + "\\" + setupfile.datFile); - XmlDocument contentdoc = RpfMan.GetFileXml(contentpath); + string contentpath = GetDlcPatchedPath($"{dlcfile.Path}\\{setupfile.datFile}"); + using XmlReader contentdoc = RpfMan.GetFileXmlReader(contentpath, xmlContentFileNameTable); DlcContentFile contentfile = new DlcContentFile(); contentfile.Load(contentdoc); @@ -506,7 +519,8 @@ namespace CodeWalker.GameFiles } catch (Exception ex) { - ErrorLog("InitDlcList: Error processing DLC " + path + "\n" + ex.ToString()); + ErrorLog?.Invoke($"InitDlcList: Error processing DLC {path}\n{ex}"); + Console.WriteLine(ex); } } } @@ -518,8 +532,9 @@ namespace CodeWalker.GameFiles DlcNameList.Clear(); foreach (var sfile in DlcSetupFiles) { - if ((sfile == null) || (sfile.DlcFile == null)) continue; - DlcNameList.Add(GetDlcNameFromPath(sfile.DlcFile.Path).ToLowerInvariant()); + if ((sfile == null) || (sfile.DlcFile == null)) + continue; + DlcNameList.Add(GetDlcNameFromPath(sfile.DlcFile.Path)); } if (DlcNameList.Count > 0) @@ -615,7 +630,7 @@ namespace CodeWalker.GameFiles //int maxdlcorder = 10000000; - Dictionary> overlays = new Dictionary>(); + Dictionary> overlays = new Dictionary>(StringComparer.OrdinalIgnoreCase); foreach (var setupfile in DlcSetupFiles) { @@ -631,13 +646,15 @@ namespace CodeWalker.GameFiles for (int i = 1; i <= setupfile.subPackCount; i++) { - var subpackPath = dlcfile.Path.Replace("\\dlc.rpf", "\\dlc" + i.ToString() + ".rpf"); + var subpackPath = dlcfile.Path.Replace("\\dlc.rpf", $"\\dlc{i}.rpf"); var subpack = RpfMan.FindRpfFile(subpackPath); if (subpack != null) { DlcActiveRpfs.Add(subpack); - if (setupfile.DlcSubpacks == null) setupfile.DlcSubpacks = new List(); + if (setupfile.DlcSubpacks is null) + setupfile.DlcSubpacks = new List(); + setupfile.DlcSubpacks.Add(subpack); } } @@ -666,19 +683,40 @@ namespace CodeWalker.GameFiles - DlcExtraFolderMountFile extramount; - DlcContentDataFile rpfdatafile; + DlcExtraFolderMountFile? extramount; + DlcContentDataFile? rpfdatafile; foreach (var changeset in contentfile.contentChangeSets) { if (changeset.useCacheLoader) { - uint cachehash = JenkHash.GenHash(changeset.changeSetName.ToLowerInvariant()); - string cachefilename = dlcname + "_" + cachehash.ToString() + "_cache_y.dat"; - string cachefilepath = dlcfile.Path + "\\x64\\data\\cacheloaderdata_dlc\\" + cachefilename; + uint cachehash = JenkHash.GenHashLower(changeset.changeSetName); + string cachefilename = $"{dlcname}_{cachehash}_cache_y.dat"; + string cachefilepath = $"{dlcfile.Path}\\x64\\data\\cacheloaderdata_dlc\\{cachefilename}"; string cachefilepathpatched = GetDlcPatchedPath(cachefilepath); - DlcCacheFileList.Add(cachefilepathpatched); + var entry = RpfMan.GetEntry(cachefilepathpatched); + if (entry is not null) + { + DlcCacheFileList.Add(cachefilepathpatched); + } + else + { + if (setupfile.DlcSubpacks is not null) + { + foreach(var subfile in setupfile.DlcSubpacks) + { + cachefilepath = $"{subfile.Path}\\x64\\data\\cacheloaderdata_dlc\\{cachefilename}"; + cachefilepathpatched = GetDlcPatchedPath(cachefilepath); + entry = RpfMan.GetEntry(cachefilepathpatched); + if (entry is not null) + { + DlcCacheFileList.Add(cachefilepathpatched); + break; + } + } + } + } //if ((changeset.mapChangeSetData != null) && (changeset.mapChangeSetData.Count > 0)) //{ } @@ -721,38 +759,27 @@ namespace CodeWalker.GameFiles AddDlcActiveMapRpfFile(dfn, phpath, setupfile); } - else - { - if (dfn.EndsWith(".rpf")) - { } - } } } - if (changeset.executionConditions != null) - { } + //if (changeset.executionConditions != null) + //{ } if (changeset.mapChangeSetData != null) { foreach (var mapcs in changeset.mapChangeSetData) { - //if (mapcs.mapChangeSetData != null) - //{ }//not used if (mapcs.filesToInvalidate != null) { foreach (string file in mapcs.filesToInvalidate) { string upath = GetDlcMountedPath(file); string fpath = GetDlcPlatformPath(upath); - if (fpath.EndsWith(".rpf")) + if (fpath.EndsWith(".rpf", StringComparison.OrdinalIgnoreCase)) { RemoveDlcActiveMapRpfFile(fpath, overlays); } - else - { } //how to deal with individual files? milo_.interior } } - if (mapcs.filesToDisable != null) - { } if (mapcs.filesToEnable != null) { foreach (string file in mapcs.filesToEnable) @@ -761,9 +788,6 @@ namespace CodeWalker.GameFiles string umpath = GetDlcUnmountedPath(fpath); string phpath = GetDlcRpfPhysicalPath(umpath, setupfile); - if (fpath != umpath) - { } - AddDlcOverlayRpf(fpath, umpath, setupfile, overlays); AddDlcActiveMapRpfFile(fpath, phpath, setupfile); @@ -787,17 +811,13 @@ namespace CodeWalker.GameFiles private void AddDlcActiveMapRpfFile(string vpath, string phpath, DlcSetupFile setupfile) { - vpath = vpath.ToLowerInvariant(); - phpath = phpath.ToLowerInvariant(); - if (phpath.EndsWith(".rpf")) + if (phpath.EndsWith(".rpf", StringComparison.OrdinalIgnoreCase)) { RpfFile rpffile = RpfMan.FindRpfFile(phpath); if (rpffile != null) { - ActiveMapRpfFiles[vpath] = rpffile; + ActiveMapRpfFiles[vpath.ToLowerInvariant()] = rpffile; } - else - { } } else { } //how to handle individual files? eg interiorProxies.meta @@ -825,8 +845,6 @@ namespace CodeWalker.GameFiles { ActiveMapRpfFiles.Remove(overlayPath); } - else - { } } overlays.Remove(vpath); } @@ -910,6 +928,28 @@ namespace CodeWalker.GameFiles } return path; } + public static ReadOnlySpan GetFilePathWithoutDeviceName(ReadOnlySpan path) + { + var index = path.IndexOf(":"); + + if (index > 0) + { + return path.Slice(index + 2); + } + + return path; + } + public static ReadOnlySpan GetDeviceNameFromPath(ReadOnlySpan path) + { + var index = path.IndexOf(":"); + + if (index > 0) + { + return path.Slice(0, index); + } + + return path; + } public static string GetDlcPlatformPath(string path) { return path.Replace("%PLATFORM%", "x64").Replace('\\', '/').Replace("platform:", "x64").ToLowerInvariant(); @@ -920,7 +960,7 @@ namespace CodeWalker.GameFiles { foreach (var fm in efm.FolderMounts) { - if ((fm.platform == null) || (fm.platform == "x64")) + if (fm.platform is null || fm.platform == "x64") { if (path.StartsWith(fm.path, StringComparison.OrdinalIgnoreCase)) { @@ -1014,7 +1054,8 @@ namespace CodeWalker.GameFiles YedDict ??= new Dictionary(300); foreach (var rpffile in AllRpfs) { - if (rpffile.AllEntries == null) continue; + if (rpffile.AllEntries is null) + continue; foreach (var entry in rpffile.AllEntries) { if (entry is RpfFileEntry fentry) @@ -1063,7 +1104,8 @@ namespace CodeWalker.GameFiles AllYmapsDict.Clear(); foreach (var rpffile in ActiveMapRpfFiles.Values) //RpfMan.BaseRpfs) { - if (rpffile.AllEntries == null) continue; + if (rpffile.AllEntries is null) + continue; foreach (var entry in rpffile.AllEntries) { if (entry is RpfFileEntry fentry) @@ -1090,20 +1132,23 @@ namespace CodeWalker.GameFiles Console.WriteLine($"YmapDict: {YmapDict.Count}; YbnDict: {YbnDict.Count}; YnvDict: {YnvDict.Count}; AllYmapsDict: {AllYmapsDict.Count};"); } - private async ValueTask InitManifestDicts(bool force = true) + private async Task InitManifestDicts(bool force = true) { UpdateStatus?.Invoke("Loading manifests..."); using var _ = new DisposableTimer("InitManifestDicts"); AllManifests ??= new List(2000); - hdtexturelookup ??= new Dictionary(24000); + hdtexturelookup ??= new ConcurrentDictionary(Environment.ProcessorCount, 24000); AllManifests.Clear(); hdtexturelookup.Clear(); IEnumerable rpfs = PreloadedMode ? AllRpfs : ActiveMapRpfFiles.Values; - await Parallel.ForEachAsync(rpfs, async (file, cancellationToken) => - { - if (file.AllEntries == null) - return; + var allManifests = new ConcurrentBag(); + + var filteredRpfs = rpfs.Where(p => p.AllEntries is not null).ToArray(); + + await Parallel.ForAsync(0, filteredRpfs.Length, async (i, cancellationToken) => + { + var file = filteredRpfs[i]; //manifest and meta parsing.. foreach (RpfEntry entry in file.AllEntries) { @@ -1114,43 +1159,35 @@ namespace CodeWalker.GameFiles try { UpdateStatus?.Invoke(entry.Path); - YmfFile ymffile = await RpfMan.GetFileAsync(entry).ConfigureAwait(false); - if (ymffile != null) + YmfFile? ymffile = await RpfManager.GetFileAsync(entry); + if (ymffile is null) + return; + + allManifests.Add(ymffile); + + foreach(var b in ymffile.HDTxdAssetBindings) { - lock(AllManifests) - { - AllManifests.Add(ymffile); - } - - if (ymffile.HDTxdAssetBindings != null) - { - for (int i = 0; i < ymffile.HDTxdAssetBindings.Length; i++) - { - var b = ymffile.HDTxdAssetBindings[i]; - var targetasset = JenkHash.GenHashLower(b.targetAsset.ToString()); - var hdtxd = JenkHash.GenHashLower(b.HDTxd.ToString()); - lock(hdtexturelookup) - { - hdtexturelookup[targetasset] = hdtxd; - } - } - } - + var targetasset = JenkHash.GenHashLower(b._targetAsset.GetBytesNullTerminated()); + var hdtxd = JenkHash.GenHashLower(b._HDTxd.GetBytesNullTerminated()); + hdtexturelookup[targetasset] = hdtxd; } } catch (Exception ex) { - string errstr = entry.Path + "\n" + ex.ToString(); + string errstr = $"{entry.Path}\n{ex}"; ErrorLog?.Invoke(errstr); Console.WriteLine(errstr); } } }).ConfigureAwait(false); + AllManifests.AddRange(allManifests); + Console.WriteLine($"hdtexturelookup: {hdtexturelookup.Count}; AllManifests: {AllManifests.Count};"); } private static ConcurrentDictionary vehicleFiles = new(4, 72, StringComparer.OrdinalIgnoreCase); + [SkipLocalsInit] private async Task InitGtxds(bool force = true) { UpdateStatus?.Invoke("Loading global texture list..."); @@ -1159,11 +1196,12 @@ namespace CodeWalker.GameFiles IEnumerable rpfs = PreloadedMode ? AllRpfs : (IEnumerable)ActiveMapRpfFiles.Values; - static void addTxdRelationships(Dictionary from, ConcurrentDictionary parentTxds) { - foreach (var kvp in from) + [SkipLocalsInit] + static void addTxdRelationships(PooledDictionary from, ConcurrentDictionary parentTxds) { + foreach (var (key, value) in from) { - uint chash = JenkHash.GenHashLower(kvp.Key); - uint phash = JenkHash.GenHashLower(kvp.Value); + uint chash = JenkHash.GenHashLower(key); + uint phash = JenkHash.GenHashLower(value); parentTxds.TryAdd(chash, phash); } @@ -1177,8 +1215,11 @@ namespace CodeWalker.GameFiles allRpfs = allRpfs.Concat(DlcActiveRpfs); } - await Parallel.ForEachAsync(allRpfs, async (file, cancellationToken) => + var filteredRpfs = allRpfs.ToArray(); + + await Parallel.ForAsync(0, filteredRpfs.Length, async (i, cancellationToken) => { + var file = filteredRpfs[i]; foreach (RpfEntry entry in file.AllEntries) { if ( @@ -1187,21 +1228,24 @@ namespace CodeWalker.GameFiles || entry.Name.Equals("mph4_gtxd.ymt", StringComparison.OrdinalIgnoreCase) ) { - GtxdFile ymt = await RpfMan.GetFileAsync(entry).ConfigureAwait(false); - if (ymt.TxdRelationships != null) + GtxdFile? ymt = await RpfManager.GetFileAsync(entry); + var txdRelationShips = ymt?.TxdRelationships; + if (txdRelationShips is not null) { - addTxdRelationships(ymt.TxdRelationships, parentTxds); + addTxdRelationships(txdRelationShips, parentTxds); } + ymt?.Dispose(); } else if (entry.Name.Equals("vehicles.meta", StringComparison.OrdinalIgnoreCase)) { if (!vehicleFiles.TryGetValue(entry.Path, out var vf)) { - vf = vehicleFiles[entry.Path] = await RpfMan.GetFileAsync(entry).ConfigureAwait(false); + vf = vehicleFiles[entry.Path] = await RpfManager.GetFileAsync(entry); } - if (vf.TxdRelationships != null) + var txdRelationShips = vf?.TxdRelationships; + if (txdRelationShips is not null) { - addTxdRelationships(vf.TxdRelationships, parentTxds); + addTxdRelationships(txdRelationShips, parentTxds); } } } @@ -1210,13 +1254,34 @@ namespace CodeWalker.GameFiles textureParents = parentTxds.ToDictionary(p => p.Key, p => p.Value); //ensure resident global texture dicts: - YtdFile ytd1 = new YtdFile(GetYtdEntry(JenkHash.GenHash("mapdetail"))); - LoadFile(ytd1); - AddTextureLookups(ytd1); + var ytdEntry1 = GetYtdEntry(JenkHash.GenHash("mapdetail")); + if (ytdEntry1 is null) + { + Console.WriteLine("Failed to load mapdetail.ytd!"); + throw new Exception("Failed to load mapdetail.ytd"); + } + else + { + YtdFile ytd1 = new YtdFile(); + LoadFile(ytd1); + AddTextureLookups(ytd1); + } + + var ytdEntry2 = GetYtdEntry(JenkHash.GenHash("vehshare")); + + if (ytdEntry2 is null) + { + Console.WriteLine("Failed to load vehshare.ytd!"); + throw new Exception("Failed to laod vehshare.ytd!"); + } + else + { + YtdFile ytd2 = new YtdFile(); + LoadFile(ytd2); + AddTextureLookups(ytd2); + } + - YtdFile ytd2 = new YtdFile(GetYtdEntry(JenkHash.GenHash("vehshare"))); - LoadFile(ytd2); - AddTextureLookups(ytd2); Console.WriteLine($"textureParents: {textureParents.Count}"); @@ -1235,7 +1300,7 @@ namespace CodeWalker.GameFiles try { var cache = RpfMan.GetFile(path); - if (cache != null) + if (cache is not null) { AllCacheFiles.Add(cache); foreach (var node in cache.AllMapNodes) @@ -1252,15 +1317,17 @@ namespace CodeWalker.GameFiles } else if (finalAttempt) { - ErrorLog(path + ": main cachefile not loaded! Possibly an unsupported GTAV installation version."); + ErrorLog($"{path}: main cachefile not loaded! Possibly an unsupported GTAV installation version."); } else //update\x64\dlcpacks\mpspecialraces\dlc.rpf\x64\data\cacheloaderdata_dlc\mpspecialraces_3336915258_cache_y.dat (hash of: mpspecialraces_interior_additions) - { } + { + Console.WriteLine($"Failed to load {path}"); + } return cache; } catch (Exception ex) { - ErrorLog(path + ": " + ex.ToString()); + ErrorLog($"{path}: {ex}"); } return null; } @@ -1299,13 +1366,19 @@ namespace CodeWalker.GameFiles archetypesLoaded = false; try { + archetypeDict ??= new Dictionary(175000); archetypeDict.Clear(); using var timer = new DisposableTimer("InitArchetypeDicts"); var rpfs = EnableDlc ? AllRpfs : BaseRpfs; var allYtypes = rpfs - .Where(p => p.AllEntries != null && (EnableDlc || !p.Path.StartsWith("update", StringComparison.OrdinalIgnoreCase))); + .Where(p => p.AllEntries != null); + + if (!EnableDlc) + { + allYtypes = allYtypes.Where(p => !p.Path.StartsWith("update", StringComparison.OrdinalIgnoreCase)); + } //.SelectMany(p => p.AllEntries.Where(p => p.IsExtension(".ytyp"))); //await allYtypes.ParallelForEachAsync(async (file) => @@ -1323,25 +1396,33 @@ namespace CodeWalker.GameFiles // } //}, maxDegreeOfParallelism: 8); - - await Parallel.ForEachAsync(allYtypes, async (file, cancellationToken) => + using (var timer1 = new DisposableTimer("InitArchetypeDicts GetFiles")) { - foreach (var entry in file.AllEntries) + var allYtypsArr = allYtypes.ToArray(); + await Parallel.ForAsync(0, allYtypsArr.Length, async (i, cancellationToken) => { - if (entry.IsExtension(".ytyp")) + var file = allYtypsArr[i]; + foreach (var entry in file.AllEntries) { - try + if (entry.IsExtension(".ytyp")) { - ytypCache.Add(await RpfMan.GetFileAsync(entry).ConfigureAwait(false)); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - ErrorLog(entry.Path + ": " + ex.ToString()); + try + { + var ytypFile = await RpfManager.GetFileAsync(entry); + if (ytypFile is not null) + ytypCache.Add(ytypFile); + else + Console.WriteLine($"Couldn't load file {entry.Path}"); + } + catch (Exception ex) + { + Console.WriteLine($"{entry.Path}: {ex}"); + ErrorLog($"{entry.Path}: {ex}"); + } } } - } - }).ConfigureAwait(false); + }); + } YtypDict = new Dictionary(ytypCache.Count); @@ -1350,6 +1431,8 @@ namespace CodeWalker.GameFiles AddYtypToDictionary(ytyp.RpfFileEntry, ytyp); } + Console.WriteLine($"archetypeDict: {archetypeDict.Count}"); + //Parallel.ForEach(allYtypes, new ParallelOptions { MaxDegreeOfParallelism = 4 }, (file) => //{ // foreach(var entry in file.AllEntries) @@ -1392,32 +1475,32 @@ namespace CodeWalker.GameFiles private void AddYtypToDictionary(RpfEntry entry, YtypFile ytypFile) { - if (ytypFile == null) + if (ytypFile is null) { throw new Exception("Couldn't load ytyp file."); //couldn't load the file for some reason... shouldn't happen.. } - if (ytypFile.Meta == null) + if (ytypFile.Meta is null) { - if (ytypFile.Pso == null && ytypFile.Rbf == null) + if (ytypFile.Pso is null && ytypFile.Rbf is null) { throw new Exception("ytyp file was not in meta format."); } return; } - ytypCache.Add(ytypFile); YtypDict[ytypFile.NameHash] = ytypFile; - if ((ytypFile.AllArchetypes == null) || (ytypFile.AllArchetypes.Length == 0)) + if (ytypFile.AllArchetypes.Length == 0) { - ErrorLog(entry.Path + ": no archetypes found"); + ErrorLog?.Invoke($"{entry.Path}: no archetypes found"); } else { foreach (var arch in ytypFile.AllArchetypes) { uint hash = arch.Hash; - if (hash == 0) continue; + if (hash == 0) + continue; archetypeDict[hash] = arch; } } @@ -1463,7 +1546,7 @@ namespace CodeWalker.GameFiles } - public async ValueTask InitStringDictsAsync(bool force = true) + public async Task InitStringDictsAsync(bool force = true) { UpdateStatus?.Invoke("Loading strings..."); using var timer = new DisposableTimer("InitStringDicts"); @@ -1486,12 +1569,11 @@ namespace CodeWalker.GameFiles if (DoFullStringIndex) { - var gxt2 = await RpfMan.GetFileAsync(entry).ConfigureAwait(false); - if (gxt2 != null) + var gxt2 = await RpfManager.GetFileAsync(entry); + if (gxt2 is not null) { - for (int i = 0; i < gxt2.TextEntries.Length; i++) + foreach(var e in gxt2.TextEntries) { - var e = gxt2.TextEntries[i]; GlobalText.Ensure(e.Text, e.Hash); } gxt2files.Add(gxt2); @@ -1505,12 +1587,11 @@ namespace CodeWalker.GameFiles if (!DoFullStringIndex) { string globalgxt2path = "x64b.rpf\\data\\lang\\" + langstr + ".rpf\\global.gxt2"; - var globalgxt2 = RpfMan.GetFile(globalgxt2path); - if (globalgxt2 != null) + var globalgxt2 = await RpfMan.GetFileAsync(globalgxt2path); + if (globalgxt2 is not null) { - for (int i = 0; i < globalgxt2.TextEntries.Length; i++) + foreach(var e in globalgxt2.TextEntries) { - var e = globalgxt2.TextEntries[i]; GlobalText.Ensure(e.Text, e.Hash); } } @@ -1560,7 +1641,24 @@ namespace CodeWalker.GameFiles StatsNames.FullIndexBuilt = true; } - public void InitVehicles(bool force = true) + public void AddInitDatas() + { + var vehiclesInitDict = VehiclesInitDict; + foreach (var vf in vehicleFiles.Values) + { + if (vf.InitDatas is not null) + { + foreach (var initData in vf.InitDatas.Span) + { + var name = initData.modelName; + var hash = JenkHash.GenHashLower(name); + vehiclesInitDict.TryAdd(hash, initData); + } + } + } + } + + public async Task InitVehicles(bool force = true) { if (!LoadVehicles) return; if (!force && VehiclesLoaded) return; @@ -1587,7 +1685,6 @@ namespace CodeWalker.GameFiles IEnumerable rpfs = PreloadedMode ? AllRpfs : (IEnumerable)ActiveMapRpfFiles.Values; - var allVehicles = new Dictionary(900); //var allCarCols = new List(); //var allCarModCols = new List(); //var allCarVariations = new List(); @@ -1601,7 +1698,7 @@ namespace CodeWalker.GameFiles allRpfs = allRpfs.Concat(DlcActiveRpfs); } - Parallel.ForEach(allRpfs.Where(p => p.AllEntries != null).SelectMany(p => p.AllEntries), (entry) => + await Parallel.ForEachAsync(allRpfs.Where(p => p.AllEntries != null).SelectMany(p => p.AllEntries), async (entry, _) => { if (!entry.Name.Equals("vehicles.meta", StringComparison.OrdinalIgnoreCase)) { @@ -1609,7 +1706,10 @@ namespace CodeWalker.GameFiles } try { - vehicleFiles[entry.Path] = RpfMan.GetFile(entry); + if (!vehicleFiles.ContainsKey(entry.Path)) + { + vehicleFiles[entry.Path] = await RpfManager.GetFileAsync(entry); + } //if ((entry.Name.Equals("carcols.ymt", StringComparison.OrdinalIgnoreCase)) || (entry.Name.Equals("carcols.meta", StringComparison.OrdinalIgnoreCase))) //{ // var cf = RpfMan.GetFile(entry); @@ -1648,34 +1748,21 @@ namespace CodeWalker.GameFiles } catch (Exception ex) { - string errstr = entry.Path + "\n" + ex.ToString(); + string errstr = $"{entry.Path}\n{ex}"; ErrorLog(errstr); Console.WriteLine(errstr); } }); - foreach(var vf in vehicleFiles.Values) - { - if (vf.InitDatas != null) - { - foreach (var initData in vf.InitDatas) - { - var name = initData.modelName; - var hash = JenkHash.GenHashLower(name); - if (!allVehicles.ContainsKey(hash)) - { - allVehicles[hash] = initData; - } - } - } - } + VehiclesInitDict ??= new Dictionary(900); + VehiclesInitDict.Clear(); - Console.WriteLine($"allVehicles: {allVehicles.Count}; vehicleFiles: {vehicleFiles.Count}"); + AddInitDatas(); - VehiclesInitDict = allVehicles; + Console.WriteLine($"VehiclesInitDict: {VehiclesInitDict.Count}; vehicleFiles: {vehicleFiles.Count}"); } - public void InitPeds(bool force = true) + public async Task InitPeds(bool force = true) { if (!LoadPeds) return; if (!force && PedsLoaded) return; @@ -1683,43 +1770,54 @@ namespace CodeWalker.GameFiles UpdateStatus?.Invoke("Loading peds..."); using var _ = new DisposableTimer("InitPeds"); IEnumerable rpfs = PreloadedMode ? AllRpfs : (IEnumerable)ActiveMapRpfFiles.Values; - List dlcrpfs = null; - if (EnableDlc) - { - dlcrpfs = new List(); - foreach (var rpf in DlcActiveRpfs) - { - dlcrpfs.Add(rpf); - if (rpf.Children == null) continue; - dlcrpfs.AddRange(rpf.Children); - } - } + PooledList? dlcrpfs = null; + //if (EnableDlc) + //{ + // Console.WriteLine("Loading DLC peds"); + // dlcrpfs = new PooledList(); + // foreach (var rpf in DlcActiveRpfs) + // { + // dlcrpfs.Add(rpf); + // if (rpf.Children is null) + // continue; + + // dlcrpfs.AddRange(rpf.Children); + // } + //} var allPeds = new ConcurrentDictionary(4, 1100); //var allPedsFiles = new List(); - var allPedYmts = new ConcurrentDictionary(4, 1100); + var allPedYmts = new ConcurrentBag(); + var allPedsFiles = new ConcurrentDictionary(); var allPedDrwDicts = new ConcurrentDictionary>(4, 1100); var allPedTexDicts = new ConcurrentDictionary>(4, 1100); var allPedClothDicts = new ConcurrentDictionary>(4, 200); - - Dictionary ensureDict(ConcurrentDictionary> coll, MetaHash hash) + static Dictionary createDict(MetaHash key) { - return coll.GetOrAdd(hash, (key) => new Dictionary()); + return new Dictionary(); } - var addPedDicts = new Action((name, hash, dir) => + static Dictionary ensureDict(ConcurrentDictionary> coll, MetaHash hash) { + return coll.GetOrAdd(hash, createDict); + } + + void addPedDicts(ReadOnlySpan name, MetaHash hash, PedFile pedFile) + { + var dir = pedFile.RpfFileEntry.Parent; + var pedsFiles = allPedsFiles.GetOrAdd(hash, (hash) => new PedsFiles()); Dictionary pedClotsDict = null; var files = dir?.Files; if (files != null) { - foreach (var file in files) + foreach (var file in files.Span) { - if (file.Name.Equals(name + ".yld", StringComparison.OrdinalIgnoreCase)) + if (file.IsExtension(".yld") && file.ShortName.Equals(name, StringComparison.OrdinalIgnoreCase)) { + pedsFiles.AddClothsDict(pedFile, file); pedClotsDict ??= ensureDict(allPedClothDicts, hash); lock(pedClotsDict) { @@ -1731,9 +1829,9 @@ namespace CodeWalker.GameFiles if (dir?.Directories != null) { - foreach (var cdir in dir.Directories) + foreach (var cdir in dir.Directories.Span) { - if (cdir.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) + if (cdir.Name.AsSpan().Equals(name, StringComparison.OrdinalIgnoreCase)) { dir = cdir; break; @@ -1744,11 +1842,12 @@ namespace CodeWalker.GameFiles { Dictionary pedDrwDicts = null; Dictionary pedTextDicts = null; - foreach (var file in files) + foreach (var file in files.Span) { if (file?.Name == null) continue; if (file.IsExtension(".ydd")) { + pedsFiles.AddDrawable(pedFile, file); pedDrwDicts ??= ensureDict(allPedDrwDicts, hash); lock(pedDrwDicts) { @@ -1757,6 +1856,7 @@ namespace CodeWalker.GameFiles } else if (file.IsExtension(".ytd")) { + pedsFiles.AddTextureDict(pedFile, file); pedTextDicts ??= ensureDict(allPedTexDicts, hash); lock(pedTextDicts) { @@ -1765,6 +1865,7 @@ namespace CodeWalker.GameFiles } else if (file.IsExtension(".yld")) { + pedsFiles.AddClothsDict(pedFile, file); pedClotsDict ??= ensureDict(allPedClothDicts, hash); lock(pedClotsDict) { @@ -1774,83 +1875,123 @@ namespace CodeWalker.GameFiles } } } - }); - - var numDlcs = dlcrpfs?.Count ?? 0; + }; var allRpfs = rpfs; - if (numDlcs > 0) + if (dlcrpfs is not null && dlcrpfs.Count > 0) { allRpfs = rpfs.Concat(dlcrpfs); } var allEntries = allRpfs .Where(p => p.AllEntries != null) - .SelectMany(p => p.AllEntries) - .Where(p => p.Name.EndsWithAny(".ymt", ".meta")); + .Where(p => p.Name.EndsWithAny(".ymt", ".meta")) + .ToArray(); - Parallel.ForEach(allEntries, new ParallelOptions { MaxDegreeOfParallelism = 4 }, (entry) => + await Parallel.ForAsync(0, allEntries.Length, new ParallelOptions { MaxDegreeOfParallelism = 4 }, async (i, cancellationToken) => { - if (!entry.Name.Equals("peds.ymt", StringComparison.OrdinalIgnoreCase) && !entry.Name.Equals("peds.meta", StringComparison.OrdinalIgnoreCase)) + var file = allEntries[i]; + foreach(var entry in file.AllEntries) { - return; - } - try - { - var pf = RpfMan.GetFile(entry); - if (pf.InitDataList?.InitDatas != null) + if (!entry.Name.Equals("peds.ymt", StringComparison.OrdinalIgnoreCase) && !entry.Name.Equals("peds.meta", StringComparison.OrdinalIgnoreCase)) { - foreach (var initData in pf.InitDataList.InitDatas) - { - var name = initData.Name; - var hash = JenkHash.GenHashLower(name); - allPeds.TryAdd(hash, initData); - } + return; + } + try + { + var pf = await RpfManager.GetFileAsync(entry); + if (pf.InitDataList?.InitDatas != null) + { + foreach (var initData in pf.InitDataList.InitDatas) + { + var name = initData.Name; + var hash = JenkHash.GenHashLower(name); + allPeds.TryAdd(hash, initData); + } + } + //allPedsFiles.Add(pf); + } + catch (Exception ex) + { + string errstr = entry.Path + "\n" + ex.ToString(); + ErrorLog?.Invoke(errstr); + Console.WriteLine(errstr); } - //allPedsFiles.Add(pf); - } - catch (Exception ex) - { - string errstr = entry.Path + "\n" + ex.ToString(); - ErrorLog?.Invoke(errstr); - Console.WriteLine(errstr); } + }); - Parallel.ForEach(allEntries, new ParallelOptions { MaxDegreeOfParallelism = 4 }, (entry) => + var pedLookup = new Dictionary(); + + foreach(var entry in DlcSetupFiles) { - if (!entry.IsExtension(".ymt")) + foreach(var dataFile in entry.ContentFile.dataFiles.Where(p => p.fileType == "SHOP_PED_APPAREL_META_FILE")) { - return; - } - try - { - var shortName = entry.ShortName; - var shortHash = entry.ShortNameHash; - if (allPeds.ContainsKey(shortHash)) + var path = GetFilePathWithoutDeviceName(GameFileCache.GetDlcPlatformPath(dataFile.filename)).ToString().Replace("/", "\\"); + + foreach(var file in entry.ContentFile.DlcFile.AllEntries) { - var pf = RpfMan.GetFile(entry); - if (pf != null) + if (file.Path.EndsWith(path, StringComparison.OrdinalIgnoreCase)) { - allPedYmts.TryAdd(shortHash, pf); - addPedDicts(shortName, shortHash, entry.Parent); + var loadedFile = await RpfManager.GetFileAsync(file); + var fullDlcNameHash = JenkHash.GenHashLower(loadedFile.FullDlcName); + var dlcNameHash = JenkHash.GenHashLower(loadedFile.DlcName); + var pedHash = JenkHash.GenHashLower(loadedFile.PedName); + pedLookup[fullDlcNameHash] = pedHash; + pedLookup[dlcNameHash] = pedHash; + var deviceName = entry.deviceName.Replace("dlc_", ""); + DlcNameLookup[fullDlcNameHash] = deviceName; + DlcNameLookup[dlcNameHash] = deviceName; + break; } } } - catch (Exception ex) + } + + await Parallel.ForAsync(0, allEntries.Length, new ParallelOptions { MaxDegreeOfParallelism = 4 }, async (i, cancellationToken) => + { + var file = allEntries[i]; + foreach (var entry in file.AllEntries) { - string errstr = entry.Path + "\n" + ex.ToString(); - ErrorLog?.Invoke(errstr); - Console.WriteLine(errstr); + if (!entry.IsExtension(".ymt")) + { + return; + } + try + { + var shortHash = entry.ShortNameHash; + if (!pedLookup.TryGetValue(shortHash, out var pedhash)) + { + pedhash = shortHash; + } + if (allPeds.ContainsKey(pedhash)) + { + var pf = await RpfManager.GetFileAsync(entry); + if (pf is not null) + { + allPedYmts.Add(pf); + addPedDicts(entry.ShortName, pedhash, pf); + } + } + } + catch (Exception ex) + { + string errstr = entry.Path + "\n" + ex.ToString(); + ErrorLog?.Invoke(errstr); + Console.WriteLine(errstr); + } } }); PedsInitDict = allPeds.ToDictionary(p => p.Key, p => p.Value); - PedVariationsDict = allPedYmts.ToDictionary(p => p.Key, p => p.Value); + var groupedYmts = allPedYmts.GroupBy(p => p.RpfFileEntry.ShortNameHash, (key, group) => KeyValuePair.Create((MetaHash)key, (ICollection)group.ToHashSet())); + PedVariationsDict = new Dictionary>(groupedYmts); + //PedVariationsDict = allPedYmts.ToDictionary(p => p.Key, p => p.Value); PedDrawableDicts = allPedDrwDicts.ToDictionary(p => p.Key, p => p.Value); PedTextureDicts = allPedTexDicts.ToDictionary(p => p.Key, p => p.Value); PedClothDicts = allPedClothDicts.ToDictionary(p => p.Key, p => p.Value); + PedsFiles = allPedsFiles.ToDictionary(p => p.Key, p => p.Value); //foreach (var kvp in PedsInitDict) @@ -1859,12 +2000,12 @@ namespace CodeWalker.GameFiles // { }//checking we found them all! //} - + dlcrpfs?.Dispose(); } private bool AudioLoaded = false; public readonly ReaderWriterLockSlim AudioDatRelFilesLock = new ReaderWriterLockSlim(); - public async ValueTask InitAudio(bool force = true) + public async Task InitAudio(bool force = true) { if (!LoadAudio) return; if (AudioLoaded && !force) return; @@ -1918,15 +2059,15 @@ namespace CodeWalker.GameFiles try { - AudioDatRelFiles ??= new List(20); + AudioDatRelFiles ??= new List(220); AudioConfigDict ??= new Dictionary(150); - AudioSpeechDict ??= new Dictionary(90000); - AudioSynthsDict ??= new Dictionary(1500); - AudioMixersDict ??= new Dictionary(3500); + AudioSpeechDict ??= new Dictionary(150000); + AudioSynthsDict ??= new Dictionary(5000); + AudioMixersDict ??= new Dictionary(5000); AudioCurvesDict ??= new Dictionary(1000); AudioCategsDict ??= new Dictionary(250); - AudioSoundsDict ??= new Dictionary(60000); - AudioGameDict ??= new Dictionary(20000); + AudioSoundsDict ??= new Dictionary(150000); + AudioGameDict ??= new Dictionary(30000); var audioDatRelFiles = AudioDatRelFiles; var audioConfigDict = AudioConfigDict; @@ -1940,10 +2081,12 @@ namespace CodeWalker.GameFiles var relFiles = new ConcurrentBag(); + var datrelentriesArr = datrelentries.Values.ToArray(); - await Parallel.ForEachAsync(datrelentries.Values, async (datrelentry, cancellationToken) => + await Parallel.ForAsync(0, datrelentriesArr.Length, async (i, cancellationToken) => { - var relfile = await RpfMan.GetFileAsync(datrelentry).ConfigureAwait(false); + var datrelentry = datrelentriesArr[i]; + var relfile = await RpfManager.GetFileAsync(datrelentry).ConfigureAwait(false); if (relfile == null) return; @@ -2034,7 +2177,7 @@ namespace CodeWalker.GameFiles //mainCache.Clear(); ClearCachedMaps(); - InitDlc(); + InitDlcAsync().GetAwaiter().GetResult(); } } } @@ -2058,7 +2201,7 @@ namespace CodeWalker.GameFiles mainCache.Clear(); InitGlobal(); - InitDlc(); + InitDlcAsync().GetAwaiter().GetResult(); } } } @@ -2074,7 +2217,7 @@ namespace CodeWalker.GameFiles foreach (var ymap in AllYmapsDict.Values) { GameFileCacheKey k = new GameFileCacheKey(ymap.ShortNameHash, GameFileType.Ymap); - mainCache.Remove(k); + mainCache.Remove(in k); } } } @@ -2084,17 +2227,21 @@ namespace CodeWalker.GameFiles public void AddProjectFile(GameFile f) { - if (f == null) return; - if (f.RpfFileEntry == null) return; - if (f.RpfFileEntry.ShortNameHash == 0) return; + if (f?.RpfFileEntry is null) + return; + if (f.RpfFileEntry.ShortNameHash == 0) + return; + var key = new GameFileCacheKey(f.RpfFileEntry.ShortNameHash, f.Type); projectFiles[key] = f; } public void RemoveProjectFile(GameFile f) { - if (f == null) return; - if (f.RpfFileEntry == null) return; - if (f.RpfFileEntry.ShortNameHash == 0) return; + if (f?.RpfFileEntry is null) + return; + if (f.RpfFileEntry.ShortNameHash == 0) + return; + var key = new GameFileCacheKey(f.RpfFileEntry.ShortNameHash, f.Type); projectFiles.TryRemove(key, out _); } @@ -2103,14 +2250,17 @@ namespace CodeWalker.GameFiles projectFiles.Clear(); } - public void AddProjectArchetype(Archetype a) + public void AddProjectArchetype(Archetype? a) { - if ((a?.Hash ?? 0) == 0) return; + if (a is null || a.Hash == 0) + return; + projectArchetypes[a.Hash] = a; } - public void RemoveProjectArchetype(Archetype a) + public void RemoveProjectArchetype(Archetype? a) { - if ((a?.Hash ?? 0) == 0) return; + if (a is null || a.Hash == 0) + return; try { projectArchetypes.TryGetValue(a.Hash, out var tarch); @@ -2140,47 +2290,52 @@ namespace CodeWalker.GameFiles } private readonly SemaphoreSlim maxCacheLock = new SemaphoreSlim(Environment.ProcessorCount / 2, Environment.ProcessorCount / 2); - public async Task TryLoadEnqueue(GameFile gf) + public async ValueTask TryLoadEnqueue(T gf) where T : GameFile { if (gf.Loaded || gf.LoadQueued) - { - return; - } - if (requestQueue.Count < 20)// && (!gf.LoadQueued) - { - gf.LoadQueued = true; - gf.LastLoadTime = DateTime.Now; + return gf; - await Task.Run(async () => + //if (requestQueue.Count < 20)// && (!gf.LoadQueued) + //{ + + if (!gf.SetLoadQueued(true)) + return gf; + + gf.LastLoadTime = DateTime.Now; + + await Task.Run(async () => + { + await maxCacheLock.WaitAsync(); + try { - await maxCacheLock.WaitAsync(); - try - { - await LoadFileAsync(gf).ConfigureAwait(false); - } - catch(Exception ex) - { - Console.WriteLine(ex); - throw; - } - finally - { - maxCacheLock.Release(); - } - }); + await LoadFileAsync(gf).ConfigureAwait(false); + } + catch (Exception ex) + { + Console.WriteLine(ex); + throw; + } + finally + { + maxCacheLock.Release(); + } + }); + + return gf; //requestQueue.Enqueue(gf); - } + //} } - public Archetype GetArchetype(uint hash) + public Archetype? GetArchetype(uint hash) { - if (!archetypesLoaded) return null; + if (!archetypesLoaded) + return null; archetypeLock.EnterReadLock(); try { - if (projectArchetypes.TryGetValue(hash, out var arch) && arch != null) + if (projectArchetypes.TryGetValue(hash, out var arch) && arch is not null) { return arch; } @@ -2194,28 +2349,30 @@ namespace CodeWalker.GameFiles } public MapDataStoreNode GetMapNode(uint hash) { - if (!IsInited) return null; + if (!IsInited) + return null; YmapHierarchyDict.TryGetValue(hash, out var node); return node; } private readonly object ydrLock = new object(); - public YdrFile GetYdr(uint hash, bool immediate = false) + public YdrFile? GetYdr(uint hash, bool immediate = false) { - if (!IsInited) return null; + if (!IsInited) + return null; lock (ydrLock) { var key = new GameFileCacheKey(hash, GameFileType.Ydr); - if (projectFiles.TryGetValue(key, out GameFile pgf)) + if (projectFiles.TryGetValue(key, out GameFile? pgf)) { return pgf as YdrFile; } - YdrFile ydr = mainCache.TryGet(key) as YdrFile; - if (ydr == null) + YdrFile? ydr = mainCache.TryGet(in key) as YdrFile; + if (ydr is null) { var e = GetYdrEntry(hash); - if (e == null) + if (e is null) { return null; } @@ -2235,21 +2392,23 @@ namespace CodeWalker.GameFiles } private readonly object yddLock = new object(); - public YddFile GetYdd(uint hash) + public YddFile? GetYdd(uint hash) { - if (!IsInited) return null; + if (!IsInited) + return null; + lock (yddLock) { var key = new GameFileCacheKey(hash, GameFileType.Ydd); - if (projectFiles.TryGetValue(key, out GameFile pgf)) + if (projectFiles.TryGetValue(key, out GameFile? pgf)) { return pgf as YddFile; } - YddFile ydd = mainCache.TryGet(key) as YddFile; - if (ydd == null) + YddFile? ydd = mainCache.TryGet(in key) as YddFile; + if (ydd is null) { var e = GetYddEntry(hash); - if (e == null) return null; + if (e is null) return null; ydd = new YddFile(e); if (!mainCache.TryAdd(key, ydd)) @@ -2267,21 +2426,23 @@ namespace CodeWalker.GameFiles } private readonly SemaphoreSlim ytdLock = new SemaphoreSlim(1, 1); - public YtdFile GetYtd(uint hash) + public YtdFile? GetYtd(uint hash) { - if (!IsInited) return null; + if (!IsInited) + return null; + ytdLock.Wait(); try { var key = new GameFileCacheKey(hash, GameFileType.Ytd); - if (projectFiles.TryGetValue(key, out GameFile pgf)) + if (projectFiles.TryGetValue(key, out var pgf)) { return pgf as YtdFile; } - YtdFile ytd = mainCache.TryGet(key) as YtdFile; - if (ytd == null) + YtdFile? ytd = mainCache.TryGet(in key) as YtdFile; + if (ytd is null) { var e = GetYtdEntry(hash); - if (e == null) + if (e is null) { return null; } @@ -2296,57 +2457,97 @@ namespace CodeWalker.GameFiles _ = TryLoadEnqueue(ytd); } return ytd; - } finally + } + finally { ytdLock.Release(); } } - private readonly object ymapLock = new object(); - public YmapFile GetYmap(uint hash) + private YmapFile? getYmapFile(uint hash) { - if (!IsInited) return null; + YmapFile? ymap; lock (ymapLock) { var key = new GameFileCacheKey(hash, GameFileType.Ymap); - YmapFile ymap = mainCache.TryGet(key) as YmapFile; - if (ymap == null) + ymap = mainCache.TryGet(in key) as YmapFile; + if (projectFiles.TryGetValue(key, out GameFile? pgf) && pgf is YmapFile ymapFile) + { + return ymapFile; + } + if (ymap is null) { var e = GetYmapEntry(hash); - if (e == null) + if (e is null) { + Console.WriteLine($"Couldn't find ymap {JenkIndex.GetString(hash)} ({hash})"); return null; } ymap = new YmapFile(e); if (!mainCache.TryAdd(key, ymap)) { + Console.WriteLine($"Couldn't add ymap {JenkIndex.GetString(hash)} ({hash}) to cache"); return null; } } - if (!ymap.Loaded && !ymap.LoadQueued) - { - _ = TryLoadEnqueue(ymap); - } - return ymap; } + + return ymap; + } + + private readonly object ymapLock = new object(); + public YmapFile? GetYmap(uint hash) + { + if (!IsInited) + return null; + + var ymap = getYmapFile(hash); + + if (ymap is null) + return null; + + if (!ymap.Loaded && !ymap.LoadQueued) + { + _ = TryLoadEnqueue(ymap); + } + return ymap; + } + + public ValueTask GetYmapAsync(uint hash) + { + if (!IsInited) + return ValueTask.FromResult((YmapFile?)null); + + var ymap = getYmapFile(hash); + + if (ymap is null) + return ValueTask.FromResult((YmapFile?)null); + + if (!ymap.Loaded && !ymap.LoadQueued) + { + return TryLoadEnqueue(ymap)!; + } + + return ValueTask.FromResult(ymap)!; } private readonly object yftLock = new object(); - public YftFile GetYft(uint hash) + public YftFile? GetYft(uint hash) { - if (!IsInited) return null; + if (!IsInited) + return null; lock (yftLock) { var key = new GameFileCacheKey(hash, GameFileType.Yft); - YftFile yft = mainCache.TryGet(key) as YftFile; - if (projectFiles.TryGetValue(key, out GameFile pgf)) + YftFile? yft = mainCache.TryGet(in key) as YftFile; + if (projectFiles.TryGetValue(key, out GameFile? pgf) && pgf is YftFile yftFile) { - return pgf as YftFile; + return yftFile; } - if (yft == null) + if (yft is null) { var e = GetYftEntry(hash); - if (e == null) + if (e is null) { return null; } @@ -2365,17 +2566,18 @@ namespace CodeWalker.GameFiles } private readonly object ybnLock = new object(); - public YbnFile GetYbn(uint hash) + public YbnFile? GetYbn(uint hash) { - if (!IsInited) return null; + if (!IsInited) + return null; lock (ybnLock) { var key = new GameFileCacheKey(hash, GameFileType.Ybn); - YbnFile ybn = mainCache.TryGet(key) as YbnFile; - if (ybn == null) + YbnFile? ybn = mainCache.TryGet(in key) as YbnFile; + if (ybn is null) { var e = GetYbnEntry(hash); - if (e == null) + if (e is null) { return null; } @@ -2394,17 +2596,18 @@ namespace CodeWalker.GameFiles } private readonly object ycdLock = new object(); - public YcdFile GetYcd(uint hash) + public YcdFile? GetYcd(uint hash) { - if (!IsInited) return null; + if (!IsInited) + return null; lock (ycdLock) { var key = new GameFileCacheKey(hash, GameFileType.Ycd); - YcdFile ycd = mainCache.TryGet(key) as YcdFile; - if (ycd == null) + YcdFile? ycd = mainCache.TryGet(in key) as YcdFile; + if (ycd is null) { var e = GetYcdEntry(hash); - if (e == null) + if (e is null) { return null; } @@ -2423,17 +2626,18 @@ namespace CodeWalker.GameFiles } private readonly object yedLock = new object(); - public YedFile GetYed(uint hash) + public YedFile? GetYed(uint hash) { - if (!IsInited) return null; + if (!IsInited) + return null; lock (yedLock) { var key = new GameFileCacheKey(hash, GameFileType.Yed); - YedFile yed = mainCache.TryGet(key) as YedFile; - if (yed == null) + YedFile? yed = mainCache.TryGet(in key) as YedFile; + if (yed is null) { var e = GetYedEntry(hash); - if (e == null) + if (e is null) { return null; } @@ -2452,13 +2656,14 @@ namespace CodeWalker.GameFiles } private readonly object yvnLock = new object(); - public YnvFile GetYnv(uint hash) + public YnvFile? GetYnv(uint hash) { - if (!IsInited) return null; + if (!IsInited) + return null; lock (yvnLock) { var key = new GameFileCacheKey(hash, GameFileType.Ynv); - YnvFile ynv = mainCache.TryGet(key) as YnvFile; + YnvFile? ynv = mainCache.TryGet(in key) as YnvFile; if (ynv == null) { var e = GetYnvEntry(hash); @@ -2481,28 +2686,24 @@ namespace CodeWalker.GameFiles } - public RpfFileEntry GetYdrEntry(uint hash) + public RpfFileEntry? GetYdrEntry(uint hash) { - RpfFileEntry entry; - YdrDict.TryGetValue(hash, out entry); + YdrDict.TryGetValue(hash, out var entry); return entry; } - public RpfFileEntry GetYddEntry(uint hash) + public RpfFileEntry? GetYddEntry(uint hash) { - RpfFileEntry entry; - YddDict.TryGetValue(hash, out entry); + YddDict.TryGetValue(hash, out var entry); return entry; } - public RpfFileEntry GetYtdEntry(uint hash) + public RpfFileEntry? GetYtdEntry(uint hash) { - RpfFileEntry entry; - YtdDict.TryGetValue(hash, out entry); + YtdDict.TryGetValue(hash, out var entry); return entry; } - public RpfFileEntry GetYmapEntry(uint hash) + public RpfFileEntry? GetYmapEntry(uint hash) { - RpfFileEntry entry; - if (!YmapDict.TryGetValue(hash, out entry)) + if (!YmapDict.TryGetValue(hash, out var entry)) { if (!AllYmapsDict.TryGetValue(hash, out entry)) { @@ -2511,34 +2712,29 @@ namespace CodeWalker.GameFiles } return entry; } - public RpfFileEntry GetYftEntry(uint hash) + public RpfFileEntry? GetYftEntry(uint hash) { - RpfFileEntry entry; - YftDict.TryGetValue(hash, out entry); + YftDict.TryGetValue(hash, out var entry); return entry; } - public RpfFileEntry GetYbnEntry(uint hash) + public RpfFileEntry? GetYbnEntry(uint hash) { - RpfFileEntry entry; - YbnDict.TryGetValue(hash, out entry); + YbnDict.TryGetValue(hash, out var entry); return entry; } - public RpfFileEntry GetYcdEntry(uint hash) + public RpfFileEntry? GetYcdEntry(uint hash) { - RpfFileEntry entry; - YcdDict.TryGetValue(hash, out entry); + YcdDict.TryGetValue(hash, out var entry); return entry; } - public RpfFileEntry GetYedEntry(uint hash) + public RpfFileEntry? GetYedEntry(uint hash) { - RpfFileEntry entry; - YedDict.TryGetValue(hash, out entry); + YedDict.TryGetValue(hash, out var entry); return entry; } - public RpfFileEntry GetYnvEntry(uint hash) + public RpfFileEntry? GetYnvEntry(uint hash) { - RpfFileEntry entry; - YnvDict.TryGetValue(hash, out entry); + YnvDict.TryGetValue(hash, out var entry); return entry; } @@ -2546,9 +2742,10 @@ namespace CodeWalker.GameFiles public bool LoadFile(T file) where T : GameFile, PackedFile { - if (file == null) return false; - RpfFileEntry entry = file.RpfFileEntry; - if (entry != null) + if (file is null) + return false; + RpfFileEntry? entry = file.RpfFileEntry; + if (entry is not null) { return RpfMan.LoadFile(file, entry); } @@ -2557,9 +2754,10 @@ namespace CodeWalker.GameFiles public ValueTask LoadFileAsync(T file) where T : GameFile, PackedFile { - if (file == null) return new ValueTask(false); - RpfFileEntry entry = file.RpfFileEntry; - if (entry != null) + if (file is null) + return new ValueTask(false); + RpfFileEntry? entry = file.RpfFileEntry; + if (entry is not null) { return RpfMan.LoadFileAsync(file, entry); } @@ -2603,40 +2801,40 @@ namespace CodeWalker.GameFiles //UpdateStatus?.Invoke("Loading " + req.RpfFileEntry.Name + "..."); //} - switch (req.Type) + switch (req) { - case GameFileType.Ydr: - req.Loaded = await LoadFileAsync(req as YdrFile); + case YdrFile ydrFile: + req.Loaded = await LoadFileAsync(ydrFile); break; - case GameFileType.Ydd: - req.Loaded = await LoadFileAsync(req as YddFile); + case YddFile yddFile: + req.Loaded = await LoadFileAsync(yddFile); break; - case GameFileType.Ytd: - req.Loaded = await LoadFileAsync(req as YtdFile); + case YtdFile ytdFile: + req.Loaded = await LoadFileAsync(ytdFile); //if (req.Loaded) AddTextureLookups(req as YtdFile); break; - case GameFileType.Ymap: - YmapFile y = req as YmapFile; - req.Loaded = await LoadFileAsync(y); - if (req.Loaded) y.InitYmapEntityArchetypes(this); + case YmapFile ymapFile: + req.Loaded = await LoadFileAsync(ymapFile); + if (req.Loaded) + ymapFile.InitYmapEntityArchetypes(this); break; - case GameFileType.Yft: - req.Loaded = await LoadFileAsync(req as YftFile); + case YftFile yftFile: + req.Loaded = await LoadFileAsync(yftFile); break; - case GameFileType.Ybn: - req.Loaded = await LoadFileAsync(req as YbnFile); + case YbnFile ybnFile: + req.Loaded = await LoadFileAsync(ybnFile); break; - case GameFileType.Ycd: - req.Loaded = await LoadFileAsync(req as YcdFile); + case YcdFile ycdFile: + req.Loaded = await LoadFileAsync(ycdFile); break; - case GameFileType.Yed: - req.Loaded = await LoadFileAsync(req as YedFile); + case YedFile yedFile: + req.Loaded = await LoadFileAsync(yedFile); break; - case GameFileType.Ynv: - req.Loaded = await LoadFileAsync(req as YnvFile); + case YnvFile ynvFile: + req.Loaded = await LoadFileAsync(ynvFile); break; - case GameFileType.Yld: - req.Loaded = await LoadFileAsync(req as YldFile); + case YldFile yldFile: + req.Loaded = await LoadFileAsync(yldFile); break; default: break; @@ -2657,7 +2855,17 @@ namespace CodeWalker.GameFiles req.LoadQueued = false; req.Loaded = false; Console.WriteLine(e); - _ = TryLoadEnqueue(req); + + // Retry loading, at most 2 times + if (req.LoadAttempts > 2) + { + req.LoadAttempts++; + _ = TryLoadEnqueue(req); + } + else + { + Console.WriteLine($"Loading of file {req.Name} at {req.FilePath} failed with error: {e}"); + } } finally { @@ -2729,7 +2937,7 @@ namespace CodeWalker.GameFiles //ErrorLog(str); if (!req.Loaded) { - ErrorLog("Error loading " + req.ToString()); + ErrorLog?.Invoke($"Error loading {req}"); } } catch (Exception e) @@ -2748,7 +2956,10 @@ namespace CodeWalker.GameFiles public bool ContentThreadProc() { - mainCache.BeginFrame(); + //mainCache.BeginFrame(); + if (requestQueue.Count == 0) + return false; + int itemcount = 0; lock (updateSyncRoot) { @@ -3050,7 +3261,7 @@ namespace CodeWalker.GameFiles if (doydr && entry.IsExtension(".ydr")) { UpdateStatus?.Invoke(entry.Path); - YdrFile ydr = RpfMan.GetFile(entry); + YdrFile ydr = RpfManager.GetFile(entry); if (ydr == null) { continue; } if (ydr.Drawable == null) { continue; } @@ -3059,7 +3270,7 @@ namespace CodeWalker.GameFiles else if (doydd & entry.IsExtension(".ydd")) { UpdateStatus?.Invoke(entry.Path); - YddFile ydd = RpfMan.GetFile(entry); + YddFile ydd = RpfManager.GetFile(entry); if (ydd == null) { continue; } if (ydd.Dict == null) { continue; } @@ -3071,7 +3282,7 @@ namespace CodeWalker.GameFiles else if (doyft && entry.IsExtension(".yft")) { UpdateStatus?.Invoke(entry.Path); - YftFile yft = RpfMan.GetFile(entry); + YftFile yft = RpfManager.GetFile(entry); if (yft == null) { continue; } if (yft.Fragment == null) { continue; } @@ -3097,7 +3308,7 @@ namespace CodeWalker.GameFiles else if (doypt && entry.IsExtension(".ypt")) { UpdateStatus?.Invoke(entry.Path); - YptFile ypt = RpfMan.GetFile(entry); + YptFile ypt = RpfManager.GetFile(entry); if (ypt == null) { continue; } if (ypt.DrawableDict == null) { continue; } @@ -3187,16 +3398,16 @@ namespace CodeWalker.GameFiles if (arch.Type == MetaName.CTimeArchetypeDef) { var ta = arch as TimeArchetype; - var t = ta.TimeFlags; + var t = ta.ActiveHours.TimeFlags; sb.Append(arch.Name); - sb.Append(","); + sb.Append(','); sb.Append(arch.AssetName); - sb.Append(","); + sb.Append(','); for (int i = 0; i < 32; i++) { bool v = ((t >> i) & 1) == 1; sb.Append(v ? "1" : "0"); - sb.Append(","); + sb.Append(','); } sb.AppendLine(); } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/Archetype.cs b/CodeWalker.Core/GameFiles/MetaTypes/Archetype.cs index c02935a..14d2b05 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/Archetype.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/Archetype.cs @@ -1,8 +1,13 @@ +using Collections.Pooled; using SharpDX; using System; +using System.Buffers; using System.Collections.Generic; using System.ComponentModel; +using System.Data; using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; @@ -14,58 +19,59 @@ namespace CodeWalker.GameFiles public virtual MetaName Type => MetaName.CBaseArchetypeDef; public CBaseArchetypeDef _BaseArchetypeDef; - public CBaseArchetypeDef BaseArchetypeDef => _BaseArchetypeDef; // for browsing. + public ref CBaseArchetypeDef BaseArchetypeDef => ref _BaseArchetypeDef; // for browsing. public MetaHash Hash { get; set; } public YtypFile Ytyp { get; set; } - public MetaHash DrawableDict { get; set; } - public MetaHash TextureDict { get; set; } - public MetaHash ClipDict { get; set; } - public Vector3 BBMin { get; set; } - public Vector3 BBMax { get; set; } - public Vector3 BSCenter { get; set; } - public float BSRadius { get; set; } - public float LodDist { get; set; } + public MetaHash DrawableDict { get => _BaseArchetypeDef.drawableDictionary; set => _BaseArchetypeDef.drawableDictionary = value; } + public MetaHash TextureDict { get => _BaseArchetypeDef.textureDictionary; set => _BaseArchetypeDef.textureDictionary = value; } + public MetaHash ClipDict { get => _BaseArchetypeDef.clipDictionary; set => _BaseArchetypeDef.clipDictionary = value; } + public ref Vector3 BBMin { get => ref _BaseArchetypeDef.bbMin; } + public ref Vector3 BBMax { get => ref _BaseArchetypeDef.bbMax; } + public ref Vector3 BSCenter { get => ref _BaseArchetypeDef.bsCentre; } + public float BSRadius { get => _BaseArchetypeDef.bsRadius; set => _BaseArchetypeDef.bsRadius = value; } + public float LodDist { get => _BaseArchetypeDef.lodDist; set => _BaseArchetypeDef.lodDist = value; } public MetaWrapper[] Extensions { get; set; } - public string Name + public string Name => _BaseArchetypeDef.name.ToString(); + public string AssetName => _BaseArchetypeDef.assetName.ToString(); + + protected void InitVars() { - get - { - return _BaseArchetypeDef.name.ToString(); - } - } - public string AssetName - { - get - { - return _BaseArchetypeDef.assetName.ToString(); - } + Hash = _BaseArchetypeDef.assetName; + if (Hash.Hash == 0) + Hash = _BaseArchetypeDef.name; + //DrawableDict = _BaseArchetypeDef.drawableDictionary; + //TextureDict = _BaseArchetypeDef.textureDictionary; + //ClipDict = _BaseArchetypeDef.clipDictionary; + //BBMin = _BaseArchetypeDef.bbMin; + //BBMax = _BaseArchetypeDef.bbMax; + //BSCenter = _BaseArchetypeDef.bsCentre; + //BSRadius = _BaseArchetypeDef.bsRadius; + //LodDist = _BaseArchetypeDef.lodDist; } - - protected void InitVars(ref CBaseArchetypeDef arch) + protected void InitVars(in CBaseArchetypeDef arch) { _BaseArchetypeDef = arch; - Hash = arch.assetName; - if (Hash.Hash == 0) Hash = arch.name; - DrawableDict = arch.drawableDictionary; - TextureDict = arch.textureDictionary; - ClipDict = arch.clipDictionary; - BBMin = arch.bbMin; - BBMax = arch.bbMax; - BSCenter = arch.bsCentre; - BSRadius = arch.bsRadius; - LodDist = arch.lodDist; + InitVars(); } - public void Init(YtypFile ytyp, ref CBaseArchetypeDef arch) + public void Init(YtypFile ytyp, in CBaseArchetypeDef arch) { Ytyp = ytyp; - InitVars(ref arch); + InitVars(in arch); + } + + public void Init(YtypFile ytyp, Span data) + { + Ytyp = ytyp; + + PsoTypes.TryConvertDataRaw(data, out _BaseArchetypeDef); + InitVars(); } public virtual bool IsActive(float hour) @@ -79,77 +85,57 @@ namespace CodeWalker.GameFiles } } + public readonly struct ActiveHours(uint flags) + { + public readonly uint TimeFlags = flags; + + public readonly bool this[int index] => ((TimeFlags >> index) & 1) == 1; + + public static implicit operator ActiveHours(uint d) => new (d); + public static implicit operator uint(ActiveHours d) => d.TimeFlags; + } + [TypeConverter(typeof(ExpandableObjectConverter))] + [SkipLocalsInit] public class TimeArchetype : Archetype { public override MetaName Type => MetaName.CTimeArchetypeDef; public CTimeArchetypeDef _TimeArchetypeDef; public CTimeArchetypeDef TimeArchetypeDef => _TimeArchetypeDef; // for browsing. - - public uint TimeFlags { get; set; } - public bool[] ActiveHours { get; set; } - private readonly Lazy _activeHoursText; - public string[] ActiveHoursText { get => _activeHoursText.Value; } - public bool ExtraFlag { get { return ((TimeFlags >> 24) & 1) == 1; } } + public ActiveHours ActiveHours; + public bool ExtraFlag => ActiveHours[24]; public TimeArchetype() - { - _activeHoursText = new Lazy(() => - { - var activeHoursText = new string[24]; - for (int i = 0; i < ActiveHours.Length; i++) - { - var nxth = (i < 23) ? (i + 1) : 0; - var hrs = string.Format("{0:00}:00 - {1:00}:00", i, nxth); - activeHoursText[i] = (hrs + (ActiveHours[i] ? " - On" : " - Off")); - } + { } - return activeHoursText; - }); - } - - public void Init(YtypFile ytyp, ref CTimeArchetypeDef arch) + public void Init(YtypFile ytyp, in CTimeArchetypeDef arch) { Ytyp = ytyp; - InitVars(ref arch._BaseArchetypeDef); + InitVars(in arch._BaseArchetypeDef); _TimeArchetypeDef = arch; + ActiveHours = arch._TimeArchetypeDef.timeFlags; + } - TimeFlags = arch.TimeArchetypeDef.timeFlags; - - UpdateActiveHours(); + new public void Init(YtypFile ytyp, Span data) + { + Ytyp = ytyp; + PsoTypes.TryConvertDataRaw(data, out _TimeArchetypeDef); + InitVars(in _TimeArchetypeDef._BaseArchetypeDef); } public override bool IsActive(float hour) { - if (ActiveHours == null) return true; int h = ((int)hour) % 24; - if ((h < 0) || (h > 23)) return true; + if ((h < 0) || (h > 23)) + return true; return ActiveHours[h]; } - - public void UpdateActiveHours() - { - if (ActiveHours == null) - { - ActiveHours = new bool[24]; - } - for (int i = 0; i < 24; i++) - { - bool v = ((TimeFlags >> i) & 1) == 1; - ActiveHours[i] = v; - } - } - public void SetTimeFlags(uint flags) { - TimeFlags = flags; + ActiveHours = flags; _TimeArchetypeDef._TimeArchetypeDef.timeFlags = flags; - - UpdateActiveHours(); } - - } public class MloArchetype : Archetype @@ -159,7 +145,7 @@ namespace CodeWalker.GameFiles public CMloArchetypeDef MloArchetypeDef => _MloArchetypeDef; // for browsing. public CMloArchetypeDef _MloArchetypeDef; - public CMloArchetypeDefData _MloArchetypeDefData; + public ref CMloArchetypeDefData _MloArchetypeDefData => ref _MloArchetypeDef._MloArchetypeDef; public MCEntityDef[] entities { get; set; } public MCMloRoomDef[] rooms { get; set; } @@ -168,17 +154,27 @@ namespace CodeWalker.GameFiles public CMloTimeCycleModifier[] timeCycleModifiers { get; set; } - public void Init(YtypFile ytyp, ref CMloArchetypeDef arch) + public void Init(YtypFile ytyp, in CMloArchetypeDef arch) { Ytyp = ytyp; - InitVars(ref arch._BaseArchetypeDef); + InitVars(in arch._BaseArchetypeDef); _MloArchetypeDef = arch; - _MloArchetypeDefData = arch.MloArchetypeDef; + //_MloArchetypeDefData = ref arch._MloArchetypeDef; + } + + public void Init(YtypFile ytyp, Span data) + { + Ytyp = ytyp; + PsoTypes.TryConvertDataRaw(data, out _MloArchetypeDef); + InitVars(in _MloArchetypeDef._BaseArchetypeDef); + + //_MloArchetypeDefData = ref _MloArchetypeDef._MloArchetypeDef; } public bool AddEntity(YmapEntityDef ent, int roomIndex, int portalIndex = -1, int entsetIndex = -1) { - if (ent == null) return false; + if (ent is null) + return false; if (roomIndex >= (rooms?.Length ?? 0)) { @@ -193,7 +189,7 @@ namespace CodeWalker.GameFiles throw new ArgumentOutOfRangeException($"EntitySet index {entsetIndex} exceeds the amount of entitySets in {Name}."); } - var mcEntityDef = new MCEntityDef(ref ent._CEntityDef, this); + var mcEntityDef = new MCEntityDef(in ent._CEntityDef, this); if ((roomIndex >= 0) || (portalIndex >= 0)) @@ -243,7 +239,8 @@ namespace CodeWalker.GameFiles } public bool RemoveEntity(YmapEntityDef ent) { - if (ent == null) return false; + if (ent is null) + return false; if ((ent.MloEntitySet?.Entities != null) && (ent.MloEntitySet?.EntitySet != null)) { @@ -305,7 +302,8 @@ namespace CodeWalker.GameFiles public void AddRoom(MCMloRoomDef room) { - if (room == null) return; + if (room is null) + return; room.OwnerMlo = this; room.Index = rooms?.Length ?? 0; @@ -316,7 +314,8 @@ namespace CodeWalker.GameFiles } public void RemoveRoom(MCMloRoomDef room) { - if (room == null) return; + if (room is null) + return; var newrooms = rooms.ToList(); newrooms.Remove(room); @@ -332,12 +331,13 @@ namespace CodeWalker.GameFiles public void AddPortal(MCMloPortalDef portal) { - if (portal == null) return; + if (portal is null) + return; portal.OwnerMlo = this; portal.Index = portals?.Length ?? 0; - var newportals = portals?.ToList() ?? new List(); + using var newportals = portals?.ToPooledList() ?? new PooledList(); newportals.Add(portal); portals = newportals.ToArray(); @@ -345,9 +345,10 @@ namespace CodeWalker.GameFiles } public void RemovePortal(MCMloPortalDef portal) { - if (portal == null) return; + if (portal is null) + return; - var newportals = portals.ToList(); + using var newportals = portals.ToPooledList(); newportals.Remove(portal); portals = newportals.ToArray(); @@ -361,7 +362,8 @@ namespace CodeWalker.GameFiles public void AddEntitySet(MCMloEntitySet set) { - if (set == null) return; + if (set is null) + return; set.OwnerMlo = this; set.Index = entitySets?.Length ?? 0; @@ -372,7 +374,8 @@ namespace CodeWalker.GameFiles } public void RemoveEntitySet(MCMloEntitySet set) { - if (set == null) return; + if (set is null) + return; var newsets = entitySets.ToList(); newsets.Remove(set); @@ -393,17 +396,19 @@ namespace CodeWalker.GameFiles { foreach (var portal in portals) { - if (portal.AttachedObjects == null || portal.AttachedObjects.Length == 0) + if (portal.AttachedObjects is null || portal.AttachedObjects.Length == 0) continue; - List newAttachedObjects = new List(); + using PooledList newAttachedObjects = new PooledList(portal.AttachedObjects.Length); foreach (var objIndex in portal.AttachedObjects) { - if (objIndex == deletedIndex) continue; + if (objIndex == deletedIndex) + continue; if (objIndex > deletedIndex) newAttachedObjects.Add(objIndex - 1); // move the index back so it matches the index in the entitiy array. else newAttachedObjects.Add(objIndex); // else just add the index to the attached objects. } + portal.AttachedObjects = newAttachedObjects.ToArray(); } } @@ -411,13 +416,14 @@ namespace CodeWalker.GameFiles { foreach (var room in rooms) { - if (room.AttachedObjects == null || room.AttachedObjects.Length == 0) + if (room.AttachedObjects is null || room.AttachedObjects.Length == 0) continue; - List newAttachedObjects = new List(); + using PooledList newAttachedObjects = new PooledList(room.AttachedObjects.Length); foreach (var objIndex in room.AttachedObjects) { - if (objIndex == deletedIndex) continue; + if (objIndex == deletedIndex) + continue; if (objIndex > deletedIndex) newAttachedObjects.Add(objIndex - 1); // move the index back so it matches the index in the entitiy array. else newAttachedObjects.Add(objIndex); // else just add the index to the attached objects. @@ -452,14 +458,15 @@ namespace CodeWalker.GameFiles public void UpdatePortalCounts() { - if ((rooms == null) || (portals == null)) return; + if (rooms is null || portals is null) + return; foreach (var room in rooms) { uint count = 0; foreach (var portal in portals) { - if ((portal._Data.roomFrom == room.Index) || (portal._Data.roomTo == room.Index)) + if (portal._Data.roomFrom == room.Index || portal._Data.roomTo == room.Index) { count++; } @@ -472,50 +479,65 @@ namespace CodeWalker.GameFiles public void LoadChildren(Meta meta) { - var centities = MetaTypes.ConvertDataArray(meta, MetaName.CEntityDef, _MloArchetypeDefData.entities); - if (centities != null) + if (_MloArchetypeDefData.entities.Count1 > 0) { + var centitiesBuffer = ArrayPool.Shared.Rent(_MloArchetypeDefData.entities.Count1); + MetaTypes.ConvertDataArray(meta, MetaName.CEntityDef, in _MloArchetypeDefData.entities, centitiesBuffer); + var centities = centitiesBuffer.AsSpan(0, _MloArchetypeDefData.entities.Count1); entities = new MCEntityDef[centities.Length]; for (int i = 0; i < centities.Length; i++) { - entities[i] = new MCEntityDef(meta, ref centities[i]) { OwnerMlo = this, Index = i }; + entities[i] = new MCEntityDef(meta, centities[i]) { OwnerMlo = this, Index = i }; } + ArrayPool.Shared.Return(centitiesBuffer); } - var crooms = MetaTypes.ConvertDataArray(meta, MetaName.CMloRoomDef, _MloArchetypeDefData.rooms); - if (crooms != null) + if (_MloArchetypeDefData.rooms.Count1 > 0) { + var croomsBuffer = ArrayPool.Shared.Rent(_MloArchetypeDefData.rooms.Count1); + MetaTypes.ConvertDataArray(meta, MetaName.CMloRoomDef, in _MloArchetypeDefData.rooms, croomsBuffer); + var crooms = croomsBuffer.AsSpan(0, _MloArchetypeDefData.rooms.Count1); rooms = new MCMloRoomDef[crooms.Length]; for (int i = 0; i < crooms.Length; i++) { rooms[i] = new MCMloRoomDef(meta, crooms[i]) { OwnerMlo = this, Index = i }; } + ArrayPool.Shared.Return(croomsBuffer); } - var cportals = MetaTypes.ConvertDataArray(meta, MetaName.CMloPortalDef, _MloArchetypeDefData.portals); - if (cportals != null) + if (_MloArchetypeDefData.portals.Count1 > 0) { + var cportalsBuffer = ArrayPool.Shared.Rent(_MloArchetypeDefData.portals.Count1); + MetaTypes.ConvertDataArray(meta, MetaName.CMloPortalDef, in _MloArchetypeDefData.portals, cportalsBuffer); + var cportals = cportalsBuffer.AsSpan(0, _MloArchetypeDefData.portals.Count1); portals = new MCMloPortalDef[cportals.Length]; for (int i = 0; i < cportals.Length; i++) { portals[i] = new MCMloPortalDef(meta, cportals[i]) { OwnerMlo = this, Index = i }; } + ArrayPool.Shared.Return(cportalsBuffer); } - var centitySets = MetaTypes.ConvertDataArray(meta, MetaName.CMloEntitySet, _MloArchetypeDefData.entitySets); - if (centitySets != null) + if (_MloArchetypeDefData.entitySets.Count1 > 0) { + var centitySetsBuffer = ArrayPool.Shared.Rent(_MloArchetypeDefData.entitySets.Count1); + MetaTypes.ConvertDataArray(meta, MetaName.CMloEntitySet, in _MloArchetypeDefData.entitySets, centitySetsBuffer); + var centitySets = centitySetsBuffer.AsSpan(0, _MloArchetypeDefData.entitySets.Count1); + entitySets = new MCMloEntitySet[centitySets.Length]; for (int i = 0; i < centitySets.Length; i++) { - entitySets[i] = new MCMloEntitySet(meta, centitySets[i], this) { OwnerMlo = this, Index = i }; + entitySets[i] = new MCMloEntitySet(meta, centitySets[i], this) { Index = i }; } + ArrayPool.Shared.Return(centitySetsBuffer); UpdateAllEntityIndexes(); + } - - timeCycleModifiers = MetaTypes.ConvertDataArray(meta, MetaName.CMloTimeCycleModifier, _MloArchetypeDefData.timeCycleModifiers); - + if (_MloArchetypeDefData.timeCycleModifiers.Count1 > 0) + { + timeCycleModifiers = MetaTypes.ConvertDataArray(meta, MetaName.CMloTimeCycleModifier, in _MloArchetypeDefData.timeCycleModifiers); + } } public int GetEntityObjectIndex(MCEntityDef ent) @@ -531,7 +553,7 @@ namespace CodeWalker.GameFiles } return -1; } - public MCMloRoomDef GetEntityRoom(MCEntityDef ent) + public MCMloRoomDef? GetEntityRoom(MCEntityDef ent) { if (rooms == null) return null; @@ -558,17 +580,19 @@ namespace CodeWalker.GameFiles return null; } - public MCMloPortalDef GetEntityPortal(MCEntityDef ent) + public MCMloPortalDef? GetEntityPortal(MCEntityDef ent) { - if (portals == null) return null; + if (portals is null) + return null; int objectIndex = GetEntityObjectIndex(ent); - if (objectIndex < 0) return null; + if (objectIndex < 0) + return null; for (int i = 0; i < portals.Length; i++) { var p = portals[i]; - if (p.AttachedObjects != null) + if (p.AttachedObjects is not null) { for (int j = 0; j < p.AttachedObjects.Length; j++) { @@ -583,7 +607,7 @@ namespace CodeWalker.GameFiles return null; } - public MCMloEntitySet GetEntitySet(MCEntityDef ent) + public MCMloEntitySet? GetEntitySet(MCEntityDef ent) { if (entitySets == null) return null; @@ -613,7 +637,7 @@ namespace CodeWalker.GameFiles public YmapEntityDef Owner { get; set; } public MloArchetype MloArch { get; set; } public CMloInstanceDef _Instance; - public CMloInstanceDef Instance { get { return _Instance; } set { _Instance = value; } } + public ref CMloInstanceDef Instance => ref _Instance; public uint[] defaultEntitySets { get; set; } public YmapEntityDef[] Entities { get; set; } @@ -627,11 +651,13 @@ namespace CodeWalker.GameFiles public void CreateYmapEntities() { - if (Owner == null) return; - if (MloArch?.entities == null) return; + if (Owner is null) + return; + if (MloArch?.entities is null) + return; var ec = MloArch.entities.Length; - var entlist = new List(); + var entlist = new List(ec); for (int i = 0; i < ec; i++) { var e = CreateYmapEntity(Owner, MloArch.entities[i], i); @@ -662,7 +688,7 @@ namespace CodeWalker.GameFiles } } - if ((defaultEntitySets != null) && (EntitySets != null)) + if (defaultEntitySets != null && EntitySets != null) { for (var i = 0; i < defaultEntitySets.Length; i++) { @@ -678,19 +704,19 @@ namespace CodeWalker.GameFiles public void InitYmapEntityArchetypes(GameFileCache gfc) { - if (Owner == null) return; + if (Owner is null) + return; var arch = Owner.Archetype; - if (Entities != null) + if (Entities is not null) { - for (int j = 0; j < Entities.Length; j++) + foreach(var ient in Entities) { - var ient = Entities[j]; var iarch = gfc.GetArchetype(ient._CEntityDef.archetypeName); - if (iarch == null) + if (iarch is null) { - Console.WriteLine($"Can't find archetype for {ient._CEntityDef.archetypeName}!"); + Console.WriteLine($"Can't find archetype for {ient._CEntityDef.archetypeName} for ymap {Owner.Name}!"); } else { @@ -701,23 +727,22 @@ namespace CodeWalker.GameFiles UpdateBBs(arch); } - if (EntitySets != null) + if (EntitySets is not null) { - for (int e = 0; e < EntitySets.Length; e++) + foreach(var entitySet in EntitySets) { - var entitySet = EntitySets[e]; var entities = entitySet.Entities; - if (entities == null) continue; + if (entities is null) + continue; for (int i = 0; i < entities.Count; i++) { var ient = entities[i]; var iarch = gfc.GetArchetype(ient._CEntityDef.archetypeName); - ient.SetArchetype(iarch); - if (iarch == null) + if (iarch is null) { - Console.WriteLine($"Couldn't find archetype {ient._CEntityDef.archetypeName}"); + Console.WriteLine($"Couldn't find archetype {ient._CEntityDef.archetypeName} ({ient._CEntityDef.archetypeName.Hash}) for ymap {Owner.Name}"); } else { @@ -731,18 +756,16 @@ namespace CodeWalker.GameFiles public void UpdateBBs(Archetype arch) { //update archetype room AABB's.. bad to have this here? where else to put it? - var mloa = arch as MloArchetype; - if (mloa != null) + if (arch is MloArchetype mloa) { Vector3 mlobbmin = Vector3.Zero; Vector3 mlobbmax = Vector3.Zero; Vector3[] c = new Vector3[8]; var rooms = mloa.rooms; - if (rooms != null) + if (rooms is not null) { - for (int j = 0; j < rooms.Length; j++) + foreach(var room in rooms) { - var room = rooms[j]; if (room.AttachedObjects == null || room.AttachedObjects.Length == 0) continue; Vector3 min = new Vector3(float.MaxValue); @@ -770,9 +793,9 @@ namespace CodeWalker.GameFiles c[7] = abmax; for (int n = 0; n < 8; n++) { - Vector3 corn = ori.Multiply(c[n]) + pos; - min = Vector3.Min(min, corn); - max = Vector3.Max(max, corn); + Vector3 corn = ori.Multiply(in c[n]) + pos; + Vectors.Min(in min, in corn, out min); + Vectors.Max(in max, in corn, out max); } } } @@ -790,7 +813,7 @@ namespace CodeWalker.GameFiles public YmapEntityDef CreateYmapEntity(YmapEntityDef owner, MCEntityDef ment, int index) { - YmapEntityDef e = new YmapEntityDef(null, index, ref ment._Data); + YmapEntityDef e = new YmapEntityDef(null, index, ment._Data); e.Extensions = ment.Extensions; e.MloRefPosition = e.Position; e.MloRefOrientation = e.Orientation; @@ -803,11 +826,14 @@ namespace CodeWalker.GameFiles return e; } - public MCEntityDef TryGetArchetypeEntity(YmapEntityDef ymapEntity) + public MCEntityDef? TryGetArchetypeEntity(YmapEntityDef ymapEntity) { - if (ymapEntity == null) return null; - if (Owner?.Archetype == null) return null; - if (!(Owner.Archetype is MloArchetype mloa)) return null; + if (ymapEntity is null) + return null; + if (Owner?.Archetype is null) + return null; + if (Owner.Archetype is not MloArchetype mloa) + return null; var index = Array.FindIndex(Entities, x => x == ymapEntity); if ((index >= 0) && (index < mloa.entities.Length)) @@ -817,13 +843,13 @@ namespace CodeWalker.GameFiles if (EntitySets != null) { - for (int e = 0; e < EntitySets.Length; e++) + foreach(var entset in EntitySets) { - var entset = EntitySets[e]; var ents = entset.Entities; var set = entset.EntitySet; var setents = set?.Entities; - if ((ents == null) || (setents == null)) continue; + if (ents is null || setents is null) + continue; var idx = ents.IndexOf(ymapEntity); if ((idx >= 0) && (idx < setents.Length)) { @@ -835,11 +861,14 @@ namespace CodeWalker.GameFiles return null; } - public YmapEntityDef TryGetYmapEntity(MCEntityDef mcEntity) + public YmapEntityDef? TryGetYmapEntity(MCEntityDef mcEntity) { - if (mcEntity == null) return null; - if (Owner?.Archetype == null) return null; - if (!(Owner.Archetype is MloArchetype mloa)) return null; + if (mcEntity is null) + return null; + if (Owner?.Archetype is null) + return null; + if (Owner.Archetype is not MloArchetype mloa) + return null; var index = Array.FindIndex(mloa.entities, x => x == mcEntity); if ((index >= 0) && (index < Entities.Length)) @@ -847,15 +876,15 @@ namespace CodeWalker.GameFiles return Entities[index]; } - if (EntitySets != null) + if (EntitySets is not null) { - for (int e = 0; e < EntitySets.Length; e++) + foreach(var entset in EntitySets) { - var entset = EntitySets[e]; var ents = entset.Entities; var set = entset.EntitySet; var setents = set?.Entities; - if ((ents == null) || (setents == null)) continue; + if (ents is null || setents is null) + continue; var idx = Array.FindIndex(setents, x => x == mcEntity); if ((idx >= 0) && (idx < ents.Count)) { @@ -883,21 +912,21 @@ namespace CodeWalker.GameFiles public void UpdateEntities() { - if (Entities == null) return; - if (Owner == null) return; + if (Entities is null) + return; + if (Owner is null) + return; - for (int i = 0; i < Entities.Length; i++) + foreach(var ent in Entities) { - var ent = Entities[i]; UpdateEntity(ent); } - if (EntitySets != null) + if (EntitySets != null && EntitySets.Length > 0) { - for (int e = 0; e < EntitySets.Length; e++) + foreach(var entset in EntitySets) { - var entset = EntitySets[e]; - if (entset?.Entities != null) + if (entset?.Entities is not null) { for (int i = 0; i < entset.Entities.Count; i++) { @@ -921,15 +950,16 @@ namespace CodeWalker.GameFiles public void AddEntity(YmapEntityDef e) { - if (e == null) return; + if (e is null) + return; - if (e.MloEntitySet != null) + if (e.MloEntitySet is not null) { e.MloEntitySet.AddEntity(e); } else { - if (Entities == null) Entities = new YmapEntityDef[0]; + Entities ??= Array.Empty(); var entities = Entities.ToList(); entities.Add(e); Entities = entities.ToArray(); @@ -937,21 +967,21 @@ namespace CodeWalker.GameFiles UpdateAllEntityIndexes(); } - public bool DeleteEntity(YmapEntityDef ent) + public bool DeleteEntity(YmapEntityDef entityToRemove) { var del = false; - if (ent.MloEntitySet != null) + if (entityToRemove.MloEntitySet is not null) { - del = ent.MloEntitySet.DeleteEntity(ent); + del = entityToRemove.MloEntitySet.DeleteEntity(entityToRemove); UpdateAllEntityIndexes(); return del; } - if (Entities == null) + if (Entities is null) { throw new NullReferenceException("The Entities list returned null in our MloInstanceData. This could be an issue with initialization. The MloInstance probably doesn't exist."); } - if (ent.Index >= Entities.Length) + if (entityToRemove.Index >= Entities.Length) { throw new ArgumentOutOfRangeException("The index of the entity was greater than the amount of entities that exist in this MloInstance. Likely an issue with initializion."); } @@ -959,14 +989,14 @@ namespace CodeWalker.GameFiles int index = 0; var newentities = new YmapEntityDef[Entities.Length - 1]; - for (int i = 0; i < Entities.Length; i++) - { - if (i == ent.Index) + foreach(var thisEnt in Entities) + { + if (thisEnt.Index == entityToRemove.Index) { del = true; continue; } - newentities[index] = Entities[i]; + newentities[index] = thisEnt; newentities[index].Index = index; index++; } @@ -982,15 +1012,16 @@ namespace CodeWalker.GameFiles public void AddEntitySet(MCMloEntitySet set) { var instset = new MloInstanceEntitySet(set, this); - var esets = EntitySets?.ToList() ?? new List(); + using var esets = EntitySets?.ToPooledList() ?? new PooledList(); esets.Add(instset); EntitySets = esets.ToArray(); } public bool DeleteEntitySet(MCMloEntitySet set) { - if (EntitySets == null) return false; - var esets = EntitySets.ToList(); + if (EntitySets is null) + return false; + using var esets = EntitySets.ToPooledList(); var rem = esets.RemoveAll(s => s.EntitySet == set); EntitySets = esets.ToArray(); UpdateAllEntityIndexes(); @@ -1022,22 +1053,23 @@ namespace CodeWalker.GameFiles private void UpdateAllEntityIndexes() { var index = 0; - if (Entities != null) + if (Entities is not null) { - for (int i = 0; i < Entities.Length; i++) + foreach(var ent in Entities) { - Entities[i].Index = index++; + ent.Index = index++; } } - if (EntitySets != null) + if (EntitySets is not null) { - for (int e = 0; e < EntitySets.Length; e++) + foreach(var set in EntitySets) { - var set = EntitySets[e]; - if (set?.Entities == null) continue; - for (int i = 0; i < set.Entities.Count; i++) + if (set?.Entities is null) + continue; + + foreach(var ent in set.Entities) { - set.Entities[i].Index = index++; + ent.Index = index++; } } } @@ -1060,8 +1092,13 @@ namespace CodeWalker.GameFiles public uint[] Locations { - get { return EntitySet?.Locations; } - set { if (EntitySet != null) EntitySet.Locations = value; } + get { + return EntitySet?.Locations; + } + set { + if (EntitySet != null) + EntitySet.Locations = value; + } } public bool Visible { get; set; } @@ -1069,8 +1106,10 @@ namespace CodeWalker.GameFiles { get { - if (Visible) return true; - if (EntitySet == null) return false; + if (Visible) + return true; + if (EntitySet == null) + return false; return EntitySet.ForceVisible; } } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/Meta.cs b/CodeWalker.Core/GameFiles/MetaTypes/Meta.cs index 9799fff..b303609 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/Meta.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/Meta.cs @@ -1,4 +1,5 @@ -using System;using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; @@ -8,18 +9,22 @@ using SharpDX; using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; +using System.Buffers; +using CodeWalker.Core.Utils; +using System.Runtime.InteropServices; +using System.Reflection; +using Collections.Pooled; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace CodeWalker.GameFiles { - [TC(typeof(EXP))] public class Meta : ResourceFileBase + [TC(typeof(EXP))] + public class Meta : ResourceFileBase, IResourceBlockSpan { - public override long BlockLength - { - get { return 112; } - } + public override long BlockLength => 112; // structure data public int Unknown_10h { get; set; } = 0x50524430; @@ -47,17 +52,17 @@ namespace CodeWalker.GameFiles public uint Unknown_6Ch { get; set; } = 0x00000000; // reference data - public ResourceSimpleArray StructureInfos { get; set; } - public ResourceSimpleArray EnumInfos { get; set; } - public ResourceSimpleArray DataBlocks { get; set; } - public string Name { get; set; } + public ResourceSimpleArray? StructureInfos { get; set; } + public ResourceSimpleArray? EnumInfos { get; set; } + public ResourceSimpleArray? DataBlocks { get; set; } + public string? Name { get; set; } //public string[] Strings { get; set; } - public MetaEncryptedStringsBlock EncryptedStrings { get; set; } - private string_r NameBlock = null; + private string_r? NameBlock = null; #if DEBUG + public MetaEncryptedStringsBlock EncryptedStrings { get; set; } public ResourceAnalyzer Analyzer { get; set; } #endif @@ -172,10 +177,14 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(base.GetReferences()); - if ((StructureInfos != null) && (StructureInfos.Count > 0)) list.Add(StructureInfos); - if ((EnumInfos != null) && (EnumInfos.Count > 0)) list.Add(EnumInfos); - if ((DataBlocks != null) && (DataBlocks.Count > 0)) list.Add(DataBlocks); + using var list = new PooledList(base.GetReferences()); + if (StructureInfos is not null && StructureInfos.Count > 0) + list.Add(StructureInfos); + if (EnumInfos is not null && EnumInfos.Count > 0) + list.Add(EnumInfos); + if (DataBlocks is not null && DataBlocks.Count > 0) + list.Add(DataBlocks); + if (!string.IsNullOrEmpty(Name)) { NameBlock = (string_r)Name; @@ -187,10 +196,12 @@ namespace CodeWalker.GameFiles - public MetaDataBlock FindBlock(MetaName name) + public MetaDataBlock? FindBlock(MetaName name) { - if (DataBlocks == null) return null; - foreach (var block in DataBlocks) + if (DataBlocks is null) + return null; + + foreach (var block in DataBlocks.Span) { if (block.StructureNameHash == name) { @@ -201,35 +212,37 @@ namespace CodeWalker.GameFiles } - public MetaDataBlock GetRootBlock() + public MetaDataBlock? GetRootBlock() { - MetaDataBlock block = null; + if (DataBlocks?.Data is null) + return null; + + MetaDataBlock? block = null; var rootind = RootBlockIndex - 1; - if ((rootind >= 0) && (rootind < DataBlocks.Count) && (DataBlocks.Data != null)) + if (rootind >= 0 && rootind < DataBlocks.Count) { block = DataBlocks[rootind]; } return block; } - public MetaDataBlock GetBlock(int id) + public MetaDataBlock? GetBlock(int id) { - MetaDataBlock block = null; - var ind = id - 1; - if ((ind >= 0) && (ind < DataBlocks.Count) && (DataBlocks.Data != null)) - { - block = DataBlocks[ind]; - } - return block; - } + if (DataBlocks?.Data is null) + return null; + var ind = id - 1; + if (ind >= 0 && ind < DataBlocks.Count) + { + return DataBlocks[ind]; + } + return null; + } } - [TC(typeof(EXP))] public class MetaStructureInfo : ResourceSystemBlock + [TC(typeof(EXP))] + public class MetaStructureInfo : ResourceSystemBlock, IResourceBlockSpan { - public override long BlockLength - { - get { return 32; } - } + public override long BlockLength => 32; // structure data public MetaName StructureNameHash { get; set; } @@ -249,6 +262,7 @@ namespace CodeWalker.GameFiles public MetaStructureInfo() { } + public MetaStructureInfo(MetaName nameHash, uint key, uint unknown, int length, params MetaStructureEntryInfo_s[] entries) { StructureNameHash = nameHash; @@ -277,7 +291,22 @@ namespace CodeWalker.GameFiles // read reference data this.Entries = reader.ReadStructsAt((ulong)this.EntriesPointer, (uint)this.EntriesCount); + } + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.StructureNameHash = (MetaName)reader.ReadInt32(); + this.StructureKey = reader.ReadUInt32(); + this.Unknown_8h = reader.ReadUInt32(); + this.Unknown_Ch = reader.ReadUInt32(); + this.EntriesPointer = reader.ReadInt64(); + this.StructureSize = reader.ReadInt32(); + this.Unknown_1Ch = reader.ReadInt16(); + this.EntriesCount = reader.ReadInt16(); + + // read reference data + this.Entries = reader.ReadStructsAt((ulong)this.EntriesPointer, (int)this.EntriesCount).ToArray(); } /// @@ -307,21 +336,13 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - if (EntriesBlock == null) - { - EntriesBlock = new ResourceSystemStructBlock(Entries); - } - if (EntriesBlock != null) list.Add(EntriesBlock); + EntriesBlock ??= new ResourceSystemStructBlock(Entries); //if (Entries != null) list.Add(Entries); //TODO: fix - return list.ToArray(); + return [EntriesBlock]; } - public override string ToString() - { - return StructureNameHash.ToString(); - } + public override string ToString() => StructureNameHash.ToString(); } public enum MetaStructureEntryDataType : byte @@ -354,71 +375,47 @@ namespace CodeWalker.GameFiles { public static string GetCSharpTypeName(MetaStructureEntryDataType t) { - switch (t) + return t switch { - case MetaStructureEntryDataType.Boolean: return "bool"; - case MetaStructureEntryDataType.SignedByte: return "sbyte"; - case MetaStructureEntryDataType.UnsignedByte: return "byte"; - case MetaStructureEntryDataType.SignedShort: return "short"; - case MetaStructureEntryDataType.UnsignedShort: return "ushort"; - case MetaStructureEntryDataType.SignedInt: return "int"; - case MetaStructureEntryDataType.UnsignedInt: return "uint"; - case MetaStructureEntryDataType.Float: return "float"; - case MetaStructureEntryDataType.Float_XYZ: return "Vector3"; - case MetaStructureEntryDataType.Float_XYZW: return "Vector4"; - - case MetaStructureEntryDataType.Hash: return "uint"; //uint hashes... - case MetaStructureEntryDataType.ByteEnum: return "byte"; //convert to enum later.. - case MetaStructureEntryDataType.IntEnum: return "int"; - case MetaStructureEntryDataType.ShortFlags: return "short"; - case MetaStructureEntryDataType.IntFlags1: return "int"; - case MetaStructureEntryDataType.IntFlags2: return "int"; - - case MetaStructureEntryDataType.Array: - case MetaStructureEntryDataType.ArrayOfChars: - case MetaStructureEntryDataType.ArrayOfBytes: - case MetaStructureEntryDataType.DataBlockPointer: - case MetaStructureEntryDataType.CharPointer: - case MetaStructureEntryDataType.StructurePointer: - case MetaStructureEntryDataType.Structure: - default: - return t.ToString(); - } + MetaStructureEntryDataType.Boolean => "bool", + MetaStructureEntryDataType.SignedByte => "sbyte", + MetaStructureEntryDataType.UnsignedByte => "byte", + MetaStructureEntryDataType.SignedShort => "short", + MetaStructureEntryDataType.UnsignedShort => "ushort", + MetaStructureEntryDataType.SignedInt => "int", + MetaStructureEntryDataType.UnsignedInt => "uint", + MetaStructureEntryDataType.Float => "float", + MetaStructureEntryDataType.Float_XYZ => "Vector3", + MetaStructureEntryDataType.Float_XYZW => "Vector4", + MetaStructureEntryDataType.Hash => "uint",//uint hashes... + MetaStructureEntryDataType.ByteEnum => "byte",//convert to enum later.. + MetaStructureEntryDataType.IntEnum => "int", + MetaStructureEntryDataType.ShortFlags => "short", + MetaStructureEntryDataType.IntFlags1 => "int", + MetaStructureEntryDataType.IntFlags2 => "int", + _ => t.ToString(), + }; } } - [TC(typeof(EXP))] public struct MetaStructureEntryInfo_s + [TC(typeof(EXP))] + public readonly struct MetaStructureEntryInfo_s(MetaName nameHash, int dataOffset, MetaStructureEntryDataType dataType, byte unk9h, short referenceTypeIndex, MetaName referenceKey) { // structure data - public MetaName EntryNameHash { get; set; } - public int DataOffset { get; set; } - public MetaStructureEntryDataType DataType { get; set; } - public byte Unknown_9h { get; set; } - public short ReferenceTypeIndex { get; set; } - public MetaName ReferenceKey { get; set; } + public MetaName EntryNameHash { get; init; } = nameHash; + public int DataOffset { get; init; } = dataOffset; + public MetaStructureEntryDataType DataType { get; init; } = dataType; + public byte Unknown_9h { get; init; } = unk9h; + public short ReferenceTypeIndex { get; init; } = referenceTypeIndex; + public MetaName ReferenceKey { get; init; } = referenceKey; - public MetaStructureEntryInfo_s(MetaName nameHash, int dataOffset, MetaStructureEntryDataType dataType, byte unk9h, short referenceTypeIndex, MetaName referenceKey) - { - EntryNameHash = nameHash; - DataOffset = dataOffset; - DataType = dataType; - Unknown_9h = unk9h; - ReferenceTypeIndex = referenceTypeIndex; - ReferenceKey = referenceKey; - } - - public override string ToString() - { - return DataOffset.ToString() + ": " + DataType.ToString() + ": " + ReferenceKey.ToString() + ": " + EntryNameHash.ToString(); - } + public override string ToString() => $"{DataOffset}: {DataType}: {ReferenceKey}: {EntryNameHash}"; } - [TC(typeof(EXP))] public class MetaEnumInfo : ResourceSystemBlock + [TC(typeof(EXP))] + public class MetaEnumInfo : ResourceSystemBlock, IResourceBlockSpan { - public override long BlockLength - { - get { return 24; } - } + public override long BlockLength => 24; // structure data public MetaName EnumNameHash { get; set; } @@ -462,7 +459,22 @@ namespace CodeWalker.GameFiles // this.EntriesCount //); this.Entries = reader.ReadStructsAt((ulong)this.EntriesPointer, (uint)this.EntriesCount); + } + public void Read(ref SequenceReader reader, params object[] parameters) + { + this.EnumNameHash = (MetaName)reader.ReadInt32(); + this.EnumKey = reader.ReadUInt32(); + this.EntriesPointer = reader.ReadInt64(); + this.EntriesCount = reader.ReadInt32(); + this.Unknown_14h = reader.ReadInt32(); + + // read reference data + //this.Entries = reader.ReadBlockAt>( + // (ulong)this.EntriesPointer, // offset + // this.EntriesCount + //); + this.Entries = reader.ReadStructsAt((ulong)this.EntriesPointer, (uint)this.EntriesCount).ToArray(); } /// @@ -489,47 +501,25 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); //if (Entries != null) list.Add(Entries); - if (EntriesBlock == null) - { - EntriesBlock = new ResourceSystemStructBlock(Entries); - } - if (EntriesBlock != null) list.Add(EntriesBlock); + EntriesBlock ??= new ResourceSystemStructBlock(Entries); - return list.ToArray(); + return [EntriesBlock]; } - public override string ToString() - { - return EnumNameHash.ToString(); - } + public override string ToString() => EnumNameHash.ToString(); } - [TC(typeof(EXP))] public struct MetaEnumEntryInfo_s + [TC(typeof(EXP))] + public readonly record struct MetaEnumEntryInfo_s(MetaName EntryNameHash, int EntryValue) { - // structure data - public MetaName EntryNameHash { get; set; } - public int EntryValue { get; set; } - - public MetaEnumEntryInfo_s(MetaName nameHash, int value) - { - EntryNameHash = nameHash; - EntryValue = value; - } - - public override string ToString() - { - return EntryNameHash.ToString() + ": " + EntryValue.ToString(); - } + public override string ToString() => $"{EntryNameHash}: {EntryValue}"; } - [TC(typeof(EXP))] public class MetaDataBlock : ResourceSystemBlock + [TC(typeof(EXP))] + public class MetaDataBlock : ResourceSystemBlock, IResourceBlockSpan { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public MetaName StructureNameHash { get; set; } @@ -538,7 +528,7 @@ namespace CodeWalker.GameFiles // reference data public byte[] Data { get; set; } - private ResourceSystemDataBlock DataBlock = null; + private ResourceSystemDataBlock? DataBlock = null; /// /// Reads the data-block from a stream. @@ -546,13 +536,21 @@ namespace CodeWalker.GameFiles public override void Read(ResourceDataReader reader, params object[] parameters) { // read structure data - this.StructureNameHash = (MetaName)reader.ReadInt32(); + this.StructureNameHash = (MetaName)reader.ReadInt32(); this.DataLength = reader.ReadInt32(); this.DataPointer = reader.ReadInt64(); - this.Data = reader.ReadBytesAt((ulong)this.DataPointer, (uint)DataLength); + } + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.StructureNameHash = (MetaName)reader.ReadInt32(); + this.DataLength = reader.ReadInt32(); + this.DataPointer = reader.ReadInt64(); + + this.Data = reader.ReadBytesAt((ulong)this.DataPointer, (uint)DataLength).ToArray(); } /// @@ -576,32 +574,19 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - if (DataBlock == null) - { - DataBlock = new ResourceSystemDataBlock(Data); - } - if (DataBlock != null) list.Add(DataBlock); + DataBlock ??= new ResourceSystemDataBlock(Data); //if (Data != null) list.Add(Data); - return list.ToArray(); + return [DataBlock]; } - public override string ToString() - { - return StructureNameHash.ToString() + ": " + DataPointer.ToString() + " (" + DataLength.ToString() + ")"; - } + public override string ToString() => $"{StructureNameHash}: {DataPointer} ({DataLength})"; } - [TC(typeof(EXP))] public class MetaEncryptedStringsBlock : ResourceSystemBlock + [TC(typeof(EXP))] + public class MetaEncryptedStringsBlock : ResourceSystemBlock { - public override long BlockLength - { - get - { - return 4 + Count;// + PadCount; - } - } + public override long BlockLength => 4 + Count; // + PadCount; public uint Count { get; set; } public byte[] EncryptedData { get; set; } @@ -648,72 +633,44 @@ namespace CodeWalker.GameFiles //derived types - manually created (array & pointer structs) - [TC(typeof(EXP))] public struct Array_StructurePointer //16 bytes - pointer for a structure pointer array + [TC(typeof(EXP))] + public readonly record struct Array_StructurePointer //16 bytes - pointer for a structure pointer array { - public ulong Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } - public uint Unk1 { get; set; } + public ulong Pointer { get; init; } + public ushort Count1 { get; init; } + public ushort Count2 { get; init; } + public uint Unk1 { get; init; } - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } } + public readonly uint Unk0 => (uint)(Pointer >> 32); + public readonly uint PointerDataId => (uint)(Pointer & 0xFFF); + public readonly uint PointerDataIndex => (uint)(Pointer & 0xFFF) - 1; + public readonly uint PointerDataOffset => (uint)((Pointer >> 12) & 0xFFFFF); - public void SwapEnd() + public readonly Array_StructurePointer 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() + ")"; - } - - public override bool Equals(object obj) - { - return obj is Array_StructurePointer pointer && - Pointer == pointer.Pointer && - Count1 == pointer.Count1 && - Count2 == pointer.Count2 && - Unk1 == pointer.Unk1; - } - - public override int GetHashCode() - { - int hashCode = -1900453823; - hashCode = hashCode * -1521134295 + Pointer.GetHashCode(); - hashCode = hashCode * -1521134295 + Count1.GetHashCode(); - hashCode = hashCode * -1521134295 + Count2.GetHashCode(); - hashCode = hashCode * -1521134295 + Unk1.GetHashCode(); - return hashCode; - } - - public static bool operator ==(Array_StructurePointer left, Array_StructurePointer right) - { - return left.Equals(right); - } - - public static bool operator !=(Array_StructurePointer left, Array_StructurePointer right) - { - return !(left == right); + return new Array_StructurePointer + { + Pointer = MetaTypes.SwapBytes(Pointer), + Count1 = MetaTypes.SwapBytes(Count1), + Count2 = MetaTypes.SwapBytes(Count2), + Unk1 = MetaTypes.SwapBytes(Unk1), + }; } + public override readonly string ToString() => $"Array_StructurePointer: {PointerDataIndex} ({Count1}/{Count2})"; } - [TC(typeof(EXP))] public struct Array_Structure //16 bytes - pointer for a structure array + + [TC(typeof(EXP))] + public readonly record struct Array_Structure //16 bytes - pointer for a structure array { - public ulong Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } - public uint Unk1 { get; set; } - - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } set { Pointer = (Pointer & 0xFFFFFFFFFFFFF000) + (value & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } set { PointerDataId = value + 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } set { Pointer = (Pointer & 0xFFFFFFFF00000FFF) + ((value << 12) & 0xFFFFF000); } } - + public ulong Pointer { get; init; } + public ushort Count1 { get; init; } + public ushort Count2 { get; init; } + public uint Unk1 { get; init; } + public readonly uint Unk0 => (uint)(Pointer >> 32); + public uint PointerDataId { readonly get { return (uint)(Pointer & 0xFFF); } init { Pointer = (Pointer & 0xFFFFFFFFFFFFF000) + (value & 0xFFF); } } + public uint PointerDataIndex { readonly get { return (uint)(Pointer & 0xFFF) - 1; } init { PointerDataId = value + 1; } } + public uint PointerDataOffset { readonly get { return (uint)((Pointer >> 12) & 0xFFFFF); } init { Pointer = (Pointer & 0xFFFFFFFF00000FFF) + ((value << 12) & 0xFFFFF000); } } public Array_Structure(ulong ptr, int cnt) { @@ -722,7 +679,7 @@ namespace CodeWalker.GameFiles Count2 = Count1; Unk1 = 0; } - public Array_Structure(MetaBuilderPointer ptr) + public Array_Structure(in MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Count1 = (ushort)ptr.Length; @@ -730,61 +687,30 @@ namespace CodeWalker.GameFiles Unk1 = 0; } - public Array_Structure SwapEnd() + public readonly Array_Structure SwapEnd() { - Pointer = MetaTypes.SwapBytes(Pointer); - Count1 = MetaTypes.SwapBytes(Count1); - Count2 = MetaTypes.SwapBytes(Count2); - Unk1 = MetaTypes.SwapBytes(Unk1); - return this; - } - public override string ToString() - { - return "Array_Structure: " + PointerDataIndex.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; - } - - public static bool operator ==(Array_Structure x, Array_Structure y) - { - return x.Equals(y); - } - - public static bool operator !=(Array_Structure x, Array_Structure y) - { - return !x.Equals(y); - } - - public override bool Equals(object obj) - { - if (obj is null || obj is not Array_Structure arrObj) - return false; - - return arrObj.Pointer == this.Pointer - && arrObj.Count1 == this.Count1 - && arrObj.Count2 == this.Count2 - && arrObj.Unk1 == this.Unk1; - } - - public override int GetHashCode() - { - int hashCode = -1900453823; - hashCode = hashCode * -1521134295 + Pointer.GetHashCode(); - hashCode = hashCode * -1521134295 + Count1.GetHashCode(); - hashCode = hashCode * -1521134295 + Count2.GetHashCode(); - hashCode = hashCode * -1521134295 + Unk1.GetHashCode(); - return hashCode; + return new Array_Structure + { + Pointer = MetaTypes.SwapBytes(Pointer), + Count1 = MetaTypes.SwapBytes(Count1), + Count2 = MetaTypes.SwapBytes(Count2), + Unk1 = MetaTypes.SwapBytes(Unk1), + }; } + public override readonly string ToString() => $"Array_Structure: {PointerDataIndex} ({Count1}/{Count2})"; } - [TC(typeof(EXP))] public struct Array_uint //16 bytes - pointer for a uint array + [TC(typeof(EXP))] + public readonly record struct Array_uint //16 bytes - pointer for a uint array { - public ulong Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } - public uint Unk1 { get; set; } + public ulong Pointer { get; init; } + public ushort Count1 { get; init; } + public ushort Count2 { get; init; } + public uint Unk1 { get; init; } - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } } + public uint Unk0 => (uint)(Pointer >> 32); + public uint PointerDataId => (uint)(Pointer & 0xFFF); + public uint PointerDataIndex => (uint)(Pointer & 0xFFF) - 1; + public uint PointerDataOffset => (uint)((Pointer >> 12) & 0xFFFFF); public Array_uint(ulong ptr, int cnt) @@ -794,7 +720,7 @@ namespace CodeWalker.GameFiles Count2 = Count1; Unk1 = 0; } - public Array_uint(MetaBuilderPointer ptr) + public Array_uint(in MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Count1 = (ushort)ptr.Length; @@ -802,60 +728,31 @@ namespace CodeWalker.GameFiles Unk1 = 0; } - public void SwapEnd() + public Array_uint SwapEnd() { - Pointer = MetaTypes.SwapBytes(Pointer); - 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() + ")"; - } - - public static bool operator ==(Array_uint x, Array_uint y) - { - return x.Equals(y); - } - - public static bool operator !=(Array_uint x, Array_uint y) - { - return !x.Equals(y); - } - - public override bool Equals(object obj) - { - if (obj is null || obj is not Array_uint arrObj) - return false; - - return arrObj.Pointer == this.Pointer - && arrObj.Count1 == this.Count1 - && arrObj.Count2 == this.Count2 - && arrObj.Unk1 == this.Unk1; - } - - public override int GetHashCode() - { - int hashCode = -1900453823; - hashCode = hashCode * -1521134295 + Pointer.GetHashCode(); - hashCode = hashCode * -1521134295 + Count1.GetHashCode(); - hashCode = hashCode * -1521134295 + Count2.GetHashCode(); - hashCode = hashCode * -1521134295 + Unk1.GetHashCode(); - return hashCode; + return new Array_uint + { + Pointer = MetaTypes.SwapBytes(Pointer), + Count1 = MetaTypes.SwapBytes(Count1), + Count2 = MetaTypes.SwapBytes(Count2), + Unk1 = MetaTypes.SwapBytes(Unk1), + }; } + public override string ToString() => $"Array_uint {{ PointerDataIndex = {PointerDataIndex}, Count1 = {Count1}, Count2 = {Count2} }}"; } - [TC(typeof(EXP))] public struct Array_ushort //16 bytes - pointer for a ushort array - { - public ulong Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } - public uint Unk1 { get; set; } - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } } + [TC(typeof(EXP))] + public readonly struct Array_ushort //16 bytes - pointer for a ushort array + { + public ulong Pointer { get; init; } + public ushort Count1 { get; init; } + public ushort Count2 { get; init; } + public uint Unk1 { get; init; } + + public readonly uint Unk0 => (uint)(Pointer >> 32); + public readonly uint PointerDataId => (uint)(Pointer & 0xFFF); + public readonly uint PointerDataIndex => (uint)(Pointer & 0xFFF) - 1; + public readonly uint PointerDataOffset => (uint)((Pointer >> 12) & 0xFFFFF); public Array_ushort(ulong ptr, int cnt) @@ -865,7 +762,7 @@ namespace CodeWalker.GameFiles Count2 = Count1; Unk1 = 0; } - public Array_ushort(MetaBuilderPointer ptr) + public Array_ushort(in MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Count1 = (ushort)ptr.Length; @@ -873,60 +770,31 @@ namespace CodeWalker.GameFiles Unk1 = 0; } - public void SwapEnd() + public readonly Array_ushort SwapEnd() { - Pointer = MetaTypes.SwapBytes(Pointer); - 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() + ")"; - } - - public static bool operator ==(Array_ushort x, Array_ushort y) - { - return x.Equals(y); - } - - public static bool operator !=(Array_ushort x, Array_ushort y) - { - return !x.Equals(y); - } - - public override bool Equals(object obj) - { - if (obj is null || obj is not Array_ushort arrObj) - return false; - - return arrObj.Pointer == this.Pointer - && arrObj.Count1 == this.Count1 - && arrObj.Count2 == this.Count2 - && arrObj.Unk1 == this.Unk1; - } - - public override int GetHashCode() - { - int hashCode = -1900453823; - hashCode = hashCode * -1521134295 + Pointer.GetHashCode(); - hashCode = hashCode * -1521134295 + Count1.GetHashCode(); - hashCode = hashCode * -1521134295 + Count2.GetHashCode(); - hashCode = hashCode * -1521134295 + Unk1.GetHashCode(); - return hashCode; + return new Array_ushort + { + Pointer = MetaTypes.SwapBytes(Pointer), + Count1 = MetaTypes.SwapBytes(Count1), + Count2 = MetaTypes.SwapBytes(Count2), + Unk1 = MetaTypes.SwapBytes(Unk1), + }; } + public override readonly string ToString() => $"Array_ushort {{ PointerDataIndex = {PointerDataIndex}, Count1 = {Count1}, Count2 = {Count2} }}"; } - [TC(typeof(EXP))] public struct Array_byte //16 bytes - pointer for a byte array - { - public ulong Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } - public uint Unk1 { get; set; } - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } } + [TC(typeof(EXP))] + public readonly record struct Array_byte //16 bytes - pointer for a byte array + { + public ulong Pointer { get; init; } + public ushort Count1 { get; init; } + public ushort Count2 { get; init; } + public uint Unk1 { get; init; } + + public readonly uint Unk0 => (uint)(Pointer >> 32); + public readonly uint PointerDataId => (uint)(Pointer & 0xFFF); + public readonly uint PointerDataIndex => (uint)(Pointer & 0xFFF) - 1; + public readonly uint PointerDataOffset => (uint)((Pointer >> 12) & 0xFFFFF); public Array_byte(ulong ptr, int cnt) { @@ -935,7 +803,8 @@ namespace CodeWalker.GameFiles Count2 = Count1; Unk1 = 0; } - public Array_byte(MetaBuilderPointer ptr) + + public Array_byte(in MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Count1 = (ushort)ptr.Length; @@ -943,58 +812,32 @@ namespace CodeWalker.GameFiles Unk1 = 0; } - public void SwapEnd() + public readonly Array_byte SwapEnd() { - Pointer = MetaTypes.SwapBytes(Pointer); - 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() + ")"; + return new Array_byte + { + Pointer = MetaTypes.SwapBytes(Pointer), + Count1 = MetaTypes.SwapBytes(Count1), + Count2 = MetaTypes.SwapBytes(Count2), + Unk1 = MetaTypes.SwapBytes(Unk1), + }; } - public override bool Equals(object obj) - { - return obj is Array_byte @byte && - Pointer == @byte.Pointer && - Count1 == @byte.Count1 && - Count2 == @byte.Count2 && - Unk1 == @byte.Unk1; - } - - public override int GetHashCode() - { - int hashCode = -1900453823; - hashCode = hashCode * -1521134295 + Pointer.GetHashCode(); - hashCode = hashCode * -1521134295 + Count1.GetHashCode(); - hashCode = hashCode * -1521134295 + Count2.GetHashCode(); - hashCode = hashCode * -1521134295 + Unk1.GetHashCode(); - return hashCode; - } - - public static bool operator ==(Array_byte left, Array_byte right) - { - return left.Equals(right); - } - - public static bool operator !=(Array_byte left, Array_byte right) - { - return !(left == right); - } + public override readonly string ToString() => $"Array_byte: {PointerDataIndex} ({Count1}/{Count2})"; } - [TC(typeof(EXP))] public struct Array_float //16 bytes - pointer for a float array - { - public ulong Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } - public uint Unk1 { get; set; } - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } } + [TC(typeof(EXP))] + public readonly struct Array_float //16 bytes - pointer for a float array + { + public ulong Pointer { get; init; } + public ushort Count1 { get; init; } + public ushort Count2 { get; init; } + public uint Unk1 { get; init; } + + public uint Unk0 => (uint)(Pointer >> 32); + public uint PointerDataId => (uint)(Pointer & 0xFFF); + public uint PointerDataIndex => (uint)(Pointer & 0xFFF) - 1; + public uint PointerDataOffset => (uint)((Pointer >> 12) & 0xFFFFF); public Array_float(ulong ptr, int cnt) { @@ -1003,7 +846,7 @@ namespace CodeWalker.GameFiles Count2 = Count1; Unk1 = 0; } - public Array_float(MetaBuilderPointer ptr) + public Array_float(in MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Count1 = (ushort)ptr.Length; @@ -1011,29 +854,31 @@ namespace CodeWalker.GameFiles Unk1 = 0; } - public void SwapEnd() + public Array_float SwapEnd() { - Pointer = MetaTypes.SwapBytes(Pointer); - 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() + ")"; + return new Array_float + { + Pointer = MetaTypes.SwapBytes(Pointer), + Count1 = MetaTypes.SwapBytes(Count1), + Count2 = MetaTypes.SwapBytes(Count2), + Unk1 = MetaTypes.SwapBytes(Unk1) + }; } + public override string ToString() => $"Array_float: {PointerDataIndex} ({Count1}/{Count2})"; } - [TC(typeof(EXP))] public struct Array_Vector3 //16 bytes - pointer for a Vector3 array - { - public ulong Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } - public uint Unk1 { get; set; } - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } } + [TC(typeof(EXP))] + public readonly struct Array_Vector3 //16 bytes - pointer for a Vector3 array + { + public ulong Pointer { get; init; } + public ushort Count1 { get; init; } + public ushort Count2 { get; init; } + public uint Unk1 { get; init; } + + public uint Unk0 => (uint)(Pointer >> 32); + public uint PointerDataId => (uint)(Pointer & 0xFFF); + public uint PointerDataIndex => (uint)(Pointer & 0xFFF) - 1; + public uint PointerDataOffset => (uint)((Pointer >> 12) & 0xFFFFF); public Array_Vector3(ulong ptr, int cnt) { @@ -1042,7 +887,7 @@ namespace CodeWalker.GameFiles Count2 = Count1; Unk1 = 0; } - public Array_Vector3(MetaBuilderPointer ptr) + public Array_Vector3(in MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Count1 = (ushort)ptr.Length; @@ -1050,29 +895,31 @@ namespace CodeWalker.GameFiles Unk1 = 0; } - public void SwapEnd() + public Array_Vector3 SwapEnd() { - Pointer = MetaTypes.SwapBytes(Pointer); - 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() + ")"; + return new Array_Vector3 + { + Pointer = MetaTypes.SwapBytes(Pointer), + Count1 = MetaTypes.SwapBytes(Count1), + Count2 = MetaTypes.SwapBytes(Count2), + Unk1 = MetaTypes.SwapBytes(Unk1) + }; } + public override string ToString() => $"Array_Vector3: {PointerDataIndex} ({Count1}/{Count2})"; } - [TC(typeof(EXP))] public struct CharPointer //16 bytes - pointer for a char array - { - public ulong Pointer { get; set; } - public ushort Count1 { get; set; } - public ushort Count2 { get; set; } - public uint Unk1 { get; set; } - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } } + [TC(typeof(EXP))] + public readonly struct CharPointer //16 bytes - pointer for a char array + { + public ulong Pointer { get; init; } + public ushort Count1 { get; init; } + public ushort Count2 { get; init; } + public uint Unk1 { get; init; } + + public uint Unk0 => (uint)(Pointer >> 32); + public uint PointerDataId => (uint)(Pointer & 0xFFF); + public uint PointerDataIndex => (uint)(Pointer & 0xFFF) - 1; + public uint PointerDataOffset => (uint)((Pointer >> 12) & 0xFFFFF); public CharPointer(ulong ptr, int len) { @@ -1081,7 +928,7 @@ namespace CodeWalker.GameFiles Count2 = Count1; Unk1 = 0; } - public CharPointer(MetaBuilderPointer ptr) + public CharPointer(in MetaBuilderPointer ptr) { Pointer = ptr.Pointer; Count1 = (ushort)ptr.Length; @@ -1089,26 +936,28 @@ namespace CodeWalker.GameFiles Unk1 = 0; } - public void SwapEnd() + public CharPointer SwapEnd() { - Pointer = MetaTypes.SwapBytes(Pointer); - Count1 = MetaTypes.SwapBytes(Count1); - Count2 = MetaTypes.SwapBytes(Count2); - Unk1 = MetaTypes.SwapBytes(Unk1); - } - public override string ToString() - { - return "CharPointer: " + Pointer.ToString() + " (" + Count1.ToString() + "/" + Count2.ToString() + ")"; + return new CharPointer + { + Pointer = MetaTypes.SwapBytes(Pointer), + Count1 = MetaTypes.SwapBytes(Count1), + Count2 = MetaTypes.SwapBytes(Count2), + Unk1 = MetaTypes.SwapBytes(Unk1) + }; } + public override string ToString() => $"CharPointer: {Pointer} ({Count1}/{Count2})"; } - [TC(typeof(EXP))] public struct DataBlockPointer //8 bytes - pointer to data block - { - public ulong Pointer { get; set; } - public uint Unk0 { get { return (uint)(Pointer >> 32); } } - public uint PointerDataId { get { return (uint)(Pointer & 0xFFF); } } - public uint PointerDataIndex { get { return (uint)(Pointer & 0xFFF) - 1; } } - public uint PointerDataOffset { get { return (uint)((Pointer >> 12) & 0xFFFFF); } } + [TC(typeof(EXP))] + public readonly struct DataBlockPointer //8 bytes - pointer to data block + { + public ulong Pointer { get; init; } + + public uint Unk0 => (uint)(Pointer >> 32); + public uint PointerDataId => (uint)(Pointer & 0xFFF); + public uint PointerDataIndex => (uint)(Pointer & 0xFFF) - 1; + public uint PointerDataOffset => (uint)((Pointer >> 12) & 0xFFFFF); public DataBlockPointer(int blockId, int offset) @@ -1116,204 +965,196 @@ namespace CodeWalker.GameFiles Pointer = ((uint)blockId & 0xFFF) | (((uint)offset & 0xFFFFF) << 12); } - public override string ToString() - { - return "DataBlockPointer: " + Pointer.ToString(); - } + public override string ToString() => $"DataBlockPointer: {Pointer}"; - public void SwapEnd() + public DataBlockPointer SwapEnd() { - Pointer = MetaTypes.SwapBytes(Pointer); + return new DataBlockPointer() + { + Pointer = MetaTypes.SwapBytes(Pointer) + }; } } - [TC(typeof(EXP))] public struct ArrayOfUshorts3 //array of 3 ushorts + [TC(typeof(EXP))] + public readonly struct ArrayOfUshorts3 //array of 3 ushorts { - public ushort u0, u1, u2; + public readonly ushort u0, u1, u2; + + public ArrayOfUshorts3(ushort u0, ushort u1, ushort u2) + { + this.u0 = u0; + this.u1 = u1; + this.u2 = u2; + } + public Vector3 XYZ() { return new Vector3(u0, u1, u2); } - public override string ToString() - { - return u0.ToString() + ", " + u1.ToString() + ", " + u2.ToString(); - } + public override string ToString() => $"{u0}, {u1}, {u2}"; } - [TC(typeof(EXP))] public struct ArrayOfBytes3 //array of 3 bytes + + [TC(typeof(EXP))] + public readonly struct ArrayOfBytes3 //array of 3 bytes { - public byte b0, b1, b2; + public readonly byte b0, b1, b2; + + public ArrayOfBytes3(byte b0, byte b1, byte b2) + { + this.b0 = b0; + this.b1 = b1; + this.b2 = b2; + } + public byte[] GetArray() { - return new[] { b0, b1, b2 }; - } - public override string ToString() - { - return b0.ToString() + ", " + b1.ToString() + ", " + b2.ToString(); + return [b0, b1, b2]; } + public override string ToString() => $"{b0}, {b1}, {b2}"; } - [TC(typeof(EXP))] public struct ArrayOfBytes4 //array of 4 bytes + + [TC(typeof(EXP))] + public readonly struct ArrayOfBytes4 //array of 4 bytes { - public byte b0, b1, b2, b3; + public readonly byte b0, b1, b2, b3; public byte[] GetArray() { - return new[] { b0, b1, b2, b3 }; - } - public override string ToString() - { - return b0.ToString() + ", " + b1.ToString() + ", " + b2.ToString() + ", " + b3.ToString(); + return [b0, b1, b2, b3]; } + public override string ToString() => $"{b0}, {b1}, {b2}, {b3}"; } - [TC(typeof(EXP))] public struct ArrayOfBytes5 //array of 5 bytes + + [TC(typeof(EXP))] + public readonly struct ArrayOfBytes5 //array of 5 bytes { - public byte b0, b1, b2, b3, b4; + public readonly byte b0, b1, b2, b3, b4; public byte[] GetArray() { - return new[] { b0, b1, b2, b3, b4 }; + return [b0, b1, b2, b3, b4]; } } - [TC(typeof(EXP))] public struct ArrayOfBytes6 //array of 6 bytes + + [TC(typeof(EXP))] + public readonly struct ArrayOfBytes6 //array of 6 bytes { - public byte b0, b1, b2, b3, b4, b5; + public readonly byte b0, b1, b2, b3, b4, b5; public byte[] GetArray() { - return new[] { b0, b1, b2, b3, b4, b5 }; + return [b0, b1, b2, b3, b4, b5]; } } - [TC(typeof(EXP))] public struct ArrayOfBytes12 //array of 12 bytes + + [TC(typeof(EXP))] + public readonly struct ArrayOfBytes12 //array of 12 bytes { - public byte b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11; + public readonly byte b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11; public byte[] GetArray() { - return new[] { b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11 }; + return [b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11]; } } - [TC(typeof(EXP))] public struct ArrayOfChars64 //array of 64 chars (bytes) + + [TC(typeof(EXP))] + public readonly struct ArrayOfChars64 //array of 64 chars (bytes) { - public byte + public readonly 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 readonly 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 ReadOnlySpan GetBytes() + { + return MemoryMarshal.AsBytes(MemoryMarshal.CreateReadOnlySpan(in this, 1)); + } + public override string ToString() { - byte[] bytes = + var byteArr = GetBytes(); + + var index = byteArr.IndexOf((byte)0); + + if (index == -1) { - 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 Encoding.ASCII.GetString(byteArr); } - return sb.ToString(); + + return Encoding.ASCII.GetString(byteArr.Slice(0, index)); } } - [TC(typeof(EXP))] public struct MetaVECTOR3 //12 bytes, Key:2751397072 + [TC(typeof(EXP))] + public readonly struct MetaVECTOR3(in Vector3 v) //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 float X { get; init; } = v.X; //0 0: Float: 0: x + public float Y { get; init; } = v.Y; //4 4: Float: 0: y + public float Z { get; init; } = v.Z; //8 8: Float: 0: z - public override string ToString() - { - return x.ToString() + ", " + y.ToString() + ", " + z.ToString(); - } - - public MetaVECTOR3(Vector3 v) - { - x = v.X; - y = v.Y; - z = v.Z; - } - - public Vector3 ToVector3() - { - return new Vector3(x, y, z); - } + public override string ToString() => $"{X}, {Y}, {Z}"; + public Vector3 ToVector3() => new Vector3(X, Y, Z); } - [TC(typeof(EXP))] public struct MetaPOINTER //8 bytes - pointer to data item //was: SectionUNKNOWN10 + [TC(typeof(EXP))] + public readonly record struct MetaPOINTER //8 bytes - pointer to data item //was: SectionUNKNOWN10 { - public ulong Pointer { get; set; } + public readonly ulong Pointer; - public int BlockIndex { get { return BlockID - 1; } } - public int BlockID { get { return (int)(Pointer & 0xFFF); } set { Pointer = (Pointer & 0xFFFFF000) + ((uint)value & 0xFFF); } } - public int Offset { get { return (int)((Pointer >> 12) & 0xFFFFF); } set { Pointer = (Pointer & 0xFFF) + (((uint)value << 12) & 0xFFFFF000); } } + public int BlockIndex => BlockID - 1; + public int BlockID => (int)(Pointer & 0xFFF); + public int Offset => (int)((Pointer >> 12) & 0xFFFFF); public MetaPOINTER(int blockID, int itemOffset) { Pointer = (((uint)itemOffset << 12) & 0xFFFFF000) + ((uint)blockID & 0xFFF); } - public override string ToString() - { - return BlockID.ToString() + ", " + Offset.ToString(); - } + public override string ToString() => $"{BlockID}, {Offset}"; } - - - - - - - - - - [TC(typeof(EXP))] public struct MetaHash : IEquatable + [TC(typeof(EXP))] + public readonly record struct MetaHash(uint Hash) : IEquatable { - public uint Hash { get; set; } - - public string Hex - { - get - { - return Hash.ToString("X").PadLeft(8, '0'); - } - } - - public float Float - { - get - { - return MetaTypes.ConvertData(MetaTypes.ConvertToBytes(Hash)); - } - } - - public short Short1 - { - get - { - return (short)(Hash & 0xFFFF); - } - } - public short Short2 - { - get - { - return (short)((Hash >> 16) & 0xFFFF); - } - } - - - public MetaHash(uint h) { Hash = h; } + public string Hex => Hash.ToString("X8"); + public float Float => MetaTypes.ConvertData(MetaTypes.ConvertToBytes(Hash)); + public short Short1 => (short)(Hash & 0xFFFF); + public short Short2 => (short)((Hash >> 16) & 0xFFFF); public override string ToString() { - var str = JenkIndex.TryGetString(Hash); - if (!string.IsNullOrEmpty(str)) return str; - if (MetaNames.TryGetString(Hash, out str)) return str; + if (JenkIndex.TryGetString(Hash, out var str)) + { + return str; + } + if (MetaNames.TryGetString(Hash, out str)) + { + return str; + } return GlobalText.GetString(Hash); } public string ToCleanString() { - if (Hash == 0) return string.Empty; + if (Hash == 0) + return string.Empty; return ToString(); } @@ -1327,51 +1168,17 @@ namespace CodeWalker.GameFiles return new MetaHash(v); } - public override readonly bool Equals(object obj) + public override int GetHashCode() { - if (obj == null) return false; - if (obj is not MetaHash metaHash) return false; - - return metaHash.Hash == Hash; - } - - public readonly bool Equals(MetaHash obj) - { - if (obj == null) return false; - - return obj.Hash == Hash; - } - - public override readonly int GetHashCode() - { - return (int)Hash; - } - - public static bool operator ==(MetaHash a, MetaHash b) - { - return a.Equals(b); - } - - public static bool operator !=(MetaHash a, MetaHash b) - { - return !a.Equals(b); + return Hash.GetHashCode(); } } - [TC(typeof(EXP))] public struct TextHash + [TC(typeof(EXP))] + public readonly record struct TextHash(uint Hash) { - public uint Hash { get; set; } - - public string Hex - { - get - { - return Hash.ToString("X"); - } - } - - public TextHash(uint h) { Hash = h; } + public string Hex => Hash.ToString("X"); public override string ToString() { @@ -1389,12 +1196,4 @@ namespace CodeWalker.GameFiles return new TextHash(v); } } - - - - - - - - } \ No newline at end of file diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaBuilder.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaBuilder.cs index 5e32ba7..9665830 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/MetaBuilder.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaBuilder.cs @@ -10,7 +10,7 @@ namespace CodeWalker.GameFiles public class MetaBuilder { - List Blocks = new List(); + readonly List Blocks = new List(); int MaxBlockLength = 0x4000; //TODO: figure what this should be! @@ -31,16 +31,18 @@ namespace CodeWalker.GameFiles } public MetaBuilderBlock AddBlock(MetaName type) { - MetaBuilderBlock b = new MetaBuilderBlock(); - b.StructureNameHash = type; - b.Index = Blocks.Count; + MetaBuilderBlock b = new MetaBuilderBlock + { + StructureNameHash = type, + Index = Blocks.Count + }; Blocks.Add(b); return b; } - public MetaBuilderPointer AddItem(MetaName type, T item) where T : struct + public MetaBuilderPointer AddItem(MetaName type, in T item) where T : struct { - byte[] data = MetaTypes.ConvertToBytes(item); + byte[] data = MetaTypes.ConvertToBytes(in item); return AddItem(type, data); } @@ -56,11 +58,11 @@ namespace CodeWalker.GameFiles data = newdata; //make sure item size is multiple of 16... so pointers don't need sub offsets! } int idx = block.AddItem(data); - MetaBuilderPointer r = new MetaBuilderPointer(); - r.BlockID = block.Index + 1; - r.Offset = (idx * data.Length); - r.Length = data.Length; - return r; + return new MetaBuilderPointer( + blockId: block.Index + 1, + offset: (idx * data.Length), + length: data.Length + ); } public MetaBuilderPointer AddItemArray(MetaName type, T[] items) where T : struct @@ -82,12 +84,13 @@ namespace CodeWalker.GameFiles byte[] newdata = new byte[newlen]; Buffer.BlockCopy(data, 0, newdata, 0, datalen); int offs = block.TotalSize; - int idx = block.AddItem(newdata); - MetaBuilderPointer r = new MetaBuilderPointer(); - r.BlockID = block.Index + 1; - r.Offset = offs; //(idx * data.Length);; - r.Length = length; - return r; + _ = block.AddItem(newdata); + return new MetaBuilderPointer + ( + blockId: block.Index + 1, + offset: offs, //(idx * data.Length);; + length: length + ); } public MetaBuilderPointer AddString(string str) @@ -99,17 +102,18 @@ namespace CodeWalker.GameFiles byte[] newdata = new byte[newlen]; Buffer.BlockCopy(data, 0, newdata, 0, datalen); int offs = block.TotalSize; - int idx = block.AddItem(newdata); - MetaBuilderPointer r = new MetaBuilderPointer(); - r.BlockID = block.Index + 1; - r.Offset = offs;// (idx * data.Length); - r.Length = datalen; //actual length of string. (not incl null terminator) - return r; + _ = block.AddItem(newdata); + return new MetaBuilderPointer + ( + blockId: block.Index + 1, + offset: offs,// (idx * data.Length); + length: datalen //actual length of string. (not incl null terminator) + ); } - public MetaPOINTER AddItemPtr(MetaName type, T item) where T : struct //helper method for AddItem + public MetaPOINTER AddItemPtr(MetaName type, in T item) where T : struct //helper method for AddItem { - var ptr = AddItem(type, item); + var ptr = AddItem(type, in item); return new MetaPOINTER(ptr.BlockID, ptr.Offset); } @@ -121,14 +125,16 @@ namespace CodeWalker.GameFiles public Array_Structure AddItemArrayPtr(MetaName type, T[] items) where T : struct //helper method for AddItemArray { - if ((items == null) || (items.Length == 0)) return new Array_Structure(); + if (items is null || items.Length == 0) + return new Array_Structure(); var ptr = AddItemArray(type, items); return new Array_Structure(ptr); } public Array_Structure AddItemArrayPtr(MetaName type, byte[][] data) //helper method for AddItemArray { - if ((data == null) || (data.Length == 0)) return new Array_Structure(); + if ((data?.Length ?? 0) == 0) + return new Array_Structure(); int len = 0; @@ -153,40 +159,43 @@ namespace CodeWalker.GameFiles public Array_Vector3 AddPaddedVector3ArrayPtr(Vector4[] items) { - if (items == null || items.Length == 0) + if ((items?.Length ?? 0) == 0) return new Array_Vector3(); var ptr = AddItemArray((MetaName)MetaTypeName.VECTOR4, items); //padded to vec4... return new Array_Vector3(ptr); } public Array_uint AddHashArrayPtr(MetaHash[] items) { - if (items == null || items.Length == 0) + if ((items?.Length ?? 0) == 0) return new Array_uint(); var ptr = AddItemArray((MetaName)MetaTypeName.HASH, items); return new Array_uint(ptr); } public Array_uint AddUintArrayPtr(uint[] items) { - if (items == null || items.Length == 0) + if ((items?.Length ?? 0) == 0) return new Array_uint(); var ptr = AddItemArray((MetaName)MetaTypeName.UINT, items); return new Array_uint(ptr); } public Array_ushort AddUshortArrayPtr(ushort[] items) { - if ((items == null) || (items.Length == 0)) return new Array_ushort(); + if ((items?.Length ?? 0) == 0) + return new Array_ushort(); var ptr = AddItemArray((MetaName)MetaTypeName.USHORT, items); return new Array_ushort(ptr); } public Array_byte AddByteArrayPtr(byte[] items) { - if ((items == null) || (items.Length == 0)) return new Array_byte(); + if ((items?.Length ?? 0) == 0) + return new Array_byte(); var ptr = AddItemArray((MetaName)MetaTypeName.BYTE, items); return new Array_byte(ptr); } public Array_float AddFloatArrayPtr(float[] items) { - if ((items == null) || (items.Length == 0)) return new Array_float(); + if ((items?.Length ?? 0) == 0) + return new Array_float(); var ptr = AddItemArray((MetaName)MetaTypeName.FLOAT, items); return new Array_float(ptr); } @@ -199,55 +208,45 @@ namespace CodeWalker.GameFiles { var block = AddBlock(type); int offs = block.TotalSize;//should always be 0... - int idx = block.AddItem(data); + _ = block.AddItem(data); var ptr = new DataBlockPointer(block.Index + 1, offs); return ptr; } - public Array_StructurePointer AddPointerArray(MetaPOINTER[] arr) + public Array_StructurePointer AddPointerArray(MetaPOINTER[]? arr) { - if ((arr == null) || (arr.Length == 0)) return new Array_StructurePointer(); + if (arr is null || arr.Length == 0) + return new Array_StructurePointer(); + var ptr = AddItemArray((MetaName)MetaTypeName.POINTER, arr); - Array_StructurePointer sp = new Array_StructurePointer(); - sp.Count1 = (ushort)arr.Length; - sp.Count2 = sp.Count1; - sp.Pointer = ptr.Pointer; + Array_StructurePointer sp = new Array_StructurePointer { + Count1 = (ushort)arr.Length, + Count2 = (ushort)arr.Length, + Pointer = ptr.Pointer, + }; return sp; } - public Array_StructurePointer AddItemPointerArrayPtr(MetaName type, T[] items) where T : struct + public Array_StructurePointer AddItemPointerArrayPtr(MetaName type, T[]? items) where T : struct { //helper method for creating a pointer array - if ((items == null) || (items.Length == 0)) return new Array_StructurePointer(); + if (items is null || items.Length == 0) + return new Array_StructurePointer(); MetaPOINTER[] ptrs = new MetaPOINTER[items.Length]; for (int i = 0; i < items.Length; i++) { - ptrs[i] = AddItemPtr(type, items[i]); + ptrs[i] = AddItemPtr(type, in items[i]); } return AddPointerArray(ptrs); - - //Array_StructurePointer sp = new Array_StructurePointer(); - //sp.Count1 = (ushort)items.Length; - //sp.Count2 = sp.Count1; - //for (int i = 0; i < items.Length; i++) - //{ - // var item = items[i]; - // var meptr = AddItemPtr(type, item); - // var mptr = AddItem((MetaName)MetaTypeName.POINTER, meptr); - // if (i == 0) - // { - // sp.Pointer = mptr.Pointer; //main pointer points to the first item. - // } - //} - //return sp; } - public Array_StructurePointer AddWrapperArrayPtr(MetaWrapper[] items) + public Array_StructurePointer AddWrapperArrayPtr(MetaWrapper[]? items) { - if ((items == null) || (items.Length == 0)) return new Array_StructurePointer(); + if (items is null || items.Length == 0) + return new Array_StructurePointer(); MetaPOINTER[] ptrs = new MetaPOINTER[items.Length]; @@ -256,43 +255,31 @@ namespace CodeWalker.GameFiles ptrs[i] = items[i].Save(this); } return AddPointerArray(ptrs); - - //Array_StructurePointer sp = new Array_StructurePointer(); - //sp.Count1 = (ushort)items.Length; - //sp.Count2 = sp.Count1; - //for (int i = 0; i < items.Length; i++) - //{ - // var item = items[i]; - // var meptr = item.Save(this); - // var mptr = AddItem((MetaName)MetaTypeName.POINTER, meptr); - // if (i == 0) - // { - // sp.Pointer = mptr.Pointer; //main pointer points to the first item. - // } - //} - //return sp; } - public Array_Structure AddWrapperArray(MetaWrapper[] items) + public Array_Structure AddWrapperArray(MetaWrapper[]? items) { - if ((items == null) || (items.Length == 0)) return new Array_Structure(); + if (items is null || items.Length == 0) + return new Array_Structure(); - var sa = new Array_Structure(); - sa.Count1 = (ushort)items.Length; - sa.Count2 = sa.Count1; + var pointer = 0UL; for (int i = 0; i < items.Length; i++) { var item = items[i]; var meptr = item.Save(this); if (i == 0) { - MetaBuilderPointer mbp = new MetaBuilderPointer(); - mbp.BlockID = meptr.BlockID; - mbp.Offset = meptr.Offset; - sa.Pointer = mbp.Pointer; + MetaBuilderPointer mbp = new MetaBuilderPointer(meptr.BlockID, meptr.Offset, 0); + pointer = mbp.Pointer; } } - return sa; + + return new Array_Structure + { + Count1 = (ushort)items.Length, + Count2 = (ushort)items.Length, + Pointer = pointer, + }; } @@ -315,15 +302,13 @@ namespace CodeWalker.GameFiles offset += bdata.Length; } } - if (offset != data.Length) - { } return data; } - Dictionary StructureInfos = new Dictionary(); - Dictionary EnumInfos = new Dictionary(); + readonly Dictionary StructureInfos = new Dictionary(); + readonly Dictionary EnumInfos = new Dictionary(); public void AddStructureInfo(MetaName name) { @@ -363,11 +348,7 @@ namespace CodeWalker.GameFiles if (StructureInfos.Count > 0) { - m.StructureInfos = new ResourceSimpleArray(); - foreach (var si in StructureInfos.Values) - { - m.StructureInfos.Add(si); - } + m.StructureInfos = new ResourceSimpleArray(StructureInfos.Values); m.StructureInfosCount = (short)m.StructureInfos.Count; } else @@ -378,11 +359,7 @@ namespace CodeWalker.GameFiles if (EnumInfos.Count > 0) { - m.EnumInfos = new ResourceSimpleArray(); - foreach (var ei in EnumInfos.Values) - { - m.EnumInfos.Add(ei); - } + m.EnumInfos = new ResourceSimpleArray(EnumInfos.Values); m.EnumInfosCount = (short)m.EnumInfos.Count; } else @@ -431,9 +408,10 @@ namespace CodeWalker.GameFiles } - public MetaDataBlock GetMetaDataBlock() + public MetaDataBlock? GetMetaDataBlock() { - if (TotalSize <= 0) return null; + if (TotalSize <= 0) + return null; byte[] data = new byte[TotalSize]; int offset = 0; @@ -455,12 +433,12 @@ namespace CodeWalker.GameFiles } - public struct MetaBuilderPointer + public readonly struct MetaBuilderPointer(int blockId, int offset, int length) { - public int BlockID { get; set; } //1-based id - public int Offset { get; set; } //byte offset - public int Length { get; set; } //for temp use... - public uint Pointer + public int BlockID { get; init; } = blockId; //1-based id + public int Offset { get; init; } = offset; //byte offset + public int Length { get; init; } = length; //for temp use... + public readonly uint Pointer { get { diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs index d0de3f1..0b35a27 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; @@ -11,21 +13,46 @@ namespace CodeWalker.GameFiles public static class MetaNames { - public static ConcurrentDictionary stringCache = new ConcurrentDictionary(); - public static bool TryGetString(uint h, out string str) + public static ConcurrentDictionary? stringCache = null; + + [MethodImpl(MethodImplOptions.Synchronized)] + [MemberNotNull(nameof(stringCache))] + public static void InitializeCache() { + if (stringCache is not null) + { + return; + } + var values = Enum.GetValues(); + var names = Enum.GetNames(); + + stringCache = new ConcurrentDictionary(Environment.ProcessorCount, names.Length); + + for (int i = 0; i < values.Length; i++) + { + var str = names[i]; + + if (str?.StartsWith('@') ?? false) + { + str = str.Substring(1); + } + + stringCache.TryAdd((uint)values[i], str); + } + } + + public static bool TryGetString(uint h, [MaybeNullWhen(false)] out string str) + { + if (stringCache is null) + { + InitializeCache(); + } + if (stringCache.TryGetValue(h, out str)) { - return str != null; + return str is not null; } - if (Enum.IsDefined(typeof(MetaName), h)) - { - str = ((MetaName)h).ToString(); - if (str.StartsWith("@")) str = str.Substring(1); //mainly to handle the @null entry - stringCache.TryAdd(h, str); - return true; - } - stringCache.TryAdd(h, str); + str = null; return false; } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs index 9941ff5..3bd10ba 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs @@ -12,11 +12,22 @@ using EXP = System.ComponentModel.ExpandableObjectConverter; using CodeWalker.World; using System.Reflection; using System.Threading; +using System.Runtime.CompilerServices; +using System.Diagnostics.CodeAnalysis; +using System.Buffers.Binary; +using System.Buffers; +using Collections.Pooled; +using CommunityToolkit.HighPerformance; +using CommunityToolkit.HighPerformance.Buffers; +using CommunityToolkit.Diagnostics; +using static System.Runtime.InteropServices.JavaScript.JSType; +using CodeWalker.Core.Utils; namespace CodeWalker.GameFiles { //this is a helper class for parsing the data. + [SkipLocalsInit] public static class MetaTypes { @@ -32,7 +43,7 @@ namespace CodeWalker.GameFiles public static void EnsureMetaTypes(Meta meta) { - if (meta.EnumInfos != null) + if (meta.EnumInfos is not null) { foreach (MetaEnumInfo mei in meta.EnumInfos) { @@ -51,7 +62,7 @@ namespace CodeWalker.GameFiles } } - if (meta.StructureInfos != null) + if (meta.StructureInfos is not null) { foreach (MetaStructureInfo msi in meta.StructureInfos) { @@ -76,15 +87,17 @@ namespace CodeWalker.GameFiles { //returns true if they are the same. - if (a.Entries.Length != b.Entries.Length) + var aEntries = a.Entries; + var bEntries = b.Entries; + if (aEntries.Length != bEntries.Length) { return false; } - for (int i = 0; i < a.Entries.Length; i++) + for (int i = 0; i < aEntries.Length; i++) { - if ((a.Entries[i].EntryNameHash != b.Entries[i].EntryNameHash) || - (a.Entries[i].EntryValue != b.Entries[i].EntryValue)) + if ((aEntries[i].EntryNameHash != bEntries[i].EntryNameHash) || + (aEntries[i].EntryValue != bEntries[i].EntryValue)) { return false; } @@ -96,16 +109,19 @@ namespace CodeWalker.GameFiles { //returns true if they are the same. - if (a.Entries.Length != b.Entries.Length) + var aEntries = a.Entries; + var bEntries = b.Entries; + + if (aEntries.Length != bEntries.Length) { return false; } - for (int i = 0; i < a.Entries.Length; i++) + for (int i = 0; i < aEntries.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)) + if ((aEntries[i].EntryNameHash != bEntries[i].EntryNameHash) || + (aEntries[i].DataOffset != bEntries[i].DataOffset) || + (aEntries[i].DataType != bEntries[i].DataType)) { return false; } @@ -247,7 +263,7 @@ namespace CodeWalker.GameFiles private static void AddStructureInfoString(MetaStructureInfo si, StringBuilder sb) { var ns = GetMetaNameString(si.StructureNameHash); - sb.AppendFormat("case " + ns + ":"); + sb.AppendFormat("case " + ns + ':'); sb.AppendLine(); sb.AppendFormat("return new MetaStructureInfo({0}, {1}, {2}, {3},", ns, si.StructureKey, si.Unknown_8h, si.StructureSize); sb.AppendLine(); @@ -260,7 +276,7 @@ namespace CodeWalker.GameFiles refkey = GetMetaNameString(e.ReferenceKey); } sb.AppendFormat(" new MetaStructureEntryInfo_s({0}, {1}, MetaStructureEntryDataType.{2}, {3}, {4}, {5})", GetMetaNameString(e.EntryNameHash), e.DataOffset, e.DataType, e.Unknown_9h, e.ReferenceTypeIndex, refkey); - if (i < si.Entries.Length - 1) sb.Append(","); + if (i < si.Entries.Length - 1) sb.Append(','); sb.AppendLine(); } sb.AppendFormat(");"); @@ -269,7 +285,7 @@ namespace CodeWalker.GameFiles private static void AddEnumInfoString(MetaEnumInfo ei, StringBuilder sb) { var ns = GetMetaNameString(ei.EnumNameHash); - sb.AppendFormat("case " + ns + ":"); + sb.AppendFormat("case " + ns + ':'); sb.AppendLine(); sb.AppendFormat("return new MetaEnumInfo({0}, {1},", ns, ei.EnumKey); sb.AppendLine(); @@ -277,7 +293,7 @@ namespace CodeWalker.GameFiles { var e = ei.Entries[i]; sb.AppendFormat(" new MetaEnumEntryInfo_s({0}, {1})", GetMetaNameString(e.EntryNameHash), e.EntryValue); - if (i < ei.Entries.Length - 1) sb.Append(","); + if (i < ei.Entries.Length - 1) sb.Append(','); sb.AppendLine(); } sb.AppendFormat(");"); @@ -296,166 +312,151 @@ namespace CodeWalker.GameFiles } - public static MetaStructureInfo GetStructureInfo(MetaName name) + public static MetaStructureInfo? GetStructureInfo(MetaName name) { //to generate structinfos - switch (name) + return name switch { - case MetaName.CScenarioPointContainer: - return new MetaStructureInfo(MetaName.CScenarioPointContainer, 2489654897, 768, 48, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CExtensionDefSpawnPoint), - new MetaStructureEntryInfo_s(MetaName.LoadSavePoints, 0, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioPoint), - new MetaStructureEntryInfo_s(MetaName.MyPoints, 16, MetaStructureEntryDataType.Array, 0, 2, 0) - ); - case MetaName.CScenarioChainingGraph: - return new MetaStructureInfo(MetaName.CScenarioChainingGraph, 88255871, 768, 88, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChainingNode), - new MetaStructureEntryInfo_s(MetaName.Nodes, 0, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChainingEdge), - new MetaStructureEntryInfo_s(MetaName.Edges, 16, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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.MinCellX, 12, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.MaxCellX, 16, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.MinCellY, 20, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.MaxCellY, 24, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.CellDimX, 44, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.CellDimY, 48, MetaStructureEntryDataType.Float, 0, 0, 0) - ); - case MetaName.CScenarioPointLookUps: - return new MetaStructureInfo(MetaName.CScenarioPointLookUps, 2669361587, 768, 96, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.TypeNames, 0, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.PedModelSetNames, 16, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.VehicleModelSetNames, 32, MetaStructureEntryDataType.Array, 0, 4, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.GroupNames, 48, MetaStructureEntryDataType.Array, 0, 6, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.InteriorNames, 64, MetaStructureEntryDataType.Array, 0, 8, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioEntityOverride), - new MetaStructureEntryInfo_s(MetaName.EntityOverrides, 72, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s(MetaName.ChainingGraph, 96, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChainingGraph), - new MetaStructureEntryInfo_s(MetaName.AccelGrid, 184, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__spdGrid2D), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)3844724227, 248, MetaStructureEntryDataType.Array, 0, 6, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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.uAvailableInMpSp, 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.CScenarioPointFlags__Flags), - 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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CExtensionDefSpawnPoint), - new MetaStructureEntryInfo_s(MetaName.ScenarioPoints, 24, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s(MetaName.EntityMayNotAlwaysExist, 64, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.SpecificallyPreventArtPoints, 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.CSpawnPoint__AvailabilityMpSp), - 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.CScenarioPointFlags__Flags), - 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.HasIncomingEdges, 24, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.HasOutgoingEdges, 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.CScenarioChainingEdge__eAction), - new MetaStructureEntryInfo_s(MetaName.NavMode, 5, MetaStructureEntryDataType.ByteEnum, 0, 0, MetaName.CScenarioChainingEdge__eNavMode), - new MetaStructureEntryInfo_s(MetaName.NavSpeed, 6, MetaStructureEntryDataType.ByteEnum, 0, 0, MetaName.CScenarioChainingEdge__eNavSpeed) - ); - 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)MetaTypeName.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) - ); - case MetaName.CStreamingRequestRecord: - return new MetaStructureInfo(MetaName.CStreamingRequestRecord, 3825587854, 768, 40, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CStreamingRequestFrame), - new MetaStructureEntryInfo_s(MetaName.Frames, 0, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CStreamingRequestCommonSet), - new MetaStructureEntryInfo_s(MetaName.CommonSets, 16, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s(MetaName.NewStyle, 32, MetaStructureEntryDataType.Boolean, 0, 0, 0) - ); - case MetaName.CStreamingRequestFrame: - return new MetaStructureInfo(MetaName.CStreamingRequestFrame, 1112444512, 1024, 112, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.AddList, 0, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.RemoveList, 16, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)896120921, 32, MetaStructureEntryDataType.Array, 0, 4, 0), - new MetaStructureEntryInfo_s(MetaName.CamPos, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.CamDir, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)1762439591, 80, MetaStructureEntryDataType.Array, 0, 8, 0), - new MetaStructureEntryInfo_s(MetaName.Flags, 96, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) - ); + MetaName.CScenarioPointContainer => new MetaStructureInfo(MetaName.CScenarioPointContainer, 2489654897, 768, 48, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CExtensionDefSpawnPoint), + new MetaStructureEntryInfo_s(MetaName.LoadSavePoints, 0, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioPoint), + new MetaStructureEntryInfo_s(MetaName.MyPoints, 16, MetaStructureEntryDataType.Array, 0, 2, 0) + ), + MetaName.CScenarioChainingGraph => new MetaStructureInfo(MetaName.CScenarioChainingGraph, 88255871, 768, 88, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChainingNode), + new MetaStructureEntryInfo_s(MetaName.Nodes, 0, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChainingEdge), + new MetaStructureEntryInfo_s(MetaName.Edges, 16, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChain), + new MetaStructureEntryInfo_s(MetaName.Chains, 32, MetaStructureEntryDataType.Array, 0, 4, 0) + ), + MetaName.rage__spdGrid2D => new MetaStructureInfo(MetaName.rage__spdGrid2D, 894636096, 768, 64, + new MetaStructureEntryInfo_s(MetaName.MinCellX, 12, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.MaxCellX, 16, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.MinCellY, 20, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.MaxCellY, 24, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.CellDimX, 44, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.CellDimY, 48, MetaStructureEntryDataType.Float, 0, 0, 0) + ), + MetaName.CScenarioPointLookUps => new MetaStructureInfo(MetaName.CScenarioPointLookUps, 2669361587, 768, 96, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.TypeNames, 0, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.PedModelSetNames, 16, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.VehicleModelSetNames, 32, MetaStructureEntryDataType.Array, 0, 4, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.GroupNames, 48, MetaStructureEntryDataType.Array, 0, 6, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.InteriorNames, 64, MetaStructureEntryDataType.Array, 0, 8, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.RequiredIMapNames, 80, MetaStructureEntryDataType.Array, 0, 10, 0) + ), + MetaName.CScenarioPointRegion => 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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioEntityOverride), + new MetaStructureEntryInfo_s(MetaName.EntityOverrides, 72, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s(MetaName.ChainingGraph, 96, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CScenarioChainingGraph), + new MetaStructureEntryInfo_s(MetaName.AccelGrid, 184, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__spdGrid2D), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)3844724227, 248, MetaStructureEntryDataType.Array, 0, 6, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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) + ), + MetaName.CScenarioPoint => 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.uAvailableInMpSp, 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.CScenarioPointFlags__Flags), + new MetaStructureEntryInfo_s(MetaName.vPositionAndDirection, 48, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0) + ), + MetaName.CScenarioEntityOverride => 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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CExtensionDefSpawnPoint), + new MetaStructureEntryInfo_s(MetaName.ScenarioPoints, 24, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s(MetaName.EntityMayNotAlwaysExist, 64, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.SpecificallyPreventArtPoints, 65, MetaStructureEntryDataType.Boolean, 0, 0, 0) + ), + MetaName.CExtensionDefSpawnPoint => 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.CSpawnPoint__AvailabilityMpSp), + 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.CScenarioPointFlags__Flags), + 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) + ), + MetaName.CScenarioChainingNode => 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.HasIncomingEdges, 24, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.HasOutgoingEdges, 25, MetaStructureEntryDataType.Boolean, 0, 0, 0) + ), + MetaName.CScenarioChainingEdge => 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.CScenarioChainingEdge__eAction), + new MetaStructureEntryInfo_s(MetaName.NavMode, 5, MetaStructureEntryDataType.ByteEnum, 0, 0, MetaName.CScenarioChainingEdge__eNavMode), + new MetaStructureEntryInfo_s(MetaName.NavSpeed, 6, MetaStructureEntryDataType.ByteEnum, 0, 0, MetaName.CScenarioChainingEdge__eNavSpeed) + ), + MetaName.CScenarioChain => new MetaStructureInfo(MetaName.CScenarioChain, 2751910366, 768, 40, + new MetaStructureEntryInfo_s((MetaName)1156691834, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.EdgeIds, 8, MetaStructureEntryDataType.Array, 0, 1, 0) + ), + MetaName.rage__spdSphere => new MetaStructureInfo(MetaName.rage__spdSphere, 1189037266, 1024, 16, + new MetaStructureEntryInfo_s(MetaName.centerAndRadius, 0, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0) + ), + MetaName.CScenarioPointCluster => 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) + ), + MetaName.CStreamingRequestRecord => new MetaStructureInfo(MetaName.CStreamingRequestRecord, 3825587854, 768, 40, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CStreamingRequestFrame), + new MetaStructureEntryInfo_s(MetaName.Frames, 0, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CStreamingRequestCommonSet), + new MetaStructureEntryInfo_s(MetaName.CommonSets, 16, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s(MetaName.NewStyle, 32, MetaStructureEntryDataType.Boolean, 0, 0, 0) + ), + MetaName.CStreamingRequestFrame => new MetaStructureInfo(MetaName.CStreamingRequestFrame, 1112444512, 1024, 112, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.AddList, 0, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.RemoveList, 16, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)896120921, 32, MetaStructureEntryDataType.Array, 0, 4, 0), + new MetaStructureEntryInfo_s(MetaName.CamPos, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.CamDir, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)1762439591, 80, MetaStructureEntryDataType.Array, 0, 8, 0), + new MetaStructureEntryInfo_s(MetaName.Flags, 96, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), //case MetaName.CStreamingRequestFrame: // return new MetaStructureInfo(MetaName.CStreamingRequestFrame, 3672937465, 1024, 96, // new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), @@ -468,43 +469,40 @@ namespace CodeWalker.GameFiles // new MetaStructureEntryInfo_s((MetaName)1762439591, 64, MetaStructureEntryDataType.Array, 0, 6, 0), // new MetaStructureEntryInfo_s(MetaName.Flags, 80, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) // ); - case MetaName.CStreamingRequestCommonSet: - return new MetaStructureInfo(MetaName.CStreamingRequestCommonSet, 3710200606, 768, 16, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.Requests, 0, MetaStructureEntryDataType.Array, 0, 0, 0) - ); - case MetaName.CMapTypes: - return new MetaStructureInfo(MetaName.CMapTypes, 2608875220, 768, 80, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.extensions, 8, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.archetypes, 24, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s(MetaName.name, 40, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.dependencies, 48, MetaStructureEntryDataType.Array, 0, 5, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CCompositeEntityType), - new MetaStructureEntryInfo_s(MetaName.compositeEntityTypes, 64, MetaStructureEntryDataType.Array, 0, 7, 0) - ); - case MetaName.CBaseArchetypeDef: - return new MetaStructureInfo(MetaName.CBaseArchetypeDef, 2411387556, 1024, 144, - new MetaStructureEntryInfo_s(MetaName.lodDist, 8, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.specialAttribute, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bsCentre, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bsRadius, 80, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.hdTextureDist, 84, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.name, 88, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.textureDictionary, 92, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.clipDictionary, 96, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.drawableDictionary, 100, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.physicsDictionary, 104, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.assetType, 108, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__fwArchetypeDef__eAssetType), - new MetaStructureEntryInfo_s(MetaName.assetName, 112, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.extensions, 120, MetaStructureEntryDataType.Array, 0, 15, 0) - ); + MetaName.CStreamingRequestCommonSet => new MetaStructureInfo(MetaName.CStreamingRequestCommonSet, 3710200606, 768, 16, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.Requests, 0, MetaStructureEntryDataType.Array, 0, 0, 0) + ), + MetaName.CMapTypes => new MetaStructureInfo(MetaName.CMapTypes, 2608875220, 768, 80, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.extensions, 8, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.archetypes, 24, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s(MetaName.name, 40, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.dependencies, 48, MetaStructureEntryDataType.Array, 0, 5, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CCompositeEntityType), + new MetaStructureEntryInfo_s(MetaName.compositeEntityTypes, 64, MetaStructureEntryDataType.Array, 0, 7, 0) + ), + MetaName.CBaseArchetypeDef => new MetaStructureInfo(MetaName.CBaseArchetypeDef, 2411387556, 1024, 144, + new MetaStructureEntryInfo_s(MetaName.lodDist, 8, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.specialAttribute, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bsCentre, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bsRadius, 80, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.hdTextureDist, 84, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.name, 88, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.textureDictionary, 92, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.clipDictionary, 96, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.drawableDictionary, 100, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.physicsDictionary, 104, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.assetType, 108, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__fwArchetypeDef__eAssetType), + new MetaStructureEntryInfo_s(MetaName.assetName, 112, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.extensions, 120, MetaStructureEntryDataType.Array, 0, 15, 0) + ), //case MetaName.CBaseArchetypeDef: // return new MetaStructureInfo(MetaName.CBaseArchetypeDef, 2352343492, 1024, 128, // new MetaStructureEntryInfo_s(MetaName.lodDist, 8, MetaStructureEntryDataType.Float, 0, 0, 0), @@ -523,896 +521,822 @@ namespace CodeWalker.GameFiles // new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), // new MetaStructureEntryInfo_s(MetaName.extensions, 112, MetaStructureEntryDataType.Array, 0, 13, 0) // ); - case MetaName.CCreatureMetaData: - return new MetaStructureInfo(MetaName.CCreatureMetaData, 2181653572, 768, 56, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CShaderVariableComponent), - new MetaStructureEntryInfo_s(MetaName.shaderVariableComponents, 8, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropExpressionData), - new MetaStructureEntryInfo_s(MetaName.pedPropExpressions, 24, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedCompExpressionData), - new MetaStructureEntryInfo_s(MetaName.pedCompExpressions, 40, MetaStructureEntryDataType.Array, 0, 4, 0) - ); - case MetaName.CShaderVariableComponent: - return new MetaStructureInfo(MetaName.CShaderVariableComponent, 3085831725, 768, 72, - new MetaStructureEntryInfo_s(MetaName.pedcompID, 8, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.maskID, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.shaderVariableHashString, 16, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.tracks, 24, MetaStructureEntryDataType.Array, 0, 3, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ids, 40, MetaStructureEntryDataType.Array, 0, 5, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.components, 56, MetaStructureEntryDataType.Array, 0, 7, 0) - ); - case MetaName.CPedPropExpressionData: - return new MetaStructureInfo(MetaName.CPedPropExpressionData, 1355135810, 768, 88, - new MetaStructureEntryInfo_s(MetaName.pedPropID, 8, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.pedPropVarIndex, 12, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.pedPropExpressionIndex, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.tracks, 24, MetaStructureEntryDataType.Array, 0, 3, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ids, 40, MetaStructureEntryDataType.Array, 0, 5, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.types, 56, MetaStructureEntryDataType.Array, 0, 7, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.components, 72, MetaStructureEntryDataType.Array, 0, 9, 0) - ); - case MetaName.CPedCompExpressionData: - return new MetaStructureInfo(MetaName.CPedCompExpressionData, 3458164745, 768, 88, - new MetaStructureEntryInfo_s(MetaName.pedCompID, 8, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.pedCompVarIndex, 12, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.pedCompExpressionIndex, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.tracks, 24, MetaStructureEntryDataType.Array, 0, 3, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ids, 40, MetaStructureEntryDataType.Array, 0, 5, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.types, 56, MetaStructureEntryDataType.Array, 0, 7, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.components, 72, MetaStructureEntryDataType.Array, 0, 9, 0) - ); - 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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwPropInstanceListDef), - new MetaStructureEntryInfo_s(MetaName.PropInstanceList, 16, MetaStructureEntryDataType.Array, 0, 1, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.FloatXYZ), - new MetaStructureEntryInfo_s(MetaName.direction, 8, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.falloff, 24, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.falloffExponent, 40, MetaStructureEntryDataType.Array, 0, 4, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.timeAndStateFlags, 56, MetaStructureEntryDataType.Array, 0, 6, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.hash, 72, MetaStructureEntryDataType.Array, 0, 8, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.coneInnerAngle, 88, MetaStructureEntryDataType.Array, 0, 10, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.coneOuterAngleOrCapExt, 104, MetaStructureEntryDataType.Array, 0, 12, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.FloatXYZ), - new MetaStructureEntryInfo_s(MetaName.position, 8, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.entities, 96, MetaStructureEntryDataType.Array, 0, 8, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwContainerLodDef), - new MetaStructureEntryInfo_s(MetaName.containerLods, 112, MetaStructureEntryDataType.Array, 0, 10, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.BoxOccluder), - new MetaStructureEntryInfo_s(MetaName.boxOccluders, 128, MetaStructureEntryDataType.Array, 4, 12, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.OccludeModel), - new MetaStructureEntryInfo_s(MetaName.occludeModels, 144, MetaStructureEntryDataType.Array, 4, 14, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CTimeCycleModifier), - new MetaStructureEntryInfo_s(MetaName.timeCycleModifiers, 224, MetaStructureEntryDataType.Array, 0, 19, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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.rage__eLodType), - new MetaStructureEntryInfo_s(MetaName.numChildren, 88, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.priorityLevel, 92, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__ePriorityLevel), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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.CTimeArchetypeDef: - return new MetaStructureInfo(MetaName.CTimeArchetypeDef, 2520619910, 1024, 160, - new MetaStructureEntryInfo_s(MetaName.lodDist, 8, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.specialAttribute, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bsCentre, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bsRadius, 80, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.hdTextureDist, 84, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.name, 88, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.textureDictionary, 92, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.clipDictionary, 96, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.drawableDictionary, 100, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.physicsDictionary, 104, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.assetType, 108, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__fwArchetypeDef__eAssetType), - new MetaStructureEntryInfo_s(MetaName.assetName, 112, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.extensions, 120, MetaStructureEntryDataType.Array, 0, 15, 0), - new MetaStructureEntryInfo_s(MetaName.timeFlags, 144, MetaStructureEntryDataType.UnsignedInt, 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)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.posn, 8, MetaStructureEntryDataType.ArrayOfBytes, 0, 0, (MetaName)3), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.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)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.direction, 112, MetaStructureEntryDataType.ArrayOfBytes, 0, 34, (MetaName)3), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.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.CMloInstanceDef: - return new MetaStructureInfo(MetaName.CMloInstanceDef, 2151576752, 1024, 160, - 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.rage__eLodType), - new MetaStructureEntryInfo_s(MetaName.numChildren, 88, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.priorityLevel, 92, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__ePriorityLevel), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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), - new MetaStructureEntryInfo_s(MetaName.groupId, 128, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.floorId, 132, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.defaultEntitySets, 136, MetaStructureEntryDataType.Array, 0, 20, 0), - new MetaStructureEntryInfo_s(MetaName.numExitPortals, 152, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.MLOInstflags, 156, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) - ); - case MetaName.BoxOccluder: - return new MetaStructureInfo(MetaName.BoxOccluder, 1831736438, 256, 16, - new MetaStructureEntryInfo_s(MetaName.iCenterX, 0, MetaStructureEntryDataType.SignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.iCenterY, 2, MetaStructureEntryDataType.SignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.iCenterZ, 4, MetaStructureEntryDataType.SignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.iCosZ, 6, MetaStructureEntryDataType.SignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.iLength, 8, MetaStructureEntryDataType.SignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.iWidth, 10, MetaStructureEntryDataType.SignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.iHeight, 12, MetaStructureEntryDataType.SignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.iSinZ, 14, MetaStructureEntryDataType.SignedShort, 0, 0, 0) - ); - case MetaName.OccludeModel: - return new MetaStructureInfo(MetaName.OccludeModel, 1172796107, 1024, 64, - new MetaStructureEntryInfo_s(MetaName.bmin, 0, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bmax, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.dataSize, 32, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.verts, 40, MetaStructureEntryDataType.DataBlockPointer, 4, 3, (MetaName)2), - new MetaStructureEntryInfo_s(MetaName.numVertsInBytes, 48, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.numTris, 50, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 52, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) - ); - case MetaName.CMloArchetypeDef: - return new MetaStructureInfo(MetaName.CMloArchetypeDef, 937664754, 1024, 240, - new MetaStructureEntryInfo_s(MetaName.lodDist, 8, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.specialAttribute, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bsCentre, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bsRadius, 80, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.hdTextureDist, 84, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.name, 88, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.textureDictionary, 92, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.clipDictionary, 96, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.drawableDictionary, 100, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.physicsDictionary, 104, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.assetType, 108, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__fwArchetypeDef__eAssetType), - new MetaStructureEntryInfo_s(MetaName.assetName, 112, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.extensions, 120, MetaStructureEntryDataType.Array, 0, 15, 0), - new MetaStructureEntryInfo_s(MetaName.mloFlags, 144, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.entities, 152, MetaStructureEntryDataType.Array, 0, 18, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CMloRoomDef), - new MetaStructureEntryInfo_s(MetaName.rooms, 168, MetaStructureEntryDataType.Array, 0, 20, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CMloPortalDef), - new MetaStructureEntryInfo_s(MetaName.portals, 184, MetaStructureEntryDataType.Array, 0, 22, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CMloEntitySet), - new MetaStructureEntryInfo_s(MetaName.entitySets, 200, MetaStructureEntryDataType.Array, 0, 24, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CMloTimeCycleModifier), - new MetaStructureEntryInfo_s(MetaName.timeCycleModifiers, 216, MetaStructureEntryDataType.Array, 0, 26, 0) - ); - case MetaName.CMloRoomDef: - return new MetaStructureInfo(MetaName.CMloRoomDef, 3885428245, 1024, 112, - new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.CharPointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.blend, 64, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.timecycleName, 68, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.secondaryTimecycleName, 72, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 76, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.portalCount, 80, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.floorId, 84, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.exteriorVisibiltyDepth, 88, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.attachedObjects, 96, MetaStructureEntryDataType.Array, 0, 10, 0) - ); - case MetaName.CMloPortalDef: - return new MetaStructureInfo(MetaName.CMloPortalDef, 1110221513, 768, 64, - new MetaStructureEntryInfo_s(MetaName.roomFrom, 8, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.roomTo, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.mirrorPriority, 20, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.opacity, 24, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.audioOcclusion, 28, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.corners, 32, MetaStructureEntryDataType.Array, 0, 6, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.attachedObjects, 48, MetaStructureEntryDataType.Array, 0, 8, 0) - ); - case MetaName.CMloTimeCycleModifier: - return new MetaStructureInfo(MetaName.CMloTimeCycleModifier, 838874674, 1024, 48, - new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.sphere, 16, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.percentage, 32, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.range, 36, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.startHour, 40, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.endHour, 44, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) - ); - case MetaName.CExtensionDefParticleEffect: - return new MetaStructureInfo(MetaName.CExtensionDefParticleEffect, 466596385, 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.fxName, 48, MetaStructureEntryDataType.CharPointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fxType, 64, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.boneTag, 68, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.scale, 72, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.probability, 76, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 80, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.color, 84, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) - ); - case MetaName.CCompositeEntityType: - return new MetaStructureInfo(MetaName.CCompositeEntityType, 659539004, 1024, 304, - new MetaStructureEntryInfo_s(MetaName.Name, 0, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), - new MetaStructureEntryInfo_s(MetaName.lodDist, 64, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 68, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.specialAttribute, 72, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMin, 80, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bbMax, 96, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bsCentre, 112, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bsRadius, 128, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.StartModel, 136, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), - new MetaStructureEntryInfo_s(MetaName.EndModel, 200, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), - new MetaStructureEntryInfo_s(MetaName.StartImapFile, 264, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.EndImapFile, 268, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.PtFxAssetName, 272, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CCompEntityAnims), - new MetaStructureEntryInfo_s(MetaName.Animations, 280, MetaStructureEntryDataType.Array, 0, 13, 0) - ); - case MetaName.CCompEntityAnims: - return new MetaStructureInfo(MetaName.CCompEntityAnims, 4110496011, 768, 216, - new MetaStructureEntryInfo_s(MetaName.AnimDict, 0, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), - new MetaStructureEntryInfo_s(MetaName.AnimName, 64, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), - new MetaStructureEntryInfo_s(MetaName.AnimatedModel, 128, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), - new MetaStructureEntryInfo_s(MetaName.punchInPhase, 192, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.punchOutPhase, 196, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CCompEntityEffectsData), - new MetaStructureEntryInfo_s(MetaName.effectsData, 200, MetaStructureEntryDataType.Array, 0, 5, 0) - ); - case MetaName.CCompEntityEffectsData: - return new MetaStructureInfo(MetaName.CCompEntityEffectsData, 1724963966, 1024, 160, - new MetaStructureEntryInfo_s(MetaName.fxType, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fxOffsetPos, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fxOffsetRot, 32, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.boneTag, 48, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.startPhase, 52, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.endPhase, 56, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ptFxIsTriggered, 60, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ptFxTag, 61, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), - new MetaStructureEntryInfo_s(MetaName.ptFxScale, 128, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ptFxProbability, 132, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ptFxHasTint, 136, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ptFxTintR, 137, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ptFxTintG, 138, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ptFxTintB, 139, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.ptFxSize, 144, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0) - ); - case MetaName.CExtensionDefAudioCollisionSettings: - return new MetaStructureInfo(MetaName.CExtensionDefAudioCollisionSettings, 2701897500, 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.settings, 32, MetaStructureEntryDataType.Hash, 0, 0, 0) - ); - case MetaName.CExtensionDefAudioEmitter: - return new MetaStructureInfo(MetaName.CExtensionDefAudioEmitter, 15929839, 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.offsetRotation, 32, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.effectHash, 48, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) - ); - case MetaName.CExtensionDefExplosionEffect: - return new MetaStructureInfo(MetaName.CExtensionDefExplosionEffect, 2840366784, 1024, 80, - 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.explosionName, 48, MetaStructureEntryDataType.CharPointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.boneTag, 64, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.explosionTag, 68, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.explosionType, 72, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 76, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) - ); - case MetaName.CExtensionDefLadder: - return new MetaStructureInfo(MetaName.CExtensionDefLadder, 1978210597, 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.bottom, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.top, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.normal, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.materialType, 80, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.CExtensionDefLadderMaterialType), - new MetaStructureEntryInfo_s(MetaName.template, 84, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.canGetOffAtTop, 88, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.canGetOffAtBottom, 89, MetaStructureEntryDataType.Boolean, 0, 0, 0) - ); - case MetaName.CExtensionDefBuoyancy: - return new MetaStructureInfo(MetaName.CExtensionDefBuoyancy, 2383039928, 1024, 32, - new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.offsetPosition, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0) - ); - case MetaName.CExtensionDefExpression: - return new MetaStructureInfo(MetaName.CExtensionDefExpression, 24441706, 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.expressionDictionaryName, 32, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.expressionName, 36, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.creatureMetadataName, 40, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.initialiseOnCollision, 44, MetaStructureEntryDataType.Boolean, 0, 0, 0) - ); - case MetaName.CExtensionDefLightShaft: - return new MetaStructureInfo(MetaName.CExtensionDefLightShaft, 2526429398, 1024, 176, - 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.cornerA, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.cornerB, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.cornerC, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.cornerD, 80, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.direction, 96, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.directionAmount, 112, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.length, 116, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fadeInTimeStart, 120, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fadeInTimeEnd, 124, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fadeOutTimeStart, 128, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fadeOutTimeEnd, 132, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fadeDistanceStart, 136, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.fadeDistanceEnd, 140, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.color, 144, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.intensity, 148, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flashiness, 152, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 156, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.densityType, 160, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.CExtensionDefLightShaftDensityType), - new MetaStructureEntryInfo_s(MetaName.volumeType, 164, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.CExtensionDefLightShaftVolumeType), - new MetaStructureEntryInfo_s(MetaName.softness, 168, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.scaleBySunIntensity, 172, MetaStructureEntryDataType.Boolean, 0, 0, 0) - ); - case MetaName.FloatXYZ: - return new MetaStructureInfo(MetaName.FloatXYZ, 2751397072, 512, 12, - new MetaStructureEntryInfo_s(MetaName.x, 0, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.y, 4, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.z, 8, MetaStructureEntryDataType.Float, 0, 0, 0) - ); - case MetaName.CPedPropInfo: - return new MetaStructureInfo(MetaName.CPedPropInfo, 1792487819, 768, 40, - new MetaStructureEntryInfo_s(MetaName.numAvailProps, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropMetaData), - new MetaStructureEntryInfo_s(MetaName.aPropMetaData, 8, MetaStructureEntryDataType.Array, 0, 1, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CAnchorProps), - new MetaStructureEntryInfo_s(MetaName.aAnchors, 24, MetaStructureEntryDataType.Array, 0, 3, 0) - ); - case MetaName.CPedVariationInfo: - return new MetaStructureInfo(MetaName.CPedVariationInfo, 4030871161, 768, 112, - new MetaStructureEntryInfo_s(MetaName.bHasTexVariations, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bHasDrawblVariations, 1, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bHasLowLODs, 2, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.bIsSuperLOD, 3, MetaStructureEntryDataType.Boolean, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.availComp, 4, MetaStructureEntryDataType.ArrayOfBytes, 0, 4, (MetaName)MetaTypeName.PsoPOINTER), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPVComponentData), - new MetaStructureEntryInfo_s(MetaName.aComponentData3, 16, MetaStructureEntryDataType.Array, 0, 6, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedSelectionSet), - new MetaStructureEntryInfo_s(MetaName.aSelectionSets, 32, MetaStructureEntryDataType.Array, 0, 8, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CComponentInfo), - new MetaStructureEntryInfo_s(MetaName.compInfos, 48, MetaStructureEntryDataType.Array, 0, 10, 0), - new MetaStructureEntryInfo_s(MetaName.propInfo, 64, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropInfo), - new MetaStructureEntryInfo_s(MetaName.dlcName, 104, MetaStructureEntryDataType.Hash, 0, 0, 0) - ); - case MetaName.CPVComponentData: - return new MetaStructureInfo(MetaName.CPVComponentData, 2024084511, 768, 24, - new MetaStructureEntryInfo_s(MetaName.numAvailTex, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPVDrawblData), - new MetaStructureEntryInfo_s(MetaName.aDrawblData3, 8, MetaStructureEntryDataType.Array, 0, 1, 0) - ); - case MetaName.CPVDrawblData__CPVClothComponentData: - return new MetaStructureInfo(MetaName.CPVDrawblData__CPVClothComponentData, 508935687, 0, 24, - new MetaStructureEntryInfo_s(MetaName.ownsCloth, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0) - ); - case MetaName.CPVDrawblData: - return new MetaStructureInfo(MetaName.CPVDrawblData, 124073662, 768, 48, - new MetaStructureEntryInfo_s(MetaName.propMask, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.numAlternatives, 1, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPVTextureData), - new MetaStructureEntryInfo_s(MetaName.aTexData, 8, MetaStructureEntryDataType.Array, 0, 2, 0), - new MetaStructureEntryInfo_s(MetaName.clothData, 24, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPVDrawblData__CPVClothComponentData) - ); - case MetaName.CPVTextureData: - return new MetaStructureInfo(MetaName.CPVTextureData, 4272717794, 0, 3, - new MetaStructureEntryInfo_s(MetaName.texId, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.distribution, 1, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) - ); - case MetaName.CComponentInfo: - return new MetaStructureInfo(MetaName.CComponentInfo, 3693847250, 512, 48, - new MetaStructureEntryInfo_s((MetaName)802196719, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)4233133352, 4, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)128864925, 8, MetaStructureEntryDataType.ArrayOfBytes, 0, 2, (MetaName)5), - new MetaStructureEntryInfo_s(MetaName.flags, 28, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.inclusions, 32, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), - new MetaStructureEntryInfo_s(MetaName.exclusions, 36, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), - new MetaStructureEntryInfo_s((MetaName)1613922652, 40, MetaStructureEntryDataType.ShortFlags, 0, 16, MetaName.ePedVarComp), - new MetaStructureEntryInfo_s((MetaName)2114993291, 42, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)3509540765, 44, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)4196345791, 45, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) - ); - case MetaName.CPedPropMetaData: - return new MetaStructureInfo(MetaName.CPedPropMetaData, 2029738350, 768, 56, - new MetaStructureEntryInfo_s(MetaName.audioId, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.expressionMods, 4, MetaStructureEntryDataType.ArrayOfBytes, 0, 1, (MetaName)5), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropTexData), - new MetaStructureEntryInfo_s(MetaName.texData, 24, MetaStructureEntryDataType.Array, 0, 3, 0), - new MetaStructureEntryInfo_s(MetaName.renderFlags, 40, MetaStructureEntryDataType.IntFlags1, 0, 3, MetaName.ePropRenderFlags), - new MetaStructureEntryInfo_s(MetaName.propFlags, 44, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 48, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.anchorId, 50, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.propId, 51, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)2894625425, 52, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) - ); - case MetaName.CPedPropTexData: - return new MetaStructureInfo(MetaName.CPedPropTexData, 2767296137, 512, 12, - new MetaStructureEntryInfo_s(MetaName.inclusions, 0, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), - new MetaStructureEntryInfo_s(MetaName.exclusions, 4, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), - new MetaStructureEntryInfo_s(MetaName.texId, 8, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.inclusionId, 9, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.exclusionId, 10, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.distribution, 11, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) - ); - case MetaName.CAnchorProps: - return new MetaStructureInfo(MetaName.CAnchorProps, 403574180, 768, 24, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.props, 0, MetaStructureEntryDataType.Array, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.anchor, 16, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.eAnchorPoints) - ); - case MetaName.CPedSelectionSet: - return new MetaStructureInfo(MetaName.CPedSelectionSet, 3120284999, 512, 48, - new MetaStructureEntryInfo_s(MetaName.name, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.compDrawableId, 4, MetaStructureEntryDataType.ArrayOfBytes, 0, 1, (MetaName)MetaTypeName.PsoPOINTER), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.compTexId, 16, MetaStructureEntryDataType.ArrayOfBytes, 0, 3, (MetaName)MetaTypeName.PsoPOINTER), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.propAnchorId, 28, MetaStructureEntryDataType.ArrayOfBytes, 0, 5, (MetaName)6), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.propDrawableId, 34, MetaStructureEntryDataType.ArrayOfBytes, 0, 7, (MetaName)6), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.propTexId, 40, MetaStructureEntryDataType.ArrayOfBytes, 0, 9, (MetaName)6) - ); - 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.CMloEntitySet: - return new MetaStructureInfo(MetaName.CMloEntitySet, 4180211587, 768, 48, - new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.locations, 16, MetaStructureEntryDataType.Array, 0, 1, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.entities, 32, MetaStructureEntryDataType.Array, 0, 3, 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.CSpawnPoint__AvailabilityMpSp), - new MetaStructureEntryInfo_s(MetaName.Flags, 52, MetaStructureEntryDataType.IntFlags2, 0, 32, MetaName.CScenarioPointFlags__Flags), - new MetaStructureEntryInfo_s(MetaName.Radius, 56, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.TimeTillPedLeaves, 60, MetaStructureEntryDataType.Float, 0, 0, 0) - ); - case MetaName.CExtensionDefWindDisturbance: - return new MetaStructureInfo(MetaName.CExtensionDefWindDisturbance, 3971538917, 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.disturbanceType, 48, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.boneTag, 52, MetaStructureEntryDataType.SignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.size, 64, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.strength, 80, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 84, MetaStructureEntryDataType.SignedInt, 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.rage__spdAABB: - return new MetaStructureInfo(MetaName.rage__spdAABB, 1158138379, 1024, 32, - new MetaStructureEntryInfo_s(MetaName.min, 0, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.max, 16, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0) - ); - case MetaName.rage__fwGrassInstanceListDef: - return new MetaStructureInfo(MetaName.rage__fwGrassInstanceListDef, 941808164, 1024, 96, - new MetaStructureEntryInfo_s(MetaName.BatchAABB, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__spdAABB), - new MetaStructureEntryInfo_s(MetaName.ScaleRange, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.archetypeName, 48, MetaStructureEntryDataType.Hash, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.lodDist, 52, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.LodFadeStartDist, 56, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.LodInstFadeRange, 60, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.OrientToTerrain, 64, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwGrassInstanceListDef__InstanceData), - new MetaStructureEntryInfo_s(MetaName.InstanceList, 72, MetaStructureEntryDataType.Array, 36, 7, 0) - ); - case MetaName.rage__fwGrassInstanceListDef__InstanceData: - return new MetaStructureInfo(MetaName.rage__fwGrassInstanceListDef__InstanceData, 2740378365, 256, 16, - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.Position, 0, MetaStructureEntryDataType.ArrayOfBytes, 0, 0, (MetaName)3), - new MetaStructureEntryInfo_s(MetaName.NormalX, 6, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.NormalY, 7, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.Color, 8, MetaStructureEntryDataType.ArrayOfBytes, 0, 4, (MetaName)3), - new MetaStructureEntryInfo_s(MetaName.Scale, 11, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.Ao, 12, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.Pad, 13, MetaStructureEntryDataType.ArrayOfBytes, 0, 8, (MetaName)3) - ); - case MetaName.CExtensionDefProcObject: - return new MetaStructureInfo(MetaName.CExtensionDefProcObject, 3965391891, 1024, 80, - 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.radiusInner, 32, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.radiusOuter, 36, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.spacing, 40, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.minScale, 44, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.maxScale, 48, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.minScaleZ, 52, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.maxScaleZ, 56, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.minZOffset, 60, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.maxZOffset, 64, MetaStructureEntryDataType.Float, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.objectHash, 68, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), - new MetaStructureEntryInfo_s(MetaName.flags, 72, MetaStructureEntryDataType.UnsignedInt, 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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__phCapsuleBoundDef), - new MetaStructureEntryInfo_s(MetaName.CollisionData, 16, MetaStructureEntryDataType.Array, 0, 1, 0) - ); - case MetaName.rage__phCapsuleBoundDef: - return new MetaStructureInfo(MetaName.rage__phCapsuleBoundDef, 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.rage__phCapsuleBoundDef__enCollisionBoundDef) - ); - - default: - return null; - } + MetaName.CCreatureMetaData => new MetaStructureInfo(MetaName.CCreatureMetaData, 2181653572, 768, 56, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CShaderVariableComponent), + new MetaStructureEntryInfo_s(MetaName.shaderVariableComponents, 8, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropExpressionData), + new MetaStructureEntryInfo_s(MetaName.pedPropExpressions, 24, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedCompExpressionData), + new MetaStructureEntryInfo_s(MetaName.pedCompExpressions, 40, MetaStructureEntryDataType.Array, 0, 4, 0) + ), + MetaName.CShaderVariableComponent => new MetaStructureInfo(MetaName.CShaderVariableComponent, 3085831725, 768, 72, + new MetaStructureEntryInfo_s(MetaName.pedcompID, 8, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.maskID, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.shaderVariableHashString, 16, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.tracks, 24, MetaStructureEntryDataType.Array, 0, 3, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ids, 40, MetaStructureEntryDataType.Array, 0, 5, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.components, 56, MetaStructureEntryDataType.Array, 0, 7, 0) + ), + MetaName.CPedPropExpressionData => new MetaStructureInfo(MetaName.CPedPropExpressionData, 1355135810, 768, 88, + new MetaStructureEntryInfo_s(MetaName.pedPropID, 8, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.pedPropVarIndex, 12, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.pedPropExpressionIndex, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.tracks, 24, MetaStructureEntryDataType.Array, 0, 3, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ids, 40, MetaStructureEntryDataType.Array, 0, 5, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.types, 56, MetaStructureEntryDataType.Array, 0, 7, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.components, 72, MetaStructureEntryDataType.Array, 0, 9, 0) + ), + MetaName.CPedCompExpressionData => new MetaStructureInfo(MetaName.CPedCompExpressionData, 3458164745, 768, 88, + new MetaStructureEntryInfo_s(MetaName.pedCompID, 8, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.pedCompVarIndex, 12, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.pedCompExpressionIndex, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.tracks, 24, MetaStructureEntryDataType.Array, 0, 3, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ids, 40, MetaStructureEntryDataType.Array, 0, 5, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.types, 56, MetaStructureEntryDataType.Array, 0, 7, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.components, 72, MetaStructureEntryDataType.Array, 0, 9, 0) + ), + MetaName.rage__fwInstancedMapData => new MetaStructureInfo(MetaName.rage__fwInstancedMapData, 1836780118, 768, 48, + new MetaStructureEntryInfo_s(MetaName.ImapLink, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwPropInstanceListDef), + new MetaStructureEntryInfo_s(MetaName.PropInstanceList, 16, MetaStructureEntryDataType.Array, 0, 1, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwGrassInstanceListDef), + new MetaStructureEntryInfo_s(MetaName.GrassInstanceList, 32, MetaStructureEntryDataType.Array, 0, 3, 0) + ), + MetaName.CLODLight => new MetaStructureInfo(MetaName.CLODLight, 2325189228, 768, 136, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.FloatXYZ), + new MetaStructureEntryInfo_s(MetaName.direction, 8, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.falloff, 24, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.falloffExponent, 40, MetaStructureEntryDataType.Array, 0, 4, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.timeAndStateFlags, 56, MetaStructureEntryDataType.Array, 0, 6, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.hash, 72, MetaStructureEntryDataType.Array, 0, 8, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.coneInnerAngle, 88, MetaStructureEntryDataType.Array, 0, 10, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.coneOuterAngleOrCapExt, 104, MetaStructureEntryDataType.Array, 0, 12, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.coronaIntensity, 120, MetaStructureEntryDataType.Array, 0, 14, 0) + ), + MetaName.CDistantLODLight => new MetaStructureInfo(MetaName.CDistantLODLight, 2820908419, 768, 48, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.FloatXYZ), + new MetaStructureEntryInfo_s(MetaName.position, 8, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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) + ), + MetaName.CBlockDesc => 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) + ), + MetaName.CMapData => 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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.entities, 96, MetaStructureEntryDataType.Array, 0, 8, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwContainerLodDef), + new MetaStructureEntryInfo_s(MetaName.containerLods, 112, MetaStructureEntryDataType.Array, 0, 10, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.BoxOccluder), + new MetaStructureEntryInfo_s(MetaName.boxOccluders, 128, MetaStructureEntryDataType.Array, 4, 12, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.OccludeModel), + new MetaStructureEntryInfo_s(MetaName.occludeModels, 144, MetaStructureEntryDataType.Array, 4, 14, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CTimeCycleModifier), + new MetaStructureEntryInfo_s(MetaName.timeCycleModifiers, 224, MetaStructureEntryDataType.Array, 0, 19, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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) + ), + MetaName.CEntityDef => 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.rage__eLodType), + new MetaStructureEntryInfo_s(MetaName.numChildren, 88, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.priorityLevel, 92, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__ePriorityLevel), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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) + ), + MetaName.CTimeCycleModifier => 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) + ), + MetaName.CTimeArchetypeDef => new MetaStructureInfo(MetaName.CTimeArchetypeDef, 2520619910, 1024, 160, + new MetaStructureEntryInfo_s(MetaName.lodDist, 8, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.specialAttribute, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bsCentre, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bsRadius, 80, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.hdTextureDist, 84, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.name, 88, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.textureDictionary, 92, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.clipDictionary, 96, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.drawableDictionary, 100, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.physicsDictionary, 104, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.assetType, 108, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__fwArchetypeDef__eAssetType), + new MetaStructureEntryInfo_s(MetaName.assetName, 112, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.extensions, 120, MetaStructureEntryDataType.Array, 0, 15, 0), + new MetaStructureEntryInfo_s(MetaName.timeFlags, 144, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), + MetaName.CExtensionDefLightEffect => 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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CLightAttrDef), + new MetaStructureEntryInfo_s(MetaName.instances, 32, MetaStructureEntryDataType.Array, 0, 2, 0) + ), + MetaName.CLightAttrDef => new MetaStructureInfo(MetaName.CLightAttrDef, 2363260268, 768, 160, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.posn, 8, MetaStructureEntryDataType.ArrayOfBytes, 0, 0, (MetaName)3), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.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)MetaTypeName.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)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.direction, 112, MetaStructureEntryDataType.ArrayOfBytes, 0, 34, (MetaName)3), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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)MetaTypeName.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) + ), + MetaName.CMloInstanceDef => new MetaStructureInfo(MetaName.CMloInstanceDef, 2151576752, 1024, 160, + 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.rage__eLodType), + new MetaStructureEntryInfo_s(MetaName.numChildren, 88, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.priorityLevel, 92, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__ePriorityLevel), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.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), + new MetaStructureEntryInfo_s(MetaName.groupId, 128, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.floorId, 132, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.defaultEntitySets, 136, MetaStructureEntryDataType.Array, 0, 20, 0), + new MetaStructureEntryInfo_s(MetaName.numExitPortals, 152, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.MLOInstflags, 156, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), + MetaName.BoxOccluder => new MetaStructureInfo(MetaName.BoxOccluder, 1831736438, 256, 16, + new MetaStructureEntryInfo_s(MetaName.iCenterX, 0, MetaStructureEntryDataType.SignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.iCenterY, 2, MetaStructureEntryDataType.SignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.iCenterZ, 4, MetaStructureEntryDataType.SignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.iCosZ, 6, MetaStructureEntryDataType.SignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.iLength, 8, MetaStructureEntryDataType.SignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.iWidth, 10, MetaStructureEntryDataType.SignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.iHeight, 12, MetaStructureEntryDataType.SignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.iSinZ, 14, MetaStructureEntryDataType.SignedShort, 0, 0, 0) + ), + MetaName.OccludeModel => new MetaStructureInfo(MetaName.OccludeModel, 1172796107, 1024, 64, + new MetaStructureEntryInfo_s(MetaName.bmin, 0, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bmax, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.dataSize, 32, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.verts, 40, MetaStructureEntryDataType.DataBlockPointer, 4, 3, (MetaName)2), + new MetaStructureEntryInfo_s(MetaName.numVertsInBytes, 48, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.numTris, 50, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 52, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), + MetaName.CMloArchetypeDef => new MetaStructureInfo(MetaName.CMloArchetypeDef, 937664754, 1024, 240, + new MetaStructureEntryInfo_s(MetaName.lodDist, 8, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.specialAttribute, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bsCentre, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bsRadius, 80, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.hdTextureDist, 84, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.name, 88, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.textureDictionary, 92, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.clipDictionary, 96, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.drawableDictionary, 100, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.physicsDictionary, 104, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.assetType, 108, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.rage__fwArchetypeDef__eAssetType), + new MetaStructureEntryInfo_s(MetaName.assetName, 112, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.extensions, 120, MetaStructureEntryDataType.Array, 0, 15, 0), + new MetaStructureEntryInfo_s(MetaName.mloFlags, 144, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.entities, 152, MetaStructureEntryDataType.Array, 0, 18, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CMloRoomDef), + new MetaStructureEntryInfo_s(MetaName.rooms, 168, MetaStructureEntryDataType.Array, 0, 20, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CMloPortalDef), + new MetaStructureEntryInfo_s(MetaName.portals, 184, MetaStructureEntryDataType.Array, 0, 22, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CMloEntitySet), + new MetaStructureEntryInfo_s(MetaName.entitySets, 200, MetaStructureEntryDataType.Array, 0, 24, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CMloTimeCycleModifier), + new MetaStructureEntryInfo_s(MetaName.timeCycleModifiers, 216, MetaStructureEntryDataType.Array, 0, 26, 0) + ), + MetaName.CMloRoomDef => new MetaStructureInfo(MetaName.CMloRoomDef, 3885428245, 1024, 112, + new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.CharPointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMin, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMax, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.blend, 64, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.timecycleName, 68, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.secondaryTimecycleName, 72, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 76, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.portalCount, 80, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.floorId, 84, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.exteriorVisibiltyDepth, 88, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.attachedObjects, 96, MetaStructureEntryDataType.Array, 0, 10, 0) + ), + MetaName.CMloPortalDef => new MetaStructureInfo(MetaName.CMloPortalDef, 1110221513, 768, 64, + new MetaStructureEntryInfo_s(MetaName.roomFrom, 8, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.roomTo, 12, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 16, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.mirrorPriority, 20, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.opacity, 24, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.audioOcclusion, 28, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.corners, 32, MetaStructureEntryDataType.Array, 0, 6, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.attachedObjects, 48, MetaStructureEntryDataType.Array, 0, 8, 0) + ), + MetaName.CMloTimeCycleModifier => new MetaStructureInfo(MetaName.CMloTimeCycleModifier, 838874674, 1024, 48, + new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.sphere, 16, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.percentage, 32, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.range, 36, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.startHour, 40, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.endHour, 44, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), + MetaName.CExtensionDefParticleEffect => new MetaStructureInfo(MetaName.CExtensionDefParticleEffect, 466596385, 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.fxName, 48, MetaStructureEntryDataType.CharPointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fxType, 64, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.boneTag, 68, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.scale, 72, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.probability, 76, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 80, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.color, 84, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), + MetaName.CCompositeEntityType => new MetaStructureInfo(MetaName.CCompositeEntityType, 659539004, 1024, 304, + new MetaStructureEntryInfo_s(MetaName.Name, 0, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), + new MetaStructureEntryInfo_s(MetaName.lodDist, 64, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 68, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.specialAttribute, 72, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMin, 80, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bbMax, 96, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bsCentre, 112, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bsRadius, 128, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.StartModel, 136, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), + new MetaStructureEntryInfo_s(MetaName.EndModel, 200, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), + new MetaStructureEntryInfo_s(MetaName.StartImapFile, 264, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.EndImapFile, 268, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.PtFxAssetName, 272, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CCompEntityAnims), + new MetaStructureEntryInfo_s(MetaName.Animations, 280, MetaStructureEntryDataType.Array, 0, 13, 0) + ), + MetaName.CCompEntityAnims => new MetaStructureInfo(MetaName.CCompEntityAnims, 4110496011, 768, 216, + new MetaStructureEntryInfo_s(MetaName.AnimDict, 0, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), + new MetaStructureEntryInfo_s(MetaName.AnimName, 64, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), + new MetaStructureEntryInfo_s(MetaName.AnimatedModel, 128, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), + new MetaStructureEntryInfo_s(MetaName.punchInPhase, 192, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.punchOutPhase, 196, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CCompEntityEffectsData), + new MetaStructureEntryInfo_s(MetaName.effectsData, 200, MetaStructureEntryDataType.Array, 0, 5, 0) + ), + MetaName.CCompEntityEffectsData => new MetaStructureInfo(MetaName.CCompEntityEffectsData, 1724963966, 1024, 160, + new MetaStructureEntryInfo_s(MetaName.fxType, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fxOffsetPos, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fxOffsetRot, 32, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.boneTag, 48, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.startPhase, 52, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.endPhase, 56, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ptFxIsTriggered, 60, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ptFxTag, 61, MetaStructureEntryDataType.ArrayOfChars, 0, 0, (MetaName)64), + new MetaStructureEntryInfo_s(MetaName.ptFxScale, 128, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ptFxProbability, 132, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ptFxHasTint, 136, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ptFxTintR, 137, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ptFxTintG, 138, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ptFxTintB, 139, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.ptFxSize, 144, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0) + ), + MetaName.CExtensionDefAudioCollisionSettings => new MetaStructureInfo(MetaName.CExtensionDefAudioCollisionSettings, 2701897500, 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.settings, 32, MetaStructureEntryDataType.Hash, 0, 0, 0) + ), + MetaName.CExtensionDefAudioEmitter => new MetaStructureInfo(MetaName.CExtensionDefAudioEmitter, 15929839, 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.offsetRotation, 32, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.effectHash, 48, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), + MetaName.CExtensionDefExplosionEffect => new MetaStructureInfo(MetaName.CExtensionDefExplosionEffect, 2840366784, 1024, 80, + 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.explosionName, 48, MetaStructureEntryDataType.CharPointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.boneTag, 64, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.explosionTag, 68, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.explosionType, 72, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 76, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), + MetaName.CExtensionDefLadder => new MetaStructureInfo(MetaName.CExtensionDefLadder, 1978210597, 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.bottom, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.top, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.normal, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.materialType, 80, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.CExtensionDefLadderMaterialType), + new MetaStructureEntryInfo_s(MetaName.template, 84, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.canGetOffAtTop, 88, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.canGetOffAtBottom, 89, MetaStructureEntryDataType.Boolean, 0, 0, 0) + ), + MetaName.CExtensionDefBuoyancy => new MetaStructureInfo(MetaName.CExtensionDefBuoyancy, 2383039928, 1024, 32, + new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.offsetPosition, 16, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0) + ), + MetaName.CExtensionDefExpression => new MetaStructureInfo(MetaName.CExtensionDefExpression, 24441706, 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.expressionDictionaryName, 32, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.expressionName, 36, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.creatureMetadataName, 40, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.initialiseOnCollision, 44, MetaStructureEntryDataType.Boolean, 0, 0, 0) + ), + MetaName.CExtensionDefLightShaft => new MetaStructureInfo(MetaName.CExtensionDefLightShaft, 2526429398, 1024, 176, + 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.cornerA, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.cornerB, 48, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.cornerC, 64, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.cornerD, 80, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.direction, 96, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.directionAmount, 112, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.length, 116, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fadeInTimeStart, 120, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fadeInTimeEnd, 124, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fadeOutTimeStart, 128, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fadeOutTimeEnd, 132, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fadeDistanceStart, 136, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.fadeDistanceEnd, 140, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.color, 144, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.intensity, 148, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flashiness, 152, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 156, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.densityType, 160, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.CExtensionDefLightShaftDensityType), + new MetaStructureEntryInfo_s(MetaName.volumeType, 164, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.CExtensionDefLightShaftVolumeType), + new MetaStructureEntryInfo_s(MetaName.softness, 168, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.scaleBySunIntensity, 172, MetaStructureEntryDataType.Boolean, 0, 0, 0) + ), + MetaName.FloatXYZ => new MetaStructureInfo(MetaName.FloatXYZ, 2751397072, 512, 12, + new MetaStructureEntryInfo_s(MetaName.x, 0, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.y, 4, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.z, 8, MetaStructureEntryDataType.Float, 0, 0, 0) + ), + MetaName.CPedPropInfo => new MetaStructureInfo(MetaName.CPedPropInfo, 1792487819, 768, 40, + new MetaStructureEntryInfo_s(MetaName.numAvailProps, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropMetaData), + new MetaStructureEntryInfo_s(MetaName.aPropMetaData, 8, MetaStructureEntryDataType.Array, 0, 1, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CAnchorProps), + new MetaStructureEntryInfo_s(MetaName.aAnchors, 24, MetaStructureEntryDataType.Array, 0, 3, 0) + ), + MetaName.CPedVariationInfo => new MetaStructureInfo(MetaName.CPedVariationInfo, 4030871161, 768, 112, + new MetaStructureEntryInfo_s(MetaName.bHasTexVariations, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bHasDrawblVariations, 1, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bHasLowLODs, 2, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.bIsSuperLOD, 3, MetaStructureEntryDataType.Boolean, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.availComp, 4, MetaStructureEntryDataType.ArrayOfBytes, 0, 4, (MetaName)MetaTypeName.PsoPOINTER), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPVComponentData), + new MetaStructureEntryInfo_s(MetaName.aComponentData3, 16, MetaStructureEntryDataType.Array, 0, 6, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedSelectionSet), + new MetaStructureEntryInfo_s(MetaName.aSelectionSets, 32, MetaStructureEntryDataType.Array, 0, 8, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CComponentInfo), + new MetaStructureEntryInfo_s(MetaName.compInfos, 48, MetaStructureEntryDataType.Array, 0, 10, 0), + new MetaStructureEntryInfo_s(MetaName.propInfo, 64, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropInfo), + new MetaStructureEntryInfo_s(MetaName.dlcName, 104, MetaStructureEntryDataType.Hash, 0, 0, 0) + ), + MetaName.CPVComponentData => new MetaStructureInfo(MetaName.CPVComponentData, 2024084511, 768, 24, + new MetaStructureEntryInfo_s(MetaName.numAvailTex, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPVDrawblData), + new MetaStructureEntryInfo_s(MetaName.aDrawblData3, 8, MetaStructureEntryDataType.Array, 0, 1, 0) + ), + MetaName.CPVDrawblData__CPVClothComponentData => new MetaStructureInfo(MetaName.CPVDrawblData__CPVClothComponentData, 508935687, 0, 24, + new MetaStructureEntryInfo_s(MetaName.ownsCloth, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0) + ), + MetaName.CPVDrawblData => new MetaStructureInfo(MetaName.CPVDrawblData, 124073662, 768, 48, + new MetaStructureEntryInfo_s(MetaName.propMask, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.numAlternatives, 1, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPVTextureData), + new MetaStructureEntryInfo_s(MetaName.aTexData, 8, MetaStructureEntryDataType.Array, 0, 2, 0), + new MetaStructureEntryInfo_s(MetaName.clothData, 24, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPVDrawblData__CPVClothComponentData) + ), + MetaName.CPVTextureData => new MetaStructureInfo(MetaName.CPVTextureData, 4272717794, 0, 3, + new MetaStructureEntryInfo_s(MetaName.texId, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.distribution, 1, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) + ), + MetaName.CComponentInfo => new MetaStructureInfo(MetaName.CComponentInfo, 3693847250, 512, 48, + new MetaStructureEntryInfo_s((MetaName)802196719, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)4233133352, 4, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)128864925, 8, MetaStructureEntryDataType.ArrayOfBytes, 0, 2, (MetaName)5), + new MetaStructureEntryInfo_s(MetaName.flags, 28, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.inclusions, 32, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), + new MetaStructureEntryInfo_s(MetaName.exclusions, 36, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), + new MetaStructureEntryInfo_s((MetaName)1613922652, 40, MetaStructureEntryDataType.ShortFlags, 0, 16, MetaName.ePedVarComp), + new MetaStructureEntryInfo_s((MetaName)2114993291, 42, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)3509540765, 44, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)4196345791, 45, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) + ), + MetaName.CPedPropMetaData => new MetaStructureInfo(MetaName.CPedPropMetaData, 2029738350, 768, 56, + new MetaStructureEntryInfo_s(MetaName.audioId, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.expressionMods, 4, MetaStructureEntryDataType.ArrayOfBytes, 0, 1, (MetaName)5), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropTexData), + new MetaStructureEntryInfo_s(MetaName.texData, 24, MetaStructureEntryDataType.Array, 0, 3, 0), + new MetaStructureEntryInfo_s(MetaName.renderFlags, 40, MetaStructureEntryDataType.IntFlags1, 0, 3, MetaName.ePropRenderFlags), + new MetaStructureEntryInfo_s(MetaName.propFlags, 44, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 48, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.anchorId, 50, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.propId, 51, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)2894625425, 52, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) + ), + MetaName.CPedPropTexData => new MetaStructureInfo(MetaName.CPedPropTexData, 2767296137, 512, 12, + new MetaStructureEntryInfo_s(MetaName.inclusions, 0, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), + new MetaStructureEntryInfo_s(MetaName.exclusions, 4, MetaStructureEntryDataType.IntFlags2, 0, 32, 0), + new MetaStructureEntryInfo_s(MetaName.texId, 8, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.inclusionId, 9, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.exclusionId, 10, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.distribution, 11, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0) + ), + MetaName.CAnchorProps => new MetaStructureInfo(MetaName.CAnchorProps, 403574180, 768, 24, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.props, 0, MetaStructureEntryDataType.Array, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.anchor, 16, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.eAnchorPoints) + ), + MetaName.CPedSelectionSet => new MetaStructureInfo(MetaName.CPedSelectionSet, 3120284999, 512, 48, + new MetaStructureEntryInfo_s(MetaName.name, 0, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.compDrawableId, 4, MetaStructureEntryDataType.ArrayOfBytes, 0, 1, (MetaName)MetaTypeName.PsoPOINTER), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.compTexId, 16, MetaStructureEntryDataType.ArrayOfBytes, 0, 3, (MetaName)MetaTypeName.PsoPOINTER), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.propAnchorId, 28, MetaStructureEntryDataType.ArrayOfBytes, 0, 5, (MetaName)6), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.propDrawableId, 34, MetaStructureEntryDataType.ArrayOfBytes, 0, 7, (MetaName)6), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.propTexId, 40, MetaStructureEntryDataType.ArrayOfBytes, 0, 9, (MetaName)6) + ), + MetaName.CExtensionDefDoor => 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) + ), + MetaName.CMloEntitySet => new MetaStructureInfo(MetaName.CMloEntitySet, 4180211587, 768, 48, + new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.locations, 16, MetaStructureEntryDataType.Array, 0, 1, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.StructurePointer, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.entities, 32, MetaStructureEntryDataType.Array, 0, 3, 0) + ), + MetaName.CExtensionDefSpawnPointOverride => 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.CSpawnPoint__AvailabilityMpSp), + new MetaStructureEntryInfo_s(MetaName.Flags, 52, MetaStructureEntryDataType.IntFlags2, 0, 32, MetaName.CScenarioPointFlags__Flags), + new MetaStructureEntryInfo_s(MetaName.Radius, 56, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.TimeTillPedLeaves, 60, MetaStructureEntryDataType.Float, 0, 0, 0) + ), + MetaName.CExtensionDefWindDisturbance => new MetaStructureInfo(MetaName.CExtensionDefWindDisturbance, 3971538917, 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.disturbanceType, 48, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.boneTag, 52, MetaStructureEntryDataType.SignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.size, 64, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.strength, 80, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 84, MetaStructureEntryDataType.SignedInt, 0, 0, 0) + ), + MetaName.CCarGen => 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) + ), + MetaName.rage__spdAABB => new MetaStructureInfo(MetaName.rage__spdAABB, 1158138379, 1024, 32, + new MetaStructureEntryInfo_s(MetaName.min, 0, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.max, 16, MetaStructureEntryDataType.Float_XYZW, 0, 0, 0) + ), + MetaName.rage__fwGrassInstanceListDef => new MetaStructureInfo(MetaName.rage__fwGrassInstanceListDef, 941808164, 1024, 96, + new MetaStructureEntryInfo_s(MetaName.BatchAABB, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__spdAABB), + new MetaStructureEntryInfo_s(MetaName.ScaleRange, 32, MetaStructureEntryDataType.Float_XYZ, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.archetypeName, 48, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.lodDist, 52, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.LodFadeStartDist, 56, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.LodInstFadeRange, 60, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.OrientToTerrain, 64, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__fwGrassInstanceListDef__InstanceData), + new MetaStructureEntryInfo_s(MetaName.InstanceList, 72, MetaStructureEntryDataType.Array, 36, 7, 0) + ), + MetaName.rage__fwGrassInstanceListDef__InstanceData => new MetaStructureInfo(MetaName.rage__fwGrassInstanceListDef__InstanceData, 2740378365, 256, 16, + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedShort, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.Position, 0, MetaStructureEntryDataType.ArrayOfBytes, 0, 0, (MetaName)3), + new MetaStructureEntryInfo_s(MetaName.NormalX, 6, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.NormalY, 7, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.Color, 8, MetaStructureEntryDataType.ArrayOfBytes, 0, 4, (MetaName)3), + new MetaStructureEntryInfo_s(MetaName.Scale, 11, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.Ao, 12, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.Pad, 13, MetaStructureEntryDataType.ArrayOfBytes, 0, 8, (MetaName)3) + ), + MetaName.CExtensionDefProcObject => new MetaStructureInfo(MetaName.CExtensionDefProcObject, 3965391891, 1024, 80, + 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.radiusInner, 32, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.radiusOuter, 36, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.spacing, 40, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.minScale, 44, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.maxScale, 48, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.minScaleZ, 52, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.maxScaleZ, 56, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.minZOffset, 60, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.maxZOffset, 64, MetaStructureEntryDataType.Float, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.objectHash, 68, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0), + new MetaStructureEntryInfo_s(MetaName.flags, 72, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0) + ), + MetaName.rage__phVerletClothCustomBounds => new MetaStructureInfo(MetaName.rage__phVerletClothCustomBounds, 2075461750, 768, 32, + new MetaStructureEntryInfo_s(MetaName.name, 8, MetaStructureEntryDataType.Hash, 0, 0, 0), + new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.rage__phCapsuleBoundDef), + new MetaStructureEntryInfo_s(MetaName.CollisionData, 16, MetaStructureEntryDataType.Array, 0, 1, 0) + ), + MetaName.rage__phCapsuleBoundDef => new MetaStructureInfo(MetaName.rage__phCapsuleBoundDef, 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.rage__phCapsuleBoundDef__enCollisionBoundDef) + ), + _ => null, + }; } - public static MetaEnumInfo GetEnumInfo(MetaName name) + public static MetaEnumInfo? GetEnumInfo(MetaName name) { //to generate enuminfos - switch (name) + return name switch { - case MetaName.CScenarioPointFlags__Flags: - return new MetaEnumInfo(MetaName.CScenarioPointFlags__Flags, 2814596095, - new MetaEnumEntryInfo_s(MetaName.IgnoreMaxInRange, 0), - new MetaEnumEntryInfo_s(MetaName.NoSpawn, 1), - new MetaEnumEntryInfo_s(MetaName.StationaryReactions, 2), - new MetaEnumEntryInfo_s(MetaName.OnlySpawnInSameInterior, 3), - new MetaEnumEntryInfo_s(MetaName.SpawnedPedIsArrestable, 4), - new MetaEnumEntryInfo_s(MetaName.ActivateVehicleSiren, 5), - new MetaEnumEntryInfo_s(MetaName.AggressiveVehicleDriving, 6), - new MetaEnumEntryInfo_s(MetaName.LandVehicleOnArrival, 7), - new MetaEnumEntryInfo_s(MetaName.IgnoreThreatsIfLosNotClear, 8), - new MetaEnumEntryInfo_s(MetaName.EventsInRadiusTriggerDisputes, 9), - new MetaEnumEntryInfo_s(MetaName.AerialVehiclePoint, 10), - new MetaEnumEntryInfo_s(MetaName.TerritorialScenario, 11), - new MetaEnumEntryInfo_s(MetaName.EndScenarioIfPlayerWithinRadius, 12), - new MetaEnumEntryInfo_s(MetaName.EventsInRadiusTriggerThreatResponse, 13), - new MetaEnumEntryInfo_s(MetaName.TaxiPlaneOnGround, 14), - new MetaEnumEntryInfo_s(MetaName.FlyOffToOblivion, 15), - new MetaEnumEntryInfo_s(MetaName.InWater, 16), - new MetaEnumEntryInfo_s(MetaName.AllowInvestigation, 17), - new MetaEnumEntryInfo_s(MetaName.OpenDoor, 18), - new MetaEnumEntryInfo_s(MetaName.PreciseUseTime, 19), - new MetaEnumEntryInfo_s(MetaName.NoRespawnUntilStreamedOut, 20), - new MetaEnumEntryInfo_s(MetaName.NoVehicleSpawnMaxDistance, 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.UseSearchlight, 26), - new MetaEnumEntryInfo_s(MetaName.ResetNoCollisionOnCleanUp, 27), - new MetaEnumEntryInfo_s(MetaName.CheckCrossedArrivalPlane, 28), - new MetaEnumEntryInfo_s(MetaName.UseVehicleFrontForArrival, 29), - new MetaEnumEntryInfo_s(MetaName.IgnoreWeatherRestrictions, 30) - ); - case MetaName.CSpawnPoint__AvailabilityMpSp: - return new MetaEnumInfo(MetaName.CSpawnPoint__AvailabilityMpSp, 671739257, - new MetaEnumEntryInfo_s(MetaName.kBoth, 0), - new MetaEnumEntryInfo_s(MetaName.kOnlySp, 1), - new MetaEnumEntryInfo_s(MetaName.kOnlyMp, 2) - ); - case MetaName.CScenarioChainingEdge__eAction: - return new MetaEnumInfo(MetaName.CScenarioChainingEdge__eAction, 3326075799, - new MetaEnumEntryInfo_s(MetaName.Move, 0), - new MetaEnumEntryInfo_s((MetaName)7865678, 1), - new MetaEnumEntryInfo_s(MetaName.MoveFollowMaster, 2) - ); - case MetaName.CScenarioChainingEdge__eNavMode: - return new MetaEnumInfo(MetaName.CScenarioChainingEdge__eNavMode, 3016128742, - new MetaEnumEntryInfo_s(MetaName.Direct, 0), - new MetaEnumEntryInfo_s(MetaName.NavMesh, 1), - new MetaEnumEntryInfo_s(MetaName.Roads, 2) - ); - case MetaName.CScenarioChainingEdge__eNavSpeed: - return new MetaEnumInfo(MetaName.CScenarioChainingEdge__eNavSpeed, 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) - ); - case MetaName.rage__fwArchetypeDef__eAssetType: - return new MetaEnumInfo(MetaName.rage__fwArchetypeDef__eAssetType, 1866031916, - new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_UNINITIALIZED, 0), - new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_FRAGMENT, 1), - new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_DRAWABLE, 2), - new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_DRAWABLEDICTIONARY, 3), - new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_ASSETLESS, 4) - ); - case MetaName.rage__eLodType: - return new MetaEnumInfo(MetaName.rage__eLodType, 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.rage__ePriorityLevel: - return new MetaEnumInfo(MetaName.rage__ePriorityLevel, 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.CExtensionDefLadderMaterialType: - return new MetaEnumInfo(MetaName.CExtensionDefLadderMaterialType, 3514570158, - new MetaEnumEntryInfo_s(MetaName.METAL_SOLID_LADDER, 0), - new MetaEnumEntryInfo_s(MetaName.METAL_LIGHT_LADDER, 1), - new MetaEnumEntryInfo_s(MetaName.WOODEN_LADDER, 2) - ); - case MetaName.CExtensionDefLightShaftDensityType: - return new MetaEnumInfo(MetaName.CExtensionDefLightShaftDensityType, 3539601182, - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_CONSTANT, 0), - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_SOFT, 1), - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_SOFT_SHADOW, 2), - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_SOFT_SHADOW_HD, 3), - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_LINEAR, 4), - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_LINEAR_GRADIENT, 5), - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_QUADRATIC, 6), - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_QUADRATIC_GRADIENT, 7) - ); - case MetaName.CExtensionDefLightShaftVolumeType: - return new MetaEnumInfo(MetaName.CExtensionDefLightShaftVolumeType, 4287472345, - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_VOLUMETYPE_SHAFT, 0), - new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_VOLUMETYPE_CYLINDER, 1) - ); - case MetaName.ePedVarComp: - return new MetaEnumInfo(MetaName.ePedVarComp, 3472084374, - new MetaEnumEntryInfo_s(MetaName.PV_COMP_INVALID, -1), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_HEAD, 0), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_BERD, 1), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_HAIR, 2), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_UPPR, 3), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_LOWR, 4), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_HAND, 5), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_FEET, 6), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_TEEF, 7), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_ACCS, 8), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_TASK, 9), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_DECL, 10), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_JBIB, 11), - new MetaEnumEntryInfo_s(MetaName.PV_COMP_MAX, 12) - ); - case MetaName.ePropRenderFlags: - return new MetaEnumInfo(MetaName.ePropRenderFlags, 1551913633, - new MetaEnumEntryInfo_s(MetaName.PRF_ALPHA, 0), - new MetaEnumEntryInfo_s(MetaName.PRF_DECAL, 1), - new MetaEnumEntryInfo_s(MetaName.PRF_CUTOUT, 2) - ); - case MetaName.eAnchorPoints: - return new MetaEnumInfo(MetaName.eAnchorPoints, 1309372691, - new MetaEnumEntryInfo_s(MetaName.ANCHOR_HEAD, 0), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_EYES, 1), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_EARS, 2), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_MOUTH, 3), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_LEFT_HAND, 4), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_RIGHT_HAND, 5), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_LEFT_WRIST, 6), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_RIGHT_WRIST, 7), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_HIP, 8), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_LEFT_FOOT, 9), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_RIGHT_FOOT, 10), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_PH_L_HAND, 11), - new MetaEnumEntryInfo_s(MetaName.ANCHOR_PH_R_HAND, 12), - new MetaEnumEntryInfo_s(MetaName.NUM_ANCHORS, 13) - ); - case MetaName.rage__phCapsuleBoundDef__enCollisionBoundDef: - return new MetaEnumInfo(MetaName.rage__phCapsuleBoundDef__enCollisionBoundDef, 1585854303, - new MetaEnumEntryInfo_s(MetaName.BOUND_DEF_IS_PLANE, 0) - ); - - default: - return null; - } + MetaName.CScenarioPointFlags__Flags => new MetaEnumInfo(MetaName.CScenarioPointFlags__Flags, 2814596095, + new MetaEnumEntryInfo_s(MetaName.IgnoreMaxInRange, 0), + new MetaEnumEntryInfo_s(MetaName.NoSpawn, 1), + new MetaEnumEntryInfo_s(MetaName.StationaryReactions, 2), + new MetaEnumEntryInfo_s(MetaName.OnlySpawnInSameInterior, 3), + new MetaEnumEntryInfo_s(MetaName.SpawnedPedIsArrestable, 4), + new MetaEnumEntryInfo_s(MetaName.ActivateVehicleSiren, 5), + new MetaEnumEntryInfo_s(MetaName.AggressiveVehicleDriving, 6), + new MetaEnumEntryInfo_s(MetaName.LandVehicleOnArrival, 7), + new MetaEnumEntryInfo_s(MetaName.IgnoreThreatsIfLosNotClear, 8), + new MetaEnumEntryInfo_s(MetaName.EventsInRadiusTriggerDisputes, 9), + new MetaEnumEntryInfo_s(MetaName.AerialVehiclePoint, 10), + new MetaEnumEntryInfo_s(MetaName.TerritorialScenario, 11), + new MetaEnumEntryInfo_s(MetaName.EndScenarioIfPlayerWithinRadius, 12), + new MetaEnumEntryInfo_s(MetaName.EventsInRadiusTriggerThreatResponse, 13), + new MetaEnumEntryInfo_s(MetaName.TaxiPlaneOnGround, 14), + new MetaEnumEntryInfo_s(MetaName.FlyOffToOblivion, 15), + new MetaEnumEntryInfo_s(MetaName.InWater, 16), + new MetaEnumEntryInfo_s(MetaName.AllowInvestigation, 17), + new MetaEnumEntryInfo_s(MetaName.OpenDoor, 18), + new MetaEnumEntryInfo_s(MetaName.PreciseUseTime, 19), + new MetaEnumEntryInfo_s(MetaName.NoRespawnUntilStreamedOut, 20), + new MetaEnumEntryInfo_s(MetaName.NoVehicleSpawnMaxDistance, 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.UseSearchlight, 26), + new MetaEnumEntryInfo_s(MetaName.ResetNoCollisionOnCleanUp, 27), + new MetaEnumEntryInfo_s(MetaName.CheckCrossedArrivalPlane, 28), + new MetaEnumEntryInfo_s(MetaName.UseVehicleFrontForArrival, 29), + new MetaEnumEntryInfo_s(MetaName.IgnoreWeatherRestrictions, 30) + ), + MetaName.CSpawnPoint__AvailabilityMpSp => new MetaEnumInfo(MetaName.CSpawnPoint__AvailabilityMpSp, 671739257, + new MetaEnumEntryInfo_s(MetaName.kBoth, 0), + new MetaEnumEntryInfo_s(MetaName.kOnlySp, 1), + new MetaEnumEntryInfo_s(MetaName.kOnlyMp, 2) + ), + MetaName.CScenarioChainingEdge__eAction => new MetaEnumInfo(MetaName.CScenarioChainingEdge__eAction, 3326075799, + new MetaEnumEntryInfo_s(MetaName.Move, 0), + new MetaEnumEntryInfo_s((MetaName)7865678, 1), + new MetaEnumEntryInfo_s(MetaName.MoveFollowMaster, 2) + ), + MetaName.CScenarioChainingEdge__eNavMode => new MetaEnumInfo(MetaName.CScenarioChainingEdge__eNavMode, 3016128742, + new MetaEnumEntryInfo_s(MetaName.Direct, 0), + new MetaEnumEntryInfo_s(MetaName.NavMesh, 1), + new MetaEnumEntryInfo_s(MetaName.Roads, 2) + ), + MetaName.CScenarioChainingEdge__eNavSpeed => new MetaEnumInfo(MetaName.CScenarioChainingEdge__eNavSpeed, 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) + ), + MetaName.rage__fwArchetypeDef__eAssetType => new MetaEnumInfo(MetaName.rage__fwArchetypeDef__eAssetType, 1866031916, + new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_UNINITIALIZED, 0), + new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_FRAGMENT, 1), + new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_DRAWABLE, 2), + new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_DRAWABLEDICTIONARY, 3), + new MetaEnumEntryInfo_s(MetaName.ASSET_TYPE_ASSETLESS, 4) + ), + MetaName.rage__eLodType => new MetaEnumInfo(MetaName.rage__eLodType, 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) + ), + MetaName.rage__ePriorityLevel => new MetaEnumInfo(MetaName.rage__ePriorityLevel, 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) + ), + MetaName.CExtensionDefLadderMaterialType => new MetaEnumInfo(MetaName.CExtensionDefLadderMaterialType, 3514570158, + new MetaEnumEntryInfo_s(MetaName.METAL_SOLID_LADDER, 0), + new MetaEnumEntryInfo_s(MetaName.METAL_LIGHT_LADDER, 1), + new MetaEnumEntryInfo_s(MetaName.WOODEN_LADDER, 2) + ), + MetaName.CExtensionDefLightShaftDensityType => new MetaEnumInfo(MetaName.CExtensionDefLightShaftDensityType, 3539601182, + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_CONSTANT, 0), + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_SOFT, 1), + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_SOFT_SHADOW, 2), + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_SOFT_SHADOW_HD, 3), + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_LINEAR, 4), + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_LINEAR_GRADIENT, 5), + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_QUADRATIC, 6), + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_DENSITYTYPE_QUADRATIC_GRADIENT, 7) + ), + MetaName.CExtensionDefLightShaftVolumeType => new MetaEnumInfo(MetaName.CExtensionDefLightShaftVolumeType, 4287472345, + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_VOLUMETYPE_SHAFT, 0), + new MetaEnumEntryInfo_s(MetaName.LIGHTSHAFT_VOLUMETYPE_CYLINDER, 1) + ), + MetaName.ePedVarComp => new MetaEnumInfo(MetaName.ePedVarComp, 3472084374, + new MetaEnumEntryInfo_s(MetaName.PV_COMP_INVALID, -1), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_HEAD, 0), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_BERD, 1), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_HAIR, 2), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_UPPR, 3), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_LOWR, 4), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_HAND, 5), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_FEET, 6), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_TEEF, 7), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_ACCS, 8), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_TASK, 9), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_DECL, 10), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_JBIB, 11), + new MetaEnumEntryInfo_s(MetaName.PV_COMP_MAX, 12) + ), + MetaName.ePropRenderFlags => new MetaEnumInfo(MetaName.ePropRenderFlags, 1551913633, + new MetaEnumEntryInfo_s(MetaName.PRF_ALPHA, 0), + new MetaEnumEntryInfo_s(MetaName.PRF_DECAL, 1), + new MetaEnumEntryInfo_s(MetaName.PRF_CUTOUT, 2) + ), + MetaName.eAnchorPoints => new MetaEnumInfo(MetaName.eAnchorPoints, 1309372691, + new MetaEnumEntryInfo_s(MetaName.ANCHOR_HEAD, 0), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_EYES, 1), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_EARS, 2), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_MOUTH, 3), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_LEFT_HAND, 4), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_RIGHT_HAND, 5), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_LEFT_WRIST, 6), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_RIGHT_WRIST, 7), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_HIP, 8), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_LEFT_FOOT, 9), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_RIGHT_FOOT, 10), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_PH_L_HAND, 11), + new MetaEnumEntryInfo_s(MetaName.ANCHOR_PH_R_HAND, 12), + new MetaEnumEntryInfo_s(MetaName.NUM_ANCHORS, 13) + ), + MetaName.rage__phCapsuleBoundDef__enCollisionBoundDef => new MetaEnumInfo(MetaName.rage__phCapsuleBoundDef__enCollisionBoundDef, 1585854303, + new MetaEnumEntryInfo_s(MetaName.BOUND_DEF_IS_PLANE, 0) + ), + _ => null, + }; } @@ -1423,11 +1347,11 @@ namespace CodeWalker.GameFiles string name = namehash.ToString(); if (string.IsNullOrEmpty(name)) { - name = "Unk_" + key; + name = $"Unk_{key}"; } if (!char.IsLetter(name[0])) { - name = "Unk_" + name; + name = $"Unk_{name}"; } return name; } @@ -1436,12 +1360,12 @@ namespace CodeWalker.GameFiles - public static byte[] ConvertToBytes(T item) where T : struct + public static byte[] ConvertToBytes(in T item) where T : struct { int size = Marshal.SizeOf(typeof(T)); //int offset = 0; byte[] arr = new byte[size]; - MemoryMarshal.TryWrite(arr.AsSpan(), ref item); + MemoryMarshal.TryWrite(arr.AsSpan(), in item); return arr; //IntPtr ptr = Marshal.AllocHGlobal(size); //Marshal.StructureToPtr(item, ptr, true); @@ -1450,35 +1374,46 @@ namespace CodeWalker.GameFiles //offset += size; //return arr; } - public static byte[] ConvertArrayToBytes(params T[] items) where T : struct + + [return: NotNullIfNotNull(nameof(items))] + public static byte[]? ConvertArrayToBytes(params T[]? items) where T : struct { - if (items == null) return null; + if (items is null) + return null; return MemoryMarshal.AsBytes(items.AsSpan()).ToArray(); } public static Span ConvertArrayToBytes(Span items) where T : struct { - if (items == null) return null; - return MemoryMarshal.AsBytes(items); } - public static T ConvertData(byte[] data) where T : struct + //public static T ConvertData(byte[] data) where T : struct + //{ + // MemoryMarshal.TryRead(data.AsSpan(), out T value); + + // return value; + // //GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); + // //var h = handle.AddrOfPinnedObject(); + // //var r = Marshal.PtrToStructure(h); + // //handle.Free(); + // //return r; + //} + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T ConvertData(Span data) where T : struct { - MemoryMarshal.TryRead(data.AsSpan(), out T value); + TryConvertData(data, out T value); return value; - //GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); - //var h = handle.AddrOfPinnedObject(); - //var r = Marshal.PtrToStructure(h); - //handle.Free(); - //return r; } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T ConvertData(byte[] data, int offset) where T : struct { - MemoryMarshal.TryRead(data.AsSpan(offset), out T value); + TryConvertData(data.AsSpan(offset), out T value); return value; //GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); @@ -1487,6 +1422,23 @@ namespace CodeWalker.GameFiles //handle.Free(); //return r; } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool TryConvertData(Span data, out T value) where T : struct + { + return MemoryMarshal.TryRead(data, out value); + } + + public static bool TryConvertData(byte[] data, int offset, out T value) where T : struct + { + return TryConvertData(data.AsSpan(offset), out value); + } + + public static Span ConvertDataArray(Span data, int count) where T : struct + { + return MemoryMarshal.Cast(data.Slice(0, count * Marshal.SizeOf(typeof(T)))); + } + public static Span ConvertDataArray(byte[] data, int offset, int count) where T : struct { //T[] items = new T[count]; @@ -1517,64 +1469,136 @@ namespace CodeWalker.GameFiles //return items; } - public static T[] ConvertDataArray(Meta meta, MetaName name, Array_StructurePointer array) where T : struct + + public static T[]? ConvertDataArray(Meta meta, MetaName name, in Array_StructurePointer array, T[]? buffer = null) 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]; - - //MetaName blocktype = 0; - for (int i = 0; i < count; i++) - { - var ptr = ptrs[i]; - var offset = ptr.Offset; - var block = meta.GetBlock(ptr.BlockID); - if (block == null) - { - continue; - } - - //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, ulong pointer, uint count) where T : struct - { + var count = (int)array.Count1; if (count == 0) return null; - T[] items = new T[count]; + var ptrsArr = ArrayPool.Shared.Rent(count); + try + { + Span ptrs = GetPointerArray(meta, in array, ptrsArr).AsSpan(0, count); + if (ptrs.IsEmpty) + return null; + if (ptrs.Length < count) + { + return null; + } + + T[] items = buffer ?? new T[count]; + + //MetaName blocktype = 0; + for (int i = 0; i < count; i++) + { + var ptr = ptrs[i]; + var offset = ptr.Offset; + var block = meta.GetBlock(ptr.BlockID); + if (block is null) + { + continue; + } + + if (block.StructureNameHash != name) + { + return null; + } //type mismatch - don't return anything... + if (offset < 0 || block.Data is null || offset >= block.Data.Length) + { + continue; + } + TryConvertData(block.Data.AsSpan(offset), out items[i]); + } + + return items; + } + finally + { + ArrayPool.Shared.Return(ptrsArr); + } + } + + public delegate void DataArrayAction(Span span, ref TArg arg); + + public static void ConvertDataArrayAction(Meta meta, MetaName name, in Array_Structure array, ref TState state, DataArrayAction action) where T : struct + { + ConvertDataArrayAction(meta, name, array.Pointer, array.Count1, ref state, action); + } + + public static T[]? ConvertDataArray(Meta meta, MetaName name, in Array_Structure array, T[]? buffer = null) where T : struct + { + return ConvertDataArray(meta, name, array.Pointer, array.Count1, buffer); + } + + public static void ConvertDataArrayAction(Meta meta, MetaName name, ulong pointer, uint count, ref TState state, DataArrayAction action) where T : struct + { + if (count == 0) + return; + int itemsize = Marshal.SizeOf(typeof(T)); int itemsleft = (int)count; //large arrays get split into chunks... uint ptrindex = (uint)(pointer & 0xFFF) - 1; uint ptroffset = (uint)((pointer >> 12) & 0xFFFFF); var ptrblock = (ptrindex < meta.DataBlocks.Count) ? meta.DataBlocks[(int)ptrindex] : null; - if ((ptrblock == null) || (ptrblock.Data == null) || (ptrblock.StructureNameHash != name)) + if (ptrblock?.Data is null || ptrblock.StructureNameHash != name) + { + return; + } //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.. + + action(ConvertDataArray(ptrblock.Data, itemoffset * Marshal.SizeOf(typeof(T)), itemcount), ref state); + //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; + }//all done! + ptrindex++; + ptrblock = (ptrindex < meta.DataBlocks.Count) ? meta.DataBlocks[(int)ptrindex] : null; + if (ptrblock?.Data is null || ptrblock.StructureNameHash != name) + { + break; + } //not enough items..? + } + + return; + } + + public static T[]? ConvertDataArray(Meta meta, MetaName name, ulong pointer, uint count, T[]? buffer = null) where T : struct + { + if (count == 0) + return null; + + T[] items = buffer ?? GC.AllocateUninitializedArray((int)count); + int itemsize = Marshal.SizeOf(typeof(T)); + int itemsleft = (int)count; //large arrays get split into chunks... + + uint ptrindex = (uint)(pointer & 0xFFF) - 1; + uint ptroffset = (uint)((pointer >> 12) & 0xFFFFF); + var ptrblock = (ptrindex < meta.DataBlocks.Count) ? meta.DataBlocks[(int)ptrindex] : null; + if (ptrblock?.Data is null || ptrblock.StructureNameHash != name) { return null; } //no block or wrong block? shouldn't happen! @@ -1608,14 +1632,10 @@ namespace CodeWalker.GameFiles }//all done! ptrindex++; ptrblock = (ptrindex < meta.DataBlocks.Count) ? meta.DataBlocks[(int)ptrindex] : null; - if ((ptrblock == null) || (ptrblock.Data == null)) + if (ptrblock?.Data is null || ptrblock.StructureNameHash != name) { break; } //not enough items..? - if (ptrblock.StructureNameHash != name) - { - break; - } //type mismatch.. } return null; @@ -1707,91 +1727,111 @@ namespace CodeWalker.GameFiles #endregion } - public static MetaPOINTER[] GetPointerArray(Meta meta, Array_StructurePointer array) + public static MetaPOINTER[] GetPointerArray(this Meta meta, in Array_StructurePointer array, MetaPOINTER[]? buffer = null) { uint count = array.Count1; - if (count == 0) return null; + if (count == 0) + return []; - MetaPOINTER[] ptrs = new MetaPOINTER[count]; int ptrsize = Marshal.SizeOf(typeof(MetaPOINTER)); int ptroffset = (int)array.PointerDataOffset; var ptrblock = meta.GetBlock((int)array.PointerDataId); - if ((ptrblock == null) || (ptrblock.Data == null) || (ptrblock.StructureNameHash != (MetaName)MetaTypeName.POINTER)) - { return null; } + if (ptrblock?.Data == null || ptrblock.StructureNameHash != (MetaName)MetaTypeName.POINTER) + { + return []; + } + MetaPOINTER[] ptrs = buffer ?? GC.AllocateUninitializedArray((int)count); for (int i = 0; i < count; i++) { int offset = ptroffset + (i * ptrsize); if (offset >= ptrblock.Data.Length) - { break; } - ptrs[i] = ConvertData(ptrblock.Data, offset); + { + break; + } + TryConvertData(ptrblock.Data.AsSpan(offset), out ptrs[i]); } return ptrs; } - public static MetaHash[] GetHashArray(Meta meta, Array_uint array) + //public static MetaPOINTER[]? GetPointerArray(this Meta meta, Array_StructurePointer array, MetaPOINTER[]? buffer = null) + //{ + // return GetPointerArray(meta, in array, buffer); + //} + + public static MetaHash[]? GetHashArray(this Meta meta, in Array_uint array) { return ConvertDataArray(meta, (MetaName)MetaTypeName.HASH, array.Pointer, array.Count1); } - public static Vector4[] GetPaddedVector3Array(Meta meta, Array_Vector3 array) + public static Vector4[]? GetPaddedVector3Array(Meta meta, in Array_Vector3 array) { return ConvertDataArray(meta, (MetaName)MetaTypeName.VECTOR4, array.Pointer, array.Count1); } - public static uint[] GetUintArray(Meta meta, Array_uint array) + public static uint[]? GetUintArray(Meta meta, in Array_uint array) { return ConvertDataArray(meta, (MetaName)MetaTypeName.UINT, array.Pointer, array.Count1); } - public static ushort[] GetUshortArray(Meta meta, Array_ushort array) + public static ushort[]? GetUshortArray(Meta meta, in Array_ushort array) { return ConvertDataArray(meta, (MetaName)MetaTypeName.USHORT, array.Pointer, array.Count1); } - public static short[] GetShortArray(Meta meta, Array_ushort array) - { - return ConvertDataArray(meta, (MetaName)MetaTypeName.USHORT, array.Pointer, array.Count1); - } - public static float[] GetFloatArray(Meta meta, Array_float array) + public static float[]? GetFloatArray(this Meta meta, in Array_float array) { return ConvertDataArray(meta, (MetaName)MetaTypeName.FLOAT, array.Pointer, array.Count1); } - public static byte[] GetByteArray(Meta meta, Array_byte array) + + public static byte[]? GetByteArray(this Meta meta, in Array_byte array) { uint ptrindex = array.PointerDataIndex; uint ptroffset = array.PointerDataOffset; - 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! + + if (meta.DataBlocks is null || ptrindex >= meta.DataBlocks.Count) + return null; + + var ptrblock = meta.DataBlocks[(int)ptrindex]; + if (ptrblock?.Data is 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]; + if (ptroffset + count > ptrblock.Data.Length) + return null; + + byte[] data = GC.AllocateUninitializedArray(count); Buffer.BlockCopy(ptrblock.Data, (int)ptroffset, data, 0, count); return data; } - public static byte[] GetByteArray(Meta meta, DataBlockPointer ptr, uint count) + + public static byte[]? GetByteArray(Meta meta, in DataBlockPointer ptr, uint count) { //var pointer = array.Pointer; uint ptrindex = ptr.PointerDataIndex;// (pointer & 0xFFF) - 1; uint ptroffset = ptr.PointerDataOffset;// ((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]; + + if (meta.DataBlocks is null || ptrindex >= meta.DataBlocks.Count) + return null; + + var ptrblock = meta.DataBlocks[(int)ptrindex]; + if (ptrblock?.Data is null) // || (ptrblock.StructureNameHash != name)) + return null; //no block or wrong block? shouldn't happen! + + if (ptroffset + count > ptrblock.Data.Length) + return null; + + byte[] data = GC.AllocateUninitializedArray((int)count); Buffer.BlockCopy(ptrblock.Data, (int)ptroffset, data, 0, (int)count); return data; } - public static T[] GetTypedDataArray(Meta meta, MetaName name) where T : struct + public static T[]? GetTypedDataArray(Meta meta, MetaName name) where T : struct { - if ((meta == null) || (meta.DataBlocks == null)) return null; + if (meta?.DataBlocks is null) + return null; var datablocks = meta.DataBlocks.Data; - MetaDataBlock startblock = null; + MetaDataBlock? startblock = null; int startblockind = -1; for (int i = 0; i < datablocks.Count; i++) { @@ -1803,7 +1843,7 @@ namespace CodeWalker.GameFiles break; } } - if (startblock == null) + if (startblock is null) { return null; //couldn't find the data. } @@ -1812,14 +1852,17 @@ namespace CodeWalker.GameFiles int itemsize = Marshal.SizeOf(typeof(T)); var currentblock = startblock; int currentblockind = startblockind; - while (currentblock != null) + while (currentblock is not null) { int blockitems = currentblock.DataLength / itemsize; count += blockitems; currentblockind++; - if (currentblockind >= datablocks.Count) break; //last block, can't go any further + 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 (currentblock.StructureNameHash != name) + break; //not the right block type, can't go further } if (count <= 0) @@ -1829,26 +1872,49 @@ namespace CodeWalker.GameFiles return ConvertDataArray(meta, name, (uint)startblockind + 1, (uint)count); } + + [DoesNotReturn] + private static void ThrowBlockNotFoundException(MetaName name) + { + throw new Exception($"Couldn't find {name} block."); + } + public static T GetTypedData(Meta meta, MetaName name) where T : struct { - foreach (var block in meta.DataBlocks) + ArgumentNullException.ThrowIfNull(meta, nameof(meta)); + if (meta?.DataBlocks is null) + { + ThrowHelper.ThrowInvalidOperationException($"meta.DataBlocks is null!"); + } + + foreach (var block in meta.DataBlocks.Span) { if (block.StructureNameHash == name) { - return MetaTypes.ConvertData(block.Data); + return ConvertData(block.Data); } } - throw new Exception("Couldn't find " + name.ToString() + " block."); + //foreach (var block in meta.DataBlocks) + //{ + // if (block.StructureNameHash == name) + // { + // return MetaTypes.ConvertData(block.Data); + // } + //} + + ThrowBlockNotFoundException(name); + return default; } - public static string[] GetStrings(Meta meta) + public static string[]? GetStrings(this Meta? meta) { //look for strings in the sectionSTRINGS data block(s) - if ((meta == null) || (meta.DataBlocks == null)) return null; + if (meta?.DataBlocks is null) + return null; var datablocks = meta.DataBlocks.Data; - MetaDataBlock startblock = null; + MetaDataBlock? startblock = null; int startblockind = -1; for (int i = 0; i < datablocks.Count; i++) { @@ -1860,52 +1926,61 @@ namespace CodeWalker.GameFiles break; } } - if (startblock == null) + if (startblock is null) { return null; //couldn't find the strings data section. } - List strings = new List(); - StringBuilder sb = new StringBuilder(); + using PooledList strings = new PooledList(); 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++) + foreach(var span in data.AsSpan().EnumerateSplit((byte)0)) { - if (data[b] == 0) + if (!span.IsEmpty) { - 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); + string str = Encoding.ASCII.GetStringPooled(span); strings.Add(str); } } + //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.AsSpan(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.AsSpan(startindex, endindex - startindex)); + // strings.Add(str); + // strings2.Add(str); + // } + //} currentblockind++; - if (currentblockind >= datablocks.Count) break; //last block, can't go any further + if (currentblockind >= datablocks.Count) + break; //last block, can't go any further + currentblock = datablocks[currentblockind]; - if (currentblock.StructureNameHash != (MetaName)MetaTypeName.STRING) break; //not the right block type, can't go further + if (currentblock.StructureNameHash != (MetaName)MetaTypeName.STRING) + break; //not the right block type, can't go further } @@ -1915,186 +1990,181 @@ namespace CodeWalker.GameFiles } return strings.ToArray(); } - public static string GetString(Meta meta, CharPointer ptr) + + [SkipLocalsInit] + public static string? GetString(this Meta meta, in 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; } + { + return null; + } var block = meta.DataBlocks[blocki]; if (block.StructureNameHash != (MetaName)MetaTypeName.STRING) - { return null; } + { + 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); + { + return null; + } + + //string s = Encoding.ASCII.GetString(block.Data.AsSpan(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; + return Encoding.ASCII.GetStringPooled(block.Data.AsSpan(offset, length)); } - public static MetaWrapper[] GetExtensions(Meta meta, Array_StructurePointer ptr) + public static string? GetString(this Meta meta, CharPointer ptr) { - if (ptr.Count1 == 0) return null; + return GetString(meta, in ptr); + } + + public static MetaWrapper[]? GetExtensions(Meta meta, in Array_StructurePointer ptr) + { + if (ptr.Count1 == 0) + return null; var result = new MetaWrapper[ptr.Count1]; - var extptrs = GetPointerArray(meta, ptr); - if (extptrs != null) + var ptrs = ArrayPool.Shared.Rent(ptr.Count1); + try { - for (int i = 0; i < extptrs.Length; i++) + GetPointerArray(meta, in ptr, ptrs); + var extptrs = ptrs.AsSpan(0, ptr.Count1); + if (!extptrs.IsEmpty) { - var extptr = extptrs[i]; - MetaWrapper ext = null; - var block = meta.GetBlock(extptr.BlockID); - var h = block.StructureNameHash; - switch (h) + for (int i = 0; i < extptrs.Length; i++) { - //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; + ref var extptr = ref extptrs[i]; + var block = meta.GetBlock(extptr.BlockID); + var h = block?.StructureNameHash ?? 0; - //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; + //var extptr = extptrs[i]; + MetaWrapper? ext = h switch + { + //archetype extension types + MetaName.CExtensionDefParticleEffect => new MCExtensionDefParticleEffect(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefAudioCollisionSettings => new MCExtensionDefAudioCollisionSettings(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefAudioEmitter => new MCExtensionDefAudioEmitter(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefSpawnPoint => new MCExtensionDefSpawnPoint(),// new MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefExplosionEffect => new MCExtensionDefExplosionEffect(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefLadder => new MCExtensionDefLadder(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefBuoyancy => new MCExtensionDefBuoyancy(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefExpression => new MCExtensionDefExpression(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefLightShaft => new MCExtensionDefLightShaft(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefWindDisturbance => new MCExtensionDefWindDisturbance(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefProcObject => new MCExtensionDefProcObject(),// MetaExtension(h, GetData(block, extptr)); + //entity extension types + MetaName.CExtensionDefLightEffect => new MCExtensionDefLightEffect(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefSpawnPointOverride => new MCExtensionDefSpawnPointOverride(),// MetaExtension(h, GetData(block, extptr)); + MetaName.CExtensionDefDoor => new MCExtensionDefDoor(),// MetaExtension(h, GetData(block, extptr)); + //rage__phVerletClothCustomBounds + MetaName.rage__phVerletClothCustomBounds => new Mrage__phVerletClothCustomBounds(),// MetaExtension(h, GetData(block, extptr)); + _ => null, + }; - default: - break; - } + //string ts = GetTypesInitString(meta); - //string ts = GetTypesInitString(meta); - - if (ext != null) - { - ext.Load(meta, extptr); - } - if (i < result.Length) - { - result[i] = ext; + ext?.Load(meta, in extptr); + if (i < result.Length) + { + result[i] = ext; + } } } } + finally + { + ArrayPool.Shared.Return(ptrs); + } return result; } - public static int GetDataOffset(MetaDataBlock block, MetaPOINTER ptr) + public static int GetDataOffset(MetaDataBlock? block, in MetaPOINTER ptr) { - if (block == null) return -1; + if (block is null || block.Data is null) + return -1; + var offset = ptr.Offset; - if ((offset < 0) || (block.Data == null) || (offset >= block.Data.Length)) - { return -1; } + if (offset < 0 || offset >= block.Data.Length) + return -1; + return offset; } - public static T GetData(Meta meta, MetaPOINTER ptr) where T : struct + + public static T GetData(Meta meta, in MetaPOINTER ptr) where T : struct { - var block = meta.GetBlock(ptr.BlockID); - var offset = GetDataOffset(block, ptr); - if (offset < 0) return new T(); - return ConvertData(block.Data, offset); + _ = TryGetData(meta, in ptr, out var result); + + return result; } + public static bool TryGetData(Meta meta, in MetaPOINTER ptr, out T result) where T : struct + { + var block = meta.GetBlock(ptr.BlockID); + var offset = GetDataOffset(block, in ptr); + if (offset < 0 || block is null) + { + result = default; + return false; + } + + return TryConvertData(block.Data, out result); + } public static ushort SwapBytes(ushort x) { - return (ushort)(((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)); + return BinaryPrimitives.ReverseEndianness(x); } public static short SwapBytes(short x) { - return (short)SwapBytes((ushort)x); + return BinaryPrimitives.ReverseEndianness(x); } 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); + return BinaryPrimitives.ReverseEndianness(x); } public static int SwapBytes(int x) { - return (int)SwapBytes((uint)x); + return BinaryPrimitives.ReverseEndianness(x); } public static ulong SwapBytes(ulong x) { - //////// [not swapping 32bit blocks! careful!] - ////// swap adjacent 32-bit blocks - ////x = (x >> 32) | (x << 32); - // swap adjacent 16-bit blocks + ////////// [not swapping 32bit blocks! careful!] + //////// 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 + //// swap adjacent 8-bit blocks return ((x & 0xFF00FF00FF00FF00) >> 8) | ((x & 0x00FF00FF00FF00FF) << 8); + + //return (ulong)((ulong)(BinaryPrimitives.ReverseEndianness((uint)(x >> 32)) << 32) | (ulong)BinaryPrimitives.ReverseEndianness((uint)(x & 0xFFFFFFFF))); } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float SwapBytes(float f) { - var a = BitConverter.GetBytes(f); - Array.Reverse(a); - return BitConverter.ToSingle(a, 0); + return BitConverter.Int32BitsToSingle(BinaryPrimitives.ReverseEndianness(BitConverter.SingleToInt32Bits(f))); } - public static Vector2 SwapBytes(Vector2 v) + public static Vector2 SwapBytes(in Vector2 v) { - var x = SwapBytes(v.X); - var y = SwapBytes(v.Y); - return new Vector2(x, y); + return new Vector2(SwapBytes(v.X), SwapBytes(v.Y)); } - public static Vector3 SwapBytes(Vector3 v) + public static Vector3 SwapBytes(in Vector3 v) { - var x = SwapBytes(v.X); - var y = SwapBytes(v.Y); - var z = SwapBytes(v.Z); - return new Vector3(x, y, z); + return new Vector3(SwapBytes(v.X), SwapBytes(v.Y), SwapBytes(v.Z)); } - public static Vector4 SwapBytes(Vector4 v) + public static Vector4 SwapBytes(in 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); + return new Vector4(SwapBytes(v.X), SwapBytes(v.Y), SwapBytes(v.Z), SwapBytes(v.W)); } } @@ -2122,10 +2192,11 @@ namespace CodeWalker.GameFiles - [TC(typeof(EXP))] public abstract class MetaWrapper + [TC(typeof(EXP))] + public abstract class MetaWrapper { - public virtual string Name { get { return ToString(); } } - public abstract void Load(Meta meta, MetaPOINTER ptr); + public virtual string Name => ToString(); + public abstract void Load(Meta meta, in MetaPOINTER ptr); public abstract MetaPOINTER Save(MetaBuilder mb); } @@ -2333,24 +2404,23 @@ namespace CodeWalker.GameFiles //generated + adjusted structs code (UnusedX padding vars manually added) from here down, + meta wrapper classes - [TC(typeof(EXP))] public struct CMapTypes //80 bytes, Key:2608875220 + [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 uint Unused0;//0 + public uint Unused1;//4 + public Array_StructurePointer extensions; //8 8: Array: 0: extensions {0: StructurePointer: 0: 256} + public Array_StructurePointer archetypes; //24 24: Array: 0: archetypes {0: StructurePointer: 0: 256} + public MetaHash name; //40 40: Hash: 0: name + public uint Unused2;//44 + public Array_uint dependencies; //48 48: Array: 0: dependencies//1013942340 {0: Hash: 0: 256} + public Array_Structure compositeEntityTypes; //64 64: Array: 0: compositeEntityTypes {0: Structure: SectionUNKNOWN2: 256} - public override string ToString() - { - return name.ToString(); - } + public override readonly string ToString() => name.ToString(); } - [TC(typeof(EXP))] public struct CBaseArchetypeDef //144 bytes, Key:2411387556 + [TC(typeof(EXP))] + public struct CBaseArchetypeDef //144 bytes, Key:2411387556 { public uint Unused00 { get; set; }//0 public uint Unused01 { get; set; }//4 @@ -2360,11 +2430,11 @@ namespace CodeWalker.GameFiles 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 Vector3 bbMin; //32 32: Float_XYZ: 0: bbMin public float Unused05 { get; set; }//44 - public Vector3 bbMax { get; set; } //48 48: Float_XYZ: 0: bbMax + public Vector3 bbMax; //48 48: Float_XYZ: 0: bbMax public float Unused06 { get; set; }//60 - public Vector3 bsCentre { get; set; } //64 64: Float_XYZ: 0: bsCentre + public Vector3 bsCentre; //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 @@ -2376,21 +2446,16 @@ namespace CodeWalker.GameFiles public rage__fwArchetypeDef__eAssetType 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 Array_StructurePointer extensions; //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(); - } + public override readonly string ToString() => $"{name}, {assetName}, {drawableDictionary}, {textureDictionary}"; } - [TC(typeof(EXP))] public struct CBaseArchetypeDef_v2 //128 bytes, Key:2352343492 //old version... + [TC(typeof(EXP))] + public struct CBaseArchetypeDef_v2 //128 bytes, Key:2352343492 //old version... { public uint Unused00 { get; set; }//0 public uint Unused01 { get; set; }//4 @@ -2417,66 +2482,68 @@ namespace CodeWalker.GameFiles public Array_StructurePointer extensions { get; set; } //112 112: Array: 0: extensions {0: StructurePointer: 0: 256} } - [TC(typeof(EXP))] public struct CTimeArchetypeDefData + [TC(typeof(EXP))] + public struct CTimeArchetypeDefData { 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 } - [TC(typeof(EXP))] public struct CTimeArchetypeDef //160 bytes, Key:2520619910 + + [TC(typeof(EXP))] + public struct CTimeArchetypeDef //160 bytes, Key:2520619910 { public CBaseArchetypeDef _BaseArchetypeDef; public CTimeArchetypeDefData _TimeArchetypeDef; - public CBaseArchetypeDef BaseArchetypeDef { get { return _BaseArchetypeDef; } set { _BaseArchetypeDef = value; } } - public CTimeArchetypeDefData TimeArchetypeDef { get { return _TimeArchetypeDef; } set { _TimeArchetypeDef = value; } } + public readonly CBaseArchetypeDef BaseArchetypeDef => _BaseArchetypeDef; + public readonly CTimeArchetypeDefData TimeArchetypeDef => _TimeArchetypeDef; - public override string ToString() - { - return _BaseArchetypeDef.ToString(); - } + public override readonly string ToString() => _BaseArchetypeDef.ToString(); } - [TC(typeof(EXP))] public struct CMloArchetypeDefData + [TC(typeof(EXP))] + public struct CMloArchetypeDefData { 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 Array_StructurePointer entities; //152 152: Array: 0: entities {0: StructurePointer: 0: 256} + public Array_Structure rooms; //168 168: Array: 0: rooms {0: Structure: CMloRoomDef: 256} + public Array_Structure portals; //184 184: Array: 0: portals//2314725778 {0: Structure: CMloPortalDef: 256} + public Array_Structure entitySets; //200 200: Array: 0: entitySets//1169996080 {0: Structure: CMloEntitySet: 256} + public Array_Structure timeCycleModifiers; //216 216: Array: 0: timeCycleModifiers {0: Structure: CMloTimeCycleModifier: 256} public uint Unused12 { get; set; }//232 public uint Unused13 { get; set; }//236 } - [TC(typeof(EXP))] public struct CMloArchetypeDef //240 bytes, Key:937664754 + + [TC(typeof(EXP))] + public struct CMloArchetypeDef //240 bytes, Key:937664754 { public CBaseArchetypeDef _BaseArchetypeDef; public CMloArchetypeDefData _MloArchetypeDef; - public CBaseArchetypeDef BaseArchetypeDef { get { return _BaseArchetypeDef; } set { _BaseArchetypeDef = value; } } - public CMloArchetypeDefData MloArchetypeDef { get { return _MloArchetypeDef; } set { _MloArchetypeDef = value; } } + public readonly CBaseArchetypeDef BaseArchetypeDef => _BaseArchetypeDef; + public readonly CMloArchetypeDefData MloArchetypeDef => _MloArchetypeDef; - public override string ToString() - { - return _BaseArchetypeDef.ToString(); - } + public override readonly string ToString() => _BaseArchetypeDef.ToString(); } - [TC(typeof(EXP))] public struct CMloInstanceDef //160 bytes, Key:2151576752 + [TC(typeof(EXP))] + public struct CMloInstanceDef //160 bytes, Key:2151576752 { - public CEntityDef CEntityDef { get; set; } + public CEntityDef CEntityDef; public uint groupId { get; set; } //128 128: UnsignedInt: 0: 2501631252 public uint floorId { get; set; } //132 132: UnsignedInt: 0: floorId//2187650609 - public Array_uint defaultEntitySets { get; set; } //136 136: Array: 0: defaultEntitySets//1407157833 {0: Hash: 0: 256} + public Array_uint defaultEntitySets; //136 136: Array: 0: defaultEntitySets//1407157833 {0: Hash: 0: 256} public uint numExitPortals { get; set; } //152 152: UnsignedInt: 0: numExitPortals//528711607 public uint MLOInstflags { get; set; } //156 156: UnsignedInt: 0: MLOInstflags//3761966250 } - [TC(typeof(EXP))] public struct CMloRoomDef //112 bytes, Key:3885428245 + [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 CharPointer name; //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 @@ -2491,9 +2558,11 @@ namespace CodeWalker.GameFiles public int floorId { get; set; } //84 84: SignedInt: 0: floorId//2187650609 public int exteriorVisibiltyDepth { 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} + public Array_uint attachedObjects; //96 96: Array: 0: attachedObjects//2382704940 {0: UnsignedInt: 0: 256} } - [TC(typeof(EXP))] public class MCMloRoomDef : MetaWrapper + + [TC(typeof(EXP))] + public class MCMloRoomDef : MetaWrapper { public CMloRoomDef _Data; public CMloRoomDef Data { get { return _Data; } } @@ -2514,15 +2583,15 @@ namespace CodeWalker.GameFiles public MCMloRoomDef(Meta meta, CMloRoomDef data) { _Data = data; - RoomName = MetaTypes.GetString(meta, _Data.name); - AttachedObjects = MetaTypes.GetUintArray(meta, _Data.attachedObjects) ?? Array.Empty(); + RoomName = MetaTypes.GetString(meta, in _Data.name); + AttachedObjects = MetaTypes.GetUintArray(meta, in _Data.attachedObjects) ?? Array.Empty(); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - RoomName = MetaTypes.GetString(meta, _Data.name); - AttachedObjects = MetaTypes.GetUintArray(meta, _Data.attachedObjects); + MetaTypes.TryGetData(meta, in ptr, out _Data); + RoomName = MetaTypes.GetString(meta, in _Data.name); + AttachedObjects = MetaTypes.GetUintArray(meta, in _Data.attachedObjects) ?? Array.Empty(); } public override MetaPOINTER Save(MetaBuilder mb) @@ -2539,24 +2608,16 @@ namespace CodeWalker.GameFiles _Data.attachedObjects = mb.AddUintArrayPtr(AttachedObjects); mb.AddStructureInfo(MetaName.CMloRoomDef); - return mb.AddItemPtr(MetaName.CMloRoomDef, _Data); + return mb.AddItemPtr(MetaName.CMloRoomDef, in _Data); } - public override string Name - { - get - { - return RoomName; - } - } + public override string Name => RoomName; - public override string ToString() - { - return RoomName; - } + public override string ToString() => RoomName; } - [TC(typeof(EXP))] public struct CMloPortalDef //64 bytes, Key:1110221513 + [TC(typeof(EXP))] + public struct CMloPortalDef //64 bytes, Key:1110221513 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -2566,13 +2627,15 @@ namespace CodeWalker.GameFiles 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} + public Array_Vector3 corners; //32 32: Array: 0: corners {0: Float_XYZ: 0: 256} + public Array_uint attachedObjects; //48 48: Array: 0: attachedObjects//2382704940 {0: UnsignedInt: 0: 256} } - [TC(typeof(EXP))] public class MCMloPortalDef : MetaWrapper + + [TC(typeof(EXP))] + public class MCMloPortalDef : MetaWrapper { public CMloPortalDef _Data; - public CMloPortalDef Data { get { return _Data; } } + public CMloPortalDef Data => _Data; public Vector4[] Corners { get; set; } public uint[] AttachedObjects { get; set; } @@ -2580,7 +2643,8 @@ namespace CodeWalker.GameFiles { get { - if ((Corners == null)||(Corners.Length==0)) return Vector3.Zero; + if (Corners == null || Corners.Length == 0) + return Vector3.Zero; var v = Vector3.Zero; for (int i = 0; i < Corners.Length; i++) { @@ -2598,20 +2662,20 @@ namespace CodeWalker.GameFiles public MCMloPortalDef(Meta meta, CMloPortalDef data) { _Data = data; - Corners = MetaTypes.GetPaddedVector3Array(meta, _Data.corners); - AttachedObjects = MetaTypes.GetUintArray(meta, _Data.attachedObjects); + Corners = MetaTypes.GetPaddedVector3Array(meta, in _Data.corners); + AttachedObjects = MetaTypes.GetUintArray(meta, in _Data.attachedObjects); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - Corners = MetaTypes.GetPaddedVector3Array(meta, _Data.corners); - AttachedObjects = MetaTypes.GetUintArray(meta, _Data.attachedObjects); + MetaTypes.TryGetData(meta, in ptr, out _Data); + Corners = MetaTypes.GetPaddedVector3Array(meta, in _Data.corners); + AttachedObjects = MetaTypes.GetUintArray(meta, in _Data.attachedObjects); } public override MetaPOINTER Save(MetaBuilder mb) { - if (Corners!=null) + if (Corners is not null) { _Data.corners = mb.AddPaddedVector3ArrayPtr(Corners); } @@ -2620,7 +2684,7 @@ namespace CodeWalker.GameFiles _Data.corners = new Array_Vector3(); } - if (AttachedObjects != null) + if (AttachedObjects is not null) { _Data.attachedObjects = mb.AddUintArrayPtr(AttachedObjects); } @@ -2630,45 +2694,42 @@ namespace CodeWalker.GameFiles } mb.AddStructureInfo(MetaName.CMloPortalDef); - return mb.AddItemPtr(MetaName.CMloPortalDef, _Data); + return mb.AddItemPtr(MetaName.CMloPortalDef, in _Data); } - public override string Name - { - get - { - return Index.ToString() + ": " + _Data.roomFrom.ToString() + " to " + _Data.roomTo.ToString(); - } - } + public override string Name => $"{Index}: {_Data.roomFrom} to {_Data.roomTo}"; - public override string ToString() - { - return Name; - } + public override string ToString() => Name; } - [TC(typeof(EXP))] public struct CMloEntitySet //48 bytes, Key:4180211587 + [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} + public Array_uint locations; //16 16: Array: 0: locations {0: UnsignedInt: 0: 256} + public Array_StructurePointer entities; //32 32: Array: 0: entities {0: StructurePointer: 0: 256} } - [TC(typeof(EXP))] public class MCMloEntitySet : MetaWrapper + + [TC(typeof(EXP))] + public class MCMloEntitySet : MetaWrapper { public CMloEntitySet _Data; - public CMloEntitySet Data { get { return _Data; } } + public CMloEntitySet Data => _Data; public uint[] Locations { get; set; } public MCEntityDef[] Entities { get; set; } - public MloArchetype OwnerMlo { get; set; } // for browsing/reference purposes + public MloArchetype? OwnerMlo { get; set; } // for browsing/reference purposes public int Index { get; set; } public bool ForceVisible { get; set; } = false; //forces this entity set visible from the project window, for rendering purpose - public MCMloEntitySet() { } + public MCMloEntitySet() { + Entities = []; + Locations = []; + } public MCMloEntitySet(Meta meta, CMloEntitySet data, MloArchetype owner) { _Data = data; @@ -2676,23 +2737,24 @@ namespace CodeWalker.GameFiles Load(meta); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); Load(meta); } + [MemberNotNull(nameof(Entities), nameof(Locations))] private void Load(Meta meta) { - Locations = MetaTypes.GetUintArray(meta, _Data.locations); + Locations = MetaTypes.GetUintArray(meta, in _Data.locations) ?? Array.Empty(); - var ents = MetaTypes.ConvertDataArray(meta, MetaName.CEntityDef, _Data.entities); + var ents = MetaTypes.ConvertDataArray(meta, MetaName.CEntityDef, in _Data.entities); if (ents != null) { Entities = new MCEntityDef[ents.Length]; for (int i = 0; i < ents.Length; i++) { - Entities[i] = new MCEntityDef(meta, ref ents[i]) { OwnerMlo = OwnerMlo }; + Entities[i] = new MCEntityDef(meta, ents[i]) { OwnerMlo = OwnerMlo }; } } } @@ -2700,7 +2762,7 @@ namespace CodeWalker.GameFiles public override MetaPOINTER Save(MetaBuilder mb) { - if (Locations != null) + if (Locations.Length > 0) { _Data.locations = mb.AddUintArrayPtr(Locations); } @@ -2709,7 +2771,7 @@ namespace CodeWalker.GameFiles _Data.locations = new Array_uint(); } - if (Entities!=null) + if (Entities.Length > 0) { _Data.entities = mb.AddWrapperArrayPtr(Entities); } @@ -2719,21 +2781,11 @@ namespace CodeWalker.GameFiles } mb.AddStructureInfo(MetaName.CMloEntitySet); - return mb.AddItemPtr(MetaName.CMloEntitySet, _Data); + return mb.AddItemPtr(MetaName.CMloEntitySet, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } - - public override string ToString() - { - return Name + ": " + (Entities?.Length ?? 0).ToString() + " entities"; - } + public override string Name => _Data.name.ToString(); + public override string ToString() => $"{Name}: {Entities?.Length ?? 0} entities"; } [TC(typeof(EXP))] public struct CMloTimeCycleModifier //48 bytes, Key:838874674 @@ -2771,17 +2823,17 @@ namespace CodeWalker.GameFiles 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 + public Array_StructurePointer entities; //96 96: Array: 0: entities {0: StructurePointer: 0: 256} + public Array_Structure containerLods; //112 112: Array: 0: containerLods//2935983381 {0: Structure: 372253349: 256} + public Array_Structure boxOccluders; //128 128: Array: 0: boxOccluders//3983590932 {0: Structure: SectionUNKNOWN7: 256} + public Array_Structure occludeModels; //144 144: Array: 0: occludeModels//2132383965 {0: Structure: SectionUNKNOWN5: 256} + public Array_uint physicsDictionaries; //160 160: Array: 0: physicsDictionaries//949589348 {0: Hash: 0: 256} + public rage__fwInstancedMapData instancedData; //176 176: Structure: rage__fwInstancedMapData: instancedData//2569067561 + public Array_Structure timeCycleModifiers; //224 224: Array: 0: timeCycleModifiers {0: Structure: CTimeCycleModifier: 256} + public Array_Structure carGenerators; //240 240: Array: 0: carGenerators//3254823756 {0: Structure: CCarGen: 256} + public CLODLight LODLightsSOA; //256 256: Structure: CLODLight: LODLightsSOA//1774371066 + public CDistantLODLight DistantLODLightsSOA; //392 392: Structure: CDistantLODLight: DistantLODLightsSOA//2954466641 + public CBlockDesc block; //440 440: Structure: CBlockDesc//3072355914: block //notes: @@ -2790,13 +2842,11 @@ namespace CodeWalker.GameFiles // flag 2 = LOD flag? reflection proxy flag? - public override string ToString() - { - return name.ToString() + ": " + parent.ToString(); - } + public override readonly string ToString() => $"{name}: {parent}"; } - [TC(typeof(EXP))] public struct CEntityDef //128 bytes, Key:1825799514 + [TC(typeof(EXP))] + public struct CEntityDef //128 bytes, Key:1825799514 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -2817,52 +2867,53 @@ namespace CodeWalker.GameFiles public rage__eLodType lodLevel { get; set; } //84 84: IntEnum: 1264241711: lodLevel //LODTYPES_DEPTH_ public uint numChildren { get; set; } //88 88: UnsignedInt: 0: numChildren//2793909385 public rage__ePriorityLevel 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 Array_StructurePointer extensions; //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(); - } + public override readonly string ToString() => $"{JenkIndex.GetString(archetypeName)}: {JenkIndex.GetString(guid)}: {position}"; } [TC(typeof(EXP))] public class MCEntityDef : MetaWrapper { public CEntityDef _Data; - public CEntityDef Data { get { return _Data; } set { _Data = value; } } + public ref CEntityDef Data => ref _Data; public MetaWrapper[] Extensions { get; set; } - public MloArchetype OwnerMlo { get; set; } // for browsing/reference purposes + public MloArchetype? OwnerMlo { get; set; } // for browsing/reference purposes public int Index { get; set; } public MCEntityDef(MCEntityDef copy) { - if (copy != null) _Data = copy.Data; + if (copy != null) + _Data = copy._Data; + + Extensions = []; } - public MCEntityDef(Meta meta, ref CEntityDef d) + public MCEntityDef(Meta meta, CEntityDef d) { _Data = d; - Extensions = MetaTypes.GetExtensions(meta, _Data.extensions); + Extensions = MetaTypes.GetExtensions(meta, in _Data.extensions) ?? []; } - public MCEntityDef(ref CEntityDef d, MloArchetype arch) + public MCEntityDef(in CEntityDef d, MloArchetype arch) { _Data = d; OwnerMlo = arch; + Extensions = []; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - Extensions = MetaTypes.GetExtensions(meta, _Data.extensions); + MetaTypes.TryGetData(meta, in ptr, out _Data); + Extensions = MetaTypes.GetExtensions(meta, in _Data.extensions) ?? []; } public override MetaPOINTER Save(MetaBuilder mb) { - if (Extensions != null) + if (Extensions.Length > 0) { _Data.extensions = mb.AddWrapperArrayPtr(Extensions); } @@ -2872,24 +2923,16 @@ namespace CodeWalker.GameFiles } mb.AddStructureInfo(MetaName.CEntityDef); - return mb.AddItemPtr(MetaName.CEntityDef, _Data); + return mb.AddItemPtr(MetaName.CEntityDef, in _Data); } - public override string Name - { - get - { - return _Data.archetypeName.ToString(); - } - } + public override string Name => _Data.archetypeName.ToString(); - public override string ToString() - { - return Name; - } + public override string ToString() => Name; } - [TC(typeof(EXP))] public struct BoxOccluder //16 bytes, Key:1831736438 //boxOccluders + [TC(typeof(EXP))] + public struct BoxOccluder //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 @@ -2901,38 +2944,40 @@ namespace CodeWalker.GameFiles public short iSinZ { get; set; } //14 14: SignedShort: 0: iSinZ } - [TC(typeof(EXP))] public struct OccludeModel //64 bytes, Key:1172796107 //occludeModels + [TC(typeof(EXP))] + public struct OccludeModel //64 bytes, Key:1172796107 //occludeModels { - public Vector3 bmin { get; set; } //0 0: Float_XYZ: 0: bmin + public Vector3 bmin; //0 0: Float_XYZ: 0: bmin public float Unused0 { get; set; }//12 - public Vector3 bmax { get; set; } //16 16: Float_XYZ: 0: bmax + public Vector3 bmax; //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 DataBlockPointer verts; //40 40: DataBlockPointer: 2: verts public ushort numVertsInBytes { get; set; } //48 48: UnsignedShort: 0: numVertsInBytes public ushort numTris { get; set; } //50 50: UnsignedShort: 0: numTris public uint flags { get; set; } //52 52: UnsignedInt: 0: flags public uint Unused3 { get; set; }//56 public uint Unused4 { get; set; }//60 + + public readonly BoundingBox BoundingBox => new BoundingBox(bmin, bmax); } - [TC(typeof(EXP))] public struct rage__fwInstancedMapData //48 bytes, Key:1836780118 + [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 Array_Structure PropInstanceList; //16 16: Array: 0: PropInstanceList//3551474528 {0: Structure: rage__fwPropInstanceListDef: 256} + public Array_Structure GrassInstanceList; //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"; - } + public override readonly string ToString() => $"{ImapLink}, {PropInstanceList.Count1} props, {GrassInstanceList.Count1} grasses"; } - [TC(typeof(EXP))] public struct rage__fwGrassInstanceListDef //96 bytes, Key:941808164 rage__fwGrassInstanceListDef//2085051229 + [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 @@ -2943,33 +2988,29 @@ namespace CodeWalker.GameFiles 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 Array_Structure InstanceList; //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)"; - } + public override readonly string ToString() => $"{archetypeName} ({InstanceList.Count1} instances)"; } - [TC(typeof(EXP))] public struct rage__fwGrassInstanceListDef__InstanceData //16 bytes, Key:2740378365 rage__fwGrassInstanceListDef__InstanceData//3985044770 // Tom: Something to do with placing foliage + [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 ArrayOfUshorts3 Position; //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 ArrayOfBytes3 Color; //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 ArrayOfBytes3 Pad; //13 13: ArrayOfBytes: 3: Pad - public override string ToString() - { - return Position.ToString() + " : " + Color.ToString() + " : " + Scale.ToString(); - } + public override readonly string ToString() => $"{Position} : {Color} : {Scale}"; } - [TC(typeof(EXP))] public struct CTimeCycleModifier //64 bytes, Key:2683420777 + [TC(typeof(EXP))] + public struct CTimeCycleModifier //64 bytes, Key:2683420777 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -2989,15 +3030,11 @@ namespace CodeWalker.GameFiles //2633803310 = NoAmbientmult //2003616884 = INT_NoAmbientMult - - - public override string ToString() - { - return name.ToString() + ": startHour " + startHour.ToString() + ", endHour " + endHour.ToString() + ", range " + range.ToString() + ", percentage " + percentage.ToString(); - } + public override readonly string ToString() => $"{name}: startHour {startHour}, endHour {endHour}, range {range}, percentage {percentage}"; } - [TC(typeof(EXP))] public struct CCarGen //80 bytes, Key:2345238261 + [TC(typeof(EXP))] + public struct CCarGen //80 bytes, Key:2345238261 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3020,45 +3057,45 @@ namespace CodeWalker.GameFiles 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(); - } + public override readonly string ToString() => $"{carModel}, {position}, {popGroup}, {livery}"; } - [TC(typeof(EXP))] public struct CLODLight //136 bytes, Key:2325189228 + [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: VECTOR3: 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} + public Array_Structure direction; //8 8: Array: 0: direction {0: Structure: VECTOR3: 256} + public Array_float falloff; //24 24: Array: 0: falloff {0: Float: 0: 256} + public Array_float falloffExponent; //40 40: Array: 0: falloffExponent {0: Float: 0: 256} + public Array_uint timeAndStateFlags; //56 56: Array: 0: timeAndStateFlags=3112418278 {0: UnsignedInt: 0: 256} + public Array_uint hash; //72 72: Array: 0: hash {0: UnsignedInt: 0: 256} + public Array_byte coneInnerAngle; //88 88: Array: 0: coneInnerAngle//1163671864 {0: UnsignedByte: 0: 256} + public Array_byte coneOuterAngleOrCapExt; //104 104: Array: 0: coneOuterAngleOrCapExt=3161894080 {0: UnsignedByte: 0: 256} + public Array_byte coronaIntensity; //120 120: Array: 0: coronaIntensity//2292363771 {0: UnsignedByte: 0: 256} } - [TC(typeof(EXP))] public struct CDistantLODLight //48 bytes, Key:2820908419 + [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: VECTOR3: 256} - public Array_uint RGBI { get; set; } //24 24: Array: 0: RGBI {0: UnsignedInt: 0: 256} + public Array_Structure position; //8 8: Array: 0: position {0: Structure: VECTOR3: 256} + public Array_uint RGBI; //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 + [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 + public CharPointer name; //8 8: CharPointer: 0: name + public CharPointer exportedBy; //24 24: CharPointer: 0: exportedBy//1983184981 + public CharPointer owner; //40 40: CharPointer: 0: owner + public CharPointer time; //56 56: CharPointer: 0: time } @@ -3070,7 +3107,8 @@ namespace CodeWalker.GameFiles - [TC(typeof(EXP))] public struct CExtensionDefParticleEffect //96 bytes, Key:466596385 + [TC(typeof(EXP))] + public struct CExtensionDefParticleEffect //96 bytes, Key:466596385 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3079,7 +3117,7 @@ namespace CodeWalker.GameFiles 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 CharPointer fxName; //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 @@ -3089,22 +3127,21 @@ namespace CodeWalker.GameFiles public uint Unused4 { get; set; }//88 public uint Unused5 { get; set; }//92 - public override string ToString() - { - return "CExtensionDefParticleEffect - " + name.ToString(); - } + public override readonly string ToString() => $"CExtensionDefParticleEffect - {name}"; } - [TC(typeof(EXP))] public class MCExtensionDefParticleEffect : MetaWrapper + + [TC(typeof(EXP))] + public class MCExtensionDefParticleEffect : MetaWrapper { public CExtensionDefParticleEffect _Data; - public CExtensionDefParticleEffect Data { get { return _Data; } } + public CExtensionDefParticleEffect Data => _Data; public string fxName { get; set; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - fxName = MetaTypes.GetString(meta, _Data.fxName); + MetaTypes.TryGetData(meta, in ptr, out _Data); + fxName = MetaTypes.GetString(meta, in _Data.fxName); } public override MetaPOINTER Save(MetaBuilder mb) @@ -3115,37 +3152,26 @@ namespace CodeWalker.GameFiles } mb.AddStructureInfo(MetaName.CExtensionDefParticleEffect); - return mb.AddItemPtr(MetaName.CExtensionDefParticleEffect, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefParticleEffect, in _Data); } - public override string Name - { - get - { - return fxName; - } - } + public override string Name => fxName; - public override string ToString() - { - return _Data.ToString() + " - " + fxName; - } + public override string ToString() => $"{_Data} - {fxName}"; } - [TC(typeof(EXP))] public struct CExtensionDefLightEffect //48 bytes, Key:2436199897 + [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 Vector3 offsetPosition; //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 Array_Structure instances; //32 32: Array: 0: 274177522 {0: Structure: CLightAttrDef: 256} - public override string ToString() - { - return "CExtensionDefLightEffect - " + name.ToString(); - } + public override readonly string ToString() => $"CExtensionDefLightEffect - {name}"; } [TC(typeof(EXP))] public class MCExtensionDefLightEffect : MetaWrapper { @@ -3154,10 +3180,10 @@ namespace CodeWalker.GameFiles public CLightAttrDef[] instances { get; set; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - instances = MetaTypes.ConvertDataArray(meta, MetaName.CLightAttrDef, _Data.instances); + MetaTypes.TryGetData(meta, in ptr, out _Data); + instances = MetaTypes.ConvertDataArray(meta, MetaName.CLightAttrDef, in _Data.instances); } public override MetaPOINTER Save(MetaBuilder mb) @@ -3169,24 +3195,16 @@ namespace CodeWalker.GameFiles mb.AddStructureInfo(MetaName.CLightAttrDef); mb.AddStructureInfo(MetaName.CExtensionDefLightEffect); - return mb.AddItemPtr(MetaName.CExtensionDefLightEffect, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefLightEffect, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString() + " (" + (instances?.Length ?? 0).ToString() + " Attributes)"; - } + public override string ToString() => $"{_Data} ({instances?.Length ?? 0} Attributes)"; } - [TC(typeof(EXP))] public struct CLightAttrDef //160 bytes, Key:2363260268 + [TC(typeof(EXP))] + public struct CLightAttrDef //160 bytes, Key:2363260268 { public uint Unused00 { get; set; }//0 public uint Unused01 { get; set; }//4 @@ -3241,42 +3259,31 @@ namespace CodeWalker.GameFiles public uint Unused5 { get; set; }//40 public uint Unused6 { get; set; }//44 - public override string ToString() - { - return "CExtensionDefAudioCollisionSettings - " + name.ToString(); - } + public override readonly string ToString() => $"CExtensionDefAudioCollisionSettings - {name}"; } [TC(typeof(EXP))] public class MCExtensionDefAudioCollisionSettings : MetaWrapper { public CExtensionDefAudioCollisionSettings _Data; - public CExtensionDefAudioCollisionSettings Data { get { return _Data; } } + public CExtensionDefAudioCollisionSettings Data => _Data; - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefAudioCollisionSettings); - return mb.AddItemPtr(MetaName.CExtensionDefAudioCollisionSettings, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefAudioCollisionSettings, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString(); - } + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefAudioEmitter //64 bytes, Key:15929839 + [TC(typeof(EXP))] + public struct CExtensionDefAudioEmitter //64 bytes, Key:15929839 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3290,42 +3297,33 @@ namespace CodeWalker.GameFiles public uint Unused5 { get; set; }//56 public uint Unused6 { get; set; }//60 - public override string ToString() - { - return "CExtensionDefAudioEmitter - " + name.ToString() + ": " + effectHash.ToString() + ": " + offsetPosition.ToString(); - } + public override readonly string ToString() => $"CExtensionDefAudioEmitter - {name}: {effectHash}: {offsetPosition}"; } - [TC(typeof(EXP))] public class MCExtensionDefAudioEmitter : MetaWrapper + + [TC(typeof(EXP))] + public class MCExtensionDefAudioEmitter : MetaWrapper { public CExtensionDefAudioEmitter _Data; - public CExtensionDefAudioEmitter Data { get { return _Data; } } + public CExtensionDefAudioEmitter Data => _Data; - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefAudioEmitter); - return mb.AddItemPtr(MetaName.CExtensionDefAudioEmitter, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefAudioEmitter, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString(); - } + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefExplosionEffect //80 bytes, Key:2840366784 + [TC(typeof(EXP))] + public struct CExtensionDefExplosionEffect //80 bytes, Key:2840366784 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3334,28 +3332,25 @@ namespace CodeWalker.GameFiles 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 CharPointer explosionName; //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(); - } + public override readonly string ToString() => $"CExtensionDefExplosionEffect - {name}"; } [TC(typeof(EXP))] public class MCExtensionDefExplosionEffect : MetaWrapper { public CExtensionDefExplosionEffect _Data; - public CExtensionDefExplosionEffect Data { get { return _Data; } } + public CExtensionDefExplosionEffect Data => _Data; public string explosionName { get; set; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - explosionName = MetaTypes.GetString(meta, _Data.explosionName); + MetaTypes.TryGetData(meta, in ptr, out _Data); + explosionName = MetaTypes.GetString(meta, in _Data.explosionName); } public override MetaPOINTER Save(MetaBuilder mb) @@ -3365,24 +3360,16 @@ namespace CodeWalker.GameFiles _Data.explosionName = mb.AddStringPtr(explosionName); } mb.AddStructureInfo(MetaName.CExtensionDefExplosionEffect); - return mb.AddItemPtr(MetaName.CExtensionDefExplosionEffect, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefExplosionEffect, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString() + " - " + explosionName; - } + public override string ToString() => $"{_Data} - {explosionName}"; } - [TC(typeof(EXP))] public struct CExtensionDefLadder //96 bytes, Key:1978210597 + [TC(typeof(EXP))] + public struct CExtensionDefLadder //96 bytes, Key:1978210597 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3403,43 +3390,33 @@ namespace CodeWalker.GameFiles public ushort Unused7 { get; set; }//90 public uint Unused8 { get; set; }//92 - public override string ToString() - { - return "CExtensionDefLadder - " + name.ToString(); - } + public override readonly string ToString() => $"CExtensionDefLadder - {name}"; } - [TC(typeof(EXP))] public class MCExtensionDefLadder : MetaWrapper + + [TC(typeof(EXP))] + public class MCExtensionDefLadder : MetaWrapper { public CExtensionDefLadder _Data; - public CExtensionDefLadder Data { get { return _Data; } } + public CExtensionDefLadder Data => _Data; - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddEnumInfo(MetaName.CExtensionDefLadderMaterialType); mb.AddStructureInfo(MetaName.CExtensionDefLadder); - return mb.AddItemPtr(MetaName.CExtensionDefLadder, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefLadder, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } - - public override string ToString() - { - return _Data.ToString(); - } + public override string Name => _Data.name.ToString(); + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefBuoyancy //32 bytes, Key:2383039928 + [TC(typeof(EXP))] + public struct CExtensionDefBuoyancy //32 bytes, Key:2383039928 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3450,40 +3427,31 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "CExtensionDefBuoyancy - " + name.ToString(); + return $"CExtensionDefBuoyancy - {name}"; } } [TC(typeof(EXP))] public class MCExtensionDefBuoyancy : MetaWrapper { public CExtensionDefBuoyancy _Data; - public CExtensionDefBuoyancy Data { get { return _Data; } } + public CExtensionDefBuoyancy Data => _Data; - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefBuoyancy); - return mb.AddItemPtr(MetaName.CExtensionDefBuoyancy, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefBuoyancy, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } - - public override string ToString() - { - return _Data.ToString(); - } + public override string Name => _Data.name.ToString(); + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefExpression //48 bytes, Key:24441706 + [TC(typeof(EXP))] + public struct CExtensionDefExpression //48 bytes, Key:24441706 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3498,42 +3466,33 @@ namespace CodeWalker.GameFiles public byte Unused4 { get; set; }//45 public ushort Unused5 { get; set; }//46 - public override string ToString() - { - return "CExtensionDefExpression - " + name.ToString(); - } + public override readonly string ToString() => $"CExtensionDefExpression - {name}"; } - [TC(typeof(EXP))] public class MCExtensionDefExpression : MetaWrapper + + [TC(typeof(EXP))] + public class MCExtensionDefExpression : MetaWrapper { public CExtensionDefExpression _Data; public CExtensionDefExpression Data { get { return _Data; } } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefExpression); - return mb.AddItemPtr(MetaName.CExtensionDefExpression, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefExpression, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString(); - } + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefLightShaft //176 bytes, Key:2526429398 + [TC(typeof(EXP))] + public struct CExtensionDefLightShaft //176 bytes, Key:2526429398 { public uint Unused00 { get; set; }//0 public uint Unused01 { get; set; }//4 @@ -3572,19 +3531,20 @@ namespace CodeWalker.GameFiles public byte Unused11 { get; set; }//173 public ushort Unused12 { get; set; }//174 - public override string ToString() + public override readonly string ToString() { - return "CExtensionDefLightShaft - " + name.ToString(); + return $"CExtensionDefLightShaft - {name}"; } } - [TC(typeof(EXP))] public class MCExtensionDefLightShaft : MetaWrapper + [TC(typeof(EXP))] + public class MCExtensionDefLightShaft : MetaWrapper { public CExtensionDefLightShaft _Data; - public CExtensionDefLightShaft Data { get { return _Data; } } + public CExtensionDefLightShaft Data => _Data; - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) @@ -3592,24 +3552,15 @@ namespace CodeWalker.GameFiles mb.AddEnumInfo(MetaName.CExtensionDefLightShaftDensityType); mb.AddEnumInfo(MetaName.CExtensionDefLightShaftVolumeType); mb.AddStructureInfo(MetaName.CExtensionDefLightShaft); - return mb.AddItemPtr(MetaName.CExtensionDefLightShaft, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefLightShaft, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } - - public override string ToString() - { - return _Data.ToString(); - } + public override string Name => _Data.name.ToString(); + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefDoor //48 bytes, Key:2671601385 + [TC(typeof(EXP))] + public struct CExtensionDefDoor //48 bytes, Key:2671601385 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3625,42 +3576,35 @@ namespace CodeWalker.GameFiles 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() + public override readonly string ToString() { - return "CExtensionDefDoor - " + name.ToString() + ", " + audioHash.ToString() + ", " + offsetPosition.ToString() + ", " + limitAngle.ToString(); + return $"CExtensionDefDoor - {name}, {audioHash}, {offsetPosition}, {limitAngle}"; } } - [TC(typeof(EXP))] public class MCExtensionDefDoor : MetaWrapper + [TC(typeof(EXP))] + public class MCExtensionDefDoor : MetaWrapper { public CExtensionDefDoor _Data; - public CExtensionDefDoor Data { get { return _Data; } } + public CExtensionDefDoor Data => _Data; - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefDoor); - return mb.AddItemPtr(MetaName.CExtensionDefDoor, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefDoor, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString(); - } + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefSpawnPoint //96 bytes, Key:3077340721 + [TC(typeof(EXP))] + public struct CExtensionDefSpawnPoint //96 bytes, Key:3077340721 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3687,12 +3631,13 @@ namespace CodeWalker.GameFiles public byte shortRange { get; set; } //94 94: Boolean: 0: shortRange public byte Unused5 { get; set; }//95 - public override string ToString() + public override readonly string ToString() { - return spawnType.ToString() + ": " + name.ToString() + ", " + pedType.ToString();// + ", " + flags.ToString() + ", " + offsetPosition.ToString(); + return $"{spawnType}: {name}, {pedType}";// + ", " + flags.ToString() + ", " + offsetPosition.ToString(); } } - [TC(typeof(EXP))] public class MCExtensionDefSpawnPoint : MetaWrapper + [TC(typeof(EXP))] + public class MCExtensionDefSpawnPoint : MetaWrapper { [TC(typeof(EXP))] public object Parent { get; set; } public MCScenarioPointRegion ScenarioRegion { get; private set; } @@ -3724,7 +3669,7 @@ namespace CodeWalker.GameFiles 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) + public MCExtensionDefSpawnPoint(MCScenarioPointRegion region, Meta meta, in CExtensionDefSpawnPoint data, object parent) { ScenarioRegion = region; Parent = parent; @@ -3741,9 +3686,9 @@ namespace CodeWalker.GameFiles } } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) @@ -3751,24 +3696,15 @@ namespace CodeWalker.GameFiles mb.AddEnumInfo(MetaName.CSpawnPoint__AvailabilityMpSp); mb.AddEnumInfo(MetaName.CScenarioPointFlags__Flags); mb.AddStructureInfo(MetaName.CExtensionDefSpawnPoint); - return mb.AddItemPtr(MetaName.CExtensionDefSpawnPoint, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefSpawnPoint, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } - - public override string ToString() - { - return _Data.ToString(); - } + public override string Name => _Data.name.ToString(); + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefSpawnPointOverride //64 bytes, Key:2551875873 + [TC(typeof(EXP))] + public struct CExtensionDefSpawnPointOverride //64 bytes, Key:2551875873 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3787,19 +3723,18 @@ namespace CodeWalker.GameFiles 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(); - } + public override readonly string ToString() => $"CExtensionDefSpawnPointOverride - {name}"; } - [TC(typeof(EXP))] public class MCExtensionDefSpawnPointOverride : MetaWrapper + + [TC(typeof(EXP))] + public class MCExtensionDefSpawnPointOverride : MetaWrapper { public CExtensionDefSpawnPointOverride _Data; - public CExtensionDefSpawnPointOverride Data { get { return _Data; } } + public CExtensionDefSpawnPointOverride Data => _Data; - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) @@ -3807,24 +3742,16 @@ namespace CodeWalker.GameFiles mb.AddEnumInfo(MetaName.CSpawnPoint__AvailabilityMpSp); mb.AddEnumInfo(MetaName.CScenarioPointFlags__Flags); mb.AddStructureInfo(MetaName.CExtensionDefSpawnPointOverride); - return mb.AddItemPtr(MetaName.CExtensionDefSpawnPointOverride, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefSpawnPointOverride, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString(); - } + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefWindDisturbance //96 bytes, Key:3971538917 + [TC(typeof(EXP))] + public struct CExtensionDefWindDisturbance //96 bytes, Key:3971538917 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3843,42 +3770,32 @@ namespace CodeWalker.GameFiles public uint Unused6 { get; set; }//88 public uint Unused7 { get; set; }//92 - public override string ToString() - { - return "CExtensionDefWindDisturbance - " + name.ToString(); - } + public override readonly string ToString() => $"CExtensionDefWindDisturbance - {name}"; } - [TC(typeof(EXP))] public class MCExtensionDefWindDisturbance : MetaWrapper + [TC(typeof(EXP))] + public class MCExtensionDefWindDisturbance : MetaWrapper { public CExtensionDefWindDisturbance _Data; - public CExtensionDefWindDisturbance Data { get { return _Data; } } + public CExtensionDefWindDisturbance Data => _Data; - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefWindDisturbance); - return mb.AddItemPtr(MetaName.CExtensionDefWindDisturbance, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefWindDisturbance, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString(); - } + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CExtensionDefProcObject //80 bytes, Key:3965391891 + [TC(typeof(EXP))] + public struct CExtensionDefProcObject //80 bytes, Key:3965391891 { public uint Unused0 { get; set; }//0 public uint Unused1 { get; set; }//4 @@ -3899,39 +3816,28 @@ namespace CodeWalker.GameFiles public uint flags { get; set; } //72 72: UnsignedInt: 0: flags public uint Unused4 { get; set; }//76 - public override string ToString() - { - return "CExtensionDefProcObject - " + name.ToString(); - } + public override readonly string ToString() => $"CExtensionDefProcObject - {name}"; } + [TC(typeof(EXP))] public class MCExtensionDefProcObject : MetaWrapper { public CExtensionDefProcObject _Data; public CExtensionDefProcObject Data { get { return _Data; } } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CExtensionDefProcObject); - return mb.AddItemPtr(MetaName.CExtensionDefProcObject, _Data); + return mb.AddItemPtr(MetaName.CExtensionDefProcObject, in _Data); } - public override string Name - { - get - { - return _Data.name.ToString(); - } - } + public override string Name => _Data.name.ToString(); - public override string ToString() - { - return _Data.ToString(); - } + public override string ToString() => _Data.ToString(); } [TC(typeof(EXP))] public struct rage__phVerletClothCustomBounds //32 bytes, Key:2075461750 @@ -3940,8 +3846,9 @@ namespace CodeWalker.GameFiles 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} + public Array_Structure CollisionData; //16 16: Array: 0: CollisionData {0: Structure: SectionUNKNOWN1: 256} } + [TC(typeof(EXP))] public class Mrage__phVerletClothCustomBounds : MetaWrapper { public rage__phVerletClothCustomBounds _Data; @@ -3949,17 +3856,17 @@ namespace CodeWalker.GameFiles public Mrage__phCapsuleBoundDef[] CollisionData { get; set; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); - var cdata = MetaTypes.ConvertDataArray(meta, MetaName.rage__phCapsuleBoundDef, _Data.CollisionData); + var cdata = MetaTypes.ConvertDataArray(meta, MetaName.rage__phCapsuleBoundDef, in _Data.CollisionData); if (cdata != null) { CollisionData = new Mrage__phCapsuleBoundDef[cdata.Length]; for (int i = 0; i < cdata.Length; i++) { - CollisionData[i] = new Mrage__phCapsuleBoundDef(meta, cdata[i]); + CollisionData[i] = new Mrage__phCapsuleBoundDef(meta, in cdata[i]); } } } @@ -3972,18 +3879,15 @@ namespace CodeWalker.GameFiles } mb.AddStructureInfo(MetaName.rage__phVerletClothCustomBounds); - return mb.AddItemPtr(MetaName.rage__phVerletClothCustomBounds, _Data); + return mb.AddItemPtr(MetaName.rage__phVerletClothCustomBounds, in _Data); } - public override string ToString() - { - return "rage__phVerletClothCustomBounds - " + _Data.name.ToString() + " (" + (CollisionData?.Length ?? 0).ToString() + " CollisionData)"; - } + public override string ToString() => $"rage__phVerletClothCustomBounds - {_Data.name} ({CollisionData?.Length ?? 0} CollisionData)"; } [TC(typeof(EXP))] public struct rage__phCapsuleBoundDef //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 CharPointer OwnerName; //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 @@ -3998,23 +3902,25 @@ namespace CodeWalker.GameFiles public uint Unused3 { get; set; }//88 public uint Unused4 { get; set; }//92 } - [TC(typeof(EXP))] public class Mrage__phCapsuleBoundDef : MetaWrapper + + [TC(typeof(EXP))] + public class Mrage__phCapsuleBoundDef : MetaWrapper { public rage__phCapsuleBoundDef _Data; - public rage__phCapsuleBoundDef Data { get { return _Data; } } + public rage__phCapsuleBoundDef Data => _Data; public string OwnerName { get; set; } public Mrage__phCapsuleBoundDef() { } - public Mrage__phCapsuleBoundDef(Meta meta, rage__phCapsuleBoundDef s) + public Mrage__phCapsuleBoundDef(Meta meta, in rage__phCapsuleBoundDef s) { _Data = s; - OwnerName = MetaTypes.GetString(meta, _Data.OwnerName); + OwnerName = MetaTypes.GetString(meta, in _Data.OwnerName); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - OwnerName = MetaTypes.GetString(meta, _Data.OwnerName); + MetaTypes.TryGetData(meta, in ptr, out _Data); + OwnerName = MetaTypes.GetString(meta, in _Data.OwnerName); } public override MetaPOINTER Save(MetaBuilder mb) @@ -4026,12 +3932,12 @@ namespace CodeWalker.GameFiles mb.AddEnumInfo(MetaName.rage__phCapsuleBoundDef__enCollisionBoundDef); mb.AddStructureInfo(MetaName.rage__phCapsuleBoundDef); - return mb.AddItemPtr(MetaName.rage__phCapsuleBoundDef, _Data); + return mb.AddItemPtr(MetaName.rage__phCapsuleBoundDef, in _Data); } public override string ToString() { - return "rage__phCapsuleBoundDef - " + OwnerName; + return $"rage__phCapsuleBoundDef - {OwnerName}"; } } @@ -4064,19 +3970,10 @@ namespace CodeWalker.GameFiles public uint Unused9 { get; set; }//60 - public Vector2I Dimensions - { - get - { - return new Vector2I((MaxCellX - MinCellX)+1, (MaxCellY - MinCellY)+1); - } - } + public readonly Vector2I Dimensions => new Vector2I((MaxCellX - MinCellX) + 1, (MaxCellY - MinCellY) + 1); public Vector2 Scale { - get - { - return new Vector2(CellDimX, CellDimY); - } + get => new Vector2(CellDimX, CellDimY); set { CellDimX = value.X; @@ -4085,10 +3982,7 @@ namespace CodeWalker.GameFiles } public Vector2 Min { - get - { - return new Vector2(MinCellX, MinCellY) * Scale; - } + get => new Vector2(MinCellX, MinCellY) * Scale; set { var gv = value / Scale; @@ -4098,10 +3992,7 @@ namespace CodeWalker.GameFiles } public Vector2 Max { - get - { - return new Vector2(MaxCellX, MaxCellY) * Scale; - } + get => new Vector2(MaxCellX, MaxCellY) * Scale; set { var gv = value / Scale; @@ -4120,12 +4011,10 @@ namespace CodeWalker.GameFiles return x.Equals(y); } - public override bool Equals(object obj) + public override readonly bool Equals(object obj) { - if (obj is null || obj is not rage__spdGrid2D arrObj) - return false; - - return arrObj.MaxCellX == this.MaxCellX + return obj is rage__spdGrid2D arrObj + && arrObj.MaxCellX == this.MaxCellX && arrObj.MaxCellY == this.MaxCellY && arrObj.MinCellX == this.MinCellX && arrObj.MinCellY == this.MinCellY @@ -4143,7 +4032,7 @@ namespace CodeWalker.GameFiles && arrObj.Unused9 == this.Unused9; } - public override int GetHashCode() + public override readonly int GetHashCode() { int hashCode = 418850833; hashCode = hashCode * -1521134295 + Unused0.GetHashCode(); @@ -4166,19 +4055,30 @@ namespace CodeWalker.GameFiles } } - [TC(typeof(EXP))] public struct rage__spdAABB //32 bytes, Key:1158138379 + [TC(typeof(EXP))] + public struct rage__spdAABB //32 bytes, Key:1158138379 { 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() + public rage__spdAABB(in Vector3 _min, in Vector3 _max) { - return "min: " + min.ToString() + ", max: " + max.ToString(); + min = new Vector4(_min.X, _min.Y, _min.Z, 0); + max = new Vector4(_max.X, _max.Y, _max.Z, 0); } - public void SwapEnd() + + public readonly override string ToString() { - min = MetaTypes.SwapBytes(min); - max = MetaTypes.SwapBytes(max); + return $"min: {min}, max: {max}"; + } + public readonly rage__spdAABB SwapEnd() + { + return this with + { + min = MetaTypes.SwapBytes(min), + max = MetaTypes.SwapBytes(max), + }; + } } @@ -4196,76 +4096,28 @@ namespace CodeWalker.GameFiles - [TC(typeof(EXP))] public struct CScenarioPointRegion //SCENARIO YMT ROOT - in /scenario/ folder //376 bytes, Key:3501351821 + [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 CScenarioPointContainer Points; //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 Array_Structure EntityOverrides; //72 72: Array: 0: EntityOverrides//697469539 {0: Structure: CScenarioEntityOverride//4213733800: 256} public uint Unused5 { get; set; }//88 public uint Unused6 { get; set; }//92 - public CScenarioChainingGraph ChainingGraph { get; set; } //[PATHS] 96 96: Structure: CScenarioChainingGraph: ChainingGraph - 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 - - public override bool Equals(object obj) - { - return obj is CScenarioPointRegion region && - VersionNumber == region.VersionNumber && - Unused0 == region.Unused0 && - EqualityComparer.Default.Equals(Points, region.Points) && - Unused1 == region.Unused1 && - Unused2 == region.Unused2 && - Unused3 == region.Unused3 && - Unused4 == region.Unused4 && - EqualityComparer.Default.Equals(EntityOverrides, region.EntityOverrides) && - Unused5 == region.Unused5 && - Unused6 == region.Unused6 && - EqualityComparer.Default.Equals(ChainingGraph, region.ChainingGraph) && - EqualityComparer.Default.Equals(AccelGrid, region.AccelGrid) && - EqualityComparer.Default.Equals(Unk_3844724227, region.Unk_3844724227) && - EqualityComparer.Default.Equals(Clusters, region.Clusters) && - EqualityComparer.Default.Equals(LookUps, region.LookUps); - } - - public override int GetHashCode() - { - int hashCode = 1436693857; - hashCode = hashCode * -1521134295 + VersionNumber.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused0.GetHashCode(); - hashCode = hashCode * -1521134295 + Points.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused1.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused2.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused3.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused4.GetHashCode(); - hashCode = hashCode * -1521134295 + EntityOverrides.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused5.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused6.GetHashCode(); - hashCode = hashCode * -1521134295 + ChainingGraph.GetHashCode(); - hashCode = hashCode * -1521134295 + AccelGrid.GetHashCode(); - hashCode = hashCode * -1521134295 + Unk_3844724227.GetHashCode(); - hashCode = hashCode * -1521134295 + Clusters.GetHashCode(); - hashCode = hashCode * -1521134295 + LookUps.GetHashCode(); - return hashCode; - } - - public static bool operator ==(CScenarioPointRegion left, CScenarioPointRegion right) - { - return left.Equals(right); - } - - public static bool operator !=(CScenarioPointRegion left, CScenarioPointRegion right) - { - return !(left == right); - } + public CScenarioChainingGraph ChainingGraph; //[PATHS] 96 96: Structure: CScenarioChainingGraph: ChainingGraph + public rage__spdGrid2D AccelGrid; //184 184: Structure: rage__spdGrid2D: AccelGrid//3053155275 + public Array_ushort Unk_3844724227; //248 248: Array: 0: 3844724227 {0: UnsignedShort: 0: 256} + public Array_Structure Clusters; //264 264: Array: 0: Clusters//3587988394 {0: Structure: CScenarioPointCluster//750308016: 256} + public CScenarioPointLookUps LookUps; //280 280: Structure: CScenarioPointLookUps//3019621867: LookUps//1097626284 } - [TC(typeof(EXP))] public class MCScenarioPointRegion : MetaWrapper + + [TC(typeof(EXP))] + public class MCScenarioPointRegion : MetaWrapper { public YmtFile Ymt { get; set; } @@ -4281,26 +4133,26 @@ namespace CodeWalker.GameFiles public int VersionNumber { get { return _Data.VersionNumber; } set { _Data.VersionNumber = value; } } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - var data = MetaTypes.GetData(meta, ptr); - Load(meta, data); + MetaTypes.TryGetData(meta, in ptr, out var data); + Load(meta, in data); } - public void Load(Meta meta, CScenarioPointRegion data) + public void Load(Meta meta, in CScenarioPointRegion data) { _Data = data; - Points = new MCScenarioPointContainer(this, meta, _Data.Points); + Points = new MCScenarioPointContainer(this, meta, in _Data.Points); - var entOverrides = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioEntityOverride, _Data.EntityOverrides); + var entOverrides = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioEntityOverride, in _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]); + EntityOverrides[i] = new MCScenarioEntityOverride(this, meta, in entOverrides[i]); } } @@ -4308,7 +4160,7 @@ namespace CodeWalker.GameFiles Paths = new MCScenarioChainingGraph(this, meta, _Data.ChainingGraph); - var clusters = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioPointCluster, _Data.Clusters); + var clusters = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioPointCluster, in _Data.Clusters); if (clusters != null) { Clusters = new MCScenarioPointCluster[clusters.Length]; @@ -4318,9 +4170,9 @@ namespace CodeWalker.GameFiles } } - Unk_3844724227 = MetaTypes.GetUshortArray(meta, _Data.Unk_3844724227); + Unk_3844724227 = MetaTypes.GetUshortArray(meta, in _Data.Unk_3844724227); - LookUps = new MCScenarioPointLookUps(this, meta, _Data.LookUps); + LookUps = new MCScenarioPointLookUps(this, meta, in _Data.LookUps); #region data analysis @@ -4412,7 +4264,7 @@ namespace CodeWalker.GameFiles for (int i = 0; i < EntityOverrides.Length; i++) { var mcent = EntityOverrides[i]; - var cent = mcent.Data; + var cent = mcent._Data; var scps = mcent.GetCScenarioPoints(); if (scps != null) { @@ -4432,18 +4284,18 @@ namespace CodeWalker.GameFiles } - if (Paths != null) + if (Paths is not null) { var pd = new CScenarioChainingGraph(); var nodes = Paths.GetCNodes(); - if (nodes != null) + if (nodes is not null && nodes.Length > 0) { mb.AddStructureInfo(MetaName.CScenarioChainingNode); pd.Nodes = mb.AddItemArrayPtr(MetaName.CScenarioChainingNode, nodes); } var edges = Paths.GetCEdges(); - if (edges != null) + if (edges is not null && edges.Length > 0) { mb.AddStructureInfo(MetaName.CScenarioChainingEdge); mb.AddEnumInfo(MetaName.CScenarioChainingEdge__eAction); @@ -4451,11 +4303,11 @@ namespace CodeWalker.GameFiles mb.AddEnumInfo(MetaName.CScenarioChainingEdge__eNavSpeed); pd.Edges = mb.AddItemArrayPtr(MetaName.CScenarioChainingEdge, edges); } - if (Paths.Chains != null) + if (Paths.Chains is not null) { foreach (var chain in Paths.Chains) { - if (chain.EdgeIds != null) + if (chain.EdgeIds is not null) { chain._Data.EdgeIds = mb.AddUshortArrayPtr(chain.EdgeIds); } @@ -4466,7 +4318,7 @@ namespace CodeWalker.GameFiles } } var chains = Paths.GetCChains(); - if (chains != null) + if (chains is not null && chains.Length > 0) { mb.AddStructureInfo(MetaName.CScenarioChain); pd.Chains = mb.AddItemArrayPtr(MetaName.CScenarioChain, chains); @@ -4538,7 +4390,7 @@ namespace CodeWalker.GameFiles mb.AddString("Made with CodeWalker by dexyfex. " + DateTime.Now.ToString()); - return mb.AddItemPtr(MetaName.CScenarioPointRegion, _Data); + return mb.AddItemPtr(MetaName.CScenarioPointRegion, in _Data); } @@ -4621,31 +4473,21 @@ namespace CodeWalker.GameFiles - public override string Name - { - get - { - return Ymt?.ToString() ?? "CScenarioPointRegion"; - } - } - - public override string ToString() - { - return Name; - } + public override string Name => Ymt?.ToString() ?? "CScenarioPointRegion"; + public override string ToString() => 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 Array_Structure LoadSavePoints; //0 0: Array: 0: LoadSavePoints//3016741991 {0: Structure: CExtensionDefSpawnPoint: 256} + public Array_Structure MyPoints; //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 bool Equals(object obj) + public override readonly bool Equals(object obj) { return obj is CScenarioPointContainer container && EqualityComparer.Default.Equals(LoadSavePoints, container.LoadSavePoints) && @@ -4656,7 +4498,7 @@ namespace CodeWalker.GameFiles Unused3 == container.Unused3; } - public override int GetHashCode() + public override readonly int GetHashCode() { int hashCode = 746587205; hashCode = hashCode * -1521134295 + LoadSavePoints.GetHashCode(); @@ -4668,9 +4510,9 @@ namespace CodeWalker.GameFiles return hashCode; } - public override string ToString() + public override readonly string ToString() { - return LoadSavePoints.Count1.ToString() + " LoadSavePoints, " + MyPoints.Count1.ToString() + " MyPoints"; + return $"{LoadSavePoints.Count1} LoadSavePoints, {MyPoints.Count1} MyPoints"; } public static bool operator ==(CScenarioPointContainer left, CScenarioPointContainer right) @@ -4683,13 +4525,14 @@ namespace CodeWalker.GameFiles return !(left == right); } } - [TC(typeof(EXP))] public class MCScenarioPointContainer : MetaWrapper + [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 ref CScenarioPointContainer Data => ref _Data; public MCExtensionDefSpawnPoint[] LoadSavePoints { get; set; } public MCScenarioPoint[] MyPoints { get; set; } @@ -4701,7 +4544,7 @@ namespace CodeWalker.GameFiles { Region = region; } - public MCScenarioPointContainer(MCScenarioPointRegion region, Meta meta, CScenarioPointContainer d) + public MCScenarioPointContainer(MCScenarioPointRegion region, Meta meta, in CScenarioPointContainer d) { Region = region; _Data = d; @@ -4710,17 +4553,17 @@ namespace CodeWalker.GameFiles public void Init(Meta meta) { - var vLoadSavePoints = MetaTypes.ConvertDataArray(meta, MetaName.CExtensionDefSpawnPoint, _Data.LoadSavePoints); + var vLoadSavePoints = MetaTypes.ConvertDataArray(meta, MetaName.CExtensionDefSpawnPoint, in _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); + LoadSavePoints[i] = new MCExtensionDefSpawnPoint(Region, meta, in vLoadSavePoints[i], this); } } - var vMyPoints = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioPoint, _Data.MyPoints); + var vMyPoints = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioPoint, in _Data.MyPoints); if (vMyPoints != null) { MyPoints = new MCScenarioPoint[vMyPoints.Length]; @@ -4732,16 +4575,16 @@ namespace CodeWalker.GameFiles } } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); Init(meta); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioPointContainer); - return mb.AddItemPtr(MetaName.CScenarioPointContainer, _Data); + return mb.AddItemPtr(MetaName.CScenarioPointContainer, in _Data); } @@ -4845,23 +4688,12 @@ namespace CodeWalker.GameFiles } - - public override string Name - { - get - { - return "CScenarioPointContainer"; - } - } - - public override string ToString() - { - return _Data.ToString(); - } - + public override string Name => "CScenarioPointContainer"; + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CScenarioPoint //SCENARIO Point, similar to CExtensionDefSpawnPointOverride //64 bytes, Key:402442150 + [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 @@ -4887,12 +4719,13 @@ namespace CodeWalker.GameFiles public uint Unused9 { get; set; }//44 public Vector4 vPositionAndDirection { get; set; } //48 48: Float_XYZW: 0: vPositionAndDirection//4685037 - public override string ToString() + public override readonly string ToString() { return FloatUtil.GetVector4String(vPositionAndDirection); //iTimeStartOverride.ToString() + "-" + iTimeEndOverride.ToString();// + ", " + Flags.ToString(); } } - [TC(typeof(EXP))] public class MCScenarioPoint : MetaWrapper + [TC(typeof(EXP))] + public class MCScenarioPoint : MetaWrapper { [TC(typeof(EXP))] public MCScenarioPointContainer Container { get; set; } public MCScenarioPointRegion Region { get; set; } @@ -4907,7 +4740,7 @@ namespace CodeWalker.GameFiles get { return Quaternion.RotationAxis(Vector3.UnitZ, Direction); } set { - Vector3 dir = value.Multiply(Vector3.UnitX); + Vector3 dir = value.Multiply(in Vector3.UnitX); float dira = (float)Math.Atan2(dir.Y, dir.X); Direction = dira; } @@ -4929,7 +4762,7 @@ namespace CodeWalker.GameFiles 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 string TimeRange => $"{_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; } } @@ -4973,39 +4806,30 @@ namespace CodeWalker.GameFiles } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioPoint); - return mb.AddItemPtr(MetaName.CScenarioPoint, _Data); + return mb.AddItemPtr(MetaName.CScenarioPoint, in _Data); } - public override string Name - { - get - { - return (Type?.ToString() ?? "") + ": " + (ModelSet?.ToString() ?? ""); - } - } - - public override string ToString() - { - return Name + ": " + TimeRange; - } + public override string Name => $"{Type?.ToString() ?? string.Empty} : {ModelSet?.ToString() ?? string.Empty}"; + public override string ToString() => $"{Name}: {TimeRange}"; } - [TC(typeof(EXP))] public struct CScenarioEntityOverride //SCENARIO Entity Override //80 bytes, Key:1271200492 + [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 Vector3 EntityPosition; //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 Array_Structure ScenarioPoints; //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 @@ -5019,12 +4843,11 @@ namespace CodeWalker.GameFiles public uint Unused10 { get; set; }//72 public uint Unused11 { get; set; }//76 - public override string ToString() - { - return EntityType.ToString() + ", " + ScenarioPoints.Count1.ToString() + " ScenarioPoints"; - } + public override readonly string ToString() => $"{EntityType}, {ScenarioPoints.Count1} ScenarioPoints"; } - [TC(typeof(EXP))] public class MCScenarioEntityOverride : MetaWrapper + + [TC(typeof(EXP))] + public class MCScenarioEntityOverride : MetaWrapper { [TC(typeof(EXP))] public object Parent { get; set; } public MCScenarioPointRegion Region { get; set; } @@ -5050,7 +4873,7 @@ namespace CodeWalker.GameFiles _Data = copy.Data; } } - public MCScenarioEntityOverride(MCScenarioPointRegion region, Meta meta, CScenarioEntityOverride d) + public MCScenarioEntityOverride(MCScenarioPointRegion region, Meta meta, in CScenarioEntityOverride d) { Region = region; _Data = d; @@ -5060,22 +4883,22 @@ namespace CodeWalker.GameFiles public void Init(Meta meta) { - var scenarioPoints = MetaTypes.ConvertDataArray(meta, MetaName.CExtensionDefSpawnPoint, _Data.ScenarioPoints); + var scenarioPoints = MetaTypes.ConvertDataArray(meta, MetaName.CExtensionDefSpawnPoint, in _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] = new MCExtensionDefSpawnPoint(Region, meta, in scenarioPoints[i], this); ScenarioPoints[i].ParentPosition = Position; } } } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); Init(meta); } @@ -5091,7 +4914,7 @@ namespace CodeWalker.GameFiles _Data.ScenarioPoints = mb.AddWrapperArray(ScenarioPoints); } - return mb.AddItemPtr(MetaName.CScenarioEntityOverride, _Data); + return mb.AddItemPtr(MetaName.CScenarioEntityOverride, in _Data); } @@ -5145,25 +4968,16 @@ namespace CodeWalker.GameFiles - public override string Name - { - get - { - return "CScenarioEntityOverride " + _Data.EntityType.ToString(); - } - } - - public override string ToString() - { - return _Data.ToString(); - } + public override string Name => $"CScenarioEntityOverride {_Data.EntityType}"; + public override string ToString() => _Data.ToString(); } - [TC(typeof(EXP))] public struct CScenarioChainingGraph //SCENARIO PATH ARRAYS //88 bytes, Key:88255871 + [TC(typeof(EXP))] + public record struct CScenarioChainingGraph //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 Array_Structure Nodes; //0 0: Array: 0: Nodes {0: Structure: CScenarioChainingNode//3340683255: 256} + public Array_Structure Edges; //16 16: Array: 0: Edges {0: Structure: CScenarioChainingEdge//4255409560: 256} + public Array_Structure Chains; //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 @@ -5175,51 +4989,14 @@ namespace CodeWalker.GameFiles public uint Unused8 { get; set; }//80 public uint Unused9 { get; set; }//84 - public override string ToString() + public override readonly string ToString() { - return Nodes.Count1.ToString() + " Nodes, " + Edges.Count1.ToString() + " Edges, " + Chains.Count1.ToString() + " Chains"; - } - - public static bool operator !=(CScenarioChainingGraph x, CScenarioChainingGraph y) - { - return !x.Equals(y); - } - - public static bool operator ==(CScenarioChainingGraph x, CScenarioChainingGraph y) - { - return x.Equals(y); - } - - public override bool Equals(object obj) - { - if (obj is null || obj is not CScenarioChainingGraph arrObj) - return false; - - return arrObj.Nodes == this.Nodes - && arrObj.Edges == this.Edges - && arrObj.Chains == this.Chains; - } - - public override int GetHashCode() - { - int hashCode = -1851298727; - hashCode = hashCode * -1521134295 + Nodes.GetHashCode(); - hashCode = hashCode * -1521134295 + Edges.GetHashCode(); - hashCode = hashCode * -1521134295 + Chains.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused0.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused1.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused2.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused3.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused4.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused5.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused6.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused7.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused8.GetHashCode(); - hashCode = hashCode * -1521134295 + Unused9.GetHashCode(); - return hashCode; + return $"{Nodes.Count1} Nodes, {Edges.Count1} Edges, {Chains.Count1} Chains"; } } - [TC(typeof(EXP))] public class MCScenarioChainingGraph : MetaWrapper + + [TC(typeof(EXP))] + public class MCScenarioChainingGraph : MetaWrapper { public MCScenarioPointRegion Region { get; private set; } @@ -5241,7 +5018,7 @@ namespace CodeWalker.GameFiles public void Init(Meta meta) { - var pathnodes = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChainingNode, _Data.Nodes); + var pathnodes = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChainingNode, in _Data.Nodes); if (pathnodes != null) { Nodes = new MCScenarioChainingNode[pathnodes.Length]; @@ -5251,7 +5028,7 @@ namespace CodeWalker.GameFiles } } - var pathedges = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChainingEdge, _Data.Edges); + var pathedges = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChainingEdge, in _Data.Edges); if (pathedges != null) { Edges = new MCScenarioChainingEdge[pathedges.Length]; @@ -5261,7 +5038,7 @@ namespace CodeWalker.GameFiles } } - var pathchains = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChain, _Data.Chains); + var pathchains = MetaTypes.ConvertDataArray(meta, MetaName.CScenarioChain, in _Data.Chains); if (pathchains != null) { Chains = new MCScenarioChain[pathchains.Length]; @@ -5272,9 +5049,9 @@ namespace CodeWalker.GameFiles } } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); Init(meta); } @@ -5283,7 +5060,7 @@ namespace CodeWalker.GameFiles public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioChainingGraph); - return mb.AddItemPtr(MetaName.CScenarioChainingGraph, _Data); + return mb.AddItemPtr(MetaName.CScenarioChainingGraph, in _Data); } @@ -5294,11 +5071,12 @@ namespace CodeWalker.GameFiles public CScenarioChainingNode[] GetCNodes() { - if ((Nodes == null) || (Nodes.Length == 0)) return null; + 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; + r[i] = Nodes[i]._Data; } return r; } @@ -5495,7 +5273,8 @@ namespace CodeWalker.GameFiles } } - [TC(typeof(EXP))] public struct CScenarioChainingNode //SCENARIO PATH NODE //32 bytes, Key:1811784424 + [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 @@ -5508,8 +5287,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return - ScenarioType.ToString() + ", " + Unk_2602393771.ToString(); + return $"{ScenarioType}, {Unk_2602393771}"; } } [TC(typeof(EXP))] public class MCScenarioChainingNode : MetaWrapper @@ -5553,30 +5331,21 @@ namespace CodeWalker.GameFiles Type = copy.Type; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioChainingNode); - return mb.AddItemPtr(MetaName.CScenarioChainingNode, _Data); + return mb.AddItemPtr(MetaName.CScenarioChainingNode, in _Data); } - public override string Name - { - get - { - return "CScenarioChainingNode";// + _Data.Unk_2602393771.ToString(); - } - } + public override string Name => "CScenarioChainingNode"; - public override string ToString() - { - return _Data.ToString(); - } + public override string ToString() => _Data.ToString(); } @@ -5591,7 +5360,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return NodeIndexFrom.ToString() + ", " + NodeIndexTo.ToString() + ", " + Action.ToString() + ", " + NavMode.ToString() + ", " + NavSpeed.ToString(); + return $"{NodeIndexFrom}, {NodeIndexTo}, {Action}, {NavMode}, {NavSpeed}"; } } [TC(typeof(EXP))] public class MCScenarioChainingEdge : MetaWrapper @@ -5627,28 +5396,22 @@ namespace CodeWalker.GameFiles NodeTo = copy.NodeTo;//these should be updated later... } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioChainingEdge); - return mb.AddItemPtr(MetaName.CScenarioChainingEdge, _Data); + return mb.AddItemPtr(MetaName.CScenarioChainingEdge, in _Data); } - public override string Name - { - get - { - return "CScenarioChainingEdge"; - } - } + public override string Name => "CScenarioChainingEdge"; public override string ToString() { - return Action.ToString() + ", " + NavMode.ToString() + ", " + NavSpeed.ToString(); + return $"{Action}, {NavMode}, {NavSpeed}"; } } @@ -5659,15 +5422,15 @@ namespace CodeWalker.GameFiles 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 Array_ushort EdgeIds; //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() + public override readonly string ToString() { - return Unk_1156691834.ToString() + ": " + EdgeIds.Count1.ToString() + " EdgeIds"; + return $"{Unk_1156691834}: {EdgeIds.Count1} EdgeIds"; } } [TC(typeof(EXP))] public class MCScenarioChain : MetaWrapper @@ -5689,13 +5452,13 @@ namespace CodeWalker.GameFiles { Region = region; _Data = d; - EdgeIds = MetaTypes.GetUshortArray(meta, _Data.EdgeIds); + EdgeIds = MetaTypes.GetUshortArray(meta, in _Data.EdgeIds); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - EdgeIds = MetaTypes.GetUshortArray(meta, _Data.EdgeIds); + MetaTypes.TryGetData(meta, in ptr, out _Data); + EdgeIds = MetaTypes.GetUshortArray(meta, in _Data.EdgeIds); } @@ -5756,7 +5519,7 @@ namespace CodeWalker.GameFiles //} mb.AddStructureInfo(MetaName.CScenarioChain); - return mb.AddItemPtr(MetaName.CScenarioChain, _Data); + return mb.AddItemPtr(MetaName.CScenarioChain, in _Data); } public override string Name @@ -5776,14 +5539,14 @@ namespace CodeWalker.GameFiles [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 CScenarioPointContainer Points; //0 0: Structure: CScenarioPointContainer//2380938603: Points//702683191 + public rage__spdSphere ClusterSphere; //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() + public override readonly string ToString() { return Points.ToString();// + ", Sphere: " + ClusterSphere.ToString(); } @@ -5830,18 +5593,18 @@ namespace CodeWalker.GameFiles Points = new MCScenarioPointContainer(region); Points.Parent = this; } - public MCScenarioPointCluster(MCScenarioPointRegion region, Meta meta, CScenarioPointCluster d) + public MCScenarioPointCluster(MCScenarioPointRegion region, Meta meta, in CScenarioPointCluster d) { Region = region; _Data = d; - Points = new MCScenarioPointContainer(region, meta, d.Points); + Points = new MCScenarioPointContainer(region, meta, in d.Points); Points.Parent = this; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); - Points = new MCScenarioPointContainer(Region, meta, _Data.Points); + MetaTypes.TryGetData(meta, in ptr, out _Data); + Points = new MCScenarioPointContainer(Region, meta, in _Data.Points); Points.Parent = this; } @@ -5889,7 +5652,7 @@ namespace CodeWalker.GameFiles _Data.Points = new CScenarioPointContainer(); } - return mb.AddItemPtr(MetaName.CScenarioPointCluster, _Data); + return mb.AddItemPtr(MetaName.CScenarioPointCluster, in _Data); } public override string Name @@ -5913,12 +5676,12 @@ namespace CodeWalker.GameFiles 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() + public override readonly string ToString() { return "CScenarioPointLookUps"; } - public override bool Equals(object obj) + public override readonly bool Equals(object obj) { return obj is CScenarioPointLookUps ups && EqualityComparer.Default.Equals(TypeNames, ups.TypeNames) && @@ -5929,7 +5692,7 @@ namespace CodeWalker.GameFiles EqualityComparer.Default.Equals(RequiredIMapNames, ups.RequiredIMapNames); } - public override int GetHashCode() + public override readonly int GetHashCode() { int hashCode = -153113894; hashCode = hashCode * -1521134295 + TypeNames.GetHashCode(); @@ -5956,7 +5719,7 @@ namespace CodeWalker.GameFiles public MCScenarioPointRegion Region { get; set; } public CScenarioPointLookUps _Data; - public CScenarioPointLookUps Data { get { return _Data; } set { _Data = value; } } + public CScenarioPointLookUps Data => _Data; public MetaHash[] TypeNames { get; set; } //scenario type hashes used by points public MetaHash[] PedModelSetNames { get; set; } //ped names @@ -5971,7 +5734,7 @@ namespace CodeWalker.GameFiles { Region = region; } - public MCScenarioPointLookUps(MCScenarioPointRegion region, Meta meta, CScenarioPointLookUps d) + public MCScenarioPointLookUps(MCScenarioPointRegion region, Meta meta, in CScenarioPointLookUps d) { Region = region; _Data = d; @@ -5988,16 +5751,16 @@ namespace CodeWalker.GameFiles RequiredIMapNames = MetaTypes.GetHashArray(meta, _Data.RequiredIMapNames); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); Init(meta); } public override MetaPOINTER Save(MetaBuilder mb) { mb.AddStructureInfo(MetaName.CScenarioPointLookUps); - return mb.AddItemPtr(MetaName.CScenarioPointLookUps, _Data); + return mb.AddItemPtr(MetaName.CScenarioPointLookUps, in _Data); } public override string Name @@ -6015,69 +5778,51 @@ namespace CodeWalker.GameFiles } - - - - - - - - - - - - - - - - - - - - - [TC(typeof(EXP))] public struct CCompositeEntityType //304 bytes, Key:659539004 dex: composite entity type - ytyp // Tom: des_ destruction + [TC(typeof(EXP))] + public readonly 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 ArrayOfChars64 Name { get; init; } //0 0: ArrayOfChars: 64: Name + public float lodDist { get; init; } //64 64: Float: 0: lodDist + public uint flags { get; init; } //68 68: UnsignedInt: 0: flags + public uint specialAttribute { get; init; } //72 72: UnsignedInt: 0: specialAttribute + public uint Unused0 { get; init; }//76 + public Vector3 bbMin { get; init; } //80 80: Float_XYZ: 0: bbMin + public float Unused1 { get; init; }//92 + public Vector3 bbMax { get; init; } //96 96: Float_XYZ: 0: bbMax + public float Unused2 { get; init; }//108 + public Vector3 bsCentre { get; init; } //112 112: Float_XYZ: 0: bsCentre + public float Unused3 { get; init; }//124 + public float bsRadius { get; init; } //128 128: Float: 0: bsRadius + public uint Unused4 { get; init; }//132 + public ArrayOfChars64 StartModel { get; init; } //136 136: ArrayOfChars: 64: StartModel + public ArrayOfChars64 EndModel { get; init; } //200 200: ArrayOfChars: 64: EndModel + public MetaHash StartImapFile { get; init; } //264 264: Hash: 0: StartImapFile//2462971690 + public MetaHash EndImapFile { get; init; } //268 268: Hash: 0: EndImapFile//2059586669 + public MetaHash PtFxAssetName { get; init; } //272 272: Hash: 0: PtFxAssetName//2497993358 + public uint Unused5 { get; init; }//276 + public Array_Structure Animations { get; init; } //280 280: Array: 0: Animations {0: Structure: 1980345114: 256} + public uint Unused6 { get; init; }//296 + public uint Unused7 { get; init; }//300 public override string ToString() { - return Name.ToString() + ", " + StartModel.ToString() + ", " + EndModel.ToString() + ", " + - StartImapFile.ToString() + ", " + EndImapFile.ToString() + ", " + PtFxAssetName.ToString(); + return $"{Name}, {StartModel}, {EndModel}, {StartImapFile}, {EndImapFile}, {PtFxAssetName}"; } } - [TC(typeof(EXP))] public struct CCompEntityAnims //216 bytes, Key:4110496011 //destruction animations? + [TC(typeof(EXP))] + public readonly struct CCompEntityAnims //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} + public ArrayOfChars64 AnimDict { get; init; } //0 0: ArrayOfChars: 64: AnimDict + public ArrayOfChars64 AnimName { get; init; } //64 64: ArrayOfChars: 64: AnimName + public ArrayOfChars64 AnimatedModel { get; init; } //128 128: ArrayOfChars: 64: AnimatedModel + public float punchInPhase { get; init; } //192 192: Float: 0: punchInPhase//3142377407 + public float punchOutPhase { get; init; } //196 196: Float: 0: punchOutPhase//2164219370 + public Array_Structure effectsData { get; init; } //200 200: Array: 0: effectsData {0: Structure: 3430328684: 256} } - [TC(typeof(EXP))] public struct CCompEntityEffectsData //160 bytes, Key:1724963966 //destruction animation effects data + [TC(typeof(EXP))] + public struct CCompEntityEffectsData //160 bytes, Key:1724963966 //destruction animation effects data { public uint fxType { get; set; } //0 0: UnsignedInt: 0: fxType public uint Unused0 { get; set; }//4 @@ -6104,18 +5849,8 @@ namespace CodeWalker.GameFiles public uint Unused7 { get; set; }//156 } - - - - - - - - - - - - [TC(typeof(EXP))] public struct CStreamingRequestRecord //40 bytes, Key:3825587854 //SRL YMT ROOT - in /streaming/ folder + [TC(typeof(EXP))] + public struct CStreamingRequestRecord //40 bytes, Key:3825587854 //SRL YMT ROOT - in /streaming/ folder { public Array_Structure Frames { get; set; } //0 0: Array: 0: Frames {0: Structure: CStreamingRequestFrame: 256} public Array_Structure CommonSets { get; set; } //16 16: Array: 0: CommonSets {0: Structure: CStreamingRequestCommonSet: 256} @@ -6125,7 +5860,8 @@ namespace CodeWalker.GameFiles public uint Unused2 { get; set; }//36 } - [TC(typeof(EXP))] public struct CStreamingRequestFrame //112 bytes, Key:1112444512 //SRL frame... + [TC(typeof(EXP))] + 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} @@ -6141,7 +5877,8 @@ namespace CodeWalker.GameFiles public uint Unused4 { get; set; }//108 } - [TC(typeof(EXP))] public struct CStreamingRequestFrame_v2 //96 bytes, Key:3672937465 //SRL frame... + [TC(typeof(EXP))] + 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} @@ -6227,33 +5964,36 @@ namespace CodeWalker.GameFiles - [TC(typeof(EXP))] public struct CPedVariationInfo : IPsoSwapEnd //112 bytes, Key:4030871161 //COMPONENT PEDS YMT ROOT - in componentpeds .rpf's + [TC(typeof(EXP))] public struct CPedVariationInfo : IPsoSwapEnd //112 bytes, Key:4030871161 //COMPONENT PEDS YMT ROOT - in componentpeds .rpf's { public byte bHasTexVariations { get; set; } //0 0: Boolean: 0: bHasTexVariations public byte bHasDrawblVariations { get; set; } //1 1: Boolean: 0: bHasDrawblVariations public byte bHasLowLODs { get; set; } //2 2: Boolean: 0: bHasLowLODs public byte bIsSuperLOD { get; set; } //3 3: Boolean: 0: bIsSuperLOD - public ArrayOfBytes12 availComp { get; set; } //4 4: ArrayOfBytes: 12: availComp - public Array_Structure aComponentData3 { get; set; } //16 16: Array: 0: aComponentData3 {0: Structure: CPVComponentData: 256} - public Array_Structure aSelectionSets { get; set; } //32 32: Array: 0: aSelectionSets {0: Structure: CPedSelectionSet: 256} - public Array_Structure compInfos { get; set; } //48 48: Array: 0: compInfos {0: Structure: CComponentInfo: 256} - public CPedPropInfo propInfo { get; set; } //64 64: Structure: CPedPropInfo: propInfo + public ArrayOfBytes12 availComp; //4 4: ArrayOfBytes: 12: availComp + public Array_Structure aComponentData3; //16 16: Array: 0: aComponentData3 {0: Structure: CPVComponentData: 256} + public Array_Structure aSelectionSets; //32 32: Array: 0: aSelectionSets {0: Structure: CPedSelectionSet: 256} + public Array_Structure compInfos; //48 48: Array: 0: compInfos {0: Structure: CComponentInfo: 256} + public CPedPropInfo propInfo; //64 64: Structure: CPedPropInfo: propInfo public MetaHash dlcName { get; set; } //104 104: Hash: 0: dlcName public uint Unused0 { get; set; }//108 - public void SwapEnd() + public CPedVariationInfo SwapEnd() { - aComponentData3 = aComponentData3.SwapEnd(); - aSelectionSets = aSelectionSets.SwapEnd(); - compInfos = compInfos.SwapEnd(); - propInfo = propInfo.SwapEnd(); - dlcName = MetaTypes.SwapBytes(dlcName); + return this with + { + aComponentData3 = aComponentData3.SwapEnd(), + aSelectionSets = aSelectionSets.SwapEnd(), + compInfos = compInfos.SwapEnd(), + propInfo = propInfo.SwapEnd(), + dlcName = MetaTypes.SwapBytes(dlcName), + }; } } [TC(typeof(EXP))] public class MCPedVariationInfo : MetaWrapper { public CPedVariationInfo _Data; - public CPedVariationInfo Data { get { return _Data; } } + public CPedVariationInfo Data => _Data; public byte[] ComponentIndices { get; set; } public MCPVComponentData[] ComponentData3 { get; set; } @@ -6262,12 +6002,12 @@ namespace CodeWalker.GameFiles public MCPedPropInfo PropInfo { get; set; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - var data = MetaTypes.GetData(meta, ptr); - Load(meta, data); + MetaTypes.TryGetData(meta, in ptr, out var data); + Load(meta, in data); } - public void Load(Meta meta, CPedVariationInfo data) + public void Load(Meta meta, in CPedVariationInfo data) { //maybe see https://github.com/emcifuntik/altv-cloth-tool/blob/master/AltTool/ResourceBuilder.cs @@ -6277,17 +6017,17 @@ namespace CodeWalker.GameFiles ComponentIndices = data.availComp.GetArray(); - var aComponentData3 = MetaTypes.ConvertDataArray(meta, MetaName.CPVComponentData, _Data.aComponentData3); + var aComponentData3 = MetaTypes.ConvertDataArray(meta, MetaName.CPVComponentData, in _Data.aComponentData3); if (aComponentData3 != null) { ComponentData3 = new MCPVComponentData[aComponentData3.Length]; for (int i = 0; i < aComponentData3.Length; i++) { - ComponentData3[i] = new MCPVComponentData(meta, aComponentData3[i], this); + ComponentData3[i] = new MCPVComponentData(meta, in aComponentData3[i], this); } } - var vSelectionSets = MetaTypes.ConvertDataArray(meta, MetaName.CPedSelectionSet, _Data.aSelectionSets); + var vSelectionSets = MetaTypes.ConvertDataArray(meta, MetaName.CPedSelectionSet, in _Data.aSelectionSets); if (vSelectionSets != null) { SelectionSets = new MCPedSelectionSet[vSelectionSets.Length]; @@ -6297,24 +6037,24 @@ namespace CodeWalker.GameFiles } } - var vCompInfos = MetaTypes.ConvertDataArray(meta, MetaName.CComponentInfo, _Data.compInfos); + var vCompInfos = MetaTypes.ConvertDataArray(meta, MetaName.CComponentInfo, in _Data.compInfos); if (vCompInfos != null) { CompInfos = new MCComponentInfo[vCompInfos.Length]; for (int i = 0; i < vCompInfos.Length; i++) { - CompInfos[i] = new MCComponentInfo(meta, vCompInfos[i], this); + CompInfos[i] = new MCComponentInfo(meta, in vCompInfos[i], this); } } - PropInfo = new MCPedPropInfo(meta, data.propInfo, this); + PropInfo = new MCPedPropInfo(meta, in data.propInfo, this); for (int i = 0; i < 12; i++) //set the component type indices on all the component variants, for them to use { var compInd = ComponentIndices[i]; - if ((compInd > 0) && (compInd < ComponentData3?.Length)) + if ((compInd >= 0) && (compInd < ComponentData3?.Length)) { var compvar = ComponentData3[compInd]; compvar.ComponentType = i; @@ -6331,10 +6071,16 @@ namespace CodeWalker.GameFiles } - + foreach(var component in ComponentData3) + { + if (component.ComponentType == -1) + { + Console.WriteLine($"No component type found for {component.Name} {component.Owner.Name}"); + } + } } - public void Load(PsoFile pso, CPedVariationInfo data) + public void Load(PsoFile pso, in CPedVariationInfo data) { //TODO! } @@ -6345,37 +6091,44 @@ namespace CodeWalker.GameFiles } - public MCPVComponentData GetComponentData(int componentType) + public MCPVComponentData? GetComponentData(int componentType) { - if ((componentType < 0) || (componentType > 11)) return null; - if (ComponentIndices == null) return null; + if ((componentType < 0) || (componentType > 11)) + throw new ArgumentOutOfRangeException(nameof(componentType), componentType, "Value should fall in range 0-11"); + if (ComponentIndices is null || ComponentData3 is null) + return null; + var index = ComponentIndices[componentType]; - if (index > ComponentData3?.Length) return null; + // Apparantly some files (like mp_f_stunt_01) have more datas than indices for some reason? + // I don't know if this is a mistake made by them or that this data is used for something else, but for now just discard it + if (index > ComponentData3?.Length || ComponentData3[index].ComponentType == -1) + return null; return ComponentData3[index]; } } - [TC(typeof(EXP))] public struct CPVComponentData //24 bytes, Key:2024084511 //COMPONENT PEDS component variations item + [TC(typeof(EXP))] + public readonly struct CPVComponentData //24 bytes, Key:2024084511 //COMPONENT PEDS component variations item { - public byte numAvailTex { get; set; } //0 0: UnsignedByte: 0: numAvailTex - public byte Unused0 { get; set; }//1 - public ushort Unused1 { get; set; }//2 - public uint Unused2 { get; set; }//4 - public Array_Structure aDrawblData3 { get; set; } //8 8: Array: 0: aDrawblData3 {0: Structure: CPVDrawblData: 256} + public byte numAvailTex { get; init; } //0 0: UnsignedByte: 0: numAvailTex + public byte Unused0 { get; init; }//1 + public ushort Unused1 { get; init; }//2 + public uint Unused2 { get; init; }//4 + public readonly Array_Structure aDrawblData3; //8 8: Array: 0: aDrawblData3 {0: Structure: CPVDrawblData: 256} } [TC(typeof(EXP))] public class MCPVComponentData : MetaWrapper { public MCPedVariationInfo Owner { get; set; } public CPVComponentData _Data; - public CPVComponentData Data { get { return _Data; } } + public CPVComponentData Data => _Data; - public byte numAvailTex { get { return _Data.numAvailTex; } set { _Data.numAvailTex = value; } } + public byte numAvailTex => _Data.numAvailTex; public MCPVDrawblData[] DrawblData3 { get; set; } - public int ComponentType { get; set; } = 0; + public int ComponentType { get; set; } = -1; public static string[] ComponentTypeNames { get; } = { "head",//0 @@ -6394,7 +6147,7 @@ namespace CodeWalker.GameFiles public MCPVComponentData() { } - public MCPVComponentData(Meta meta, CPVComponentData data, MCPedVariationInfo owner) + public MCPVComponentData(Meta meta, in CPVComponentData data, MCPedVariationInfo owner) { _Data = data; Owner = owner; @@ -6404,21 +6157,21 @@ namespace CodeWalker.GameFiles private void Init(Meta meta) { - var aDrawblData3 = MetaTypes.ConvertDataArray(meta, MetaName.CPVDrawblData, _Data.aDrawblData3); + var aDrawblData3 = MetaTypes.ConvertDataArray(meta, MetaName.CPVDrawblData, in _Data.aDrawblData3); if (aDrawblData3 != null) { DrawblData3 = new MCPVDrawblData[aDrawblData3.Length]; for (int i = 0; i < aDrawblData3.Length; i++) { - DrawblData3[i] = new MCPVDrawblData(meta, aDrawblData3[i], this, i); + DrawblData3[i] = new MCPVDrawblData(meta, in aDrawblData3[i], this, i); } } } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { - _Data = MetaTypes.GetData(meta, ptr); + MetaTypes.TryGetData(meta, in ptr, out _Data); Init(meta); } @@ -6429,35 +6182,36 @@ namespace CodeWalker.GameFiles public override string ToString() { - string r = (ComponentType < 12) ? ComponentTypeNames[ComponentType] : "error"; - return r + " : " + DrawblData3?.Length.ToString() ?? base.ToString(); + string r = (ComponentType < 12 && ComponentType >= 0) ? ComponentTypeNames[ComponentType] : "error"; + return r + " : " + (DrawblData3?.Length.ToString() ?? base.ToString()); } } - [TC(typeof(EXP))] public struct CPVDrawblData //48 bytes, Key:124073662 //COMPONENT PEDS drawable info + [TC(typeof(EXP))] + public readonly struct CPVDrawblData //48 bytes, Key:124073662 //COMPONENT PEDS drawable info { - public byte propMask { get; set; } //0 0: UnsignedByte: 0: propMask - public byte numAlternatives { get; set; } //1 1: UnsignedByte: 0: 2806194106 - public ushort Unused0 { get; set; }//2 - public uint Unused1 { get; set; }//4 - public Array_Structure aTexData { get; set; } //8 8: Array: 0: aTexData {0: Structure: CPVTextureData: 256} - public CPVDrawblData__CPVClothComponentData clothData { get; set; } //24 24: Structure: CPVDrawblData__CPVClothComponentData: clothData + public byte propMask { get; init; } //0 0: UnsignedByte: 0: propMask + public byte numAlternatives { get; init; } //1 1: UnsignedByte: 0: 2806194106 + public ushort Unused0 { get; init; }//2 + public uint Unused1 { get; init; }//4 + public readonly Array_Structure aTexData; //8 8: Array: 0: aTexData {0: Structure: CPVTextureData: 256} + public readonly CPVDrawblData__CPVClothComponentData clothData; //24 24: Structure: CPVDrawblData__CPVClothComponentData: clothData } [TC(typeof(EXP))] public class MCPVDrawblData : MetaWrapper { public MCPVComponentData Owner { get; set; } public CPVDrawblData _Data; - public CPVDrawblData Data { get { return _Data; } } + public CPVDrawblData Data => _Data; public CPVTextureData[] TexData { get; set; } public int ComponentType { get; set; } = 0; public int DrawableIndex { get; set; } = 0; - public int PropMask { get { return _Data.propMask; } } - public int NumAlternatives { get { return _Data.numAlternatives; } } + public int PropMask => _Data.propMask; + public int NumAlternatives => _Data.numAlternatives; - public int PropType { get { return (PropMask >> 4) & 3; } } + public int PropType => (PropMask >> 4) & 3; public string GetDrawableName(int altnum = 0) { @@ -6539,17 +6293,17 @@ namespace CodeWalker.GameFiles public MCPVDrawblData() { } - public MCPVDrawblData(Meta meta, CPVDrawblData data, MCPVComponentData owner, int index) + public MCPVDrawblData(Meta meta, in CPVDrawblData data, MCPVComponentData owner, int index) { _Data = data; Owner = owner; DrawableIndex = index; - TexData = MetaTypes.ConvertDataArray(meta, MetaName.CPVTextureData, _Data.aTexData); + TexData = MetaTypes.ConvertDataArray(meta, MetaName.CPVTextureData, in _Data.aTexData); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { throw new NotImplementedException(); } @@ -6565,41 +6319,44 @@ namespace CodeWalker.GameFiles } } - [TC(typeof(EXP))] public struct CPVTextureData //3 bytes, Key:4272717794 //COMPONENT PEDS (cloth?) aTexData + [TC(typeof(EXP))] + public struct CPVTextureData //3 bytes, Key:4272717794 //COMPONENT PEDS (cloth?) aTexData { public byte texId { get; set; } //0 0: UnsignedByte: 0: texId public byte distribution { get; set; } //1 1: UnsignedByte: 0: distribution//914976023 public byte Unused0 { get; set; }//2 } - [TC(typeof(EXP))] public struct CPVDrawblData__CPVClothComponentData //24 bytes, Key:508935687 //COMPONENT PEDS clothData + [TC(typeof(EXP))] + public readonly struct CPVDrawblData__CPVClothComponentData //24 bytes, Key:508935687 //COMPONENT PEDS clothData { - public byte ownsCloth { get; set; } //0 0: Boolean: 0: ownsCloth - public byte Unused0 { get; set; }//1 - public ushort Unused1 { get; set; }//2 - public uint Unused2 { get; set; }//4 - 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 byte ownsCloth { get; init; } //0 0: Boolean: 0: ownsCloth + public byte Unused0 { get; init; }//1 + public ushort Unused1 { get; init; }//2 + public uint Unused2 { get; init; }//4 + public uint Unused3 { get; init; }//8 + public uint Unused4 { get; init; }//12 + public uint Unused5 { get; init; }//16 + public uint Unused6 { get; init; }//20 } - [TC(typeof(EXP))] public struct CPedSelectionSet //48 bytes, Key:3120284999 //COMPONENT PEDS + [TC(typeof(EXP))] + public readonly struct CPedSelectionSet //48 bytes, Key:3120284999 //COMPONENT PEDS { - public MetaHash name { get; set; } //0 0: Hash: 0: name - public ArrayOfBytes12 compDrawableId { get; set; } //4 4: ArrayOfBytes: 12: compDrawableId - public ArrayOfBytes12 compTexId { get; set; } //16 16: ArrayOfBytes: 12: compTexId - public ArrayOfBytes6 propAnchorId { get; set; } //28 28: ArrayOfBytes: 6: propAnchorId - public ArrayOfBytes6 propDrawableId { get; set; } //34 34: ArrayOfBytes: 6: propDrawableId - public ArrayOfBytes6 propTexId { get; set; } //40 40: ArrayOfBytes: 6: propTexId - public ushort Unused0 { get; set; }//46 + public MetaHash name { get; init; } //0 0: Hash: 0: name + public ArrayOfBytes12 compDrawableId { get; init; } //4 4: ArrayOfBytes: 12: compDrawableId + public ArrayOfBytes12 compTexId { get; init; } //16 16: ArrayOfBytes: 12: compTexId + public ArrayOfBytes6 propAnchorId { get; init; } //28 28: ArrayOfBytes: 6: propAnchorId + public ArrayOfBytes6 propDrawableId { get; init; } //34 34: ArrayOfBytes: 6: propDrawableId + public ArrayOfBytes6 propTexId { get; init; } //40 40: ArrayOfBytes: 6: propTexId + public ushort Unused0 { get; init; }//46 } [TC(typeof(EXP))] public class MCPedSelectionSet : MetaWrapper { public MCPedVariationInfo Owner { get; set; } public CPedSelectionSet _Data; - public CPedSelectionSet Data { get { return _Data; } } + public CPedSelectionSet Data => _Data; public MCPedSelectionSet() { } public MCPedSelectionSet(Meta meta, CPedSelectionSet data, MCPedVariationInfo owner) @@ -6608,7 +6365,7 @@ namespace CodeWalker.GameFiles Owner = owner; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { throw new NotImplementedException(); } @@ -6619,45 +6376,47 @@ namespace CodeWalker.GameFiles } } - [TC(typeof(EXP))] public struct CComponentInfo //48 bytes, Key:3693847250 //COMPONENT PEDS + [TC(typeof(EXP))] + public readonly struct CComponentInfo //48 bytes, Key:3693847250 //COMPONENT PEDS { - public MetaHash Unk_802196719 { get; set; } //0 0: Hash: 0: 802196719 - public MetaHash Unk_4233133352 { get; set; } //4 4: Hash: 0: 4233133352 - 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 ePedVarComp Unk_1613922652 { get; set; } //40 40: ShortFlags: ePedVarComp: 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 MetaHash Unk_802196719 { get; init; } //0 0: Hash: 0: 802196719 + public MetaHash Unk_4233133352 { get; init; } //4 4: Hash: 0: 4233133352 + public ArrayOfBytes5 Unk_128864925 { get; init; } //8 8: ArrayOfBytes: 5: 128864925 + public byte Unused0 { get; init; }//13 + public ushort Unused1 { get; init; }//14 + public uint Unused2 { get; init; }//16 + public uint Unused3 { get; init; }//20 + public uint Unused4 { get; init; }//24 + public uint flags { get; init; } //28 28: UnsignedInt: 0: flags + public int inclusions { get; init; } //32 32: IntFlags2: 0: inclusions//2172318933 + public int exclusions { get; init; } //36 36: IntFlags2: 0: exclusions + public ePedVarComp Unk_1613922652 { get; init; } //40 40: ShortFlags: ePedVarComp: 1613922652 + public ushort Unk_2114993291 { get; init; } //42 42: UnsignedShort: 0: 2114993291 + public byte Unk_3509540765 { get; init; } //44 44: UnsignedByte: 0: 3509540765 + public byte Unk_4196345791 { get; init; } //45 45: UnsignedByte: 0: 4196345791 + public ushort Unused5 { get; init; }//46 } - [TC(typeof(EXP))] public class MCComponentInfo : MetaWrapper + [TC(typeof(EXP))] + public class MCComponentInfo : MetaWrapper { public MCPedVariationInfo Owner { get; set; } public CComponentInfo _Data; - public CComponentInfo Data { get { return _Data; } } + public CComponentInfo Data => _Data; - public int ComponentType { get { return _Data.Unk_3509540765; } } - public int ComponentIndex { get { return _Data.Unk_4196345791; } } + public int ComponentType => _Data.Unk_3509540765; + public int ComponentIndex => _Data.Unk_4196345791; public MCComponentInfo() { } - public MCComponentInfo(Meta meta, CComponentInfo data, MCPedVariationInfo owner) + public MCComponentInfo(Meta meta, in CComponentInfo data, MCPedVariationInfo owner) { _Data = data; Owner = owner; } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { throw new NotImplementedException(); } @@ -6679,8 +6438,8 @@ namespace CodeWalker.GameFiles public byte Unused0 { get; set; }//1 public ushort Unused1 { get; set; }//2 public uint Unused2 { get; set; }//4 - public Array_Structure aPropMetaData { get; set; } //8 8: Array: 0: aPropMetaData {0: Structure: CPedPropMetaData: 256} - public Array_Structure aAnchors { get; set; } //24 24: Array: 0: aAnchors {0: Structure: CAnchorProps: 256} + public Array_Structure aPropMetaData; //8 8: Array: 0: aPropMetaData {0: Structure: CPedPropMetaData: 256} + public Array_Structure aAnchors; //24 24: Array: 0: aAnchors {0: Structure: CAnchorProps: 256} public CPedPropInfo SwapEnd() { aPropMetaData = aPropMetaData.SwapEnd(); @@ -6693,28 +6452,28 @@ namespace CodeWalker.GameFiles public MCPedVariationInfo Owner { get; set; } public CPedPropInfo _Data; - public CPedPropInfo Data { get { return _Data; } } + public CPedPropInfo Data => _Data; public MCPedPropMetaData[] PropMetaData { get; set; } public MCAnchorProps[] Anchors { get; set; } public MCPedPropInfo() { } - public MCPedPropInfo(Meta meta, CPedPropInfo data, MCPedVariationInfo owner) + public MCPedPropInfo(Meta meta, in CPedPropInfo data, MCPedVariationInfo owner) { _Data = data; Owner = owner; - var vPropMetaData = MetaTypes.ConvertDataArray(meta, MetaName.CPedPropMetaData, _Data.aPropMetaData); + var vPropMetaData = MetaTypes.ConvertDataArray(meta, MetaName.CPedPropMetaData, in _Data.aPropMetaData); if (vPropMetaData != null) { PropMetaData = new MCPedPropMetaData[vPropMetaData.Length]; for (int i = 0; i < vPropMetaData.Length; i++) { - PropMetaData[i] = new MCPedPropMetaData(meta, vPropMetaData[i], this); + PropMetaData[i] = new MCPedPropMetaData(meta, in vPropMetaData[i], this); } } - var vAnchors = MetaTypes.ConvertDataArray(meta, MetaName.CAnchorProps, _Data.aAnchors); + var vAnchors = MetaTypes.ConvertDataArray(meta, MetaName.CAnchorProps, in _Data.aAnchors); if (vAnchors != null) { Anchors = new MCAnchorProps[vAnchors.Length]; @@ -6728,7 +6487,7 @@ namespace CodeWalker.GameFiles - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { throw new NotImplementedException(); } @@ -6739,43 +6498,44 @@ namespace CodeWalker.GameFiles } } - [TC(typeof(EXP))] public struct CPedPropMetaData //56 bytes, Key:2029738350 //COMPONENT PEDS + [TC(typeof(EXP))] + public struct CPedPropMetaData //56 bytes, Key:2029738350 //COMPONENT PEDS { - public MetaHash audioId { get; set; } //0 0: Hash: 0: audioId - public ArrayOfBytes5 expressionMods { get; set; } //4 4: ArrayOfBytes: 5: expressionMods//942761829 - 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 {0: Structure: CPedPropTexData: 256} - public ePropRenderFlags renderFlags { get; set; } //40 40: IntFlags1: ePropRenderFlags: renderFlags - public uint propFlags { get; set; } //44 44: UnsignedInt: 0: propFlags - public ushort flags { get; set; } //48 48: UnsignedShort: 0: flags - public byte anchorId { get; set; } //50 50: UnsignedByte: 0: anchorId - public byte propId { get; set; } //51 51: UnsignedByte: 0: propId - public byte Unk_2894625425 { get; set; } //52 52: UnsignedByte: 0: 2894625425 - public byte Unused5 { get; set; }//53 - public ushort Unused6 { get; set; }//54 + public MetaHash audioId { get; init; } //0 0: Hash: 0: audioId + public readonly ArrayOfBytes5 expressionMods; //4 4: ArrayOfBytes: 5: expressionMods//942761829 + public byte Unused0 { get; init; }//9 + public ushort Unused1 { get; init; }//10 + public uint Unused2 { get; init; }//12 + public uint Unused3 { get; init; }//16 + public uint Unused4 { get; init; }//20 + public readonly Array_Structure texData;//24 24: Array: 0: texData {0: Structure: CPedPropTexData: 256} + public ePropRenderFlags renderFlags { get; init; } //40 40: IntFlags1: ePropRenderFlags: renderFlags + public uint propFlags { get; init; } //44 44: UnsignedInt: 0: propFlags + public ushort flags { get; init; } //48 48: UnsignedShort: 0: flags + public byte anchorId { get; init; } //50 50: UnsignedByte: 0: anchorId + public byte propId { get; init; } //51 51: UnsignedByte: 0: propId + public byte Unk_2894625425 { get; init; } //52 52: UnsignedByte: 0: 2894625425 + public byte Unused5 { get; init; }//53 + public ushort Unused6 { get; init; }//54 } [TC(typeof(EXP))] public class MCPedPropMetaData : MetaWrapper { public MCPedPropInfo Owner { get; set; } public CPedPropMetaData _Data; - public CPedPropMetaData Data { get { return _Data; } } + public CPedPropMetaData Data => _Data; public CPedPropTexData[] TexData { get; set; } - public MCPedPropMetaData(Meta meta, CPedPropMetaData data, MCPedPropInfo owner) + public MCPedPropMetaData(Meta meta, in CPedPropMetaData data, MCPedPropInfo owner) { _Data = data; Owner = owner; - TexData = MetaTypes.ConvertDataArray(meta, MetaName.CPedPropTexData, _Data.texData); + TexData = MetaTypes.ConvertDataArray(meta, MetaName.CPedPropTexData, in _Data.texData); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { throw new NotImplementedException(); } @@ -6786,7 +6546,8 @@ namespace CodeWalker.GameFiles } } - [TC(typeof(EXP))] public struct CPedPropTexData //12 bytes, Key:2767296137 //COMPONENT PEDS + [TC(typeof(EXP))] + public struct CPedPropTexData //12 bytes, Key:2767296137 //COMPONENT PEDS { public int inclusions { get; set; } //0 0: IntFlags2: 0: inclusions public int exclusions { get; set; } //4 4: IntFlags2: 0: exclusions @@ -6796,18 +6557,20 @@ namespace CodeWalker.GameFiles public byte distribution { get; set; } //11 11: UnsignedByte: 0: distribution } - [TC(typeof(EXP))] public struct CAnchorProps //24 bytes, Key:403574180 //COMPONENT PEDS CAnchorProps + [TC(typeof(EXP))] + 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 readonly Array_byte props; //0 0: Array: 0: props {0: UnsignedByte: 0: 256} public eAnchorPoints anchor { get; set; } //16 16: IntEnum: eAnchorPoints: anchor public uint Unused0 { get; set; }//20 } - [TC(typeof(EXP))] public class MCAnchorProps : MetaWrapper + [TC(typeof(EXP))] + public class MCAnchorProps : MetaWrapper { public MCPedPropInfo Owner { get; set; } public CAnchorProps _Data; - public CAnchorProps Data { get { return _Data; } } + public CAnchorProps Data => _Data; public byte[] Props { get; set; } @@ -6816,11 +6579,11 @@ namespace CodeWalker.GameFiles _Data = data; Owner = owner; - Props = MetaTypes.GetByteArray(meta, _Data.props); + Props = MetaTypes.GetByteArray(meta, in _Data.props); } - public override void Load(Meta meta, MetaPOINTER ptr) + public override void Load(Meta meta, in MetaPOINTER ptr) { throw new NotImplementedException(); } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaXml.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaXml.cs index fdd3e23..68f8f08 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/MetaXml.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaXml.cs @@ -1,13 +1,18 @@  +using CodeWalker.Core.Utils; +using CommunityToolkit.HighPerformance; +using Microsoft.Extensions.ObjectPool; using SharpDX; using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; +using static CodeWalker.GameFiles.MetaXmlBase; namespace CodeWalker.GameFiles { @@ -20,7 +25,7 @@ namespace CodeWalker.GameFiles if (!string.IsNullOrEmpty(outputfolder)) { - outputfolder = Path.Combine(outputfolder, e.ShortName); + outputfolder = Path.Join(outputfolder, e.ShortName); } if (fn.EndsWith(".ymt", StringComparison.OrdinalIgnoreCase)) @@ -179,21 +184,47 @@ namespace CodeWalker.GameFiles filename = string.Empty; return string.Empty; } - public static string GetXml(YmapFile ymap, out string filename) + public static string GetXml(YmapFile? ymap, out string filename) { var fn = (ymap?.RpfFileEntry?.Name) ?? ""; - if (ymap.Meta != null) { filename = fn + ".xml"; return GetXml(ymap.Meta); } - else if (ymap.Pso != null) { filename = fn + ".pso.xml"; return PsoXml.GetXml(ymap.Pso); } - else if (ymap.Rbf != null) { filename = fn + ".rbf.xml"; return RbfXml.GetXml(ymap.Rbf); } + if (ymap.Meta is not null) { + filename = fn + ".xml"; + return GetXml(ymap.Meta); + } + else if (ymap.Pso is not null) { + filename = fn + ".pso.xml"; + return PsoXml.GetXml(ymap.Pso); + } + else if (ymap.Rbf is not null) { + filename = fn + ".rbf.xml"; + return RbfXml.GetXml(ymap.Rbf); + } filename = string.Empty; return string.Empty; } public static string GetXml(YtypFile ytyp, out string filename) { - var fn = (ytyp?.RpfFileEntry?.Name) ?? ""; - if (ytyp.Meta != null) { filename = fn + ".xml"; return GetXml(ytyp.Meta); } - else if (ytyp.Pso != null) { filename = fn + ".pso.xml"; return PsoXml.GetXml(ytyp.Pso); } - else if (ytyp.Rbf != null) { filename = fn + ".rbf.xml"; return RbfXml.GetXml(ytyp.Rbf); } + if (ytyp is null) + { + filename = string.Empty; + return string.Empty; + } + + var fn = (ytyp.RpfFileEntry?.Name) ?? ""; + if (ytyp.Meta is not null) + { + filename = fn + ".xml"; + return GetXml(ytyp.Meta); + } + else if (ytyp.Pso is not null) + { + filename = fn + ".pso.xml"; + return PsoXml.GetXml(ytyp.Pso); + } + else if (ytyp.Rbf is not null) { + filename = fn + ".rbf.xml"; + return RbfXml.GetXml(ytyp.Rbf); + } filename = string.Empty; return string.Empty; } @@ -348,17 +379,24 @@ namespace CodeWalker.GameFiles public static string GetXml(Meta meta) { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if (meta != null) + StringBuilder sb = StringBuilderPool.Get(); + try { - var cont = new MetaCont(meta); + sb.AppendLine(XmlHeader); - WriteNode(sb, 0, cont, meta.RootBlockIndex, 0, XmlTagMode.Structure, 0, (string)meta.Name); + if (meta != null) + { + var cont = new MetaCont(meta); + + WriteNode(sb, 0, cont, meta.RootBlockIndex, 0, XmlTagMode.Structure, 0, (string)meta.Name); + } + + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); } - - return sb.ToString(); } private static void WriteNode(StringBuilder sb, int indent, MetaCont cont, int blockId, int offset, XmlTagMode tagMode = XmlTagMode.None, MetaName structName = 0, string metaName = "") @@ -395,13 +433,13 @@ namespace CodeWalker.GameFiles switch (tagMode) { case XmlTagMode.Structure: - OpenTag(sb, indent, name, true, metaName); + OpenTag(sb, indent, name, metaName, true); break; case XmlTagMode.Item: - OpenTag(sb, indent, "Item", true, metaName); + OpenTag(sb, indent, "Item", metaName, true); break; case XmlTagMode.ItemAndType: - OpenTag(sb, indent, "Item type=\"" + name + "\"", true, metaName); + OpenTag(sb, indent, $"Item type=\"{name}\"", metaName, true); break; } @@ -420,7 +458,7 @@ namespace CodeWalker.GameFiles switch (entry.DataType) { default: - ErrorXml(sb, cind, ename + ": Unexpected entry DataType: " + entry.DataType.ToString()); + ErrorXml(sb, cind, $"{ename}: Unexpected entry DataType: {entry.DataType}"); break; case MetaStructureEntryDataType.Array: @@ -456,12 +494,12 @@ namespace CodeWalker.GameFiles ValueTag(sb, cind, ename, byteEnumVal.ToString()); break; case MetaStructureEntryDataType.CharPointer: - var charPtr = MetaTypes.ConvertData(data, eoffset); + MetaTypes.TryConvertData(data.AsSpan(eoffset), out var charPtr); string charStr = MetaTypes.GetString(cont.Meta, charPtr); OneLineTag(sb, cind, ename, charStr); break; case MetaStructureEntryDataType.DataBlockPointer: - var dataPtr = MetaTypes.ConvertData(data, eoffset); + MetaTypes.TryConvertData(data.AsSpan(eoffset), out var dataPtr); //need to just get all the data from that block, since this pointer is referring to the whole block! it should be of type BYTE! var dblock = cont.Meta.GetBlock((int)dataPtr.PointerDataId); WriteRawArray(sb, dblock.Data, cind, ename, "ByteArray", FormatHexByte, 32); @@ -471,15 +509,15 @@ namespace CodeWalker.GameFiles ValueTag(sb, cind, ename, FloatUtil.ToString(floatVal)); break; case MetaStructureEntryDataType.Float_XYZ: - var v3 = MetaTypes.ConvertData(data, eoffset); - SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v3.X) + "\" y=\"" + FloatUtil.ToString(v3.Y) + "\" z=\"" + FloatUtil.ToString(v3.Z) + "\""); + MetaTypes.TryConvertData(data.AsSpan(eoffset), out var v3); + SelfClosingTag(sb, cind, $"{ename} x=\"{FloatUtil.ToString(v3.X)}\" y=\"{FloatUtil.ToString(v3.Y)}\" z=\"{FloatUtil.ToString(v3.Z)}\""); break; case MetaStructureEntryDataType.Float_XYZW: - var v4 = MetaTypes.ConvertData(data, eoffset); - SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v4.X) + "\" y=\"" + FloatUtil.ToString(v4.Y) + "\" z=\"" + FloatUtil.ToString(v4.Z) + "\" w=\"" + FloatUtil.ToString(v4.W) + "\""); + MetaTypes.TryConvertData(data.AsSpan(eoffset), out var v4); + SelfClosingTag(sb, cind, $"{ename} x=\"{FloatUtil.ToString(v4.X)}\" y=\"{FloatUtil.ToString(v4.Y)}\" z=\"{FloatUtil.ToString(v4.Z)}\" w=\"{FloatUtil.ToString(v4.W)}\""); break; case MetaStructureEntryDataType.Hash: - var hashVal = MetaTypes.ConvertData(data, eoffset); + MetaTypes.TryConvertData(data.AsSpan(eoffset), out var hashVal); var hashStr = HashString(hashVal); StringTag(sb, cind, ename, hashStr); break; @@ -538,7 +576,7 @@ namespace CodeWalker.GameFiles ValueTag(sb, cind, ename, uintVal.ToString()); break; case MetaName.color: - ValueTag(sb, cind, ename, "0x" + uintVal.ToString("X").PadLeft(8, '0')); + ValueTag(sb, cind, ename, $"0x{uintVal:X8}"); break; } @@ -571,14 +609,14 @@ namespace CodeWalker.GameFiles switch (arrEntry.DataType) { default: - ErrorXml(sb, indent, ename + ": Unexpected array entry DataType: " + arrEntry.DataType.ToString()); + ErrorXml(sb, indent, $"{ename}: Unexpected array entry DataType: {arrEntry.DataType}"); break; case MetaStructureEntryDataType.Structure: - var arrStruc = MetaTypes.ConvertData(data, eoffset); + MetaTypes.TryConvertData(data, eoffset, out var arrStruc); var aBlockId = (int)arrStruc.PointerDataId; var aOffset = (int)arrStruc.PointerDataOffset; aCount = arrStruc.Count1; - arrTag += " itemType=\"" + HashString(arrEntry.ReferenceKey) + "\""; + arrTag += $" itemType=\"{HashString(arrEntry.ReferenceKey)}\""; if (aCount > 0) { OpenTag(sb, indent, arrTag); @@ -604,15 +642,15 @@ namespace CodeWalker.GameFiles } break; case MetaStructureEntryDataType.StructurePointer: - var arrStrucP = MetaTypes.ConvertData(data, eoffset); - var ptrArr = MetaTypes.GetPointerArray(cont.Meta, arrStrucP); - aCount = ptrArr?.Length ?? 0; + MetaTypes.TryConvertData(data, eoffset, out var arrStrucP); + var ptrArr = MetaTypes.GetPointerArray(cont.Meta, in arrStrucP); + aCount = ptrArr.Length; if (aCount > 0) { OpenTag(sb, indent, arrTag); for (int n = 0; n < aCount; n++) { - var ptr = ptrArr[n]; + ref var ptr = ref ptrArr[n]; var offset = ptr.Offset; WriteNode(sb, aind, cont, ptr.BlockID, offset, XmlTagMode.ItemAndType); } @@ -624,27 +662,27 @@ namespace CodeWalker.GameFiles } break; case MetaStructureEntryDataType.UnsignedInt: - var arrUint = MetaTypes.ConvertData(data, eoffset); - var uintArr = MetaTypes.GetUintArray(cont.Meta, arrUint); + MetaTypes.TryConvertData(data, eoffset, out var arrUint); + var uintArr = MetaTypes.GetUintArray(cont.Meta, in arrUint); WriteRawArray(sb, uintArr, indent, ename, "uint"); break; case MetaStructureEntryDataType.UnsignedShort: - var arrUshort = MetaTypes.ConvertData(data, eoffset); - var ushortArr = MetaTypes.GetUshortArray(cont.Meta, arrUshort); + MetaTypes.TryConvertData(data, eoffset, out var arrUshort); + var ushortArr = MetaTypes.GetUshortArray(cont.Meta, in arrUshort); WriteRawArray(sb, ushortArr, indent, ename, "ushort"); break; case MetaStructureEntryDataType.UnsignedByte: - var arrUbyte = MetaTypes.ConvertData(data, eoffset); - var byteArr = MetaTypes.GetByteArray(cont.Meta, arrUbyte); + MetaTypes.TryConvertData(data, eoffset, out var arrUbyte); + var byteArr = MetaTypes.GetByteArray(cont.Meta, in arrUbyte); WriteRawArray(sb, byteArr, indent, ename, "byte"); break; case MetaStructureEntryDataType.Float: - var arrFloat = MetaTypes.ConvertData(data, eoffset); - var floatArr = MetaTypes.GetFloatArray(cont.Meta, arrFloat); + MetaTypes.TryConvertData(data, eoffset, out var arrFloat); + var floatArr = MetaTypes.GetFloatArray(cont.Meta, in arrFloat); WriteRawArray(sb, floatArr, indent, ename, "float"); break; case MetaStructureEntryDataType.Float_XYZ: - var arrV3 = MetaTypes.ConvertData(data, eoffset); + MetaTypes.TryConvertData(data, eoffset, out var arrV3); var v4Arr = MetaTypes.ConvertDataArray(cont.Meta, (MetaName)MetaTypeName.VECTOR4, arrV3.Pointer, arrV3.Count1); WriteItemArray(sb, v4Arr, indent, ename, "Vector3/4", FormatVector4); break; @@ -655,8 +693,8 @@ namespace CodeWalker.GameFiles ErrorXml(sb, indent, "DataBlockPointer ARRAY not supported here! Tell dexy!"); break; case MetaStructureEntryDataType.Hash: - var arrHash = MetaTypes.ConvertData(data, eoffset); - var hashArr = MetaTypes.GetHashArray(cont.Meta, arrHash); + MetaTypes.TryConvertData(data, eoffset, out var arrHash); + var hashArr = MetaTypes.GetHashArray(cont.Meta, in arrHash); WriteItemArray(sb, hashArr, indent, ename, "Hash", FormatHash); break; } @@ -675,7 +713,7 @@ namespace CodeWalker.GameFiles { var bidx = eoffset + n; byte b = ((bidx >= 0) && (bidx < data.Length)) ? data[bidx] : (byte)0; - sb.Append(b.ToString("X").PadLeft(2, '0')); + sb.Append(b.ToString("X2")); } break; case MetaStructureEntryDataType.SignedByte: @@ -684,7 +722,7 @@ namespace CodeWalker.GameFiles var bidx = eoffset + n; sbyte b = ((bidx >= 0) && (bidx < data.Length)) ? (sbyte)data[bidx] : (sbyte)0; sb.Append(b.ToString()); //sb.Append(b.ToString("X").PadLeft(2, '0')); to show HEX values - if (n < byteArrLen - 1) sb.Append(" "); + if (n < byteArrLen - 1) sb.Append(' '); } break; @@ -694,7 +732,7 @@ namespace CodeWalker.GameFiles var bidx = eoffset + n; byte b = ((bidx >= 0) && (bidx < data.Length)) ? data[bidx] : (byte)0; sb.Append(b.ToString()); - if (n < byteArrLen - 1) sb.Append(" "); + if (n < byteArrLen - 1) sb.Append(' '); } break; case MetaStructureEntryDataType.SignedShort: @@ -703,7 +741,7 @@ namespace CodeWalker.GameFiles var bidx = eoffset + n * 2; short b = ((bidx >= 0) && (bidx < data.Length)) ? BitConverter.ToInt16(data, bidx) : (short)0; sb.Append(b.ToString()); - if (n < byteArrLen - 1) sb.Append(" "); + if (n < byteArrLen - 1) sb.Append(' '); } break; case MetaStructureEntryDataType.UnsignedShort: @@ -712,7 +750,7 @@ namespace CodeWalker.GameFiles var bidx = eoffset + n * 2; ushort b = ((bidx >= 0) && (bidx < data.Length)) ? BitConverter.ToUInt16(data, bidx) : (ushort)0; sb.Append(b.ToString()); - if (n < byteArrLen - 1) sb.Append(" "); + if (n < byteArrLen - 1) sb.Append(' '); } break; case MetaStructureEntryDataType.SignedInt: @@ -721,7 +759,7 @@ namespace CodeWalker.GameFiles var bidx = eoffset + n * 4; int b = ((bidx >= 0) && (bidx < data.Length)) ? BitConverter.ToInt32(data, bidx) : (int)0; sb.Append(b.ToString()); - if (n < byteArrLen - 1) sb.Append(" "); + if (n < byteArrLen - 1) sb.Append(' '); } break; case MetaStructureEntryDataType.UnsignedInt: @@ -730,7 +768,7 @@ namespace CodeWalker.GameFiles var bidx = eoffset + n * 4; uint b = ((bidx >= 0) && (bidx < data.Length)) ? BitConverter.ToUInt32(data, bidx) : (uint)0; sb.Append(b.ToString()); - if (n < byteArrLen - 1) sb.Append(" "); + if (n < byteArrLen - 1) sb.Append(' '); } break; case MetaStructureEntryDataType.Float: @@ -739,7 +777,7 @@ namespace CodeWalker.GameFiles var bidx = eoffset + n * 4; float b = ((bidx >= 0) && (bidx < data.Length)) ? BitConverter.ToSingle(data, bidx) : (float)0; sb.Append(FloatUtil.ToString(b)); - if (n < byteArrLen - 1) sb.Append(" "); + if (n < byteArrLen - 1) sb.Append(' '); } break; } @@ -764,18 +802,25 @@ namespace CodeWalker.GameFiles if (isFlags) { - StringBuilder sb = new StringBuilder(); - foreach (var ev in eInfo.Entries) + StringBuilder sb = StringBuilderPool.Get(); + try { - var v = ev.EntryValue; - var m = 1 << v; - if ((value & m) > 0) + foreach (var ev in eInfo.Entries) { - if (sb.Length > 0) sb.Append(", "); - sb.Append(HashString(ev.EntryNameHash)); + var v = ev.EntryValue; + var m = 1 << v; + if ((value & m) > 0) + { + if (sb.Length > 0) sb.Append(", "); + sb.Append(HashString(ev.EntryNameHash)); + } } + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); } - return sb.ToString(); } else { @@ -839,36 +884,41 @@ namespace CodeWalker.GameFiles public class PsoXml : MetaXmlBase { - public static string GetXml(PsoFile pso) { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); - - if ((pso != null) && (pso.DataSection != null) && (pso.DataMapSection != null)) + StringBuilder sb = StringBuilderPool.Get(); + try { - var cont = new PsoCont(pso); + sb.AppendLine(XmlHeader); - WriteNode(sb, 0, cont, pso.DataMapSection.RootId, 0, XmlTagMode.Structure); + if (pso?.DataSection is not null && pso.DataMapSection is not null) + { + var cont = new PsoCont(pso); + + WriteNode(sb, 0, cont, pso.DataMapSection.RootId, 0, XmlTagMode.Structure); + } + + return sb.ToString(); + } + finally + { + Console.WriteLine($"StringBuilder Capacity: {sb.Capacity}"); + StringBuilderPool.Return(sb); } - - return sb.ToString(); } private static void WriteNode(StringBuilder sb, int indent, PsoCont cont, int blockId, int offset, XmlTagMode tagMode = XmlTagMode.None, MetaName structName = 0) { - - var block = cont.Pso.GetBlock(blockId); - if (block == null) + if (!cont.Pso.TryGetBlock(blockId, out var block)) { - ErrorXml(sb, indent, "Couldn't find block " + blockId + "!"); + ErrorXml(sb, indent, $"Couldn't find block {blockId}!"); return; } if (offset >= block.Length) { - offset = offset >> 8; //how to tell when to do this?? + offset >>= 8; //how to tell when to do this?? } var boffset = offset + block.Offset; @@ -884,16 +934,16 @@ namespace CodeWalker.GameFiles var structInfo = cont.GetStructureInfo(structName); if (structInfo == null) { - structInfo = PsoTypes.GetStructureInfo(structName);//fallback to builtin... + structInfo = PsoTypesStructureInfo.GetStructureInfo(structName);//fallback to builtin... } if (structInfo == null) { - ErrorXml(sb, indent, "Couldn't find structure info " + name + "!"); + ErrorXml(sb, indent, $"Couldn't find structure info {name}!"); return; } if (structInfo.Entries == null) { - ErrorXml(sb, indent, "Couldn't find structure info entries for " + name + "!"); + ErrorXml(sb, indent, $"Couldn't find structure info entries for {name}!"); return; } @@ -906,15 +956,14 @@ namespace CodeWalker.GameFiles OpenTag(sb, indent, "Item"); break; case XmlTagMode.ItemAndType: - OpenTag(sb, indent, "Item type=\"" + name + "\""); + OpenTag(sb, indent, $"Item type=\"{name}\""); break; } var cind = indent + 1; - for (int i = 0; i < structInfo.Entries.Length; i++) + foreach(ref var entry in structInfo.Entries.AsSpan()) { - var entry = structInfo.Entries[i]; if (entry.EntryNameHash == (MetaName)MetaTypeName.ARRAYINFO) { continue; @@ -924,7 +973,7 @@ namespace CodeWalker.GameFiles switch (entry.Type) { default: - ErrorXml(sb, cind, ename + ": Unexpected entry DataType: " + entry.Type.ToString()); + ErrorXml(sb, cind, $"{ename}: Unexpected entry DataType: {entry.Type}"); break; case PsoDataType.Array: @@ -950,20 +999,27 @@ namespace CodeWalker.GameFiles switch (entry.Unk_5h) { default: - ErrorXml(sb, cind, ename + ": Unexpected Enum subtype: " + entry.Unk_5h.ToString()); + ErrorXml(sb, cind, $"{ename}: Unexpected Enum subtype: {entry.Unk_5h}"); break; case 0: //int enum var intEVal = MetaTypes.SwapBytes(BitConverter.ToInt32(data, eoffset)); - var intE = enumInfo.FindEntry(intEVal); - var intH = HashString(intE?.EntryNameHash ?? 0); - if (string.IsNullOrEmpty(intH)) - { } + var intH = string.Empty; + if (enumInfo.TryFindEntry(intEVal, out var intE)) + { + intH = HashString(intE.EntryNameHash); + } + StringTag(sb, cind, ename, intH); + break; case 2: //byte enum var byteEVal = data[eoffset]; - var byteE = enumInfo.FindEntry(byteEVal); - StringTag(sb, cind, ename, HashString(byteE?.EntryNameHash ?? 0)); + var byteH = string.Empty; + if (enumInfo.TryFindEntry(byteEVal, out var byteE)) + { + byteH = HashString(byteE.EntryNameHash); + } + StringTag(sb, cind, ename, byteH); break; } break; @@ -972,9 +1028,9 @@ namespace CodeWalker.GameFiles uint fEntry = (entry.ReferenceKey & 0xFFF); var fEnt = (fEntry != 0xFFF) ? structInfo.GetEntry((int)fEntry) : null; PsoEnumInfo flagsInfo = null; - if ((fEnt != null) && (fEnt.EntryNameHash == (MetaName)MetaTypeName.ARRAYINFO)) + if ((fEnt != null) && (fEnt.Value.EntryNameHash == (MetaName)MetaTypeName.ARRAYINFO)) { - flagsInfo = cont.GetEnumInfo((MetaName)fEnt.ReferenceKey); + flagsInfo = cont.GetEnumInfo((MetaName)fEnt.Value.ReferenceKey); } if (flagsInfo == null) { @@ -986,7 +1042,7 @@ namespace CodeWalker.GameFiles switch (entry.Unk_5h) { default: - ErrorXml(sb, cind, ename + ": Unexpected Flags subtype: " + entry.Unk_5h.ToString()); + ErrorXml(sb, cind, $"{ename}: Unexpected Flags subtype: {entry.Unk_5h}"); break; case 0: //int flags flagsVal = MetaTypes.SwapBytes(BitConverter.ToUInt32(data, eoffset)); @@ -1028,24 +1084,29 @@ namespace CodeWalker.GameFiles ValueTag(sb, cind, ename, FloatUtil.ToString(floatVal)); break; case PsoDataType.Float2: - var v2 = MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset)); - SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v2.X) + "\" y=\"" + FloatUtil.ToString(v2.Y) + "\""); + MetaTypes.TryConvertData(data, eoffset, out var v2); + v2 = MetaTypes.SwapBytes(in v2); + SelfClosingTag(sb, cind, $"{ename} x=\"{FloatUtil.ToString(v2.X)}\" y=\"{FloatUtil.ToString(v2.Y)}\""); break; case PsoDataType.Float3: - var v3 = MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset)); - SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v3.X) + "\" y=\"" + FloatUtil.ToString(v3.Y) + "\" z=\"" + FloatUtil.ToString(v3.Z) + "\""); + MetaTypes.TryConvertData(data, eoffset, out var v3); + v3 = MetaTypes.SwapBytes(in v3); + SelfClosingTag(sb, cind, $"{ename} x=\"{FloatUtil.ToString(v3.X)}\" y=\"{FloatUtil.ToString(v3.Y)}\" z=\"{FloatUtil.ToString(v3.Z)}\""); break; case PsoDataType.Float3a: //TODO: check this! - var v3a = MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset)); - SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v3a.X) + "\" y=\"" + FloatUtil.ToString(v3a.Y) + "\" z=\"" + FloatUtil.ToString(v3a.Z) + "\""); + MetaTypes.TryConvertData(data, eoffset, out var v3a); + v3a = MetaTypes.SwapBytes(in v3a); + SelfClosingTag(sb, cind, $"{ename} x=\"{FloatUtil.ToString(v3a.X)}\" y=\"{FloatUtil.ToString(v3a.Y)}\" z=\"{FloatUtil.ToString(v3a.Z)}\""); break; case PsoDataType.Float4a: //TODO: check this! //...why are there 3 different types of float3? - var v3b = MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset)); - SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v3b.X) + "\" y=\"" + FloatUtil.ToString(v3b.Y) + "\" z=\"" + FloatUtil.ToString(v3b.Z) + "\""); + MetaTypes.TryConvertData(data, eoffset, out var v3b); + v3b = MetaTypes.SwapBytes(in v3b); + SelfClosingTag(sb, cind, $"{ename} x=\"{FloatUtil.ToString(v3b.X)}\" y=\"{FloatUtil.ToString(v3b.Y)}\" z=\"{FloatUtil.ToString(v3b.Z)}\""); break; case PsoDataType.Float4: - var v4 = MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset)); - SelfClosingTag(sb, cind, ename + " x=\"" + FloatUtil.ToString(v4.X) + "\" y=\"" + FloatUtil.ToString(v4.Y) + "\" z=\"" + FloatUtil.ToString(v4.Z) + "\" w=\"" + FloatUtil.ToString(v4.W) + "\""); + MetaTypes.TryConvertData(data, eoffset, out var v4); + v4 = MetaTypes.SwapBytes(in v4); + SelfClosingTag(sb, cind, $"{ename} x=\"{FloatUtil.ToString(v4.X)}\" y=\"{FloatUtil.ToString(v4.Y)}\" z=\"{FloatUtil.ToString(v4.Z)}\" w=\"{FloatUtil.ToString(v4.W)}\""); break; case PsoDataType.SInt: //TODO: convert hashes? var int5Val = MetaTypes.SwapBytes(BitConverter.ToInt32(data, eoffset)); @@ -1055,7 +1116,7 @@ namespace CodeWalker.GameFiles switch (entry.Unk_5h) { default: - ErrorXml(sb, cind, ename + ": Unexpected Integer subtype: " + entry.Unk_5h.ToString()); + ErrorXml(sb, cind, $"{ename}: Unexpected Integer subtype: {entry.Unk_5h}"); break; case 0: //signed int (? flags?) var int6aVal = MetaTypes.SwapBytes(BitConverter.ToInt32(data, eoffset)); @@ -1064,7 +1125,7 @@ namespace CodeWalker.GameFiles case 1: //unsigned int var int6bVal = MetaTypes.SwapBytes(BitConverter.ToUInt32(data, eoffset)); //ValueTag(sb, cind, ename, int6bVal.ToString()); - ValueTag(sb, cind, ename, "0x" + int6bVal.ToString("X").PadLeft(8, '0')); + ValueTag(sb, cind, ename, $"0x{int6bVal:X8}"); break; } break; @@ -1104,7 +1165,7 @@ namespace CodeWalker.GameFiles switch (entry.Unk_5h) { default: - ErrorXml(sb, cind, ename + ": Unexpected Structure subtype: " + entry.Unk_5h.ToString()); + ErrorXml(sb, cind, $"{ename}: Unexpected Structure subtype: {entry.Unk_5h}"); break; case 0: //default structure OpenTag(sb, cind, ename); @@ -1113,8 +1174,8 @@ namespace CodeWalker.GameFiles break; case 3: //structure pointer... case 4: //also pointer? what's the difference? - var ptrVal = MetaTypes.ConvertData(data, eoffset); - ptrVal.SwapEnd(); + MetaTypes.TryConvertData(data.AsSpan(eoffset), out var ptrVal); + ptrVal = ptrVal.SwapEnd(); var pbid = ptrVal.BlockID; bool pbok = true; if (pbid <= 0) @@ -1127,8 +1188,12 @@ namespace CodeWalker.GameFiles } if (pbok) { - var typename = HashString(cont.Pso.GetBlock(pbid).NameHash); - OpenTag(sb, cind, ename + " type=\"" + typename + "\""); + var typename = string.Empty; + if (cont.Pso.TryGetBlock(pbid, out var _block)) + { + typename = HashString(_block.NameHash); + } + OpenTag(sb, cind, $"{ename} type=\"{typename}\""); WriteNode(sb, cind, cont, ptrVal.BlockID, (int)ptrVal.ItemOffset, XmlTagMode.None, (MetaName)entry.ReferenceKey); CloseTag(sb, cind, ename); } @@ -1159,19 +1224,25 @@ namespace CodeWalker.GameFiles private static void WriteArrayNode(StringBuilder sb, int indent, PsoCont cont, int blockId, int offset, PsoStructureEntryInfo entry, PsoStructureInfo estruct, string ename) { + if (!cont.Pso.TryGetBlock(blockId, out var block)) + { + Console.WriteLine("Couldn't get blockId"); + return; + } - - var block = cont.Pso.GetBlock(blockId); var boffset = offset + block.Offset; var eoffset = boffset + entry.DataOffset; var aOffset = offset + entry.DataOffset; var abOffset = aOffset + block.Offset; var aBlockId = blockId; uint aCount = (entry.ReferenceKey >> 16) & 0x0000FFFF; - Array_Structure arrStruc = new Array_Structure(); - arrStruc.PointerDataId = (uint)aBlockId; - arrStruc.PointerDataOffset = (uint)aOffset; - arrStruc.Count1 = arrStruc.Count2 = (ushort)aCount; + Array_Structure arrStruc = new Array_Structure + { + PointerDataId = (uint)aBlockId, + PointerDataOffset = (uint)aOffset, + Count1 = (ushort)aCount, + Count2 = (ushort)aCount, + }; var aind = indent + 1; string arrTag = ename; var arrEntInd = (entry.ReferenceKey & 0xFFFF); @@ -1179,10 +1250,9 @@ namespace CodeWalker.GameFiles { arrEntInd = (entry.ReferenceKey & 0xFFF); } - PsoStructureEntryInfo arrEntry = estruct.GetEntry((int)arrEntInd); - if (arrEntry == null) + if (!estruct.TryGetEntry((int)arrEntInd, out var arrEntry)) { - ErrorXml(sb, indent, "ARRAYINFO not found for " + ename + "!"); + ErrorXml(sb, indent, $"ARRAYINFO not found for {ename}!"); return; } @@ -1192,16 +1262,15 @@ namespace CodeWalker.GameFiles switch (entry.Unk_5h) { default: - ErrorXml(sb, indent, ename + ": WIP! Unsupported Array subtype: " + entry.Unk_5h.ToString()); + ErrorXml(sb, indent, $"{ename}: WIP! Unsupported Array subtype: {entry.Unk_5h}"); break; case 0: //Array_Structure - arrStruc = MetaTypes.ConvertData(data, eoffset); - arrStruc.SwapEnd(); + MetaTypes.TryConvertData(data, eoffset, out arrStruc); + arrStruc = arrStruc.SwapEnd(); aBlockId = (int)arrStruc.PointerDataId; aOffset = (int)arrStruc.PointerDataOffset; aCount = arrStruc.Count1; - var aBlock = cont.Pso.GetBlock(aBlockId); - if (aBlock != null) + if (cont.Pso.TryGetBlock(aBlockId, out var aBlock)) { abOffset = aOffset + aBlock.Offset; } @@ -1214,13 +1283,12 @@ namespace CodeWalker.GameFiles case 4: //pointer array? default array? if (arrEntry.Unk_5h == 3) //pointers... { - arrStruc = MetaTypes.ConvertData(data, eoffset); - arrStruc.SwapEnd(); + MetaTypes.TryConvertData(data, eoffset, out arrStruc); + arrStruc = arrStruc.SwapEnd(); aBlockId = (int)arrStruc.PointerDataId; aOffset = (int)arrStruc.PointerDataOffset; aCount = arrStruc.Count1; - var aBlock2 = cont.Pso.GetBlock(aBlockId); - if (aBlock2 != null) + if (cont.Pso.TryGetBlock(aBlockId, out var aBlock2)) { abOffset = aOffset + aBlock2.Offset; } @@ -1268,16 +1336,16 @@ namespace CodeWalker.GameFiles case 0: break; case 3://structure pointer array - var arrStrucPtr = MetaTypes.ConvertData(data, eoffset); - arrStrucPtr.SwapEnd(); + MetaTypes.TryConvertData(data, eoffset, out var arrStrucPtr); + arrStrucPtr = arrStrucPtr.SwapEnd(); aBlockId = (int)arrStrucPtr.PointerDataId; aOffset = (int)arrStrucPtr.PointerDataOffset; aCount = arrStrucPtr.Count1; if (aCount > 0) { - var ptrArr = PsoTypes.GetPointerArray(cont.Pso, arrStrucPtr); + var ptrArr = PsoTypes.GetPointerArray(cont.Pso, in arrStrucPtr); OpenTag(sb, indent, arrTag); - for (int n = 0; n < aCount; n++) + for (int n = 0; n < ptrArr.Length; n++) { var ptrVal = ptrArr[n]; if (ptrVal.Pointer == 0) @@ -1298,9 +1366,8 @@ namespace CodeWalker.GameFiles arrTag += " itemType=\"" + HashString((MetaName)arrEntry.ReferenceKey) + "\""; if (aCount > 0) { - var aBlock = cont.Pso.GetBlock(aBlockId); var atyp = cont.GetStructureInfo((MetaName)arrEntry.ReferenceKey); - if (aBlock == null) + if (!cont.Pso.TryGetBlock(aBlockId, out var aBlock)) { ErrorXml(sb, indent, ename + ": Array block not found: " + aBlockId.ToString()); } @@ -1317,7 +1384,7 @@ namespace CodeWalker.GameFiles { WriteNode(sb, aind, cont, aBlockId, aOffset, XmlTagMode.Item, (MetaName)arrEntry.ReferenceKey); aOffset += atyp.StructureLength; - if ((n < (aCount - 1)) && (aBlock != null) && (aOffset >= aBlock.Length)) + if ((n < (aCount - 1)) && (aOffset >= aBlock.Length)) { break; } @@ -1337,13 +1404,13 @@ namespace CodeWalker.GameFiles switch (entry.Unk_5h) { default: - ErrorXml(sb, indent, ename + ": Unexpected String array subtype: " + entry.Unk_5h.ToString()); + ErrorXml(sb, indent, $"{ename}: Unexpected String array subtype: {entry.Unk_5h}"); break; case 0: //hash array... if (embedded) { } - var arrHash = MetaTypes.ConvertData(data, eoffset); - arrHash.SwapEnd(); + MetaTypes.TryConvertData(data, eoffset, out var arrHash); + arrHash = arrHash.SwapEnd(); var hashArr = PsoTypes.GetHashArray(cont.Pso, arrHash); WriteItemArray(sb, hashArr, indent, ename, "Hash", HashString); break; @@ -1394,13 +1461,13 @@ namespace CodeWalker.GameFiles if (embedded) { } var arrFloat = new Array_float(arrStruc.Pointer, arrStruc.Count1); //block type 7 - var floatArr = PsoTypes.GetFloatArray(cont.Pso, arrFloat); + var floatArr = PsoTypes.GetFloatArray(cont.Pso, in arrFloat); WriteRawArray(sb, floatArr, indent, ename, "float", FloatUtil.ToString); break; case PsoDataType.UShort: if (embedded) { } - var shortArr = PsoTypes.GetUShortArray(cont.Pso, arrStruc); //block type 4 + var shortArr = PsoTypes.GetUShortArray(cont.Pso, in arrStruc); //block type 4 WriteRawArray(sb, shortArr, indent, ename, "ushort"); break; case PsoDataType.UInt: @@ -1418,10 +1485,8 @@ namespace CodeWalker.GameFiles WriteRawArray(sb, intArr2, indent, ename, "int"); break; case PsoDataType.Enum: - if (embedded) - { } - var arrEnum = MetaTypes.ConvertData(data, eoffset); - arrEnum.SwapEnd(); + MetaTypes.TryConvertData(data, eoffset, out var arrEnum); + arrEnum = arrEnum.SwapEnd(); var enumArr = PsoTypes.GetUintArray(cont.Pso, arrEnum); var enumDef = cont.GetEnumInfo((MetaName)arrEntry.ReferenceKey); WriteItemArray(sb, enumArr, indent, ename, "enum", (ie)=> { @@ -1449,8 +1514,8 @@ namespace CodeWalker.GameFiles var mapreftype2 = structInfo.Entries[mapidx1]; var x1 = MetaTypes.SwapBytes(BitConverter.ToInt32(data, eoffset)); var x2 = MetaTypes.SwapBytes(BitConverter.ToInt32(data, eoffset + 4)); - var sptr = MetaTypes.ConvertData(data, eoffset + 8); - sptr.SwapEnd(); + MetaTypes.TryConvertData(data, eoffset + 8, out var sptr); + sptr = sptr.SwapEnd(); if (x1 != 0x1000000) @@ -1468,134 +1533,124 @@ namespace CodeWalker.GameFiles if (c1 != c2) { } } - if (x2 != 0) - { } - if (mapreftype2.ReferenceKey != 0) - { } var xBlockId = (int)sptr.PointerDataId;// x3 & 0xFFF; var xOffset = sptr.PointerDataOffset;// (x3 >> 12) & 0xFFFFF; var xCount1 = sptr.Count1;// x5 & 0xFFFF; + + if (xCount1 == 0) + { + SelfClosingTag(sb, cind, ename); + break; + } + var xCount2 = sptr.Count2;// (x5 >> 16) & 0xFFFF; - var xBlock = cont.Pso.GetBlock(xBlockId); - if ((xBlock == null) && (xCount1 > 0)) + if (!cont.Pso.TryGetBlock(xBlockId, out var xBlock)) { ErrorXml(sb, cind, ename + ": Couldn't find Map xBlock: " + xBlockId.ToString()); } else { - if (xCount1 != xCount2) - { } - if (xCount1 > 0) + var xStruct = cont.GetStructureInfo(xBlock.NameHash); + var xind = indent + 1; + var aind = indent + 2; + + if (xOffset >= xBlock.Length) { - var xStruct = cont.GetStructureInfo(xBlock.NameHash); - var xind = indent + 1; - var aind = indent + 2; - var kEntry = xStruct?.FindEntry(MetaName.Key); - var iEntry = xStruct?.FindEntry(MetaName.Item); + xOffset = xOffset >> 8; //how to tell when to do this?? + } - if (xOffset >= xBlock.Length) - { - xOffset = xOffset >> 8; //how to tell when to do this?? - } + if (xStruct == null && xBlock.NameHash == 0) + { + SelfClosingTag(sb, cind, ename); + } + else if (xStruct == null) + { + ErrorXml(sb, aind, ename + ": Map struct type not found: " + HashString(xBlock.NameHash)); + } + else if (xStruct.IndexInfo.NameHash == 0 && xStruct.IndexInfo.Offset == 0)// || (xStruct.IndexInfo.NameHash != (MetaName)MetaTypeName.ARRAYINFO)) + { + ErrorXml(sb, aind, ename + ": Map struct was missing IndexInfo! " + (xStruct == null ? "" : xStruct.ToString())); + } + else if (!xStruct.TryFindEntry(MetaName.Key, out var kEntry) || !xStruct.TryFindEntry(MetaName.Item, out var iEntry)) + { + ErrorXml(sb, aind, ename + ": Map Key/Item entries not found!"); + } + else if (kEntry.Type != PsoDataType.String) + { + ErrorXml(sb, aind, ename + ": Map Key was not a string!"); + } + else if ((iEntry.Type != PsoDataType.Structure) && (iEntry.Type != PsoDataType.String)) + { + ErrorXml(sb, aind, ename + ": Map Item was not a structure or string!"); + } + //else if (iEntry.Unk_5h != 3) + //{ + // ErrorXml(sb, aind, ename + ": Map Item was not a structure pointer - TODO!"); + //} + else + { + OpenTag(sb, xind, ename); - if ((xStruct == null) && (xBlock.NameHash == 0)) + for (int n = 0; n < xCount1; n++) { - SelfClosingTag(sb, cind, ename); - } - else if (xStruct == null) - { - ErrorXml(sb, aind, ename + ": Map struct type not found: " + HashString(xBlock.NameHash)); - } - else if ((xStruct.IndexInfo == null))// || (xStruct.IndexInfo.NameHash != (MetaName)MetaTypeName.ARRAYINFO)) - { - ErrorXml(sb, aind, ename + ": Map struct was missing IndexInfo! " + (xStruct == null ? "" : xStruct.ToString())); - } - else if ((kEntry == null) || (iEntry == null)) - { - ErrorXml(sb, aind, ename + ": Map Key/Item entries not found!"); - } - else if (kEntry.Type != PsoDataType.String) - { - ErrorXml(sb, aind, ename + ": Map Key was not a string!"); - } - else if ((iEntry.Type != PsoDataType.Structure) && (iEntry.Type != PsoDataType.String)) - { - ErrorXml(sb, aind, ename + ": Map Item was not a structure or string!"); - } - //else if (iEntry.Unk_5h != 3) - //{ - // ErrorXml(sb, aind, ename + ": Map Item was not a structure pointer - TODO!"); - //} - else - { - OpenTag(sb, xind, ename); - - for (int n = 0; n < xCount1; n++) + if (xOffset >= xBlock.Length) { - if (xOffset >= xBlock.Length) - { - ErrorXml(sb, aind, "Offset out of range! Count is " + xCount1.ToString()); - break; //out of range... - } - //WriteNode(sb, aind, cont, xBlockId, xOffset, XmlTagMode.Item, xStruct.IndexInfo.NameHash); + ErrorXml(sb, aind, "Offset out of range! Count is " + xCount1.ToString()); + break; //out of range... + } + //WriteNode(sb, aind, cont, xBlockId, xOffset, XmlTagMode.Item, xStruct.IndexInfo.NameHash); - int sOffset = (int)xOffset + xBlock.Offset; - var kOffset = sOffset + kEntry.DataOffset; - var iOffset = sOffset + iEntry.DataOffset; - var kStr = GetStringValue(cont.Pso, kEntry, data, kOffset); - if (iEntry.Type == PsoDataType.String) + int sOffset = (int)xOffset + xBlock.Offset; + var kOffset = sOffset + kEntry.DataOffset; + var iOffset = sOffset + iEntry.DataOffset; + var kStr = GetStringValue(cont.Pso, kEntry, data, kOffset); + if (iEntry.Type == PsoDataType.String) + { + var iStr = GetStringValue(cont.Pso, iEntry, data, iOffset); + OpenTag(sb, aind, $"Item type=\"String\" key=\"{kStr}\"", false); + sb.Append(XmlEscape(iStr)); + CloseTag(sb, 0, "Item"); + } + else if (iEntry.ReferenceKey != 0)//(xBlock.NameHash != (MetaName)MetaTypeName.ARRAYINFO)//257,258,259 + { + //embedded map values + var vOffset = (int)xOffset + iEntry.DataOffset; + OpenTag(sb, aind, $"Item type=\"{HashString((MetaName)iEntry.ReferenceKey)}\" key=\"{kStr}\""); + WriteNode(sb, aind, cont, xBlockId, vOffset, XmlTagMode.None, (MetaName)iEntry.ReferenceKey); + CloseTag(sb, aind, "Item"); + } + else + { + MetaTypes.TryConvertData(data, iOffset, out var iPtr); + iPtr = iPtr.SwapEnd(); + if (!cont.Pso.TryGetBlock(iPtr.BlockID, out var iBlock)) { - var iStr = GetStringValue(cont.Pso, iEntry, data, iOffset); - OpenTag(sb, aind, "Item type=\"String\" key=\"" + kStr + "\"", false); - sb.Append(XmlEscape(iStr)); - CloseTag(sb, 0, "Item"); - } - else if (iEntry.ReferenceKey != 0)//(xBlock.NameHash != (MetaName)MetaTypeName.ARRAYINFO)//257,258,259 - { - //embedded map values - var vOffset = (int)xOffset + iEntry.DataOffset; - OpenTag(sb, aind, "Item type=\"" + HashString((MetaName)iEntry.ReferenceKey) + "\" key=\"" + kStr + "\""); - WriteNode(sb, aind, cont, xBlockId, vOffset, XmlTagMode.None, (MetaName)iEntry.ReferenceKey); - CloseTag(sb, aind, "Item"); + ErrorXml(sb, aind, ename + ": Could not find iBlock for Map entry!"); } else { - var iPtr = MetaTypes.ConvertData(data, iOffset); - iPtr.SwapEnd(); - var iBlock = cont.Pso.GetBlock(iPtr.BlockID); - if (iBlock == null) + var iStr = $"Item type=\"{HashString(iBlock.NameHash)}\" key=\"{kStr}\""; + var iStruc = cont.GetStructureInfo(iBlock.NameHash); + if (iStruc?.EntriesCount == 0) { - ErrorXml(sb, aind, ename + ": Could not find iBlock for Map entry!"); + //SelfClosingTag(sb, aind, iStr); + OpenTag(sb, aind, iStr); + CloseTag(sb, aind, "Item"); } else { - var iStr = "Item type=\"" + HashString(iBlock.NameHash) + "\" key=\"" + kStr + "\""; - var iStruc = cont.GetStructureInfo(iBlock.NameHash); - if (iStruc?.EntriesCount == 0) - { - //SelfClosingTag(sb, aind, iStr); - OpenTag(sb, aind, iStr); - CloseTag(sb, aind, "Item"); - } - else - { - var iOff = (int)iPtr.ItemOffset; - OpenTag(sb, aind, iStr); - WriteNode(sb, aind, cont, iPtr.BlockID, iOff, XmlTagMode.None);//, (MetaName)entry.ReferenceKey); - CloseTag(sb, aind, "Item"); - } + var iOff = (int)iPtr.ItemOffset; + OpenTag(sb, aind, iStr); + WriteNode(sb, aind, cont, iPtr.BlockID, iOff, XmlTagMode.None);//, (MetaName)entry.ReferenceKey); + CloseTag(sb, aind, "Item"); } } - xOffset += (uint)xStruct.StructureLength; } - CloseTag(sb, xind, ename); + xOffset += (uint)xStruct.StructureLength; } - } - else - { - SelfClosingTag(sb, cind, ename); + CloseTag(sb, xind, ename); } } break; @@ -1605,7 +1660,7 @@ namespace CodeWalker.GameFiles - private static string GetStringValue(PsoFile pso, PsoStructureEntryInfo entry, byte[] data, int eoffset) + private static string? GetStringValue(PsoFile pso, PsoStructureEntryInfo entry, byte[] data, int eoffset) { switch (entry.Unk_5h) { @@ -1616,17 +1671,17 @@ namespace CodeWalker.GameFiles return Encoding.ASCII.GetString(data, eoffset, str0len).Replace("\0", ""); case 1: case 2: - var dataPtr2 = MetaTypes.ConvertData(data, eoffset); - dataPtr2.SwapEnd(); - return PsoTypes.GetString(pso, dataPtr2); + MetaTypes.TryConvertData(data, eoffset, out var dataPtr2); + dataPtr2 = dataPtr2.SwapEnd(); + return PsoTypes.GetString(pso, in dataPtr2); case 3: - var charPtr3 = MetaTypes.ConvertData(data, eoffset); - charPtr3.SwapEnd(); - var strval = PsoTypes.GetString(pso, charPtr3); - return strval ?? ""; + MetaTypes.TryConvertData(data, eoffset, out var charPtr3); + charPtr3 = charPtr3.SwapEnd(); + return PsoTypes.GetString(pso, in charPtr3); case 7: case 8: - var hashVal = (MetaHash)MetaTypes.SwapBytes(MetaTypes.ConvertData(data, eoffset)); + MetaTypes.TryConvertData(data, eoffset, out var rawVal); + var hashVal = (MetaHash)MetaTypes.SwapBytes(rawVal); return HashString(hashVal); } @@ -1708,45 +1763,57 @@ namespace CodeWalker.GameFiles public static string GetXml(RbfFile rbf) { - StringBuilder sb = new StringBuilder(); - sb.AppendLine(XmlHeader); + StringBuilder sb = StringBuilderPool.Get(); + try + { + sb.AppendLine(XmlHeader); - WriteNode(sb, 0, rbf.current); + WriteNode(sb, 0, rbf.current); + + return sb.ToString(); + } finally + { + StringBuilderPool.Return(sb); + } - return sb.ToString(); } private static void WriteNode(StringBuilder sb, int indent, RbfStructure rs) { var attStr = ""; - if (rs.Attributes.Count > 0) + if (rs.Attributes is not null && rs.Attributes.Count > 0) { - var asb = new StringBuilder(); - foreach (var attr in rs.Attributes) + var asb = StringBuilderPool.Get(); + try { - if (attr is RbfString str) + foreach (var attr in rs.Attributes) { - asb.Append($" {attr.Name}=\"{str.Value}\""); + if (attr is RbfString str) + { + asb.Append($" {attr.Name}=\"{str.Value}\""); + } + else if (attr is RbfFloat flt) + { + asb.Append($" {attr.Name}=\"{FloatUtil.ToString(flt.Value)}\""); + } + else if (attr is RbfUint32 unt) + { + asb.Append($" {attr.Name}=\"{unt.Value}\""); + } + else if (attr is RbfBoolean bln) + { + asb.Append($" {attr.Name}=\"{bln.Value}\""); + } } - else if (attr is RbfFloat flt) - { - asb.Append($" {attr.Name}=\"{FloatUtil.ToString(flt.Value)}\""); - } - else if (attr is RbfUint32 unt) - { - asb.Append($" {attr.Name}=\"{unt.Value.ToString()}\""); - } - else if (attr is RbfBoolean bln) - { - asb.Append($" {attr.Name}=\"{bln.Value.ToString()}\""); - } - else - { } + attStr = $"{asb}"; + } + finally + { + StringBuilderPool.Return(asb); } - attStr = $"{asb.ToString()}"; } - if (rs.Children.Count == 0) + if (rs.Children is null || rs.Children.Count == 0) { SelfClosingTag(sb, indent, rs.Name + attStr); return; @@ -1764,8 +1831,8 @@ namespace CodeWalker.GameFiles if (child is RbfBytes) { var bytesChild = (RbfBytes)child; - var contentField = rs.FindAttribute("content") as RbfString;//TODO: fix this to output nicer XML! - if (contentField != null) + //TODO: fix this to output nicer XML! + if (rs.FindAttribute("content") is RbfString contentField) { if (contentField.Value == "char_array") { @@ -1787,7 +1854,7 @@ namespace CodeWalker.GameFiles } else { - ErrorXml(sb, cind, "Unexpected content type: " + contentField.Value); + ErrorXml(sb, cind, $"Unexpected content type: {contentField.Value}"); } } else @@ -1813,24 +1880,21 @@ namespace CodeWalker.GameFiles //else if (stringChild.Name.Equals("type")) //else throw new Exception("Unexpected string content"); } - if (child is RbfStructure) + if (child is RbfStructure rbfStructure) { - WriteNode(sb, cind, child as RbfStructure); + WriteNode(sb, cind, rbfStructure); } - if (child is RbfUint32) + if (child is RbfUint32 intChild) { - var intChild = (RbfUint32)child; ValueTag(sb, cind, intChild.Name, UintString(intChild.Value)); } - if (child is RbfBoolean) + if (child is RbfBoolean booleanChild) { - var booleanChild = (RbfBoolean)child; ValueTag(sb, cind, booleanChild.Name, booleanChild.Value.ToString()); } - if (child is RbfFloat3) + if (child is RbfFloat3 v3) { - var v3 = child as RbfFloat3; - SelfClosingTag(sb, cind, v3.Name + " x=\"" + FloatUtil.ToString(v3.X) + "\" y=\"" + FloatUtil.ToString(v3.Y) + "\" z=\"" + FloatUtil.ToString(v3.Z) + "\""); + SelfClosingTag(sb, cind, $"{v3.Name} x=\"{FloatUtil.ToString(v3.X)}\" y=\"{FloatUtil.ToString(v3.Y)}\" z=\"{FloatUtil.ToString(v3.Z)}\""); } @@ -1843,83 +1907,94 @@ namespace CodeWalker.GameFiles } + public class StringBuilderPooledObjectPolicyLogged : StringBuilderPooledObjectPolicy + { + public override bool Return(StringBuilder obj) + { + Console.WriteLine($"StringBuilder returned with capacity: {obj.Capacity} {obj.Length}"); + return base.Return(obj); + } + } public class MetaXmlBase { - + public static ObjectPool StringBuilderPool = ObjectPool.Create(new StringBuilderPooledObjectPolicyLogged { MaximumRetainedCapacity = 4 * 1024 * 1024, InitialCapacity = 1024 * 32 }); public const string XmlHeader = ""; public static void Indent(StringBuilder sb, int indent) { - for (int i = 0; i < indent; i++) - { - sb.Append(" "); - } + sb.Append(' ', indent); } + public static void ErrorXml(StringBuilder sb, int indent, string msg) { Indent(sb, indent); - sb.Append(""); - sb.Append(msg); - sb.Append(""); - sb.AppendLine(); + sb.AppendLine($"{msg}"); } - public static void OpenTag(StringBuilder sb, int indent, string name, bool appendLine = true, string metaName = "") + + public static void OpenTag(StringBuilder sb, int indent, string name, bool appendLine = true) { Indent(sb, indent); - sb.Append("<"); + sb.Append('<'); + sb.Append(name); + sb.Append('>'); + if (appendLine) + sb.AppendLine(); + } + + public static void OpenTag(StringBuilder sb, int indent, string name, string metaName, bool appendLine = true) + { + Indent(sb, indent); + sb.Append('<'); sb.Append(name); if (string.IsNullOrWhiteSpace(metaName)) { - sb.Append(">"); + sb.Append('>'); } else { - sb.Append(" name=\"" + metaName + "\">"); + sb.Append($" name=\"{metaName}\">"); } if (appendLine) sb.AppendLine(); } + + //public static void OpenTag(StringBuilder sb, int indent, string name, bool appendLine = true, string metaName = "") + //{ + // Indent(sb, indent); + // sb.Append('<'); + // sb.Append(name); + // if (string.IsNullOrWhiteSpace(metaName)) + // { + // sb.Append('>'); + // } + // else + // { + // sb.Append($" name=\"{metaName}\">"); + // } + // if (appendLine) sb.AppendLine(); + //} public static void CloseTag(StringBuilder sb, int indent, string name, bool appendLine = true) { Indent(sb, indent); - sb.Append(""); + sb.Append($""); if (appendLine) sb.AppendLine(); } public static void ValueTag(StringBuilder sb, int indent, string name, string val, string attr = "value") { Indent(sb, indent); - sb.Append("<"); - sb.Append(name); - sb.Append(" "); - sb.Append(attr); - sb.Append("=\""); - sb.Append(val); - sb.Append("\" />"); - sb.AppendLine(); + sb.AppendLine($"<{name} {attr}=\"{val}\" />"); } public static void OneLineTag(StringBuilder sb, int indent, string name, string text) { Indent(sb, indent); - sb.Append("<"); - sb.Append(name); - sb.Append(">"); - sb.Append(text); - sb.Append(""); - sb.AppendLine(); + sb.AppendLine($"<{name}>{text}"); } public static void SelfClosingTag(StringBuilder sb, int indent, string val) { Indent(sb, indent); - sb.Append("<"); - sb.Append(val); - sb.Append(" />"); - sb.AppendLine(); + sb.AppendLine($"<{val} />"); } public static void StringTag(StringBuilder sb, int indent, string name, string text) { @@ -1927,15 +2002,19 @@ namespace CodeWalker.GameFiles else SelfClosingTag(sb, indent, name); } - public static void WriteRawArrayContent(StringBuilder sb, T[] arr, int ind, Func formatter = null, int arrRowSize = 10) where T : struct + public static void WriteRawArrayContent(StringBuilder sb, T[]? arr, int ind, Func formatter = null, int arrRowSize = 10) where T : struct { - var aCount = arr?.Length ?? 0; + if (arr is null || arr.Length == 0) + return; + + var aCount = arr.Length; for (int n = 0; n < aCount; n++) { + ref var value = ref arr[n]; var col = n % arrRowSize; if (col == 0) Indent(sb, ind); - if (col > 0) sb.Append(" "); - string str = (formatter != null) ? formatter(arr[n]) : arr[n].ToString(); + if (col > 0) sb.Append(' '); + string? str = formatter?.Invoke(value) ?? value.ToString(); sb.Append(str); bool lastcol = (col == (arrRowSize - 1)); bool lastn = (n == (aCount - 1)); @@ -1943,7 +2022,7 @@ namespace CodeWalker.GameFiles } } - public static void WriteRawArray(StringBuilder sb, Span arr, int ind, string name, string typeName, Func formatter = null, int arrRowSize = 10) where T : struct + public static void WriteRawArray(StringBuilder sb, Span arr, int ind, string name, string typeName, FormatterRef? formatter = null, int arrRowSize = 10) where T : struct { var aCount = arr.Length; //var arrRowSize = 10; @@ -1956,8 +2035,8 @@ namespace CodeWalker.GameFiles OpenTag(sb, ind, arrTag, false); for (int n = 0; n < aCount; n++) { - if (n > 0) sb.Append(" "); - string str = (formatter != null) ? formatter(arr[n]) : arr[n].ToString(); + if (n > 0) sb.Append(' '); + string? str = formatter?.Invoke(in arr[n]) ?? arr[n].ToString(); sb.Append(str); } CloseTag(sb, 0, name); @@ -1969,8 +2048,8 @@ namespace CodeWalker.GameFiles { var col = n % arrRowSize; if (col == 0) Indent(sb, aind); - if (col > 0) sb.Append(" "); - string str = (formatter != null) ? formatter(arr[n]) : arr[n].ToString(); + if (col > 0) sb.Append(' '); + string? str = formatter?.Invoke(in arr[n]) ?? arr[n].ToString(); sb.Append(str); bool lastcol = (col == (arrRowSize - 1)); bool lastn = (n == (aCount - 1)); @@ -1985,29 +2064,47 @@ namespace CodeWalker.GameFiles } } - public static void WriteRawArray(StringBuilder sb, T[] arr, int ind, string name, string typeName, Func formatter = null, int arrRowSize = 10) where T : struct + public delegate string FormatterRef(in T y); + + public delegate string Formatter(T y); + + public static void WriteRawArray(StringBuilder sb, T[] arr, int ind, string name, string typeName, FormatterRef? formatter = null, int arrRowSize = 10) where T : struct { WriteRawArray(sb, arr.AsSpan(), ind, name, typeName, formatter, arrRowSize); } - public static void WriteItemArray(StringBuilder sb, T[] arr, int ind, string name, string typeName, Func formatter) where T : struct + + public static void WriteRawArray(StringBuilder sb, T[] arr, int ind, string name, string typeName, Func formatter, int arrRowSize = 10) where T : struct + { + WriteRawArray(sb, arr.AsSpan(), ind, name, typeName, (in T value) => formatter(value), arrRowSize); + } + + public static void WriteRawArray(StringBuilder sb, Span arr, int ind, string name, string typeName) where T : struct + { + WriteRawArray(sb, arr, ind, name, typeName); + } + + public static void WriteItemArray(StringBuilder sb, T[]? arr, int ind, string name, string typeName, FormatterRef formatter) where T : struct { WriteItemArray(sb, arr.AsSpan(), ind, name, typeName, formatter); } - public static void WriteItemArray(StringBuilder sb, Span arr, int ind, string name, string typeName, Func formatter) where T : struct + public static void WriteItemArray(StringBuilder sb, T[]? arr, int ind, string name, string typeName, Func formatter) where T : struct + { + WriteItemArray(sb, arr.AsSpan(), ind, name, typeName, (in T value) => formatter(value)); + } + + public static void WriteItemArray(StringBuilder sb, Span arr, int ind, string name, string typeName, FormatterRef formatter) where T : struct { var itemCount = arr.Length; var arrTag = name;// + " itemType=\"Hash\""; var aind = ind + 1; if (itemCount > 0) { - OpenTag(sb, ind, arrTag, metaName: typeName); + OpenTag(sb, ind, arrTag, typeName); for (int n = 0; n < itemCount; n++) { Indent(sb, aind); - sb.Append(""); - sb.Append(formatter(arr[n])); - sb.AppendLine(""); + sb.AppendLine($"{formatter(arr[n])}"); } CloseTag(sb, ind, name); } @@ -2016,118 +2113,111 @@ namespace CodeWalker.GameFiles SelfClosingTag(sb, ind, arrTag); } } - public static void WriteItemArray(StringBuilder sb, T[] arr, int ind, string name) where T : IMetaXmlItem + public static void WriteItemArray(StringBuilder sb, T[]? arr, int ind, string name) where T : IMetaXmlItem { - var itemCount = arr?.Length ?? 0; - if (itemCount > 0) - { - OpenTag(sb, ind, name); - var cind = ind + 1; - var cind2 = ind + 2; - for (int i = 0; i < itemCount; i++) - { - if (arr[i] != null) - { - OpenTag(sb, cind, "Item"); - arr[i].WriteXml(sb, cind2); - CloseTag(sb, cind, "Item"); - } - else - { - SelfClosingTag(sb, cind, "Item"); - } - } - CloseTag(sb, ind, name); - } - else + if (arr is null || arr.Length == 0) { SelfClosingTag(sb, ind, name); + return; } + + OpenTag(sb, ind, name); + var cind = ind + 1; + var cind2 = ind + 2; + foreach(var item in arr) + { + if (item is null) + { + SelfClosingTag(sb, cind, "Item"); + continue; + } + + OpenTag(sb, cind, "Item"); + item.WriteXml(sb, cind2); + CloseTag(sb, cind, "Item"); + } + CloseTag(sb, ind, name); } - public static void WriteCustomItemArray(StringBuilder sb, T[] arr, int ind, string name) where T : IMetaXmlItem + public static void WriteCustomItemArray(StringBuilder sb, T[]? arr, int ind, string name) where T : IMetaXmlItem { - var itemCount = arr?.Length ?? 0; - if (itemCount > 0) - { - OpenTag(sb, ind, name); - var cind = ind + 1; - for (int i = 0; i < itemCount; i++) - { - if (arr[i] != null) - { - arr[i].WriteXml(sb, cind); - } - } - CloseTag(sb, ind, name); - } - else + if (arr is null || arr.Length == 0) { SelfClosingTag(sb, ind, name); + return; } + + OpenTag(sb, ind, name); + var cind = ind + 1; + foreach(var item in arr) + { + item?.WriteXml(sb, cind); + } + CloseTag(sb, ind, name); } - public static void WriteHashItemArray(StringBuilder sb, MetaHash[] arr, int ind, string name) + public static void WriteHashItemArray(StringBuilder sb, MetaHash[]? arr, int ind, string name) { - var itemCount = arr?.Length ?? 0; - if (itemCount > 0) - { - OpenTag(sb, ind, name); - var cind = ind + 1; - for (int i = 0; i < itemCount; i++) - { - var iname = HashString(arr[i]); - StringTag(sb, cind, "Item", iname); - } - CloseTag(sb, ind, name); - } - else + if (arr is null || arr.Length == 0) { SelfClosingTag(sb, ind, name); + return; } + + OpenTag(sb, ind, name); + var cind = ind + 1; + foreach(var item in arr) + { + var iname = HashString(item); + StringTag(sb, cind, "Item", iname); + } + CloseTag(sb, ind, name); } public static string FormatHash(MetaHash h) //for use with WriteItemArray { - var str = JenkIndex.TryGetString(h); - if (!string.IsNullOrEmpty(str)) return str; - str = GlobalText.TryGetString(h); - if (!string.IsNullOrEmpty(str)) return str; + + if (JenkIndex.TryGetString(h, out var str)) + return str; + + if (GlobalText.TryGetString(h, out str)) + return str; + return HashString(h);// "hash_" + h.Hex; //return h.ToString(); } - public static string FormatVector2(Vector2 v) //for use with WriteItemArray + public static string FormatVector2(in Vector2 v) //for use with WriteItemArray { return FloatUtil.GetVector2String(v); } - public static string FormatVector3(Vector3 v) //for use with WriteItemArray + public static string FormatVector3(in Vector3 v) //for use with WriteItemArray { - return FloatUtil.GetVector3String(v); + return FloatUtil.GetVector3String(in v); } - public static string FormatVector4(Vector4 v) //for use with WriteItemArray + public static string FormatVector4(in Vector4 v) //for use with WriteItemArray { - return FloatUtil.GetVector4String(v); + return FloatUtil.GetVector4String(in v); } public static string FormatHexByte(byte b) { - return Convert.ToString(b, 16).ToUpperInvariant().PadLeft(2, '0'); //hex byte array + return b.ToString("X2"); } public static string FormatHashSwap(MetaHash h) //for use with WriteItemArray, swaps endianness { return MetaTypes.SwapBytes(h).ToString(); } - public static string FormatVector2Swap(Vector2 v) //for use with WriteItemArray, swaps endianness + public static string FormatVector2Swap(in Vector2 v) //for use with WriteItemArray, swaps endianness { - return FloatUtil.GetVector2String(MetaTypes.SwapBytes(v)); + return FloatUtil.GetVector2String(MetaTypes.SwapBytes(in v)); } public static string FormatVector3Swap(Vector3 v) //for use with WriteItemArray, swaps endianness { - return FloatUtil.GetVector3String(MetaTypes.SwapBytes(v)); + return FloatUtil.GetVector3String(MetaTypes.SwapBytes(in v)); } public static string FormatVector4Swap(Vector4 v) //for use with WriteItemArray, swaps endianness { - return FloatUtil.GetVector4String(MetaTypes.SwapBytes(v)); + return FloatUtil.GetVector4String(MetaTypes.SwapBytes(in v)); } - public static string FormatVector4SwapXYZOnly(Vector4 v) //for use with WriteItemArray, swaps endianness, and outputs only XYZ components + public static string FormatVector4SwapXYZOnly(in Vector4 v) //for use with WriteItemArray, swaps endianness, and outputs only XYZ components { return FloatUtil.GetVector3String(MetaTypes.SwapBytes(v.XYZ())); } @@ -2137,50 +2227,56 @@ namespace CodeWalker.GameFiles public static string HashString(MetaName h) { uint uh = (uint)h; - if (uh == 0) return ""; + if (uh == 0) + return string.Empty; - string str; - if (MetaNames.TryGetString(uh, out str)) return str; + string? str; + if (MetaNames.TryGetString(uh, out str)) + return str; str = JenkIndex.TryGetString(uh); - if (!string.IsNullOrEmpty(str)) return str; + if (!string.IsNullOrEmpty(str)) + return str; //TODO: do extra hash lookup here //if(Lookup.TryGetValue(uh, out str)) ... - return "hash_" + uh.ToString("X").PadLeft(8, '0'); + return $"hash_{uh:X8}"; } public static string HashString(MetaHash h) { - if (h == 0) return ""; + if (h == 0) + return string.Empty; - var str = JenkIndex.TryGetString(h); + if (JenkIndex.TryGetString(h, out var str)) + return str; - if (string.IsNullOrEmpty(str)) - { - if (MetaNames.TryGetString(h, out str)) return str; - } + if (MetaNames.TryGetString(h, out str)) + return str; //todo: make sure JenkIndex is built! //todo: do extra hash lookup here - if (!string.IsNullOrEmpty(str)) return str; - return "hash_" + h.Hex; + if (!string.IsNullOrEmpty(str)) + return str; + + return $"hash_{h.Hex}"; } public static string HashString(TextHash h) { uint uh = h.Hash; - if (uh == 0) return ""; + if (uh == 0) + return string.Empty; - var str = GlobalText.TryGetString(uh); - if (!string.IsNullOrEmpty(str)) return str; + if (GlobalText.TryGetString(uh, out var str)) + return str; //TODO: do extra hash lookup here //if(Lookup.TryGetValue(uh, out str)) ... - return "hash_" + uh.ToString("X").PadLeft(8, '0'); + return $"hash_{uh:X8}"; } @@ -2197,16 +2293,17 @@ namespace CodeWalker.GameFiles //if (h == 0) return ""; - return "0x" + h.ToString("X"); + return $"0x{h:X}"; } - - public static string XmlEscape(string unescaped) + [return: NotNullIfNotNull(nameof(unescaped))] + public static string? XmlEscape(string? unescaped) { - if (unescaped == null) return null; + if (unescaped is null) + return null; var escaped = System.Web.HttpUtility.HtmlEncode(unescaped).Replace("\"", """); return escaped; } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/Pso.cs b/CodeWalker.Core/GameFiles/MetaTypes/Pso.cs index 132be99..fe5c0ee 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/Pso.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/Pso.cs @@ -112,11 +112,18 @@ This is a table i made a while ago for the pso types btw +using CodeWalker.Core.Utils; +using CommunityToolkit.Diagnostics; +using SharpDX.Win32; using System; +using System.Buffers; +using System.Buffers.Binary; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; @@ -209,8 +216,10 @@ namespace CodeWalker.GameFiles public void Load(byte[] data) { - using (var ms = new MemoryStream(data)) - Load(ms); + var sequence = new ReadOnlySequence(data); + var reader = new SequenceReader(sequence); + + Load(ref reader); } public void Load(string fileName) @@ -221,7 +230,10 @@ namespace CodeWalker.GameFiles public virtual void Load(Stream stream) { - stream.Position = 0; + if (stream.Position != 0) + { + stream.Position = 0; + } var reader = new DataReader(stream, Endianess.BigEndian); while (reader.Position < reader.Length) @@ -276,6 +288,63 @@ namespace CodeWalker.GameFiles } } + public virtual void Load(ref SequenceReader reader) + { + if (reader.Consumed != 0) + { + reader.SetPosition(0); + } + while (reader.Consumed < reader.Length) + { + var identInt = reader.ReadUInt32BigEndian(); + var ident = (PsoSection)identInt; + var length = reader.ReadInt32BigEndian(); + + reader.Rewind(8); + + var sectionData = reader.ReadSubSequence(length); + var sectionReader = new SequenceReader(sectionData); + + switch (ident) + { + case PsoSection.PSIN: //0x5053494E "PSIN" - ID / data section + DataSection = new PsoDataSection(); + DataSection.Read(ref sectionReader, identInt, length); + break; + case PsoSection.PMAP: //0x504D4150 "PMAP" //data mapping + DataMapSection = new PsoDataMapSection(); + DataMapSection.Read(ref sectionReader); + break; + case PsoSection.PSCH: //0x50534348 "PSCH" //schema + SchemaSection = new PsoSchemaSection(); + SchemaSection.Read(ref sectionReader); + break; + case PsoSection.STRF: //0x53545246 "STRF" //paths/STRINGS (folder strings?) + STRFSection = new PsoSTRFSection(); + STRFSection.Read(ref sectionReader); + break; + case PsoSection.STRS: //0x53545253 "STRS" //names/strings (DES_) + STRSSection = new PsoSTRSSection(); + STRSSection.Read(ref sectionReader); + break; + case PsoSection.STRE: //0x53545245 "STRE" //probably encrypted strings..... + STRESection = new PsoSTRESection(); + STRESection.Read(ref sectionReader); + break; + case PsoSection.PSIG: //0x50534947 "PSIG" //signature? + PSIGSection = new PsoPSIGSection(); + PSIGSection.Read(ref sectionReader); + break; + case PsoSection.CHKS: //0x43484B53 "CHKS" //checksum? + CHKSSection = new PsoCHKSSection(); + CHKSSection.Read(ref sectionReader); + break; + default: + break; + } + } + } + public byte[] Save() { @@ -312,11 +381,30 @@ namespace CodeWalker.GameFiles - public PsoDataMappingEntry GetBlock(int id) + public bool TryGetBlock(int id, out PsoDataMappingEntry block) { - if (DataMapSection == null) return null; - if (DataMapSection.Entries == null) return null; - PsoDataMappingEntry block = null; + if (DataMapSection?.Entries is null) + { + block = default; + return false; + } + var ind = id - 1; + var blocks = DataMapSection.Entries; + if ((ind >= 0) && (ind < blocks.Length)) + { + block = blocks[ind]; + return true; + } + + block = default; + return false; + } + + public PsoDataMappingEntry? GetBlock(int id) + { + if (DataMapSection?.Entries == null) + return null; + PsoDataMappingEntry? block = null; var ind = id - 1; var blocks = DataMapSection.Entries; if ((ind >= 0) && (ind < blocks.Length)) @@ -326,8 +414,8 @@ namespace CodeWalker.GameFiles return block; } - - + public const uint PSO_IDENT_LITTLE_ENDIAN = 0x4e495350; + public static readonly uint PSO_IDENT_BIG_ENDIAN = BinaryPrimitives.ReverseEndianness(PSO_IDENT_LITTLE_ENDIAN); public static bool IsPSO(Stream stream) @@ -335,29 +423,31 @@ namespace CodeWalker.GameFiles //return !IsRBF(stream); //1347635534 - var reader = new DataReader(stream, Endianess.BigEndian); - var identInt = reader.ReadUInt32(); - stream.Position = 0; - return IsPSO(identInt); //"PSIN" + Span buffer = stackalloc byte[4]; + stream.Read(buffer); + stream.Position = 0; + return IsPSO(buffer); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsPSO(Span data) + { + var identInt = BinaryPrimitives.ReadUInt32LittleEndian(data); + + return IsPsoLittleEndian(identInt); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsPSO(uint identInt) { - return identInt == 1347635534; + return identInt == PSO_IDENT_BIG_ENDIAN; } - public static bool IsRBF(Stream stream) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsPsoLittleEndian(uint identInt) { - var reader = new DataReader(stream, Endianess.BigEndian); - var identInt = reader.ReadUInt32(); - stream.Position = 0; - return IsRBF(identInt); - } - - public static bool IsRBF(uint identInt) - { - return (identInt & 0xFFFFFF00) == 0x52424600; + return identInt == PSO_IDENT_LITTLE_ENDIAN; } } @@ -376,6 +466,21 @@ namespace CodeWalker.GameFiles Data = reader.ReadBytes(Length); } + public void Read(ref SequenceReader reader, uint ident, int length) + { + Ident = ident; + Length = length; + Data = reader.ReadBytes(Length).ToArray(); + } + + public void Read(ref SequenceReader reader) + { + Ident = reader.ReadUInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + reader.Rewind(8); + Data = reader.ReadBytes(Length).ToArray(); + } + public void Write(DataWriter writer) { Length = Data.Length; @@ -389,12 +494,13 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Ident.ToString() + ": " + Length.ToString(); + return $"{Ident}: {Length}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoDataMapSection + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoDataMapSection { public int Ident { get; set; } = 0x504D4150; public int Length { get; private set; } @@ -422,9 +528,31 @@ namespace CodeWalker.GameFiles Entries = new PsoDataMappingEntry[EntriesCount]; for (int i = 0; i < EntriesCount; i++) { - var entry = new PsoDataMappingEntry(); - entry.Read(reader); - Entries[i] = entry; + Entries[i] = new PsoDataMappingEntry(reader); + } + } + + public void Read(ref SequenceReader reader) + { + Ident = reader.ReadInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + RootId = reader.ReadInt32BigEndian(); + EntriesCount = reader.ReadInt16BigEndian(); + Unknown_Eh = reader.ReadInt16BigEndian(); + + if (EntriesCount <= 0) //any other way to know which version? + { + EntriesCount = reader.ReadInt16BigEndian(); + reader.Advance(6); + //var unk1 = reader.ReadInt16BigEndian(); + //var unk2 = reader.ReadInt16BigEndian(); + //var unk3 = reader.ReadInt16BigEndian(); + } + + Entries = new PsoDataMappingEntry[EntriesCount]; + for (int i = 0; i < EntriesCount; i++) + { + Entries[i] = new PsoDataMappingEntry(ref reader); } } @@ -447,18 +575,19 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Ident.ToString() + ": " + EntriesCount.ToString(); + return $"{Ident}: {EntriesCount}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoDataMappingEntry + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct PsoDataMappingEntry { - public MetaName NameHash { get; set; } - public int Offset { get; set; } - public int Unknown_8h { get; set; } = 0x00000000; - public int Length { get; set; } + public MetaName NameHash { get; init; } + public int Offset { get; init; } + public int Unknown_8h { get; init; } + public int Length { get; init; } - public void Read(DataReader reader) + public PsoDataMappingEntry(DataReader reader) { NameHash = (MetaName)reader.ReadUInt32(); Offset = reader.ReadInt32(); @@ -466,6 +595,14 @@ namespace CodeWalker.GameFiles Length = reader.ReadInt32(); } + public PsoDataMappingEntry(ref SequenceReader reader) + { + NameHash = (MetaName)reader.ReadUInt32BigEndian(); + Offset = reader.ReadInt32BigEndian(); + Unknown_8h = reader.ReadInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + } + public void Write(DataWriter writer) { writer.Write((uint)NameHash); @@ -476,12 +613,13 @@ namespace CodeWalker.GameFiles public override string ToString() { - return NameHash.ToString() + ": " + Offset.ToString() + ": " + Length.ToString(); + return $"{NameHash}: {Offset}: {Length}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoSchemaSection + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoSchemaSection { public int Ident { get; private set; } = 0x50534348; public int Length { get; set; } @@ -499,12 +637,10 @@ namespace CodeWalker.GameFiles EntriesIdx = new PsoElementIndexInfo[Count]; for (int i = 0; i < Count; i++) { - var entry = new PsoElementIndexInfo(); - entry.Read(reader); - EntriesIdx[i] = entry; + EntriesIdx[i] = new PsoElementIndexInfo(reader); } - Entries = new PsoElementInfo[Count]; + Entries = new PsoStructureInfo[Count]; for (int i = 0; i < Count; i++) { reader.Position = EntriesIdx[i].Offset; @@ -513,20 +649,46 @@ namespace CodeWalker.GameFiles reader.Position = EntriesIdx[i].Offset; if (type == 0) { - var entry = new PsoStructureInfo(); - entry.Read(reader); - entry.IndexInfo = EntriesIdx[i]; - Entries[i] = entry; + Entries[i] = new PsoStructureInfo(reader) { IndexInfo = EntriesIdx[i] }; } else if (type == 1) { - var entry = new PsoEnumInfo(); - entry.Read(reader); - entry.IndexInfo = EntriesIdx[i]; - Entries[i] = entry; + Entries[i] = new PsoEnumInfo(reader) { IndexInfo = EntriesIdx[i] }; } else - throw new Exception("unknown type!"); + ThrowHelper.ThrowNotSupportedException("Unknown type"); + } + } + + public void Read(ref SequenceReader reader) + { + Ident = reader.ReadInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + Count = reader.ReadUInt32BigEndian(); + + EntriesIdx = new PsoElementIndexInfo[Count]; + for (int i = 0; i < Count; i++) + { + EntriesIdx[i] = new PsoElementIndexInfo(ref reader); + } + + Entries = new PsoElementInfo[Count]; + for (int i = 0; i < Count; i++) + { + reader.SetPosition(EntriesIdx[i].Offset); + var type = reader.ReadByte(); + + reader.SetPosition(EntriesIdx[i].Offset); + if (type == 0) + { + Entries[i] = new PsoStructureInfo(ref reader) { IndexInfo = EntriesIdx[i] }; + } + else if (type == 1) + { + Entries[i] = new PsoEnumInfo(ref reader) { IndexInfo = EntriesIdx[i], }; + } + else + ThrowHelper.ThrowNotSupportedException("Unknown type"); } } @@ -537,7 +699,7 @@ namespace CodeWalker.GameFiles var entriesWriter = new DataWriter(entriesStream, Endianess.BigEndian); for (int i = 0; i < Entries.Length; i++) { - EntriesIdx[i].Offset = 12 + 8 * Entries.Length + (int)entriesWriter.Position; + EntriesIdx[i] = EntriesIdx[i] with { Offset = 12 + 8 * Entries.Length + (int)entriesWriter.Position, }; Entries[i].Write(entriesWriter); } @@ -572,20 +734,23 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Ident.ToString() + ": " + Count.ToString(); + return $"{Ident}: {Count}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoElementIndexInfo + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct PsoElementIndexInfo(MetaName nameHash, int offset) { - public MetaName NameHash { get; set; } - public int Offset { get; set; } + public MetaName NameHash { get; init; } = nameHash; + public int Offset { get; init; } = offset; - public void Read(DataReader reader) - { - NameHash = (MetaName)reader.ReadUInt32(); - Offset = reader.ReadInt32(); - } + public PsoElementIndexInfo(DataReader reader) + : this ((MetaName)reader.ReadUInt32(), reader.ReadInt32()) + { } + + public PsoElementIndexInfo(ref SequenceReader reader) + : this((MetaName)reader.ReadUInt32BigEndian(), reader.ReadInt32BigEndian()) + { } public void Write(DataWriter writer) { @@ -595,21 +760,22 @@ namespace CodeWalker.GameFiles public override string ToString() { - return NameHash.ToString() + ": " + Offset.ToString(); + return $"{NameHash}: {Offset}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public abstract class PsoElementInfo + [TypeConverter(typeof(ExpandableObjectConverter))] + public interface PsoElementInfo { public PsoElementIndexInfo IndexInfo { get; set; } - public abstract void Read(DataReader reader); - public abstract void Write(DataWriter writer); } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoStructureInfo : PsoElementInfo + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoStructureInfo : PsoElementInfo { + public PsoElementIndexInfo IndexInfo { get; set; } public byte Type { get; set; } = 0; public short EntriesCount { get; private set; } public byte Unk { get; set; } @@ -617,14 +783,44 @@ namespace CodeWalker.GameFiles public uint Unk_Ch { get; set; } = 0x00000000; public PsoStructureEntryInfo[] Entries { get; set; } - public PsoStructureInfo() { } + + public PsoStructureInfo(DataReader reader) + { + uint x = reader.ReadUInt32(); + Type = (byte)((x & 0xFF000000) >> 24); + EntriesCount = (short)(x & 0xFFFF); + Unk = (byte)((x & 0x00FF0000) >> 16); + StructureLength = reader.ReadInt32(); + Unk_Ch = reader.ReadUInt32(); + + Entries = new PsoStructureEntryInfo[EntriesCount]; + for (int i = 0; i < EntriesCount; i++) + { + Entries[i] = new PsoStructureEntryInfo(reader); + } + } + + public PsoStructureInfo(ref SequenceReader reader) + { + uint x = reader.ReadUInt32BigEndian(); + Type = (byte)((x & 0xFF000000) >> 24); + EntriesCount = (short)(x & 0xFFFF); + Unk = (byte)((x & 0x00FF0000) >> 16); + StructureLength = reader.ReadInt32BigEndian(); + Unk_Ch = reader.ReadUInt32BigEndian(); + + Entries = new PsoStructureEntryInfo[EntriesCount]; + for (int i = 0; i < EntriesCount; i++) + { + Entries[i] = new PsoStructureEntryInfo(ref reader); + } + } + public PsoStructureInfo(MetaName nameHash, byte type, byte unk, int length, params PsoStructureEntryInfo[] entries) { - IndexInfo = new PsoElementIndexInfo(); - IndexInfo.NameHash = nameHash; - IndexInfo.Offset = 0; //todo: fix? + IndexInfo = new PsoElementIndexInfo(nameHash, 0); Type = type; EntriesCount = (short)(entries?.Length ?? 0); @@ -634,28 +830,7 @@ namespace CodeWalker.GameFiles Entries = entries; } - public override void Read(DataReader reader) - { - uint x = reader.ReadUInt32(); - Type = (byte)((x & 0xFF000000) >> 24); - EntriesCount = (short)(x & 0xFFFF); - Unk = (byte)((x & 0x00FF0000) >> 16); - StructureLength = reader.ReadInt32(); - Unk_Ch = reader.ReadUInt32(); - - if (Unk_Ch != 0) - { } - - Entries = new PsoStructureEntryInfo[EntriesCount]; - for (int i = 0; i < EntriesCount; i++) - { - var entry = new PsoStructureEntryInfo(); - entry.Read(reader); - Entries[i] = entry; - } - } - - public override void Write(DataWriter writer) + public void Write(DataWriter writer) { Type = 0; EntriesCount = (short)Entries.Length; @@ -673,21 +848,55 @@ namespace CodeWalker.GameFiles public override string ToString() { - return IndexInfo.ToString() + " - " + Type.ToString() + ": " + EntriesCount.ToString(); + return $"{IndexInfo} - {Type}: {EntriesCount}"; } - public PsoStructureEntryInfo FindEntry(MetaName name) + public bool TryFindEntry(MetaName name, [MaybeNullWhen(false)] out PsoStructureEntryInfo entryInfo) + { + if (Entries is null) + { + entryInfo = default; + return false; + } + + foreach (var entry in Entries.AsSpan()) + { + if (entry.EntryNameHash == name) + { + entryInfo = entry; + return true; + } + } + + entryInfo = default; + return false; + } + + public PsoStructureEntryInfo? FindEntry(MetaName name) { if (Entries != null) { foreach (var entry in Entries) { - if (entry.EntryNameHash == name) return entry; + if (entry.EntryNameHash == name) + return entry; } } return null; } - public PsoStructureEntryInfo GetEntry(int id) + + public bool TryGetEntry(int id, [MaybeNullWhen(false)] out PsoStructureEntryInfo entry) + { + if ((Entries != null) && (id >= 0) && (id < Entries.Length)) + { + entry = Entries[id]; + return true; + } + entry = default; + return false; + } + + public PsoStructureEntryInfo? GetEntry(int id) { if ((Entries != null) && (id >= 0) && (id < Entries.Length)) { @@ -698,17 +907,38 @@ namespace CodeWalker.GameFiles } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoStructureEntryInfo + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct PsoStructureEntryInfo { - public MetaName EntryNameHash { get; set; } - public PsoDataType Type { get; set; } - public byte Unk_5h { get; set; } //0 = default, 3 = pointer array? - public ushort DataOffset { get; set; } - public uint ReferenceKey { get; set; } // when array -> entry index with type + public MetaName EntryNameHash { get; init; } + public PsoDataType Type { get; init; } + public byte Unk_5h { get; init; } //0 = default, 3 = pointer array? + public ushort DataOffset { get; init; } + public uint ReferenceKey { get; init; } // when array -> entry index with type public PsoStructureEntryInfo() { } + + + public PsoStructureEntryInfo(DataReader reader) + { + EntryNameHash = (MetaName)reader.ReadUInt32(); + Type = (PsoDataType)reader.ReadByte(); + Unk_5h = reader.ReadByte(); + DataOffset = reader.ReadUInt16(); + ReferenceKey = reader.ReadUInt32(); + } + + public PsoStructureEntryInfo(ref SequenceReader reader) + { + EntryNameHash = (MetaName)reader.ReadUInt32BigEndian(); + Type = (PsoDataType)reader.ReadByte(); + Unk_5h = reader.ReadByte(); + DataOffset = reader.ReadUInt16BigEndian(); + ReferenceKey = reader.ReadUInt32BigEndian(); + } + public PsoStructureEntryInfo(MetaName nameHash, PsoDataType type, ushort offset, byte unk, MetaName refKey) { EntryNameHash = nameHash; @@ -718,15 +948,6 @@ namespace CodeWalker.GameFiles ReferenceKey = (uint)refKey; } - public void Read(DataReader reader) - { - EntryNameHash = (MetaName)reader.ReadUInt32(); - Type = (PsoDataType)reader.ReadByte(); - Unk_5h = reader.ReadByte(); - DataOffset = reader.ReadUInt16(); - ReferenceKey = reader.ReadUInt32(); - } - public void Write(DataWriter writer) { writer.Write((uint)EntryNameHash); @@ -740,14 +961,16 @@ namespace CodeWalker.GameFiles { if(ReferenceKey!=0) { - return EntryNameHash.ToString() + ": " + Type.ToString() + ": " + DataOffset.ToString() + ": " + ((MetaName)ReferenceKey).ToString(); + return $"{EntryNameHash}: {Type}: {DataOffset}: {(MetaName)ReferenceKey}"; } - return EntryNameHash.ToString() + ": " + Type.ToString() + ": " + DataOffset.ToString(); + return $"{EntryNameHash}: {Type}: {DataOffset}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoEnumInfo : PsoElementInfo + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoEnumInfo : PsoElementInfo { + public PsoElementIndexInfo IndexInfo { get; set; } public byte Type { get; private set; } = 1; public int EntriesCount { get; private set; } public PsoEnumEntryInfo[] Entries { get; set; } @@ -757,15 +980,13 @@ namespace CodeWalker.GameFiles { } public PsoEnumInfo(MetaName nameHash, byte type, params PsoEnumEntryInfo[] entries) { - IndexInfo = new PsoElementIndexInfo(); - IndexInfo.NameHash = nameHash; - IndexInfo.Offset = 0; //todo: fix? + IndexInfo = new PsoElementIndexInfo(nameHash, 0); EntriesCount = entries?.Length ?? 0; Entries = entries; } - public override void Read(DataReader reader) + public PsoEnumInfo(DataReader reader) { uint x = reader.ReadUInt32(); Type = (byte)((x & 0xFF000000) >> 24); @@ -774,13 +995,24 @@ namespace CodeWalker.GameFiles Entries = new PsoEnumEntryInfo[EntriesCount]; for (int i = 0; i < EntriesCount; i++) { - var entry = new PsoEnumEntryInfo(); - entry.Read(reader); - Entries[i] = entry; + Entries[i] = new PsoEnumEntryInfo(reader); } } - public override void Write(DataWriter writer) + public PsoEnumInfo(ref SequenceReader reader) + { + uint x = reader.ReadUInt32BigEndian(); + Type = (byte)((x & 0xFF000000) >> 24); + EntriesCount = (int)(x & 0x00FFFFFF); + + Entries = new PsoEnumEntryInfo[EntriesCount]; + for (int i = 0; i < EntriesCount; i++) + { + Entries[i] = new PsoEnumEntryInfo(ref reader); + } + } + + public void Write(DataWriter writer) { // update... Type = 1; @@ -795,31 +1027,65 @@ namespace CodeWalker.GameFiles } } - public PsoEnumEntryInfo FindEntry(int val) + public bool TryFindEntry(int val, out PsoEnumEntryInfo entry) { - if (Entries == null) return null; + if (Entries == null) + { + entry = default; + return false; + } + for (int i = 0; i < Entries.Length; i++) { - var entry = Entries[i]; - if (entry.EntryKey == val) + var _entry = Entries[i]; + if (_entry.EntryKey == val) { - return entry; + entry = _entry; + return true; } } + + entry = default; + return false; + } + + public PsoEnumEntryInfo? FindEntry(int val) + { + if (TryFindEntry(val, out var entry)) + { + return entry; + } return null; } - public PsoEnumEntryInfo FindEntryByName(MetaName name) + public bool TryFindEntryByName(MetaName name, out PsoEnumEntryInfo entry) { - if (Entries == null) return null; + if (Entries == null) + { + entry = default; + return false; + } for (int i = 0; i < Entries.Length; i++) { - var entry = Entries[i]; - if (entry.EntryNameHash == name) + var _entry = Entries[i]; + if (_entry.EntryNameHash == name) { - return entry; + entry = _entry; + return true; } } + + entry = default; + return false; + } + + public PsoEnumEntryInfo? FindEntryByName(MetaName name) + { + if (!TryFindEntryByName(name, out var entry)) + { + return entry; + } + return null; } @@ -827,14 +1093,15 @@ namespace CodeWalker.GameFiles public override string ToString() { - return IndexInfo.ToString() + " - " + Type.ToString() + ": " + EntriesCount.ToString(); + return $"{IndexInfo} - {Type}: {EntriesCount}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoEnumEntryInfo + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct PsoEnumEntryInfo { - public MetaName EntryNameHash { get; set; } - public int EntryKey { get; set; } + public readonly MetaName EntryNameHash; + public readonly int EntryKey; public PsoEnumEntryInfo() @@ -845,12 +1112,18 @@ namespace CodeWalker.GameFiles EntryKey = key; } - public void Read(DataReader reader) + public PsoEnumEntryInfo(DataReader reader) { EntryNameHash = (MetaName)reader.ReadUInt32(); EntryKey = reader.ReadInt32(); } + public PsoEnumEntryInfo(ref SequenceReader reader) + { + EntryNameHash = (MetaName)reader.ReadUInt32BigEndian(); + EntryKey = reader.ReadInt32BigEndian(); + } + public void Write(DataWriter writer) { writer.Write((uint)EntryNameHash); @@ -859,12 +1132,13 @@ namespace CodeWalker.GameFiles public override string ToString() { - return EntryNameHash.ToString() + ": " + EntryKey.ToString(); + return $"{EntryNameHash}: {EntryKey}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoSTRFSection + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoSTRFSection { public int Ident { get; private set; } = 0x53545246; public int Length { get; set; } @@ -877,10 +1151,22 @@ namespace CodeWalker.GameFiles List strs = new List(); while (reader.Position < reader.Length) { - strs.Add(reader.ReadString()); + var str = reader.ReadString(); + strs.Add(str); + JenkIndex.EnsureBoth(str); } - foreach (var str in strs) + Strings = strs.ToArray(); + } + + public void Read(ref SequenceReader reader) + { + Ident = reader.ReadInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + List strs = new List(); + while (reader.Consumed < reader.Length) { + var str = reader.ReadString(); + strs.Add(str); JenkIndex.EnsureBoth(str); } Strings = strs.ToArray(); @@ -912,11 +1198,12 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Ident.ToString() + ": " + Length.ToString(); + return $"{Ident}: {Length}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoSTRSSection + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoSTRSSection { public int Ident { get; private set; } = 0x53545253; public int Length { get; set; } @@ -931,12 +1218,24 @@ namespace CodeWalker.GameFiles List strs = new List(); while (reader.Position < reader.Length) { - strs.Add(reader.ReadString()); + var str = reader.ReadString(); + strs.Add(str); + JenkIndex.EnsureBoth(str); } - foreach (var str in strs) + Strings = strs.ToArray(); + } + + public void Read(ref SequenceReader reader) + { + Ident = reader.ReadInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + + List strs = new List(); + while (reader.Consumed < reader.Length) { - JenkIndex.Ensure(str); - JenkIndex.EnsureLower(str); + var str = reader.ReadString(); + strs.Add(str); + JenkIndex.EnsureBoth(str); } Strings = strs.ToArray(); } @@ -967,11 +1266,12 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Ident.ToString() + ": " + Length.ToString(); + return $"{Ident}: {Length}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoSTRESection + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoSTRESection { public int Ident { get; private set; } = 0x53545245; public int Length { get; set; } @@ -996,6 +1296,22 @@ namespace CodeWalker.GameFiles } } + public void Read(ref SequenceReader reader) + { + Ident = reader.ReadInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + + if (Length > 8) + { + Data = reader.ReadBytes(Length - 8).ToArray(); + + //Decr1 = GTACrypto.DecryptAES(Data); + //Decr2 = GTACrypto.DecryptNG(Data, ) + + //TODO: someone plz figure out that encryption + } + } + public void Write(DataWriter writer) { @@ -1013,11 +1329,12 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Ident.ToString() + ": " + Length.ToString(); + return $"{Ident}: {Length}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoPSIGSection + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoPSIGSection { public int Ident { get; private set; } = 0x50534947; public int Length { get; set; } @@ -1034,6 +1351,17 @@ namespace CodeWalker.GameFiles } } + public void Read(ref SequenceReader reader) + { + Ident = reader.ReadInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + + if (Length > 8) + { + Data = reader.ReadBytes(Length - 8).ToArray(); + } + } + public void Write(DataWriter writer) { Length = (Data?.Length ?? 0) + 8; @@ -1050,11 +1378,12 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Ident.ToString() + ": " + Length.ToString(); + return $"{Ident}: {Length}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class PsoCHKSSection + [TypeConverter(typeof(ExpandableObjectConverter))] + public class PsoCHKSSection { public int Ident { get; private set; } = 0x43484B53; public int Length { get; set; } @@ -1075,6 +1404,19 @@ namespace CodeWalker.GameFiles Unk0 = reader.ReadUInt32(); } + public void Read(ref SequenceReader reader) + { + Ident = reader.ReadInt32BigEndian(); + Length = reader.ReadInt32BigEndian(); + + if (Length != 20) + { return; } + + FileSize = reader.ReadUInt32BigEndian(); + Checksum = reader.ReadUInt32BigEndian(); + Unk0 = reader.ReadUInt32BigEndian(); + } + public void Write(DataWriter writer) { Length = 20; @@ -1088,7 +1430,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return Ident.ToString() + ": " + Length.ToString(); + return $"{Ident}: {Length}"; } } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/PsoBuilder.cs b/CodeWalker.Core/GameFiles/MetaTypes/PsoBuilder.cs index a956cf9..5fffe3f 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/PsoBuilder.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/PsoBuilder.cs @@ -46,7 +46,7 @@ namespace CodeWalker.GameFiles public PsoBuilderPointer AddItem(MetaName type, T item) where T : struct { - byte[] data = MetaTypes.ConvertToBytes(item); + byte[] data = MetaTypes.ConvertToBytes(in item); return AddItem(type, data); } @@ -62,10 +62,12 @@ namespace CodeWalker.GameFiles // data = newdata; //make sure item size is multiple of 16... so pointers don't need sub offsets! //} int idx = block.AddItem(data); - PsoBuilderPointer r = new PsoBuilderPointer(); - r.BlockID = block.Index + 1; - r.Offset = (idx * data.Length); - r.Length = data.Length; + PsoBuilderPointer r = new PsoBuilderPointer + { + BlockID = block.Index + 1, + Offset = (idx * data.Length), + Length = data.Length + }; return r; } @@ -89,10 +91,12 @@ namespace CodeWalker.GameFiles Buffer.BlockCopy(data, 0, newdata, 0, datalen); int offs = block.TotalSize; int idx = block.AddItem(newdata); - PsoBuilderPointer r = new PsoBuilderPointer(); - r.BlockID = block.Index + 1; - r.Offset = offs; //(idx * data.Length);; - r.Length = length; + PsoBuilderPointer r = new PsoBuilderPointer + { + BlockID = block.Index + 1, + Offset = offs, //(idx * data.Length);; + Length = length + }; return r; } @@ -148,10 +152,12 @@ namespace CodeWalker.GameFiles { if ((arr == null) || (arr.Length == 0)) return new Array_StructurePointer(); var ptr = AddItemArray((MetaName)MetaTypeName.PsoPOINTER, arr); - Array_StructurePointer sp = new Array_StructurePointer(); - sp.Count1 = (ushort)arr.Length; - sp.Count2 = sp.Count1; - sp.Pointer = ptr.Pointer; + Array_StructurePointer sp = new Array_StructurePointer + { + Count1 = (ushort)arr.Length, + Count2 = (ushort)arr.Length, + Pointer = ptr.Pointer, + }; return sp; } @@ -172,10 +178,12 @@ namespace CodeWalker.GameFiles Buffer.BlockCopy(data, 0, newdata, 0, datalen); int offs = block.TotalSize; int idx = block.AddItem(newdata); - PsoBuilderPointer r = new PsoBuilderPointer(); - r.BlockID = block.Index + 1; - r.Offset = offs;// (idx * data.Length); - r.Length = datalen; //actual length of string. + PsoBuilderPointer r = new PsoBuilderPointer + { + BlockID = block.Index + 1, + Offset = offs,// (idx * data.Length); + Length = datalen //actual length of string. + }; return r; } @@ -248,7 +256,7 @@ namespace CodeWalker.GameFiles { if (!StructureInfos.ContainsKey(name)) { - PsoStructureInfo si = PsoTypes.GetStructureInfo(name); + PsoStructureInfo si = PsoTypesStructureInfo.GetStructureInfo(name); if (si != null) { StructureInfos[name] = si; @@ -259,7 +267,7 @@ namespace CodeWalker.GameFiles { if (!EnumInfos.ContainsKey(name)) { - PsoEnumInfo ei = PsoTypes.GetEnumInfo(name); + PsoEnumInfo ei = PsoTypesEnumInfo.GetEnumInfo(name); if (ei != null) { EnumInfos[name] = ei; @@ -274,7 +282,7 @@ namespace CodeWalker.GameFiles if (valType == 0) { - inf = PsoTypes.GetStructureInfo((MetaName)MetaTypeName.ARRAYINFO); //default ARRAYINFO with pointer + inf = PsoTypesStructureInfo.GetStructureInfo((MetaName)MetaTypeName.ARRAYINFO); //default ARRAYINFO with pointer if (!StructureInfos.ContainsKey(inf.IndexInfo.NameHash)) { StructureInfos[inf.IndexInfo.NameHash] = inf; @@ -282,7 +290,7 @@ namespace CodeWalker.GameFiles return inf; } - var structInfo = PsoTypes.GetStructureInfo(valType); + var structInfo = PsoTypesStructureInfo.GetStructureInfo(valType); if (structInfo == null) { }//error? @@ -396,8 +404,7 @@ namespace CodeWalker.GameFiles pso.SchemaSection.EntriesIdx = new PsoElementIndexInfo[schEntries.Count]; for (int i = 0; i < schEntries.Count; i++) { - pso.SchemaSection.EntriesIdx[i] = new PsoElementIndexInfo(); - pso.SchemaSection.EntriesIdx[i].NameHash = schEntries[i].IndexInfo.NameHash; + pso.SchemaSection.EntriesIdx[i] = new PsoElementIndexInfo(schEntries[i].IndexInfo.NameHash, 0); } if (STRFStrings.Count > 0) @@ -422,10 +429,12 @@ namespace CodeWalker.GameFiles for (int i = 0; i < Blocks.Count; i++) { var b = Blocks[i]; - var e = new PsoDataMappingEntry(); - e.NameHash = b.StructureNameHash; - e.Length = b.TotalSize; - e.Offset = offset; + var e = new PsoDataMappingEntry + { + NameHash = b.StructureNameHash, + Length = b.TotalSize, + Offset = offset + }; offset += b.TotalSize; pso.DataMapSection.Entries[i] = e; } @@ -454,13 +463,7 @@ namespace CodeWalker.GameFiles return idx; } - public uint BasePointer - { - get - { - return (((uint)Index + 1) & 0xFFF); - } - } + public uint BasePointer => (((uint)Index + 1) & 0xFFF); //public MetaDataBlock GetMetaDataBlock() @@ -484,16 +487,16 @@ namespace CodeWalker.GameFiles } - public struct PsoBuilderPointer + public readonly struct PsoBuilderPointer { - public int BlockID { get; set; } //1-based id - public int Offset { get; set; } //byte offset - public int Length { get; set; } //for temp use... + public int BlockID { get; init; } //1-based id + public int Offset { get; init; } //byte offset + public int Length { get; init; } //for temp use... public uint Pointer { get { - uint bidx = (((uint)BlockID) & 0xFFF); + uint bidx = ((uint)BlockID) & 0xFFF; uint offs = (((uint)Offset) & 0xFFFFF) << 12; return bidx + offs; } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs index b531f5e..532404c 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs @@ -9,16516 +9,1134 @@ using System.Threading.Tasks; using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Buffers.Binary; +using System.Buffers; -namespace CodeWalker.GameFiles +namespace CodeWalker.GameFiles; + +public static class PsoTypes { - public static class PsoTypes + //for parsing schema info in PSO files to generate structs for PSO parsing. + //equivalent of MetaTypes but for PSO. + + public static Dictionary EnumDict = new Dictionary(); + public static Dictionary StructDict = new Dictionary(); + + + + public static void Clear() { - //for parsing schema info in PSO files to generate structs for PSO parsing. - //equivalent of MetaTypes but for PSO. + EnumDict.Clear(); + StructDict.Clear(); + } - public static Dictionary EnumDict = new Dictionary(); - public static Dictionary StructDict = new Dictionary(); + public static void EnsurePsoTypes(PsoFile pso) + { - - - public static void Clear() + if ((pso.SchemaSection == null) || (pso.SchemaSection.Entries == null) || (pso.SchemaSection.EntriesIdx == null)) { - EnumDict.Clear(); - StructDict.Clear(); + return; } - public static void EnsurePsoTypes(PsoFile pso) + + for (int i = 0; i < pso.SchemaSection.Entries.Length; i++) { + var entry = pso.SchemaSection.Entries[i]; - if ((pso.SchemaSection == null) || (pso.SchemaSection.Entries == null) || (pso.SchemaSection.EntriesIdx == null)) + if (entry is PsoEnumInfo enuminfo) { - return; - } - - - for (int i = 0; i < pso.SchemaSection.Entries.Length; i++) - { - var entry = pso.SchemaSection.Entries[i]; - var enuminfo = entry as PsoEnumInfo; - var structinfo = entry as PsoStructureInfo; - - if (enuminfo != null) + if (!EnumDict.ContainsKey(enuminfo.IndexInfo.NameHash)) { - if (!EnumDict.ContainsKey(enuminfo.IndexInfo.NameHash)) + EnumDict.Add(enuminfo.IndexInfo.NameHash, enuminfo); + } + else + { + PsoEnumInfo oldei = EnumDict[enuminfo.IndexInfo.NameHash]; + if (!ComparePsoEnumInfos(oldei, enuminfo)) { - EnumDict.Add(enuminfo.IndexInfo.NameHash, enuminfo); - } - else - { - PsoEnumInfo oldei = EnumDict[enuminfo.IndexInfo.NameHash]; - if (!ComparePsoEnumInfos(oldei, enuminfo)) + if (enuminfo.EntriesCount > oldei.EntriesCount)//assume this is newer... { - if (enuminfo.EntriesCount > oldei.EntriesCount)//assume this is newer... - { - EnumDict[enuminfo.IndexInfo.NameHash] = enuminfo; - } + EnumDict[enuminfo.IndexInfo.NameHash] = enuminfo; } } } - else if (structinfo != null) + } + else if (entry is PsoStructureInfo structinfo) + { + if (!StructDict.ContainsKey(structinfo.IndexInfo.NameHash)) { - if (!StructDict.ContainsKey(structinfo.IndexInfo.NameHash)) + StructDict.Add(structinfo.IndexInfo.NameHash, structinfo); + } + else + { + PsoStructureInfo oldsi = StructDict[structinfo.IndexInfo.NameHash]; + if (!ComparePsoStructureInfos(oldsi, structinfo)) { - StructDict.Add(structinfo.IndexInfo.NameHash, structinfo); - } - else - { - PsoStructureInfo oldsi = StructDict[structinfo.IndexInfo.NameHash]; - if (!ComparePsoStructureInfos(oldsi, structinfo)) + if (structinfo.EntriesCount > oldsi.EntriesCount) //assume more entries is newer.. maybe not correct { - if (structinfo.EntriesCount > oldsi.EntriesCount) //assume more entries is newer.. maybe not correct - { - StructDict[structinfo.IndexInfo.NameHash] = structinfo; - } + StructDict[structinfo.IndexInfo.NameHash] = structinfo; } } } - } } - public static bool ComparePsoEnumInfos(PsoEnumInfo a, PsoEnumInfo b) - { - //returns true if they are the same. + } - if (a.Entries.Length != b.Entries.Length) + public static bool ComparePsoEnumInfos(PsoEnumInfo a, PsoEnumInfo 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].EntryKey != b.Entries[i].EntryKey)) { return false; } - - for (int i = 0; i < a.Entries.Length; i++) - { - if ((a.Entries[i].EntryNameHash != b.Entries[i].EntryNameHash) || - (a.Entries[i].EntryKey != b.Entries[i].EntryKey)) - { - return false; - } - } - - return true; } - public static bool ComparePsoStructureInfos(PsoStructureInfo a, PsoStructureInfo b) - { - //returns true if they are the same. - if (a.Entries.Length != b.Entries.Length) + return true; + } + public static bool ComparePsoStructureInfos(PsoStructureInfo a, PsoStructureInfo 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].Type != b.Entries[i].Type)) { 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].Type != b.Entries[i].Type)) - { - return false; - } - } - - return true; } + return true; + } - public static string GetTypesString() + + 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) { - StringBuilder sbe = new StringBuilder(); - StringBuilder sbs = new StringBuilder(); - - sbe.AppendLine("//Enum infos"); - sbs.AppendLine("//Struct infos"); - - - foreach (var kvp in EnumDict) + var ei = kvp.Value; + string name = GetSafeName(ei.IndexInfo.NameHash, ei.Type); + sbe.AppendLine("public enum " + name + " //Type:" + ei.Type.ToString()); + sbe.AppendLine("{"); + foreach (var entry in ei.Entries) { - var ei = kvp.Value; - string name = GetSafeName(ei.IndexInfo.NameHash, ei.Type); - sbe.AppendLine("public enum " + name + " //Type:" + ei.Type.ToString()); - sbe.AppendLine("{"); - foreach (var entry in ei.Entries) - { - string eename = GetSafeName(entry.EntryNameHash, (uint)entry.EntryKey); - sbe.AppendFormat(" {0} = {1},", eename, entry.EntryKey); - sbe.AppendLine(); - } - sbe.AppendLine("}"); + string eename = GetSafeName(entry.EntryNameHash, (uint)entry.EntryKey); + sbe.AppendFormat(" {0} = {1},", eename, entry.EntryKey); sbe.AppendLine(); } + sbe.AppendLine("}"); + sbe.AppendLine(); + } - foreach (var kvp in StructDict) + foreach (var kvp in StructDict) + { + var si = kvp.Value; + string name = GetSafeName(si.IndexInfo.NameHash, si.Type); + sbs.AppendLine("public struct " + name + " //" + si.StructureLength.ToString() + " bytes, Type:" + si.Type.ToString()); + sbs.AppendLine("{"); + for (int i = 0; i < si.Entries.Length; i++) { - var si = kvp.Value; - string name = GetSafeName(si.IndexInfo.NameHash, si.Type); - sbs.AppendLine("public struct " + name + " //" + si.StructureLength.ToString() + " bytes, Type:" + si.Type.ToString()); - sbs.AppendLine("{"); - for (int i = 0; i < si.Entries.Length; i++) + var entry = si.Entries[i]; + + if ((entry.DataOffset == 0) && (entry.EntryNameHash == (MetaName)MetaTypeName.ARRAYINFO)) //referred to by array { - var entry = si.Entries[i]; + } + else + { + string sename = GetSafeName(entry.EntryNameHash, entry.ReferenceKey); + string fmt = " public {0} {1}; //{2} {3}"; - if ((entry.DataOffset == 0) && (entry.EntryNameHash == (MetaName)MetaTypeName.ARRAYINFO)) //referred to by array + if (entry.Type == PsoDataType.Array) { - } - else - { - string sename = GetSafeName(entry.EntryNameHash, entry.ReferenceKey); - string fmt = " public {0} {1}; //{2} {3}"; - - if (entry.Type == PsoDataType.Array) + if (entry.ReferenceKey >= si.Entries.Length) { - if (entry.ReferenceKey >= si.Entries.Length) - { - sbs.AppendFormat(fmt, entry.Type.ToString(), sename, entry.DataOffset, entry.ToString() + " { unexpected key! " + entry.ReferenceKey.ToString() + "}"); - sbs.AppendLine(); - } - else - { - var structentry = si.Entries[(int)entry.ReferenceKey]; - var typename = "Array_" + PsoDataTypes.GetCSharpTypeName(structentry.Type); - sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry.ToString() + " {" + structentry.ToString() + "}"); - sbs.AppendLine(); - } - } - else if (entry.Type == PsoDataType.Structure) - { - var typename = GetSafeName((MetaName)entry.ReferenceKey, entry.ReferenceKey); - sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry.ToString()); + sbs.AppendFormat(fmt, entry.Type.ToString(), sename, entry.DataOffset, entry.ToString() + " { unexpected key! " + entry.ReferenceKey.ToString() + "}"); sbs.AppendLine(); } else { - var typename = PsoDataTypes.GetCSharpTypeName(entry.Type); - sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry); + var structentry = si.Entries[(int)entry.ReferenceKey]; + var typename = "Array_" + PsoDataTypes.GetCSharpTypeName(structentry.Type); + sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry.ToString() + " {" + structentry.ToString() + "}"); 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() - { - StringBuilder sb = new StringBuilder(); - - foreach (var si in StructDict.Values) - { - AddStructureInfoString(si, sb); - } - - sb.AppendLine(); - - foreach (var ei in EnumDict.Values) - { - AddEnumInfoString(ei, sb); - } - - string str = sb.ToString(); - return str; - } - private static void AddStructureInfoString(PsoStructureInfo si, StringBuilder sb) - { - var ns = GetMetaNameString(si.IndexInfo.NameHash); - sb.AppendFormat("case " + ns + ":"); - sb.AppendLine(); - sb.AppendFormat("return new PsoStructureInfo({0}, {1}, {2}, {3},", ns, si.Type, si.Unk, si.StructureLength); - sb.AppendLine(); - for (int i = 0; i < si.Entries.Length; i++) - { - var e = si.Entries[i]; - string refkey = "0"; - if (e.ReferenceKey != 0) - { - refkey = GetMetaNameString((MetaName)e.ReferenceKey); - } - sb.AppendFormat(" new PsoStructureEntryInfo({0}, PsoDataType.{1}, {2}, {3}, {4})", GetMetaNameString(e.EntryNameHash), e.Type, e.DataOffset, e.Unk_5h, refkey); - if (i < si.Entries.Length - 1) sb.Append(","); - sb.AppendLine(); - } - sb.AppendFormat(");"); - sb.AppendLine(); - } - private static void AddEnumInfoString(PsoEnumInfo ei, StringBuilder sb) - { - var ns = GetMetaNameString(ei.IndexInfo.NameHash); - sb.AppendFormat("case " + ns + ":"); - sb.AppendLine(); - sb.AppendFormat("return new PsoEnumInfo({0}, {1},", ns, ei.Type); - sb.AppendLine(); - for (int i = 0; i < ei.Entries.Length; i++) - { - var e = ei.Entries[i]; - sb.AppendFormat(" new PsoEnumEntryInfo({0}, {1})", GetMetaNameString(e.EntryNameHash), e.EntryKey); - if (i < ei.Entries.Length - 1) sb.Append(","); - sb.AppendLine(); - } - sb.AppendFormat(");"); - sb.AppendLine(); - } - private static string GetMetaNameString(MetaName n) - { - if (Enum.IsDefined(typeof(MetaName), n)) - { - return "MetaName." + n.ToString(); - } - else - { - return "(MetaName)" + n.ToString(); - } - } - - - - public static PsoStructureInfo GetStructureInfo(MetaName name) - { - //to generate structinfos - switch (name) - { - case MetaName.CJunctionTemplateArray: - return new PsoStructureInfo(MetaName.CJunctionTemplateArray, 0, 0, 170688, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CJunctionTemplate), - new PsoStructureEntryInfo(MetaName.Entries, PsoDataType.Array, 0, 1, (MetaName)9830400), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2111264667), - new PsoStructureEntryInfo(MetaName.AutoJunctionAdjustments, PsoDataType.Array, 39344, 129, (MetaName)524290) - ); - case MetaName.CJunctionTemplate: - return new PsoStructureInfo(MetaName.CJunctionTemplate, 0, 0, 1136, - new PsoStructureEntryInfo(MetaName.iFlags, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.iNumJunctionNodes, PsoDataType.SInt, 4, 0, 0), - new PsoStructureEntryInfo(MetaName.iNumEntrances, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.iNumPhases, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.iNumTrafficLightLocations, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fSearchDistance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fPhaseOffset, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.vJunctionMin, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.vJunctionMax, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float3, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.vJunctionNodePositions, PsoDataType.Array, 64, 2, (MetaName)524297), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1057820426), - new PsoStructureEntryInfo(MetaName.Entrances, PsoDataType.Array, 192, 2, (MetaName)1048587), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)38018516), - new PsoStructureEntryInfo(MetaName.PhaseTimings, PsoDataType.Array, 960, 2, (MetaName)1048589), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2279781599), - new PsoStructureEntryInfo(MetaName.TrafficLightLocations, PsoDataType.Array, 1088, 2, (MetaName)524303) - ); - case (MetaName)1057820426: - return new PsoStructureInfo((MetaName)1057820426, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.vNodePosition, PsoDataType.Float3, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.iPhase, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fStoppingDistance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fOrientation, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fAngleFromCenter, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.bCanTurnRightOnRedLight, PsoDataType.Bool, 33, 0, 0), - new PsoStructureEntryInfo(MetaName.bLeftLaneIsAheadOnly, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.bRightLaneIsRightOnly, PsoDataType.Bool, 34, 0, 0), - new PsoStructureEntryInfo(MetaName.iLeftFilterLanePhase, PsoDataType.SInt, 36, 0, 0) - ); - case (MetaName)38018516: - return new PsoStructureInfo((MetaName)38018516, 0, 0, 8, - new PsoStructureEntryInfo(MetaName.fStartTime, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.fDuration, PsoDataType.Float, 4, 0, 0) - ); - case (MetaName)2279781599: - return new PsoStructureInfo((MetaName)2279781599, 0, 0, 6, - new PsoStructureEntryInfo(MetaName.iPosX, PsoDataType.SShort, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.iPosY, PsoDataType.SShort, 2, 0, 0), - new PsoStructureEntryInfo(MetaName.iPosZ, PsoDataType.SShort, 4, 0, 0) - ); - case (MetaName)2111264667: - return new PsoStructureInfo((MetaName)2111264667, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.vLocation, PsoDataType.Float3a, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.fCycleOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fCycleDuration, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CVehicleModelInfoVarGlobal: //carcols.ymt root - return new PsoStructureInfo(MetaName.CVehicleModelInfoVarGlobal, 0, 0, 392, - new PsoStructureEntryInfo(MetaName.VehiclePlates, PsoDataType.Structure, 8, 0, (MetaName)465922034), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModelColor), - new PsoStructureEntryInfo(MetaName.Colors, PsoDataType.Array, 48, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleMetallicSetting), - new PsoStructureEntryInfo(MetaName.MetallicSettings, PsoDataType.Array, 64, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleWindowColor), - new PsoStructureEntryInfo(MetaName.WindowColors, PsoDataType.Array, 80, 0, (MetaName)5), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.vehicleLightSettings), - new PsoStructureEntryInfo(MetaName.Lights, PsoDataType.Array, 96, 0, (MetaName)MetaTypeName.POINTER), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.sirenSettings), - new PsoStructureEntryInfo(MetaName.Sirens, PsoDataType.Array, 112, 0, (MetaName)9), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleKit), - new PsoStructureEntryInfo(MetaName.Kits, PsoDataType.Array, 128, 0, (MetaName)11), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleWheel), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Array, 0, 0, (MetaName)13), - new PsoStructureEntryInfo(MetaName.Wheels, PsoDataType.Array, 144, 4, (MetaName)851982), - new PsoStructureEntryInfo(MetaName.GlobalVariationData, PsoDataType.Structure, 352, 0, (MetaName)3062246906), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleXenonLightColor), - new PsoStructureEntryInfo(MetaName.XenonLightColors, PsoDataType.Array, 376, 0, (MetaName)MetaTypeName.BYTE) - ); - case (MetaName)465922034: //CVehicleModelInfoVarGlobal VehiclePlates - return new PsoStructureInfo((MetaName)465922034, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3027500557), - new PsoStructureEntryInfo(MetaName.Textures, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTexureIndex, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.NumericOffset, PsoDataType.UByte, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.AlphabeticOffset, PsoDataType.UByte, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.SpaceOffset, PsoDataType.UByte, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.RandomCharOffset, PsoDataType.UByte, 31, 0, 0), - new PsoStructureEntryInfo(MetaName.NumRandomChar, PsoDataType.UByte, 32, 0, 0) - ); - case (MetaName)3027500557: //CVehicleModelInfoVarGlobal VehiclePlates Texture - return new PsoStructureInfo((MetaName)3027500557, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.TextureSetName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DiffuseMapName, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.NormalMapName, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.FontExtents, PsoDataType.Float4, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLettersOnPlate, PsoDataType.Float2, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.FontColor, PsoDataType.UInt, 56, 1, 0), - new PsoStructureEntryInfo(MetaName.FontOutlineColor, PsoDataType.UInt, 60, 1, 0), - new PsoStructureEntryInfo(MetaName.IsFontOutlineEnabled, PsoDataType.Bool, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.FontOutlineMinMaxDepth, PsoDataType.Float2, 68, 0, 0) - ); - case (MetaName)3062246906: //CVehicleModelInfoVarGlobal GlobalVariationData - return new PsoStructureInfo((MetaName)3062246906, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.xenonLightColor, PsoDataType.UInt, 8, 1, 0), - new PsoStructureEntryInfo(MetaName.xenonCoronaColor, PsoDataType.UInt, 12, 1, 0), - new PsoStructureEntryInfo(MetaName.xenonLightIntensityModifier, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.xenonCoronaIntensityModifier, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CVehicleXenonLightColor: //CVehicleModelInfoVarGlobal XenonLightColors - return new PsoStructureInfo(MetaName.CVehicleXenonLightColor, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.lightColor, PsoDataType.UInt, 8, 1, 0), - new PsoStructureEntryInfo(MetaName.coronaColor, PsoDataType.UInt, 12, 1, 0), - new PsoStructureEntryInfo(MetaName.lightIntensityModifier, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.coronaIntensityModifier, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CVehicleModelColor: //CVehicleModelInfoVarGlobal Colors - return new PsoStructureInfo(MetaName.CVehicleModelColor, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 8, 1, 0), - new PsoStructureEntryInfo(MetaName.metallicID, PsoDataType.Enum, 12, 2, (MetaName)360458334), - new PsoStructureEntryInfo(MetaName.audioColor, PsoDataType.Enum, 13, 2, (MetaName)544262540), - new PsoStructureEntryInfo(MetaName.audioPrefix, PsoDataType.Enum, 14, 2, (MetaName)2065815796), - new PsoStructureEntryInfo(MetaName.audioColorHash, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.audioPrefixHash, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.colorName, PsoDataType.String, 24, 1, 0) - ); - case MetaName.CVehicleMetallicSetting: //CVehicleModelInfoVarGlobal MetallicSettings - return new PsoStructureInfo(MetaName.CVehicleMetallicSetting, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.specInt, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.specFalloff, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.specFresnel, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CVehicleWindowColor: //CVehicleModelInfoVarGlobal WindowColors - return new PsoStructureInfo(MetaName.CVehicleWindowColor, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 8, 1, 0), - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 12, 7, 0) - ); - case MetaName.vehicleLightSettings: //CVehicleModelInfoVarGlobal Lights - return new PsoStructureInfo(MetaName.vehicleLightSettings, 0, 0, 552, - new PsoStructureEntryInfo(MetaName.id, PsoDataType.UByte, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.indicator, PsoDataType.Structure, 16, 0, MetaName.vehicleLight), - new PsoStructureEntryInfo(MetaName.rearIndicatorCorona, PsoDataType.Structure, 64, 0, MetaName.vehicleCorona), - new PsoStructureEntryInfo(MetaName.frontIndicatorCorona, PsoDataType.Structure, 120, 0, MetaName.vehicleCorona), - new PsoStructureEntryInfo(MetaName.tailLight, PsoDataType.Structure, 176, 0, MetaName.vehicleLight), - new PsoStructureEntryInfo(MetaName.tailLightCorona, PsoDataType.Structure, 224, 0, MetaName.vehicleCorona), - new PsoStructureEntryInfo(MetaName.tailLightMiddleCorona, PsoDataType.Structure, 280, 0, MetaName.vehicleCorona), - new PsoStructureEntryInfo(MetaName.headLight, PsoDataType.Structure, 336, 0, MetaName.vehicleLight), - new PsoStructureEntryInfo(MetaName.headLightCorona, PsoDataType.Structure, 384, 0, MetaName.vehicleCorona), - new PsoStructureEntryInfo(MetaName.reversingLight, PsoDataType.Structure, 440, 0, MetaName.vehicleLight), - new PsoStructureEntryInfo(MetaName.reversingLightCorona, PsoDataType.Structure, 488, 0, MetaName.vehicleCorona), - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 544, 1, 0) - ); - case MetaName.vehicleLight: //CVehicleModelInfoVarGlobal Lights Light info - return new PsoStructureInfo(MetaName.vehicleLight, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.intensity, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.falloffMax, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.falloffExponent, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.innerConeAngle, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.outerConeAngle, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.emmissiveBoost, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 32, 1, 0), - new PsoStructureEntryInfo(MetaName.textureName, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.mirrorTexture, PsoDataType.Bool, 40, 0, 0) - ); - case MetaName.vehicleCorona: //CVehicleModelInfoVarGlobal Lights Corona info - return new PsoStructureInfo(MetaName.vehicleCorona, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.size, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.size_far, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.intensity, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.intensity_far, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 24, 1, 0), - new PsoStructureEntryInfo(MetaName.numCoronas, PsoDataType.UByte, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.distBetweenCoronas, PsoDataType.UByte, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.distBetweenCoronas_far, PsoDataType.UByte, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.xRotation, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.yRotation, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.zRotation, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.zBias, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.pullCoronaIn, PsoDataType.Bool, 48, 0, 0) - ); - case MetaName.sirenSettings: - return new PsoStructureInfo(MetaName.sirenSettings, 0, 0, 2376, - new PsoStructureEntryInfo(MetaName.id, PsoDataType.UByte, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 16, 1, 0), - new PsoStructureEntryInfo(MetaName.timeMultiplier, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.lightFalloffMax, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.lightFalloffExponent, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.lightInnerConeAngle, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.lightOuterConeAngle, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.lightOffset, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.textureName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.sequencerBpm, PsoDataType.UInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.leftHeadLight, PsoDataType.Structure, 56, 0, (MetaName)188820339), - new PsoStructureEntryInfo(MetaName.rightHeadLight, PsoDataType.Structure, 72, 0, (MetaName)188820339), - new PsoStructureEntryInfo(MetaName.leftTailLight, PsoDataType.Structure, 88, 0, (MetaName)188820339), - new PsoStructureEntryInfo(MetaName.rightTailLight, PsoDataType.Structure, 104, 0, (MetaName)188820339), - new PsoStructureEntryInfo(MetaName.leftHeadLightMultiples, PsoDataType.UByte, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.rightHeadLightMultiples, PsoDataType.UByte, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.leftTailLightMultiples, PsoDataType.UByte, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.rightTailLightMultiples, PsoDataType.UByte, 123, 0, 0), - new PsoStructureEntryInfo(MetaName.useRealLights, PsoDataType.Bool, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.sirenLight), - new PsoStructureEntryInfo(MetaName.sirens, PsoDataType.Array, 128, 1, (MetaName)1310739) - ); - case (MetaName)188820339: - return new PsoStructureInfo((MetaName)188820339, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.sequencer, PsoDataType.UInt, 8, 0, 0) - ); - case MetaName.sirenLight: - return new PsoStructureInfo(MetaName.sirenLight, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.rotation, PsoDataType.Structure, 8, 0, (MetaName)1356743507), - new PsoStructureEntryInfo(MetaName.flashiness, PsoDataType.Structure, 40, 0, (MetaName)1356743507), - new PsoStructureEntryInfo(MetaName.corona, PsoDataType.Structure, 72, 0, MetaName.sirenCorona), - new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 96, 1, 0), - new PsoStructureEntryInfo(MetaName.intensity, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.lightGroup, PsoDataType.UByte, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.rotate, PsoDataType.Bool, 105, 0, 0), - new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Bool, 106, 0, 0), - new PsoStructureEntryInfo(MetaName.scaleFactor, PsoDataType.UByte, 107, 0, 0), - new PsoStructureEntryInfo(MetaName.flash, PsoDataType.Bool, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.light, PsoDataType.Bool, 109, 0, 0), - new PsoStructureEntryInfo(MetaName.spotLight, PsoDataType.Bool, 110, 0, 0), - new PsoStructureEntryInfo(MetaName.castShadows, PsoDataType.Bool, 111, 0, 0) - ); - case (MetaName)1356743507: - return new PsoStructureInfo((MetaName)1356743507, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.delta, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.start, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.speed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.sequencer, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.multiples, PsoDataType.UByte, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.direction, PsoDataType.Bool, 25, 0, 0), - new PsoStructureEntryInfo(MetaName.syncToBpm, PsoDataType.Bool, 26, 0, 0) - ); - case MetaName.sirenCorona: - return new PsoStructureInfo(MetaName.sirenCorona, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.intensity, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.size, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.pull, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.faceCamera, PsoDataType.Bool, 20, 0, 0) - ); - case MetaName.CVehicleKit: - return new PsoStructureInfo(MetaName.CVehicleKit, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.kitName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.id, PsoDataType.UShort, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.kitType, PsoDataType.Enum, 16, 0, MetaName.eModKitType), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModVisible), - new PsoStructureEntryInfo(MetaName.visibleMods, PsoDataType.Array, 24, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModLink), - new PsoStructureEntryInfo(MetaName.linkMods, PsoDataType.Array, 40, 0, (MetaName)5), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModStat), - new PsoStructureEntryInfo(MetaName.statMods, PsoDataType.Array, 56, 0, (MetaName)7), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)427606548), - new PsoStructureEntryInfo(MetaName.slotNames, PsoDataType.Array, 72, 0, (MetaName)9), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), - new PsoStructureEntryInfo(MetaName.liveryNames, PsoDataType.Array, 88, 0, (MetaName)11), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), - new PsoStructureEntryInfo(MetaName.livery2Names, PsoDataType.Array, 104, 0, (MetaName)13) - ); - case MetaName.CVehicleModStat: - return new PsoStructureInfo(MetaName.CVehicleModStat, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.identifier, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.modifier, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.audioApply, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.weight, PsoDataType.UByte, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.type, PsoDataType.Enum, 24, 0, MetaName.eVehicleModType) - ); - case MetaName.CVehicleModVisible: - return new PsoStructureInfo(MetaName.CVehicleModVisible, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.modelName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.modShopLabel, PsoDataType.String, 16, 2, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.linkedModels, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3635907608), - new PsoStructureEntryInfo(MetaName.turnOffBones, PsoDataType.Array, 40, 0, (MetaName)4), - new PsoStructureEntryInfo(MetaName.type, PsoDataType.Enum, 56, 0, MetaName.eVehicleModType), - new PsoStructureEntryInfo(MetaName.bone, PsoDataType.Enum, 60, 0, (MetaName)3635907608), - new PsoStructureEntryInfo(MetaName.collisionBone, PsoDataType.Enum, 64, 0, (MetaName)3635907608), - new PsoStructureEntryInfo(MetaName.cameraPos, PsoDataType.Enum, 68, 0, MetaName.eVehicleModCameraPos), - new PsoStructureEntryInfo(MetaName.audioApply, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.weight, PsoDataType.UByte, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.turnOffExtra, PsoDataType.Bool, 77, 0, 0), - new PsoStructureEntryInfo(MetaName.disableBonnetCamera, PsoDataType.Bool, 78, 0, 0), - new PsoStructureEntryInfo(MetaName.allowBonnetSlide, PsoDataType.Bool, 79, 0, 0), - new PsoStructureEntryInfo(MetaName.weaponSlot, PsoDataType.SByte, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.weaponSlotSecondary, PsoDataType.SByte, 81, 0, 0), - new PsoStructureEntryInfo(MetaName.disableProjectileDriveby, PsoDataType.Bool, 82, 0, 0), - new PsoStructureEntryInfo(MetaName.disableDriveby, PsoDataType.Bool, 83, 0, 0), - new PsoStructureEntryInfo(MetaName.disableDrivebySeat, PsoDataType.SInt, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.disableDrivebySeatSecondary, PsoDataType.SInt, 88, 0, 0) - ); - case (MetaName)427606548: - return new PsoStructureInfo((MetaName)427606548, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.slot, PsoDataType.Enum, 8, 0, MetaName.eVehicleModType), - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 16, 2, 0) - ); - case MetaName.CVehicleModLink: - return new PsoStructureInfo(MetaName.CVehicleModLink, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.modelName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.bone, PsoDataType.Enum, 12, 0, (MetaName)3635907608), - new PsoStructureEntryInfo(MetaName.turnOffExtra, PsoDataType.Bool, 16, 0, 0) - ); - case MetaName.CVehicleWheel: - return new PsoStructureInfo(MetaName.CVehicleWheel, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.wheelName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.wheelVariation, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.modShopLabel, PsoDataType.String, 16, 2, 0), - new PsoStructureEntryInfo(MetaName.rimRadius, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.rear, PsoDataType.Bool, 28, 0, 0) - ); - case MetaName.CVehicleModColors: //carmodcols.ymt root - return new PsoStructureInfo(MetaName.CVehicleModColors, 0, 0, 128, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), - new PsoStructureEntryInfo(MetaName.metallic, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), - new PsoStructureEntryInfo(MetaName.classic, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), - new PsoStructureEntryInfo(MetaName.matte, PsoDataType.Array, 40, 0, (MetaName)4), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), - new PsoStructureEntryInfo(MetaName.metals, PsoDataType.Array, 56, 0, (MetaName)6), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), - new PsoStructureEntryInfo(MetaName.chrome, PsoDataType.Array, 72, 0, (MetaName)8), - new PsoStructureEntryInfo(MetaName.pearlescent, PsoDataType.Structure, 88, 0, MetaName.CVehicleModPearlescentColors) - ); - case MetaName.CVehicleModPearlescentColors: - return new PsoStructureInfo(MetaName.CVehicleModPearlescentColors, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), - new PsoStructureEntryInfo(MetaName.baseCols, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), - new PsoStructureEntryInfo(MetaName.specCols, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case MetaName.CVehicleModColor: - return new PsoStructureInfo(MetaName.CVehicleModColor, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 2, 0), - new PsoStructureEntryInfo(MetaName.col, PsoDataType.UByte, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.spec, PsoDataType.UByte, 17, 0, 0) - ); - case MetaName.CVehicleModelInfoVariation: //carvariations.ymt root - return new PsoStructureInfo(MetaName.CVehicleModelInfoVariation, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)418053801), - new PsoStructureEntryInfo(MetaName.variationData, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)418053801: //CVehicleModelInfoVariation variationData - return new PsoStructureInfo((MetaName)418053801, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.modelName, PsoDataType.String, 8, 1, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2575850962), - new PsoStructureEntryInfo(MetaName.colors, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.kits, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.windowsWithExposedEdges, PsoDataType.Array, 48, 0, (MetaName)5), - new PsoStructureEntryInfo(MetaName.plateProbabilities, PsoDataType.Structure, 64, 0, MetaName.PlateProbabilities), - new PsoStructureEntryInfo(MetaName.lightSettings, PsoDataType.UByte, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.sirenSettings, PsoDataType.UByte, 89, 0, 0) - ); - case (MetaName)2575850962: //CVehicleModelInfoVariation variationData colors - return new PsoStructureInfo((MetaName)2575850962, 0, 0, 44 /*40*/, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.indices, PsoDataType.Array, 8, 4, (MetaName)393216 /*262144*/), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Bool, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.liveries, PsoDataType.Array, 14 /*12*/, 4, (MetaName)1966082 /*1638402*/) - ); - case MetaName.PlateProbabilities: - return new PsoStructureInfo(MetaName.PlateProbabilities, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)938618322), - new PsoStructureEntryInfo(MetaName.Probabilities, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)938618322: - return new PsoStructureInfo((MetaName)938618322, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.UInt, 12, 0, 0) - ); - case MetaName.CCreditArray: //credits.ymt root - return new PsoStructureInfo(MetaName.CCreditArray, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCreditItem), - new PsoStructureEntryInfo(MetaName.CreditItems, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.CCreditItem: - return new PsoStructureInfo(MetaName.CCreditItem, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.LineType, PsoDataType.Enum, 8, 0, (MetaName)1795685103), - new PsoStructureEntryInfo(MetaName.cTextId1, PsoDataType.String, 16, 3, 0), - new PsoStructureEntryInfo(MetaName.cTextId2, PsoDataType.String, 32, 3, 0) - ); - case MetaName.CDataFileMgr__ContentsOfDataFileXml: - return new PsoStructureInfo(MetaName.CDataFileMgr__ContentsOfDataFileXml, 0, 0, 120, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.disabledFiles, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__DataFileArray), - new PsoStructureEntryInfo(MetaName.includedXmlFiles, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.includedDataFiles, PsoDataType.Array, 40, 0, (MetaName)4), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__DataFile), - new PsoStructureEntryInfo(MetaName.dataFiles, PsoDataType.Array, 56, 0, (MetaName)6), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__ContentChangeSet), - new PsoStructureEntryInfo(MetaName.contentChangeSets, PsoDataType.Array, 72, 0, (MetaName)8), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.patchFiles, PsoDataType.Array, 88, 0, (MetaName)10), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.allowedFolders, PsoDataType.Array, 104, 0, (MetaName)MetaTypeName.PsoPOINTER) - ); - case MetaName.CDataFileMgr__DataFile: - return new PsoStructureInfo(MetaName.CDataFileMgr__DataFile, 0, 0, 176, - new PsoStructureEntryInfo(MetaName.filename, PsoDataType.String, 8, 0, (MetaName)8388608), - new PsoStructureEntryInfo(MetaName.fileType, PsoDataType.Enum, 136, 0, MetaName.DataFileType), - new PsoStructureEntryInfo(MetaName.registerAs, PsoDataType.String, 144, 3, 0), - new PsoStructureEntryInfo(MetaName.locked, PsoDataType.Bool, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.loadCompletely, PsoDataType.Bool, 161, 0, 0), - new PsoStructureEntryInfo(MetaName.overlay, PsoDataType.Bool, 162, 0, 0), - new PsoStructureEntryInfo(MetaName.patchFile, PsoDataType.Bool, 163, 0, 0), - new PsoStructureEntryInfo(MetaName.disabled, PsoDataType.Bool, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.persistent, PsoDataType.Bool, 165, 0, 0), - new PsoStructureEntryInfo(MetaName.enforceLsnSorting, PsoDataType.Bool, 166, 0, 0), - new PsoStructureEntryInfo(MetaName.contents, PsoDataType.Enum, 168, 0, MetaName.DataFileContents), - new PsoStructureEntryInfo(MetaName.installPartition, PsoDataType.Enum, 172, 0, MetaName.InstallPartition) - ); - case MetaName.CLevelData: //levels.ymt root - return new PsoStructureInfo(MetaName.CLevelData, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.sLevelData), - new PsoStructureEntryInfo(MetaName.aLevelsData, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.sLevelData: - return new PsoStructureInfo(MetaName.sLevelData, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.cFriendlyName, PsoDataType.String, 8, 3, 0), - new PsoStructureEntryInfo(MetaName.cTitle, PsoDataType.String, 24, 3, 0), - new PsoStructureEntryInfo(MetaName.cFilename, PsoDataType.String, 40, 3, 0), - new PsoStructureEntryInfo(MetaName.cBugstarName, PsoDataType.String, 56, 3, 0) - ); - case (MetaName)1056751197: //mapdatacullboxes.ymt root - return new PsoStructureInfo((MetaName)1056751197, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)322201475), - new PsoStructureEntryInfo(MetaName.entries, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)322201475: - return new PsoStructureInfo((MetaName)322201475, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.aabb, PsoDataType.Structure, 16, 0, MetaName.rage__spdAABB), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)4022397219, PsoDataType.Array, 48, 0, (MetaName)2), - new PsoStructureEntryInfo(MetaName.bEnabled, PsoDataType.Bool, 64, 0, 0) - ); - case MetaName.rage__spdAABB: - return new PsoStructureInfo(MetaName.rage__spdAABB, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.min, PsoDataType.Float4a, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.max, PsoDataType.Float4a, 16, 0, 0) - ); - case MetaName.CPedModelInfo__InitDataList: - return new PsoStructureInfo(MetaName.CPedModelInfo__InitDataList, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.residentTxd, PsoDataType.String, 8, 3, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.residentAnims, PsoDataType.Array, 24, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedModelInfo__InitData), - new PsoStructureEntryInfo(MetaName.InitDatas, PsoDataType.Array, 40, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CTxdRelationship), - new PsoStructureEntryInfo(MetaName.txdRelationships, PsoDataType.Array, 56, 0, (MetaName)5), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CMultiTxdRelationship), - new PsoStructureEntryInfo(MetaName.multiTxdRelationships, PsoDataType.Array, 72, 0, (MetaName)7) - ); - case MetaName.CPedModelInfo__InitData: - return new PsoStructureInfo(MetaName.CPedModelInfo__InitData, 0, 0, 296, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 2, 0), - new PsoStructureEntryInfo(MetaName.PropsName, PsoDataType.String, 16, 2, 0), - new PsoStructureEntryInfo(MetaName.ClipDictionaryName, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.BlendShapeFileName, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo(MetaName.ExpressionSetName, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.ExpressionDictionaryName, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.ExpressionName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.Pedtype, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.MovementClipSet, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.MovementClipSets, PsoDataType.Array, 56, 0, (MetaName)9), - new PsoStructureEntryInfo(MetaName.StrafeClipSet, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo(MetaName.MovementToStrafeClipSet, PsoDataType.String, 76, 7, 0), - new PsoStructureEntryInfo(MetaName.InjuredStrafeClipSet, PsoDataType.String, 80, 7, 0), - new PsoStructureEntryInfo(MetaName.FullBodyDamageClipSet, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo(MetaName.AdditiveDamageClipSet, PsoDataType.String, 88, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultGestureClipSet, PsoDataType.String, 92, 7, 0), - new PsoStructureEntryInfo(MetaName.FacialClipsetGroupName, PsoDataType.String, 96, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultVisemeClipSet, PsoDataType.String, 100, 7, 0), - new PsoStructureEntryInfo(MetaName.SidestepClipSet, PsoDataType.String, 104, 7, 0), - new PsoStructureEntryInfo(MetaName.PoseMatcherName, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo(MetaName.PoseMatcherProneName, PsoDataType.String, 112, 7, 0), - new PsoStructureEntryInfo(MetaName.GetupSetHash, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.CreatureMetadataName, PsoDataType.String, 120, 7, 0), - new PsoStructureEntryInfo(MetaName.DecisionMakerName, PsoDataType.String, 124, 7, 0), - new PsoStructureEntryInfo(MetaName.MotionTaskDataSetName, PsoDataType.String, 128, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultTaskDataSetName, PsoDataType.String, 132, 7, 0), - new PsoStructureEntryInfo(MetaName.PedCapsuleName, PsoDataType.String, 136, 7, 0), - new PsoStructureEntryInfo(MetaName.PedLayoutName, PsoDataType.String, 140, 7, 0), - new PsoStructureEntryInfo(MetaName.PedComponentSetName, PsoDataType.String, 144, 7, 0), - new PsoStructureEntryInfo(MetaName.PedComponentClothName, PsoDataType.String, 148, 7, 0), - new PsoStructureEntryInfo(MetaName.PedIKSettingsName, PsoDataType.String, 152, 7, 0), - new PsoStructureEntryInfo(MetaName.TaskDataName, PsoDataType.String, 156, 7, 0), - new PsoStructureEntryInfo(MetaName.IsStreamedGfx, PsoDataType.Bool, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.AmbulanceShouldRespondTo, PsoDataType.Bool, 161, 0, 0), - new PsoStructureEntryInfo(MetaName.CanRideBikeWithNoHelmet, PsoDataType.Bool, 162, 0, 0), - new PsoStructureEntryInfo(MetaName.CanSpawnInCar, PsoDataType.Bool, 163, 0, 0), - new PsoStructureEntryInfo(MetaName.IsHeadBlendPed, PsoDataType.Bool, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.bOnlyBulkyItemVariations, PsoDataType.Bool, 165, 0, 0), - new PsoStructureEntryInfo(MetaName.RelationshipGroup, PsoDataType.String, 168, 7, 0), - new PsoStructureEntryInfo(MetaName.NavCapabilitiesName, PsoDataType.String, 172, 7, 0), - new PsoStructureEntryInfo(MetaName.PerceptionInfo, PsoDataType.String, 176, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBrawlingStyle, PsoDataType.String, 180, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultUnarmedWeapon, PsoDataType.String, 184, 7, 0), - new PsoStructureEntryInfo(MetaName.Personality, PsoDataType.String, 188, 7, 0), - new PsoStructureEntryInfo(MetaName.CombatInfo, PsoDataType.String, 192, 7, 0), - new PsoStructureEntryInfo(MetaName.VfxInfoName, PsoDataType.String, 196, 7, 0), - new PsoStructureEntryInfo(MetaName.AmbientClipsForFlee, PsoDataType.String, 200, 7, 0), - new PsoStructureEntryInfo(MetaName.Radio1, PsoDataType.Enum, 204, 0, MetaName.ePedRadioGenre), - new PsoStructureEntryInfo(MetaName.Radio2, PsoDataType.Enum, 208, 0, MetaName.ePedRadioGenre), - new PsoStructureEntryInfo(MetaName.FUpOffset, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.RUpOffset, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.FFrontOffset, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.RFrontOffset, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.MinActivationImpulse, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.Stubble, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.HDDist, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetingThreatModifier, PsoDataType.Float, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.KilledPerceptionRangeModifer, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eSexinessFlags), - new PsoStructureEntryInfo(MetaName.Sexiness, PsoDataType.Flags, 248, 0, (MetaName)2097211), - new PsoStructureEntryInfo(MetaName.Age, PsoDataType.UByte, 252, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPassengersInCar, PsoDataType.UByte, 253, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eExternallyDrivenDOFs), - new PsoStructureEntryInfo(MetaName.ExternallyDrivenDOFs, PsoDataType.Flags, 254, 2, (MetaName)327743), - new PsoStructureEntryInfo(MetaName.PedVoiceGroup, PsoDataType.String, 256, 7, 0), - new PsoStructureEntryInfo(MetaName.AnimalAudioObject, PsoDataType.String, 260, 7, 0), - new PsoStructureEntryInfo(MetaName.AbilityType, PsoDataType.Enum, 264, 0, MetaName.SpecialAbilityType), - new PsoStructureEntryInfo(MetaName.ThermalBehaviour, PsoDataType.Enum, 268, 0, MetaName.ThermalBehaviour), - new PsoStructureEntryInfo(MetaName.SuperlodType, PsoDataType.Enum, 272, 0, MetaName.eSuperlodType), - new PsoStructureEntryInfo(MetaName.ScenarioPopStreamingSlot, PsoDataType.Enum, 276, 0, MetaName.eScenarioPopStreamingSlot), - new PsoStructureEntryInfo(MetaName.DefaultSpawningPreference, PsoDataType.Enum, 280, 0, MetaName.DefaultSpawnPreference), - new PsoStructureEntryInfo(MetaName.DefaultRemoveRangeMultiplier, PsoDataType.Float, 284, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowCloseSpawning, PsoDataType.Bool, 288, 0, 0) - ); - case MetaName.CMultiTxdRelationship: - return new PsoStructureInfo(MetaName.CMultiTxdRelationship, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.parent, PsoDataType.String, 8, 3, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.children, PsoDataType.Array, 24, 0, (MetaName)1) - ); - case MetaName.CPlayerSpecialAbilityManager: - return new PsoStructureInfo(MetaName.CPlayerSpecialAbilityManager, 0, 0, 64, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4125685004), - new PsoStructureEntryInfo(MetaName.specialAbilities, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.smallCharge, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.mediumCharge, PsoDataType.SInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.largeCharge, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.continuousCharge, PsoDataType.SInt, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fadeCurveType, PsoDataType.Enum, 40, 0, MetaName.eFadeCurveType), - new PsoStructureEntryInfo(MetaName.halfSigmoidConstant, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.sigmoidConstant, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fadeInTime, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.fadeOutTime, PsoDataType.Float, 56, 0, 0) - ); - case (MetaName)4125685004: - return new PsoStructureInfo((MetaName)4125685004, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.duration, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.initialUnlockedCap, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.timeWarpScale, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.damageMultiplier, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.defenseMultiplier, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.depletionMultiplier, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.chargeMultiplier, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fxName, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.outFxName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.activeAnimSet, PsoDataType.String, 44, 7, 0) - ); - case MetaName.CDataFileMgr__ContentChangeSet: - return new PsoStructureInfo(MetaName.CDataFileMgr__ContentChangeSet, 0, 0, 184, - new PsoStructureEntryInfo(MetaName.changeSetName, PsoDataType.String, 8, 3, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__ChangeSetData), - new PsoStructureEntryInfo(MetaName.mapChangeSetData, PsoDataType.Array, 24, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.filesToInvalidate, PsoDataType.Array, 40, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.filesToDisable, PsoDataType.Array, 56, 0, (MetaName)5), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.filesToEnable, PsoDataType.Array, 72, 0, (MetaName)MetaTypeName.POINTER), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.txdToLoad, PsoDataType.Array, 88, 0, (MetaName)9), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.txdToUnload, PsoDataType.Array, 104, 0, (MetaName)11), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__ResourceReference), - new PsoStructureEntryInfo(MetaName.residentResources, PsoDataType.Array, 120, 0, (MetaName)13), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__ResourceReference), - new PsoStructureEntryInfo(MetaName.unregisterResources, PsoDataType.Array, 136, 0, (MetaName)15), - new PsoStructureEntryInfo(MetaName.requiresLoadingScreen, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.executionConditions, PsoDataType.Structure, 160, 0, MetaName.ExecutionConditions) - ); - case MetaName.ExecutionConditions: - return new PsoStructureInfo(MetaName.ExecutionConditions, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.ExecutionCondition), - new PsoStructureEntryInfo(MetaName.activeChangesetConditions, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.fwClipSetManager: - return new PsoStructureInfo(MetaName.fwClipSetManager, 0, 0, 128, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.clipSets, PsoDataType.Map, 8, 1, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.fwClipDictionaryMetadata), - new PsoStructureEntryInfo(MetaName.clipDictionaryMetadatas, PsoDataType.Map, 32, 1, (MetaName)196612), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.fwMemoryGroupMetadata), - new PsoStructureEntryInfo(MetaName.memoryGroupMetadatas, PsoDataType.Map, 56, 1, (MetaName)393223), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3219912345), - new PsoStructureEntryInfo((MetaName)3532340754, PsoDataType.Map, 80, 1, (MetaName)589834),//memory group modifiers - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.clipVariationSets, PsoDataType.Map, 104, 1, (MetaName)786445)//move network flags dictionary - ); - case (MetaName)MetaTypeName.ARRAYINFO://default map node entry, with a structure pointer - return new PsoStructureInfo((MetaName)MetaTypeName.ARRAYINFO, 0, 2, 16, - new PsoStructureEntryInfo(MetaName.Key, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Item, PsoDataType.Structure, 8, 3, 0) - ); - case MetaName.fwClipSet: - return new PsoStructureInfo(MetaName.fwClipSet, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.fallbackId, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.clipDictionaryName, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.clipItems, PsoDataType.Map, 16, 1, (MetaName)131075), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.moveNetworkFlags, PsoDataType.Array, 40, 0, (MetaName)5) - ); - case MetaName.fwDirectedClipItemWithProps: - return new PsoStructureInfo(MetaName.fwDirectedClipItemWithProps, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eAnimPlayerFlag), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.Flags, 8, 0, (MetaName)2097152), - new PsoStructureEntryInfo(MetaName.priority, PsoDataType.Enum, 12, 0, MetaName.eAnimPriority), - new PsoStructureEntryInfo(MetaName.boneMask, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.direction, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.fwClipItemWithProps: - return new PsoStructureInfo(MetaName.fwClipItemWithProps, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eAnimPlayerFlag), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.Flags, 8, 0, (MetaName)2097152), - new PsoStructureEntryInfo(MetaName.priority, PsoDataType.Enum, 12, 0, MetaName.eAnimPriority), - new PsoStructureEntryInfo(MetaName.boneMask, PsoDataType.String, 16, 7, 0) - ); - case MetaName.fwClipItem: - return new PsoStructureInfo(MetaName.fwClipItem, 0, 0, 8 //empty struct... possibly abstract/base class - ); - case MetaName.fwClipSetWithGetup: //creature/animal clip set? - return new PsoStructureInfo(MetaName.fwClipSetWithGetup, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.fallbackId, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.clipDictionaryName, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.clipItems, PsoDataType.Map, 16, 1, (MetaName)131075), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.moveNetworkFlags, PsoDataType.Array, 40, 0, (MetaName)5), - new PsoStructureEntryInfo(MetaName.GetupSet, PsoDataType.String, 56, 7, 0), - new PsoStructureEntryInfo(MetaName.DeadBlendOutSet, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo(MetaName.AllowAnimatedDeadFall, PsoDataType.Bool, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AnimatedDeadFallSet, PsoDataType.String, 68, 7, 0) - ); - case MetaName.fwClipDictionaryMetadata: - return new PsoStructureInfo(MetaName.fwClipDictionaryMetadata, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eStreamingPolicy), - new PsoStructureEntryInfo(MetaName.streamingPolicy, PsoDataType.Flags, 8, 0, (MetaName)2097152), - new PsoStructureEntryInfo(MetaName.memoryGroup, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.streamingPriority, PsoDataType.Enum, 16, 0, MetaName.eStreamingPriority) - ); - case MetaName.fwMemoryGroupMetadata: - return new PsoStructureInfo(MetaName.fwMemoryGroupMetadata, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)676191063, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)1661025772, PsoDataType.UInt, 12, 0, 0) - ); - case (MetaName)3219912345://clip sets memory group modifier? - return new PsoStructureInfo((MetaName)3219912345, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2356519750), - new PsoStructureEntryInfo(MetaName.Adjustments, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)2356519750: //clip sets memory group modifier adjustment - return new PsoStructureInfo((MetaName)2356519750, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MemoryGroup, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Amount, PsoDataType.SInt, 12, 0, 0) - ); - case MetaName.fwClipVariationSet: //clip sets move network flags list/group? - return new PsoStructureInfo(MetaName.fwClipVariationSet, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.clips, PsoDataType.Array, 8, 0, 0) - ); - //case (MetaName)257://this shouldn't really be in here, because it's dynamically generated, see PsoBuilder.AddMapNodeStructureInfo - // return new PsoStructureInfo((MetaName)257, 0, 2, 32, - // new PsoStructureEntryInfo(MetaName.Key, PsoDataType.String, 0, 7, 0), - // new PsoStructureEntryInfo(MetaName.Item, PsoDataType.Structure, 8, 0, MetaName.fwClipDictionaryMetadata) - // ); - //case (MetaName)258://this shouldn't really be in here, because it's dynamically generated, see PsoBuilder.AddMapNodeStructureInfo - // return new PsoStructureInfo((MetaName)258, 0, 2, 24, - // new PsoStructureEntryInfo(MetaName.Key, PsoDataType.String, 0, 7, 0), - // new PsoStructureEntryInfo(MetaName.Item, PsoDataType.Structure, 8, 0, MetaName.fwMemoryGroupMetadata) - // ); - //case (MetaName)259://this shouldn't really be in here, because it's dynamically generated, see PsoBuilder.AddMapNodeStructureInfo - // return new PsoStructureInfo((MetaName)259, 0, 2, 32, - // new PsoStructureEntryInfo(MetaName.Key, PsoDataType.String, 0, 7, 0), - // new PsoStructureEntryInfo(MetaName.Item, PsoDataType.Structure, 8, 0, (MetaName)3219912345) - // ); - case MetaName.AnimPostFXManager: - return new PsoStructureInfo(MetaName.AnimPostFXManager, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2319197961), - new PsoStructureEntryInfo(MetaName.RegisteredStacks, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)2319197961: - return new PsoStructureInfo((MetaName)2319197961, 0, 0, 384, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FXStack, PsoDataType.Structure, 16, 0, (MetaName)2675557154), - new PsoStructureEntryInfo(MetaName.Priority, PsoDataType.UByte, 376, 0, 0) - ); - case (MetaName)2675557154: - return new PsoStructureInfo((MetaName)2675557154, 0, 0, 360, - new PsoStructureEntryInfo(MetaName.LayerBlend, PsoDataType.Structure, 8, 0, (MetaName)2367955297), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.AnimatedPostFX), - new PsoStructureEntryInfo(MetaName.Layers, PsoDataType.Array, 48, 1, (MetaName)393217), - new PsoStructureEntryInfo(MetaName.GroupId, PsoDataType.SInt, 344, 0, 0), - new PsoStructureEntryInfo((MetaName)1991133938, PsoDataType.UInt, 348, 0, 0), - new PsoStructureEntryInfo((MetaName)4185090704, PsoDataType.UInt, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.EventType, PsoDataType.Enum, 356, 0, (MetaName)2168155209) - ); - case (MetaName)2367955297: - return new PsoStructureInfo((MetaName)2367955297, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.LayerA, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.LayerB, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.Disabled, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.FrequencyNoise, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.AmplitudeNoise, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.Frequency, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.Bias, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.AnimatedPostFX: - return new PsoStructureInfo(MetaName.AnimatedPostFX, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.ModifierName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AnimMode, PsoDataType.Enum, 12, 0, (MetaName)2476021071), - new PsoStructureEntryInfo(MetaName.StartDelayDuration, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.InDuration, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.HoldDuration, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.OutDuration, PsoDataType.UInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.Disabled, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.LoopMode, PsoDataType.Enum, 36, 0, (MetaName)3696221852), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 40, 0, 0) - ); - case (MetaName)1300198536: - return new PsoStructureInfo((MetaName)1300198536, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.LensArtefact), - new PsoStructureEntryInfo(MetaName.layers, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.LensArtefact: - return new PsoStructureInfo(MetaName.LensArtefact, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.blurType, PsoDataType.Enum, 12, 0, (MetaName)3261591327), - new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Float2, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.offset, PsoDataType.Float2, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.colorShift, PsoDataType.UInt, 32, 1, 0), - new PsoStructureEntryInfo(MetaName.opacity, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2600565536, PsoDataType.Enum, 40, 0, (MetaName)516897642), - new PsoStructureEntryInfo((MetaName)1250212400, PsoDataType.Float2, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.streakDirection, PsoDataType.Enum, 52, 0, (MetaName)2665868448), - new PsoStructureEntryInfo(MetaName.enabled, PsoDataType.Bool, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.sortIndex, PsoDataType.SInt, 60, 0, 0) - ); - case MetaName.CPtFxAssetInfoMgr: - return new PsoStructureInfo(MetaName.CPtFxAssetInfoMgr, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.ptfxAssetDependencyInfos, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.CPtFxAssetDependencyInfo: - return new PsoStructureInfo(MetaName.CPtFxAssetDependencyInfo, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.parentName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.childName, PsoDataType.String, 12, 7, 0) - ); - case MetaName.CVfxFogVolumeInfoMgr: - return new PsoStructureInfo(MetaName.CVfxFogVolumeInfoMgr, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.vfxFogVolumeInfos, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.CVfxFogVolumeInfo: - return new PsoStructureInfo(MetaName.CVfxFogVolumeInfo, 0, 0, 112, - new PsoStructureEntryInfo((MetaName)4135301713, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)1768347469, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.position, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.rotation, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.colR, PsoDataType.UByte, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.colG, PsoDataType.UByte, 65, 0, 0), - new PsoStructureEntryInfo(MetaName.colB, PsoDataType.UByte, 66, 0, 0), - new PsoStructureEntryInfo(MetaName.colA, PsoDataType.UByte, 67, 0, 0), - new PsoStructureEntryInfo(MetaName.hdrMult, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.range, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.density, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.falloff, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.interiorHash, PsoDataType.Long, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.isUnderwater, PsoDataType.Bool, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.lightingType, PsoDataType.Enum, 100, 0, (MetaName)2628996780) - ); - case MetaName.CVfxInteriorInfoMgr: - return new PsoStructureInfo(MetaName.CVfxInteriorInfoMgr, 0, 0, 56, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.vfxInteriorSetups, PsoDataType.Map, 8, 1, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.vfxInteriorInfos, PsoDataType.Map, 32, 1, (MetaName)196612) - ); - case MetaName.CVfxInteriorSetup: - return new PsoStructureInfo(MetaName.CVfxInteriorSetup, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.interiorInfoName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.vfxRoomSetups, PsoDataType.Map, 16, 1, (MetaName)65538) - ); - case MetaName.CVfxRoomSetup: - return new PsoStructureInfo(MetaName.CVfxRoomSetup, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.interiorInfoName, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CVfxInteriorInfo: - return new PsoStructureInfo(MetaName.CVfxInteriorInfo, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.smokePtFxEnabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.smokePtFxName, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.smokePtFxLevelOverride, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.dustPtFxEnabled, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.dustPtFxName, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.dustPtFxEvo, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CVfxPedInfoMgr: - return new PsoStructureInfo(MetaName.CVfxPedInfoMgr, 0, 0, 224, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)1639857157, PsoDataType.Map, 8, 1, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)190681942, PsoDataType.Map, 32, 1, (MetaName)196612), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)866013965, PsoDataType.Map, 56, 1, (MetaName)393223), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)619497315, PsoDataType.Map, 80, 1, (MetaName)589834), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)1719780883, PsoDataType.Map, 104, 1, (MetaName)786445), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)2436902422, PsoDataType.Map, 128, 1, (MetaName)983056), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)670699231, PsoDataType.Map, 152, 1, (MetaName)1179667), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)161646760, PsoDataType.Map, 176, 1, (MetaName)1376278), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.vfxPedInfos, PsoDataType.Map, 200, 1, (MetaName)1572889) - ); - case (MetaName)3745427162: - return new PsoStructureInfo((MetaName)3745427162, 0, 0, 104, - new PsoStructureEntryInfo((MetaName)2328909272, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)3928010395, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)1667415425, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3934831401, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2811575072, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3485910056, PsoDataType.SInt, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)924601972, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)2748666322, PsoDataType.SInt, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2717336085, PsoDataType.SInt, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)383606187, PsoDataType.SInt, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1201928922, PsoDataType.SInt, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2683338794, PsoDataType.SInt, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)244388834, PsoDataType.SInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3603110778, PsoDataType.SInt, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)1531021558, PsoDataType.SInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1193506380, PsoDataType.SInt, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)1561972343, PsoDataType.SInt, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)2527519128, PsoDataType.SInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.decalWidth, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.decalLength, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)1369041264, PsoDataType.UByte, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)1201263928, PsoDataType.UByte, 89, 0, 0), - new PsoStructureEntryInfo((MetaName)1596752989, PsoDataType.UByte, 90, 0, 0), - new PsoStructureEntryInfo((MetaName)2768457985, PsoDataType.UByte, 91, 0, 0), - new PsoStructureEntryInfo((MetaName)1822646338, PsoDataType.UByte, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)2318441304, PsoDataType.UByte, 93, 0, 0), - new PsoStructureEntryInfo(MetaName.decalLife, PsoDataType.Float, 96, 0, 0) - ); - case (MetaName)1299390333: - return new PsoStructureInfo((MetaName)1299390333, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)634726437, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)1754146930, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)4279228573, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxScale, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)2425920550: - return new PsoStructureInfo((MetaName)2425920550, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)3741812782, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)2206302043, PsoDataType.String, 12, 7, 0) - ); - case (MetaName)1811001251: - return new PsoStructureInfo((MetaName)1811001251, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.decalId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)3806811108, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)3913505542, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3041920342, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2666183704, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1369041264, PsoDataType.UByte, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1201263928, PsoDataType.UByte, 29, 0, 0), - new PsoStructureEntryInfo((MetaName)1596752989, PsoDataType.UByte, 30, 0, 0) - ); - case (MetaName)1559486096: - return new PsoStructureInfo((MetaName)1559486096, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ptFxName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ptFxDepthEvoMin, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxDepthEvoMax, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxSpeedEvoMin, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxSpeedEvoMax, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)4188307664: - return new PsoStructureInfo((MetaName)4188307664, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)3741812782, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)2206302043, PsoDataType.String, 12, 7, 0) - ); - case (MetaName)1073939452: - return new PsoStructureInfo((MetaName)1073939452, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.sizeEvo, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.depthMult, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.speedMult, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.widthRatio, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)2217981082: - return new PsoStructureInfo((MetaName)2217981082, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.sampleSize, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.boneSize, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)2990477260, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxEnabled, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxEnabled, PsoDataType.Bool, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxEnabled, PsoDataType.Bool, 19, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxEnabled, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2545172352, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxRange, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxRange, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxRange, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxRange, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1146082049, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CVfxPedInfo: - return new PsoStructureInfo(MetaName.CVfxPedInfo, 0, 0, 512, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)231867887), - new PsoStructureEntryInfo((MetaName)293516458, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1904273735), - new PsoStructureEntryInfo((MetaName)4005470263, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)1938733863, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)2108095349, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)898188953, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)815580680, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)728045365, PsoDataType.Bool, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1340027467, PsoDataType.Bool, 57, 0, 0), - new PsoStructureEntryInfo((MetaName)1185708987, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)3067401171, PsoDataType.Bool, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)267862759, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)481653295, PsoDataType.Bool, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)3695423274, PsoDataType.Bool, 73, 0, 0), - new PsoStructureEntryInfo((MetaName)1954970508, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)1273209835, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)1481826432, PsoDataType.Bool, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)1210003497, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)3343556845, PsoDataType.Bool, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)300193613, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)2234775971, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)2648212357, PsoDataType.Bool, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)2189031336, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)1537566823, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)2106749959, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)621919678, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)1944160314, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)537443923, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)1293634249, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)1694886060, PsoDataType.Bool, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)3575961872, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo((MetaName)423449081, PsoDataType.String, 144, 7, 0), - new PsoStructureEntryInfo((MetaName)4063560113, PsoDataType.Bool, 148, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1810355587), - new PsoStructureEntryInfo((MetaName)1379225165, PsoDataType.Array, 152, 0, (MetaName)34), - new PsoStructureEntryInfo((MetaName)2002559884, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo((MetaName)717291862, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo((MetaName)606684208, PsoDataType.Bool, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)2292742472, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)1437576219, PsoDataType.String, 184, 7, 0), - new PsoStructureEntryInfo((MetaName)3754033729, PsoDataType.Enum, 188, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo((MetaName)1020967481, PsoDataType.Enum, 192, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo((MetaName)2592389483, PsoDataType.Bool, 196, 0, 0), - new PsoStructureEntryInfo((MetaName)4054422403, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo((MetaName)740137113, PsoDataType.String, 204, 7, 0), - new PsoStructureEntryInfo((MetaName)1841095686, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo((MetaName)886073686, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo((MetaName)1055815172, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo((MetaName)2913384203, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo((MetaName)3977079346, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo((MetaName)3136327436, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo((MetaName)2168759960, PsoDataType.Bool, 232, 0, 0), - new PsoStructureEntryInfo((MetaName)2723487263, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo((MetaName)1349459576, PsoDataType.String, 240, 7, 0), - new PsoStructureEntryInfo((MetaName)2366514623, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo((MetaName)194784077, PsoDataType.Float, 248, 0, 0), - new PsoStructureEntryInfo((MetaName)1052325933, PsoDataType.Float, 252, 0, 0), - new PsoStructureEntryInfo((MetaName)2774545125, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo((MetaName)431439807, PsoDataType.Bool, 260, 0, 0), - new PsoStructureEntryInfo((MetaName)2591692617, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo((MetaName)2631634259, PsoDataType.String, 268, 7, 0), - new PsoStructureEntryInfo((MetaName)3959299203, PsoDataType.Float, 272, 0, 0), - new PsoStructureEntryInfo((MetaName)2821295083, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo((MetaName)3995586056, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo((MetaName)3353201139, PsoDataType.Float, 284, 0, 0), - new PsoStructureEntryInfo((MetaName)412619038, PsoDataType.Bool, 288, 0, 0), - new PsoStructureEntryInfo((MetaName)1889989706, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo((MetaName)3972116805, PsoDataType.Bool, 296, 0, 0), - new PsoStructureEntryInfo((MetaName)4143286255, PsoDataType.String, 300, 7, 0), - new PsoStructureEntryInfo((MetaName)30217815, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo((MetaName)1079949132, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo((MetaName)4224134658, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo((MetaName)901763385, PsoDataType.Bool, 316, 0, 0), - new PsoStructureEntryInfo((MetaName)3950900138, PsoDataType.String, 320, 7, 0), - new PsoStructureEntryInfo((MetaName)10501246, PsoDataType.Float, 324, 0, 0), - new PsoStructureEntryInfo((MetaName)4131076032, PsoDataType.Float, 328, 0, 0), - new PsoStructureEntryInfo((MetaName)1327278534, PsoDataType.Float, 332, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxName, PsoDataType.String, 336, 7, 0), - new PsoStructureEntryInfo((MetaName)374673880, PsoDataType.Float, 340, 0, 0), - new PsoStructureEntryInfo((MetaName)1335117116, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo((MetaName)4258146773, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxName, PsoDataType.String, 352, 7, 0), - new PsoStructureEntryInfo((MetaName)4020845257, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo((MetaName)1518647754, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxName, PsoDataType.String, 364, 7, 0), - new PsoStructureEntryInfo((MetaName)4021444798, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)2149475580, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxName, PsoDataType.String, 376, 7, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxSpeedEvoMin, PsoDataType.Float, 380, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxSpeedEvoMax, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo((MetaName)4096431642, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo((MetaName)415880732, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo((MetaName)3919360765, PsoDataType.String, 396, 7, 0), - new PsoStructureEntryInfo((MetaName)3723675330, PsoDataType.Float, 400, 0, 0), - new PsoStructureEntryInfo((MetaName)3295859425, PsoDataType.Bool, 404, 0, 0), - new PsoStructureEntryInfo((MetaName)1659367240, PsoDataType.String, 408, 7, 0), - new PsoStructureEntryInfo((MetaName)2238873027, PsoDataType.String, 412, 7, 0), - new PsoStructureEntryInfo((MetaName)3354804163, PsoDataType.String, 416, 7, 0), - new PsoStructureEntryInfo((MetaName)1800302370, PsoDataType.String, 420, 7, 0), - new PsoStructureEntryInfo((MetaName)2345868328, PsoDataType.String, 424, 7, 0), - new PsoStructureEntryInfo((MetaName)2719523535, PsoDataType.Float, 428, 0, 0), - new PsoStructureEntryInfo((MetaName)460277230, PsoDataType.Float, 432, 0, 0), - new PsoStructureEntryInfo((MetaName)4222549442, PsoDataType.Float, 436, 0, 0), - new PsoStructureEntryInfo((MetaName)2205812843, PsoDataType.Bool, 440, 0, 0), - new PsoStructureEntryInfo((MetaName)2543787987, PsoDataType.Float, 444, 0, 0), - new PsoStructureEntryInfo((MetaName)789559375, PsoDataType.String, 448, 7, 0), - new PsoStructureEntryInfo((MetaName)610648776, PsoDataType.Enum, 452, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo((MetaName)2321865573, PsoDataType.Bool, 456, 0, 0), - new PsoStructureEntryInfo((MetaName)3482316648, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo((MetaName)3414327374, PsoDataType.String, 464, 7, 0), - new PsoStructureEntryInfo((MetaName)3991249477, PsoDataType.Enum, 468, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo((MetaName)3633780286, PsoDataType.Bool, 472, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3663974917), - new PsoStructureEntryInfo((MetaName)1614411627, PsoDataType.Array, 480, 0, (MetaName)113), - new PsoStructureEntryInfo((MetaName)2158250314, PsoDataType.Bool, 496, 0, 0), - new PsoStructureEntryInfo((MetaName)2801240542, PsoDataType.Float, 500, 0, 0), - new PsoStructureEntryInfo((MetaName)1702406422, PsoDataType.String, 504, 7, 0) - ); - case (MetaName)231867887: - return new PsoStructureInfo((MetaName)231867887, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.vfxGroup, PsoDataType.Enum, 8, 0, MetaName.eVfxGroup), - new PsoStructureEntryInfo((MetaName)3557178741, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)3535009775, PsoDataType.String, 16, 7, 0) - ); - case (MetaName)1904273735: - return new PsoStructureInfo((MetaName)1904273735, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)2366957880, PsoDataType.Enum, 8, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo((MetaName)1407284946, PsoDataType.Enum, 12, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo(MetaName.limbId, PsoDataType.Enum, 16, 0, (MetaName)726948528), - new PsoStructureEntryInfo((MetaName)1061041502, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo((MetaName)2989606868, PsoDataType.String, 24, 7, 0) - ); - case (MetaName)1810355587: - return new PsoStructureInfo((MetaName)1810355587, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ptFxName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)2366957880, PsoDataType.Enum, 12, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo((MetaName)1407284946, PsoDataType.Enum, 16, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo(MetaName.limbId, PsoDataType.SInt, 20, 0, 0) - ); - case (MetaName)3663974917: - return new PsoStructureInfo((MetaName)3663974917, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ptFxName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)2366957880, PsoDataType.Enum, 12, 0, MetaName.eAnimBoneTag), - new PsoStructureEntryInfo((MetaName)1407284946, PsoDataType.Enum, 16, 0, MetaName.eAnimBoneTag) - ); - case MetaName.CVfxRegionInfoMgr: - return new PsoStructureInfo(MetaName.CVfxRegionInfoMgr, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.vfxRegionInfos, PsoDataType.Map, 8, 1, (MetaName)1) - ); - case MetaName.CVfxRegionInfo: - return new PsoStructureInfo(MetaName.CVfxRegionInfo, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.windDebrisPtFxEnabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.windDebrisPtFxName, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)215011533), - new PsoStructureEntryInfo((MetaName)157134441, PsoDataType.Array, 16, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)215011533), - new PsoStructureEntryInfo((MetaName)2975635968, PsoDataType.Array, 32, 0, (MetaName)4), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)215011533), - new PsoStructureEntryInfo((MetaName)3751751493, PsoDataType.Array, 48, 0, (MetaName)6) - ); - case (MetaName)215011533: - return new PsoStructureInfo((MetaName)215011533, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.gpuPtFxEnabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)28713766, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)3099312282, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3614737265, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2437695423, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1775217766, PsoDataType.SInt, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1202806570, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)4204794351, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)634319578, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)552536380, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.CVfxVehicleInfoMgr: - return new PsoStructureInfo(MetaName.CVfxVehicleInfoMgr, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.vfxVehicleInfos, PsoDataType.Map, 8, 1, (MetaName)1) - ); - case MetaName.CVfxVehicleInfo: - return new PsoStructureInfo(MetaName.CVfxVehicleInfo, 0, 0, 880, - new PsoStructureEntryInfo(MetaName.mtlBangPtFxVehicleEvo, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.mtlBangPtFxVehicleScale, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.mtlScrapePtFxVehicleEvo, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.mtlScrapePtFxVehicleScale, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxEnabled, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxName, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxCutOffSpeed, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxRange, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxScale, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxSpeedEvoMin, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxSpeedEvoMax, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxTempEvoMin, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxTempEvoMax, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.exhaustPtFxThrottleEvoOnGearChange, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.engineStartupPtFxEnabled, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.engineStartupPtFxName, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo(MetaName.engineStartupPtFxRange, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.misfirePtFxEnabled, PsoDataType.Bool, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.misfirePtFxName, PsoDataType.String, 76, 7, 0), - new PsoStructureEntryInfo(MetaName.misfirePtFxRange, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.backfirePtFxEnabled, PsoDataType.Bool, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.backfirePtFxName, PsoDataType.String, 88, 7, 0), - new PsoStructureEntryInfo(MetaName.backfirePtFxRange, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxEnabled, PsoDataType.Bool, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxHasPanel, PsoDataType.Bool, 97, 0, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxHasRotorEvo, PsoDataType.Bool, 98, 0, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxNoPanelName, PsoDataType.String, 100, 7, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxPanelOpenName, PsoDataType.String, 104, 7, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxPanelShutName, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxRange, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxSpeedEvoMin, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.engineDamagePtFxSpeedEvoMax, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxEnabled, PsoDataType.Bool, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxName, PsoDataType.String, 128, 7, 0), - new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxRange, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxAngleThresh, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxSpeedThresh, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxEngineHealthThresh, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.leakPtFxEnabled, PsoDataType.Bool, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.leakPtFxOilName, PsoDataType.String, 152, 7, 0), - new PsoStructureEntryInfo(MetaName.leakPtFxPetrolName, PsoDataType.String, 156, 7, 0), - new PsoStructureEntryInfo(MetaName.leakPtFxRange, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.leakPtFxSpeedEvoMin, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.leakPtFxSpeedEvoMax, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelGenericPtFxSet, PsoDataType.SInt, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelGenericDecalSet, PsoDataType.SInt, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelGenericRangeMult, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelSkidmarkRearOnly, PsoDataType.Bool, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelSkidmarkSlipMult, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelSkidmarkPressureMult, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelFrictionPtFxFricMult, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelDisplacementPtFxDispMult, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelBurnoutPtFxFricMult, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelBurnoutPtFxTempMult, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelLowLodPtFxScale, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelPuncturePtFxName, PsoDataType.String, 216, 7, 0), - new PsoStructureEntryInfo(MetaName.wheelPuncturePtFxRange, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelBurstPtFxName, PsoDataType.String, 224, 7, 0), - new PsoStructureEntryInfo(MetaName.wheelBurstPtFxRange, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelFirePtFxName, PsoDataType.String, 232, 7, 0), - new PsoStructureEntryInfo(MetaName.wheelFirePtFxRange, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelFirePtFxSpeedEvoMin, PsoDataType.Float, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.wheelFirePtFxSpeedEvoMax, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFirePtFxEnabled, PsoDataType.Bool, 248, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFirePtFxName, PsoDataType.String, 252, 7, 0), - new PsoStructureEntryInfo(MetaName.wreckedFirePtFxDurationMin, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFirePtFxDurationMax, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFirePtFxRadius, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxEnabled, PsoDataType.Bool, 268, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxName, PsoDataType.String, 272, 7, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxDurationMin, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxDurationMax, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxRadius, PsoDataType.Float, 284, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire2UseOverheatBone, PsoDataType.Bool, 288, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire2OffsetPos, PsoDataType.Float3, 304, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxEnabled, PsoDataType.Bool, 320, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxName, PsoDataType.String, 324, 7, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxDurationMin, PsoDataType.Float, 328, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxDurationMax, PsoDataType.Float, 332, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxRadius, PsoDataType.Float, 336, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire3UseOverheatBone, PsoDataType.Bool, 340, 0, 0), - new PsoStructureEntryInfo(MetaName.wreckedFire3OffsetPos, PsoDataType.Float3, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxName, PsoDataType.String, 368, 7, 0), - new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxRange, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxSpeedEvoMin, PsoDataType.Float, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxSpeedEvoMax, PsoDataType.Float, 380, 0, 0), - new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxRadius, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.boatEntryPtFxEnabled, PsoDataType.Bool, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.boatEntryPtFxRange, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.boatEntryPtFxName, PsoDataType.String, 396, 7, 0), - new PsoStructureEntryInfo(MetaName.boatEntryPtFxSpeedEvoMin, PsoDataType.Float, 400, 0, 0), - new PsoStructureEntryInfo(MetaName.boatEntryPtFxSpeedEvoMax, PsoDataType.Float, 404, 0, 0), - new PsoStructureEntryInfo(MetaName.boatEntryPtFxScale, PsoDataType.Float, 408, 0, 0), - new PsoStructureEntryInfo(MetaName.boatExitPtFxEnabled, PsoDataType.Bool, 412, 0, 0), - new PsoStructureEntryInfo(MetaName.boatExitPtFxRange, PsoDataType.Float, 416, 0, 0), - new PsoStructureEntryInfo(MetaName.boatExitPtFxName, PsoDataType.String, 420, 7, 0), - new PsoStructureEntryInfo(MetaName.boatExitPtFxSpeedEvoMin, PsoDataType.Float, 424, 0, 0), - new PsoStructureEntryInfo(MetaName.boatExitPtFxSpeedEvoMax, PsoDataType.Float, 428, 0, 0), - new PsoStructureEntryInfo(MetaName.boatExitPtFxScale, PsoDataType.Float, 432, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxEnabled, PsoDataType.Bool, 436, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxRange, PsoDataType.Float, 440, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxForwardName, PsoDataType.String, 444, 7, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxReverseName, PsoDataType.String, 448, 7, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxForwardMountedName, PsoDataType.String, 452, 7, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxForwardMountedOffset, PsoDataType.Float3, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxSpeedEvoMin, PsoDataType.Float, 480, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxSpeedEvoMax, PsoDataType.Float, 484, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxKeelEvoMin, PsoDataType.Float, 488, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxKeelEvoMax, PsoDataType.Float, 492, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxScale, PsoDataType.Float, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.boatBowPtFxReverseOffset, PsoDataType.Float, 500, 0, 0), - new PsoStructureEntryInfo(MetaName.boatWashPtFxEnabled, PsoDataType.Bool, 504, 0, 0), - new PsoStructureEntryInfo(MetaName.boatWashPtFxRange, PsoDataType.Float, 508, 0, 0), - new PsoStructureEntryInfo(MetaName.boatWashPtFxName, PsoDataType.String, 512, 7, 0), - new PsoStructureEntryInfo(MetaName.boatWashPtFxSpeedEvoMin, PsoDataType.Float, 516, 0, 0), - new PsoStructureEntryInfo(MetaName.boatWashPtFxSpeedEvoMax, PsoDataType.Float, 520, 0, 0), - new PsoStructureEntryInfo(MetaName.boatWashPtFxScale, PsoDataType.Float, 524, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxEnabled, PsoDataType.Bool, 528, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxRange, PsoDataType.Float, 532, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxName, PsoDataType.String, 536, 7, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxForwardSpeedEvoMin, PsoDataType.Float, 540, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxForwardSpeedEvoMax, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxBackwardSpeedEvoMin, PsoDataType.Float, 548, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxBackwardSpeedEvoMax, PsoDataType.Float, 552, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxDepthEvoMin, PsoDataType.Float, 556, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxDepthEvoMax, PsoDataType.Float, 560, 0, 0), - new PsoStructureEntryInfo(MetaName.boatPropellerPtFxScale, PsoDataType.Float, 564, 0, 0), - new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxEnabled, PsoDataType.Bool, 568, 0, 0), - new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxRangeMin, PsoDataType.Float, 572, 0, 0), - new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxRangeMax, PsoDataType.Float, 576, 0, 0), - new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxName, PsoDataType.String, 580, 7, 0), - new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxSpeedEvoMin, PsoDataType.Float, 584, 0, 0), - new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxSpeedEvoMax, PsoDataType.Float, 588, 0, 0), - new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxScale, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.planeAfterburnerPtFxEnabled, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.planeAfterburnerPtFxName, PsoDataType.String, 600, 7, 0), - new PsoStructureEntryInfo(MetaName.planeAfterburnerPtFxRange, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.planeAfterburnerPtFxScale, PsoDataType.Float, 608, 0, 0), - new PsoStructureEntryInfo(MetaName.planeWingTipPtFxEnabled, PsoDataType.Bool, 612, 0, 0), - new PsoStructureEntryInfo(MetaName.planeWingTipPtFxName, PsoDataType.String, 616, 7, 0), - new PsoStructureEntryInfo(MetaName.planeWingTipPtFxRange, PsoDataType.Float, 620, 0, 0), - new PsoStructureEntryInfo(MetaName.planeWingTipPtFxSpeedEvoMin, PsoDataType.Float, 624, 0, 0), - new PsoStructureEntryInfo(MetaName.planeWingTipPtFxSpeedEvoMax, PsoDataType.Float, 628, 0, 0), - new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxEnabled, PsoDataType.Bool, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxName, PsoDataType.String, 636, 7, 0), - new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxRange, PsoDataType.Float, 640, 0, 0), - new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxSpeedEvoMin, PsoDataType.Float, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxSpeedEvoMax, PsoDataType.Float, 648, 0, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxEnabled, PsoDataType.Bool, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameDefault, PsoDataType.String, 656, 7, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameSand, PsoDataType.String, 660, 7, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameDirt, PsoDataType.String, 664, 7, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameWater, PsoDataType.String, 668, 7, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameFoliage, PsoDataType.String, 672, 7, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxRange, PsoDataType.Float, 676, 0, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxDist, PsoDataType.Float, 680, 0, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxSpeedEvoMin, PsoDataType.Float, 684, 0, 0), - new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxSpeedEvoMax, PsoDataType.Float, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxEnabled, PsoDataType.Bool, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxName, PsoDataType.String, 696, 7, 0), - new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxRange, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxSpeedEvoMin, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxSpeedEvoMax, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxEnabled, PsoDataType.Bool, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameDefault, PsoDataType.String, 716, 7, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameSand, PsoDataType.String, 720, 7, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameDirt, PsoDataType.String, 724, 7, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameWater, PsoDataType.String, 728, 7, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameFoliage, PsoDataType.String, 732, 7, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxRange, PsoDataType.Float, 736, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxDist, PsoDataType.Float, 740, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxSpeedEvoMin, PsoDataType.Float, 744, 0, 0), - new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxSpeedEvoMax, PsoDataType.Float, 748, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxEnabled, PsoDataType.Bool, 752, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxRange, PsoDataType.Float, 756, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxName, PsoDataType.String, 760, 7, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxSizeEvoMax, PsoDataType.Float, 764, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedDownwardThresh, PsoDataType.Float, 768, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedLateralEvoMin, PsoDataType.Float, 772, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedLateralEvoMax, PsoDataType.Float, 776, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedDownwardEvoMin, PsoDataType.Float, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedDownwardEvoMax, PsoDataType.Float, 784, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxEnabled, PsoDataType.Bool, 788, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxRange, PsoDataType.Float, 792, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxName, PsoDataType.String, 796, 7, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxSizeEvoMax, PsoDataType.Float, 800, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxSpeedLateralEvoMin, PsoDataType.Float, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxSpeedLateralEvoMax, PsoDataType.Float, 808, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxSpeedUpwardEvoMin, PsoDataType.Float, 812, 0, 0), - new PsoStructureEntryInfo(MetaName.splashOutPtFxSpeedUpwardEvoMax, PsoDataType.Float, 816, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxEnabled, PsoDataType.Bool, 820, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxRange, PsoDataType.Float, 824, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxName, PsoDataType.String, 828, 7, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxSizeEvoMax, PsoDataType.Float, 832, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxSpeedVehicleEvoMin, PsoDataType.Float, 836, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxSpeedVehicleEvoMax, PsoDataType.Float, 840, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxSpeedRiverEvoMin, PsoDataType.Float, 844, 0, 0), - new PsoStructureEntryInfo(MetaName.splashWadePtFxSpeedRiverEvoMax, PsoDataType.Float, 848, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxEnabled, PsoDataType.Bool, 852, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxRange, PsoDataType.Float, 856, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxName, PsoDataType.String, 860, 7, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxSizeEvoMax, PsoDataType.Float, 864, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxSpeedEvoMin, PsoDataType.Float, 868, 0, 0), - new PsoStructureEntryInfo(MetaName.splashTrailPtFxSpeedEvoMax, PsoDataType.Float, 872, 0, 0) - ); - case MetaName.CVfxWeaponInfoMgr: - return new PsoStructureInfo(MetaName.CVfxWeaponInfoMgr, 0, 0, 56, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)3938144758, PsoDataType.Map, 8, 1, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo((MetaName)735539988, PsoDataType.Map, 32, 1, (MetaName)196612) - ); - case (MetaName)2452529929: - return new PsoStructureInfo((MetaName)2452529929, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)294307720, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.probability, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.colTint, PsoDataType.UInt, 20, 1, 0) - ); - case (MetaName)1794703310: - return new PsoStructureInfo((MetaName)1794703310, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)1914084434, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.probability, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)3089927233, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2658317066, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CProceduralInfo: - return new PsoStructureInfo(MetaName.CProceduralInfo, 0, 0, 4120, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2143317860), - new PsoStructureEntryInfo(MetaName.procObjInfos, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPlantInfo), - new PsoStructureEntryInfo(MetaName.plantInfos, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3343541253), - new PsoStructureEntryInfo(MetaName.procTagTable, PsoDataType.Array, 40, 4, (MetaName)16711684) - ); - case (MetaName)3343541253: - return new PsoStructureInfo((MetaName)3343541253, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1599521754), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 8, 2, (MetaName)524288) - ); - case (MetaName)2143317860: - return new PsoStructureInfo((MetaName)2143317860, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Tag, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.PlantTag, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.Spacing, PsoDataType.HFloat, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinXRotation, PsoDataType.HFloat, 22, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxXRotation, PsoDataType.HFloat, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinYRotation, PsoDataType.HFloat, 26, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxYRotation, PsoDataType.HFloat, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinZRotation, PsoDataType.HFloat, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZRotation, PsoDataType.HFloat, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinScale, PsoDataType.HFloat, 34, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxScale, PsoDataType.HFloat, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinScaleZ, PsoDataType.HFloat, 38, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxScaleZ, PsoDataType.HFloat, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinZOffset, PsoDataType.HFloat, 42, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZOffset, PsoDataType.HFloat, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistance, PsoDataType.HFloat, 46, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.HFloat, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTintPalette, PsoDataType.UByte, 50, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTintPalette, PsoDataType.UByte, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)956281369), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 52, 2, (MetaName)524308) - ); - case MetaName.CPlantInfo: - return new PsoStructureInfo(MetaName.CPlantInfo, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Tag, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Color, PsoDataType.UInt, 12, 1, 0), - new PsoStructureEntryInfo(MetaName.GroundColor, PsoDataType.UInt, 16, 1, 0), - new PsoStructureEntryInfo(MetaName.ScaleXY, PsoDataType.HFloat, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleZ, PsoDataType.HFloat, 22, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleVariationXY, PsoDataType.HFloat, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleVariationZ, PsoDataType.HFloat, 26, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleRangeXYZ, PsoDataType.HFloat, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleRangeZ, PsoDataType.HFloat, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.MicroMovementsScaleH, PsoDataType.HFloat, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MicroMovementsScaleV, PsoDataType.HFloat, 34, 0, 0), - new PsoStructureEntryInfo(MetaName.MicroMovementsFreqH, PsoDataType.HFloat, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MicroMovementsFreqV, PsoDataType.HFloat, 38, 0, 0), - new PsoStructureEntryInfo(MetaName.WindBendScale, PsoDataType.HFloat, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.WindBendVariation, PsoDataType.HFloat, 42, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.HFloat, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.Density, PsoDataType.HFloat, 46, 0, 0), - new PsoStructureEntryInfo(MetaName.DensityRange, PsoDataType.HFloat, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.ModelId, PsoDataType.UByte, 50, 0, 0), - new PsoStructureEntryInfo(MetaName.TextureId, PsoDataType.UByte, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1247137385), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 52, 1, (MetaName)1048596), - new PsoStructureEntryInfo(MetaName.Intensity, PsoDataType.UByte, 54, 0, 0), - new PsoStructureEntryInfo(MetaName.IntensityVar, PsoDataType.UByte, 55, 0, 0) - ); - case MetaName.camMetadataStore: - return new PsoStructureInfo(MetaName.camMetadataStore, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.MetadataList, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.DirectorList, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case MetaName.camDepthOfFieldSettingsMetadata: - return new PsoStructureInfo(MetaName.camDepthOfFieldSettingsMetadata, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)3872687437, PsoDataType.Float2, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)809440628, PsoDataType.Float2, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)490969727, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3622576788, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1424443550, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3810611648, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1068831663, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1181720025, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)2941105367, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1760535059, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)244310625, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)2726944087, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)366578954, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1584584282, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)4112080817, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)4019248724, PsoDataType.Bool, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)3170603601, PsoDataType.Bool, 85, 0, 0), - new PsoStructureEntryInfo((MetaName)367424479, PsoDataType.Bool, 86, 0, 0), - new PsoStructureEntryInfo((MetaName)3748087913, PsoDataType.Bool, 87, 0, 0), - new PsoStructureEntryInfo((MetaName)981218312, PsoDataType.Bool, 88, 0, 0) - ); - case MetaName.camCinematicAnimatedCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicAnimatedCameraMetadata, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0) - ); - case MetaName.camCinematicCameraManCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicCameraManCameraMetadata, 0, 0, 328, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2962759393, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3005507009, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)114561573, PsoDataType.Bool, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1535052963, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3023548272, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)846082931, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)3539146194, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)3668836939, PsoDataType.UInt, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)1699827350, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1265046558, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)1161122588, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)3190591149, PsoDataType.UInt, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)2884448793, PsoDataType.UInt, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)69722150, PsoDataType.Bool, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.ScanRadius, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ScanDistance, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)199666231, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 112, 7, 0), - new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo((MetaName)3308026067, PsoDataType.String, 120, 7, 0), - new PsoStructureEntryInfo((MetaName)1279708504, PsoDataType.Structure, 128, 0, MetaName.camCinematicCameraOperatorShakeSettings), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo((MetaName)1035890821, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo((MetaName)3518053347, PsoDataType.Bool, 272, 0, 0), - new PsoStructureEntryInfo((MetaName)568093394, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo((MetaName)781245272, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo((MetaName)2596681112, PsoDataType.Bool, 284, 0, 0), - new PsoStructureEntryInfo((MetaName)1468609247, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo((MetaName)727781899, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo((MetaName)3140771983, PsoDataType.Float, 296, 0, 0), - new PsoStructureEntryInfo((MetaName)3196312636, PsoDataType.Bool, 300, 0, 0), - new PsoStructureEntryInfo((MetaName)3061937367, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo((MetaName)1900366054, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo((MetaName)4085704227, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo((MetaName)3250401979, PsoDataType.Float, 316, 0, 0), - new PsoStructureEntryInfo((MetaName)618136263, PsoDataType.Float, 320, 0, 0), - new PsoStructureEntryInfo((MetaName)2469116692, PsoDataType.Float, 324, 0, 0) - ); - case MetaName.camCinematicCameraOperatorShakeSettings: - return new PsoStructureInfo(MetaName.camCinematicCameraOperatorShakeSettings, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.UncertaintySettings, PsoDataType.Structure, 8, 0, MetaName.camCinematicCameraOperatorShakeUncertaintySettings), - new PsoStructureEntryInfo(MetaName.TurbulenceSettings, PsoDataType.Structure, 88, 0, MetaName.camCinematicCameraOperatorShakeTurbulenceSettings) - ); - case MetaName.camCinematicCameraOperatorShakeUncertaintySettings: - return new PsoStructureInfo(MetaName.camCinematicCameraOperatorShakeUncertaintySettings, 0, 0, 80, - new PsoStructureEntryInfo((MetaName)784117005, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)4083769430, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)4138212913, PsoDataType.Float2, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2793659114, PsoDataType.Float2, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2611684493, PsoDataType.Float2, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3850080675, PsoDataType.Float2, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)2902509544, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)3004590170, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ScalingFactor, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2280675285, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)933422390, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)3253772488, PsoDataType.Float, 72, 0, 0) - ); - case MetaName.camCinematicCameraOperatorShakeTurbulenceSettings: - return new PsoStructureInfo(MetaName.camCinematicCameraOperatorShakeTurbulenceSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)1741343660, PsoDataType.Float2, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceRange, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2902509544, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3004590170, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camCinematicHeliChaseCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicHeliChaseCameraMetadata, 0, 0, 392, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDuration, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3800346187, PsoDataType.UInt, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2004927681, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)408757490, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1805018741, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1929531797, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)1117152888, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3610993313, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2885533396, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1162205528, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2128811877, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)3504182592, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)2040715445, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)1346377414, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)495502725, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)3725520797, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)832331471, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)953228499, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)199666231, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)1288561522, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)4220570274, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)613448395, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)106130617, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)3190591149, PsoDataType.UInt, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)2884448793, PsoDataType.UInt, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)1265046558, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)1699827350, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)1161122588, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo((MetaName)781245272, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo((MetaName)568093394, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo((MetaName)2289962831, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo((MetaName)3658577234, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo((MetaName)3483998043, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.NearClip, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)2217923367, PsoDataType.Bool, 168, 0, 0), - new PsoStructureEntryInfo((MetaName)114561573, PsoDataType.Bool, 169, 0, 0), - new PsoStructureEntryInfo((MetaName)2187445607, PsoDataType.Bool, 170, 0, 0), - new PsoStructureEntryInfo((MetaName)1144995443, PsoDataType.Bool, 171, 0, 0), - new PsoStructureEntryInfo((MetaName)4185802977, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo((MetaName)315713489, PsoDataType.Bool, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 188, 7, 0), - new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 192, 7, 0), - new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 196, 7, 0), - new PsoStructureEntryInfo((MetaName)3308026067, PsoDataType.String, 200, 7, 0), - new PsoStructureEntryInfo((MetaName)1279708504, PsoDataType.Structure, 208, 0, MetaName.camCinematicCameraOperatorShakeSettings), - new PsoStructureEntryInfo((MetaName)983508410, PsoDataType.Float, 336, 0, 0), - new PsoStructureEntryInfo((MetaName)3451936358, PsoDataType.Float, 340, 0, 0), - new PsoStructureEntryInfo((MetaName)2352608445, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo((MetaName)618136263, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo((MetaName)2469116692, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo((MetaName)4085704227, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo((MetaName)3250401979, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo((MetaName)3574069037, PsoDataType.Float, 364, 0, 0), - new PsoStructureEntryInfo((MetaName)761184934, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)1444706843, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo((MetaName)218641622, PsoDataType.Float, 376, 0, 0), - new PsoStructureEntryInfo((MetaName)3061937367, PsoDataType.Float, 380, 0, 0), - new PsoStructureEntryInfo((MetaName)1900366054, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo((MetaName)1035890821, PsoDataType.Float, 388, 0, 0) - ); - case MetaName.camCinematicVehicleOrbitCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehicleOrbitCameraMetadata, 0, 0, 136, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.FovLimits, PsoDataType.Float2, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)315073442, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleDelta, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)559738595, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)3983210518, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)2153696126, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)765619120, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)3644129030, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)3991802629, PsoDataType.UInt, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicVehicleOrbitCameraInitalSettings), - new PsoStructureEntryInfo((MetaName)1539141183, PsoDataType.Array, 104, 0, (MetaName)20), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 128, 0, 0) - ); - case MetaName.camCinematicVehicleOrbitCameraInitalSettings: - return new PsoStructureInfo(MetaName.camCinematicVehicleOrbitCameraInitalSettings, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Heading, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingDelta, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camCinematicVehicleLowOrbitCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehicleLowOrbitCameraMetadata, 0, 0, 256, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.FovLimits, PsoDataType.Float2, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)315073442, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleDelta, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2037218535, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)4219845621, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)1088437692, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)3983210518, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)565251953, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)2153696126, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)765619120, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicVehicleOrbitCameraInitalSettings), - new PsoStructureEntryInfo((MetaName)1539141183, PsoDataType.Array, 112, 0, (MetaName)MetaTypeName.UINT), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)1958709726, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo((MetaName)2815616753, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo((MetaName)2843406703, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo((MetaName)4109249654, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo((MetaName)565527739, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)3889226535, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo((MetaName)3920334627, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo((MetaName)3189979615, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)1031927866, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)2223609026, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo((MetaName)752307799, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo((MetaName)1612512934, PsoDataType.Structure, 192, 0, MetaName.camSpeedRelativeShakeSettingsMetadata), - new PsoStructureEntryInfo(MetaName.HighSpeedShakeSettings, PsoDataType.Structure, 224, 0, MetaName.camSpeedRelativeShakeSettingsMetadata) - ); - case MetaName.camSpeedRelativeShakeSettingsMetadata: - return new PsoStructureInfo(MetaName.camSpeedRelativeShakeSettingsMetadata, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3092190689, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camCinematicIdleCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicIdleCameraMetadata, 0, 0, 168, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1305640980, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)653716069, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)887335192, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.WideShot, PsoDataType.Structure, 48, 0, MetaName.camCinematicIdleShots), - new PsoStructureEntryInfo(MetaName.MediumShot, PsoDataType.Structure, 72, 0, MetaName.camCinematicIdleShots), - new PsoStructureEntryInfo((MetaName)2026925651, PsoDataType.Structure, 96, 0, MetaName.camCinematicIdleShots), - new PsoStructureEntryInfo((MetaName)2443187932, PsoDataType.Float2, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)3983210518, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo((MetaName)762567518, PsoDataType.Float2, 148, 0, 0), - new PsoStructureEntryInfo((MetaName)348135302, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.Float, 160, 0, 0) - ); - case MetaName.camCinematicIdleShots: - return new PsoStructureInfo(MetaName.camCinematicIdleShots, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceLimits, PsoDataType.Float2, 16, 0, 0) - ); - case MetaName.camCinematicFirstPersonIdleCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicFirstPersonIdleCameraMetadata, 0, 0, 200, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.tacticalXml, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)2146055434, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)498489070, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)642179285, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)3833690476, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)91642876, PsoDataType.UInt, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3423831703, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1365351828, PsoDataType.UInt, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)1799833343, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)2451425179, PsoDataType.UInt, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2398830068, PsoDataType.UInt, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)4013543182, PsoDataType.UInt, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)4060544092, PsoDataType.UInt, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)1863497759, PsoDataType.UInt, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)2865768466, PsoDataType.UInt, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)2935498108, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)3267214601, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)25343385, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)2453008156, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)333391552, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)3472598366, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)3523922750, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)27172088, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)2656885705, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)3821389091, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)3137663245, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)2149837453, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)1352549573, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo((MetaName)559353307, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo((MetaName)340096669, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo((MetaName)3997020725, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo((MetaName)1330235813, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo((MetaName)3625015755, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo((MetaName)815735892, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)2653018133, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo((MetaName)3754548217, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo((MetaName)216085311, PsoDataType.UInt, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)811132412, PsoDataType.UInt, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)1561520371, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo((MetaName)2384466151, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo((MetaName)1800176594, PsoDataType.Float, 192, 0, 0) - ); - case MetaName.camCinematicStuntCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicStuntCameraMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.FovLimits, PsoDataType.Float2, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3686787728, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)2332427685, PsoDataType.Float2, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)3195921543, PsoDataType.Float2, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)2033229500, PsoDataType.Float2, 60, 0, 0) - ); - case MetaName.camCinematicGroupCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicGroupCameraMetadata, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.FovLimits, PsoDataType.Float2, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3686787728, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)4150576777, PsoDataType.Float2, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)3434528744, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)2373655501, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)400251000, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1035890821, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)1856660360, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 92, 0, 0) - ); - case MetaName.camCinematicTrainTrackingCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicTrainTrackingCameraMetadata, 0, 0, 400, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2962759393, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3005507009, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)114561573, PsoDataType.Bool, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1535052963, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3023548272, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)846082931, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)3539146194, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)3668836939, PsoDataType.UInt, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)1699827350, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1265046558, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)1161122588, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)3190591149, PsoDataType.UInt, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)2884448793, PsoDataType.UInt, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)69722150, PsoDataType.Bool, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.ScanRadius, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ScanDistance, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)199666231, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 112, 7, 0), - new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo((MetaName)3308026067, PsoDataType.String, 120, 7, 0), - new PsoStructureEntryInfo((MetaName)1279708504, PsoDataType.Structure, 128, 0, MetaName.camCinematicCameraOperatorShakeSettings), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo((MetaName)1035890821, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo((MetaName)3518053347, PsoDataType.Bool, 272, 0, 0), - new PsoStructureEntryInfo((MetaName)568093394, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo((MetaName)781245272, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo((MetaName)2596681112, PsoDataType.Bool, 284, 0, 0), - new PsoStructureEntryInfo((MetaName)1468609247, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo((MetaName)727781899, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo((MetaName)3140771983, PsoDataType.Float, 296, 0, 0), - new PsoStructureEntryInfo((MetaName)3196312636, PsoDataType.Bool, 300, 0, 0), - new PsoStructureEntryInfo((MetaName)3061937367, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo((MetaName)1900366054, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo((MetaName)4085704227, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo((MetaName)3250401979, PsoDataType.Float, 316, 0, 0), - new PsoStructureEntryInfo((MetaName)618136263, PsoDataType.Float, 320, 0, 0), - new PsoStructureEntryInfo((MetaName)2469116692, PsoDataType.Float, 324, 0, 0), - new PsoStructureEntryInfo((MetaName)886237220, PsoDataType.Float3, 336, 0, 0), - new PsoStructureEntryInfo((MetaName)649866655, PsoDataType.Float2, 352, 0, 0), - new PsoStructureEntryInfo((MetaName)3049827950, PsoDataType.Float2, 360, 0, 0), - new PsoStructureEntryInfo((MetaName)1066491626, PsoDataType.Float2, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)3832386323, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo((MetaName)412149987, PsoDataType.Float2, 384, 0, 0) - ); - case MetaName.camCinematicMountedCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadata, 0, 0, 1344, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.MobilePhoneCameraControlHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo((MetaName)3464513788, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.RagdollBlendEnvelopeRef, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo((MetaName)4071354708, PsoDataType.String, 52, 7, 0), - new PsoStructureEntryInfo((MetaName)972815273, PsoDataType.String, 56, 7, 0), - new PsoStructureEntryInfo((MetaName)844800904, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo((MetaName)648641770, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo((MetaName)722540604, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo((MetaName)3400674238, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo((MetaName)885223840, PsoDataType.String, 76, 7, 0), - new PsoStructureEntryInfo(MetaName.SpringMountRef, PsoDataType.String, 80, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachPosition, PsoDataType.Float3, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)1792533284, PsoDataType.Float3, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.BoneRelativeAttachOffset, PsoDataType.Float3, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)3162861957, PsoDataType.Float3, 144, 0, 0), - new PsoStructureEntryInfo((MetaName)2981089011, PsoDataType.Float3, 160, 0, 0), - new PsoStructureEntryInfo((MetaName)464677746, PsoDataType.Float3, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)2301891370, PsoDataType.Float3, 192, 0, 0), - new PsoStructureEntryInfo((MetaName)1452169682, PsoDataType.Float3, 208, 0, 0), - new PsoStructureEntryInfo((MetaName)4196591490, PsoDataType.Float3, 224, 0, 0), - new PsoStructureEntryInfo((MetaName)1001532487, PsoDataType.Float3, 240, 0, 0), - new PsoStructureEntryInfo((MetaName)1862921276, PsoDataType.Float3, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantLimits, PsoDataType.Float2, 272, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantLimitsForPassengers, PsoDataType.Float2, 280, 0, 0), - new PsoStructureEntryInfo((MetaName)3248777081, PsoDataType.Float2, 288, 0, 0), - new PsoStructureEntryInfo((MetaName)74704022, PsoDataType.Float2, 296, 0, 0), - new PsoStructureEntryInfo((MetaName)4088070730, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo((MetaName)2782354748, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo((MetaName)1994565733, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo((MetaName)383680708, PsoDataType.Float, 316, 0, 0), - new PsoStructureEntryInfo((MetaName)2931383793, PsoDataType.Bool, 320, 0, 0), - new PsoStructureEntryInfo((MetaName)1919709187, PsoDataType.Float, 324, 0, 0), - new PsoStructureEntryInfo((MetaName)945934562, PsoDataType.Float, 328, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultRelativePitch, PsoDataType.Float, 332, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultReversePitch, PsoDataType.Float, 336, 0, 0), - new PsoStructureEntryInfo((MetaName)742850166, PsoDataType.Float, 340, 0, 0), - new PsoStructureEntryInfo((MetaName)2686299665, PsoDataType.Float2, 344, 0, 0), - new PsoStructureEntryInfo((MetaName)1473955583, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo((MetaName)704024974, PsoDataType.Bool, 356, 0, 0), - new PsoStructureEntryInfo((MetaName)2135497875, PsoDataType.Bool, 357, 0, 0), - new PsoStructureEntryInfo((MetaName)4187867131, PsoDataType.Bool, 358, 0, 0), - new PsoStructureEntryInfo((MetaName)2423170684, PsoDataType.Structure, 360, 0, MetaName.camCinematicMountedCameraMetadataRelativePitchScalingToThrottle), - new PsoStructureEntryInfo(MetaName.HighSpeedShakeSettings, PsoDataType.Structure, 376, 0, MetaName.camSpeedRelativeShakeSettingsMetadata), - new PsoStructureEntryInfo((MetaName)1672349165, PsoDataType.Structure, 408, 0, MetaName.camSpeedRelativeShakeSettingsMetadata), - new PsoStructureEntryInfo(MetaName.RocketSettings, PsoDataType.Structure, 440, 0, MetaName.camVehicleRocketSettings), - new PsoStructureEntryInfo((MetaName)1913942883, PsoDataType.Bool, 456, 0, 0), - new PsoStructureEntryInfo((MetaName)3459873736, PsoDataType.Bool, 457, 0, 0), - new PsoStructureEntryInfo((MetaName)880876795, PsoDataType.Bool, 458, 0, 0), - new PsoStructureEntryInfo((MetaName)153965986, PsoDataType.Structure, 464, 0, MetaName.camCinematicMountedCameraMetadataLookAroundSettings), - new PsoStructureEntryInfo((MetaName)1625111759, PsoDataType.Structure, 504, 0, MetaName.camCinematicMountedCameraMetadataLookAroundSettings), - new PsoStructureEntryInfo((MetaName)2701071860, PsoDataType.Structure, 544, 0, MetaName.camCinematicMountedCameraMetadataLookAroundSettings), - new PsoStructureEntryInfo((MetaName)1020746469, PsoDataType.Structure, 584, 0, MetaName.camCinematicMountedCameraMetadataFirstPersonRoll), - new PsoStructureEntryInfo((MetaName)3266557322, PsoDataType.Structure, 608, 0, MetaName.camCinematicMountedCameraMetadataFirstPersonPitchOffset), - new PsoStructureEntryInfo((MetaName)4210630063, PsoDataType.Bool, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachSpringDampingRatio, PsoDataType.Float, 660, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForMaxRelativeAttachSpringConstant, PsoDataType.Float, 664, 0, 0), - new PsoStructureEntryInfo((MetaName)17770171, PsoDataType.Float, 668, 0, 0), - new PsoStructureEntryInfo((MetaName)2454715147, PsoDataType.Float, 672, 0, 0), - new PsoStructureEntryInfo((MetaName)789371927, PsoDataType.Bool, 676, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToFollowPedHead, PsoDataType.Bool, 677, 0, 0), - new PsoStructureEntryInfo((MetaName)2639714447, PsoDataType.Bool, 678, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToFollowPedSeat, PsoDataType.Bool, 679, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldRestictToFrontSeat, PsoDataType.Bool, 680, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToVehicleExitEntryPoint, PsoDataType.Bool, 681, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToVehicleBone, PsoDataType.Bool, 682, 0, 0), - new PsoStructureEntryInfo((MetaName)4227962431, PsoDataType.Bool, 683, 0, 0), - new PsoStructureEntryInfo((MetaName)3424726202, PsoDataType.Bool, 684, 0, 0), - new PsoStructureEntryInfo((MetaName)883646732, PsoDataType.Bool, 685, 0, 0), - new PsoStructureEntryInfo((MetaName)1344883999, PsoDataType.Bool, 686, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2782414211), - new PsoStructureEntryInfo((MetaName)3524553148, PsoDataType.Flags, 688, 0, (MetaName)2097231), - new PsoStructureEntryInfo(MetaName.VehicleAttachPart, PsoDataType.Enum, 692, 0, (MetaName)3404480226), - new PsoStructureEntryInfo(MetaName.LookAtBehaviour, PsoDataType.Enum, 696, 0, (MetaName)2136742399), - new PsoStructureEntryInfo(MetaName.RelativeLookAtPosition, PsoDataType.Float3, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.LookBehindRelativeAttachPosition, PsoDataType.Float3, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLookBehindCustomPosition, PsoDataType.Bool, 736, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowPedLookAtBoneTag, PsoDataType.SInt, 740, 0, 0), - new PsoStructureEntryInfo(MetaName.OrientationSpring, PsoDataType.Structure, 744, 0, MetaName.camCinematicMountedCameraMetadataOrientationSpring), - new PsoStructureEntryInfo((MetaName)2204528705, PsoDataType.Structure, 808, 0, MetaName.camCinematicMountedCameraMetadataLeadingLookSettings), - new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 856, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 860, 0, 0), - new PsoStructureEntryInfo((MetaName)3932844561, PsoDataType.Float, 864, 0, 0), - new PsoStructureEntryInfo((MetaName)1690462370, PsoDataType.Float, 868, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeHeadingLimitsForMobilePhoneCamera, PsoDataType.Float2, 872, 0, 0), - new PsoStructureEntryInfo(MetaName.IsBehindVehicleGlass, PsoDataType.Bool, 880, 0, 0), - new PsoStructureEntryInfo((MetaName)2385481086, PsoDataType.Bool, 881, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 882, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldMakeFollowPedHeadInvisible, PsoDataType.Bool, 883, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldMakePedInAttachSeatInvisible, PsoDataType.Bool, 884, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldCopyVehicleCameraMotionBlur, PsoDataType.Bool, 885, 0, 0), - new PsoStructureEntryInfo(MetaName.LimitAttachParentRelativePitchAndHeading, PsoDataType.Bool, 886, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTerminateForPitchAndHeading, PsoDataType.Bool, 887, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRelativePitch, PsoDataType.Float2, 888, 0, 0), - new PsoStructureEntryInfo((MetaName)1537030464, PsoDataType.Float2, 896, 0, 0), - new PsoStructureEntryInfo((MetaName)3275096368, PsoDataType.Float2, 904, 0, 0), - new PsoStructureEntryInfo((MetaName)923714524, PsoDataType.Float2, 912, 0, 0), - new PsoStructureEntryInfo((MetaName)3680927973, PsoDataType.Float2, 920, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRelativeHeading, PsoDataType.Float2, 928, 0, 0), - new PsoStructureEntryInfo((MetaName)2362796003, PsoDataType.Float2, 936, 0, 0), - new PsoStructureEntryInfo((MetaName)2931436971, PsoDataType.Float2, 944, 0, 0), - new PsoStructureEntryInfo((MetaName)4288033461, PsoDataType.Float2, 952, 0, 0), - new PsoStructureEntryInfo((MetaName)1148577305, PsoDataType.Float2, 960, 0, 0), - new PsoStructureEntryInfo((MetaName)818123698, PsoDataType.Float2, 968, 0, 0), - new PsoStructureEntryInfo((MetaName)3197853445, PsoDataType.Float2, 976, 0, 0), - new PsoStructureEntryInfo((MetaName)1847367979, PsoDataType.Float2, 984, 0, 0), - new PsoStructureEntryInfo((MetaName)1083919137, PsoDataType.Float2, 992, 0, 0), - new PsoStructureEntryInfo((MetaName)4130730234, PsoDataType.Float2, 1000, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialRelativePitchLimits, PsoDataType.Float2, 1008, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialRelativeHeadingLimits, PsoDataType.Float2, 1016, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachParentRoll, PsoDataType.Bool, 1024, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTerminateForWorldPitch, PsoDataType.Bool, 1025, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialWorldPitchLimits, PsoDataType.Float2, 1028, 0, 0), - new PsoStructureEntryInfo(MetaName.WorldPitchLimits, PsoDataType.Float2, 1036, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTerminateForOcclusion, PsoDataType.Bool, 1044, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 1048, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTerminateIfOccludedByAttachParent, PsoDataType.Bool, 1052, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccludedByAttachParent, PsoDataType.UInt, 1056, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 1060, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 1064, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTerminateForDistanceToTarget, PsoDataType.Bool, 1068, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToTerminate, PsoDataType.Float, 1072, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldCalculateXYDistance, PsoDataType.Bool, 1076, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTestForClipping, PsoDataType.Bool, 1077, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToClipIntoDynamicCollision, PsoDataType.UInt, 1080, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 1084, 0, 0), - new PsoStructureEntryInfo((MetaName)816145056, PsoDataType.Bool, 1088, 0, 0), - new PsoStructureEntryInfo((MetaName)439797539, PsoDataType.Bool, 1089, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 1092, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 1096, 0, 0), - new PsoStructureEntryInfo((MetaName)976391107, PsoDataType.Bool, 1100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 1104, 0, 0), - new PsoStructureEntryInfo((MetaName)200247978, PsoDataType.Bool, 1108, 0, 0), - new PsoStructureEntryInfo((MetaName)1613380386, PsoDataType.Float, 1112, 0, 0), - new PsoStructureEntryInfo((MetaName)2154681758, PsoDataType.Bool, 1116, 0, 0), - new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 1120, 7, 0), - new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 1124, 7, 0), - new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 1128, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldByPassNearClip, PsoDataType.Bool, 1132, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTestForMapPenetrationFromAttachPosition, PsoDataType.Bool, 1133, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseHeading, PsoDataType.Float, 1136, 0, 0), - new PsoStructureEntryInfo((MetaName)1214392329, PsoDataType.Bool, 1140, 0, 0), - new PsoStructureEntryInfo((MetaName)2327168839, PsoDataType.Float, 1144, 0, 0), - new PsoStructureEntryInfo((MetaName)1246262822, PsoDataType.Float, 1148, 0, 0), - new PsoStructureEntryInfo((MetaName)4216676429, PsoDataType.Float, 1152, 0, 0), - new PsoStructureEntryInfo((MetaName)2719028802, PsoDataType.Structure, 1160, 0, MetaName.camCinematicMountedCameraMetadataMovementOnAccelerationSettings), - new PsoStructureEntryInfo((MetaName)36987752, PsoDataType.Float, 1208, 0, 0), - new PsoStructureEntryInfo((MetaName)3434721036, PsoDataType.Float3, 1216, 0, 0), - new PsoStructureEntryInfo((MetaName)3664516177, PsoDataType.Float, 1232, 0, 0), - new PsoStructureEntryInfo((MetaName)2807019381, PsoDataType.Float, 1236, 0, 0), - new PsoStructureEntryInfo((MetaName)1688077651, PsoDataType.Float, 1240, 0, 0), - new PsoStructureEntryInfo((MetaName)1499512130, PsoDataType.Float, 1244, 0, 0), - new PsoStructureEntryInfo((MetaName)805860083, PsoDataType.Float, 1248, 0, 0), - new PsoStructureEntryInfo((MetaName)1793179555, PsoDataType.Float, 1252, 0, 0), - new PsoStructureEntryInfo((MetaName)1784170819, PsoDataType.Float, 1256, 0, 0), - new PsoStructureEntryInfo((MetaName)2549816384, PsoDataType.Float, 1260, 0, 0), - new PsoStructureEntryInfo((MetaName)2482994089, PsoDataType.Float, 1264, 0, 0), - new PsoStructureEntryInfo((MetaName)3440187587, PsoDataType.Float, 1268, 0, 0), - new PsoStructureEntryInfo((MetaName)2744603068, PsoDataType.Float, 1272, 0, 0), - new PsoStructureEntryInfo((MetaName)1387580481, PsoDataType.Float, 1276, 0, 0), - new PsoStructureEntryInfo((MetaName)1233327091, PsoDataType.Float, 1280, 0, 0), - new PsoStructureEntryInfo((MetaName)3672709376, PsoDataType.Float3, 1296, 0, 0), - new PsoStructureEntryInfo((MetaName)2119789086, PsoDataType.Float3, 1312, 0, 0), - new PsoStructureEntryInfo((MetaName)2958804846, PsoDataType.Float, 1328, 0, 0), - new PsoStructureEntryInfo((MetaName)2107938182, PsoDataType.Float, 1332, 0, 0) - ); - case MetaName.camCinematicMountedCameraMetadataRelativePitchScalingToThrottle: - return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataRelativePitchScalingToThrottle, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)1802668561, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)200823333, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camCinematicMountedCameraMetadataLookAroundSettings: - return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataLookAroundSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.LeanScale, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)214599438, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)2702689596, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2951014073, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2830026870, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3102721723, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)509094775, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3198719034, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camCinematicMountedCameraMetadataFirstPersonRoll: - return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataFirstPersonRoll, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)455355504, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)694448363, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)2004679597, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2782811596, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camCinematicMountedCameraMetadataFirstPersonPitchOffset: - return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataFirstPersonPitchOffset, 0, 0, 48, - new PsoStructureEntryInfo((MetaName)551752221, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxOffset, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1775298710, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)2173221242, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)75090556, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.camCinematicMountedCameraMetadataOrientationSpring: - return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataOrientationSpring, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)1464813290, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)12756205, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)967704366, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3344080959, PsoDataType.Float2, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)243857972, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2399868550, PsoDataType.Float2, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)2060478858, PsoDataType.Float2, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)131585240, PsoDataType.Float2, 56, 0, 0) - ); - case MetaName.camCinematicMountedCameraMetadataLeadingLookSettings: - return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataLeadingLookSettings, 0, 0, 48, - new PsoStructureEntryInfo((MetaName)966483701, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)1778767763, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)3524239627, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1788878871, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3960905630, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)2872708052, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1733937006, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.camCinematicMountedCameraMetadataMovementOnAccelerationSettings: - return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataMovementOnAccelerationSettings, 0, 0, 48, - new PsoStructureEntryInfo((MetaName)3974113312, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3305119805, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1186910375, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1778767763, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZoomFactor, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3493441660, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1259376027, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.camCinematicPositionCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicPositionCameraMetadata, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3983210518, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3715714007, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3434528744, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)1699827350, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomDuration, PsoDataType.UInt, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)3609378888, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1843629037, PsoDataType.UInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 92, 7, 0), - new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 96, 7, 0), - new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 100, 7, 0) - ); - case MetaName.camCinematicWaterCrashCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicWaterCrashCameraMetadata, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3106190053, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScale, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DropDistance, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3822313305, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.tacticalXml, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2965889555, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.DropDuration, PsoDataType.UInt, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)2920068067, PsoDataType.UInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendDuration, PsoDataType.UInt, 80, 0, 0) - ); - case MetaName.camCinematicTwoShotCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicTwoShotCameraMetadata, 0, 0, 136, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeScale, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3072113430, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)654218252, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.CameraRelativeVerticalOffset, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)1926313598, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1167967077, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)656358172, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)940306022, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)4169793326, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistance, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)3573176421, PsoDataType.SInt, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)1953981041, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.IdleCmini, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)3754548217, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)2383824547, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)1720877983, PsoDataType.Bool, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)1117249844, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)3115155794, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)1144205032, PsoDataType.Bool, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)1450705774, PsoDataType.Float, 132, 0, 0) - ); - case MetaName.camCinematicPedCloseUpCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicPedCloseUpCameraMetadata, 0, 0, 192, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOffset, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1099610506, PsoDataType.Bool, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)3573176421, PsoDataType.SInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.LookAtOffset, PsoDataType.Float3, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)367186942, PsoDataType.Bool, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)3381486527, PsoDataType.UInt, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)3185512023, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)4280914022, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)430381212, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)2406519031, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)2116722083, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)4065237819, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)1391390084, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)3698583789, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)3754548217, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)2383824547, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo((MetaName)3406809215, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo((MetaName)4170206883, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo((MetaName)3418665750, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo((MetaName)2934396710, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo((MetaName)2715105524, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)3609378888, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 180, 0, 0) - ); - case MetaName.camControlHelperMetadata: - return new PsoStructureInfo(MetaName.camControlHelperMetadata, 0, 0, 288, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ViewModes, PsoDataType.Structure, 16, 0, MetaName.camControlHelperMetadataViewModes), - new PsoStructureEntryInfo(MetaName.LookAround, PsoDataType.Structure, 128, 0, MetaName.camControlHelperMetadataLookAround), - new PsoStructureEntryInfo(MetaName.Zoom, PsoDataType.Structure, 224, 0, MetaName.camControlHelperMetadataZoom), - new PsoStructureEntryInfo(MetaName.LookBehindOutroTimeMS, PsoDataType.UInt, 264, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLookBehindInput, PsoDataType.Bool, 268, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseAccurateModeInput, PsoDataType.Bool, 269, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldToggleAccurateModeInput, PsoDataType.Bool, 270, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplySniperControlPref, PsoDataType.Bool, 271, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyAimSensitivityPref, PsoDataType.Bool, 272, 0, 0), - new PsoStructureEntryInfo(MetaName.AimSensitivityScalingLimits, PsoDataType.Float2, 276, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDurationForMultiplayerViewModeActivation, PsoDataType.UInt, 284, 0, 0) - ); - case MetaName.camControlHelperMetadataViewModes: - return new PsoStructureInfo(MetaName.camControlHelperMetadataViewModes, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.ShouldUseViewModeInput, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldToggleViewModeBetweenThirdAndFirstPerson, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.Context, PsoDataType.Enum, 12, 0, (MetaName)513957198), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2703064232), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 16, 2, (MetaName)327683), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camControlHelperMetadataViewModeSettings), - new PsoStructureEntryInfo(MetaName.Settings, PsoDataType.Array, 24, 4, (MetaName)327685), - new PsoStructureEntryInfo(MetaName.ViewModeBlendEnvelopeRef, PsoDataType.String, 104, 7, 0) - ); - case MetaName.camControlHelperMetadataViewModeSettings: - return new PsoStructureInfo(MetaName.camControlHelperMetadataViewModeSettings, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitScaling, PsoDataType.Float2, 8, 0, 0) - ); - case MetaName.camControlHelperMetadataLookAround: - return new PsoStructureInfo(MetaName.camControlHelperMetadataLookAround, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Acceleration, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Deceleration, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeadingSpeed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitchSpeed, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MouseMaxHeadingSpeedMin, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MouseMaxHeadingSpeedMax, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MouseMaxPitchSpeedMin, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MouseMaxPitchSpeedMax, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.LSDeadZoneAngle, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.LSAcceleration, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.LSDeceleration, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseGameTime, PsoDataType.Bool, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.InputEnvelopeRef, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo(MetaName.PrecisionAimSettings, PsoDataType.Structure, 64, 0, MetaName.camControlHelperMetaDataPrecisionAimSettings) - ); - case MetaName.camControlHelperMetaDataPrecisionAimSettings: - return new PsoStructureInfo(MetaName.camControlHelperMetaDataPrecisionAimSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MinAccelModifier, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAccelModifier, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDeccelModifier, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDeccelModifier, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.InputMagToIncreaseDeadZoneMin, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.InputMagToIncreaseDeadZoneMax, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.camControlHelperMetadataZoom: - return new PsoStructureInfo(MetaName.camControlHelperMetadataZoom, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldUseZoomInput, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDiscreteZoomControl, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseGameTime, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFov, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFovForNetworkPlay, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxFov, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.Acceleration, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.Deceleration, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camCinematicVehicleTrackingCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehicleTrackingCameraMetadata, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.LookAtOffset, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.PositionOffset, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.Fov, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1292601136, PsoDataType.Float2, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)3554537001, PsoDataType.Float2, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)4013358927, PsoDataType.Float2, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)328948722, PsoDataType.Float2, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)2198318784, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)1142735275, PsoDataType.UInt, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 124, 0, 0) - ); - case MetaName.camEnvelopeMetadata: - return new PsoStructureInfo(MetaName.camEnvelopeMetadata, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)4004354650, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AttackDuration, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DecayDuration, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1735638891, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.HoldDuration, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ReleaseDuration, PsoDataType.UInt, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2014772834, PsoDataType.Enum, 40, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)1004206996, PsoDataType.Enum, 44, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)1484523694, PsoDataType.Bool, 48, 0, 0) - ); - case MetaName.camSpringMountMetadata: - return new PsoStructureInfo(MetaName.camSpringMountMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AccelerationLimit, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AccelerationForce, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringForce, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DampeningForce, PsoDataType.Float3, 64, 0, 0) - ); - case MetaName.camAnimatedCameraMetadata: - return new PsoStructureInfo(MetaName.camAnimatedCameraMetadata, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0) - ); - case MetaName.camFreeCameraMetadata: - return new PsoStructureInfo(MetaName.camFreeCameraMetadata, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.StartPosition, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ForwardAcceleration, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.StrafeAcceleration, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.VerticalAcceleration, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)430698760, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingAcceleration, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchAcceleration, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.RollAcceleration, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)991761956, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.FovAcceleration, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)2276437979, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)1380375800, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)3305680632, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)3631492583, PsoDataType.UInt, 100, 0, 0) - ); - case MetaName.camCinematicMountedPartCameraMetadata: - return new PsoStructureInfo(MetaName.camCinematicMountedPartCameraMetadata, 0, 0, 192, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantEnvelopeRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.SpringMountRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPart, PsoDataType.Enum, 48, 0, (MetaName)3404480226), - new PsoStructureEntryInfo((MetaName)2797646907, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeLookAtPosition, PsoDataType.Float3, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantLimits, PsoDataType.Float2, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantLimitsForPassengers, PsoDataType.Float2, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForMaxRelativeAttachSpringConstant, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.HighSpeedShakeSettings, PsoDataType.Structure, 120, 0, MetaName.camSpeedRelativeShakeSettingsMetadata), - new PsoStructureEntryInfo(MetaName.IsBehindVehicleGlass, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo((MetaName)2385481086, PsoDataType.Bool, 153, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 154, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldMakeFollowPedHeadInvisible, PsoDataType.Bool, 155, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldCopyVehicleCameraMotionBlur, PsoDataType.Bool, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTestForClipping, PsoDataType.Bool, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 188, 0, 0) - ); - case MetaName.camFollowPedCameraMetadata: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadata, 0, 0, 2288, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), - new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), - new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), - new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), - new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), - new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), - new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentInAirEnvelopeRef, PsoDataType.String, 784, 7, 0), - new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingOnGroundEnvelopeRef, PsoDataType.String, 788, 7, 0), - new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingInAirEnvelopeRef, PsoDataType.String, 792, 7, 0), - new PsoStructureEntryInfo(MetaName.AimBehaviourEnvelopeRef, PsoDataType.String, 796, 7, 0), - new PsoStructureEntryInfo(MetaName.WaterBobShakeRef, PsoDataType.String, 800, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentMovementForOrientation, PsoDataType.Bool, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 808, 0, MetaName.camFollowCameraMetadataPullAroundSettings), - new PsoStructureEntryInfo(MetaName.PullAroundSettingsForLookBehind, PsoDataType.Structure, 872, 0, MetaName.camFollowCameraMetadataPullAroundSettings), - new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentLocalXYVelocityForPullAround, PsoDataType.Bool, 936, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentForwardSpeedForPullAround, PsoDataType.Bool, 937, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundToAttachParentFront, PsoDataType.Bool, 938, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundToBasicAttachParentMatrix, PsoDataType.Bool, 939, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundUsingSimpleSpringDamping, PsoDataType.Bool, 940, 0, 0), - new PsoStructureEntryInfo((MetaName)2671392542, PsoDataType.Bool, 941, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachParentApproachSpeedForPitchLock, PsoDataType.Float, 944, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockHeading, PsoDataType.Bool, 948, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMoveSpeedForFollowOrientation, PsoDataType.Float, 952, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLookAroundMoveSpeedMultiplier, PsoDataType.Float, 956, 0, 0), - new PsoStructureEntryInfo(MetaName.SpeedLimitsForVerticalMoveSpeedScaling, PsoDataType.Float2, 960, 0, 0), - new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScaling, PsoDataType.Float, 968, 0, 0), - new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScalingAtMaxSpeed, PsoDataType.Float, 972, 0, 0), - new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingOnGround, PsoDataType.Float, 976, 0, 0), - new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingInAir, PsoDataType.Float, 980, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMoveOrientationSpeedDuringLookAround, PsoDataType.Float, 984, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowOrientationConing, PsoDataType.Structure, 992, 0, MetaName.camFollowCameraMetadataFollowOrientationConing), - new PsoStructureEntryInfo(MetaName.RollSettings, PsoDataType.Structure, 1024, 0, MetaName.camFollowCameraMetadataRollSettings), - new PsoStructureEntryInfo(MetaName.HighAltitudeZoomSettings, PsoDataType.Structure, 1064, 0, MetaName.camFollowCameraMetadataHighAltitudeZoomSettings), - new PsoStructureEntryInfo((MetaName)1885083576, PsoDataType.Bool, 1104, 0, 0), - new PsoStructureEntryInfo((MetaName)1213389792, PsoDataType.Bool, 1105, 0, 0), - new PsoStructureEntryInfo((MetaName)473739279, PsoDataType.Float, 1108, 0, 0), - new PsoStructureEntryInfo(MetaName.RagdollBlendEnvelopeRef, PsoDataType.String, 1112, 7, 0), - new PsoStructureEntryInfo((MetaName)3575968142, PsoDataType.String, 1116, 7, 0), - new PsoStructureEntryInfo((MetaName)2291862537, PsoDataType.UInt, 1120, 0, 0), - new PsoStructureEntryInfo((MetaName)459469516, PsoDataType.Float, 1124, 0, 0), - new PsoStructureEntryInfo((MetaName)4093180426, PsoDataType.Float, 1128, 0, 0), - new PsoStructureEntryInfo((MetaName)1028171116, PsoDataType.Float, 1132, 0, 0), - new PsoStructureEntryInfo((MetaName)2578221071, PsoDataType.Float2, 1136, 0, 0), - new PsoStructureEntryInfo((MetaName)2418079526, PsoDataType.String, 1144, 7, 0), - new PsoStructureEntryInfo((MetaName)300074581, PsoDataType.Bool, 1148, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFollowPedCameraMetadataCustomViewModeSettings), - new PsoStructureEntryInfo((MetaName)95464861, PsoDataType.Array, 1152, 4, (MetaName)327809), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFollowPedCameraMetadataCustomViewModeSettings), - new PsoStructureEntryInfo((MetaName)741352357, PsoDataType.Array, 1272, 4, (MetaName)327811), - new PsoStructureEntryInfo((MetaName)1557873238, PsoDataType.Bool, 1392, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFollowPedCameraMetadataCustomViewModeSettings), - new PsoStructureEntryInfo((MetaName)1607272001, PsoDataType.Array, 1400, 4, (MetaName)327814), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFollowPedCameraMetadataCustomViewModeSettings), - new PsoStructureEntryInfo((MetaName)467721499, PsoDataType.Array, 1520, 4, (MetaName)327816), - new PsoStructureEntryInfo((MetaName)4261252982, PsoDataType.String, 1640, 7, 0), - new PsoStructureEntryInfo((MetaName)2397521015, PsoDataType.Float, 1644, 0, 0), - new PsoStructureEntryInfo((MetaName)886249434, PsoDataType.Float, 1648, 0, 0), - new PsoStructureEntryInfo((MetaName)3909973356, PsoDataType.Float, 1652, 0, 0), - new PsoStructureEntryInfo((MetaName)4282038076, PsoDataType.Float, 1656, 0, 0), - new PsoStructureEntryInfo((MetaName)1414513338, PsoDataType.Float, 1660, 0, 0), - new PsoStructureEntryInfo((MetaName)233447402, PsoDataType.Float, 1664, 0, 0), - new PsoStructureEntryInfo((MetaName)813655062, PsoDataType.Float, 1668, 0, 0), - new PsoStructureEntryInfo((MetaName)859959795, PsoDataType.Float, 1672, 0, 0), - new PsoStructureEntryInfo((MetaName)2322941924, PsoDataType.Structure, 1680, 0, MetaName.camFollowPedCameraMetadataAssistedMovementAlignment), - new PsoStructureEntryInfo(MetaName.LadderAlignment, PsoDataType.Structure, 1768, 0, MetaName.camFollowPedCameraMetadataLadderAlignment), - new PsoStructureEntryInfo(MetaName.RappellingAlignment, PsoDataType.Structure, 1952, 0, MetaName.camFollowPedCameraMetadataRappellingAlignment), - new PsoStructureEntryInfo((MetaName)215880757, PsoDataType.Bool, 1968, 0, 0), - new PsoStructureEntryInfo((MetaName)4161177976, PsoDataType.Structure, 1976, 0, MetaName.camFollowCameraMetadataPullAroundSettings), - new PsoStructureEntryInfo((MetaName)2738607365, PsoDataType.Float2, 2040, 0, 0), - new PsoStructureEntryInfo((MetaName)3410646358, PsoDataType.Float2, 2048, 0, 0), - new PsoStructureEntryInfo((MetaName)528803049, PsoDataType.Bool, 2056, 0, 0), - new PsoStructureEntryInfo((MetaName)3857904181, PsoDataType.Float, 2060, 0, 0), - new PsoStructureEntryInfo((MetaName)2773176002, PsoDataType.Float, 2064, 0, 0), - new PsoStructureEntryInfo((MetaName)3592715839, PsoDataType.Bool, 2068, 0, 0), - new PsoStructureEntryInfo((MetaName)3895855693, PsoDataType.Float2, 2072, 0, 0), - new PsoStructureEntryInfo((MetaName)2344836057, PsoDataType.Structure, 2080, 0, MetaName.camFollowPedCameraMetadataOrbitPitchLimitsForOverheadCollision), - new PsoStructureEntryInfo((MetaName)3095276846, PsoDataType.Float, 2112, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleEntryExitPitchLevelSmoothRate, PsoDataType.Float, 2116, 0, 0), - new PsoStructureEntryInfo((MetaName)2068541596, PsoDataType.Float, 2120, 0, 0), - new PsoStructureEntryInfo((MetaName)1699579049, PsoDataType.Structure, 2128, 0, MetaName.camFollowPedCameraMetadataRunningShakeSettings), - new PsoStructureEntryInfo((MetaName)498572221, PsoDataType.Structure, 2160, 0, MetaName.camFollowPedCameraMetadataSwimmingShakeSettings), - new PsoStructureEntryInfo((MetaName)2385645301, PsoDataType.Structure, 2192, 0, MetaName.camFollowPedCameraMetadataDivingShakeSettings), - new PsoStructureEntryInfo((MetaName)136635268, PsoDataType.Structure, 2224, 0, MetaName.camFollowPedCameraMetadataHighFallShakeSettings), - new PsoStructureEntryInfo((MetaName)41370383, PsoDataType.Structure, 2248, 0, MetaName.camFollowPedCameraMetadataPushBeyondNearbyVehiclesInRagdollSettings) - ); - case MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.HeightScaling, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxExtraHeightForVehicleTrailers, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxExtraHeightForTowedVehicles, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveVehicleDriverSeat, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataBasePivotPosition: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataBasePivotPosition, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.ShouldUseBaseAttachPosition, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentHeightRatioToAttain, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentHeightRatioToAttainInTightSpace, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyInAttachParentLocalSpace, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.RollSettings, PsoDataType.Structure, 24, 0, MetaName.camThirdPersonCameraMetadataBasePivotPositionRollSettings), - new PsoStructureEntryInfo(MetaName.RelativeOffset, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockVerticalOffset, PsoDataType.Bool, 80, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataBasePivotPositionRollSettings: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataBasePivotPositionRollSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachParentRoll, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleScalingFactor, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngle, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataPivotPosition: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataPivotPosition, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.CameraRelativeSideOffset, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.CameraRelativeVerticalOffset, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentWidthScalingForCameraRelativeSideOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentHeightScalingForCameraRelativeVerticalOffset, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.timeAfterAimingToApplyAlternateScalingMin, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.timeAfterAimingToApplyAlternateScalingMax, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.maxDistanceAfterAimingToApplyAlternateScalingMax, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.timeAfterAimingToApplyDistanceBlend, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentHeightScalingForCameraRelativeVerticalOffset_AfterAiming, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)2888330455, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.BlendLevel, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraCameraRelativeVerticalOffset, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentHeightScalingForExtraCameraRelativeVerticalOffset, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataBuoyancySettings: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataBuoyancySettings, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.ShouldApplyBuoyancy, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelayBetweenBuoyancyStateChanges, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelayOnSubmerging, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelayOnSurfacing, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeSpentSwimmingToRespectMotionTask, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentDepthUnderWaterToRemainBuoyant, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentDepthUnderWaterToRemainBuoyantOut, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionFallBackBlendLevelToForceUnderWater, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldSetBuoyantWhenAttachParentNotFullySubmerged, PsoDataType.Bool, 40, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.AttachParentHeightRatioToAttain, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachParentHeightRatioToPushAwayFromCollision, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)4004666528, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendLevelAfterPushAwayFromCollision, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)31648245, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2702477980, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)20195593, PsoDataType.Bool, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyInAttachParentLocalSpace, PsoDataType.Bool, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ShouldApply, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDurationToTrackVehicles, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToTestDownForVehiclesToReject, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataLookOverSettings: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataLookOverSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.MinHeight, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchOffsetAtMinHeight, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchOffsetAtMaxHeight, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataStealthZoomSettings: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataStealthZoomSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ShouldApply, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZoomFactor, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camFollowCameraMetadataPullAroundSettings: - return new PsoStructureInfo(MetaName.camFollowCameraMetadataPullAroundSettings, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.ShouldBlendOutWhenAttachParentIsInAir, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldBlendOutWhenAttachParentIsOnGround, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldBlendWithAttachParentMatrixForRelativeOrbitBlend, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingPullAroundMinMoveSpeed, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingPullAroundMaxMoveSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingPullAroundSpeedAtMaxMoveSpeed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingPullAroundErrorScalingBlendLevel, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingPullAroundSpringConstant, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingPullAroundSpringDampingRatio, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchPullAroundMinMoveSpeed, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchPullAroundMaxMoveSpeed, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchPullAroundSpeedAtMaxMoveSpeed, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchPullAroundErrorScalingBlendLevel, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchPullAroundSpringConstant, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchPullAroundSpringDampingRatio, PsoDataType.Float, 56, 0, 0) - ); - case MetaName.camFollowCameraMetadataFollowOrientationConing: - return new PsoStructureInfo(MetaName.camFollowCameraMetadataFollowOrientationConing, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MaxAngle, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.AspectRatio, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchOffset, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SmoothRate, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camFollowCameraMetadataRollSettings: - return new PsoStructureInfo(MetaName.camFollowCameraMetadataRollSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldApplyRoll, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.RollSpringConstant, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.RollSpringDampRatio, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.RollAngleScale, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camFollowCameraMetadataHighAltitudeZoomSettings: - return new PsoStructureInfo(MetaName.camFollowCameraMetadataHighAltitudeZoomSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MinAltitudeDelta, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAltitudeDelta, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBaseFovScaling, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camFollowPedCameraMetadataCustomViewModeSettings: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataCustomViewModeSettings, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)4026985674, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camFollowPedCameraMetadataAssistedMovementAlignment: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataAssistedMovementAlignment, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.ShouldAlign, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)2541847736, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)3143901835, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2602308947, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 24, 0, MetaName.camFollowCameraMetadataPullAroundSettings) - ); - case MetaName.camFollowPedCameraMetadataLadderAlignment: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataLadderAlignment, 0, 0, 184, - new PsoStructureEntryInfo(MetaName.ShouldAlign, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)2541847736, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)261180327, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScaling, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)666447554, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)4131471736, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)3980517625, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 56, 0, MetaName.camFollowCameraMetadataPullAroundSettings), - new PsoStructureEntryInfo((MetaName)738690141, PsoDataType.Structure, 120, 0, MetaName.camFollowCameraMetadataPullAroundSettings) - ); - case MetaName.camFollowPedCameraMetadataRappellingAlignment: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataRappellingAlignment, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.ShouldAlign, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)261180327, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camFollowPedCameraMetadataOrbitPitchLimitsForOverheadCollision: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataOrbitPitchLimitsForOverheadCollision, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)1746008730, PsoDataType.Float2, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)256117257, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camFollowPedCameraMetadataRunningShakeSettings: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataRunningShakeSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinAmplitude, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)491218034, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2700987639, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camFollowPedCameraMetadataSwimmingShakeSettings: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataSwimmingShakeSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinAmplitude, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)491218034, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1443947683, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2015392943, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.camFollowPedCameraMetadataDivingShakeSettings: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataDivingShakeSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinHeight, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAmplitude, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camFollowPedCameraMetadataHighFallShakeSettings: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataHighFallShakeSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinSpeed, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camFollowPedCameraMetadataPushBeyondNearbyVehiclesInRagdollSettings: - return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataPushBeyondNearbyVehiclesInRagdollSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.MaxDurationToTrackVehicles, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)1159487467, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)2913317904, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)752814960, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1115262693, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DetectionRadius, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToTestDownForVehiclesToReject, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camCollisionMetadata: - return new PsoStructureInfo(MetaName.camCollisionMetadata, 0, 0, 240, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreOcclusionWithBrokenFragments, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreOcclusionWithBrokenFragmentsOfIgnoredEntities, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldMoveTowardsLos, PsoDataType.Bool, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldSweepToAvoidPopIn, PsoDataType.Bool, 19, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistPopInBehaviour, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullBackByCapsuleRadius, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreOcclusionWithSelectCollision, PsoDataType.Bool, 22, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreOcclusionWithRagdolls, PsoDataType.Bool, 23, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldReportAsCameraTypeTest, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.OcclusionSweep, PsoDataType.Structure, 32, 0, MetaName.camCollisionMetadataOcclusionSweep), - new PsoStructureEntryInfo(MetaName.PathFinding, PsoDataType.Structure, 72, 0, MetaName.camCollisionMetadataPathFinding), - new PsoStructureEntryInfo(MetaName.RotationTowardsLos, PsoDataType.Structure, 88, 0, MetaName.camCollisionMetadataRotationTowardsLos), - new PsoStructureEntryInfo(MetaName.OrbitDistanceDamping, PsoDataType.Structure, 104, 0, MetaName.camCollisionMetadataOrbitDistanceDamping), - new PsoStructureEntryInfo(MetaName.ClippingAvoidance, PsoDataType.Structure, 136, 0, MetaName.camCollisionMetadataClippingAvoidance), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 152, 0, MetaName.camCollisionMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.PushBeyondEntitiesIfClipping, PsoDataType.Structure, 184, 0, MetaName.camCollisionMetadataPushBeyondEntitiesIfClipping), - new PsoStructureEntryInfo(MetaName.PullBackTowardsCollision, PsoDataType.Structure, 216, 0, MetaName.camCollisionMetadataPullBackTowardsCollision) - ); - case MetaName.camCollisionMetadataOcclusionSweep: - return new PsoStructureInfo(MetaName.camCollisionMetadataOcclusionSweep, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.NumCapsuleTests, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionRootSpeedToForcePopIn, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPreCollisionCameraSpeedToForcePopIn, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSweepAngleWhenMovingTowardsLos, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSweepAngleWhenAvoidingPopIn, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinOrientationSpeedToMaintainDirection, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinCameraMoveSpeedToSweepInDirectionOfTravel, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camCollisionMetadataPathFinding: - return new PsoStructureInfo(MetaName.camCollisionMetadataPathFinding, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MaxCapsuleTests, PsoDataType.UInt, 8, 0, 0) - ); - case MetaName.camCollisionMetadataRotationTowardsLos: - return new PsoStructureInfo(MetaName.camCollisionMetadataRotationTowardsLos, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camCollisionMetadataOrbitDistanceDamping: - return new PsoStructureInfo(MetaName.camCollisionMetadataOrbitDistanceDamping, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MaxCollisionRootSpeedToPausePullBack, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPreCollisionCameraSpeedToPausePullBack, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceErrorToIgnore, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camCollisionMetadataClippingAvoidance: - return new PsoStructureInfo(MetaName.camCollisionMetadataClippingAvoidance, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MaxIterations, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.CapsuleLengthForDetection, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camCollisionMetadataBuoyancySettings: - return new PsoStructureInfo(MetaName.camCollisionMetadataBuoyancySettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShouldApplyBuoyancy, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreBuoyancyStateAndAvoidSurface, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHitNormalDotWorldUpForRivers, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.WaterHeightSmoothRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWaterWhenBuoyant, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDepthUnderWaterWhenNotBuoyant, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camCollisionMetadataPushBeyondEntitiesIfClipping: - return new PsoStructureInfo(MetaName.camCollisionMetadataPushBeyondEntitiesIfClipping, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ExtraDistanceToPushAway, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingToApplyWhenPushing, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.PullBackSpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.PushInSpringConstant, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAllowOtherCollisionToConstrainCameraIntoEntities, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)925224069, PsoDataType.Bool, 29, 0, 0), - new PsoStructureEntryInfo((MetaName)631999118, PsoDataType.Bool, 30, 0, 0) - ); - case MetaName.camCollisionMetadataPullBackTowardsCollision: - return new PsoStructureInfo(MetaName.camCollisionMetadataPullBackTowardsCollision, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.camHintHelperMetadata: - return new PsoStructureInfo(MetaName.camHintHelperMetadata, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FovScalar, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1674069994, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)67329582, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2753181554, PsoDataType.Structure, 40, 0, MetaName.camHintHelperMetadataPivotPositionAdditive), - new PsoStructureEntryInfo((MetaName)3051761482, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo((MetaName)399304638, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo((MetaName)315713489, PsoDataType.Bool, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)3421755121, PsoDataType.Bool, 73, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)1167921072, PsoDataType.Bool, 80, 0, 0) - ); - case MetaName.camHintHelperMetadataPivotPositionAdditive: - return new PsoStructureInfo(MetaName.camHintHelperMetadataPivotPositionAdditive, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)3517580346, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)2171374488, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)3803694830, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)187223663, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camInconsistentBehaviourZoomHelperMetadata: - return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperMetadata, 0, 0, 184, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)2835430912, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxFov, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)192388977, PsoDataType.Structure, 24, 0, MetaName.camInconsistentBehaviourZoomHelperDetectSuddenMovementSettings), - new PsoStructureEntryInfo((MetaName)3137016932, PsoDataType.Structure, 64, 0, MetaName.camInconsistentBehaviourZoomHelperDetectFastCameraTurnSettings), - new PsoStructureEntryInfo((MetaName)3922359176, PsoDataType.Structure, 104, 0, MetaName.camInconsistentBehaviourZoomHelperAirborneSettings), - new PsoStructureEntryInfo((MetaName)3604184077, PsoDataType.Structure, 144, 0, MetaName.camInconsistentBehaviourZoomHelperLosSettings) - ); - case MetaName.camInconsistentBehaviourZoomHelperDetectSuddenMovementSettings: - return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperDetectSuddenMovementSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldDetect, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ReactionTime, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)989577416, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2226168954, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2667621860, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2802018341, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camInconsistentBehaviourZoomHelperDetectFastCameraTurnSettings: - return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperDetectFastCameraTurnSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldDetect, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ReactionTime, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)989577416, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2226168954, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2667621860, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1513989445, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)423008264, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camInconsistentBehaviourZoomHelperAirborneSettings: - return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperAirborneSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldDetect, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ReactionTime, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)989577416, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2226168954, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2667621860, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)424844475, PsoDataType.UInt, 32, 0, 0) - ); - case MetaName.camInconsistentBehaviourZoomHelperLosSettings: - return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperLosSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldDetect, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ReactionTime, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)989577416, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2226168954, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2667621860, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1918423771, PsoDataType.UInt, 32, 0, 0) - ); - case MetaName.camCatchUpHelperMetadata: - return new PsoStructureInfo(MetaName.camCatchUpHelperMetadata, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)482340760, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1046944473, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendDuration, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3764337155, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2836572250, PsoDataType.Enum, 32, 0, MetaName.eCurveType) - ); - case MetaName.camLookAtDampingHelperMetadata: - return new PsoStructureInfo(MetaName.camLookAtDampingHelperMetadata, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)3543584583, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2722511334, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3076282416, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3481945794, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1705112434, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)627718911, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3152826625, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3880553368, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1561096582, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1150311187, PsoDataType.Float, 52, 0, 0) - ); - case MetaName.camLookAheadHelperMetadata: - return new PsoStructureInfo(MetaName.camLookAheadHelperMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)765307181, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)988110708, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeed, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3931376905, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1623903878, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3766959106, PsoDataType.Bool, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)88070689, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1846985178, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2004585270, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 60, 0, 0) - ); - case MetaName.camFollowVehicleCameraMetadata: - return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadata, 0, 0, 1376, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), - new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), - new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), - new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), - new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), - new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), - new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentInAirEnvelopeRef, PsoDataType.String, 784, 7, 0), - new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingOnGroundEnvelopeRef, PsoDataType.String, 788, 7, 0), - new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingInAirEnvelopeRef, PsoDataType.String, 792, 7, 0), - new PsoStructureEntryInfo(MetaName.AimBehaviourEnvelopeRef, PsoDataType.String, 796, 7, 0), - new PsoStructureEntryInfo(MetaName.WaterBobShakeRef, PsoDataType.String, 800, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentMovementForOrientation, PsoDataType.Bool, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 808, 0, MetaName.camFollowCameraMetadataPullAroundSettings), - new PsoStructureEntryInfo(MetaName.PullAroundSettingsForLookBehind, PsoDataType.Structure, 872, 0, MetaName.camFollowCameraMetadataPullAroundSettings), - new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentLocalXYVelocityForPullAround, PsoDataType.Bool, 936, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentForwardSpeedForPullAround, PsoDataType.Bool, 937, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundToAttachParentFront, PsoDataType.Bool, 938, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundToBasicAttachParentMatrix, PsoDataType.Bool, 939, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundUsingSimpleSpringDamping, PsoDataType.Bool, 940, 0, 0), - new PsoStructureEntryInfo((MetaName)2671392542, PsoDataType.Bool, 941, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachParentApproachSpeedForPitchLock, PsoDataType.Float, 944, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockHeading, PsoDataType.Bool, 948, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMoveSpeedForFollowOrientation, PsoDataType.Float, 952, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLookAroundMoveSpeedMultiplier, PsoDataType.Float, 956, 0, 0), - new PsoStructureEntryInfo(MetaName.SpeedLimitsForVerticalMoveSpeedScaling, PsoDataType.Float2, 960, 0, 0), - new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScaling, PsoDataType.Float, 968, 0, 0), - new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScalingAtMaxSpeed, PsoDataType.Float, 972, 0, 0), - new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingOnGround, PsoDataType.Float, 976, 0, 0), - new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingInAir, PsoDataType.Float, 980, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMoveOrientationSpeedDuringLookAround, PsoDataType.Float, 984, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowOrientationConing, PsoDataType.Structure, 992, 0, MetaName.camFollowCameraMetadataFollowOrientationConing), - new PsoStructureEntryInfo(MetaName.RollSettings, PsoDataType.Structure, 1024, 0, MetaName.camFollowCameraMetadataRollSettings), - new PsoStructureEntryInfo(MetaName.HighAltitudeZoomSettings, PsoDataType.Structure, 1064, 0, MetaName.camFollowCameraMetadataHighAltitudeZoomSettings), - new PsoStructureEntryInfo(MetaName.HandBrakeSwingSettings, PsoDataType.Structure, 1104, 0, MetaName.camFollowVehicleCameraMetadataHandBrakeSwingSettings), - new PsoStructureEntryInfo(MetaName.DuckUnderOverheadCollisionSettings, PsoDataType.Structure, 1136, 0, MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettings), - new PsoStructureEntryInfo(MetaName.HighSpeedZoomSettings, PsoDataType.Structure, 1192, 0, MetaName.camFollowVehicleCameraMetadataHighSpeedZoomSettings), - new PsoStructureEntryInfo(MetaName.HighSpeedShakeSettings, PsoDataType.Structure, 1224, 0, MetaName.camFollowVehicleCameraMetadataHighSpeedShakeSettings), - new PsoStructureEntryInfo(MetaName.WaterEntryShakeSettings, PsoDataType.Structure, 1248, 0, MetaName.camFollowVehicleCameraMetadataWaterEntryShakeSettings), - new PsoStructureEntryInfo(MetaName.VerticalFlightModeSettings, PsoDataType.Structure, 1280, 0, MetaName.camFollowVehicleCameraMetadataVerticalFlightModeSettings), - new PsoStructureEntryInfo(MetaName.DoorAlignmentSettings, PsoDataType.Structure, 1296, 0, MetaName.camVehicleCustomSettingsMetadataDoorAlignmentSettings), - new PsoStructureEntryInfo(MetaName.VehicleEntryExitPitchLevelSmoothRate, PsoDataType.Float, 1336, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraOrbitPitchOffsetForHighAngleMode, PsoDataType.Float, 1340, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraOrbitPitchOffsetForThirdPersonFarViewMode, PsoDataType.Float, 1344, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldForceCutToOrbitDistanceLimitsForThirdPersonFarViewMode, PsoDataType.Bool, 1348, 0, 0), - new PsoStructureEntryInfo(MetaName.ThirdPersonVehicleAimCameraRef, PsoDataType.String, 1352, 7, 0), - new PsoStructureEntryInfo((MetaName)4075164277, PsoDataType.Bool, 1356, 0, 0), - new PsoStructureEntryInfo((MetaName)2625336677, PsoDataType.String, 1360, 7, 0), - new PsoStructureEntryInfo((MetaName)3347720841, PsoDataType.Float2, 1364, 0, 0) - ); - case MetaName.camFollowVehicleCameraMetadataHandBrakeSwingSettings: - return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataHandBrakeSwingSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.HandBrakeInputEnvelopeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinLateralSkidSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLateralSkidSpeed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SwingSpeedAtMaxSkidSpeed, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettings: - return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettings, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.EnvelopeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldDuck, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchOffsetWhenFullyDucked, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToPersist, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.CapsuleSettings, PsoDataType.Structure, 32, 0, MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettingsCapsuleSettings) - ); - case MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettingsCapsuleSettings: - return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettingsCapsuleSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.NumTests, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.LengthScaling, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.OffsetLimits, PsoDataType.Float2, 16, 0, 0) - ); - case MetaName.camFollowVehicleCameraMetadataHighSpeedZoomSettings: - return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataHighSpeedZoomSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBaseFovScaling, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.CutsceneBlendSpringConstant, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.CutsceneBlendSpringDampingRatio, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.camFollowVehicleCameraMetadataHighSpeedShakeSettings: - return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataHighSpeedShakeSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camFollowVehicleCameraMetadataWaterEntryShakeSettings: - return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataWaterEntryShakeSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxShakeInstances, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DownwardSpeedLimits, PsoDataType.Float2, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AmplitudeLimits, PsoDataType.Float2, 24, 0, 0) - ); - case MetaName.camFollowVehicleCameraMetadataVerticalFlightModeSettings: - return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataVerticalFlightModeSettings, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 8, 0, 0) - ); - case MetaName.camVehicleCustomSettingsMetadataDoorAlignmentSettings: - return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataDoorAlignmentSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAlignOnVehicleExit, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo((MetaName)669372144, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.AlignmentConeOffsetTowardsVehicleFrontAngle, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.AlignmentConeAngle, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AlignmentConeAngleWithTrailer, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinOrientationDeltaToCut, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinOrientationDeltaToCutForReverseAngle, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinOrientationDeltaToCutWithTrailer, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camFollowParachuteCameraMetadata: - return new PsoStructureInfo(MetaName.camFollowParachuteCameraMetadata, 0, 0, 1136, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), - new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), - new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), - new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), - new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), - new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), - new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentInAirEnvelopeRef, PsoDataType.String, 784, 7, 0), - new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingOnGroundEnvelopeRef, PsoDataType.String, 788, 7, 0), - new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingInAirEnvelopeRef, PsoDataType.String, 792, 7, 0), - new PsoStructureEntryInfo(MetaName.AimBehaviourEnvelopeRef, PsoDataType.String, 796, 7, 0), - new PsoStructureEntryInfo(MetaName.WaterBobShakeRef, PsoDataType.String, 800, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentMovementForOrientation, PsoDataType.Bool, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 808, 0, MetaName.camFollowCameraMetadataPullAroundSettings), - new PsoStructureEntryInfo(MetaName.PullAroundSettingsForLookBehind, PsoDataType.Structure, 872, 0, MetaName.camFollowCameraMetadataPullAroundSettings), - new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentLocalXYVelocityForPullAround, PsoDataType.Bool, 936, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentForwardSpeedForPullAround, PsoDataType.Bool, 937, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundToAttachParentFront, PsoDataType.Bool, 938, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundToBasicAttachParentMatrix, PsoDataType.Bool, 939, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPullAroundUsingSimpleSpringDamping, PsoDataType.Bool, 940, 0, 0), - new PsoStructureEntryInfo((MetaName)2671392542, PsoDataType.Bool, 941, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachParentApproachSpeedForPitchLock, PsoDataType.Float, 944, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockHeading, PsoDataType.Bool, 948, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMoveSpeedForFollowOrientation, PsoDataType.Float, 952, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLookAroundMoveSpeedMultiplier, PsoDataType.Float, 956, 0, 0), - new PsoStructureEntryInfo(MetaName.SpeedLimitsForVerticalMoveSpeedScaling, PsoDataType.Float2, 960, 0, 0), - new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScaling, PsoDataType.Float, 968, 0, 0), - new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScalingAtMaxSpeed, PsoDataType.Float, 972, 0, 0), - new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingOnGround, PsoDataType.Float, 976, 0, 0), - new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingInAir, PsoDataType.Float, 980, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMoveOrientationSpeedDuringLookAround, PsoDataType.Float, 984, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowOrientationConing, PsoDataType.Structure, 992, 0, MetaName.camFollowCameraMetadataFollowOrientationConing), - new PsoStructureEntryInfo(MetaName.RollSettings, PsoDataType.Structure, 1024, 0, MetaName.camFollowCameraMetadataRollSettings), - new PsoStructureEntryInfo(MetaName.HighAltitudeZoomSettings, PsoDataType.Structure, 1064, 0, MetaName.camFollowCameraMetadataHighAltitudeZoomSettings), - new PsoStructureEntryInfo(MetaName.CustomSettings, PsoDataType.Structure, 1104, 0, MetaName.camFollowParachuteCameraMetadataCustomSettings) - ); - case MetaName.camFollowParachuteCameraMetadataCustomSettings: - return new PsoStructureInfo(MetaName.camFollowParachuteCameraMetadataCustomSettings, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)3501562487, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)1514912105, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)2028447415, PsoDataType.String, 16, 7, 0) - ); - case MetaName.camFirstPersonPedAimCameraMetadata: - return new PsoStructureInfo(MetaName.camFirstPersonPedAimCameraMetadata, 0, 0, 208, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinUpdatesBeforeApplyingMotionBlur, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseMotionBlurStrength, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMinFovDelta, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxFovDelta, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxStrengthForFov, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachRelativeOffset, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachOffsetRelativeToCamera, PsoDataType.Bool, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRelativeHeading, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRelativeHeading, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldMakeAttachedEntityInvisible, PsoDataType.Bool, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)1959607978, PsoDataType.Bool, 113, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 114, 0, 0), - new PsoStructureEntryInfo((MetaName)1120407412, PsoDataType.Bool, 115, 0, 0), - new PsoStructureEntryInfo(MetaName.ShakeFirstPersonShootingAbilityLimits, PsoDataType.Float2, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.ShakeAmplitudeScalingForShootingAbilityLimits, PsoDataType.Float2, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)2758176724, PsoDataType.Structure, 136, 0, MetaName.camFirstPersonAimCameraMetadataHeadingCorrection), - new PsoStructureEntryInfo((MetaName)330110937, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachPositionSmoothRate, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTorsoIkLimitsOverrideOrbitPitchLimits, PsoDataType.Bool, 188, 0, 0), - new PsoStructureEntryInfo((MetaName)1847867369, PsoDataType.Bool, 189, 0, 0), - new PsoStructureEntryInfo((MetaName)1173900687, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo((MetaName)1322555765, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo((MetaName)1723254225, PsoDataType.Bool, 200, 0, 0) - ); - case MetaName.camFirstPersonAimCameraMetadataHeadingCorrection: - return new PsoStructureInfo(MetaName.camFirstPersonAimCameraMetadataHeadingCorrection, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)1496770623, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DeltaTolerance, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.camFirstPersonShooterCameraMetadata: - return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadata, 0, 0, 1664, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinUpdatesBeforeApplyingMotionBlur, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseMotionBlurStrength, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMinFovDelta, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxFovDelta, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxStrengthForFov, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachRelativeOffset, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachOffsetRelativeToCamera, PsoDataType.Bool, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRelativeHeading, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRelativeHeading, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldMakeAttachedEntityInvisible, PsoDataType.Bool, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)1959607978, PsoDataType.Bool, 113, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 114, 0, 0), - new PsoStructureEntryInfo((MetaName)1120407412, PsoDataType.Bool, 115, 0, 0), - new PsoStructureEntryInfo(MetaName.ShakeFirstPersonShootingAbilityLimits, PsoDataType.Float2, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.ShakeAmplitudeScalingForShootingAbilityLimits, PsoDataType.Float2, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)2758176724, PsoDataType.Structure, 136, 0, MetaName.camFirstPersonAimCameraMetadataHeadingCorrection), - new PsoStructureEntryInfo((MetaName)330110937, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 176, 7, 0), - new PsoStructureEntryInfo((MetaName)3500215588, PsoDataType.Float3, 192, 0, 0), - new PsoStructureEntryInfo((MetaName)1583458555, PsoDataType.Float3, 208, 0, 0), - new PsoStructureEntryInfo((MetaName)3253139357, PsoDataType.Float3, 224, 0, 0), - new PsoStructureEntryInfo((MetaName)4262893203, PsoDataType.Float3, 240, 0, 0), - new PsoStructureEntryInfo((MetaName)2347724525, PsoDataType.Float3, 256, 0, 0), - new PsoStructureEntryInfo((MetaName)3438104893, PsoDataType.Float3, 272, 0, 0), - new PsoStructureEntryInfo((MetaName)424961570, PsoDataType.Float3, 288, 0, 0), - new PsoStructureEntryInfo((MetaName)104465235, PsoDataType.Float3, 304, 0, 0), - new PsoStructureEntryInfo((MetaName)4034848485, PsoDataType.Float3, 320, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRelativeHeading, PsoDataType.Float2, 336, 0, 0), - new PsoStructureEntryInfo((MetaName)2372600507, PsoDataType.Float2, 344, 0, 0), - new PsoStructureEntryInfo((MetaName)971666241, PsoDataType.Float2, 352, 0, 0), - new PsoStructureEntryInfo((MetaName)162051482, PsoDataType.Float2, 360, 0, 0), - new PsoStructureEntryInfo((MetaName)3789298543, PsoDataType.Float2, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)3507003526, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo((MetaName)1765689234, PsoDataType.String, 384, 7, 0), - new PsoStructureEntryInfo((MetaName)722540604, PsoDataType.String, 388, 7, 0), - new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 392, 7, 0), - new PsoStructureEntryInfo((MetaName)3102337801, PsoDataType.String, 396, 7, 0), - new PsoStructureEntryInfo((MetaName)1038878908, PsoDataType.String, 400, 7, 0), - new PsoStructureEntryInfo((MetaName)3684814544, PsoDataType.String, 404, 7, 0), - new PsoStructureEntryInfo((MetaName)2377645189, PsoDataType.String, 408, 7, 0), - new PsoStructureEntryInfo((MetaName)3664775821, PsoDataType.String, 412, 7, 0), - new PsoStructureEntryInfo((MetaName)3075522471, PsoDataType.String, 416, 7, 0), - new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 420, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeAttachPositionSmoothRate, PsoDataType.Float, 424, 0, 0), - new PsoStructureEntryInfo((MetaName)3559802057, PsoDataType.Structure, 432, 0, MetaName.camFirstPersonShooterCameraMetadataRelativeAttachOrientationSettings), - new PsoStructureEntryInfo((MetaName)3284913244, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo((MetaName)742850166, PsoDataType.Float, 548, 0, 0), - new PsoStructureEntryInfo((MetaName)1801708329, PsoDataType.Float, 552, 0, 0), - new PsoStructureEntryInfo((MetaName)522025471, PsoDataType.Float, 556, 0, 0), - new PsoStructureEntryInfo(MetaName.AimFov, PsoDataType.Float, 560, 0, 0), - new PsoStructureEntryInfo((MetaName)2685045238, PsoDataType.Float, 564, 0, 0), - new PsoStructureEntryInfo((MetaName)1545486036, PsoDataType.Float, 568, 0, 0), - new PsoStructureEntryInfo(MetaName.PhoneFov, PsoDataType.Float, 572, 0, 0), - new PsoStructureEntryInfo((MetaName)2263644173, PsoDataType.Float, 576, 0, 0), - new PsoStructureEntryInfo((MetaName)189771911, PsoDataType.Float, 580, 0, 0), - new PsoStructureEntryInfo((MetaName)3266229162, PsoDataType.Float, 584, 0, 0), - new PsoStructureEntryInfo((MetaName)3113298498, PsoDataType.Float, 588, 0, 0), - new PsoStructureEntryInfo((MetaName)317025866, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo((MetaName)788370107, PsoDataType.Float, 596, 0, 0), - new PsoStructureEntryInfo((MetaName)1892114730, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo((MetaName)2312570903, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo((MetaName)1650788232, PsoDataType.Float, 608, 0, 0), - new PsoStructureEntryInfo((MetaName)3142109941, PsoDataType.Float, 612, 0, 0), - new PsoStructureEntryInfo((MetaName)1692829019, PsoDataType.Float, 616, 0, 0), - new PsoStructureEntryInfo((MetaName)1583361695, PsoDataType.Float, 620, 0, 0), - new PsoStructureEntryInfo((MetaName)3530519735, PsoDataType.Float, 624, 0, 0), - new PsoStructureEntryInfo((MetaName)1560089378, PsoDataType.Float, 628, 0, 0), - new PsoStructureEntryInfo((MetaName)1683046794, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo((MetaName)1176445410, PsoDataType.Float, 636, 0, 0), - new PsoStructureEntryInfo((MetaName)3761456258, PsoDataType.Float, 640, 0, 0), - new PsoStructureEntryInfo((MetaName)413985988, PsoDataType.Float, 644, 0, 0), - new PsoStructureEntryInfo((MetaName)731578407, PsoDataType.Float, 648, 0, 0), - new PsoStructureEntryInfo((MetaName)3517278862, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.LadderPitch, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo((MetaName)83336335, PsoDataType.Float, 660, 0, 0), - new PsoStructureEntryInfo((MetaName)3203179444, PsoDataType.Float, 664, 0, 0), - new PsoStructureEntryInfo((MetaName)803486985, PsoDataType.Float, 668, 0, 0), - new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 672, 0, 0), - new PsoStructureEntryInfo((MetaName)2122499987, PsoDataType.Float, 676, 0, 0), - new PsoStructureEntryInfo((MetaName)1515082975, PsoDataType.Float, 680, 0, 0), - new PsoStructureEntryInfo((MetaName)1515564685, PsoDataType.Float, 684, 0, 0), - new PsoStructureEntryInfo((MetaName)3592059377, PsoDataType.Float, 688, 0, 0), - new PsoStructureEntryInfo((MetaName)448454700, PsoDataType.Bool, 692, 0, 0), - new PsoStructureEntryInfo((MetaName)545313111, PsoDataType.Float, 696, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo((MetaName)1534221961, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo((MetaName)270168093, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo((MetaName)2100042799, PsoDataType.Float, 712, 0, 0), - new PsoStructureEntryInfo((MetaName)3626441228, PsoDataType.UInt, 716, 0, 0), - new PsoStructureEntryInfo((MetaName)700340890, PsoDataType.UInt, 720, 0, 0), - new PsoStructureEntryInfo((MetaName)1968480925, PsoDataType.UInt, 724, 0, 0), - new PsoStructureEntryInfo((MetaName)2850438294, PsoDataType.UInt, 728, 0, 0), - new PsoStructureEntryInfo((MetaName)1608452380, PsoDataType.UInt, 732, 0, 0), - new PsoStructureEntryInfo((MetaName)2387142724, PsoDataType.UInt, 736, 0, 0), - new PsoStructureEntryInfo((MetaName)2743970065, PsoDataType.UInt, 740, 0, 0), - new PsoStructureEntryInfo((MetaName)2452155390, PsoDataType.UInt, 744, 0, 0), - new PsoStructureEntryInfo(MetaName.OrientationSpring, PsoDataType.Structure, 752, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpring), - new PsoStructureEntryInfo((MetaName)415673303, PsoDataType.Structure, 792, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpring), - new PsoStructureEntryInfo((MetaName)3397810078, PsoDataType.Structure, 832, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpring), - new PsoStructureEntryInfo((MetaName)3440729757, PsoDataType.Structure, 872, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)2454767338, PsoDataType.Structure, 888, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)1962460716, PsoDataType.Structure, 904, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)1766077384, PsoDataType.Structure, 920, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)2053281479, PsoDataType.Structure, 936, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)3083287001, PsoDataType.Structure, 952, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)4060968766, PsoDataType.Structure, 968, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)2437540040, PsoDataType.Structure, 984, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)3391036765, PsoDataType.Structure, 1000, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)2728534787, PsoDataType.Structure, 1016, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)3139215619, PsoDataType.Structure, 1032, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)4087791749, PsoDataType.Structure, 1048, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)2550891007, PsoDataType.Structure, 1064, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), - new PsoStructureEntryInfo((MetaName)475503552, PsoDataType.Float, 1080, 0, 0), - new PsoStructureEntryInfo((MetaName)1215439957, PsoDataType.Float2, 1084, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTorsoIkLimitsOverrideOrbitPitchLimits, PsoDataType.Bool, 1092, 0, 0), - new PsoStructureEntryInfo((MetaName)1723254225, PsoDataType.Bool, 1093, 0, 0), - new PsoStructureEntryInfo((MetaName)366723406, PsoDataType.String, 1096, 7, 0), - new PsoStructureEntryInfo((MetaName)264754789, PsoDataType.String, 1100, 7, 0), - new PsoStructureEntryInfo((MetaName)1539647797, PsoDataType.String, 1104, 7, 0), - new PsoStructureEntryInfo((MetaName)1519473347, PsoDataType.Float, 1108, 0, 0), - new PsoStructureEntryInfo((MetaName)3224324247, PsoDataType.Float, 1112, 0, 0), - new PsoStructureEntryInfo((MetaName)2478271115, PsoDataType.Float, 1116, 0, 0), - new PsoStructureEntryInfo((MetaName)2317113905, PsoDataType.Float, 1120, 0, 0), - new PsoStructureEntryInfo((MetaName)3903912151, PsoDataType.Float, 1124, 0, 0), - new PsoStructureEntryInfo((MetaName)2266019553, PsoDataType.Float, 1128, 0, 0), - new PsoStructureEntryInfo((MetaName)3706052819, PsoDataType.Float, 1132, 0, 0), - new PsoStructureEntryInfo((MetaName)2722258227, PsoDataType.Float, 1136, 0, 0), - new PsoStructureEntryInfo((MetaName)1525907069, PsoDataType.Float, 1140, 0, 0), - new PsoStructureEntryInfo((MetaName)2570774561, PsoDataType.Float, 1144, 0, 0), - new PsoStructureEntryInfo((MetaName)1547572758, PsoDataType.Bool, 1148, 0, 0), - new PsoStructureEntryInfo((MetaName)3957958745, PsoDataType.UInt, 1152, 0, 0), - new PsoStructureEntryInfo((MetaName)1630855608, PsoDataType.Float, 1156, 0, 0), - new PsoStructureEntryInfo((MetaName)3965978499, PsoDataType.Structure, 1160, 0, MetaName.camFirstPersonShooterCameraMetadataStickyAim), - new PsoStructureEntryInfo((MetaName)585212636, PsoDataType.Structure, 1272, 0, MetaName.camFirstPersonShooterCameraMetadataStickyAim), - new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 1384, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 1385, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 1388, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 1392, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 1396, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 1400, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 1404, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 1408, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 1412, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 1416, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 1420, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 1424, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 1428, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 1432, 0, 0), - new PsoStructureEntryInfo((MetaName)2447870594, PsoDataType.Float, 1436, 0, 0), - new PsoStructureEntryInfo((MetaName)2225908075, PsoDataType.Float, 1440, 0, 0), - new PsoStructureEntryInfo((MetaName)1894138, PsoDataType.Float, 1444, 0, 0), - new PsoStructureEntryInfo((MetaName)724885771, PsoDataType.Float, 1448, 0, 0), - new PsoStructureEntryInfo((MetaName)2413827894, PsoDataType.Float2, 1452, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverSettings, PsoDataType.Structure, 1464, 0, MetaName.camFirstPersonShooterCameraMetadataCoverSettings), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFirstPersonShooterCameraMetadataSprintBreakOutSettings), - new PsoStructureEntryInfo((MetaName)2011532787, PsoDataType.Array, 1584, 1, (MetaName)131236), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 1656, 7, 0) - ); - case MetaName.camFirstPersonShooterCameraMetadataRelativeAttachOrientationSettings: - return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataRelativeAttachOrientationSettings, 0, 0, 112, - new PsoStructureEntryInfo((MetaName)3727099699, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)3120224920, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)2408234737, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)869960116, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3340971535, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2197092363, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2198368821, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3606762226, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1647925848, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)490937808, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)379620733, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1441798592, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3840322276, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3383026591, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)1824793815, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1259376027, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2964527414, PsoDataType.Float3, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)2439730995, PsoDataType.Float3, 96, 0, 0) - ); - case MetaName.camFirstPersonShooterCameraMetadataOrientationSpring: - return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataOrientationSpring, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.HeadingLimits, PsoDataType.Float2, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1524988618, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)1290012653, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite: - return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camFirstPersonShooterCameraMetadataStickyAim: - return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataStickyAim, 0, 0, 112, - new PsoStructureEntryInfo((MetaName)934287534, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)1890095417, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)2911838887, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1168068740, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)943460322, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2440008981, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3546382126, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3702929248, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1390609527, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1952283316, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1859396322, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)3508865952, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)4071651879, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3012719683, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)1163787532, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)3148686816, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2294593316, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)3264503435, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)432760898, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)3118501359, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)2024506330, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)1824271937, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)721888806, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)903289241, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)2991714924, PsoDataType.Float, 104, 0, 0) - ); - case MetaName.camFirstPersonShooterCameraMetadataCoverSettings: - return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataCoverSettings, 0, 0, 120, - new PsoStructureEntryInfo((MetaName)2970917480, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)256711860, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)2716737212, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1153272400, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)11232964, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1680843526, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1294539981, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3548711893, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3299300152, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1497386222, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)783496886, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2616989255, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingCorrection, PsoDataType.Structure, 56, 0, MetaName.camFirstPersonAimCameraMetadataHeadingCorrection), - new PsoStructureEntryInfo((MetaName)907428778, PsoDataType.SInt, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)4143200730, PsoDataType.SInt, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)105496678, PsoDataType.SInt, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)2098811685, PsoDataType.SInt, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)1946159554, PsoDataType.SInt, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)3595423851, PsoDataType.SInt, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)153370955, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)1271201291, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)558015512, PsoDataType.UInt, 112, 0, 0) - ); - case MetaName.camFirstPersonShooterCameraMetadataSprintBreakOutSettings: - return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataSprintBreakOutSettings, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)741085985, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)87271889, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)4190510062, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1438187592, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1823031239, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2144963791, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.camFirstPersonHeadTrackingAimCameraMetadata: - return new PsoStructureInfo(MetaName.camFirstPersonHeadTrackingAimCameraMetadata, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinUpdatesBeforeApplyingMotionBlur, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseMotionBlurStrength, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMinFovDelta, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxFovDelta, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxStrengthForFov, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachRelativeOffset, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachOffsetRelativeToCamera, PsoDataType.Bool, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRelativeHeading, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRelativeHeading, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 116, 0, 0) - ); - case MetaName.camThirdPersonPedAimCameraMetadata: - return new PsoStructureInfo(MetaName.camThirdPersonPedAimCameraMetadata, 0, 0, 1040, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), - new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), - new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), - new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), - new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), - new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), - new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), - new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), - new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), - new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), - new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnTargetStunnedEnvelopeRef, PsoDataType.String, 880, 7, 0), - new PsoStructureEntryInfo(MetaName.LockOnTargetDampingSettings, PsoDataType.Structure, 888, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings), - new PsoStructureEntryInfo(MetaName.LockOnOrbitDistanceSettings, PsoDataType.Structure, 928, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings), - new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffset, PsoDataType.Float3, 976, 0, 0), - new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffsetAtOrbitHeadingLimits, PsoDataType.Float3, 992, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 1008, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldScriptedAimTaskOverrideOrbitPitchLimits, PsoDataType.Bool, 1012, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAimSweepOverrideOrbitPitchLimits, PsoDataType.Bool, 1013, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsForMobilePhoneShallowDofMode, PsoDataType.String, 1016, 7, 0), - new PsoStructureEntryInfo((MetaName)309842601, PsoDataType.Float, 1020, 0, 0), - new PsoStructureEntryInfo((MetaName)3770307856, PsoDataType.Bool, 1024, 0, 0) - ); - case MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldApplyDamping, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.StunnedHeadingSpringConstant, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.StunnedHeadingSpringDampingRatio, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StunnedPitchSpringConstant, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.StunnedPitchSpringDampingRatio, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.StunnedDistanceSpringConstant, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.StunnedDistanceSpringDampingRatio, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldApplyScaling, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnDistanceLimits, PsoDataType.Float2, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingLimits, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingSpringConstant, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingSpringDampingRatio, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraMetadata: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraMetadata, 0, 0, 1584, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), - new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), - new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), - new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), - new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), - new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), - new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), - new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), - new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), - new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), - new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnTargetStunnedEnvelopeRef, PsoDataType.String, 880, 7, 0), - new PsoStructureEntryInfo(MetaName.LockOnTargetDampingSettings, PsoDataType.Structure, 888, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings), - new PsoStructureEntryInfo(MetaName.LockOnOrbitDistanceSettings, PsoDataType.Structure, 928, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings), - new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffset, PsoDataType.Float3, 976, 0, 0), - new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffsetAtOrbitHeadingLimits, PsoDataType.Float3, 992, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 1008, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldScriptedAimTaskOverrideOrbitPitchLimits, PsoDataType.Bool, 1012, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAimSweepOverrideOrbitPitchLimits, PsoDataType.Bool, 1013, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsForMobilePhoneShallowDofMode, PsoDataType.String, 1016, 7, 0), - new PsoStructureEntryInfo((MetaName)309842601, PsoDataType.Float, 1020, 0, 0), - new PsoStructureEntryInfo((MetaName)3770307856, PsoDataType.Bool, 1024, 0, 0), - new PsoStructureEntryInfo((MetaName)2612404486, PsoDataType.Bool, 1040, 0, 0), - new PsoStructureEntryInfo((MetaName)3464513788, PsoDataType.String, 1044, 7, 0), - new PsoStructureEntryInfo((MetaName)3165832172, PsoDataType.Float, 1048, 0, 0), - new PsoStructureEntryInfo((MetaName)313901382, PsoDataType.Float, 1052, 0, 0), - new PsoStructureEntryInfo((MetaName)3456520914, PsoDataType.Float, 1056, 0, 0), - new PsoStructureEntryInfo((MetaName)3227758752, PsoDataType.Float, 1060, 0, 0), - new PsoStructureEntryInfo((MetaName)2595201884, PsoDataType.Structure, 1064, 0, MetaName.camThirdPersonPedAssistedAimCameraShakeActivityScalingSettings), - new PsoStructureEntryInfo((MetaName)1699579049, PsoDataType.Structure, 1088, 0, MetaName.camThirdPersonPedAssistedAimCameraRunningShakeSettings), - new PsoStructureEntryInfo((MetaName)2514985597, PsoDataType.Structure, 1112, 0, MetaName.camThirdPersonPedAssistedAimCameraRunningShakeSettings), - new PsoStructureEntryInfo((MetaName)3459655185, PsoDataType.Structure, 1136, 0, MetaName.camThirdPersonPedAssistedAimCameraPivotScalingSettings), - new PsoStructureEntryInfo((MetaName)1039438125, PsoDataType.Structure, 1192, 0, MetaName.camThirdPersonPedAssistedAimCameraShootingFocusSettings), - new PsoStructureEntryInfo((MetaName)2331386580, PsoDataType.Structure, 1248, 0, MetaName.camThirdPersonPedAssistedAimCameraCinematicMomentSettings), - new PsoStructureEntryInfo((MetaName)3975806377, PsoDataType.Structure, 1432, 0, MetaName.camThirdPersonPedAssistedAimCameraRecoilShakeScalingSettings), - new PsoStructureEntryInfo((MetaName)2579888707, PsoDataType.Structure, 1464, 0, MetaName.camThirdPersonPedAssistedAimCameraInCoverSettings) - ); - case MetaName.camThirdPersonPedAssistedAimCameraShakeActivityScalingSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraShakeActivityScalingSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.AmplitudeScale, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraRunningShakeSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraRunningShakeSettings, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinAmplitude, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3083741385, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2434404012, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo((MetaName)1424595128, PsoDataType.Bool, 22, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraPivotScalingSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraPivotScalingSettings, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)3290868314, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZoomFactor, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1239610477, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)4266810853, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2490035552, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)1582111169, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ErrorThreshold, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.SideOffset, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)3185812029, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2740464011, PsoDataType.Float, 52, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraShootingFocusSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraShootingFocusSettings, 0, 0, 56, - new PsoStructureEntryInfo((MetaName)1778381348, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)352609433, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2503271690, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZoomFactor, PsoDataType.Float, 48, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraCinematicMomentSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraCinematicMomentSettings, 0, 0, 184, - new PsoStructureEntryInfo((MetaName)3112353702, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)3298892127, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)3924454742, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2215779446, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)917560913, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1705773296, PsoDataType.UInt, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3495762240, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)2011477591, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3944656129, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3273599536, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.ZoomFactor, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1293989475, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3934763180, PsoDataType.Structure, 56, 0, MetaName.camThirdPersonPedAssistedAimCameraLockOnAlignmentSettings), - new PsoStructureEntryInfo((MetaName)4209943355, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)3222932576, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)1411402256, PsoDataType.Structure, 120, 0, MetaName.camThirdPersonPedAssistedAimCameraPlayerFramingSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 180, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraLockOnAlignmentSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraLockOnAlignmentSettings, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)2192037365, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)1207772736, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1953981041, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.IdleCmini, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3067708566, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3928624067, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)4117544351, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3546588287, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)2433975532, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2894326732, PsoDataType.Float, 48, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraPlayerFramingSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraPlayerFramingSettings, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.AttackDelay, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.AttackDuration, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ReleaseDelay, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1918481730, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredPitch, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3067708566, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3928624067, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)4117544351, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3648026356, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraRecoilShakeScalingSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraRecoilShakeScalingSettings, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)632884413, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)3501089975, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)1841607681, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)405521980, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2308368369, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camThirdPersonPedAssistedAimCameraInCoverSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraInCoverSettings, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3044106186, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2342994624, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2363962395, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3996729234, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2974603259, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1163820100, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1153320978, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)887750583, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.parameterIntensity, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3038154213, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)795086429, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)2305231569, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2043206239, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1283135688, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)3878807616, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)3640542370, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)3758922505, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)1764223557, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)3214654546, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)1111260888, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)3050977735, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)1185331567, PsoDataType.Float, 108, 0, 0) - ); - case MetaName.camThirdPersonPedAimInCoverCameraMetadata: - return new PsoStructureInfo(MetaName.camThirdPersonPedAimInCoverCameraMetadata, 0, 0, 1248, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), - new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), - new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), - new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), - new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), - new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), - new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), - new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), - new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), - new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), - new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnTargetStunnedEnvelopeRef, PsoDataType.String, 880, 7, 0), - new PsoStructureEntryInfo(MetaName.LockOnTargetDampingSettings, PsoDataType.Structure, 888, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings), - new PsoStructureEntryInfo(MetaName.LockOnOrbitDistanceSettings, PsoDataType.Structure, 928, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings), - new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffset, PsoDataType.Float3, 976, 0, 0), - new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffsetAtOrbitHeadingLimits, PsoDataType.Float3, 992, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 1008, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldScriptedAimTaskOverrideOrbitPitchLimits, PsoDataType.Bool, 1012, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAimSweepOverrideOrbitPitchLimits, PsoDataType.Bool, 1013, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsForMobilePhoneShallowDofMode, PsoDataType.String, 1016, 7, 0), - new PsoStructureEntryInfo((MetaName)309842601, PsoDataType.Float, 1020, 0, 0), - new PsoStructureEntryInfo((MetaName)3770307856, PsoDataType.Bool, 1024, 0, 0), - new PsoStructureEntryInfo((MetaName)124410885, PsoDataType.Float, 1040, 0, 0), - new PsoStructureEntryInfo((MetaName)1852506764, PsoDataType.Float, 1044, 0, 0), - new PsoStructureEntryInfo((MetaName)1914946004, PsoDataType.Float, 1048, 0, 0), - new PsoStructureEntryInfo((MetaName)2125876256, PsoDataType.Float, 1052, 0, 0), - new PsoStructureEntryInfo((MetaName)3456376985, PsoDataType.Float, 1056, 0, 0), - new PsoStructureEntryInfo(MetaName.streamedMusc, PsoDataType.Float, 1060, 0, 0), - new PsoStructureEntryInfo((MetaName)2791057952, PsoDataType.Float, 1064, 0, 0), - new PsoStructureEntryInfo((MetaName)1336398630, PsoDataType.Bool, 1068, 0, 0), - new PsoStructureEntryInfo((MetaName)1847527244, PsoDataType.Float, 1072, 0, 0), - new PsoStructureEntryInfo((MetaName)364456330, PsoDataType.Float, 1076, 0, 0), - new PsoStructureEntryInfo((MetaName)3398320415, PsoDataType.Float, 1080, 0, 0), - new PsoStructureEntryInfo((MetaName)2699503170, PsoDataType.Float, 1084, 0, 0), - new PsoStructureEntryInfo((MetaName)2215910236, PsoDataType.Float, 1088, 0, 0), - new PsoStructureEntryInfo((MetaName)2140597790, PsoDataType.Float, 1092, 0, 0), - new PsoStructureEntryInfo((MetaName)2141354850, PsoDataType.Float, 1096, 0, 0), - new PsoStructureEntryInfo((MetaName)9125054, PsoDataType.Float, 1100, 0, 0), - new PsoStructureEntryInfo((MetaName)341585039, PsoDataType.Float, 1104, 0, 0), - new PsoStructureEntryInfo((MetaName)3090152422, PsoDataType.Float, 1108, 0, 0), - new PsoStructureEntryInfo((MetaName)3518102089, PsoDataType.Float, 1112, 0, 0), - new PsoStructureEntryInfo((MetaName)2714979879, PsoDataType.Float, 1116, 0, 0), - new PsoStructureEntryInfo((MetaName)4047322117, PsoDataType.Float, 1120, 0, 0), - new PsoStructureEntryInfo((MetaName)10419895, PsoDataType.Float, 1124, 0, 0), - new PsoStructureEntryInfo((MetaName)817394632, PsoDataType.Float2, 1128, 0, 0), - new PsoStructureEntryInfo((MetaName)3793303691, PsoDataType.Bool, 1136, 0, 0), - new PsoStructureEntryInfo((MetaName)891610436, PsoDataType.Float, 1140, 0, 0), - new PsoStructureEntryInfo((MetaName)1332592052, PsoDataType.Float, 1144, 0, 0), - new PsoStructureEntryInfo((MetaName)3712243434, PsoDataType.Float, 1148, 0, 0), - new PsoStructureEntryInfo((MetaName)2126717159, PsoDataType.Float, 1152, 0, 0), - new PsoStructureEntryInfo((MetaName)467663222, PsoDataType.Float, 1156, 0, 0), - new PsoStructureEntryInfo((MetaName)3920880465, PsoDataType.Float, 1160, 0, 0), - new PsoStructureEntryInfo((MetaName)1407257659, PsoDataType.UInt, 1164, 0, 0), - new PsoStructureEntryInfo((MetaName)1350298358, PsoDataType.Structure, 1168, 0, MetaName.camThirdPersonPedAimInCoverCameraMetadataLowCoverSettings), - new PsoStructureEntryInfo(MetaName.AimingSettings, PsoDataType.Structure, 1208, 0, MetaName.camThirdPersonPedAimInCoverCameraMetadataAimingSettings) - ); - case MetaName.camThirdPersonPedAimInCoverCameraMetadataLowCoverSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAimInCoverCameraMetadataLowCoverSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)2811394796, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)388057725, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)4026985674, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2972801644, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camThirdPersonPedAimInCoverCameraMetadataAimingSettings: - return new PsoStructureInfo(MetaName.camThirdPersonPedAimInCoverCameraMetadataAimingSettings, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ShouldApply, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)3794685898, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3031220740, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)810186943, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2302950975, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camThirdPersonPedMeleeAimCameraMetadata: - return new PsoStructureInfo(MetaName.camThirdPersonPedMeleeAimCameraMetadata, 0, 0, 1088, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), - new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), - new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), - new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), - new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), - new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), - new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), - new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), - new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), - new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), - new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnTargetStunnedEnvelopeRef, PsoDataType.String, 880, 7, 0), - new PsoStructureEntryInfo(MetaName.LockOnTargetDampingSettings, PsoDataType.Structure, 888, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings), - new PsoStructureEntryInfo(MetaName.LockOnOrbitDistanceSettings, PsoDataType.Structure, 928, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings), - new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffset, PsoDataType.Float3, 976, 0, 0), - new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffsetAtOrbitHeadingLimits, PsoDataType.Float3, 992, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 1008, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldScriptedAimTaskOverrideOrbitPitchLimits, PsoDataType.Bool, 1012, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAimSweepOverrideOrbitPitchLimits, PsoDataType.Bool, 1013, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsForMobilePhoneShallowDofMode, PsoDataType.String, 1016, 7, 0), - new PsoStructureEntryInfo((MetaName)309842601, PsoDataType.Float, 1020, 0, 0), - new PsoStructureEntryInfo((MetaName)3770307856, PsoDataType.Bool, 1024, 0, 0), - new PsoStructureEntryInfo((MetaName)3195731427, PsoDataType.Float, 1040, 0, 0), - new PsoStructureEntryInfo((MetaName)2888452072, PsoDataType.Float2, 1044, 0, 0), - new PsoStructureEntryInfo((MetaName)2501102835, PsoDataType.Float, 1052, 0, 0), - new PsoStructureEntryInfo((MetaName)2903662656, PsoDataType.Float, 1056, 0, 0), - new PsoStructureEntryInfo((MetaName)2037218535, PsoDataType.Float, 1060, 0, 0), - new PsoStructureEntryInfo((MetaName)4219845621, PsoDataType.Float, 1064, 0, 0), - new PsoStructureEntryInfo((MetaName)3549368383, PsoDataType.Float, 1068, 0, 0), - new PsoStructureEntryInfo((MetaName)1000603972, PsoDataType.Float, 1072, 0, 0), - new PsoStructureEntryInfo((MetaName)1991971403, PsoDataType.Float, 1076, 0, 0) - ); - case MetaName.camThirdPersonVehicleAimCameraMetadata: - return new PsoStructureInfo(MetaName.camThirdPersonVehicleAimCameraMetadata, 0, 0, 896, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), - new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), - new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), - new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), - new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), - new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), - new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), - new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), - new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), - new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), - new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), - new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), - new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), - new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAimingForDriver, PsoDataType.Bool, 880, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAimingForPassenger, PsoDataType.Bool, 881, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraSideOffsetForHangingOnLeftSide, PsoDataType.Float, 884, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraSideOffsetForHangingOnRightSide, PsoDataType.Float, 888, 0, 0) - ); - case MetaName.camMarketingFreeCameraMetadata: - return new PsoStructureInfo(MetaName.camMarketingFreeCameraMetadata, 0, 0, 200, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0) - ); - case MetaName.camMarketingFreeCameraMetadataInputResponse: - return new PsoStructureInfo(MetaName.camMarketingFreeCameraMetadataInputResponse, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)3855676319, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Acceleration, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Deceleration, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.camMarketingAToBCameraMetadata: - return new PsoStructureInfo(MetaName.camMarketingAToBCameraMetadata, 0, 0, 216, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo((MetaName)1044888659, PsoDataType.String, 200, 7, 0), - new PsoStructureEntryInfo((MetaName)1147067733, PsoDataType.UInt, 204, 0, 0), - new PsoStructureEntryInfo((MetaName)1825469896, PsoDataType.UInt, 208, 0, 0) - ); - case MetaName.camTimedSplineCameraMetadata: - return new PsoStructureInfo(MetaName.camTimedSplineCameraMetadata, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3867080895, PsoDataType.SInt, 40, 0, 0) - ); - case MetaName.camMarketingOrbitCameraMetadata: - return new PsoStructureInfo(MetaName.camMarketingOrbitCameraMetadata, 0, 0, 208, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo((MetaName)2308368369, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringMountRef, PsoDataType.String, 204, 7, 0) - ); - case MetaName.camMarketingMountedCameraMetadata: - return new PsoStructureInfo(MetaName.camMarketingMountedCameraMetadata, 0, 0, 208, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo((MetaName)2308368369, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringMountRef, PsoDataType.String, 204, 7, 0) - ); - case MetaName.camMarketingStickyCameraMetadata: - return new PsoStructureInfo(MetaName.camMarketingStickyCameraMetadata, 0, 0, 200, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0) - ); - case MetaName.camScriptedCameraMetadata: - return new PsoStructureInfo(MetaName.camScriptedCameraMetadata, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camScriptedFlyCameraMetadata: - return new PsoStructureInfo(MetaName.camScriptedFlyCameraMetadata, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)1160500952, PsoDataType.Structure, 40, 0, MetaName.camScriptedFlyCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2802203540, PsoDataType.Structure, 64, 0, MetaName.camScriptedFlyCameraMetadataInputResponse), - new PsoStructureEntryInfo(MetaName.DefaultPitch, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)1176855075, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)2736468652, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.CapsuleRadius, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)2779060394, PsoDataType.UInt, 112, 0, 0) - ); - case MetaName.camScriptedFlyCameraMetadataInputResponse: - return new PsoStructureInfo(MetaName.camScriptedFlyCameraMetadataInputResponse, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAcceleration, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDeceleration, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camCustomTimedSplineCameraMetadata: - return new PsoStructureInfo(MetaName.camCustomTimedSplineCameraMetadata, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3867080895, PsoDataType.SInt, 40, 0, 0) - ); - case MetaName.camRoundedSplineCameraMetadata: - return new PsoStructureInfo(MetaName.camRoundedSplineCameraMetadata, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camSmoothedSplineCameraMetadata: - return new PsoStructureInfo(MetaName.camSmoothedSplineCameraMetadata, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3867080895, PsoDataType.SInt, 40, 0, 0) - ); - case MetaName.camSwitchCameraMetadata: - return new PsoStructureInfo(MetaName.camSwitchCameraMetadata, 0, 0, 144, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1245276384, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo((MetaName)2105074563, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.Fov, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.NearClip, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MotionBlurStrength, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1056782751, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)341706306, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)1176855075, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)2303904065, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)978298090, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultPitch, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)1771807090, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)1215756626, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)1181521957, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)2559186523, PsoDataType.UInt, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)1045169360, PsoDataType.UInt, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)1298516568, PsoDataType.UInt, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)3976211620, PsoDataType.UInt, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)3193297650, PsoDataType.UInt, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)3466836211, PsoDataType.UInt, 132, 0, 0) - ); - case MetaName.camReplayRecordedCameraMetadata: - return new PsoStructureInfo(MetaName.camReplayRecordedCameraMetadata, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camReplayPresetCameraMetadata: - return new PsoStructureInfo(MetaName.camReplayPresetCameraMetadata, 0, 0, 256, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3243156997, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.RelativeLookAtPosition, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)3869518259, PsoDataType.Structure, 80, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 104, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 128, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo(MetaName.MinFov, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxFov, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo((MetaName)777402839, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)1557834870, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo((MetaName)1089474876, PsoDataType.Bool, 172, 0, 0), - new PsoStructureEntryInfo((MetaName)2480397790, PsoDataType.Bool, 173, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionSettings, PsoDataType.Structure, 176, 0, MetaName.camReplayBaseCameraMetadataCollisionSettings), - new PsoStructureEntryInfo((MetaName)549109147, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo((MetaName)3394194196, PsoDataType.UInt, 228, 0, 0), - new PsoStructureEntryInfo((MetaName)2704093958, PsoDataType.UInt, 232, 0, 0), - new PsoStructureEntryInfo((MetaName)1677933530, PsoDataType.UInt, 236, 0, 0), - new PsoStructureEntryInfo((MetaName)343964264, PsoDataType.UInt, 240, 0, 0), - new PsoStructureEntryInfo((MetaName)681964647, PsoDataType.UInt, 244, 0, 0), - new PsoStructureEntryInfo((MetaName)2782721869, PsoDataType.UInt, 248, 0, 0) - ); - case MetaName.camReplayBaseCameraMetadataInputResponse: - return new PsoStructureInfo(MetaName.camReplayBaseCameraMetadataInputResponse, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAcceleration, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDeceleration, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camReplayBaseCameraMetadataCollisionSettings: - return new PsoStructureInfo(MetaName.camReplayBaseCameraMetadataCollisionSettings, 0, 0, 48, - new PsoStructureEntryInfo((MetaName)2162401385, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.WaterHeightSmoothRate, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)653804618, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3232040475, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)819688366, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)122123361, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)557881422, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 40, 0, 0) - ); - case MetaName.camReplayFreeCameraMetadata: - return new PsoStructureInfo(MetaName.camReplayFreeCameraMetadata, 0, 0, 544, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.NearClip, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1160500952, PsoDataType.Structure, 48, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2802203540, PsoDataType.Structure, 72, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2292446130, PsoDataType.Structure, 96, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 120, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)1176189471, PsoDataType.Structure, 168, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)4043692651, PsoDataType.Structure, 192, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)2391928883, PsoDataType.Structure, 216, 0, MetaName.camReplayBaseCameraMetadataInputResponse), - new PsoStructureEntryInfo((MetaName)1466164024, PsoDataType.Structure, 240, 0, MetaName.camInterpolatorMetadata), - new PsoStructureEntryInfo((MetaName)3699879509, PsoDataType.Structure, 280, 0, MetaName.camInterpolatorMetadata), - new PsoStructureEntryInfo((MetaName)2461431150, PsoDataType.Structure, 320, 0, MetaName.camInterpolatorMetadata), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFov, PsoDataType.Float, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxFov, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.CapsuleRadius, PsoDataType.Float, 376, 0, 0), - new PsoStructureEntryInfo((MetaName)537337364, PsoDataType.Float, 380, 0, 0), - new PsoStructureEntryInfo((MetaName)870756038, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo((MetaName)1068739939, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo((MetaName)3629360459, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo((MetaName)479683481, PsoDataType.Float, 396, 0, 0), - new PsoStructureEntryInfo((MetaName)2077539523, PsoDataType.Float3, 400, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionSettings, PsoDataType.Structure, 416, 0, MetaName.camReplayBaseCameraMetadataCollisionSettings), - new PsoStructureEntryInfo((MetaName)4113213041, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo((MetaName)2101093733, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo((MetaName)2090863388, PsoDataType.Float, 472, 0, 0), - new PsoStructureEntryInfo((MetaName)109690208, PsoDataType.Float, 476, 0, 0), - new PsoStructureEntryInfo((MetaName)425553139, PsoDataType.Float, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)2285453310, PsoDataType.UInt, 484, 0, 0), - new PsoStructureEntryInfo((MetaName)3186336829, PsoDataType.Float, 488, 0, 0), - new PsoStructureEntryInfo((MetaName)858986389, PsoDataType.Float, 492, 0, 0), - new PsoStructureEntryInfo((MetaName)168114371, PsoDataType.Float, 496, 0, 0), - new PsoStructureEntryInfo((MetaName)2257617130, PsoDataType.Float, 500, 0, 0), - new PsoStructureEntryInfo((MetaName)4119877675, PsoDataType.Float, 504, 0, 0), - new PsoStructureEntryInfo((MetaName)2969211614, PsoDataType.UInt, 508, 0, 0), - new PsoStructureEntryInfo((MetaName)3394194196, PsoDataType.UInt, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)2704093958, PsoDataType.UInt, 516, 0, 0), - new PsoStructureEntryInfo((MetaName)1677933530, PsoDataType.UInt, 520, 0, 0), - new PsoStructureEntryInfo((MetaName)343964264, PsoDataType.UInt, 524, 0, 0), - new PsoStructureEntryInfo((MetaName)681964647, PsoDataType.UInt, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)2782721869, PsoDataType.UInt, 532, 0, 0), - new PsoStructureEntryInfo((MetaName)3026527735, PsoDataType.Float, 536, 0, 0), - new PsoStructureEntryInfo((MetaName)1272604977, PsoDataType.Float, 540, 0, 0) - ); - case MetaName.camShakeMetadata: - return new PsoStructureInfo(MetaName.camShakeMetadata, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)1260823161, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)1428204256, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3480173900, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camShakeMetadataFrameComponent), - new PsoStructureEntryInfo(MetaName.FrameComponents, PsoDataType.Array, 24, 0, (MetaName)4), - new PsoStructureEntryInfo(MetaName.Vibration, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.camShakeMetadataFrameComponent: - return new PsoStructureInfo(MetaName.camShakeMetadataFrameComponent, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, (MetaName)4206293824), - new PsoStructureEntryInfo((MetaName)3866719227, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.EnvelopeRef, PsoDataType.String, 16, 7, 0) - ); - case MetaName.camOscillatorMetadata: - return new PsoStructureInfo(MetaName.camOscillatorMetadata, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Waveform, PsoDataType.Enum, 16, 0, (MetaName)902027429), - new PsoStructureEntryInfo(MetaName.Amplitude, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.Frequency, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.phase, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2974245218, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.Decay, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.camAnimatedShakeMetadata: - return new PsoStructureInfo(MetaName.camAnimatedShakeMetadata, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)1260823161, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)1428204256, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3480173900, PsoDataType.Bool, 21, 0, 0) - ); - case MetaName.camCinematicCameraManShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicCameraManShotMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) - ); - case MetaName.camCinematicCraningCameraManShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicCraningCameraManShotMetadata, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)934463872, PsoDataType.Bool, 65, 0, 0), - new PsoStructureEntryInfo((MetaName)2227467637, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)943740099, PsoDataType.Bool, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1606540295, PsoDataType.UInt, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)3516181833, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)3249173046, PsoDataType.Float2, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)2987455099, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.ScanRadius, PsoDataType.Float, 96, 0, 0) - ); - case MetaName.camCinematicInVehicleCrashShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicInVehicleCrashShotMetadata, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRoll, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)3669617802, PsoDataType.UInt, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)3100384106, PsoDataType.UInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelocity, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)3730987855, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)4150416286, PsoDataType.UInt, 88, 0, 0) - ); - case MetaName.camCinematicVehiclePartShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehiclePartShotMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)233780411, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicHeliTrackingShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicHeliTrackingShotMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) - ); - case MetaName.camCinematicVehicleOrbitShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehicleOrbitShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicVehicleLowOrbitShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehicleLowOrbitShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicTrainRoofMountedShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicTrainRoofMountedShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicTrainStationShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicTrainStationShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicTrainPassengerShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicTrainPassengerShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicTrainTrackShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicTrainTrackShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicPoliceCarMountedShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicPoliceCarMountedShotMetadata, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.LimitAttachParentRelativePitchAndHeading, PsoDataType.Bool, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldTerminateForPitchAndHeading, PsoDataType.Bool, 65, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRelativePitch, PsoDataType.Float2, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachParentRelativeHeading, PsoDataType.Float2, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialRelativePitchLimits, PsoDataType.Float2, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialRelativeHeadingLimits, PsoDataType.Float2, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 100, 7, 0), - new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 104, 7, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 108, 0, 0) - ); - case MetaName.camCinematicPoliceHeliMountedShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicPoliceHeliMountedShotMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) - ); - case MetaName.camCinematicPoliceInCoverShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicPoliceInCoverShotMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) - ); - case MetaName.camCinematicPoliceRoadBlockShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicPoliceRoadBlockShotMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)876494977, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.SpreadLimit, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 72, 0, 0) - ); - case MetaName.camCinematicPoliceExitVehicleShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicPoliceExitVehicleShotMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) - ); - case MetaName.camCinematicOnFootIdleShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicOnFootIdleShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicOnFootFirstPersonIdleShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicOnFootFirstPersonIdleShotMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Cameras, PsoDataType.Array, 64, 0, (MetaName)14) - ); - case MetaName.camCinematicStuntJumpShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicStuntJumpShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicParachuteHeliShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicParachuteHeliShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicParachuteCameraManShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicParachuteCameraManShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicOnFootAssistedAimingKillShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicOnFootAssistedAimingKillShotMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1965493319, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)513375599, PsoDataType.Float, 68, 0, 0) - ); - case MetaName.camCinematicOnFootMeleeShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicOnFootMeleeShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicVehicleBonnetShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehicleBonnetShotMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1109718587, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)4170146926, PsoDataType.UInt, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2661334408, PsoDataType.String, 72, 7, 0) - ); - case MetaName.camCinematicBustedShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicBustedShotMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3180920449, PsoDataType.Float, 64, 0, 0) - ); - case MetaName.camCinematicVehicleGroupShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehicleGroupShotMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)189014933, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)3490628210, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)456924361, PsoDataType.UInt, 72, 0, 0) - ); - case MetaName.camCinematicMissileKillShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicMissileKillShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicWaterCrashShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicWaterCrashShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicFallFromHeliShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicFallFromHeliShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicVehicleConvertibleRoofShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicVehicleConvertibleRoofShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camCinematicScriptRaceCheckPointShotMetadata: - return new PsoStructureInfo(MetaName.camCinematicScriptRaceCheckPointShotMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), - new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camLongSwoopSwitchHelperMetadata: - return new PsoStructureInfo(MetaName.camLongSwoopSwitchHelperMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), - new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), - new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), - new PsoStructureEntryInfo((MetaName)796068415, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)417423151, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)3958574934, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2939152164, PsoDataType.Enum, 52, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)2707662935, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)26423852, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)322264486, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)2868975511, PsoDataType.Enum, 68, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)3659327390, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)833330146, PsoDataType.Float, 76, 0, 0) - ); - case MetaName.camShortZoomToHeadSwitchHelperMetadata: - return new PsoStructureInfo(MetaName.camShortZoomToHeadSwitchHelperMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), - new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), - new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), - new PsoStructureEntryInfo((MetaName)864831122, PsoDataType.Bool, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3573176421, PsoDataType.SInt, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1837935839, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2395979106, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)4037747409, PsoDataType.Float, 68, 0, 0) - ); - case MetaName.camShortRotationSwitchHelperMetadata: - return new PsoStructureInfo(MetaName.camShortRotationSwitchHelperMetadata, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), - new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), - new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), - new PsoStructureEntryInfo((MetaName)2291716575, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.camShortTranslationSwitchHelperMetadata: - return new PsoStructureInfo(MetaName.camShortTranslationSwitchHelperMetadata, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), - new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), - new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), - new PsoStructureEntryInfo((MetaName)3634726737, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.camShortZoomInOutSwitchHelperMetadata: - return new PsoStructureInfo(MetaName.camShortZoomInOutSwitchHelperMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), - new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), - new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), - new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), - new PsoStructureEntryInfo((MetaName)1190587282, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)547488153, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2504913741, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)26423852, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)4037747409, PsoDataType.Float, 56, 0, 0) - ); - case MetaName.camNearClipScannerMetadata: - return new PsoStructureInfo(MetaName.camNearClipScannerMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)494178060, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1713774083, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3006651453, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1502537267, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3831489261, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)1103532228, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)639510975, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1947972687, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1176855075, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)529344496, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)1434632498, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3130208423, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)1525295652, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)304640727, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2477079271, PsoDataType.Float, 72, 0, 0) - ); - case MetaName.camVehicleCustomSettingsMetadata: - return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadata, 0, 0, 192, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DoorAlignmentSettings, PsoDataType.Structure, 16, 0, MetaName.camVehicleCustomSettingsMetadataDoorAlignmentSettings), - new PsoStructureEntryInfo((MetaName)2728784918, PsoDataType.Structure, 56, 0, MetaName.camVehicleCustomSettingsMetadataExitSeatPhaseForCameraExitSettings), - new PsoStructureEntryInfo((MetaName)556143364, PsoDataType.Structure, 72, 0, MetaName.camVehicleCustomSettingsMetadataMultiplayerPassengerCameraHashSettings), - new PsoStructureEntryInfo((MetaName)981761687, PsoDataType.Structure, 104, 0, MetaName.camVehicleCustomSettingsMetadataInvalidCinematcShotsRefsForVehicleSettings), - new PsoStructureEntryInfo((MetaName)955775077, PsoDataType.Structure, 136, 0, MetaName.camVehicleCustomSettingsMetadataAdditionalBoundScalingVehicleSettings), - new PsoStructureEntryInfo((MetaName)3842334374, PsoDataType.Structure, 152, 0, MetaName.camVehicleCustomSettingsMetadataSeatSpecficCameras), - new PsoStructureEntryInfo((MetaName)3299186532, PsoDataType.Bool, 184, 0, 0) - ); - case MetaName.camVehicleCustomSettingsMetadataExitSeatPhaseForCameraExitSettings: - return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataExitSeatPhaseForCameraExitSettings, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)2549072274, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camVehicleCustomSettingsMetadataMultiplayerPassengerCameraHashSettings: - return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataMultiplayerPassengerCameraHashSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)109781807, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)2400069518, PsoDataType.Array, 16, 0, (MetaName)2) - ); - case MetaName.camVehicleCustomSettingsMetadataInvalidCinematcShotsRefsForVehicleSettings: - return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataInvalidCinematcShotsRefsForVehicleSettings, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)3579087558, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case MetaName.camVehicleCustomSettingsMetadataAdditionalBoundScalingVehicleSettings: - return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataAdditionalBoundScalingVehicleSettings, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.HeightScaling, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camVehicleCustomSettingsMetadataSeatSpecficCameras: - return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataSeatSpecficCameras, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camSeatSpecificCameras), - new PsoStructureEntryInfo((MetaName)1517635298, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case MetaName.camSeatSpecificCameras: - return new PsoStructureInfo(MetaName.camSeatSpecificCameras, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.SeatIndex, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)1261448360, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.PovCameraOffset, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2254474492, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)273799675, PsoDataType.Bool, 36, 0, 0) - ); - case MetaName.camGameplayDirectorMetadata: - return new PsoStructureInfo(MetaName.camGameplayDirectorMetadata, 0, 0, 608, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2089690180, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo((MetaName)519684035, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo((MetaName)4121580243, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo((MetaName)3253949128, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo((MetaName)3345137885, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo((MetaName)2365172496, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.ThirdPersonVehicleAimCameraRef, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo((MetaName)3734793071, PsoDataType.String, 52, 7, 0), - new PsoStructureEntryInfo((MetaName)2936418982, PsoDataType.String, 56, 7, 0), - new PsoStructureEntryInfo((MetaName)595399339, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo((MetaName)4266955763, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo((MetaName)1070442381, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo((MetaName)838085564, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo((MetaName)1252415609, PsoDataType.String, 76, 7, 0), - new PsoStructureEntryInfo((MetaName)2466448846, PsoDataType.String, 80, 7, 0), - new PsoStructureEntryInfo((MetaName)3845919335, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo((MetaName)3326977311, PsoDataType.String, 88, 7, 0), - new PsoStructureEntryInfo((MetaName)374047020, PsoDataType.String, 92, 7, 0), - new PsoStructureEntryInfo((MetaName)859347369, PsoDataType.String, 96, 7, 0), - new PsoStructureEntryInfo((MetaName)1384877759, PsoDataType.String, 100, 7, 0), - new PsoStructureEntryInfo((MetaName)399013837, PsoDataType.String, 104, 7, 0), - new PsoStructureEntryInfo((MetaName)3929905827, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo((MetaName)2078537289, PsoDataType.String, 112, 7, 0), - new PsoStructureEntryInfo((MetaName)2211994659, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo((MetaName)1839344859, PsoDataType.String, 120, 7, 0), - new PsoStructureEntryInfo((MetaName)1168367025, PsoDataType.String, 124, 7, 0), - new PsoStructureEntryInfo((MetaName)3316487821, PsoDataType.String, 128, 7, 0), - new PsoStructureEntryInfo((MetaName)2772847581, PsoDataType.String, 132, 7, 0), - new PsoStructureEntryInfo((MetaName)766173022, PsoDataType.String, 136, 7, 0), - new PsoStructureEntryInfo((MetaName)2535543863, PsoDataType.String, 140, 7, 0), - new PsoStructureEntryInfo((MetaName)160927927, PsoDataType.String, 144, 7, 0), - new PsoStructureEntryInfo((MetaName)478304411, PsoDataType.String, 148, 7, 0), - new PsoStructureEntryInfo((MetaName)2995820414, PsoDataType.String, 152, 7, 0), - new PsoStructureEntryInfo((MetaName)2615323901, PsoDataType.String, 156, 7, 0), - new PsoStructureEntryInfo((MetaName)773221014, PsoDataType.UInt, 160, 0, 0), - new PsoStructureEntryInfo((MetaName)1041806552, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)2032331076, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo((MetaName)1446696509, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo((MetaName)3986662918, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)508043832, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)2976021060, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo((MetaName)3396642792, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo((MetaName)3225930628, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo((MetaName)1352017718, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo((MetaName)73333937, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo((MetaName)1414986019, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo((MetaName)3574987574, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo((MetaName)992242800, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo((MetaName)2148272557, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo((MetaName)1884609047, PsoDataType.UInt, 220, 0, 0), - new PsoStructureEntryInfo((MetaName)839256524, PsoDataType.Float2, 224, 0, 0), - new PsoStructureEntryInfo((MetaName)3914143003, PsoDataType.Float2, 232, 0, 0), - new PsoStructureEntryInfo((MetaName)1935117365, PsoDataType.Float2, 240, 0, 0), - new PsoStructureEntryInfo((MetaName)3465208228, PsoDataType.Float2, 248, 0, 0), - new PsoStructureEntryInfo((MetaName)2745575061, PsoDataType.UInt, 256, 0, 0), - new PsoStructureEntryInfo((MetaName)19236851, PsoDataType.UInt, 260, 0, 0), - new PsoStructureEntryInfo((MetaName)3381171437, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo((MetaName)4274113098, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo((MetaName)3364491568, PsoDataType.UInt, 272, 0, 0), - new PsoStructureEntryInfo((MetaName)565980479, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo((MetaName)467608921, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo((MetaName)3180328046, PsoDataType.UInt, 284, 0, 0), - new PsoStructureEntryInfo((MetaName)924888517, PsoDataType.UInt, 288, 0, 0), - new PsoStructureEntryInfo((MetaName)1870040536, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camGameplayDirectorMetadataVehicleCustomSettings), - new PsoStructureEntryInfo(MetaName.VehicleCustomSettingsList, PsoDataType.Array, 296, 0, (MetaName)66), - new PsoStructureEntryInfo((MetaName)3559905910, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo((MetaName)259392755, PsoDataType.Float, 316, 0, 0), - new PsoStructureEntryInfo((MetaName)1523938219, PsoDataType.Float, 320, 0, 0), - new PsoStructureEntryInfo((MetaName)3704241863, PsoDataType.UInt, 324, 0, 0), - new PsoStructureEntryInfo((MetaName)2185907197, PsoDataType.UInt, 328, 0, 0), - new PsoStructureEntryInfo((MetaName)2766631017, PsoDataType.UInt, 332, 0, 0), - new PsoStructureEntryInfo((MetaName)4088657953, PsoDataType.UInt, 336, 0, 0), - new PsoStructureEntryInfo((MetaName)2940797056, PsoDataType.UInt, 340, 0, 0), - new PsoStructureEntryInfo((MetaName)926072750, PsoDataType.UInt, 344, 0, 0), - new PsoStructureEntryInfo((MetaName)4071374960, PsoDataType.UInt, 348, 0, 0), - new PsoStructureEntryInfo((MetaName)4097214758, PsoDataType.UInt, 352, 0, 0), - new PsoStructureEntryInfo((MetaName)4182146981, PsoDataType.UInt, 356, 0, 0), - new PsoStructureEntryInfo((MetaName)3961367630, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo((MetaName)1597015313, PsoDataType.Float, 364, 0, 0), - new PsoStructureEntryInfo((MetaName)2284520874, PsoDataType.Bool, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)4217422073, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo((MetaName)636518286, PsoDataType.String, 376, 7, 0), - new PsoStructureEntryInfo((MetaName)984379181, PsoDataType.UInt, 380, 0, 0), - new PsoStructureEntryInfo((MetaName)2430934664, PsoDataType.UInt, 384, 0, 0), - new PsoStructureEntryInfo((MetaName)1190562413, PsoDataType.Float2, 388, 0, 0), - new PsoStructureEntryInfo((MetaName)3193796044, PsoDataType.Float2, 396, 0, 0), - new PsoStructureEntryInfo((MetaName)3497158180, PsoDataType.Float2, 404, 0, 0), - new PsoStructureEntryInfo((MetaName)202581691, PsoDataType.Float2, 412, 0, 0), - new PsoStructureEntryInfo((MetaName)1600149759, PsoDataType.Float2, 420, 0, 0), - new PsoStructureEntryInfo((MetaName)310864401, PsoDataType.Float2, 428, 0, 0), - new PsoStructureEntryInfo((MetaName)910310359, PsoDataType.Float, 436, 0, 0), - new PsoStructureEntryInfo((MetaName)1518272577, PsoDataType.Float, 440, 0, 0), - new PsoStructureEntryInfo((MetaName)2881277133, PsoDataType.Float, 444, 0, 0), - new PsoStructureEntryInfo((MetaName)1283045856, PsoDataType.Float, 448, 0, 0), - new PsoStructureEntryInfo((MetaName)1013584657, PsoDataType.UInt, 452, 0, 0), - new PsoStructureEntryInfo((MetaName)1494877942, PsoDataType.UInt, 456, 0, 0), - new PsoStructureEntryInfo((MetaName)3664775821, PsoDataType.String, 460, 7, 0), - new PsoStructureEntryInfo((MetaName)1867117468, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo((MetaName)425967458, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo((MetaName)2079587041, PsoDataType.Float, 472, 0, 0), - new PsoStructureEntryInfo((MetaName)3495981266, PsoDataType.Float, 476, 0, 0), - new PsoStructureEntryInfo((MetaName)3273630905, PsoDataType.Float, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)3860060233, PsoDataType.Float, 484, 0, 0), - new PsoStructureEntryInfo((MetaName)2204296545, PsoDataType.Float, 488, 0, 0), - new PsoStructureEntryInfo((MetaName)111546466, PsoDataType.Float, 492, 0, 0), - new PsoStructureEntryInfo((MetaName)2322128139, PsoDataType.Float, 496, 0, 0), - new PsoStructureEntryInfo((MetaName)642537232, PsoDataType.Float, 500, 0, 0), - new PsoStructureEntryInfo((MetaName)2040447490, PsoDataType.Float, 504, 0, 0), - new PsoStructureEntryInfo((MetaName)928667502, PsoDataType.Float, 508, 0, 0), - new PsoStructureEntryInfo((MetaName)3216527316, PsoDataType.UInt, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)3465879577, PsoDataType.UInt, 516, 0, 0), - new PsoStructureEntryInfo((MetaName)3390712027, PsoDataType.UInt, 520, 0, 0), - new PsoStructureEntryInfo((MetaName)2683111365, PsoDataType.UInt, 524, 0, 0), - new PsoStructureEntryInfo((MetaName)3170020756, PsoDataType.UInt, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)4287333189, PsoDataType.UInt, 532, 0, 0), - new PsoStructureEntryInfo((MetaName)115056986, PsoDataType.UInt, 536, 0, 0), - new PsoStructureEntryInfo((MetaName)1843179030, PsoDataType.UInt, 540, 0, 0), - new PsoStructureEntryInfo((MetaName)3134298162, PsoDataType.String, 544, 7, 0), - new PsoStructureEntryInfo((MetaName)1564626128, PsoDataType.String, 548, 7, 0), - new PsoStructureEntryInfo((MetaName)834090440, PsoDataType.Structure, 552, 0, MetaName.camGameplayDirectorMetadataExplosionShakeSettings) - ); - case MetaName.camGameplayDirectorMetadataExplosionShakeSettings: - return new PsoStructureInfo(MetaName.camGameplayDirectorMetadataExplosionShakeSettings, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DistanceLimits, PsoDataType.Float2, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxInstances, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.RumbleDuration, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3070197011, PsoDataType.UInt, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2337695573, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)815713089, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1985122943, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3938350897, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)951241725, PsoDataType.Float, 48, 0, 0) - ); - case MetaName.camGameplayDirectorMetadataVehicleCustomSettings: - return new PsoStructureInfo(MetaName.camGameplayDirectorMetadataVehicleCustomSettings, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SettingsRef, PsoDataType.String, 12, 7, 0) - ); - case MetaName.camCinematicDirectorMetadata: - return new PsoStructureInfo(MetaName.camCinematicDirectorMetadata, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)164388064, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1567199172, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)4027640984, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)730699960, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)4198475225, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo((MetaName)3640482549, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2985235183, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)200602575, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)2683111365, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1677201089, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo((MetaName)2101508607, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo((MetaName)1867117468, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)425967458, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)2079587041, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.CinematicContexts, PsoDataType.Array, 80, 0, (MetaName)MetaTypeName.STRING), - new PsoStructureEntryInfo((MetaName)28440621, PsoDataType.UInt, 96, 0, 0) - ); - case MetaName.camCinematicInVehicleMultiplayerPassengerContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicInVehicleMultiplayerPassengerContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicShots: - return new PsoStructureInfo(MetaName.camCinematicShots, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Shot, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Priority, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ProbabilityWeighting, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.camCinematicSpectatorNewsChannelContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicSpectatorNewsChannelContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicScriptedMissionCreatorFailContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicScriptedMissionCreatorFailContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicScriptContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicScriptContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicScriptedRaceCheckPointContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicScriptedRaceCheckPointContextMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1650416254, PsoDataType.UInt, 72, 0, 0) - ); - case MetaName.camCinematicBustedContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicBustedContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicFallFromHeliContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicFallFromHeliContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicInVehicleOverriddenFirstPersonContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicInVehicleOverriddenFirstPersonContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicInVehicleWantedContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicInVehicleWantedContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camPreferredShotSelectionType: - return new PsoStructureInfo(MetaName.camPreferredShotSelectionType, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Shot, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.InputType, PsoDataType.Enum, 12, 0, (MetaName)3889593720) - ); - case MetaName.camCinematicInVehicleContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicInVehicleContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicInTrainAtStationContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicInTrainAtStationContextMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)2216049071, PsoDataType.UInt, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)3119408512, PsoDataType.UInt, 76, 0, 0) - ); - case MetaName.camCinematicInTrainContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicInTrainContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicOnFootSpectatingContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicOnFootSpectatingContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicParachuteContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicParachuteContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicStuntJumpContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicStuntJumpContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicOnFootAssistedAimingContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicOnFootAssistedAimingContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicOnFootMeleeContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicOnFootMeleeContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicInVehicleFirstPersonContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicInVehicleFirstPersonContextMetadata, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) - ); - case MetaName.camCinematicOnFootIdleContextMetadata: - return new PsoStructureInfo(MetaName.camCinematicOnFootIdleContextMetadata, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), - new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), - new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1879525600, PsoDataType.UInt, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1202637816, PsoDataType.Float, 76, 0, 0) - ); - case MetaName.camSyncedSceneDirectorMetadata: - return new PsoStructureInfo(MetaName.camSyncedSceneDirectorMetadata, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2406434970, PsoDataType.String, 24, 7, 0) - ); - case MetaName.camScriptDirectorMetadata: - return new PsoStructureInfo(MetaName.camScriptDirectorMetadata, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3308601968, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo((MetaName)1044888659, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo((MetaName)609660376, PsoDataType.UInt, 32, 0, 0) - ); - case MetaName.camSwitchDirectorMetadata: - return new PsoStructureInfo(MetaName.camSwitchDirectorMetadata, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)4284026199, PsoDataType.String, 24, 7, 0) - ); - case MetaName.camCutsceneDirectorMetadata: - return new PsoStructureInfo(MetaName.camCutsceneDirectorMetadata, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1814055656, PsoDataType.String, 24, 7, 0) - ); - case MetaName.camReplayDirectorMetadata: - return new PsoStructureInfo(MetaName.camReplayDirectorMetadata, 0, 0, 160, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2721634605, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo((MetaName)2132680058, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo((MetaName)491767013, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo((MetaName)2648380967, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo((MetaName)4072288030, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo((MetaName)664486210, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo((MetaName)3903471436, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo((MetaName)3789126205, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)2319741638, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1596110048, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)1238798750, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1362065867, PsoDataType.String, 80, 7, 0), - new PsoStructureEntryInfo((MetaName)2640324566, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)3068943162, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)81027141, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)4246618820, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)1674718375, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)227690771, PsoDataType.String, 104, 7, 0), - new PsoStructureEntryInfo((MetaName)1982856886, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo((MetaName)881665360, PsoDataType.String, 112, 7, 0), - new PsoStructureEntryInfo((MetaName)2599823537, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo((MetaName)3206570060, PsoDataType.String, 120, 7, 0), - new PsoStructureEntryInfo((MetaName)1690145332, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)4171384554, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)3385138470, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)950635108, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)925408249, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo((MetaName)3918000719, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo((MetaName)1379084243, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo((MetaName)2245689292, PsoDataType.Float, 152, 0, 0) - ); - case MetaName.camDebugDirectorMetadata: - return new PsoStructureInfo(MetaName.camDebugDirectorMetadata, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2750009688, PsoDataType.String, 24, 7, 0) - ); - case MetaName.camMarketingDirectorMetadata: - return new PsoStructureInfo(MetaName.camMarketingDirectorMetadata, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camMarketingDirectorMetadataMode), - new PsoStructureEntryInfo(MetaName.Modes, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case MetaName.camMarketingDirectorMetadataMode: - return new PsoStructureInfo(MetaName.camMarketingDirectorMetadataMode, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TextLabel, PsoDataType.String, 12, 0, (MetaName)1048576) - ); - case MetaName.CExplosionInfoManager: - return new PsoStructureInfo(MetaName.CExplosionInfoManager, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2541591167), - new PsoStructureEntryInfo(MetaName.aExplosionTagData, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)2541591167: - return new PsoStructureInfo((MetaName)2541591167, 0, 0, 136, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 3, 0), - new PsoStructureEntryInfo(MetaName.damageAtCentre, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.damageAtEdge, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.networkPlayerModifier, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.networkPedModifier, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.endRadius, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.initSpeed, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.decayFactor, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.forceFactor, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.fRagdollForceModifier, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.fSelfForceModifier, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.directedWidth, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.directedLifeTime, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.camShakeName, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo(MetaName.camShake, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.camShakeRollOffScaling, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.shockingEventVisualRangeOverride, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.shockingEventAudioRangeOverride, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.minorExplosion, PsoDataType.Bool, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.vfxTagHashName, PsoDataType.String, 96, 7, 0), - new PsoStructureEntryInfo(MetaName.fragDamage, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.bAppliesContinuousDamage, PsoDataType.Bool, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.bPostProcessCollisionsWithNoForce, PsoDataType.Bool, 105, 0, 0), - new PsoStructureEntryInfo(MetaName.bDamageVehicles, PsoDataType.Bool, 106, 0, 0), - new PsoStructureEntryInfo(MetaName.bDamageObjects, PsoDataType.Bool, 107, 0, 0), - new PsoStructureEntryInfo(MetaName.bOnlyAffectsLivePeds, PsoDataType.Bool, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.bIgnoreExplodingEntity, PsoDataType.Bool, 109, 0, 0), - new PsoStructureEntryInfo(MetaName.bNoOcclusion, PsoDataType.Bool, 110, 0, 0), - new PsoStructureEntryInfo(MetaName.explodeAttachEntityWhenFinished, PsoDataType.Bool, 111, 0, 0), - new PsoStructureEntryInfo(MetaName.bCanSetPedOnFire, PsoDataType.Bool, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.bCanSetPlayerOnFire, PsoDataType.Bool, 113, 0, 0), - new PsoStructureEntryInfo(MetaName.bSuppressCrime, PsoDataType.Bool, 114, 0, 0), - new PsoStructureEntryInfo(MetaName.bUseDistanceDamageCalc, PsoDataType.Bool, 115, 0, 0), - new PsoStructureEntryInfo(MetaName.bPreventWaterExplosionVFX, PsoDataType.Bool, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.bIgnoreRatioCheckForFire, PsoDataType.Bool, 117, 0, 0), - new PsoStructureEntryInfo(MetaName.bAllowUnderwaterExplosion, PsoDataType.Bool, 118, 0, 0), - new PsoStructureEntryInfo(MetaName.bForceVehicleExplosion, PsoDataType.Bool, 119, 0, 0), - new PsoStructureEntryInfo(MetaName.midRadius, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.damageAtMid, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.bApplyVehicleEMP, PsoDataType.Bool, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.bApplyVehicleSlick, PsoDataType.Bool, 129, 0, 0), - new PsoStructureEntryInfo(MetaName.bApplyVehicleSlowdown, PsoDataType.Bool, 130, 0, 0), - new PsoStructureEntryInfo(MetaName.bApplyVehicleTyrePop, PsoDataType.Bool, 131, 0, 0), - new PsoStructureEntryInfo(MetaName.bForcePetrolTankDamage, PsoDataType.Bool, 132, 0, 0) - ); - case MetaName.CPedModelInfo__PersonalityDataList: - return new PsoStructureInfo(MetaName.CPedModelInfo__PersonalityDataList, 0, 0, 88, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1111461724), - new PsoStructureEntryInfo(MetaName.MovementModeUnholsterData, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)29118966), - new PsoStructureEntryInfo(MetaName.MovementModes, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4185391031), - new PsoStructureEntryInfo(MetaName.PedPersonalities, PsoDataType.Array, 40, 0, (MetaName)4), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)905918498), - new PsoStructureEntryInfo(MetaName.BraveryTypes, PsoDataType.Array, 56, 0, (MetaName)6), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2072330808), - new PsoStructureEntryInfo(MetaName.CriminalityTypes, PsoDataType.Array, 72, 0, (MetaName)8) - ); - case (MetaName)1111461724: - return new PsoStructureInfo((MetaName)1111461724, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2934735155), - new PsoStructureEntryInfo(MetaName.UnholsterClips, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case (MetaName)2934735155: - return new PsoStructureInfo((MetaName)2934735155, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Weapons, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Clip, PsoDataType.String, 24, 7, 0) - ); - case (MetaName)29118966: - return new PsoStructureInfo((MetaName)29118966, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1727236615), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Array, 0, 0, (MetaName)1), - new PsoStructureEntryInfo(MetaName.MovementModes, PsoDataType.Array, 16, 4, (MetaName)131074), - new PsoStructureEntryInfo(MetaName.LastBattleEventHighEnergyStartTime, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.LastBattleEventHighEnergyEndTime, PsoDataType.Float, 52, 0, 0) - ); - case (MetaName)1727236615: - return new PsoStructureInfo((MetaName)1727236615, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Weapons, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3455138791), - new PsoStructureEntryInfo(MetaName.ClipSets, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case (MetaName)3455138791: - return new PsoStructureInfo((MetaName)3455138791, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.MovementClipSetId, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.WeaponClipSetId, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.WeaponClipFilterId, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.UpperBodyShadowExpressionEnabled, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.UpperBodyFeatheredLeanEnabled, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo(MetaName.UseWeaponAnimsForGrip, PsoDataType.Bool, 22, 0, 0), - new PsoStructureEntryInfo(MetaName.UseLeftHandIk, PsoDataType.Bool, 23, 0, 0), - new PsoStructureEntryInfo(MetaName.IdleTransitionBlendOutTime, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.IdleTransitions, PsoDataType.Array, 32, 0, (MetaName)8), - new PsoStructureEntryInfo(MetaName.UnholsterClipSetId, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.UnholsterClipData, PsoDataType.String, 52, 7, 0) - ); - case (MetaName)4185391031: - return new PsoStructureInfo((MetaName)4185391031, 0, 0, 184, - new PsoStructureEntryInfo(MetaName.PersonalityName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultWeaponLoadout, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.Bravery, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.AgitatedPersonality, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.Criminality, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.AgitationTriggers, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo(MetaName.HealthConfigHash, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.WeaponAnimations, PsoDataType.Array, 40, 0, (MetaName)MetaTypeName.POINTER), - new PsoStructureEntryInfo(MetaName.AmbientAudio, PsoDataType.String, 56, 7, 0), - new PsoStructureEntryInfo(MetaName.WitnessPersonality, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo(MetaName.Agility, PsoDataType.Structure, 64, 0, (MetaName)265080325), - new PsoStructureEntryInfo(MetaName.IsMale, PsoDataType.Bool, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.IsHuman, PsoDataType.Bool, 81, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldRewardMoneyOnDeath, PsoDataType.Bool, 82, 0, 0), - new PsoStructureEntryInfo(MetaName.IsGang, PsoDataType.Bool, 83, 0, 0), - new PsoStructureEntryInfo(MetaName.IsSecurity, PsoDataType.Bool, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.IsWeird, PsoDataType.Bool, 85, 0, 0), - new PsoStructureEntryInfo(MetaName.IsDangerousAnimal, PsoDataType.Bool, 86, 0, 0), - new PsoStructureEntryInfo(MetaName.CausesRumbleWhenCollidesWithPlayer, PsoDataType.Bool, 87, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowSlowCruisingWithMusic, PsoDataType.Bool, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowRoadCrossHurryOnLightChange, PsoDataType.Bool, 89, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2920442291), - new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 92, 0, (MetaName)524310), - new PsoStructureEntryInfo(MetaName.AttackStrengthMin, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.AttackStrengthMax, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.StaminaEfficiency, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.ArmourEfficiency, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.HealthRegenEfficiency, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.ExplosiveDamageMod, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.HandGunDamageMod, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.RifleDamageMod, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.SmgDamageMod, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.PopulationFleeMod, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.HotwireRate, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MotivationMin, PsoDataType.UInt, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.MotivationMax, PsoDataType.UInt, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.DrivingAbilityMin, PsoDataType.UByte, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.DrivingAbilityMax, PsoDataType.UByte, 149, 0, 0), - new PsoStructureEntryInfo(MetaName.DrivingAggressivenessMin, PsoDataType.UByte, 150, 0, 0), - new PsoStructureEntryInfo(MetaName.DrivingAggressivenessMax, PsoDataType.UByte, 151, 0, 0), - new PsoStructureEntryInfo(MetaName.Affluence, PsoDataType.Enum, 152, 0, MetaName.Affluence), - new PsoStructureEntryInfo(MetaName.TechSavvy, PsoDataType.Enum, 156, 0, MetaName.TechSavvy), - new PsoStructureEntryInfo(MetaName.MovementModes, PsoDataType.String, 160, 7, 0), - new PsoStructureEntryInfo(MetaName.WeaponAnimsFPSIdle, PsoDataType.String, 164, 7, 0), - new PsoStructureEntryInfo(MetaName.WeaponAnimsFPSRNG, PsoDataType.String, 168, 7, 0), - new PsoStructureEntryInfo(MetaName.WeaponAnimsFPSLT, PsoDataType.String, 172, 7, 0), - new PsoStructureEntryInfo(MetaName.WeaponAnimsFPSScope, PsoDataType.String, 176, 7, 0) - ); - case (MetaName)265080325: - return new PsoStructureInfo((MetaName)265080325, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2675594832), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 8, 0, (MetaName)2097152), - new PsoStructureEntryInfo(MetaName.MovementCostModifier, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)905918498: - return new PsoStructureInfo((MetaName)905918498, 0, 0, 256, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3079935216), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 12, 0, (MetaName)2097153), - new PsoStructureEntryInfo(MetaName.TakedownProbability, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ThreatResponseUnarmed, PsoDataType.Structure, 24, 0, (MetaName)3637970520), - new PsoStructureEntryInfo(MetaName.ThreatResponseMelee, PsoDataType.Structure, 96, 0, (MetaName)3637970520), - new PsoStructureEntryInfo(MetaName.ThreatResponseArmed, PsoDataType.Structure, 168, 0, (MetaName)3637970520), - new PsoStructureEntryInfo(MetaName.FleeDuringCombat, PsoDataType.Structure, 240, 0, (MetaName)651017172) - ); - case (MetaName)3637970520: - return new PsoStructureInfo((MetaName)3637970520, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Action, PsoDataType.Structure, 8, 0, (MetaName)3450423538), - new PsoStructureEntryInfo(MetaName.Fight, PsoDataType.Structure, 32, 0, (MetaName)301719986) - ); - case (MetaName)3450423538: - return new PsoStructureInfo((MetaName)3450423538, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Weights, PsoDataType.Structure, 8, 0, (MetaName)3954379444) - ); - case (MetaName)3954379444: - return new PsoStructureInfo((MetaName)3954379444, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Fight, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Flee, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)301719986: - return new PsoStructureInfo((MetaName)301719986, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Weights, PsoDataType.Structure, 8, 0, (MetaName)272028034), - new PsoStructureEntryInfo(MetaName.ProbabilityDrawWeaponWhenLosing, PsoDataType.Float, 32, 0, 0) - ); - case (MetaName)272028034: - return new PsoStructureInfo((MetaName)272028034, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.KeepWeapon, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MatchTargetWeapon, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.EquipBestWeapon, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)651017172: - return new PsoStructureInfo((MetaName)651017172, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesWhenBuddyKilledWithScaryWeapon, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)2072330808: - return new PsoStructureInfo((MetaName)2072330808, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1639628591), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 12, 0, (MetaName)2097153) - ); - case MetaName.sStatsMetadataTuning: - return new PsoStructureInfo(MetaName.sStatsMetadataTuning, 0, 0, 72, - new PsoStructureEntryInfo((MetaName)1063717096, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.AwardVehicleJumpTime, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.AwardParachuteJumpTime, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SPLargeAccidenThresold, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MPLargeAccidenThresold, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.FreefallThresold, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.AwardVehicleJumpDistanceA, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AwardVehicleJumpDistanceB, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AwardParachuteJumpDistanceA, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AwardParachuteJumpDistanceB, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.nonFlyableAreas, PsoDataType.Structure, 48, 0, MetaName.NonFlyableAreaArray) - ); - case MetaName.CFiringPatternInfoManager: - return new PsoStructureInfo(MetaName.CFiringPatternInfoManager, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.Infos, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.CFiringPatternInfo: - return new PsoStructureInfo(MetaName.CFiringPatternInfo, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.NumberOfBurstsMin, PsoDataType.SShort, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.NumberOfBurstsMax, PsoDataType.SShort, 14, 0, 0), - new PsoStructureEntryInfo(MetaName.NumberOfShotsPerBurstMin, PsoDataType.SShort, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.NumberOfShotsPerBurstMax, PsoDataType.SShort, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenShotsMin, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenShotsMax, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenShotsAbsoluteMin, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenBurstsMin, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenBurstsMax, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenBurstsAbsoluteMin, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBeforeFiringMin, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBeforeFiringMax, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2922044807, PsoDataType.Bool, 52, 0, 0) - ); - case MetaName.CTuningFile: - return new PsoStructureInfo(MetaName.CTuningFile, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.Tunables, PsoDataType.Array, 0, 0, 0) - ); - case MetaName.CCombatTaskManager__Tunables: - return new PsoStructureInfo(MetaName.CCombatTaskManager__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenUpdates, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.iMaxPedsInCombatTask, PsoDataType.SInt, 20, 0, 0) - ); - case MetaName.CTaskAnimatedHitByExplosion__Tunables: - return new PsoStructureInfo(MetaName.CTaskAnimatedHitByExplosion__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.InitialRagdollDelay, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowPitchAndRoll, PsoDataType.Bool, 20, 0, 0) - ); - case MetaName.CTaskStandGuard__Tunables: - return new PsoStructureInfo(MetaName.CTaskStandGuard__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinStandWaitTimeMS, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStandWaitTimeMS, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDefendPointWaitTimeMS, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDefendPointWaitTimeMS, PsoDataType.SInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinNavmeshPatrolRadiusFactor, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxNavmeshPatrolRadiusFactor, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.RouteRadiusFactor, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CTaskCombatAdditionalTask__Tunables: - return new PsoStructureInfo(MetaName.CTaskCombatAdditionalTask__Tunables, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.iBulletEventResponseLengthMs, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fChanceOfDynamicRun, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxDynamicStrafeDistance, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeInState, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fMoveBlendRatioLerpTime, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceToClearCorner, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxDistanceFromCorner, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxLeavingCornerDistance, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fBlockedLosAimTime, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fStartAimingDistance, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.fStopAimingDistance, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinOtherPedDistanceDiff, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeBetweenRunDirectlyChecks, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxTimeStrafing, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeRunning, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.fForceStrafeDistance, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)2878670581, PsoDataType.Float, 80, 0, 0) - ); - case MetaName.CTaskCombatFlank__Tunables: - return new PsoStructureInfo(MetaName.CTaskCombatFlank__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fInfluenceSphereInnerWeight, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fInfluenceSphereOuterWeight, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fInfluenceSphereRequestRadius, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fInfluenceSphereCheckRouteRadius, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fSmallInfluenceSphereRadius, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fDistanceBetweenInfluenceSpheres, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fAbsoluteMinDistanceToTarget, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fCoverPointScoreMultiplier, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.CTaskHelicopterStrafe__Tunables: - return new PsoStructureInfo(MetaName.CTaskHelicopterStrafe__Tunables, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FlightHeightAboveTarget, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveTerrain, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetDirectionMinDot, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetOffset, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetMinSpeedToIgnore, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetMaxSpeedToStrafe, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToAvoidTargetAfterDamaged, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidOffsetXY, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidOffsetZ, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToBeConsideredInFront, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.BehindRotateAngleLookAhead, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.SearchRotateAngleLookAhead, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.CircleRotateAngleLookAhead, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.BehindTargetAngle, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetOffsetFilter, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenStrafeDirectionChanges, PsoDataType.Float, 76, 0, 0) - ); - case MetaName.CTaskMeleeActionResult__Tunables: - return new PsoStructureInfo(MetaName.CTaskMeleeActionResult__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ActionModeTime, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceRunDelayTime, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskMoveCombatMounted__Tunables: - return new PsoStructureInfo(MetaName.CTaskMoveCombatMounted__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.CircleTestRadii, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo(MetaName.CircleTestsMoveDistToTestNewPos, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeSinceAnyCircleJoined, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeSinceSameCircleJoined, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TransitionReactionTime, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.VelStartCircling, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.VelStopCircling, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeWaitingForCircleMs, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.CTaskDyingDead__Tunables: - return new PsoStructureInfo(MetaName.CTaskDyingDead__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.VehicleForwardInitialScale, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleForwardScale, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToApplyPushFromVehicleForce, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceToApply, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFallingSpeedForAnimatedDyingFall, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.SphereTestRadiusForDeadWaterSettle, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.RagdollAbortPoseDistanceThreshold, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.RagdollAbortPoseMaxVelocity, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToThrowWeaponMS, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToThrowWeaponPlayerMS, PsoDataType.UInt, 52, 0, 0) - ); - case MetaName.CTaskDamageElectric__Tunables: - return new PsoStructureInfo(MetaName.CTaskDamageElectric__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FallsOutofVehicleVelocity, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskInvestigate__Tunables: - return new PsoStructureInfo(MetaName.CTaskInvestigate__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.iTimeToStandAtSearchPoint, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceToUseVehicle, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceSavingToUseVehicle, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeToStandAtPerimeter, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fNewPositionThreshold, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.CTaskCombat__Tunables: - return new PsoStructureInfo(MetaName.CTaskCombat__Tunables, 0, 0, 704, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.BuddyShot, PsoDataType.Structure, 16, 0, (MetaName)4144542252), - new PsoStructureEntryInfo(MetaName.LackOfHostility, PsoDataType.Structure, 48, 0, (MetaName)455065356), - new PsoStructureEntryInfo(MetaName.EnemyAccuracyScaling, PsoDataType.Structure, 144, 0, (MetaName)1818844971), - new PsoStructureEntryInfo(MetaName.ChargeTuning, PsoDataType.Structure, 168, 0, (MetaName)3736726978), - new PsoStructureEntryInfo(MetaName.ThrowSmokeGrenadeTuning, PsoDataType.Structure, 240, 0, (MetaName)1530415684), - new PsoStructureEntryInfo(MetaName.MaxDistToCoverZ, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistToCoverXY, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo(MetaName.fAmbientAnimsMinDistToTargetSq, PsoDataType.Float, 296, 0, 0), - new PsoStructureEntryInfo(MetaName.fAmbientAnimsMaxDistToTargetSq, PsoDataType.Float, 300, 0, 0), - new PsoStructureEntryInfo(MetaName.fGoToDefAreaTimeOut, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo(MetaName.fFireContinuouslyDistMin, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo(MetaName.fFireContinuouslyDistMax, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo(MetaName.fLostTargetTime, PsoDataType.Float, 316, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeAfterAimPoseForStateChange, PsoDataType.Float, 320, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxAttemptMoveToCoverDelay, PsoDataType.Float, 324, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinAttemptMoveToCoverDelay, PsoDataType.Float, 328, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxAttemptMoveToCoverDelayGlobal, PsoDataType.Float, 332, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinAttemptMoveToCoverDelayGlobal, PsoDataType.Float, 336, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceForAltCover, PsoDataType.Float, 340, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeStandingAtCover, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeBetweenFrustratedPeds, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxTimeBetweenFrustratedPeds, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.fRetreatTime, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.fTargetTooCloseDistance, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenJackingAttempts, PsoDataType.Float, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenCoverSearchesMin, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenCoverSearchesMax, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenAltCoverSearches, PsoDataType.Float, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.fShoutTargetPositionInterval, PsoDataType.Float, 380, 0, 0), - new PsoStructureEntryInfo(MetaName.fShoutBlockingLosInterval, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenDragsMin, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenSecondaryTargetUsesMin, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenSecondaryTargetUsesMax, PsoDataType.Float, 396, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeToUseSecondaryTargetMin, PsoDataType.Float, 400, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeToUseSecondaryTargetMax, PsoDataType.Float, 404, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenCombatDirectorUpdates, PsoDataType.Float, 408, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenPassiveAnimsMin, PsoDataType.Float, 412, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenPassiveAnimsMax, PsoDataType.Float, 416, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenQuickGlancesMin, PsoDataType.Float, 420, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenQuickGlancesMax, PsoDataType.Float, 424, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenGestureAnimsMin, PsoDataType.Float, 428, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenGestureAnimsMax, PsoDataType.Float, 432, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenFailedGestureMin, PsoDataType.Float, 436, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenFailedGestureMax, PsoDataType.Float, 440, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenGesturesMinGlobal, PsoDataType.Float, 444, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenGesturesMaxGlobal, PsoDataType.Float, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeSinceLastAimedAtForGesture, PsoDataType.Float, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeBeforeReactToExplosion, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxTimeBeforeReactToExplosion, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetInfluenceSphereRadius, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetMinDistanceToRoute, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetMinDistanceToAwayFacingNavLink, PsoDataType.Float, 472, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxWaitForCoverExitTime, PsoDataType.Float, 476, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxDstanceToMoveAwayFromAlly, PsoDataType.Float, 480, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenAllyProximityChecks, PsoDataType.Float, 484, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceFromPrimaryTarget, PsoDataType.Float, 488, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxAngleBetweenTargets, PsoDataType.Float, 492, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceFromPedToHelpPed, PsoDataType.Float, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDotToTargetToHelpPed, PsoDataType.Float, 500, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeadingDifferenceForQuickGlanceInSameDirection, PsoDataType.Float, 504, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenQuickGlancesInSameDirection, PsoDataType.Float, 508, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedToStartJackingVehicle, PsoDataType.Float, 512, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedToContinueJackingVehicle, PsoDataType.Float, 516, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetJackRadius, PsoDataType.Float, 520, 0, 0), - new PsoStructureEntryInfo(MetaName.SafetyProportionInDefensiveAreaMin, PsoDataType.Float, 524, 0, 0), - new PsoStructureEntryInfo(MetaName.SafetyProportionInDefensiveAreaMax, PsoDataType.Float, 528, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMoveToDefensiveAreaAngleVariation, PsoDataType.Float, 532, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToEnterVehicleIfTargetEntersVehicle, PsoDataType.Float, 536, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToMyVehicleToChase, PsoDataType.Float, 540, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToVehicleForCommandeer, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.NumEarlyVehicleEntryDriversAllowed, PsoDataType.UByte, 548, 0, 0), - new PsoStructureEntryInfo(MetaName.SafeTimeBeforeLeavingCover, PsoDataType.UInt, 552, 0, 0), - new PsoStructureEntryInfo(MetaName.WaitTimeForJackingSlowedVehicle, PsoDataType.UInt, 556, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxInjuredTargetTimerVariation, PsoDataType.Float, 560, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxNumPedsChasingOnFoot, PsoDataType.UByte, 564, 0, 0), - new PsoStructureEntryInfo(MetaName.FireTimeAfterStaticMovementAbort, PsoDataType.Float, 568, 0, 0), - new PsoStructureEntryInfo(MetaName.MinMovingToCoverTimeToStop, PsoDataType.Float, 572, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToCoverToStop, PsoDataType.Float, 576, 0, 0), - new PsoStructureEntryInfo(MetaName.FireTimeAfterStoppingMoveToCover, PsoDataType.Float, 580, 0, 0), - new PsoStructureEntryInfo(MetaName.ApproachingTargetVehicleHoldFireDistance, PsoDataType.Float, 584, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDefensiveAreaRadiusForWillAdvance, PsoDataType.Float, 588, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToHoldFireForArrest, PsoDataType.Float, 592, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToDelayChaseOnFoot, PsoDataType.Float, 596, 0, 0), - new PsoStructureEntryInfo(MetaName.FireTimeAfterChaseOnFoot, PsoDataType.Float, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToChangeChaseOnFootSpeed, PsoDataType.UInt, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableForcedFireForTargetProximity, PsoDataType.Bool, 608, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForceFiringStateTime, PsoDataType.Float, 612, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForceFiringStateTime, PsoDataType.Float, 616, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBeforeInitialForcedFire, PsoDataType.Float, 620, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenForcedFireStates, PsoDataType.Float, 624, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInStateForForcedFire, PsoDataType.Float, 628, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForceFiringDistance, PsoDataType.Float, 632, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForceFiringDistance, PsoDataType.Float, 636, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForAimIntro, PsoDataType.Float, 640, 0, 0), - new PsoStructureEntryInfo((MetaName)3129989164, PsoDataType.Float, 644, 0, 0), - new PsoStructureEntryInfo((MetaName)4269476531, PsoDataType.Float, 648, 0, 0), - new PsoStructureEntryInfo(MetaName.AmbientAnimLengthBuffer, PsoDataType.Float, 652, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenPlayerArrestAttempts, PsoDataType.UInt, 656, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenArmedMeleeAttemptsInMs, PsoDataType.UInt, 660, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowMovingArmedMeleeAttack, PsoDataType.Bool, 664, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToHoldFireAfterJack, PsoDataType.Float, 668, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenMeleeJackAttempts, PsoDataType.UInt, 672, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenMeleeJackAttemptsOnNetworkClone, PsoDataType.UInt, 676, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToHoldFireAtTaskInitialization, PsoDataType.Float, 680, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToRejectRespawnedTarget, PsoDataType.UInt, 684, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForLawToFleeFromCombat, PsoDataType.Float, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForLawToReturnToCombatFromFlee, PsoDataType.Float, 692, 0, 0), - new PsoStructureEntryInfo((MetaName)2186966715, PsoDataType.Float, 696, 0, 0) - ); - case (MetaName)4144542252: - return new PsoStructureInfo((MetaName)4144542252, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBeforeReact, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeBeforeReact, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeSinceShot, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)455065356: - return new PsoStructureInfo((MetaName)455065356, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.WantedLevel1, PsoDataType.Structure, 8, 0, (MetaName)2841666617), - new PsoStructureEntryInfo(MetaName.WantedLevel2, PsoDataType.Structure, 24, 0, (MetaName)2841666617), - new PsoStructureEntryInfo(MetaName.WantedLevel3, PsoDataType.Structure, 40, 0, (MetaName)2841666617), - new PsoStructureEntryInfo(MetaName.WantedLevel4, PsoDataType.Structure, 56, 0, (MetaName)2841666617), - new PsoStructureEntryInfo(MetaName.WantedLevel5, PsoDataType.Structure, 72, 0, (MetaName)2841666617), - new PsoStructureEntryInfo(MetaName.MaxSpeedForVehicle, PsoDataType.Float, 88, 0, 0) - ); - case (MetaName)2841666617: - return new PsoStructureInfo((MetaName)2841666617, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeSinceLastHostileAction, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)1818844971: - return new PsoStructureInfo((MetaName)1818844971, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.iMinNumEnemiesForScaling, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fAccuracyReductionPerEnemy, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fAccuracyReductionFloor, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)3736726978: - return new PsoStructureInfo((MetaName)3736726978, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.bChargeTargetEnabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.uMaxNumActiveChargers, PsoDataType.UByte, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.uConsiderRecentChargeAsActiveTimeoutMS, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.uMinTimeBetweenChargesAtSameTargetMS, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.uMinTimeForSamePedToChargeAgainMS, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.uCheckForChargeTargetPeriodMS, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeInCombatSeconds, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceToTarget, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxDistanceToTarget, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistToNonTargetEnemy, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistBetweenTargetAndOtherEnemies, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fDistToHidingTarget_Outer, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fDistToHidingTarget_Inner, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.fChargeGoalCompletionRadius, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.fCancelTargetOutOfCoverMovedDist, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.fCancelTargetInCoverMovedDist, PsoDataType.Float, 64, 0, 0) - ); - case (MetaName)1530415684: - return new PsoStructureInfo((MetaName)1530415684, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.bThrowSmokeGrenadeEnabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.uMaxNumActiveThrowers, PsoDataType.UByte, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.uConsiderRecentThrowAsActiveTimeoutMS, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.uMinTimeBetweenThrowsAtSameTargetMS, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.uMinTimeForSamePedToThrowAgainMS, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.uCheckForSmokeThrowPeriodMS, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceToTarget, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxDistanceToTarget, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fDotMinThrowerToTarget, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinLoiteringTimeSeconds, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CTaskReactAimWeapon__Tunables: - return new PsoStructureInfo(MetaName.CTaskReactAimWeapon__Tunables, 0, 0, 680, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Professional, PsoDataType.Structure, 16, 0, (MetaName)3326118529), - new PsoStructureEntryInfo(MetaName.NotProfessional, PsoDataType.Structure, 344, 0, (MetaName)3326118529), - new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 672, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRateVariance, PsoDataType.Float, 676, 0, 0) - ); - case (MetaName)3326118529: - return new PsoStructureInfo((MetaName)3326118529, 0, 0, 328, - new PsoStructureEntryInfo(MetaName.Flinch, PsoDataType.Structure, 8, 0, (MetaName)2563725968), - new PsoStructureEntryInfo(MetaName.Surprised, PsoDataType.Structure, 88, 0, (MetaName)2563725968), - new PsoStructureEntryInfo(MetaName.Sniper, PsoDataType.Structure, 168, 0, (MetaName)2563725968), - new PsoStructureEntryInfo(MetaName.None, PsoDataType.Structure, 248, 0, (MetaName)2563725968) - ); - case (MetaName)2563725968: - return new PsoStructureInfo((MetaName)2563725968, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Pistol, PsoDataType.Structure, 8, 0, (MetaName)3972028972), - new PsoStructureEntryInfo(MetaName.Rifle, PsoDataType.Structure, 32, 0, (MetaName)3972028972), - new PsoStructureEntryInfo(MetaName.MicroSMG, PsoDataType.Structure, 56, 0, (MetaName)3972028972) - ); - case (MetaName)3972028972: - return new PsoStructureInfo((MetaName)3972028972, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ClipSetId, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.HasSixDirections, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.HasCreateWeaponTag, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.HasInterruptTag, PsoDataType.Bool, 18, 0, 0) - ); - case MetaName.CTaskSearch__Tunables: - return new PsoStructureInfo(MetaName.CTaskSearch__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeToStare, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MoveBlendRatio, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetReached, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CTaskSearchForUnknownThreat__Tunables: - return new PsoStructureInfo(MetaName.CTaskSearchForUnknownThreat__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.iMinTimeBeforeSearchingForNewHidingPlace, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.iMaxTimeBeforeSearchingForNewHidingPlace, PsoDataType.SInt, 20, 0, 0) - ); - case MetaName.CTaskSharkCircle__Tunables: - return new PsoStructureInfo(MetaName.CTaskSharkCircle__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AdvanceDistanceSquared, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MoveRateOverride, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskSharkAttack__Tunables: - return new PsoStructureInfo(MetaName.CTaskSharkAttack__Tunables, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SurfaceProjectionDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SurfaceZOffset, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDepthBelowSurface, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.CirclingAngularSpeed, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToCircle, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinCircleRadius, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCircleRadius, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.CirclingMBR, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DiveProjectionDistance, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DiveDepth, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DiveMBR, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinNumberFakeApproaches, PsoDataType.SInt, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxNumberFakeApproaches, PsoDataType.SInt, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.FakeLungeOffset, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.LungeForwardOffset, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.LungeZOffset, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.LungeChangeDistance, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.LungeTargetRadius, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowTimeout, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowYOffset, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowZOffset, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.LandProbeLength, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingVehicleVelocityThreshold, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.SharkFleeDist, PsoDataType.Float, 108, 0, 0) - ); - case MetaName.CTaskCover__Tunables: - return new PsoStructureInfo(MetaName.CTaskCover__Tunables, 0, 0, 192, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)3698046827, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1862046997, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1686691958, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3171144783, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1788624470, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)1235126752, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1335048013, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)2787523036, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.PriorityCoverWeighting, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleToCameraWeighting, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleToDynamicCoverWeighting, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceWeighting, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleToCoverWeighting, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleOfCoverWeighting, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeWeighting, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.NetworkBlendOutDurationRun, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.NetworkBlendOutDurationRunStart, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.NetworkBlendOutDuration, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPlayerToCoverDist, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)1534623417, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularDiffBetweenDynamicAndStaticCover, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.RangeToUseDynamicCoverPointMin, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.RangeToUseDynamicCoverPointMax, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistToCoverAnyDir, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistToPriorityCoverToForce, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistToCoverSpecificDir, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.BehindPedToCoverCosTolerance, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.SearchToCoverCosTolerance, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.CapsuleZOffset, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenTestSpheresIntersectingRoute, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistToCoverWhenPlayerIsClose, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MinCoverToPlayerCoverDist, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.MinMoveToCoverDistForCoverMeAudio, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSecondsAsTopLevelTask, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceStreamingFailure, PsoDataType.Bool, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.StreamedUnarmedCoverMovementClipSetId, PsoDataType.String, 156, 7, 0), - new PsoStructureEntryInfo((MetaName)1804897490, PsoDataType.String, 160, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamedOneHandedCoverMovementClipSetId, PsoDataType.String, 164, 7, 0), - new PsoStructureEntryInfo(MetaName.AIOneHandedAimingClipSetId, PsoDataType.String, 168, 7, 0), - new PsoStructureEntryInfo(MetaName.AITwoHandedAimingClipSetId, PsoDataType.String, 172, 7, 0), - new PsoStructureEntryInfo(MetaName.CoreWeaponClipSetId, PsoDataType.String, 176, 7, 0), - new PsoStructureEntryInfo((MetaName)3902347552, PsoDataType.String, 180, 7, 0), - new PsoStructureEntryInfo((MetaName)2620277506, PsoDataType.String, 184, 7, 0) - ); - case MetaName.CTaskEnterCover__Tunables: - return new PsoStructureInfo(MetaName.CTaskEnterCover__Tunables, 0, 0, 368, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryRatePlayer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryRateAI, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryShortDistanceAI, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryShortDistancePlayer, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryStandDistance, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryStandStrafeDistance, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryMinDistance, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryMaxDistance, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryMinDistanceAI, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryMaxDistanceAI, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryMaxDirectDistance, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryMinTimeNavigatingAI, PsoDataType.SInt, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryMinAngleToScale, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryHeadingReachedTol, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverEntryPositionReachedTol, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.FromCoverExitDistance, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.NetworkBlendInDuration, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.DistFromCoverToAllowReloadCache, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.WaitForFootPlant, PsoDataType.Bool, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableFootTagSyncing, PsoDataType.Bool, 89, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceToTarget, PsoDataType.Bool, 90, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableInitialHeadingBlend, PsoDataType.Bool, 91, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableTranslationScaling, PsoDataType.Bool, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableRotationScaling, PsoDataType.Bool, 93, 0, 0), - new PsoStructureEntryInfo(MetaName.PreventTranslationOvershoot, PsoDataType.Bool, 94, 0, 0), - new PsoStructureEntryInfo(MetaName.PreventRotationOvershoot, PsoDataType.Bool, 95, 0, 0), - new PsoStructureEntryInfo(MetaName.DoInitialHeadingBlend, PsoDataType.Bool, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.DoFinalHeadingFixUp, PsoDataType.Bool, 97, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistToPlayEntryAnim, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistToScale, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRotSpeed, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTransScale, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTransScale, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRotScale, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRotScale, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.DeltaTolerance, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRotDelta, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleToSetDirectly, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.AiEntryHalfAngleTolerance, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableNewAICoverEntry, PsoDataType.Bool, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableUseSwatClipSet, PsoDataType.Bool, 149, 0, 0), - new PsoStructureEntryInfo(MetaName.UseShortDistAngleRotation, PsoDataType.Bool, 150, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableAiCoverEntryStreamCheck, PsoDataType.Bool, 151, 0, 0), - new PsoStructureEntryInfo(MetaName.DistToUseShortestRotation, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.InCoverTolerance, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.DotThresholdForCenterEnter, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.AiEntryMinRate, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.AiEntryMaxRate, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerSprintEntryRate, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultPlayerStandEntryStartMovementPhase, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultPlayerStandEntryEndMovementPhase, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleToBeginRotationScale, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDefaultAngularVelocity, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverInterruptMinTime, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverInterruptDistanceTolerance, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverInterruptHeadingTolerance, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverAimInterruptDistanceTolerance, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverAimInterruptHeadingTolerance, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo((MetaName)3920645611, PsoDataType.Structure, 216, 0, (MetaName)1285383250), - new PsoStructureEntryInfo((MetaName)80713034, PsoDataType.Structure, 256, 0, (MetaName)1285383250), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)711010751), - new PsoStructureEntryInfo(MetaName.AIEnterCoverClips, PsoDataType.Array, 296, 0, (MetaName)62), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3590219800), - new PsoStructureEntryInfo(MetaName.AIStandEnterCoverClips, PsoDataType.Array, 312, 0, (MetaName)64), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)711010751), - new PsoStructureEntryInfo(MetaName.AIEnterTransitionClips, PsoDataType.Array, 328, 0, (MetaName)66), - new PsoStructureEntryInfo(MetaName.EnterCoverAIAimingBase1H, PsoDataType.String, 344, 7, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverAIAimingBase2H, PsoDataType.String, 348, 7, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverAIAimingSwat1H, PsoDataType.String, 352, 7, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverAIAimingSwat2H, PsoDataType.String, 356, 7, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverAITransition1H, PsoDataType.String, 360, 7, 0), - new PsoStructureEntryInfo(MetaName.EnterCoverAITransition2H, PsoDataType.String, 364, 7, 0) - ); - case (MetaName)1285383250: - return new PsoStructureInfo((MetaName)1285383250, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo((MetaName)611524654, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo((MetaName)1120845094, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case (MetaName)3038580099: - return new PsoStructureInfo((MetaName)3038580099, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Clips, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 24, 0, (MetaName)2097154) - ); - case (MetaName)711010751: - return new PsoStructureInfo((MetaName)711010751, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.EnterClipId, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 12, 0, (MetaName)2097153) - ); - case (MetaName)3590219800: - return new PsoStructureInfo((MetaName)3590219800, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.StandClip0Id, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.StandClip1Id, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.StandClip2Id, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 20, 0, (MetaName)2097155) - ); - case MetaName.CTaskExitCover__Tunables: - return new PsoStructureInfo(MetaName.CTaskExitCover__Tunables, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4010326834), - new PsoStructureEntryInfo(MetaName.CornerExitClips, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo(MetaName.ExitCoverBaseClipSetId, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo((MetaName)2123164199, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.ExitCoverExtraClipSetId, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo((MetaName)1757551615, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.MinInputToInterruptIdle, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.CornerExitHeadingModifier, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitCornerZOffset, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitCornerYOffset, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitCornerDirOffset, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)3920645611, PsoDataType.Structure, 72, 0, (MetaName)246682624), - new PsoStructureEntryInfo((MetaName)80713034, PsoDataType.Structure, 96, 0, (MetaName)246682624) - ); - case (MetaName)246682624: - return new PsoStructureInfo((MetaName)246682624, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo((MetaName)1123873278, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)4010326834: - return new PsoStructureInfo((MetaName)4010326834, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.ExitClipId, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 12, 0, (MetaName)2097153) - ); - case MetaName.CTaskInCover__Tunables: - return new PsoStructureInfo(MetaName.CTaskInCover__Tunables, 0, 0, 536, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MovementClipRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TurnClipRate, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxInputForIdleExit, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.InputYAxisCornerExitValue, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlDebugXPos, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlDebugYPos, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlDebugRadius, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlDebugBeginAngle, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.ControlDebugEndAngle, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStickInputToMoveInCover, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStickInputXAxisToTurnInCover, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)927329696, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.InputYAxisQuitValue, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.StartExtendedProbeTime, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToSpendInTask, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredDistanceToCover, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredDistanceToCoverToRequestStep, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.OptimumDistToRightCoverEdgeCrouched, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.OptimumDistToLeftCoverEdgeCrouched, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.OptimumDistToRightCoverEdge, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.OptimumDistToLeftCoverEdge, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.MinMovingProbeOffset, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMovingProbeOffset, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTurnProbeOffset, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTurnProbeOffset, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultProbeOffset, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStoppingEdgeCheckProbeOffset, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStoppingEdgeCheckProbeOffset, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStoppingProbeOffset, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStoppingProbeOffset, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingChangeRate, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBeforeAllowingCornerMove, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.CrouchedLeftFireOffset, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.CrouchedRightFireOffset, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverLeftFireModifier, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverRightFireModifier, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverLeftFireModifierLow, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverRightFireModifierLow, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)2625425324, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.CFriendlyIssues, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverLeftIncreaseModifier, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverRightIncreaseModifier, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.AimTurnCosAngleTolerance, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.InCoverMovementSpeedEnterCover, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.InCoverMovementSpeed, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.SteppingMovementSpeed, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.UseAutoPeekAimFromCoverControls, PsoDataType.Bool, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.ComeBackInWhenAimDirectChangeInHighCover, PsoDataType.Bool, 201, 0, 0), - new PsoStructureEntryInfo(MetaName.AlternateControlStickInputThreshold, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeCapsuleRadius, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeStartXOffset, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeEndXOffset, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeStartYOffset, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeEndYOffset, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.InsideEdgeStartYOffset, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.InsideEdgeEndYOffset, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.InsideEdgeStartXOffset, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.InsideEdgeEndXOffset, PsoDataType.Float, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.WallTestYOffset, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialLowEdgeWallTestYOffset, PsoDataType.Float, 248, 0, 0), - new PsoStructureEntryInfo(MetaName.HighCloseEdgeWallTestYOffset, PsoDataType.Float, 252, 0, 0), - new PsoStructureEntryInfo(MetaName.WallTestStartXOffset, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.WallTestEndXOffset, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo(MetaName.WallHighTestZOffset, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingEdgeTestStartYOffset, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingEdgeTestEndYOffset, PsoDataType.Float, 272, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverEdgeTestStartYOffset, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverEdgeTestEndYOffset, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo(MetaName.SteppingEdgeTestStartYOffset, PsoDataType.Float, 284, 0, 0), - new PsoStructureEntryInfo(MetaName.SteppingEdgeTestEndYOffset, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialLowEdgeTestStartYOffset, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialLowEdgeTestEndYOffset, PsoDataType.Float, 296, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeHighZOffset, PsoDataType.Float, 300, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeLowZOffset, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeMinimumOffsetDiff, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeMaximumOffsetDiff, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo(MetaName.PinnedDownPeekChance, PsoDataType.Float, 316, 0, 0), - new PsoStructureEntryInfo(MetaName.PinnedDownBlindFireChance, PsoDataType.Float, 320, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBeforeAllowingAutoPeek, PsoDataType.Float, 324, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableAimDirectlyIntros, PsoDataType.Bool, 328, 0, 0), - new PsoStructureEntryInfo(MetaName.PedDirToPedCoverCosAngleTol, PsoDataType.Float, 332, 0, 0), - new PsoStructureEntryInfo(MetaName.CamToPedDirCosAngleTol, PsoDataType.Float, 336, 0, 0), - new PsoStructureEntryInfo(MetaName.CamToCoverDirCosAngleTol, PsoDataType.Float, 340, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToTargetForPeek, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenPeeksWithoutLOS, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1466791495), - new PsoStructureEntryInfo(MetaName.ThrowProjectileClips, PsoDataType.Array, 352, 0, (MetaName)86), - new PsoStructureEntryInfo(MetaName.RecreateWeaponTime, PsoDataType.SInt, 368, 0, 0), - new PsoStructureEntryInfo(MetaName.BlindFireHighCoverMinPitchLimit, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.BlindFireHighCoverMaxPitchLimit, PsoDataType.Float, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableLeftHandIkInCover, PsoDataType.Bool, 380, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableReloadingWhilstMovingInCover, PsoDataType.Bool, 381, 0, 0), - new PsoStructureEntryInfo(MetaName.AimIntroRateForAi, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.AimOutroRateForAi, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.MinReactToFireRate, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxReactToFireRate, PsoDataType.Float, 396, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxReactToFireDelay, PsoDataType.Float, 400, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeUntilReturnToIdleFromAimAfterAimedAt, PsoDataType.Float, 404, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeUntilReturnToIdleFromAimAfterAimedAt, PsoDataType.Float, 408, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeUntilReturnToIdleFromAimDefault, PsoDataType.Float, 412, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeUntilReturnToIdleFromAimDefault, PsoDataType.Float, 416, 0, 0), - new PsoStructureEntryInfo(MetaName.GlobalLateralTorsoOffsetInLeftCover, PsoDataType.Float, 420, 0, 0), - new PsoStructureEntryInfo((MetaName)3668359056, PsoDataType.Float, 424, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponLongBlockingOffsetInLeftCover, PsoDataType.Float, 428, 0, 0), - new PsoStructureEntryInfo((MetaName)2805643991, PsoDataType.Float, 432, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponBlockingOffsetInLeftCover, PsoDataType.Float, 436, 0, 0), - new PsoStructureEntryInfo((MetaName)3824828934, PsoDataType.Float, 440, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponBlockingOffsetInRightCover, PsoDataType.Float, 444, 0, 0), - new PsoStructureEntryInfo((MetaName)3593181124, PsoDataType.Float, 448, 0, 0), - new PsoStructureEntryInfo((MetaName)1214766569, PsoDataType.Float, 452, 0, 0), - new PsoStructureEntryInfo((MetaName)2018978213, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponBlockingLengthOffset, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo((MetaName)2717483602, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverStepClipSetId, PsoDataType.String, 468, 7, 0), - new PsoStructureEntryInfo(MetaName.PinnedDownTakeCoverAmount, PsoDataType.Float, 472, 0, 0), - new PsoStructureEntryInfo(MetaName.AmountPinnedDownByDamage, PsoDataType.Float, 476, 0, 0), - new PsoStructureEntryInfo(MetaName.AmountPinnedDownByBullet, PsoDataType.Float, 480, 0, 0), - new PsoStructureEntryInfo(MetaName.AmountPinnedDownByWitnessKill, PsoDataType.Float, 484, 0, 0), - new PsoStructureEntryInfo(MetaName.PinnedDownByBulletRange, PsoDataType.Float, 488, 0, 0), - new PsoStructureEntryInfo(MetaName.PinnedDownDecreaseAmountPerSecond, PsoDataType.Float, 492, 0, 0), - new PsoStructureEntryInfo(MetaName.AimIntroTaskBlendOutDuration, PsoDataType.Float, 496, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToBePinnedDown, PsoDataType.UInt, 500, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenBurstsMaxRandomPercent, PsoDataType.Float, 504, 0, 0), - new PsoStructureEntryInfo(MetaName.AimOutroDelayTime, PsoDataType.UInt, 508, 0, 0), - new PsoStructureEntryInfo((MetaName)3531438516, PsoDataType.UInt, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)796325569, PsoDataType.UInt, 516, 0, 0), - new PsoStructureEntryInfo((MetaName)2152868269, PsoDataType.Bool, 520, 0, 0), - new PsoStructureEntryInfo((MetaName)1536785516, PsoDataType.Bool, 521, 0, 0), - new PsoStructureEntryInfo(MetaName.ThrowProjectileClipSetId, PsoDataType.String, 524, 7, 0), - new PsoStructureEntryInfo((MetaName)3576155857, PsoDataType.String, 528, 7, 0) - ); - case (MetaName)1466791495: - return new PsoStructureInfo((MetaName)1466791495, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.IntroClipId, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.PullPinClipId, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.BaseClipId, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.ThrowLongClipId, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.ThrowShortClipId, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo((MetaName)1925480184, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo((MetaName)3487669030, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 36, 0, (MetaName)2097159) - ); - case MetaName.CTaskMotionInCover__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionInCover__Tunables, 0, 0, 1112, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverClipRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableCoverToCoverTranslationScaling, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableCoverToCoverRotationScaling, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo(MetaName.UseButtonToMoveAroundCorner, PsoDataType.Bool, 22, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableCoverToCover, PsoDataType.Bool, 23, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableWalkStops, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableCoverPeekingVariations, PsoDataType.Bool, 25, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableCoverPinnedVariations, PsoDataType.Bool, 26, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableCoverIdleVariations, PsoDataType.Bool, 27, 0, 0), - new PsoStructureEntryInfo(MetaName.UseSprintButtonForCoverToCover, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.VerifyCoverInterval, PsoDataType.UByte, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeForCornerMove, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultSettleBlendDuration, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.HeightChangeSettleBlendDuration, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeStayPinned, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeStayPinned, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.PinnedDownThreshold, PsoDataType.UInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ForcePinnedDown, PsoDataType.Bool, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToTargetForIdleVariations, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenIdleVariations, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeBetweenIdleVariations, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MinWaitTimeToPlayPlayerIdleVariations, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenPlayerIdleVariations, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeBetweenPlayerIdleVariations, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverDuration, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMinScalePhase, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMaxScalePhase, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMinRotScalePhase, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMaxRotScalePhase, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRotationalSpeedScale, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRotationalSpeed, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStickInputToEnableMoveAroundCorner, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStickInputToEnableCoverToCover, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStickInputToMoveAroundCorner, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStoppingDuration, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStoppingDist, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToScale, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCDepthDistanceCompletionOffset, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeLowCoverMoveTime, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToStandUp, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMinDistToScale, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMinAngToScale, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMinAng, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverDistTol, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMaxDistToStep, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverAngTol, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMaxAngToStep, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMaxAccel, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.ForwardDistToStartSideScale, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverMinDepthToScale, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverToCoverSmallAnimDist, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingReachedTolerance, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendToIdleTime, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.InsideCornerStopDistance, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverHeadingCloseEnough, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverHeadingCloseEnoughTurn, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverPositionCloseEnough, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultStillToTurnBlendDuration, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultEdgeTurnBlendDuration, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.PeekToEdgeTurnBlendDuration, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMoveSpeedInCover, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.MinEdgeDistanceForStoppingAnim, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.UseNewStepAndWalkStarts, PsoDataType.Bool, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.UseNewTurns, PsoDataType.Bool, 237, 0, 0), - new PsoStructureEntryInfo(MetaName.UseNewTurnWalkStarts, PsoDataType.Bool, 238, 0, 0), - new PsoStructureEntryInfo(MetaName.CoreMotionClipSetId, PsoDataType.String, 240, 7, 0), - new PsoStructureEntryInfo((MetaName)1642317087, PsoDataType.String, 244, 7, 0), - new PsoStructureEntryInfo(MetaName.CoreAIMotionClipSetId, PsoDataType.String, 248, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.PeekingVariationAnimStateInfos, PsoDataType.Array, 256, 0, (MetaName)69), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PeekingLow1HVariationClipsets, PsoDataType.Array, 272, 0, (MetaName)71), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PeekingLow2HVariationClipsets, PsoDataType.Array, 288, 0, (MetaName)73), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PeekingHigh1HVariationClipsets, PsoDataType.Array, 304, 0, (MetaName)75), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PeekingHigh2HVariationClipsets, PsoDataType.Array, 320, 0, (MetaName)77), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PinnedLow1HVariationClipsets, PsoDataType.Array, 336, 0, (MetaName)79), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PinnedLow2HVariationClipsets, PsoDataType.Array, 352, 0, (MetaName)81), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PinnedHigh1HVariationClipsets, PsoDataType.Array, 368, 0, (MetaName)83), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PinnedHigh2HVariationClipsets, PsoDataType.Array, 384, 0, (MetaName)85), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.OutroReact1HVariationClipsets, PsoDataType.Array, 400, 0, (MetaName)87), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.OutroReact2HVariationClipsets, PsoDataType.Array, 416, 0, (MetaName)89), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.IdleLow1HVariationClipsets, PsoDataType.Array, 432, 0, (MetaName)91), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.IdleLow2HVariationClipsets, PsoDataType.Array, 448, 0, (MetaName)93), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.IdleHigh1HVariationClipsets, PsoDataType.Array, 464, 0, (MetaName)95), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.IdleHigh2HVariationClipsets, PsoDataType.Array, 480, 0, (MetaName)97), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PlayerIdleLow0HVariationClipsets, PsoDataType.Array, 496, 0, (MetaName)99), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PlayerIdleLow1HVariationClipsets, PsoDataType.Array, 512, 0, (MetaName)101), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PlayerIdleLow2HVariationClipsets, PsoDataType.Array, 528, 0, (MetaName)103), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PlayerIdleHigh0HVariationClipsets, PsoDataType.Array, 544, 0, (MetaName)105), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PlayerIdleHigh1HVariationClipsets, PsoDataType.Array, 560, 0, (MetaName)107), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.PlayerIdleHigh2HVariationClipsets, PsoDataType.Array, 576, 0, (MetaName)109), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.PinnedIntroAnimStateInfos, PsoDataType.Array, 592, 0, (MetaName)111), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.PinnedIdleAnimStateInfos, PsoDataType.Array, 608, 0, (MetaName)113), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.PinnedOutroAnimStateInfos, PsoDataType.Array, 624, 0, (MetaName)115), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.IdleVariationAnimStateInfos, PsoDataType.Array, 640, 0, (MetaName)117), - new PsoStructureEntryInfo((MetaName)3920645611, PsoDataType.Structure, 656, 0, (MetaName)2625948332), - new PsoStructureEntryInfo((MetaName)80713034, PsoDataType.Structure, 880, 0, (MetaName)2625948332), - new PsoStructureEntryInfo((MetaName)1230607954, PsoDataType.Bool, 1104, 0, 0), - new PsoStructureEntryInfo((MetaName)1949874056, PsoDataType.Bool, 1105, 0, 0), - new PsoStructureEntryInfo((MetaName)3098272438, PsoDataType.Bool, 1106, 0, 0), - new PsoStructureEntryInfo((MetaName)2038512667, PsoDataType.Bool, 1107, 0, 0) - ); - case (MetaName)2625948332: - return new PsoStructureInfo((MetaName)2625948332, 0, 0, 224, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.IdleAnimStateInfos, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.AtEdgeAnimStateInfos, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.PeekingAnimStateInfos, PsoDataType.Array, 40, 0, (MetaName)4), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.StoppingAnimStateInfos, PsoDataType.Array, 56, 0, (MetaName)6), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.MovingAnimStateInfos, PsoDataType.Array, 72, 0, (MetaName)8), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.EdgeTurnAnimStateInfos, PsoDataType.Array, 88, 0, (MetaName)10), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.CoverToCoverAnimStateInfos, PsoDataType.Array, 104, 0, (MetaName)MetaTypeName.PsoPOINTER), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.SteppingAnimStateInfos, PsoDataType.Array, 120, 0, (MetaName)14), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.WalkStartAnimStateInfos, PsoDataType.Array, 136, 0, (MetaName)MetaTypeName.STRING), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.SettleAnimStateInfos, PsoDataType.Array, 152, 0, (MetaName)18), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.TurnEnterAnimStateInfos, PsoDataType.Array, 168, 0, (MetaName)20), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.TurnEndAnimStateInfos, PsoDataType.Array, 184, 0, (MetaName)22), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo(MetaName.TurnWalkStartAnimStateInfos, PsoDataType.Array, 200, 0, (MetaName)24), - new PsoStructureEntryInfo((MetaName)3535710087, PsoDataType.String, 216, 7, 0) - ); - case MetaName.CTaskAimGunFromCoverIntro__Tunables: - return new PsoStructureInfo(MetaName.CTaskAimGunFromCoverIntro__Tunables, 0, 0, 312, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.UpperBodyAimBlendInDuration, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.IntroMovementDuration, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableIntroScaling, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableRotationScaling, PsoDataType.Bool, 25, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableIntroOverShootCheck, PsoDataType.Bool, 26, 0, 0), - new PsoStructureEntryInfo(MetaName.UseConstantIntroScaling, PsoDataType.Bool, 27, 0, 0), - new PsoStructureEntryInfo(MetaName.RenderArcsAtCoverPosition, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.RenderAimArcDebug, PsoDataType.Bool, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.UseMoverPositionWhilePeeking, PsoDataType.Bool, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableWeaponBlocking, PsoDataType.Bool, 31, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableTranslationScaling, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ArcRadius, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.IntroScalingDefaultStartPhase, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.IntroScalingDefaultEndPhase, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.IntroRotScalingDefaultStartPhase, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.IntroRotScalingDefaultEndPhase, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.AiAimIntroCloseEnoughTolerance, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStepBackDist, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStepOutDist, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStepOutDist, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.IntroMaxScale, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.IntroRate, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)2875886470, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.OutroRate, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)2575356761, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.SteppingApproachRateSlow, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.SteppingApproachRate, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.SteppingApproachRateFast, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.SteppingHeadingApproachRate, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRotationalSpeedScale, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRotationalSpeedScale, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingReachedTolerance, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.StepOutCapsuleRadiusScale, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.AimDirectlyMaxAngle, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.StepOutLeftX, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.StepOutRightX, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.StepOutY, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.LowXClearOffsetCapsuleTest, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.LowXOffsetCapsuleTest, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.LowYOffsetCapsuleTest, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.LowZOffsetCapsuleTest, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.LowOffsetCapsuleLength, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.LowOffsetCapsuleRadius, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.LowLeftStep, PsoDataType.Float2, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.LowRightStep, PsoDataType.Float2, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.LowBlockedBlend, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.LowStepOutLeftXBlocked, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.LowStepOutLeftYBlocked, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.LowStepBackLeftXBlocked, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.LowStepBackLeftYBlocked, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.LowStepOutRightXBlocked, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.LowStepOutRightYBlocked, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.LowStepBackRightXBlocked, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.LowStepBackRightYBlocked, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.LowSideZOffset, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.DistConsideredAtAimPosition, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPhaseToApplyExtraHeadingAi, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPhaseToApplyExtraHeadingPlayer, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityAi, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityPlayer, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityPlayerForcedStandAim, PsoDataType.Float, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.HighLeftAimStepInfoSet, PsoDataType.Structure, 248, 0, (MetaName)791301518), - new PsoStructureEntryInfo(MetaName.HighRightAimStepInfoSet, PsoDataType.Structure, 272, 0, (MetaName)791301518), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4162893736), - new PsoStructureEntryInfo(MetaName.AimIntroClips, PsoDataType.Array, 296, 0, (MetaName)64) - ); - case (MetaName)791301518: - return new PsoStructureInfo((MetaName)791301518, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2996437115), - new PsoStructureEntryInfo(MetaName.StepInfos, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)2996437115: - return new PsoStructureInfo((MetaName)2996437115, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.StepOutX, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.StepOutY, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.StepTransitionMinAngle, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StepTransitionMaxAngle, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.PreviousTransitionExtraScalar, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.NextTransitionExtraScalar, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.PreviousTransitionClipId, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.NextTransitionClipId, PsoDataType.String, 36, 7, 0) - ); - case (MetaName)4162893736: - return new PsoStructureInfo((MetaName)4162893736, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Clips, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 24, 0, (MetaName)2097154) - ); - case MetaName.CTaskAimGunFromCoverOutro__Tunables: - return new PsoStructureInfo(MetaName.CTaskAimGunFromCoverOutro__Tunables, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DisableOutroScaling, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableRotationScaling, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableOutroOverShootCheck, PsoDataType.Bool, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.UseConstantOutroScaling, PsoDataType.Bool, 19, 0, 0), - new PsoStructureEntryInfo(MetaName.OutroRotationScalingDefaultStartPhase, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.OutroRotationScalingDefaultEndPhase, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.OutroScalingDefaultStartPhase, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.OutroScalingDefaultEndPhase, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.OutroMaxScale, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AdditionalModifier, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.EndHeadingTolerance, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredDistanceToCover, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.InCoverMovementSpeed, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.OutroMovementDuration, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.UpperBodyAimBlendOutDuration, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityAi, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityPlayer, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)2412106599, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityPlayerForcedStandAim, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)3920645611, PsoDataType.Structure, 80, 0, (MetaName)1280972310), - new PsoStructureEntryInfo((MetaName)80713034, PsoDataType.Structure, 104, 0, (MetaName)1280972310) - ); - case (MetaName)1280972310: - return new PsoStructureInfo((MetaName)1280972310, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), - new PsoStructureEntryInfo((MetaName)2828309925, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.CTaskAimGunBlindFire__Tunables: - return new PsoStructureInfo(MetaName.CTaskAimGunBlindFire__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.RemoveReticuleDuringBlindFire, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DontRemoveReticuleDuringBlindFireNew, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.LowBlindFireAimingDirectlyLimitAngle, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.HighBlindFireAimingDirectlyLimitAngle, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)994532516), - new PsoStructureEntryInfo(MetaName.BlindFireAnimStateNewInfos, PsoDataType.Array, 32, 0, (MetaName)5) - ); - case (MetaName)994532516: - return new PsoStructureInfo((MetaName)994532516, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.IntroClip0Id, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.IntroClip1Id, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.SweepClip0Id, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.SweepClip1Id, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo(MetaName.SweepClip2Id, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.OutroClip0Id, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo((MetaName)2291961208, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo((MetaName)3610728325, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo((MetaName)1018316975, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.CockGunWeaponClipId, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 48, 0, (MetaName)2097162), - new PsoStructureEntryInfo(MetaName.MinHeadingAngle, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeadingAngle, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3127121455, PsoDataType.Structure, 64, 0, (MetaName)4209697792), - new PsoStructureEntryInfo((MetaName)465339689, PsoDataType.Structure, 88, 0, (MetaName)4209697792) - ); - case (MetaName)4209697792: - return new PsoStructureInfo((MetaName)4209697792, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.MinPitchAngle, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitchAngle, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPitchAngle2H, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitchAngle2H, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CAiCoverClipVariationHelper__Tunables: - return new PsoStructureInfo(MetaName.CAiCoverClipVariationHelper__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinUsesForPeekingVariationChange, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxUsesForPeekingVariationChange, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinUsesForPinnedVariationChange, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxUsesForPinnedVariationChange, PsoDataType.UInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinUsesForOutroReactVariationChange, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxUsesForOutroReactVariationChange, PsoDataType.UInt, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinUsesForIdleVariationChange, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxUsesForIdleVariationChange, PsoDataType.UInt, 44, 0, 0) - ); - case MetaName.CPlayerCoverClipVariationHelper__Tunables: - return new PsoStructureInfo(MetaName.CPlayerCoverClipVariationHelper__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinUsesForIdleVariationChange, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxUsesForIdleVariationChange, PsoDataType.UInt, 20, 0, 0) - ); - case MetaName.CDynamicCoverHelper__Tunables: - return new PsoStructureInfo(MetaName.CDynamicCoverHelper__Tunables, 0, 0, 176, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.EnableConflictingNormalCollisionRemoval, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.UseStickHistoryForCoverSearch, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.StickDownDuration, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.StickDownMinRange, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.UseCameraOrientationWeighting, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.UseCameraOrientationWhenStill, PsoDataType.Bool, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.UseCameraOrientationForBackwardsDirection, PsoDataType.Bool, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.BehindThreshold, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToWallStanding, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToWallCrouching, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToWallCoverToCover, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.OCMCrouchedForwardClearanceOffset, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.OCMStandingForwardClearanceOffset, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.OCMSideClearanceDepth, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.OCMClearanceCapsuleRadius, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.OCMSideTestDepth, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.OCMCrouchedHeightOffset, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.OCMStandingHeightOffset, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCSideOffset, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCProbeDepth, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCForwardOffset, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCSpacingOffset, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCCapsuleRadius, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCHeightOffset, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.LowCoverProbeHeight, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.HighCoverProbeHeight, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleRadius, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleStartForwardOffset, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleEndForwardOffset, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleStartZOffset, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleEndZOffset, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.CTCMinDistance, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleEdgeProbeXOffset, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleEdgeProbeZOffset, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZDiffBetweenCoverPoints, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZDiffBetweenPedPos, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeadingDiffBetweenCTCPoints, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.PedToCoverCapsuleRadius, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.PedToCoverEndPullBackDistance, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.PedToCoverEndZOffset, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStickInputAngleInfluence, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.IdleYStartOffset, PsoDataType.Float, 168, 0, 0) - ); - case MetaName.CClipScalingHelper__Tunables: - return new PsoStructureInfo(MetaName.CClipScalingHelper__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DisableRotationScaling, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableRotationOvershoot, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableTranslationScaling, PsoDataType.Bool, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableTranslationOvershoot, PsoDataType.Bool, 19, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelocityToScale, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTransVelocity, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRemainingAnimDurationToScale, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAnimRotationDeltaToScale, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAnimTranslationDeltaToScale, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinCurrentRotationDeltaToScale, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultMinRotationScalingValue, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultMaxRotationScalingValue, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultMinTranslationScalingValue, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultMaxTranslationScalingValue, PsoDataType.Float, 56, 0, 0) - ); - case MetaName.CTaskAdvance__Tunables: - return new PsoStructureInfo(MetaName.CTaskAdvance__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeToWaitAtPosition, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenPointUpdates, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenSeekChecksAtTacticalPoint, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskAimFromGround__Tunables: - return new PsoStructureInfo(MetaName.CTaskAimFromGround__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxAimFromGroundTime, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskBoatChase__Tunables: - return new PsoStructureInfo(MetaName.CTaskBoatChase__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceForPursue, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskBoatCombat__Tunables: - return new PsoStructureInfo(MetaName.CTaskBoatCombat__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)384450892), - new PsoStructureEntryInfo(MetaName.MinSpeedForChase, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToLookAheadForCollision, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DepthForLandProbe, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToWait, PsoDataType.Float, 44, 0, 0) - ); - case (MetaName)384450892: - return new PsoStructureInfo((MetaName)384450892, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionProbe, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.LandProbe, PsoDataType.Bool, 10, 0, 0) - ); - case MetaName.CTaskBoatStrafe__Tunables: - return new PsoStructureInfo(MetaName.CTaskBoatStrafe__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AdditionalDistanceForApproach, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AdditionalDistanceForStrafe, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedForStrafe, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.RotationLookAhead, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAdjustmentLookAhead, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.CTaskDraggingToSafety__Tunables: - return new PsoStructureInfo(MetaName.CTaskDraggingToSafety__Tunables, 0, 0, 208, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ObstructionProbe, PsoDataType.Structure, 16, 0, (MetaName)1469164696), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 40, 0, (MetaName)512689970), - new PsoStructureEntryInfo(MetaName.MaxTimeForStream, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverMinDistance, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverMaxDistance, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.LookAtUpdateTime, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.LookAtTime, PsoDataType.SInt, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverWeightDistance, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverWeightUsage, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverWeightValue, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.SeparationPickup, PsoDataType.Float3, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.SeparationDrag, PsoDataType.Float3, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.SeparationPutdown, PsoDataType.Float3, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.AbortAimedAtMinDistance, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverResponseTimeout, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotForPickupDirection, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForHolster, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForPedToBeVeryCloseToCover, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxNumPedsAllowedToBeVeryCloseToCover, PsoDataType.SInt, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenCoverPointSearches, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToSetApproachPosition, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToConsiderTooClose, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToAlwaysLookAtTarget, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeightDifferenceToApproachTarget, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxXYDistanceToApproachTarget, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToBeObstructed, PsoDataType.Float, 192, 0, 0) - ); - case (MetaName)1469164696: - return new PsoStructureInfo((MetaName)1469164696, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Height, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Radius, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraHeightForGround, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)512689970: - return new PsoStructureInfo((MetaName)512689970, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ObstructionProbe, PsoDataType.Bool, 9, 0, 0) - ); - case MetaName.CTaskHeliChase__Tunables: - return new PsoStructureInfo(MetaName.CTaskHeliChase__Tunables, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DriftX, PsoDataType.Structure, 16, 0, (MetaName)1407012688), - new PsoStructureEntryInfo(MetaName.DriftY, PsoDataType.Structure, 40, 0, (MetaName)1407012688), - new PsoStructureEntryInfo(MetaName.DriftZ, PsoDataType.Structure, 64, 0, (MetaName)1407012688), - new PsoStructureEntryInfo(MetaName.MinHeightAboveTerrain, PsoDataType.SInt, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowDownDistanceMin, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowDownDistanceMax, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForOrientation, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.NearDistanceForOrientation, PsoDataType.Float, 108, 0, 0) - ); - case (MetaName)1407012688: - return new PsoStructureInfo((MetaName)1407012688, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.MinValueForCorrection, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxValueForCorrection, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRate, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskHeliCombat__Tunables: - return new PsoStructureInfo(MetaName.CTaskHeliCombat__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Chase, PsoDataType.Structure, 16, 0, (MetaName)960897278) - ); - case (MetaName)960897278: - return new PsoStructureInfo((MetaName)960897278, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.MinSpeed, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetOffsetX, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTargetOffsetX, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetOffsetY, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTargetOffsetY, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetOffsetZ, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTargetOffsetZ, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetOffsetZ_TargetInAir, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTargetOffsetZ_TargetInAir, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CTaskPlaneChase__Tunables: - return new PsoStructureInfo(MetaName.CTaskPlaneChase__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CTaskReactToBuddyShot__Tunables: - return new PsoStructureInfo(MetaName.CTaskReactToBuddyShot__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CTaskVariedAimPose__Tunables: - return new PsoStructureInfo(MetaName.CTaskVariedAimPose__Tunables, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBeforeCanChooseNewPose, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBeforeNewPose, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeBeforeNewPose, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceForMinTimeBeforeNewPose, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceForMaxTimeBeforeNewPose, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidNearbyPedHorizontal, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidNearbyPedVertical, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidNearbyPedDotThreshold, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenReactions, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAnimOffsetMagnitude, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToCareAboutBlockingLineOfSight, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToUseUrgentTransitions, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToUseUrgentTransitionsWhenThreatened, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenReactionChecksForGunAimedAt, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToReactForGunAimedAt, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxClipsToCheckPerFrame, PsoDataType.SInt, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.DebugDraw, PsoDataType.Bool, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultStandingPose, PsoDataType.String, 92, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultCrouchingPose, PsoDataType.String, 96, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)896772506), - new PsoStructureEntryInfo(MetaName.AimPoses, PsoDataType.Array, 104, 0, (MetaName)22) - ); - case (MetaName)896772506: - return new PsoStructureInfo((MetaName)896772506, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.IsCrouching, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.IsStationary, PsoDataType.Bool, 13, 0, 0), - new PsoStructureEntryInfo(MetaName.LoopClipSetId, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.LoopClipId, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2263463390), - new PsoStructureEntryInfo(MetaName.Transitions, PsoDataType.Array, 24, 0, (MetaName)5) - ); - case (MetaName)2263463390: - return new PsoStructureInfo((MetaName)2263463390, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ToPose, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ClipSetId, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.ClipId, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)966624441), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 24, 2, (MetaName)524292) - ); - case MetaName.CTaskVehicleChase__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleChase__Tunables, 0, 0, 264, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CloseDistance, PsoDataType.Structure, 16, 0, (MetaName)653343499), - new PsoStructureEntryInfo(MetaName.Block, PsoDataType.Structure, 32, 0, (MetaName)45194904), - new PsoStructureEntryInfo(MetaName.Pursue, PsoDataType.Structure, 56, 0, (MetaName)2956630463), - new PsoStructureEntryInfo(MetaName.Ram, PsoDataType.Structure, 80, 0, (MetaName)533527745), - new PsoStructureEntryInfo(MetaName.SpinOut, PsoDataType.Structure, 104, 0, (MetaName)2379651736), - new PsoStructureEntryInfo(MetaName.PullAlongside, PsoDataType.Structure, 128, 0, (MetaName)3309127383), - new PsoStructureEntryInfo(MetaName.AggressiveMove, PsoDataType.Structure, 152, 0, (MetaName)2082149421), - new PsoStructureEntryInfo(MetaName.Cheat, PsoDataType.Structure, 216, 0, (MetaName)3284002922), - new PsoStructureEntryInfo(MetaName.MaxDotForHandBrake, PsoDataType.Float, 248, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenCarChaseShockingEvents, PsoDataType.Float, 252, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceForCarChaseShockingEvents, PsoDataType.Float, 256, 0, 0) - ); - case (MetaName)653343499: - return new PsoStructureInfo((MetaName)653343499, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MinDistanceToStart, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToContinue, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)45194904: - return new PsoStructureInfo((MetaName)45194904, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.MaxDotToStartFromAnalyze, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDotToContinueFromAnalyze, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetSpeedToStartFromPursue, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetSpeedToContinueFromPursue, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)2956630463: - return new PsoStructureInfo((MetaName)2956630463, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.MinDotToStartFromAnalyze, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToContinueFromAnalyze, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistance, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)533527745: - return new PsoStructureInfo((MetaName)533527745, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.StraightLineDistance, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetSpeedToStartFromPursue, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetSpeedToContinueFromPursue, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)2379651736: - return new PsoStructureInfo((MetaName)2379651736, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.StraightLineDistance, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetSpeedToStartFromPursue, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetSpeedToContinueFromPursue, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)3309127383: - return new PsoStructureInfo((MetaName)3309127383, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.StraightLineDistance, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetSpeedToStartFromPursue, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetSpeedToContinueFromPursue, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)2082149421: - return new PsoStructureInfo((MetaName)2082149421, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.MaxDistanceToStartFromPursue, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToStartFromPursue, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedLeewayToStartFromPursue, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTargetSteerAngleToStartFromPursue, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToContinueFromPursue, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToContinueFromPursue, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeInStateToContinueFromPursue, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTargetSteerAngleToContinueFromPursue, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelay, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelay, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.WeightToRamFromPursue, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.WeightToBlockFromPursue, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.WeightToSpinOutFromPursue, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.WeightToPullAlongsideFromPursue, PsoDataType.Float, 60, 0, 0) - ); - case (MetaName)3284002922: - return new PsoStructureInfo((MetaName)3284002922, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MinSpeedDifferenceForPowerAdjustment, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedDifferenceForPowerAdjustment, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.PowerForMinAdjustment, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.PowerForMaxAdjustment, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.destroySuppressor, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskVehiclePersuit__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehiclePersuit__Tunables, 0, 0, 184, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ApproachTarget, PsoDataType.Structure, 16, 0, (MetaName)2385857407), - new PsoStructureEntryInfo(MetaName.ObstructionProbeAngleA, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.ObstructionProbeAngleB, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.ObstructionProbeAngleC, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceOnBikeAndTargetUnarmed, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceOnBikeAndTargetArmed, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceInVehicleAndTargetUnarmed, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceInVehicleAndTargetArmed, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceShotAt, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceCouldLeaveCar, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToStopMultiplier, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToStopMassIdeal, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToStopMassWeight, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDriverTimeToLeaveVehicle, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDriverTimeToLeaveVehicle, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPassengerTimeToLeaveVehicle, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPassengerTimeToLeaveVehicle, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedForEarlyCombatExit, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToJumpOutOfVehicle, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBoatOutOfWaterForExit, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidanceMarginForOtherLawEnforcementVehicles, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToWaitForOtherPedToExit, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelayExitTime, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayExitTime, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.PreventShufflingExtraRange, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeWaitForExitBeforeWarp, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTargetStandingOnTrainSpeed, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToFollowInCar, PsoDataType.SInt, 176, 0, 0) - ); - case (MetaName)2385857407: - return new PsoStructureInfo((MetaName)2385857407, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.TargetArriveDist, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToConsiderClose, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedWhenClose, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedWhenObstructedByLawEnforcementPed, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedWhenObstructedByLawEnforcementVehicle, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1208093369, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)4019091857, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2510151940, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1955661253, PsoDataType.SInt, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2422052515, PsoDataType.SInt, 48, 0, 0) - ); - case MetaName.CTaskVehicleCombat__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleCombat__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenShootOutTiresGlobal, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeBetweenShootOutTiresGlobal, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInCombatToShootOutTires, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeInCombatToShootOutTires, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToApplyReactionWhenShootingOutTire, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToPrepareWeapon, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToPrepareWeapon, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1726607124, PsoDataType.UInt, 44, 0, 0) - ); - case MetaName.CTaskSearchBase__Tunables: - return new PsoStructureInfo(MetaName.CTaskSearchBase__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeToGiveUp, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPositionVariance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDirectionVariance, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskSearchInAutomobile__Tunables: - return new PsoStructureInfo(MetaName.CTaskSearchInAutomobile__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FleeOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskSearchInBoat__Tunables: - return new PsoStructureInfo(MetaName.CTaskSearchInBoat__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CTaskSearchInHeli__Tunables: - return new PsoStructureInfo(MetaName.CTaskSearchInHeli__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FleeOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeightAboveTerrain, PsoDataType.SInt, 24, 0, 0) - ); - case MetaName.CTaskSearchOnFoot__Tunables: - return new PsoStructureInfo(MetaName.CTaskSearchOnFoot__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FleeOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.CompletionRadius, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowDownDistance, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeSafeDistance, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MoveBlendRatio, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.CTaskShootOutTire__Tunables: - return new PsoStructureInfo(MetaName.CTaskShootOutTire__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeoutToAcquireLineOfSight, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeoutToAcquireLineOfSight, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenLineOfSightChecks, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToWaitForShot, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToWaitForShot, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWaitForShotFailures, PsoDataType.SInt, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToApplyReaction, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CTaskTargetUnreachable__Tunables: - return new PsoStructureInfo(MetaName.CTaskTargetUnreachable__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fTimeBetweenRouteSearches, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskTargetUnreachableInInterior__Tunables: - return new PsoStructureInfo(MetaName.CTaskTargetUnreachableInInterior__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fDirectionTestProbeLength, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskTargetUnreachableInExterior__Tunables: - return new PsoStructureInfo(MetaName.CTaskTargetUnreachableInExterior__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.RangePercentage, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceFromNavMesh, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MoveBlendRatio, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.CompletionRadius, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToWait, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToWait, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CPedTargetting__Tunables: - return new PsoStructureInfo(MetaName.CPedTargetting__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fExistingTargetScoreWeight, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fTargetingInactiveDisableTime, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fBlockedLosWeighting, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fTimeToIgnoreBlockedLosWeighting, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fPlayerHighThreatWeighting, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)1742395925, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.iTargetNotSeenIgnoreTimeMs, PsoDataType.SInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fPlayerThreatDistance, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fPlayerDirectThreatDistance, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fPlayerBeingTargetedExtraDistance, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.iPlayerDirectThreatTimeMs, PsoDataType.SInt, 56, 0, 0) - ); - case MetaName.CTaskPursueCriminal__Tunables: - return new PsoStructureInfo(MetaName.CTaskPursueCriminal__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToFindVehicle, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToFindVehicle, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeightDifference, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DotProductFacing, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DotProductBehind, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToFollowVehicleBeforeFlee, PsoDataType.SInt, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToSignalVehiclePursuitToCriminal, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToSignalVehiclePursuitToCriminalMin, PsoDataType.SInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToSignalVehiclePursuitToCriminalMax, PsoDataType.SInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DrawDebug, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowPursuePlayer, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo(MetaName.CriminalVehicleMinStartSpeed, PsoDataType.Float, 56, 0, 0) - ); - case MetaName.CTaskReactToPursuit__Tunables: - return new PsoStructureInfo(MetaName.CTaskReactToPursuit__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToFleeInVehicle, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToFleeInVehicle, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeSpeedInVehicle, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskStealVehicle__Tunables: - return new PsoStructureInfo(MetaName.CTaskStealVehicle__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToFindVehicle, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToPursueVehicle, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToRunToVehicle, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.CanStealPlayersVehicle, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.CanStealCarsAtLights, PsoDataType.Bool, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.CanStealParkedCars, PsoDataType.Bool, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.CanStealStationaryCars, PsoDataType.Bool, 31, 0, 0) - ); - case MetaName.CLookAtHistory__Tunables: - return new PsoStructureInfo(MetaName.CLookAtHistory__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.HistoryCosineThreshold, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MemoryDuration, PsoDataType.UInt, 20, 0, 0) - ); - case MetaName.CAmbientLookAt__Tunables: - return new PsoStructureInfo(MetaName.CAmbientLookAt__Tunables, 0, 0, 416, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultLookAtThreshold, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultDistanceFromWorldCenter, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtendedDistanceFromWorldCenter, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToScanLookAts, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.BaseTimeToLook, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AITimeBetweenLookAtsFailureMin, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AITimeBetweenLookAtsFailureMax, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerTimeBetweenLookAtsMin, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerTimeBetweenLookAtsMax, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerTimeMyVehicleLookAtsMin, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerTimeMyVehicleLookAtsMax, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenScenarioScans, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioScanOffsetDistance, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioScanRadius, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPlayerScore, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.BasicPedScore, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.BasicVehicleScore, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.BasicObjectScore, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.BehindPedModifier, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerPedModifier, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.WalkingRoundPedModifier, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.RunningPedModifier, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.ClimbingOrJumpingPedModifier, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.FightingModifier, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.JackingModifier, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.HangingAroundVehicleModifier, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioToScenarioPedModifier, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.GangScenarioPedToPlayerModifier, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.ApproachingPlayerModifier, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.ClosePlayerModifier, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.InRangePlayerModifier, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.InRangeDrivingPlayerModifier, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.HoldingWeaponPlayerModifier, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.CoveredInBloodPlayerModifier, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.RagdollingModifier, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.PickingUpBikeModifier, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.RecklessCarModifier, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.RecentlyLookedAtPlayerModifier, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.RecentlyLookedAtEntityModifier, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.HighImportanceModifier, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.MediumImportanceModifier, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.LowImportanceModifier, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.ModelNamesToConsiderPlayersForScoringPurposes, PsoDataType.Array, 184, 0, (MetaName)43), - new PsoStructureEntryInfo(MetaName.RecklessCarSpeedMin, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.RecklessCarSpeedMax, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.CarSirenModifier, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerCopModifier, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerSexyPedModifier, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerSwankyCarModifier, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerCopCarModifier, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerHasslingModifier, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.HotPedMinDistance, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.HotPedMaxDistance, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.HotPedMinDotAngle, PsoDataType.Float, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.HotPedMaxDotAngle, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo(MetaName.HotPedMaxHeightDifference, PsoDataType.Float, 248, 0, 0), - new PsoStructureEntryInfo(MetaName.InRangePlayerDistanceThreshold, PsoDataType.Float, 252, 0, 0), - new PsoStructureEntryInfo(MetaName.InRangePlayerInRaceDistanceThreshold, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.ClosePlayerDistanceThreshold, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo(MetaName.ApproachingPlayerDistanceThreshold, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo(MetaName.ApproachingPlayerCosineThreshold, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo(MetaName.RagdollPlayerDistanceThreshold, PsoDataType.Float, 272, 0, 0), - new PsoStructureEntryInfo(MetaName.LookingInRangePlayerMaxDotAngle, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVelocityForVehicleLookAtSqr, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerSwankyCarMin, PsoDataType.UByte, 284, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerSwankyCarMax, PsoDataType.UByte, 285, 0, 0), - new PsoStructureEntryInfo(MetaName.HotPedRenderDebug, PsoDataType.Bool, 286, 0, 0), - new PsoStructureEntryInfo(MetaName.HotPedDisableSexinessFlagChecks, PsoDataType.Bool, 287, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBeforeSwitchLookAt, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLookBackAngle, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTurnSpeedMotionOverPOI, PsoDataType.Float, 296, 0, 0), - new PsoStructureEntryInfo(MetaName.SpeedForNarrowestAnglePickPOI, PsoDataType.Float, 300, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAnglePickPOI, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAnglePickPOI, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitchingAnglePickPOI, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerLookAtDebugDraw, PsoDataType.Bool, 316, 0, 0), - new PsoStructureEntryInfo(MetaName.CameraLookAtTurnRate, PsoDataType.Enum, 320, 0, MetaName.LookIkTurnRate), - new PsoStructureEntryInfo(MetaName.POILookAtTurnRate, PsoDataType.Enum, 324, 0, MetaName.LookIkTurnRate), - new PsoStructureEntryInfo(MetaName.MotionLookAtTurnRate, PsoDataType.Enum, 328, 0, MetaName.LookIkTurnRate), - new PsoStructureEntryInfo(MetaName.VehicleJumpLookAtTurnRate, PsoDataType.Enum, 332, 0, MetaName.LookIkTurnRate), - new PsoStructureEntryInfo(MetaName.CameraLookAtBlendRate, PsoDataType.Enum, 336, 0, MetaName.LookIkBlendRate), - new PsoStructureEntryInfo(MetaName.POILookAtBlendRate, PsoDataType.Enum, 340, 0, MetaName.LookIkBlendRate), - new PsoStructureEntryInfo(MetaName.MotionLookAtBlendRate, PsoDataType.Enum, 344, 0, MetaName.LookIkBlendRate), - new PsoStructureEntryInfo(MetaName.VehicleJumpLookAtBlendRate, PsoDataType.Enum, 348, 0, MetaName.LookIkBlendRate), - new PsoStructureEntryInfo(MetaName.CameraLookAtRotationLimit, PsoDataType.Enum, 352, 0, MetaName.LookIkRotationLimit), - new PsoStructureEntryInfo(MetaName.POILookAtRotationLimit, PsoDataType.Enum, 356, 0, MetaName.LookIkRotationLimit), - new PsoStructureEntryInfo(MetaName.MotionLookAtRotationLimit, PsoDataType.Enum, 360, 0, MetaName.LookIkRotationLimit), - new PsoStructureEntryInfo(MetaName.AITimeWaitingToCrossRoadMin, PsoDataType.Float, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.AITimeWaitingToCrossRoadMax, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo(MetaName.fAIGreetingDistanceMin, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.fAIGreetingDistanceMax, PsoDataType.Float, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.uAITimeBetweenGreeting, PsoDataType.UInt, 380, 0, 0), - new PsoStructureEntryInfo(MetaName.fAIGreetingPedModifier, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.uTimeBetweenLookBacks, PsoDataType.UInt, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.uTimeToLookBack, PsoDataType.UInt, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.uAimToIdleLookAtTime, PsoDataType.UInt, 396, 0, 0), - new PsoStructureEntryInfo(MetaName.fAimToIdleBreakOutAngle, PsoDataType.Float, 400, 0, 0), - new PsoStructureEntryInfo(MetaName.fAimToIdleAngleLimitLeft, PsoDataType.Float, 404, 0, 0), - new PsoStructureEntryInfo(MetaName.fAimToIdleAngleLimitRight, PsoDataType.Float, 408, 0, 0), - new PsoStructureEntryInfo((MetaName)3044687592, PsoDataType.UInt, 412, 0, 0) - ); - case MetaName.CTaskAmbientClips__Tunables: - return new PsoStructureInfo(MetaName.CTaskAmbientClips__Tunables, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.LowLodBaseClipSetId, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultChanceOfStandingWhileMoving, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTimeBetweenIdles, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeAfterGunshotToPlayIdles, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeAfterGunshotForPlayerToPlayIdles, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.playerNearToHangoutDistanceInMetersSquared, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.minSecondsNearPlayerUntilHangoutQuit, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.maxSecondsNearPlayerUntilHangoutQuit, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.maxHangoutChatDistSq, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.VFXCullRangeScaleNotVisible, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.SecondsSinceInWaterThatCountsAsWet, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVehicleVelocityForAmbientIdles, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSteeringAngleForAmbientIdles, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeSinceGetUpForAmbientIdles, PsoDataType.UInt, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)110858295, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)990057437, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.fArgumentProbability, PsoDataType.Float, 80, 0, 0) - ); - case MetaName.CTaskChat__Tunables: - return new PsoStructureInfo(MetaName.CTaskChat__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.HeadingToleranceDegrees, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWaitTime, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskCuffed__Tunables: - return new PsoStructureInfo(MetaName.CTaskCuffed__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.HandcuffedClipSetId, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.ActionsHandcuffedNetworkId, PsoDataType.String, 20, 7, 0) - ); - case MetaName.CTaskInCustody__Tunables: - return new PsoStructureInfo(MetaName.CTaskInCustody__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AbandonDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowRadius, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.FollowOffset, PsoDataType.Float3, 32, 0, 0) - ); - case MetaName.CTaskFlyingWander__Tunables: - return new PsoStructureInfo(MetaName.CTaskFlyingWander__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.RangeOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingWanderChange, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskPlayerOnFoot__Tunables: - return new PsoStructureInfo(MetaName.CTaskPlayerOnFoot__Tunables, 0, 0, 368, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ParachutePack, PsoDataType.Structure, 16, 0, (MetaName)810561649), - new PsoStructureEntryInfo(MetaName.ScubaGear, PsoDataType.Structure, 88, 0, (MetaName)4252665724), - new PsoStructureEntryInfo((MetaName)973020790, PsoDataType.Structure, 152, 0, (MetaName)2770060121), - new PsoStructureEntryInfo(MetaName.EvaluateThreatFromCoverPoints, PsoDataType.Bool, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.UseThreatWeighting, PsoDataType.Bool, 209, 0, 0), - new PsoStructureEntryInfo((MetaName)1978058747, PsoDataType.Bool, 210, 0, 0), - new PsoStructureEntryInfo((MetaName)3319528567, PsoDataType.Bool, 211, 0, 0), - new PsoStructureEntryInfo(MetaName.ArrestDistance, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.ArrestDot, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxEncumberedClimbHeight, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTrainClimbHeight, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.TakeCustodyDistance, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.UncuffDistance, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToTalk, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToTalk, PsoDataType.Float, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenPlayerEvents, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceBetweenAiPedsCoverAndPlayersCover, PsoDataType.Float, 248, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceAiPedFromTheirCoverToAbortPlayerEnterCover, PsoDataType.Float, 252, 0, 0), - new PsoStructureEntryInfo(MetaName.SmallCapsuleCoverPenalty, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.SmallCapsuleCoverRadius, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo(MetaName.PriorityCoverWeight, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo(MetaName.EdgeCoverWeight, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo(MetaName.DistToCoverWeightThreat, PsoDataType.Float, 272, 0, 0), - new PsoStructureEntryInfo(MetaName.DistToCoverWeight, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo(MetaName.DistToCoverWeightNoStickBonus, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo(MetaName.VeryCloseToCoverDist, PsoDataType.Float, 284, 0, 0), - new PsoStructureEntryInfo(MetaName.VeryCloseToCoverWeight, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredDirToCoverWeight, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredDirToCoverAimingWeight, PsoDataType.Float, 296, 0, 0), - new PsoStructureEntryInfo(MetaName.ThreatDirWeight, PsoDataType.Float, 300, 0, 0), - new PsoStructureEntryInfo(MetaName.ThreatEngageDirWeight, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverDirToCameraWeightMin, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverDirToCameraWeightMax, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverDirToCameraWeightMaxAimGun, PsoDataType.Float, 316, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverDirToCameraWeightMaxScaleDist, PsoDataType.Float, 320, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredDirToCoverMinDot, PsoDataType.Float, 324, 0, 0), - new PsoStructureEntryInfo(MetaName.CameraDirToCoverMinDot, PsoDataType.Float, 328, 0, 0), - new PsoStructureEntryInfo(MetaName.StaticLosTest1Offset, PsoDataType.Float, 332, 0, 0), - new PsoStructureEntryInfo(MetaName.StaticLosTest2Offset, PsoDataType.Float, 336, 0, 0), - new PsoStructureEntryInfo(MetaName.CollisionLosHeightOffset, PsoDataType.Float, 340, 0, 0), - new PsoStructureEntryInfo(MetaName.VeryCloseIgnoreDesAndCamToleranceDist, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo(MetaName.VeryCloseIgnoreDesAndCamToleranceDistAimGun, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo(MetaName.DeadZoneStickNorm, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.SearchThreatMaxDot, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo((MetaName)3328482583, PsoDataType.String, 360, 7, 0), - new PsoStructureEntryInfo((MetaName)1221942053, PsoDataType.Bool, 364, 0, 0), - new PsoStructureEntryInfo((MetaName)1138836382, PsoDataType.Bool, 365, 0, 0) - ); - case (MetaName)810561649: - return new PsoStructureInfo((MetaName)810561649, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.VelocityInheritance, PsoDataType.Structure, 8, 0, (MetaName)1276417684), - new PsoStructureEntryInfo(MetaName.AttachOffsetX, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOffsetY, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOffsetZ, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOrientationX, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOrientationY, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOrientationZ, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendInDeltaForPed, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendInDeltaForProp, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.PhaseToBlendOut, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutDelta, PsoDataType.Float, 68, 0, 0) - ); - case (MetaName)1276417684: - return new PsoStructureInfo((MetaName)1276417684, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)4252665724: - return new PsoStructureInfo((MetaName)4252665724, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.VelocityInheritance, PsoDataType.Structure, 8, 0, (MetaName)2201360486), - new PsoStructureEntryInfo(MetaName.AttachOffsetX, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOffsetY, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOffsetZ, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOrientationX, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOrientationY, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachOrientationZ, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.PhaseToBlendOut, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutDelta, PsoDataType.Float, 60, 0, 0) - ); - case (MetaName)2201360486: - return new PsoStructureInfo((MetaName)2201360486, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)2770060121: - return new PsoStructureInfo((MetaName)2770060121, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.VelocityInheritance, PsoDataType.Structure, 8, 0, (MetaName)549752042), - new PsoStructureEntryInfo(MetaName.PhaseToBlendOut, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutDelta, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3586541171, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)4160387967, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo((MetaName)2801649672, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo((MetaName)2028074979, PsoDataType.String, 52, 7, 0) - ); - case (MetaName)549752042: - return new PsoStructureInfo((MetaName)549752042, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskSwimmingWander__Tunables: - return new PsoStructureInfo(MetaName.CTaskSwimmingWander__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SurfaceSkimmerDepth, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.NormalPreferredDepth, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidanceProbeLength, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidanceProbePullback, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidanceProbeInterval, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AvoidanceSteerAngleDegrees, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.InstantProbeDurationMin, PsoDataType.UInt, 40, 0, 0) - ); - case MetaName.CTaskUnalerted__Tunables: - return new PsoStructureInfo(MetaName.CTaskUnalerted__Tunables, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterFailureMin, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterFailureMax, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterFailureWhenStationary, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterNotAbleToSearch, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterSuccessMin, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterSuccessMax, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioDelayInitialMin, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.ScenarioDelayInitialMax, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBeforeDriverAnimCheck, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenSearchesForNextScenarioInChain, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeMinBeforeLastPoint, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeMinBeforeLastPointType, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.PavementFloodFillSearchRadius, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.WaitTimeAfterFailedVehExit, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToReturnToLastUsedVehicle, PsoDataType.Float, 72, 0, 0) - ); - case MetaName.CTaskWander__Tunables: - return new PsoStructureInfo(MetaName.CTaskWander__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.uNumPedsToTransitionToRainPerPeriod, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fSecondsInRainTransitionPeriod, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskWanderInArea__Tunables: - return new PsoStructureInfo(MetaName.CTaskWanderInArea__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinWaitTime, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWaitTime, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CDispatchSpawnHelper__Tunables: - return new PsoStructureInfo(MetaName.CDispatchSpawnHelper__Tunables, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Restrictions, PsoDataType.Structure, 16, 0, (MetaName)2369454477), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 32, 0, (MetaName)3541869149), - new PsoStructureEntryInfo(MetaName.IdealSpawnDistance, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotForInFront, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceTraveledMultiplier, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToBeConsideredEscapingInVehicle, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForDispatchPosition, PsoDataType.Float, 64, 0, 0) - ); - case (MetaName)2369454477: - return new PsoStructureInfo((MetaName)2369454477, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MaxDistanceFromCameraForViewportChecks, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusForViewportCheck, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)3541869149: - return new PsoStructureInfo((MetaName)3541869149, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.DispatchNode, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.FindSpawnPointInDirection, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.IncidentLocation, PsoDataType.Bool, 11, 0, 0) - ); - case MetaName.CDispatchAdvancedSpawnHelper__Tunables: - return new PsoStructureInfo(MetaName.CDispatchAdvancedSpawnHelper__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)3744572044), - new PsoStructureEntryInfo(MetaName.TimeBetweenInvalidateInvalidDispatchVehicles, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenMarkDispatchVehiclesForDespawn, PsoDataType.Float, 36, 0, 0) - ); - case (MetaName)3744572044: - return new PsoStructureInfo((MetaName)3744572044, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0) - ); - case MetaName.CDispatchHelperSearchOnFoot__Tunables: - return new PsoStructureInfo(MetaName.CDispatchHelperSearchOnFoot__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2350715434), - new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo(MetaName.MaxDistanceFromNavMesh, PsoDataType.Float, 32, 0, 0) - ); - case (MetaName)2350715434: - return new PsoStructureInfo((MetaName)2350715434, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.MinTimeSinceLastSpotted, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeSinceLastSpotted, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRadiusForMinTimeSinceLastSpotted, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRadiusForMaxTimeSinceLastSpotted, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngle, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.UseLastSeenPosition, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.UseByDefault, PsoDataType.Bool, 33, 0, 0), - new PsoStructureEntryInfo(MetaName.UseEnclosedSearchRegions, PsoDataType.Bool, 34, 0, 0) - ); - case MetaName.CDispatchHelperSearchInAutomobile__Tunables: - return new PsoStructureInfo(MetaName.CDispatchHelperSearchInAutomobile__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2350715434), - new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo(MetaName.MaxDistanceFromRoadNode, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.CDispatchHelperSearchInBoat__Tunables: - return new PsoStructureInfo(MetaName.CDispatchHelperSearchInBoat__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2350715434), - new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.CDispatchHelperSearchInHeli__Tunables: - return new PsoStructureInfo(MetaName.CDispatchHelperSearchInHeli__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2350715434), - new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case MetaName.CDispatchHelperVolumes__Tunables: - return new PsoStructureInfo(MetaName.CDispatchHelperVolumes__Tunables, 0, 0, 152, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)3452608618), - new PsoStructureEntryInfo(MetaName.LocationForNearestCarNodeOverrides, PsoDataType.Structure, 32, 0, (MetaName)3249772165), - new PsoStructureEntryInfo(MetaName.EnclosedSearchRegions, PsoDataType.Structure, 72, 0, (MetaName)898276026), - new PsoStructureEntryInfo(MetaName.BlockingAreas, PsoDataType.Structure, 112, 0, (MetaName)2312163633) - ); - case (MetaName)3452608618: - return new PsoStructureInfo((MetaName)3452608618, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.LocationForNearestCarNodeOverrides, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.EnclosedSearchRegions, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.BlockingAreas, PsoDataType.Bool, 11, 0, 0) - ); - case (MetaName)3249772165: - return new PsoStructureInfo((MetaName)3249772165, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1419890352), - new PsoStructureEntryInfo(MetaName.AngledAreas, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3809247475), - new PsoStructureEntryInfo(MetaName.Spheres, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case (MetaName)898276026: - return new PsoStructureInfo((MetaName)898276026, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2129766809), - new PsoStructureEntryInfo(MetaName.AngledAreas, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)253441159), - new PsoStructureEntryInfo(MetaName.Spheres, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case (MetaName)2312163633: - return new PsoStructureInfo((MetaName)2312163633, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3558216355), - new PsoStructureEntryInfo(MetaName.AngledAreas, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1335944774), - new PsoStructureEntryInfo(MetaName.Spheres, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case (MetaName)1419890352: - return new PsoStructureInfo((MetaName)1419890352, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.AngledArea, PsoDataType.Structure, 8, 0, (MetaName)3558216355), - new PsoStructureEntryInfo(MetaName.Position, PsoDataType.Structure, 72, 0, (MetaName)2431379611) - ); - case (MetaName)3558216355: - return new PsoStructureInfo((MetaName)3558216355, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 8, 0, (MetaName)2431379611), - new PsoStructureEntryInfo(MetaName.End, PsoDataType.Structure, 32, 0, (MetaName)2431379611), - new PsoStructureEntryInfo(MetaName.Width, PsoDataType.Float, 56, 0, 0) - ); - case (MetaName)2431379611: - return new PsoStructureInfo((MetaName)2431379611, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)2129766809: - return new PsoStructureInfo((MetaName)2129766809, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.AngledArea, PsoDataType.Structure, 8, 0, (MetaName)3558216355), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)4002001992), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 72, 0, (MetaName)2097153) - ); - case MetaName.CWantedHelicopterDispatch__Tunables: - return new PsoStructureInfo(MetaName.CWantedHelicopterDispatch__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenSpawnAttempts, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpawnTimeForPoliceHeliAfterDestroyed, PsoDataType.UInt, 20, 0, 0) - ); - case MetaName.CPoliceBoatDispatch__Tunables: - return new PsoStructureInfo(MetaName.CPoliceBoatDispatch__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenSpawnAttempts, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CEventPedJackingMyVehicle__Tunables: - return new PsoStructureInfo(MetaName.CEventPedJackingMyVehicle__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CEventEncroachingPed__Tunables: - return new PsoStructureInfo(MetaName.CEventEncroachingPed__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CEventRequestHelp__Tunables: - return new PsoStructureInfo(MetaName.CEventRequestHelp__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxRangeWithoutRadioForFistFights, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CEventCrimeCryForHelp__Tunables: - return new PsoStructureInfo(MetaName.CEventCrimeCryForHelp__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1405855513, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)4108300187, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1818772152, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)2579479361, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)977600457, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.CEventSuspiciousActivity__Tunables: - return new PsoStructureInfo(MetaName.CEventSuspiciousActivity__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceToBeConsideredSameEvent, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CEventAgitated__Tunables: - return new PsoStructureInfo(MetaName.CEventAgitated__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeToLive, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AmbientEventLifetime, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TriggerAmbientReactionChances, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForAmbientReaction, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForAmbientReaction, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeForAmbientReaction, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeForAmbientReaction, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AmbientEventType, PsoDataType.Enum, 44, 0, MetaName.AmbientEventType) - ); - case MetaName.CEventRespondedToThreat__Tunables: - return new PsoStructureInfo(MetaName.CEventRespondedToThreat__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskCallPolice__Tunables: - return new PsoStructureInfo(MetaName.CTaskCallPolice__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeMovingAwayToGiveToWitness, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeSinceTalkingEndedToMakeCall, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeSinceTargetTalkingEndedToMakeCall, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeTargetHasBeenTalkingToMakeCall, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeSinceTalkingEndedToSayContextForCall, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeSpentInEarLoopToSayContextForCall, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToSpendInEarLoopToPutDownPhone, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSpendInEarLoopToPutDownPhone, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.CTaskConversationHelper__Tunables: - return new PsoStructureInfo(MetaName.CTaskConversationHelper__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fMinSecondsDelayBetweenPhoneLines, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxSecondsDelayBetweenPhoneLines, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinSecondsDelayBetweenChatLines, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxSecondsDelayBetweenChatLines, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceSquaredToPlayerForAudio, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fChanceOfConversationRant, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fChanceOfArgumentChallenge, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fChanceOfArgumentChallengeBeingAccepted, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.uTimeInMSUntilNewWeirdPedComment, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.uMaxTimeInMSToPlayRingTone, PsoDataType.UInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.uTimeToWaitAfterNewSayFailureInSeconds, PsoDataType.UByte, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.uTicksUntilHangoutConversationCheck, PsoDataType.UByte, 57, 0, 0) - ); - case MetaName.CLegIkSolver__Tunables: - return new PsoStructureInfo(MetaName.CLegIkSolver__Tunables, 0, 0, 392, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.PelvisInterp, PsoDataType.Structure, 16, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.PelvisInterpMoving, PsoDataType.Structure, 40, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.PelvisInterpOnDynamic, PsoDataType.Structure, 64, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.FootInterp, PsoDataType.Structure, 88, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.FootInterpIntersecting, PsoDataType.Structure, 112, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.FootInterpMoving, PsoDataType.Structure, 136, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.FootInterpIntersectingMoving, PsoDataType.Structure, 160, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.FootInterpOnDynamic, PsoDataType.Structure, 184, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.StairsPelvisInterp, PsoDataType.Structure, 208, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.StairsPelvisInterpMoving, PsoDataType.Structure, 232, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.StairsPelvisInterpCoverAim, PsoDataType.Structure, 256, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.StairsFootInterp, PsoDataType.Structure, 280, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.StairsFootInterpIntersecting, PsoDataType.Structure, 304, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.StairsFootInterpCoverAim, PsoDataType.Structure, 328, 0, (MetaName)1560218317), - new PsoStructureEntryInfo(MetaName.UpStairsPelvisMaxDeltaZMoving, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.UpStairsPelvisMaxNegativeDeltaZMoving, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo(MetaName.DownStairsPelvisMaxDeltaZMoving, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo(MetaName.DownStairsPelvisMaxNegativeDeltaZMoving, PsoDataType.Float, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.StairsPelvisMaxNegativeDeltaZCoverAim, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo(MetaName.VelMagStairsSpringMin, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.VelMagStairsSpringMax, PsoDataType.Float, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.StairsSpringMultiplierMin, PsoDataType.Float, 380, 0, 0), - new PsoStructureEntryInfo(MetaName.StairsSpringMultiplierMax, PsoDataType.Float, 384, 0, 0) - ); - case (MetaName)1560218317: - return new PsoStructureInfo((MetaName)1560218317, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.AccelerationBased, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleAccelWithDelta, PsoDataType.Bool, 13, 0, 0), - new PsoStructureEntryInfo(MetaName.ZeroRateOnDirectionChange, PsoDataType.Bool, 14, 0, 0), - new PsoStructureEntryInfo(MetaName.AccelRate, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CMiniMap__Tunables: - return new PsoStructureInfo(MetaName.CMiniMap__Tunables, 0, 0, 352, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Sonar, PsoDataType.Structure, 16, 0, (MetaName)53366421), - new PsoStructureEntryInfo(MetaName.HealthBar, PsoDataType.Structure, 132, 0, (MetaName)1902464991), - new PsoStructureEntryInfo(MetaName.Bitmap, PsoDataType.Structure, 140, 0, (MetaName)2026887270), - new PsoStructureEntryInfo((MetaName)1791333322, PsoDataType.Structure, 172, 0, (MetaName)1690619373), - new PsoStructureEntryInfo(MetaName.Camera, PsoDataType.Structure, 200, 0, (MetaName)283649933), - new PsoStructureEntryInfo(MetaName.Tiles, PsoDataType.Structure, 300, 0, (MetaName)3031405081), - new PsoStructureEntryInfo(MetaName.Overlay, PsoDataType.Structure, 320, 0, (MetaName)2449081679), - new PsoStructureEntryInfo(MetaName.Display, PsoDataType.Structure, 340, 0, (MetaName)1640186987) - ); - case (MetaName)53366421: - return new PsoStructureInfo((MetaName)53366421, 0, 0, 116, - new PsoStructureEntryInfo(MetaName.fSoundRange_BarelyAudible, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_MostlyAudible, PsoDataType.Float, 4, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_ClearlyAudible, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_Whisper, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_Talking, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_Shouting, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_Megaphone, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_FootstepBase, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_HeavyFootstep, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_FootstepFoliage, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_LandFromFall, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_WeaponSpinUp, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_Gunshot, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_SilencedGunshot, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)60903513, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_Explosion, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_ObjectCollision, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_GlassBreak, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_CarHorn, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_CarLowSpeed, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_CarHighSpeed, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_WaterSplashSmall, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.fSoundRange_WaterSplashLarge, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinListenerRangeToDrawSonarBlips, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.fRainSnowSoundReductionAmount, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.fRadioSoundReductionAmount, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.fRadioSoundReductionDistance, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.fConversationSoundReductionAmount, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.fConversationSoundReductionDistance, PsoDataType.Float, 112, 0, 0) - ); - case (MetaName)1902464991: - return new PsoStructureInfo((MetaName)1902464991, 0, 0, 8, - new PsoStructureEntryInfo(MetaName.fStaminaDepletionBlinkPercentage, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.iHealthDepletionBlinkPercentage, PsoDataType.SInt, 4, 0, 0) - ); - case (MetaName)2026887270: - return new PsoStructureInfo((MetaName)2026887270, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)2262853888, PsoDataType.UShort, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)735818480, PsoDataType.UShort, 2, 0, 0), - new PsoStructureEntryInfo((MetaName)4138858726, PsoDataType.Float2, 4, 0, 0), - new PsoStructureEntryInfo((MetaName)3205558428, PsoDataType.Float2, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)1388742013, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3712817443, PsoDataType.Enum, 24, 0, (MetaName)1049598006), - new PsoStructureEntryInfo((MetaName)1737696498, PsoDataType.Enum, 28, 0, (MetaName)1049598006) - ); - case (MetaName)1690619373: - return new PsoStructureInfo((MetaName)1690619373, 0, 0, 28, - new PsoStructureEntryInfo(MetaName.fWorldX, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.fWorldY, PsoDataType.Float, 4, 0, 0), - new PsoStructureEntryInfo(MetaName.fWorldW, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fWorldH, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fBaseAlpha, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2170322240, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fFowWaterHeight, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)283649933: - return new PsoStructureInfo((MetaName)283649933, 0, 0, 100, - new PsoStructureEntryInfo((MetaName)3708284943, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)1172300147, PsoDataType.Float, 4, 0, 0), - new PsoStructureEntryInfo(MetaName.fExteriorFootZoom, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fExteriorFootZoomRunning, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fExteriorFootZoomWanted, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fExteriorFootZoomWantedRunning, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1296848312, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)187030077, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fInteriorFootZoom, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)2652932444, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2075786872, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fParachutingZoom, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fVehicleStaticZoom, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fVehicleStaticWantedZoom, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.fVehicleMovingZoom, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.fVehicleMovingWantedZoom, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.fVehicleSpeedZoomScalar, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.fVehicleTilt, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.fVehicleOffset, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1912611271, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)4158832075, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)2229181525, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)1723892124, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.fRangeZoomedScalarStandard, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.fRangeZoomedScalarPlane, PsoDataType.Float, 96, 0, 0) - ); - case (MetaName)3031405081: - return new PsoStructureInfo((MetaName)3031405081, 0, 0, 20, - new PsoStructureEntryInfo((MetaName)2152230135, PsoDataType.Float2, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)4201231105, PsoDataType.Float2, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)142519492, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)866622976, PsoDataType.Bool, 17, 0, 0) - ); - case (MetaName)2449081679: - return new PsoStructureInfo((MetaName)2449081679, 0, 0, 20, - new PsoStructureEntryInfo(MetaName.vPos, PsoDataType.Float2, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.vScale, PsoDataType.Float2, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fDisplayZ, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)1640186987: - return new PsoStructureInfo((MetaName)1640186987, 0, 0, 12, - new PsoStructureEntryInfo((MetaName)717614933, PsoDataType.UShort, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)81490677, PsoDataType.UShort, 2, 0, 0), - new PsoStructureEntryInfo((MetaName)2014573657, PsoDataType.Float, 4, 0, 0), - new PsoStructureEntryInfo((MetaName)3269987179, PsoDataType.Float, 8, 0, 0) - ); - case MetaName.CTaskMotionAiming__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionAiming__Tunables, 0, 0, 144, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.PlayerMoveAccel, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerMoveDecel, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.PedMoveAccel, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.PedMoveDecel, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.FromOnFootAccelerationMod, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.WalkAngAccel, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.RunAngAccel, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1722146938, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1350763236, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)3375971933, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3611401160, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.Turn180ActivationAngle, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.Turn180ConsistentAngleTolerance, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.Turn, PsoDataType.Structure, 72, 0, (MetaName)150934045), - new PsoStructureEntryInfo(MetaName.PitchChangeRate, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchChangeRateAcceleration, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.OverwriteMaxPitch, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.AimIntroMaxAngleChangeRate, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.AimIntroMinPhaseChangeRate, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.AimIntroMaxPhaseChangeRate, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.AimIntroMaxTimedOutPhaseChangeRate, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerIdleIntroAnimRate, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingWalkAnimRateMin, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingWalkAnimRateMax, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingWalkAnimRateAcceleration, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.DoPostCameraClipUpdateForPlayer, PsoDataType.Bool, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableIkForAI, PsoDataType.Bool, 133, 0, 0), - new PsoStructureEntryInfo((MetaName)122800807, PsoDataType.Bool, 134, 0, 0), - new PsoStructureEntryInfo((MetaName)259313148, PsoDataType.Bool, 135, 0, 0), - new PsoStructureEntryInfo((MetaName)2900191858, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)827074596, PsoDataType.Bool, 140, 0, 0) - ); - case (MetaName)150934045: - return new PsoStructureInfo((MetaName)150934045, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MaxVariationForCurrentPitch, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVariationForDesiredPitch, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.CTaskBirdLocomotion__Tunables: - return new PsoStructureInfo(MetaName.CTaskBirdLocomotion__Tunables, 0, 0, 136, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinWaitTimeBetweenTakeOffsMS, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWaitTimeBetweenTakeOffsMS, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTakeOffRate, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTakeOffRate, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTakeOffHeadingChangeRate, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTakeOffHeadingChangeRate, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2759154614, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToFlapMin, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToFlapMax, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1388183900, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceNoTimeslicingHeadingDiff, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceFromPlayerToDeleteStuckBird, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeUntilDeletionWhenStuckOffscreen, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeWhenStuckToIgnoreBird, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.HighLodWalkHeadingLerpRate, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.LowLodWalkHeadingLerpRate, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)325409255, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)2032071225, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)171073592, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)2122727094, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)578605354, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)961953658, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)291845288, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)1918070033, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)677105748, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)2691956573, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)27278755, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)2575647854, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)3370383430, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)951644869, PsoDataType.String, 132, 7, 0) - ); - case MetaName.CTaskMotionSwimming__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionSwimming__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinStruggleTime, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStruggleTime, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4258712195), - new PsoStructureEntryInfo(MetaName.ScubaGearVariations, PsoDataType.Array, 24, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.fCargoFuel), - new PsoStructureEntryInfo(MetaName.ScubaMaskProps, PsoDataType.Array, 40, 0, (MetaName)5) - ); - case (MetaName)4258712195: - return new PsoStructureInfo((MetaName)4258712195, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3020467458), - new PsoStructureEntryInfo(MetaName.Variations, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case (MetaName)3020467458: - return new PsoStructureInfo((MetaName)3020467458, 0, 0, 72, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2469984956), - new PsoStructureEntryInfo(MetaName.Wearing, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ScubaGearWithLightsOn, PsoDataType.Structure, 24, 0, (MetaName)2354064210), - new PsoStructureEntryInfo(MetaName.ScubaGearWithLightsOff, PsoDataType.Structure, 48, 0, (MetaName)2354064210) - ); - case (MetaName)2354064210: - return new PsoStructureInfo((MetaName)2354064210, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), - new PsoStructureEntryInfo(MetaName.DrawableId, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DrawableAltId, PsoDataType.UInt, 16, 0, 0) - ); - case (MetaName)2469984956: - return new PsoStructureInfo((MetaName)2469984956, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.DrawableIds, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case MetaName.fCargoFuel: - return new PsoStructureInfo(MetaName.fCargoFuel, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Index, PsoDataType.SInt, 12, 0, 0) - ); - case MetaName.CTaskMotionBasicLocomotionLowLod__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionBasicLocomotionLowLod__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateAcceleration, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceUpdatesWhenTurningStartThresholdRadians, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceUpdatesWhenTurningStopThresholdRadians, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CTaskFishLocomotion__Tunables: - return new PsoStructureInfo(MetaName.CTaskFishLocomotion__Tunables, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.StartTurnThresholdDegrees, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StopTurnThresholdDegrees, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTurnApproachRate, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealTurnApproachRate, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)190400066, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TurnAcceleration, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)2035076014, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchAcceleration, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2691956573, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1242076965, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)2945548240, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)3350282721, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.FishOutOfWaterDelay, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1246801857, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.AssistanceAngle, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraHeadingRate, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.SurfaceProbeHead, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.SurfaceProbeTail, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.SurfacePitchLerpRate, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.SurfaceHeightFallingLerpRate, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.SurfaceHeightRisingLerpRate, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.SurfaceHeightFollowingTriggerRange, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)2334883967, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)487169156, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)951644869, PsoDataType.String, 112, 7, 0), - new PsoStructureEntryInfo((MetaName)1984559896, PsoDataType.Float, 116, 0, 0) - ); - case MetaName.CTaskHumanLocomotion__Tunables: - return new PsoStructureInfo(MetaName.CTaskHumanLocomotion__Tunables, 0, 0, 864, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Player_MBRAcceleration, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Player_MBRDeceleration, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.AI_MBRAcceleration, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.AI_MBRDeceleration, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.FromStrafeAccelerationMod, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.FastWalkRateMin, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.FastWalkRateMax, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowRunRateMin, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowRunRateMax, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.FastRunRateMin, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.FastRunRateMax, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.Turn180ActivationAngle, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.Turn180ConsistentAngleTolerance, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.IdleHeadingLerpRate, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.Player_IdleTurnRate, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.AI_IdleTurnRate, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.FromStrafe_WeightRate, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.FromStrafe_MovingBlendOutTime, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.IdleTransitionBlendTimeFromActionMode, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.IdleTransitionBlendTimeFromStealth, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2557519583), - new PsoStructureEntryInfo(MetaName.MovingVarsSet, PsoDataType.Array, 96, 4, (MetaName)196629) - ); - case (MetaName)2557519583: - return new PsoStructureInfo((MetaName)2557519583, 0, 0, 256, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Standard, PsoDataType.Structure, 16, 0, (MetaName)1246324819), - new PsoStructureEntryInfo(MetaName.StandardAI, PsoDataType.Structure, 96, 0, (MetaName)1246324819), - new PsoStructureEntryInfo(MetaName.TighterTurn, PsoDataType.Structure, 176, 0, (MetaName)1246324819) - ); - case (MetaName)1246324819: - return new PsoStructureInfo((MetaName)1246324819, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingAngleMin, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingAngleMax, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateMin, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateMaxWalk, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateMaxRun, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateAccelerationMin, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateAccelerationMax, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingForwardAngleWalk, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingForwardAngleRun, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingForwardRateMod, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingForwardRateAccelerationMod, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeAngleMin, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeAngleMax, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateWalk, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateRun, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateAccelerationMin, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateAccelerationMax, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.UseExtraHeading, PsoDataType.Bool, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.UseMovingDirectionDiff, PsoDataType.Bool, 77, 0, 0) - ); - case MetaName.CTaskMotionTennis__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionTennis__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.StrafeDirectionLerpRateMinAI, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StrafeDirectionLerpRateMaxAI, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.StrafeDirectionLerpRateMinPlayer, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.StrafeDirectionLerpRateMaxPlayer, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CTaskQuadLocomotion__Tunables: - return new PsoStructureInfo(MetaName.CTaskQuadLocomotion__Tunables, 0, 0, 184, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.StartAnimatedTurnsD, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StopAnimatedTurnsD, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TurnTransitionDelay, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.TurnToIdleTransitionDelay, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.SteepSlopeStartAnimatedTurnsD, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.SteepSlopeStopAnimatedTurnsD, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.SteepSlopeThresholdD, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.InMotionAlignmentVelocityTolerance, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.InMotionTighterTurnsVelocityTolerance, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.InPlaceAlignmentVelocityTolerance, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.TurnSpeedMBRThreshold, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowMinTurnApproachRate, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.FastMinTurnApproachRate, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowTurnApproachRate, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.FastTurnApproachRate, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowTurnAcceleration, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.FastTurnAcceleration, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.TurnResetThresholdD, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.ProcessPhysicsApproachRate, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableTimeslicingHeadingThresholdD, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.LowLodExtraHeadingAdjustmentRate, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.StartLocomotionBlendoutThreshold, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.StartLocomotionHeadingDeltaBlendoutThreshold, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.StartLocomotionDefaultBlendDuration, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.StartLocomotionDefaultBlendOutDuration, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.StartLocomotionEarlyOutBlendOutDuration, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.StartLocomotionWalkRunBoundary, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.StartToIdleDirectlyPhaseThreshold, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MovementAcceleration, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MinMBRToStop, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.PursuitModeGallopRateFactor, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.PursuitModeExtraHeadingRate, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.StoppingDistanceWalkMBR, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.StoppingDistanceRunMBR, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.StoppingDistanceGallopMBR, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.StoppingGotoPointRemainingDist, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.StopPhaseThreshold, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStopPhaseToResumeMovement, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStopPhaseToResumeMovement, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo((MetaName)951644869, PsoDataType.String, 172, 7, 0), - new PsoStructureEntryInfo((MetaName)3492404675, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo((MetaName)3330274310, PsoDataType.Float, 180, 0, 0) - ); - case MetaName.CEventPotentialBeWalkedInto__Tunables: - return new PsoStructureInfo(MetaName.CEventPotentialBeWalkedInto__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)3702961077, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3689187240, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1651660816, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CEventPotentialGetRunOver__Tunables: - return new PsoStructureInfo(MetaName.CEventPotentialGetRunOver__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToDive, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SpeedToAlwaysDive, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedToDive, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToDive, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)4246045187, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelay, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelay, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CEventPotentialBlast__Tunables: - return new PsoStructureInfo(MetaName.CEventPotentialBlast__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CTaskComplexEvasiveStep__Tunables: - return new PsoStructureInfo(MetaName.CTaskComplexEvasiveStep__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.BlendOutDelta, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskFall__Tunables: - return new PsoStructureInfo(MetaName.CTaskFall__Tunables, 0, 0, 176, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ImmediateHighFallSpeedPlayer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ImmediateHighFallSpeedAi, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.HighFallProbeLength, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1694135928, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ContinuousGapHighFallTime, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3844027585, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)3197570465, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)391736247, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2495576534, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.InAirHeadingRate, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.InAirMovementRate, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.InAirMovementApproachRate, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.LandHeadingModifier, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.StandingLandHeadingModifier, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.FallLandThreshold, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.ReenterFallLandThreshold, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.PadShakeMinIntensity, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.PadShakeMaxIntensity, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.PadShakeMinHeight, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.PadShakeMaxHeight, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.PadShakeMinDuration, PsoDataType.UInt, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.PadShakeMaxDuration, PsoDataType.UInt, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)2719065213, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)358840176, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.VaultFallTestAngle, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.JumpFallTestAngle, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.FallTestAngleBlendOutTime, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.DiveControlMaxFallDistance, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.DiveControlExtraDistanceForDiveFromVehicle, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.DiveControlExtraDistanceBlendOutSpeed, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.DiveWaterOffsetToHitFullyInControlWeight, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.LandRollHeightFromJump, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.LandRollHeightFromVault, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.LandRollHeight, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo((MetaName)4229439207, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo((MetaName)2581310221, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo((MetaName)3807299066, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo((MetaName)2776570354, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)4036569890, PsoDataType.Float, 168, 0, 0) - ); - case MetaName.CTaskFlyToPoint__Tunables: - return new PsoStructureInfo(MetaName.CTaskFlyToPoint__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.HeightMapDelta, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.HeightMapLookAheadDist, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialTerrainAvoidanceAngleD, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ProgressiveTerrainAvoidanceAngleD, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenIncreasingAvoidanceAngle, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.CTaskGetUp__Tunables: - return new PsoStructureInfo(MetaName.CTaskGetUp__Tunables, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fPreferInjuredGetupPlayerHealthThreshold, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fInjuredGetupImpulseMag2, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeInGetUpToAllowCover, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowNonPlayerHighFallAbort, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowOffScreenHighFallAbort, PsoDataType.Bool, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.FallTimeBeforeHighFallAbort, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFallSpeedForHighFallAbort, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)866980885, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerMoverFixupMaxExtraHeadingChange, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.AiMoverFixupMaxExtraHeadingChange, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.StartClipWaitTimePlayer, PsoDataType.SInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.StartClipWaitTime, PsoDataType.SInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.StuckWaitTime, PsoDataType.SInt, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.StuckWaitTimeMp, PsoDataType.SInt, 64, 0, 0) - ); - case MetaName.CTaskGoToScenario__Tunables: - return new PsoStructureInfo(MetaName.CTaskGoToScenario__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ClosePointDistanceSquared, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ClosePointCounterMax, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingDiffStartBlendDegrees, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.PositionDiffStartBlend, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ExactStopTargetRadius, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.PreferNearWaterSurfaceArrivalRadius, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenBrokenPointChecks, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CTaskMoveToTacticalPoint__Tunables: - return new PsoStructureInfo(MetaName.CTaskMoveToTacticalPoint__Tunables, 0, 0, 224, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Scoring, PsoDataType.Structure, 16, 0, (MetaName)2164459263), - new PsoStructureEntryInfo(MetaName.TargetRadiusForMoveToPosition, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeUntilRelease, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToConsiderCloseToPositionToMoveTo, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenInfluenceSphereChecks, PsoDataType.Float, 220, 0, 0) - ); - case (MetaName)2164459263: - return new PsoStructureInfo((MetaName)2164459263, 0, 0, 192, - new PsoStructureEntryInfo(MetaName.CoverPoint, PsoDataType.Structure, 8, 0, (MetaName)3018405043), - new PsoStructureEntryInfo(MetaName.NavMeshPoint, PsoDataType.Structure, 88, 0, (MetaName)1211016943), - new PsoStructureEntryInfo(MetaName.Position, PsoDataType.Structure, 160, 0, (MetaName)3791189200) - ); - case (MetaName)3018405043: - return new PsoStructureInfo((MetaName)3018405043, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Base, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Bonus, PsoDataType.Structure, 16, 0, (MetaName)1890577968), - new PsoStructureEntryInfo(MetaName.Penalty, PsoDataType.Structure, 32, 0, (MetaName)3436208238) - ); - case (MetaName)1890577968: - return new PsoStructureInfo((MetaName)1890577968, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Current, PsoDataType.Float, 8, 0, 0) - ); - case (MetaName)3436208238: - return new PsoStructureInfo((MetaName)3436208238, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.BadRoute, PsoDataType.Structure, 8, 0, (MetaName)532562236), - new PsoStructureEntryInfo(MetaName.Arc, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.LineOfSight, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.Nearby, PsoDataType.Float, 40, 0, 0) - ); - case (MetaName)532562236: - return new PsoStructureInfo((MetaName)532562236, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ValueForMin, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMax, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Min, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)1211016943: - return new PsoStructureInfo((MetaName)1211016943, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Base, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Bonus, PsoDataType.Structure, 16, 0, (MetaName)1762528765), - new PsoStructureEntryInfo(MetaName.Penalty, PsoDataType.Structure, 32, 0, (MetaName)2194913513) - ); - case (MetaName)1762528765: - return new PsoStructureInfo((MetaName)1762528765, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Current, PsoDataType.Float, 8, 0, 0) - ); - case (MetaName)2194913513: - return new PsoStructureInfo((MetaName)2194913513, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.BadRoute, PsoDataType.Structure, 8, 0, (MetaName)333617339), - new PsoStructureEntryInfo(MetaName.LineOfSight, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.Nearby, PsoDataType.Float, 36, 0, 0) - ); - case (MetaName)333617339: - return new PsoStructureInfo((MetaName)333617339, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ValueForMin, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMax, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Min, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)3791189200: - return new PsoStructureInfo((MetaName)3791189200, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MaxDistanceFromPed, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMaxDistanceFromPed, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMinDistanceFromPed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceFromOptimal, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMaxDistanceFromOptimal, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMinDistanceFromOptimal, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CTaskMoveCrossRoadAtTrafficLights__Tunables: - return new PsoStructureInfo(MetaName.CTaskMoveCrossRoadAtTrafficLights__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.bTrafficLightPositioning, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)645072887), - new PsoStructureEntryInfo(MetaName.WaitingOffsets, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo(MetaName.iMaxPedsAtTrafficLights, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceBetweenPeds, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fDecideToRunChance, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fPlayerObstructionCheckRadius, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.fPlayerObstructionRadius, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.bDebugRender, PsoDataType.Bool, 60, 0, 0) - ); - case (MetaName)645072887: - return new PsoStructureInfo((MetaName)645072887, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Pos, PsoDataType.Float3, 16, 0, 0) - ); - case MetaName.CTaskMoveWithinAttackWindow__Tunables: - return new PsoStructureInfo(MetaName.CTaskMoveWithinAttackWindow__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fMaxAngleOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinAlliesForMaxAngleOffset, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxAllyDistance, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxRandomAdditionalOffset, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxRouteDistanceModifier, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeToWait, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxTimeToWait, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CTaskMoveFollowNavMesh__Tunables: - return new PsoStructureInfo(MetaName.CTaskMoveFollowNavMesh__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.uRepeatedAttemptsBeforeTeleportToLeader, PsoDataType.UByte, 16, 0, 0) - ); - case MetaName.CTaskParachute__Tunables: - return new PsoStructureInfo(MetaName.CTaskParachute__Tunables, 0, 0, 1312, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ChangeRatesForSkydiving, PsoDataType.Structure, 16, 0, (MetaName)2342773550), - new PsoStructureEntryInfo(MetaName.ChangeRatesForParachuting, PsoDataType.Structure, 40, 0, (MetaName)1918103038), - new PsoStructureEntryInfo(MetaName.FlightAngleLimitsForSkydiving, PsoDataType.Structure, 64, 0, (MetaName)3788337195), - new PsoStructureEntryInfo(MetaName.FlightAngleLimitsForParachutingNormal, PsoDataType.Structure, 96, 0, (MetaName)4209854321), - new PsoStructureEntryInfo(MetaName.FlightAngleLimitsForParachutingBraking, PsoDataType.Structure, 144, 0, (MetaName)4209854321), - new PsoStructureEntryInfo(MetaName.PedAngleLimitsForSkydiving, PsoDataType.Structure, 192, 0, (MetaName)3009185102), - new PsoStructureEntryInfo(MetaName.MoveParameters, PsoDataType.Structure, 208, 0, (MetaName)560894723), - new PsoStructureEntryInfo(MetaName.ForcesForSkydiving, PsoDataType.Structure, 264, 0, (MetaName)2934924657), - new PsoStructureEntryInfo(MetaName.ParachutingAi, PsoDataType.Structure, 280, 0, (MetaName)2046463254), - new PsoStructureEntryInfo(MetaName.Landing, PsoDataType.Structure, 464, 0, (MetaName)2206940602), - new PsoStructureEntryInfo(MetaName.CrashLanding, PsoDataType.Structure, 552, 0, (MetaName)954219518), - new PsoStructureEntryInfo(MetaName.Allow, PsoDataType.Structure, 592, 0, (MetaName)202257215), - new PsoStructureEntryInfo(MetaName.CameraSettings, PsoDataType.Structure, 616, 0, (MetaName)892940524), - new PsoStructureEntryInfo(MetaName.ParachutePhysics, PsoDataType.Structure, 640, 0, (MetaName)3266862316), - new PsoStructureEntryInfo(MetaName.ExtraForces, PsoDataType.Structure, 656, 0, (MetaName)889782022), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 1008, 0, (MetaName)629460530), - new PsoStructureEntryInfo(MetaName.LowLod, PsoDataType.Structure, 1024, 0, (MetaName)196547756), - new PsoStructureEntryInfo(MetaName.ParachuteBones, PsoDataType.Structure, 1040, 0, (MetaName)1078023650), - new PsoStructureEntryInfo(MetaName.Aiming, PsoDataType.Structure, 1144, 0, (MetaName)2787675897), - new PsoStructureEntryInfo(MetaName.PadShake, PsoDataType.Structure, 1160, 0, (MetaName)947557087), - new PsoStructureEntryInfo(MetaName.BrakingDifferenceForLinearVZMin, PsoDataType.Float, 1216, 0, 0), - new PsoStructureEntryInfo(MetaName.BrakingDifferenceForLinearVZMax, PsoDataType.Float, 1220, 0, 0), - new PsoStructureEntryInfo(MetaName.LinearVZForBrakingDifferenceMin, PsoDataType.Float, 1224, 0, 0), - new PsoStructureEntryInfo(MetaName.LinearVZForBrakingDifferenceMax, PsoDataType.Float, 1228, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchRatioForLinearVZMin, PsoDataType.Float, 1232, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchRatioForLinearVZMax, PsoDataType.Float, 1236, 0, 0), - new PsoStructureEntryInfo(MetaName.LinearVZForPitchRatioMin, PsoDataType.Float, 1240, 0, 0), - new PsoStructureEntryInfo(MetaName.LinearVZForPitchRatioMax, PsoDataType.Float, 1244, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBrakeForCloseUpCamera, PsoDataType.Float, 1248, 0, 0), - new PsoStructureEntryInfo(MetaName.ParachuteMass, PsoDataType.Float, 1252, 0, 0), - new PsoStructureEntryInfo(MetaName.ParachuteMassReduced, PsoDataType.Float, 1256, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToLookAheadForFutureTargetPosition, PsoDataType.Float, 1260, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDifferenceToAverageBrakes, PsoDataType.Float, 1264, 0, 0), - new PsoStructureEntryInfo(MetaName.ModelForParachuteInSP, PsoDataType.String, 1268, 7, 0), - new PsoStructureEntryInfo(MetaName.ModelForParachuteInMP, PsoDataType.String, 1272, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)974228846), - new PsoStructureEntryInfo(MetaName.ParachutePackVariations, PsoDataType.Array, 1280, 0, (MetaName)36), - new PsoStructureEntryInfo(MetaName.FirstPersonDriveByIKOffset, PsoDataType.Float3, 1296, 0, 0) - ); - case (MetaName)2342773550: - return new PsoStructureInfo((MetaName)2342773550, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Pitch, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Roll, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Yaw, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Heading, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)1918103038: - return new PsoStructureInfo((MetaName)1918103038, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Pitch, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Roll, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Yaw, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Brake, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)3788337195: - return new PsoStructureInfo((MetaName)3788337195, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.InflectionPitch, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxYaw, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)4209854321: - return new PsoStructureInfo((MetaName)4209854321, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRollFromStick, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRollFromBrake, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxYawFromStick, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxYawFromRoll, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.RollForMinYaw, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.RollForMaxYaw, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxYaw, PsoDataType.Float, 44, 0, 0) - ); - case (MetaName)3009185102: - return new PsoStructureInfo((MetaName)3009185102, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)560894723: - return new PsoStructureInfo((MetaName)560894723, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Parachuting, PsoDataType.Structure, 8, 0, (MetaName)801836577) - ); - case (MetaName)801836577: - return new PsoStructureInfo((MetaName)801836577, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.InterpRates, PsoDataType.Structure, 8, 0, (MetaName)2238420428), - new PsoStructureEntryInfo(MetaName.MinParachutePitch, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxParachutePitch, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxParachuteRoll, PsoDataType.Float, 40, 0, 0) - ); - case (MetaName)2238420428: - return new PsoStructureInfo((MetaName)2238420428, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.StickX, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.StickY, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.TotalStickInput, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.CurrentHeading, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)2934924657: - return new PsoStructureInfo((MetaName)2934924657, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MaxThrust, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLift, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)2046463254: - return new PsoStructureInfo((MetaName)2046463254, 0, 0, 184, - new PsoStructureEntryInfo(MetaName.Target, PsoDataType.Structure, 8, 0, (MetaName)4228543633), - new PsoStructureEntryInfo(MetaName.Brake, PsoDataType.Structure, 24, 0, (MetaName)1021020250), - new PsoStructureEntryInfo(MetaName.RollForNormal, PsoDataType.Structure, 56, 0, (MetaName)1305267132), - new PsoStructureEntryInfo(MetaName.RollForBraking, PsoDataType.Structure, 80, 0, (MetaName)1305267132), - new PsoStructureEntryInfo(MetaName.PitchForNormal, PsoDataType.Structure, 104, 0, (MetaName)2131363216), - new PsoStructureEntryInfo(MetaName.PitchForBraking, PsoDataType.Structure, 128, 0, (MetaName)2131363216), - new PsoStructureEntryInfo(MetaName.Drop, PsoDataType.Structure, 152, 0, (MetaName)209420440) - ); - case (MetaName)4228543633: - return new PsoStructureInfo((MetaName)4228543633, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MinDistanceToAdjust, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Adjustment, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)1021020250: - return new PsoStructureInfo((MetaName)1021020250, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToStart, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceForFull, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleForMin, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleForMax, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)1305267132: - return new PsoStructureInfo((MetaName)1305267132, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.AngleDifferenceForMin, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleDifferenceForMax, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.StickValueForMin, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StickValueForMax, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)2131363216: - return new PsoStructureInfo((MetaName)2131363216, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.DesiredTimeToResolveAngleDifference, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.DeltaForMaxStickChange, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStickChangePerSecond, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)209420440: - return new PsoStructureInfo((MetaName)209420440, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MinDistance, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeight, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDot, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)2206940602: - return new PsoStructureInfo((MetaName)2206940602, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.NormalThresholds, PsoDataType.Structure, 8, 0, (MetaName)3954319942), - new PsoStructureEntryInfo(MetaName.MaxVelocityForSlow, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelocityForFast, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ParachuteProbeRadius, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinStickMagnitudeForEarlyOutMovement, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.FramesToLookAheadForProbe, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendDurationForEarlyOut, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.AngleForRunway, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.LookAheadForRunway, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.DropForRunway, PsoDataType.Float, 80, 0, 0) - ); - case (MetaName)3954319942: - return new PsoStructureInfo((MetaName)3954319942, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Normal, PsoDataType.Structure, 8, 0, (MetaName)1558938460), - new PsoStructureEntryInfo(MetaName.Braking, PsoDataType.Structure, 24, 0, (MetaName)1558938460) - ); - case (MetaName)1558938460: - return new PsoStructureInfo((MetaName)1558938460, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Forward, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Collision, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)954219518: - return new PsoStructureInfo((MetaName)954219518, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.NoParachuteTimeForMinCollisionNormalThreshold, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.NoParachuteMaxCollisionNormalThreshold, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.NoParachuteMinCollisionNormalThreshold, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.NoParachuteMaxPitch, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ParachuteProbeRadius, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ParachuteUpThreshold, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.FramesToLookAheadForProbe, PsoDataType.Float, 32, 0, 0) - ); - case (MetaName)202257215: - return new PsoStructureInfo((MetaName)202257215, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.MinClearDistanceBelow, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFallingSpeedInRagdoll, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInRagdoll, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)892940524: - return new PsoStructureInfo((MetaName)892940524, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.SkyDivingCamera, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ParachuteCamera, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.ParachuteCloseUpCamera, PsoDataType.String, 16, 7, 0) - ); - case (MetaName)3266862316: - return new PsoStructureInfo((MetaName)3266862316, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.ParachuteInitialVelocityY, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ParachuteInitialVelocityZ, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)889782022: - return new PsoStructureInfo((MetaName)889782022, 0, 0, 352, - new PsoStructureEntryInfo(MetaName.Parachuting, PsoDataType.Structure, 8, 0, (MetaName)1386112053) - ); - case (MetaName)1386112053: - return new PsoStructureInfo((MetaName)1386112053, 0, 0, 344, - new PsoStructureEntryInfo(MetaName.Normal, PsoDataType.Structure, 8, 0, (MetaName)899207522), - new PsoStructureEntryInfo(MetaName.Braking, PsoDataType.Structure, 224, 0, (MetaName)3310740500) - ); - case (MetaName)899207522: - return new PsoStructureInfo((MetaName)899207522, 0, 0, 216, - new PsoStructureEntryInfo(MetaName.TurnFromStick, PsoDataType.Structure, 8, 0, (MetaName)3387028743), - new PsoStructureEntryInfo(MetaName.TurnFromRoll, PsoDataType.Structure, 120, 0, (MetaName)3597070589) - ); - case (MetaName)3387028743: - return new PsoStructureInfo((MetaName)3387028743, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.FromValue, PsoDataType.Structure, 8, 0, (MetaName)3597070589), - new PsoStructureEntryInfo(MetaName.UseVerticalAxis, PsoDataType.Bool, 104, 0, 0) - ); - case (MetaName)3597070589: - return new PsoStructureInfo((MetaName)3597070589, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.ValueForMin, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMax, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinValue, PsoDataType.Structure, 16, 0, (MetaName)162458425), - new PsoStructureEntryInfo(MetaName.ZeroValue, PsoDataType.Structure, 40, 0, (MetaName)162458425), - new PsoStructureEntryInfo(MetaName.MaxValue, PsoDataType.Structure, 64, 0, (MetaName)162458425), - new PsoStructureEntryInfo(MetaName.IsLocal, PsoDataType.Bool, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.ClearZ, PsoDataType.Bool, 89, 0, 0) - ); - case (MetaName)162458425: - return new PsoStructureInfo((MetaName)162458425, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)3310740500: - return new PsoStructureInfo((MetaName)3310740500, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.TurnFromStick, PsoDataType.Structure, 8, 0, (MetaName)3387028743) - ); - case (MetaName)629460530: - return new PsoStructureInfo((MetaName)629460530, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.RunwayProbes, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.ValidityProbes, PsoDataType.Bool, 10, 0, 0) - ); - case (MetaName)196547756: - return new PsoStructureInfo((MetaName)196547756, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MinDistance, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.AlwaysUse, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.NeverUse, PsoDataType.Bool, 13, 0, 0) - ); - case (MetaName)1078023650: - return new PsoStructureInfo((MetaName)1078023650, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.LeftGrip, PsoDataType.Structure, 8, 0, (MetaName)2874150626), - new PsoStructureEntryInfo(MetaName.RightGrip, PsoDataType.Structure, 32, 0, (MetaName)2874150626), - new PsoStructureEntryInfo(MetaName.LeftWire, PsoDataType.Structure, 56, 0, (MetaName)2874150626), - new PsoStructureEntryInfo(MetaName.RightWire, PsoDataType.Structure, 80, 0, (MetaName)2874150626) - ); - case (MetaName)2874150626: - return new PsoStructureInfo((MetaName)2874150626, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.UseOrientationFromParachuteBone, PsoDataType.Bool, 20, 0, 0) - ); - case (MetaName)2787675897: - return new PsoStructureInfo((MetaName)2787675897, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Disabled, PsoDataType.Bool, 8, 0, 0) - ); - case (MetaName)947557087: - return new PsoStructureInfo((MetaName)947557087, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Falling, PsoDataType.Structure, 8, 0, (MetaName)3452040071), - new PsoStructureEntryInfo(MetaName.Deploy, PsoDataType.Structure, 40, 0, (MetaName)2930279050) - ); - case (MetaName)3452040071: - return new PsoStructureInfo((MetaName)3452040071, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchForMinIntensity, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchForMaxIntensity, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinIntensity, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxIntensity, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)2930279050: - return new PsoStructureInfo((MetaName)2930279050, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Intensity, PsoDataType.Float, 12, 0, 0) - ); - case (MetaName)974228846: - return new PsoStructureInfo((MetaName)974228846, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1192596872), - new PsoStructureEntryInfo(MetaName.Variations, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case (MetaName)1192596872: - return new PsoStructureInfo((MetaName)1192596872, 0, 0, 48, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3788247444), - new PsoStructureEntryInfo(MetaName.Wearing, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ParachutePack, PsoDataType.Structure, 24, 0, (MetaName)3901274641) - ); - case (MetaName)3901274641: - return new PsoStructureInfo((MetaName)3901274641, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), - new PsoStructureEntryInfo(MetaName.DrawableId, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DrawableAltId, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TexId, PsoDataType.UInt, 20, 0, 0) - ); - case (MetaName)3788247444: - return new PsoStructureInfo((MetaName)3788247444, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.DrawableIds, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case MetaName.CTaskParachuteObject__Tunables: - return new PsoStructureInfo(MetaName.CTaskParachuteObject__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.PhaseDuringDeployToConsiderOut, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskTakeOffPedVariation__Tunables: - return new PsoStructureInfo(MetaName.CTaskTakeOffPedVariation__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CTaskHeliPassengerRappel__Tunables: - return new PsoStructureInfo(MetaName.CTaskHeliPassengerRappel__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fDefaultRopeLength, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fExtraRopeLength, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fExitDescendRate, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fDefaultDescendRate, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fStartDescendingDistToTargetSq, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fRopeUnwindRate, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinHeightToRappel, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxHeliSpeedForRappel, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.CTaskRappel__Tunables: - return new PsoStructureInfo(MetaName.CTaskRappel__Tunables, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fJumpDescendRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fLongJumpDescendRate, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fJumpToSmashWindowPhaseChange, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinJumpPhaseAllowDescend, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxJumpPhaseAllowDescend, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinJumpPhaseAllowSmashWindow, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxJumpPhaseAllowSmashWindow, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinSmashWindowPhase, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fGlassBreakRadius, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fGlassDamage, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinDistanceToBreakWindow, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinStickValueAllowDescend, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.bAllowSmashDuringJump, PsoDataType.Bool, 64, 0, 0) - ); - case MetaName.CTaskVault__Tunables: - return new PsoStructureInfo(MetaName.CTaskVault__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AngledClimbTheshold, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAngleForScaleVelocityExtension, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleForScaleVelocityExtension, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.AngledClimbScaleVelocityExtensionMax, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableVaultForwardDot, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.SlideWalkAnimRate, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.CTaskJump__Tunables: - return new PsoStructureInfo(MetaName.CTaskJump__Tunables, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinSuperJumpInitialVelocity, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSuperJumpInitialVelocity, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)3568425813, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)1477129396, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.HighJumpMinAngleForVelScale, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.HighJumpMaxAngleForVelScale, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.HighJumpMinVelScale, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.HighJumpMaxVelScale, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableJumpOnSteepStairs, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStairsJumpAngle, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.bEnableJumpCollisions, PsoDataType.Bool, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.bEnableJumpCollisionsMp, PsoDataType.Bool, 57, 0, 0), - new PsoStructureEntryInfo(MetaName.bBlockJumpCollisionAgainstRagdollBlocked, PsoDataType.Bool, 58, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveProbeZOffset, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveBraceStartDelay, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveBraceProbeLength, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveBraceBlendInDuration, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveBraceBlendOutDuration, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveBraceMaxUpDotSlope, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveRagdollIntersectionDot, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveRagdollStartDelay, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveRagdollProbeLength, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveRagdollProbeRadius, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.PredictiveRagdollRequiredVelocityMag, PsoDataType.Float, 100, 0, 0) - ); - case MetaName.CPedTargetEvaluator__Tunables: - return new PsoStructureInfo(MetaName.CPedTargetEvaluator__Tunables, 0, 0, 232, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitMelee, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitMeleeLockOnNoStick, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetDistanceWeightMelee, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2485794835, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetDistanceWeightMeleeRunning, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)2082223604, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetHeadingWeightMelee, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3532059041, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetHeadingWeightMeleeRunning, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)1974328161, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitVehicleWeapon, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MeleeLockOnStickWeighting, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MeleeLockOnCameraWeighting, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MeleeLockOnCameraWeightingNoStick, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MeleeLockOnPedWeightingNoStick, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioHarmless, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioNeutral, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioNeutralInjured, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioIngangOrFriend, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioPotentialThreat, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioMissionThreat, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioMissionThreatCuffed, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.DownedThreatModifier, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioPlayer2PlayerEveryone, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioPlayer2PlayerStrangers, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioPlayer2PlayerAttackers, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioPlayer2Player, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioPlayer2PlayerCuffed, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioScriptedHighPriority, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioMeleeDead, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioMeleeCombatThreat, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioMeleeDownedCombatThreat, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioMeleeInjured, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.PrioMeleePotentialThreat, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.InCoverScoreModifier, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.ClosestPointToLineDist, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.ClosestPointToLineBonusModifier, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.MeleeHeadingOverride, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.MeleeHeadingOverrideRunning, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.MeleeHeadingFalloffPowerRunning, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultMeleeRange, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetDistanceWeightingMin, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetDistanceWeightingMax, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetHeadingWeighting, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetDistanceMaxWeightingAimTime, PsoDataType.UInt, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetDistanceFallOffMin, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetDistanceFallOffMax, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.RejectLockonHeadingTheshold, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingScoreForCoverLockOnRejection, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo((MetaName)680689338, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeForTakedownTargetAcquiry, PsoDataType.UInt, 216, 0, 0), - new PsoStructureEntryInfo((MetaName)3508597107, PsoDataType.UInt, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.UseMeleeHeadingOverride, PsoDataType.Bool, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.LimitMeleeRangeToDefault, PsoDataType.Bool, 225, 0, 0), - new PsoStructureEntryInfo(MetaName.DebugTargetting, PsoDataType.Bool, 226, 0, 0), - new PsoStructureEntryInfo(MetaName.UseNonNormalisedScoringForPlayer, PsoDataType.Bool, 227, 0, 0), - new PsoStructureEntryInfo(MetaName.RejectLockIfBestTargetIsInCover, PsoDataType.Bool, 228, 0, 0) - ); - case MetaName.CGrabHelper__Tunables: - return new PsoStructureInfo(MetaName.CGrabHelper__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Sets, PsoDataType.Structure, 16, 0, (MetaName)2070432509) - ); - case (MetaName)2070432509: - return new PsoStructureInfo((MetaName)2070432509, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.sets, PsoDataType.Map, 8, 1, (MetaName)1) - ); - case MetaName.CNmTuningSet: - return new PsoStructureInfo(MetaName.CNmTuningSet, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Id, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Priority, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.Messages, PsoDataType.Array, 24, 0, (MetaName)3) - ); - case MetaName.CNmMessage: - return new PsoStructureInfo(MetaName.CNmMessage, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.Params, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo(MetaName.ForceNewMessage, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TaskMessage, PsoDataType.Bool, 33, 0, 0) - ); - case MetaName.CNmParameterBool: - return new PsoStructureInfo(MetaName.CNmParameterBool, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.Bool, 16, 0, 0) - ); - case MetaName.CNmParameterFloat: - return new PsoStructureInfo(MetaName.CNmParameterFloat, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CNmParameterRandomFloat: - return new PsoStructureInfo(MetaName.CNmParameterRandomFloat, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Min, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CNmParameterInt: - return new PsoStructureInfo(MetaName.CNmParameterInt, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.SInt, 16, 0, 0) - ); - case MetaName.CTaskNMControl__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMControl__Tunables, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DriveToGetup, PsoDataType.Structure, 16, 0, (MetaName)3336326859), - new PsoStructureEntryInfo(MetaName.OnEnableDriveToGetup, PsoDataType.Structure, 48, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnDisableDriveToGetup, PsoDataType.Structure, 88, 0, MetaName.CNmTuningSet) - ); - case (MetaName)3336326859: - return new PsoStructureInfo((MetaName)3336326859, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.AllowDriveToGetup, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.OnlyAllowForShot, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowWhenBalanced, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHealth, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxUprightRatio, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MatchTimer, PsoDataType.UInt, 24, 0, 0) - ); - case MetaName.CNmParameterString: - return new PsoStructureInfo(MetaName.CNmParameterString, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.String, 16, 8, 0) - ); - case MetaName.CTaskNMBehaviour__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMBehaviour__Tunables, 0, 0, 936, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.EnableRagdollPooling, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxGameplayNmAgents, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRageRagdolls, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ReserveLocalPlayerNmAgent, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableRagdollPoolingMp, PsoDataType.Bool, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxGameplayNmAgentsMp, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRageRagdollsMp, PsoDataType.SInt, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ReserveLocalPlayerNmAgentMp, PsoDataType.Bool, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.BlockOffscreenShotReactions, PsoDataType.Bool, 41, 0, 0), - new PsoStructureEntryInfo(MetaName.UsePreEmptiveEdgeActivation, PsoDataType.Bool, 42, 0, 0), - new PsoStructureEntryInfo(MetaName.UsePreEmptiveEdgeActivationMp, PsoDataType.Bool, 43, 0, 0), - new PsoStructureEntryInfo(MetaName.UseBalanceForEdgeActivation, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMaxVel, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMaxHeadingDiff, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMinDotVel, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMaxDistance, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMinDesiredMBR2, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.StandardBlendOutThresholds, PsoDataType.Structure, 72, 0, (MetaName)3979439077), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4115910995), - new PsoStructureEntryInfo(MetaName.CamAttachPositionWeights, PsoDataType.Array, 176, 0, (MetaName)MetaTypeName.USHORT), - new PsoStructureEntryInfo(MetaName.SpActivationModifiers, PsoDataType.Structure, 192, 0, (MetaName)2720813484), - new PsoStructureEntryInfo(MetaName.MpActivationModifiers, PsoDataType.Structure, 272, 0, (MetaName)2720813484), - new PsoStructureEntryInfo(MetaName.PlayerBumpedByCloneCarActivationModifier, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo(MetaName.ClonePlayerBumpedByCarActivationModifier, PsoDataType.Float, 356, 0, 0), - //new PsoStructureEntryInfo(MetaName.ClonePlayerBumpedByCloneCarActivationModifier, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo((MetaName)2048881690, PsoDataType.Float, 360, 0, 0), //seems to be newer than above.. - new PsoStructureEntryInfo(MetaName.MaxVehicleCapsulePushTimeForRagdollActivation, PsoDataType.Float, 364, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVehicleCapsulePushTimeForPlayerRagdollActivation, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForContinuousPushActivation, PsoDataType.Float, 372, 0, 0), - new PsoStructureEntryInfo(MetaName.MinContactDepthForContinuousPushActivation, PsoDataType.Float, 376, 0, 0), - new PsoStructureEntryInfo(MetaName.DurationRampDownCapsulePushedByVehicle, PsoDataType.Float, 380, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForAiActivation, PsoDataType.Float, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForStationaryAiActivation, PsoDataType.Float, 388, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForPlayerActivation, PsoDataType.Float, 392, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForStationaryPlayerActivation, PsoDataType.Float, 396, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForWarningActivation, PsoDataType.Float, 400, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleFallingSpeedWeight, PsoDataType.Float, 404, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierDefault, PsoDataType.Float, 408, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierBicycle, PsoDataType.Float, 412, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierBike, PsoDataType.Float, 416, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierBoat, PsoDataType.Float, 420, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierPlane, PsoDataType.Float, 424, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierQuadBike, PsoDataType.Float, 428, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierHeli, PsoDataType.Float, 432, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierTrain, PsoDataType.Float, 436, 0, 0), - new PsoStructureEntryInfo(MetaName.ExcludePedBumpAngleFromPushCalculation, PsoDataType.Bool, 440, 0, 0), - new PsoStructureEntryInfo(MetaName.PedActivationForceMultiplier, PsoDataType.Float, 444, 0, 0), - new PsoStructureEntryInfo(MetaName.ObjectMinSpeedForActivation, PsoDataType.Float, 448, 0, 0), - new PsoStructureEntryInfo(MetaName.ObjectActivationForceMultiplier, PsoDataType.Float, 452, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPlayerCapsulePushTimeForRagdollActivation, PsoDataType.SInt, 456, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerCapsuleMinSpeedForContinuousPushActivation, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo(MetaName.StuckOnVehicleMaxTime, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo(MetaName.StuckOnVehicleBlendOutThresholds, PsoDataType.Structure, 472, 0, (MetaName)3979439077), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 576, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.TeeterControl, PsoDataType.Structure, 616, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.animPoseDefault, PsoDataType.Structure, 656, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.animPoseAttachDefault, PsoDataType.Structure, 696, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.animPoseAttachToVehicle, PsoDataType.Structure, 736, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.animPoseHandsCuffed, PsoDataType.Structure, 776, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.forceFall, PsoDataType.Structure, 816, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.RagdollUnderWheelTuning, PsoDataType.Structure, 856, 0, (MetaName)267001783), - new PsoStructureEntryInfo(MetaName.KickOnGroundTuning, PsoDataType.Structure, 880, 0, (MetaName)2578171686), - new PsoStructureEntryInfo(MetaName.CapsuleVehicleHitTuning, PsoDataType.Structure, 896, 0, (MetaName)1040069698) - ); - case (MetaName)3979439077: - return new PsoStructureInfo((MetaName)3979439077, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.Ai, PsoDataType.Structure, 8, 0, (MetaName)3749122641), - new PsoStructureEntryInfo(MetaName.Player, PsoDataType.Structure, 40, 0, (MetaName)3749122641), - new PsoStructureEntryInfo(MetaName.PlayerMp, PsoDataType.Structure, 72, 0, (MetaName)3749122641) - ); - case (MetaName)3749122641: - return new PsoStructureInfo((MetaName)3749122641, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.MaxLinearVelocity, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularVelocity, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.SettledTimeMS, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.RandomiseSettledTime, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SettledTimeMinMS, PsoDataType.SInt, 24, 0, 0) - ); - case (MetaName)2720813484: - return new PsoStructureInfo((MetaName)2720813484, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.BumpedByCar, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByCarFriendly, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerBumpedByCar, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVehicleWarning, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByPedMinVel, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByPedMinDotVel, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByPed, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByPlayerRagdoll, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByPedRagdoll, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByPedFriendly, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByPedIsQuadruped, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BumpedByObject, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.Walking, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.Running, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.Sprinting, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPlayerActivationLimit, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAiActivationLimit, PsoDataType.Float, 72, 0, 0) - ); - case (MetaName)267001783: - return new PsoStructureInfo((MetaName)267001783, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.fImpulseMultLimbs, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fImpulseMultSpine, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinSpeedForPush, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fFastCarPushImpulseMult, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)2578171686: - return new PsoStructureInfo((MetaName)2578171686, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.fPronePedKickImpulse, PsoDataType.Float, 8, 0, 0) - ); - case (MetaName)1040069698: - return new PsoStructureInfo((MetaName)1040069698, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.EnableActivationsFromCapsuleImpacts, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleVelToImpactNormalMinDot, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableSideSwipeActivations, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2302810051, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSideNormalForSideSwipe, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelThroughNormalForSideSwipe, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAccumulatedImpactForSideSwipe, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVehVelMagForSideSwipe, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVehVelMagForBicycleSideSwipe, PsoDataType.Float, 36, 0, 0) - ); - case (MetaName)4115910995: - return new PsoStructureInfo((MetaName)4115910995, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Bound, PsoDataType.Enum, 8, 0, (MetaName)3509057257), - new PsoStructureEntryInfo(MetaName.Weight, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.CTaskNMBalance__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMBalance__Tunables, 0, 0, 912, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.InitialBumpComponent, PsoDataType.Enum, 16, 0, (MetaName)3509057257), - new PsoStructureEntryInfo(MetaName.InitialBumpForce, PsoDataType.Structure, 24, 0, (MetaName)760338219), - new PsoStructureEntryInfo(MetaName.InitialBumpOffset, PsoDataType.Float3, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleStayUprightWithVel, PsoDataType.Bool, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.StayUprightAtMaxVel, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVel, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.StayUprightAtMinVel, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVel, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.lookAtVelProbIfNoBumpTarget, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxTargetDistToUpdateFlinch, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxTargetDistToUpdateFlinchOnGround, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.fFlinchTargetZOffset, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.fFlinchTargetZOffsetOnGround, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinForwardVectorToFlinch, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinForwardVectorToFlinchOnGround, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.fHeadLookZOffset, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.fHeadLookZOffsetOnGround, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSteps, PsoDataType.SInt, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.timeToCatchfallMS, PsoDataType.SInt, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.StartWeak, PsoDataType.Structure, 176, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StartAggressive, PsoDataType.Structure, 216, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StartDefault, PsoDataType.Structure, 256, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.BumpedByPed, PsoDataType.Structure, 296, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnStairs, PsoDataType.Structure, 336, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnSteepSlope, PsoDataType.Structure, 376, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnMovingGround, PsoDataType.Structure, 416, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.LostBalanceAndGrabbing, PsoDataType.Structure, 456, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Teeter, PsoDataType.Structure, 496, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.FallOffAMovingCar, PsoDataType.Structure, 536, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.RollingFall, PsoDataType.Structure, 576, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.CatchFall, PsoDataType.Structure, 616, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 656, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.NotBeingPushedDelayMS, PsoDataType.SInt, 696, 0, 0), - new PsoStructureEntryInfo(MetaName.NotBeingPushedOnGroundDelayMS, PsoDataType.SInt, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.BeingPushedOnGroundTooLongMS, PsoDataType.SInt, 704, 0, 0), - new PsoStructureEntryInfo(MetaName.OnBeingPushed, PsoDataType.Structure, 712, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBeingPushedOnGround, PsoDataType.Structure, 752, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnNotBeingPushed, PsoDataType.Structure, 792, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBeingPushedOnGroundTooLong, PsoDataType.Structure, 832, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.PushedThresholdOnGround, PsoDataType.Structure, 872, 0, (MetaName)3749122641) - ); - case (MetaName)760338219: - return new PsoStructureInfo((MetaName)760338219, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Enable, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Mag, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleWithVelocity, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityMin, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityMax, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceAtMinVelocity, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceAtMaxVelocity, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ClampImpulse, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinImpulse, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxImpulse, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.Delay, PsoDataType.SInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.SInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleWithUpright, PsoDataType.Bool, 56, 0, 0) - ); - case MetaName.CNmParameterVector: - return new PsoStructureInfo(MetaName.CNmParameterVector, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.Float3, 16, 0, 0) - ); - case MetaName.CTaskNMBrace__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMBrace__Tunables, 0, 0, 1568, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.VehicleOverrides, PsoDataType.Structure, 16, 0, (MetaName)2216090795), - new PsoStructureEntryInfo(MetaName.InverseMassScales, PsoDataType.Structure, 40, 0, (MetaName)1267291753), - new PsoStructureEntryInfo(MetaName.AngularVelocityLimits, PsoDataType.Structure, 64, 0, (MetaName)238499603), - new PsoStructureEntryInfo(MetaName.InitialForce, PsoDataType.Structure, 144, 0, (MetaName)2808943365), - new PsoStructureEntryInfo(MetaName.ChestForce, PsoDataType.Structure, 176, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.FeetLiftForce, PsoDataType.Structure, 232, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.RootLiftForce, PsoDataType.Structure, 288, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.FlipForce, PsoDataType.Structure, 344, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.CapsuleHitForce, PsoDataType.Structure, 400, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.SideSwipeForce, PsoDataType.Structure, 456, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.ForceUnderVehicle, PsoDataType.Bool, 512, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceOverVehicle, PsoDataType.Bool, 513, 0, 0), - new PsoStructureEntryInfo(MetaName.ChestForcePitch, PsoDataType.Float, 516, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowWarningActivations, PsoDataType.Bool, 520, 0, 0), - new PsoStructureEntryInfo(MetaName.LowVelocityReactionThreshold, PsoDataType.Float, 524, 0, 0), - new PsoStructureEntryInfo(MetaName.FallingSpeedForHighFall, PsoDataType.Float, 528, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleCollisionElasticityMult, PsoDataType.Float, 532, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleCollisionFrictionMult, PsoDataType.Float, 536, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleCollisionNormalPitchOverVehicle, PsoDataType.Float, 540, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleCollisionNormalPitchUnderVehicle, PsoDataType.Float, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.AiClearedVehicleDelay, PsoDataType.SInt, 548, 0, 0), - new PsoStructureEntryInfo(MetaName.AiClearedVehicleSmartFallDelay, PsoDataType.SInt, 552, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerClearedVehicleDelay, PsoDataType.SInt, 556, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerClearedVehicleSmartFallDelay, PsoDataType.SInt, 560, 0, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 568, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnStairs, PsoDataType.Structure, 608, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Weak, PsoDataType.Structure, 648, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 688, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailedStairs, PsoDataType.Structure, 728, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HighVelocity, PsoDataType.Structure, 768, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StuckUnderVehicleMaxUpright, PsoDataType.Float, 808, 0, 0), - new PsoStructureEntryInfo(MetaName.StuckOnVehicle, PsoDataType.Structure, 816, 0, (MetaName)1649426998), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 1256, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Dead, PsoDataType.Structure, 1296, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OverVehicle, PsoDataType.Structure, 1336, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.UnderVehicle, PsoDataType.Structure, 1376, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.ClearedVehicle, PsoDataType.Structure, 1416, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HighVelocityBlendOut, PsoDataType.Structure, 1456, 0, (MetaName)3979439077) - ); - case (MetaName)2216090795: - return new PsoStructureInfo((MetaName)2216090795, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1768633733), - new PsoStructureEntryInfo(MetaName.sets, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)1267291753: - return new PsoStructureInfo((MetaName)1267291753, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ApplyVehicleScale, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleScale, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ApplyPedScale, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.PedScale, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)238499603: - return new PsoStructureInfo((MetaName)238499603, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Apply, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Constant, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Velocity, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.Velocity2, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.Delay, PsoDataType.SInt, 68, 0, 0) - ); - case (MetaName)2808943365: - return new PsoStructureInfo((MetaName)2808943365, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.VelocityMin, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityMax, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceAtMinVelocity, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceAtMaxVelocity, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleWithUpright, PsoDataType.Bool, 24, 0, 0) - ); - case (MetaName)3816043274: - return new PsoStructureInfo((MetaName)3816043274, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Apply, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleWithVelocity, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelThreshold, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVelThreshold, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelMag, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVelMag, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleWithUpright, PsoDataType.Bool, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleWithMass, PsoDataType.Bool, 29, 0, 0), - new PsoStructureEntryInfo(MetaName.ReduceWithPedVelocity, PsoDataType.Bool, 30, 0, 0), - new PsoStructureEntryInfo(MetaName.ReduceWithPedAngularVelocity, PsoDataType.Bool, 31, 0, 0), - new PsoStructureEntryInfo(MetaName.OnlyInContact, PsoDataType.Bool, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.OnlyNotInContact, PsoDataType.Bool, 33, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceMag, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinMag, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxMag, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.SInt, 48, 0, 0) - ); - case (MetaName)1649426998: - return new PsoStructureInfo((MetaName)1649426998, 0, 0, 440, - new PsoStructureEntryInfo(MetaName.InitialDelay, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.UnderVehicleInitialDelay, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityThreshold, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ContinuousContactTime, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.UnderVehicleVelocityThreshold, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.UnderVehicleContinuousContactTime, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.UnderCarMaxVelocity, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.StuckOnVehicle, PsoDataType.Structure, 40, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.EndStuckOnVehicle, PsoDataType.Structure, 80, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.UpdateOnVehicle, PsoDataType.Structure, 120, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StuckUnderVehicle, PsoDataType.Structure, 160, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.EndStuckUnderVehicle, PsoDataType.Structure, 200, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StuckOnVehiclePlayer, PsoDataType.Structure, 240, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.EndStuckOnVehiclePlayer, PsoDataType.Structure, 280, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.UpdateOnVehiclePlayer, PsoDataType.Structure, 320, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StuckUnderVehiclePlayer, PsoDataType.Structure, 360, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.EndStuckUnderVehiclePlayer, PsoDataType.Structure, 400, 0, MetaName.CNmTuningSet) - ); - case (MetaName)1768633733: - return new PsoStructureInfo((MetaName)1768633733, 0, 0, 736, - new PsoStructureEntryInfo(MetaName.Id, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.OverrideInverseMassScales, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.InverseMassScales, PsoDataType.Structure, 16, 0, (MetaName)1267291753), - new PsoStructureEntryInfo(MetaName.OverrideReactionType, PsoDataType.Bool, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceUnderVehicle, PsoDataType.Bool, 41, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceOverVehicle, PsoDataType.Bool, 42, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleCentreZOffset, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.OverrideRootLiftForce, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.RootLiftForce, PsoDataType.Structure, 56, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.OverrideFlipForce, PsoDataType.Bool, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.FlipForce, PsoDataType.Structure, 120, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.OverrideInitialForce, PsoDataType.Bool, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialForce, PsoDataType.Structure, 184, 0, (MetaName)2808943365), - new PsoStructureEntryInfo(MetaName.OverrideElasticity, PsoDataType.Bool, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleCollisionElasticityMult, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.OverrideFriction, PsoDataType.Bool, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleCollisionFrictionMult, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.LateralForce, PsoDataType.Structure, 232, 0, (MetaName)3816043274), - new PsoStructureEntryInfo(MetaName.OverrideStuckOnVehicleSets, PsoDataType.Bool, 288, 0, 0), - new PsoStructureEntryInfo(MetaName.AddToBaseStuckOnVehicleSets, PsoDataType.Bool, 289, 0, 0), - new PsoStructureEntryInfo(MetaName.StuckOnVehicle, PsoDataType.Structure, 296, 0, (MetaName)1649426998) - ); - case MetaName.CNmParameterResetMessage: - return new PsoStructureInfo(MetaName.CNmParameterResetMessage, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0) - ); - case MetaName.CTaskNMDraggingToSafety__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMDraggingToSafety__Tunables, 0, 0, 160, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Stiffness, PsoDataType.Structure, 16, 0, (MetaName)2241487041), - new PsoStructureEntryInfo(MetaName.DraggerArmIk, PsoDataType.Structure, 48, 0, (MetaName)1214269741), - new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Structure, 96, 0, (MetaName)2410537644), - new PsoStructureEntryInfo(MetaName.Forces, PsoDataType.Structure, 112, 0, (MetaName)2059054874) - ); - case (MetaName)2241487041: - return new PsoStructureInfo((MetaName)2241487041, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Relaxation, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadAndNeck, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.AnkleAndWrist, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)1214269741: - return new PsoStructureInfo((MetaName)1214269741, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftBoneOffset, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.RightBoneOffset, PsoDataType.Float3, 32, 0, 0) - ); - case (MetaName)2410537644: - return new PsoStructureInfo((MetaName)2410537644, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 8, 0, 0) - ); - case (MetaName)2059054874: - return new PsoStructureInfo((MetaName)2059054874, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftHandOffset, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.RightHandOffset, PsoDataType.Float3, 32, 0, 0) - ); - case MetaName.CTaskNMDrunk__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMDrunk__Tunables, 0, 0, 256, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fMinHeadingDeltaToFixTurn, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fHeadingRandomizationRange, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.iHeadingRandomizationTimeMin, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.iHeadingRandomizationTimeMax, PsoDataType.SInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fForceLeanInDirectionAmountMin, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fForceLeanInDirectionAmountMax, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fForceRampMinSpeed, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fForceRampMaxSpeed, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fHeadLookHeadingRandomizationRange, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fHeadLookPitchRandomizationRange, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.iHeadLookRandomizationTimeMin, PsoDataType.SInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.iHeadlookRandomizationTimeMax, PsoDataType.SInt, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinHeadingDeltaToIdleTurn, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.iRunningTimeForVelocityBasedStayupright, PsoDataType.SInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.fStayUprightForceNonVelocityBased, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.fStayUprightForceMoving, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.fStayUprightForceIdle, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.fFallingSpeedForHighFall, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.bUseStayUpright, PsoDataType.Bool, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.bDrawIdleHeadLookTarget, PsoDataType.Bool, 89, 0, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 96, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Base, PsoDataType.Structure, 136, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Moving, PsoDataType.Structure, 176, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Idle, PsoDataType.Structure, 216, 0, MetaName.CNmTuningSet) - ); - case MetaName.CTaskNMElectrocute__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMElectrocute__Tunables, 0, 0, 400, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.InitialForceComponent, PsoDataType.Enum, 16, 0, (MetaName)3509057257), - new PsoStructureEntryInfo(MetaName.InitialForce, PsoDataType.Structure, 24, 0, (MetaName)760338219), - new PsoStructureEntryInfo(MetaName.InitialForceOffset, PsoDataType.Float3, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.FallingSpeedForHighFall, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 120, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Walking, PsoDataType.Structure, 160, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Running, PsoDataType.Structure, 200, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Sprinting, PsoDataType.Structure, 240, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 280, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnCatchFallSuccess, PsoDataType.Structure, 320, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnElectrocuteFinished, PsoDataType.Structure, 360, 0, MetaName.CNmTuningSet) - ); - case MetaName.CTaskNMExplosion__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMExplosion__Tunables, 0, 0, 344, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinStunnedTime, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStunnedTime, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowPlayerStunned, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.UseRelaxBehaviour, PsoDataType.Bool, 25, 0, 0), - new PsoStructureEntryInfo(MetaName.RollUpHeightThreshold, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.CatchFallHeightThresholdRollUp, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.CatchFallHeightThresholdWindmill, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.CatchFallHeightThresholdClipPose, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToStartCatchFall, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToStartCatchFallPlayer, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DoCatchFallRelax, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.CatchFallRelaxHeight, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.HeightToStartWrithe, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeForInitialState, PsoDataType.SInt, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeForInitialState, PsoDataType.SInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MinWritheTime, PsoDataType.SInt, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWritheTime, PsoDataType.SInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceRollUp, PsoDataType.Bool, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceWindmill, PsoDataType.Bool, 81, 0, 0), - new PsoStructureEntryInfo(MetaName.StartWindmill, PsoDataType.Structure, 88, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StartCatchFall, PsoDataType.Structure, 128, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StartRollDownStairs, PsoDataType.Structure, 168, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 208, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Explosion, PsoDataType.Structure, 248, 0, (MetaName)3490848491) - ); - case (MetaName)3490848491: - return new PsoStructureInfo((MetaName)3490848491, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.NMBodyScale, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.HumanBodyScale, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.HumanPelvisScale, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.HumanSpine0Scale, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.HumanSpine1Scale, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.AnimalBodyScale, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.AnimalPelvisScale, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.StrongBlastMagnitude, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.FastMovingPedSpeed, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceAbovePedPositionToClampPitch, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchClampMin, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchClampMax, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MagnitudeClamp, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.SideScale, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchSideAngle, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchTorqueMin, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.PitchTorqueMax, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.BlanketForceScale, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraTorqueTwistMax, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableInjuredBehaviorImpulseLimit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableInjuredBehaviorDistLimit, PsoDataType.Float, 88, 0, 0) - ); - case MetaName.CTaskNMFlinch__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMFlinch__Tunables, 0, 0, 624, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 16, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Passive, PsoDataType.Structure, 56, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.WaterCannon, PsoDataType.Structure, 96, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Armoured, PsoDataType.Structure, 136, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnStairs, PsoDataType.Structure, 176, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.BoundAnkles, PsoDataType.Structure, 216, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.FatallyInjured, PsoDataType.Structure, 256, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.PlayerDeath, PsoDataType.Structure, 296, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HoldingTwoHandedWeapon, PsoDataType.Structure, 336, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HoldingSingleHandedWeapon, PsoDataType.Structure, 376, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 416, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 456, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailedStairs, PsoDataType.Structure, 496, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.WeaponSets, PsoDataType.Structure, 536, 0, (MetaName)2070432509), - new PsoStructureEntryInfo(MetaName.ActionSets, PsoDataType.Structure, 568, 0, (MetaName)2070432509), - new PsoStructureEntryInfo(MetaName.RandomiseLeadingHand, PsoDataType.Bool, 600, 0, 0), - new PsoStructureEntryInfo(MetaName.MinLeanInDirectionTime, PsoDataType.SInt, 604, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLeanInDirectionTime, PsoDataType.SInt, 608, 0, 0), - new PsoStructureEntryInfo(MetaName.fImpulseReductionScaleMax, PsoDataType.Float, 612, 0, 0), - new PsoStructureEntryInfo(MetaName.fSpecialAbilityRageKickImpulseModifier, PsoDataType.Float, 616, 0, 0), - new PsoStructureEntryInfo(MetaName.fCounterImpulseScale, PsoDataType.Float, 620, 0, 0) - ); - case MetaName.CNmParameterRandomInt: - return new PsoStructureInfo(MetaName.CNmParameterRandomInt, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Min, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Max, PsoDataType.SInt, 20, 0, 0) - ); - case MetaName.CTaskNMHighFall__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMHighFall__Tunables, 0, 0, 1112, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.PitchInDirectionForce, PsoDataType.Structure, 16, 0, (MetaName)760338219), - new PsoStructureEntryInfo(MetaName.PitchInDirectionComponent, PsoDataType.SInt, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.StuntJumpPitchInDirectionForce, PsoDataType.Structure, 88, 0, (MetaName)760338219), - new PsoStructureEntryInfo(MetaName.StuntJumpPitchInDirectionComponent, PsoDataType.SInt, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.HighFallTimeToBlockInjuredOnGround, PsoDataType.SInt, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 160, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.InAir, PsoDataType.Structure, 200, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Vault, PsoDataType.Structure, 240, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.FromCarHit, PsoDataType.Structure, 280, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SlopeSlide, PsoDataType.Structure, 320, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.TeeterEdge, PsoDataType.Structure, 360, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SprintExhausted, PsoDataType.Structure, 400, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.JumpCollision, PsoDataType.Structure, 440, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StuntJump, PsoDataType.Structure, 480, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailedSprintExhausted, PsoDataType.Structure, 520, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.DisableStartMessageForSprintExhausted, PsoDataType.Bool, 560, 0, 0), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 568, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.BlendOut, PsoDataType.Structure, 608, 0, (MetaName)3979439077), - new PsoStructureEntryInfo(MetaName.PlayerQuickBlendOut, PsoDataType.Structure, 712, 0, (MetaName)3749122641), - new PsoStructureEntryInfo(MetaName.MpPlayerQuickBlendOut, PsoDataType.Structure, 744, 0, (MetaName)3749122641), - new PsoStructureEntryInfo(MetaName.MaxHealthLossForQuickGetup, PsoDataType.Float, 776, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHealthForQuickGetup, PsoDataType.Float, 780, 0, 0), - new PsoStructureEntryInfo(MetaName.MpMaxHealthLossForQuickGetup, PsoDataType.Float, 784, 0, 0), - new PsoStructureEntryInfo(MetaName.MpMinHealthForQuickGetup, PsoDataType.Float, 788, 0, 0), - new PsoStructureEntryInfo(MetaName.UseRemainingMinTimeForGroundWrithe, PsoDataType.Bool, 792, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeRemainingForGroundWrithe, PsoDataType.SInt, 796, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeElapsedForGroundWrithe, PsoDataType.SInt, 800, 0, 0), - new PsoStructureEntryInfo(MetaName.HighHighFallStart, PsoDataType.Structure, 808, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SuperHighFallStart, PsoDataType.Structure, 848, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HighHighFallEnd, PsoDataType.Structure, 888, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.AirResistanceOption, PsoDataType.UByte, 928, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceZThresholdForHighHighFall, PsoDataType.Float, 932, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityZThresholdForHighHighFall, PsoDataType.Float, 936, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityZThresholdForSuperHighFall, PsoDataType.Float, 940, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.RagdollComponentAirResistanceForce, PsoDataType.Array, 944, 4, (MetaName)1376291), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.RagdollComponentAirResistanceMinStiffness, PsoDataType.Array, 1028, 4, (MetaName)1310757) - ); - case MetaName.CTaskNMInjuredOnGround__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMInjuredOnGround__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fDoInjuredOnGroundChance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fFallingSpeedThreshold, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.iRandomDurationMin, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.iRandomDurationMax, PsoDataType.SInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.iMaxNumInjuredOnGroundAgents, PsoDataType.SInt, 32, 0, 0) - ); - case MetaName.CTaskNMJumpRollFromRoadVehicle__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMJumpRollFromRoadVehicle__Tunables, 0, 0, 304, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.GravityScale, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StartForceDownHeight, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 24, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.EntryPointSets, PsoDataType.Structure, 64, 0, (MetaName)2070432509), - new PsoStructureEntryInfo(MetaName.BlendOut, PsoDataType.Structure, 96, 0, (MetaName)3979439077), - new PsoStructureEntryInfo(MetaName.QuickBlendOut, PsoDataType.Structure, 200, 0, (MetaName)3979439077) - ); - case MetaName.CTaskNMOnFire__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMOnFire__Tunables, 0, 0, 176, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 16, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Weak, PsoDataType.Structure, 56, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 96, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 136, 0, MetaName.CNmTuningSet) - ); - case MetaName.CTaskNMPrototype__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMPrototype__Tunables, 0, 0, 288, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.RunForever, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SimulationTimeInMs, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.CheckForMovingGround, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 32, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 72, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 112, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CTaskNMPrototype__Tunables__TimedTuning), - new PsoStructureEntryInfo(MetaName.TimedMessages, PsoDataType.Array, 152, 0, (MetaName)MetaTypeName.POINTER), - new PsoStructureEntryInfo(MetaName.DynamicSet1, PsoDataType.Structure, 168, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.DynamicSet2, PsoDataType.Structure, 208, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.DynamicSet3, PsoDataType.Structure, 248, 0, MetaName.CNmTuningSet) - ); - case MetaName.CTaskNMPrototype__Tunables__TimedTuning: - return new PsoStructureInfo(MetaName.CTaskNMPrototype__Tunables__TimedTuning, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.TimeInSeconds, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Periodic, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Messages, PsoDataType.Structure, 16, 0, MetaName.CNmTuningSet) - ); - case MetaName.CTaskNMRiverRapids__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMRiverRapids__Tunables, 0, 0, 272, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fMinRiverFlowForRapids, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinRiverGroundClearanceForRapids, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.bHorizontalRighting, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fHorizontalRightingStrength, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fHorizontalRightingTime, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.bVerticalRighting, PsoDataType.Bool, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fVerticalRightingStrength, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fVerticalRightingTime, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.fRagdollComponentBuoyancy, PsoDataType.Array, 48, 4, (MetaName)1376265), - new PsoStructureEntryInfo(MetaName.BodyWrithe, PsoDataType.Structure, 136, 0, (MetaName)2361842970), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 192, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 232, 0, MetaName.CNmTuningSet) - ); - case (MetaName)2361842970: - return new PsoStructureInfo((MetaName)2361842970, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.bControlledByPlayerSprintInput, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinArmAmplitude, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxArmAmplitude, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinArmStiffness, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxArmStiffness, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinArmPeriod, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxArmPeriod, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinStroke, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxStroke, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinBuoyancy, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxBuoyancy, PsoDataType.Float, 48, 0, 0) - ); - case MetaName.CTaskNMShot__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMShot__Tunables, 0, 0, 2304, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinimumShotReactionTimePlayerMS, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinimumShotReactionTimeAIMS, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.bUseClipPoseHelper, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.bEnableDebugDraw, PsoDataType.Bool, 25, 0, 0), - new PsoStructureEntryInfo(MetaName.fImpactConeAngleFront, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fImpactConeAngleBack, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.eImpactConeRagdollComponent, PsoDataType.Enum, 36, 0, (MetaName)3509057257), - new PsoStructureEntryInfo(MetaName.iShotMinTimeBeforeGunThreaten, PsoDataType.SInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.iShotMaxTimeBeforeGunThreaten, PsoDataType.SInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.iShotMinTimeBetweenFireGun, PsoDataType.SInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.iShotMaxTimeBetweenFireGun, PsoDataType.SInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.iShotMaxBlindFireTimeL, PsoDataType.SInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.iShotMaxBlindFireTimeH, PsoDataType.SInt, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutDelayStanding, PsoDataType.SInt, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutDelayBalanceFailed, PsoDataType.SInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.fShotBlindFireProbability, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.fShotWeaponAngleToFireGun, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.fShotHeadAngleToFireGun, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.fFireWeaponStrengthForceMultiplier, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinFinisherShotgunTotalImpulseNormal, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinFinisherShotgunTotalImpulseBraced, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.fFinisherShotgunBonusArmedSpeedModifier, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleSnapWithSpineOrientation, PsoDataType.Bool, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSnap, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.ShotAgainstWall, PsoDataType.Structure, 112, 0, (MetaName)2342621138), - new PsoStructureEntryInfo(MetaName.BCRExclusionZone, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.Impulses, PsoDataType.Structure, 152, 0, (MetaName)209088469), - new PsoStructureEntryInfo(MetaName.HitRandomisation, PsoDataType.Structure, 352, 0, (MetaName)996969243), - new PsoStructureEntryInfo(MetaName.HitRandomisationAutomatic, PsoDataType.Structure, 392, 0, (MetaName)996969243), - new PsoStructureEntryInfo(MetaName.StayUpright, PsoDataType.Structure, 432, 0, (MetaName)1001943080), - new PsoStructureEntryInfo(MetaName.ArmShot, PsoDataType.Structure, 464, 0, (MetaName)2149258416), - new PsoStructureEntryInfo(MetaName.FallingSpeedForHighFall, PsoDataType.Float, 504, 0, 0), - new PsoStructureEntryInfo(MetaName.ReduceDownedTimeByPerformanceTime, PsoDataType.Bool, 508, 0, 0), - new PsoStructureEntryInfo(MetaName.MinimumDownedTime, PsoDataType.SInt, 512, 0, 0), - new PsoStructureEntryInfo(MetaName.ChanceOfFallToKneesOnCollapse, PsoDataType.Float, 516, 0, 0), - new PsoStructureEntryInfo(MetaName.ChanceOfFallToKneesAfterLastStand, PsoDataType.Float, 520, 0, 0), - new PsoStructureEntryInfo(MetaName.ChanceForGutShotKnockdown, PsoDataType.Float, 524, 0, 0), - new PsoStructureEntryInfo(MetaName.LastStandMaxTotalTime, PsoDataType.Float, 528, 0, 0), - new PsoStructureEntryInfo(MetaName.LastStandMaxArmouredTotalTime, PsoDataType.Float, 532, 0, 0), - new PsoStructureEntryInfo(MetaName.RapidHitCount, PsoDataType.SInt, 536, 0, 0), - new PsoStructureEntryInfo(MetaName.ArmouredRapidHitCount, PsoDataType.SInt, 540, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowArmouredLegShot, PsoDataType.Bool, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowArmouredKnockdown, PsoDataType.Bool, 545, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnHeadShot, PsoDataType.Bool, 546, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnHeadShotMinDelay, PsoDataType.SInt, 548, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnHeadShotMaxDelay, PsoDataType.SInt, 552, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnNeckShot, PsoDataType.Bool, 556, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnNeckShotMinDelay, PsoDataType.SInt, 560, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnNeckShotMaxDelay, PsoDataType.SInt, 564, 0, 0), - new PsoStructureEntryInfo(MetaName.ParamSets, PsoDataType.Structure, 568, 0, (MetaName)436100430), - new PsoStructureEntryInfo(MetaName.WeaponSets, PsoDataType.Structure, 2136, 0, (MetaName)2070432509), - new PsoStructureEntryInfo(MetaName.BlendOutThreshold, PsoDataType.Structure, 2168, 0, (MetaName)3979439077), - new PsoStructureEntryInfo(MetaName.SubmergedBlendOutThreshold, PsoDataType.Structure, 2272, 0, (MetaName)3749122641) - ); - case (MetaName)2342621138: - return new PsoStructureInfo((MetaName)2342621138, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.HealthRatioLimit, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.WallProbeRadius, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.WallProbeDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ProbeHeightAbovePelvis, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ImpulseMult, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWallAngle, PsoDataType.Float, 28, 0, 0) - ); - case (MetaName)209088469: - return new PsoStructureInfo((MetaName)209088469, 0, 0, 200, - new PsoStructureEntryInfo(MetaName.MaxArmourImpulseMult, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinArmourImpulseMult, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHealthImpulseMult, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHealthImpulseMult, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDamageTakenImpulseMult, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDamageTakenImpulseMult, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDamageTakenThreshold, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDamageTakenThreshold, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultKillShotImpulseMult, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultRapidFireKillShotImpulseMult, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultMPKillShotImpulseMult, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultMPRapidFireKillShotImpulseMult, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ShotgunMaxSpeedForLiftImpulse, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ShotgunMaxLiftImpulse, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ShotgunLiftNearThreshold, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ShotgunChanceToMoveSpine3ImpulseToSpine2, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.ShotgunChanceToMoveNeckImpulseToSpine2, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.ShotgunChanceToMoveHeadImpulseToSpine2, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.RapidFireBoostShotImpulseMult, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.RapidFireBoostShotMinRandom, PsoDataType.SInt, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.RapidFireBoostShotMaxRandom, PsoDataType.SInt, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.EqualizeAmount, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.COMImpulseScale, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3509057257), - new PsoStructureEntryInfo(MetaName.COMImpulseComponent, PsoDataType.Flags, 100, 0, (MetaName)2097175), - new PsoStructureEntryInfo(MetaName.COMImpulseMaxRootVelocityMagnitude, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.COMImpulseOnlyWhileBalancing, PsoDataType.Bool, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadShotImpulseMultiplier, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadShotMPImpulseMultiplier, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.ScaleHeadShotImpulseWithSpineOrientation, PsoDataType.Bool, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeadShotImpulseMultiplier, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.AutomaticInitialSnapMult, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.BurstFireInitialSnapMult, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.FinalShotImpulseClampMax, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.RunningAgainstBulletImpulseMult, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.RunningAgainstBulletImpulseMultMax, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.RunningWithBulletImpulseMult, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.LegShotFallRootImpulseMinUpright, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.LegShotFallRootImpulseMult, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.SniperImpulses, PsoDataType.Structure, 160, 0, (MetaName)3192684380) - ); - case (MetaName)3192684380: - return new PsoStructureInfo((MetaName)3192684380, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.MaxHealthImpulseMult, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHealthImpulseMult, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDamageTakenImpulseMult, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDamageTakenImpulseMult, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDamageTakenThreshold, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDamageTakenThreshold, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultKillShotImpulseMult, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultMPKillShotImpulseMult, PsoDataType.Float, 36, 0, 0) - ); - case (MetaName)996969243: - return new PsoStructureInfo((MetaName)996969243, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Enable, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.TopSpread, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.BottomSpread, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Blend, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TopComponent, PsoDataType.Enum, 24, 0, (MetaName)3509057257), - new PsoStructureEntryInfo(MetaName.BottomComponent, PsoDataType.Enum, 28, 0, (MetaName)3509057257), - new PsoStructureEntryInfo(MetaName.BiasSide, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.BiasSideTime, PsoDataType.UInt, 36, 0, 0) - ); - case (MetaName)1001943080: - return new PsoStructureInfo((MetaName)1001943080, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.HoldingWeaponBonus, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.UnarmedBonus, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ArmouredBonus, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingMultiplierBonus, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.HealthMultiplierBonus, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)2149258416: - return new PsoStructureInfo((MetaName)2149258416, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.MinLookAtArmWoundTime, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLookAtArmWoundTime, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.UpperArmImpulseCap, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.LowerArmImpulseCap, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ClavicleImpulseScale, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.UpperArmNoTorsoHitImpulseCap, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.LowerArmNoTorseHitImpulseCap, PsoDataType.Float, 32, 0, 0) - ); - case (MetaName)436100430: - return new PsoStructureInfo((MetaName)436100430, 0, 0, 1568, - new PsoStructureEntryInfo(MetaName.Base, PsoDataType.Structure, 8, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Melee, PsoDataType.Structure, 48, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Electrocute, PsoDataType.Structure, 88, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SprintingLegShot, PsoDataType.Structure, 128, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SprintingDeath, PsoDataType.Structure, 168, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Sprinting, PsoDataType.Structure, 208, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.AutomaticHeadShot, PsoDataType.Structure, 248, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HeadShot, PsoDataType.Structure, 288, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.AutomaticNeckShot, PsoDataType.Structure, 328, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.NeckShot, PsoDataType.Structure, 368, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SniperLegShot, PsoDataType.Structure, 408, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.LegShot, PsoDataType.Structure, 448, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.ArmShot, PsoDataType.Structure, 488, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.BackShot, PsoDataType.Structure, 528, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Underwater, PsoDataType.Structure, 568, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.UnderwaterRelax, PsoDataType.Structure, 608, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Armoured, PsoDataType.Structure, 648, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.BoundAnkles, PsoDataType.Structure, 688, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.FatallyInjured, PsoDataType.Structure, 728, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.PlayerDeathSP, PsoDataType.Structure, 768, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.PlayerDeathMP, PsoDataType.Structure, 808, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnStairs, PsoDataType.Structure, 848, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.ShotAgainstWall, PsoDataType.Structure, 888, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.LastStand, PsoDataType.Structure, 928, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.LastStandArmoured, PsoDataType.Structure, 968, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HeadLook, PsoDataType.Structure, 1008, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.FallToKnees, PsoDataType.Structure, 1048, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.StaggerFall, PsoDataType.Structure, 1088, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.CatchFall, PsoDataType.Structure, 1128, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SetFallingReactionHealthy, PsoDataType.Structure, 1168, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SetFallingReactionInjured, PsoDataType.Structure, 1208, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SetFallingReactionFallOverWall, PsoDataType.Structure, 1248, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.SetFallingReactionFallOverVehicle, PsoDataType.Structure, 1288, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.RubberBulletKnockdown, PsoDataType.Structure, 1328, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Teeter, PsoDataType.Structure, 1368, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HoldingTwoHandedWeapon, PsoDataType.Structure, 1408, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.HoldingSingleHandedWeapon, PsoDataType.Structure, 1448, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.CrouchedOrLowCover, PsoDataType.Structure, 1488, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Female, PsoDataType.Structure, 1528, 0, MetaName.CNmTuningSet) - ); - case MetaName.CTaskNMSimple__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMSimple__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2610655349), - new PsoStructureEntryInfo(MetaName.Tuning, PsoDataType.Map, 16, 1, (MetaName)65538) - ); - case (MetaName)2610655349: - return new PsoStructureInfo((MetaName)2610655349, 0, 0, 176, - new PsoStructureEntryInfo(MetaName.iMinTime, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.iMaxTime, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fRagdollScore, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 24, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 64, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.OnBalanceFailure, PsoDataType.Structure, 104, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.BlendOutThreshold, PsoDataType.Structure, 144, 0, (MetaName)3749122641) - ); - case MetaName.CTaskNMThroughWindscreen__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMThroughWindscreen__Tunables, 0, 0, 232, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.GravityScale, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StartForceDownHeight, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeForwardMinComponent, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeForwardMaxComponent, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeUpMinComponent, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeUpMaxComponent, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikePitchMinComponent, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikePitchMaxComponent, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeMinSpeed, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeMaxSpeed, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeMinUpright, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeMaxUpright, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeEjectMaxImpactDepth, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.KnockOffBikeEjectImpactFriction, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.ClearVehicleTimeMS, PsoDataType.SInt, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultInverseMassScales, PsoDataType.Structure, 80, 0, (MetaName)1267291753), - new PsoStructureEntryInfo(MetaName.BicycleInverseMassScales, PsoDataType.Structure, 104, 0, (MetaName)1267291753), - new PsoStructureEntryInfo(MetaName.BikeInverseMassScales, PsoDataType.Structure, 128, 0, (MetaName)1267291753), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 152, 0, MetaName.CNmTuningSet), - new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 192, 0, MetaName.CNmTuningSet) - ); - case MetaName.CTaskRageRagdoll__Tunables: - return new PsoStructureInfo(MetaName.CTaskRageRagdoll__Tunables, 0, 0, 168, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SpineStrengthTuning, PsoDataType.Structure, 16, 0, (MetaName)2579680791), - new PsoStructureEntryInfo(MetaName.NeckStrengthTuning, PsoDataType.Structure, 48, 0, (MetaName)2579680791), - new PsoStructureEntryInfo(MetaName.LimbStrengthTuning, PsoDataType.Structure, 80, 0, (MetaName)2579680791), - new PsoStructureEntryInfo(MetaName.RageRagdollImpulseTuning, PsoDataType.Structure, 112, 0, (MetaName)2715073781), - new PsoStructureEntryInfo(MetaName.fMuscleAngleStrengthRampDownRate, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.fMuscleSpeedStrengthRampDownRate, PsoDataType.Float, 164, 0, 0) - ); - case (MetaName)2579680791: - return new PsoStructureInfo((MetaName)2579680791, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.fInitialDelay, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fStartStrength, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fMidStrength, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fEndStrength, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fDurationStage1, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fDurationStage2, PsoDataType.Float, 28, 0, 0) - ); - case (MetaName)2715073781: - return new PsoStructureInfo((MetaName)2715073781, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.fImpulseReductionPerShot, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fImpulseRecoveryPerSecond, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxImpulseModifier, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinImpulseModifier, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fCounterImpulseRatio, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fTempInitialStiffnessWhenShot, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fAnimalMassMult, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fAnimalImpulseMultMin, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fAnimalImpulseMultMax, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fInitialHitImpulseMult, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.CPlayerInfo__Tunables: - return new PsoStructureInfo(MetaName.CPlayerInfo__Tunables, 0, 0, 992, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.EnemyCharging, PsoDataType.Structure, 16, 0, (MetaName)2968011987), - new PsoStructureEntryInfo(MetaName.CombatLoitering, PsoDataType.Structure, 48, 0, (MetaName)2859355160), - new PsoStructureEntryInfo(MetaName.MinVehicleCollisionDamageScale, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVehicleCollisionDamageScale, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngleConsidered, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToConsiderVehicleValid, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistToConsiderVehicleValid, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.SprintReplenishFinishedPercentage, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)3763989739, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.SprintReplenishRateMultiplier, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.SprintReplenishRateMultiplierBike, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWorldLimitsPlayerX, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWorldLimitsPlayerY, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MinWorldLimitsPlayerX, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MinWorldLimitsPlayerY, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToTrespassWhileSwimmingBeforeDeath, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MovementAwayWeighting, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceWeighting, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingWeighting, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.CameraWeighting, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceWeightingNoStick, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingWeightingNoStick, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.OnFireWeightingMult, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeMaxRestoreDuration, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeMinRestoreDuration, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleDepletionMinMult, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleDepletionMidMult, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleDepletionMaxMult, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleMinDepletionLimit, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleMidDepletionLimit, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleMaxDepletionLimit, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenSwitchToClearTasks, PsoDataType.UInt, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenShoutTargetPosition, PsoDataType.UInt, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.TrespassGuardModelName, PsoDataType.String, 188, 7, 0), - new PsoStructureEntryInfo(MetaName.GuardWorldExtents, PsoDataType.Bool, 192, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPlayerInfo__sSprintControlData), - new PsoStructureEntryInfo(MetaName.SprintControlData, PsoDataType.Array, 200, 1, (MetaName)262180), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPlayerInfo__sPlayerStatInfo), - new PsoStructureEntryInfo(MetaName.PlayerStatInfos, PsoDataType.Array, 336, 1, (MetaName)524326), - new PsoStructureEntryInfo((MetaName)4178328957, PsoDataType.Float, 984, 0, 0), - new PsoStructureEntryInfo((MetaName)1447073898, PsoDataType.Float, 988, 0, 0) - ); - case (MetaName)2968011987: - return new PsoStructureInfo((MetaName)2968011987, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.fChargeGoalBehindCoverCentralOffset, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fChargeGoalLateralOffset, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fChargeGoalRearOffset, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fChargeGoalMaxAdjustRadius, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fPlayerMoveDistToResetChargeGoals, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)2859355160: - return new PsoStructureInfo((MetaName)2859355160, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.fPlayerMoveDistToResetLoiterPosition, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.uDistanceCheckPeriodMS, PsoDataType.UInt, 12, 0, 0) - ); - case MetaName.CPlayerInfo__sSprintControlData: - return new PsoStructureInfo(MetaName.CPlayerInfo__sSprintControlData, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.TapAdd, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.HoldSub, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ReleaseSub, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Threshhold, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLimit, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ResultMult, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CPlayerInfo__sPlayerStatInfo: - return new PsoStructureInfo(MetaName.CPlayerInfo__sPlayerStatInfo, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinStaminaDuration, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxStaminaDuration, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHoldBreathDuration, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHoldBreathDuration, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinWheelieAbility, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWheelieAbility, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPlaneControlAbility, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPlaneControlAbility, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPlaneDamping, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPlaneDamping, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeliDamping, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeliDamping, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFallHeight, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxFallHeight, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDiveHeight, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDiveHeight, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.DiveRampPow, PsoDataType.Float, 76, 0, 0) - ); - case MetaName.CAnimSpeedUps__Tunables: - return new PsoStructureInfo(MetaName.CAnimSpeedUps__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MultiplayerClimbStandRateModifier, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MultiplayerClimbRunningRateModifier, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MultiplayerClimbClamberRateModifier, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MultiplayerEnterExitJackVehicleRateModifier, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MultiplayerLadderRateModifier, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MultiplayerReloadRateModifier, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MultiplayerCoverIntroRateModifier, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MultiplayerIdleTurnRateModifier, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceMPAnimRatesInSP, PsoDataType.Bool, 48, 0, 0) - ); - case MetaName.CPlayerPedTargeting__Tunables: - return new PsoStructureInfo(MetaName.CPlayerPedTargeting__Tunables, 0, 0, 3776, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fTargetableDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fTargetThreatOverride, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ArrestHardLockDistance, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.UnarmedInCoverTargetingDistance, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1109599945, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MeleeLostLOSBreakTime, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToAllowCachedStickInputForMelee, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.DoAynchronousProbesWhenFindingFreeAimAssistTarget, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowDriverLockOnToAmbientPeds, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowDriverLockOnToAmbientPedsInSP, PsoDataType.Bool, 46, 0, 0), - new PsoStructureEntryInfo(MetaName.DisplayAimAssistIntersections, PsoDataType.Bool, 47, 0, 0), - new PsoStructureEntryInfo((MetaName)2235947157, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DisplayAimAssistCurves, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo(MetaName.DisplayLockOnDistRanges, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo(MetaName.DisplayLockOnAngularRanges, PsoDataType.Bool, 51, 0, 0), - new PsoStructureEntryInfo(MetaName.DisplaySoftLockDebug, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DisplayFreeAimTargetDebug, PsoDataType.Bool, 53, 0, 0), - new PsoStructureEntryInfo(MetaName.DebugLockOnTargets, PsoDataType.Bool, 54, 0, 0), - new PsoStructureEntryInfo(MetaName.UseRagdollTargetIfNoAssistTarget, PsoDataType.Bool, 55, 0, 0), - new PsoStructureEntryInfo(MetaName.UseReticuleSlowDownStrafeClamp, PsoDataType.Bool, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.EasyTargettingDifficultyInfo, PsoDataType.Structure, 64, 0, MetaName.CTargettingDifficultyInfo), - new PsoStructureEntryInfo(MetaName.NormalTargettingDifficultyInfo, PsoDataType.Structure, 528, 0, MetaName.CTargettingDifficultyInfo), - new PsoStructureEntryInfo((MetaName)2843442022, PsoDataType.Structure, 992, 0, MetaName.CTargettingDifficultyInfo), - new PsoStructureEntryInfo((MetaName)933644170, PsoDataType.Structure, 1456, 0, MetaName.CTargettingDifficultyInfo), - new PsoStructureEntryInfo((MetaName)1051298047, PsoDataType.Structure, 1920, 0, MetaName.CTargettingDifficultyInfo), - new PsoStructureEntryInfo((MetaName)1712651720, PsoDataType.Structure, 2384, 0, MetaName.CTargettingDifficultyInfo), - new PsoStructureEntryInfo((MetaName)3769742750, PsoDataType.Structure, 2848, 0, MetaName.CTargettingDifficultyInfo), - new PsoStructureEntryInfo((MetaName)1604857901, PsoDataType.Structure, 3312, 0, MetaName.CTargettingDifficultyInfo) - ); - case MetaName.CTargettingDifficultyInfo: - return new PsoStructureInfo(MetaName.CTargettingDifficultyInfo, 0, 0, 464, - new PsoStructureEntryInfo(MetaName.LockType, PsoDataType.Enum, 8, 0, MetaName.LockType), - new PsoStructureEntryInfo((MetaName)3742855719, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.UseLockOnTargetSwitching, PsoDataType.Bool, 13, 0, 0), - new PsoStructureEntryInfo(MetaName.UseReticuleSlowDownForRunAndGun, PsoDataType.Bool, 14, 0, 0), - new PsoStructureEntryInfo(MetaName.UseReticuleSlowDown, PsoDataType.Bool, 15, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableBulletBending, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowSoftLockFineAim, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.UseFineAimSpring, PsoDataType.Bool, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.UseNewSlowDownCode, PsoDataType.Bool, 19, 0, 0), - new PsoStructureEntryInfo(MetaName.UseCapsuleTests, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.UseDriveByAssistedAim, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo((MetaName)3708089905, PsoDataType.Bool, 22, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnRangeModifier, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ReticuleSlowDownRadius, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ReticuleSlowDownCapsuleRadius, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ReticuleSlowDownCapsuleLength, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimit, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitClose, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitCloseDistMin, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitCloseDistMax, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.WideTargetAngularLimit, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.CycleTargetAngularLimit, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.CycleTargetAngularLimitMelee, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAimPitchMin, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultTargetAimPitchMax, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.NoReticuleLockOnRangeModifier, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.NoReticuleMaxLockOnRange, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.NoReticuleTargetAngularLimit, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.NoReticuleTargetAngularLimitClose, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.NoReticuleTargetAngularLimitCloseDistMin, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.NoReticuleTargetAngularLimitCloseDistMax, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.NoReticuleTargetAimPitchLimit, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelocityForDriveByAssistedAim, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnDistanceRejectionModifier, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimVerticalMovement, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimDownwardsVerticalMovement, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimSidewaysScale, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSoftLockBreakTime, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSoftLockBreakTimeCloseRange, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSoftLockBreakAtMaxXStickTime, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockBreakDistanceMin, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockBreakDistanceMax, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFineAimTime, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.MinFineAimTimeHoldingStick, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.MinNoReticuleAimTime, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.AimAssistCapsuleRadius, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo((MetaName)2152729841, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.AimAssistCapsuleMaxLength, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo((MetaName)1099784311, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.AimAssistBlendInTime, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.AimAssistBlendOutTime, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockFineAimBreakXYValue, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockFineAimBreakZValue, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockFineAimXYAbsoluteValue, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockFineAimXYAbsoluteValueClose, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockBreakValue, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockTime, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.SoftLockTimeToAcquireTarget, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo((MetaName)2167138628, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimHorSpeedMin, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimHorSpeedMax, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimVerSpeed, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimSpeedMultiplier, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimHorWeightSpeedMultiplier, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimHorSpeedPower, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimSpeedMultiplierClose, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimSpeedMultiplierCloseDistMin, PsoDataType.Float, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.FineAimSpeedMultiplierCloseDistMax, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo((MetaName)1715236167, PsoDataType.Float, 248, 0, 0), - new PsoStructureEntryInfo((MetaName)1204531501, PsoDataType.Float, 252, 0, 0), - new PsoStructureEntryInfo((MetaName)2894104098, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo((MetaName)1976544803, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo((MetaName)922516025, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo((MetaName)3926385305, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo((MetaName)493048149, PsoDataType.Float, 272, 0, 0), - new PsoStructureEntryInfo((MetaName)2549641570, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnSwitchTimeExtensionBreakLock, PsoDataType.UInt, 280, 0, 0), - new PsoStructureEntryInfo(MetaName.LockOnSwitchTimeExtensionKillTarget, PsoDataType.UInt, 284, 0, 0), - new PsoStructureEntryInfo((MetaName)3957255740, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo((MetaName)3799655237, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCurveSet), - new PsoStructureEntryInfo(MetaName.CurveSets, PsoDataType.Array, 296, 1, (MetaName)262224), - new PsoStructureEntryInfo(MetaName.AimAssistDistanceCurve, PsoDataType.Structure, 432, 0, MetaName.CCurveSet) - ); - case MetaName.CCurveSet: - return new PsoStructureInfo(MetaName.CCurveSet, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCurve), - new PsoStructureEntryInfo(MetaName.curves, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case MetaName.CCurve: - return new PsoStructureInfo(MetaName.CCurve, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.fInputMax, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.fResultMax, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.fPow, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CRandomEventManager__Tunables: - return new PsoStructureInfo(MetaName.CRandomEventManager__Tunables, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.RenderDebug, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceCrime, PsoDataType.Bool, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.EventInterval, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.EventInitInterval, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1980648971), - new PsoStructureEntryInfo(MetaName.RandomEventType, PsoDataType.Array, 32, 0, (MetaName)6), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2790883352), - new PsoStructureEntryInfo(MetaName.RandomEventData, PsoDataType.Array, 48, 0, (MetaName)8), - new PsoStructureEntryInfo(MetaName.SpawningChasesEnabled, PsoDataType.Bool, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxNumberCopVehiclesInChase, PsoDataType.SInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.ProbSpawnHeli, PsoDataType.SInt, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAmbientVehiclesToSpawnChase, PsoDataType.SInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPlayerMoveDistanceToSpawnChase, PsoDataType.SInt, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.HeliVehicleModelId, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo(MetaName.HeliPedModelId, PsoDataType.String, 88, 7, 0) - ); - case (MetaName)1980648971: - return new PsoStructureInfo((MetaName)1980648971, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.RandomEventTypeName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.RandomEventTimeIntervalMin, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.RandomEventTimeIntervalMax, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DeltaScaleWhenPlayerStationary, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)2790883352: - return new PsoStructureInfo((MetaName)2790883352, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.RandomEventName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.RandomEventType, PsoDataType.Enum, 12, 0, (MetaName)3799765345) - ); - case MetaName.CEventExplosionHeard__Tunables: - return new PsoStructureInfo(MetaName.CEventExplosionHeard__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxCombineDistThresholdSquared, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CRelationshipManager__Tunables: - return new PsoStructureInfo(MetaName.CRelationshipManager__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DisplayRemovedGroups, PsoDataType.Bool, 16, 0, 0) - ); - case MetaName.CTaskAgitated__Tunables: - return new PsoStructureInfo(MetaName.CTaskAgitated__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)588501678), - new PsoStructureEntryInfo(MetaName.TimeBetweenLookAts, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MovingAwayVelocityMSThreshold, PsoDataType.Float, 36, 0, 0) - ); - case (MetaName)588501678: - return new PsoStructureInfo((MetaName)588501678, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Info, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.Hashes, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.History, PsoDataType.Bool, 11, 0, 0) - ); - case MetaName.CTaskConfront__Tunables: - return new PsoStructureInfo(MetaName.CTaskConfront__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceIfUnarmed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistanceIfArmed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToMove, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRadius, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToIntimidateArmedTarget, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToIntimidateUnarmedTarget, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.CTaskSmartFlee__Tunables: - return new PsoStructureInfo(MetaName.CTaskSmartFlee__Tunables, 0, 0, 136, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)2976849785, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2923989237, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo((MetaName)964747565, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2588997912, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3847831913, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)182226933, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3494668944, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)55450154, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)1156561437, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2850307001, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)4172340609, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)916666022, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1653710895, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitVehicleMaxDistance, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitVehicleRouteMinDistance, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenHandsUpChecks, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenExitVehicleDueToRouteChecks, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToCower, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeForHandsUp, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeForHandsUp, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimeForExitVehicle, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimeForExitVehicle, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ChanceToDeleteOnExitVehicle, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistFromPlayerToDeleteOnExitVehicle, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRouteLengthForCower, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistFromTargetWhenCoweringToCheckForExit, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeTargetTooCloseDistance, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)945475130, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)909291779, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRouteSizeForCower, PsoDataType.SInt, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceCower, PsoDataType.Bool, 132, 0, 0) - ); - case MetaName.CTaskScenarioFlee__Tunables: - return new PsoStructureInfo(MetaName.CTaskScenarioFlee__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fFleeProjectRange, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fInitialSearchRadius, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fSearchScaler, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fSearchRangeMax, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fFleeRange, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)1817496588, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fTargetScenarioRadius, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fProbeLength, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)3328108206, PsoDataType.UInt, 48, 0, 0) - ); - case MetaName.CTaskExhaustedFlee__Tunables: - return new PsoStructureInfo(MetaName.CTaskExhaustedFlee__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.StartingEnergy, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.EnergyLostPerSecond, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.OuterDistanceThreshold, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.InnerDistanceThreshold, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CTaskWalkAway__Tunables: - return new PsoStructureInfo(MetaName.CTaskWalkAway__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SafeDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenRouteAdjustments, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskGrowlAndFlee__Tunables: - return new PsoStructureInfo(MetaName.CTaskGrowlAndFlee__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FleeMBR, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskIntimidate__Tunables: - return new PsoStructureInfo(MetaName.CTaskIntimidate__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)920671881, PsoDataType.Bool, 16, 0, 0) - ); - case MetaName.CTaskReactAndFlee__Tunables: - return new PsoStructureInfo(MetaName.CTaskReactAndFlee__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinFleeMoveBlendRatio, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxFleeMoveBlendRatio, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.OverrideDirections, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.OverrideReactDirection, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.OverrideFleeDirection, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxReactionTime, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRate, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRate, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingChangeRate, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToRepeatLastAnimation, PsoDataType.Float, 52, 0, 0) - ); - case MetaName.CTaskReactInDirection__Tunables: - return new PsoStructureInfo(MetaName.CTaskReactInDirection__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CTaskReactToExplosion__Tunables: - return new PsoStructureInfo(MetaName.CTaskReactToExplosion__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxShellShockedDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxFlinchDistance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLookAtDistance, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskReactToImminentExplosion__Tunables: - return new PsoStructureInfo(MetaName.CTaskReactToImminentExplosion__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxEscapeDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxFlinchDistance, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskShockingEvent__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingEvent__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinRemainingRotationForScaling, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAngularVelocityScaleFactor, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAngularVelocityScaleFactor, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskShockingEventGoto__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingEventGoto__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DistSquaredThresholdAtCrowdRoundPos, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DistSquaredThresholdMovingToCrowdRoundPos, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DistVicinityOfCrowd, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraDistForGoto, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistFromOtherPeds, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MoveBlendRatioForFarGoto, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetRadiusForCloseNavMeshTask, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraToleranceForStopWatchDistance, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.CTaskShockingEventHurryAway__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingEventHurryAway__Tunables, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.LookAheadDistanceForBackAway, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToCallPolice, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToCallPolice, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToCallPolice, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancePlayingInitalTurnAnimSmallReact, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancePlayingCustomBackAwayAnimSmallReact, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancePlayingInitalTurnAnimBigReact, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancePlayingCustomBackAwayAnimBigReact, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldFleeDistance, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldFleeVehicleDistance, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldFleeFilmingDistance, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.EvasionThreshold, PsoDataType.UInt, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ClosePlayerSpeedupDistanceSquaredThreshold, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ClosePlayerSpeedupTimeThreshold, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceFromPlayerToDeleteHurriedPed, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeUntilDeletionWhenHurrying, PsoDataType.Float, 76, 0, 0) - ); - case MetaName.CTaskShockingEventWatch__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingEventWatch__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxTargetAngularMovementForWatch, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ThresholdWatchAfterFace, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ThresholdWatchStop, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceBetweenFilmingPeds, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)1440458015, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceAwayForFilming, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.CTaskShockingEventReact__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingEventReact__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TurningTolerance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TurningRate, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TurningEnergyUpperThreshold, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.TurningEnergyLowerThreshold, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenReactionIdlesMin, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenReactionIdlesMax, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendoutPhase, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CTaskShockingEventBackAway__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingEventBackAway__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxHeadingAdjustmentRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeadingAlignmentCosThreshold, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeadingAlignmentCosThreshold, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MoveNetworkBlendoutDuration, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultBackwardsProjectionRange, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AxesFacingTolerance, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForBackAway, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForBackAway, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWptAngle, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutPhase, PsoDataType.Float, 52, 0, 0) - ); - case MetaName.CTaskShockingEventReactToAircraft__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingEventReactToAircraft__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ThresholdWatch, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ThresholdRun, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskShockingPoliceInvestigate__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingPoliceInvestigate__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ExtraDistForGoto, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MoveBlendRatioForFarGoto, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistFromPlayerToDeleteOffscreen, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DeleteOffscreenTimeMS_MIN, PsoDataType.UInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DeleteOffscreenTimeMS_MAX, PsoDataType.UInt, 32, 0, 0) - ); - case MetaName.CTaskShockingEventStopAndStare__Tunables: - return new PsoStructureInfo(MetaName.CTaskShockingEventStopAndStare__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.BringVehicleToHaltDistance, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskShove__Tunables: - return new PsoStructureInfo(MetaName.CTaskShove__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)838054604), - new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDot, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusForContact, PsoDataType.Float, 40, 0, 0) - ); - case (MetaName)838054604: - return new PsoStructureInfo((MetaName)838054604, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Contact, PsoDataType.Bool, 9, 0, 0) - ); - case MetaName.CTaskShoved__Tunables: - return new PsoStructureInfo(MetaName.CTaskShoved__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CScenarioClipHelper__Tunables: - return new PsoStructureInfo(MetaName.CScenarioClipHelper__Tunables, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CVehicleScenarioManager__AttractorTuning__Tunables: - return new PsoStructureInfo(MetaName.CVehicleScenarioManager__AttractorTuning__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ForwardDirectionThresholdCosSquared, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistToPathDefault, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistToVehicle, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistToVehicle, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.NumToUpdatePerFrame, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeAfterAttractionMs, PsoDataType.UInt, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeAfterChainTestFailedMs, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeAfterFailedConditionsMs, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeAfterNoBoundsMs, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPassengersForAttraction, PsoDataType.UShort, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPassengersForAttraction, PsoDataType.UShort, 54, 0, 0) - ); - case MetaName.CTaskCoupleScenario__Tunables: - return new PsoStructureInfo(MetaName.CTaskCoupleScenario__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ResumeDistSq, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StopDistSq, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetDistance, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskCowerScenario__Tunables: - return new PsoStructureInfo(MetaName.CTaskCowerScenario__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.EventDecayTimeMS, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ReturnToNormalDistanceSq, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.BackHeadingInterpRate, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.EventlessSwitchStateTimeRequirement, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.EventlessSwitchInactivityTimeRequirement, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.EventlessSwitchDistanceRequirement, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistFromPlayerToDeleteCoweringForever, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.CoweringForeverDeleteOffscreenTimeMS_MIN, PsoDataType.UInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.CoweringForeverDeleteOffscreenTimeMS_MAX, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.FlinchDecayTime, PsoDataType.UInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenFlinches, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.CTaskUseScenario__Tunables: - return new PsoStructureInfo(MetaName.CTaskUseScenario__Tunables, 0, 0, 152, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AdvanceUseTimeRandomMaxProportion, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.BreakAttachmentMoveSpeedThreshold, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.BreakAttachmentOrientationThreshold, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitAttachmentMoveSpeedThreshold, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.RouteLengthThresholdForFinalApproach, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ZThresholdForApproachOffset, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DetachExitDefaultPhaseThreshold, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.FastExitDefaultPhaseThreshold, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.RouteLengthThresholdForApproachOffset, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraFleeDistance, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.FindPropInEnvironmentDist, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRateToPlayCowerReaction, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRateToPlayCowerReaction, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDifferenceBetweenCowerReactionRates, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.ReactAndFleeBlendOutPhase, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.RegularExitDefaultPhaseThreshold, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeOfDayRandomnessHours, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToLeaveMinBetweenAnybody, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToLeaveRandomAmount, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToLeaveRandomFraction, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.PavementFloodFillSearchRadius, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.DelayBetweenPavementFloodFillSearches, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeMBRMin, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeMBRMax, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPathLengthForValidExit, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceNavmeshMayAdjustPath, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenChecksToLeaveCowering, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.SkipGotoXYDist, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.SkipGotoZDist, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.SkipGotoHeadingDeltaDegrees, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.MinExtraMoney, PsoDataType.SInt, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxExtraMoney, PsoDataType.SInt, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.UpdatesBeforeShiftingBounds, PsoDataType.SByte, 144, 0, 0) - ); - case MetaName.CTaskUseVehicleScenario__Tunables: - return new PsoStructureInfo(MetaName.CTaskUseVehicleScenario__Tunables, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.BringVehicleToHaltDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.IdleTimeRandomFactor, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowDownDist, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowDownSpeed, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.SwitchToStraightLineDist, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetArriveDist, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.PlaneTargetArriveDist, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.HeliTargetArriveDist, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.BoatTargetArriveDist, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.PlaneTargetArriveDistTaxiOnGround, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.PlaneDrivingSubtaskArrivalDist, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.BoatMaxAvoidanceAngle, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSearchDistance, PsoDataType.UShort, 64, 0, 0) - ); - case MetaName.CTaskWanderingScenario__Tunables: - return new PsoStructureInfo(MetaName.CTaskWanderingScenario__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeWaitingForBlockingArea, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SwitchToNextPointDistWalking, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SwitchToNextPointDistJogging, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.PreferNearWaterSurfaceArrivalRadius, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenBlockingAreaChecksMS, PsoDataType.UInt, 32, 0, 0) - ); - case MetaName.CTaskPoliceOrderResponse__Tunables: - return new PsoStructureInfo(MetaName.CTaskPoliceOrderResponse__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToWait, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedForVehicleMovingSlowly, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForVehicleMovingQuickly, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBeforeOvertakeToMatchSpeedWhenPulledOver, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBeforeOvertakeToMatchSpeedWhenCruising, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.CheatPowerIncreaseForMatchSpeed, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.HashOrdering, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)683308669, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)527303977, PsoDataType.Float, 48, 0, 0) - ); - case MetaName.CTaskArrestPed__Tunables: - return new PsoStructureInfo(MetaName.CTaskArrestPed__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AimDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ArrestDistance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ArrestInVehicleDistance, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MoveToDistanceInVehicle, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetDistanceFromVehicleEntry, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)1425198943, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)4218266421, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)305536610, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.RegainComet, PsoDataType.UInt, 48, 0, 0) - ); - case MetaName.CTaskSwatOrderResponse__Tunables: - return new PsoStructureInfo(MetaName.CTaskSwatOrderResponse__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.HashOrdering, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)683308669, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskHeliOrderResponse__Tunables: - return new PsoStructureInfo(MetaName.CTaskHeliOrderResponse__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)3905663903, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)143141277, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)490178156, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)2892876798, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)3618878970, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)3555374966, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.CTaskWitness__Tunables: - return new PsoStructureInfo(MetaName.CTaskWitness__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeMoveNearCrimeMs, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeMoveToLawMs, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeSearchMs, PsoDataType.UInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeMoveToLawFailedPathfindingMs, PsoDataType.UInt, 28, 0, 0) - ); - case MetaName.CEventShocking__Tunables: - return new PsoStructureInfo(MetaName.CEventShocking__Tunables, 0, 0, 224, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.LifeTime, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.VisualReactionRange, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.CopInVehicleVisualReactionRange, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.AudioReactionRange, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.AIOnlyReactionRangeScaleFactor, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.DuckAndCoverCanTriggerForPlayerTime, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.GotoWatchRange, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.StopWatchDistance, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.HurryAwayMBRChangeDelay, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.HurryAwayMBRChangeRange, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.HurryAwayInitialMBR, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.HurryAwayMoveBlendRatioWhenFar, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.HurryAwayMoveBlendRatioWhenNear, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinWatchTime, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWatchTime, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MinWatchTimeHurryAway, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxWatchTimeHurryAway, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.ChanceOfWatchRatherThanHurryAway, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPhoneFilmTime, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPhoneFilmTime, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPhoneFilmTimeHurryAway, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPhoneFilmTimeHurryAway, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.ChanceOfFilmingEventOnPhoneIfWatching, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.PedGenBlockedAreaMinRadius, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.WanderInfluenceSphereRadius, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.TriggerAmbientReactionChances, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForAmbientReaction, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForAmbientReaction, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.AmbientEventLifetime, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeForAmbientReaction, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeForAmbientReaction, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.PedFearImpact, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.ShockingSpeechChance, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.DuplicateDistanceCheck, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeForAudioReaction, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToUseGunfireReactAndFleeAnimations, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.PedGenBlockingAreaLifeTimeMS, PsoDataType.UInt, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.DuplicateTimeCheck, PsoDataType.UInt, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.ShockingSpeechHash, PsoDataType.String, 176, 7, 0), - new PsoStructureEntryInfo(MetaName.ShockingFilmSpeechHash, PsoDataType.String, 180, 7, 0), - new PsoStructureEntryInfo(MetaName.Priority, PsoDataType.SInt, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.AmbientEventType, PsoDataType.Enum, 188, 0, MetaName.AmbientEventType), - new PsoStructureEntryInfo(MetaName.AddPedGenBlockedArea, PsoDataType.Bool, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.CausesVehicleAvoidance, PsoDataType.Bool, 193, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowIgnoreAsLowPriority, PsoDataType.Bool, 194, 0, 0), - new PsoStructureEntryInfo(MetaName.DebugDisplayAlwaysUseEventPosition, PsoDataType.Bool, 195, 0, 0), - new PsoStructureEntryInfo(MetaName.DebugDisplayListPlayerInfo, PsoDataType.Bool, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.HurryAwayWatchFirst, PsoDataType.Bool, 197, 0, 0), - new PsoStructureEntryInfo(MetaName.MobileChatScenarioMayAbort, PsoDataType.Bool, 198, 0, 0), - new PsoStructureEntryInfo(MetaName.WatchSayFightCheers, PsoDataType.Bool, 199, 0, 0), - new PsoStructureEntryInfo(MetaName.WatchSayShocked, PsoDataType.Bool, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleSlowDown, PsoDataType.Bool, 201, 0, 0), - new PsoStructureEntryInfo(MetaName.IgnoreIfSensingPedIsOtherEntity, PsoDataType.Bool, 202, 0, 0), - new PsoStructureEntryInfo(MetaName.IgnorePavementChecks, PsoDataType.Bool, 203, 0, 0), - new PsoStructureEntryInfo(MetaName.AllowScanningEvenIfPreviouslyReacted, PsoDataType.Bool, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.ReactionMode, PsoDataType.Enum, 208, 0, (MetaName)1809724872), - new PsoStructureEntryInfo(MetaName.StopResponseWhenExpired, PsoDataType.Bool, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeIfApproachedByOtherEntity, PsoDataType.Bool, 213, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeIfApproachedBySourceEntity, PsoDataType.Bool, 214, 0, 0), - new PsoStructureEntryInfo(MetaName.CanCallPolice, PsoDataType.Bool, 215, 0, 0), - new PsoStructureEntryInfo(MetaName.IgnoreFovForHeadIk, PsoDataType.Bool, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.ReactToOtherEntity, PsoDataType.Bool, 217, 0, 0) - ); - case MetaName.CSituationalClipSetStreamer__Tunables: - return new PsoStructureInfo(MetaName.CSituationalClipSetStreamer__Tunables, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Avoids, PsoDataType.Structure, 16, 0, (MetaName)2341712397), - new PsoStructureEntryInfo(MetaName.FleeReactions, PsoDataType.Structure, 48, 0, MetaName.iVectorDefault) - ); - case (MetaName)2341712397: - return new PsoStructureInfo((MetaName)2341712397, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.ClipSet, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ClipSetForCasual, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1095110195), - new PsoStructureEntryInfo(MetaName.Variations, PsoDataType.Array, 16, 0, (MetaName)2) - ); - case MetaName.iVectorDefault: - return new PsoStructureInfo(MetaName.iVectorDefault, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.ClipSetForIntro, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)3696584734, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo((MetaName)4027846555, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.ClipSetForRuns, PsoDataType.String, 20, 7, 0), - new PsoStructureEntryInfo((MetaName)3482724306, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo((MetaName)551602790, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInCombatToNotStreamIn, PsoDataType.Float, 32, 0, 0) - ); - case (MetaName)1095110195: - return new PsoStructureInfo((MetaName)1095110195, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ClipSet, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.IsCasual, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Chances, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CEventFootStepHeard__Tunables: - return new PsoStructureInfo(MetaName.CEventFootStepHeard__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTacticalAnalysisNavMeshPoints__Tunables: - return new PsoStructureInfo(MetaName.CTacticalAnalysisNavMeshPoints__Tunables, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.BufferDistance, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenAttemptsToFindNewPosition, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenLineOfSightTests, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenAttemptsToFindNearby, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSearchRadiusForNavMesh, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusForFindNearby, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceBetweenPositionsWithClearLineOfSight, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceBetweenPositionsWithoutClearLineOfSightInExteriors, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceBetweenPositionsWithoutClearLineOfSightInInteriors, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxXYDistanceForNewPosition, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxNearbyToFindPerFrame, PsoDataType.SInt, 64, 0, 0) - ); - case MetaName.CTacticalAnalysisCoverPointSearch__Tunables: - return new PsoStructureInfo(MetaName.CTacticalAnalysisCoverPointSearch__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Scoring, PsoDataType.Structure, 16, 0, (MetaName)850484111), - new PsoStructureEntryInfo(MetaName.ScoreCalculationsPerFrame, PsoDataType.SInt, 48, 0, 0) - ); - case (MetaName)850484111: - return new PsoStructureInfo((MetaName)850484111, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Occupied, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Scripted, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.PointOnMap, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToBeConsideredOptimal, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToBeConsideredOptimal, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.Optimal, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CTacticalAnalysisCoverPoints__Tunables: - return new PsoStructureInfo(MetaName.CTacticalAnalysisCoverPoints__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceMovedToStartSearch, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeBetweenSearches, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForSearch, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForSearch, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenLineOfSightTests, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenAttemptsToFindNearby, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenStatusUpdates, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.RadiusForFindNearby, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxNearbyToFindPerFrame, PsoDataType.SInt, 48, 0, 0) - ); - case MetaName.CTacticalAnalysis__Tunables: - return new PsoStructureInfo(MetaName.CTacticalAnalysis__Tunables, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.BadRoute, PsoDataType.Structure, 16, 0, (MetaName)1310298123), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 40, 0, (MetaName)1230349399), - new PsoStructureEntryInfo(MetaName.MaxSpeedToActivate, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToDeactivate, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeWithNoReferences, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 76, 0, 0) - ); - case (MetaName)1310298123: - return new PsoStructureInfo((MetaName)1310298123, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ValueForUnableToFind, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForTooCloseToTarget, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForTaint, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DecayRate, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)1230349399: - return new PsoStructureInfo((MetaName)1230349399, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverPoints, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.NavMeshPoints, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.Position, PsoDataType.Bool, 11, 0, 0), - new PsoStructureEntryInfo(MetaName.LineOfSightStatus, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ArcStatus, PsoDataType.Bool, 13, 0, 0), - new PsoStructureEntryInfo(MetaName.Reserved, PsoDataType.Bool, 14, 0, 0), - new PsoStructureEntryInfo(MetaName.Nearby, PsoDataType.Bool, 15, 0, 0), - new PsoStructureEntryInfo(MetaName.BadRouteValue, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.Reservations, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.LineOfSightTests, PsoDataType.Bool, 18, 0, 0) - ); - case MetaName.CTaskVehicleApproach__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleApproach__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceAroundClosestRoadNode, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskVehicleBlock__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleBlock__Tunables, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DistanceToCapSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToStartCappingSpeed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.AdditionalSpeedCap, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceFromTargetToForceStraightLineMode, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToLookAhead, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToLookAhead, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToStartBackAndForth, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsOurSideToStartBackAndForth, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToContinueBackAndForth, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToStartBrakeInFront, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotMovingTowardsTargetToStartBrakeInFront, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToContinueBrakeInFront, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotMovingTowardsTargetToContinueBrakeInFront, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToStartCruiseInFront, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotMovingAwayFromTargetToStartCruiseInFront, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToContinueCruiseInFront, PsoDataType.Float, 76, 0, 0) - ); - case MetaName.CTaskVehicleBlockCruiseInFront__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleBlockCruiseInFront__Tunables, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Probes, PsoDataType.Structure, 16, 0, (MetaName)3985328803), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 56, 0, (MetaName)999261493), - new PsoStructureEntryInfo(MetaName.StraightLineDistance, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToLookAhead, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToLookAhead, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotForSlowdown, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForSlowdown, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForSlowdown, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForMinSlowdown, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForMaxSlowdown, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealDistance, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToAdjustSpeed, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToAdjustSpeed, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MinCruiseSpeedMultiplier, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCruiseSpeedMultiplier, PsoDataType.Float, 120, 0, 0) - ); - case (MetaName)3985328803: - return new PsoStructureInfo((MetaName)3985328803, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Collision, PsoDataType.Structure, 8, 0, (MetaName)1883924946) - ); - case (MetaName)1883924946: - return new PsoStructureInfo((MetaName)1883924946, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)2241187664, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)3879165256, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo((MetaName)4154217054, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinLength, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxLength, PsoDataType.Float, 24, 0, 0) - ); - case (MetaName)999261493: - return new PsoStructureInfo((MetaName)999261493, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Probe, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.ProbeResults, PsoDataType.Bool, 10, 0, 0), - new PsoStructureEntryInfo((MetaName)2932215080, PsoDataType.Bool, 11, 0, 0), - new PsoStructureEntryInfo((MetaName)1537468920, PsoDataType.Bool, 12, 0, 0) - ); - case MetaName.CTaskVehicleBlockBrakeInFront__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleBlockBrakeInFront__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeAheadForGetInPosition, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinOffsetForGetInPosition, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeAheadForBrake, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeAheadForBrakeOnWideRoads, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeForBrake, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.FutureDistanceForMinSteerAngle, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.FutureDistanceForMaxSteerAngle, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedToUseHandBrake, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToClampCruiseSpeed, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToClampCruiseSpeed, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCruiseSpeedWhenClamped, PsoDataType.Float, 56, 0, 0) - ); - case MetaName.CTaskVehicleBlockBackAndForth__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleBlockBackAndForth__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ThrottleMultiplier, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskVehicleFlee__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleFlee__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ChancesForSwerve, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForSwerve, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToSwerve, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToSwerve, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesForHesitate, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedForHesitate, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToHesitate, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToHesitate, PsoDataType.Float, 44, 0, 0) - ); - case MetaName.CTaskVehicleCruiseBoat__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleCruiseBoat__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fTimeToPickNewPoint, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fDistToPickNewPoint, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fDistSearch, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskVehicleDeadDriver__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleDeadDriver__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SwerveTime, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.SteerAngleControl, PsoDataType.Enum, 20, 0, (MetaName)888350649), - new PsoStructureEntryInfo(MetaName.MinSteerAngle, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSteerAngle, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ThrottleControl, PsoDataType.Enum, 32, 0, (MetaName)2055586340), - new PsoStructureEntryInfo(MetaName.MinThrottle, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxThrottle, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.BrakeControl, PsoDataType.Enum, 44, 0, (MetaName)3374036042), - new PsoStructureEntryInfo(MetaName.MinBrake, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBrake, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.HandBrakeControl, PsoDataType.Enum, 56, 0, (MetaName)4001255574) - ); - case MetaName.CTaskVehicleFleeBoat__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleFleeBoat__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.FleeDistance, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskVehicleCrash__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleCrash__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForWreck, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskVehicleGoToPointWithAvoidanceAutomobile__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleGoToPointWithAvoidanceAutomobile__Tunables, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TailgateDistanceMax, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TailgateIdealDistanceMin, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TailgateIdealDistanceMax, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.TailgateSpeedMultiplierMin, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TailgateSpeedMultiplierMax, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.TailgateVelocityMin, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ChanceOfPedSeeingCarFromBehind, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForAvoid, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForAvoid, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedForAvoid, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForAvoid, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceForAvoidDirected, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForAvoidDirected, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceForAvoidDirected, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedForAvoidDirected, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAbsDotForAvoidDirected, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedForBrace, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForDive, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToConsiderDangerousDriving, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MultiplierForDangerousDriving, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToSideOnPavement, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToSideOnPavement, PsoDataType.Float, 100, 0, 0) - ); - case MetaName.CTaskVehicleGoToBoat__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleGoToBoat__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SlowdownDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.RouteArrivalDistance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.RouteLookAheadDistance, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskVehicleGoToHelicopter__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleGoToHelicopter__Tunables, 0, 0, 152, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.slowDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.maxCruiseSpeed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.maxPitchRoll, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.maxThrottle, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.leanKp, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.leanKi, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.leanKd, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.yawKp, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.yawKi, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.yawKd, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.throttleKp, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.throttleKi, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.throttleKd, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.whiskerForwardTestDistance, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.whiskerForwardSpeedScale, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.whiskerLateralTestDistance, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.whiskerVerticalTestDistance, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.whiskerTestAngle, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.avoidHeadingChangeSpeed, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.avoidHeadingJump, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.avoidPitchChangeSpeed, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.avoidPitchJump, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.avoidLockDuration, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)2436197334, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)1438517312, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)444775360, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)3623227512, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)3009403254, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.numHeightmapFutureSamples, PsoDataType.SInt, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.futureHeightmapSampleTime, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceXYToUseHeightMapAvoidance, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.TimesliceMinDistToTarget, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.TimesliceTimeAfterAvoidanceMs, PsoDataType.UInt, 144, 0, 0) - ); - case MetaName.CTaskVehicleGoToPlane__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleGoToPlane__Tunables, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.numFutureSamples, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.futureSampleTime, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.maxDesiredAngleYawDegrees, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.maxDesiredAnglePitchDegrees, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.maxDesiredAngleRollDegrees, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.angleToTargetDegreesToNotUseMinRadius, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.minMinDistanceForRollComputation, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.maxMinDistanceForRollComputation, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.maxYaw, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.maxPitch, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.maxRoll, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.maxThrottle, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.yawKp, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.yawKi, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.yawKd, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.pitchKp, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.pitchKi, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.pitchKd, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.rollKp, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.rollKi, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.rollKd, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.throttleKp, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.throttleKi, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.throttleKd, PsoDataType.Float, 108, 0, 0) - ); - case MetaName.CTaskVehicleLandPlane__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleLandPlane__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SlowDownDistance, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeOnGroundToDrive, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.HeightToStartLanding, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.LandSlopeNoseUpMin, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.LandSlopeNoseUpMax, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.CTaskVehicleMissionBase__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleMissionBase__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToKeepEngineAndLightsOnWhileParked, PsoDataType.UInt, 16, 0, 0) - ); - case MetaName.CTaskVehicleParkNew__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleParkNew__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ParkingSpaceBlockedWaitTimePerAttempt, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ParkingSpaceBlockedMaxAttempts, PsoDataType.UByte, 20, 0, 0) - ); - case MetaName.CTaskVehiclePlaneChase__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehiclePlaneChase__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskVehiclePullAlongside__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehiclePullAlongside__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeToLookAhead, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToLookAhead, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.OverlapSpeedMultiplier, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedDifference, PsoDataType.Float, 28, 0, 0) - ); - case MetaName.CTaskVehiclePursue__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehiclePursue__Tunables, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DriftX, PsoDataType.Structure, 16, 0, (MetaName)42267357), - new PsoStructureEntryInfo(MetaName.DriftY, PsoDataType.Structure, 40, 0, (MetaName)42267357), - new PsoStructureEntryInfo(MetaName.TimeToLookBehind, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToLookBehind, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.SpeedDifferenceForMinDistanceToStartMatchingSpeed, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.SpeedDifferenceForMaxDistanceToStartMatchingSpeed, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToStartMatchingSpeed, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToStartMatchingSpeed, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForBackOff, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.DotToClampSpeedToMinimum, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.DotToClampSpeedToMaximum, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.SpeedForMinimumDot, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenLineOfSightChecks, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceForStraightLineModeAlways, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceForStraightLineModeIfLos, PsoDataType.Float, 112, 0, 0) - ); - case (MetaName)42267357: - return new PsoStructureInfo((MetaName)42267357, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.MinValueForCorrection, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxValueForCorrection, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRate, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskVehicleRam__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleRam__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.BackOffTimer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBackOffDistance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxBackOffDistance, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForMinBackOffDistance, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForMaxBackOffDistance, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.CTaskVehicleShotTire__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleShotTire__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeInSwerve, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedInSwerve, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToApplyTorque, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDotToApplyTorque, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.TorqueMultiplier, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.CTaskVehicleSpinOut__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleSpinOut__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeToLookAhead, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToLookAhead, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.BumperOverlapForMaxSpeed, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.BumperOverlapForMinSpeed, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.CatchUpSpeed, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.BumperOverlapToBeInPosition, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSidePaddingForTurn, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TurnTime, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.InvMassScale, PsoDataType.Float, 48, 0, 0) - ); - case MetaName.CPrioritizedClipSetRequestManager__Tunables: - return new PsoStructureInfo(MetaName.CPrioritizedClipSetRequestManager__Tunables, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.RenderDebugDraw, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.vScroll, PsoDataType.Float2, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fIndent, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxNumRequestsPerContext, PsoDataType.SInt, 32, 0, 0) - ); - case MetaName.CVehicleClipRequestHelper__Tunables: - return new PsoStructureInfo(MetaName.CVehicleClipRequestHelper__Tunables, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToScanForNearbyVehicle, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToScanForNearbyVehicle, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistUpdateFrequency, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistUpdateFrequency, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistPercentageToScaleScanArc, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistScanArc, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistScanArc, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableVehicleDependencies, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableStreamedVehicleAnimRequestHelper, PsoDataType.Bool, 45, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableStreamedEntryAnims, PsoDataType.Bool, 46, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableStreamedInVehicleAnims, PsoDataType.Bool, 47, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableStreamedEntryVariationAnims, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.StreamConnectedSeatAnims, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo(MetaName.StreamInVehicleAndEntryAnimsTogether, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo(MetaName.StreamEntryAndInVehicleAnimsTogether, PsoDataType.Bool, 51, 0, 0) - ); - case MetaName.CTaskInVehicleBasic__Tunables: - return new PsoStructureInfo(MetaName.CTaskInVehicleBasic__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.fSecondsInAirBeforePassengerComment, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.CTaskPlayerDrive__Tunables: - return new PsoStructureInfo(MetaName.CTaskPlayerDrive__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.StealthNoisePeriodMS, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthSpeedThresholdLow, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthSpeedThresholdHigh, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.StealthVehicleTypeFactorBicycles, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPlayerJumpOutSpeedBike, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPlayerJumpOutSpeedCar, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenAddingDangerousVehicleEvents, PsoDataType.Float, 40, 0, 0) - ); - case MetaName.CTaskCarReactToVehicleCollision__Tunables: - return new PsoStructureInfo(MetaName.CTaskCarReactToVehicleCollision__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.SlowDown, PsoDataType.Structure, 16, 0, (MetaName)3933935552), - new PsoStructureEntryInfo(MetaName.MaxDamageToIgnore, PsoDataType.Float, 56, 0, 0) - ); - case (MetaName)3933935552: - return new PsoStructureInfo((MetaName)3933935552, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.MinTimeToReact, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToReact, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxCruiseSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToHonk, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToHonkHeldDown, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ChancesToFlipOff, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTime, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTime, PsoDataType.Float, 36, 0, 0) - ); - case MetaName.CTaskEnterVehicle__Tunables: - return new PsoStructureInfo(MetaName.CTaskEnterVehicle__Tunables, 0, 0, 408, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.UseCombatEntryForAiJack, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableJackRateOverride, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableDoorHandleArmIk, PsoDataType.Bool, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableBikeHandleArmIk, PsoDataType.Bool, 19, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableSeatBoneArmIk, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableTagSyncIntoAlign, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableMoverFixups, PsoDataType.Bool, 22, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableBikePickPullUpOffsetScale, PsoDataType.Bool, 23, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableNewBikeEntry, PsoDataType.Bool, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ForcedDoorHandleArmIk, PsoDataType.Bool, 25, 0, 0), - new PsoStructureEntryInfo(MetaName.IgnoreRotationBlend, PsoDataType.Bool, 26, 0, 0), - new PsoStructureEntryInfo(MetaName.EnableBikePickUpAlign, PsoDataType.Bool, 27, 0, 0), - new PsoStructureEntryInfo((MetaName)192421777, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)509809270, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.BikePickUpAlignBlendDuration, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.GetInRate, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinMagForBikeToBeOnSide, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DistanceToEvaluateDoors, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.NetworkBlendDuration, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.NetworkBlendDurationOpenDoorCombat, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.DoorRatioToConsiderDoorOpenSteps, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.DoorRatioToConsiderDoorOpen, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.DoorRatioToConsiderDoorOpenCombat, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.DoorRatioToConsiderDoorClosed, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.DistToEntryToAllowForcedActionMode, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.VaultDepth, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.VaultHorizClearance, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.VaultVertClearance, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftPickUpTargetLerpPhaseStart, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftPickUpTargetLerpPhaseEnd, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftPullUpTargetLerpPhaseStart, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftPullUpTargetLerpPhaseEnd, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.RightPickUpTargetLerpPhaseStart, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.RightPickUpTargetLerpPhaseEnd, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.RightPullUpTargetLerpPhaseStart, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.RightPullUpTargetLerpPhaseEnd, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftPickUpTargetLerpPhaseStartBicycle, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftPickUpTargetLerpPhaseEndBicycle, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftPullUpTargetLerpPhaseStartBicycle, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftPullUpTargetLerpPhaseEndBicycle, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.RightPickUpTargetLerpPhaseStartBicycle, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.RightPickUpTargetLerpPhaseEndBicycle, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.RightPullUpTargetLerpPhaseStartBicycle, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.RightPullUpTargetLerpPhaseEndBicycle, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo((MetaName)3408785399, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToAbortOpenDoor, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToAbortOpenDoorCombat, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToAbortOpenDoorPlayer, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToRagdollOpenDoor, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToRagdollOpenDoorCombat, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToRagdollOpenDoorPlayer, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackRate, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeEnterForce, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleEnterForce, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.FastEnterExitRate, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetRearDoorOpenRatio, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxOpenRatioForOpenDoorInitialOutside, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxOpenRatioForOpenDoorOutside, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxOscillationDisplacementOutside, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxOpenRatioForOpenDoorInitialInside, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxOpenRatioForOpenDoorInside, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxOscillationDisplacementInside, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeEnterLeanAngleOvershootAmt, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeEnterLeanAngleOvershootRate, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToCheckEntryCollisionWhenIgnoring, PsoDataType.Float, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.CombatEntryBlendDuration, PsoDataType.Float, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToReactToJackForGoToDoor, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeStreamClipSetInBeforeWarpSP, PsoDataType.Float, 248, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeStreamClipSetInBeforeWarpMP, PsoDataType.Float, 252, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeStreamClipSetInBeforeSkippingCloseDoor, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeStreamShuffleClipSetInBeforeWarp, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo(MetaName.ClimbAlignTolerance, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenDoorChecks, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo(MetaName.UseSlowInOut, PsoDataType.Bool, 272, 0, 0), - new PsoStructureEntryInfo(MetaName.OpenDoorBlendDurationFromNormalAlign, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo(MetaName.OpenDoorBlendDurationFromOnVehicleAlign, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo(MetaName.OpenDoorToJackBlendDuration, PsoDataType.Float, 284, 0, 0), - new PsoStructureEntryInfo(MetaName.GroupMemberWaitMinTime, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo(MetaName.GroupMemberSlowDownDistance, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo(MetaName.GroupMemberWalkCloseDistance, PsoDataType.Float, 296, 0, 0), - new PsoStructureEntryInfo(MetaName.GroupMemberWaitDistance, PsoDataType.Float, 300, 0, 0), - new PsoStructureEntryInfo(MetaName.SecondsBeforeWarpToLeader, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo((MetaName)119275101, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo((MetaName)2217815195, PsoDataType.UInt, 312, 0, 0), - new PsoStructureEntryInfo(MetaName.DurationHeldDownEnterButtonToJackFriendly, PsoDataType.UInt, 316, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackAlivePedFromOutsideClipId, PsoDataType.String, 320, 7, 0), - new PsoStructureEntryInfo((MetaName)3431653792, PsoDataType.String, 324, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackDeadPedFromOutsideClipId, PsoDataType.String, 328, 7, 0), - new PsoStructureEntryInfo((MetaName)1983954745, PsoDataType.String, 332, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackAlivePedFromWaterClipId, PsoDataType.String, 336, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackDeadPedFromWaterClipId, PsoDataType.String, 340, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackPedFromOnVehicleClipId, PsoDataType.String, 344, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackDeadPedFromOnVehicleClipId, PsoDataType.String, 348, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackPedOnVehicleIntoWaterClipId, PsoDataType.String, 352, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultJackDeadPedOnVehicleIntoWaterClipId, PsoDataType.String, 356, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultClimbUpClipId, PsoDataType.String, 360, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultClimbUpNoDoorClipId, PsoDataType.String, 364, 7, 0), - new PsoStructureEntryInfo((MetaName)1857752806, PsoDataType.String, 368, 7, 0), - new PsoStructureEntryInfo((MetaName)536807372, PsoDataType.String, 372, 7, 0), - new PsoStructureEntryInfo((MetaName)298521545, PsoDataType.String, 376, 7, 0), - new PsoStructureEntryInfo((MetaName)3045129247, PsoDataType.String, 380, 7, 0), - new PsoStructureEntryInfo((MetaName)2509236171, PsoDataType.String, 384, 7, 0), - new PsoStructureEntryInfo((MetaName)939217889, PsoDataType.String, 388, 7, 0), - new PsoStructureEntryInfo((MetaName)3905015036, PsoDataType.String, 392, 7, 0), - new PsoStructureEntryInfo((MetaName)3309036906, PsoDataType.String, 396, 7, 0), - new PsoStructureEntryInfo((MetaName)3854657159, PsoDataType.Bool, 400, 0, 0), - new PsoStructureEntryInfo((MetaName)1405627810, PsoDataType.Bool, 401, 0, 0), - new PsoStructureEntryInfo((MetaName)2067860370, PsoDataType.Float, 404, 0, 0) - ); - case MetaName.CTaskEnterVehicleAlign__Tunables: - return new PsoStructureInfo(MetaName.CTaskEnterVehicleAlign__Tunables, 0, 0, 136, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.UseAttachDuringAlign, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.RenderDebugToTTY, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.ApplyRotationScaling, PsoDataType.Bool, 18, 0, 0), - new PsoStructureEntryInfo(MetaName.ApplyTranslationScaling, PsoDataType.Bool, 19, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableRotationOvershootCheck, PsoDataType.Bool, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableTranslationOvershootCheck, PsoDataType.Bool, 21, 0, 0), - new PsoStructureEntryInfo(MetaName.ReverseLeftFootAlignAnims, PsoDataType.Bool, 22, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceStandEnterOnly, PsoDataType.Bool, 23, 0, 0), - new PsoStructureEntryInfo(MetaName.TranslationChangeRate, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.RotationChangeRate, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultAlignRate, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.FastAlignRate, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.CombatAlignRate, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.ActionCombatAlignRate, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.StandAlignMaxDist, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.AlignSuccessMaxDist, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultAlignStartFixupPhase, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultAlignEndFixupPhase, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetRadiusForOrientatedAlignWalk, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.TargetRadiusForOrientatedAlignRun, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRotationalSpeedScale, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRotationalSpeedScale, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRotationalSpeed, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTranslationalScale, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTranslationalScale, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTranslationalStandSpeed, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTranslationalMoveSpeed, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.HeadingReachedTolerance, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.StdVehicleMinPhaseToStartRotFixup, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeVehicleMinPhaseToStartRotFixup, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.VaultExtraZGroundTest, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSqdDistToSetPos, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistAwayFromEntryPointToConsiderFinished, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPedFwdToEntryDotToClampInitialOrientation, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistToAlwaysClampInitialOrientation, PsoDataType.Float, 128, 0, 0) - ); - case MetaName.CTaskOpenVehicleDoorFromOutside__Tunables: - return new PsoStructureInfo(MetaName.CTaskOpenVehicleDoorFromOutside__Tunables, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.EnableOpenDoorHandIk, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultOpenDoorStartPhase, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultOpenDoorEndPhase, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultOpenDoorStartIkPhase, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultOpenDoorEndIkPhase, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendWeightToUseHighClipEvents, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultOpenDoorRate, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHandleHeightDiffVan, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHandleHeightDiffVan, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHandleHeightDiff, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultOpenDoorClipId, PsoDataType.String, 56, 7, 0), - new PsoStructureEntryInfo(MetaName.HighOpenDoorClipId, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo(MetaName.CombatOpenDoorClipId, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultTryLockedDoorClipId, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultForcedEntryClipId, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo((MetaName)26377711, PsoDataType.String, 76, 7, 0) - ); - case MetaName.CTaskCloseVehicleDoorFromInside__Tunables: - return new PsoStructureInfo(MetaName.CTaskCloseVehicleDoorFromInside__Tunables, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.EnableCloseDoorHandIk, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultCloseDoorStartPhase, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultCloseDoorEndPhase, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultCloseDoorStartIkPhase, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultCloseDoorEndIkPhase, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinBlendWeightToUseFarClipEvents, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.CloseDoorForceMultiplier, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.VehicleSpeedToAbortCloseDoor, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.PedTestXOffset, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.PedTestYOffset, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.PedTestZStartOffset, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.PedTestZOffset, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.PedTestRadius, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinOpenDoorRatioToUseArmIk, PsoDataType.Float, 68, 0, 0) - ); - case MetaName.CTaskEnterVehicleSeat__Tunables: - return new PsoStructureInfo(MetaName.CTaskEnterVehicleSeat__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinVelocityToRagdollPed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVelocityToEnterBike, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultGetInClipId, PsoDataType.String, 24, 7, 0), - new PsoStructureEntryInfo(MetaName.GetOnQuickClipId, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo(MetaName.GetInFromWaterClipId, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.GetInStandOnClipId, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.GetInCombatClipId, PsoDataType.String, 40, 7, 0) - ); - case MetaName.CTaskExitVehicle__Tunables: - return new PsoStructureInfo(MetaName.CTaskExitVehicle__Tunables, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TimeSinceLastSpottedToLeaveEngineOn, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.BeJackedBlendInDuration, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitVehicleBlendInDuration, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.ThroughWindScreenBlendInDuration, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitVehicleBlendOutDuration, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitVehicleUnderWaterBlendOutDuration, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitVehicleAttempToFireBlendOutDuration, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeExitVehicleBlendOutDuration, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.LeaderExitVehicleDistance, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitProbeDistance, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.ExitDistance, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.RearExitSideOffset, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelocityToRagdollPed, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToReserveComponentBeforeWarp, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraOffsetForGroundCheck, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.JumpOutofSubNeutralBuoyancyTime, PsoDataType.UInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultClimbDownClipId, PsoDataType.String, 80, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultClimbDownNoDoorClipId, PsoDataType.String, 84, 7, 0) - ); - case MetaName.CTaskExitVehicleSeat__Tunables: - return new PsoStructureInfo(MetaName.CTaskExitVehicleSeat__Tunables, 0, 0, 232, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)3909498748, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.AdditionalWindscreenRagdollForceFwd, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.AdditionalWindscreenRagdollForceUp, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.SkyDiveProbeDistance, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.InAirProbeDistance, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.ArrestProbeDistance, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.InWaterExitDepth, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.InWaterExitProbeLength, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeVelocityToUseAnimatedJumpOff, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleVelocityToUseAnimatedJumpOff, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultGetOutBlendDuration, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultGetOutNoWindBlendDuration, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeForArrestBreakout, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.ThroughWindscreenDamagePlayer, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.ThroughWindscreenDamageAi, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultCrashExitOnSideClipId, PsoDataType.String, 76, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBeJackedAlivePedFromOutsideClipId, PsoDataType.String, 80, 7, 0), - new PsoStructureEntryInfo((MetaName)2529144140, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBeJackedDeadPedFromOutsideClipId, PsoDataType.String, 88, 7, 0), - new PsoStructureEntryInfo((MetaName)3459414413, PsoDataType.String, 92, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBeJackedAlivePedFromWaterClipId, PsoDataType.String, 96, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBeJackedDeadPedFromWaterClipId, PsoDataType.String, 100, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBeJackedAlivePedOnVehicleClipId, PsoDataType.String, 104, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBeJackedDeadPedOnVehicleClipId, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBeJackedAlivePedOnVehicleIntoWaterClipId, PsoDataType.String, 112, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultBeJackedDeadPedOnVehicleIntoWaterClipId, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultFleeExitClipId, PsoDataType.String, 120, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultGetOutClipId, PsoDataType.String, 124, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultGetOutToWaterClipId, PsoDataType.String, 128, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultGetOutOnToVehicleClipId, PsoDataType.String, 132, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultGetOutNoWingId, PsoDataType.String, 136, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultJumpOutClipId, PsoDataType.String, 140, 7, 0), - new PsoStructureEntryInfo(MetaName.DeadFallOutClipId, PsoDataType.String, 144, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)609992288), - new PsoStructureEntryInfo(MetaName.ExitToAimClipSets, PsoDataType.Array, 152, 0, (MetaName)34), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3736014569), - new PsoStructureEntryInfo(MetaName.ExitToAimVehicleInfos, PsoDataType.Array, 168, 0, (MetaName)36), - new PsoStructureEntryInfo(MetaName.BikeExitForce, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.RagdollIntoWaterVelocity, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.GroundFixupHeight, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.GroundFixupHeightLarge, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.GroundFixupHeightLargeOffset, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.GroundFixupHeightBoatInWaterInitial, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.GroundFixupHeightBoatInWater, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.ExtraWaterZGroundFixup, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeExitExtraRotationSpeed, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.FleeExitExtraTranslationSpeed, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo((MetaName)1345368814, PsoDataType.String, 224, 7, 0), - new PsoStructureEntryInfo((MetaName)1495472466, PsoDataType.String, 228, 7, 0) - ); - case (MetaName)609992288: - return new PsoStructureInfo((MetaName)609992288, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Clips, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case (MetaName)3736014569: - return new PsoStructureInfo((MetaName)3736014569, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1118518303), - new PsoStructureEntryInfo(MetaName.Seats, PsoDataType.Array, 16, 0, (MetaName)1) - ); - case (MetaName)1118518303: - return new PsoStructureInfo((MetaName)1118518303, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ExitToAimClipsName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.OneHandedClipSetName, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.TwoHandedClipSetName, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo(MetaName.SeatPosition, PsoDataType.Enum, 20, 0, (MetaName)894416699) - ); - case MetaName.CTaskReactToBeingAskedToLeaveVehicle__Tunables: - return new PsoStructureInfo(MetaName.CTaskReactToBeingAskedToLeaveVehicle__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToWatchVehicle, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToWatchVehicle, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskRideTrain__Tunables: - return new PsoStructureInfo(MetaName.CTaskRideTrain__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDelayForGetOff, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayForGetOff, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxWaitSeconds, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskTrainBase__Tunables: - return new PsoStructureInfo(MetaName.CTaskTrainBase__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.CompletionRadius, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowDownDistance, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskTryToGrabVehicleDoor__Tunables: - return new PsoStructureInfo(MetaName.CTaskTryToGrabVehicleDoor__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinGrabTime, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxGrabTime, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHandToHandleDistance, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CTaskVehicleFSM__Tunables: - return new PsoStructureInfo(MetaName.CTaskVehicleFSM__Tunables, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.AllowEntryToMPWarpInSeats, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ForceStreamingFailure, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.PushAngleDotTolerance, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.TowardsDoorPushAngleDotTolerance, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DeadZoneAnyInputDirection, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DisallowGroundProbeVelocity, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPedSpeedToActivateRagdoll, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPhysSpeedToActivateRagdoll, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHoverHeightDistToWarpIntoHeli, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToConsiderPedGoingToDoorPriority, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeToConsiderPedGoingToDoorPriority, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistToConsiderPedGoingToDoorPriority, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)1835160785, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)1964009554, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)2552082535, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)3034610967, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeToConsiderEnterInputValid, PsoDataType.UInt, 76, 0, 0) - ); - case MetaName.CTaskMotionInVehicle__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionInVehicle__Tunables, 0, 0, 208, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.DisableCloseDoor, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3306188437, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedForVehicleToBeConsideredStillSqr, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityDeltaThrownOut, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityDeltaThrownOutPlayerSP, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.VelocityDeltaThrownOutPlayerMP, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRateForInVehicleAnims, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRateForInVehicleAnims, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.HeavyBrakeYAcceleration, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MinRatioForClosingDoor, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.InAirZAccelTrigger, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.InAirProbeDistance, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.InAirProbeForwardOffset, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPitchDefault, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitchDefault, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPitchInAir, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitchInAir, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultPitchSmoothingRate, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.BikePitchSmoothingRate, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.BikePitchSmoothingPassengerRate, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.WheelieAccelerateControlThreshold, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.WheelieMaxSpeedThreshold, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.WheelieUpDownControlThreshold, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.WheelieDesiredLeanAngleTol, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.StillAccTol, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.StillPitchAngleTol, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.AccelerationSmoothing, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.AccelerationSmoothingBike, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.AccelerationScaleBike, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInCurrentStateForStill, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.AccelerationToStartLeaning, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.ZAccelerationToStartLeaning, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAccelerationForLean, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxXYAccelerationForLeanBike, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZAccelerationForLeanBike, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.StillDelayTime, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.ShuntAccelerateMag, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.ShuntAccelerateMagBike, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInShuntStateBeforeRestart, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAbsThrottleForCloseDoor, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVehSpeedToConsiderClosingDoor, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDoorSpeedToConsiderClosingDoor, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVehVelocityToGoThroughWindscreen, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVehVelocityToGoThroughWindscreenMP, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxZComponentForCollisionNormal, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeStreamInVehicleClipSetBeforeStartingEngine, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo((MetaName)599372255, PsoDataType.UInt, 200, 0, 0) - ); - case MetaName.CTaskMotionInAutomobile__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionInAutomobile__Tunables, 0, 0, 536, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.TestLowLodIdle, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3645563068, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2286839301, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInHornState, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxVelocityForSitIdles, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSteeringAngleForSitIdles, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MinCentredSteeringAngleTimeForSitIdles, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleSmoothingRateMin, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleSmoothingRateMax, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleSmoothingAcc, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleMinAccAngle, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleMaxAccAngle, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftRightStickInputSmoothingRate, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.LeftRightStickInputMin, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanForwardsAngleSmoothingRate, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.UpDownStickInputSmoothingRate, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.UpDownStickInputMin, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.ZAccForLowImpact, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.ZAccForMedImpact, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.ZAccForHighImpact, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.UseLegIkOnBikes, PsoDataType.Bool, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.LargeVerticalAccelerationDelta, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.NumFramesToPersistLargeVerticalAcceleration, PsoDataType.SInt, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.LowLodIdleClipSetId, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo(MetaName.SeatDisplacementSmoothingRateDriver, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.SeatDisplacementSmoothingRatePassenger, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)3038905403, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.StartEngineForce, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardsPitchSlope, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardsPitchSlope, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardsPitchSlopeBalance, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardsPitchSlopeBalance, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeInWheelieToEnforceMinPitch, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardsPitchWheelieBalance, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardsPitchWheelieBalance, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardsPitchWheelieBegin, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowFastSpeedThreshold, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardsPitchSlowSpeed, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardsPitchSlowSpeed, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardsPitchFastSpeed, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardsPitchFastSpeed, PsoDataType.Float, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowApproachRate, PsoDataType.Float, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.FastApproachRate, PsoDataType.Float, 184, 0, 0), - new PsoStructureEntryInfo(MetaName.WheelieApproachRate, PsoDataType.Float, 188, 0, 0), - new PsoStructureEntryInfo(MetaName.NewLeanSteerApproachRate, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenCloseDoorAttempts, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo(MetaName.ShuntDamageMultiplierAI, PsoDataType.Float, 200, 0, 0), - new PsoStructureEntryInfo(MetaName.ShuntDamageMultiplierPlayer, PsoDataType.Float, 204, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDamageTakenToApplyDamageAI, PsoDataType.Float, 208, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDamageTakenToApplyDamagePlayer, PsoDataType.Float, 212, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInTaskToCheckForDamage, PsoDataType.Float, 216, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDamageToCheckForRandomDeath, PsoDataType.Float, 220, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDamageToCheckForRandomDeath, PsoDataType.Float, 224, 0, 0), - new PsoStructureEntryInfo(MetaName.MinHeavyCrashDeathChance, PsoDataType.Float, 228, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxHeavyCrashDeathChance, PsoDataType.Float, 232, 0, 0), - new PsoStructureEntryInfo(MetaName.SteeringDeadZoneCentreTimeMS, PsoDataType.UInt, 236, 0, 0), - new PsoStructureEntryInfo(MetaName.SteeringDeadZoneTimeMS, PsoDataType.UInt, 240, 0, 0), - new PsoStructureEntryInfo(MetaName.SteeringDeadZone, PsoDataType.Float, 244, 0, 0), - new PsoStructureEntryInfo(MetaName.SteeringChangeToStartProcessMoveSignals, PsoDataType.Float, 248, 0, 0), - new PsoStructureEntryInfo(MetaName.SteeringChangeToStopProcessMoveSignals, PsoDataType.Float, 252, 0, 0), - new PsoStructureEntryInfo(MetaName.SeatBlendLinSpeed, PsoDataType.Float, 256, 0, 0), - new PsoStructureEntryInfo(MetaName.SeatBlendAngSpeed, PsoDataType.Float, 260, 0, 0), - new PsoStructureEntryInfo(MetaName.HoldLegOutVelocity, PsoDataType.Float, 264, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelStillStart, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo(MetaName.MinVelStillStop, PsoDataType.Float, 272, 0, 0), - new PsoStructureEntryInfo(MetaName.ForcedLegUpVelocity, PsoDataType.Float, 276, 0, 0), - new PsoStructureEntryInfo(MetaName.BurnOutBlendInTol, PsoDataType.Float, 280, 0, 0), - new PsoStructureEntryInfo(MetaName.BurnOutBlendInSpeed, PsoDataType.Float, 284, 0, 0), - new PsoStructureEntryInfo(MetaName.BurnOutBlendOutSpeed, PsoDataType.Float, 288, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeInAirDriveToStandUpTimeMin, PsoDataType.Float, 292, 0, 0), - new PsoStructureEntryInfo(MetaName.BikeInAirDriveToStandUpTimeMax, PsoDataType.Float, 296, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSpeedToBlendInDriveFastFacial, PsoDataType.Float, 300, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDisplacementScale, PsoDataType.Float, 304, 0, 0), - new PsoStructureEntryInfo(MetaName.DisplacementScaleApproachRateIn, PsoDataType.Float, 308, 0, 0), - new PsoStructureEntryInfo(MetaName.DisplacementScaleApproachRateOut, PsoDataType.Float, 312, 0, 0), - new PsoStructureEntryInfo((MetaName)640640576, PsoDataType.Float, 316, 0, 0), - new PsoStructureEntryInfo((MetaName)445721091, PsoDataType.Float, 320, 0, 0), - new PsoStructureEntryInfo((MetaName)2001571571, PsoDataType.Float, 324, 0, 0), - new PsoStructureEntryInfo((MetaName)1295618163, PsoDataType.Float, 328, 0, 0), - new PsoStructureEntryInfo((MetaName)622968896, PsoDataType.Float, 332, 0, 0), - new PsoStructureEntryInfo((MetaName)2029080904, PsoDataType.Float, 336, 0, 0), - new PsoStructureEntryInfo((MetaName)2895820001, PsoDataType.Float, 340, 0, 0), - new PsoStructureEntryInfo((MetaName)3604323696, PsoDataType.Float, 344, 0, 0), - new PsoStructureEntryInfo((MetaName)2175428814, PsoDataType.Float, 348, 0, 0), - new PsoStructureEntryInfo((MetaName)346108670, PsoDataType.Float, 352, 0, 0), - new PsoStructureEntryInfo((MetaName)3123171906, PsoDataType.Float, 356, 0, 0), - new PsoStructureEntryInfo((MetaName)3193879405, PsoDataType.Float, 360, 0, 0), - new PsoStructureEntryInfo((MetaName)1771118662, PsoDataType.Float, 364, 0, 0), - new PsoStructureEntryInfo((MetaName)1104842114, PsoDataType.Float, 368, 0, 0), - new PsoStructureEntryInfo((MetaName)2239621028, PsoDataType.UInt, 372, 0, 0), - new PsoStructureEntryInfo((MetaName)7898446, PsoDataType.UInt, 376, 0, 0), - new PsoStructureEntryInfo((MetaName)56684479, PsoDataType.UInt, 380, 0, 0), - new PsoStructureEntryInfo((MetaName)345487015, PsoDataType.UInt, 384, 0, 0), - new PsoStructureEntryInfo(MetaName.StartEngineClipId, PsoDataType.String, 388, 7, 0), - new PsoStructureEntryInfo((MetaName)2195918560, PsoDataType.String, 392, 7, 0), - new PsoStructureEntryInfo(MetaName.HotwireClipId, PsoDataType.String, 396, 7, 0), - new PsoStructureEntryInfo((MetaName)1348667163, PsoDataType.String, 400, 7, 0), - new PsoStructureEntryInfo(MetaName.PutOnHelmetClipId, PsoDataType.String, 404, 7, 0), - new PsoStructureEntryInfo((MetaName)1430534928, PsoDataType.String, 408, 7, 0), - new PsoStructureEntryInfo((MetaName)1851449258, PsoDataType.String, 412, 7, 0), - new PsoStructureEntryInfo((MetaName)2091354753, PsoDataType.String, 416, 7, 0), - new PsoStructureEntryInfo((MetaName)1023392893, PsoDataType.String, 420, 7, 0), - new PsoStructureEntryInfo((MetaName)2273702662, PsoDataType.String, 424, 7, 0), - new PsoStructureEntryInfo(MetaName.ChangeStationClipId, PsoDataType.String, 428, 7, 0), - new PsoStructureEntryInfo(MetaName.StillToSitClipId, PsoDataType.String, 432, 7, 0), - new PsoStructureEntryInfo(MetaName.SitToStillClipId, PsoDataType.String, 436, 7, 0), - new PsoStructureEntryInfo(MetaName.BurnOutClipId, PsoDataType.String, 440, 7, 0), - new PsoStructureEntryInfo((MetaName)1920935636, PsoDataType.String, 444, 7, 0), - new PsoStructureEntryInfo(MetaName.BikeHornClipId, PsoDataType.String, 448, 7, 0), - new PsoStructureEntryInfo((MetaName)4017603423, PsoDataType.String, 452, 7, 0), - new PsoStructureEntryInfo((MetaName)1797630730, PsoDataType.Float, 456, 0, 0), - new PsoStructureEntryInfo((MetaName)2658529211, PsoDataType.Float, 460, 0, 0), - new PsoStructureEntryInfo((MetaName)3474960988, PsoDataType.Float, 464, 0, 0), - new PsoStructureEntryInfo((MetaName)3061913457, PsoDataType.Float, 468, 0, 0), - new PsoStructureEntryInfo((MetaName)2713284751, PsoDataType.Float, 472, 0, 0), - new PsoStructureEntryInfo((MetaName)2044390676, PsoDataType.Float, 476, 0, 0), - new PsoStructureEntryInfo((MetaName)137806659, PsoDataType.Float, 480, 0, 0), - new PsoStructureEntryInfo((MetaName)402428981, PsoDataType.Float, 484, 0, 0), - new PsoStructureEntryInfo((MetaName)1039484179, PsoDataType.Float, 488, 0, 0), - new PsoStructureEntryInfo((MetaName)342194320, PsoDataType.Float, 492, 0, 0), - new PsoStructureEntryInfo((MetaName)2083391331, PsoDataType.Float, 496, 0, 0), - new PsoStructureEntryInfo((MetaName)2714021858, PsoDataType.Float, 500, 0, 0), - new PsoStructureEntryInfo((MetaName)2266547610, PsoDataType.Float, 504, 0, 0), - new PsoStructureEntryInfo((MetaName)1896779219, PsoDataType.Float, 508, 0, 0), - new PsoStructureEntryInfo((MetaName)1233910025, PsoDataType.Float, 512, 0, 0), - new PsoStructureEntryInfo((MetaName)1743777174, PsoDataType.Float, 516, 0, 0), - new PsoStructureEntryInfo((MetaName)868848233, PsoDataType.Float, 520, 0, 0), - new PsoStructureEntryInfo((MetaName)1182962200, PsoDataType.Float, 524, 0, 0), - new PsoStructureEntryInfo((MetaName)1798674235, PsoDataType.Float, 528, 0, 0), - new PsoStructureEntryInfo((MetaName)647907606, PsoDataType.Float, 532, 0, 0) - ); - case MetaName.CTaskMotionOnBicycle__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionOnBicycle__Tunables, 0, 0, 224, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.LeanAngleSmoothingRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.StillToSitPedalGearApproachRate, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.PedalGearApproachRate, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinXYVelForWantsToMove, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedForStill, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedForStillReverse, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxThrottleForStill, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultPedalToFreewheelBlendDuration, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.SlowPedalToFreewheelBlendDuration, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxRateForSlowBlendDuration, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.StillToSitLeanRate, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.StillToSitApproachRate, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.UpHillMinPitchToStandUp, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.DownHillMinPitchToStandUp, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInStandState, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1621924028, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.MinSprintResultToStand, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeSinceShiftedWeightForwardToAllowWheelie, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.WheelieShiftThreshold, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.MinPitchDefault, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitchDefault, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForwardsPitchSlope, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxForwardsPitchSlope, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.OnSlopeThreshold, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxJumpHeightForSmallImpact, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.LongitudinalBodyLeanApproachRateSlope, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.LongitudinalBodyLeanApproachRate, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.LongitudinalBodyLeanApproachRateSlow, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.SideZoneThreshold, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.ReturnZoneThreshold, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxYIntentionToUseSlowApproach, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeToStayUprightAfterImpact, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultSitToStandBlendDuration, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.WheelieSitToStandBlendDuration, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.WheelieStickPullBackMinIntention, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeSinceNotWantingToTrackStandToAllowStillTransition, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInSitToStillStateToReverse, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.PreventDirectTransitionToReverseFromSit, PsoDataType.Bool, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultSmallImpactCharClipId, PsoDataType.String, 168, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultImpactCharClipId, PsoDataType.String, 172, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultSmallImpactBikeClipId, PsoDataType.String, 176, 7, 0), - new PsoStructureEntryInfo(MetaName.DefaultImpactBikeClipId, PsoDataType.String, 180, 7, 0), - new PsoStructureEntryInfo(MetaName.DownHillSmallImpactCharClipId, PsoDataType.String, 184, 7, 0), - new PsoStructureEntryInfo(MetaName.DownHillImpactCharClipId, PsoDataType.String, 188, 7, 0), - new PsoStructureEntryInfo(MetaName.DownHillSmallImpactBikeClipId, PsoDataType.String, 192, 7, 0), - new PsoStructureEntryInfo(MetaName.DownHillImpactBikeClipId, PsoDataType.String, 196, 7, 0), - new PsoStructureEntryInfo(MetaName.SitToStillCharClipId, PsoDataType.String, 200, 7, 0), - new PsoStructureEntryInfo(MetaName.SitToStillBikeClipId, PsoDataType.String, 204, 7, 0), - new PsoStructureEntryInfo(MetaName.TrackStandToStillLeftCharClipId, PsoDataType.String, 208, 7, 0), - new PsoStructureEntryInfo(MetaName.TrackStandToStillLeftBikeClipId, PsoDataType.String, 212, 7, 0), - new PsoStructureEntryInfo(MetaName.TrackStandToStillRightCharClipId, PsoDataType.String, 216, 7, 0), - new PsoStructureEntryInfo(MetaName.TrackStandToStillRightBikeClipId, PsoDataType.String, 220, 7, 0) - ); - case MetaName.CTaskMotionOnBicycleController__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionOnBicycleController__Tunables, 0, 0, 184, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInStateToAllowTransitionFromFixieSkid, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeStillToTransitionToTrackStand, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInPedalState, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeInFreewheelState, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAiSpeedForStandingUp, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedToTriggerTrackStandTransition, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxSpeedToTriggerFixieSkidTransition, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.CruiseDuckPrepLeftCharClipId, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.CruiseDuckPrepRightCharClipId, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.CruiseDuckPrepLeftBikeClipId, PsoDataType.String, 52, 7, 0), - new PsoStructureEntryInfo(MetaName.CruiseDuckPrepRightBikeClipId, PsoDataType.String, 56, 7, 0), - new PsoStructureEntryInfo(MetaName.FastDuckPrepLeftCharClipId, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo(MetaName.FastDuckPrepRightCharClipId, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo(MetaName.FastDuckPrepLeftBikeClipId, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo(MetaName.FastDuckPrepRightBikeClipId, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo(MetaName.LaunchLeftCharClipId, PsoDataType.String, 76, 7, 0), - new PsoStructureEntryInfo(MetaName.LaunchRightCharClipId, PsoDataType.String, 80, 7, 0), - new PsoStructureEntryInfo(MetaName.LaunchLeftBikeClipId, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo(MetaName.LaunchRightBikeClipId, PsoDataType.String, 88, 7, 0), - new PsoStructureEntryInfo(MetaName.TrackStandLeftCharClipId, PsoDataType.String, 92, 7, 0), - new PsoStructureEntryInfo(MetaName.TrackStandRightCharClipId, PsoDataType.String, 96, 7, 0), - new PsoStructureEntryInfo(MetaName.TrackStandLeftBikeClipId, PsoDataType.String, 100, 7, 0), - new PsoStructureEntryInfo(MetaName.TrackStandRightBikeClipId, PsoDataType.String, 104, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidLeftCharClip0Id, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidLeftCharClip1Id, PsoDataType.String, 112, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidRightCharClip0Id, PsoDataType.String, 116, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidRightCharClip1Id, PsoDataType.String, 120, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidLeftBikeClip0Id, PsoDataType.String, 124, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidLeftBikeClip1Id, PsoDataType.String, 128, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidRightBikeClip0Id, PsoDataType.String, 132, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidRightBikeClip1Id, PsoDataType.String, 136, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidToBalanceLeftCharClip1Id, PsoDataType.String, 140, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidToBalanceRightCharClip1Id, PsoDataType.String, 144, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidToBalanceLeftBikeClip1Id, PsoDataType.String, 148, 7, 0), - new PsoStructureEntryInfo(MetaName.FixieSkidToBalanceRightBikeClip1Id, PsoDataType.String, 152, 7, 0), - new PsoStructureEntryInfo(MetaName.CruisePedalCharClipId, PsoDataType.String, 156, 7, 0), - new PsoStructureEntryInfo(MetaName.InAirFreeWheelCharClipId, PsoDataType.String, 160, 7, 0), - new PsoStructureEntryInfo(MetaName.InAirFreeWheelBikeClipId, PsoDataType.String, 164, 7, 0), - new PsoStructureEntryInfo(MetaName.DownHillInAirFreeWheelCharClipId, PsoDataType.String, 168, 7, 0), - new PsoStructureEntryInfo(MetaName.DownHillInAirFreeWheelBikeClipId, PsoDataType.String, 172, 7, 0), - new PsoStructureEntryInfo(MetaName.TuckFreeWheelToTrackStandRightCharClipId, PsoDataType.String, 176, 7, 0), - new PsoStructureEntryInfo(MetaName.TuckFreeWheelToTrackStandRightBikeClipId, PsoDataType.String, 180, 7, 0) - ); - case MetaName.CBikeLeanAngleHelper__Tunables: - return new PsoStructureInfo(MetaName.CBikeLeanAngleHelper__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.UseReturnOvershoot, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.UseInitialLeanForcing, PsoDataType.Bool, 17, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredLeanAngleTolToBringLegIn, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredSpeedToBringLegIn, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredLeanAngleRate, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredLeanAngleRateQuad, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanAngleReturnRate, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanAngleDefaultRate, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanAngleDefaultRatePassenger, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.DesiredOvershootLeanAngle, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.LeanAngleReturnedTol, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.HasStickInputThreshold, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.LeaningExtremeThreshold, PsoDataType.Float, 60, 0, 0) - ); - case MetaName.CTaskMotionInTurret__Tunables: - return new PsoStructureInfo(MetaName.CTaskMotionInTurret__Tunables, 0, 0, 248, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)4093217060, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)4102381397, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2540703340, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3512769803, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo((MetaName)171275597, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)2073783636, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)1235675432, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)2737439830, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)1027124968, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2183745831, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3114603561, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)943989780, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2556074717, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1811862646, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)216639291, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)1460193378, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)3098186043, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)1012095486, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)1934656831, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)2982819675, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)2624331049, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo((MetaName)1324859893, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo((MetaName)1057562451, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo((MetaName)1546988642, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo((MetaName)3067513344, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo((MetaName)1707713717, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo((MetaName)2395321832, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)1059545904, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)3062906436, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo((MetaName)2949666078, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo((MetaName)705780320, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo((MetaName)459162028, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo((MetaName)1797630730, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo((MetaName)1465756410, PsoDataType.String, 148, 7, 0), - new PsoStructureEntryInfo((MetaName)1144665981, PsoDataType.String, 152, 7, 0), - new PsoStructureEntryInfo((MetaName)790728667, PsoDataType.String, 156, 7, 0), - new PsoStructureEntryInfo((MetaName)2997429282, PsoDataType.String, 160, 7, 0), - new PsoStructureEntryInfo((MetaName)2148334725, PsoDataType.String, 164, 7, 0), - new PsoStructureEntryInfo((MetaName)356569692, PsoDataType.String, 168, 7, 0), - new PsoStructureEntryInfo((MetaName)2567235955, PsoDataType.String, 172, 7, 0), - new PsoStructureEntryInfo((MetaName)3042448153, PsoDataType.String, 176, 7, 0), - new PsoStructureEntryInfo(MetaName.TurnLeftSlowClipId, PsoDataType.String, 180, 7, 0), - new PsoStructureEntryInfo(MetaName.TurnLeftFastClipId, PsoDataType.String, 184, 7, 0), - new PsoStructureEntryInfo((MetaName)1206230540, PsoDataType.String, 188, 7, 0), - new PsoStructureEntryInfo((MetaName)3713053450, PsoDataType.String, 192, 7, 0), - new PsoStructureEntryInfo((MetaName)2463362878, PsoDataType.String, 196, 7, 0), - new PsoStructureEntryInfo((MetaName)3874294070, PsoDataType.String, 200, 7, 0), - new PsoStructureEntryInfo(MetaName.TurnRightSlowClipId, PsoDataType.String, 204, 7, 0), - new PsoStructureEntryInfo(MetaName.TurnRightFastClipId, PsoDataType.String, 208, 7, 0), - new PsoStructureEntryInfo((MetaName)1611862735, PsoDataType.String, 212, 7, 0), - new PsoStructureEntryInfo((MetaName)413072568, PsoDataType.String, 216, 7, 0), - new PsoStructureEntryInfo((MetaName)1114189303, PsoDataType.String, 220, 7, 0), - new PsoStructureEntryInfo((MetaName)531096295, PsoDataType.String, 224, 7, 0), - new PsoStructureEntryInfo((MetaName)2077576253, PsoDataType.String, 228, 7, 0), - new PsoStructureEntryInfo((MetaName)3278999439, PsoDataType.String, 232, 7, 0), - new PsoStructureEntryInfo((MetaName)4038706223, PsoDataType.String, 236, 7, 0), - new PsoStructureEntryInfo((MetaName)1558752243, PsoDataType.String, 240, 7, 0), - new PsoStructureEntryInfo((MetaName)4031618294, PsoDataType.String, 244, 7, 0) - ); - case MetaName.CWanted__Tunables: - return new PsoStructureInfo(MetaName.CWanted__Tunables, 0, 0, 2696, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.WantedClean, PsoDataType.Structure, 16, 0, MetaName.CWanted__Tunables__WantedLevel), - new PsoStructureEntryInfo(MetaName.WantedLevel1, PsoDataType.Structure, 128, 0, MetaName.CWanted__Tunables__WantedLevel), - new PsoStructureEntryInfo(MetaName.WantedLevel2, PsoDataType.Structure, 240, 0, MetaName.CWanted__Tunables__WantedLevel), - new PsoStructureEntryInfo(MetaName.WantedLevel3, PsoDataType.Structure, 352, 0, MetaName.CWanted__Tunables__WantedLevel), - new PsoStructureEntryInfo(MetaName.WantedLevel4, PsoDataType.Structure, 464, 0, MetaName.CWanted__Tunables__WantedLevel), - new PsoStructureEntryInfo(MetaName.WantedLevel5, PsoDataType.Structure, 576, 0, MetaName.CWanted__Tunables__WantedLevel), - new PsoStructureEntryInfo(MetaName.Difficulty, PsoDataType.Structure, 688, 0, (MetaName)2685546187), - new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 2640, 0, (MetaName)1581603972), - new PsoStructureEntryInfo(MetaName.Timers, PsoDataType.Structure, 2656, 0, (MetaName)4245193745), - new PsoStructureEntryInfo(MetaName.MaxTimeTargetVehicleMoving, PsoDataType.UInt, 2672, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultAmnestyTime, PsoDataType.UInt, 2676, 0, 0), - new PsoStructureEntryInfo(MetaName.DefaultHiddenEvasionTimeReduction, PsoDataType.UInt, 2680, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialAreaTimeoutWhenSeen, PsoDataType.UInt, 2684, 0, 0), - new PsoStructureEntryInfo(MetaName.InitialAreaTimeoutWhenCrimeReported, PsoDataType.UInt, 2688, 0, 0), - new PsoStructureEntryInfo((MetaName)2940774268, PsoDataType.Float, 2692, 0, 0) - ); - case MetaName.CWanted__Tunables__WantedLevel: - return new PsoStructureInfo(MetaName.CWanted__Tunables__WantedLevel, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.Difficulty, PsoDataType.Structure, 8, 0, (MetaName)3660423994) - ); - case (MetaName)3660423994: - return new PsoStructureInfo((MetaName)3660423994, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.Calculation, PsoDataType.Structure, 8, 0, (MetaName)1037717481), - new PsoStructureEntryInfo(MetaName.Helis, PsoDataType.Structure, 72, 0, (MetaName)3986648608) - ); - case (MetaName)1037717481: - return new PsoStructureInfo((MetaName)1037717481, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.FromWantedLevel, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Weights, PsoDataType.Structure, 16, 0, (MetaName)1310408174), - new PsoStructureEntryInfo(MetaName.Decay, PsoDataType.Structure, 40, 0, (MetaName)3442100148) - ); - case (MetaName)1310408174: - return new PsoStructureInfo((MetaName)1310408174, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.WantedLevel, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.LastSpottedDistance, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Randomness, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)3442100148: - return new PsoStructureInfo((MetaName)3442100148, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.TimeEvadingForMaxValue, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxValue, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableWhenOffMission, PsoDataType.Bool, 16, 0, 0) - ); - case (MetaName)3986648608: - return new PsoStructureInfo((MetaName)3986648608, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Refuel, PsoDataType.Structure, 8, 0, (MetaName)2123007699) - ); - case (MetaName)2123007699: - return new PsoStructureInfo((MetaName)2123007699, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBefore, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.Delay, PsoDataType.Float, 16, 0, 0) - ); - case (MetaName)2685546187: - return new PsoStructureInfo((MetaName)2685546187, 0, 0, 1952, - new PsoStructureEntryInfo(MetaName.Spawning, PsoDataType.Structure, 8, 0, (MetaName)2145739988), - new PsoStructureEntryInfo(MetaName.Despawning, PsoDataType.Structure, 152, 0, (MetaName)1602748523), - new PsoStructureEntryInfo(MetaName.Peds, PsoDataType.Structure, 280, 0, (MetaName)3209293959), - new PsoStructureEntryInfo(MetaName.Dispatch, PsoDataType.Structure, 1920, 0, (MetaName)3840146119) - ); - case (MetaName)2145739988: - return new PsoStructureInfo((MetaName)2145739988, 0, 0, 144, - new PsoStructureEntryInfo(MetaName.Scoring, PsoDataType.Structure, 8, 0, (MetaName)3801009121), - new PsoStructureEntryInfo(MetaName.IdealDistance, PsoDataType.Structure, 96, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.ChancesToForceWaitInFront, PsoDataType.Structure, 120, 0, (MetaName)2528332511) - ); - case (MetaName)3801009121: - return new PsoStructureInfo((MetaName)3801009121, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.Weights, PsoDataType.Structure, 8, 0, (MetaName)2379615087) - ); - case (MetaName)2379615087: - return new PsoStructureInfo((MetaName)2379615087, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Distance, PsoDataType.Structure, 8, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.Direction, PsoDataType.Structure, 32, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.Randomness, PsoDataType.Structure, 56, 0, (MetaName)2528332511) - ); - case (MetaName)2528332511: - return new PsoStructureInfo((MetaName)2528332511, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Min, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMin, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.ValueForMax, PsoDataType.Float, 20, 0, 0) - ); - case (MetaName)1602748523: - return new PsoStructureInfo((MetaName)1602748523, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.MaxFacingThreshold, PsoDataType.Structure, 8, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.MaxMovingThreshold, PsoDataType.Structure, 32, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.MinDistanceToBeConsideredLaggingBehind, PsoDataType.Structure, 56, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.MinDistanceToCheckClumped, PsoDataType.Structure, 80, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.MaxDistanceToBeConsideredClumped, PsoDataType.Structure, 104, 0, (MetaName)2528332511) - ); - case (MetaName)3209293959: - return new PsoStructureInfo((MetaName)3209293959, 0, 0, 1640, - new PsoStructureEntryInfo(MetaName.Cops, PsoDataType.Structure, 8, 0, (MetaName)2022711333), - new PsoStructureEntryInfo(MetaName.Swat, PsoDataType.Structure, 552, 0, (MetaName)2022711333), - new PsoStructureEntryInfo(MetaName.Army, PsoDataType.Structure, 1096, 0, (MetaName)2022711333) - ); - case (MetaName)2022711333: - return new PsoStructureInfo((MetaName)2022711333, 0, 0, 544, - new PsoStructureEntryInfo(MetaName.Situations, PsoDataType.Structure, 8, 0, (MetaName)1181208064), - new PsoStructureEntryInfo(MetaName.AutomobileSpeedModifier, PsoDataType.Structure, 496, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.HeliSpeedModifier, PsoDataType.Structure, 520, 0, (MetaName)2528332511) - ); - case (MetaName)1181208064: - return new PsoStructureInfo((MetaName)1181208064, 0, 0, 488, - new PsoStructureEntryInfo(MetaName.Default, PsoDataType.Structure, 8, 0, (MetaName)3795144262), - new PsoStructureEntryInfo(MetaName.InVehicle, PsoDataType.Structure, 128, 0, (MetaName)3795144262), - new PsoStructureEntryInfo(MetaName.InHeli, PsoDataType.Structure, 248, 0, (MetaName)3795144262), - new PsoStructureEntryInfo(MetaName.InBoat, PsoDataType.Structure, 368, 0, (MetaName)3795144262) - ); - case (MetaName)3795144262: - return new PsoStructureInfo((MetaName)3795144262, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.SensesRange, PsoDataType.Structure, 8, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.IdentificationRange, PsoDataType.Structure, 32, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.ShootRateModifier, PsoDataType.Structure, 56, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.WeaponAccuracy, PsoDataType.Structure, 80, 0, (MetaName)2528332511), - new PsoStructureEntryInfo(MetaName.WeaponAccuracyModifierForEvasiveMovement, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponAccuracyModifierForOffScreen, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponAccuracyModifierForAimedAt, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MinForDrivebys, PsoDataType.Float, 116, 0, 0) - ); - case (MetaName)3840146119: - return new PsoStructureInfo((MetaName)3840146119, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.TimeBetweenSpawnAttemptsModifier, PsoDataType.Structure, 8, 0, (MetaName)2528332511) - ); - case (MetaName)1581603972: - return new PsoStructureInfo((MetaName)1581603972, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.Witnesses, PsoDataType.Bool, 9, 0, 0), - new PsoStructureEntryInfo(MetaName.Crimes, PsoDataType.Bool, 10, 0, 0) - ); - case (MetaName)4245193745: - return new PsoStructureInfo((MetaName)4245193745, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.TimeBetweenDifficultyUpdates, PsoDataType.Float, 8, 0, 0) - ); - case MetaName.CEventGunAimedAt__Tunables: - return new PsoStructureInfo(MetaName.CEventGunAimedAt__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CEventGunShot__Tunables: - return new PsoStructureInfo(MetaName.CEventGunShot__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.GunShotThresholdDistance, PsoDataType.Float, 24, 0, 0) - ); - case MetaName.CEventMeleeAction__Tunables: - return new PsoStructureInfo(MetaName.CEventMeleeAction__Tunables, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.CTaskAimAndThrowProjectile__Tunables: - return new PsoStructureInfo(MetaName.CTaskAimAndThrowProjectile__Tunables, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.bEnableGaitAdditive, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinHoldThrowPitch, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.iMaxRandomExplosionTime, PsoDataType.UInt, 24, 0, 0) - ); - case MetaName.CTaskSwapWeapon__Tunables: - return new PsoStructureInfo(MetaName.CTaskSwapWeapon__Tunables, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.OnFootClipRate, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.OnFootBlendInDuration, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.LowCoverClipRate, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.LowCoverBlendInDuration, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.HighCoverClipRate, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.HighCoverBlendInDuration, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.ActionClipRate, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.ActionBlendInDuration, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.BlendOutDuration, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2181619027, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DebugSwapInstantly, PsoDataType.Bool, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.SkipHolsterWeapon, PsoDataType.Bool, 57, 0, 0) - ); - case MetaName.CTaskAimGunOnFoot__Tunables: - return new PsoStructureInfo(MetaName.CTaskAimGunOnFoot__Tunables, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenFiringVariations, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.IdealPitchForFiringVariation, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxPitchDifferenceForFiringVariation, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.AssistedAimOutroTime, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.RunAndGunOutroTime, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AimOutroTime, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AimOutroTimeIfAimingOnStick, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AimOutroMinTaskTimeWhenRunPressed, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.AimingOnStickExitCooldown, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeForRunAndGunOutroDelays, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.DampenRootTargetWeight, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.DampenRootTargetHeight, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.AlternativeAnimBlockedHeight, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.CoverAimOffsetFromBlocked, PsoDataType.Float3, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.DelayTimeWhenOutOfAmmoInScope, PsoDataType.UInt, 96, 0, 0) - ); - case MetaName.CTaskGun__Tunables: - return new PsoStructureInfo(MetaName.CTaskGun__Tunables, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.iMinLookAtTime, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.iMaxLookAtTime, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeBetweenBulletReactions, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxTimeBetweenBulletReactions, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxDistForOverheadReactions, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxAboveHeadForOverheadReactions, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fBulletReactionPosAdjustmentZ, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fMinTimeBetweenLookAt, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fMaxTimeBetweenLookAt, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.bDisable2HandedGetups, PsoDataType.Bool, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeForEyeIk, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenEyeIkProcesses, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToPointGunAtPositionWhenUnableToTurn, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.AssistedAimCamera, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo(MetaName.RunAndGunAimCamera, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo(MetaName.AssistedAimInterpolateInDuration, PsoDataType.UInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.RunAndGunInterpolateInDuration, PsoDataType.UInt, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenOverheadBulletReactions, PsoDataType.UInt, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxTimeInBulletReactionState, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo((MetaName)3228655867, PsoDataType.UInt, 92, 0, 0), - new PsoStructureEntryInfo((MetaName)270252777, PsoDataType.UInt, 96, 0, 0) - ); - case MetaName.CTaskAimGunVehicleDriveBy__Tunables: - return new PsoStructureInfo(MetaName.CTaskAimGunVehicleDriveBy__Tunables, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenInsults, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToInsult, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDotToInsult, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.MinAimTimeMs, PsoDataType.UInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxAimTimeOnStickMs, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.AimingOnStickCooldownMs, PsoDataType.UInt, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.BicycleDrivebyFilterId, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.BikeDrivebyFilterId, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.JetskiDrivebyFilterId, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.ParachutingFilterId, PsoDataType.String, 52, 7, 0), - new PsoStructureEntryInfo((MetaName)2221302483, PsoDataType.String, 56, 7, 0), - new PsoStructureEntryInfo((MetaName)3323392529, PsoDataType.String, 60, 7, 0), - new PsoStructureEntryInfo((MetaName)2684719351, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo((MetaName)4246561663, PsoDataType.String, 68, 7, 0) - ); - case MetaName.CWildlifeManager__Tunables: - return new PsoStructureInfo(MetaName.CWildlifeManager__Tunables, 0, 0, 136, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.BirdHeightMapDeltaMin, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.BirdHeightMapDeltaMax, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.BirdSpawnXYRangeMin, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.BirdSpawnXYRangeMax, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.IncreasedAerialSpawningFactor, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToSearchForGroundWildlifePoints, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToSearchForGroundWildlifePoints, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenGroundProbes, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.GroundMaterialProbeDepth, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.GroundMaterialProbeOffset, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.GroundMaterialSpawnCoordNormalZTolerance, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.MinDistanceToSearchForAquaticPoints, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxDistanceToSearchForAquaticPoints, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenWaterHeightMapChecks, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.TimeBetweenWaterProbes, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.WaterProbeDepth, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.WaterProbeOffset, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.AquaticSpawnDepth, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.AquaticSpawnMaxHeightAbovePlayer, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.IncreasedAquaticSpawningFactor, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.CloseSpawningViewMultiplier, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.IncreasedGroundWildlifeSpawningFactor, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.SharkModelName, PsoDataType.String, 104, 7, 0), - new PsoStructureEntryInfo(MetaName.DeepWaterThreshold, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.PlayerSwimTimeThreshold, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.MinTimeBetweenSharkDispatches, PsoDataType.UInt, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.SharkAddRangeInViewMin, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo((MetaName)3653722296, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo((MetaName)1235067475, PsoDataType.Float, 128, 0, 0) - ); - case MetaName.CPopGroupList: - return new PsoStructureInfo(MetaName.CPopGroupList, 0, 0, 56, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPopulationGroup), - new PsoStructureEntryInfo(MetaName.pedGroups, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPopulationGroup), - new PsoStructureEntryInfo(MetaName.vehGroups, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.wildlifeHabitats, PsoDataType.Array, 40, 0, (MetaName)4) - ); - case MetaName.CPopulationGroup: - return new PsoStructureInfo(MetaName.CPopulationGroup, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3852980612), - new PsoStructureEntryInfo(MetaName.models, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)4186696686), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.Flags, 32, 0, (MetaName)2097155) - ); - case MetaName.CDoorTuningFile: - return new PsoStructureInfo(MetaName.CDoorTuningFile, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)607870603), - new PsoStructureEntryInfo(MetaName.NamedTuningArray, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)934147895), - new PsoStructureEntryInfo(MetaName.ModelToTuneMapping, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case (MetaName)607870603: - return new PsoStructureInfo((MetaName)607870603, 0, 0, 144, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 2, 0), - new PsoStructureEntryInfo(MetaName.Tuning, PsoDataType.Structure, 16, 0, (MetaName)2175119364) - ); - case (MetaName)2175119364: - return new PsoStructureInfo((MetaName)2175119364, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.AutoOpenVolumeOffset, PsoDataType.Float3a, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2809332931), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 32, 0, (MetaName)2097153), - new PsoStructureEntryInfo(MetaName.AutoOpenRadiusModifier, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AutoOpenRate, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.AutoOpenCosineAngleBetweenThreshold, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.AutoOpenCloseRateTaper, PsoDataType.Bool, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.UseAutoOpenTriggerBox, PsoDataType.Bool, 49, 0, 0), - new PsoStructureEntryInfo(MetaName.CustomTriggerBox, PsoDataType.Bool, 50, 0, 0), - new PsoStructureEntryInfo(MetaName.TriggerBoxMinMax, PsoDataType.Structure, 64, 0, MetaName.rage__spdAABB), - new PsoStructureEntryInfo(MetaName.BreakableByVehicle, PsoDataType.Bool, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.BreakingImpulse, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.ShouldLatchShut, PsoDataType.Bool, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.MassMultiplier, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.WeaponImpulseMultiplier, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.RotationLimitAngle, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.TorqueAngularVelocityLimit, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.StdDoorRotDir, PsoDataType.Enum, 124, 0, MetaName.StdDoorRotDir) - ); - case (MetaName)934147895: - return new PsoStructureInfo((MetaName)934147895, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 2, 0), - new PsoStructureEntryInfo(MetaName.TuningName, PsoDataType.String, 16, 2, 0) - ); - case (MetaName)3852980612: - return new PsoStructureInfo((MetaName)3852980612, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Variations, PsoDataType.Structure, 16, 3, 0) - ); - case MetaName.CAmbientPedModelVariations: - return new PsoStructureInfo(MetaName.CAmbientPedModelVariations, 0, 0, 48, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3553377863), - new PsoStructureEntryInfo(MetaName.CompRestrictions, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3159204365), - new PsoStructureEntryInfo(MetaName.PropRestrictions, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo(MetaName.LoadOut, PsoDataType.String, 40, 7, 0) - ); - case (MetaName)3553377863: - return new PsoStructureInfo((MetaName)3553377863, 0, 0, 12, - new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 0, 0, MetaName.ePedVarComp), - new PsoStructureEntryInfo(MetaName.DrawableIndex, PsoDataType.SInt, 4, 0, 0), - new PsoStructureEntryInfo(MetaName.Restriction, PsoDataType.Enum, 8, 0, (MetaName)2065671281) - ); - case MetaName.CSlownessZoneManager: - return new PsoStructureInfo(MetaName.CSlownessZoneManager, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1778476350), - new PsoStructureEntryInfo(MetaName.aSlownessZone, PsoDataType.Array, 8, 0, 0) - ); - case (MetaName)1778476350: - return new PsoStructureInfo((MetaName)1778476350, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.bBox, PsoDataType.Structure, 16, 0, MetaName.rage__spdAABB) - ); - case MetaName.CScenarioPointManifest: - return new PsoStructureInfo(MetaName.CScenarioPointManifest, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.VersionNumber, PsoDataType.SInt, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.RegionDefs, PsoDataType.Array, 8, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.Groups, PsoDataType.Array, 24, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.InteriorNames, PsoDataType.Array, 40, 0, (MetaName)5) - ); - case MetaName.CScenarioPointRegionDef: - return new PsoStructureInfo(MetaName.CScenarioPointRegionDef, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 8, 0), - new PsoStructureEntryInfo(MetaName.AABB, PsoDataType.Structure, 16, 0, MetaName.rage__spdAABB) - ); - case MetaName.CScenarioPointGroup: - return new PsoStructureInfo(MetaName.CScenarioPointGroup, 0, 0, 8, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.EnabledByDefault, PsoDataType.Bool, 4, 0, 0) - ); - case MetaName.strRequestRecording: - return new PsoStructureInfo(MetaName.strRequestRecording, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.strRecordedRequest), - new PsoStructureEntryInfo(MetaName.Requests, PsoDataType.Array, 0, 0, 0) - ); - case MetaName.strRecordedRequest: - return new PsoStructureInfo(MetaName.strRecordedRequest, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Resource, PsoDataType.Structure, 0, 0, MetaName.strResourceReference), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.SInt, 24, 0, 0) - ); - case MetaName.strResourceReference: - return new PsoStructureInfo(MetaName.strResourceReference, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.AssetName, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.Extension, PsoDataType.String, 16, 0, (MetaName)524288) - ); - case (MetaName)62557530: - return new PsoStructureInfo((MetaName)62557530, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3112305802), - new PsoStructureEntryInfo(MetaName.zones, PsoDataType.Array, 0, 0, 0) - ); - case (MetaName)3112305802: - return new PsoStructureInfo((MetaName)3112305802, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.zoneName, PsoDataType.String, 0, 2, 0), - new PsoStructureEntryInfo(MetaName.spName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.mpName, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.vfxRegion, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)1896983690, PsoDataType.UByte, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)1856972365, PsoDataType.Enum, 24, 0, (MetaName)1756502932), - new PsoStructureEntryInfo(MetaName.lawResponseTime, PsoDataType.Enum, 28, 0, (MetaName)3204395397), - new PsoStructureEntryInfo(MetaName.lawResponseType, PsoDataType.Enum, 32, 0, (MetaName)4286852891), - new PsoStructureEntryInfo(MetaName.specialZoneAttribute, PsoDataType.Enum, 36, 0, (MetaName)4095090001), - new PsoStructureEntryInfo(MetaName.vehDirtMin, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.vehDirtMax, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.vehDirtGrowScale, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.pedDirtMin, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.pedDirtMax, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.dirtRed, PsoDataType.UByte, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.dirtGreen, PsoDataType.UByte, 61, 0, 0), - new PsoStructureEntryInfo(MetaName.dirtBlue, PsoDataType.UByte, 62, 0, 0), - new PsoStructureEntryInfo((MetaName)1430479029, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)2056852733, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo((MetaName)1457405649, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo((MetaName)2304154060, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo((MetaName)1018913504, PsoDataType.SInt, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)9361713, PsoDataType.Bool, 84, 0, 0), - new PsoStructureEntryInfo((MetaName)2931752685, PsoDataType.Bool, 85, 0, 0) - ); - case MetaName.CCoverTuningFile: - return new PsoStructureInfo(MetaName.CCoverTuningFile, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)912106952), - new PsoStructureEntryInfo(MetaName.NamedTuningArray, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3821651387), - new PsoStructureEntryInfo(MetaName.ModelToTuneMapping, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case (MetaName)912106952: - return new PsoStructureInfo((MetaName)912106952, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 2, 0), - new PsoStructureEntryInfo(MetaName.Tuning, PsoDataType.Structure, 16, 0, (MetaName)61864478) - ); - case (MetaName)61864478: - return new PsoStructureInfo((MetaName)61864478, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)98189892), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 8, 0, (MetaName)2097152) - ); - case (MetaName)3821651387: - return new PsoStructureInfo((MetaName)3821651387, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 2, 0), - new PsoStructureEntryInfo(MetaName.TuningName, PsoDataType.String, 16, 2, 0) - ); - case MetaName.CScenarioPointRegion: - return new PsoStructureInfo(MetaName.CScenarioPointRegion, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.VersionNumber, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CExtensionDefSpawnPoint), - new PsoStructureEntryInfo(MetaName.ScenarioPoints, PsoDataType.Array, 16, 0, (MetaName)1), - new PsoStructureEntryInfo(MetaName.ChainingGraph, PsoDataType.Structure, 32, 0, MetaName.CScenarioChainingGraph) - ); - case MetaName.CExtensionDefSpawnPoint: - return new PsoStructureInfo(MetaName.CExtensionDefSpawnPoint, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.offsetPosition, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.offsetRotation, PsoDataType.Float4, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.spawnType, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.pedType, PsoDataType.String, 52, 7, 0), - new PsoStructureEntryInfo(MetaName.group, PsoDataType.String, 56, 7, 0), - new PsoStructureEntryInfo(MetaName.availableInMpSp, PsoDataType.Enum, 60, 0, MetaName.CSpawnPoint__AvailabilityMpSp), - new PsoStructureEntryInfo(MetaName.timeTillPedLeaves, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.start, PsoDataType.UByte, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.end, PsoDataType.UByte, 69, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.CScenarioPointFlags__Flags), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.Flags, 72, 0, (MetaName)196618), - new PsoStructureEntryInfo(MetaName.highPri, PsoDataType.Bool, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.extendedRange, PsoDataType.Bool, 77, 0, 0) - ); - case MetaName.CScenarioChainingGraph: - return new PsoStructureInfo(MetaName.CScenarioChainingGraph, 0, 0, 40, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CScenarioChainingNode), - new PsoStructureEntryInfo(MetaName.Nodes, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CScenarioChainingEdge), - new PsoStructureEntryInfo(MetaName.Edges, PsoDataType.Array, 24, 0, (MetaName)2) - ); - case MetaName.CScenarioChainingNode: - return new PsoStructureInfo(MetaName.CScenarioChainingNode, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Position, PsoDataType.Float3a, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2602393771, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.ScenarioType, PsoDataType.String, 36, 7, 0), - new PsoStructureEntryInfo(MetaName.HasIncomingEdges, PsoDataType.Bool, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.HasOutgoingEdges, PsoDataType.Bool, 41, 0, 0) - ); - case MetaName.CScenarioChainingEdge: - return new PsoStructureInfo(MetaName.CScenarioChainingEdge, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.NodeIndexFrom, PsoDataType.UShort, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.NodeIndexTo, PsoDataType.UShort, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.NavMode, PsoDataType.Enum, 12, 2, MetaName.CScenarioChainingEdge__eNavMode), - new PsoStructureEntryInfo(MetaName.NavSpeed, PsoDataType.Enum, 13, 2, MetaName.CScenarioChainingEdge__eNavSpeed) - ); - case MetaName.CPedVariationInfo: - return new PsoStructureInfo(MetaName.CPedVariationInfo, 0, 0, 112, - new PsoStructureEntryInfo(MetaName.bHasTexVariations, PsoDataType.Bool, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.bHasDrawblVariations, PsoDataType.Bool, 1, 0, 0), - new PsoStructureEntryInfo(MetaName.bHasLowLODs, PsoDataType.Bool, 2, 0, 0), - new PsoStructureEntryInfo(MetaName.bIsSuperLOD, PsoDataType.Bool, 3, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.availComp, PsoDataType.Array, 4, 4, (MetaName)786436), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPVComponentData), - new PsoStructureEntryInfo(MetaName.aComponentData3, PsoDataType.Array, 16, 0, (MetaName)6), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedSelectionSet), - new PsoStructureEntryInfo(MetaName.aSelectionSets, PsoDataType.Array, 32, 0, (MetaName)8), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CComponentInfo), - new PsoStructureEntryInfo(MetaName.compInfos, PsoDataType.Array, 48, 0, (MetaName)10), - new PsoStructureEntryInfo(MetaName.propInfo, PsoDataType.Structure, 64, 0, MetaName.CPedPropInfo), - new PsoStructureEntryInfo(MetaName.dlcName, PsoDataType.String, 104, 8, 0) - ); - case MetaName.CPedPropInfo: - return new PsoStructureInfo(MetaName.CPedPropInfo, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.numAvailProps, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedPropMetaData), - new PsoStructureEntryInfo(MetaName.aPropMetaData, PsoDataType.Array, 8, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CAnchorProps), - new PsoStructureEntryInfo(MetaName.aAnchors, PsoDataType.Array, 24, 0, (MetaName)3) - ); - case MetaName.CPVComponentData: - return new PsoStructureInfo(MetaName.CPVComponentData, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.numAvailTex, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPVDrawblData), - new PsoStructureEntryInfo(MetaName.aDrawblData3, PsoDataType.Array, 8, 0, (MetaName)1) - ); - case MetaName.CPVDrawblData: - return new PsoStructureInfo(MetaName.CPVDrawblData, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.propMask, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.numAlternatives, PsoDataType.UByte, 1, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPVTextureData), - new PsoStructureEntryInfo(MetaName.aTexData, PsoDataType.Array, 8, 0, (MetaName)2), - new PsoStructureEntryInfo(MetaName.clothData, PsoDataType.Structure, 24, 0, MetaName.CPVDrawblData__CPVClothComponentData) - ); - case MetaName.CPVDrawblData__CPVClothComponentData: - return new PsoStructureInfo(MetaName.CPVDrawblData__CPVClothComponentData, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ownsCloth, PsoDataType.Bool, 0, 0, 0) - ); - case MetaName.CPVTextureData: - return new PsoStructureInfo(MetaName.CPVTextureData, 0, 0, 3, - new PsoStructureEntryInfo(MetaName.texId, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.distribution, PsoDataType.UByte, 1, 0, 0) - ); - case MetaName.CComponentInfo: - return new PsoStructureInfo(MetaName.CComponentInfo, 0, 0, 48, - new PsoStructureEntryInfo((MetaName)802196719, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)4233133352, PsoDataType.String, 4, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)128864925, PsoDataType.Array, 8, 4, (MetaName)327682), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.inclusions, PsoDataType.Flags, 32, 0, (MetaName)2101247), - new PsoStructureEntryInfo(MetaName.exclusions, PsoDataType.Flags, 36, 0, (MetaName)2101247), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.ePedVarComp), - new PsoStructureEntryInfo((MetaName)1613922652, PsoDataType.Flags, 40, 1, (MetaName)1048583), - new PsoStructureEntryInfo((MetaName)2114993291, PsoDataType.UShort, 42, 0, 0), - new PsoStructureEntryInfo((MetaName)3509540765, PsoDataType.UByte, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)4196345791, PsoDataType.UByte, 45, 0, 0) - ); - case MetaName.CCreatureMetaData: - return new PsoStructureInfo(MetaName.CCreatureMetaData, 0, 0, 56, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CShaderVariableComponent), - new PsoStructureEntryInfo(MetaName.shaderVariableComponents, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedPropExpressionData), - new PsoStructureEntryInfo(MetaName.pedPropExpressions, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedCompExpressionData), - new PsoStructureEntryInfo(MetaName.pedCompExpressions, PsoDataType.Array, 40, 0, (MetaName)4) - ); - case MetaName.CShaderVariableComponent: - return new PsoStructureInfo(MetaName.CShaderVariableComponent, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.pedcompID, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.maskID, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.shaderVariableHashString, PsoDataType.String, 16, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.tracks, PsoDataType.Array, 24, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UShort, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.ids, PsoDataType.Array, 40, 0, (MetaName)5), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.components, PsoDataType.Array, 56, 0, (MetaName)MetaTypeName.POINTER) - ); - case MetaName.CPedPropExpressionData: - return new PsoStructureInfo(MetaName.CPedPropExpressionData, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.pedPropID, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.pedPropVarIndex, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.pedPropExpressionIndex, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.tracks, PsoDataType.Array, 24, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UShort, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.ids, PsoDataType.Array, 40, 0, (MetaName)5), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.types, PsoDataType.Array, 56, 0, (MetaName)MetaTypeName.POINTER), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.components, PsoDataType.Array, 72, 0, (MetaName)9) - ); - case MetaName.CPedCompExpressionData: - return new PsoStructureInfo(MetaName.CPedCompExpressionData, 0, 0, 88, - new PsoStructureEntryInfo(MetaName.pedCompID, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.pedCompVarIndex, PsoDataType.SInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.pedCompExpressionIndex, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.tracks, PsoDataType.Array, 24, 0, (MetaName)3), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UShort, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.ids, PsoDataType.Array, 40, 0, (MetaName)5), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.types, PsoDataType.Array, 56, 0, (MetaName)MetaTypeName.POINTER), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.components, PsoDataType.Array, 72, 0, (MetaName)9) - ); - case MetaName.rage__cutfCutsceneFile2: - return new PsoStructureInfo(MetaName.rage__cutfCutsceneFile2, 0, 0, 3360, - new PsoStructureEntryInfo(MetaName.fTotalDuration, PsoDataType.Float, 268, 0, 0), - new PsoStructureEntryInfo(MetaName.cFaceDir, PsoDataType.String, 272, 0, (MetaName)16777216), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.iCutsceneFlags, PsoDataType.Array, 528, 4, (MetaName)262146), - new PsoStructureEntryInfo(MetaName.vOffset, PsoDataType.Float3, 544, 0, 0), - new PsoStructureEntryInfo(MetaName.fRotation, PsoDataType.Float, 560, 0, 0), - new PsoStructureEntryInfo(MetaName.vTriggerOffset, PsoDataType.Float3, 576, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.pCutsceneObjects, PsoDataType.Array, 592, 0, (MetaName)7), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.pCutsceneLoadEventList, PsoDataType.Array, 608, 0, (MetaName)9), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.pCutsceneEventList, PsoDataType.Array, 624, 0, (MetaName)11), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.pCutsceneEventArgsList, PsoDataType.Array, 640, 0, (MetaName)13), - new PsoStructureEntryInfo(MetaName.attributes, PsoDataType.Structure, 656, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 672, 4, 0), - new PsoStructureEntryInfo(MetaName.iRangeStart, PsoDataType.SInt, 680, 0, 0), - new PsoStructureEntryInfo(MetaName.iRangeEnd, PsoDataType.SInt, 684, 0, 0), - new PsoStructureEntryInfo(MetaName.iAltRangeEnd, PsoDataType.SInt, 688, 0, 0), - new PsoStructureEntryInfo(MetaName.fSectionByTimeSliceDuration, PsoDataType.Float, 692, 0, 0), - new PsoStructureEntryInfo(MetaName.fFadeOutCutsceneDuration, PsoDataType.Float, 696, 0, 0), - new PsoStructureEntryInfo(MetaName.fFadeInGameDuration, PsoDataType.Float, 700, 0, 0), - new PsoStructureEntryInfo(MetaName.fadeInColor, PsoDataType.UInt, 704, 1, 0), - new PsoStructureEntryInfo(MetaName.iBlendOutCutsceneDuration, PsoDataType.SInt, 708, 0, 0), - new PsoStructureEntryInfo(MetaName.iBlendOutCutsceneOffset, PsoDataType.SInt, 712, 0, 0), - new PsoStructureEntryInfo(MetaName.fFadeOutGameDuration, PsoDataType.Float, 716, 0, 0), - new PsoStructureEntryInfo(MetaName.fFadeInCutsceneDuration, PsoDataType.Float, 720, 0, 0), - new PsoStructureEntryInfo(MetaName.fadeOutColor, PsoDataType.UInt, 724, 1, 0), - new PsoStructureEntryInfo(MetaName.DayCoCHours, PsoDataType.UInt, 728, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.cameraCutList, PsoDataType.Array, 736, 0, (MetaName)30), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.sectionSplitList, PsoDataType.Array, 752, 0, (MetaName)32), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.rage__cutfCutsceneFile2__SConcatData), - new PsoStructureEntryInfo(MetaName.concatDataList, PsoDataType.Array, 768, 1, (MetaName)2621474), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.vHaltFrequency), - new PsoStructureEntryInfo(MetaName.discardFrameList, PsoDataType.Array, 3344, 0, (MetaName)36) - ); - case MetaName.rage__parAttributeList: - return new PsoStructureInfo(MetaName.rage__parAttributeList, 0, 0, 12, - new PsoStructureEntryInfo(MetaName.UserData1, PsoDataType.UByte, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.UserData2, PsoDataType.UByte, 9, 0, 0) - ); - case MetaName.rage__cutfCutsceneFile2__SConcatData: - return new PsoStructureInfo(MetaName.rage__cutfCutsceneFile2__SConcatData, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.cSceneName, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.vOffset, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fStartTime, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fRotation, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.fPitch, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.fRoll, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.iRangeStart, PsoDataType.SInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.iRangeEnd, PsoDataType.SInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.bValidForPlayBack, PsoDataType.Bool, 56, 0, 0) - ); - case MetaName.rage__cutfAssetManagerObject: - return new PsoStructureInfo(MetaName.rage__cutfAssetManagerObject, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0) - ); - case MetaName.rage__cutfAnimationManagerObject: - return new PsoStructureInfo(MetaName.rage__cutfAnimationManagerObject, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0) - ); - case MetaName.rage__cutfCameraObject: - return new PsoStructureInfo(MetaName.rage__cutfCameraObject, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fNearDrawDistance, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.fFarDrawDistance, PsoDataType.Float, 60, 0, 0) - ); - case MetaName.rage__cutfPedModelObject: - return new PsoStructureInfo(MetaName.rage__cutfPedModelObject, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.cAnimExportCtrlSpecFile, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo(MetaName.cFaceExportCtrlSpecFile, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo(MetaName.cAnimCompressionFile, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo(MetaName.cHandle, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo(MetaName.typeFile, PsoDataType.String, 88, 7, 0), - new PsoStructureEntryInfo(MetaName.overrideFaceAnimationFilename, PsoDataType.String, 96, 7, 0), - new PsoStructureEntryInfo(MetaName.bFoundFaceAnimation, PsoDataType.Bool, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.bFaceAndBodyAreMerged, PsoDataType.Bool, 105, 0, 0), - new PsoStructureEntryInfo(MetaName.bOverrideFaceAnimation, PsoDataType.Bool, 106, 0, 0), - new PsoStructureEntryInfo(MetaName.faceAnimationNodeName, PsoDataType.String, 108, 7, 0), - new PsoStructureEntryInfo(MetaName.faceAttributesFilename, PsoDataType.String, 112, 7, 0) - ); - case MetaName.rage__cutfPropModelObject: - return new PsoStructureInfo(MetaName.rage__cutfPropModelObject, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.cAnimExportCtrlSpecFile, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo(MetaName.cFaceExportCtrlSpecFile, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo(MetaName.cAnimCompressionFile, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo(MetaName.cHandle, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo(MetaName.typeFile, PsoDataType.String, 88, 7, 0) - ); - case MetaName.rage__cutfBlockingBoundsObject: - return new PsoStructureInfo(MetaName.rage__cutfBlockingBoundsObject, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float3, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.vCorners, PsoDataType.Array, 48, 4, (MetaName)262148), - new PsoStructureEntryInfo(MetaName.fHeight, PsoDataType.Float, 112, 0, 0) - ); - case MetaName.rage__cutfAudioObject: - return new PsoStructureInfo(MetaName.rage__cutfAudioObject, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 3, 0), - new PsoStructureEntryInfo(MetaName.fOffset, PsoDataType.Float, 56, 0, 0) - ); - case MetaName.rage__cutfHiddenModelObject: - return new PsoStructureInfo(MetaName.rage__cutfHiddenModelObject, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fRadius, PsoDataType.Float, 64, 0, 0) - ); - case MetaName.rage__cutfOverlayObject: - return new PsoStructureInfo(MetaName.rage__cutfOverlayObject, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 3, 0), - new PsoStructureEntryInfo(MetaName.cRenderTargetName, PsoDataType.String, 56, 3, 0), - new PsoStructureEntryInfo(MetaName.iOverlayType, PsoDataType.UInt, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.modelHashName, PsoDataType.String, 76, 7, 0) - ); - case MetaName.rage__cutfSubtitleObject: - return new PsoStructureInfo(MetaName.rage__cutfSubtitleObject, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0) - ); - case MetaName.rage__cutfLightObject: - return new PsoStructureInfo(MetaName.rage__cutfLightObject, 0, 0, 192, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.vDirection, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.vColour, PsoDataType.Float3, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.fIntensity, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.fFallOff, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.fConeAngle, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.fVolumeIntensity, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.fVolumeSizeScale, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.fCoronaSize, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.fCoronaIntensity, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.fCoronaZBias, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.fInnerConeAngle, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.fExponentialFallOff, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.fShadowBlur, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.iLightType, PsoDataType.SInt, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.iLightProperty, PsoDataType.SInt, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.TextureDictID, PsoDataType.SInt, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.TextureKey, PsoDataType.SInt, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.uLightFlags, PsoDataType.UInt, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.uHourFlags, PsoDataType.UInt, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.bStatic, PsoDataType.Bool, 186, 0, 0) - ); - case MetaName.rage__cutfAnimatedLightObject: - return new PsoStructureInfo(MetaName.rage__cutfAnimatedLightObject, 0, 0, 208, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.vDirection, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.vColour, PsoDataType.Float3, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.fIntensity, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.fFallOff, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.fConeAngle, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.fVolumeIntensity, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.fVolumeSizeScale, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.fCoronaSize, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.fCoronaIntensity, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.fCoronaZBias, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.fInnerConeAngle, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.fExponentialFallOff, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.fShadowBlur, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.iLightType, PsoDataType.SInt, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.iLightProperty, PsoDataType.SInt, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.TextureDictID, PsoDataType.SInt, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.TextureKey, PsoDataType.SInt, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.uLightFlags, PsoDataType.UInt, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.uHourFlags, PsoDataType.UInt, 180, 0, 0), - new PsoStructureEntryInfo(MetaName.bStatic, PsoDataType.Bool, 186, 0, 0), - new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 192, 0, 0) - ); - case MetaName.rage__cutfObjectIdEvent: - return new PsoStructureInfo(MetaName.rage__cutfObjectIdEvent, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.fTime, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.iEventId, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.iEventArgsIndex, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.pChildEvents, PsoDataType.Structure, 32, 3, 0), - new PsoStructureEntryInfo(MetaName.StickyId, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.IsChild, PsoDataType.Bool, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 48, 0, 0) - ); - case MetaName.rage__cutfObjectVariationEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfObjectVariationEventArgs, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.iComponent, PsoDataType.SInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.iDrawable, PsoDataType.SInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.iTexture, PsoDataType.SInt, 48, 0, 0) - ); - case MetaName.rage__cutfEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfEventArgs, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0) - ); - case MetaName.rage__cutfAttributeList: - return new PsoStructureInfo(MetaName.rage__cutfAttributeList, 0, 0, 16, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.Items, PsoDataType.Array, 0, 0, 0) - ); - case MetaName.cutf_int: - return new PsoStructureInfo(MetaName.cutf_int, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.SInt, 16, 0, 0) - ); - case MetaName.cutf_float: - return new PsoStructureInfo(MetaName.cutf_float, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.Float, 16, 0, 0) - ); - case MetaName.rage__cutfLoadSceneEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfLoadSceneEventArgs, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.vOffset, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fRotation, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.fPitch, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.fRoll, PsoDataType.Float, 72, 0, 0) - ); - case MetaName.rage__cutfObjectIdEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfObjectIdEventArgs, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0) - ); - case MetaName.rage__cutfObjectIdListEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfObjectIdListEventArgs, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.SInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.iObjectIdList, PsoDataType.Array, 32, 0, (MetaName)2) - ); - case MetaName.rage__cutfNameEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfNameEventArgs, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 7, 0) - ); - case MetaName.rage__cutfCameraCutEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfCameraCutEventArgs, 0, 0, 272, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.vRotationQuaternion, PsoDataType.Float4, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.fNearDrawDistance, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.fFarDrawDistance, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.fMapLodScale, PsoDataType.Float, 88, 0, 0), - new PsoStructureEntryInfo(MetaName.ReflectionLodRangeStart, PsoDataType.Float, 92, 0, 0), - new PsoStructureEntryInfo(MetaName.ReflectionLodRangeEnd, PsoDataType.Float, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.ReflectionSLodRangeStart, PsoDataType.Float, 100, 0, 0), - new PsoStructureEntryInfo(MetaName.ReflectionSLodRangeEnd, PsoDataType.Float, 104, 0, 0), - new PsoStructureEntryInfo(MetaName.LodMultHD, PsoDataType.Float, 108, 0, 0), - new PsoStructureEntryInfo(MetaName.LodMultOrphanedHD, PsoDataType.Float, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.LodMultLod, PsoDataType.Float, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.LodMultSLod1, PsoDataType.Float, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.LodMultSLod2, PsoDataType.Float, 124, 0, 0), - new PsoStructureEntryInfo(MetaName.LodMultSLod3, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.LodMultSLod4, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.WaterReflectionFarClip, PsoDataType.Float, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.SSAOLightInten, PsoDataType.Float, 140, 0, 0), - new PsoStructureEntryInfo(MetaName.ExposurePush, PsoDataType.Float, 144, 0, 0), - new PsoStructureEntryInfo(MetaName.LightFadeDistanceMult, PsoDataType.Float, 148, 0, 0), - new PsoStructureEntryInfo(MetaName.LightShadowFadeDistanceMult, PsoDataType.Float, 152, 0, 0), - new PsoStructureEntryInfo(MetaName.LightSpecularFadeDistMult, PsoDataType.Float, 156, 0, 0), - new PsoStructureEntryInfo(MetaName.LightVolumetricFadeDistanceMult, PsoDataType.Float, 160, 0, 0), - new PsoStructureEntryInfo(MetaName.DirectionalLightMultiplier, PsoDataType.Float, 164, 0, 0), - new PsoStructureEntryInfo(MetaName.LensArtefactMultiplier, PsoDataType.Float, 168, 0, 0), - new PsoStructureEntryInfo(MetaName.BloomMax, PsoDataType.Float, 172, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableHighQualityDof, PsoDataType.Bool, 176, 0, 0), - new PsoStructureEntryInfo(MetaName.FreezeReflectionMap, PsoDataType.Bool, 177, 0, 0), - new PsoStructureEntryInfo(MetaName.DisableDirectionalLighting, PsoDataType.Bool, 178, 0, 0), - new PsoStructureEntryInfo(MetaName.AbsoluteIntensityEnabled, PsoDataType.Bool, 179, 0, 0), - new PsoStructureEntryInfo(MetaName.CharacterLight, PsoDataType.Structure, 192, 0, MetaName.rage__cutfCameraCutCharacterLightParams), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.rage__cutfCameraCutTimeOfDayDofModifier), - new PsoStructureEntryInfo(MetaName.TimeOfDayDofModifers, PsoDataType.Array, 256, 0, (MetaName)34) - ); - case MetaName.rage__cutfCameraCutCharacterLightParams: - return new PsoStructureInfo(MetaName.rage__cutfCameraCutCharacterLightParams, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.bUseTimeCycleValues, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.vDirection, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.vColour, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fIntensity, PsoDataType.Float, 48, 0, 0) - ); - case MetaName.rage__cutfSubtitleEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfSubtitleEventArgs, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.iLanguageID, PsoDataType.SInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.iTransitionIn, PsoDataType.SInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.fTransitionInDuration, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.iTransitionOut, PsoDataType.SInt, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.fTransitionOutDuration, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.fSubtitleDuration, PsoDataType.Float, 60, 0, 0) - ); - case MetaName.rage__cutfFinalNameEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfFinalNameEventArgs, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 3, 0) - ); - case MetaName.rage__cutfObjectIdNameEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfObjectIdNameEventArgs, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0) - ); - case MetaName.vHaltFrequency: - return new PsoStructureInfo(MetaName.vHaltFrequency, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.cSceneName, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.SInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.frames, PsoDataType.Array, 8, 0, (MetaName)1) - ); - case MetaName.rage__cutfVehicleModelObject: - return new PsoStructureInfo(MetaName.rage__cutfVehicleModelObject, 0, 0, 120, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.cAnimExportCtrlSpecFile, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo(MetaName.cFaceExportCtrlSpecFile, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo(MetaName.cAnimCompressionFile, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo(MetaName.cHandle, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo(MetaName.typeFile, PsoDataType.String, 88, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.cRemoveBoneNameList, PsoDataType.Array, 96, 0, (MetaName)11), - new PsoStructureEntryInfo(MetaName.bCanApplyRealDamage, PsoDataType.Bool, 112, 0, 0) - ); - case MetaName.rage__cutfEvent: - return new PsoStructureInfo(MetaName.rage__cutfEvent, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.fTime, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.iEventId, PsoDataType.SInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.iEventArgsIndex, PsoDataType.SInt, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.pChildEvents, PsoDataType.Structure, 32, 3, 0), - new PsoStructureEntryInfo(MetaName.StickyId, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.IsChild, PsoDataType.Bool, 44, 0, 0) - ); - case MetaName.rage__cutfCascadeShadowEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfCascadeShadowEventArgs, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.cameraCutHashName, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo(MetaName.position, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.radius, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.interpTime, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.cascadeIndex, PsoDataType.SInt, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.enabled, PsoDataType.Bool, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.interpolateToDisabled, PsoDataType.Bool, 77, 0, 0) - ); - case MetaName.rage__cutfFloatValueEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfFloatValueEventArgs, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.fValue, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.rage__cutfAnimatedParticleEffectObject: - return new PsoStructureInfo(MetaName.rage__cutfAnimatedParticleEffectObject, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.athFxListHash, PsoDataType.String, 64, 7, 0) - ); - case MetaName.rage__cutfWeaponModelObject: - return new PsoStructureInfo(MetaName.rage__cutfWeaponModelObject, 0, 0, 104, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.cAnimExportCtrlSpecFile, PsoDataType.String, 64, 7, 0), - new PsoStructureEntryInfo(MetaName.cFaceExportCtrlSpecFile, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo(MetaName.cAnimCompressionFile, PsoDataType.String, 72, 7, 0), - new PsoStructureEntryInfo(MetaName.cHandle, PsoDataType.String, 84, 7, 0), - new PsoStructureEntryInfo(MetaName.typeFile, PsoDataType.String, 88, 7, 0), - new PsoStructureEntryInfo(MetaName.GenericWeaponType, PsoDataType.UInt, 96, 0, 0) - ); - case MetaName.rage__cutfPlayParticleEffectEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfPlayParticleEffectEventArgs, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.vInitialBoneRotation, PsoDataType.Float4, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.vInitialBoneOffset, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.iAttachParentId, PsoDataType.SInt, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.iAttachBoneHash, PsoDataType.UShort, 68, 0, 0) - ); - case MetaName.rage__cutfBoolValueEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfBoolValueEventArgs, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.bValue, PsoDataType.Bool, 32, 0, 0) - ); - case MetaName.rage__cutfRayfireObject: - return new PsoStructureInfo(MetaName.rage__cutfRayfireObject, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.vStartPosition, PsoDataType.Float3, 64, 0, 0) - ); - case MetaName.rage__cutfParticleEffectObject: - return new PsoStructureInfo(MetaName.rage__cutfParticleEffectObject, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.athFxListHash, PsoDataType.String, 56, 7, 0) - ); - case MetaName.rage__cutfDecalObject: - return new PsoStructureInfo(MetaName.rage__cutfDecalObject, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo(MetaName.RenderId, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.rage__cutfDecalEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfDecalEventArgs, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.vRotation, PsoDataType.Float4, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fWidth, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.fHeight, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.Colour, PsoDataType.UInt, 72, 1, 0), - new PsoStructureEntryInfo(MetaName.fLifeTime, PsoDataType.Float, 76, 0, 0) - ); - case MetaName.rage__cutfScreenFadeObject: - return new PsoStructureInfo(MetaName.rage__cutfScreenFadeObject, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0) - ); - case MetaName.rage__cutfVehicleVariationEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfVehicleVariationEventArgs, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.iMainBodyColour, PsoDataType.SInt, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.iSecondBodyColour, PsoDataType.SInt, 44, 0, 0), - new PsoStructureEntryInfo(MetaName.iSpecularColour, PsoDataType.SInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.iWheelTrimColour, PsoDataType.SInt, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)2747538743, PsoDataType.SInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.iLivery, PsoDataType.SInt, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.iLivery2, PsoDataType.SInt, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.fDirtLevel, PsoDataType.Float, 68, 0, 0) - ); - case MetaName.cutf_string: - return new PsoStructureInfo(MetaName.cutf_string, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), - new PsoStructureEntryInfo(MetaName.Value, PsoDataType.String, 16, 3, 0) - ); - case MetaName.rage__cutfScreenFadeEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfScreenFadeEventArgs, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.fValue, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 40, 1, 0) - ); - case MetaName.rage__cutfTriggerLightEffectEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfTriggerLightEffectEventArgs, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.iAttachParentId, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.iAttachBoneHash, PsoDataType.UShort, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.AttachedParentName, PsoDataType.String, 40, 7, 0) - ); - case MetaName.rage__cutfVehicleExtraEventArgs: - return new PsoStructureInfo(MetaName.rage__cutfVehicleExtraEventArgs, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.SInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.pExtraBoneIds, PsoDataType.Array, 40, 0, (MetaName)3) - ); - case MetaName.rage__cutfFixupModelObject: - return new PsoStructureInfo(MetaName.rage__cutfFixupModelObject, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), - new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), - new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.fRadius, PsoDataType.Float, 64, 0, 0) - ); - case MetaName.CPackFileMetaData: - return new PsoStructureInfo(MetaName.CPackFileMetaData, 0, 0, 96, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CMapDataGroup), - new PsoStructureEntryInfo(MetaName.MapDataGroups, PsoDataType.Array, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CHDTxdAssetBinding), - new PsoStructureEntryInfo(MetaName.HDTxdBindingArray, PsoDataType.Array, 16, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CImapDependency), - new PsoStructureEntryInfo(MetaName.imapDependencies, PsoDataType.Array, 32, 0, (MetaName)4), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CImapDependencies), - new PsoStructureEntryInfo(MetaName.imapDependencies_2, PsoDataType.Array, 48, 0, (MetaName)6), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CItypDependencies), - new PsoStructureEntryInfo(MetaName.itypDependencies_2, PsoDataType.Array, 64, 0, (MetaName)8), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CInteriorBoundsFiles), - new PsoStructureEntryInfo(MetaName.Interiors, PsoDataType.Array, 80, 0, (MetaName)10) - ); - case MetaName.CMapDataGroup: - return new PsoStructureInfo(MetaName.CMapDataGroup, 0, 0, 56, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Bounds, PsoDataType.Array, 8, 0, (MetaName)1), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1193003611), - new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 24, 0, (MetaName)2097155), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.WeatherTypes, PsoDataType.Array, 32, 0, (MetaName)5), - new PsoStructureEntryInfo(MetaName.HoursOnOff, PsoDataType.UInt, 48, 0, 0) - ); - case MetaName.CHDTxdAssetBinding: - return new PsoStructureInfo(MetaName.CHDTxdAssetBinding, 0, 0, 132, - new PsoStructureEntryInfo(MetaName.assetType, PsoDataType.Enum, 0, 0, (MetaName)3387532954), - new PsoStructureEntryInfo(MetaName.targetAsset, PsoDataType.String, 4, 0, (MetaName)4194304), - new PsoStructureEntryInfo(MetaName.HDTxd, PsoDataType.String, 68, 0, (MetaName)4194304) - ); - case MetaName.CImapDependencies: - return new PsoStructureInfo(MetaName.CImapDependencies, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.imapName, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.manifestFlags), - new PsoStructureEntryInfo(MetaName.manifestFlags, PsoDataType.Flags, 4, 0, (MetaName)2097153), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.itypDepArray, PsoDataType.Array, 8, 0, (MetaName)3) - ); - case MetaName.CItypDependencies: - return new PsoStructureInfo(MetaName.CItypDependencies, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.itypName, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.manifestFlags), - new PsoStructureEntryInfo(MetaName.manifestFlags, PsoDataType.Flags, 4, 0, (MetaName)2097153), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.itypDepArray, PsoDataType.Array, 8, 0, (MetaName)3) - ); - case MetaName.CInteriorBoundsFiles: - return new PsoStructureInfo(MetaName.CInteriorBoundsFiles, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.Bounds, PsoDataType.Array, 8, 0, (MetaName)1) - ); - case MetaName.CMapTypes: - return new PsoStructureInfo(MetaName.CMapTypes, 0, 0, 96, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.extensions, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.archetypes, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 40, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.dependencies, PsoDataType.Array, 48, 0, (MetaName)5), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CTxdRelationship), - new PsoStructureEntryInfo(MetaName.txdRelationships, PsoDataType.Array, 64, 0, (MetaName)MetaTypeName.POINTER), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCompositeEntityType), - new PsoStructureEntryInfo(MetaName.compositeEntityTypes, PsoDataType.Array, 80, 0, (MetaName)9) - ); - case MetaName.CTxdRelationship: - return new PsoStructureInfo(MetaName.CTxdRelationship, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.parent, PsoDataType.String, 8, 3, 0), - new PsoStructureEntryInfo(MetaName.child, PsoDataType.String, 24, 3, 0) - ); - case MetaName.CCompositeEntityType: - return new PsoStructureInfo(MetaName.CCompositeEntityType, 0, 0, 336, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 0, (MetaName)4194304), - new PsoStructureEntryInfo(MetaName.lodDist, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.specialAttribute, PsoDataType.UInt, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.bbMin, PsoDataType.Float3, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.bbMax, PsoDataType.Float3, 96, 0, 0), - new PsoStructureEntryInfo(MetaName.bsCentre, PsoDataType.Float3, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.bsRadius, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.StartModel, PsoDataType.String, 136, 0, (MetaName)4194304), - new PsoStructureEntryInfo(MetaName.EndModel, PsoDataType.String, 200, 0, (MetaName)4194304), - new PsoStructureEntryInfo(MetaName.StartImapFile, PsoDataType.String, 264, 3, 0), - new PsoStructureEntryInfo(MetaName.EndImapFile, PsoDataType.String, 280, 3, 0), - new PsoStructureEntryInfo(MetaName.PtFxAssetName, PsoDataType.String, 296, 3, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCompEntityAnims), - new PsoStructureEntryInfo(MetaName.Animations, PsoDataType.Array, 312, 0, (MetaName)13) - ); - case MetaName.CCompEntityAnims: - return new PsoStructureInfo(MetaName.CCompEntityAnims, 0, 0, 216, - new PsoStructureEntryInfo(MetaName.AnimDict, PsoDataType.String, 0, 0, (MetaName)4194304), - new PsoStructureEntryInfo(MetaName.AnimName, PsoDataType.String, 64, 0, (MetaName)4194304), - new PsoStructureEntryInfo(MetaName.AnimatedModel, PsoDataType.String, 128, 0, (MetaName)4194304), - new PsoStructureEntryInfo(MetaName.punchInPhase, PsoDataType.Float, 192, 0, 0), - new PsoStructureEntryInfo(MetaName.punchOutPhase, PsoDataType.Float, 196, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCompEntityEffectsData), - new PsoStructureEntryInfo(MetaName.effectsData, PsoDataType.Array, 200, 0, (MetaName)5) - ); - case MetaName.CCompEntityEffectsData: - return new PsoStructureInfo(MetaName.CCompEntityEffectsData, 0, 0, 160, - new PsoStructureEntryInfo(MetaName.fxType, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.fxOffsetPos, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.fxOffsetRot, PsoDataType.Float4, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.boneTag, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.startPhase, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.endPhase, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxIsTriggered, PsoDataType.Bool, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxTag, PsoDataType.String, 61, 0, (MetaName)4194304), - new PsoStructureEntryInfo(MetaName.ptFxScale, PsoDataType.Float, 128, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxProbability, PsoDataType.Float, 132, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxHasTint, PsoDataType.Bool, 136, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxTintR, PsoDataType.UByte, 137, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxTintG, PsoDataType.UByte, 138, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxTintB, PsoDataType.UByte, 139, 0, 0), - new PsoStructureEntryInfo(MetaName.ptFxSize, PsoDataType.Float3, 144, 0, 0) - ); - case MetaName.CExtensionDefParticleEffect: - return new PsoStructureInfo(MetaName.CExtensionDefParticleEffect, 0, 0, 96, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.offsetPosition, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.offsetRotation, PsoDataType.Float4, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.fxName, PsoDataType.String, 48, 3, 0), - new PsoStructureEntryInfo(MetaName.fxType, PsoDataType.SInt, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.boneTag, PsoDataType.SInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Float, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.probability, PsoDataType.SInt, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.SInt, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 84, 1, 0) - ); - case MetaName.CBaseArchetypeDef: - return new PsoStructureInfo(MetaName.CBaseArchetypeDef, 0, 0, 176, - new PsoStructureEntryInfo(MetaName.lodDist, PsoDataType.Float, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.specialAttribute, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.bbMin, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.bbMax, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.bsCentre, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.bsRadius, PsoDataType.Float, 80, 0, 0), - new PsoStructureEntryInfo(MetaName.hdTextureDist, PsoDataType.Float, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 88, 3, 0), - new PsoStructureEntryInfo(MetaName.textureDictionary, PsoDataType.String, 104, 3, 0), - new PsoStructureEntryInfo(MetaName.clipDictionary, PsoDataType.String, 120, 3, 0), - new PsoStructureEntryInfo(MetaName.drawableDictionary, PsoDataType.String, 136, 3, 0), - new PsoStructureEntryInfo(MetaName.physicsDictionary, PsoDataType.String, 152, 7, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.extensions, PsoDataType.Array, 160, 0, (MetaName)13) - ); - case MetaName.CImapDependency: - return new PsoStructureInfo(MetaName.CImapDependency, 0, 0, 12, - new PsoStructureEntryInfo(MetaName.imapName, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.itypName, PsoDataType.String, 4, 7, 0), - new PsoStructureEntryInfo(MetaName.packFileName, PsoDataType.String, 8, 7, 0) - ); - case MetaName.CMapData: - return new PsoStructureInfo(MetaName.CMapData, 0, 0, 304, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.parent, PsoDataType.String, 12, 7, 0), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.contentFlags, PsoDataType.UInt, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.streamingExtentsMin, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.streamingExtentsMax, PsoDataType.Float3, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.entitiesExtentsMin, PsoDataType.Float3, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.entitiesExtentsMax, PsoDataType.Float3, 80, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.entities, PsoDataType.Array, 96, 0, (MetaName)8), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.rage__fwContainerLodDef), - new PsoStructureEntryInfo(MetaName.containerLods, PsoDataType.Array, 112, 0, (MetaName)10), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.BoxOccluder), - new PsoStructureEntryInfo(MetaName.boxOccluders, PsoDataType.Array, 128, 0, (MetaName)MetaTypeName.PsoPOINTER), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.OccludeModel), - new PsoStructureEntryInfo(MetaName.occludeModels, PsoDataType.Array, 144, 0, (MetaName)14), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.physicsDictionaries, PsoDataType.Array, 160, 0, (MetaName)MetaTypeName.STRING), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CTimeCycleModifier), - new PsoStructureEntryInfo(MetaName.timeCycleModifiers, PsoDataType.Array, 176, 0, (MetaName)18), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCarGen), - new PsoStructureEntryInfo(MetaName.carGenerators, PsoDataType.Array, 192, 0, (MetaName)20), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CLODLight), - new PsoStructureEntryInfo(MetaName.LODLights, PsoDataType.Array, 208, 0, (MetaName)22), - new PsoStructureEntryInfo(MetaName.block, PsoDataType.Structure, 224, 0, MetaName.CBlockDesc) - ); - case MetaName.rage__fwContainerLodDef: - return new PsoStructureInfo(MetaName.rage__fwContainerLodDef, 0, 0, 8, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 0, 7, 0), - new PsoStructureEntryInfo(MetaName.parentIndex, PsoDataType.UInt, 4, 0, 0) - ); - case MetaName.BoxOccluder: - return new PsoStructureInfo(MetaName.BoxOccluder, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.iCenterX, PsoDataType.SShort, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.iCenterY, PsoDataType.SShort, 2, 0, 0), - new PsoStructureEntryInfo(MetaName.iCenterZ, PsoDataType.SShort, 4, 0, 0), - new PsoStructureEntryInfo(MetaName.iCosZ, PsoDataType.SShort, 6, 0, 0), - new PsoStructureEntryInfo(MetaName.iLength, PsoDataType.SShort, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.iWidth, PsoDataType.SShort, 10, 0, 0), - new PsoStructureEntryInfo(MetaName.iHeight, PsoDataType.SShort, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.iSinZ, PsoDataType.SShort, 14, 0, 0) - ); - case MetaName.OccludeModel: - return new PsoStructureInfo(MetaName.OccludeModel, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.bmin, PsoDataType.Float3a, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.bmax, PsoDataType.Float3a, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.dataSize, PsoDataType.UInt, 32, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.verts, PsoDataType.Array, 40, 6, (MetaName)2097155), - new PsoStructureEntryInfo(MetaName.numVertsInBytes, PsoDataType.UShort, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.numTris, PsoDataType.UShort, 50, 0, 0) - ); - case MetaName.CTimeCycleModifier: - return new PsoStructureInfo(MetaName.CTimeCycleModifier, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.minExtents, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.maxExtents, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.percentage, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.range, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo(MetaName.startHour, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.endHour, PsoDataType.UInt, 60, 0, 0) - ); - case MetaName.CCarGen: - return new PsoStructureInfo(MetaName.CCarGen, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.position, PsoDataType.Float3, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.orientX, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.orientY, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.perpendicularLength, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.carModel, PsoDataType.String, 44, 7, 0), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)2431193454, PsoDataType.UInt, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)379378343, PsoDataType.UInt, 56, 0, 0), - new PsoStructureEntryInfo(MetaName.bodyColorRemap1, PsoDataType.SInt, 60, 0, 0), - new PsoStructureEntryInfo(MetaName.bodyColorRemap2, PsoDataType.SInt, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.bodyColorRemap3, PsoDataType.SInt, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.bodyColorRemap4, PsoDataType.SInt, 72, 0, 0) - ); - case MetaName.CLODLight: - return new PsoStructureInfo(MetaName.CLODLight, 0, 0, 136, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.FloatXYZ), - new PsoStructureEntryInfo(MetaName.direction, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.falloff, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.falloffExponent, PsoDataType.Array, 40, 0, (MetaName)4), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.timeAndStateFlags, PsoDataType.Array, 56, 0, (MetaName)6), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.hash, PsoDataType.Array, 72, 0, (MetaName)8), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.coneInnerAngle, PsoDataType.Array, 88, 0, (MetaName)10), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.coneOuterAngleOrCapExt, PsoDataType.Array, 104, 0, (MetaName)MetaTypeName.PsoPOINTER), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.coronaIntensity, PsoDataType.Array, 120, 0, (MetaName)14) - ); - case MetaName.CBlockDesc: - return new PsoStructureInfo(MetaName.CBlockDesc, 0, 0, 72, - new PsoStructureEntryInfo(MetaName.version, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 4, 0, 0), - new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 3, 0), - new PsoStructureEntryInfo(MetaName.exportedBy, PsoDataType.String, 24, 3, 0), - new PsoStructureEntryInfo(MetaName.owner, PsoDataType.String, 40, 3, 0), - new PsoStructureEntryInfo(MetaName.time, PsoDataType.String, 56, 3, 0) - ); - case MetaName.CEntityDef: - return new PsoStructureInfo(MetaName.CEntityDef, 0, 0, 128, - new PsoStructureEntryInfo(MetaName.archetypeName, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.guid, PsoDataType.UInt, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.position, PsoDataType.Float3, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.rotation, PsoDataType.Float4, 48, 0, 0), - new PsoStructureEntryInfo(MetaName.scaleXY, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo(MetaName.scaleZ, PsoDataType.Float, 68, 0, 0), - new PsoStructureEntryInfo(MetaName.parentIndex, PsoDataType.SInt, 72, 0, 0), - new PsoStructureEntryInfo(MetaName.lodDist, PsoDataType.Float, 76, 0, 0), - new PsoStructureEntryInfo(MetaName.lodLevel, PsoDataType.Enum, 80, 0, MetaName.rage__eLodType), - new PsoStructureEntryInfo(MetaName.numChildren, PsoDataType.UInt, 84, 0, 0), - new PsoStructureEntryInfo(MetaName.priorityLevel, PsoDataType.Enum, 88, 0, MetaName.rage__ePriorityLevel), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), - new PsoStructureEntryInfo(MetaName.extensions, PsoDataType.Array, 96, 0, (MetaName)MetaTypeName.PsoPOINTER), - new PsoStructureEntryInfo(MetaName.ambientOcclusionMultiplier, PsoDataType.SInt, 112, 0, 0), - new PsoStructureEntryInfo(MetaName.artificialAmbientOcclusion, PsoDataType.SInt, 116, 0, 0), - new PsoStructureEntryInfo(MetaName.tintValue, PsoDataType.UInt, 120, 0, 0), - new PsoStructureEntryInfo(MetaName.lightGroup, PsoDataType.UInt, 124, 0, 0) - ); - case MetaName.CDistantLODLight: - return new PsoStructureInfo(MetaName.CDistantLODLight, 0, 0, 48, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.FloatXYZ), - new PsoStructureEntryInfo(MetaName.position, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.RGBI, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo(MetaName.numStreetLights, PsoDataType.UShort, 40, 0, 0), - new PsoStructureEntryInfo(MetaName.category, PsoDataType.UShort, 42, 0, 0) - ); - case (MetaName)3730683074: - return new PsoStructureInfo((MetaName)3730683074, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2166096847), - new PsoStructureEntryInfo(MetaName.PortalInfoList, PsoDataType.Array, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1998468471), - new PsoStructureEntryInfo(MetaName.PathNodeList, PsoDataType.Array, 16, 0, (MetaName)2) - ); - case (MetaName)2166096847: - return new PsoStructureInfo((MetaName)2166096847, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.InteriorProxyHash, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.PortalIdx, PsoDataType.SInt, 4, 0, 0), - new PsoStructureEntryInfo(MetaName.RoomIdx, PsoDataType.SInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.DestInteriorHash, PsoDataType.UInt, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.DestRoomIdx, PsoDataType.SInt, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4133637881), - new PsoStructureEntryInfo(MetaName.PortalEntityList, PsoDataType.Array, 24, 0, (MetaName)5) - ); - case (MetaName)4133637881: - return new PsoStructureInfo((MetaName)4133637881, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.LinkType, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.MaxOcclusion, PsoDataType.Float, 4, 0, 0), - new PsoStructureEntryInfo((MetaName)3815194629, PsoDataType.UInt, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.IsDoor, PsoDataType.Bool, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.IsGlass, PsoDataType.Bool, 13, 0, 0) - ); - case (MetaName)1998468471: - return new PsoStructureInfo((MetaName)1998468471, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.Key, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2301425487), - new PsoStructureEntryInfo(MetaName.PathNodeChildList, PsoDataType.Array, 8, 0, (MetaName)1) - ); - case (MetaName)2301425487: - return new PsoStructureInfo((MetaName)2301425487, 0, 0, 8, - new PsoStructureEntryInfo(MetaName.PathNodeKey, PsoDataType.UInt, 0, 0, 0), - new PsoStructureEntryInfo(MetaName.PortalInfoIdx, PsoDataType.SInt, 4, 0, 0) - ); - case MetaName.camMotionBlurSettingsMetadata: - return new PsoStructureInfo(MetaName.camMotionBlurSettingsMetadata, 0, 0, 64, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.MovementMotionBlurMinSpeed, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.MovementMotionBlurMaxSpeed, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.MovementMotionBlurMaxStrength, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.DamageMotionBlurMinDamage, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.DamageMotionBlurMaxDamage, PsoDataType.Float, 32, 0, 0), - new PsoStructureEntryInfo(MetaName.DamageMotionBlurMaxStrength, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo(MetaName.DamageMotionBlurDuration, PsoDataType.UInt, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)3109021193, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)2711268798, PsoDataType.Float, 48, 0, 0), - new PsoStructureEntryInfo((MetaName)960288180, PsoDataType.Float, 52, 0, 0), - new PsoStructureEntryInfo((MetaName)3693477470, PsoDataType.UInt, 56, 0, 0) - ); - case MetaName.camVehicleRocketSettings: - return new PsoStructureInfo(MetaName.camVehicleRocketSettings, 0, 0, 16, - new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.ShakeAmplitude, PsoDataType.Float, 12, 0, 0) - ); - case MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring: - return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring, 0, 0, 24, - new PsoStructureEntryInfo(MetaName.ShouldApply, PsoDataType.Bool, 8, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 12, 0, 0), - new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)1065492607, PsoDataType.Float, 20, 0, 0) - ); - case MetaName.camInterpolatorMetadata: - return new PsoStructureInfo(MetaName.camInterpolatorMetadata, 0, 0, 40, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo(MetaName.EaseIn, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo(MetaName.EaseOut, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Float, 28, 0, 0), - new PsoStructureEntryInfo(MetaName.End, PsoDataType.Float, 32, 0, 0) - ); - case MetaName.camAnimSceneDirectorMetadata: - return new PsoStructureInfo(MetaName.camAnimSceneDirectorMetadata, 0, 0, 32, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)2406434970, PsoDataType.String, 24, 7, 0) - ); - case MetaName.NonFlyableAreaArray: - return new PsoStructureInfo(MetaName.NonFlyableAreaArray, 0, 0, 24, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.NonFlyableArea), - new PsoStructureEntryInfo(MetaName.areas, PsoDataType.Array, 8, 0, 0) - ); - case MetaName.NonFlyableArea: - return new PsoStructureInfo(MetaName.NonFlyableArea, 0, 0, 32, - new PsoStructureEntryInfo((MetaName)2473579981, PsoDataType.Float4, 16, 0, 0) - ); - case MetaName.CAssassinsDispatch__Tunables: - return new PsoStructureInfo(MetaName.CAssassinsDispatch__Tunables, 0, 0, 80, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo((MetaName)2394623568, PsoDataType.Float, 16, 0, 0), - new PsoStructureEntryInfo((MetaName)3368196277, PsoDataType.Float, 20, 0, 0), - new PsoStructureEntryInfo((MetaName)2477967991, PsoDataType.Float, 24, 0, 0), - new PsoStructureEntryInfo((MetaName)3376433583, PsoDataType.String, 28, 7, 0), - new PsoStructureEntryInfo((MetaName)689054964, PsoDataType.String, 32, 7, 0), - new PsoStructureEntryInfo((MetaName)147587300, PsoDataType.Float, 36, 0, 0), - new PsoStructureEntryInfo((MetaName)201820320, PsoDataType.Float, 40, 0, 0), - new PsoStructureEntryInfo((MetaName)4035657267, PsoDataType.Float, 44, 0, 0), - new PsoStructureEntryInfo((MetaName)3058832678, PsoDataType.String, 48, 7, 0), - new PsoStructureEntryInfo((MetaName)2649613364, PsoDataType.String, 52, 7, 0), - new PsoStructureEntryInfo((MetaName)4282874513, PsoDataType.Float, 56, 0, 0), - new PsoStructureEntryInfo((MetaName)969882415, PsoDataType.Float, 60, 0, 0), - new PsoStructureEntryInfo((MetaName)2143223731, PsoDataType.Float, 64, 0, 0), - new PsoStructureEntryInfo((MetaName)1149455399, PsoDataType.String, 68, 7, 0), - new PsoStructureEntryInfo((MetaName)835576115, PsoDataType.String, 72, 7, 0) - ); - case MetaName.CTaskNMBuoyancy__Tunables: - return new PsoStructureInfo(MetaName.CTaskNMBuoyancy__Tunables, 0, 0, 48, - new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), - new PsoStructureEntryInfo(MetaName.BlendOutThreshold, PsoDataType.Structure, 16, 0, (MetaName)3749122641) - ); - case MetaName.fwProfanityFilter: - return new PsoStructureInfo(MetaName.fwProfanityFilter, 0, 0, 56, - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), - new PsoStructureEntryInfo(MetaName.profaneTerms, PsoDataType.Array, 8, 0, 0), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), - new PsoStructureEntryInfo(MetaName.reservedTerms, PsoDataType.Array, 24, 0, (MetaName)2), - new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), - new PsoStructureEntryInfo(MetaName.reservedFSCharacters, PsoDataType.Array, 40, 0, (MetaName)4) - ); - default: - return null; - } - } - public static PsoEnumInfo GetEnumInfo(MetaName name) - { - //to generate enuminfos - switch (name) - { - case (MetaName)360458334: //vehicle mod color metallic id - return new PsoEnumInfo((MetaName)360458334, 1, - new PsoEnumEntryInfo(MetaName.none, -1), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_normal, 0), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_1, 1), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_2, 2), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_3, 3), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_4, 4), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_5, 5), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_6, 6), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_7, 7), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_8, 8), - new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_9, 9) - ); - case (MetaName)544262540: //vehicle mod color audio color - return new PsoEnumInfo((MetaName)544262540, 1, - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_black, 0), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_blue, 1), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_brown, 2), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_beige, 3), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_graphite, 4), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_green, 5), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_grey, 6), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_orange, 7), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_pink, 8), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_red, 9), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_silver, 10), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_white, 11), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_yellow, 12) - ); - case (MetaName)2065815796: //vehicle mod color audio prefix - return new PsoEnumInfo((MetaName)2065815796, 1, - new PsoEnumEntryInfo(MetaName.none, 0), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_PREFIX_bright, 1), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_PREFIX_light, 2), - new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_PREFIX_dark, 3) - ); - case MetaName.eModKitType: //vehicle mod kit type - return new PsoEnumInfo(MetaName.eModKitType, 1, - new PsoEnumEntryInfo(MetaName.MKT_STANDARD, 0), - new PsoEnumEntryInfo(MetaName.MKT_SPORT, 1), - new PsoEnumEntryInfo(MetaName.MKT_SUV, 2), - new PsoEnumEntryInfo(MetaName.MKT_SPECIAL, 3) - ); - case MetaName.eVehicleModType: //vehicle mod type - return new PsoEnumInfo(MetaName.eVehicleModType, 1, - new PsoEnumEntryInfo(MetaName.VMT_SPOILER, 0), - new PsoEnumEntryInfo(MetaName.VMT_BUMPER_F, 1), - new PsoEnumEntryInfo(MetaName.VMT_BUMPER_R, 2), - new PsoEnumEntryInfo(MetaName.VMT_SKIRT, 3), - new PsoEnumEntryInfo(MetaName.VMT_EXHAUST, 4), - new PsoEnumEntryInfo(MetaName.VMT_CHASSIS, 5), - new PsoEnumEntryInfo(MetaName.VMT_GRILL, 6), - new PsoEnumEntryInfo(MetaName.VMT_BONNET, 7), - new PsoEnumEntryInfo(MetaName.VMT_WING_L, 8), - new PsoEnumEntryInfo(MetaName.VMT_WING_R, 9), - new PsoEnumEntryInfo(MetaName.VMT_ROOF, 10), - new PsoEnumEntryInfo(MetaName.VMT_PLTHOLDER, 11), - new PsoEnumEntryInfo(MetaName.VMT_PLTVANITY, 12), - new PsoEnumEntryInfo(MetaName.VMT_INTERIOR1, 13), - new PsoEnumEntryInfo(MetaName.VMT_INTERIOR2, 14), - new PsoEnumEntryInfo(MetaName.VMT_INTERIOR3, 15), - new PsoEnumEntryInfo(MetaName.VMT_INTERIOR4, 16), - new PsoEnumEntryInfo(MetaName.VMT_INTERIOR5, 17), - new PsoEnumEntryInfo(MetaName.VMT_SEATS, 18), - new PsoEnumEntryInfo(MetaName.VMT_STEERING, 19), - new PsoEnumEntryInfo(MetaName.VMT_KNOB, 20), - new PsoEnumEntryInfo(MetaName.VMT_PLAQUE, 21), - new PsoEnumEntryInfo(MetaName.VMT_ICE, 22), - new PsoEnumEntryInfo(MetaName.VMT_TRUNK, 23), - new PsoEnumEntryInfo(MetaName.VMT_HYDRO, 24), - new PsoEnumEntryInfo(MetaName.VMT_ENGINEBAY1, 25), - new PsoEnumEntryInfo(MetaName.VMT_ENGINEBAY2, 26), - new PsoEnumEntryInfo(MetaName.VMT_ENGINEBAY3, 27), - new PsoEnumEntryInfo(MetaName.VMT_CHASSIS2, 28), - new PsoEnumEntryInfo(MetaName.VMT_CHASSIS3, 29), - new PsoEnumEntryInfo(MetaName.VMT_CHASSIS4, 30), - new PsoEnumEntryInfo(MetaName.VMT_CHASSIS5, 31), - new PsoEnumEntryInfo(MetaName.VMT_DOOR_L, 32), - new PsoEnumEntryInfo(MetaName.VMT_DOOR_R, 33), - new PsoEnumEntryInfo(MetaName.VMT_LIVERY_MOD, 34), - new PsoEnumEntryInfo((MetaName)3409280882, 35), - new PsoEnumEntryInfo(MetaName.VMT_ENGINE, 36), - new PsoEnumEntryInfo(MetaName.VMT_BRAKES, 37), - new PsoEnumEntryInfo(MetaName.VMT_GEARBOX, 38), - new PsoEnumEntryInfo(MetaName.VMT_HORN, 39), - new PsoEnumEntryInfo(MetaName.VMT_SUSPENSION, 40), - new PsoEnumEntryInfo(MetaName.VMT_ARMOUR, 41), - new PsoEnumEntryInfo((MetaName)3278520444, 42), - new PsoEnumEntryInfo(MetaName.VMT_TURBO, 43), - new PsoEnumEntryInfo((MetaName)1675686396, 44), - new PsoEnumEntryInfo(MetaName.VMT_TYRE_SMOKE, 45), - new PsoEnumEntryInfo(MetaName.VMT_HYDRAULICS, 46), - new PsoEnumEntryInfo(MetaName.VMT_XENON_LIGHTS, 47), - new PsoEnumEntryInfo(MetaName.VMT_WHEELS, 48), - new PsoEnumEntryInfo(MetaName.VMT_WHEELS_REAR_OR_HYDRAULICS, 49) - ); - case (MetaName)3635907608: //vehicle mod bone - return new PsoEnumInfo((MetaName)3635907608, 1, - new PsoEnumEntryInfo(MetaName.none, -1), - new PsoEnumEntryInfo(MetaName.chassis, 0), - new PsoEnumEntryInfo(MetaName.bodyshell, 48), - new PsoEnumEntryInfo(MetaName.bumper_f, 49), - new PsoEnumEntryInfo(MetaName.bumper_r, 50), - new PsoEnumEntryInfo(MetaName.wing_rf, 51), - new PsoEnumEntryInfo(MetaName.wing_lf, 52), - new PsoEnumEntryInfo(MetaName.bonnet, 53), - new PsoEnumEntryInfo(MetaName.boot, 54), - new PsoEnumEntryInfo(MetaName.exhaust, 56), - new PsoEnumEntryInfo(MetaName.exhaust_2, 57), - new PsoEnumEntryInfo(MetaName.exhaust_3, 58), - new PsoEnumEntryInfo(MetaName.exhaust_4, 59), - new PsoEnumEntryInfo(MetaName.exhaust_5, 60), - new PsoEnumEntryInfo(MetaName.exhaust_6, 61), - new PsoEnumEntryInfo(MetaName.exhaust_7, 62), - new PsoEnumEntryInfo(MetaName.exhaust_8, 63), - new PsoEnumEntryInfo(MetaName.exhaust_9, 64), - new PsoEnumEntryInfo(MetaName.exhaust_10, 65), - new PsoEnumEntryInfo(MetaName.exhaust_11, 66), - new PsoEnumEntryInfo(MetaName.exhaust_12, 67), - new PsoEnumEntryInfo(MetaName.exhaust_13, 68), - new PsoEnumEntryInfo(MetaName.exhaust_14, 69), - new PsoEnumEntryInfo(MetaName.exhaust_15, 70), - new PsoEnumEntryInfo(MetaName.exhaust_16, 71), - new PsoEnumEntryInfo(MetaName.extra_1, 401), - new PsoEnumEntryInfo(MetaName.extra_2, 402), - new PsoEnumEntryInfo(MetaName.extra_3, 403), - new PsoEnumEntryInfo(MetaName.extra_4, 404), - new PsoEnumEntryInfo(MetaName.extra_5, 405), - new PsoEnumEntryInfo(MetaName.extra_6, 406), - new PsoEnumEntryInfo(MetaName.extra_7, 407), - new PsoEnumEntryInfo(MetaName.extra_8, 408), - new PsoEnumEntryInfo(MetaName.extra_9, 409), - new PsoEnumEntryInfo(MetaName.extra_10, 410), - new PsoEnumEntryInfo(MetaName.extra_11, 411), - new PsoEnumEntryInfo(MetaName.extra_12, 412), - new PsoEnumEntryInfo(MetaName.extra_13, 413), - new PsoEnumEntryInfo(MetaName.extra_14, 414), - new PsoEnumEntryInfo(MetaName.break_extra_1, 417), - new PsoEnumEntryInfo(MetaName.break_extra_2, 418), - new PsoEnumEntryInfo(MetaName.break_extra_3, 419), - new PsoEnumEntryInfo(MetaName.break_extra_4, 420), - new PsoEnumEntryInfo(MetaName.break_extra_5, 421), - new PsoEnumEntryInfo(MetaName.break_extra_6, 422), - new PsoEnumEntryInfo(MetaName.break_extra_7, 423), - new PsoEnumEntryInfo(MetaName.break_extra_8, 424), - new PsoEnumEntryInfo(MetaName.break_extra_9, 425), - new PsoEnumEntryInfo(MetaName.break_extra_10, 426), - new PsoEnumEntryInfo(MetaName.mod_col_1, 427), - new PsoEnumEntryInfo(MetaName.mod_col_2, 428), - new PsoEnumEntryInfo(MetaName.mod_col_3, 429), - new PsoEnumEntryInfo(MetaName.mod_col_4, 430), - new PsoEnumEntryInfo(MetaName.mod_col_5, 431), - new PsoEnumEntryInfo(MetaName.mod_col_6, 432), - new PsoEnumEntryInfo(MetaName.mod_col_7, 433), - new PsoEnumEntryInfo(MetaName.mod_col_8, 434), - new PsoEnumEntryInfo(MetaName.mod_col_9, 435), - new PsoEnumEntryInfo(MetaName.mod_col_10, 436), - new PsoEnumEntryInfo(MetaName.mod_col_11, 437), - new PsoEnumEntryInfo(MetaName.mod_col_12, 438), - new PsoEnumEntryInfo(MetaName.mod_col_13, 439), - new PsoEnumEntryInfo(MetaName.mod_col_14, 440), - new PsoEnumEntryInfo(MetaName.mod_col_15, 441), - new PsoEnumEntryInfo(MetaName.mod_col_16, 442), - new PsoEnumEntryInfo(MetaName.misc_a, 369), - new PsoEnumEntryInfo(MetaName.misc_b, 370), - new PsoEnumEntryInfo(MetaName.misc_c, 371), - new PsoEnumEntryInfo(MetaName.misc_d, 372), - new PsoEnumEntryInfo(MetaName.misc_e, 373), - new PsoEnumEntryInfo(MetaName.misc_f, 374), - new PsoEnumEntryInfo(MetaName.misc_g, 375), - new PsoEnumEntryInfo(MetaName.misc_h, 376), - new PsoEnumEntryInfo(MetaName.misc_i, 377), - new PsoEnumEntryInfo(MetaName.misc_j, 378), - new PsoEnumEntryInfo(MetaName.misc_k, 379), - new PsoEnumEntryInfo(MetaName.misc_l, 380), - new PsoEnumEntryInfo(MetaName.misc_m, 381), - new PsoEnumEntryInfo(MetaName.misc_n, 382), - new PsoEnumEntryInfo(MetaName.misc_o, 383), - new PsoEnumEntryInfo(MetaName.misc_p, 384), - new PsoEnumEntryInfo(MetaName.misc_q, 385), - new PsoEnumEntryInfo(MetaName.misc_r, 386), - new PsoEnumEntryInfo(MetaName.misc_s, 387), - new PsoEnumEntryInfo(MetaName.misc_t, 388), - new PsoEnumEntryInfo(MetaName.misc_u, 389), - new PsoEnumEntryInfo(MetaName.misc_v, 390), - new PsoEnumEntryInfo(MetaName.misc_w, 391), - new PsoEnumEntryInfo(MetaName.misc_x, 392), - new PsoEnumEntryInfo(MetaName.misc_y, 393), - new PsoEnumEntryInfo(MetaName.misc_z, 394), - new PsoEnumEntryInfo(MetaName.misc_1, 395), - new PsoEnumEntryInfo(MetaName.misc_2, 396), - new PsoEnumEntryInfo(MetaName.handlebars, 79), - new PsoEnumEntryInfo(MetaName.steeringwheel, 80), - new PsoEnumEntryInfo(MetaName.swingarm, 29), - new PsoEnumEntryInfo(MetaName.forks_u, 21), - new PsoEnumEntryInfo(MetaName.forks_l, 22), - new PsoEnumEntryInfo(MetaName.headlight_l, 91), - new PsoEnumEntryInfo(MetaName.headlight_r, 92), - new PsoEnumEntryInfo(MetaName.indicator_lr, 97), - new PsoEnumEntryInfo(MetaName.indicator_lf, 95), - new PsoEnumEntryInfo(MetaName.indicator_rr, 98), - new PsoEnumEntryInfo(MetaName.indicator_rf, 96), - new PsoEnumEntryInfo(MetaName.taillight_l, 93), - new PsoEnumEntryInfo(MetaName.taillight_r, 94), - new PsoEnumEntryInfo(MetaName.window_lf, 42), - new PsoEnumEntryInfo(MetaName.window_rf, 43), - new PsoEnumEntryInfo(MetaName.window_rr, 45), - new PsoEnumEntryInfo(MetaName.window_lr, 44), - new PsoEnumEntryInfo(MetaName.window_lm, 46), - new PsoEnumEntryInfo(MetaName.window_rm, 47), - new PsoEnumEntryInfo(MetaName.hub_lf, 30), - new PsoEnumEntryInfo(MetaName.hub_rf, 31), - new PsoEnumEntryInfo(MetaName.windscreen_r, 41), - new PsoEnumEntryInfo(MetaName.neon_l, 104), - new PsoEnumEntryInfo(MetaName.neon_r, 105), - new PsoEnumEntryInfo(MetaName.neon_f, 106), - new PsoEnumEntryInfo(MetaName.neon_b, 107), - new PsoEnumEntryInfo(MetaName.door_dside_f, 3), - new PsoEnumEntryInfo(MetaName.door_dside_r, 4), - new PsoEnumEntryInfo(MetaName.door_pside_f, 5), - new PsoEnumEntryInfo(MetaName.door_pside_r, 6), - new PsoEnumEntryInfo(MetaName.bobble_head, 361), - new PsoEnumEntryInfo(MetaName.bobble_base, 362), - new PsoEnumEntryInfo(MetaName.bobble_hand, 363), - new PsoEnumEntryInfo(MetaName.engineblock, 364), - new PsoEnumEntryInfo(MetaName.mod_a, 474), - new PsoEnumEntryInfo(MetaName.mod_b, 475), - new PsoEnumEntryInfo(MetaName.mod_c, 476), - new PsoEnumEntryInfo(MetaName.mod_d, 477), - new PsoEnumEntryInfo(MetaName.mod_e, 478), - new PsoEnumEntryInfo(MetaName.mod_f, 479), - new PsoEnumEntryInfo(MetaName.mod_g, 480), - new PsoEnumEntryInfo(MetaName.mod_h, 481), - new PsoEnumEntryInfo(MetaName.mod_i, 482), - new PsoEnumEntryInfo(MetaName.mod_j, 483), - new PsoEnumEntryInfo(MetaName.mod_k, 484), - new PsoEnumEntryInfo(MetaName.mod_l, 485), - new PsoEnumEntryInfo(MetaName.mod_m, 486), - new PsoEnumEntryInfo(MetaName.mod_n, 487), - new PsoEnumEntryInfo(MetaName.mod_o, 488), - new PsoEnumEntryInfo(MetaName.mod_p, 489), - new PsoEnumEntryInfo(MetaName.mod_q, 490), - new PsoEnumEntryInfo(MetaName.mod_r, 491), - new PsoEnumEntryInfo(MetaName.mod_s, 492), - new PsoEnumEntryInfo(MetaName.mod_t, 493), - new PsoEnumEntryInfo(MetaName.mod_u, 494), - new PsoEnumEntryInfo(MetaName.mod_v, 495), - new PsoEnumEntryInfo(MetaName.mod_w, 496), - new PsoEnumEntryInfo(MetaName.mod_x, 497), - new PsoEnumEntryInfo(MetaName.mod_y, 498), - new PsoEnumEntryInfo(MetaName.mod_z, 499), - new PsoEnumEntryInfo(MetaName.mod_aa, 500), - new PsoEnumEntryInfo(MetaName.mod_ab, 501), - new PsoEnumEntryInfo(MetaName.mod_ac, 502), - new PsoEnumEntryInfo(MetaName.mod_ad, 503), - new PsoEnumEntryInfo(MetaName.mod_ae, 504), - new PsoEnumEntryInfo(MetaName.mod_af, 505), - new PsoEnumEntryInfo(MetaName.mod_ag, 506), - new PsoEnumEntryInfo(MetaName.mod_ah, 507), - new PsoEnumEntryInfo(MetaName.mod_ai, 508), - new PsoEnumEntryInfo(MetaName.mod_aj, 509), - new PsoEnumEntryInfo(MetaName.mod_ak, 510), - new PsoEnumEntryInfo(MetaName.turret_a1, 511), - new PsoEnumEntryInfo(MetaName.turret_a2, 512), - new PsoEnumEntryInfo(MetaName.turret_a3, 513), - new PsoEnumEntryInfo(MetaName.turret_a4, 514), - new PsoEnumEntryInfo(MetaName.turret_b1, 524), - new PsoEnumEntryInfo(MetaName.turret_b2, 525), - new PsoEnumEntryInfo(MetaName.turret_b3, 526), - new PsoEnumEntryInfo(MetaName.turret_b4, 527), - new PsoEnumEntryInfo(MetaName.rblade_1mod, 560), - new PsoEnumEntryInfo(MetaName.rblade_1fast, 561), - new PsoEnumEntryInfo(MetaName.rblade_2mod, 562), - new PsoEnumEntryInfo(MetaName.rblade_2fast, 563), - new PsoEnumEntryInfo(MetaName.rblade_3mod, 564), - new PsoEnumEntryInfo(MetaName.rblade_3fast, 565), - new PsoEnumEntryInfo(MetaName.fblade_1mod, 566), - new PsoEnumEntryInfo(MetaName.fblade_1fast, 567), - new PsoEnumEntryInfo(MetaName.fblade_2mod, 568), - new PsoEnumEntryInfo(MetaName.fblade_2fast, 569), - new PsoEnumEntryInfo(MetaName.fblade_3mod, 570), - new PsoEnumEntryInfo(MetaName.fblade_3fast, 571), - new PsoEnumEntryInfo((MetaName)1086719913, 572), - new PsoEnumEntryInfo((MetaName)3237490897, 573), - new PsoEnumEntryInfo((MetaName)3375838140, 574), - new PsoEnumEntryInfo((MetaName)2381840182, 575), - new PsoEnumEntryInfo((MetaName)3607058940, 576), - new PsoEnumEntryInfo((MetaName)3607058940, 577), - new PsoEnumEntryInfo((MetaName)1208798824, 578), - new PsoEnumEntryInfo((MetaName)303656220, 579), - new PsoEnumEntryInfo((MetaName)660207018, 580), - new PsoEnumEntryInfo(MetaName.spike_1mod, 581), - new PsoEnumEntryInfo((MetaName)3045655218, 582), - new PsoEnumEntryInfo((MetaName)2017296145, 583), - new PsoEnumEntryInfo(MetaName.spike_2mod, 584), - new PsoEnumEntryInfo((MetaName)1122332083, 585), - new PsoEnumEntryInfo((MetaName)1123212214, 586), - new PsoEnumEntryInfo(MetaName.spike_3mod, 587), - new PsoEnumEntryInfo((MetaName)4011591561, 588), - new PsoEnumEntryInfo((MetaName)2320654166, 589), - new PsoEnumEntryInfo(MetaName.scoop_1mod, 590), - new PsoEnumEntryInfo(MetaName.scoop_2mod, 591), - new PsoEnumEntryInfo(MetaName.scoop_3mod, 592) - ); - case MetaName.eVehicleModCameraPos: //vehicle mod camera position - return new PsoEnumInfo(MetaName.eVehicleModCameraPos, 1, - new PsoEnumEntryInfo(MetaName.VMCP_DEFAULT, 0), - new PsoEnumEntryInfo(MetaName.VMCP_FRONT, 1), - new PsoEnumEntryInfo(MetaName.VMCP_FRONT_LEFT, 2), - new PsoEnumEntryInfo(MetaName.VMCP_FRONT_RIGHT, 3), - new PsoEnumEntryInfo(MetaName.VMCP_REAR, 4), - new PsoEnumEntryInfo(MetaName.VMCP_REAR_LEFT, 5), - new PsoEnumEntryInfo(MetaName.VMCP_REAR_RIGHT, 6), - new PsoEnumEntryInfo(MetaName.VMCP_LEFT, 7), - new PsoEnumEntryInfo(MetaName.VMCP_RIGHT, 8), - new PsoEnumEntryInfo(MetaName.VMCP_TOP, 9), - new PsoEnumEntryInfo(MetaName.VMCP_BOTTOM, 10) - ); - case (MetaName)1795685103: //credit item job line type - return new PsoEnumInfo((MetaName)1795685103, 1, - new PsoEnumEntryInfo(MetaName.JOB_BIG, 0), - new PsoEnumEntryInfo(MetaName.JOB_MED, 1), - new PsoEnumEntryInfo(MetaName.JOB_SMALL, 2), - new PsoEnumEntryInfo(MetaName.NAME_BIG, 3), - new PsoEnumEntryInfo(MetaName.NAME_MED, 4), - new PsoEnumEntryInfo(MetaName.NAME_SMALL, 5), - new PsoEnumEntryInfo(MetaName.SPACE_BIG, 6), - new PsoEnumEntryInfo(MetaName.SPACE_MED, 7), - new PsoEnumEntryInfo(MetaName.SPACE_SMALL, 8), - new PsoEnumEntryInfo(MetaName.SPACE_END, 9), - new PsoEnumEntryInfo(MetaName.SPRITE_1, 10), - new PsoEnumEntryInfo(MetaName.LEGALS, 11), - new PsoEnumEntryInfo(MetaName.AUDIO_NAME, 12), - new PsoEnumEntryInfo(MetaName.AUDIO_LEGALS, 13), - new PsoEnumEntryInfo(MetaName.JOB_AND_NAME_MED, 14) - ); - case MetaName.DataFileType: - return new PsoEnumInfo(MetaName.DataFileType, 1, - new PsoEnumEntryInfo(MetaName.RPF_FILE, 0), - new PsoEnumEntryInfo(MetaName.IDE_FILE, 1), - new PsoEnumEntryInfo(MetaName.DELAYED_IDE_FILE, 2), - new PsoEnumEntryInfo(MetaName.IPL_FILE, 3), - new PsoEnumEntryInfo(MetaName.PERMANENT_ITYP_FILE, 4), - new PsoEnumEntryInfo((MetaName)4175147664, 5), - new PsoEnumEntryInfo(MetaName.HANDLING_FILE, 6), - new PsoEnumEntryInfo(MetaName.VEHICLEEXTRAS_FILE, 7), - new PsoEnumEntryInfo(MetaName.CHINESE_SHUFFLING_CHECKS_FILE, 8), - new PsoEnumEntryInfo(MetaName.PEDSTREAM_FILE, 9), - new PsoEnumEntryInfo(MetaName.CARCOLS_FILE, 10), - new PsoEnumEntryInfo(MetaName.POPGRP_FILE, 11), - new PsoEnumEntryInfo((MetaName)337231870, 12), - new PsoEnumEntryInfo((MetaName)3783701680, 13), - new PsoEnumEntryInfo(MetaName.POPSCHED_FILE, 14), - new PsoEnumEntryInfo(MetaName.ZONEBIND_FILE, 15), - new PsoEnumEntryInfo(MetaName.RADIO_FILE, 16), - new PsoEnumEntryInfo(MetaName.EXTRAMAP_CONVERSION_OCC_FILE, 17), - new PsoEnumEntryInfo(MetaName.THROWNWEAPONINFO_FILE, 18), - new PsoEnumEntryInfo(MetaName.RMPTFX_FILE, 19), - new PsoEnumEntryInfo(MetaName.PED_PERSONALITY_FILE, 20), - new PsoEnumEntryInfo(MetaName.PED_PERCEPTION_FILE, 21), - new PsoEnumEntryInfo(MetaName.VEHICLE_CAMERA_OFFSETS_FILE, 22), - new PsoEnumEntryInfo(MetaName.FRONTEND_MENU_FILE, 23), - new PsoEnumEntryInfo(MetaName.LEADERBOARD_DATA_FILE, 24), - new PsoEnumEntryInfo(MetaName.LEADERBOARD_ICONS_FILE, 25), - new PsoEnumEntryInfo(MetaName.NETWORKOPTIONS_FILE, 26), - new PsoEnumEntryInfo(MetaName.TIMECYCLE_FILE, 27), - new PsoEnumEntryInfo(MetaName.TIMECYCLEMOD_FILE, 28), - new PsoEnumEntryInfo(MetaName.WEATHER_FILE, 29), - new PsoEnumEntryInfo((MetaName)2403189033, 30), - new PsoEnumEntryInfo((MetaName)2431127142, 31), - new PsoEnumEntryInfo(MetaName.PROCOBJ_FILE, 32), - new PsoEnumEntryInfo(MetaName.PROC_META_FILE, 33), - new PsoEnumEntryInfo(MetaName.VFX_SETTINGS_FILE, 34), - new PsoEnumEntryInfo(MetaName.SP_STATS_DISPLAY_LIST_FILE, 35), - new PsoEnumEntryInfo(MetaName.MP_STATS_DISPLAY_LIST_FILE, 36), - new PsoEnumEntryInfo(MetaName.PED_VARS_FILE, 37), - new PsoEnumEntryInfo(MetaName.DISABLE_FILE, 38), - new PsoEnumEntryInfo(MetaName.BUILDING_META_DISPLACEMENT_FILE, 39), - new PsoEnumEntryInfo(MetaName.HUD_TXD_FILE, 40), - new PsoEnumEntryInfo(MetaName.FRONTEND_DAT_FILE, 41), - new PsoEnumEntryInfo(MetaName.SCROLLBARS_FILE, 42), - new PsoEnumEntryInfo(MetaName.TIME_FILE, 43), - new PsoEnumEntryInfo(MetaName.BLOODFX_FILE, 44), - new PsoEnumEntryInfo(MetaName.ENTITYFX_FILE, 45), - new PsoEnumEntryInfo(MetaName.EXPLOSIONFX_FILE, 46), - new PsoEnumEntryInfo(MetaName.MATERIALFX_FILE, 47), - new PsoEnumEntryInfo(MetaName.MOTION_TASK_DATA_FILE, 48), - new PsoEnumEntryInfo(MetaName.DEFAULT_TASK_DATA_FILE, 49), - new PsoEnumEntryInfo(MetaName.MOUNT_TUNE_FILE, 50), - new PsoEnumEntryInfo(MetaName.PED_BOUNDS_FILE, 51), - new PsoEnumEntryInfo(MetaName.PED_HEALTH_FILE, 52), - new PsoEnumEntryInfo(MetaName.PED_COMPONENT_SETS_FILE, 53), - new PsoEnumEntryInfo(MetaName.PED_IK_SETTINGS_FILE, 54), - new PsoEnumEntryInfo(MetaName.PED_TASK_DATA_FILE, 55), - new PsoEnumEntryInfo(MetaName.PED_SPECIAL_ABILITIES_FILE, 56), - new PsoEnumEntryInfo(MetaName.WHEELFX_FILE, 57), - new PsoEnumEntryInfo(MetaName.WEAPONFX_FILE, 58), - new PsoEnumEntryInfo(MetaName.DECALS_FILE, 59), - new PsoEnumEntryInfo(MetaName.NAVMESH_INDEXREMAPPING_FILE, 60), - new PsoEnumEntryInfo(MetaName.NAVNODE_INDEXREMAPPING_FILE, 61), - new PsoEnumEntryInfo(MetaName.AUDIOMESH_INDEXREMAPPING_FILE, 62), - new PsoEnumEntryInfo(MetaName.JUNCTION_TEMPLATES_FILE, 63), - new PsoEnumEntryInfo(MetaName.PATH_ZONES_FILE, 64), - new PsoEnumEntryInfo(MetaName.DISTANT_LIGHTS_FILE, 65), - new PsoEnumEntryInfo(MetaName.DISTANT_LIGHTS_HD_FILE, 66), - new PsoEnumEntryInfo(MetaName.FLIGHTZONES_FILE, 67), - new PsoEnumEntryInfo(MetaName.WATER_FILE, 68), - new PsoEnumEntryInfo(MetaName.TRAINCONFIGS_FILE, 69), - new PsoEnumEntryInfo(MetaName.TRAINTRACK_FILE, 70), - new PsoEnumEntryInfo(MetaName.PED_METADATA_FILE, 71), - new PsoEnumEntryInfo(MetaName.WEAPON_METADATA_FILE, 72), - new PsoEnumEntryInfo(MetaName.VEHICLE_METADATA_FILE, 73), - new PsoEnumEntryInfo(MetaName.DISPATCH_DATA_FILE, 74), - new PsoEnumEntryInfo(MetaName.DEFORMABLE_OBJECTS_FILE, 75), - new PsoEnumEntryInfo(MetaName.TUNABLE_OBJECTS_FILE, 76), - new PsoEnumEntryInfo(MetaName.PED_NAV_CAPABILITES_FILE, 77), - new PsoEnumEntryInfo(MetaName.WEAPONINFO_FILE, 78), - new PsoEnumEntryInfo(MetaName.WEAPONCOMPONENTSINFO_FILE, 79), - new PsoEnumEntryInfo(MetaName.LOADOUTS_FILE, 80), - new PsoEnumEntryInfo(MetaName.FIRINGPATTERNS_FILE, 81), - new PsoEnumEntryInfo(MetaName.MOTIVATIONS_FILE, 82), - new PsoEnumEntryInfo(MetaName.SCENARIO_POINTS_FILE, 83), - new PsoEnumEntryInfo(MetaName.SCENARIO_POINTS_PSO_FILE, 84), - new PsoEnumEntryInfo(MetaName.STREAMING_FILE, 85), - new PsoEnumEntryInfo(MetaName.STREAMING_FILE_PLATFORM_PS3, 86), - new PsoEnumEntryInfo(MetaName.STREAMING_FILE_PLATFORM_XENON, 87), - new PsoEnumEntryInfo(MetaName.STREAMING_FILE_PLATFORM_OTHER, 88), - new PsoEnumEntryInfo(MetaName.PED_BRAWLING_STYLE_FILE, 89), - new PsoEnumEntryInfo(MetaName.AMBIENT_PED_MODEL_SET_FILE, 90), - new PsoEnumEntryInfo(MetaName.AMBIENT_PROP_MODEL_SET_FILE, 91), - new PsoEnumEntryInfo(MetaName.AMBIENT_VEHICLE_MODEL_SET_FILE, 92), - new PsoEnumEntryInfo(MetaName.LADDER_METADATA_FILE, 93), - new PsoEnumEntryInfo((MetaName)4108615940, 94), - new PsoEnumEntryInfo(MetaName.SLOWNESS_ZONES_FILE, 95), - new PsoEnumEntryInfo(MetaName.LIQUIDFX_FILE, 96), - new PsoEnumEntryInfo(MetaName.VFXVEHICLEINFO_FILE, 97), - new PsoEnumEntryInfo(MetaName.VFXPEDINFO_FILE, 98), - new PsoEnumEntryInfo(MetaName.DOOR_TUNING_FILE, 99), - new PsoEnumEntryInfo(MetaName.PTFXASSETINFO_FILE, 100), - new PsoEnumEntryInfo(MetaName.SCRIPTFX_FILE, 101), - new PsoEnumEntryInfo(MetaName.VFXREGIONINFO_FILE, 102), - new PsoEnumEntryInfo(MetaName.VFXINTERIORINFO_FILE, 103), - new PsoEnumEntryInfo(MetaName.CAMERA_METADATA_FILE, 104), - new PsoEnumEntryInfo(MetaName.STREET_VEHICLE_ASSOCIATION_FILE, 105), - new PsoEnumEntryInfo(MetaName.VFXWEAPONINFO_FILE, 106), - new PsoEnumEntryInfo(MetaName.EXPLOSION_INFO_FILE, 107), - new PsoEnumEntryInfo(MetaName.JUNCTION_TEMPLATES_PSO_FILE, 108), - new PsoEnumEntryInfo(MetaName.MAPZONES_FILE, 109), - new PsoEnumEntryInfo(MetaName.SP_STATS_UI_LIST_FILE, 110), - new PsoEnumEntryInfo(MetaName.MP_STATS_UI_LIST_FILE, 111), - new PsoEnumEntryInfo(MetaName.OBJ_COVER_TUNING_FILE, 112), - new PsoEnumEntryInfo(MetaName.STREAMING_REQUEST_LISTS_FILE, 113), - new PsoEnumEntryInfo(MetaName.PLAYER_CARD_SETUP, 114), - new PsoEnumEntryInfo(MetaName.WORLD_HEIGHTMAP_FILE, 115), - new PsoEnumEntryInfo(MetaName.WORLD_WATERHEIGHT_FILE, 116), - new PsoEnumEntryInfo(MetaName.PED_OVERLAY_FILE, 117), - new PsoEnumEntryInfo(MetaName.WEAPON_ANIMATIONS_FILE, 118), - new PsoEnumEntryInfo(MetaName.VEHICLE_POPULATION_FILE, 119), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_DEFINITIONS, 120), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_RESULTS, 121), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_IMPULSES, 122), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_RUMBLES, 123), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_INTERRELATIONS, 124), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_HOMINGS, 125), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_DAMAGES, 126), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_STRIKE_BONES, 127), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_BRANCHES, 128), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_STEALTH_KILLS, 129), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_VFX, 130), - new PsoEnumEntryInfo(MetaName.ACTION_TABLE_FACIAL_ANIM_SETS, 131), - new PsoEnumEntryInfo(MetaName.VEHGEN_MARKUP_FILE, 132), - new PsoEnumEntryInfo(MetaName.PED_COMPONENT_CLOTH_FILE, 133), - new PsoEnumEntryInfo(MetaName.TATTOO_SHOP_DLC_FILE, 134), - new PsoEnumEntryInfo(MetaName.VEHICLE_VARIATION_FILE, 135), - new PsoEnumEntryInfo(MetaName.CONTENT_UNLOCKING_META_FILE, 136), - new PsoEnumEntryInfo(MetaName.SHOP_PED_APPAREL_META_FILE, 137), - new PsoEnumEntryInfo(MetaName.AUDIO_SOUNDDATA, 138), - new PsoEnumEntryInfo(MetaName.AUDIO_CURVEDATA, 139), - new PsoEnumEntryInfo(MetaName.AUDIO_GAMEDATA, 140), - new PsoEnumEntryInfo(MetaName.AUDIO_DYNAMIXDATA, 141), - new PsoEnumEntryInfo(MetaName.AUDIO_SPEECHDATA, 142), - new PsoEnumEntryInfo(MetaName.AUDIO_SYNTHDATA, 143), - new PsoEnumEntryInfo(MetaName.AUDIO_WAVEPACK, 144), - new PsoEnumEntryInfo(MetaName.CLIP_SETS_FILE, 145), - new PsoEnumEntryInfo(MetaName.EXPRESSION_SETS_FILE, 146), - new PsoEnumEntryInfo(MetaName.FACIAL_CLIPSET_GROUPS_FILE, 147), - new PsoEnumEntryInfo((MetaName)1603688191, 148), - new PsoEnumEntryInfo(MetaName.VEHICLE_SHOP_DLC_FILE, 149), - new PsoEnumEntryInfo(MetaName.WEAPON_SHOP_INFO_METADATA_FILE, 150), - new PsoEnumEntryInfo(MetaName.SCALEFORM_PREALLOC_FILE, 151), - new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE, 152), - new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_360, 153), - new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_PS3, 154), - new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_PS3_JPN, 155), - new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_ORBIS, 156), - new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_ORBIS_JPN, 157), - new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_DURANGO, 158), - new PsoEnumEntryInfo((MetaName)25671749, 159), - new PsoEnumEntryInfo(MetaName.TEXTFILE_METAFILE, 160), - new PsoEnumEntryInfo(MetaName.NM_TUNING_FILE, 161), - new PsoEnumEntryInfo(MetaName.MOVE_NETWORK_DEFS, 162), - new PsoEnumEntryInfo(MetaName.WEAPONINFO_FILE_PATCH, 163), - new PsoEnumEntryInfo(MetaName.DLC_SCRIPT_METAFILE, 164), - new PsoEnumEntryInfo(MetaName.VEHICLE_LAYOUTS_FILE, 165), - new PsoEnumEntryInfo(MetaName.DLC_WEAPON_PICKUPS, 166), - new PsoEnumEntryInfo(MetaName.EXTRA_TITLE_UPDATE_DATA, 167), - new PsoEnumEntryInfo(MetaName.SCALEFORM_DLC_FILE, 168), - new PsoEnumEntryInfo(MetaName.OVERLAY_INFO_FILE, 169), - new PsoEnumEntryInfo(MetaName.ALTERNATE_VARIATIONS_FILE, 170), - new PsoEnumEntryInfo(MetaName.HORSE_REINS_FILE, 171), - new PsoEnumEntryInfo(MetaName.FIREFX_FILE, 172), - new PsoEnumEntryInfo(MetaName.INTERIOR_PROXY_ORDER_FILE, 173), - new PsoEnumEntryInfo(MetaName.DLC_ITYP_REQUEST, 174), - new PsoEnumEntryInfo(MetaName.EXTRA_FOLDER_MOUNT_DATA, 175), - new PsoEnumEntryInfo(MetaName.AMB_PROCEDURAL_BLOOD_FILE, 176), - new PsoEnumEntryInfo(MetaName.SCRIPT_BRAIN_FILE, 177), - new PsoEnumEntryInfo(MetaName.SCALEFORM_VALID_METHODS_FILE, 178), - new PsoEnumEntryInfo(MetaName.DLC_POP_GROUPS, 179), - new PsoEnumEntryInfo((MetaName)2145817864, 180), - new PsoEnumEntryInfo(MetaName.SCENARIO_INFO_FILE, 181), - new PsoEnumEntryInfo(MetaName.CONDITIONAL_ANIMS_FILE, 182), - new PsoEnumEntryInfo(MetaName.STATS_METADATA_PSO_FILE, 183), - new PsoEnumEntryInfo(MetaName.VFXFOGVOLUMEINFO_FILE, 184), - new PsoEnumEntryInfo(MetaName.RPF_FILE_PRE_INSTALL, 185), - new PsoEnumEntryInfo((MetaName)341493400, 186), - new PsoEnumEntryInfo(MetaName.LEVEL_STREAMING_FILE, 187), - new PsoEnumEntryInfo(MetaName.SCENARIO_POINTS_OVERRIDE_FILE, 188), - new PsoEnumEntryInfo((MetaName)2800880346, 189), - new PsoEnumEntryInfo(MetaName.DRIVER_RULES_STD_FILE, 190), - new PsoEnumEntryInfo(MetaName.PED_FIRST_PERSON_ASSET_DATA, 191), - new PsoEnumEntryInfo(MetaName.GTXD_PARENTING_DATA, 192), - new PsoEnumEntryInfo(MetaName.COMBAT_BEHAVIOUR_OVERRIDE_FILE, 193), - new PsoEnumEntryInfo(MetaName.EVENTS_OVERRIDE_FILE, 194), - new PsoEnumEntryInfo(MetaName.PED_DAMAGE_OVERRIDE_FILE, 195), - new PsoEnumEntryInfo(MetaName.PED_DAMAGE_APPEND_FILE, 196), - new PsoEnumEntryInfo(MetaName.BACKGROUND_SCRIPT_FILE, 197), - new PsoEnumEntryInfo(MetaName.PS3_SCRIPT_RPF, 198), - new PsoEnumEntryInfo(MetaName.X360_SCRIPT_RPF, 199), - new PsoEnumEntryInfo(MetaName.PED_FIRST_PERSON_ALTERNATE_DATA, 200) - ); - case MetaName.DataFileContents: - return new PsoEnumInfo(MetaName.DataFileContents, 1, - new PsoEnumEntryInfo(MetaName.CONTENTS_DEFAULT, 0), - new PsoEnumEntryInfo(MetaName.CONTENTS_PROPS, 1), - new PsoEnumEntryInfo(MetaName.CONTENTS_MAP, 2), - new PsoEnumEntryInfo(MetaName.CONTENTS_LODS, 3), - new PsoEnumEntryInfo(MetaName.CONTENTS_PEDS, 4), - new PsoEnumEntryInfo(MetaName.CONTENTS_VEHICLES, 5), - new PsoEnumEntryInfo(MetaName.CONTENTS_ANIMATION, 6), - new PsoEnumEntryInfo(MetaName.CONTENTS_CUTSCENE, 7), - new PsoEnumEntryInfo(MetaName.CONTENTS_DLC_MAP_DATA, 8), - new PsoEnumEntryInfo(MetaName.CONTENTS_DEBUG_ONLY, 9), - new PsoEnumEntryInfo(MetaName.CONTENTS_MAX, 10) - ); - case MetaName.InstallPartition: - return new PsoEnumInfo(MetaName.InstallPartition, 1, - new PsoEnumEntryInfo(MetaName.PARTITION_NONE, -1), - new PsoEnumEntryInfo(MetaName.PARTITION_0, 0), - new PsoEnumEntryInfo(MetaName.PARTITION_1, 1), - new PsoEnumEntryInfo(MetaName.PARTITION_2, 2), - new PsoEnumEntryInfo(MetaName.PARTITION_MAX, 3) - ); - case MetaName.ePedRadioGenre: - return new PsoEnumInfo(MetaName.ePedRadioGenre, 1, - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_OFF, 0), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_MODERN_ROCK, 1), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_CLASSIC_ROCK, 2), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_POP, 3), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_MODERN_HIPHOP, 4), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_CLASSIC_HIPHOP, 5), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_PUNK, 6), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_LEFT_WING_TALK, 7), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_RIGHT_WING_TALK, 8), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_COUNTRY, 9), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_DANCE, 10), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_MEXICAN, 11), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_REGGAE, 12), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_JAZZ, 13), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_MOTOWN, 14), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_SURF, 15), - new PsoEnumEntryInfo(MetaName.RADIO_GENRE_UNSPECIFIED, 16) - ); - case MetaName.eSexinessFlags: - return new PsoEnumInfo(MetaName.eSexinessFlags, 1, - new PsoEnumEntryInfo(MetaName.SF_JEER_AT_HOT_PED, 0), - new PsoEnumEntryInfo((MetaName)296569367, 1), - new PsoEnumEntryInfo(MetaName.SF_HOT_PERSON, 2) - ); - case MetaName.eExternallyDrivenDOFs: - return new PsoEnumInfo(MetaName.eExternallyDrivenDOFs, 1, - new PsoEnumEntryInfo(MetaName.EMPTY, 0), - new PsoEnumEntryInfo(MetaName.HIGH_HEELS, 1), - new PsoEnumEntryInfo(MetaName.COLLAR, 2) - ); - case MetaName.SpecialAbilityType: //CPedModelInfo__InitData AbilityType - return new PsoEnumInfo(MetaName.SpecialAbilityType, 1, - new PsoEnumEntryInfo(MetaName.SAT_NONE, -1), - new PsoEnumEntryInfo(MetaName.SAT_CAR_SLOWDOWN, 0), - new PsoEnumEntryInfo(MetaName.SAT_RAGE, 1), - new PsoEnumEntryInfo(MetaName.SAT_BULLET_TIME, 2), - new PsoEnumEntryInfo(MetaName.SAT_SNAPSHOT, 3), - new PsoEnumEntryInfo(MetaName.SAT_INSULT, 4) - ); - case MetaName.ThermalBehaviour: - return new PsoEnumInfo(MetaName.ThermalBehaviour, 1, - new PsoEnumEntryInfo(MetaName.TB_DEAD, 0), - new PsoEnumEntryInfo(MetaName.TB_COLD, 1), - new PsoEnumEntryInfo(MetaName.TB_WARM, 2), - new PsoEnumEntryInfo(MetaName.TB_HOT, 3) - ); - case MetaName.eSuperlodType: - return new PsoEnumInfo(MetaName.eSuperlodType, 1, - new PsoEnumEntryInfo(MetaName.SLOD_HUMAN, 0), - new PsoEnumEntryInfo(MetaName.SLOD_SMALL_QUADPED, 1), - new PsoEnumEntryInfo(MetaName.SLOD_LARGE_QUADPED, 2), - new PsoEnumEntryInfo(MetaName.SLOD_NULL, 3), - new PsoEnumEntryInfo(MetaName.SLOD_KEEP_LOWEST, 4) - ); - case MetaName.eScenarioPopStreamingSlot: //CPedModelInfo__InitData ScenarioPopStreamingSlot - return new PsoEnumInfo(MetaName.eScenarioPopStreamingSlot, 1, - new PsoEnumEntryInfo(MetaName.SCENARIO_POP_STREAMING_NORMAL, 0), - new PsoEnumEntryInfo(MetaName.SCENARIO_POP_STREAMING_SMALL, 1) - ); - case MetaName.DefaultSpawnPreference: //CPedModelInfo__InitData DefaultSpawningPreference - return new PsoEnumInfo(MetaName.DefaultSpawnPreference, 1, - new PsoEnumEntryInfo(MetaName.DSP_AERIAL, 0), - new PsoEnumEntryInfo(MetaName.DSP_AQUATIC, 1), - new PsoEnumEntryInfo(MetaName.DSP_GROUND_WILDLIFE, 2), - new PsoEnumEntryInfo(MetaName.DSP_NORMAL, 3) - ); - case MetaName.eFadeCurveType: - return new PsoEnumInfo(MetaName.eFadeCurveType, 1, - new PsoEnumEntryInfo(MetaName.FCT_NONE, 0), - new PsoEnumEntryInfo(MetaName.FCT_LINEAR, 1), - new PsoEnumEntryInfo(MetaName.FCT_HALF_SIGMOID, 2), - new PsoEnumEntryInfo(MetaName.FCT_SIGMOID, 3) - ); - case MetaName.eAnimPlayerFlag: //animation clip flags - return new PsoEnumInfo(MetaName.eAnimPlayerFlag, 1, - new PsoEnumEntryInfo(MetaName.APF_USE_SECONDARY_SLOT, 0), - new PsoEnumEntryInfo((MetaName)892548521, 1), - new PsoEnumEntryInfo(MetaName.APF_UNUSED_3, 2), - new PsoEnumEntryInfo(MetaName.APF_UNUSED_4, 3), - new PsoEnumEntryInfo(MetaName.APF_ISPLAYING, 4), - new PsoEnumEntryInfo(MetaName.APF_ISLOOPED, 5), - new PsoEnumEntryInfo((MetaName)2715402776, 6), - new PsoEnumEntryInfo((MetaName)2559750026, 7), - new PsoEnumEntryInfo((MetaName)334669388, 8), - new PsoEnumEntryInfo(MetaName.APF_SCRIPT, 9), - new PsoEnumEntryInfo(MetaName.APF_UNUSED_6, 10), - new PsoEnumEntryInfo(MetaName.APF_UNUSED_7, 11), - new PsoEnumEntryInfo(MetaName.APF_UNUSED_8, 12), - new PsoEnumEntryInfo((MetaName)3730225937, 13), - new PsoEnumEntryInfo(MetaName.APF_ISBLENDAUTOREMOVE, 14), - new PsoEnumEntryInfo(MetaName.APF_ISFINISHAUTOREMOVE, 15), - new PsoEnumEntryInfo((MetaName)1984129772, 16), - new PsoEnumEntryInfo(MetaName.APF_ADDITIVE, 17), - new PsoEnumEntryInfo(MetaName.APF_FACIAL, 18), - new PsoEnumEntryInfo((MetaName)1964664646, 19), - new PsoEnumEntryInfo((MetaName)46138343, 20), - new PsoEnumEntryInfo(MetaName.APF_UPPERBODYONLY, 21), - new PsoEnumEntryInfo((MetaName)28056044, 22), - new PsoEnumEntryInfo((MetaName)2237335835, 23), - new PsoEnumEntryInfo((MetaName)1604795828, 24), - new PsoEnumEntryInfo((MetaName)1772376494, 25), - new PsoEnumEntryInfo(MetaName.APF_BLOCK_IK, 26), - new PsoEnumEntryInfo((MetaName)2310486390, 27), - new PsoEnumEntryInfo(MetaName.APF_BLOCK_HEAD_IK, 28), - new PsoEnumEntryInfo((MetaName)98009864, 29), - new PsoEnumEntryInfo(MetaName.APF_UNUSED_9, 30), - new PsoEnumEntryInfo((MetaName)3765996064, 31) - ); - case MetaName.eAnimPriority: //animation clip priority - return new PsoEnumInfo(MetaName.eAnimPriority, 1, - new PsoEnumEntryInfo(MetaName.AP_LOW, 0), - new PsoEnumEntryInfo(MetaName.AP_MEDIUM, 1), - new PsoEnumEntryInfo(MetaName.AP_HIGH, 2), - new PsoEnumEntryInfo(MetaName.AP_FACE_LOW, 3), - new PsoEnumEntryInfo(MetaName.AP_FACE_MEDIUM, 4), - new PsoEnumEntryInfo(MetaName.AP_FACE_HIGH, 5) - ); - case MetaName.eStreamingPolicy: //anim clip dictionary streaming policy - return new PsoEnumInfo(MetaName.eStreamingPolicy, 1, - new PsoEnumEntryInfo(MetaName.SP_STREAMING, 0), - new PsoEnumEntryInfo(MetaName.SP_SINGLEPLAYER_RESIDENT, 1), - new PsoEnumEntryInfo(MetaName.SP_MULTIPLAYER_RESIDENT, 2) - ); - case MetaName.eStreamingPriority: //anim clip dictionary streaming priority - return new PsoEnumInfo(MetaName.eStreamingPriority, 1, - new PsoEnumEntryInfo(MetaName.SP_Variation, 0), - new PsoEnumEntryInfo(MetaName.SP_Low, 1), - new PsoEnumEntryInfo(MetaName.SP_Medium, 2), - new PsoEnumEntryInfo(MetaName.SP_High, 3) - ); - case (MetaName)2476021071: - return new PsoEnumInfo((MetaName)2476021071, 1, - new PsoEnumEntryInfo(MetaName.POSTFX_IN_HOLD_OUT, 0), - new PsoEnumEntryInfo(MetaName.POSTFX_EASE_IN_HOLD_EASE_OUT, 1), - new PsoEnumEntryInfo(MetaName.POSTFX_EASE_IN, 2), - new PsoEnumEntryInfo(MetaName.POSTFX_EASE_OUT, 3) - ); - case (MetaName)3696221852: - return new PsoEnumInfo((MetaName)3696221852, 1, - new PsoEnumEntryInfo(MetaName.POSTFX_LOOP_ALL, 0), - new PsoEnumEntryInfo(MetaName.POSTFX_LOOP_HOLD_ONLY, 1), - new PsoEnumEntryInfo(MetaName.POSTFX_LOOP_NONE, 2) - ); - case (MetaName)2168155209: - return new PsoEnumInfo((MetaName)2168155209, 1, - new PsoEnumEntryInfo((MetaName)133697287, -1), - new PsoEnumEntryInfo((MetaName)3954742285, 0), - new PsoEnumEntryInfo((MetaName)201802975, 1), - new PsoEnumEntryInfo((MetaName)1916954442, 2), - new PsoEnumEntryInfo((MetaName)507840474, 3), - new PsoEnumEntryInfo((MetaName)1919284445, 4), - new PsoEnumEntryInfo((MetaName)4132752489, 5), - new PsoEnumEntryInfo((MetaName)499113587, 6) - ); - case (MetaName)3261591327: - return new PsoEnumInfo((MetaName)3261591327, 1, - new PsoEnumEntryInfo((MetaName)2736859683, 0), - new PsoEnumEntryInfo((MetaName)856837195, 1), - new PsoEnumEntryInfo((MetaName)1505659915, 2), - new PsoEnumEntryInfo((MetaName)2834501937, 3), - new PsoEnumEntryInfo((MetaName)373586892, 4) - ); - case (MetaName)516897642: - return new PsoEnumInfo((MetaName)516897642, 1, - new PsoEnumEntryInfo((MetaName)165337364, 0), - new PsoEnumEntryInfo((MetaName)385965901, 1), - new PsoEnumEntryInfo((MetaName)3779370608, 2) - ); - case (MetaName)2665868448: - return new PsoEnumInfo((MetaName)2665868448, 1, - new PsoEnumEntryInfo((MetaName)2470279016, 0), - new PsoEnumEntryInfo((MetaName)2411291289, 1), - new PsoEnumEntryInfo((MetaName)2103152910, 2), - new PsoEnumEntryInfo((MetaName)3535879124, 3), - new PsoEnumEntryInfo((MetaName)3456440271, 4) - ); - case (MetaName)2628996780: - return new PsoEnumInfo((MetaName)2628996780, 1, - new PsoEnumEntryInfo((MetaName)3708927680, 0), - new PsoEnumEntryInfo((MetaName)2136499167, 1), - new PsoEnumEntryInfo((MetaName)3568072118, 2) - ); - case MetaName.eAnimBoneTag: - return new PsoEnumInfo(MetaName.eAnimBoneTag, 1, - new PsoEnumEntryInfo(MetaName.BONETAG_INVALID, -1), - new PsoEnumEntryInfo(MetaName.BONETAG_ROOT, 0), - new PsoEnumEntryInfo((MetaName)1724691876, 17916), - new PsoEnumEntryInfo(MetaName.BONETAG_PELVIS, 11816), - new PsoEnumEntryInfo(MetaName.BONETAG_PELVIS1, 53251), - new PsoEnumEntryInfo(MetaName.BONETAG_SPINE_ROOT, 57597), - new PsoEnumEntryInfo(MetaName.BONETAG_SPINE0, 23553), - new PsoEnumEntryInfo(MetaName.BONETAG_SPINE1, 24816), - new PsoEnumEntryInfo(MetaName.BONETAG_SPINE2, 24817), - new PsoEnumEntryInfo(MetaName.BONETAG_SPINE3, 24818), - new PsoEnumEntryInfo(MetaName.BONETAG_NECK, 39317), - new PsoEnumEntryInfo(MetaName.BONETAG_NECK2, 24532), - new PsoEnumEntryInfo(MetaName.BONETAG_HEAD, 31086), - new PsoEnumEntryInfo(MetaName.BONETAG_R_CLAVICLE, 10706), - new PsoEnumEntryInfo(MetaName.BONETAG_R_UPPERARM, 40269), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FOREARM, 28252), - new PsoEnumEntryInfo(MetaName.BONETAG_R_HAND, 57005), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER0, 58866), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER01, 64016), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER02, 64017), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER1, 58867), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER11, 64096), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER12, 64097), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER2, 58868), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER21, 64112), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER22, 64113), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER3, 58869), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER31, 64064), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER32, 64065), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER4, 58870), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER41, 64080), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER42, 64081), - new PsoEnumEntryInfo(MetaName.BONETAG_L_CLAVICLE, 64729), - new PsoEnumEntryInfo(MetaName.BONETAG_L_UPPERARM, 45509), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FOREARM, 61163), - new PsoEnumEntryInfo(MetaName.BONETAG_L_HAND, 18905), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER0, 26610), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER01, 4089), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER02, 4090), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER1, 26611), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER11, 4169), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER12, 4170), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER2, 26612), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER21, 4185), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER22, 4186), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER3, 26613), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER31, 4137), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER32, 4138), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER4, 26614), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER41, 4153), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER42, 4154), - new PsoEnumEntryInfo(MetaName.BONETAG_L_THIGH, 58271), - new PsoEnumEntryInfo(MetaName.BONETAG_L_CALF, 63931), - new PsoEnumEntryInfo(MetaName.BONETAG_L_FOOT, 14201), - new PsoEnumEntryInfo(MetaName.BONETAG_L_TOE, 2108), - new PsoEnumEntryInfo(MetaName.BONETAG_L_TOE1, 7531), - new PsoEnumEntryInfo(MetaName.BONETAG_R_THIGH, 51826), - new PsoEnumEntryInfo(MetaName.BONETAG_R_CALF, 36864), - new PsoEnumEntryInfo(MetaName.BONETAG_R_FOOT, 52301), - new PsoEnumEntryInfo(MetaName.BONETAG_R_TOE, 20781), - new PsoEnumEntryInfo(MetaName.BONETAG_R_TOE1, 45631), - new PsoEnumEntryInfo((MetaName)1914315501, 35731), - new PsoEnumEntryInfo((MetaName)1648548119, 5232), - new PsoEnumEntryInfo((MetaName)533252846, 37119), - new PsoEnumEntryInfo((MetaName)2013152691, 61007), - new PsoEnumEntryInfo((MetaName)1274264606, 43810), - new PsoEnumEntryInfo((MetaName)2720329662, 23639), - new PsoEnumEntryInfo((MetaName)2841566254, 6442), - new PsoEnumEntryInfo(MetaName.BONETAG_L_PH_HAND, 60309), - new PsoEnumEntryInfo(MetaName.BONETAG_R_PH_HAND, 28422), - new PsoEnumEntryInfo((MetaName)3721004313, 41922), - new PsoEnumEntryInfo((MetaName)1646663439, 18212), - new PsoEnumEntryInfo((MetaName)2650851428, 33399), - new PsoEnumEntryInfo((MetaName)4289658079, 38180), - new PsoEnumEntryInfo((MetaName)2379061275, 39126), - new PsoEnumEntryInfo((MetaName)176026430, 39638), - new PsoEnumEntryInfo((MetaName)3870648046, 36029), - new PsoEnumEntryInfo((MetaName)3398180204, 6286), - new PsoEnumEntryInfo(MetaName.BONETAG_TAIL0, 838), - new PsoEnumEntryInfo(MetaName.BONETAG_TAIL1, 839), - new PsoEnumEntryInfo(MetaName.BONETAG_TAIL2, 840), - new PsoEnumEntryInfo(MetaName.BONETAG_TAIL3, 841), - new PsoEnumEntryInfo(MetaName.BONETAG_TAIL4, 842), - new PsoEnumEntryInfo(MetaName.BONETAG_TAIL5, 843), - new PsoEnumEntryInfo((MetaName)1109140959, 30992), - new PsoEnumEntryInfo((MetaName)803570034, 30993), - new PsoEnumEntryInfo((MetaName)631663860, 30994), - new PsoEnumEntryInfo((MetaName)322488345, 30995), - new PsoEnumEntryInfo((MetaName)5907036, 30996), - new PsoEnumEntryInfo((MetaName)4136373952, 30997), - new PsoEnumEntryInfo((MetaName)2411152202, 6986), - new PsoEnumEntryInfo((MetaName)2717247431, 6987), - new PsoEnumEntryInfo((MetaName)1883898992, 6988), - new PsoEnumEntryInfo((MetaName)601675397, 16351), - new PsoEnumEntryInfo((MetaName)62423933, 1805), - new PsoEnumEntryInfo((MetaName)2641889475, 39905), - new PsoEnumEntryInfo((MetaName)1949780854, 5956), - new PsoEnumEntryInfo((MetaName)3296017019, 6468), - new PsoEnumEntryInfo((MetaName)1556908436, 25260), - new PsoEnumEntryInfo((MetaName)3030868822, 27474), - new PsoEnumEntryInfo((MetaName)3452992357, 56604), - new PsoEnumEntryInfo((MetaName)3473614855, 12844), - new PsoEnumEntryInfo((MetaName)633057706, 57717), - new PsoEnumEntryInfo((MetaName)3570968304, 24806), - new PsoEnumEntryInfo((MetaName)2034893792, 65245), - new PsoEnumEntryInfo((MetaName)974447640, 35502), - new PsoEnumEntryInfo((MetaName)2263842006, 15570), - new PsoEnumEntryInfo((MetaName)1882359409, 28462), - new PsoEnumEntryInfo((MetaName)2421563540, 13201), - new PsoEnumEntryInfo((MetaName)2644806883, 48472), - new PsoEnumEntryInfo((MetaName)4089752637, 5930), - new PsoEnumEntryInfo((MetaName)1473028002, 44297), - new PsoEnumEntryInfo((MetaName)1823061586, 47158), - new PsoEnumEntryInfo((MetaName)3875905388, 19729), - new PsoEnumEntryInfo((MetaName)2560977519, 43885), - new PsoEnumEntryInfo((MetaName)4050972607, 2359), - new PsoEnumEntryInfo((MetaName)1028261740, 2449), - new PsoEnumEntryInfo((MetaName)3159424443, 19336), - new PsoEnumEntryInfo((MetaName)1939403075, 64744), - new PsoEnumEntryInfo((MetaName)1097108699, 64745), - new PsoEnumEntryInfo((MetaName)428522884, 64746), - new PsoEnumEntryInfo((MetaName)3131540134, 56194), - new PsoEnumEntryInfo((MetaName)1217317825, 45733), - new PsoEnumEntryInfo((MetaName)4198936370, 45734), - new PsoEnumEntryInfo((MetaName)1977853546, 45735), - new PsoEnumEntryInfo((MetaName)2601253047, 48389), - new PsoEnumEntryInfo((MetaName)2181973692, 48390), - new PsoEnumEntryInfo((MetaName)3140860170, 48391), - new PsoEnumEntryInfo((MetaName)455142432, 30929), - new PsoEnumEntryInfo((MetaName)3803060301, 33869), - new PsoEnumEntryInfo((MetaName)746815866, 4126) - ); - case MetaName.eVfxGroup: - return new PsoEnumInfo(MetaName.eVfxGroup, 1, - new PsoEnumEntryInfo(MetaName.VFXGROUP_UNDEFINED, -1), - new PsoEnumEntryInfo(MetaName.VFXGROUP_VOID, 0), - new PsoEnumEntryInfo(MetaName.VFXGROUP_GENERIC, 1), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CONCRETE, 2), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CONCRETE_DUSTY, 3), - new PsoEnumEntryInfo(MetaName.VFXGROUP_TARMAC, 4), - new PsoEnumEntryInfo(MetaName.VFXGROUP_TARMAC_BRITTLE, 5), - new PsoEnumEntryInfo(MetaName.VFXGROUP_STONE, 6), - new PsoEnumEntryInfo(MetaName.VFXGROUP_BRICK, 7), - new PsoEnumEntryInfo(MetaName.VFXGROUP_MARBLE, 8), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PAVING, 9), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SANDSTONE, 10), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SANDSTONE_BRITTLE, 11), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_LOOSE, 12), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_COMPACT, 13), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_WET, 14), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_UNDERWATER, 15), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_DEEP, 16), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_WET_DEEP, 17), - new PsoEnumEntryInfo(MetaName.VFXGROUP_ICE, 18), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SNOW_LOOSE, 19), - new PsoEnumEntryInfo(MetaName.VFXGROUP_SNOW_COMPACT, 20), - new PsoEnumEntryInfo(MetaName.VFXGROUP_GRAVEL, 21), - new PsoEnumEntryInfo(MetaName.VFXGROUP_GRAVEL_DEEP, 22), - new PsoEnumEntryInfo(MetaName.VFXGROUP_DIRT_DRY, 23), - new PsoEnumEntryInfo(MetaName.VFXGROUP_MUD_SOFT, 24), - new PsoEnumEntryInfo(MetaName.VFXGROUP_MUD_DEEP, 25), - new PsoEnumEntryInfo(MetaName.VFXGROUP_MUD_UNDERWATER, 26), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CLAY, 27), - new PsoEnumEntryInfo(MetaName.VFXGROUP_GRASS, 28), - new PsoEnumEntryInfo(MetaName.VFXGROUP_GRASS_SHORT, 29), - new PsoEnumEntryInfo(MetaName.VFXGROUP_HAY, 30), - new PsoEnumEntryInfo(MetaName.VFXGROUP_BUSHES, 31), - new PsoEnumEntryInfo(MetaName.VFXGROUP_TREE_BARK, 32), - new PsoEnumEntryInfo(MetaName.VFXGROUP_LEAVES, 33), - new PsoEnumEntryInfo(MetaName.VFXGROUP_METAL, 34), - new PsoEnumEntryInfo(MetaName.VFXGROUP_WOOD, 35), - new PsoEnumEntryInfo(MetaName.VFXGROUP_WOOD_DUSTY, 36), - new PsoEnumEntryInfo(MetaName.VFXGROUP_WOOD_SPLINTER, 37), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CERAMIC, 38), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CARPET_FABRIC, 39), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CARPET_FABRIC_DUSTY, 40), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PLASTIC, 41), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PLASTIC_HOLLOW, 42), - new PsoEnumEntryInfo(MetaName.VFXGROUP_RUBBER, 43), - new PsoEnumEntryInfo(MetaName.VFXGROUP_LINOLEUM, 44), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PLASTER_BRITTLE, 45), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CARDBOARD, 46), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PAPER, 47), - new PsoEnumEntryInfo(MetaName.VFXGROUP_FOAM, 48), - new PsoEnumEntryInfo(MetaName.VFXGROUP_FEATHERS, 49), - new PsoEnumEntryInfo(MetaName.VFXGROUP_TVSCREEN, 50), - new PsoEnumEntryInfo(MetaName.VFXGROUP_GLASS, 51), - new PsoEnumEntryInfo(MetaName.VFXGROUP_GLASS_BULLETPROOF, 52), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CAR_METAL, 53), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CAR_PLASTIC, 54), - new PsoEnumEntryInfo(MetaName.VFXGROUP_CAR_GLASS, 55), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PUDDLE, 56), - new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_WATER, 57), - new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_BLOOD, 58), - new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_OIL, 59), - new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_PETROL, 60), - new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_MUD, 61), - new PsoEnumEntryInfo(MetaName.VFXGROUP_FRESH_MEAT, 62), - new PsoEnumEntryInfo(MetaName.VFXGROUP_DRIED_MEAT, 63), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_HEAD, 64), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_TORSO, 65), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_LIMB, 66), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_FOOT, 67), - new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_CAPSULE, 68) - ); - case (MetaName)726948528: - return new PsoEnumInfo((MetaName)726948528, 1, - new PsoEnumEntryInfo((MetaName)2375349691, 0), - new PsoEnumEntryInfo((MetaName)978806254, 1), - new PsoEnumEntryInfo((MetaName)345174417, 2), - new PsoEnumEntryInfo((MetaName)2719994633, 3), - new PsoEnumEntryInfo((MetaName)1055203807, 4) - ); - case (MetaName)1599521754: - return new PsoEnumInfo((MetaName)1599521754, 1, - new PsoEnumEntryInfo((MetaName)1546538473, 0) - ); - case (MetaName)956281369: - return new PsoEnumInfo((MetaName)956281369, 1, - new PsoEnumEntryInfo(MetaName.PROCOBJ_ALIGN_OBJ, 0), - new PsoEnumEntryInfo(MetaName.PROCOBJ_USE_GRID, 1), - new PsoEnumEntryInfo(MetaName.PROCOBJ_USE_SEED, 2), - new PsoEnumEntryInfo(MetaName.PROCOBJ_IS_FLOATING, 3), - new PsoEnumEntryInfo(MetaName.PROCOBJ_CAST_SHADOW, 4), - new PsoEnumEntryInfo(MetaName.PROCOBJ_NETWORK_GAME, 5) - ); - case (MetaName)1247137385: - return new PsoEnumInfo((MetaName)1247137385, 1, - new PsoEnumEntryInfo(MetaName.PROCPLANT_LOD0, 0), - new PsoEnumEntryInfo(MetaName.PROCPLANT_LOD1, 1), - new PsoEnumEntryInfo(MetaName.PROCPLANT_LOD2, 2), - new PsoEnumEntryInfo(MetaName.PROCPLANT_FURGRASS, 3), - new PsoEnumEntryInfo(MetaName.PROCPLANT_CAMERADONOTCULL, 4), - new PsoEnumEntryInfo(MetaName.PROCPLANT_UNDERWATER, 5), - new PsoEnumEntryInfo(MetaName.PROCPLANT_GROUNDSCALE1VERT, 6), - new PsoEnumEntryInfo(MetaName.PROCPLANT_NOGROUNDSKEW_LOD0, 7), - new PsoEnumEntryInfo(MetaName.PROCPLANT_NOGROUNDSKEW_LOD1, 8), - new PsoEnumEntryInfo(MetaName.PROCPLANT_NOGROUNDSKEW_LOD2, 9), - new PsoEnumEntryInfo(MetaName.PROCPLANT_NOSHADOW, 10) - ); - case (MetaName)2782414211: - return new PsoEnumInfo((MetaName)2782414211, 1, - new PsoEnumEntryInfo((MetaName)3117886768, 0), - new PsoEnumEntryInfo((MetaName)361913441, 1), - new PsoEnumEntryInfo((MetaName)1673907105, 2) - ); - case (MetaName)3404480226: - return new PsoEnumInfo((MetaName)3404480226, 1, - new PsoEnumEntryInfo((MetaName)643717225, 0), - new PsoEnumEntryInfo((MetaName)1755526414, 1), - new PsoEnumEntryInfo(MetaName.CVA_WHEEL_REAR_LEFT, 2), - new PsoEnumEntryInfo((MetaName)1950121897, 3), - new PsoEnumEntryInfo((MetaName)2065407336, 4), - new PsoEnumEntryInfo((MetaName)1249738073, 5), - new PsoEnumEntryInfo((MetaName)3037431481, 6), - new PsoEnumEntryInfo((MetaName)2009750623, 7), - new PsoEnumEntryInfo((MetaName)3659952659, 8), - new PsoEnumEntryInfo((MetaName)4024787971, 9), - new PsoEnumEntryInfo((MetaName)4081041159, 10), - new PsoEnumEntryInfo((MetaName)3123586287, 11), - new PsoEnumEntryInfo((MetaName)1678048274, 12), - new PsoEnumEntryInfo((MetaName)1275607205, 13), - new PsoEnumEntryInfo(MetaName.DEVINS_SNOWLIGHT, 14), - new PsoEnumEntryInfo((MetaName)2276229539, 15), - new PsoEnumEntryInfo((MetaName)493733281, 16), - new PsoEnumEntryInfo((MetaName)1037540057, 17), - new PsoEnumEntryInfo((MetaName)1162901510, 18), - new PsoEnumEntryInfo((MetaName)739467989, 19), - new PsoEnumEntryInfo((MetaName)677568593, 20), - new PsoEnumEntryInfo((MetaName)1739703625, 21), - new PsoEnumEntryInfo((MetaName)2932239149, 22), - new PsoEnumEntryInfo((MetaName)1612186711, 23), - new PsoEnumEntryInfo((MetaName)629489585, 24), - new PsoEnumEntryInfo((MetaName)3531030925, 25), - new PsoEnumEntryInfo((MetaName)1769219469, 26), - new PsoEnumEntryInfo((MetaName)1816463715, 27), - new PsoEnumEntryInfo((MetaName)3449512558, 28) - ); - case (MetaName)2136742399: - return new PsoEnumInfo((MetaName)2136742399, 1, - new PsoEnumEntryInfo(MetaName.LOOK_FORWARD_RELATIVE_TO_ATTACH, 0), - new PsoEnumEntryInfo((MetaName)4067031256, 1), - new PsoEnumEntryInfo((MetaName)3668340720, 2) - ); - case (MetaName)513957198: - return new PsoEnumInfo((MetaName)513957198, 1, - new PsoEnumEntryInfo(MetaName.ON_FOOT, 0), - new PsoEnumEntryInfo(MetaName.IN_VEHICLE, 1), - new PsoEnumEntryInfo(MetaName.ON_BIKE, 2), - new PsoEnumEntryInfo(MetaName.IN_BOAT, 3), - new PsoEnumEntryInfo(MetaName.IN_AIRCRAFT, 4), - new PsoEnumEntryInfo(MetaName.IN_SUBMARINE, 5), - new PsoEnumEntryInfo(MetaName.IN_HELI, 6), - new PsoEnumEntryInfo(MetaName.IN_TURRET, 7) - ); - case (MetaName)2703064232: - return new PsoEnumInfo((MetaName)2703064232, 1, - new PsoEnumEntryInfo(MetaName.THIRD_PERSON_NEAR, 0), - new PsoEnumEntryInfo(MetaName.THIRD_PERSON_MEDIUM, 1), - new PsoEnumEntryInfo(MetaName.THIRD_PERSON_FAR, 2), - new PsoEnumEntryInfo(MetaName.CINEMATIC, 3), - new PsoEnumEntryInfo(MetaName.FIRST_PERSON, 4) - ); - case MetaName.eCurveType: - return new PsoEnumInfo(MetaName.eCurveType, 1, - new PsoEnumEntryInfo((MetaName)3099024980, 0), - new PsoEnumEntryInfo((MetaName)3810146036, 1), - new PsoEnumEntryInfo((MetaName)1812191173, 2), - new PsoEnumEntryInfo((MetaName)2081939217, 3), - new PsoEnumEntryInfo((MetaName)2879490434, 4), - new PsoEnumEntryInfo((MetaName)3899422166, 5), - new PsoEnumEntryInfo((MetaName)4202435238, 6), - new PsoEnumEntryInfo((MetaName)1924959165, 7), - new PsoEnumEntryInfo((MetaName)2394366735, 8), - new PsoEnumEntryInfo((MetaName)2691765069, 9), - new PsoEnumEntryInfo((MetaName)3782218410, 10), - new PsoEnumEntryInfo((MetaName)1054471073, 11), - new PsoEnumEntryInfo((MetaName)3232508014, 12), - new PsoEnumEntryInfo((MetaName)3268408636, 13), - new PsoEnumEntryInfo((MetaName)156483360, 14), - new PsoEnumEntryInfo((MetaName)610568483, 15), - new PsoEnumEntryInfo((MetaName)1031574247, 16), - new PsoEnumEntryInfo((MetaName)1817346630, 17), - new PsoEnumEntryInfo((MetaName)3038768594, 18), - new PsoEnumEntryInfo((MetaName)3433776656, 19), - new PsoEnumEntryInfo((MetaName)3224106151, 20), - new PsoEnumEntryInfo((MetaName)3781585750, 21), - new PsoEnumEntryInfo((MetaName)728471947, 22), - new PsoEnumEntryInfo((MetaName)2868857018, 23), - new PsoEnumEntryInfo((MetaName)3394937778, 24), - new PsoEnumEntryInfo((MetaName)1572642455, 25), - new PsoEnumEntryInfo((MetaName)4148234847, 26) - ); - case (MetaName)4206293824: - return new PsoEnumInfo((MetaName)4206293824, 1, - new PsoEnumEntryInfo((MetaName)3090781844, 0), - new PsoEnumEntryInfo((MetaName)714439506, 1), - new PsoEnumEntryInfo((MetaName)3541453901, 2), - new PsoEnumEntryInfo((MetaName)3420181340, 3), - new PsoEnumEntryInfo((MetaName)3785293538, 4), - new PsoEnumEntryInfo((MetaName)2987466695, 5), - new PsoEnumEntryInfo((MetaName)2089898957, 6), - new PsoEnumEntryInfo((MetaName)776877896, 7), - new PsoEnumEntryInfo((MetaName)1192126664, 8), - new PsoEnumEntryInfo((MetaName)1989206149, 9), - new PsoEnumEntryInfo((MetaName)2132778492, 10), - new PsoEnumEntryInfo((MetaName)1459749185, 11), - new PsoEnumEntryInfo((MetaName)769806680, 12), - new PsoEnumEntryInfo((MetaName)344800761, 13), - new PsoEnumEntryInfo((MetaName)2607259232, 14) - ); - case (MetaName)902027429: - return new PsoEnumInfo((MetaName)902027429, 1, - new PsoEnumEntryInfo((MetaName)1166188847, 0), - new PsoEnumEntryInfo((MetaName)899750670, 1) - ); - case (MetaName)3529626013: - return new PsoEnumInfo((MetaName)3529626013, 1, - new PsoEnumEntryInfo(MetaName.CAR, 0), - new PsoEnumEntryInfo(MetaName.PLANE, 1), - new PsoEnumEntryInfo(MetaName.TRAILER, 2), - new PsoEnumEntryInfo(MetaName.QUADBIKE, 3), - new PsoEnumEntryInfo(MetaName.HELI, 4), - new PsoEnumEntryInfo(MetaName.AUTOGYRO, 5), - new PsoEnumEntryInfo(MetaName.BIKE, 6), - new PsoEnumEntryInfo(MetaName.BICYCLE, 7), - new PsoEnumEntryInfo(MetaName.BOAT, 8), - new PsoEnumEntryInfo(MetaName.TRAIN, 9), - new PsoEnumEntryInfo(MetaName.SUBMARINE, 10), - new PsoEnumEntryInfo(MetaName.ALL, 11) - ); - case (MetaName)3889593720: - return new PsoEnumInfo((MetaName)3889593720, 1, - new PsoEnumEntryInfo((MetaName)2388118614, 0), - new PsoEnumEntryInfo((MetaName)1309321028, 1), - new PsoEnumEntryInfo((MetaName)2409045263, 2), - new PsoEnumEntryInfo((MetaName)1405307635, 3), - new PsoEnumEntryInfo((MetaName)3183067451, 4) - ); - case (MetaName)2675594832: - return new PsoEnumInfo((MetaName)2675594832, 1, - new PsoEnumEntryInfo(MetaName.AF_CAN_DIVE, 0), - new PsoEnumEntryInfo((MetaName)665056449, 1), - new PsoEnumEntryInfo((MetaName)1838090773, 2), - new PsoEnumEntryInfo((MetaName)1429252732, 3), - new PsoEnumEntryInfo((MetaName)335156894, 4), - new PsoEnumEntryInfo((MetaName)1995789406, 5), - new PsoEnumEntryInfo((MetaName)301163182, 6), - new PsoEnumEntryInfo((MetaName)2727636155, 7), - new PsoEnumEntryInfo((MetaName)2154274359, 8), - new PsoEnumEntryInfo((MetaName)3233981661, 9), - new PsoEnumEntryInfo((MetaName)3036600251, 10) - ); - case (MetaName)2920442291: - return new PsoEnumInfo((MetaName)2920442291, 1, - new PsoEnumEntryInfo(MetaName.PED_DRIVES_POOR_CAR, 0), - new PsoEnumEntryInfo(MetaName.PED_DRIVES_AVERAGE_CAR, 1), - new PsoEnumEntryInfo(MetaName.PED_DRIVES_RICH_CAR, 2), - new PsoEnumEntryInfo(MetaName.PED_DRIVES_BIG_CAR, 3), - new PsoEnumEntryInfo(MetaName.PED_DRIVES_MOTORCYCLE, 4), - new PsoEnumEntryInfo(MetaName.PED_DRIVES_BOAT, 5) - ); - case MetaName.Affluence: - return new PsoEnumInfo(MetaName.Affluence, 1, - new PsoEnumEntryInfo(MetaName.AFF_POOR, 0), - new PsoEnumEntryInfo(MetaName.AFF_AVERAGE, 1), - new PsoEnumEntryInfo(MetaName.AFF_RICH, 2) - ); - case MetaName.TechSavvy: - return new PsoEnumInfo(MetaName.TechSavvy, 1, - new PsoEnumEntryInfo(MetaName.TS_LOW, 0), - new PsoEnumEntryInfo(MetaName.TS_HIGH, 1) - ); - case (MetaName)3079935216: - return new PsoEnumInfo((MetaName)3079935216, 1, - new PsoEnumEntryInfo(MetaName.BF_INTERVENE_ON_MELEE_ACTION, 0), - new PsoEnumEntryInfo(MetaName.BF_DONT_RUN_ON_MELEE_ATTACK, 1), - new PsoEnumEntryInfo(MetaName.BF_WATCH_ON_CAR_STOLEN, 2), - new PsoEnumEntryInfo(MetaName.BF_INTIMIDATE_PLAYER, 3), - new PsoEnumEntryInfo(MetaName.BF_GET_PISSED_WHEN_HIT_BY_CAR, 4), - new PsoEnumEntryInfo((MetaName)2870992946, 5), - new PsoEnumEntryInfo(MetaName.BF_DONT_SAY_PANIC_ON_FLEE, 6), - new PsoEnumEntryInfo(MetaName.BF_REACT_ON_COMBAT, 7), - new PsoEnumEntryInfo(MetaName.BF_PLAY_CAR_HORN, 8), - new PsoEnumEntryInfo(MetaName.BF_ARGUMENTATIVE, 9), - new PsoEnumEntryInfo(MetaName.BF_CONFRONTATIONAL, 10), - new PsoEnumEntryInfo(MetaName.BF_LIMIT_COMBATANTS, 11), - new PsoEnumEntryInfo(MetaName.BF_PURSUE_WHEN_HIT_BY_CAR, 12), - new PsoEnumEntryInfo(MetaName.BF_COWARDLY_FOR_SHOCKING_EVENTS, 13), - new PsoEnumEntryInfo(MetaName.BF_BOOST_BRAVERY_IN_GROUP, 14), - new PsoEnumEntryInfo(MetaName.BF_CAN_ACCELERATE_IN_CAR, 15), - new PsoEnumEntryInfo(MetaName.BF_CAN_GET_OUT_WHEN_HIT_BY_CAR, 16), - new PsoEnumEntryInfo(MetaName.BF_AGGRESSIVE_AFTER_RUNNING_PED_OVER, 17), - new PsoEnumEntryInfo(MetaName.BF_CAN_FLEE_WHEN_HIT_BY_CAR, 18), - new PsoEnumEntryInfo(MetaName.BF_ALLOW_CONFRONT_FOR_TERRITORY_REACTIONS, 19), - new PsoEnumEntryInfo(MetaName.BF_DONT_FORCE_FLEE_COMBAT, 20) - ); - case (MetaName)1639628591: - return new PsoEnumInfo((MetaName)1639628591, 1, - new PsoEnumEntryInfo(MetaName.CF_JACKING, 0), - new PsoEnumEntryInfo(MetaName.CF_ALLOWED_COP_PURSUIT, 1) - ); - case (MetaName)1559228487: - return new PsoEnumInfo((MetaName)1559228487, 1, - new PsoEnumEntryInfo(MetaName.AF_Low, 0), - new PsoEnumEntryInfo(MetaName.AF_EnterLeft, 1), - new PsoEnumEntryInfo(MetaName.AF_FaceLeft, 2), - new PsoEnumEntryInfo(MetaName.AF_AtEdge, 3), - new PsoEnumEntryInfo(MetaName.AF_ToLow, 4), - new PsoEnumEntryInfo(MetaName.AF_AimDirect, 5), - new PsoEnumEntryInfo(MetaName.AF_Center, 6), - new PsoEnumEntryInfo(MetaName.AF_ToPeek, 7), - new PsoEnumEntryInfo(MetaName.AF_Scope, 8) - ); - case (MetaName)966624441: - return new PsoEnumInfo((MetaName)966624441, 1, - new PsoEnumEntryInfo(MetaName.OnlyUseForReactions, 0), - new PsoEnumEntryInfo(MetaName.CanUseForReactions, 1), - new PsoEnumEntryInfo(MetaName.Urgent, 2), - new PsoEnumEntryInfo(MetaName.OnlyUseForLawEnforcementPeds, 3), - new PsoEnumEntryInfo(MetaName.OnlyUseForGangPeds, 4) - ); - case MetaName.LookIkTurnRate: - return new PsoEnumInfo(MetaName.LookIkTurnRate, 1, - new PsoEnumEntryInfo(MetaName.LOOKIK_TURN_RATE_SLOW, 0), - new PsoEnumEntryInfo(MetaName.LOOKIK_TURN_RATE_NORMAL, 1), - new PsoEnumEntryInfo(MetaName.LOOKIK_TURN_RATE_FAST, 2) - ); - case MetaName.LookIkBlendRate: - return new PsoEnumInfo(MetaName.LookIkBlendRate, 1, - new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_SLOWEST, 0), - new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_SLOW, 1), - new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_NORMAL, 2), - new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_FAST, 3), - new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_FASTEST, 4), - new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_INSTANT, 5) - ); - case MetaName.LookIkRotationLimit: - return new PsoEnumInfo(MetaName.LookIkRotationLimit, 1, - new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_OFF, 0), - new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_NARROWEST, 1), - new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_NARROW, 2), - new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_WIDE, 3), - new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_WIDEST, 4) - ); - case (MetaName)4002001992: - return new PsoEnumInfo((MetaName)4002001992, 1, - new PsoEnumEntryInfo((MetaName)4238595643, 0) - ); - case MetaName.AmbientEventType: - return new PsoEnumInfo(MetaName.AmbientEventType, 1, - new PsoEnumEntryInfo((MetaName)1637555008, 0), - new PsoEnumEntryInfo(MetaName.AET_Interesting, 1), - new PsoEnumEntryInfo(MetaName.AET_Threatening, 2), - new PsoEnumEntryInfo(MetaName.AET_Threatened, 3), - new PsoEnumEntryInfo(MetaName.AET_In_Place, 4), - new PsoEnumEntryInfo(MetaName.AET_Directed_In_Place, 5), - new PsoEnumEntryInfo(MetaName.AET_Flinch, 6) - ); - case (MetaName)1049598006: - return new PsoEnumInfo((MetaName)1049598006, 1, - new PsoEnumEntryInfo((MetaName)1600411487, 0), - new PsoEnumEntryInfo((MetaName)3999177563, 1), - new PsoEnumEntryInfo((MetaName)3250863043, 2) - ); - case MetaName.ePedVarComp: - return new PsoEnumInfo(MetaName.ePedVarComp, 1, - new PsoEnumEntryInfo(MetaName.PV_COMP_INVALID, -1), - new PsoEnumEntryInfo(MetaName.PV_COMP_HEAD, 0), - new PsoEnumEntryInfo(MetaName.PV_COMP_BERD, 1), - new PsoEnumEntryInfo(MetaName.PV_COMP_HAIR, 2), - new PsoEnumEntryInfo(MetaName.PV_COMP_UPPR, 3), - new PsoEnumEntryInfo(MetaName.PV_COMP_LOWR, 4), - new PsoEnumEntryInfo(MetaName.PV_COMP_HAND, 5), - new PsoEnumEntryInfo(MetaName.PV_COMP_FEET, 6), - new PsoEnumEntryInfo(MetaName.PV_COMP_TEEF, 7), - new PsoEnumEntryInfo(MetaName.PV_COMP_ACCS, 8), - new PsoEnumEntryInfo(MetaName.PV_COMP_TASK, 9), - new PsoEnumEntryInfo(MetaName.PV_COMP_DECL, 10), - new PsoEnumEntryInfo(MetaName.PV_COMP_JBIB, 11), - new PsoEnumEntryInfo(MetaName.PV_COMP_MAX, 12) - ); - case (MetaName)3509057257: - return new PsoEnumInfo((MetaName)3509057257, 1, - new PsoEnumEntryInfo(MetaName.RAGDOLL_BUTTOCKS, 0), - new PsoEnumEntryInfo(MetaName.RAGDOLL_THIGH_LEFT, 1), - new PsoEnumEntryInfo(MetaName.RAGDOLL_SHIN_LEFT, 2), - new PsoEnumEntryInfo(MetaName.RAGDOLL_FOOT_LEFT, 3), - new PsoEnumEntryInfo(MetaName.RAGDOLL_THIGH_RIGHT, 4), - new PsoEnumEntryInfo(MetaName.RAGDOLL_SHIN_RIGHT, 5), - new PsoEnumEntryInfo(MetaName.RAGDOLL_FOOT_RIGHT, 6), - new PsoEnumEntryInfo(MetaName.RAGDOLL_SPINE0, 7), - new PsoEnumEntryInfo(MetaName.RAGDOLL_SPINE1, 8), - new PsoEnumEntryInfo(MetaName.RAGDOLL_SPINE2, 9), - new PsoEnumEntryInfo(MetaName.RAGDOLL_SPINE3, 10), - new PsoEnumEntryInfo(MetaName.RAGDOLL_CLAVICLE_LEFT, 11), - new PsoEnumEntryInfo(MetaName.RAGDOLL_UPPER_ARM_LEFT, 12), - new PsoEnumEntryInfo(MetaName.RAGDOLL_LOWER_ARM_LEFT, 13), - new PsoEnumEntryInfo(MetaName.RAGDOLL_HAND_LEFT, 14), - new PsoEnumEntryInfo(MetaName.RAGDOLL_CLAVICLE_RIGHT, 15), - new PsoEnumEntryInfo(MetaName.RAGDOLL_UPPER_ARM_RIGHT, 16), - new PsoEnumEntryInfo((MetaName)937951079, 17), - new PsoEnumEntryInfo(MetaName.RAGDOLL_HAND_RIGHT, 18), - new PsoEnumEntryInfo(MetaName.RAGDOLL_NECK, 19), - new PsoEnumEntryInfo(MetaName.RAGDOLL_HEAD, 20) - ); - case MetaName.LockType: - return new PsoEnumInfo(MetaName.LockType, 1, - new PsoEnumEntryInfo((MetaName)40312212, 0), - new PsoEnumEntryInfo((MetaName)2263813480, 1), - new PsoEnumEntryInfo((MetaName)1924092278, 2) - ); - case (MetaName)3799765345: - return new PsoEnumInfo((MetaName)3799765345, 1, - new PsoEnumEntryInfo(MetaName.ET_INVALID, -1), - new PsoEnumEntryInfo(MetaName.ET_CRIME, 0), - new PsoEnumEntryInfo(MetaName.ET_JAYWALKING, 1), - new PsoEnumEntryInfo(MetaName.ET_COP_PURSUIT, 2), - new PsoEnumEntryInfo(MetaName.ET_SPAWNED_COP_PURSUIT, 3), - new PsoEnumEntryInfo(MetaName.ET_AMBIENT_COP, 4), - new PsoEnumEntryInfo(MetaName.ET_INTERESTING_DRIVER, 5), - new PsoEnumEntryInfo(MetaName.ET_AGGRESSIVE_DRIVER, 6) - ); - case (MetaName)1809724872: - return new PsoEnumInfo((MetaName)1809724872, 1, - new PsoEnumEntryInfo(MetaName.NO_REACTION, 0), - new PsoEnumEntryInfo(MetaName.SMALL_REACTION, 1), - new PsoEnumEntryInfo(MetaName.BIG_REACTION, 2) - ); - case (MetaName)888350649: - return new PsoEnumInfo((MetaName)888350649, 1, - new PsoEnumEntryInfo(MetaName.SAC_Retain, 0), - new PsoEnumEntryInfo((MetaName)485311651, 1), - new PsoEnumEntryInfo((MetaName)1413720671, 2), - new PsoEnumEntryInfo(MetaName.SAC_Randomize, 3) - ); - case (MetaName)2055586340: - return new PsoEnumInfo((MetaName)2055586340, 1, - new PsoEnumEntryInfo(MetaName.TC_Retain, 0), - new PsoEnumEntryInfo((MetaName)1410481380, 1), - new PsoEnumEntryInfo((MetaName)1541573135, 2), - new PsoEnumEntryInfo(MetaName.TC_Randomize, 3) - ); - case (MetaName)3374036042: - return new PsoEnumInfo((MetaName)3374036042, 1, - new PsoEnumEntryInfo(MetaName.BC_Retain, 0), - new PsoEnumEntryInfo((MetaName)1834753809, 1), - new PsoEnumEntryInfo((MetaName)2650352944, 2), - new PsoEnumEntryInfo(MetaName.BC_Randomize, 3) - ); - case (MetaName)4001255574: - return new PsoEnumInfo((MetaName)4001255574, 1, - new PsoEnumEntryInfo(MetaName.HBC_Retain, 0), - new PsoEnumEntryInfo((MetaName)2508718569, 1), - new PsoEnumEntryInfo((MetaName)1024930189, 2), - new PsoEnumEntryInfo(MetaName.HBC_Randomize, 3) - ); - case (MetaName)894416699: - return new PsoEnumInfo((MetaName)894416699, 1, - new PsoEnumEntryInfo(MetaName.SF_FrontDriverSide, 0), - new PsoEnumEntryInfo(MetaName.SF_FrontPassengerSide, 1), - new PsoEnumEntryInfo(MetaName.SF_BackDriverSide, 2), - new PsoEnumEntryInfo(MetaName.SF_BackPassengerSide, 3), - new PsoEnumEntryInfo(MetaName.SF_AltFrontDriverSide, 4), - new PsoEnumEntryInfo(MetaName.SF_AltFrontPassengerSide, 5), - new PsoEnumEntryInfo(MetaName.SF_AltBackDriverSide, 6), - new PsoEnumEntryInfo(MetaName.SF_AltBackPassengerSide, 7) - ); - case (MetaName)4186696686: - return new PsoEnumInfo((MetaName)4186696686, 1, - new PsoEnumEntryInfo(MetaName.POPGROUP_IS_GANG, 0), - new PsoEnumEntryInfo(MetaName.POPGROUP_AMBIENT, 1), - new PsoEnumEntryInfo(MetaName.POPGROUP_SCENARIO, 2), - new PsoEnumEntryInfo(MetaName.POPGROUP_RARE, 3), - new PsoEnumEntryInfo(MetaName.POPGROUP_NETWORK_COMMON, 4), - new PsoEnumEntryInfo(MetaName.POPGROUP_AERIAL, 5), - new PsoEnumEntryInfo(MetaName.POPGROUP_AQUATIC, 6), - new PsoEnumEntryInfo(MetaName.POPGROUP_WILDLIFE, 7), - new PsoEnumEntryInfo(MetaName.POPGROUP_IN_VEHICLE, 8) - ); - case (MetaName)2809332931: - return new PsoEnumInfo((MetaName)2809332931, 1, - new PsoEnumEntryInfo(MetaName.DontCloseWhenTouched, 0), - new PsoEnumEntryInfo(MetaName.AutoOpensForSPVehicleWithPedsOnly, 1), - new PsoEnumEntryInfo(MetaName.AutoOpensForSPPlayerPedsOnly, 2), - new PsoEnumEntryInfo(MetaName.AutoOpensForMPVehicleWithPedsOnly, 3), - new PsoEnumEntryInfo(MetaName.AutoOpensForMPPlayerPedsOnly, 4), - new PsoEnumEntryInfo(MetaName.DelayDoorClosingForPlayer, 5), - new PsoEnumEntryInfo(MetaName.AutoOpensForAllVehicles, 6), - new PsoEnumEntryInfo(MetaName.IgnoreOpenDoorTaskEdgeLerp, 7), - new PsoEnumEntryInfo(MetaName.AutoOpensForLawEnforcement, 8) - ); - case MetaName.StdDoorRotDir: - return new PsoEnumInfo(MetaName.StdDoorRotDir, 1, - new PsoEnumEntryInfo(MetaName.StdDoorOpenBothDir, 0), - new PsoEnumEntryInfo(MetaName.StdDoorOpenNegDir, 1), - new PsoEnumEntryInfo(MetaName.StdDoorOpenPosDir, 2) - ); - case (MetaName)2065671281: - return new PsoEnumInfo((MetaName)2065671281, 1, - new PsoEnumEntryInfo(MetaName.CantUse, 0), - new PsoEnumEntryInfo(MetaName.MustUse, 1) - ); - case (MetaName)1756502932: - return new PsoEnumInfo((MetaName)1756502932, 1, - new PsoEnumEntryInfo((MetaName)1618156912, 0), - new PsoEnumEntryInfo((MetaName)325739119, 1), - new PsoEnumEntryInfo((MetaName)1129710621, 2), - new PsoEnumEntryInfo((MetaName)2784202857, 3), - new PsoEnumEntryInfo((MetaName)3198877297, 4), - new PsoEnumEntryInfo((MetaName)2664559559, 5) - ); - case (MetaName)3204395397: - return new PsoEnumInfo((MetaName)3204395397, 1, - new PsoEnumEntryInfo((MetaName)3124669982, 0), - new PsoEnumEntryInfo((MetaName)1679254647, 1), - new PsoEnumEntryInfo((MetaName)1875723229, 2) - ); - case (MetaName)4286852891: - return new PsoEnumInfo((MetaName)4286852891, 1, - new PsoEnumEntryInfo(MetaName.VEHICLE_RESPONSE_DEFAULT, 0), - new PsoEnumEntryInfo(MetaName.VEHICLE_RESPONSE_COUNTRYSIDE, 1), - new PsoEnumEntryInfo(MetaName.VEHICLE_RESPONSE_ARMY_BASE, 2), - new PsoEnumEntryInfo((MetaName)2910242310, 3) - ); - case (MetaName)4095090001: - return new PsoEnumInfo((MetaName)4095090001, 1, - new PsoEnumEntryInfo(MetaName.SPECIAL_NONE, 0), - new PsoEnumEntryInfo(MetaName.SPECIAL_AIRPORT, 1) - ); - case (MetaName)98189892: - return new PsoEnumInfo((MetaName)98189892, 1, - new PsoEnumEntryInfo(MetaName.NoCoverNorthFaceEast, 0), - new PsoEnumEntryInfo(MetaName.NoCoverNorthFaceWest, 1), - new PsoEnumEntryInfo(MetaName.NoCoverNorthFaceCenter, 2), - new PsoEnumEntryInfo(MetaName.NoCoverSouthFaceEast, 3), - new PsoEnumEntryInfo(MetaName.NoCoverSouthFaceWest, 4), - new PsoEnumEntryInfo(MetaName.NoCoverSouthFaceCenter, 5), - new PsoEnumEntryInfo(MetaName.NoCoverEastFaceNorth, 6), - new PsoEnumEntryInfo(MetaName.NoCoverEastFaceSouth, 7), - new PsoEnumEntryInfo(MetaName.NoCoverEastFaceCenter, 8), - new PsoEnumEntryInfo(MetaName.NoCoverWestFaceNorth, 9), - new PsoEnumEntryInfo(MetaName.NoCoverWestFaceSouth, 10), - new PsoEnumEntryInfo(MetaName.NoCoverWestFaceCenter, 11), - new PsoEnumEntryInfo(MetaName.ForceLowCornerNorthFaceEast, 12), - new PsoEnumEntryInfo(MetaName.ForceLowCornerNorthFaceWest, 13), - new PsoEnumEntryInfo(MetaName.ForceLowCornerSouthFaceEast, 14), - new PsoEnumEntryInfo(MetaName.ForceLowCornerSouthFaceWest, 15), - new PsoEnumEntryInfo(MetaName.ForceLowCornerEastFaceNorth, 16), - new PsoEnumEntryInfo(MetaName.ForceLowCornerEastFaceSouth, 17), - new PsoEnumEntryInfo(MetaName.ForceLowCornerWestFaceNorth, 18), - new PsoEnumEntryInfo(MetaName.ForceLowCornerWestFaceSouth, 19), - new PsoEnumEntryInfo(MetaName.NoCoverVehicleDoors, 20) - ); - case MetaName.CSpawnPoint__AvailabilityMpSp: - return new PsoEnumInfo(MetaName.CSpawnPoint__AvailabilityMpSp, 1, - new PsoEnumEntryInfo(MetaName.kBoth, 0), - new PsoEnumEntryInfo(MetaName.kOnlySp, 1), - new PsoEnumEntryInfo(MetaName.kOnlyMp, 2) - ); - case MetaName.CScenarioPointFlags__Flags: - return new PsoEnumInfo(MetaName.CScenarioPointFlags__Flags, 1, - new PsoEnumEntryInfo(MetaName.IgnoreMaxInRange, 0), - new PsoEnumEntryInfo(MetaName.NoSpawn, 1), - new PsoEnumEntryInfo(MetaName.StationaryReactions, 2) - ); - case MetaName.CScenarioChainingEdge__eNavMode: - return new PsoEnumInfo(MetaName.CScenarioChainingEdge__eNavMode, 1, - new PsoEnumEntryInfo(MetaName.Direct, 0), - new PsoEnumEntryInfo(MetaName.NavMesh, 1), - new PsoEnumEntryInfo(MetaName.Roads, 2) - ); - case MetaName.CScenarioChainingEdge__eNavSpeed: - return new PsoEnumInfo(MetaName.CScenarioChainingEdge__eNavSpeed, 1, - new PsoEnumEntryInfo((MetaName)3279574318, 0), - new PsoEnumEntryInfo((MetaName)2212923970, 1), - new PsoEnumEntryInfo((MetaName)4022799658, 2), - new PsoEnumEntryInfo((MetaName)1425672334, 3), - new PsoEnumEntryInfo((MetaName)957720931, 4), - new PsoEnumEntryInfo((MetaName)3795195414, 5), - new PsoEnumEntryInfo((MetaName)2834622009, 6), - new PsoEnumEntryInfo((MetaName)1876554076, 7), - new PsoEnumEntryInfo((MetaName)698543797, 8), - new PsoEnumEntryInfo((MetaName)3911005380, 9), - new PsoEnumEntryInfo((MetaName)3717649022, 10), - new PsoEnumEntryInfo((MetaName)3356026130, 11) - ); - case (MetaName)1193003611: - return new PsoEnumInfo((MetaName)1193003611, 1, - new PsoEnumEntryInfo(MetaName.TIME_DEPENDENT, 0), - new PsoEnumEntryInfo(MetaName.WEATHER_DEPENDENT, 1) - ); - case (MetaName)3387532954: - return new PsoEnumInfo((MetaName)3387532954, 1, - new PsoEnumEntryInfo(MetaName.AT_TXD, 0), - new PsoEnumEntryInfo(MetaName.AT_DRB, 1), - new PsoEnumEntryInfo(MetaName.AT_DWD, 2), - new PsoEnumEntryInfo(MetaName.AT_FRG, 3) - ); - case MetaName.manifestFlags: - return new PsoEnumInfo(MetaName.manifestFlags, 1, - new PsoEnumEntryInfo(MetaName.INTERIOR_DATA, 0) - ); - case MetaName.rage__eLodType: - return new PsoEnumInfo(MetaName.rage__eLodType, 1, - new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_HD, 0), - new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_LOD, 1), - new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_SLOD1, 2), - new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_SLOD2, 3), - new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_SLOD3, 4), - new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_ORPHANHD, 5), - new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_SLOD4, 6) - ); - case MetaName.rage__ePriorityLevel: - return new PsoEnumInfo(MetaName.rage__ePriorityLevel, 1, - new PsoEnumEntryInfo(MetaName.PRI_REQUIRED, 0), - new PsoEnumEntryInfo(MetaName.PRI_OPTIONAL_HIGH, 1), - new PsoEnumEntryInfo(MetaName.PRI_OPTIONAL_MEDIUM, 2), - new PsoEnumEntryInfo(MetaName.PRI_OPTIONAL_LOW, 3) - ); - 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 T ConvertDataRaw(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 ConvertDataRawOld(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 ConvertDataRaw(byte[] data, int offset) where T : struct - { - MemoryMarshal.TryRead(data.AsSpan(offset), out var value); - return value; - } - - public static T ConvertData(byte[] data, int offset) where T : struct, IPsoSwapEnd - { - GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); - var h = handle.AddrOfPinnedObject(); - var r = Marshal.PtrToStructure(h + offset); - handle.Free(); - r.SwapEnd(); - return r; - } - public static Span ConvertDataArrayRaw(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] = ConvertDataRaw(data, off); - //} - - GCHandle handle = GCHandle.Alloc(items, GCHandleType.Pinned); - var h = handle.AddrOfPinnedObject(); - Marshal.Copy(data, offset, h, itemsize * count); - handle.Free(); - - return items; - } - - - public static T GetItem(PsoFile pso, int offset) where T : struct, IPsoSwapEnd - { - return ConvertData(pso.DataSection.Data, offset); - } - public static T GetRootItem(PsoFile pso) where T : struct, IPsoSwapEnd - { - var i = pso.DataMapSection.RootId - 1; - var e = pso.DataMapSection.Entries[i]; - return GetItem(pso, e.Offset); - } - public static PsoDataMappingEntry GetRootEntry(PsoFile pso) - { - var i = pso.DataMapSection.RootId - 1; - var e = pso.DataMapSection.Entries[i]; - return e; - } - - public static Span GetItemArrayRaw(PsoFile pso, Array_Structure arr) where T : struct - { - if ((arr.Count1 > 0) && (arr.Pointer > 0)) - { - var entry = pso.DataMapSection.Entries[arr.PointerDataIndex]; - return ConvertDataArrayRaw(pso.DataSection.Data, entry.Offset, arr.Count1); - } - return null; - } - public static Span GetItemArray(PsoFile pso, Array_Structure arr) where T : struct, IPsoSwapEnd - { - if ((arr.Count1 > 0) && (arr.Pointer > 0)) - { - var entry = pso.DataMapSection.Entries[arr.PointerDataIndex]; - var res = ConvertDataArrayRaw(pso.DataSection.Data, entry.Offset, arr.Count1); - if (res != null) - { - for (int i = 0; i < res.Length; i++) + else if (entry.Type == PsoDataType.Structure) { - res[i].SwapEnd(); + var typename = GetSafeName((MetaName)entry.ReferenceKey, entry.ReferenceKey); + sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry.ToString()); + sbs.AppendLine(); + } + else + { + var typename = PsoDataTypes.GetCSharpTypeName(entry.Type); + sbs.AppendFormat(fmt, typename, sename, entry.DataOffset, entry); + sbs.AppendLine(); } } - return res; } - return null; + sbs.AppendLine("}"); + sbs.AppendLine(); } - public static Span GetUintArrayRaw(PsoFile pso, Array_uint arr) + sbe.AppendLine(); + sbe.AppendLine(); + sbe.AppendLine(); + sbe.AppendLine(); + sbe.AppendLine(); + sbe.Append(sbs.ToString()); + + string result = sbe.ToString(); + + return result; + } + + + public static string GetTypesInitString() + { + StringBuilder sb = new StringBuilder(); + + foreach (var si in StructDict.Values) { - byte[] data = pso.DataSection.Data; - var entryid = arr.PointerDataId; - if ((entryid == 0) || (entryid > pso.DataMapSection.EntriesCount)) + AddStructureInfoString(si, sb); + } + + sb.AppendLine(); + + foreach (var ei in EnumDict.Values) + { + AddEnumInfoString(ei, sb); + } + + string str = sb.ToString(); + return str; + } + private static void AddStructureInfoString(PsoStructureInfo si, StringBuilder sb) + { + var ns = GetMetaNameString(si.IndexInfo.NameHash); + sb.AppendFormat("case " + ns + ":"); + sb.AppendLine(); + sb.AppendFormat("return new PsoStructureInfo({0}, {1}, {2}, {3},", ns, si.Type, si.Unk, si.StructureLength); + sb.AppendLine(); + for (int i = 0; i < si.Entries.Length; i++) + { + var e = si.Entries[i]; + string refkey = "0"; + if (e.ReferenceKey != 0) { - return null; + refkey = GetMetaNameString((MetaName)e.ReferenceKey); } - var entryoffset = arr.PointerDataOffset; - var arrentry = pso.DataMapSection.Entries[(int)entryid - 1]; - int totoffset = arrentry.Offset + (int)entryoffset; - var readdata = ConvertDataArrayRaw(data, totoffset, arr.Count1); - return readdata; + sb.AppendFormat(" new PsoStructureEntryInfo({0}, PsoDataType.{1}, {2}, {3}, {4})", GetMetaNameString(e.EntryNameHash), e.Type, e.DataOffset, e.Unk_5h, refkey); + if (i < si.Entries.Length - 1) sb.Append(','); + sb.AppendLine(); } - public static Span GetUintArray(PsoFile pso, Array_uint arr) + sb.AppendFormat(");"); + sb.AppendLine(); + } + private static void AddEnumInfoString(PsoEnumInfo ei, StringBuilder sb) + { + var ns = GetMetaNameString(ei.IndexInfo.NameHash); + sb.AppendFormat("case " + ns + ":"); + sb.AppendLine(); + sb.AppendFormat("return new PsoEnumInfo({0}, {1},", ns, ei.Type); + sb.AppendLine(); + for (int i = 0; i < ei.Entries.Length; i++) { - var uints = GetUintArrayRaw(pso, arr); - if (uints == null) return null; - for (int i = 0; i < uints.Length; i++) + var e = ei.Entries[i]; + sb.AppendFormat(" new PsoEnumEntryInfo({0}, {1})", GetMetaNameString(e.EntryNameHash), e.EntryKey); + if (i < ei.Entries.Length - 1) sb.Append(','); + sb.AppendLine(); + } + sb.AppendFormat(");"); + sb.AppendLine(); + } + private static string GetMetaNameString(MetaName n) + { + if (Enum.IsDefined(typeof(MetaName), n)) + { + return "MetaName." + n.ToString(); + } + else + { + return "(MetaName)" + n.ToString(); + } + } + + + + + private static string GetSafeName(MetaName namehash, uint key) + { + string? name = Enum.GetName(namehash); + if (string.IsNullOrEmpty(name)) + { + name = $"Unk_{key}"; + } + if (!char.IsLetter(name[0])) + { + name = $"Unk_{name}"; + } + return name; + } + + + + public static T ConvertDataRaw(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 ConvertDataRawOld(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; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool TryConvertDataRaw(byte[] data, int offset, out T value) where T : struct + { + return MemoryMarshal.TryRead(data.AsSpan(offset), out value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool TryConvertDataRaw(Span data, out T value) where T : struct + { + return MemoryMarshal.TryRead(data, out value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T ConvertDataRaw(byte[] data, int offset) where T : struct + { + MemoryMarshal.TryRead(data.AsSpan(offset), out var value); + return value; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T ConvertData(byte[] data, int offset) where T : struct, IPsoSwapEnd + { + TryConvertData(data.AsSpan(offset), out var value); + + return value; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool TryConvertData(byte[] data, int offset, out T value) where T : struct, IPsoSwapEnd + { + return TryConvertData(data.AsSpan(offset), out value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool TryConvertData(Span data, out T value) where T : struct, IPsoSwapEnd + { + MemoryMarshal.TryRead(data, out value); + value = value.SwapEnd(); + return true; + } + + public static T[] ConvertDataArrayRaw(byte[] data, int offset, int count, T[]? buffer = null) where T : struct + { + if (count == 0) + { + return []; + } + int itemsize = Marshal.SizeOf(typeof(T)); + var result = MemoryMarshal.Cast(data.AsSpan(offset, count * itemsize)); + + var resultArr = buffer ?? new T[result.Length]; + + result.CopyTo(resultArr.AsSpan()); + + return resultArr; + } + + + public static T GetItem(PsoFile pso, int offset) where T : struct, IPsoSwapEnd + { + return ConvertData(pso.DataSection.Data, offset); + } + public static T GetRootItem(PsoFile pso) where T : struct, IPsoSwapEnd + { + var i = pso.DataMapSection.RootId - 1; + var e = pso.DataMapSection.Entries[i]; + return GetItem(pso, e.Offset); + } + public static PsoDataMappingEntry GetRootEntry(PsoFile pso) + { + var i = pso.DataMapSection.RootId - 1; + var e = pso.DataMapSection.Entries[i]; + return e; + } + + public static Span GetItemArrayRaw(PsoFile pso, Array_Structure arr) where T : struct + { + if ((arr.Count1 > 0) && (arr.Pointer > 0)) + { + var entry = pso.DataMapSection.Entries[arr.PointerDataIndex]; + return ConvertDataArrayRaw(pso.DataSection.Data, entry.Offset, arr.Count1); + } + return null; + } + public static T[] GetItemArray(PsoFile pso, in Array_Structure arr) where T : struct, IPsoSwapEnd + { + if ((arr.Count1 > 0) && (arr.Pointer > 0)) + { + var entry = pso.DataMapSection.Entries[arr.PointerDataIndex]; + var res = ConvertDataArrayRaw(pso.DataSection.Data, entry.Offset, arr.Count1); + if (res != null) { - uints[i] = MetaTypes.SwapBytes(uints[i]); - } - return uints; - } - - public static MetaHash[] GetHashArray(PsoFile pso, Array_uint arr) - { - var uints = GetUintArrayRaw(pso, arr); - if (uints == null) return null; - MetaHash[] hashes = new MetaHash[uints.Length]; - for (int n = 0; n < uints.Length; n++) - { - hashes[n].Hash = MetaTypes.SwapBytes(uints[n]); - } - return hashes; - } - - - - - public static Span GetFloatArrayRaw(PsoFile pso, Array_float arr) - { - byte[] data = pso.DataSection.Data; - var entryid = arr.PointerDataId; - if ((entryid == 0) || (entryid > pso.DataMapSection.EntriesCount)) - { - return null; - } - var entryoffset = arr.PointerDataOffset; - var arrentry = pso.DataMapSection.Entries[(int)entryid - 1]; - int totoffset = arrentry.Offset + (int)entryoffset; - var readdata = ConvertDataArrayRaw(data, totoffset, arr.Count1); - return readdata; - } - public static Span GetFloatArray(PsoFile pso, Array_float arr) - { - var floats = GetFloatArrayRaw(pso, arr); - if (floats == null) return null; - for (int i = 0; i < floats.Length; i++) - { - floats[i] = MetaTypes.SwapBytes(floats[i]); - } - return floats; - } - - - - - - public static Span GetUShortArrayRaw(PsoFile pso, Array_Structure arr) - { - byte[] data = pso.DataSection.Data; - var entryid = arr.PointerDataId; - if ((entryid == 0) || (entryid > pso.DataMapSection.EntriesCount)) - { - return null; - } - var entryoffset = arr.PointerDataOffset; - var arrentry = pso.DataMapSection.Entries[(int)entryid - 1]; - int totoffset = arrentry.Offset + (int)entryoffset; - Span readdata = ConvertDataArrayRaw(data, totoffset, arr.Count1); - return readdata; - } - public static Span GetUShortArray(PsoFile pso, Array_Structure arr) - { - var ushorts = GetUShortArrayRaw(pso, arr); - if (ushorts == null) return null; - for (int i = 0; i < ushorts.Length; i++) - { - ushorts[i] = MetaTypes.SwapBytes(ushorts[i]); - } - return ushorts; - } - - - - - - - public static T[] GetObjectArray(PsoFile pso, Array_Structure arr) where U : struct, IPsoSwapEnd where T : PsoClass, new() - { - Span items = GetItemArray(pso, arr); - if (items == null) return null; - if (items.Length == 0) return null; - T[] result = new T[items.Length]; - for (int i = 0; i < items.Length; i++) - { - T newitem = new T(); - newitem.Init(pso, ref items[i]); - result[i] = newitem; - } - return result; - } - - - public static byte[] GetByteArray(PsoFile pso, PsoStructureEntryInfo entry, int offset) - { - var aCount = (entry.ReferenceKey >> 16) & 0x0000FFFF; - var aBlockId = (int)entry.ReferenceKey & 0x0000FFFF; - var block = pso.GetBlock(aBlockId); - if (block == null) return null; - - //block.Offset - - return null; - } - - - - - - - public static Span GetPointerArray(PsoFile pso, Array_StructurePointer array) - { - uint count = array.Count1; - if (count == 0) return null; - - uint ptrindex = array.PointerDataIndex; - uint ptroffset = array.PointerDataOffset; - var ptrblock = (ptrindex < pso.DataMapSection.EntriesCount) ? pso.DataMapSection.Entries[ptrindex] : null; - if ((ptrblock == null) || (ptrblock.NameHash != (MetaName)MetaTypeName.PsoPOINTER)) - { return null; } - - var offset = ptrblock.Offset; - int boffset = (int)(offset + ptroffset); - - var ptrs = ConvertDataArrayRaw(pso.DataSection.Data, boffset, (int)count); - if (ptrs != null) - { - for (int i = 0; i < ptrs.Length; i++) + for (int i = 0; i < res.Length; i++) { - ptrs[i].SwapEnd(); + res[i] = res[i].SwapEnd(); } } + return res; + } + return null; + } - return ptrs; + + public static uint[]? GetUintArrayRaw(PsoFile pso, in Array_uint arr, uint[]? buffer = null) + { + byte[] data = pso.DataSection.Data; + var entryid = arr.PointerDataId; + if ((entryid == 0) || (entryid > pso.DataMapSection.EntriesCount)) + { + return null; + } + var entryoffset = arr.PointerDataOffset; + var arrentry = pso.DataMapSection.Entries[(int)entryid - 1]; + int totoffset = arrentry.Offset + (int)entryoffset; + var readdata = ConvertDataArrayRaw(data, totoffset, arr.Count1, buffer); + return readdata; + } + + public static uint[]? GetUintArray(PsoFile pso, in Array_uint arr) + { + var uints = GetUintArrayRaw(pso, in arr); + if (uints == null) + return null; + + BinaryPrimitives.ReverseEndianness(uints, uints); + + return uints; + } + + public static MetaHash[]? GetHashArray(PsoFile pso, in Array_uint arr) + { + var uints = ArrayPool.Shared.Rent((int)arr.Count1); + try + { + GetUintArrayRaw(pso, in arr, uints); + if (uints is null) + return null; + + BinaryPrimitives.ReverseEndianness(uints, uints); + + return MemoryMarshal.Cast(uints).ToArray(); + } + finally + { + ArrayPool.Shared.Return(uints); + } + } + + + + + public static float[] GetFloatArrayRaw(PsoFile pso, in Array_float arr) + { + byte[] data = pso.DataSection.Data; + var entryid = arr.PointerDataId; + if ((entryid == 0) || (entryid > pso.DataMapSection.EntriesCount)) + { + return null; + } + var entryoffset = arr.PointerDataOffset; + var arrentry = pso.DataMapSection.Entries[(int)entryid - 1]; + int totoffset = arrentry.Offset + (int)entryoffset; + var readdata = ConvertDataArrayRaw(data, totoffset, arr.Count1); + return readdata; + } + public static float[] GetFloatArray(PsoFile pso, in Array_float arr) + { + var floats = GetFloatArrayRaw(pso, in arr); + if (floats == null) + return null; + + var uints = MemoryMarshal.Cast(floats); + BinaryPrimitives.ReverseEndianness(uints, uints); + return floats; + } + + + + + + public static ushort[] GetUShortArrayRaw(PsoFile pso, in Array_Structure arr) + { + byte[] data = pso.DataSection.Data; + var entryid = arr.PointerDataId; + if (entryid == 0 || entryid > pso.DataMapSection.EntriesCount) + { + return null; + } + var entryoffset = arr.PointerDataOffset; + var arrentry = pso.DataMapSection.Entries[(int)entryid - 1]; + int totoffset = arrentry.Offset + (int)entryoffset; + ushort[] readdata = ConvertDataArrayRaw(data, totoffset, arr.Count1); + return readdata; + } + + public static ushort[] GetUShortArray(PsoFile pso, in Array_Structure arr) + { + var ushorts = GetUShortArrayRaw(pso, in arr); + if (ushorts == null) + return null; + + BinaryPrimitives.ReverseEndianness(ushorts, ushorts); + return ushorts; + } + + + + + + + public static T[]? GetObjectArray(PsoFile pso, in Array_Structure arr) where U : struct, IPsoSwapEnd where T : PsoClass, new() + { + U[] items = GetItemArray(pso, in arr); + if (items == null) + return null; + + if (items.Length == 0) + return null; + + T[] result = new T[items.Length]; + for (int i = 0; i < items.Length; i++) + { + T newitem = new T(); + newitem.Init(pso, in items[i]); + result[i] = newitem; + } + return result; + } + + + public static byte[]? GetByteArray(PsoFile pso, PsoStructureEntryInfo entry, int offset) + { + var aCount = (entry.ReferenceKey >> 16) & 0x0000FFFF; + var aBlockId = (int)entry.ReferenceKey & 0x0000FFFF; + var block = pso.GetBlock(aBlockId); + if (block == null) + return null; + + //block.Offset + + return null; + } + + + + + + + public static PsoPOINTER[]? GetPointerArray(PsoFile pso, in Array_StructurePointer array, PsoPOINTER[]? buffer = null) + { + uint count = array.Count1; + if (count == 0) + return null; + + uint ptrindex = array.PointerDataIndex; + uint ptroffset = array.PointerDataOffset; + + if (ptrindex >= pso.DataMapSection.EntriesCount) + { + return null; } - - public static T[] ConvertDataArray(PsoFile pso, Array_StructurePointer array) where T : struct, IPsoSwapEnd + var ptrblock = pso.DataMapSection.Entries[ptrindex]; + if (ptrblock.NameHash != (MetaName)MetaTypeName.PsoPOINTER) { - uint count = array.Count1; - if (count == 0) return null; - var ptrs = GetPointerArray(pso, array); - if (ptrs == null) return null; - if (ptrs.Length < count) - { return null; } + return null; + } - T[] items = new T[count]; + var offset = ptrblock.Offset; + int boffset = (int)(offset + ptroffset); - for (int i = 0; i < count; i++) + var ptrs = ConvertDataArrayRaw(pso.DataSection.Data, boffset, (int)count); + if (ptrs != null) + { + for (int i = 0; i < ptrs.Length; i++) { - var sptr = ptrs[i]; - int blocki = sptr.BlockID - 1; - int offset = (int)sptr.ItemOffset;// * 16;//block data size... - if (blocki >= pso.DataMapSection.EntriesCount) - { continue; } - var block = pso.DataMapSection.Entries[blocki]; + ptrs[i] = ptrs[i].SwapEnd(); + } + } - if ((offset < 0) || (offset >= block.Length)) - { continue; } + return ptrs; + } - int boffset = block.Offset + offset; - items[i] = ConvertData(pso.DataSection.Data, boffset); + public static T[]? ConvertDataArray(PsoFile pso, in Array_StructurePointer array) where T : struct, IPsoSwapEnd + { + uint count = array.Count1; + if (count == 0) + { + Console.WriteLine($"count is 0"); + return null; + } + + var ptrs = GetPointerArray(pso, in array); + if (ptrs == null) + { + Console.WriteLine($"ptrs is null"); + return null; + } + if (ptrs.Length < count || ptrs.Length == 0) + { + Console.WriteLine($"ptrs.Length smaller than count or ptrs.Length == 0; ptrs.Length = {ptrs.Length}; count = {count}"); + return null; + } + + T[] items = new T[count]; + + for (int i = 0; i < count; i++) + { + var sptr = ptrs[i]; + int blocki = sptr.BlockID - 1; + int offset = (int)sptr.ItemOffset;// * 16;//block data size... + if (blocki >= pso.DataMapSection.EntriesCount) + { + continue; + } + var block = pso.DataMapSection.Entries[blocki]; + + if (offset < 0 || offset >= block.Length) + { + continue; } - return items; + int boffset = block.Offset + offset; + + TryConvertData(pso.DataSection.Data, boffset, out items[i]); } - - - public static string GetString(PsoFile pso, CharPointer ptr) - { - if (ptr.Count1 == 0) return null; - - var blocki = (int)ptr.PointerDataId;// (ptr.Pointer & 0xFFF) - 1; - var offset = (int)ptr.PointerDataOffset;// (ptr.Pointer >> 12) & 0xFFFFF; - - var block = pso.GetBlock(blocki); //nameHash = 1 - if (block == null) - { return null; } - - //if (block.NameHash != (MetaName)1) - //{ } - - var length = ptr.Count1; - var lastbyte = offset + length; - if (lastbyte >= block.Length) - { return null; } - - var data = pso.DataSection?.Data; - if (data == null) - { return null; } - - var doffset = block.Offset + offset; - - string s = Encoding.ASCII.GetString(data, doffset, 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 string GetString(PsoFile pso, DataBlockPointer ptr) - { - var blocki = (int)ptr.PointerDataId;// (ptr.Pointer & 0xFFF) - 1; - var offset = (int)ptr.PointerDataOffset;// (ptr.Pointer >> 12) & 0xFFFFF; - - var block = pso.GetBlock(blocki); //nameHash = 1 - if (block == null) - { return null; } - - //if (block.NameHash != (MetaName)1) - //{ } - - //var length = ptr.Count1; - //var lastbyte = offset + length; - //if (lastbyte >= block.Length) - //{ return null; } - - var data = pso.DataSection?.Data; - if (data == null) - { return null; } - - //var doffset = block.Offset + offset; - - //string s = Encoding.ASCII.GetString(data, doffset, length); - - StringBuilder sb = new StringBuilder(); - var o = block.Offset + offset; - char c = (char)data[o]; - while (c != 0) - { - sb.Append(c); - o++; - c = (char)data[o]; - } - var s = sb.ToString(); - - return s; - } - - + return items; } - public interface IPsoSwapEnd + + public static string GetString(PsoFile pso, in CharPointer ptr) { - void SwapEnd(); - } + if (ptr.Count1 == 0) + return string.Empty; - public abstract class PsoClass where T : struct, IPsoSwapEnd - { - public abstract void Init(PsoFile pso, ref T v); - } + var blocki = (int)ptr.PointerDataId;// (ptr.Pointer & 0xFFF) - 1; + var offset = (int)ptr.PointerDataOffset;// (ptr.Pointer >> 12) & 0xFFFFF; - - public struct PsoChar64 - { - 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() + if (!pso.TryGetBlock(blocki, out var block)) { - byte[] bytes = new byte[] - { - b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, + return string.Empty; + } + + //if (block.NameHash != (MetaName)1) + //{ } + + var length = ptr.Count1; + var lastbyte = offset + length; + if (lastbyte >= block.Length) + { + return string.Empty; + } + + var data = pso.DataSection?.Data; + if (data == null) + { + return string.Empty; + } + + var doffset = block.Offset + offset; + + string s = Encoding.ASCII.GetString(data, doffset, length); + + return s; + } + public static string? GetString(PsoFile pso, in DataBlockPointer ptr) + { + var blocki = (int)ptr.PointerDataId;// (ptr.Pointer & 0xFFF) - 1; + var offset = (int)ptr.PointerDataOffset;// (ptr.Pointer >> 12) & 0xFFFFF; + + if (!pso.TryGetBlock(blocki, out var block)) + { + return null; + } + + //if (block.NameHash != (MetaName)1) + //{ } + + //var length = ptr.Count1; + //var lastbyte = offset + length; + //if (lastbyte >= block.Length) + //{ return null; } + + var data = pso.DataSection?.Data; + if (data == null) + { + return null; + } + + //var doffset = block.Offset + offset; + + //string s = Encoding.ASCII.GetString(data, doffset, length); + + var o = block.Offset + offset; + + char c = (char)data[o]; + + var strData = data.AsSpan(o); + var index = strData.IndexOf((byte)'\0'); + + if (index == -1) + { + return Encoding.ASCII.GetString(strData); + } + + return Encoding.ASCII.GetString(strData.Slice(0, index)); + } +} + + +public interface IPsoSwapEnd +{ + T SwapEnd(); +} + +public abstract class PsoClass where T : struct, IPsoSwapEnd +{ + public abstract void Init(PsoFile pso, in T v); +} + +public readonly struct PsoChar64 +{ + public readonly 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 - }; - return Encoding.ASCII.GetString(bytes).Replace("\0", string.Empty); - } - } - public struct PsoChar32 - { - 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; + b60, b61, b62, b63; - public PsoChar32(string s) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ReadOnlySpan GetBytes() + { + return MemoryMarshal.AsBytes(MemoryMarshal.CreateReadOnlySpan(in this, 1)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ReadOnlySpan GetBytesNullTerminated() + { + var bytes = GetBytes(); + + var index = bytes.IndexOf((byte)0); + + if (index == -1) { - s = s.PadRight(32, '\0'); - b00 = (byte)s[0]; - b01 = (byte)s[1]; - b02 = (byte)s[2]; - b03 = (byte)s[3]; - b04 = (byte)s[4]; - b05 = (byte)s[5]; - b06 = (byte)s[6]; - b07 = (byte)s[7]; - b08 = (byte)s[8]; - b09 = (byte)s[9]; - b10 = (byte)s[10]; - b11 = (byte)s[11]; - b12 = (byte)s[12]; - b13 = (byte)s[13]; - b14 = (byte)s[14]; - b15 = (byte)s[15]; - b16 = (byte)s[16]; - b17 = (byte)s[17]; - b18 = (byte)s[18]; - b19 = (byte)s[19]; - b20 = (byte)s[20]; - b21 = (byte)s[21]; - b22 = (byte)s[22]; - b23 = (byte)s[23]; - b24 = (byte)s[24]; - b25 = (byte)s[25]; - b26 = (byte)s[26]; - b27 = (byte)s[27]; - b28 = (byte)s[28]; - b29 = (byte)s[29]; - b30 = (byte)s[30]; - b31 = (byte)s[31]; + return bytes; } - public override string ToString() - { - byte[] bytes = new byte[] - { - b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, + + return bytes.Slice(0, index); + } + + public override string ToString() + { + var byteArr = GetBytesNullTerminated(); + + return Encoding.ASCII.GetString(byteArr); + } +} +public readonly struct PsoChar32 +{ + public readonly 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 - }; - return Encoding.ASCII.GetString(bytes).Replace("\0", string.Empty); - } - } + b30, b31; - - - - [TC(typeof(EXP))] public struct PsoPOINTER : IPsoSwapEnd //8 bytes - pointer to data item + public PsoChar32(string s) { - public ulong Pointer { get; set; } - - public ushort BlockID { get { return (ushort)(Pointer & 0xFFF); } } //1-based ID - public uint ItemOffset { get { return (uint)((Pointer>>12) & 0xFFFFF); } } //byte offset - public uint Unk0 { get { return (uint)((Pointer>>32) & 0xFFFFFFFF); } } - - - public PsoPOINTER(int blockID, int itemOffset) - { - Pointer = (((uint)itemOffset << 12) & 0xFFFFF000) + ((uint)blockID & 0xFFF); - } - - - public override string ToString() - { - return BlockID.ToString() + ", " + ItemOffset.ToString();// + ", " + Unk2.ToString(); - } - - public void SwapEnd() - { - Pointer = MetaTypes.SwapBytes(Pointer); - } + s = s.PadRight(32, '\0'); + b00 = (byte)s[0]; + b01 = (byte)s[1]; + b02 = (byte)s[2]; + b03 = (byte)s[3]; + b04 = (byte)s[4]; + b05 = (byte)s[5]; + b06 = (byte)s[6]; + b07 = (byte)s[7]; + b08 = (byte)s[8]; + b09 = (byte)s[9]; + b10 = (byte)s[10]; + b11 = (byte)s[11]; + b12 = (byte)s[12]; + b13 = (byte)s[13]; + b14 = (byte)s[14]; + b15 = (byte)s[15]; + b16 = (byte)s[16]; + b17 = (byte)s[17]; + b18 = (byte)s[18]; + b19 = (byte)s[19]; + b20 = (byte)s[20]; + b21 = (byte)s[21]; + b22 = (byte)s[22]; + b23 = (byte)s[23]; + b24 = (byte)s[24]; + b25 = (byte)s[25]; + b26 = (byte)s[26]; + b27 = (byte)s[27]; + b28 = (byte)s[28]; + b29 = (byte)s[29]; + b30 = (byte)s[30]; + b31 = (byte)s[31]; } - - - - - - - - - //Struct infos - [TC(typeof(EXP))] public struct CPackFileMetaData : IPsoSwapEnd //96 bytes, Type:0 + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ReadOnlySpan GetBytes() { - public Array_Structure MapDataGroups; //0 MapDataGroups: Array: 0 {256: Structure: 0: 3260758307} - public Array_Structure HDTxdBindingArray; //16 HDTxdBindingArray: Array: 16: 2 {256: Structure: 0: CHDTxdAssetBinding} - public Array_Structure imapDependencies; //32 imapDependencies: Array: 32: 4 {256: Structure: 0: 3501026914} - public Array_Structure imapDependencies_2; //48 imapDependencies_2: Array: 48: 6 {256: Structure: 0: 3240050401} - public Array_Structure itypDependencies_2; //64 itypDependencies_2: Array: 64: 8 {256: Structure: 0: 1515605584} - public Array_Structure Interiors; //80 Interiors: Array: 80: 10 {256: Structure: 0: 741495440} - - public void SwapEnd() - { - MapDataGroups.SwapEnd(); - HDTxdBindingArray.SwapEnd(); - imapDependencies.SwapEnd(); - imapDependencies_2.SwapEnd(); - itypDependencies_2.SwapEnd(); - Interiors.SwapEnd(); - } + return MemoryMarshal.AsBytes(MemoryMarshal.CreateReadOnlySpan(in this, 1)); } - [TC(typeof(EXP))] public struct CMapDataGroup : IPsoSwapEnd //56 bytes, Type:0 + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ReadOnlySpan GetBytesNullTerminated() { - public MetaHash Name { get; set; } //0 Name: INT_0Bh: 0 - public uint Unused0 { get; set; } //4 - public Array_uint Bounds { get; set; } //8 Bounds: Array: 8: 1 {256: INT_0Bh: 0} - public ushort Flags { get; set; } //24 Flags: SHORT_0Fh: 24: 2097155 - public ushort Unused1 { get; set; }//26 - public uint Unused2 { get; set; }//28 - public Array_uint WeatherTypes { get; set; } //32 WeatherTypes: Array: 32: 5 {256: INT_0Bh: 0} - public uint HoursOnOff { get; set; } //48 HoursOnOff//4190815249: INT_06h: 48 - public uint Unused3 { get; set; }//52 + var bytes = GetBytes(); - public override string ToString() + var index = bytes.IndexOf((byte)0); + + if (index == -1) { - return Name.ToString() + ": ybn:" + Bounds.Count1.ToString() + ", wt:" + WeatherTypes.Count1.ToString() + ", flags:" + Flags.ToString() + ", hours:" + HoursOnOff.ToString(); + return bytes; } - public void SwapEnd() - { - Name = new MetaHash(MetaTypes.SwapBytes(Name.Hash)); - var b = Bounds; b.SwapEnd(); Bounds = b; - var w = WeatherTypes; w.SwapEnd(); WeatherTypes = w; - HoursOnOff = MetaTypes.SwapBytes(HoursOnOff); - Flags = MetaTypes.SwapBytes(Flags); - } + return bytes.Slice(0, index); } - [TC(typeof(EXP))] public struct CHDTxdAssetBinding : IPsoSwapEnd //132 bytes, Type:0 + public override string ToString() { - public byte assetType { get; set; } //0 assetType: BYTE_ENUM_VALUE: 0: 3387532954 - public byte Unused01 { get; set; }//1 - public ushort Unused02 { get; set; }//2 - public PsoChar64 targetAsset { get; set; } //4 targetAsset: INT_0Bh: 4: 4194304 - public PsoChar64 HDTxd { get; set; } //68 HDTxd: INT_0Bh: 68: 4194304 + var byteArr = GetBytesNullTerminated(); - public override string ToString() - { - return assetType.ToString() + ": " + targetAsset.ToString() + ": " + HDTxd.ToString(); - } - public void SwapEnd() - { - //targetAsset.Hash = MetaTypes.SwapBytes(targetAsset.Hash); - //HDTxd.Hash = MetaTypes.SwapBytes(HDTxd.Hash); - } + return Encoding.ASCII.GetString(byteArr); + } +} + + +[TC(typeof(EXP))] +public readonly struct PsoPOINTER : IPsoSwapEnd //8 bytes - pointer to data item +{ + public ulong Pointer { get; init; } + + public ushort BlockID => (ushort)(Pointer & 0xFFF); //1-based ID + public uint ItemOffset => (uint)((Pointer>>12) & 0xFFFFF); //byte offset + public uint Unk0 => (uint)((Pointer>>32) & 0xFFFFFFFF); + + + public PsoPOINTER(int blockID, int itemOffset) + { + Pointer = (((uint)itemOffset << 12) & 0xFFFFF000) + ((uint)blockID & 0xFFF); + } + + + public override string ToString() => $"{BlockID}, {ItemOffset}"; + + public PsoPOINTER SwapEnd() + { + return this with + { + Pointer = MetaTypes.SwapBytes(Pointer), + }; + } +} + +//Struct infos +[TC(typeof(EXP))] +public readonly struct CPackFileMetaData : IPsoSwapEnd //96 bytes, Type:0 +{ + public readonly Array_Structure _MapDataGroups; //0 MapDataGroups: Array: 0 {256: Structure: 0: 3260758307} + public Array_Structure MapDataGroups { get => _MapDataGroups; init => _MapDataGroups = value; } + + public readonly Array_Structure _HDTxdBindingArray; //16 HDTxdBindingArray: Array: 16: 2 {256: Structure: 0: CHDTxdAssetBinding} + public Array_Structure HDTxdBindingArray { get => _HDTxdBindingArray; init => _HDTxdBindingArray = value; } + + public readonly Array_Structure _imapDependencies; //32 imapDependencies: Array: 32: 4 {256: Structure: 0: 3501026914} + public Array_Structure imapDependencies { get => _imapDependencies; init => _imapDependencies = value; } + + public readonly Array_Structure _imapDependencies_2; //48 imapDependencies_2: Array: 48: 6 {256: Structure: 0: 3240050401} + public Array_Structure imapDependencies_2 { get => _imapDependencies_2; init => _imapDependencies_2 = value; } + + public readonly Array_Structure _itypDependencies_2; //64 itypDependencies_2: Array: 64: 8 {256: Structure: 0: 1515605584} + public Array_Structure itypDependencies_2 { get => _itypDependencies_2; init => _itypDependencies_2 = value; } + + public readonly Array_Structure _Interiors; //80 Interiors: Array: 80: 10 {256: Structure: 0: 741495440} + public Array_Structure Interiors { get => _Interiors; init => _Interiors = value; } + + public CPackFileMetaData SwapEnd() + { + return this with + { + MapDataGroups = _MapDataGroups.SwapEnd(), + HDTxdBindingArray = _HDTxdBindingArray.SwapEnd(), + imapDependencies = _imapDependencies.SwapEnd(), + imapDependencies_2 = _imapDependencies_2.SwapEnd(), + itypDependencies_2 = _itypDependencies_2.SwapEnd(), + Interiors = _Interiors.SwapEnd(), + }; + } +} + +[TC(typeof(EXP))] public struct CMapDataGroup : IPsoSwapEnd //56 bytes, Type:0 +{ + public MetaHash Name { get; set; } //0 Name: INT_0Bh: 0 + public uint Unused0 { get; set; } //4 + public Array_uint Bounds { get; set; } //8 Bounds: Array: 8: 1 {256: INT_0Bh: 0} + public ushort Flags { get; set; } //24 Flags: SHORT_0Fh: 24: 2097155 + public ushort Unused1 { get; set; }//26 + public uint Unused2 { get; set; }//28 + public Array_uint WeatherTypes { get; set; } //32 WeatherTypes: Array: 32: 5 {256: INT_0Bh: 0} + public uint HoursOnOff { get; set; } //48 HoursOnOff//4190815249: INT_06h: 48 + public uint Unused3 { get; set; }//52 + + public override readonly string ToString() + { + return $"{Name}: ybn:{Bounds.Count1}, wt:{WeatherTypes.Count1}, flags:{Flags}, hours:{HoursOnOff}"; + } + + public CMapDataGroup SwapEnd() + { + return this with + { + Name = new MetaHash(MetaTypes.SwapBytes(Name.Hash)), + Bounds = Bounds.SwapEnd(), + WeatherTypes = WeatherTypes.SwapEnd(), + HoursOnOff = MetaTypes.SwapBytes(HoursOnOff), + Flags = MetaTypes.SwapBytes(Flags), + }; + } +} + +[TC(typeof(EXP))] +public readonly struct CHDTxdAssetBinding : IPsoSwapEnd //132 bytes, Type:0 +{ + public byte assetType { get; init; } //0 assetType: BYTE_ENUM_VALUE: 0: 3387532954 + public byte Unused01 { get; init; }//1 + public ushort Unused02 { get; init; }//2 + + public readonly PsoChar64 _targetAsset; + public PsoChar64 targetAsset { get => _targetAsset; init => _targetAsset = value; } //4 targetAsset: INT_0Bh: 4: 4194304 + + public readonly PsoChar64 _HDTxd; + public PsoChar64 HDTxd { get => _HDTxd; init => _HDTxd = value; } //68 HDTxd: INT_0Bh: 68: 4194304 + + public override string ToString() + { + return $"{assetType}: {_targetAsset}: {_HDTxd}"; + } + public readonly CHDTxdAssetBinding SwapEnd() + { + return this; + //targetAsset.Hash = MetaTypes.SwapBytes(targetAsset.Hash); + //HDTxd.Hash = MetaTypes.SwapBytes(HDTxd.Hash); + } +} + +[TC(typeof(EXP))] public struct CImapDependency : IPsoSwapEnd //12 bytes, Type:0 // CImapDependency//3501026914 +{ + public MetaHash imapName { get; set; } //0 imapName: INT_0Bh: 0 + public MetaHash itypName { get; set; } //4 itypName//2890158180: INT_0Bh: 4 + public MetaHash packFileName { get; set; } //8 packFileName//4216494073: INT_0Bh: 8 + + public override string ToString() + { + return $"{imapName}, {itypName}, {packFileName}"; + } + public CImapDependency SwapEnd() + { + return this with + { + imapName = new MetaHash(MetaTypes.SwapBytes(imapName.Hash)), + itypName = new MetaHash(MetaTypes.SwapBytes(itypName.Hash)), + packFileName = new MetaHash(MetaTypes.SwapBytes(packFileName.Hash)), + }; + } +} + +[TC(typeof(EXP))] +public struct CImapDependencies : IPsoSwapEnd //24 bytes, Type:0 // CImapDependencies//3240050401 imapDependencies_2 +{ + public MetaHash imapName { get; set; } //0 imapName: INT_0Bh: 0 //name hash + public ushort manifestFlags { get; set; } //4 manifestFlags//1683136603: SHORT_0Fh: 4: 2097153 + public ushort Unused0 { get; set; } //6 + public Array_uint itypDepArray { get; set; } //8 itypDepArray//2410949350: Array: 8: 3 {256: INT_0Bh: 0} //children... + + + public override string ToString() + { + return $"{imapName}: {manifestFlags}: {itypDepArray}"; + } + public CImapDependencies SwapEnd() + { + return this with + { + imapName = new MetaHash(MetaTypes.SwapBytes(imapName.Hash)), + manifestFlags = MetaTypes.SwapBytes(manifestFlags), + itypDepArray = itypDepArray.SwapEnd(), + }; + } +} + +[TC(typeof(EXP))] +public struct CItypDependencies : IPsoSwapEnd //24 bytes, Type:0 // CItypDependencies//1515605584 itypDependencies_2 +{ + public MetaHash itypName { get; set; } //0 itypName//2890158180: INT_0Bh: 0 + public ushort manifestFlags { get; set; } //4 manifestFlags//1683136603: SHORT_0Fh: 4: 2097153 + public ushort Unused0 { get; set; } //6 + public Array_uint itypDepArray { get; set; } //8 itypDepArray//2410949350: Array: 8: 3 {256: INT_0Bh: 0} + + public override string ToString() + { + return $"{itypName}: {manifestFlags}: {itypDepArray}"; + } + public CItypDependencies SwapEnd() + { + return this with + { + itypName = new MetaHash(MetaTypes.SwapBytes(itypName.Hash)), + manifestFlags = MetaTypes.SwapBytes(manifestFlags), + itypDepArray = itypDepArray.SwapEnd(), + }; + } +} + +[TC(typeof(EXP))] +public struct CInteriorBoundsFiles : IPsoSwapEnd //24 bytes, Type:0 // Interiors +{ + public MetaHash Name { get; init; } //0 Name: INT_0Bh: 0 + public uint Unused0 { get; init; } //4 + public readonly Array_uint _Bounds; //8 Bounds: Array: 8: 1 {256: INT_0Bh: 0} + public Array_uint Bounds { get => _Bounds; init => _Bounds = value; } + + public override string ToString() => JenkIndex.GetString(Name); + public CInteriorBoundsFiles SwapEnd() + { + return this with + { + Name = new MetaHash(MetaTypes.SwapBytes(Name.Hash)), + Bounds = Bounds.SwapEnd(), + }; + } +} + + + + + + +[TC(typeof(EXP))] +public readonly struct CScenarioPointManifest : IPsoSwapEnd //56 bytes, Type:0 +{ + public readonly int _VersionNumber; + public int VersionNumber { get => _VersionNumber; init => _VersionNumber = value; } //0 VersionNumber: INT_05h: 0 + + public readonly uint _Unused0; + public uint Unused0 { get => _Unused0; init => _Unused0 = value; } //4 + + public readonly Array_StructurePointer _RegionDefs; + public Array_StructurePointer RegionDefs { get => _RegionDefs; init => _RegionDefs = value; } //8 RegionDefs: Array: 8: 1 {ARRAYINFO: Structure: 0} + + public readonly Array_StructurePointer _Groups; + public Array_StructurePointer Groups { get => _Groups; init => _Groups = value; } //24 Groups: Array: 24: 3 {ARRAYINFO: Structure: 0} + + public readonly Array_uint _InteriorNames; + public Array_uint InteriorNames { get => _InteriorNames; init => _InteriorNames = value; } //40 InteriorNames: Array: 40: 5 {ARRAYINFO: INT_0Bh: 0} + + public override readonly string ToString() => VersionNumber.ToString(); + public CScenarioPointManifest SwapEnd() + { + return this with + { + VersionNumber = MetaTypes.SwapBytes(VersionNumber), + RegionDefs = RegionDefs.SwapEnd(), + Groups = Groups.SwapEnd(), + InteriorNames = InteriorNames.SwapEnd(), + }; + } +} + +[TC(typeof(EXP))] +public readonly struct CScenarioPointRegionDef : IPsoSwapEnd //64 bytes, Type:0 +{ + public MetaHash Name { get; init; } //0 Name: INT_0Bh: 0 + public uint Unused0 { get; init; } //4 + public uint Unused1 { get; init; } //8 + public uint Unused2 { get; init; } //12 + public rage__spdAABB AABB { get; init; } //16 AABB: Structure: 16: rage__spdAABB + public uint Unused3 { get; init; } //48 + public uint Unused4 { get; init; } //52 + public uint Unused5 { get; init; } //56 + public uint Unused6 { get; init; } //60 + + public override readonly string ToString() => $"{Name}, {AABB}"; + public CScenarioPointRegionDef SwapEnd() + { + return this with + { + Name = new MetaHash(MetaTypes.SwapBytes(Name.Hash)), + AABB = AABB.SwapEnd(), + }; + } +} + +[TC(typeof(EXP))] public struct CScenarioPointGroup : IPsoSwapEnd //8 bytes, Type:0 +{ + public MetaHash Name { get; set; } //0 Name: INT_0Bh: 0 + public byte EnabledByDefault { get; set; } //4 EnabledByDefault: BYTE_00h: 4 + public byte Unused0 { get; set; } //5 + public ushort Unused1 { get; set; } //6 + + public override string ToString() => Name.ToString(); + public CScenarioPointGroup SwapEnd() + { + return this with + { + Name = new MetaHash(MetaTypes.SwapBytes(Name.Hash)), + }; } - - [TC(typeof(EXP))] public struct CImapDependency : IPsoSwapEnd //12 bytes, Type:0 // CImapDependency//3501026914 - { - public MetaHash imapName { get; set; } //0 imapName: INT_0Bh: 0 - public MetaHash itypName { get; set; } //4 itypName//2890158180: INT_0Bh: 4 - public MetaHash packFileName { get; set; } //8 packFileName//4216494073: INT_0Bh: 8 - - public override string ToString() - { - return imapName.ToString() + ", " + itypName.ToString() + ", " + packFileName.ToString(); - } - public void SwapEnd() - { - imapName = new MetaHash(MetaTypes.SwapBytes(imapName.Hash)); - itypName = new MetaHash(MetaTypes.SwapBytes(itypName.Hash)); - packFileName = new MetaHash(MetaTypes.SwapBytes(packFileName.Hash)); - } - } - - [TC(typeof(EXP))] public struct CImapDependencies : IPsoSwapEnd //24 bytes, Type:0 // CImapDependencies//3240050401 imapDependencies_2 - { - public MetaHash imapName { get; set; } //0 imapName: INT_0Bh: 0 //name hash - public ushort manifestFlags { get; set; } //4 manifestFlags//1683136603: SHORT_0Fh: 4: 2097153 - public ushort Unused0 { get; set; } //6 - public Array_uint itypDepArray { get; set; } //8 itypDepArray//2410949350: Array: 8: 3 {256: INT_0Bh: 0} //children... - - - public override string ToString() - { - return imapName.ToString() + ": " + manifestFlags.ToString() + ": " + itypDepArray.ToString(); - } - public void SwapEnd() - { - imapName = new MetaHash(MetaTypes.SwapBytes(imapName.Hash)); - manifestFlags = MetaTypes.SwapBytes(manifestFlags); - var d = itypDepArray; d.SwapEnd(); itypDepArray = d; - } - } - - [TC(typeof(EXP))] public struct CItypDependencies : IPsoSwapEnd //24 bytes, Type:0 // CItypDependencies//1515605584 itypDependencies_2 - { - public MetaHash itypName { get; set; } //0 itypName//2890158180: INT_0Bh: 0 - public ushort manifestFlags { get; set; } //4 manifestFlags//1683136603: SHORT_0Fh: 4: 2097153 - public ushort Unused0 { get; set; } //6 - public Array_uint itypDepArray { get; set; } //8 itypDepArray//2410949350: Array: 8: 3 {256: INT_0Bh: 0} - - public override string ToString() - { - return itypName.ToString() + ": " + manifestFlags.ToString() + ": " + itypDepArray.ToString(); - } - public void SwapEnd() - { - itypName = new MetaHash(MetaTypes.SwapBytes(itypName.Hash)); - manifestFlags = MetaTypes.SwapBytes(manifestFlags); - var d = itypDepArray; d.SwapEnd(); itypDepArray = d; - } - } - - [TC(typeof(EXP))] public struct CInteriorBoundsFiles : IPsoSwapEnd //24 bytes, Type:0 // Interiors - { - public MetaHash Name { get; set; } //0 Name: INT_0Bh: 0 - public uint Unused0 { get; set; } //4 - public Array_uint Bounds { get; set; } //8 Bounds: Array: 8: 1 {256: INT_0Bh: 0} - - public override string ToString() - { - return JenkIndex.GetString(Name); - } - public void SwapEnd() - { - Name = new MetaHash(MetaTypes.SwapBytes(Name.Hash)); - var b = Bounds; b.SwapEnd(); Bounds = b; - } - } - - - - - - - [TC(typeof(EXP))] public struct CScenarioPointManifest : IPsoSwapEnd //56 bytes, Type:0 - { - public int VersionNumber { get; set; } //0 VersionNumber: INT_05h: 0 - public uint Unused0 { get; set; } //4 - public Array_StructurePointer RegionDefs { get; set; } //8 RegionDefs: Array: 8: 1 {ARRAYINFO: Structure: 0} - public Array_StructurePointer Groups { get; set; } //24 Groups: Array: 24: 3 {ARRAYINFO: Structure: 0} - public Array_uint InteriorNames { get; set; } //40 InteriorNames: Array: 40: 5 {ARRAYINFO: INT_0Bh: 0} - - public override string ToString() - { - return VersionNumber.ToString(); - } - public void SwapEnd() - { - VersionNumber = MetaTypes.SwapBytes(VersionNumber); - var r = RegionDefs; r.SwapEnd(); RegionDefs = r; - var g = Groups; g.SwapEnd(); Groups = g; - var i = InteriorNames; i.SwapEnd(); InteriorNames = i; - } - } - - [TC(typeof(EXP))] public struct CScenarioPointRegionDef : IPsoSwapEnd //64 bytes, Type:0 - { - public MetaHash Name { get; set; } //0 Name: INT_0Bh: 0 - public uint Unused0 { get; set; } //4 - public uint Unused1 { get; set; } //8 - public uint Unused2 { get; set; } //12 - public rage__spdAABB AABB { get; set; } //16 AABB: Structure: 16: rage__spdAABB - public uint Unused3 { get; set; } //48 - public uint Unused4 { get; set; } //52 - public uint Unused5 { get; set; } //56 - public uint Unused6 { get; set; } //60 - - public override string ToString() - { - return Name.ToString() + ", " + AABB.ToString(); - } - public void SwapEnd() - { - Name = new MetaHash(MetaTypes.SwapBytes(Name.Hash)); - var aabb = AABB; aabb.SwapEnd(); AABB = aabb; - } - } - - [TC(typeof(EXP))] public struct CScenarioPointGroup : IPsoSwapEnd //8 bytes, Type:0 - { - public MetaHash Name { get; set; } //0 Name: INT_0Bh: 0 - public byte EnabledByDefault { get; set; } //4 EnabledByDefault: BYTE_00h: 4 - public byte Unused0 { get; set; } //5 - public ushort Unused1 { get; set; } //6 - - public override string ToString() - { - return Name.ToString(); - } - public void SwapEnd() - { - Name = new MetaHash(MetaTypes.SwapBytes(Name.Hash)); - } - } - - - - } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes/GetEnumInfo.cs b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes/GetEnumInfo.cs new file mode 100644 index 0000000..fae5f57 --- /dev/null +++ b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes/GetEnumInfo.cs @@ -0,0 +1,1453 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CodeWalker.GameFiles; +public static class PsoTypesEnumInfo +{ + public static PsoEnumInfo? GetEnumInfo(MetaName name) + { + //to generate enuminfos + return name switch + { + //vehicle mod color metallic id + (MetaName)360458334 => new PsoEnumInfo((MetaName)360458334, 1, + new PsoEnumEntryInfo(MetaName.none, -1), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_normal, 0), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_1, 1), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_2, 2), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_3, 3), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_4, 4), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_5, 5), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_6, 6), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_7, 7), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_8, 8), + new PsoEnumEntryInfo(MetaName.EVehicleModelColorMetallic_9, 9) + ), + //vehicle mod color audio color + (MetaName)544262540 => new PsoEnumInfo((MetaName)544262540, 1, + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_black, 0), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_blue, 1), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_brown, 2), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_beige, 3), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_graphite, 4), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_green, 5), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_grey, 6), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_orange, 7), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_pink, 8), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_red, 9), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_silver, 10), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_white, 11), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_COLOUR_yellow, 12) + ), + //vehicle mod color audio prefix + (MetaName)2065815796 => new PsoEnumInfo((MetaName)2065815796, 1, + new PsoEnumEntryInfo(MetaName.none, 0), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_PREFIX_bright, 1), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_PREFIX_light, 2), + new PsoEnumEntryInfo(MetaName.POLICE_SCANNER_PREFIX_dark, 3) + ), + //vehicle mod kit type + MetaName.eModKitType => new PsoEnumInfo(MetaName.eModKitType, 1, + new PsoEnumEntryInfo(MetaName.MKT_STANDARD, 0), + new PsoEnumEntryInfo(MetaName.MKT_SPORT, 1), + new PsoEnumEntryInfo(MetaName.MKT_SUV, 2), + new PsoEnumEntryInfo(MetaName.MKT_SPECIAL, 3) + ), + //vehicle mod type + MetaName.eVehicleModType => new PsoEnumInfo(MetaName.eVehicleModType, 1, + new PsoEnumEntryInfo(MetaName.VMT_SPOILER, 0), + new PsoEnumEntryInfo(MetaName.VMT_BUMPER_F, 1), + new PsoEnumEntryInfo(MetaName.VMT_BUMPER_R, 2), + new PsoEnumEntryInfo(MetaName.VMT_SKIRT, 3), + new PsoEnumEntryInfo(MetaName.VMT_EXHAUST, 4), + new PsoEnumEntryInfo(MetaName.VMT_CHASSIS, 5), + new PsoEnumEntryInfo(MetaName.VMT_GRILL, 6), + new PsoEnumEntryInfo(MetaName.VMT_BONNET, 7), + new PsoEnumEntryInfo(MetaName.VMT_WING_L, 8), + new PsoEnumEntryInfo(MetaName.VMT_WING_R, 9), + new PsoEnumEntryInfo(MetaName.VMT_ROOF, 10), + new PsoEnumEntryInfo(MetaName.VMT_PLTHOLDER, 11), + new PsoEnumEntryInfo(MetaName.VMT_PLTVANITY, 12), + new PsoEnumEntryInfo(MetaName.VMT_INTERIOR1, 13), + new PsoEnumEntryInfo(MetaName.VMT_INTERIOR2, 14), + new PsoEnumEntryInfo(MetaName.VMT_INTERIOR3, 15), + new PsoEnumEntryInfo(MetaName.VMT_INTERIOR4, 16), + new PsoEnumEntryInfo(MetaName.VMT_INTERIOR5, 17), + new PsoEnumEntryInfo(MetaName.VMT_SEATS, 18), + new PsoEnumEntryInfo(MetaName.VMT_STEERING, 19), + new PsoEnumEntryInfo(MetaName.VMT_KNOB, 20), + new PsoEnumEntryInfo(MetaName.VMT_PLAQUE, 21), + new PsoEnumEntryInfo(MetaName.VMT_ICE, 22), + new PsoEnumEntryInfo(MetaName.VMT_TRUNK, 23), + new PsoEnumEntryInfo(MetaName.VMT_HYDRO, 24), + new PsoEnumEntryInfo(MetaName.VMT_ENGINEBAY1, 25), + new PsoEnumEntryInfo(MetaName.VMT_ENGINEBAY2, 26), + new PsoEnumEntryInfo(MetaName.VMT_ENGINEBAY3, 27), + new PsoEnumEntryInfo(MetaName.VMT_CHASSIS2, 28), + new PsoEnumEntryInfo(MetaName.VMT_CHASSIS3, 29), + new PsoEnumEntryInfo(MetaName.VMT_CHASSIS4, 30), + new PsoEnumEntryInfo(MetaName.VMT_CHASSIS5, 31), + new PsoEnumEntryInfo(MetaName.VMT_DOOR_L, 32), + new PsoEnumEntryInfo(MetaName.VMT_DOOR_R, 33), + new PsoEnumEntryInfo(MetaName.VMT_LIVERY_MOD, 34), + new PsoEnumEntryInfo((MetaName)3409280882, 35), + new PsoEnumEntryInfo(MetaName.VMT_ENGINE, 36), + new PsoEnumEntryInfo(MetaName.VMT_BRAKES, 37), + new PsoEnumEntryInfo(MetaName.VMT_GEARBOX, 38), + new PsoEnumEntryInfo(MetaName.VMT_HORN, 39), + new PsoEnumEntryInfo(MetaName.VMT_SUSPENSION, 40), + new PsoEnumEntryInfo(MetaName.VMT_ARMOUR, 41), + new PsoEnumEntryInfo((MetaName)3278520444, 42), + new PsoEnumEntryInfo(MetaName.VMT_TURBO, 43), + new PsoEnumEntryInfo((MetaName)1675686396, 44), + new PsoEnumEntryInfo(MetaName.VMT_TYRE_SMOKE, 45), + new PsoEnumEntryInfo(MetaName.VMT_HYDRAULICS, 46), + new PsoEnumEntryInfo(MetaName.VMT_XENON_LIGHTS, 47), + new PsoEnumEntryInfo(MetaName.VMT_WHEELS, 48), + new PsoEnumEntryInfo(MetaName.VMT_WHEELS_REAR_OR_HYDRAULICS, 49) + ), + //vehicle mod bone + (MetaName)3635907608 => new PsoEnumInfo((MetaName)3635907608, 1, + new PsoEnumEntryInfo(MetaName.none, -1), + new PsoEnumEntryInfo(MetaName.chassis, 0), + new PsoEnumEntryInfo(MetaName.bodyshell, 48), + new PsoEnumEntryInfo(MetaName.bumper_f, 49), + new PsoEnumEntryInfo(MetaName.bumper_r, 50), + new PsoEnumEntryInfo(MetaName.wing_rf, 51), + new PsoEnumEntryInfo(MetaName.wing_lf, 52), + new PsoEnumEntryInfo(MetaName.bonnet, 53), + new PsoEnumEntryInfo(MetaName.boot, 54), + new PsoEnumEntryInfo(MetaName.exhaust, 56), + new PsoEnumEntryInfo(MetaName.exhaust_2, 57), + new PsoEnumEntryInfo(MetaName.exhaust_3, 58), + new PsoEnumEntryInfo(MetaName.exhaust_4, 59), + new PsoEnumEntryInfo(MetaName.exhaust_5, 60), + new PsoEnumEntryInfo(MetaName.exhaust_6, 61), + new PsoEnumEntryInfo(MetaName.exhaust_7, 62), + new PsoEnumEntryInfo(MetaName.exhaust_8, 63), + new PsoEnumEntryInfo(MetaName.exhaust_9, 64), + new PsoEnumEntryInfo(MetaName.exhaust_10, 65), + new PsoEnumEntryInfo(MetaName.exhaust_11, 66), + new PsoEnumEntryInfo(MetaName.exhaust_12, 67), + new PsoEnumEntryInfo(MetaName.exhaust_13, 68), + new PsoEnumEntryInfo(MetaName.exhaust_14, 69), + new PsoEnumEntryInfo(MetaName.exhaust_15, 70), + new PsoEnumEntryInfo(MetaName.exhaust_16, 71), + new PsoEnumEntryInfo(MetaName.extra_1, 401), + new PsoEnumEntryInfo(MetaName.extra_2, 402), + new PsoEnumEntryInfo(MetaName.extra_3, 403), + new PsoEnumEntryInfo(MetaName.extra_4, 404), + new PsoEnumEntryInfo(MetaName.extra_5, 405), + new PsoEnumEntryInfo(MetaName.extra_6, 406), + new PsoEnumEntryInfo(MetaName.extra_7, 407), + new PsoEnumEntryInfo(MetaName.extra_8, 408), + new PsoEnumEntryInfo(MetaName.extra_9, 409), + new PsoEnumEntryInfo(MetaName.extra_10, 410), + new PsoEnumEntryInfo(MetaName.extra_11, 411), + new PsoEnumEntryInfo(MetaName.extra_12, 412), + new PsoEnumEntryInfo(MetaName.extra_13, 413), + new PsoEnumEntryInfo(MetaName.extra_14, 414), + new PsoEnumEntryInfo(MetaName.break_extra_1, 417), + new PsoEnumEntryInfo(MetaName.break_extra_2, 418), + new PsoEnumEntryInfo(MetaName.break_extra_3, 419), + new PsoEnumEntryInfo(MetaName.break_extra_4, 420), + new PsoEnumEntryInfo(MetaName.break_extra_5, 421), + new PsoEnumEntryInfo(MetaName.break_extra_6, 422), + new PsoEnumEntryInfo(MetaName.break_extra_7, 423), + new PsoEnumEntryInfo(MetaName.break_extra_8, 424), + new PsoEnumEntryInfo(MetaName.break_extra_9, 425), + new PsoEnumEntryInfo(MetaName.break_extra_10, 426), + new PsoEnumEntryInfo(MetaName.mod_col_1, 427), + new PsoEnumEntryInfo(MetaName.mod_col_2, 428), + new PsoEnumEntryInfo(MetaName.mod_col_3, 429), + new PsoEnumEntryInfo(MetaName.mod_col_4, 430), + new PsoEnumEntryInfo(MetaName.mod_col_5, 431), + new PsoEnumEntryInfo(MetaName.mod_col_6, 432), + new PsoEnumEntryInfo(MetaName.mod_col_7, 433), + new PsoEnumEntryInfo(MetaName.mod_col_8, 434), + new PsoEnumEntryInfo(MetaName.mod_col_9, 435), + new PsoEnumEntryInfo(MetaName.mod_col_10, 436), + new PsoEnumEntryInfo(MetaName.mod_col_11, 437), + new PsoEnumEntryInfo(MetaName.mod_col_12, 438), + new PsoEnumEntryInfo(MetaName.mod_col_13, 439), + new PsoEnumEntryInfo(MetaName.mod_col_14, 440), + new PsoEnumEntryInfo(MetaName.mod_col_15, 441), + new PsoEnumEntryInfo(MetaName.mod_col_16, 442), + new PsoEnumEntryInfo(MetaName.misc_a, 369), + new PsoEnumEntryInfo(MetaName.misc_b, 370), + new PsoEnumEntryInfo(MetaName.misc_c, 371), + new PsoEnumEntryInfo(MetaName.misc_d, 372), + new PsoEnumEntryInfo(MetaName.misc_e, 373), + new PsoEnumEntryInfo(MetaName.misc_f, 374), + new PsoEnumEntryInfo(MetaName.misc_g, 375), + new PsoEnumEntryInfo(MetaName.misc_h, 376), + new PsoEnumEntryInfo(MetaName.misc_i, 377), + new PsoEnumEntryInfo(MetaName.misc_j, 378), + new PsoEnumEntryInfo(MetaName.misc_k, 379), + new PsoEnumEntryInfo(MetaName.misc_l, 380), + new PsoEnumEntryInfo(MetaName.misc_m, 381), + new PsoEnumEntryInfo(MetaName.misc_n, 382), + new PsoEnumEntryInfo(MetaName.misc_o, 383), + new PsoEnumEntryInfo(MetaName.misc_p, 384), + new PsoEnumEntryInfo(MetaName.misc_q, 385), + new PsoEnumEntryInfo(MetaName.misc_r, 386), + new PsoEnumEntryInfo(MetaName.misc_s, 387), + new PsoEnumEntryInfo(MetaName.misc_t, 388), + new PsoEnumEntryInfo(MetaName.misc_u, 389), + new PsoEnumEntryInfo(MetaName.misc_v, 390), + new PsoEnumEntryInfo(MetaName.misc_w, 391), + new PsoEnumEntryInfo(MetaName.misc_x, 392), + new PsoEnumEntryInfo(MetaName.misc_y, 393), + new PsoEnumEntryInfo(MetaName.misc_z, 394), + new PsoEnumEntryInfo(MetaName.misc_1, 395), + new PsoEnumEntryInfo(MetaName.misc_2, 396), + new PsoEnumEntryInfo(MetaName.handlebars, 79), + new PsoEnumEntryInfo(MetaName.steeringwheel, 80), + new PsoEnumEntryInfo(MetaName.swingarm, 29), + new PsoEnumEntryInfo(MetaName.forks_u, 21), + new PsoEnumEntryInfo(MetaName.forks_l, 22), + new PsoEnumEntryInfo(MetaName.headlight_l, 91), + new PsoEnumEntryInfo(MetaName.headlight_r, 92), + new PsoEnumEntryInfo(MetaName.indicator_lr, 97), + new PsoEnumEntryInfo(MetaName.indicator_lf, 95), + new PsoEnumEntryInfo(MetaName.indicator_rr, 98), + new PsoEnumEntryInfo(MetaName.indicator_rf, 96), + new PsoEnumEntryInfo(MetaName.taillight_l, 93), + new PsoEnumEntryInfo(MetaName.taillight_r, 94), + new PsoEnumEntryInfo(MetaName.window_lf, 42), + new PsoEnumEntryInfo(MetaName.window_rf, 43), + new PsoEnumEntryInfo(MetaName.window_rr, 45), + new PsoEnumEntryInfo(MetaName.window_lr, 44), + new PsoEnumEntryInfo(MetaName.window_lm, 46), + new PsoEnumEntryInfo(MetaName.window_rm, 47), + new PsoEnumEntryInfo(MetaName.hub_lf, 30), + new PsoEnumEntryInfo(MetaName.hub_rf, 31), + new PsoEnumEntryInfo(MetaName.windscreen_r, 41), + new PsoEnumEntryInfo(MetaName.neon_l, 104), + new PsoEnumEntryInfo(MetaName.neon_r, 105), + new PsoEnumEntryInfo(MetaName.neon_f, 106), + new PsoEnumEntryInfo(MetaName.neon_b, 107), + new PsoEnumEntryInfo(MetaName.door_dside_f, 3), + new PsoEnumEntryInfo(MetaName.door_dside_r, 4), + new PsoEnumEntryInfo(MetaName.door_pside_f, 5), + new PsoEnumEntryInfo(MetaName.door_pside_r, 6), + new PsoEnumEntryInfo(MetaName.bobble_head, 361), + new PsoEnumEntryInfo(MetaName.bobble_base, 362), + new PsoEnumEntryInfo(MetaName.bobble_hand, 363), + new PsoEnumEntryInfo(MetaName.engineblock, 364), + new PsoEnumEntryInfo(MetaName.mod_a, 474), + new PsoEnumEntryInfo(MetaName.mod_b, 475), + new PsoEnumEntryInfo(MetaName.mod_c, 476), + new PsoEnumEntryInfo(MetaName.mod_d, 477), + new PsoEnumEntryInfo(MetaName.mod_e, 478), + new PsoEnumEntryInfo(MetaName.mod_f, 479), + new PsoEnumEntryInfo(MetaName.mod_g, 480), + new PsoEnumEntryInfo(MetaName.mod_h, 481), + new PsoEnumEntryInfo(MetaName.mod_i, 482), + new PsoEnumEntryInfo(MetaName.mod_j, 483), + new PsoEnumEntryInfo(MetaName.mod_k, 484), + new PsoEnumEntryInfo(MetaName.mod_l, 485), + new PsoEnumEntryInfo(MetaName.mod_m, 486), + new PsoEnumEntryInfo(MetaName.mod_n, 487), + new PsoEnumEntryInfo(MetaName.mod_o, 488), + new PsoEnumEntryInfo(MetaName.mod_p, 489), + new PsoEnumEntryInfo(MetaName.mod_q, 490), + new PsoEnumEntryInfo(MetaName.mod_r, 491), + new PsoEnumEntryInfo(MetaName.mod_s, 492), + new PsoEnumEntryInfo(MetaName.mod_t, 493), + new PsoEnumEntryInfo(MetaName.mod_u, 494), + new PsoEnumEntryInfo(MetaName.mod_v, 495), + new PsoEnumEntryInfo(MetaName.mod_w, 496), + new PsoEnumEntryInfo(MetaName.mod_x, 497), + new PsoEnumEntryInfo(MetaName.mod_y, 498), + new PsoEnumEntryInfo(MetaName.mod_z, 499), + new PsoEnumEntryInfo(MetaName.mod_aa, 500), + new PsoEnumEntryInfo(MetaName.mod_ab, 501), + new PsoEnumEntryInfo(MetaName.mod_ac, 502), + new PsoEnumEntryInfo(MetaName.mod_ad, 503), + new PsoEnumEntryInfo(MetaName.mod_ae, 504), + new PsoEnumEntryInfo(MetaName.mod_af, 505), + new PsoEnumEntryInfo(MetaName.mod_ag, 506), + new PsoEnumEntryInfo(MetaName.mod_ah, 507), + new PsoEnumEntryInfo(MetaName.mod_ai, 508), + new PsoEnumEntryInfo(MetaName.mod_aj, 509), + new PsoEnumEntryInfo(MetaName.mod_ak, 510), + new PsoEnumEntryInfo(MetaName.turret_a1, 511), + new PsoEnumEntryInfo(MetaName.turret_a2, 512), + new PsoEnumEntryInfo(MetaName.turret_a3, 513), + new PsoEnumEntryInfo(MetaName.turret_a4, 514), + new PsoEnumEntryInfo(MetaName.turret_b1, 524), + new PsoEnumEntryInfo(MetaName.turret_b2, 525), + new PsoEnumEntryInfo(MetaName.turret_b3, 526), + new PsoEnumEntryInfo(MetaName.turret_b4, 527), + new PsoEnumEntryInfo(MetaName.rblade_1mod, 560), + new PsoEnumEntryInfo(MetaName.rblade_1fast, 561), + new PsoEnumEntryInfo(MetaName.rblade_2mod, 562), + new PsoEnumEntryInfo(MetaName.rblade_2fast, 563), + new PsoEnumEntryInfo(MetaName.rblade_3mod, 564), + new PsoEnumEntryInfo(MetaName.rblade_3fast, 565), + new PsoEnumEntryInfo(MetaName.fblade_1mod, 566), + new PsoEnumEntryInfo(MetaName.fblade_1fast, 567), + new PsoEnumEntryInfo(MetaName.fblade_2mod, 568), + new PsoEnumEntryInfo(MetaName.fblade_2fast, 569), + new PsoEnumEntryInfo(MetaName.fblade_3mod, 570), + new PsoEnumEntryInfo(MetaName.fblade_3fast, 571), + new PsoEnumEntryInfo((MetaName)1086719913, 572), + new PsoEnumEntryInfo((MetaName)3237490897, 573), + new PsoEnumEntryInfo((MetaName)3375838140, 574), + new PsoEnumEntryInfo((MetaName)2381840182, 575), + new PsoEnumEntryInfo((MetaName)3607058940, 576), + new PsoEnumEntryInfo((MetaName)3607058940, 577), + new PsoEnumEntryInfo((MetaName)1208798824, 578), + new PsoEnumEntryInfo((MetaName)303656220, 579), + new PsoEnumEntryInfo((MetaName)660207018, 580), + new PsoEnumEntryInfo(MetaName.spike_1mod, 581), + new PsoEnumEntryInfo((MetaName)3045655218, 582), + new PsoEnumEntryInfo((MetaName)2017296145, 583), + new PsoEnumEntryInfo(MetaName.spike_2mod, 584), + new PsoEnumEntryInfo((MetaName)1122332083, 585), + new PsoEnumEntryInfo((MetaName)1123212214, 586), + new PsoEnumEntryInfo(MetaName.spike_3mod, 587), + new PsoEnumEntryInfo((MetaName)4011591561, 588), + new PsoEnumEntryInfo((MetaName)2320654166, 589), + new PsoEnumEntryInfo(MetaName.scoop_1mod, 590), + new PsoEnumEntryInfo(MetaName.scoop_2mod, 591), + new PsoEnumEntryInfo(MetaName.scoop_3mod, 592) + ), + //vehicle mod camera position + MetaName.eVehicleModCameraPos => new PsoEnumInfo(MetaName.eVehicleModCameraPos, 1, + new PsoEnumEntryInfo(MetaName.VMCP_DEFAULT, 0), + new PsoEnumEntryInfo(MetaName.VMCP_FRONT, 1), + new PsoEnumEntryInfo(MetaName.VMCP_FRONT_LEFT, 2), + new PsoEnumEntryInfo(MetaName.VMCP_FRONT_RIGHT, 3), + new PsoEnumEntryInfo(MetaName.VMCP_REAR, 4), + new PsoEnumEntryInfo(MetaName.VMCP_REAR_LEFT, 5), + new PsoEnumEntryInfo(MetaName.VMCP_REAR_RIGHT, 6), + new PsoEnumEntryInfo(MetaName.VMCP_LEFT, 7), + new PsoEnumEntryInfo(MetaName.VMCP_RIGHT, 8), + new PsoEnumEntryInfo(MetaName.VMCP_TOP, 9), + new PsoEnumEntryInfo(MetaName.VMCP_BOTTOM, 10) + ), + //credit item job line type + (MetaName)1795685103 => new PsoEnumInfo((MetaName)1795685103, 1, + new PsoEnumEntryInfo(MetaName.JOB_BIG, 0), + new PsoEnumEntryInfo(MetaName.JOB_MED, 1), + new PsoEnumEntryInfo(MetaName.JOB_SMALL, 2), + new PsoEnumEntryInfo(MetaName.NAME_BIG, 3), + new PsoEnumEntryInfo(MetaName.NAME_MED, 4), + new PsoEnumEntryInfo(MetaName.NAME_SMALL, 5), + new PsoEnumEntryInfo(MetaName.SPACE_BIG, 6), + new PsoEnumEntryInfo(MetaName.SPACE_MED, 7), + new PsoEnumEntryInfo(MetaName.SPACE_SMALL, 8), + new PsoEnumEntryInfo(MetaName.SPACE_END, 9), + new PsoEnumEntryInfo(MetaName.SPRITE_1, 10), + new PsoEnumEntryInfo(MetaName.LEGALS, 11), + new PsoEnumEntryInfo(MetaName.AUDIO_NAME, 12), + new PsoEnumEntryInfo(MetaName.AUDIO_LEGALS, 13), + new PsoEnumEntryInfo(MetaName.JOB_AND_NAME_MED, 14) + ), + MetaName.DataFileType => new PsoEnumInfo(MetaName.DataFileType, 1, + new PsoEnumEntryInfo(MetaName.RPF_FILE, 0), + new PsoEnumEntryInfo(MetaName.IDE_FILE, 1), + new PsoEnumEntryInfo(MetaName.DELAYED_IDE_FILE, 2), + new PsoEnumEntryInfo(MetaName.IPL_FILE, 3), + new PsoEnumEntryInfo(MetaName.PERMANENT_ITYP_FILE, 4), + new PsoEnumEntryInfo((MetaName)4175147664, 5), + new PsoEnumEntryInfo(MetaName.HANDLING_FILE, 6), + new PsoEnumEntryInfo(MetaName.VEHICLEEXTRAS_FILE, 7), + new PsoEnumEntryInfo(MetaName.CHINESE_SHUFFLING_CHECKS_FILE, 8), + new PsoEnumEntryInfo(MetaName.PEDSTREAM_FILE, 9), + new PsoEnumEntryInfo(MetaName.CARCOLS_FILE, 10), + new PsoEnumEntryInfo(MetaName.POPGRP_FILE, 11), + new PsoEnumEntryInfo((MetaName)337231870, 12), + new PsoEnumEntryInfo((MetaName)3783701680, 13), + new PsoEnumEntryInfo(MetaName.POPSCHED_FILE, 14), + new PsoEnumEntryInfo(MetaName.ZONEBIND_FILE, 15), + new PsoEnumEntryInfo(MetaName.RADIO_FILE, 16), + new PsoEnumEntryInfo(MetaName.EXTRAMAP_CONVERSION_OCC_FILE, 17), + new PsoEnumEntryInfo(MetaName.THROWNWEAPONINFO_FILE, 18), + new PsoEnumEntryInfo(MetaName.RMPTFX_FILE, 19), + new PsoEnumEntryInfo(MetaName.PED_PERSONALITY_FILE, 20), + new PsoEnumEntryInfo(MetaName.PED_PERCEPTION_FILE, 21), + new PsoEnumEntryInfo(MetaName.VEHICLE_CAMERA_OFFSETS_FILE, 22), + new PsoEnumEntryInfo(MetaName.FRONTEND_MENU_FILE, 23), + new PsoEnumEntryInfo(MetaName.LEADERBOARD_DATA_FILE, 24), + new PsoEnumEntryInfo(MetaName.LEADERBOARD_ICONS_FILE, 25), + new PsoEnumEntryInfo(MetaName.NETWORKOPTIONS_FILE, 26), + new PsoEnumEntryInfo(MetaName.TIMECYCLE_FILE, 27), + new PsoEnumEntryInfo(MetaName.TIMECYCLEMOD_FILE, 28), + new PsoEnumEntryInfo(MetaName.WEATHER_FILE, 29), + new PsoEnumEntryInfo((MetaName)2403189033, 30), + new PsoEnumEntryInfo((MetaName)2431127142, 31), + new PsoEnumEntryInfo(MetaName.PROCOBJ_FILE, 32), + new PsoEnumEntryInfo(MetaName.PROC_META_FILE, 33), + new PsoEnumEntryInfo(MetaName.VFX_SETTINGS_FILE, 34), + new PsoEnumEntryInfo(MetaName.SP_STATS_DISPLAY_LIST_FILE, 35), + new PsoEnumEntryInfo(MetaName.MP_STATS_DISPLAY_LIST_FILE, 36), + new PsoEnumEntryInfo(MetaName.PED_VARS_FILE, 37), + new PsoEnumEntryInfo(MetaName.DISABLE_FILE, 38), + new PsoEnumEntryInfo(MetaName.BUILDING_META_DISPLACEMENT_FILE, 39), + new PsoEnumEntryInfo(MetaName.HUD_TXD_FILE, 40), + new PsoEnumEntryInfo(MetaName.FRONTEND_DAT_FILE, 41), + new PsoEnumEntryInfo(MetaName.SCROLLBARS_FILE, 42), + new PsoEnumEntryInfo(MetaName.TIME_FILE, 43), + new PsoEnumEntryInfo(MetaName.BLOODFX_FILE, 44), + new PsoEnumEntryInfo(MetaName.ENTITYFX_FILE, 45), + new PsoEnumEntryInfo(MetaName.EXPLOSIONFX_FILE, 46), + new PsoEnumEntryInfo(MetaName.MATERIALFX_FILE, 47), + new PsoEnumEntryInfo(MetaName.MOTION_TASK_DATA_FILE, 48), + new PsoEnumEntryInfo(MetaName.DEFAULT_TASK_DATA_FILE, 49), + new PsoEnumEntryInfo(MetaName.MOUNT_TUNE_FILE, 50), + new PsoEnumEntryInfo(MetaName.PED_BOUNDS_FILE, 51), + new PsoEnumEntryInfo(MetaName.PED_HEALTH_FILE, 52), + new PsoEnumEntryInfo(MetaName.PED_COMPONENT_SETS_FILE, 53), + new PsoEnumEntryInfo(MetaName.PED_IK_SETTINGS_FILE, 54), + new PsoEnumEntryInfo(MetaName.PED_TASK_DATA_FILE, 55), + new PsoEnumEntryInfo(MetaName.PED_SPECIAL_ABILITIES_FILE, 56), + new PsoEnumEntryInfo(MetaName.WHEELFX_FILE, 57), + new PsoEnumEntryInfo(MetaName.WEAPONFX_FILE, 58), + new PsoEnumEntryInfo(MetaName.DECALS_FILE, 59), + new PsoEnumEntryInfo(MetaName.NAVMESH_INDEXREMAPPING_FILE, 60), + new PsoEnumEntryInfo(MetaName.NAVNODE_INDEXREMAPPING_FILE, 61), + new PsoEnumEntryInfo(MetaName.AUDIOMESH_INDEXREMAPPING_FILE, 62), + new PsoEnumEntryInfo(MetaName.JUNCTION_TEMPLATES_FILE, 63), + new PsoEnumEntryInfo(MetaName.PATH_ZONES_FILE, 64), + new PsoEnumEntryInfo(MetaName.DISTANT_LIGHTS_FILE, 65), + new PsoEnumEntryInfo(MetaName.DISTANT_LIGHTS_HD_FILE, 66), + new PsoEnumEntryInfo(MetaName.FLIGHTZONES_FILE, 67), + new PsoEnumEntryInfo(MetaName.WATER_FILE, 68), + new PsoEnumEntryInfo(MetaName.TRAINCONFIGS_FILE, 69), + new PsoEnumEntryInfo(MetaName.TRAINTRACK_FILE, 70), + new PsoEnumEntryInfo(MetaName.PED_METADATA_FILE, 71), + new PsoEnumEntryInfo(MetaName.WEAPON_METADATA_FILE, 72), + new PsoEnumEntryInfo(MetaName.VEHICLE_METADATA_FILE, 73), + new PsoEnumEntryInfo(MetaName.DISPATCH_DATA_FILE, 74), + new PsoEnumEntryInfo(MetaName.DEFORMABLE_OBJECTS_FILE, 75), + new PsoEnumEntryInfo(MetaName.TUNABLE_OBJECTS_FILE, 76), + new PsoEnumEntryInfo(MetaName.PED_NAV_CAPABILITES_FILE, 77), + new PsoEnumEntryInfo(MetaName.WEAPONINFO_FILE, 78), + new PsoEnumEntryInfo(MetaName.WEAPONCOMPONENTSINFO_FILE, 79), + new PsoEnumEntryInfo(MetaName.LOADOUTS_FILE, 80), + new PsoEnumEntryInfo(MetaName.FIRINGPATTERNS_FILE, 81), + new PsoEnumEntryInfo(MetaName.MOTIVATIONS_FILE, 82), + new PsoEnumEntryInfo(MetaName.SCENARIO_POINTS_FILE, 83), + new PsoEnumEntryInfo(MetaName.SCENARIO_POINTS_PSO_FILE, 84), + new PsoEnumEntryInfo(MetaName.STREAMING_FILE, 85), + new PsoEnumEntryInfo(MetaName.STREAMING_FILE_PLATFORM_PS3, 86), + new PsoEnumEntryInfo(MetaName.STREAMING_FILE_PLATFORM_XENON, 87), + new PsoEnumEntryInfo(MetaName.STREAMING_FILE_PLATFORM_OTHER, 88), + new PsoEnumEntryInfo(MetaName.PED_BRAWLING_STYLE_FILE, 89), + new PsoEnumEntryInfo(MetaName.AMBIENT_PED_MODEL_SET_FILE, 90), + new PsoEnumEntryInfo(MetaName.AMBIENT_PROP_MODEL_SET_FILE, 91), + new PsoEnumEntryInfo(MetaName.AMBIENT_VEHICLE_MODEL_SET_FILE, 92), + new PsoEnumEntryInfo(MetaName.LADDER_METADATA_FILE, 93), + new PsoEnumEntryInfo((MetaName)4108615940, 94), + new PsoEnumEntryInfo(MetaName.SLOWNESS_ZONES_FILE, 95), + new PsoEnumEntryInfo(MetaName.LIQUIDFX_FILE, 96), + new PsoEnumEntryInfo(MetaName.VFXVEHICLEINFO_FILE, 97), + new PsoEnumEntryInfo(MetaName.VFXPEDINFO_FILE, 98), + new PsoEnumEntryInfo(MetaName.DOOR_TUNING_FILE, 99), + new PsoEnumEntryInfo(MetaName.PTFXASSETINFO_FILE, 100), + new PsoEnumEntryInfo(MetaName.SCRIPTFX_FILE, 101), + new PsoEnumEntryInfo(MetaName.VFXREGIONINFO_FILE, 102), + new PsoEnumEntryInfo(MetaName.VFXINTERIORINFO_FILE, 103), + new PsoEnumEntryInfo(MetaName.CAMERA_METADATA_FILE, 104), + new PsoEnumEntryInfo(MetaName.STREET_VEHICLE_ASSOCIATION_FILE, 105), + new PsoEnumEntryInfo(MetaName.VFXWEAPONINFO_FILE, 106), + new PsoEnumEntryInfo(MetaName.EXPLOSION_INFO_FILE, 107), + new PsoEnumEntryInfo(MetaName.JUNCTION_TEMPLATES_PSO_FILE, 108), + new PsoEnumEntryInfo(MetaName.MAPZONES_FILE, 109), + new PsoEnumEntryInfo(MetaName.SP_STATS_UI_LIST_FILE, 110), + new PsoEnumEntryInfo(MetaName.MP_STATS_UI_LIST_FILE, 111), + new PsoEnumEntryInfo(MetaName.OBJ_COVER_TUNING_FILE, 112), + new PsoEnumEntryInfo(MetaName.STREAMING_REQUEST_LISTS_FILE, 113), + new PsoEnumEntryInfo(MetaName.PLAYER_CARD_SETUP, 114), + new PsoEnumEntryInfo(MetaName.WORLD_HEIGHTMAP_FILE, 115), + new PsoEnumEntryInfo(MetaName.WORLD_WATERHEIGHT_FILE, 116), + new PsoEnumEntryInfo(MetaName.PED_OVERLAY_FILE, 117), + new PsoEnumEntryInfo(MetaName.WEAPON_ANIMATIONS_FILE, 118), + new PsoEnumEntryInfo(MetaName.VEHICLE_POPULATION_FILE, 119), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_DEFINITIONS, 120), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_RESULTS, 121), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_IMPULSES, 122), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_RUMBLES, 123), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_INTERRELATIONS, 124), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_HOMINGS, 125), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_DAMAGES, 126), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_STRIKE_BONES, 127), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_BRANCHES, 128), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_STEALTH_KILLS, 129), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_VFX, 130), + new PsoEnumEntryInfo(MetaName.ACTION_TABLE_FACIAL_ANIM_SETS, 131), + new PsoEnumEntryInfo(MetaName.VEHGEN_MARKUP_FILE, 132), + new PsoEnumEntryInfo(MetaName.PED_COMPONENT_CLOTH_FILE, 133), + new PsoEnumEntryInfo(MetaName.TATTOO_SHOP_DLC_FILE, 134), + new PsoEnumEntryInfo(MetaName.VEHICLE_VARIATION_FILE, 135), + new PsoEnumEntryInfo(MetaName.CONTENT_UNLOCKING_META_FILE, 136), + new PsoEnumEntryInfo(MetaName.SHOP_PED_APPAREL_META_FILE, 137), + new PsoEnumEntryInfo(MetaName.AUDIO_SOUNDDATA, 138), + new PsoEnumEntryInfo(MetaName.AUDIO_CURVEDATA, 139), + new PsoEnumEntryInfo(MetaName.AUDIO_GAMEDATA, 140), + new PsoEnumEntryInfo(MetaName.AUDIO_DYNAMIXDATA, 141), + new PsoEnumEntryInfo(MetaName.AUDIO_SPEECHDATA, 142), + new PsoEnumEntryInfo(MetaName.AUDIO_SYNTHDATA, 143), + new PsoEnumEntryInfo(MetaName.AUDIO_WAVEPACK, 144), + new PsoEnumEntryInfo(MetaName.CLIP_SETS_FILE, 145), + new PsoEnumEntryInfo(MetaName.EXPRESSION_SETS_FILE, 146), + new PsoEnumEntryInfo(MetaName.FACIAL_CLIPSET_GROUPS_FILE, 147), + new PsoEnumEntryInfo((MetaName)1603688191, 148), + new PsoEnumEntryInfo(MetaName.VEHICLE_SHOP_DLC_FILE, 149), + new PsoEnumEntryInfo(MetaName.WEAPON_SHOP_INFO_METADATA_FILE, 150), + new PsoEnumEntryInfo(MetaName.SCALEFORM_PREALLOC_FILE, 151), + new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE, 152), + new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_360, 153), + new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_PS3, 154), + new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_PS3_JPN, 155), + new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_ORBIS, 156), + new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_ORBIS_JPN, 157), + new PsoEnumEntryInfo(MetaName.CONTROLLER_LABELS_FILE_DURANGO, 158), + new PsoEnumEntryInfo((MetaName)25671749, 159), + new PsoEnumEntryInfo(MetaName.TEXTFILE_METAFILE, 160), + new PsoEnumEntryInfo(MetaName.NM_TUNING_FILE, 161), + new PsoEnumEntryInfo(MetaName.MOVE_NETWORK_DEFS, 162), + new PsoEnumEntryInfo(MetaName.WEAPONINFO_FILE_PATCH, 163), + new PsoEnumEntryInfo(MetaName.DLC_SCRIPT_METAFILE, 164), + new PsoEnumEntryInfo(MetaName.VEHICLE_LAYOUTS_FILE, 165), + new PsoEnumEntryInfo(MetaName.DLC_WEAPON_PICKUPS, 166), + new PsoEnumEntryInfo(MetaName.EXTRA_TITLE_UPDATE_DATA, 167), + new PsoEnumEntryInfo(MetaName.SCALEFORM_DLC_FILE, 168), + new PsoEnumEntryInfo(MetaName.OVERLAY_INFO_FILE, 169), + new PsoEnumEntryInfo(MetaName.ALTERNATE_VARIATIONS_FILE, 170), + new PsoEnumEntryInfo(MetaName.HORSE_REINS_FILE, 171), + new PsoEnumEntryInfo(MetaName.FIREFX_FILE, 172), + new PsoEnumEntryInfo(MetaName.INTERIOR_PROXY_ORDER_FILE, 173), + new PsoEnumEntryInfo(MetaName.DLC_ITYP_REQUEST, 174), + new PsoEnumEntryInfo(MetaName.EXTRA_FOLDER_MOUNT_DATA, 175), + new PsoEnumEntryInfo(MetaName.AMB_PROCEDURAL_BLOOD_FILE, 176), + new PsoEnumEntryInfo(MetaName.SCRIPT_BRAIN_FILE, 177), + new PsoEnumEntryInfo(MetaName.SCALEFORM_VALID_METHODS_FILE, 178), + new PsoEnumEntryInfo(MetaName.DLC_POP_GROUPS, 179), + new PsoEnumEntryInfo((MetaName)2145817864, 180), + new PsoEnumEntryInfo(MetaName.SCENARIO_INFO_FILE, 181), + new PsoEnumEntryInfo(MetaName.CONDITIONAL_ANIMS_FILE, 182), + new PsoEnumEntryInfo(MetaName.STATS_METADATA_PSO_FILE, 183), + new PsoEnumEntryInfo(MetaName.VFXFOGVOLUMEINFO_FILE, 184), + new PsoEnumEntryInfo(MetaName.RPF_FILE_PRE_INSTALL, 185), + new PsoEnumEntryInfo((MetaName)341493400, 186), + new PsoEnumEntryInfo(MetaName.LEVEL_STREAMING_FILE, 187), + new PsoEnumEntryInfo(MetaName.SCENARIO_POINTS_OVERRIDE_FILE, 188), + new PsoEnumEntryInfo((MetaName)2800880346, 189), + new PsoEnumEntryInfo(MetaName.DRIVER_RULES_STD_FILE, 190), + new PsoEnumEntryInfo(MetaName.PED_FIRST_PERSON_ASSET_DATA, 191), + new PsoEnumEntryInfo(MetaName.GTXD_PARENTING_DATA, 192), + new PsoEnumEntryInfo(MetaName.COMBAT_BEHAVIOUR_OVERRIDE_FILE, 193), + new PsoEnumEntryInfo(MetaName.EVENTS_OVERRIDE_FILE, 194), + new PsoEnumEntryInfo(MetaName.PED_DAMAGE_OVERRIDE_FILE, 195), + new PsoEnumEntryInfo(MetaName.PED_DAMAGE_APPEND_FILE, 196), + new PsoEnumEntryInfo(MetaName.BACKGROUND_SCRIPT_FILE, 197), + new PsoEnumEntryInfo(MetaName.PS3_SCRIPT_RPF, 198), + new PsoEnumEntryInfo(MetaName.X360_SCRIPT_RPF, 199), + new PsoEnumEntryInfo(MetaName.PED_FIRST_PERSON_ALTERNATE_DATA, 200) + ), + MetaName.DataFileContents => new PsoEnumInfo(MetaName.DataFileContents, 1, + new PsoEnumEntryInfo(MetaName.CONTENTS_DEFAULT, 0), + new PsoEnumEntryInfo(MetaName.CONTENTS_PROPS, 1), + new PsoEnumEntryInfo(MetaName.CONTENTS_MAP, 2), + new PsoEnumEntryInfo(MetaName.CONTENTS_LODS, 3), + new PsoEnumEntryInfo(MetaName.CONTENTS_PEDS, 4), + new PsoEnumEntryInfo(MetaName.CONTENTS_VEHICLES, 5), + new PsoEnumEntryInfo(MetaName.CONTENTS_ANIMATION, 6), + new PsoEnumEntryInfo(MetaName.CONTENTS_CUTSCENE, 7), + new PsoEnumEntryInfo(MetaName.CONTENTS_DLC_MAP_DATA, 8), + new PsoEnumEntryInfo(MetaName.CONTENTS_DEBUG_ONLY, 9), + new PsoEnumEntryInfo(MetaName.CONTENTS_MAX, 10) + ), + MetaName.InstallPartition => new PsoEnumInfo(MetaName.InstallPartition, 1, + new PsoEnumEntryInfo(MetaName.PARTITION_NONE, -1), + new PsoEnumEntryInfo(MetaName.PARTITION_0, 0), + new PsoEnumEntryInfo(MetaName.PARTITION_1, 1), + new PsoEnumEntryInfo(MetaName.PARTITION_2, 2), + new PsoEnumEntryInfo(MetaName.PARTITION_MAX, 3) + ), + MetaName.ePedRadioGenre => new PsoEnumInfo(MetaName.ePedRadioGenre, 1, + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_OFF, 0), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_MODERN_ROCK, 1), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_CLASSIC_ROCK, 2), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_POP, 3), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_MODERN_HIPHOP, 4), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_CLASSIC_HIPHOP, 5), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_PUNK, 6), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_LEFT_WING_TALK, 7), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_RIGHT_WING_TALK, 8), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_COUNTRY, 9), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_DANCE, 10), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_MEXICAN, 11), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_REGGAE, 12), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_JAZZ, 13), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_MOTOWN, 14), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_SURF, 15), + new PsoEnumEntryInfo(MetaName.RADIO_GENRE_UNSPECIFIED, 16) + ), + MetaName.eSexinessFlags => new PsoEnumInfo(MetaName.eSexinessFlags, 1, + new PsoEnumEntryInfo(MetaName.SF_JEER_AT_HOT_PED, 0), + new PsoEnumEntryInfo((MetaName)296569367, 1), + new PsoEnumEntryInfo(MetaName.SF_HOT_PERSON, 2) + ), + MetaName.eExternallyDrivenDOFs => new PsoEnumInfo(MetaName.eExternallyDrivenDOFs, 1, + new PsoEnumEntryInfo(MetaName.EMPTY, 0), + new PsoEnumEntryInfo(MetaName.HIGH_HEELS, 1), + new PsoEnumEntryInfo(MetaName.COLLAR, 2) + ), + //CPedModelInfo__InitData AbilityType + MetaName.SpecialAbilityType => new PsoEnumInfo(MetaName.SpecialAbilityType, 1, + new PsoEnumEntryInfo(MetaName.SAT_NONE, -1), + new PsoEnumEntryInfo(MetaName.SAT_CAR_SLOWDOWN, 0), + new PsoEnumEntryInfo(MetaName.SAT_RAGE, 1), + new PsoEnumEntryInfo(MetaName.SAT_BULLET_TIME, 2), + new PsoEnumEntryInfo(MetaName.SAT_SNAPSHOT, 3), + new PsoEnumEntryInfo(MetaName.SAT_INSULT, 4) + ), + MetaName.ThermalBehaviour => new PsoEnumInfo(MetaName.ThermalBehaviour, 1, + new PsoEnumEntryInfo(MetaName.TB_DEAD, 0), + new PsoEnumEntryInfo(MetaName.TB_COLD, 1), + new PsoEnumEntryInfo(MetaName.TB_WARM, 2), + new PsoEnumEntryInfo(MetaName.TB_HOT, 3) + ), + MetaName.eSuperlodType => new PsoEnumInfo(MetaName.eSuperlodType, 1, + new PsoEnumEntryInfo(MetaName.SLOD_HUMAN, 0), + new PsoEnumEntryInfo(MetaName.SLOD_SMALL_QUADPED, 1), + new PsoEnumEntryInfo(MetaName.SLOD_LARGE_QUADPED, 2), + new PsoEnumEntryInfo(MetaName.SLOD_NULL, 3), + new PsoEnumEntryInfo(MetaName.SLOD_KEEP_LOWEST, 4) + ), + //CPedModelInfo__InitData ScenarioPopStreamingSlot + MetaName.eScenarioPopStreamingSlot => new PsoEnumInfo(MetaName.eScenarioPopStreamingSlot, 1, + new PsoEnumEntryInfo(MetaName.SCENARIO_POP_STREAMING_NORMAL, 0), + new PsoEnumEntryInfo(MetaName.SCENARIO_POP_STREAMING_SMALL, 1) + ), + //CPedModelInfo__InitData DefaultSpawningPreference + MetaName.DefaultSpawnPreference => new PsoEnumInfo(MetaName.DefaultSpawnPreference, 1, + new PsoEnumEntryInfo(MetaName.DSP_AERIAL, 0), + new PsoEnumEntryInfo(MetaName.DSP_AQUATIC, 1), + new PsoEnumEntryInfo(MetaName.DSP_GROUND_WILDLIFE, 2), + new PsoEnumEntryInfo(MetaName.DSP_NORMAL, 3) + ), + MetaName.eFadeCurveType => new PsoEnumInfo(MetaName.eFadeCurveType, 1, + new PsoEnumEntryInfo(MetaName.FCT_NONE, 0), + new PsoEnumEntryInfo(MetaName.FCT_LINEAR, 1), + new PsoEnumEntryInfo(MetaName.FCT_HALF_SIGMOID, 2), + new PsoEnumEntryInfo(MetaName.FCT_SIGMOID, 3) + ), + //animation clip flags + MetaName.eAnimPlayerFlag => new PsoEnumInfo(MetaName.eAnimPlayerFlag, 1, + new PsoEnumEntryInfo(MetaName.APF_USE_SECONDARY_SLOT, 0), + new PsoEnumEntryInfo((MetaName)892548521, 1), + new PsoEnumEntryInfo(MetaName.APF_UNUSED_3, 2), + new PsoEnumEntryInfo(MetaName.APF_UNUSED_4, 3), + new PsoEnumEntryInfo(MetaName.APF_ISPLAYING, 4), + new PsoEnumEntryInfo(MetaName.APF_ISLOOPED, 5), + new PsoEnumEntryInfo((MetaName)2715402776, 6), + new PsoEnumEntryInfo((MetaName)2559750026, 7), + new PsoEnumEntryInfo((MetaName)334669388, 8), + new PsoEnumEntryInfo(MetaName.APF_SCRIPT, 9), + new PsoEnumEntryInfo(MetaName.APF_UNUSED_6, 10), + new PsoEnumEntryInfo(MetaName.APF_UNUSED_7, 11), + new PsoEnumEntryInfo(MetaName.APF_UNUSED_8, 12), + new PsoEnumEntryInfo((MetaName)3730225937, 13), + new PsoEnumEntryInfo(MetaName.APF_ISBLENDAUTOREMOVE, 14), + new PsoEnumEntryInfo(MetaName.APF_ISFINISHAUTOREMOVE, 15), + new PsoEnumEntryInfo((MetaName)1984129772, 16), + new PsoEnumEntryInfo(MetaName.APF_ADDITIVE, 17), + new PsoEnumEntryInfo(MetaName.APF_FACIAL, 18), + new PsoEnumEntryInfo((MetaName)1964664646, 19), + new PsoEnumEntryInfo((MetaName)46138343, 20), + new PsoEnumEntryInfo(MetaName.APF_UPPERBODYONLY, 21), + new PsoEnumEntryInfo((MetaName)28056044, 22), + new PsoEnumEntryInfo((MetaName)2237335835, 23), + new PsoEnumEntryInfo((MetaName)1604795828, 24), + new PsoEnumEntryInfo((MetaName)1772376494, 25), + new PsoEnumEntryInfo(MetaName.APF_BLOCK_IK, 26), + new PsoEnumEntryInfo((MetaName)2310486390, 27), + new PsoEnumEntryInfo(MetaName.APF_BLOCK_HEAD_IK, 28), + new PsoEnumEntryInfo((MetaName)98009864, 29), + new PsoEnumEntryInfo(MetaName.APF_UNUSED_9, 30), + new PsoEnumEntryInfo((MetaName)3765996064, 31) + ), + //animation clip priority + MetaName.eAnimPriority => new PsoEnumInfo(MetaName.eAnimPriority, 1, + new PsoEnumEntryInfo(MetaName.AP_LOW, 0), + new PsoEnumEntryInfo(MetaName.AP_MEDIUM, 1), + new PsoEnumEntryInfo(MetaName.AP_HIGH, 2), + new PsoEnumEntryInfo(MetaName.AP_FACE_LOW, 3), + new PsoEnumEntryInfo(MetaName.AP_FACE_MEDIUM, 4), + new PsoEnumEntryInfo(MetaName.AP_FACE_HIGH, 5) + ), + //anim clip dictionary streaming policy + MetaName.eStreamingPolicy => new PsoEnumInfo(MetaName.eStreamingPolicy, 1, + new PsoEnumEntryInfo(MetaName.SP_STREAMING, 0), + new PsoEnumEntryInfo(MetaName.SP_SINGLEPLAYER_RESIDENT, 1), + new PsoEnumEntryInfo(MetaName.SP_MULTIPLAYER_RESIDENT, 2) + ), + //anim clip dictionary streaming priority + MetaName.eStreamingPriority => new PsoEnumInfo(MetaName.eStreamingPriority, 1, + new PsoEnumEntryInfo(MetaName.SP_Variation, 0), + new PsoEnumEntryInfo(MetaName.SP_Low, 1), + new PsoEnumEntryInfo(MetaName.SP_Medium, 2), + new PsoEnumEntryInfo(MetaName.SP_High, 3) + ), + (MetaName)2476021071 => new PsoEnumInfo((MetaName)2476021071, 1, + new PsoEnumEntryInfo(MetaName.POSTFX_IN_HOLD_OUT, 0), + new PsoEnumEntryInfo(MetaName.POSTFX_EASE_IN_HOLD_EASE_OUT, 1), + new PsoEnumEntryInfo(MetaName.POSTFX_EASE_IN, 2), + new PsoEnumEntryInfo(MetaName.POSTFX_EASE_OUT, 3) + ), + (MetaName)3696221852 => new PsoEnumInfo((MetaName)3696221852, 1, + new PsoEnumEntryInfo(MetaName.POSTFX_LOOP_ALL, 0), + new PsoEnumEntryInfo(MetaName.POSTFX_LOOP_HOLD_ONLY, 1), + new PsoEnumEntryInfo(MetaName.POSTFX_LOOP_NONE, 2) + ), + (MetaName)2168155209 => new PsoEnumInfo((MetaName)2168155209, 1, + new PsoEnumEntryInfo((MetaName)133697287, -1), + new PsoEnumEntryInfo((MetaName)3954742285, 0), + new PsoEnumEntryInfo((MetaName)201802975, 1), + new PsoEnumEntryInfo((MetaName)1916954442, 2), + new PsoEnumEntryInfo((MetaName)507840474, 3), + new PsoEnumEntryInfo((MetaName)1919284445, 4), + new PsoEnumEntryInfo((MetaName)4132752489, 5), + new PsoEnumEntryInfo((MetaName)499113587, 6) + ), + (MetaName)3261591327 => new PsoEnumInfo((MetaName)3261591327, 1, + new PsoEnumEntryInfo((MetaName)2736859683, 0), + new PsoEnumEntryInfo((MetaName)856837195, 1), + new PsoEnumEntryInfo((MetaName)1505659915, 2), + new PsoEnumEntryInfo((MetaName)2834501937, 3), + new PsoEnumEntryInfo((MetaName)373586892, 4) + ), + (MetaName)516897642 => new PsoEnumInfo((MetaName)516897642, 1, + new PsoEnumEntryInfo((MetaName)165337364, 0), + new PsoEnumEntryInfo((MetaName)385965901, 1), + new PsoEnumEntryInfo((MetaName)3779370608, 2) + ), + (MetaName)2665868448 => new PsoEnumInfo((MetaName)2665868448, 1, + new PsoEnumEntryInfo((MetaName)2470279016, 0), + new PsoEnumEntryInfo((MetaName)2411291289, 1), + new PsoEnumEntryInfo((MetaName)2103152910, 2), + new PsoEnumEntryInfo((MetaName)3535879124, 3), + new PsoEnumEntryInfo((MetaName)3456440271, 4) + ), + (MetaName)2628996780 => new PsoEnumInfo((MetaName)2628996780, 1, + new PsoEnumEntryInfo((MetaName)3708927680, 0), + new PsoEnumEntryInfo((MetaName)2136499167, 1), + new PsoEnumEntryInfo((MetaName)3568072118, 2) + ), + MetaName.eAnimBoneTag => new PsoEnumInfo(MetaName.eAnimBoneTag, 1, + new PsoEnumEntryInfo(MetaName.BONETAG_INVALID, -1), + new PsoEnumEntryInfo(MetaName.BONETAG_ROOT, 0), + new PsoEnumEntryInfo((MetaName)1724691876, 17916), + new PsoEnumEntryInfo(MetaName.BONETAG_PELVIS, 11816), + new PsoEnumEntryInfo(MetaName.BONETAG_PELVIS1, 53251), + new PsoEnumEntryInfo(MetaName.BONETAG_SPINE_ROOT, 57597), + new PsoEnumEntryInfo(MetaName.BONETAG_SPINE0, 23553), + new PsoEnumEntryInfo(MetaName.BONETAG_SPINE1, 24816), + new PsoEnumEntryInfo(MetaName.BONETAG_SPINE2, 24817), + new PsoEnumEntryInfo(MetaName.BONETAG_SPINE3, 24818), + new PsoEnumEntryInfo(MetaName.BONETAG_NECK, 39317), + new PsoEnumEntryInfo(MetaName.BONETAG_NECK2, 24532), + new PsoEnumEntryInfo(MetaName.BONETAG_HEAD, 31086), + new PsoEnumEntryInfo(MetaName.BONETAG_R_CLAVICLE, 10706), + new PsoEnumEntryInfo(MetaName.BONETAG_R_UPPERARM, 40269), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FOREARM, 28252), + new PsoEnumEntryInfo(MetaName.BONETAG_R_HAND, 57005), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER0, 58866), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER01, 64016), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER02, 64017), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER1, 58867), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER11, 64096), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER12, 64097), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER2, 58868), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER21, 64112), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER22, 64113), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER3, 58869), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER31, 64064), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER32, 64065), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER4, 58870), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER41, 64080), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FINGER42, 64081), + new PsoEnumEntryInfo(MetaName.BONETAG_L_CLAVICLE, 64729), + new PsoEnumEntryInfo(MetaName.BONETAG_L_UPPERARM, 45509), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FOREARM, 61163), + new PsoEnumEntryInfo(MetaName.BONETAG_L_HAND, 18905), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER0, 26610), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER01, 4089), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER02, 4090), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER1, 26611), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER11, 4169), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER12, 4170), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER2, 26612), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER21, 4185), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER22, 4186), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER3, 26613), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER31, 4137), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER32, 4138), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER4, 26614), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER41, 4153), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FINGER42, 4154), + new PsoEnumEntryInfo(MetaName.BONETAG_L_THIGH, 58271), + new PsoEnumEntryInfo(MetaName.BONETAG_L_CALF, 63931), + new PsoEnumEntryInfo(MetaName.BONETAG_L_FOOT, 14201), + new PsoEnumEntryInfo(MetaName.BONETAG_L_TOE, 2108), + new PsoEnumEntryInfo(MetaName.BONETAG_L_TOE1, 7531), + new PsoEnumEntryInfo(MetaName.BONETAG_R_THIGH, 51826), + new PsoEnumEntryInfo(MetaName.BONETAG_R_CALF, 36864), + new PsoEnumEntryInfo(MetaName.BONETAG_R_FOOT, 52301), + new PsoEnumEntryInfo(MetaName.BONETAG_R_TOE, 20781), + new PsoEnumEntryInfo(MetaName.BONETAG_R_TOE1, 45631), + new PsoEnumEntryInfo((MetaName)1914315501, 35731), + new PsoEnumEntryInfo((MetaName)1648548119, 5232), + new PsoEnumEntryInfo((MetaName)533252846, 37119), + new PsoEnumEntryInfo((MetaName)2013152691, 61007), + new PsoEnumEntryInfo((MetaName)1274264606, 43810), + new PsoEnumEntryInfo((MetaName)2720329662, 23639), + new PsoEnumEntryInfo((MetaName)2841566254, 6442), + new PsoEnumEntryInfo(MetaName.BONETAG_L_PH_HAND, 60309), + new PsoEnumEntryInfo(MetaName.BONETAG_R_PH_HAND, 28422), + new PsoEnumEntryInfo((MetaName)3721004313, 41922), + new PsoEnumEntryInfo((MetaName)1646663439, 18212), + new PsoEnumEntryInfo((MetaName)2650851428, 33399), + new PsoEnumEntryInfo((MetaName)4289658079, 38180), + new PsoEnumEntryInfo((MetaName)2379061275, 39126), + new PsoEnumEntryInfo((MetaName)176026430, 39638), + new PsoEnumEntryInfo((MetaName)3870648046, 36029), + new PsoEnumEntryInfo((MetaName)3398180204, 6286), + new PsoEnumEntryInfo(MetaName.BONETAG_TAIL0, 838), + new PsoEnumEntryInfo(MetaName.BONETAG_TAIL1, 839), + new PsoEnumEntryInfo(MetaName.BONETAG_TAIL2, 840), + new PsoEnumEntryInfo(MetaName.BONETAG_TAIL3, 841), + new PsoEnumEntryInfo(MetaName.BONETAG_TAIL4, 842), + new PsoEnumEntryInfo(MetaName.BONETAG_TAIL5, 843), + new PsoEnumEntryInfo((MetaName)1109140959, 30992), + new PsoEnumEntryInfo((MetaName)803570034, 30993), + new PsoEnumEntryInfo((MetaName)631663860, 30994), + new PsoEnumEntryInfo((MetaName)322488345, 30995), + new PsoEnumEntryInfo((MetaName)5907036, 30996), + new PsoEnumEntryInfo((MetaName)4136373952, 30997), + new PsoEnumEntryInfo((MetaName)2411152202, 6986), + new PsoEnumEntryInfo((MetaName)2717247431, 6987), + new PsoEnumEntryInfo((MetaName)1883898992, 6988), + new PsoEnumEntryInfo((MetaName)601675397, 16351), + new PsoEnumEntryInfo((MetaName)62423933, 1805), + new PsoEnumEntryInfo((MetaName)2641889475, 39905), + new PsoEnumEntryInfo((MetaName)1949780854, 5956), + new PsoEnumEntryInfo((MetaName)3296017019, 6468), + new PsoEnumEntryInfo((MetaName)1556908436, 25260), + new PsoEnumEntryInfo((MetaName)3030868822, 27474), + new PsoEnumEntryInfo((MetaName)3452992357, 56604), + new PsoEnumEntryInfo((MetaName)3473614855, 12844), + new PsoEnumEntryInfo((MetaName)633057706, 57717), + new PsoEnumEntryInfo((MetaName)3570968304, 24806), + new PsoEnumEntryInfo((MetaName)2034893792, 65245), + new PsoEnumEntryInfo((MetaName)974447640, 35502), + new PsoEnumEntryInfo((MetaName)2263842006, 15570), + new PsoEnumEntryInfo((MetaName)1882359409, 28462), + new PsoEnumEntryInfo((MetaName)2421563540, 13201), + new PsoEnumEntryInfo((MetaName)2644806883, 48472), + new PsoEnumEntryInfo((MetaName)4089752637, 5930), + new PsoEnumEntryInfo((MetaName)1473028002, 44297), + new PsoEnumEntryInfo((MetaName)1823061586, 47158), + new PsoEnumEntryInfo((MetaName)3875905388, 19729), + new PsoEnumEntryInfo((MetaName)2560977519, 43885), + new PsoEnumEntryInfo((MetaName)4050972607, 2359), + new PsoEnumEntryInfo((MetaName)1028261740, 2449), + new PsoEnumEntryInfo((MetaName)3159424443, 19336), + new PsoEnumEntryInfo((MetaName)1939403075, 64744), + new PsoEnumEntryInfo((MetaName)1097108699, 64745), + new PsoEnumEntryInfo((MetaName)428522884, 64746), + new PsoEnumEntryInfo((MetaName)3131540134, 56194), + new PsoEnumEntryInfo((MetaName)1217317825, 45733), + new PsoEnumEntryInfo((MetaName)4198936370, 45734), + new PsoEnumEntryInfo((MetaName)1977853546, 45735), + new PsoEnumEntryInfo((MetaName)2601253047, 48389), + new PsoEnumEntryInfo((MetaName)2181973692, 48390), + new PsoEnumEntryInfo((MetaName)3140860170, 48391), + new PsoEnumEntryInfo((MetaName)455142432, 30929), + new PsoEnumEntryInfo((MetaName)3803060301, 33869), + new PsoEnumEntryInfo((MetaName)746815866, 4126) + ), + MetaName.eVfxGroup => new PsoEnumInfo(MetaName.eVfxGroup, 1, + new PsoEnumEntryInfo(MetaName.VFXGROUP_UNDEFINED, -1), + new PsoEnumEntryInfo(MetaName.VFXGROUP_VOID, 0), + new PsoEnumEntryInfo(MetaName.VFXGROUP_GENERIC, 1), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CONCRETE, 2), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CONCRETE_DUSTY, 3), + new PsoEnumEntryInfo(MetaName.VFXGROUP_TARMAC, 4), + new PsoEnumEntryInfo(MetaName.VFXGROUP_TARMAC_BRITTLE, 5), + new PsoEnumEntryInfo(MetaName.VFXGROUP_STONE, 6), + new PsoEnumEntryInfo(MetaName.VFXGROUP_BRICK, 7), + new PsoEnumEntryInfo(MetaName.VFXGROUP_MARBLE, 8), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PAVING, 9), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SANDSTONE, 10), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SANDSTONE_BRITTLE, 11), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_LOOSE, 12), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_COMPACT, 13), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_WET, 14), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_UNDERWATER, 15), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_DEEP, 16), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SAND_WET_DEEP, 17), + new PsoEnumEntryInfo(MetaName.VFXGROUP_ICE, 18), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SNOW_LOOSE, 19), + new PsoEnumEntryInfo(MetaName.VFXGROUP_SNOW_COMPACT, 20), + new PsoEnumEntryInfo(MetaName.VFXGROUP_GRAVEL, 21), + new PsoEnumEntryInfo(MetaName.VFXGROUP_GRAVEL_DEEP, 22), + new PsoEnumEntryInfo(MetaName.VFXGROUP_DIRT_DRY, 23), + new PsoEnumEntryInfo(MetaName.VFXGROUP_MUD_SOFT, 24), + new PsoEnumEntryInfo(MetaName.VFXGROUP_MUD_DEEP, 25), + new PsoEnumEntryInfo(MetaName.VFXGROUP_MUD_UNDERWATER, 26), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CLAY, 27), + new PsoEnumEntryInfo(MetaName.VFXGROUP_GRASS, 28), + new PsoEnumEntryInfo(MetaName.VFXGROUP_GRASS_SHORT, 29), + new PsoEnumEntryInfo(MetaName.VFXGROUP_HAY, 30), + new PsoEnumEntryInfo(MetaName.VFXGROUP_BUSHES, 31), + new PsoEnumEntryInfo(MetaName.VFXGROUP_TREE_BARK, 32), + new PsoEnumEntryInfo(MetaName.VFXGROUP_LEAVES, 33), + new PsoEnumEntryInfo(MetaName.VFXGROUP_METAL, 34), + new PsoEnumEntryInfo(MetaName.VFXGROUP_WOOD, 35), + new PsoEnumEntryInfo(MetaName.VFXGROUP_WOOD_DUSTY, 36), + new PsoEnumEntryInfo(MetaName.VFXGROUP_WOOD_SPLINTER, 37), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CERAMIC, 38), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CARPET_FABRIC, 39), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CARPET_FABRIC_DUSTY, 40), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PLASTIC, 41), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PLASTIC_HOLLOW, 42), + new PsoEnumEntryInfo(MetaName.VFXGROUP_RUBBER, 43), + new PsoEnumEntryInfo(MetaName.VFXGROUP_LINOLEUM, 44), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PLASTER_BRITTLE, 45), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CARDBOARD, 46), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PAPER, 47), + new PsoEnumEntryInfo(MetaName.VFXGROUP_FOAM, 48), + new PsoEnumEntryInfo(MetaName.VFXGROUP_FEATHERS, 49), + new PsoEnumEntryInfo(MetaName.VFXGROUP_TVSCREEN, 50), + new PsoEnumEntryInfo(MetaName.VFXGROUP_GLASS, 51), + new PsoEnumEntryInfo(MetaName.VFXGROUP_GLASS_BULLETPROOF, 52), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CAR_METAL, 53), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CAR_PLASTIC, 54), + new PsoEnumEntryInfo(MetaName.VFXGROUP_CAR_GLASS, 55), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PUDDLE, 56), + new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_WATER, 57), + new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_BLOOD, 58), + new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_OIL, 59), + new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_PETROL, 60), + new PsoEnumEntryInfo(MetaName.VFXGROUP_LIQUID_MUD, 61), + new PsoEnumEntryInfo(MetaName.VFXGROUP_FRESH_MEAT, 62), + new PsoEnumEntryInfo(MetaName.VFXGROUP_DRIED_MEAT, 63), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_HEAD, 64), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_TORSO, 65), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_LIMB, 66), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_FOOT, 67), + new PsoEnumEntryInfo(MetaName.VFXGROUP_PED_CAPSULE, 68) + ), + (MetaName)726948528 => new PsoEnumInfo((MetaName)726948528, 1, + new PsoEnumEntryInfo((MetaName)2375349691, 0), + new PsoEnumEntryInfo((MetaName)978806254, 1), + new PsoEnumEntryInfo((MetaName)345174417, 2), + new PsoEnumEntryInfo((MetaName)2719994633, 3), + new PsoEnumEntryInfo((MetaName)1055203807, 4) + ), + (MetaName)1599521754 => new PsoEnumInfo((MetaName)1599521754, 1, + new PsoEnumEntryInfo((MetaName)1546538473, 0) + ), + (MetaName)956281369 => new PsoEnumInfo((MetaName)956281369, 1, + new PsoEnumEntryInfo(MetaName.PROCOBJ_ALIGN_OBJ, 0), + new PsoEnumEntryInfo(MetaName.PROCOBJ_USE_GRID, 1), + new PsoEnumEntryInfo(MetaName.PROCOBJ_USE_SEED, 2), + new PsoEnumEntryInfo(MetaName.PROCOBJ_IS_FLOATING, 3), + new PsoEnumEntryInfo(MetaName.PROCOBJ_CAST_SHADOW, 4), + new PsoEnumEntryInfo(MetaName.PROCOBJ_NETWORK_GAME, 5) + ), + (MetaName)1247137385 => new PsoEnumInfo((MetaName)1247137385, 1, + new PsoEnumEntryInfo(MetaName.PROCPLANT_LOD0, 0), + new PsoEnumEntryInfo(MetaName.PROCPLANT_LOD1, 1), + new PsoEnumEntryInfo(MetaName.PROCPLANT_LOD2, 2), + new PsoEnumEntryInfo(MetaName.PROCPLANT_FURGRASS, 3), + new PsoEnumEntryInfo(MetaName.PROCPLANT_CAMERADONOTCULL, 4), + new PsoEnumEntryInfo(MetaName.PROCPLANT_UNDERWATER, 5), + new PsoEnumEntryInfo(MetaName.PROCPLANT_GROUNDSCALE1VERT, 6), + new PsoEnumEntryInfo(MetaName.PROCPLANT_NOGROUNDSKEW_LOD0, 7), + new PsoEnumEntryInfo(MetaName.PROCPLANT_NOGROUNDSKEW_LOD1, 8), + new PsoEnumEntryInfo(MetaName.PROCPLANT_NOGROUNDSKEW_LOD2, 9), + new PsoEnumEntryInfo(MetaName.PROCPLANT_NOSHADOW, 10) + ), + (MetaName)2782414211 => new PsoEnumInfo((MetaName)2782414211, 1, + new PsoEnumEntryInfo((MetaName)3117886768, 0), + new PsoEnumEntryInfo((MetaName)361913441, 1), + new PsoEnumEntryInfo((MetaName)1673907105, 2) + ), + (MetaName)3404480226 => new PsoEnumInfo((MetaName)3404480226, 1, + new PsoEnumEntryInfo((MetaName)643717225, 0), + new PsoEnumEntryInfo((MetaName)1755526414, 1), + new PsoEnumEntryInfo(MetaName.CVA_WHEEL_REAR_LEFT, 2), + new PsoEnumEntryInfo((MetaName)1950121897, 3), + new PsoEnumEntryInfo((MetaName)2065407336, 4), + new PsoEnumEntryInfo((MetaName)1249738073, 5), + new PsoEnumEntryInfo((MetaName)3037431481, 6), + new PsoEnumEntryInfo((MetaName)2009750623, 7), + new PsoEnumEntryInfo((MetaName)3659952659, 8), + new PsoEnumEntryInfo((MetaName)4024787971, 9), + new PsoEnumEntryInfo((MetaName)4081041159, 10), + new PsoEnumEntryInfo((MetaName)3123586287, 11), + new PsoEnumEntryInfo((MetaName)1678048274, 12), + new PsoEnumEntryInfo((MetaName)1275607205, 13), + new PsoEnumEntryInfo(MetaName.DEVINS_SNOWLIGHT, 14), + new PsoEnumEntryInfo((MetaName)2276229539, 15), + new PsoEnumEntryInfo((MetaName)493733281, 16), + new PsoEnumEntryInfo((MetaName)1037540057, 17), + new PsoEnumEntryInfo((MetaName)1162901510, 18), + new PsoEnumEntryInfo((MetaName)739467989, 19), + new PsoEnumEntryInfo((MetaName)677568593, 20), + new PsoEnumEntryInfo((MetaName)1739703625, 21), + new PsoEnumEntryInfo((MetaName)2932239149, 22), + new PsoEnumEntryInfo((MetaName)1612186711, 23), + new PsoEnumEntryInfo((MetaName)629489585, 24), + new PsoEnumEntryInfo((MetaName)3531030925, 25), + new PsoEnumEntryInfo((MetaName)1769219469, 26), + new PsoEnumEntryInfo((MetaName)1816463715, 27), + new PsoEnumEntryInfo((MetaName)3449512558, 28) + ), + (MetaName)2136742399 => new PsoEnumInfo((MetaName)2136742399, 1, + new PsoEnumEntryInfo(MetaName.LOOK_FORWARD_RELATIVE_TO_ATTACH, 0), + new PsoEnumEntryInfo((MetaName)4067031256, 1), + new PsoEnumEntryInfo((MetaName)3668340720, 2) + ), + (MetaName)513957198 => new PsoEnumInfo((MetaName)513957198, 1, + new PsoEnumEntryInfo(MetaName.ON_FOOT, 0), + new PsoEnumEntryInfo(MetaName.IN_VEHICLE, 1), + new PsoEnumEntryInfo(MetaName.ON_BIKE, 2), + new PsoEnumEntryInfo(MetaName.IN_BOAT, 3), + new PsoEnumEntryInfo(MetaName.IN_AIRCRAFT, 4), + new PsoEnumEntryInfo(MetaName.IN_SUBMARINE, 5), + new PsoEnumEntryInfo(MetaName.IN_HELI, 6), + new PsoEnumEntryInfo(MetaName.IN_TURRET, 7) + ), + (MetaName)2703064232 => new PsoEnumInfo((MetaName)2703064232, 1, + new PsoEnumEntryInfo(MetaName.THIRD_PERSON_NEAR, 0), + new PsoEnumEntryInfo(MetaName.THIRD_PERSON_MEDIUM, 1), + new PsoEnumEntryInfo(MetaName.THIRD_PERSON_FAR, 2), + new PsoEnumEntryInfo(MetaName.CINEMATIC, 3), + new PsoEnumEntryInfo(MetaName.FIRST_PERSON, 4) + ), + MetaName.eCurveType => new PsoEnumInfo(MetaName.eCurveType, 1, + new PsoEnumEntryInfo((MetaName)3099024980, 0), + new PsoEnumEntryInfo((MetaName)3810146036, 1), + new PsoEnumEntryInfo((MetaName)1812191173, 2), + new PsoEnumEntryInfo((MetaName)2081939217, 3), + new PsoEnumEntryInfo((MetaName)2879490434, 4), + new PsoEnumEntryInfo((MetaName)3899422166, 5), + new PsoEnumEntryInfo((MetaName)4202435238, 6), + new PsoEnumEntryInfo((MetaName)1924959165, 7), + new PsoEnumEntryInfo((MetaName)2394366735, 8), + new PsoEnumEntryInfo((MetaName)2691765069, 9), + new PsoEnumEntryInfo((MetaName)3782218410, 10), + new PsoEnumEntryInfo((MetaName)1054471073, 11), + new PsoEnumEntryInfo((MetaName)3232508014, 12), + new PsoEnumEntryInfo((MetaName)3268408636, 13), + new PsoEnumEntryInfo((MetaName)156483360, 14), + new PsoEnumEntryInfo((MetaName)610568483, 15), + new PsoEnumEntryInfo((MetaName)1031574247, 16), + new PsoEnumEntryInfo((MetaName)1817346630, 17), + new PsoEnumEntryInfo((MetaName)3038768594, 18), + new PsoEnumEntryInfo((MetaName)3433776656, 19), + new PsoEnumEntryInfo((MetaName)3224106151, 20), + new PsoEnumEntryInfo((MetaName)3781585750, 21), + new PsoEnumEntryInfo((MetaName)728471947, 22), + new PsoEnumEntryInfo((MetaName)2868857018, 23), + new PsoEnumEntryInfo((MetaName)3394937778, 24), + new PsoEnumEntryInfo((MetaName)1572642455, 25), + new PsoEnumEntryInfo((MetaName)4148234847, 26) + ), + (MetaName)4206293824 => new PsoEnumInfo((MetaName)4206293824, 1, + new PsoEnumEntryInfo((MetaName)3090781844, 0), + new PsoEnumEntryInfo((MetaName)714439506, 1), + new PsoEnumEntryInfo((MetaName)3541453901, 2), + new PsoEnumEntryInfo((MetaName)3420181340, 3), + new PsoEnumEntryInfo((MetaName)3785293538, 4), + new PsoEnumEntryInfo((MetaName)2987466695, 5), + new PsoEnumEntryInfo((MetaName)2089898957, 6), + new PsoEnumEntryInfo((MetaName)776877896, 7), + new PsoEnumEntryInfo((MetaName)1192126664, 8), + new PsoEnumEntryInfo((MetaName)1989206149, 9), + new PsoEnumEntryInfo((MetaName)2132778492, 10), + new PsoEnumEntryInfo((MetaName)1459749185, 11), + new PsoEnumEntryInfo((MetaName)769806680, 12), + new PsoEnumEntryInfo((MetaName)344800761, 13), + new PsoEnumEntryInfo((MetaName)2607259232, 14) + ), + (MetaName)902027429 => new PsoEnumInfo((MetaName)902027429, 1, + new PsoEnumEntryInfo((MetaName)1166188847, 0), + new PsoEnumEntryInfo((MetaName)899750670, 1) + ), + (MetaName)3529626013 => new PsoEnumInfo((MetaName)3529626013, 1, + new PsoEnumEntryInfo(MetaName.CAR, 0), + new PsoEnumEntryInfo(MetaName.PLANE, 1), + new PsoEnumEntryInfo(MetaName.TRAILER, 2), + new PsoEnumEntryInfo(MetaName.QUADBIKE, 3), + new PsoEnumEntryInfo(MetaName.HELI, 4), + new PsoEnumEntryInfo(MetaName.AUTOGYRO, 5), + new PsoEnumEntryInfo(MetaName.BIKE, 6), + new PsoEnumEntryInfo(MetaName.BICYCLE, 7), + new PsoEnumEntryInfo(MetaName.BOAT, 8), + new PsoEnumEntryInfo(MetaName.TRAIN, 9), + new PsoEnumEntryInfo(MetaName.SUBMARINE, 10), + new PsoEnumEntryInfo(MetaName.ALL, 11) + ), + (MetaName)3889593720 => new PsoEnumInfo((MetaName)3889593720, 1, + new PsoEnumEntryInfo((MetaName)2388118614, 0), + new PsoEnumEntryInfo((MetaName)1309321028, 1), + new PsoEnumEntryInfo((MetaName)2409045263, 2), + new PsoEnumEntryInfo((MetaName)1405307635, 3), + new PsoEnumEntryInfo((MetaName)3183067451, 4) + ), + (MetaName)2675594832 => new PsoEnumInfo((MetaName)2675594832, 1, + new PsoEnumEntryInfo(MetaName.AF_CAN_DIVE, 0), + new PsoEnumEntryInfo((MetaName)665056449, 1), + new PsoEnumEntryInfo((MetaName)1838090773, 2), + new PsoEnumEntryInfo((MetaName)1429252732, 3), + new PsoEnumEntryInfo((MetaName)335156894, 4), + new PsoEnumEntryInfo((MetaName)1995789406, 5), + new PsoEnumEntryInfo((MetaName)301163182, 6), + new PsoEnumEntryInfo((MetaName)2727636155, 7), + new PsoEnumEntryInfo((MetaName)2154274359, 8), + new PsoEnumEntryInfo((MetaName)3233981661, 9), + new PsoEnumEntryInfo((MetaName)3036600251, 10) + ), + (MetaName)2920442291 => new PsoEnumInfo((MetaName)2920442291, 1, + new PsoEnumEntryInfo(MetaName.PED_DRIVES_POOR_CAR, 0), + new PsoEnumEntryInfo(MetaName.PED_DRIVES_AVERAGE_CAR, 1), + new PsoEnumEntryInfo(MetaName.PED_DRIVES_RICH_CAR, 2), + new PsoEnumEntryInfo(MetaName.PED_DRIVES_BIG_CAR, 3), + new PsoEnumEntryInfo(MetaName.PED_DRIVES_MOTORCYCLE, 4), + new PsoEnumEntryInfo(MetaName.PED_DRIVES_BOAT, 5) + ), + MetaName.Affluence => new PsoEnumInfo(MetaName.Affluence, 1, + new PsoEnumEntryInfo(MetaName.AFF_POOR, 0), + new PsoEnumEntryInfo(MetaName.AFF_AVERAGE, 1), + new PsoEnumEntryInfo(MetaName.AFF_RICH, 2) + ), + MetaName.TechSavvy => new PsoEnumInfo(MetaName.TechSavvy, 1, + new PsoEnumEntryInfo(MetaName.TS_LOW, 0), + new PsoEnumEntryInfo(MetaName.TS_HIGH, 1) + ), + (MetaName)3079935216 => new PsoEnumInfo((MetaName)3079935216, 1, + new PsoEnumEntryInfo(MetaName.BF_INTERVENE_ON_MELEE_ACTION, 0), + new PsoEnumEntryInfo(MetaName.BF_DONT_RUN_ON_MELEE_ATTACK, 1), + new PsoEnumEntryInfo(MetaName.BF_WATCH_ON_CAR_STOLEN, 2), + new PsoEnumEntryInfo(MetaName.BF_INTIMIDATE_PLAYER, 3), + new PsoEnumEntryInfo(MetaName.BF_GET_PISSED_WHEN_HIT_BY_CAR, 4), + new PsoEnumEntryInfo((MetaName)2870992946, 5), + new PsoEnumEntryInfo(MetaName.BF_DONT_SAY_PANIC_ON_FLEE, 6), + new PsoEnumEntryInfo(MetaName.BF_REACT_ON_COMBAT, 7), + new PsoEnumEntryInfo(MetaName.BF_PLAY_CAR_HORN, 8), + new PsoEnumEntryInfo(MetaName.BF_ARGUMENTATIVE, 9), + new PsoEnumEntryInfo(MetaName.BF_CONFRONTATIONAL, 10), + new PsoEnumEntryInfo(MetaName.BF_LIMIT_COMBATANTS, 11), + new PsoEnumEntryInfo(MetaName.BF_PURSUE_WHEN_HIT_BY_CAR, 12), + new PsoEnumEntryInfo(MetaName.BF_COWARDLY_FOR_SHOCKING_EVENTS, 13), + new PsoEnumEntryInfo(MetaName.BF_BOOST_BRAVERY_IN_GROUP, 14), + new PsoEnumEntryInfo(MetaName.BF_CAN_ACCELERATE_IN_CAR, 15), + new PsoEnumEntryInfo(MetaName.BF_CAN_GET_OUT_WHEN_HIT_BY_CAR, 16), + new PsoEnumEntryInfo(MetaName.BF_AGGRESSIVE_AFTER_RUNNING_PED_OVER, 17), + new PsoEnumEntryInfo(MetaName.BF_CAN_FLEE_WHEN_HIT_BY_CAR, 18), + new PsoEnumEntryInfo(MetaName.BF_ALLOW_CONFRONT_FOR_TERRITORY_REACTIONS, 19), + new PsoEnumEntryInfo(MetaName.BF_DONT_FORCE_FLEE_COMBAT, 20) + ), + (MetaName)1639628591 => new PsoEnumInfo((MetaName)1639628591, 1, + new PsoEnumEntryInfo(MetaName.CF_JACKING, 0), + new PsoEnumEntryInfo(MetaName.CF_ALLOWED_COP_PURSUIT, 1) + ), + (MetaName)1559228487 => new PsoEnumInfo((MetaName)1559228487, 1, + new PsoEnumEntryInfo(MetaName.AF_Low, 0), + new PsoEnumEntryInfo(MetaName.AF_EnterLeft, 1), + new PsoEnumEntryInfo(MetaName.AF_FaceLeft, 2), + new PsoEnumEntryInfo(MetaName.AF_AtEdge, 3), + new PsoEnumEntryInfo(MetaName.AF_ToLow, 4), + new PsoEnumEntryInfo(MetaName.AF_AimDirect, 5), + new PsoEnumEntryInfo(MetaName.AF_Center, 6), + new PsoEnumEntryInfo(MetaName.AF_ToPeek, 7), + new PsoEnumEntryInfo(MetaName.AF_Scope, 8) + ), + (MetaName)966624441 => new PsoEnumInfo((MetaName)966624441, 1, + new PsoEnumEntryInfo(MetaName.OnlyUseForReactions, 0), + new PsoEnumEntryInfo(MetaName.CanUseForReactions, 1), + new PsoEnumEntryInfo(MetaName.Urgent, 2), + new PsoEnumEntryInfo(MetaName.OnlyUseForLawEnforcementPeds, 3), + new PsoEnumEntryInfo(MetaName.OnlyUseForGangPeds, 4) + ), + MetaName.LookIkTurnRate => new PsoEnumInfo(MetaName.LookIkTurnRate, 1, + new PsoEnumEntryInfo(MetaName.LOOKIK_TURN_RATE_SLOW, 0), + new PsoEnumEntryInfo(MetaName.LOOKIK_TURN_RATE_NORMAL, 1), + new PsoEnumEntryInfo(MetaName.LOOKIK_TURN_RATE_FAST, 2) + ), + MetaName.LookIkBlendRate => new PsoEnumInfo(MetaName.LookIkBlendRate, 1, + new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_SLOWEST, 0), + new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_SLOW, 1), + new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_NORMAL, 2), + new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_FAST, 3), + new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_FASTEST, 4), + new PsoEnumEntryInfo(MetaName.LOOKIK_BLEND_RATE_INSTANT, 5) + ), + MetaName.LookIkRotationLimit => new PsoEnumInfo(MetaName.LookIkRotationLimit, 1, + new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_OFF, 0), + new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_NARROWEST, 1), + new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_NARROW, 2), + new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_WIDE, 3), + new PsoEnumEntryInfo(MetaName.LOOKIK_ROT_LIM_WIDEST, 4) + ), + (MetaName)4002001992 => new PsoEnumInfo((MetaName)4002001992, 1, + new PsoEnumEntryInfo((MetaName)4238595643, 0) + ), + MetaName.AmbientEventType => new PsoEnumInfo(MetaName.AmbientEventType, 1, + new PsoEnumEntryInfo((MetaName)1637555008, 0), + new PsoEnumEntryInfo(MetaName.AET_Interesting, 1), + new PsoEnumEntryInfo(MetaName.AET_Threatening, 2), + new PsoEnumEntryInfo(MetaName.AET_Threatened, 3), + new PsoEnumEntryInfo(MetaName.AET_In_Place, 4), + new PsoEnumEntryInfo(MetaName.AET_Directed_In_Place, 5), + new PsoEnumEntryInfo(MetaName.AET_Flinch, 6) + ), + (MetaName)1049598006 => new PsoEnumInfo((MetaName)1049598006, 1, + new PsoEnumEntryInfo((MetaName)1600411487, 0), + new PsoEnumEntryInfo((MetaName)3999177563, 1), + new PsoEnumEntryInfo((MetaName)3250863043, 2) + ), + MetaName.ePedVarComp => new PsoEnumInfo(MetaName.ePedVarComp, 1, + new PsoEnumEntryInfo(MetaName.PV_COMP_INVALID, -1), + new PsoEnumEntryInfo(MetaName.PV_COMP_HEAD, 0), + new PsoEnumEntryInfo(MetaName.PV_COMP_BERD, 1), + new PsoEnumEntryInfo(MetaName.PV_COMP_HAIR, 2), + new PsoEnumEntryInfo(MetaName.PV_COMP_UPPR, 3), + new PsoEnumEntryInfo(MetaName.PV_COMP_LOWR, 4), + new PsoEnumEntryInfo(MetaName.PV_COMP_HAND, 5), + new PsoEnumEntryInfo(MetaName.PV_COMP_FEET, 6), + new PsoEnumEntryInfo(MetaName.PV_COMP_TEEF, 7), + new PsoEnumEntryInfo(MetaName.PV_COMP_ACCS, 8), + new PsoEnumEntryInfo(MetaName.PV_COMP_TASK, 9), + new PsoEnumEntryInfo(MetaName.PV_COMP_DECL, 10), + new PsoEnumEntryInfo(MetaName.PV_COMP_JBIB, 11), + new PsoEnumEntryInfo(MetaName.PV_COMP_MAX, 12) + ), + (MetaName)3509057257 => new PsoEnumInfo((MetaName)3509057257, 1, + new PsoEnumEntryInfo(MetaName.RAGDOLL_BUTTOCKS, 0), + new PsoEnumEntryInfo(MetaName.RAGDOLL_THIGH_LEFT, 1), + new PsoEnumEntryInfo(MetaName.RAGDOLL_SHIN_LEFT, 2), + new PsoEnumEntryInfo(MetaName.RAGDOLL_FOOT_LEFT, 3), + new PsoEnumEntryInfo(MetaName.RAGDOLL_THIGH_RIGHT, 4), + new PsoEnumEntryInfo(MetaName.RAGDOLL_SHIN_RIGHT, 5), + new PsoEnumEntryInfo(MetaName.RAGDOLL_FOOT_RIGHT, 6), + new PsoEnumEntryInfo(MetaName.RAGDOLL_SPINE0, 7), + new PsoEnumEntryInfo(MetaName.RAGDOLL_SPINE1, 8), + new PsoEnumEntryInfo(MetaName.RAGDOLL_SPINE2, 9), + new PsoEnumEntryInfo(MetaName.RAGDOLL_SPINE3, 10), + new PsoEnumEntryInfo(MetaName.RAGDOLL_CLAVICLE_LEFT, 11), + new PsoEnumEntryInfo(MetaName.RAGDOLL_UPPER_ARM_LEFT, 12), + new PsoEnumEntryInfo(MetaName.RAGDOLL_LOWER_ARM_LEFT, 13), + new PsoEnumEntryInfo(MetaName.RAGDOLL_HAND_LEFT, 14), + new PsoEnumEntryInfo(MetaName.RAGDOLL_CLAVICLE_RIGHT, 15), + new PsoEnumEntryInfo(MetaName.RAGDOLL_UPPER_ARM_RIGHT, 16), + new PsoEnumEntryInfo((MetaName)937951079, 17), + new PsoEnumEntryInfo(MetaName.RAGDOLL_HAND_RIGHT, 18), + new PsoEnumEntryInfo(MetaName.RAGDOLL_NECK, 19), + new PsoEnumEntryInfo(MetaName.RAGDOLL_HEAD, 20) + ), + MetaName.LockType => new PsoEnumInfo(MetaName.LockType, 1, + new PsoEnumEntryInfo((MetaName)40312212, 0), + new PsoEnumEntryInfo((MetaName)2263813480, 1), + new PsoEnumEntryInfo((MetaName)1924092278, 2) + ), + (MetaName)3799765345 => new PsoEnumInfo((MetaName)3799765345, 1, + new PsoEnumEntryInfo(MetaName.ET_INVALID, -1), + new PsoEnumEntryInfo(MetaName.ET_CRIME, 0), + new PsoEnumEntryInfo(MetaName.ET_JAYWALKING, 1), + new PsoEnumEntryInfo(MetaName.ET_COP_PURSUIT, 2), + new PsoEnumEntryInfo(MetaName.ET_SPAWNED_COP_PURSUIT, 3), + new PsoEnumEntryInfo(MetaName.ET_AMBIENT_COP, 4), + new PsoEnumEntryInfo(MetaName.ET_INTERESTING_DRIVER, 5), + new PsoEnumEntryInfo(MetaName.ET_AGGRESSIVE_DRIVER, 6) + ), + (MetaName)1809724872 => new PsoEnumInfo((MetaName)1809724872, 1, + new PsoEnumEntryInfo(MetaName.NO_REACTION, 0), + new PsoEnumEntryInfo(MetaName.SMALL_REACTION, 1), + new PsoEnumEntryInfo(MetaName.BIG_REACTION, 2) + ), + (MetaName)888350649 => new PsoEnumInfo((MetaName)888350649, 1, + new PsoEnumEntryInfo(MetaName.SAC_Retain, 0), + new PsoEnumEntryInfo((MetaName)485311651, 1), + new PsoEnumEntryInfo((MetaName)1413720671, 2), + new PsoEnumEntryInfo(MetaName.SAC_Randomize, 3) + ), + (MetaName)2055586340 => new PsoEnumInfo((MetaName)2055586340, 1, + new PsoEnumEntryInfo(MetaName.TC_Retain, 0), + new PsoEnumEntryInfo((MetaName)1410481380, 1), + new PsoEnumEntryInfo((MetaName)1541573135, 2), + new PsoEnumEntryInfo(MetaName.TC_Randomize, 3) + ), + (MetaName)3374036042 => new PsoEnumInfo((MetaName)3374036042, 1, + new PsoEnumEntryInfo(MetaName.BC_Retain, 0), + new PsoEnumEntryInfo((MetaName)1834753809, 1), + new PsoEnumEntryInfo((MetaName)2650352944, 2), + new PsoEnumEntryInfo(MetaName.BC_Randomize, 3) + ), + (MetaName)4001255574 => new PsoEnumInfo((MetaName)4001255574, 1, + new PsoEnumEntryInfo(MetaName.HBC_Retain, 0), + new PsoEnumEntryInfo((MetaName)2508718569, 1), + new PsoEnumEntryInfo((MetaName)1024930189, 2), + new PsoEnumEntryInfo(MetaName.HBC_Randomize, 3) + ), + (MetaName)894416699 => new PsoEnumInfo((MetaName)894416699, 1, + new PsoEnumEntryInfo(MetaName.SF_FrontDriverSide, 0), + new PsoEnumEntryInfo(MetaName.SF_FrontPassengerSide, 1), + new PsoEnumEntryInfo(MetaName.SF_BackDriverSide, 2), + new PsoEnumEntryInfo(MetaName.SF_BackPassengerSide, 3), + new PsoEnumEntryInfo(MetaName.SF_AltFrontDriverSide, 4), + new PsoEnumEntryInfo(MetaName.SF_AltFrontPassengerSide, 5), + new PsoEnumEntryInfo(MetaName.SF_AltBackDriverSide, 6), + new PsoEnumEntryInfo(MetaName.SF_AltBackPassengerSide, 7) + ), + (MetaName)4186696686 => new PsoEnumInfo((MetaName)4186696686, 1, + new PsoEnumEntryInfo(MetaName.POPGROUP_IS_GANG, 0), + new PsoEnumEntryInfo(MetaName.POPGROUP_AMBIENT, 1), + new PsoEnumEntryInfo(MetaName.POPGROUP_SCENARIO, 2), + new PsoEnumEntryInfo(MetaName.POPGROUP_RARE, 3), + new PsoEnumEntryInfo(MetaName.POPGROUP_NETWORK_COMMON, 4), + new PsoEnumEntryInfo(MetaName.POPGROUP_AERIAL, 5), + new PsoEnumEntryInfo(MetaName.POPGROUP_AQUATIC, 6), + new PsoEnumEntryInfo(MetaName.POPGROUP_WILDLIFE, 7), + new PsoEnumEntryInfo(MetaName.POPGROUP_IN_VEHICLE, 8) + ), + (MetaName)2809332931 => new PsoEnumInfo((MetaName)2809332931, 1, + new PsoEnumEntryInfo(MetaName.DontCloseWhenTouched, 0), + new PsoEnumEntryInfo(MetaName.AutoOpensForSPVehicleWithPedsOnly, 1), + new PsoEnumEntryInfo(MetaName.AutoOpensForSPPlayerPedsOnly, 2), + new PsoEnumEntryInfo(MetaName.AutoOpensForMPVehicleWithPedsOnly, 3), + new PsoEnumEntryInfo(MetaName.AutoOpensForMPPlayerPedsOnly, 4), + new PsoEnumEntryInfo(MetaName.DelayDoorClosingForPlayer, 5), + new PsoEnumEntryInfo(MetaName.AutoOpensForAllVehicles, 6), + new PsoEnumEntryInfo(MetaName.IgnoreOpenDoorTaskEdgeLerp, 7), + new PsoEnumEntryInfo(MetaName.AutoOpensForLawEnforcement, 8) + ), + MetaName.StdDoorRotDir => new PsoEnumInfo(MetaName.StdDoorRotDir, 1, + new PsoEnumEntryInfo(MetaName.StdDoorOpenBothDir, 0), + new PsoEnumEntryInfo(MetaName.StdDoorOpenNegDir, 1), + new PsoEnumEntryInfo(MetaName.StdDoorOpenPosDir, 2) + ), + (MetaName)2065671281 => new PsoEnumInfo((MetaName)2065671281, 1, + new PsoEnumEntryInfo(MetaName.CantUse, 0), + new PsoEnumEntryInfo(MetaName.MustUse, 1) + ), + (MetaName)1756502932 => new PsoEnumInfo((MetaName)1756502932, 1, + new PsoEnumEntryInfo((MetaName)1618156912, 0), + new PsoEnumEntryInfo((MetaName)325739119, 1), + new PsoEnumEntryInfo((MetaName)1129710621, 2), + new PsoEnumEntryInfo((MetaName)2784202857, 3), + new PsoEnumEntryInfo((MetaName)3198877297, 4), + new PsoEnumEntryInfo((MetaName)2664559559, 5) + ), + (MetaName)3204395397 => new PsoEnumInfo((MetaName)3204395397, 1, + new PsoEnumEntryInfo((MetaName)3124669982, 0), + new PsoEnumEntryInfo((MetaName)1679254647, 1), + new PsoEnumEntryInfo((MetaName)1875723229, 2) + ), + (MetaName)4286852891 => new PsoEnumInfo((MetaName)4286852891, 1, + new PsoEnumEntryInfo(MetaName.VEHICLE_RESPONSE_DEFAULT, 0), + new PsoEnumEntryInfo(MetaName.VEHICLE_RESPONSE_COUNTRYSIDE, 1), + new PsoEnumEntryInfo(MetaName.VEHICLE_RESPONSE_ARMY_BASE, 2), + new PsoEnumEntryInfo((MetaName)2910242310, 3) + ), + (MetaName)4095090001 => new PsoEnumInfo((MetaName)4095090001, 1, + new PsoEnumEntryInfo(MetaName.SPECIAL_NONE, 0), + new PsoEnumEntryInfo(MetaName.SPECIAL_AIRPORT, 1) + ), + (MetaName)98189892 => new PsoEnumInfo((MetaName)98189892, 1, + new PsoEnumEntryInfo(MetaName.NoCoverNorthFaceEast, 0), + new PsoEnumEntryInfo(MetaName.NoCoverNorthFaceWest, 1), + new PsoEnumEntryInfo(MetaName.NoCoverNorthFaceCenter, 2), + new PsoEnumEntryInfo(MetaName.NoCoverSouthFaceEast, 3), + new PsoEnumEntryInfo(MetaName.NoCoverSouthFaceWest, 4), + new PsoEnumEntryInfo(MetaName.NoCoverSouthFaceCenter, 5), + new PsoEnumEntryInfo(MetaName.NoCoverEastFaceNorth, 6), + new PsoEnumEntryInfo(MetaName.NoCoverEastFaceSouth, 7), + new PsoEnumEntryInfo(MetaName.NoCoverEastFaceCenter, 8), + new PsoEnumEntryInfo(MetaName.NoCoverWestFaceNorth, 9), + new PsoEnumEntryInfo(MetaName.NoCoverWestFaceSouth, 10), + new PsoEnumEntryInfo(MetaName.NoCoverWestFaceCenter, 11), + new PsoEnumEntryInfo(MetaName.ForceLowCornerNorthFaceEast, 12), + new PsoEnumEntryInfo(MetaName.ForceLowCornerNorthFaceWest, 13), + new PsoEnumEntryInfo(MetaName.ForceLowCornerSouthFaceEast, 14), + new PsoEnumEntryInfo(MetaName.ForceLowCornerSouthFaceWest, 15), + new PsoEnumEntryInfo(MetaName.ForceLowCornerEastFaceNorth, 16), + new PsoEnumEntryInfo(MetaName.ForceLowCornerEastFaceSouth, 17), + new PsoEnumEntryInfo(MetaName.ForceLowCornerWestFaceNorth, 18), + new PsoEnumEntryInfo(MetaName.ForceLowCornerWestFaceSouth, 19), + new PsoEnumEntryInfo(MetaName.NoCoverVehicleDoors, 20) + ), + MetaName.CSpawnPoint__AvailabilityMpSp => new PsoEnumInfo(MetaName.CSpawnPoint__AvailabilityMpSp, 1, + new PsoEnumEntryInfo(MetaName.kBoth, 0), + new PsoEnumEntryInfo(MetaName.kOnlySp, 1), + new PsoEnumEntryInfo(MetaName.kOnlyMp, 2) + ), + MetaName.CScenarioPointFlags__Flags => new PsoEnumInfo(MetaName.CScenarioPointFlags__Flags, 1, + new PsoEnumEntryInfo(MetaName.IgnoreMaxInRange, 0), + new PsoEnumEntryInfo(MetaName.NoSpawn, 1), + new PsoEnumEntryInfo(MetaName.StationaryReactions, 2) + ), + MetaName.CScenarioChainingEdge__eNavMode => new PsoEnumInfo(MetaName.CScenarioChainingEdge__eNavMode, 1, + new PsoEnumEntryInfo(MetaName.Direct, 0), + new PsoEnumEntryInfo(MetaName.NavMesh, 1), + new PsoEnumEntryInfo(MetaName.Roads, 2) + ), + MetaName.CScenarioChainingEdge__eNavSpeed => new PsoEnumInfo(MetaName.CScenarioChainingEdge__eNavSpeed, 1, + new PsoEnumEntryInfo((MetaName)3279574318, 0), + new PsoEnumEntryInfo((MetaName)2212923970, 1), + new PsoEnumEntryInfo((MetaName)4022799658, 2), + new PsoEnumEntryInfo((MetaName)1425672334, 3), + new PsoEnumEntryInfo((MetaName)957720931, 4), + new PsoEnumEntryInfo((MetaName)3795195414, 5), + new PsoEnumEntryInfo((MetaName)2834622009, 6), + new PsoEnumEntryInfo((MetaName)1876554076, 7), + new PsoEnumEntryInfo((MetaName)698543797, 8), + new PsoEnumEntryInfo((MetaName)3911005380, 9), + new PsoEnumEntryInfo((MetaName)3717649022, 10), + new PsoEnumEntryInfo((MetaName)3356026130, 11) + ), + (MetaName)1193003611 => new PsoEnumInfo((MetaName)1193003611, 1, + new PsoEnumEntryInfo(MetaName.TIME_DEPENDENT, 0), + new PsoEnumEntryInfo(MetaName.WEATHER_DEPENDENT, 1) + ), + (MetaName)3387532954 => new PsoEnumInfo((MetaName)3387532954, 1, + new PsoEnumEntryInfo(MetaName.AT_TXD, 0), + new PsoEnumEntryInfo(MetaName.AT_DRB, 1), + new PsoEnumEntryInfo(MetaName.AT_DWD, 2), + new PsoEnumEntryInfo(MetaName.AT_FRG, 3) + ), + MetaName.manifestFlags => new PsoEnumInfo(MetaName.manifestFlags, 1, + new PsoEnumEntryInfo(MetaName.INTERIOR_DATA, 0) + ), + MetaName.rage__eLodType => new PsoEnumInfo(MetaName.rage__eLodType, 1, + new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_HD, 0), + new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_LOD, 1), + new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_SLOD1, 2), + new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_SLOD2, 3), + new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_SLOD3, 4), + new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_ORPHANHD, 5), + new PsoEnumEntryInfo(MetaName.LODTYPES_DEPTH_SLOD4, 6) + ), + MetaName.rage__ePriorityLevel => new PsoEnumInfo(MetaName.rage__ePriorityLevel, 1, + new PsoEnumEntryInfo(MetaName.PRI_REQUIRED, 0), + new PsoEnumEntryInfo(MetaName.PRI_OPTIONAL_HIGH, 1), + new PsoEnumEntryInfo(MetaName.PRI_OPTIONAL_MEDIUM, 2), + new PsoEnumEntryInfo(MetaName.PRI_OPTIONAL_LOW, 3) + ), + _ => null, + }; + } +} diff --git a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes/GetStructureInfo.cs b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes/GetStructureInfo.cs new file mode 100644 index 0000000..b757627 --- /dev/null +++ b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes/GetStructureInfo.cs @@ -0,0 +1,14000 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CodeWalker.GameFiles; +public static class PsoTypesStructureInfo +{ + public static PsoStructureInfo GetStructureInfo(MetaName name) + { + //to generate structinfos + switch (name) + { + case MetaName.CJunctionTemplateArray: + return new PsoStructureInfo(MetaName.CJunctionTemplateArray, 0, 0, 170688, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CJunctionTemplate), + new PsoStructureEntryInfo(MetaName.Entries, PsoDataType.Array, 0, 1, (MetaName)9830400), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2111264667), + new PsoStructureEntryInfo(MetaName.AutoJunctionAdjustments, PsoDataType.Array, 39344, 129, (MetaName)524290) + ); + case MetaName.CJunctionTemplate: + return new PsoStructureInfo(MetaName.CJunctionTemplate, 0, 0, 1136, + new PsoStructureEntryInfo(MetaName.iFlags, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.iNumJunctionNodes, PsoDataType.SInt, 4, 0, 0), + new PsoStructureEntryInfo(MetaName.iNumEntrances, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.iNumPhases, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.iNumTrafficLightLocations, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fSearchDistance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fPhaseOffset, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.vJunctionMin, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.vJunctionMax, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float3, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.vJunctionNodePositions, PsoDataType.Array, 64, 2, (MetaName)524297), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1057820426), + new PsoStructureEntryInfo(MetaName.Entrances, PsoDataType.Array, 192, 2, (MetaName)1048587), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)38018516), + new PsoStructureEntryInfo(MetaName.PhaseTimings, PsoDataType.Array, 960, 2, (MetaName)1048589), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2279781599), + new PsoStructureEntryInfo(MetaName.TrafficLightLocations, PsoDataType.Array, 1088, 2, (MetaName)524303) + ); + case (MetaName)1057820426: + return new PsoStructureInfo((MetaName)1057820426, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.vNodePosition, PsoDataType.Float3, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.iPhase, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fStoppingDistance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fOrientation, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fAngleFromCenter, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.bCanTurnRightOnRedLight, PsoDataType.Bool, 33, 0, 0), + new PsoStructureEntryInfo(MetaName.bLeftLaneIsAheadOnly, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.bRightLaneIsRightOnly, PsoDataType.Bool, 34, 0, 0), + new PsoStructureEntryInfo(MetaName.iLeftFilterLanePhase, PsoDataType.SInt, 36, 0, 0) + ); + case (MetaName)38018516: + return new PsoStructureInfo((MetaName)38018516, 0, 0, 8, + new PsoStructureEntryInfo(MetaName.fStartTime, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.fDuration, PsoDataType.Float, 4, 0, 0) + ); + case (MetaName)2279781599: + return new PsoStructureInfo((MetaName)2279781599, 0, 0, 6, + new PsoStructureEntryInfo(MetaName.iPosX, PsoDataType.SShort, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.iPosY, PsoDataType.SShort, 2, 0, 0), + new PsoStructureEntryInfo(MetaName.iPosZ, PsoDataType.SShort, 4, 0, 0) + ); + case (MetaName)2111264667: + return new PsoStructureInfo((MetaName)2111264667, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.vLocation, PsoDataType.Float3a, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.fCycleOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fCycleDuration, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CVehicleModelInfoVarGlobal: //carcols.ymt root + return new PsoStructureInfo(MetaName.CVehicleModelInfoVarGlobal, 0, 0, 392, + new PsoStructureEntryInfo(MetaName.VehiclePlates, PsoDataType.Structure, 8, 0, (MetaName)465922034), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModelColor), + new PsoStructureEntryInfo(MetaName.Colors, PsoDataType.Array, 48, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleMetallicSetting), + new PsoStructureEntryInfo(MetaName.MetallicSettings, PsoDataType.Array, 64, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleWindowColor), + new PsoStructureEntryInfo(MetaName.WindowColors, PsoDataType.Array, 80, 0, (MetaName)5), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.vehicleLightSettings), + new PsoStructureEntryInfo(MetaName.Lights, PsoDataType.Array, 96, 0, (MetaName)MetaTypeName.POINTER), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.sirenSettings), + new PsoStructureEntryInfo(MetaName.Sirens, PsoDataType.Array, 112, 0, (MetaName)9), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleKit), + new PsoStructureEntryInfo(MetaName.Kits, PsoDataType.Array, 128, 0, (MetaName)11), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleWheel), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Array, 0, 0, (MetaName)13), + new PsoStructureEntryInfo(MetaName.Wheels, PsoDataType.Array, 144, 4, (MetaName)851982), + new PsoStructureEntryInfo(MetaName.GlobalVariationData, PsoDataType.Structure, 352, 0, (MetaName)3062246906), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleXenonLightColor), + new PsoStructureEntryInfo(MetaName.XenonLightColors, PsoDataType.Array, 376, 0, (MetaName)MetaTypeName.BYTE) + ); + case (MetaName)465922034: //CVehicleModelInfoVarGlobal VehiclePlates + return new PsoStructureInfo((MetaName)465922034, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3027500557), + new PsoStructureEntryInfo(MetaName.Textures, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTexureIndex, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.NumericOffset, PsoDataType.UByte, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.AlphabeticOffset, PsoDataType.UByte, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.SpaceOffset, PsoDataType.UByte, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.RandomCharOffset, PsoDataType.UByte, 31, 0, 0), + new PsoStructureEntryInfo(MetaName.NumRandomChar, PsoDataType.UByte, 32, 0, 0) + ); + case (MetaName)3027500557: //CVehicleModelInfoVarGlobal VehiclePlates Texture + return new PsoStructureInfo((MetaName)3027500557, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.TextureSetName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DiffuseMapName, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.NormalMapName, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.FontExtents, PsoDataType.Float4, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLettersOnPlate, PsoDataType.Float2, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.FontColor, PsoDataType.UInt, 56, 1, 0), + new PsoStructureEntryInfo(MetaName.FontOutlineColor, PsoDataType.UInt, 60, 1, 0), + new PsoStructureEntryInfo(MetaName.IsFontOutlineEnabled, PsoDataType.Bool, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.FontOutlineMinMaxDepth, PsoDataType.Float2, 68, 0, 0) + ); + case (MetaName)3062246906: //CVehicleModelInfoVarGlobal GlobalVariationData + return new PsoStructureInfo((MetaName)3062246906, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.xenonLightColor, PsoDataType.UInt, 8, 1, 0), + new PsoStructureEntryInfo(MetaName.xenonCoronaColor, PsoDataType.UInt, 12, 1, 0), + new PsoStructureEntryInfo(MetaName.xenonLightIntensityModifier, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.xenonCoronaIntensityModifier, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CVehicleXenonLightColor: //CVehicleModelInfoVarGlobal XenonLightColors + return new PsoStructureInfo(MetaName.CVehicleXenonLightColor, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.lightColor, PsoDataType.UInt, 8, 1, 0), + new PsoStructureEntryInfo(MetaName.coronaColor, PsoDataType.UInt, 12, 1, 0), + new PsoStructureEntryInfo(MetaName.lightIntensityModifier, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.coronaIntensityModifier, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CVehicleModelColor: //CVehicleModelInfoVarGlobal Colors + return new PsoStructureInfo(MetaName.CVehicleModelColor, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 8, 1, 0), + new PsoStructureEntryInfo(MetaName.metallicID, PsoDataType.Enum, 12, 2, (MetaName)360458334), + new PsoStructureEntryInfo(MetaName.audioColor, PsoDataType.Enum, 13, 2, (MetaName)544262540), + new PsoStructureEntryInfo(MetaName.audioPrefix, PsoDataType.Enum, 14, 2, (MetaName)2065815796), + new PsoStructureEntryInfo(MetaName.audioColorHash, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.audioPrefixHash, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.colorName, PsoDataType.String, 24, 1, 0) + ); + case MetaName.CVehicleMetallicSetting: //CVehicleModelInfoVarGlobal MetallicSettings + return new PsoStructureInfo(MetaName.CVehicleMetallicSetting, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.specInt, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.specFalloff, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.specFresnel, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CVehicleWindowColor: //CVehicleModelInfoVarGlobal WindowColors + return new PsoStructureInfo(MetaName.CVehicleWindowColor, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 8, 1, 0), + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 12, 7, 0) + ); + case MetaName.vehicleLightSettings: //CVehicleModelInfoVarGlobal Lights + return new PsoStructureInfo(MetaName.vehicleLightSettings, 0, 0, 552, + new PsoStructureEntryInfo(MetaName.id, PsoDataType.UByte, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.indicator, PsoDataType.Structure, 16, 0, MetaName.vehicleLight), + new PsoStructureEntryInfo(MetaName.rearIndicatorCorona, PsoDataType.Structure, 64, 0, MetaName.vehicleCorona), + new PsoStructureEntryInfo(MetaName.frontIndicatorCorona, PsoDataType.Structure, 120, 0, MetaName.vehicleCorona), + new PsoStructureEntryInfo(MetaName.tailLight, PsoDataType.Structure, 176, 0, MetaName.vehicleLight), + new PsoStructureEntryInfo(MetaName.tailLightCorona, PsoDataType.Structure, 224, 0, MetaName.vehicleCorona), + new PsoStructureEntryInfo(MetaName.tailLightMiddleCorona, PsoDataType.Structure, 280, 0, MetaName.vehicleCorona), + new PsoStructureEntryInfo(MetaName.headLight, PsoDataType.Structure, 336, 0, MetaName.vehicleLight), + new PsoStructureEntryInfo(MetaName.headLightCorona, PsoDataType.Structure, 384, 0, MetaName.vehicleCorona), + new PsoStructureEntryInfo(MetaName.reversingLight, PsoDataType.Structure, 440, 0, MetaName.vehicleLight), + new PsoStructureEntryInfo(MetaName.reversingLightCorona, PsoDataType.Structure, 488, 0, MetaName.vehicleCorona), + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 544, 1, 0) + ); + case MetaName.vehicleLight: //CVehicleModelInfoVarGlobal Lights Light info + return new PsoStructureInfo(MetaName.vehicleLight, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.intensity, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.falloffMax, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.falloffExponent, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.innerConeAngle, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.outerConeAngle, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.emmissiveBoost, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 32, 1, 0), + new PsoStructureEntryInfo(MetaName.textureName, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.mirrorTexture, PsoDataType.Bool, 40, 0, 0) + ); + case MetaName.vehicleCorona: //CVehicleModelInfoVarGlobal Lights Corona info + return new PsoStructureInfo(MetaName.vehicleCorona, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.size, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.size_far, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.intensity, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.intensity_far, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 24, 1, 0), + new PsoStructureEntryInfo(MetaName.numCoronas, PsoDataType.UByte, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.distBetweenCoronas, PsoDataType.UByte, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.distBetweenCoronas_far, PsoDataType.UByte, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.xRotation, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.yRotation, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.zRotation, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.zBias, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.pullCoronaIn, PsoDataType.Bool, 48, 0, 0) + ); + case MetaName.sirenSettings: + return new PsoStructureInfo(MetaName.sirenSettings, 0, 0, 2376, + new PsoStructureEntryInfo(MetaName.id, PsoDataType.UByte, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 16, 1, 0), + new PsoStructureEntryInfo(MetaName.timeMultiplier, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.lightFalloffMax, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.lightFalloffExponent, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.lightInnerConeAngle, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.lightOuterConeAngle, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.lightOffset, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.textureName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.sequencerBpm, PsoDataType.UInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.leftHeadLight, PsoDataType.Structure, 56, 0, (MetaName)188820339), + new PsoStructureEntryInfo(MetaName.rightHeadLight, PsoDataType.Structure, 72, 0, (MetaName)188820339), + new PsoStructureEntryInfo(MetaName.leftTailLight, PsoDataType.Structure, 88, 0, (MetaName)188820339), + new PsoStructureEntryInfo(MetaName.rightTailLight, PsoDataType.Structure, 104, 0, (MetaName)188820339), + new PsoStructureEntryInfo(MetaName.leftHeadLightMultiples, PsoDataType.UByte, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.rightHeadLightMultiples, PsoDataType.UByte, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.leftTailLightMultiples, PsoDataType.UByte, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.rightTailLightMultiples, PsoDataType.UByte, 123, 0, 0), + new PsoStructureEntryInfo(MetaName.useRealLights, PsoDataType.Bool, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.sirenLight), + new PsoStructureEntryInfo(MetaName.sirens, PsoDataType.Array, 128, 1, (MetaName)1310739) + ); + case (MetaName)188820339: + return new PsoStructureInfo((MetaName)188820339, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.sequencer, PsoDataType.UInt, 8, 0, 0) + ); + case MetaName.sirenLight: + return new PsoStructureInfo(MetaName.sirenLight, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.rotation, PsoDataType.Structure, 8, 0, (MetaName)1356743507), + new PsoStructureEntryInfo(MetaName.flashiness, PsoDataType.Structure, 40, 0, (MetaName)1356743507), + new PsoStructureEntryInfo(MetaName.corona, PsoDataType.Structure, 72, 0, MetaName.sirenCorona), + new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 96, 1, 0), + new PsoStructureEntryInfo(MetaName.intensity, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.lightGroup, PsoDataType.UByte, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.rotate, PsoDataType.Bool, 105, 0, 0), + new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Bool, 106, 0, 0), + new PsoStructureEntryInfo(MetaName.scaleFactor, PsoDataType.UByte, 107, 0, 0), + new PsoStructureEntryInfo(MetaName.flash, PsoDataType.Bool, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.light, PsoDataType.Bool, 109, 0, 0), + new PsoStructureEntryInfo(MetaName.spotLight, PsoDataType.Bool, 110, 0, 0), + new PsoStructureEntryInfo(MetaName.castShadows, PsoDataType.Bool, 111, 0, 0) + ); + case (MetaName)1356743507: + return new PsoStructureInfo((MetaName)1356743507, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.delta, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.start, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.speed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.sequencer, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.multiples, PsoDataType.UByte, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.direction, PsoDataType.Bool, 25, 0, 0), + new PsoStructureEntryInfo(MetaName.syncToBpm, PsoDataType.Bool, 26, 0, 0) + ); + case MetaName.sirenCorona: + return new PsoStructureInfo(MetaName.sirenCorona, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.intensity, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.size, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.pull, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.faceCamera, PsoDataType.Bool, 20, 0, 0) + ); + case MetaName.CVehicleKit: + return new PsoStructureInfo(MetaName.CVehicleKit, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.kitName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.id, PsoDataType.UShort, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.kitType, PsoDataType.Enum, 16, 0, MetaName.eModKitType), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModVisible), + new PsoStructureEntryInfo(MetaName.visibleMods, PsoDataType.Array, 24, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModLink), + new PsoStructureEntryInfo(MetaName.linkMods, PsoDataType.Array, 40, 0, (MetaName)5), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModStat), + new PsoStructureEntryInfo(MetaName.statMods, PsoDataType.Array, 56, 0, (MetaName)7), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)427606548), + new PsoStructureEntryInfo(MetaName.slotNames, PsoDataType.Array, 72, 0, (MetaName)9), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), + new PsoStructureEntryInfo(MetaName.liveryNames, PsoDataType.Array, 88, 0, (MetaName)11), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), + new PsoStructureEntryInfo(MetaName.livery2Names, PsoDataType.Array, 104, 0, (MetaName)13) + ); + case MetaName.CVehicleModStat: + return new PsoStructureInfo(MetaName.CVehicleModStat, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.identifier, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.modifier, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.audioApply, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.weight, PsoDataType.UByte, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.type, PsoDataType.Enum, 24, 0, MetaName.eVehicleModType) + ); + case MetaName.CVehicleModVisible: + return new PsoStructureInfo(MetaName.CVehicleModVisible, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.modelName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.modShopLabel, PsoDataType.String, 16, 2, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.linkedModels, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3635907608), + new PsoStructureEntryInfo(MetaName.turnOffBones, PsoDataType.Array, 40, 0, (MetaName)4), + new PsoStructureEntryInfo(MetaName.type, PsoDataType.Enum, 56, 0, MetaName.eVehicleModType), + new PsoStructureEntryInfo(MetaName.bone, PsoDataType.Enum, 60, 0, (MetaName)3635907608), + new PsoStructureEntryInfo(MetaName.collisionBone, PsoDataType.Enum, 64, 0, (MetaName)3635907608), + new PsoStructureEntryInfo(MetaName.cameraPos, PsoDataType.Enum, 68, 0, MetaName.eVehicleModCameraPos), + new PsoStructureEntryInfo(MetaName.audioApply, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.weight, PsoDataType.UByte, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.turnOffExtra, PsoDataType.Bool, 77, 0, 0), + new PsoStructureEntryInfo(MetaName.disableBonnetCamera, PsoDataType.Bool, 78, 0, 0), + new PsoStructureEntryInfo(MetaName.allowBonnetSlide, PsoDataType.Bool, 79, 0, 0), + new PsoStructureEntryInfo(MetaName.weaponSlot, PsoDataType.SByte, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.weaponSlotSecondary, PsoDataType.SByte, 81, 0, 0), + new PsoStructureEntryInfo(MetaName.disableProjectileDriveby, PsoDataType.Bool, 82, 0, 0), + new PsoStructureEntryInfo(MetaName.disableDriveby, PsoDataType.Bool, 83, 0, 0), + new PsoStructureEntryInfo(MetaName.disableDrivebySeat, PsoDataType.SInt, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.disableDrivebySeatSecondary, PsoDataType.SInt, 88, 0, 0) + ); + case (MetaName)427606548: + return new PsoStructureInfo((MetaName)427606548, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.slot, PsoDataType.Enum, 8, 0, MetaName.eVehicleModType), + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 16, 2, 0) + ); + case MetaName.CVehicleModLink: + return new PsoStructureInfo(MetaName.CVehicleModLink, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.modelName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.bone, PsoDataType.Enum, 12, 0, (MetaName)3635907608), + new PsoStructureEntryInfo(MetaName.turnOffExtra, PsoDataType.Bool, 16, 0, 0) + ); + case MetaName.CVehicleWheel: + return new PsoStructureInfo(MetaName.CVehicleWheel, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.wheelName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.wheelVariation, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.modShopLabel, PsoDataType.String, 16, 2, 0), + new PsoStructureEntryInfo(MetaName.rimRadius, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.rear, PsoDataType.Bool, 28, 0, 0) + ); + case MetaName.CVehicleModColors: //carmodcols.ymt root + return new PsoStructureInfo(MetaName.CVehicleModColors, 0, 0, 128, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), + new PsoStructureEntryInfo(MetaName.metallic, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), + new PsoStructureEntryInfo(MetaName.classic, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), + new PsoStructureEntryInfo(MetaName.matte, PsoDataType.Array, 40, 0, (MetaName)4), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), + new PsoStructureEntryInfo(MetaName.metals, PsoDataType.Array, 56, 0, (MetaName)6), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), + new PsoStructureEntryInfo(MetaName.chrome, PsoDataType.Array, 72, 0, (MetaName)8), + new PsoStructureEntryInfo(MetaName.pearlescent, PsoDataType.Structure, 88, 0, MetaName.CVehicleModPearlescentColors) + ); + case MetaName.CVehicleModPearlescentColors: + return new PsoStructureInfo(MetaName.CVehicleModPearlescentColors, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), + new PsoStructureEntryInfo(MetaName.baseCols, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CVehicleModColor), + new PsoStructureEntryInfo(MetaName.specCols, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case MetaName.CVehicleModColor: + return new PsoStructureInfo(MetaName.CVehicleModColor, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 2, 0), + new PsoStructureEntryInfo(MetaName.col, PsoDataType.UByte, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.spec, PsoDataType.UByte, 17, 0, 0) + ); + case MetaName.CVehicleModelInfoVariation: //carvariations.ymt root + return new PsoStructureInfo(MetaName.CVehicleModelInfoVariation, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)418053801), + new PsoStructureEntryInfo(MetaName.variationData, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)418053801: //CVehicleModelInfoVariation variationData + return new PsoStructureInfo((MetaName)418053801, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.modelName, PsoDataType.String, 8, 1, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2575850962), + new PsoStructureEntryInfo(MetaName.colors, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.kits, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.windowsWithExposedEdges, PsoDataType.Array, 48, 0, (MetaName)5), + new PsoStructureEntryInfo(MetaName.plateProbabilities, PsoDataType.Structure, 64, 0, MetaName.PlateProbabilities), + new PsoStructureEntryInfo(MetaName.lightSettings, PsoDataType.UByte, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.sirenSettings, PsoDataType.UByte, 89, 0, 0) + ); + case (MetaName)2575850962: //CVehicleModelInfoVariation variationData colors + return new PsoStructureInfo((MetaName)2575850962, 0, 0, 44 /*40*/, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.indices, PsoDataType.Array, 8, 4, (MetaName)393216 /*262144*/), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Bool, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.liveries, PsoDataType.Array, 14 /*12*/, 4, (MetaName)1966082 /*1638402*/) + ); + case MetaName.PlateProbabilities: + return new PsoStructureInfo(MetaName.PlateProbabilities, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)938618322), + new PsoStructureEntryInfo(MetaName.Probabilities, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)938618322: + return new PsoStructureInfo((MetaName)938618322, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.UInt, 12, 0, 0) + ); + case MetaName.CCreditArray: //credits.ymt root + return new PsoStructureInfo(MetaName.CCreditArray, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCreditItem), + new PsoStructureEntryInfo(MetaName.CreditItems, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.CCreditItem: + return new PsoStructureInfo(MetaName.CCreditItem, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.LineType, PsoDataType.Enum, 8, 0, (MetaName)1795685103), + new PsoStructureEntryInfo(MetaName.cTextId1, PsoDataType.String, 16, 3, 0), + new PsoStructureEntryInfo(MetaName.cTextId2, PsoDataType.String, 32, 3, 0) + ); + case MetaName.CDataFileMgr__ContentsOfDataFileXml: + return new PsoStructureInfo(MetaName.CDataFileMgr__ContentsOfDataFileXml, 0, 0, 120, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.disabledFiles, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__DataFileArray), + new PsoStructureEntryInfo(MetaName.includedXmlFiles, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.includedDataFiles, PsoDataType.Array, 40, 0, (MetaName)4), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__DataFile), + new PsoStructureEntryInfo(MetaName.dataFiles, PsoDataType.Array, 56, 0, (MetaName)6), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__ContentChangeSet), + new PsoStructureEntryInfo(MetaName.contentChangeSets, PsoDataType.Array, 72, 0, (MetaName)8), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.patchFiles, PsoDataType.Array, 88, 0, (MetaName)10), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.allowedFolders, PsoDataType.Array, 104, 0, (MetaName)MetaTypeName.PsoPOINTER) + ); + case MetaName.CDataFileMgr__DataFile: + return new PsoStructureInfo(MetaName.CDataFileMgr__DataFile, 0, 0, 176, + new PsoStructureEntryInfo(MetaName.filename, PsoDataType.String, 8, 0, (MetaName)8388608), + new PsoStructureEntryInfo(MetaName.fileType, PsoDataType.Enum, 136, 0, MetaName.DataFileType), + new PsoStructureEntryInfo(MetaName.registerAs, PsoDataType.String, 144, 3, 0), + new PsoStructureEntryInfo(MetaName.locked, PsoDataType.Bool, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.loadCompletely, PsoDataType.Bool, 161, 0, 0), + new PsoStructureEntryInfo(MetaName.overlay, PsoDataType.Bool, 162, 0, 0), + new PsoStructureEntryInfo(MetaName.patchFile, PsoDataType.Bool, 163, 0, 0), + new PsoStructureEntryInfo(MetaName.disabled, PsoDataType.Bool, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.persistent, PsoDataType.Bool, 165, 0, 0), + new PsoStructureEntryInfo(MetaName.enforceLsnSorting, PsoDataType.Bool, 166, 0, 0), + new PsoStructureEntryInfo(MetaName.contents, PsoDataType.Enum, 168, 0, MetaName.DataFileContents), + new PsoStructureEntryInfo(MetaName.installPartition, PsoDataType.Enum, 172, 0, MetaName.InstallPartition) + ); + case MetaName.CLevelData: //levels.ymt root + return new PsoStructureInfo(MetaName.CLevelData, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.sLevelData), + new PsoStructureEntryInfo(MetaName.aLevelsData, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.sLevelData: + return new PsoStructureInfo(MetaName.sLevelData, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.cFriendlyName, PsoDataType.String, 8, 3, 0), + new PsoStructureEntryInfo(MetaName.cTitle, PsoDataType.String, 24, 3, 0), + new PsoStructureEntryInfo(MetaName.cFilename, PsoDataType.String, 40, 3, 0), + new PsoStructureEntryInfo(MetaName.cBugstarName, PsoDataType.String, 56, 3, 0) + ); + case (MetaName)1056751197: //mapdatacullboxes.ymt root + return new PsoStructureInfo((MetaName)1056751197, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)322201475), + new PsoStructureEntryInfo(MetaName.entries, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)322201475: + return new PsoStructureInfo((MetaName)322201475, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.aabb, PsoDataType.Structure, 16, 0, MetaName.rage__spdAABB), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)4022397219, PsoDataType.Array, 48, 0, (MetaName)2), + new PsoStructureEntryInfo(MetaName.bEnabled, PsoDataType.Bool, 64, 0, 0) + ); + case MetaName.rage__spdAABB: + return new PsoStructureInfo(MetaName.rage__spdAABB, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.min, PsoDataType.Float4a, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.max, PsoDataType.Float4a, 16, 0, 0) + ); + case MetaName.CPedModelInfo__InitDataList: + return new PsoStructureInfo(MetaName.CPedModelInfo__InitDataList, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.residentTxd, PsoDataType.String, 8, 3, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.residentAnims, PsoDataType.Array, 24, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedModelInfo__InitData), + new PsoStructureEntryInfo(MetaName.InitDatas, PsoDataType.Array, 40, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CTxdRelationship), + new PsoStructureEntryInfo(MetaName.txdRelationships, PsoDataType.Array, 56, 0, (MetaName)5), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CMultiTxdRelationship), + new PsoStructureEntryInfo(MetaName.multiTxdRelationships, PsoDataType.Array, 72, 0, (MetaName)7) + ); + case MetaName.CPedModelInfo__InitData: + return new PsoStructureInfo(MetaName.CPedModelInfo__InitData, 0, 0, 296, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 2, 0), + new PsoStructureEntryInfo(MetaName.PropsName, PsoDataType.String, 16, 2, 0), + new PsoStructureEntryInfo(MetaName.ClipDictionaryName, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.BlendShapeFileName, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo(MetaName.ExpressionSetName, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.ExpressionDictionaryName, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.ExpressionName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.Pedtype, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.MovementClipSet, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.MovementClipSets, PsoDataType.Array, 56, 0, (MetaName)9), + new PsoStructureEntryInfo(MetaName.StrafeClipSet, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo(MetaName.MovementToStrafeClipSet, PsoDataType.String, 76, 7, 0), + new PsoStructureEntryInfo(MetaName.InjuredStrafeClipSet, PsoDataType.String, 80, 7, 0), + new PsoStructureEntryInfo(MetaName.FullBodyDamageClipSet, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo(MetaName.AdditiveDamageClipSet, PsoDataType.String, 88, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultGestureClipSet, PsoDataType.String, 92, 7, 0), + new PsoStructureEntryInfo(MetaName.FacialClipsetGroupName, PsoDataType.String, 96, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultVisemeClipSet, PsoDataType.String, 100, 7, 0), + new PsoStructureEntryInfo(MetaName.SidestepClipSet, PsoDataType.String, 104, 7, 0), + new PsoStructureEntryInfo(MetaName.PoseMatcherName, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo(MetaName.PoseMatcherProneName, PsoDataType.String, 112, 7, 0), + new PsoStructureEntryInfo(MetaName.GetupSetHash, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.CreatureMetadataName, PsoDataType.String, 120, 7, 0), + new PsoStructureEntryInfo(MetaName.DecisionMakerName, PsoDataType.String, 124, 7, 0), + new PsoStructureEntryInfo(MetaName.MotionTaskDataSetName, PsoDataType.String, 128, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultTaskDataSetName, PsoDataType.String, 132, 7, 0), + new PsoStructureEntryInfo(MetaName.PedCapsuleName, PsoDataType.String, 136, 7, 0), + new PsoStructureEntryInfo(MetaName.PedLayoutName, PsoDataType.String, 140, 7, 0), + new PsoStructureEntryInfo(MetaName.PedComponentSetName, PsoDataType.String, 144, 7, 0), + new PsoStructureEntryInfo(MetaName.PedComponentClothName, PsoDataType.String, 148, 7, 0), + new PsoStructureEntryInfo(MetaName.PedIKSettingsName, PsoDataType.String, 152, 7, 0), + new PsoStructureEntryInfo(MetaName.TaskDataName, PsoDataType.String, 156, 7, 0), + new PsoStructureEntryInfo(MetaName.IsStreamedGfx, PsoDataType.Bool, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.AmbulanceShouldRespondTo, PsoDataType.Bool, 161, 0, 0), + new PsoStructureEntryInfo(MetaName.CanRideBikeWithNoHelmet, PsoDataType.Bool, 162, 0, 0), + new PsoStructureEntryInfo(MetaName.CanSpawnInCar, PsoDataType.Bool, 163, 0, 0), + new PsoStructureEntryInfo(MetaName.IsHeadBlendPed, PsoDataType.Bool, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.bOnlyBulkyItemVariations, PsoDataType.Bool, 165, 0, 0), + new PsoStructureEntryInfo(MetaName.RelationshipGroup, PsoDataType.String, 168, 7, 0), + new PsoStructureEntryInfo(MetaName.NavCapabilitiesName, PsoDataType.String, 172, 7, 0), + new PsoStructureEntryInfo(MetaName.PerceptionInfo, PsoDataType.String, 176, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBrawlingStyle, PsoDataType.String, 180, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultUnarmedWeapon, PsoDataType.String, 184, 7, 0), + new PsoStructureEntryInfo(MetaName.Personality, PsoDataType.String, 188, 7, 0), + new PsoStructureEntryInfo(MetaName.CombatInfo, PsoDataType.String, 192, 7, 0), + new PsoStructureEntryInfo(MetaName.VfxInfoName, PsoDataType.String, 196, 7, 0), + new PsoStructureEntryInfo(MetaName.AmbientClipsForFlee, PsoDataType.String, 200, 7, 0), + new PsoStructureEntryInfo(MetaName.Radio1, PsoDataType.Enum, 204, 0, MetaName.ePedRadioGenre), + new PsoStructureEntryInfo(MetaName.Radio2, PsoDataType.Enum, 208, 0, MetaName.ePedRadioGenre), + new PsoStructureEntryInfo(MetaName.FUpOffset, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.RUpOffset, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.FFrontOffset, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.RFrontOffset, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.MinActivationImpulse, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.Stubble, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.HDDist, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetingThreatModifier, PsoDataType.Float, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.KilledPerceptionRangeModifer, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eSexinessFlags), + new PsoStructureEntryInfo(MetaName.Sexiness, PsoDataType.Flags, 248, 0, (MetaName)2097211), + new PsoStructureEntryInfo(MetaName.Age, PsoDataType.UByte, 252, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPassengersInCar, PsoDataType.UByte, 253, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eExternallyDrivenDOFs), + new PsoStructureEntryInfo(MetaName.ExternallyDrivenDOFs, PsoDataType.Flags, 254, 2, (MetaName)327743), + new PsoStructureEntryInfo(MetaName.PedVoiceGroup, PsoDataType.String, 256, 7, 0), + new PsoStructureEntryInfo(MetaName.AnimalAudioObject, PsoDataType.String, 260, 7, 0), + new PsoStructureEntryInfo(MetaName.AbilityType, PsoDataType.Enum, 264, 0, MetaName.SpecialAbilityType), + new PsoStructureEntryInfo(MetaName.ThermalBehaviour, PsoDataType.Enum, 268, 0, MetaName.ThermalBehaviour), + new PsoStructureEntryInfo(MetaName.SuperlodType, PsoDataType.Enum, 272, 0, MetaName.eSuperlodType), + new PsoStructureEntryInfo(MetaName.ScenarioPopStreamingSlot, PsoDataType.Enum, 276, 0, MetaName.eScenarioPopStreamingSlot), + new PsoStructureEntryInfo(MetaName.DefaultSpawningPreference, PsoDataType.Enum, 280, 0, MetaName.DefaultSpawnPreference), + new PsoStructureEntryInfo(MetaName.DefaultRemoveRangeMultiplier, PsoDataType.Float, 284, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowCloseSpawning, PsoDataType.Bool, 288, 0, 0) + ); + case MetaName.CMultiTxdRelationship: + return new PsoStructureInfo(MetaName.CMultiTxdRelationship, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.parent, PsoDataType.String, 8, 3, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.children, PsoDataType.Array, 24, 0, (MetaName)1) + ); + case MetaName.CPlayerSpecialAbilityManager: + return new PsoStructureInfo(MetaName.CPlayerSpecialAbilityManager, 0, 0, 64, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4125685004), + new PsoStructureEntryInfo(MetaName.specialAbilities, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.smallCharge, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.mediumCharge, PsoDataType.SInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.largeCharge, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.continuousCharge, PsoDataType.SInt, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fadeCurveType, PsoDataType.Enum, 40, 0, MetaName.eFadeCurveType), + new PsoStructureEntryInfo(MetaName.halfSigmoidConstant, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.sigmoidConstant, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fadeInTime, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.fadeOutTime, PsoDataType.Float, 56, 0, 0) + ); + case (MetaName)4125685004: + return new PsoStructureInfo((MetaName)4125685004, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.duration, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.initialUnlockedCap, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.timeWarpScale, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.damageMultiplier, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.defenseMultiplier, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.depletionMultiplier, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.chargeMultiplier, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fxName, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.outFxName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.activeAnimSet, PsoDataType.String, 44, 7, 0) + ); + case MetaName.CDataFileMgr__ContentChangeSet: + return new PsoStructureInfo(MetaName.CDataFileMgr__ContentChangeSet, 0, 0, 184, + new PsoStructureEntryInfo(MetaName.changeSetName, PsoDataType.String, 8, 3, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__ChangeSetData), + new PsoStructureEntryInfo(MetaName.mapChangeSetData, PsoDataType.Array, 24, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.filesToInvalidate, PsoDataType.Array, 40, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.filesToDisable, PsoDataType.Array, 56, 0, (MetaName)5), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.filesToEnable, PsoDataType.Array, 72, 0, (MetaName)MetaTypeName.POINTER), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.txdToLoad, PsoDataType.Array, 88, 0, (MetaName)9), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.txdToUnload, PsoDataType.Array, 104, 0, (MetaName)11), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__ResourceReference), + new PsoStructureEntryInfo(MetaName.residentResources, PsoDataType.Array, 120, 0, (MetaName)13), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CDataFileMgr__ResourceReference), + new PsoStructureEntryInfo(MetaName.unregisterResources, PsoDataType.Array, 136, 0, (MetaName)15), + new PsoStructureEntryInfo(MetaName.requiresLoadingScreen, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.executionConditions, PsoDataType.Structure, 160, 0, MetaName.ExecutionConditions) + ); + case MetaName.ExecutionConditions: + return new PsoStructureInfo(MetaName.ExecutionConditions, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.ExecutionCondition), + new PsoStructureEntryInfo(MetaName.activeChangesetConditions, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.fwClipSetManager: + return new PsoStructureInfo(MetaName.fwClipSetManager, 0, 0, 128, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.clipSets, PsoDataType.Map, 8, 1, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.fwClipDictionaryMetadata), + new PsoStructureEntryInfo(MetaName.clipDictionaryMetadatas, PsoDataType.Map, 32, 1, (MetaName)196612), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.fwMemoryGroupMetadata), + new PsoStructureEntryInfo(MetaName.memoryGroupMetadatas, PsoDataType.Map, 56, 1, (MetaName)393223), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3219912345), + new PsoStructureEntryInfo((MetaName)3532340754, PsoDataType.Map, 80, 1, (MetaName)589834),//memory group modifiers + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.clipVariationSets, PsoDataType.Map, 104, 1, (MetaName)786445)//move network flags dictionary + ); + case (MetaName)MetaTypeName.ARRAYINFO://default map node entry, with a structure pointer + return new PsoStructureInfo((MetaName)MetaTypeName.ARRAYINFO, 0, 2, 16, + new PsoStructureEntryInfo(MetaName.Key, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Item, PsoDataType.Structure, 8, 3, 0) + ); + case MetaName.fwClipSet: + return new PsoStructureInfo(MetaName.fwClipSet, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.fallbackId, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.clipDictionaryName, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.clipItems, PsoDataType.Map, 16, 1, (MetaName)131075), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.moveNetworkFlags, PsoDataType.Array, 40, 0, (MetaName)5) + ); + case MetaName.fwDirectedClipItemWithProps: + return new PsoStructureInfo(MetaName.fwDirectedClipItemWithProps, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eAnimPlayerFlag), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.Flags, 8, 0, (MetaName)2097152), + new PsoStructureEntryInfo(MetaName.priority, PsoDataType.Enum, 12, 0, MetaName.eAnimPriority), + new PsoStructureEntryInfo(MetaName.boneMask, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.direction, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.fwClipItemWithProps: + return new PsoStructureInfo(MetaName.fwClipItemWithProps, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eAnimPlayerFlag), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.Flags, 8, 0, (MetaName)2097152), + new PsoStructureEntryInfo(MetaName.priority, PsoDataType.Enum, 12, 0, MetaName.eAnimPriority), + new PsoStructureEntryInfo(MetaName.boneMask, PsoDataType.String, 16, 7, 0) + ); + case MetaName.fwClipItem: + return new PsoStructureInfo(MetaName.fwClipItem, 0, 0, 8 //empty struct... possibly abstract/base class + ); + case MetaName.fwClipSetWithGetup: //creature/animal clip set? + return new PsoStructureInfo(MetaName.fwClipSetWithGetup, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.fallbackId, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.clipDictionaryName, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.clipItems, PsoDataType.Map, 16, 1, (MetaName)131075), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.moveNetworkFlags, PsoDataType.Array, 40, 0, (MetaName)5), + new PsoStructureEntryInfo(MetaName.GetupSet, PsoDataType.String, 56, 7, 0), + new PsoStructureEntryInfo(MetaName.DeadBlendOutSet, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo(MetaName.AllowAnimatedDeadFall, PsoDataType.Bool, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AnimatedDeadFallSet, PsoDataType.String, 68, 7, 0) + ); + case MetaName.fwClipDictionaryMetadata: + return new PsoStructureInfo(MetaName.fwClipDictionaryMetadata, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.eStreamingPolicy), + new PsoStructureEntryInfo(MetaName.streamingPolicy, PsoDataType.Flags, 8, 0, (MetaName)2097152), + new PsoStructureEntryInfo(MetaName.memoryGroup, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.streamingPriority, PsoDataType.Enum, 16, 0, MetaName.eStreamingPriority) + ); + case MetaName.fwMemoryGroupMetadata: + return new PsoStructureInfo(MetaName.fwMemoryGroupMetadata, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)676191063, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)1661025772, PsoDataType.UInt, 12, 0, 0) + ); + case (MetaName)3219912345://clip sets memory group modifier? + return new PsoStructureInfo((MetaName)3219912345, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2356519750), + new PsoStructureEntryInfo(MetaName.Adjustments, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)2356519750: //clip sets memory group modifier adjustment + return new PsoStructureInfo((MetaName)2356519750, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MemoryGroup, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Amount, PsoDataType.SInt, 12, 0, 0) + ); + case MetaName.fwClipVariationSet: //clip sets move network flags list/group? + return new PsoStructureInfo(MetaName.fwClipVariationSet, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.clips, PsoDataType.Array, 8, 0, 0) + ); + //case (MetaName)257://this shouldn't really be in here, because it's dynamically generated, see PsoBuilder.AddMapNodeStructureInfo + // return new PsoStructureInfo((MetaName)257, 0, 2, 32, + // new PsoStructureEntryInfo(MetaName.Key, PsoDataType.String, 0, 7, 0), + // new PsoStructureEntryInfo(MetaName.Item, PsoDataType.Structure, 8, 0, MetaName.fwClipDictionaryMetadata) + // ); + //case (MetaName)258://this shouldn't really be in here, because it's dynamically generated, see PsoBuilder.AddMapNodeStructureInfo + // return new PsoStructureInfo((MetaName)258, 0, 2, 24, + // new PsoStructureEntryInfo(MetaName.Key, PsoDataType.String, 0, 7, 0), + // new PsoStructureEntryInfo(MetaName.Item, PsoDataType.Structure, 8, 0, MetaName.fwMemoryGroupMetadata) + // ); + //case (MetaName)259://this shouldn't really be in here, because it's dynamically generated, see PsoBuilder.AddMapNodeStructureInfo + // return new PsoStructureInfo((MetaName)259, 0, 2, 32, + // new PsoStructureEntryInfo(MetaName.Key, PsoDataType.String, 0, 7, 0), + // new PsoStructureEntryInfo(MetaName.Item, PsoDataType.Structure, 8, 0, (MetaName)3219912345) + // ); + case MetaName.AnimPostFXManager: + return new PsoStructureInfo(MetaName.AnimPostFXManager, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2319197961), + new PsoStructureEntryInfo(MetaName.RegisteredStacks, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)2319197961: + return new PsoStructureInfo((MetaName)2319197961, 0, 0, 384, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FXStack, PsoDataType.Structure, 16, 0, (MetaName)2675557154), + new PsoStructureEntryInfo(MetaName.Priority, PsoDataType.UByte, 376, 0, 0) + ); + case (MetaName)2675557154: + return new PsoStructureInfo((MetaName)2675557154, 0, 0, 360, + new PsoStructureEntryInfo(MetaName.LayerBlend, PsoDataType.Structure, 8, 0, (MetaName)2367955297), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.AnimatedPostFX), + new PsoStructureEntryInfo(MetaName.Layers, PsoDataType.Array, 48, 1, (MetaName)393217), + new PsoStructureEntryInfo(MetaName.GroupId, PsoDataType.SInt, 344, 0, 0), + new PsoStructureEntryInfo((MetaName)1991133938, PsoDataType.UInt, 348, 0, 0), + new PsoStructureEntryInfo((MetaName)4185090704, PsoDataType.UInt, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.EventType, PsoDataType.Enum, 356, 0, (MetaName)2168155209) + ); + case (MetaName)2367955297: + return new PsoStructureInfo((MetaName)2367955297, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.LayerA, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.LayerB, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.Disabled, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.FrequencyNoise, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.AmplitudeNoise, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.Frequency, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.Bias, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.AnimatedPostFX: + return new PsoStructureInfo(MetaName.AnimatedPostFX, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.ModifierName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AnimMode, PsoDataType.Enum, 12, 0, (MetaName)2476021071), + new PsoStructureEntryInfo(MetaName.StartDelayDuration, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.InDuration, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.HoldDuration, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.OutDuration, PsoDataType.UInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.Disabled, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.LoopMode, PsoDataType.Enum, 36, 0, (MetaName)3696221852), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 40, 0, 0) + ); + case (MetaName)1300198536: + return new PsoStructureInfo((MetaName)1300198536, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.LensArtefact), + new PsoStructureEntryInfo(MetaName.layers, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.LensArtefact: + return new PsoStructureInfo(MetaName.LensArtefact, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.blurType, PsoDataType.Enum, 12, 0, (MetaName)3261591327), + new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Float2, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.offset, PsoDataType.Float2, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.colorShift, PsoDataType.UInt, 32, 1, 0), + new PsoStructureEntryInfo(MetaName.opacity, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2600565536, PsoDataType.Enum, 40, 0, (MetaName)516897642), + new PsoStructureEntryInfo((MetaName)1250212400, PsoDataType.Float2, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.streakDirection, PsoDataType.Enum, 52, 0, (MetaName)2665868448), + new PsoStructureEntryInfo(MetaName.enabled, PsoDataType.Bool, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.sortIndex, PsoDataType.SInt, 60, 0, 0) + ); + case MetaName.CPtFxAssetInfoMgr: + return new PsoStructureInfo(MetaName.CPtFxAssetInfoMgr, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.ptfxAssetDependencyInfos, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.CPtFxAssetDependencyInfo: + return new PsoStructureInfo(MetaName.CPtFxAssetDependencyInfo, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.parentName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.childName, PsoDataType.String, 12, 7, 0) + ); + case MetaName.CVfxFogVolumeInfoMgr: + return new PsoStructureInfo(MetaName.CVfxFogVolumeInfoMgr, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.vfxFogVolumeInfos, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.CVfxFogVolumeInfo: + return new PsoStructureInfo(MetaName.CVfxFogVolumeInfo, 0, 0, 112, + new PsoStructureEntryInfo((MetaName)4135301713, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)1768347469, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.position, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.rotation, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.colR, PsoDataType.UByte, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.colG, PsoDataType.UByte, 65, 0, 0), + new PsoStructureEntryInfo(MetaName.colB, PsoDataType.UByte, 66, 0, 0), + new PsoStructureEntryInfo(MetaName.colA, PsoDataType.UByte, 67, 0, 0), + new PsoStructureEntryInfo(MetaName.hdrMult, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.range, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.density, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.falloff, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.interiorHash, PsoDataType.Long, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.isUnderwater, PsoDataType.Bool, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.lightingType, PsoDataType.Enum, 100, 0, (MetaName)2628996780) + ); + case MetaName.CVfxInteriorInfoMgr: + return new PsoStructureInfo(MetaName.CVfxInteriorInfoMgr, 0, 0, 56, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.vfxInteriorSetups, PsoDataType.Map, 8, 1, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.vfxInteriorInfos, PsoDataType.Map, 32, 1, (MetaName)196612) + ); + case MetaName.CVfxInteriorSetup: + return new PsoStructureInfo(MetaName.CVfxInteriorSetup, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.interiorInfoName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.vfxRoomSetups, PsoDataType.Map, 16, 1, (MetaName)65538) + ); + case MetaName.CVfxRoomSetup: + return new PsoStructureInfo(MetaName.CVfxRoomSetup, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.interiorInfoName, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CVfxInteriorInfo: + return new PsoStructureInfo(MetaName.CVfxInteriorInfo, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.smokePtFxEnabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.smokePtFxName, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.smokePtFxLevelOverride, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.dustPtFxEnabled, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.dustPtFxName, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.dustPtFxEvo, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CVfxPedInfoMgr: + return new PsoStructureInfo(MetaName.CVfxPedInfoMgr, 0, 0, 224, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)1639857157, PsoDataType.Map, 8, 1, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)190681942, PsoDataType.Map, 32, 1, (MetaName)196612), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)866013965, PsoDataType.Map, 56, 1, (MetaName)393223), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)619497315, PsoDataType.Map, 80, 1, (MetaName)589834), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)1719780883, PsoDataType.Map, 104, 1, (MetaName)786445), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)2436902422, PsoDataType.Map, 128, 1, (MetaName)983056), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)670699231, PsoDataType.Map, 152, 1, (MetaName)1179667), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)161646760, PsoDataType.Map, 176, 1, (MetaName)1376278), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.vfxPedInfos, PsoDataType.Map, 200, 1, (MetaName)1572889) + ); + case (MetaName)3745427162: + return new PsoStructureInfo((MetaName)3745427162, 0, 0, 104, + new PsoStructureEntryInfo((MetaName)2328909272, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)3928010395, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)1667415425, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3934831401, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2811575072, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3485910056, PsoDataType.SInt, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)924601972, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)2748666322, PsoDataType.SInt, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2717336085, PsoDataType.SInt, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)383606187, PsoDataType.SInt, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1201928922, PsoDataType.SInt, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2683338794, PsoDataType.SInt, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)244388834, PsoDataType.SInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3603110778, PsoDataType.SInt, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)1531021558, PsoDataType.SInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1193506380, PsoDataType.SInt, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)1561972343, PsoDataType.SInt, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)2527519128, PsoDataType.SInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.decalWidth, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.decalLength, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)1369041264, PsoDataType.UByte, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)1201263928, PsoDataType.UByte, 89, 0, 0), + new PsoStructureEntryInfo((MetaName)1596752989, PsoDataType.UByte, 90, 0, 0), + new PsoStructureEntryInfo((MetaName)2768457985, PsoDataType.UByte, 91, 0, 0), + new PsoStructureEntryInfo((MetaName)1822646338, PsoDataType.UByte, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)2318441304, PsoDataType.UByte, 93, 0, 0), + new PsoStructureEntryInfo(MetaName.decalLife, PsoDataType.Float, 96, 0, 0) + ); + case (MetaName)1299390333: + return new PsoStructureInfo((MetaName)1299390333, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)634726437, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)1754146930, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)4279228573, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxScale, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)2425920550: + return new PsoStructureInfo((MetaName)2425920550, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)3741812782, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)2206302043, PsoDataType.String, 12, 7, 0) + ); + case (MetaName)1811001251: + return new PsoStructureInfo((MetaName)1811001251, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.decalId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)3806811108, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)3913505542, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3041920342, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2666183704, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1369041264, PsoDataType.UByte, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1201263928, PsoDataType.UByte, 29, 0, 0), + new PsoStructureEntryInfo((MetaName)1596752989, PsoDataType.UByte, 30, 0, 0) + ); + case (MetaName)1559486096: + return new PsoStructureInfo((MetaName)1559486096, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ptFxName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ptFxDepthEvoMin, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxDepthEvoMax, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxSpeedEvoMin, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxSpeedEvoMax, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)4188307664: + return new PsoStructureInfo((MetaName)4188307664, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)3741812782, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)2206302043, PsoDataType.String, 12, 7, 0) + ); + case (MetaName)1073939452: + return new PsoStructureInfo((MetaName)1073939452, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.sizeEvo, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.depthMult, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.speedMult, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.widthRatio, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)2217981082: + return new PsoStructureInfo((MetaName)2217981082, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.sampleSize, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.boneSize, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)2990477260, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxEnabled, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxEnabled, PsoDataType.Bool, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxEnabled, PsoDataType.Bool, 19, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxEnabled, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2545172352, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxRange, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxRange, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxRange, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxRange, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1146082049, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CVfxPedInfo: + return new PsoStructureInfo(MetaName.CVfxPedInfo, 0, 0, 512, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)231867887), + new PsoStructureEntryInfo((MetaName)293516458, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1904273735), + new PsoStructureEntryInfo((MetaName)4005470263, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)1938733863, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)2108095349, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)898188953, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)815580680, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)728045365, PsoDataType.Bool, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1340027467, PsoDataType.Bool, 57, 0, 0), + new PsoStructureEntryInfo((MetaName)1185708987, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)3067401171, PsoDataType.Bool, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)267862759, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)481653295, PsoDataType.Bool, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)3695423274, PsoDataType.Bool, 73, 0, 0), + new PsoStructureEntryInfo((MetaName)1954970508, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)1273209835, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)1481826432, PsoDataType.Bool, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)1210003497, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)3343556845, PsoDataType.Bool, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)300193613, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)2234775971, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)2648212357, PsoDataType.Bool, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)2189031336, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)1537566823, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)2106749959, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)621919678, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)1944160314, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)537443923, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)1293634249, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)1694886060, PsoDataType.Bool, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)3575961872, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo((MetaName)423449081, PsoDataType.String, 144, 7, 0), + new PsoStructureEntryInfo((MetaName)4063560113, PsoDataType.Bool, 148, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1810355587), + new PsoStructureEntryInfo((MetaName)1379225165, PsoDataType.Array, 152, 0, (MetaName)34), + new PsoStructureEntryInfo((MetaName)2002559884, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo((MetaName)717291862, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo((MetaName)606684208, PsoDataType.Bool, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)2292742472, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)1437576219, PsoDataType.String, 184, 7, 0), + new PsoStructureEntryInfo((MetaName)3754033729, PsoDataType.Enum, 188, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo((MetaName)1020967481, PsoDataType.Enum, 192, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo((MetaName)2592389483, PsoDataType.Bool, 196, 0, 0), + new PsoStructureEntryInfo((MetaName)4054422403, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo((MetaName)740137113, PsoDataType.String, 204, 7, 0), + new PsoStructureEntryInfo((MetaName)1841095686, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo((MetaName)886073686, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo((MetaName)1055815172, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo((MetaName)2913384203, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo((MetaName)3977079346, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo((MetaName)3136327436, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo((MetaName)2168759960, PsoDataType.Bool, 232, 0, 0), + new PsoStructureEntryInfo((MetaName)2723487263, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo((MetaName)1349459576, PsoDataType.String, 240, 7, 0), + new PsoStructureEntryInfo((MetaName)2366514623, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo((MetaName)194784077, PsoDataType.Float, 248, 0, 0), + new PsoStructureEntryInfo((MetaName)1052325933, PsoDataType.Float, 252, 0, 0), + new PsoStructureEntryInfo((MetaName)2774545125, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo((MetaName)431439807, PsoDataType.Bool, 260, 0, 0), + new PsoStructureEntryInfo((MetaName)2591692617, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo((MetaName)2631634259, PsoDataType.String, 268, 7, 0), + new PsoStructureEntryInfo((MetaName)3959299203, PsoDataType.Float, 272, 0, 0), + new PsoStructureEntryInfo((MetaName)2821295083, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo((MetaName)3995586056, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo((MetaName)3353201139, PsoDataType.Float, 284, 0, 0), + new PsoStructureEntryInfo((MetaName)412619038, PsoDataType.Bool, 288, 0, 0), + new PsoStructureEntryInfo((MetaName)1889989706, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo((MetaName)3972116805, PsoDataType.Bool, 296, 0, 0), + new PsoStructureEntryInfo((MetaName)4143286255, PsoDataType.String, 300, 7, 0), + new PsoStructureEntryInfo((MetaName)30217815, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo((MetaName)1079949132, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo((MetaName)4224134658, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo((MetaName)901763385, PsoDataType.Bool, 316, 0, 0), + new PsoStructureEntryInfo((MetaName)3950900138, PsoDataType.String, 320, 7, 0), + new PsoStructureEntryInfo((MetaName)10501246, PsoDataType.Float, 324, 0, 0), + new PsoStructureEntryInfo((MetaName)4131076032, PsoDataType.Float, 328, 0, 0), + new PsoStructureEntryInfo((MetaName)1327278534, PsoDataType.Float, 332, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxName, PsoDataType.String, 336, 7, 0), + new PsoStructureEntryInfo((MetaName)374673880, PsoDataType.Float, 340, 0, 0), + new PsoStructureEntryInfo((MetaName)1335117116, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo((MetaName)4258146773, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxName, PsoDataType.String, 352, 7, 0), + new PsoStructureEntryInfo((MetaName)4020845257, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo((MetaName)1518647754, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxName, PsoDataType.String, 364, 7, 0), + new PsoStructureEntryInfo((MetaName)4021444798, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)2149475580, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxName, PsoDataType.String, 376, 7, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxSpeedEvoMin, PsoDataType.Float, 380, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxSpeedEvoMax, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo((MetaName)4096431642, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo((MetaName)415880732, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo((MetaName)3919360765, PsoDataType.String, 396, 7, 0), + new PsoStructureEntryInfo((MetaName)3723675330, PsoDataType.Float, 400, 0, 0), + new PsoStructureEntryInfo((MetaName)3295859425, PsoDataType.Bool, 404, 0, 0), + new PsoStructureEntryInfo((MetaName)1659367240, PsoDataType.String, 408, 7, 0), + new PsoStructureEntryInfo((MetaName)2238873027, PsoDataType.String, 412, 7, 0), + new PsoStructureEntryInfo((MetaName)3354804163, PsoDataType.String, 416, 7, 0), + new PsoStructureEntryInfo((MetaName)1800302370, PsoDataType.String, 420, 7, 0), + new PsoStructureEntryInfo((MetaName)2345868328, PsoDataType.String, 424, 7, 0), + new PsoStructureEntryInfo((MetaName)2719523535, PsoDataType.Float, 428, 0, 0), + new PsoStructureEntryInfo((MetaName)460277230, PsoDataType.Float, 432, 0, 0), + new PsoStructureEntryInfo((MetaName)4222549442, PsoDataType.Float, 436, 0, 0), + new PsoStructureEntryInfo((MetaName)2205812843, PsoDataType.Bool, 440, 0, 0), + new PsoStructureEntryInfo((MetaName)2543787987, PsoDataType.Float, 444, 0, 0), + new PsoStructureEntryInfo((MetaName)789559375, PsoDataType.String, 448, 7, 0), + new PsoStructureEntryInfo((MetaName)610648776, PsoDataType.Enum, 452, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo((MetaName)2321865573, PsoDataType.Bool, 456, 0, 0), + new PsoStructureEntryInfo((MetaName)3482316648, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo((MetaName)3414327374, PsoDataType.String, 464, 7, 0), + new PsoStructureEntryInfo((MetaName)3991249477, PsoDataType.Enum, 468, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo((MetaName)3633780286, PsoDataType.Bool, 472, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3663974917), + new PsoStructureEntryInfo((MetaName)1614411627, PsoDataType.Array, 480, 0, (MetaName)113), + new PsoStructureEntryInfo((MetaName)2158250314, PsoDataType.Bool, 496, 0, 0), + new PsoStructureEntryInfo((MetaName)2801240542, PsoDataType.Float, 500, 0, 0), + new PsoStructureEntryInfo((MetaName)1702406422, PsoDataType.String, 504, 7, 0) + ); + case (MetaName)231867887: + return new PsoStructureInfo((MetaName)231867887, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.vfxGroup, PsoDataType.Enum, 8, 0, MetaName.eVfxGroup), + new PsoStructureEntryInfo((MetaName)3557178741, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)3535009775, PsoDataType.String, 16, 7, 0) + ); + case (MetaName)1904273735: + return new PsoStructureInfo((MetaName)1904273735, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)2366957880, PsoDataType.Enum, 8, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo((MetaName)1407284946, PsoDataType.Enum, 12, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo(MetaName.limbId, PsoDataType.Enum, 16, 0, (MetaName)726948528), + new PsoStructureEntryInfo((MetaName)1061041502, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo((MetaName)2989606868, PsoDataType.String, 24, 7, 0) + ); + case (MetaName)1810355587: + return new PsoStructureInfo((MetaName)1810355587, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ptFxName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)2366957880, PsoDataType.Enum, 12, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo((MetaName)1407284946, PsoDataType.Enum, 16, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo(MetaName.limbId, PsoDataType.SInt, 20, 0, 0) + ); + case (MetaName)3663974917: + return new PsoStructureInfo((MetaName)3663974917, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ptFxName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)2366957880, PsoDataType.Enum, 12, 0, MetaName.eAnimBoneTag), + new PsoStructureEntryInfo((MetaName)1407284946, PsoDataType.Enum, 16, 0, MetaName.eAnimBoneTag) + ); + case MetaName.CVfxRegionInfoMgr: + return new PsoStructureInfo(MetaName.CVfxRegionInfoMgr, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.vfxRegionInfos, PsoDataType.Map, 8, 1, (MetaName)1) + ); + case MetaName.CVfxRegionInfo: + return new PsoStructureInfo(MetaName.CVfxRegionInfo, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.windDebrisPtFxEnabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.windDebrisPtFxName, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)215011533), + new PsoStructureEntryInfo((MetaName)157134441, PsoDataType.Array, 16, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)215011533), + new PsoStructureEntryInfo((MetaName)2975635968, PsoDataType.Array, 32, 0, (MetaName)4), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)215011533), + new PsoStructureEntryInfo((MetaName)3751751493, PsoDataType.Array, 48, 0, (MetaName)6) + ); + case (MetaName)215011533: + return new PsoStructureInfo((MetaName)215011533, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.gpuPtFxEnabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)28713766, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)3099312282, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3614737265, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2437695423, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1775217766, PsoDataType.SInt, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1202806570, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)4204794351, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)634319578, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)552536380, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.CVfxVehicleInfoMgr: + return new PsoStructureInfo(MetaName.CVfxVehicleInfoMgr, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.vfxVehicleInfos, PsoDataType.Map, 8, 1, (MetaName)1) + ); + case MetaName.CVfxVehicleInfo: + return new PsoStructureInfo(MetaName.CVfxVehicleInfo, 0, 0, 880, + new PsoStructureEntryInfo(MetaName.mtlBangPtFxVehicleEvo, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.mtlBangPtFxVehicleScale, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.mtlScrapePtFxVehicleEvo, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.mtlScrapePtFxVehicleScale, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxEnabled, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxName, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxCutOffSpeed, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxRange, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxScale, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxSpeedEvoMin, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxSpeedEvoMax, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxTempEvoMin, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxTempEvoMax, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.exhaustPtFxThrottleEvoOnGearChange, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.engineStartupPtFxEnabled, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.engineStartupPtFxName, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo(MetaName.engineStartupPtFxRange, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.misfirePtFxEnabled, PsoDataType.Bool, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.misfirePtFxName, PsoDataType.String, 76, 7, 0), + new PsoStructureEntryInfo(MetaName.misfirePtFxRange, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.backfirePtFxEnabled, PsoDataType.Bool, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.backfirePtFxName, PsoDataType.String, 88, 7, 0), + new PsoStructureEntryInfo(MetaName.backfirePtFxRange, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxEnabled, PsoDataType.Bool, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxHasPanel, PsoDataType.Bool, 97, 0, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxHasRotorEvo, PsoDataType.Bool, 98, 0, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxNoPanelName, PsoDataType.String, 100, 7, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxPanelOpenName, PsoDataType.String, 104, 7, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxPanelShutName, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxRange, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxSpeedEvoMin, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.engineDamagePtFxSpeedEvoMax, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxEnabled, PsoDataType.Bool, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxName, PsoDataType.String, 128, 7, 0), + new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxRange, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxAngleThresh, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxSpeedThresh, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.overturnedSmokePtFxEngineHealthThresh, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.leakPtFxEnabled, PsoDataType.Bool, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.leakPtFxOilName, PsoDataType.String, 152, 7, 0), + new PsoStructureEntryInfo(MetaName.leakPtFxPetrolName, PsoDataType.String, 156, 7, 0), + new PsoStructureEntryInfo(MetaName.leakPtFxRange, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.leakPtFxSpeedEvoMin, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.leakPtFxSpeedEvoMax, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelGenericPtFxSet, PsoDataType.SInt, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelGenericDecalSet, PsoDataType.SInt, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelGenericRangeMult, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelSkidmarkRearOnly, PsoDataType.Bool, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelSkidmarkSlipMult, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelSkidmarkPressureMult, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelFrictionPtFxFricMult, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelDisplacementPtFxDispMult, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelBurnoutPtFxFricMult, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelBurnoutPtFxTempMult, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelLowLodPtFxScale, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelPuncturePtFxName, PsoDataType.String, 216, 7, 0), + new PsoStructureEntryInfo(MetaName.wheelPuncturePtFxRange, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelBurstPtFxName, PsoDataType.String, 224, 7, 0), + new PsoStructureEntryInfo(MetaName.wheelBurstPtFxRange, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelFirePtFxName, PsoDataType.String, 232, 7, 0), + new PsoStructureEntryInfo(MetaName.wheelFirePtFxRange, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelFirePtFxSpeedEvoMin, PsoDataType.Float, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.wheelFirePtFxSpeedEvoMax, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFirePtFxEnabled, PsoDataType.Bool, 248, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFirePtFxName, PsoDataType.String, 252, 7, 0), + new PsoStructureEntryInfo(MetaName.wreckedFirePtFxDurationMin, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFirePtFxDurationMax, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFirePtFxRadius, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxEnabled, PsoDataType.Bool, 268, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxName, PsoDataType.String, 272, 7, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxDurationMin, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxDurationMax, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire2PtFxRadius, PsoDataType.Float, 284, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire2UseOverheatBone, PsoDataType.Bool, 288, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire2OffsetPos, PsoDataType.Float3, 304, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxEnabled, PsoDataType.Bool, 320, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxName, PsoDataType.String, 324, 7, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxDurationMin, PsoDataType.Float, 328, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxDurationMax, PsoDataType.Float, 332, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire3PtFxRadius, PsoDataType.Float, 336, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire3UseOverheatBone, PsoDataType.Bool, 340, 0, 0), + new PsoStructureEntryInfo(MetaName.wreckedFire3OffsetPos, PsoDataType.Float3, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxName, PsoDataType.String, 368, 7, 0), + new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxRange, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxSpeedEvoMin, PsoDataType.Float, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxSpeedEvoMax, PsoDataType.Float, 380, 0, 0), + new PsoStructureEntryInfo(MetaName.petrolTankFirePtFxRadius, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.boatEntryPtFxEnabled, PsoDataType.Bool, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.boatEntryPtFxRange, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.boatEntryPtFxName, PsoDataType.String, 396, 7, 0), + new PsoStructureEntryInfo(MetaName.boatEntryPtFxSpeedEvoMin, PsoDataType.Float, 400, 0, 0), + new PsoStructureEntryInfo(MetaName.boatEntryPtFxSpeedEvoMax, PsoDataType.Float, 404, 0, 0), + new PsoStructureEntryInfo(MetaName.boatEntryPtFxScale, PsoDataType.Float, 408, 0, 0), + new PsoStructureEntryInfo(MetaName.boatExitPtFxEnabled, PsoDataType.Bool, 412, 0, 0), + new PsoStructureEntryInfo(MetaName.boatExitPtFxRange, PsoDataType.Float, 416, 0, 0), + new PsoStructureEntryInfo(MetaName.boatExitPtFxName, PsoDataType.String, 420, 7, 0), + new PsoStructureEntryInfo(MetaName.boatExitPtFxSpeedEvoMin, PsoDataType.Float, 424, 0, 0), + new PsoStructureEntryInfo(MetaName.boatExitPtFxSpeedEvoMax, PsoDataType.Float, 428, 0, 0), + new PsoStructureEntryInfo(MetaName.boatExitPtFxScale, PsoDataType.Float, 432, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxEnabled, PsoDataType.Bool, 436, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxRange, PsoDataType.Float, 440, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxForwardName, PsoDataType.String, 444, 7, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxReverseName, PsoDataType.String, 448, 7, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxForwardMountedName, PsoDataType.String, 452, 7, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxForwardMountedOffset, PsoDataType.Float3, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxSpeedEvoMin, PsoDataType.Float, 480, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxSpeedEvoMax, PsoDataType.Float, 484, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxKeelEvoMin, PsoDataType.Float, 488, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxKeelEvoMax, PsoDataType.Float, 492, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxScale, PsoDataType.Float, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.boatBowPtFxReverseOffset, PsoDataType.Float, 500, 0, 0), + new PsoStructureEntryInfo(MetaName.boatWashPtFxEnabled, PsoDataType.Bool, 504, 0, 0), + new PsoStructureEntryInfo(MetaName.boatWashPtFxRange, PsoDataType.Float, 508, 0, 0), + new PsoStructureEntryInfo(MetaName.boatWashPtFxName, PsoDataType.String, 512, 7, 0), + new PsoStructureEntryInfo(MetaName.boatWashPtFxSpeedEvoMin, PsoDataType.Float, 516, 0, 0), + new PsoStructureEntryInfo(MetaName.boatWashPtFxSpeedEvoMax, PsoDataType.Float, 520, 0, 0), + new PsoStructureEntryInfo(MetaName.boatWashPtFxScale, PsoDataType.Float, 524, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxEnabled, PsoDataType.Bool, 528, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxRange, PsoDataType.Float, 532, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxName, PsoDataType.String, 536, 7, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxForwardSpeedEvoMin, PsoDataType.Float, 540, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxForwardSpeedEvoMax, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxBackwardSpeedEvoMin, PsoDataType.Float, 548, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxBackwardSpeedEvoMax, PsoDataType.Float, 552, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxDepthEvoMin, PsoDataType.Float, 556, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxDepthEvoMax, PsoDataType.Float, 560, 0, 0), + new PsoStructureEntryInfo(MetaName.boatPropellerPtFxScale, PsoDataType.Float, 564, 0, 0), + new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxEnabled, PsoDataType.Bool, 568, 0, 0), + new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxRangeMin, PsoDataType.Float, 572, 0, 0), + new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxRangeMax, PsoDataType.Float, 576, 0, 0), + new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxName, PsoDataType.String, 580, 7, 0), + new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxSpeedEvoMin, PsoDataType.Float, 584, 0, 0), + new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxSpeedEvoMax, PsoDataType.Float, 588, 0, 0), + new PsoStructureEntryInfo(MetaName.boatLowLodWakePtFxScale, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.planeAfterburnerPtFxEnabled, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.planeAfterburnerPtFxName, PsoDataType.String, 600, 7, 0), + new PsoStructureEntryInfo(MetaName.planeAfterburnerPtFxRange, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.planeAfterburnerPtFxScale, PsoDataType.Float, 608, 0, 0), + new PsoStructureEntryInfo(MetaName.planeWingTipPtFxEnabled, PsoDataType.Bool, 612, 0, 0), + new PsoStructureEntryInfo(MetaName.planeWingTipPtFxName, PsoDataType.String, 616, 7, 0), + new PsoStructureEntryInfo(MetaName.planeWingTipPtFxRange, PsoDataType.Float, 620, 0, 0), + new PsoStructureEntryInfo(MetaName.planeWingTipPtFxSpeedEvoMin, PsoDataType.Float, 624, 0, 0), + new PsoStructureEntryInfo(MetaName.planeWingTipPtFxSpeedEvoMax, PsoDataType.Float, 628, 0, 0), + new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxEnabled, PsoDataType.Bool, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxName, PsoDataType.String, 636, 7, 0), + new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxRange, PsoDataType.Float, 640, 0, 0), + new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxSpeedEvoMin, PsoDataType.Float, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.planeDamageFirePtFxSpeedEvoMax, PsoDataType.Float, 648, 0, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxEnabled, PsoDataType.Bool, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameDefault, PsoDataType.String, 656, 7, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameSand, PsoDataType.String, 660, 7, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameDirt, PsoDataType.String, 664, 7, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameWater, PsoDataType.String, 668, 7, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxNameFoliage, PsoDataType.String, 672, 7, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxRange, PsoDataType.Float, 676, 0, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxDist, PsoDataType.Float, 680, 0, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxSpeedEvoMin, PsoDataType.Float, 684, 0, 0), + new PsoStructureEntryInfo(MetaName.planeGroundDisturbPtFxSpeedEvoMax, PsoDataType.Float, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxEnabled, PsoDataType.Bool, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxName, PsoDataType.String, 696, 7, 0), + new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxRange, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxSpeedEvoMin, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftSectionDamageSmokePtFxSpeedEvoMax, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxEnabled, PsoDataType.Bool, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameDefault, PsoDataType.String, 716, 7, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameSand, PsoDataType.String, 720, 7, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameDirt, PsoDataType.String, 724, 7, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameWater, PsoDataType.String, 728, 7, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxNameFoliage, PsoDataType.String, 732, 7, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxRange, PsoDataType.Float, 736, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxDist, PsoDataType.Float, 740, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxSpeedEvoMin, PsoDataType.Float, 744, 0, 0), + new PsoStructureEntryInfo(MetaName.aircraftDownwashPtFxSpeedEvoMax, PsoDataType.Float, 748, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxEnabled, PsoDataType.Bool, 752, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxRange, PsoDataType.Float, 756, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxName, PsoDataType.String, 760, 7, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxSizeEvoMax, PsoDataType.Float, 764, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedDownwardThresh, PsoDataType.Float, 768, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedLateralEvoMin, PsoDataType.Float, 772, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedLateralEvoMax, PsoDataType.Float, 776, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedDownwardEvoMin, PsoDataType.Float, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.splashInPtFxSpeedDownwardEvoMax, PsoDataType.Float, 784, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxEnabled, PsoDataType.Bool, 788, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxRange, PsoDataType.Float, 792, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxName, PsoDataType.String, 796, 7, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxSizeEvoMax, PsoDataType.Float, 800, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxSpeedLateralEvoMin, PsoDataType.Float, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxSpeedLateralEvoMax, PsoDataType.Float, 808, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxSpeedUpwardEvoMin, PsoDataType.Float, 812, 0, 0), + new PsoStructureEntryInfo(MetaName.splashOutPtFxSpeedUpwardEvoMax, PsoDataType.Float, 816, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxEnabled, PsoDataType.Bool, 820, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxRange, PsoDataType.Float, 824, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxName, PsoDataType.String, 828, 7, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxSizeEvoMax, PsoDataType.Float, 832, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxSpeedVehicleEvoMin, PsoDataType.Float, 836, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxSpeedVehicleEvoMax, PsoDataType.Float, 840, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxSpeedRiverEvoMin, PsoDataType.Float, 844, 0, 0), + new PsoStructureEntryInfo(MetaName.splashWadePtFxSpeedRiverEvoMax, PsoDataType.Float, 848, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxEnabled, PsoDataType.Bool, 852, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxRange, PsoDataType.Float, 856, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxName, PsoDataType.String, 860, 7, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxSizeEvoMax, PsoDataType.Float, 864, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxSpeedEvoMin, PsoDataType.Float, 868, 0, 0), + new PsoStructureEntryInfo(MetaName.splashTrailPtFxSpeedEvoMax, PsoDataType.Float, 872, 0, 0) + ); + case MetaName.CVfxWeaponInfoMgr: + return new PsoStructureInfo(MetaName.CVfxWeaponInfoMgr, 0, 0, 56, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)3938144758, PsoDataType.Map, 8, 1, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo((MetaName)735539988, PsoDataType.Map, 32, 1, (MetaName)196612) + ); + case (MetaName)2452529929: + return new PsoStructureInfo((MetaName)2452529929, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)294307720, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.probability, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.colTint, PsoDataType.UInt, 20, 1, 0) + ); + case (MetaName)1794703310: + return new PsoStructureInfo((MetaName)1794703310, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)1914084434, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.probability, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)3089927233, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2658317066, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CProceduralInfo: + return new PsoStructureInfo(MetaName.CProceduralInfo, 0, 0, 4120, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2143317860), + new PsoStructureEntryInfo(MetaName.procObjInfos, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPlantInfo), + new PsoStructureEntryInfo(MetaName.plantInfos, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3343541253), + new PsoStructureEntryInfo(MetaName.procTagTable, PsoDataType.Array, 40, 4, (MetaName)16711684) + ); + case (MetaName)3343541253: + return new PsoStructureInfo((MetaName)3343541253, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1599521754), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 8, 2, (MetaName)524288) + ); + case (MetaName)2143317860: + return new PsoStructureInfo((MetaName)2143317860, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Tag, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.PlantTag, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.Spacing, PsoDataType.HFloat, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinXRotation, PsoDataType.HFloat, 22, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxXRotation, PsoDataType.HFloat, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinYRotation, PsoDataType.HFloat, 26, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxYRotation, PsoDataType.HFloat, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinZRotation, PsoDataType.HFloat, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZRotation, PsoDataType.HFloat, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinScale, PsoDataType.HFloat, 34, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxScale, PsoDataType.HFloat, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinScaleZ, PsoDataType.HFloat, 38, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxScaleZ, PsoDataType.HFloat, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinZOffset, PsoDataType.HFloat, 42, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZOffset, PsoDataType.HFloat, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistance, PsoDataType.HFloat, 46, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.HFloat, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTintPalette, PsoDataType.UByte, 50, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTintPalette, PsoDataType.UByte, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)956281369), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 52, 2, (MetaName)524308) + ); + case MetaName.CPlantInfo: + return new PsoStructureInfo(MetaName.CPlantInfo, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Tag, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Color, PsoDataType.UInt, 12, 1, 0), + new PsoStructureEntryInfo(MetaName.GroundColor, PsoDataType.UInt, 16, 1, 0), + new PsoStructureEntryInfo(MetaName.ScaleXY, PsoDataType.HFloat, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleZ, PsoDataType.HFloat, 22, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleVariationXY, PsoDataType.HFloat, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleVariationZ, PsoDataType.HFloat, 26, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleRangeXYZ, PsoDataType.HFloat, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleRangeZ, PsoDataType.HFloat, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.MicroMovementsScaleH, PsoDataType.HFloat, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MicroMovementsScaleV, PsoDataType.HFloat, 34, 0, 0), + new PsoStructureEntryInfo(MetaName.MicroMovementsFreqH, PsoDataType.HFloat, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MicroMovementsFreqV, PsoDataType.HFloat, 38, 0, 0), + new PsoStructureEntryInfo(MetaName.WindBendScale, PsoDataType.HFloat, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.WindBendVariation, PsoDataType.HFloat, 42, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.HFloat, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.Density, PsoDataType.HFloat, 46, 0, 0), + new PsoStructureEntryInfo(MetaName.DensityRange, PsoDataType.HFloat, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.ModelId, PsoDataType.UByte, 50, 0, 0), + new PsoStructureEntryInfo(MetaName.TextureId, PsoDataType.UByte, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1247137385), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 52, 1, (MetaName)1048596), + new PsoStructureEntryInfo(MetaName.Intensity, PsoDataType.UByte, 54, 0, 0), + new PsoStructureEntryInfo(MetaName.IntensityVar, PsoDataType.UByte, 55, 0, 0) + ); + case MetaName.camMetadataStore: + return new PsoStructureInfo(MetaName.camMetadataStore, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.MetadataList, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.DirectorList, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case MetaName.camDepthOfFieldSettingsMetadata: + return new PsoStructureInfo(MetaName.camDepthOfFieldSettingsMetadata, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)3872687437, PsoDataType.Float2, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)809440628, PsoDataType.Float2, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)490969727, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3622576788, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1424443550, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3810611648, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1068831663, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1181720025, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)2941105367, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1760535059, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)244310625, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)2726944087, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)366578954, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1584584282, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)4112080817, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)4019248724, PsoDataType.Bool, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)3170603601, PsoDataType.Bool, 85, 0, 0), + new PsoStructureEntryInfo((MetaName)367424479, PsoDataType.Bool, 86, 0, 0), + new PsoStructureEntryInfo((MetaName)3748087913, PsoDataType.Bool, 87, 0, 0), + new PsoStructureEntryInfo((MetaName)981218312, PsoDataType.Bool, 88, 0, 0) + ); + case MetaName.camCinematicAnimatedCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicAnimatedCameraMetadata, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0) + ); + case MetaName.camCinematicCameraManCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicCameraManCameraMetadata, 0, 0, 328, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2962759393, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3005507009, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)114561573, PsoDataType.Bool, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1535052963, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3023548272, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)846082931, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)3539146194, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)3668836939, PsoDataType.UInt, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)1699827350, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1265046558, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)1161122588, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)3190591149, PsoDataType.UInt, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)2884448793, PsoDataType.UInt, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)69722150, PsoDataType.Bool, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.ScanRadius, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ScanDistance, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)199666231, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 112, 7, 0), + new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo((MetaName)3308026067, PsoDataType.String, 120, 7, 0), + new PsoStructureEntryInfo((MetaName)1279708504, PsoDataType.Structure, 128, 0, MetaName.camCinematicCameraOperatorShakeSettings), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo((MetaName)1035890821, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo((MetaName)3518053347, PsoDataType.Bool, 272, 0, 0), + new PsoStructureEntryInfo((MetaName)568093394, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo((MetaName)781245272, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo((MetaName)2596681112, PsoDataType.Bool, 284, 0, 0), + new PsoStructureEntryInfo((MetaName)1468609247, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo((MetaName)727781899, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo((MetaName)3140771983, PsoDataType.Float, 296, 0, 0), + new PsoStructureEntryInfo((MetaName)3196312636, PsoDataType.Bool, 300, 0, 0), + new PsoStructureEntryInfo((MetaName)3061937367, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo((MetaName)1900366054, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo((MetaName)4085704227, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo((MetaName)3250401979, PsoDataType.Float, 316, 0, 0), + new PsoStructureEntryInfo((MetaName)618136263, PsoDataType.Float, 320, 0, 0), + new PsoStructureEntryInfo((MetaName)2469116692, PsoDataType.Float, 324, 0, 0) + ); + case MetaName.camCinematicCameraOperatorShakeSettings: + return new PsoStructureInfo(MetaName.camCinematicCameraOperatorShakeSettings, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.UncertaintySettings, PsoDataType.Structure, 8, 0, MetaName.camCinematicCameraOperatorShakeUncertaintySettings), + new PsoStructureEntryInfo(MetaName.TurbulenceSettings, PsoDataType.Structure, 88, 0, MetaName.camCinematicCameraOperatorShakeTurbulenceSettings) + ); + case MetaName.camCinematicCameraOperatorShakeUncertaintySettings: + return new PsoStructureInfo(MetaName.camCinematicCameraOperatorShakeUncertaintySettings, 0, 0, 80, + new PsoStructureEntryInfo((MetaName)784117005, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)4083769430, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)4138212913, PsoDataType.Float2, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2793659114, PsoDataType.Float2, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2611684493, PsoDataType.Float2, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3850080675, PsoDataType.Float2, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)2902509544, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)3004590170, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ScalingFactor, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2280675285, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)933422390, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)3253772488, PsoDataType.Float, 72, 0, 0) + ); + case MetaName.camCinematicCameraOperatorShakeTurbulenceSettings: + return new PsoStructureInfo(MetaName.camCinematicCameraOperatorShakeTurbulenceSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)1741343660, PsoDataType.Float2, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceRange, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2902509544, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3004590170, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camCinematicHeliChaseCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicHeliChaseCameraMetadata, 0, 0, 392, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDuration, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3800346187, PsoDataType.UInt, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2004927681, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)408757490, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1805018741, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1929531797, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)1117152888, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3610993313, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2885533396, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1162205528, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2128811877, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)3504182592, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)2040715445, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)1346377414, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)495502725, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)3725520797, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)832331471, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)953228499, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)199666231, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)1288561522, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)4220570274, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)613448395, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)106130617, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)3190591149, PsoDataType.UInt, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)2884448793, PsoDataType.UInt, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)1265046558, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)1699827350, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)1161122588, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo((MetaName)781245272, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo((MetaName)568093394, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo((MetaName)2289962831, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo((MetaName)3658577234, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo((MetaName)3483998043, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.NearClip, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)2217923367, PsoDataType.Bool, 168, 0, 0), + new PsoStructureEntryInfo((MetaName)114561573, PsoDataType.Bool, 169, 0, 0), + new PsoStructureEntryInfo((MetaName)2187445607, PsoDataType.Bool, 170, 0, 0), + new PsoStructureEntryInfo((MetaName)1144995443, PsoDataType.Bool, 171, 0, 0), + new PsoStructureEntryInfo((MetaName)4185802977, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo((MetaName)315713489, PsoDataType.Bool, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 188, 7, 0), + new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 192, 7, 0), + new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 196, 7, 0), + new PsoStructureEntryInfo((MetaName)3308026067, PsoDataType.String, 200, 7, 0), + new PsoStructureEntryInfo((MetaName)1279708504, PsoDataType.Structure, 208, 0, MetaName.camCinematicCameraOperatorShakeSettings), + new PsoStructureEntryInfo((MetaName)983508410, PsoDataType.Float, 336, 0, 0), + new PsoStructureEntryInfo((MetaName)3451936358, PsoDataType.Float, 340, 0, 0), + new PsoStructureEntryInfo((MetaName)2352608445, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo((MetaName)618136263, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo((MetaName)2469116692, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo((MetaName)4085704227, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo((MetaName)3250401979, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo((MetaName)3574069037, PsoDataType.Float, 364, 0, 0), + new PsoStructureEntryInfo((MetaName)761184934, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)1444706843, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo((MetaName)218641622, PsoDataType.Float, 376, 0, 0), + new PsoStructureEntryInfo((MetaName)3061937367, PsoDataType.Float, 380, 0, 0), + new PsoStructureEntryInfo((MetaName)1900366054, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo((MetaName)1035890821, PsoDataType.Float, 388, 0, 0) + ); + case MetaName.camCinematicVehicleOrbitCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehicleOrbitCameraMetadata, 0, 0, 136, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.FovLimits, PsoDataType.Float2, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)315073442, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleDelta, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)559738595, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)3983210518, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)2153696126, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)765619120, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)3644129030, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)3991802629, PsoDataType.UInt, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicVehicleOrbitCameraInitalSettings), + new PsoStructureEntryInfo((MetaName)1539141183, PsoDataType.Array, 104, 0, (MetaName)20), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 128, 0, 0) + ); + case MetaName.camCinematicVehicleOrbitCameraInitalSettings: + return new PsoStructureInfo(MetaName.camCinematicVehicleOrbitCameraInitalSettings, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Heading, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingDelta, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camCinematicVehicleLowOrbitCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehicleLowOrbitCameraMetadata, 0, 0, 256, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.FovLimits, PsoDataType.Float2, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)315073442, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleDelta, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2037218535, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)4219845621, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)1088437692, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)3983210518, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)565251953, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)2153696126, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)765619120, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicVehicleOrbitCameraInitalSettings), + new PsoStructureEntryInfo((MetaName)1539141183, PsoDataType.Array, 112, 0, (MetaName)MetaTypeName.UINT), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)1958709726, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo((MetaName)2815616753, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo((MetaName)2843406703, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo((MetaName)4109249654, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo((MetaName)565527739, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)3889226535, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo((MetaName)3920334627, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo((MetaName)3189979615, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)1031927866, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)2223609026, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo((MetaName)752307799, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo((MetaName)1612512934, PsoDataType.Structure, 192, 0, MetaName.camSpeedRelativeShakeSettingsMetadata), + new PsoStructureEntryInfo(MetaName.HighSpeedShakeSettings, PsoDataType.Structure, 224, 0, MetaName.camSpeedRelativeShakeSettingsMetadata) + ); + case MetaName.camSpeedRelativeShakeSettingsMetadata: + return new PsoStructureInfo(MetaName.camSpeedRelativeShakeSettingsMetadata, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3092190689, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camCinematicIdleCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicIdleCameraMetadata, 0, 0, 168, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1305640980, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)653716069, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)887335192, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.WideShot, PsoDataType.Structure, 48, 0, MetaName.camCinematicIdleShots), + new PsoStructureEntryInfo(MetaName.MediumShot, PsoDataType.Structure, 72, 0, MetaName.camCinematicIdleShots), + new PsoStructureEntryInfo((MetaName)2026925651, PsoDataType.Structure, 96, 0, MetaName.camCinematicIdleShots), + new PsoStructureEntryInfo((MetaName)2443187932, PsoDataType.Float2, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)3983210518, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo((MetaName)762567518, PsoDataType.Float2, 148, 0, 0), + new PsoStructureEntryInfo((MetaName)348135302, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.Float, 160, 0, 0) + ); + case MetaName.camCinematicIdleShots: + return new PsoStructureInfo(MetaName.camCinematicIdleShots, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceLimits, PsoDataType.Float2, 16, 0, 0) + ); + case MetaName.camCinematicFirstPersonIdleCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicFirstPersonIdleCameraMetadata, 0, 0, 200, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.tacticalXml, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)2146055434, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)498489070, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)642179285, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)3833690476, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)91642876, PsoDataType.UInt, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3423831703, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1365351828, PsoDataType.UInt, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)1799833343, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)2451425179, PsoDataType.UInt, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2398830068, PsoDataType.UInt, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)4013543182, PsoDataType.UInt, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)4060544092, PsoDataType.UInt, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)1863497759, PsoDataType.UInt, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)2865768466, PsoDataType.UInt, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)2935498108, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)3267214601, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)25343385, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)2453008156, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)333391552, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)3472598366, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)3523922750, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)27172088, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)2656885705, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)3821389091, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)3137663245, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)2149837453, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)1352549573, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo((MetaName)559353307, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo((MetaName)340096669, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo((MetaName)3997020725, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo((MetaName)1330235813, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo((MetaName)3625015755, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo((MetaName)815735892, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)2653018133, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo((MetaName)3754548217, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo((MetaName)216085311, PsoDataType.UInt, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)811132412, PsoDataType.UInt, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)1561520371, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo((MetaName)2384466151, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo((MetaName)1800176594, PsoDataType.Float, 192, 0, 0) + ); + case MetaName.camCinematicStuntCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicStuntCameraMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.FovLimits, PsoDataType.Float2, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3686787728, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)2332427685, PsoDataType.Float2, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)3195921543, PsoDataType.Float2, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)2033229500, PsoDataType.Float2, 60, 0, 0) + ); + case MetaName.camCinematicGroupCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicGroupCameraMetadata, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.FovLimits, PsoDataType.Float2, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3686787728, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)4150576777, PsoDataType.Float2, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)3434528744, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)2373655501, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)400251000, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1035890821, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)1856660360, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 92, 0, 0) + ); + case MetaName.camCinematicTrainTrackingCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicTrainTrackingCameraMetadata, 0, 0, 400, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2962759393, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3005507009, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)114561573, PsoDataType.Bool, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1535052963, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3023548272, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)846082931, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)3539146194, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)3668836939, PsoDataType.UInt, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)1699827350, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1265046558, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)1161122588, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)3190591149, PsoDataType.UInt, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)2884448793, PsoDataType.UInt, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)69722150, PsoDataType.Bool, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.ScanRadius, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ScanDistance, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)199666231, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 112, 7, 0), + new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo((MetaName)3308026067, PsoDataType.String, 120, 7, 0), + new PsoStructureEntryInfo((MetaName)1279708504, PsoDataType.Structure, 128, 0, MetaName.camCinematicCameraOperatorShakeSettings), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo((MetaName)1035890821, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo((MetaName)3518053347, PsoDataType.Bool, 272, 0, 0), + new PsoStructureEntryInfo((MetaName)568093394, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo((MetaName)781245272, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo((MetaName)2596681112, PsoDataType.Bool, 284, 0, 0), + new PsoStructureEntryInfo((MetaName)1468609247, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo((MetaName)727781899, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo((MetaName)3140771983, PsoDataType.Float, 296, 0, 0), + new PsoStructureEntryInfo((MetaName)3196312636, PsoDataType.Bool, 300, 0, 0), + new PsoStructureEntryInfo((MetaName)3061937367, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo((MetaName)1900366054, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo((MetaName)4085704227, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo((MetaName)3250401979, PsoDataType.Float, 316, 0, 0), + new PsoStructureEntryInfo((MetaName)618136263, PsoDataType.Float, 320, 0, 0), + new PsoStructureEntryInfo((MetaName)2469116692, PsoDataType.Float, 324, 0, 0), + new PsoStructureEntryInfo((MetaName)886237220, PsoDataType.Float3, 336, 0, 0), + new PsoStructureEntryInfo((MetaName)649866655, PsoDataType.Float2, 352, 0, 0), + new PsoStructureEntryInfo((MetaName)3049827950, PsoDataType.Float2, 360, 0, 0), + new PsoStructureEntryInfo((MetaName)1066491626, PsoDataType.Float2, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)3832386323, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo((MetaName)412149987, PsoDataType.Float2, 384, 0, 0) + ); + case MetaName.camCinematicMountedCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadata, 0, 0, 1344, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.MobilePhoneCameraControlHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo((MetaName)3464513788, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.RagdollBlendEnvelopeRef, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo((MetaName)4071354708, PsoDataType.String, 52, 7, 0), + new PsoStructureEntryInfo((MetaName)972815273, PsoDataType.String, 56, 7, 0), + new PsoStructureEntryInfo((MetaName)844800904, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo((MetaName)648641770, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo((MetaName)722540604, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo((MetaName)3400674238, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo((MetaName)885223840, PsoDataType.String, 76, 7, 0), + new PsoStructureEntryInfo(MetaName.SpringMountRef, PsoDataType.String, 80, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachPosition, PsoDataType.Float3, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)1792533284, PsoDataType.Float3, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.BoneRelativeAttachOffset, PsoDataType.Float3, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)3162861957, PsoDataType.Float3, 144, 0, 0), + new PsoStructureEntryInfo((MetaName)2981089011, PsoDataType.Float3, 160, 0, 0), + new PsoStructureEntryInfo((MetaName)464677746, PsoDataType.Float3, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)2301891370, PsoDataType.Float3, 192, 0, 0), + new PsoStructureEntryInfo((MetaName)1452169682, PsoDataType.Float3, 208, 0, 0), + new PsoStructureEntryInfo((MetaName)4196591490, PsoDataType.Float3, 224, 0, 0), + new PsoStructureEntryInfo((MetaName)1001532487, PsoDataType.Float3, 240, 0, 0), + new PsoStructureEntryInfo((MetaName)1862921276, PsoDataType.Float3, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantLimits, PsoDataType.Float2, 272, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantLimitsForPassengers, PsoDataType.Float2, 280, 0, 0), + new PsoStructureEntryInfo((MetaName)3248777081, PsoDataType.Float2, 288, 0, 0), + new PsoStructureEntryInfo((MetaName)74704022, PsoDataType.Float2, 296, 0, 0), + new PsoStructureEntryInfo((MetaName)4088070730, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo((MetaName)2782354748, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo((MetaName)1994565733, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo((MetaName)383680708, PsoDataType.Float, 316, 0, 0), + new PsoStructureEntryInfo((MetaName)2931383793, PsoDataType.Bool, 320, 0, 0), + new PsoStructureEntryInfo((MetaName)1919709187, PsoDataType.Float, 324, 0, 0), + new PsoStructureEntryInfo((MetaName)945934562, PsoDataType.Float, 328, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultRelativePitch, PsoDataType.Float, 332, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultReversePitch, PsoDataType.Float, 336, 0, 0), + new PsoStructureEntryInfo((MetaName)742850166, PsoDataType.Float, 340, 0, 0), + new PsoStructureEntryInfo((MetaName)2686299665, PsoDataType.Float2, 344, 0, 0), + new PsoStructureEntryInfo((MetaName)1473955583, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo((MetaName)704024974, PsoDataType.Bool, 356, 0, 0), + new PsoStructureEntryInfo((MetaName)2135497875, PsoDataType.Bool, 357, 0, 0), + new PsoStructureEntryInfo((MetaName)4187867131, PsoDataType.Bool, 358, 0, 0), + new PsoStructureEntryInfo((MetaName)2423170684, PsoDataType.Structure, 360, 0, MetaName.camCinematicMountedCameraMetadataRelativePitchScalingToThrottle), + new PsoStructureEntryInfo(MetaName.HighSpeedShakeSettings, PsoDataType.Structure, 376, 0, MetaName.camSpeedRelativeShakeSettingsMetadata), + new PsoStructureEntryInfo((MetaName)1672349165, PsoDataType.Structure, 408, 0, MetaName.camSpeedRelativeShakeSettingsMetadata), + new PsoStructureEntryInfo(MetaName.RocketSettings, PsoDataType.Structure, 440, 0, MetaName.camVehicleRocketSettings), + new PsoStructureEntryInfo((MetaName)1913942883, PsoDataType.Bool, 456, 0, 0), + new PsoStructureEntryInfo((MetaName)3459873736, PsoDataType.Bool, 457, 0, 0), + new PsoStructureEntryInfo((MetaName)880876795, PsoDataType.Bool, 458, 0, 0), + new PsoStructureEntryInfo((MetaName)153965986, PsoDataType.Structure, 464, 0, MetaName.camCinematicMountedCameraMetadataLookAroundSettings), + new PsoStructureEntryInfo((MetaName)1625111759, PsoDataType.Structure, 504, 0, MetaName.camCinematicMountedCameraMetadataLookAroundSettings), + new PsoStructureEntryInfo((MetaName)2701071860, PsoDataType.Structure, 544, 0, MetaName.camCinematicMountedCameraMetadataLookAroundSettings), + new PsoStructureEntryInfo((MetaName)1020746469, PsoDataType.Structure, 584, 0, MetaName.camCinematicMountedCameraMetadataFirstPersonRoll), + new PsoStructureEntryInfo((MetaName)3266557322, PsoDataType.Structure, 608, 0, MetaName.camCinematicMountedCameraMetadataFirstPersonPitchOffset), + new PsoStructureEntryInfo((MetaName)4210630063, PsoDataType.Bool, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachSpringDampingRatio, PsoDataType.Float, 660, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForMaxRelativeAttachSpringConstant, PsoDataType.Float, 664, 0, 0), + new PsoStructureEntryInfo((MetaName)17770171, PsoDataType.Float, 668, 0, 0), + new PsoStructureEntryInfo((MetaName)2454715147, PsoDataType.Float, 672, 0, 0), + new PsoStructureEntryInfo((MetaName)789371927, PsoDataType.Bool, 676, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToFollowPedHead, PsoDataType.Bool, 677, 0, 0), + new PsoStructureEntryInfo((MetaName)2639714447, PsoDataType.Bool, 678, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToFollowPedSeat, PsoDataType.Bool, 679, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldRestictToFrontSeat, PsoDataType.Bool, 680, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToVehicleExitEntryPoint, PsoDataType.Bool, 681, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToVehicleBone, PsoDataType.Bool, 682, 0, 0), + new PsoStructureEntryInfo((MetaName)4227962431, PsoDataType.Bool, 683, 0, 0), + new PsoStructureEntryInfo((MetaName)3424726202, PsoDataType.Bool, 684, 0, 0), + new PsoStructureEntryInfo((MetaName)883646732, PsoDataType.Bool, 685, 0, 0), + new PsoStructureEntryInfo((MetaName)1344883999, PsoDataType.Bool, 686, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2782414211), + new PsoStructureEntryInfo((MetaName)3524553148, PsoDataType.Flags, 688, 0, (MetaName)2097231), + new PsoStructureEntryInfo(MetaName.VehicleAttachPart, PsoDataType.Enum, 692, 0, (MetaName)3404480226), + new PsoStructureEntryInfo(MetaName.LookAtBehaviour, PsoDataType.Enum, 696, 0, (MetaName)2136742399), + new PsoStructureEntryInfo(MetaName.RelativeLookAtPosition, PsoDataType.Float3, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.LookBehindRelativeAttachPosition, PsoDataType.Float3, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLookBehindCustomPosition, PsoDataType.Bool, 736, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowPedLookAtBoneTag, PsoDataType.SInt, 740, 0, 0), + new PsoStructureEntryInfo(MetaName.OrientationSpring, PsoDataType.Structure, 744, 0, MetaName.camCinematicMountedCameraMetadataOrientationSpring), + new PsoStructureEntryInfo((MetaName)2204528705, PsoDataType.Structure, 808, 0, MetaName.camCinematicMountedCameraMetadataLeadingLookSettings), + new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 856, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 860, 0, 0), + new PsoStructureEntryInfo((MetaName)3932844561, PsoDataType.Float, 864, 0, 0), + new PsoStructureEntryInfo((MetaName)1690462370, PsoDataType.Float, 868, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeHeadingLimitsForMobilePhoneCamera, PsoDataType.Float2, 872, 0, 0), + new PsoStructureEntryInfo(MetaName.IsBehindVehicleGlass, PsoDataType.Bool, 880, 0, 0), + new PsoStructureEntryInfo((MetaName)2385481086, PsoDataType.Bool, 881, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 882, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldMakeFollowPedHeadInvisible, PsoDataType.Bool, 883, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldMakePedInAttachSeatInvisible, PsoDataType.Bool, 884, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldCopyVehicleCameraMotionBlur, PsoDataType.Bool, 885, 0, 0), + new PsoStructureEntryInfo(MetaName.LimitAttachParentRelativePitchAndHeading, PsoDataType.Bool, 886, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTerminateForPitchAndHeading, PsoDataType.Bool, 887, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRelativePitch, PsoDataType.Float2, 888, 0, 0), + new PsoStructureEntryInfo((MetaName)1537030464, PsoDataType.Float2, 896, 0, 0), + new PsoStructureEntryInfo((MetaName)3275096368, PsoDataType.Float2, 904, 0, 0), + new PsoStructureEntryInfo((MetaName)923714524, PsoDataType.Float2, 912, 0, 0), + new PsoStructureEntryInfo((MetaName)3680927973, PsoDataType.Float2, 920, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRelativeHeading, PsoDataType.Float2, 928, 0, 0), + new PsoStructureEntryInfo((MetaName)2362796003, PsoDataType.Float2, 936, 0, 0), + new PsoStructureEntryInfo((MetaName)2931436971, PsoDataType.Float2, 944, 0, 0), + new PsoStructureEntryInfo((MetaName)4288033461, PsoDataType.Float2, 952, 0, 0), + new PsoStructureEntryInfo((MetaName)1148577305, PsoDataType.Float2, 960, 0, 0), + new PsoStructureEntryInfo((MetaName)818123698, PsoDataType.Float2, 968, 0, 0), + new PsoStructureEntryInfo((MetaName)3197853445, PsoDataType.Float2, 976, 0, 0), + new PsoStructureEntryInfo((MetaName)1847367979, PsoDataType.Float2, 984, 0, 0), + new PsoStructureEntryInfo((MetaName)1083919137, PsoDataType.Float2, 992, 0, 0), + new PsoStructureEntryInfo((MetaName)4130730234, PsoDataType.Float2, 1000, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialRelativePitchLimits, PsoDataType.Float2, 1008, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialRelativeHeadingLimits, PsoDataType.Float2, 1016, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachParentRoll, PsoDataType.Bool, 1024, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTerminateForWorldPitch, PsoDataType.Bool, 1025, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialWorldPitchLimits, PsoDataType.Float2, 1028, 0, 0), + new PsoStructureEntryInfo(MetaName.WorldPitchLimits, PsoDataType.Float2, 1036, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTerminateForOcclusion, PsoDataType.Bool, 1044, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 1048, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTerminateIfOccludedByAttachParent, PsoDataType.Bool, 1052, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccludedByAttachParent, PsoDataType.UInt, 1056, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 1060, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 1064, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTerminateForDistanceToTarget, PsoDataType.Bool, 1068, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToTerminate, PsoDataType.Float, 1072, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldCalculateXYDistance, PsoDataType.Bool, 1076, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTestForClipping, PsoDataType.Bool, 1077, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToClipIntoDynamicCollision, PsoDataType.UInt, 1080, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 1084, 0, 0), + new PsoStructureEntryInfo((MetaName)816145056, PsoDataType.Bool, 1088, 0, 0), + new PsoStructureEntryInfo((MetaName)439797539, PsoDataType.Bool, 1089, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 1092, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 1096, 0, 0), + new PsoStructureEntryInfo((MetaName)976391107, PsoDataType.Bool, 1100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 1104, 0, 0), + new PsoStructureEntryInfo((MetaName)200247978, PsoDataType.Bool, 1108, 0, 0), + new PsoStructureEntryInfo((MetaName)1613380386, PsoDataType.Float, 1112, 0, 0), + new PsoStructureEntryInfo((MetaName)2154681758, PsoDataType.Bool, 1116, 0, 0), + new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 1120, 7, 0), + new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 1124, 7, 0), + new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 1128, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldByPassNearClip, PsoDataType.Bool, 1132, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTestForMapPenetrationFromAttachPosition, PsoDataType.Bool, 1133, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseHeading, PsoDataType.Float, 1136, 0, 0), + new PsoStructureEntryInfo((MetaName)1214392329, PsoDataType.Bool, 1140, 0, 0), + new PsoStructureEntryInfo((MetaName)2327168839, PsoDataType.Float, 1144, 0, 0), + new PsoStructureEntryInfo((MetaName)1246262822, PsoDataType.Float, 1148, 0, 0), + new PsoStructureEntryInfo((MetaName)4216676429, PsoDataType.Float, 1152, 0, 0), + new PsoStructureEntryInfo((MetaName)2719028802, PsoDataType.Structure, 1160, 0, MetaName.camCinematicMountedCameraMetadataMovementOnAccelerationSettings), + new PsoStructureEntryInfo((MetaName)36987752, PsoDataType.Float, 1208, 0, 0), + new PsoStructureEntryInfo((MetaName)3434721036, PsoDataType.Float3, 1216, 0, 0), + new PsoStructureEntryInfo((MetaName)3664516177, PsoDataType.Float, 1232, 0, 0), + new PsoStructureEntryInfo((MetaName)2807019381, PsoDataType.Float, 1236, 0, 0), + new PsoStructureEntryInfo((MetaName)1688077651, PsoDataType.Float, 1240, 0, 0), + new PsoStructureEntryInfo((MetaName)1499512130, PsoDataType.Float, 1244, 0, 0), + new PsoStructureEntryInfo((MetaName)805860083, PsoDataType.Float, 1248, 0, 0), + new PsoStructureEntryInfo((MetaName)1793179555, PsoDataType.Float, 1252, 0, 0), + new PsoStructureEntryInfo((MetaName)1784170819, PsoDataType.Float, 1256, 0, 0), + new PsoStructureEntryInfo((MetaName)2549816384, PsoDataType.Float, 1260, 0, 0), + new PsoStructureEntryInfo((MetaName)2482994089, PsoDataType.Float, 1264, 0, 0), + new PsoStructureEntryInfo((MetaName)3440187587, PsoDataType.Float, 1268, 0, 0), + new PsoStructureEntryInfo((MetaName)2744603068, PsoDataType.Float, 1272, 0, 0), + new PsoStructureEntryInfo((MetaName)1387580481, PsoDataType.Float, 1276, 0, 0), + new PsoStructureEntryInfo((MetaName)1233327091, PsoDataType.Float, 1280, 0, 0), + new PsoStructureEntryInfo((MetaName)3672709376, PsoDataType.Float3, 1296, 0, 0), + new PsoStructureEntryInfo((MetaName)2119789086, PsoDataType.Float3, 1312, 0, 0), + new PsoStructureEntryInfo((MetaName)2958804846, PsoDataType.Float, 1328, 0, 0), + new PsoStructureEntryInfo((MetaName)2107938182, PsoDataType.Float, 1332, 0, 0) + ); + case MetaName.camCinematicMountedCameraMetadataRelativePitchScalingToThrottle: + return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataRelativePitchScalingToThrottle, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)1802668561, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)200823333, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camCinematicMountedCameraMetadataLookAroundSettings: + return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataLookAroundSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.LeanScale, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)214599438, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)2702689596, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2951014073, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2830026870, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3102721723, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)509094775, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3198719034, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camCinematicMountedCameraMetadataFirstPersonRoll: + return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataFirstPersonRoll, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)455355504, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)694448363, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)2004679597, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2782811596, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camCinematicMountedCameraMetadataFirstPersonPitchOffset: + return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataFirstPersonPitchOffset, 0, 0, 48, + new PsoStructureEntryInfo((MetaName)551752221, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxOffset, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1775298710, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)2173221242, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)75090556, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.camCinematicMountedCameraMetadataOrientationSpring: + return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataOrientationSpring, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)1464813290, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)12756205, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)967704366, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3344080959, PsoDataType.Float2, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)243857972, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2399868550, PsoDataType.Float2, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)2060478858, PsoDataType.Float2, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)131585240, PsoDataType.Float2, 56, 0, 0) + ); + case MetaName.camCinematicMountedCameraMetadataLeadingLookSettings: + return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataLeadingLookSettings, 0, 0, 48, + new PsoStructureEntryInfo((MetaName)966483701, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)1778767763, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)3524239627, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1788878871, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3960905630, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)2872708052, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1733937006, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.camCinematicMountedCameraMetadataMovementOnAccelerationSettings: + return new PsoStructureInfo(MetaName.camCinematicMountedCameraMetadataMovementOnAccelerationSettings, 0, 0, 48, + new PsoStructureEntryInfo((MetaName)3974113312, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3305119805, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1186910375, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1778767763, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZoomFactor, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3493441660, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1259376027, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.camCinematicPositionCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicPositionCameraMetadata, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3983210518, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3715714007, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3434528744, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)1699827350, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomDuration, PsoDataType.UInt, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)3609378888, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1843629037, PsoDataType.UInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 92, 7, 0), + new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 96, 7, 0), + new PsoStructureEntryInfo((MetaName)4200791860, PsoDataType.String, 100, 7, 0) + ); + case MetaName.camCinematicWaterCrashCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicWaterCrashCameraMetadata, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3106190053, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScale, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DropDistance, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3822313305, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.tacticalXml, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2965889555, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.DropDuration, PsoDataType.UInt, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)2920068067, PsoDataType.UInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendDuration, PsoDataType.UInt, 80, 0, 0) + ); + case MetaName.camCinematicTwoShotCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicTwoShotCameraMetadata, 0, 0, 136, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeScale, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3072113430, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)654218252, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.CameraRelativeVerticalOffset, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)1926313598, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1167967077, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)656358172, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)940306022, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)4169793326, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistance, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)3573176421, PsoDataType.SInt, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)1953981041, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.IdleCmini, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)3754548217, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)2383824547, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)1720877983, PsoDataType.Bool, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)1117249844, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)3115155794, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)1144205032, PsoDataType.Bool, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)1450705774, PsoDataType.Float, 132, 0, 0) + ); + case MetaName.camCinematicPedCloseUpCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicPedCloseUpCameraMetadata, 0, 0, 192, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOffset, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1099610506, PsoDataType.Bool, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)3573176421, PsoDataType.SInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.LookAtOffset, PsoDataType.Float3, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)367186942, PsoDataType.Bool, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)3381486527, PsoDataType.UInt, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)3185512023, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)4280914022, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)430381212, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)2406519031, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)2116722083, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)4065237819, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)1391390084, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)3698583789, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)3754548217, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)2383824547, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo((MetaName)3406809215, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo((MetaName)4170206883, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo((MetaName)3418665750, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo((MetaName)2934396710, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo((MetaName)2715105524, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)3609378888, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 180, 0, 0) + ); + case MetaName.camControlHelperMetadata: + return new PsoStructureInfo(MetaName.camControlHelperMetadata, 0, 0, 288, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ViewModes, PsoDataType.Structure, 16, 0, MetaName.camControlHelperMetadataViewModes), + new PsoStructureEntryInfo(MetaName.LookAround, PsoDataType.Structure, 128, 0, MetaName.camControlHelperMetadataLookAround), + new PsoStructureEntryInfo(MetaName.Zoom, PsoDataType.Structure, 224, 0, MetaName.camControlHelperMetadataZoom), + new PsoStructureEntryInfo(MetaName.LookBehindOutroTimeMS, PsoDataType.UInt, 264, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLookBehindInput, PsoDataType.Bool, 268, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseAccurateModeInput, PsoDataType.Bool, 269, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldToggleAccurateModeInput, PsoDataType.Bool, 270, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplySniperControlPref, PsoDataType.Bool, 271, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyAimSensitivityPref, PsoDataType.Bool, 272, 0, 0), + new PsoStructureEntryInfo(MetaName.AimSensitivityScalingLimits, PsoDataType.Float2, 276, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDurationForMultiplayerViewModeActivation, PsoDataType.UInt, 284, 0, 0) + ); + case MetaName.camControlHelperMetadataViewModes: + return new PsoStructureInfo(MetaName.camControlHelperMetadataViewModes, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.ShouldUseViewModeInput, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldToggleViewModeBetweenThirdAndFirstPerson, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.Context, PsoDataType.Enum, 12, 0, (MetaName)513957198), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2703064232), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 16, 2, (MetaName)327683), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camControlHelperMetadataViewModeSettings), + new PsoStructureEntryInfo(MetaName.Settings, PsoDataType.Array, 24, 4, (MetaName)327685), + new PsoStructureEntryInfo(MetaName.ViewModeBlendEnvelopeRef, PsoDataType.String, 104, 7, 0) + ); + case MetaName.camControlHelperMetadataViewModeSettings: + return new PsoStructureInfo(MetaName.camControlHelperMetadataViewModeSettings, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitScaling, PsoDataType.Float2, 8, 0, 0) + ); + case MetaName.camControlHelperMetadataLookAround: + return new PsoStructureInfo(MetaName.camControlHelperMetadataLookAround, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Acceleration, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Deceleration, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeadingSpeed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitchSpeed, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MouseMaxHeadingSpeedMin, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MouseMaxHeadingSpeedMax, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MouseMaxPitchSpeedMin, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MouseMaxPitchSpeedMax, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.LSDeadZoneAngle, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.LSAcceleration, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.LSDeceleration, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseGameTime, PsoDataType.Bool, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.InputEnvelopeRef, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo(MetaName.PrecisionAimSettings, PsoDataType.Structure, 64, 0, MetaName.camControlHelperMetaDataPrecisionAimSettings) + ); + case MetaName.camControlHelperMetaDataPrecisionAimSettings: + return new PsoStructureInfo(MetaName.camControlHelperMetaDataPrecisionAimSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MinAccelModifier, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAccelModifier, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDeccelModifier, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDeccelModifier, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.InputMagToIncreaseDeadZoneMin, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.InputMagToIncreaseDeadZoneMax, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.camControlHelperMetadataZoom: + return new PsoStructureInfo(MetaName.camControlHelperMetadataZoom, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldUseZoomInput, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDiscreteZoomControl, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseGameTime, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFov, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFovForNetworkPlay, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxFov, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.Acceleration, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.Deceleration, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camCinematicVehicleTrackingCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehicleTrackingCameraMetadata, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.LookAtOffset, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.PositionOffset, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.Fov, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1292601136, PsoDataType.Float2, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)3554537001, PsoDataType.Float2, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)4013358927, PsoDataType.Float2, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)328948722, PsoDataType.Float2, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)2198318784, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)1142735275, PsoDataType.UInt, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 124, 0, 0) + ); + case MetaName.camEnvelopeMetadata: + return new PsoStructureInfo(MetaName.camEnvelopeMetadata, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)4004354650, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AttackDuration, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DecayDuration, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1735638891, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.HoldDuration, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ReleaseDuration, PsoDataType.UInt, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2014772834, PsoDataType.Enum, 40, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)1004206996, PsoDataType.Enum, 44, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)1484523694, PsoDataType.Bool, 48, 0, 0) + ); + case MetaName.camSpringMountMetadata: + return new PsoStructureInfo(MetaName.camSpringMountMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AccelerationLimit, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AccelerationForce, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringForce, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DampeningForce, PsoDataType.Float3, 64, 0, 0) + ); + case MetaName.camAnimatedCameraMetadata: + return new PsoStructureInfo(MetaName.camAnimatedCameraMetadata, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0) + ); + case MetaName.camFreeCameraMetadata: + return new PsoStructureInfo(MetaName.camFreeCameraMetadata, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.StartPosition, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ForwardAcceleration, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.StrafeAcceleration, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.VerticalAcceleration, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)430698760, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingAcceleration, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchAcceleration, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.RollAcceleration, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)991761956, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.FovAcceleration, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)2276437979, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)1380375800, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)3305680632, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)3631492583, PsoDataType.UInt, 100, 0, 0) + ); + case MetaName.camCinematicMountedPartCameraMetadata: + return new PsoStructureInfo(MetaName.camCinematicMountedPartCameraMetadata, 0, 0, 192, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantEnvelopeRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.SpringMountRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPart, PsoDataType.Enum, 48, 0, (MetaName)3404480226), + new PsoStructureEntryInfo((MetaName)2797646907, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeLookAtPosition, PsoDataType.Float3, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantLimits, PsoDataType.Float2, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachSpringConstantLimitsForPassengers, PsoDataType.Float2, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForMaxRelativeAttachSpringConstant, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.HighSpeedShakeSettings, PsoDataType.Structure, 120, 0, MetaName.camSpeedRelativeShakeSettingsMetadata), + new PsoStructureEntryInfo(MetaName.IsBehindVehicleGlass, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo((MetaName)2385481086, PsoDataType.Bool, 153, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 154, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldMakeFollowPedHeadInvisible, PsoDataType.Bool, 155, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldCopyVehicleCameraMotionBlur, PsoDataType.Bool, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendOccluded, PsoDataType.UInt, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRadius, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForOcclusionTest, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTestForClipping, PsoDataType.Bool, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusScalingForClippingTest, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForWaterClippingTest, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForRiverWaterClippingTest, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 188, 0, 0) + ); + case MetaName.camFollowPedCameraMetadata: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadata, 0, 0, 2288, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), + new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), + new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), + new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), + new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), + new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), + new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentInAirEnvelopeRef, PsoDataType.String, 784, 7, 0), + new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingOnGroundEnvelopeRef, PsoDataType.String, 788, 7, 0), + new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingInAirEnvelopeRef, PsoDataType.String, 792, 7, 0), + new PsoStructureEntryInfo(MetaName.AimBehaviourEnvelopeRef, PsoDataType.String, 796, 7, 0), + new PsoStructureEntryInfo(MetaName.WaterBobShakeRef, PsoDataType.String, 800, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentMovementForOrientation, PsoDataType.Bool, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 808, 0, MetaName.camFollowCameraMetadataPullAroundSettings), + new PsoStructureEntryInfo(MetaName.PullAroundSettingsForLookBehind, PsoDataType.Structure, 872, 0, MetaName.camFollowCameraMetadataPullAroundSettings), + new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentLocalXYVelocityForPullAround, PsoDataType.Bool, 936, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentForwardSpeedForPullAround, PsoDataType.Bool, 937, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundToAttachParentFront, PsoDataType.Bool, 938, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundToBasicAttachParentMatrix, PsoDataType.Bool, 939, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundUsingSimpleSpringDamping, PsoDataType.Bool, 940, 0, 0), + new PsoStructureEntryInfo((MetaName)2671392542, PsoDataType.Bool, 941, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachParentApproachSpeedForPitchLock, PsoDataType.Float, 944, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockHeading, PsoDataType.Bool, 948, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMoveSpeedForFollowOrientation, PsoDataType.Float, 952, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLookAroundMoveSpeedMultiplier, PsoDataType.Float, 956, 0, 0), + new PsoStructureEntryInfo(MetaName.SpeedLimitsForVerticalMoveSpeedScaling, PsoDataType.Float2, 960, 0, 0), + new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScaling, PsoDataType.Float, 968, 0, 0), + new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScalingAtMaxSpeed, PsoDataType.Float, 972, 0, 0), + new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingOnGround, PsoDataType.Float, 976, 0, 0), + new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingInAir, PsoDataType.Float, 980, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMoveOrientationSpeedDuringLookAround, PsoDataType.Float, 984, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowOrientationConing, PsoDataType.Structure, 992, 0, MetaName.camFollowCameraMetadataFollowOrientationConing), + new PsoStructureEntryInfo(MetaName.RollSettings, PsoDataType.Structure, 1024, 0, MetaName.camFollowCameraMetadataRollSettings), + new PsoStructureEntryInfo(MetaName.HighAltitudeZoomSettings, PsoDataType.Structure, 1064, 0, MetaName.camFollowCameraMetadataHighAltitudeZoomSettings), + new PsoStructureEntryInfo((MetaName)1885083576, PsoDataType.Bool, 1104, 0, 0), + new PsoStructureEntryInfo((MetaName)1213389792, PsoDataType.Bool, 1105, 0, 0), + new PsoStructureEntryInfo((MetaName)473739279, PsoDataType.Float, 1108, 0, 0), + new PsoStructureEntryInfo(MetaName.RagdollBlendEnvelopeRef, PsoDataType.String, 1112, 7, 0), + new PsoStructureEntryInfo((MetaName)3575968142, PsoDataType.String, 1116, 7, 0), + new PsoStructureEntryInfo((MetaName)2291862537, PsoDataType.UInt, 1120, 0, 0), + new PsoStructureEntryInfo((MetaName)459469516, PsoDataType.Float, 1124, 0, 0), + new PsoStructureEntryInfo((MetaName)4093180426, PsoDataType.Float, 1128, 0, 0), + new PsoStructureEntryInfo((MetaName)1028171116, PsoDataType.Float, 1132, 0, 0), + new PsoStructureEntryInfo((MetaName)2578221071, PsoDataType.Float2, 1136, 0, 0), + new PsoStructureEntryInfo((MetaName)2418079526, PsoDataType.String, 1144, 7, 0), + new PsoStructureEntryInfo((MetaName)300074581, PsoDataType.Bool, 1148, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFollowPedCameraMetadataCustomViewModeSettings), + new PsoStructureEntryInfo((MetaName)95464861, PsoDataType.Array, 1152, 4, (MetaName)327809), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFollowPedCameraMetadataCustomViewModeSettings), + new PsoStructureEntryInfo((MetaName)741352357, PsoDataType.Array, 1272, 4, (MetaName)327811), + new PsoStructureEntryInfo((MetaName)1557873238, PsoDataType.Bool, 1392, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFollowPedCameraMetadataCustomViewModeSettings), + new PsoStructureEntryInfo((MetaName)1607272001, PsoDataType.Array, 1400, 4, (MetaName)327814), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFollowPedCameraMetadataCustomViewModeSettings), + new PsoStructureEntryInfo((MetaName)467721499, PsoDataType.Array, 1520, 4, (MetaName)327816), + new PsoStructureEntryInfo((MetaName)4261252982, PsoDataType.String, 1640, 7, 0), + new PsoStructureEntryInfo((MetaName)2397521015, PsoDataType.Float, 1644, 0, 0), + new PsoStructureEntryInfo((MetaName)886249434, PsoDataType.Float, 1648, 0, 0), + new PsoStructureEntryInfo((MetaName)3909973356, PsoDataType.Float, 1652, 0, 0), + new PsoStructureEntryInfo((MetaName)4282038076, PsoDataType.Float, 1656, 0, 0), + new PsoStructureEntryInfo((MetaName)1414513338, PsoDataType.Float, 1660, 0, 0), + new PsoStructureEntryInfo((MetaName)233447402, PsoDataType.Float, 1664, 0, 0), + new PsoStructureEntryInfo((MetaName)813655062, PsoDataType.Float, 1668, 0, 0), + new PsoStructureEntryInfo((MetaName)859959795, PsoDataType.Float, 1672, 0, 0), + new PsoStructureEntryInfo((MetaName)2322941924, PsoDataType.Structure, 1680, 0, MetaName.camFollowPedCameraMetadataAssistedMovementAlignment), + new PsoStructureEntryInfo(MetaName.LadderAlignment, PsoDataType.Structure, 1768, 0, MetaName.camFollowPedCameraMetadataLadderAlignment), + new PsoStructureEntryInfo(MetaName.RappellingAlignment, PsoDataType.Structure, 1952, 0, MetaName.camFollowPedCameraMetadataRappellingAlignment), + new PsoStructureEntryInfo((MetaName)215880757, PsoDataType.Bool, 1968, 0, 0), + new PsoStructureEntryInfo((MetaName)4161177976, PsoDataType.Structure, 1976, 0, MetaName.camFollowCameraMetadataPullAroundSettings), + new PsoStructureEntryInfo((MetaName)2738607365, PsoDataType.Float2, 2040, 0, 0), + new PsoStructureEntryInfo((MetaName)3410646358, PsoDataType.Float2, 2048, 0, 0), + new PsoStructureEntryInfo((MetaName)528803049, PsoDataType.Bool, 2056, 0, 0), + new PsoStructureEntryInfo((MetaName)3857904181, PsoDataType.Float, 2060, 0, 0), + new PsoStructureEntryInfo((MetaName)2773176002, PsoDataType.Float, 2064, 0, 0), + new PsoStructureEntryInfo((MetaName)3592715839, PsoDataType.Bool, 2068, 0, 0), + new PsoStructureEntryInfo((MetaName)3895855693, PsoDataType.Float2, 2072, 0, 0), + new PsoStructureEntryInfo((MetaName)2344836057, PsoDataType.Structure, 2080, 0, MetaName.camFollowPedCameraMetadataOrbitPitchLimitsForOverheadCollision), + new PsoStructureEntryInfo((MetaName)3095276846, PsoDataType.Float, 2112, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleEntryExitPitchLevelSmoothRate, PsoDataType.Float, 2116, 0, 0), + new PsoStructureEntryInfo((MetaName)2068541596, PsoDataType.Float, 2120, 0, 0), + new PsoStructureEntryInfo((MetaName)1699579049, PsoDataType.Structure, 2128, 0, MetaName.camFollowPedCameraMetadataRunningShakeSettings), + new PsoStructureEntryInfo((MetaName)498572221, PsoDataType.Structure, 2160, 0, MetaName.camFollowPedCameraMetadataSwimmingShakeSettings), + new PsoStructureEntryInfo((MetaName)2385645301, PsoDataType.Structure, 2192, 0, MetaName.camFollowPedCameraMetadataDivingShakeSettings), + new PsoStructureEntryInfo((MetaName)136635268, PsoDataType.Structure, 2224, 0, MetaName.camFollowPedCameraMetadataHighFallShakeSettings), + new PsoStructureEntryInfo((MetaName)41370383, PsoDataType.Structure, 2248, 0, MetaName.camFollowPedCameraMetadataPushBeyondNearbyVehiclesInRagdollSettings) + ); + case MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.HeightScaling, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxExtraHeightForVehicleTrailers, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxExtraHeightForTowedVehicles, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveVehicleDriverSeat, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataBasePivotPosition: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataBasePivotPosition, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.ShouldUseBaseAttachPosition, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentHeightRatioToAttain, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentHeightRatioToAttainInTightSpace, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyInAttachParentLocalSpace, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.RollSettings, PsoDataType.Structure, 24, 0, MetaName.camThirdPersonCameraMetadataBasePivotPositionRollSettings), + new PsoStructureEntryInfo(MetaName.RelativeOffset, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockVerticalOffset, PsoDataType.Bool, 80, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataBasePivotPositionRollSettings: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataBasePivotPositionRollSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachParentRoll, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleScalingFactor, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngle, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataPivotPosition: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataPivotPosition, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.CameraRelativeSideOffset, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.CameraRelativeVerticalOffset, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentWidthScalingForCameraRelativeSideOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentHeightScalingForCameraRelativeVerticalOffset, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.timeAfterAimingToApplyAlternateScalingMin, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.timeAfterAimingToApplyAlternateScalingMax, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.maxDistanceAfterAimingToApplyAlternateScalingMax, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.timeAfterAimingToApplyDistanceBlend, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentHeightScalingForCameraRelativeVerticalOffset_AfterAiming, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)2888330455, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.BlendLevel, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraCameraRelativeVerticalOffset, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentHeightScalingForExtraCameraRelativeVerticalOffset, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataBuoyancySettings: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataBuoyancySettings, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.ShouldApplyBuoyancy, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelayBetweenBuoyancyStateChanges, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelayOnSubmerging, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelayOnSurfacing, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeSpentSwimmingToRespectMotionTask, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentDepthUnderWaterToRemainBuoyant, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentDepthUnderWaterToRemainBuoyantOut, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionFallBackBlendLevelToForceUnderWater, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldSetBuoyantWhenAttachParentNotFullySubmerged, PsoDataType.Bool, 40, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.AttachParentHeightRatioToAttain, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachParentHeightRatioToPushAwayFromCollision, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)4004666528, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendLevelAfterPushAwayFromCollision, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)31648245, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2702477980, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)20195593, PsoDataType.Bool, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyInAttachParentLocalSpace, PsoDataType.Bool, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ShouldApply, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDurationToTrackVehicles, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToTestDownForVehiclesToReject, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataLookOverSettings: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataLookOverSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.MinHeight, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchOffsetAtMinHeight, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchOffsetAtMaxHeight, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataStealthZoomSettings: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataStealthZoomSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ShouldApply, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZoomFactor, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camFollowCameraMetadataPullAroundSettings: + return new PsoStructureInfo(MetaName.camFollowCameraMetadataPullAroundSettings, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.ShouldBlendOutWhenAttachParentIsInAir, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldBlendOutWhenAttachParentIsOnGround, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldBlendWithAttachParentMatrixForRelativeOrbitBlend, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingPullAroundMinMoveSpeed, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingPullAroundMaxMoveSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingPullAroundSpeedAtMaxMoveSpeed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingPullAroundErrorScalingBlendLevel, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingPullAroundSpringConstant, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingPullAroundSpringDampingRatio, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchPullAroundMinMoveSpeed, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchPullAroundMaxMoveSpeed, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchPullAroundSpeedAtMaxMoveSpeed, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchPullAroundErrorScalingBlendLevel, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchPullAroundSpringConstant, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchPullAroundSpringDampingRatio, PsoDataType.Float, 56, 0, 0) + ); + case MetaName.camFollowCameraMetadataFollowOrientationConing: + return new PsoStructureInfo(MetaName.camFollowCameraMetadataFollowOrientationConing, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MaxAngle, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.AspectRatio, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchOffset, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SmoothRate, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camFollowCameraMetadataRollSettings: + return new PsoStructureInfo(MetaName.camFollowCameraMetadataRollSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldApplyRoll, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.RollSpringConstant, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.RollSpringDampRatio, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.RollAngleScale, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camFollowCameraMetadataHighAltitudeZoomSettings: + return new PsoStructureInfo(MetaName.camFollowCameraMetadataHighAltitudeZoomSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MinAltitudeDelta, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAltitudeDelta, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBaseFovScaling, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camFollowPedCameraMetadataCustomViewModeSettings: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataCustomViewModeSettings, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)4026985674, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camFollowPedCameraMetadataAssistedMovementAlignment: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataAssistedMovementAlignment, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.ShouldAlign, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)2541847736, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)3143901835, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2602308947, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 24, 0, MetaName.camFollowCameraMetadataPullAroundSettings) + ); + case MetaName.camFollowPedCameraMetadataLadderAlignment: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataLadderAlignment, 0, 0, 184, + new PsoStructureEntryInfo(MetaName.ShouldAlign, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)2541847736, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)261180327, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScaling, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)666447554, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)4131471736, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)3980517625, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 56, 0, MetaName.camFollowCameraMetadataPullAroundSettings), + new PsoStructureEntryInfo((MetaName)738690141, PsoDataType.Structure, 120, 0, MetaName.camFollowCameraMetadataPullAroundSettings) + ); + case MetaName.camFollowPedCameraMetadataRappellingAlignment: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataRappellingAlignment, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.ShouldAlign, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)261180327, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camFollowPedCameraMetadataOrbitPitchLimitsForOverheadCollision: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataOrbitPitchLimitsForOverheadCollision, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)1746008730, PsoDataType.Float2, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)256117257, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camFollowPedCameraMetadataRunningShakeSettings: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataRunningShakeSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinAmplitude, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)491218034, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2700987639, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camFollowPedCameraMetadataSwimmingShakeSettings: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataSwimmingShakeSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinAmplitude, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)491218034, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1443947683, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2015392943, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.camFollowPedCameraMetadataDivingShakeSettings: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataDivingShakeSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinHeight, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAmplitude, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camFollowPedCameraMetadataHighFallShakeSettings: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataHighFallShakeSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinSpeed, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camFollowPedCameraMetadataPushBeyondNearbyVehiclesInRagdollSettings: + return new PsoStructureInfo(MetaName.camFollowPedCameraMetadataPushBeyondNearbyVehiclesInRagdollSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.MaxDurationToTrackVehicles, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)1159487467, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)2913317904, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)752814960, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1115262693, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DetectionRadius, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToTestDownForVehiclesToReject, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camCollisionMetadata: + return new PsoStructureInfo(MetaName.camCollisionMetadata, 0, 0, 240, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreOcclusionWithBrokenFragments, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreOcclusionWithBrokenFragmentsOfIgnoredEntities, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldMoveTowardsLos, PsoDataType.Bool, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldSweepToAvoidPopIn, PsoDataType.Bool, 19, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistPopInBehaviour, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullBackByCapsuleRadius, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreOcclusionWithSelectCollision, PsoDataType.Bool, 22, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreOcclusionWithRagdolls, PsoDataType.Bool, 23, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldReportAsCameraTypeTest, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.OcclusionSweep, PsoDataType.Structure, 32, 0, MetaName.camCollisionMetadataOcclusionSweep), + new PsoStructureEntryInfo(MetaName.PathFinding, PsoDataType.Structure, 72, 0, MetaName.camCollisionMetadataPathFinding), + new PsoStructureEntryInfo(MetaName.RotationTowardsLos, PsoDataType.Structure, 88, 0, MetaName.camCollisionMetadataRotationTowardsLos), + new PsoStructureEntryInfo(MetaName.OrbitDistanceDamping, PsoDataType.Structure, 104, 0, MetaName.camCollisionMetadataOrbitDistanceDamping), + new PsoStructureEntryInfo(MetaName.ClippingAvoidance, PsoDataType.Structure, 136, 0, MetaName.camCollisionMetadataClippingAvoidance), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 152, 0, MetaName.camCollisionMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.PushBeyondEntitiesIfClipping, PsoDataType.Structure, 184, 0, MetaName.camCollisionMetadataPushBeyondEntitiesIfClipping), + new PsoStructureEntryInfo(MetaName.PullBackTowardsCollision, PsoDataType.Structure, 216, 0, MetaName.camCollisionMetadataPullBackTowardsCollision) + ); + case MetaName.camCollisionMetadataOcclusionSweep: + return new PsoStructureInfo(MetaName.camCollisionMetadataOcclusionSweep, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.NumCapsuleTests, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionRootSpeedToForcePopIn, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPreCollisionCameraSpeedToForcePopIn, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSweepAngleWhenMovingTowardsLos, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSweepAngleWhenAvoidingPopIn, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinOrientationSpeedToMaintainDirection, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinCameraMoveSpeedToSweepInDirectionOfTravel, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camCollisionMetadataPathFinding: + return new PsoStructureInfo(MetaName.camCollisionMetadataPathFinding, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MaxCapsuleTests, PsoDataType.UInt, 8, 0, 0) + ); + case MetaName.camCollisionMetadataRotationTowardsLos: + return new PsoStructureInfo(MetaName.camCollisionMetadataRotationTowardsLos, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camCollisionMetadataOrbitDistanceDamping: + return new PsoStructureInfo(MetaName.camCollisionMetadataOrbitDistanceDamping, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MaxCollisionRootSpeedToPausePullBack, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPreCollisionCameraSpeedToPausePullBack, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceErrorToIgnore, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camCollisionMetadataClippingAvoidance: + return new PsoStructureInfo(MetaName.camCollisionMetadataClippingAvoidance, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MaxIterations, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.CapsuleLengthForDetection, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camCollisionMetadataBuoyancySettings: + return new PsoStructureInfo(MetaName.camCollisionMetadataBuoyancySettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShouldApplyBuoyancy, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreBuoyancyStateAndAvoidSurface, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHitNormalDotWorldUpForRivers, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.WaterHeightSmoothRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWaterWhenBuoyant, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDepthUnderWaterWhenNotBuoyant, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camCollisionMetadataPushBeyondEntitiesIfClipping: + return new PsoStructureInfo(MetaName.camCollisionMetadataPushBeyondEntitiesIfClipping, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ExtraDistanceToPushAway, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingToApplyWhenPushing, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.PullBackSpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.PushInSpringConstant, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAllowOtherCollisionToConstrainCameraIntoEntities, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)925224069, PsoDataType.Bool, 29, 0, 0), + new PsoStructureEntryInfo((MetaName)631999118, PsoDataType.Bool, 30, 0, 0) + ); + case MetaName.camCollisionMetadataPullBackTowardsCollision: + return new PsoStructureInfo(MetaName.camCollisionMetadataPullBackTowardsCollision, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.camHintHelperMetadata: + return new PsoStructureInfo(MetaName.camHintHelperMetadata, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FovScalar, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1674069994, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)67329582, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2753181554, PsoDataType.Structure, 40, 0, MetaName.camHintHelperMetadataPivotPositionAdditive), + new PsoStructureEntryInfo((MetaName)3051761482, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo((MetaName)399304638, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo((MetaName)315713489, PsoDataType.Bool, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)3421755121, PsoDataType.Bool, 73, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)1167921072, PsoDataType.Bool, 80, 0, 0) + ); + case MetaName.camHintHelperMetadataPivotPositionAdditive: + return new PsoStructureInfo(MetaName.camHintHelperMetadataPivotPositionAdditive, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)3517580346, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)2171374488, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)3803694830, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)187223663, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camInconsistentBehaviourZoomHelperMetadata: + return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperMetadata, 0, 0, 184, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)2835430912, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxFov, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)192388977, PsoDataType.Structure, 24, 0, MetaName.camInconsistentBehaviourZoomHelperDetectSuddenMovementSettings), + new PsoStructureEntryInfo((MetaName)3137016932, PsoDataType.Structure, 64, 0, MetaName.camInconsistentBehaviourZoomHelperDetectFastCameraTurnSettings), + new PsoStructureEntryInfo((MetaName)3922359176, PsoDataType.Structure, 104, 0, MetaName.camInconsistentBehaviourZoomHelperAirborneSettings), + new PsoStructureEntryInfo((MetaName)3604184077, PsoDataType.Structure, 144, 0, MetaName.camInconsistentBehaviourZoomHelperLosSettings) + ); + case MetaName.camInconsistentBehaviourZoomHelperDetectSuddenMovementSettings: + return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperDetectSuddenMovementSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldDetect, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ReactionTime, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)989577416, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2226168954, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2667621860, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2802018341, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camInconsistentBehaviourZoomHelperDetectFastCameraTurnSettings: + return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperDetectFastCameraTurnSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldDetect, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ReactionTime, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)989577416, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2226168954, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2667621860, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1513989445, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)423008264, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camInconsistentBehaviourZoomHelperAirborneSettings: + return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperAirborneSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldDetect, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ReactionTime, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)989577416, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2226168954, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2667621860, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)424844475, PsoDataType.UInt, 32, 0, 0) + ); + case MetaName.camInconsistentBehaviourZoomHelperLosSettings: + return new PsoStructureInfo(MetaName.camInconsistentBehaviourZoomHelperLosSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldDetect, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ReactionTime, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)989577416, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2226168954, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2667621860, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1918423771, PsoDataType.UInt, 32, 0, 0) + ); + case MetaName.camCatchUpHelperMetadata: + return new PsoStructureInfo(MetaName.camCatchUpHelperMetadata, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)482340760, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1046944473, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendDuration, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3764337155, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2836572250, PsoDataType.Enum, 32, 0, MetaName.eCurveType) + ); + case MetaName.camLookAtDampingHelperMetadata: + return new PsoStructureInfo(MetaName.camLookAtDampingHelperMetadata, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)3543584583, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2722511334, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3076282416, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3481945794, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1705112434, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)627718911, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3152826625, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3880553368, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1561096582, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1150311187, PsoDataType.Float, 52, 0, 0) + ); + case MetaName.camLookAheadHelperMetadata: + return new PsoStructureInfo(MetaName.camLookAheadHelperMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)765307181, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)988110708, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeed, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3931376905, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1623903878, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3766959106, PsoDataType.Bool, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)88070689, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1846985178, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2004585270, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 60, 0, 0) + ); + case MetaName.camFollowVehicleCameraMetadata: + return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadata, 0, 0, 1376, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), + new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), + new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), + new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), + new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), + new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), + new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentInAirEnvelopeRef, PsoDataType.String, 784, 7, 0), + new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingOnGroundEnvelopeRef, PsoDataType.String, 788, 7, 0), + new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingInAirEnvelopeRef, PsoDataType.String, 792, 7, 0), + new PsoStructureEntryInfo(MetaName.AimBehaviourEnvelopeRef, PsoDataType.String, 796, 7, 0), + new PsoStructureEntryInfo(MetaName.WaterBobShakeRef, PsoDataType.String, 800, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentMovementForOrientation, PsoDataType.Bool, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 808, 0, MetaName.camFollowCameraMetadataPullAroundSettings), + new PsoStructureEntryInfo(MetaName.PullAroundSettingsForLookBehind, PsoDataType.Structure, 872, 0, MetaName.camFollowCameraMetadataPullAroundSettings), + new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentLocalXYVelocityForPullAround, PsoDataType.Bool, 936, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentForwardSpeedForPullAround, PsoDataType.Bool, 937, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundToAttachParentFront, PsoDataType.Bool, 938, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundToBasicAttachParentMatrix, PsoDataType.Bool, 939, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundUsingSimpleSpringDamping, PsoDataType.Bool, 940, 0, 0), + new PsoStructureEntryInfo((MetaName)2671392542, PsoDataType.Bool, 941, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachParentApproachSpeedForPitchLock, PsoDataType.Float, 944, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockHeading, PsoDataType.Bool, 948, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMoveSpeedForFollowOrientation, PsoDataType.Float, 952, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLookAroundMoveSpeedMultiplier, PsoDataType.Float, 956, 0, 0), + new PsoStructureEntryInfo(MetaName.SpeedLimitsForVerticalMoveSpeedScaling, PsoDataType.Float2, 960, 0, 0), + new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScaling, PsoDataType.Float, 968, 0, 0), + new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScalingAtMaxSpeed, PsoDataType.Float, 972, 0, 0), + new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingOnGround, PsoDataType.Float, 976, 0, 0), + new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingInAir, PsoDataType.Float, 980, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMoveOrientationSpeedDuringLookAround, PsoDataType.Float, 984, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowOrientationConing, PsoDataType.Structure, 992, 0, MetaName.camFollowCameraMetadataFollowOrientationConing), + new PsoStructureEntryInfo(MetaName.RollSettings, PsoDataType.Structure, 1024, 0, MetaName.camFollowCameraMetadataRollSettings), + new PsoStructureEntryInfo(MetaName.HighAltitudeZoomSettings, PsoDataType.Structure, 1064, 0, MetaName.camFollowCameraMetadataHighAltitudeZoomSettings), + new PsoStructureEntryInfo(MetaName.HandBrakeSwingSettings, PsoDataType.Structure, 1104, 0, MetaName.camFollowVehicleCameraMetadataHandBrakeSwingSettings), + new PsoStructureEntryInfo(MetaName.DuckUnderOverheadCollisionSettings, PsoDataType.Structure, 1136, 0, MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettings), + new PsoStructureEntryInfo(MetaName.HighSpeedZoomSettings, PsoDataType.Structure, 1192, 0, MetaName.camFollowVehicleCameraMetadataHighSpeedZoomSettings), + new PsoStructureEntryInfo(MetaName.HighSpeedShakeSettings, PsoDataType.Structure, 1224, 0, MetaName.camFollowVehicleCameraMetadataHighSpeedShakeSettings), + new PsoStructureEntryInfo(MetaName.WaterEntryShakeSettings, PsoDataType.Structure, 1248, 0, MetaName.camFollowVehicleCameraMetadataWaterEntryShakeSettings), + new PsoStructureEntryInfo(MetaName.VerticalFlightModeSettings, PsoDataType.Structure, 1280, 0, MetaName.camFollowVehicleCameraMetadataVerticalFlightModeSettings), + new PsoStructureEntryInfo(MetaName.DoorAlignmentSettings, PsoDataType.Structure, 1296, 0, MetaName.camVehicleCustomSettingsMetadataDoorAlignmentSettings), + new PsoStructureEntryInfo(MetaName.VehicleEntryExitPitchLevelSmoothRate, PsoDataType.Float, 1336, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraOrbitPitchOffsetForHighAngleMode, PsoDataType.Float, 1340, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraOrbitPitchOffsetForThirdPersonFarViewMode, PsoDataType.Float, 1344, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldForceCutToOrbitDistanceLimitsForThirdPersonFarViewMode, PsoDataType.Bool, 1348, 0, 0), + new PsoStructureEntryInfo(MetaName.ThirdPersonVehicleAimCameraRef, PsoDataType.String, 1352, 7, 0), + new PsoStructureEntryInfo((MetaName)4075164277, PsoDataType.Bool, 1356, 0, 0), + new PsoStructureEntryInfo((MetaName)2625336677, PsoDataType.String, 1360, 7, 0), + new PsoStructureEntryInfo((MetaName)3347720841, PsoDataType.Float2, 1364, 0, 0) + ); + case MetaName.camFollowVehicleCameraMetadataHandBrakeSwingSettings: + return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataHandBrakeSwingSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.HandBrakeInputEnvelopeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinLateralSkidSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLateralSkidSpeed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SwingSpeedAtMaxSkidSpeed, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettings: + return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettings, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.EnvelopeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldDuck, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchOffsetWhenFullyDucked, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToPersist, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.CapsuleSettings, PsoDataType.Structure, 32, 0, MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettingsCapsuleSettings) + ); + case MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettingsCapsuleSettings: + return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataDuckUnderOverheadCollisionSettingsCapsuleSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.NumTests, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.LengthScaling, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.OffsetLimits, PsoDataType.Float2, 16, 0, 0) + ); + case MetaName.camFollowVehicleCameraMetadataHighSpeedZoomSettings: + return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataHighSpeedZoomSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBaseFovScaling, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.CutsceneBlendSpringConstant, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.CutsceneBlendSpringDampingRatio, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.camFollowVehicleCameraMetadataHighSpeedShakeSettings: + return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataHighSpeedShakeSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinForwardSpeed, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camFollowVehicleCameraMetadataWaterEntryShakeSettings: + return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataWaterEntryShakeSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxShakeInstances, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DownwardSpeedLimits, PsoDataType.Float2, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AmplitudeLimits, PsoDataType.Float2, 24, 0, 0) + ); + case MetaName.camFollowVehicleCameraMetadataVerticalFlightModeSettings: + return new PsoStructureInfo(MetaName.camFollowVehicleCameraMetadataVerticalFlightModeSettings, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 8, 0, 0) + ); + case MetaName.camVehicleCustomSettingsMetadataDoorAlignmentSettings: + return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataDoorAlignmentSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAlignOnVehicleExit, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo((MetaName)669372144, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.AlignmentConeOffsetTowardsVehicleFrontAngle, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.AlignmentConeAngle, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AlignmentConeAngleWithTrailer, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinOrientationDeltaToCut, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinOrientationDeltaToCutForReverseAngle, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinOrientationDeltaToCutWithTrailer, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camFollowParachuteCameraMetadata: + return new PsoStructureInfo(MetaName.camFollowParachuteCameraMetadata, 0, 0, 1136, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), + new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), + new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), + new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), + new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), + new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), + new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentInAirEnvelopeRef, PsoDataType.String, 784, 7, 0), + new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingOnGroundEnvelopeRef, PsoDataType.String, 788, 7, 0), + new PsoStructureEntryInfo(MetaName.AttachParentUpwardSpeedScalingInAirEnvelopeRef, PsoDataType.String, 792, 7, 0), + new PsoStructureEntryInfo(MetaName.AimBehaviourEnvelopeRef, PsoDataType.String, 796, 7, 0), + new PsoStructureEntryInfo(MetaName.WaterBobShakeRef, PsoDataType.String, 800, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentMovementForOrientation, PsoDataType.Bool, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.PullAroundSettings, PsoDataType.Structure, 808, 0, MetaName.camFollowCameraMetadataPullAroundSettings), + new PsoStructureEntryInfo(MetaName.PullAroundSettingsForLookBehind, PsoDataType.Structure, 872, 0, MetaName.camFollowCameraMetadataPullAroundSettings), + new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentLocalXYVelocityForPullAround, PsoDataType.Bool, 936, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConsiderAttachParentForwardSpeedForPullAround, PsoDataType.Bool, 937, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundToAttachParentFront, PsoDataType.Bool, 938, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundToBasicAttachParentMatrix, PsoDataType.Bool, 939, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPullAroundUsingSimpleSpringDamping, PsoDataType.Bool, 940, 0, 0), + new PsoStructureEntryInfo((MetaName)2671392542, PsoDataType.Bool, 941, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachParentApproachSpeedForPitchLock, PsoDataType.Float, 944, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockHeading, PsoDataType.Bool, 948, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMoveSpeedForFollowOrientation, PsoDataType.Float, 952, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLookAroundMoveSpeedMultiplier, PsoDataType.Float, 956, 0, 0), + new PsoStructureEntryInfo(MetaName.SpeedLimitsForVerticalMoveSpeedScaling, PsoDataType.Float2, 960, 0, 0), + new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScaling, PsoDataType.Float, 968, 0, 0), + new PsoStructureEntryInfo(MetaName.VerticalMoveSpeedScalingAtMaxSpeed, PsoDataType.Float, 972, 0, 0), + new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingOnGround, PsoDataType.Float, 976, 0, 0), + new PsoStructureEntryInfo(MetaName.UpwardMoveSpeedScalingInAir, PsoDataType.Float, 980, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMoveOrientationSpeedDuringLookAround, PsoDataType.Float, 984, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowOrientationConing, PsoDataType.Structure, 992, 0, MetaName.camFollowCameraMetadataFollowOrientationConing), + new PsoStructureEntryInfo(MetaName.RollSettings, PsoDataType.Structure, 1024, 0, MetaName.camFollowCameraMetadataRollSettings), + new PsoStructureEntryInfo(MetaName.HighAltitudeZoomSettings, PsoDataType.Structure, 1064, 0, MetaName.camFollowCameraMetadataHighAltitudeZoomSettings), + new PsoStructureEntryInfo(MetaName.CustomSettings, PsoDataType.Structure, 1104, 0, MetaName.camFollowParachuteCameraMetadataCustomSettings) + ); + case MetaName.camFollowParachuteCameraMetadataCustomSettings: + return new PsoStructureInfo(MetaName.camFollowParachuteCameraMetadataCustomSettings, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)3501562487, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)1514912105, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)2028447415, PsoDataType.String, 16, 7, 0) + ); + case MetaName.camFirstPersonPedAimCameraMetadata: + return new PsoStructureInfo(MetaName.camFirstPersonPedAimCameraMetadata, 0, 0, 208, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinUpdatesBeforeApplyingMotionBlur, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseMotionBlurStrength, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMinFovDelta, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxFovDelta, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxStrengthForFov, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachRelativeOffset, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachOffsetRelativeToCamera, PsoDataType.Bool, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRelativeHeading, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRelativeHeading, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldMakeAttachedEntityInvisible, PsoDataType.Bool, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)1959607978, PsoDataType.Bool, 113, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 114, 0, 0), + new PsoStructureEntryInfo((MetaName)1120407412, PsoDataType.Bool, 115, 0, 0), + new PsoStructureEntryInfo(MetaName.ShakeFirstPersonShootingAbilityLimits, PsoDataType.Float2, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.ShakeAmplitudeScalingForShootingAbilityLimits, PsoDataType.Float2, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)2758176724, PsoDataType.Structure, 136, 0, MetaName.camFirstPersonAimCameraMetadataHeadingCorrection), + new PsoStructureEntryInfo((MetaName)330110937, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachPositionSmoothRate, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTorsoIkLimitsOverrideOrbitPitchLimits, PsoDataType.Bool, 188, 0, 0), + new PsoStructureEntryInfo((MetaName)1847867369, PsoDataType.Bool, 189, 0, 0), + new PsoStructureEntryInfo((MetaName)1173900687, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo((MetaName)1322555765, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo((MetaName)1723254225, PsoDataType.Bool, 200, 0, 0) + ); + case MetaName.camFirstPersonAimCameraMetadataHeadingCorrection: + return new PsoStructureInfo(MetaName.camFirstPersonAimCameraMetadataHeadingCorrection, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)1496770623, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DeltaTolerance, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.camFirstPersonShooterCameraMetadata: + return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadata, 0, 0, 1664, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinUpdatesBeforeApplyingMotionBlur, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseMotionBlurStrength, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMinFovDelta, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxFovDelta, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxStrengthForFov, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachRelativeOffset, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachOffsetRelativeToCamera, PsoDataType.Bool, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRelativeHeading, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRelativeHeading, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldMakeAttachedEntityInvisible, PsoDataType.Bool, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)1959607978, PsoDataType.Bool, 113, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 114, 0, 0), + new PsoStructureEntryInfo((MetaName)1120407412, PsoDataType.Bool, 115, 0, 0), + new PsoStructureEntryInfo(MetaName.ShakeFirstPersonShootingAbilityLimits, PsoDataType.Float2, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.ShakeAmplitudeScalingForShootingAbilityLimits, PsoDataType.Float2, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)2758176724, PsoDataType.Structure, 136, 0, MetaName.camFirstPersonAimCameraMetadataHeadingCorrection), + new PsoStructureEntryInfo((MetaName)330110937, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 176, 7, 0), + new PsoStructureEntryInfo((MetaName)3500215588, PsoDataType.Float3, 192, 0, 0), + new PsoStructureEntryInfo((MetaName)1583458555, PsoDataType.Float3, 208, 0, 0), + new PsoStructureEntryInfo((MetaName)3253139357, PsoDataType.Float3, 224, 0, 0), + new PsoStructureEntryInfo((MetaName)4262893203, PsoDataType.Float3, 240, 0, 0), + new PsoStructureEntryInfo((MetaName)2347724525, PsoDataType.Float3, 256, 0, 0), + new PsoStructureEntryInfo((MetaName)3438104893, PsoDataType.Float3, 272, 0, 0), + new PsoStructureEntryInfo((MetaName)424961570, PsoDataType.Float3, 288, 0, 0), + new PsoStructureEntryInfo((MetaName)104465235, PsoDataType.Float3, 304, 0, 0), + new PsoStructureEntryInfo((MetaName)4034848485, PsoDataType.Float3, 320, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRelativeHeading, PsoDataType.Float2, 336, 0, 0), + new PsoStructureEntryInfo((MetaName)2372600507, PsoDataType.Float2, 344, 0, 0), + new PsoStructureEntryInfo((MetaName)971666241, PsoDataType.Float2, 352, 0, 0), + new PsoStructureEntryInfo((MetaName)162051482, PsoDataType.Float2, 360, 0, 0), + new PsoStructureEntryInfo((MetaName)3789298543, PsoDataType.Float2, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)3507003526, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo((MetaName)1765689234, PsoDataType.String, 384, 7, 0), + new PsoStructureEntryInfo((MetaName)722540604, PsoDataType.String, 388, 7, 0), + new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 392, 7, 0), + new PsoStructureEntryInfo((MetaName)3102337801, PsoDataType.String, 396, 7, 0), + new PsoStructureEntryInfo((MetaName)1038878908, PsoDataType.String, 400, 7, 0), + new PsoStructureEntryInfo((MetaName)3684814544, PsoDataType.String, 404, 7, 0), + new PsoStructureEntryInfo((MetaName)2377645189, PsoDataType.String, 408, 7, 0), + new PsoStructureEntryInfo((MetaName)3664775821, PsoDataType.String, 412, 7, 0), + new PsoStructureEntryInfo((MetaName)3075522471, PsoDataType.String, 416, 7, 0), + new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 420, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeAttachPositionSmoothRate, PsoDataType.Float, 424, 0, 0), + new PsoStructureEntryInfo((MetaName)3559802057, PsoDataType.Structure, 432, 0, MetaName.camFirstPersonShooterCameraMetadataRelativeAttachOrientationSettings), + new PsoStructureEntryInfo((MetaName)3284913244, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo((MetaName)742850166, PsoDataType.Float, 548, 0, 0), + new PsoStructureEntryInfo((MetaName)1801708329, PsoDataType.Float, 552, 0, 0), + new PsoStructureEntryInfo((MetaName)522025471, PsoDataType.Float, 556, 0, 0), + new PsoStructureEntryInfo(MetaName.AimFov, PsoDataType.Float, 560, 0, 0), + new PsoStructureEntryInfo((MetaName)2685045238, PsoDataType.Float, 564, 0, 0), + new PsoStructureEntryInfo((MetaName)1545486036, PsoDataType.Float, 568, 0, 0), + new PsoStructureEntryInfo(MetaName.PhoneFov, PsoDataType.Float, 572, 0, 0), + new PsoStructureEntryInfo((MetaName)2263644173, PsoDataType.Float, 576, 0, 0), + new PsoStructureEntryInfo((MetaName)189771911, PsoDataType.Float, 580, 0, 0), + new PsoStructureEntryInfo((MetaName)3266229162, PsoDataType.Float, 584, 0, 0), + new PsoStructureEntryInfo((MetaName)3113298498, PsoDataType.Float, 588, 0, 0), + new PsoStructureEntryInfo((MetaName)317025866, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo((MetaName)788370107, PsoDataType.Float, 596, 0, 0), + new PsoStructureEntryInfo((MetaName)1892114730, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo((MetaName)2312570903, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo((MetaName)1650788232, PsoDataType.Float, 608, 0, 0), + new PsoStructureEntryInfo((MetaName)3142109941, PsoDataType.Float, 612, 0, 0), + new PsoStructureEntryInfo((MetaName)1692829019, PsoDataType.Float, 616, 0, 0), + new PsoStructureEntryInfo((MetaName)1583361695, PsoDataType.Float, 620, 0, 0), + new PsoStructureEntryInfo((MetaName)3530519735, PsoDataType.Float, 624, 0, 0), + new PsoStructureEntryInfo((MetaName)1560089378, PsoDataType.Float, 628, 0, 0), + new PsoStructureEntryInfo((MetaName)1683046794, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo((MetaName)1176445410, PsoDataType.Float, 636, 0, 0), + new PsoStructureEntryInfo((MetaName)3761456258, PsoDataType.Float, 640, 0, 0), + new PsoStructureEntryInfo((MetaName)413985988, PsoDataType.Float, 644, 0, 0), + new PsoStructureEntryInfo((MetaName)731578407, PsoDataType.Float, 648, 0, 0), + new PsoStructureEntryInfo((MetaName)3517278862, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.LadderPitch, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo((MetaName)83336335, PsoDataType.Float, 660, 0, 0), + new PsoStructureEntryInfo((MetaName)3203179444, PsoDataType.Float, 664, 0, 0), + new PsoStructureEntryInfo((MetaName)803486985, PsoDataType.Float, 668, 0, 0), + new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 672, 0, 0), + new PsoStructureEntryInfo((MetaName)2122499987, PsoDataType.Float, 676, 0, 0), + new PsoStructureEntryInfo((MetaName)1515082975, PsoDataType.Float, 680, 0, 0), + new PsoStructureEntryInfo((MetaName)1515564685, PsoDataType.Float, 684, 0, 0), + new PsoStructureEntryInfo((MetaName)3592059377, PsoDataType.Float, 688, 0, 0), + new PsoStructureEntryInfo((MetaName)448454700, PsoDataType.Bool, 692, 0, 0), + new PsoStructureEntryInfo((MetaName)545313111, PsoDataType.Float, 696, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo((MetaName)1534221961, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo((MetaName)270168093, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo((MetaName)2100042799, PsoDataType.Float, 712, 0, 0), + new PsoStructureEntryInfo((MetaName)3626441228, PsoDataType.UInt, 716, 0, 0), + new PsoStructureEntryInfo((MetaName)700340890, PsoDataType.UInt, 720, 0, 0), + new PsoStructureEntryInfo((MetaName)1968480925, PsoDataType.UInt, 724, 0, 0), + new PsoStructureEntryInfo((MetaName)2850438294, PsoDataType.UInt, 728, 0, 0), + new PsoStructureEntryInfo((MetaName)1608452380, PsoDataType.UInt, 732, 0, 0), + new PsoStructureEntryInfo((MetaName)2387142724, PsoDataType.UInt, 736, 0, 0), + new PsoStructureEntryInfo((MetaName)2743970065, PsoDataType.UInt, 740, 0, 0), + new PsoStructureEntryInfo((MetaName)2452155390, PsoDataType.UInt, 744, 0, 0), + new PsoStructureEntryInfo(MetaName.OrientationSpring, PsoDataType.Structure, 752, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpring), + new PsoStructureEntryInfo((MetaName)415673303, PsoDataType.Structure, 792, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpring), + new PsoStructureEntryInfo((MetaName)3397810078, PsoDataType.Structure, 832, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpring), + new PsoStructureEntryInfo((MetaName)3440729757, PsoDataType.Structure, 872, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)2454767338, PsoDataType.Structure, 888, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)1962460716, PsoDataType.Structure, 904, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)1766077384, PsoDataType.Structure, 920, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)2053281479, PsoDataType.Structure, 936, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)3083287001, PsoDataType.Structure, 952, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)4060968766, PsoDataType.Structure, 968, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)2437540040, PsoDataType.Structure, 984, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)3391036765, PsoDataType.Structure, 1000, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)2728534787, PsoDataType.Structure, 1016, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)3139215619, PsoDataType.Structure, 1032, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)4087791749, PsoDataType.Structure, 1048, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)2550891007, PsoDataType.Structure, 1064, 0, MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite), + new PsoStructureEntryInfo((MetaName)475503552, PsoDataType.Float, 1080, 0, 0), + new PsoStructureEntryInfo((MetaName)1215439957, PsoDataType.Float2, 1084, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTorsoIkLimitsOverrideOrbitPitchLimits, PsoDataType.Bool, 1092, 0, 0), + new PsoStructureEntryInfo((MetaName)1723254225, PsoDataType.Bool, 1093, 0, 0), + new PsoStructureEntryInfo((MetaName)366723406, PsoDataType.String, 1096, 7, 0), + new PsoStructureEntryInfo((MetaName)264754789, PsoDataType.String, 1100, 7, 0), + new PsoStructureEntryInfo((MetaName)1539647797, PsoDataType.String, 1104, 7, 0), + new PsoStructureEntryInfo((MetaName)1519473347, PsoDataType.Float, 1108, 0, 0), + new PsoStructureEntryInfo((MetaName)3224324247, PsoDataType.Float, 1112, 0, 0), + new PsoStructureEntryInfo((MetaName)2478271115, PsoDataType.Float, 1116, 0, 0), + new PsoStructureEntryInfo((MetaName)2317113905, PsoDataType.Float, 1120, 0, 0), + new PsoStructureEntryInfo((MetaName)3903912151, PsoDataType.Float, 1124, 0, 0), + new PsoStructureEntryInfo((MetaName)2266019553, PsoDataType.Float, 1128, 0, 0), + new PsoStructureEntryInfo((MetaName)3706052819, PsoDataType.Float, 1132, 0, 0), + new PsoStructureEntryInfo((MetaName)2722258227, PsoDataType.Float, 1136, 0, 0), + new PsoStructureEntryInfo((MetaName)1525907069, PsoDataType.Float, 1140, 0, 0), + new PsoStructureEntryInfo((MetaName)2570774561, PsoDataType.Float, 1144, 0, 0), + new PsoStructureEntryInfo((MetaName)1547572758, PsoDataType.Bool, 1148, 0, 0), + new PsoStructureEntryInfo((MetaName)3957958745, PsoDataType.UInt, 1152, 0, 0), + new PsoStructureEntryInfo((MetaName)1630855608, PsoDataType.Float, 1156, 0, 0), + new PsoStructureEntryInfo((MetaName)3965978499, PsoDataType.Structure, 1160, 0, MetaName.camFirstPersonShooterCameraMetadataStickyAim), + new PsoStructureEntryInfo((MetaName)585212636, PsoDataType.Structure, 1272, 0, MetaName.camFirstPersonShooterCameraMetadataStickyAim), + new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 1384, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 1385, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 1388, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 1392, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 1396, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 1400, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 1404, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 1408, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 1412, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 1416, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 1420, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 1424, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 1428, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 1432, 0, 0), + new PsoStructureEntryInfo((MetaName)2447870594, PsoDataType.Float, 1436, 0, 0), + new PsoStructureEntryInfo((MetaName)2225908075, PsoDataType.Float, 1440, 0, 0), + new PsoStructureEntryInfo((MetaName)1894138, PsoDataType.Float, 1444, 0, 0), + new PsoStructureEntryInfo((MetaName)724885771, PsoDataType.Float, 1448, 0, 0), + new PsoStructureEntryInfo((MetaName)2413827894, PsoDataType.Float2, 1452, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverSettings, PsoDataType.Structure, 1464, 0, MetaName.camFirstPersonShooterCameraMetadataCoverSettings), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camFirstPersonShooterCameraMetadataSprintBreakOutSettings), + new PsoStructureEntryInfo((MetaName)2011532787, PsoDataType.Array, 1584, 1, (MetaName)131236), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 1656, 7, 0) + ); + case MetaName.camFirstPersonShooterCameraMetadataRelativeAttachOrientationSettings: + return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataRelativeAttachOrientationSettings, 0, 0, 112, + new PsoStructureEntryInfo((MetaName)3727099699, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)3120224920, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)2408234737, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)869960116, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3340971535, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2197092363, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2198368821, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3606762226, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1647925848, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)490937808, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)379620733, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1441798592, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3840322276, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3383026591, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)1824793815, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1259376027, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2964527414, PsoDataType.Float3, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)2439730995, PsoDataType.Float3, 96, 0, 0) + ); + case MetaName.camFirstPersonShooterCameraMetadataOrientationSpring: + return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataOrientationSpring, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.HeadingLimits, PsoDataType.Float2, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchLimits, PsoDataType.Float2, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1524988618, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)1290012653, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite: + return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataOrientationSpringLite, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camFirstPersonShooterCameraMetadataStickyAim: + return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataStickyAim, 0, 0, 112, + new PsoStructureEntryInfo((MetaName)934287534, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)1890095417, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)2911838887, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1168068740, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)943460322, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2440008981, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3546382126, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3702929248, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1390609527, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1952283316, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1859396322, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)3508865952, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)4071651879, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3012719683, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)1163787532, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)3148686816, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2294593316, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)3264503435, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)432760898, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)3118501359, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)2024506330, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)1824271937, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)721888806, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)903289241, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)2991714924, PsoDataType.Float, 104, 0, 0) + ); + case MetaName.camFirstPersonShooterCameraMetadataCoverSettings: + return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataCoverSettings, 0, 0, 120, + new PsoStructureEntryInfo((MetaName)2970917480, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)256711860, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)2716737212, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1153272400, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)11232964, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1680843526, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1294539981, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3548711893, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3299300152, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1497386222, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)783496886, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2616989255, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingCorrection, PsoDataType.Structure, 56, 0, MetaName.camFirstPersonAimCameraMetadataHeadingCorrection), + new PsoStructureEntryInfo((MetaName)907428778, PsoDataType.SInt, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)4143200730, PsoDataType.SInt, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)105496678, PsoDataType.SInt, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)2098811685, PsoDataType.SInt, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)1946159554, PsoDataType.SInt, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)3595423851, PsoDataType.SInt, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)153370955, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)1271201291, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)558015512, PsoDataType.UInt, 112, 0, 0) + ); + case MetaName.camFirstPersonShooterCameraMetadataSprintBreakOutSettings: + return new PsoStructureInfo(MetaName.camFirstPersonShooterCameraMetadataSprintBreakOutSettings, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)741085985, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)87271889, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)4190510062, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1438187592, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1823031239, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2144963791, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.camFirstPersonHeadTrackingAimCameraMetadata: + return new PsoStructureInfo(MetaName.camFirstPersonHeadTrackingAimCameraMetadata, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinUpdatesBeforeApplyingMotionBlur, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseMotionBlurStrength, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMinFovDelta, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxFovDelta, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ZoomMotionBlurMaxStrengthForFov, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachRelativeOffset, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachOffsetRelativeToCamera, PsoDataType.Bool, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRelativeHeading, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRelativeHeading, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 116, 0, 0) + ); + case MetaName.camThirdPersonPedAimCameraMetadata: + return new PsoStructureInfo(MetaName.camThirdPersonPedAimCameraMetadata, 0, 0, 1040, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), + new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), + new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), + new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), + new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), + new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), + new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), + new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), + new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), + new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), + new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnTargetStunnedEnvelopeRef, PsoDataType.String, 880, 7, 0), + new PsoStructureEntryInfo(MetaName.LockOnTargetDampingSettings, PsoDataType.Structure, 888, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings), + new PsoStructureEntryInfo(MetaName.LockOnOrbitDistanceSettings, PsoDataType.Structure, 928, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings), + new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffset, PsoDataType.Float3, 976, 0, 0), + new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffsetAtOrbitHeadingLimits, PsoDataType.Float3, 992, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 1008, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldScriptedAimTaskOverrideOrbitPitchLimits, PsoDataType.Bool, 1012, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAimSweepOverrideOrbitPitchLimits, PsoDataType.Bool, 1013, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsForMobilePhoneShallowDofMode, PsoDataType.String, 1016, 7, 0), + new PsoStructureEntryInfo((MetaName)309842601, PsoDataType.Float, 1020, 0, 0), + new PsoStructureEntryInfo((MetaName)3770307856, PsoDataType.Bool, 1024, 0, 0) + ); + case MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldApplyDamping, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.StunnedHeadingSpringConstant, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.StunnedHeadingSpringDampingRatio, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StunnedPitchSpringConstant, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.StunnedPitchSpringDampingRatio, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.StunnedDistanceSpringConstant, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.StunnedDistanceSpringDampingRatio, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldApplyScaling, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnDistanceLimits, PsoDataType.Float2, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingLimits, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingSpringConstant, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingSpringDampingRatio, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraMetadata: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraMetadata, 0, 0, 1584, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), + new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), + new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), + new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), + new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), + new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), + new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), + new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), + new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), + new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), + new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnTargetStunnedEnvelopeRef, PsoDataType.String, 880, 7, 0), + new PsoStructureEntryInfo(MetaName.LockOnTargetDampingSettings, PsoDataType.Structure, 888, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings), + new PsoStructureEntryInfo(MetaName.LockOnOrbitDistanceSettings, PsoDataType.Structure, 928, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings), + new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffset, PsoDataType.Float3, 976, 0, 0), + new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffsetAtOrbitHeadingLimits, PsoDataType.Float3, 992, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 1008, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldScriptedAimTaskOverrideOrbitPitchLimits, PsoDataType.Bool, 1012, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAimSweepOverrideOrbitPitchLimits, PsoDataType.Bool, 1013, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsForMobilePhoneShallowDofMode, PsoDataType.String, 1016, 7, 0), + new PsoStructureEntryInfo((MetaName)309842601, PsoDataType.Float, 1020, 0, 0), + new PsoStructureEntryInfo((MetaName)3770307856, PsoDataType.Bool, 1024, 0, 0), + new PsoStructureEntryInfo((MetaName)2612404486, PsoDataType.Bool, 1040, 0, 0), + new PsoStructureEntryInfo((MetaName)3464513788, PsoDataType.String, 1044, 7, 0), + new PsoStructureEntryInfo((MetaName)3165832172, PsoDataType.Float, 1048, 0, 0), + new PsoStructureEntryInfo((MetaName)313901382, PsoDataType.Float, 1052, 0, 0), + new PsoStructureEntryInfo((MetaName)3456520914, PsoDataType.Float, 1056, 0, 0), + new PsoStructureEntryInfo((MetaName)3227758752, PsoDataType.Float, 1060, 0, 0), + new PsoStructureEntryInfo((MetaName)2595201884, PsoDataType.Structure, 1064, 0, MetaName.camThirdPersonPedAssistedAimCameraShakeActivityScalingSettings), + new PsoStructureEntryInfo((MetaName)1699579049, PsoDataType.Structure, 1088, 0, MetaName.camThirdPersonPedAssistedAimCameraRunningShakeSettings), + new PsoStructureEntryInfo((MetaName)2514985597, PsoDataType.Structure, 1112, 0, MetaName.camThirdPersonPedAssistedAimCameraRunningShakeSettings), + new PsoStructureEntryInfo((MetaName)3459655185, PsoDataType.Structure, 1136, 0, MetaName.camThirdPersonPedAssistedAimCameraPivotScalingSettings), + new PsoStructureEntryInfo((MetaName)1039438125, PsoDataType.Structure, 1192, 0, MetaName.camThirdPersonPedAssistedAimCameraShootingFocusSettings), + new PsoStructureEntryInfo((MetaName)2331386580, PsoDataType.Structure, 1248, 0, MetaName.camThirdPersonPedAssistedAimCameraCinematicMomentSettings), + new PsoStructureEntryInfo((MetaName)3975806377, PsoDataType.Structure, 1432, 0, MetaName.camThirdPersonPedAssistedAimCameraRecoilShakeScalingSettings), + new PsoStructureEntryInfo((MetaName)2579888707, PsoDataType.Structure, 1464, 0, MetaName.camThirdPersonPedAssistedAimCameraInCoverSettings) + ); + case MetaName.camThirdPersonPedAssistedAimCameraShakeActivityScalingSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraShakeActivityScalingSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.AmplitudeScale, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraRunningShakeSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraRunningShakeSettings, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinAmplitude, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAmplitude, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3083741385, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2434404012, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo((MetaName)1424595128, PsoDataType.Bool, 22, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraPivotScalingSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraPivotScalingSettings, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)3290868314, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZoomFactor, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1239610477, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)4266810853, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2490035552, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)1582111169, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ErrorThreshold, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.SideOffset, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)3185812029, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2740464011, PsoDataType.Float, 52, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraShootingFocusSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraShootingFocusSettings, 0, 0, 56, + new PsoStructureEntryInfo((MetaName)1778381348, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)352609433, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2503271690, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZoomFactor, PsoDataType.Float, 48, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraCinematicMomentSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraCinematicMomentSettings, 0, 0, 184, + new PsoStructureEntryInfo((MetaName)3112353702, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)3298892127, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)3924454742, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2215779446, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)917560913, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1705773296, PsoDataType.UInt, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3495762240, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)2011477591, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3944656129, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3273599536, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.ZoomFactor, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1293989475, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3934763180, PsoDataType.Structure, 56, 0, MetaName.camThirdPersonPedAssistedAimCameraLockOnAlignmentSettings), + new PsoStructureEntryInfo((MetaName)4209943355, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)3222932576, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)1411402256, PsoDataType.Structure, 120, 0, MetaName.camThirdPersonPedAssistedAimCameraPlayerFramingSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 180, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraLockOnAlignmentSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraLockOnAlignmentSettings, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)2192037365, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)1207772736, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1953981041, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.IdleCmini, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3067708566, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3928624067, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)4117544351, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3546588287, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)2433975532, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2894326732, PsoDataType.Float, 48, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraPlayerFramingSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraPlayerFramingSettings, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.AttackDelay, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.AttackDuration, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ReleaseDelay, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1918481730, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredPitch, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3067708566, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3928624067, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)4117544351, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3648026356, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraRecoilShakeScalingSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraRecoilShakeScalingSettings, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)632884413, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)3501089975, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)1841607681, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)405521980, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2308368369, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camThirdPersonPedAssistedAimCameraInCoverSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAssistedAimCameraInCoverSettings, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3044106186, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2342994624, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2363962395, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3996729234, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2974603259, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1163820100, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1153320978, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)887750583, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.parameterIntensity, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3038154213, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)795086429, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)2305231569, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2043206239, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1283135688, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)3878807616, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)3640542370, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)3758922505, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)1764223557, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)3214654546, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)1111260888, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)3050977735, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)1185331567, PsoDataType.Float, 108, 0, 0) + ); + case MetaName.camThirdPersonPedAimInCoverCameraMetadata: + return new PsoStructureInfo(MetaName.camThirdPersonPedAimInCoverCameraMetadata, 0, 0, 1248, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), + new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), + new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), + new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), + new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), + new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), + new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), + new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), + new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), + new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), + new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnTargetStunnedEnvelopeRef, PsoDataType.String, 880, 7, 0), + new PsoStructureEntryInfo(MetaName.LockOnTargetDampingSettings, PsoDataType.Structure, 888, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings), + new PsoStructureEntryInfo(MetaName.LockOnOrbitDistanceSettings, PsoDataType.Structure, 928, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings), + new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffset, PsoDataType.Float3, 976, 0, 0), + new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffsetAtOrbitHeadingLimits, PsoDataType.Float3, 992, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 1008, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldScriptedAimTaskOverrideOrbitPitchLimits, PsoDataType.Bool, 1012, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAimSweepOverrideOrbitPitchLimits, PsoDataType.Bool, 1013, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsForMobilePhoneShallowDofMode, PsoDataType.String, 1016, 7, 0), + new PsoStructureEntryInfo((MetaName)309842601, PsoDataType.Float, 1020, 0, 0), + new PsoStructureEntryInfo((MetaName)3770307856, PsoDataType.Bool, 1024, 0, 0), + new PsoStructureEntryInfo((MetaName)124410885, PsoDataType.Float, 1040, 0, 0), + new PsoStructureEntryInfo((MetaName)1852506764, PsoDataType.Float, 1044, 0, 0), + new PsoStructureEntryInfo((MetaName)1914946004, PsoDataType.Float, 1048, 0, 0), + new PsoStructureEntryInfo((MetaName)2125876256, PsoDataType.Float, 1052, 0, 0), + new PsoStructureEntryInfo((MetaName)3456376985, PsoDataType.Float, 1056, 0, 0), + new PsoStructureEntryInfo(MetaName.streamedMusc, PsoDataType.Float, 1060, 0, 0), + new PsoStructureEntryInfo((MetaName)2791057952, PsoDataType.Float, 1064, 0, 0), + new PsoStructureEntryInfo((MetaName)1336398630, PsoDataType.Bool, 1068, 0, 0), + new PsoStructureEntryInfo((MetaName)1847527244, PsoDataType.Float, 1072, 0, 0), + new PsoStructureEntryInfo((MetaName)364456330, PsoDataType.Float, 1076, 0, 0), + new PsoStructureEntryInfo((MetaName)3398320415, PsoDataType.Float, 1080, 0, 0), + new PsoStructureEntryInfo((MetaName)2699503170, PsoDataType.Float, 1084, 0, 0), + new PsoStructureEntryInfo((MetaName)2215910236, PsoDataType.Float, 1088, 0, 0), + new PsoStructureEntryInfo((MetaName)2140597790, PsoDataType.Float, 1092, 0, 0), + new PsoStructureEntryInfo((MetaName)2141354850, PsoDataType.Float, 1096, 0, 0), + new PsoStructureEntryInfo((MetaName)9125054, PsoDataType.Float, 1100, 0, 0), + new PsoStructureEntryInfo((MetaName)341585039, PsoDataType.Float, 1104, 0, 0), + new PsoStructureEntryInfo((MetaName)3090152422, PsoDataType.Float, 1108, 0, 0), + new PsoStructureEntryInfo((MetaName)3518102089, PsoDataType.Float, 1112, 0, 0), + new PsoStructureEntryInfo((MetaName)2714979879, PsoDataType.Float, 1116, 0, 0), + new PsoStructureEntryInfo((MetaName)4047322117, PsoDataType.Float, 1120, 0, 0), + new PsoStructureEntryInfo((MetaName)10419895, PsoDataType.Float, 1124, 0, 0), + new PsoStructureEntryInfo((MetaName)817394632, PsoDataType.Float2, 1128, 0, 0), + new PsoStructureEntryInfo((MetaName)3793303691, PsoDataType.Bool, 1136, 0, 0), + new PsoStructureEntryInfo((MetaName)891610436, PsoDataType.Float, 1140, 0, 0), + new PsoStructureEntryInfo((MetaName)1332592052, PsoDataType.Float, 1144, 0, 0), + new PsoStructureEntryInfo((MetaName)3712243434, PsoDataType.Float, 1148, 0, 0), + new PsoStructureEntryInfo((MetaName)2126717159, PsoDataType.Float, 1152, 0, 0), + new PsoStructureEntryInfo((MetaName)467663222, PsoDataType.Float, 1156, 0, 0), + new PsoStructureEntryInfo((MetaName)3920880465, PsoDataType.Float, 1160, 0, 0), + new PsoStructureEntryInfo((MetaName)1407257659, PsoDataType.UInt, 1164, 0, 0), + new PsoStructureEntryInfo((MetaName)1350298358, PsoDataType.Structure, 1168, 0, MetaName.camThirdPersonPedAimInCoverCameraMetadataLowCoverSettings), + new PsoStructureEntryInfo(MetaName.AimingSettings, PsoDataType.Structure, 1208, 0, MetaName.camThirdPersonPedAimInCoverCameraMetadataAimingSettings) + ); + case MetaName.camThirdPersonPedAimInCoverCameraMetadataLowCoverSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAimInCoverCameraMetadataLowCoverSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.BlendInSpringConstant, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)2811394796, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutSpringConstant, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)388057725, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)4026985674, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2972801644, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camThirdPersonPedAimInCoverCameraMetadataAimingSettings: + return new PsoStructureInfo(MetaName.camThirdPersonPedAimInCoverCameraMetadataAimingSettings, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ShouldApply, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)3794685898, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3031220740, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)810186943, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2302950975, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camThirdPersonPedMeleeAimCameraMetadata: + return new PsoStructureInfo(MetaName.camThirdPersonPedMeleeAimCameraMetadata, 0, 0, 1088, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), + new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), + new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), + new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), + new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), + new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), + new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), + new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), + new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), + new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), + new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnTargetStunnedEnvelopeRef, PsoDataType.String, 880, 7, 0), + new PsoStructureEntryInfo(MetaName.LockOnTargetDampingSettings, PsoDataType.Structure, 888, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnTargetDampingSettings), + new PsoStructureEntryInfo(MetaName.LockOnOrbitDistanceSettings, PsoDataType.Structure, 928, 0, MetaName.camThirdPersonPedAimCameraMetadataLockOnOrbitDistanceSettings), + new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffset, PsoDataType.Float3, 976, 0, 0), + new PsoStructureEntryInfo(MetaName.ParentRelativeAttachOffsetAtOrbitHeadingLimits, PsoDataType.Float3, 992, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachBoneTag, PsoDataType.SInt, 1008, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldScriptedAimTaskOverrideOrbitPitchLimits, PsoDataType.Bool, 1012, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAimSweepOverrideOrbitPitchLimits, PsoDataType.Bool, 1013, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsForMobilePhoneShallowDofMode, PsoDataType.String, 1016, 7, 0), + new PsoStructureEntryInfo((MetaName)309842601, PsoDataType.Float, 1020, 0, 0), + new PsoStructureEntryInfo((MetaName)3770307856, PsoDataType.Bool, 1024, 0, 0), + new PsoStructureEntryInfo((MetaName)3195731427, PsoDataType.Float, 1040, 0, 0), + new PsoStructureEntryInfo((MetaName)2888452072, PsoDataType.Float2, 1044, 0, 0), + new PsoStructureEntryInfo((MetaName)2501102835, PsoDataType.Float, 1052, 0, 0), + new PsoStructureEntryInfo((MetaName)2903662656, PsoDataType.Float, 1056, 0, 0), + new PsoStructureEntryInfo((MetaName)2037218535, PsoDataType.Float, 1060, 0, 0), + new PsoStructureEntryInfo((MetaName)4219845621, PsoDataType.Float, 1064, 0, 0), + new PsoStructureEntryInfo((MetaName)3549368383, PsoDataType.Float, 1068, 0, 0), + new PsoStructureEntryInfo((MetaName)1000603972, PsoDataType.Float, 1072, 0, 0), + new PsoStructureEntryInfo((MetaName)1991971403, PsoDataType.Float, 1076, 0, 0) + ); + case MetaName.camThirdPersonVehicleAimCameraMetadata: + return new PsoStructureInfo(MetaName.camThirdPersonVehicleAimCameraMetadata, 0, 0, 896, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlHelperRef, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.HintHelperRef, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.CatchUpHelperRef, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseAttachVelocityToIgnoreEnvelopeRef, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseFov, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseNearClip, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3305154880, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldOrbitRelativeToAttachParentOrientation, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPersistOrbitOrientationRelativeToAttachParent, PsoDataType.Bool, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringConstant, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentMatrixForRelativeOrbitSpringDampingRatio, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2406229624, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)727876548, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSubmergedLevelToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftGroundSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAircraftContactSpeedToApplyFullAttachParentMatrixForRelativeOrbit, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldTimeToBlockFullAttachParentMatrixForRelativeOrbit, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAttachParentSpeedToClonePitchFromCinematicMountedCameras, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomFramingInTightSpace, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAttachSpeedToUpdateTightSpaceLevel, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringConstant, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.TightSpaceSpringDampingRatio, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DofSettingsInTightSpace, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldAttachToParentCentreOfGravity, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseDynamicCentreOfGravity, PsoDataType.Bool, 121, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVelocityOfAttachParentAttachEntity, PsoDataType.Bool, 122, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomBoundingBoxSettings, PsoDataType.Structure, 128, 0, MetaName.camThirdPersonCameraMetadataCustomBoundingBoxSettings), + new PsoStructureEntryInfo(MetaName.ShouldApplyAttachPedPelvisOffset, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringConstant, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachPedPelvisOffsetSpringDampingRatio, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotPosition, PsoDataType.Structure, 176, 0, MetaName.camThirdPersonCameraMetadataBasePivotPosition), + new PsoStructureEntryInfo(MetaName.PivotPosition, PsoDataType.Structure, 272, 0, MetaName.camThirdPersonCameraMetadataPivotPosition), + new PsoStructureEntryInfo(MetaName.PivotOverBoundingBoxSettings, PsoDataType.Structure, 320, 0, MetaName.camThirdPersonCameraMetadataPivotOverBoungingBoxSettings), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoom, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoom, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMinFootRoomInTightSpace, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ScreenRatioForMaxFootRoomInTightSpace, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.BasePivotHeightScalingForFootRoom, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreVerticalPivotOffsetForFootRoom, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeOrbitDistanceScalingForExtensions, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)560700931, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomOrbitDistanceLimitsToForce, PsoDataType.Float2, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringConstant, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitSpringDampingRatio, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceScalingForCustomFirstPersonFallBack, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.BuoyancySettings, PsoDataType.Structure, 400, 0, MetaName.camThirdPersonCameraMetadataBuoyancySettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithAttachParent, PsoDataType.Bool, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreCollisionWithFollowVehicle, PsoDataType.Bool, 449, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionOrigin, PsoDataType.Bool, 450, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreFollowVehicleForCollisionRoot, PsoDataType.Bool, 451, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringConstant, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionTestRadiusSpringDampingRatio, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomCollisionOriginRelativePosition, PsoDataType.Float3, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)4194152221, PsoDataType.Float3, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseCustomCollisionOrigin, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1998689777, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo((MetaName)2235540893, PsoDataType.Bool, 514, 0, 0), + new PsoStructureEntryInfo((MetaName)3479639237, PsoDataType.Float3, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)1496115250, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionFallBackPosition, PsoDataType.Structure, 552, 0, MetaName.camThirdPersonCameraMetadataCollisionFallBackPosition), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionFallBackToPivotBlendValue, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldConstrainCollisionRootPositionAgainstClippingTypes, PsoDataType.Bool, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringConstant, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionRootPositionSpringDampingRatio, PsoDataType.Float, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleOnTopOfVehicleCollisionSettings, PsoDataType.Structure, 608, 0, MetaName.camThirdPersonCameraMetadataVehicleOnTopOfVehicleCollisionSettings), + new PsoStructureEntryInfo(MetaName.IdealHeadingOffsetForLimiting, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeOrbitHeadingLimits, PsoDataType.Float2, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitPitchLimits, PsoDataType.Float2, 644, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffset, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseOrbitPitchOffsetInTightSpace, PsoDataType.Float, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.LookOverSettings, PsoDataType.Structure, 664, 0, MetaName.camThirdPersonCameraMetadataLookOverSettings), + new PsoStructureEntryInfo(MetaName.ShouldIgnoreAttachParentPitchForLookBehind, PsoDataType.Bool, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.OrbitDistanceLimitsForBasePosition, PsoDataType.Float2, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.PreToPostCollisionLookAtOrientationBlendValue, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringConstant, PsoDataType.Float, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollSpringDampingRatio, PsoDataType.Float, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchSoftLimits, PsoDataType.Float2, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRollDampingPitchHardLimits, PsoDataType.Float2, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthZoomSettings, PsoDataType.Structure, 728, 0, MetaName.camThirdPersonCameraMetadataStealthZoomSettings), + new PsoStructureEntryInfo((MetaName)1947299079, PsoDataType.Structure, 752, 0, MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring), + new PsoStructureEntryInfo(MetaName.MotionBlurSettings, PsoDataType.String, 776, 7, 0), + new PsoStructureEntryInfo((MetaName)2122226771, PsoDataType.Bool, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnEnvelopeRef, PsoDataType.String, 784, 7, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticule, PsoDataType.Bool, 788, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldDisplayReticuleDuringInterpolation, PsoDataType.Bool, 789, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldAllowInterpolationSourceCameraToPersistReticule, PsoDataType.Bool, 790, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldApplyWeaponFov, PsoDataType.Bool, 791, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAiming, PsoDataType.Bool, 792, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLockOnToTargetEntityPosition, PsoDataType.Bool, 793, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldValidateLockOnTargetPosition, PsoDataType.Bool, 794, 0, 0), + new PsoStructureEntryInfo(MetaName.TripleHeadNearClip, PsoDataType.Float, 796, 0, 0), + new PsoStructureEntryInfo(MetaName.RecoilShakeAmplitudeScaling, PsoDataType.Float, 800, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLockOn, PsoDataType.Float, 804, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForFineAimScaling, PsoDataType.Float, 808, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForFineAimScaling, PsoDataType.Float, 812, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleDeltaForLockOnSwitchBlendScaling, PsoDataType.Float, 816, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForInitialLockOn, PsoDataType.UInt, 820, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForInitialLockOn, PsoDataType.UInt, 824, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendDurationForLockOnSwitch, PsoDataType.UInt, 828, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBlendDurationForLockOnSwitch, PsoDataType.UInt, 832, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringConstant, PsoDataType.Float, 836, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimBlendSpringDampingRatio, PsoDataType.Float, 840, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringConstant, PsoDataType.Float, 844, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponZoomFactorSpringDampingRatio, PsoDataType.Float, 848, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldFocusOnLockOnTarget, PsoDataType.Bool, 852, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseFovToEmulateWithFocalLengthMultiplier, PsoDataType.Float, 856, 0, 0), + new PsoStructureEntryInfo(MetaName.FocusParentToTargetBlendLevel, PsoDataType.Float, 860, 0, 0), + new PsoStructureEntryInfo(MetaName.SecondaryFocusParentToTargetBlendLevel, PsoDataType.Float, 864, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFocusToSecondaryFocusDistance, PsoDataType.Float, 868, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAimingForDriver, PsoDataType.Bool, 880, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldUseLockOnAimingForPassenger, PsoDataType.Bool, 881, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraSideOffsetForHangingOnLeftSide, PsoDataType.Float, 884, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraSideOffsetForHangingOnRightSide, PsoDataType.Float, 888, 0, 0) + ); + case MetaName.camMarketingFreeCameraMetadata: + return new PsoStructureInfo(MetaName.camMarketingFreeCameraMetadata, 0, 0, 200, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0) + ); + case MetaName.camMarketingFreeCameraMetadataInputResponse: + return new PsoStructureInfo(MetaName.camMarketingFreeCameraMetadataInputResponse, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)3855676319, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Acceleration, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Deceleration, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.camMarketingAToBCameraMetadata: + return new PsoStructureInfo(MetaName.camMarketingAToBCameraMetadata, 0, 0, 216, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo((MetaName)1044888659, PsoDataType.String, 200, 7, 0), + new PsoStructureEntryInfo((MetaName)1147067733, PsoDataType.UInt, 204, 0, 0), + new PsoStructureEntryInfo((MetaName)1825469896, PsoDataType.UInt, 208, 0, 0) + ); + case MetaName.camTimedSplineCameraMetadata: + return new PsoStructureInfo(MetaName.camTimedSplineCameraMetadata, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3867080895, PsoDataType.SInt, 40, 0, 0) + ); + case MetaName.camMarketingOrbitCameraMetadata: + return new PsoStructureInfo(MetaName.camMarketingOrbitCameraMetadata, 0, 0, 208, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo((MetaName)2308368369, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringMountRef, PsoDataType.String, 204, 7, 0) + ); + case MetaName.camMarketingMountedCameraMetadata: + return new PsoStructureInfo(MetaName.camMarketingMountedCameraMetadata, 0, 0, 208, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo((MetaName)2308368369, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringMountRef, PsoDataType.String, 204, 7, 0) + ); + case MetaName.camMarketingStickyCameraMetadata: + return new PsoStructureInfo(MetaName.camMarketingStickyCameraMetadata, 0, 0, 200, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3808044930, PsoDataType.Structure, 32, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2925373184, PsoDataType.Structure, 64, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 96, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3295350072, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)1591024915, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)829837985, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camMarketingFreeCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3141690306, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)4157311158, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)1989308054, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 192, 0, 0) + ); + case MetaName.camScriptedCameraMetadata: + return new PsoStructureInfo(MetaName.camScriptedCameraMetadata, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camScriptedFlyCameraMetadata: + return new PsoStructureInfo(MetaName.camScriptedFlyCameraMetadata, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)1160500952, PsoDataType.Structure, 40, 0, MetaName.camScriptedFlyCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2802203540, PsoDataType.Structure, 64, 0, MetaName.camScriptedFlyCameraMetadataInputResponse), + new PsoStructureEntryInfo(MetaName.DefaultPitch, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)1176855075, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)2736468652, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.CapsuleRadius, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveWater, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)2779060394, PsoDataType.UInt, 112, 0, 0) + ); + case MetaName.camScriptedFlyCameraMetadataInputResponse: + return new PsoStructureInfo(MetaName.camScriptedFlyCameraMetadataInputResponse, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAcceleration, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDeceleration, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camCustomTimedSplineCameraMetadata: + return new PsoStructureInfo(MetaName.camCustomTimedSplineCameraMetadata, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3867080895, PsoDataType.SInt, 40, 0, 0) + ); + case MetaName.camRoundedSplineCameraMetadata: + return new PsoStructureInfo(MetaName.camRoundedSplineCameraMetadata, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camSmoothedSplineCameraMetadata: + return new PsoStructureInfo(MetaName.camSmoothedSplineCameraMetadata, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3867080895, PsoDataType.SInt, 40, 0, 0) + ); + case MetaName.camSwitchCameraMetadata: + return new PsoStructureInfo(MetaName.camSwitchCameraMetadata, 0, 0, 144, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1245276384, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo((MetaName)2105074563, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.Fov, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.NearClip, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MotionBlurStrength, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1056782751, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)341706306, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)1176855075, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)2303904065, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)978298090, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultPitch, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)1771807090, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)1215756626, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)1181521957, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)2559186523, PsoDataType.UInt, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)1045169360, PsoDataType.UInt, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)1298516568, PsoDataType.UInt, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)3976211620, PsoDataType.UInt, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)3193297650, PsoDataType.UInt, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)3466836211, PsoDataType.UInt, 132, 0, 0) + ); + case MetaName.camReplayRecordedCameraMetadata: + return new PsoStructureInfo(MetaName.camReplayRecordedCameraMetadata, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camReplayPresetCameraMetadata: + return new PsoStructureInfo(MetaName.camReplayPresetCameraMetadata, 0, 0, 256, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3243156997, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.RelativeLookAtPosition, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)3869518259, PsoDataType.Structure, 80, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 104, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 128, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo(MetaName.MinFov, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxFov, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo((MetaName)777402839, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)1557834870, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo((MetaName)1089474876, PsoDataType.Bool, 172, 0, 0), + new PsoStructureEntryInfo((MetaName)2480397790, PsoDataType.Bool, 173, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionSettings, PsoDataType.Structure, 176, 0, MetaName.camReplayBaseCameraMetadataCollisionSettings), + new PsoStructureEntryInfo((MetaName)549109147, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo((MetaName)3394194196, PsoDataType.UInt, 228, 0, 0), + new PsoStructureEntryInfo((MetaName)2704093958, PsoDataType.UInt, 232, 0, 0), + new PsoStructureEntryInfo((MetaName)1677933530, PsoDataType.UInt, 236, 0, 0), + new PsoStructureEntryInfo((MetaName)343964264, PsoDataType.UInt, 240, 0, 0), + new PsoStructureEntryInfo((MetaName)681964647, PsoDataType.UInt, 244, 0, 0), + new PsoStructureEntryInfo((MetaName)2782721869, PsoDataType.UInt, 248, 0, 0) + ); + case MetaName.camReplayBaseCameraMetadataInputResponse: + return new PsoStructureInfo(MetaName.camReplayBaseCameraMetadataInputResponse, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.InputMagPowerFactor, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAcceleration, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDeceleration, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camReplayBaseCameraMetadataCollisionSettings: + return new PsoStructureInfo(MetaName.camReplayBaseCameraMetadataCollisionSettings, 0, 0, 48, + new PsoStructureEntryInfo((MetaName)2162401385, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.WaterHeightSmoothRate, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSafeRadiusReductionWithinPedMoverCapsule, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)653804618, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3232040475, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)819688366, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)122123361, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)557881422, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldPushBeyondAttachParentIfClipping, PsoDataType.Bool, 40, 0, 0) + ); + case MetaName.camReplayFreeCameraMetadata: + return new PsoStructureInfo(MetaName.camReplayFreeCameraMetadata, 0, 0, 544, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.CollisionRef, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.DofSettings, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCollisionTestRadius, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.NearClip, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1160500952, PsoDataType.Structure, 48, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2802203540, PsoDataType.Structure, 72, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2292446130, PsoDataType.Structure, 96, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)31061142, PsoDataType.Structure, 120, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)3177251856, PsoDataType.Structure, 144, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)1176189471, PsoDataType.Structure, 168, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)4043692651, PsoDataType.Structure, 192, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)2391928883, PsoDataType.Structure, 216, 0, MetaName.camReplayBaseCameraMetadataInputResponse), + new PsoStructureEntryInfo((MetaName)1466164024, PsoDataType.Structure, 240, 0, MetaName.camInterpolatorMetadata), + new PsoStructureEntryInfo((MetaName)3699879509, PsoDataType.Structure, 280, 0, MetaName.camInterpolatorMetadata), + new PsoStructureEntryInfo((MetaName)2461431150, PsoDataType.Structure, 320, 0, MetaName.camInterpolatorMetadata), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFov, PsoDataType.Float, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxFov, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultFov, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.CapsuleRadius, PsoDataType.Float, 376, 0, 0), + new PsoStructureEntryInfo((MetaName)537337364, PsoDataType.Float, 380, 0, 0), + new PsoStructureEntryInfo((MetaName)870756038, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo((MetaName)1068739939, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo((MetaName)3629360459, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo((MetaName)479683481, PsoDataType.Float, 396, 0, 0), + new PsoStructureEntryInfo((MetaName)2077539523, PsoDataType.Float3, 400, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionSettings, PsoDataType.Structure, 416, 0, MetaName.camReplayBaseCameraMetadataCollisionSettings), + new PsoStructureEntryInfo((MetaName)4113213041, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo((MetaName)2101093733, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo((MetaName)2090863388, PsoDataType.Float, 472, 0, 0), + new PsoStructureEntryInfo((MetaName)109690208, PsoDataType.Float, 476, 0, 0), + new PsoStructureEntryInfo((MetaName)425553139, PsoDataType.Float, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)2285453310, PsoDataType.UInt, 484, 0, 0), + new PsoStructureEntryInfo((MetaName)3186336829, PsoDataType.Float, 488, 0, 0), + new PsoStructureEntryInfo((MetaName)858986389, PsoDataType.Float, 492, 0, 0), + new PsoStructureEntryInfo((MetaName)168114371, PsoDataType.Float, 496, 0, 0), + new PsoStructureEntryInfo((MetaName)2257617130, PsoDataType.Float, 500, 0, 0), + new PsoStructureEntryInfo((MetaName)4119877675, PsoDataType.Float, 504, 0, 0), + new PsoStructureEntryInfo((MetaName)2969211614, PsoDataType.UInt, 508, 0, 0), + new PsoStructureEntryInfo((MetaName)3394194196, PsoDataType.UInt, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)2704093958, PsoDataType.UInt, 516, 0, 0), + new PsoStructureEntryInfo((MetaName)1677933530, PsoDataType.UInt, 520, 0, 0), + new PsoStructureEntryInfo((MetaName)343964264, PsoDataType.UInt, 524, 0, 0), + new PsoStructureEntryInfo((MetaName)681964647, PsoDataType.UInt, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)2782721869, PsoDataType.UInt, 532, 0, 0), + new PsoStructureEntryInfo((MetaName)3026527735, PsoDataType.Float, 536, 0, 0), + new PsoStructureEntryInfo((MetaName)1272604977, PsoDataType.Float, 540, 0, 0) + ); + case MetaName.camShakeMetadata: + return new PsoStructureInfo(MetaName.camShakeMetadata, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)1260823161, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)1428204256, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3480173900, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camShakeMetadataFrameComponent), + new PsoStructureEntryInfo(MetaName.FrameComponents, PsoDataType.Array, 24, 0, (MetaName)4), + new PsoStructureEntryInfo(MetaName.Vibration, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.camShakeMetadataFrameComponent: + return new PsoStructureInfo(MetaName.camShakeMetadataFrameComponent, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, (MetaName)4206293824), + new PsoStructureEntryInfo((MetaName)3866719227, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.EnvelopeRef, PsoDataType.String, 16, 7, 0) + ); + case MetaName.camOscillatorMetadata: + return new PsoStructureInfo(MetaName.camOscillatorMetadata, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Waveform, PsoDataType.Enum, 16, 0, (MetaName)902027429), + new PsoStructureEntryInfo(MetaName.Amplitude, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.Frequency, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.phase, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2974245218, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.Decay, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.camAnimatedShakeMetadata: + return new PsoStructureInfo(MetaName.camAnimatedShakeMetadata, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)1260823161, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)1428204256, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3480173900, PsoDataType.Bool, 21, 0, 0) + ); + case MetaName.camCinematicCameraManShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicCameraManShotMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) + ); + case MetaName.camCinematicCraningCameraManShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicCraningCameraManShotMetadata, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)934463872, PsoDataType.Bool, 65, 0, 0), + new PsoStructureEntryInfo((MetaName)2227467637, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)943740099, PsoDataType.Bool, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1606540295, PsoDataType.UInt, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)3516181833, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)3249173046, PsoDataType.Float2, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)2987455099, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.ScanRadius, PsoDataType.Float, 96, 0, 0) + ); + case MetaName.camCinematicInVehicleCrashShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicInVehicleCrashShotMetadata, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRoll, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)3669617802, PsoDataType.UInt, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)3100384106, PsoDataType.UInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelocity, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)3730987855, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)4150416286, PsoDataType.UInt, 88, 0, 0) + ); + case MetaName.camCinematicVehiclePartShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehiclePartShotMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)233780411, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicHeliTrackingShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicHeliTrackingShotMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) + ); + case MetaName.camCinematicVehicleOrbitShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehicleOrbitShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicVehicleLowOrbitShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehicleLowOrbitShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicTrainRoofMountedShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicTrainRoofMountedShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicTrainStationShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicTrainStationShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicTrainPassengerShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicTrainPassengerShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicTrainTrackShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicTrainTrackShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicPoliceCarMountedShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicPoliceCarMountedShotMetadata, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.LimitAttachParentRelativePitchAndHeading, PsoDataType.Bool, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldTerminateForPitchAndHeading, PsoDataType.Bool, 65, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRelativePitch, PsoDataType.Float2, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachParentRelativeHeading, PsoDataType.Float2, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialRelativePitchLimits, PsoDataType.Float2, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialRelativeHeadingLimits, PsoDataType.Float2, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.InVehicleLookAtDampingRef, PsoDataType.String, 100, 7, 0), + new PsoStructureEntryInfo(MetaName.OnFootLookAtDampingRef, PsoDataType.String, 104, 7, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 108, 0, 0) + ); + case MetaName.camCinematicPoliceHeliMountedShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicPoliceHeliMountedShotMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) + ); + case MetaName.camCinematicPoliceInCoverShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicPoliceInCoverShotMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) + ); + case MetaName.camCinematicPoliceRoadBlockShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicPoliceRoadBlockShotMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)876494977, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.SpreadLimit, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 72, 0, 0) + ); + case MetaName.camCinematicPoliceExitVehicleShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicPoliceExitVehicleShotMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)4197822931, PsoDataType.Bool, 64, 0, 0) + ); + case MetaName.camCinematicOnFootIdleShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicOnFootIdleShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicOnFootFirstPersonIdleShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicOnFootFirstPersonIdleShotMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Cameras, PsoDataType.Array, 64, 0, (MetaName)14) + ); + case MetaName.camCinematicStuntJumpShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicStuntJumpShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicParachuteHeliShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicParachuteHeliShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicParachuteCameraManShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicParachuteCameraManShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicOnFootAssistedAimingKillShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicOnFootAssistedAimingKillShotMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1965493319, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)513375599, PsoDataType.Float, 68, 0, 0) + ); + case MetaName.camCinematicOnFootMeleeShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicOnFootMeleeShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicVehicleBonnetShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehicleBonnetShotMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1109718587, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)4170146926, PsoDataType.UInt, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2661334408, PsoDataType.String, 72, 7, 0) + ); + case MetaName.camCinematicBustedShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicBustedShotMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3180920449, PsoDataType.Float, 64, 0, 0) + ); + case MetaName.camCinematicVehicleGroupShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehicleGroupShotMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)189014933, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)3490628210, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)456924361, PsoDataType.UInt, 72, 0, 0) + ); + case MetaName.camCinematicMissileKillShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicMissileKillShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicWaterCrashShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicWaterCrashShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicFallFromHeliShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicFallFromHeliShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicVehicleConvertibleRoofShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicVehicleConvertibleRoofShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camCinematicScriptRaceCheckPointShotMetadata: + return new PsoStructureInfo(MetaName.camCinematicScriptRaceCheckPointShotMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)3727857604, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2997337835, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3529626013), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 32, 0, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)841129953, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1771050581, PsoDataType.Bool, 37, 0, 0), + new PsoStructureEntryInfo((MetaName)2973786865, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1480107235, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2460595867, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo((MetaName)3700663941, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2275630497, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60485337, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camLongSwoopSwitchHelperMetadata: + return new PsoStructureInfo(MetaName.camLongSwoopSwitchHelperMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), + new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), + new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), + new PsoStructureEntryInfo((MetaName)796068415, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)417423151, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)3958574934, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2939152164, PsoDataType.Enum, 52, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)2707662935, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)26423852, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)322264486, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)2868975511, PsoDataType.Enum, 68, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)3659327390, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)833330146, PsoDataType.Float, 76, 0, 0) + ); + case MetaName.camShortZoomToHeadSwitchHelperMetadata: + return new PsoStructureInfo(MetaName.camShortZoomToHeadSwitchHelperMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), + new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), + new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), + new PsoStructureEntryInfo((MetaName)864831122, PsoDataType.Bool, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3573176421, PsoDataType.SInt, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1837935839, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2395979106, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)4037747409, PsoDataType.Float, 68, 0, 0) + ); + case MetaName.camShortRotationSwitchHelperMetadata: + return new PsoStructureInfo(MetaName.camShortRotationSwitchHelperMetadata, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), + new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), + new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), + new PsoStructureEntryInfo((MetaName)2291716575, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.camShortTranslationSwitchHelperMetadata: + return new PsoStructureInfo(MetaName.camShortTranslationSwitchHelperMetadata, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), + new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), + new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), + new PsoStructureEntryInfo((MetaName)3634726737, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.camShortZoomInOutSwitchHelperMetadata: + return new PsoStructureInfo(MetaName.camShortZoomInOutSwitchHelperMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2578467489, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1608990953, PsoDataType.Enum, 24, 0, MetaName.eCurveType), + new PsoStructureEntryInfo((MetaName)2608832721, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2368120393, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3903914248, PsoDataType.Bool, 33, 0, 0), + new PsoStructureEntryInfo((MetaName)1595139928, PsoDataType.Bool, 34, 0, 0), + new PsoStructureEntryInfo((MetaName)1489449044, PsoDataType.Bool, 35, 0, 0), + new PsoStructureEntryInfo((MetaName)1190587282, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)547488153, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2504913741, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)26423852, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)4037747409, PsoDataType.Float, 56, 0, 0) + ); + case MetaName.camNearClipScannerMetadata: + return new PsoStructureInfo(MetaName.camNearClipScannerMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)494178060, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1713774083, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3006651453, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1502537267, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3831489261, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)1103532228, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)639510975, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1947972687, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1176855075, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)529344496, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)1434632498, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3130208423, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)1525295652, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)304640727, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2477079271, PsoDataType.Float, 72, 0, 0) + ); + case MetaName.camVehicleCustomSettingsMetadata: + return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadata, 0, 0, 192, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DoorAlignmentSettings, PsoDataType.Structure, 16, 0, MetaName.camVehicleCustomSettingsMetadataDoorAlignmentSettings), + new PsoStructureEntryInfo((MetaName)2728784918, PsoDataType.Structure, 56, 0, MetaName.camVehicleCustomSettingsMetadataExitSeatPhaseForCameraExitSettings), + new PsoStructureEntryInfo((MetaName)556143364, PsoDataType.Structure, 72, 0, MetaName.camVehicleCustomSettingsMetadataMultiplayerPassengerCameraHashSettings), + new PsoStructureEntryInfo((MetaName)981761687, PsoDataType.Structure, 104, 0, MetaName.camVehicleCustomSettingsMetadataInvalidCinematcShotsRefsForVehicleSettings), + new PsoStructureEntryInfo((MetaName)955775077, PsoDataType.Structure, 136, 0, MetaName.camVehicleCustomSettingsMetadataAdditionalBoundScalingVehicleSettings), + new PsoStructureEntryInfo((MetaName)3842334374, PsoDataType.Structure, 152, 0, MetaName.camVehicleCustomSettingsMetadataSeatSpecficCameras), + new PsoStructureEntryInfo((MetaName)3299186532, PsoDataType.Bool, 184, 0, 0) + ); + case MetaName.camVehicleCustomSettingsMetadataExitSeatPhaseForCameraExitSettings: + return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataExitSeatPhaseForCameraExitSettings, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)2549072274, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camVehicleCustomSettingsMetadataMultiplayerPassengerCameraHashSettings: + return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataMultiplayerPassengerCameraHashSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)109781807, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)2400069518, PsoDataType.Array, 16, 0, (MetaName)2) + ); + case MetaName.camVehicleCustomSettingsMetadataInvalidCinematcShotsRefsForVehicleSettings: + return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataInvalidCinematcShotsRefsForVehicleSettings, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)3579087558, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case MetaName.camVehicleCustomSettingsMetadataAdditionalBoundScalingVehicleSettings: + return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataAdditionalBoundScalingVehicleSettings, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.HeightScaling, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camVehicleCustomSettingsMetadataSeatSpecficCameras: + return new PsoStructureInfo(MetaName.camVehicleCustomSettingsMetadataSeatSpecficCameras, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ShouldConsiderData, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camSeatSpecificCameras), + new PsoStructureEntryInfo((MetaName)1517635298, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case MetaName.camSeatSpecificCameras: + return new PsoStructureInfo(MetaName.camSeatSpecificCameras, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.SeatIndex, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)1261448360, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.PovCameraOffset, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2254474492, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)273799675, PsoDataType.Bool, 36, 0, 0) + ); + case MetaName.camGameplayDirectorMetadata: + return new PsoStructureInfo(MetaName.camGameplayDirectorMetadata, 0, 0, 608, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2089690180, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo((MetaName)519684035, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo((MetaName)4121580243, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo((MetaName)3253949128, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo((MetaName)3345137885, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo((MetaName)2365172496, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.ThirdPersonVehicleAimCameraRef, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo((MetaName)3734793071, PsoDataType.String, 52, 7, 0), + new PsoStructureEntryInfo((MetaName)2936418982, PsoDataType.String, 56, 7, 0), + new PsoStructureEntryInfo((MetaName)595399339, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo((MetaName)4266955763, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo((MetaName)1070442381, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo((MetaName)838085564, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo((MetaName)1252415609, PsoDataType.String, 76, 7, 0), + new PsoStructureEntryInfo((MetaName)2466448846, PsoDataType.String, 80, 7, 0), + new PsoStructureEntryInfo((MetaName)3845919335, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo((MetaName)3326977311, PsoDataType.String, 88, 7, 0), + new PsoStructureEntryInfo((MetaName)374047020, PsoDataType.String, 92, 7, 0), + new PsoStructureEntryInfo((MetaName)859347369, PsoDataType.String, 96, 7, 0), + new PsoStructureEntryInfo((MetaName)1384877759, PsoDataType.String, 100, 7, 0), + new PsoStructureEntryInfo((MetaName)399013837, PsoDataType.String, 104, 7, 0), + new PsoStructureEntryInfo((MetaName)3929905827, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo((MetaName)2078537289, PsoDataType.String, 112, 7, 0), + new PsoStructureEntryInfo((MetaName)2211994659, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo((MetaName)1839344859, PsoDataType.String, 120, 7, 0), + new PsoStructureEntryInfo((MetaName)1168367025, PsoDataType.String, 124, 7, 0), + new PsoStructureEntryInfo((MetaName)3316487821, PsoDataType.String, 128, 7, 0), + new PsoStructureEntryInfo((MetaName)2772847581, PsoDataType.String, 132, 7, 0), + new PsoStructureEntryInfo((MetaName)766173022, PsoDataType.String, 136, 7, 0), + new PsoStructureEntryInfo((MetaName)2535543863, PsoDataType.String, 140, 7, 0), + new PsoStructureEntryInfo((MetaName)160927927, PsoDataType.String, 144, 7, 0), + new PsoStructureEntryInfo((MetaName)478304411, PsoDataType.String, 148, 7, 0), + new PsoStructureEntryInfo((MetaName)2995820414, PsoDataType.String, 152, 7, 0), + new PsoStructureEntryInfo((MetaName)2615323901, PsoDataType.String, 156, 7, 0), + new PsoStructureEntryInfo((MetaName)773221014, PsoDataType.UInt, 160, 0, 0), + new PsoStructureEntryInfo((MetaName)1041806552, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)2032331076, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo((MetaName)1446696509, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo((MetaName)3986662918, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)508043832, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)2976021060, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo((MetaName)3396642792, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo((MetaName)3225930628, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo((MetaName)1352017718, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo((MetaName)73333937, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo((MetaName)1414986019, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo((MetaName)3574987574, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo((MetaName)992242800, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo((MetaName)2148272557, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo((MetaName)1884609047, PsoDataType.UInt, 220, 0, 0), + new PsoStructureEntryInfo((MetaName)839256524, PsoDataType.Float2, 224, 0, 0), + new PsoStructureEntryInfo((MetaName)3914143003, PsoDataType.Float2, 232, 0, 0), + new PsoStructureEntryInfo((MetaName)1935117365, PsoDataType.Float2, 240, 0, 0), + new PsoStructureEntryInfo((MetaName)3465208228, PsoDataType.Float2, 248, 0, 0), + new PsoStructureEntryInfo((MetaName)2745575061, PsoDataType.UInt, 256, 0, 0), + new PsoStructureEntryInfo((MetaName)19236851, PsoDataType.UInt, 260, 0, 0), + new PsoStructureEntryInfo((MetaName)3381171437, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo((MetaName)4274113098, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo((MetaName)3364491568, PsoDataType.UInt, 272, 0, 0), + new PsoStructureEntryInfo((MetaName)565980479, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo((MetaName)467608921, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo((MetaName)3180328046, PsoDataType.UInt, 284, 0, 0), + new PsoStructureEntryInfo((MetaName)924888517, PsoDataType.UInt, 288, 0, 0), + new PsoStructureEntryInfo((MetaName)1870040536, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camGameplayDirectorMetadataVehicleCustomSettings), + new PsoStructureEntryInfo(MetaName.VehicleCustomSettingsList, PsoDataType.Array, 296, 0, (MetaName)66), + new PsoStructureEntryInfo((MetaName)3559905910, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo((MetaName)259392755, PsoDataType.Float, 316, 0, 0), + new PsoStructureEntryInfo((MetaName)1523938219, PsoDataType.Float, 320, 0, 0), + new PsoStructureEntryInfo((MetaName)3704241863, PsoDataType.UInt, 324, 0, 0), + new PsoStructureEntryInfo((MetaName)2185907197, PsoDataType.UInt, 328, 0, 0), + new PsoStructureEntryInfo((MetaName)2766631017, PsoDataType.UInt, 332, 0, 0), + new PsoStructureEntryInfo((MetaName)4088657953, PsoDataType.UInt, 336, 0, 0), + new PsoStructureEntryInfo((MetaName)2940797056, PsoDataType.UInt, 340, 0, 0), + new PsoStructureEntryInfo((MetaName)926072750, PsoDataType.UInt, 344, 0, 0), + new PsoStructureEntryInfo((MetaName)4071374960, PsoDataType.UInt, 348, 0, 0), + new PsoStructureEntryInfo((MetaName)4097214758, PsoDataType.UInt, 352, 0, 0), + new PsoStructureEntryInfo((MetaName)4182146981, PsoDataType.UInt, 356, 0, 0), + new PsoStructureEntryInfo((MetaName)3961367630, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo((MetaName)1597015313, PsoDataType.Float, 364, 0, 0), + new PsoStructureEntryInfo((MetaName)2284520874, PsoDataType.Bool, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)4217422073, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo((MetaName)636518286, PsoDataType.String, 376, 7, 0), + new PsoStructureEntryInfo((MetaName)984379181, PsoDataType.UInt, 380, 0, 0), + new PsoStructureEntryInfo((MetaName)2430934664, PsoDataType.UInt, 384, 0, 0), + new PsoStructureEntryInfo((MetaName)1190562413, PsoDataType.Float2, 388, 0, 0), + new PsoStructureEntryInfo((MetaName)3193796044, PsoDataType.Float2, 396, 0, 0), + new PsoStructureEntryInfo((MetaName)3497158180, PsoDataType.Float2, 404, 0, 0), + new PsoStructureEntryInfo((MetaName)202581691, PsoDataType.Float2, 412, 0, 0), + new PsoStructureEntryInfo((MetaName)1600149759, PsoDataType.Float2, 420, 0, 0), + new PsoStructureEntryInfo((MetaName)310864401, PsoDataType.Float2, 428, 0, 0), + new PsoStructureEntryInfo((MetaName)910310359, PsoDataType.Float, 436, 0, 0), + new PsoStructureEntryInfo((MetaName)1518272577, PsoDataType.Float, 440, 0, 0), + new PsoStructureEntryInfo((MetaName)2881277133, PsoDataType.Float, 444, 0, 0), + new PsoStructureEntryInfo((MetaName)1283045856, PsoDataType.Float, 448, 0, 0), + new PsoStructureEntryInfo((MetaName)1013584657, PsoDataType.UInt, 452, 0, 0), + new PsoStructureEntryInfo((MetaName)1494877942, PsoDataType.UInt, 456, 0, 0), + new PsoStructureEntryInfo((MetaName)3664775821, PsoDataType.String, 460, 7, 0), + new PsoStructureEntryInfo((MetaName)1867117468, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo((MetaName)425967458, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo((MetaName)2079587041, PsoDataType.Float, 472, 0, 0), + new PsoStructureEntryInfo((MetaName)3495981266, PsoDataType.Float, 476, 0, 0), + new PsoStructureEntryInfo((MetaName)3273630905, PsoDataType.Float, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)3860060233, PsoDataType.Float, 484, 0, 0), + new PsoStructureEntryInfo((MetaName)2204296545, PsoDataType.Float, 488, 0, 0), + new PsoStructureEntryInfo((MetaName)111546466, PsoDataType.Float, 492, 0, 0), + new PsoStructureEntryInfo((MetaName)2322128139, PsoDataType.Float, 496, 0, 0), + new PsoStructureEntryInfo((MetaName)642537232, PsoDataType.Float, 500, 0, 0), + new PsoStructureEntryInfo((MetaName)2040447490, PsoDataType.Float, 504, 0, 0), + new PsoStructureEntryInfo((MetaName)928667502, PsoDataType.Float, 508, 0, 0), + new PsoStructureEntryInfo((MetaName)3216527316, PsoDataType.UInt, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)3465879577, PsoDataType.UInt, 516, 0, 0), + new PsoStructureEntryInfo((MetaName)3390712027, PsoDataType.UInt, 520, 0, 0), + new PsoStructureEntryInfo((MetaName)2683111365, PsoDataType.UInt, 524, 0, 0), + new PsoStructureEntryInfo((MetaName)3170020756, PsoDataType.UInt, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)4287333189, PsoDataType.UInt, 532, 0, 0), + new PsoStructureEntryInfo((MetaName)115056986, PsoDataType.UInt, 536, 0, 0), + new PsoStructureEntryInfo((MetaName)1843179030, PsoDataType.UInt, 540, 0, 0), + new PsoStructureEntryInfo((MetaName)3134298162, PsoDataType.String, 544, 7, 0), + new PsoStructureEntryInfo((MetaName)1564626128, PsoDataType.String, 548, 7, 0), + new PsoStructureEntryInfo((MetaName)834090440, PsoDataType.Structure, 552, 0, MetaName.camGameplayDirectorMetadataExplosionShakeSettings) + ); + case MetaName.camGameplayDirectorMetadataExplosionShakeSettings: + return new PsoStructureInfo(MetaName.camGameplayDirectorMetadataExplosionShakeSettings, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DistanceLimits, PsoDataType.Float2, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxInstances, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.RumbleDuration, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3070197011, PsoDataType.UInt, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2337695573, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)815713089, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1985122943, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3938350897, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)951241725, PsoDataType.Float, 48, 0, 0) + ); + case MetaName.camGameplayDirectorMetadataVehicleCustomSettings: + return new PsoStructureInfo(MetaName.camGameplayDirectorMetadataVehicleCustomSettings, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SettingsRef, PsoDataType.String, 12, 7, 0) + ); + case MetaName.camCinematicDirectorMetadata: + return new PsoStructureInfo(MetaName.camCinematicDirectorMetadata, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)164388064, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1567199172, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)4027640984, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)730699960, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)4198475225, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo((MetaName)3640482549, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2985235183, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)200602575, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)2683111365, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1677201089, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo((MetaName)2101508607, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo((MetaName)1867117468, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)425967458, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)2079587041, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.CinematicContexts, PsoDataType.Array, 80, 0, (MetaName)MetaTypeName.STRING), + new PsoStructureEntryInfo((MetaName)28440621, PsoDataType.UInt, 96, 0, 0) + ); + case MetaName.camCinematicInVehicleMultiplayerPassengerContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicInVehicleMultiplayerPassengerContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicShots: + return new PsoStructureInfo(MetaName.camCinematicShots, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Shot, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Priority, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ProbabilityWeighting, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.camCinematicSpectatorNewsChannelContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicSpectatorNewsChannelContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicScriptedMissionCreatorFailContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicScriptedMissionCreatorFailContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicScriptContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicScriptContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicScriptedRaceCheckPointContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicScriptedRaceCheckPointContextMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1650416254, PsoDataType.UInt, 72, 0, 0) + ); + case MetaName.camCinematicBustedContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicBustedContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicFallFromHeliContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicFallFromHeliContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicInVehicleOverriddenFirstPersonContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicInVehicleOverriddenFirstPersonContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicInVehicleWantedContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicInVehicleWantedContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camPreferredShotSelectionType: + return new PsoStructureInfo(MetaName.camPreferredShotSelectionType, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Shot, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.InputType, PsoDataType.Enum, 12, 0, (MetaName)3889593720) + ); + case MetaName.camCinematicInVehicleContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicInVehicleContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicInTrainAtStationContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicInTrainAtStationContextMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)2216049071, PsoDataType.UInt, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)3119408512, PsoDataType.UInt, 76, 0, 0) + ); + case MetaName.camCinematicInTrainContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicInTrainContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicOnFootSpectatingContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicOnFootSpectatingContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicParachuteContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicParachuteContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicStuntJumpContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicStuntJumpContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicOnFootAssistedAimingContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicOnFootAssistedAimingContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicOnFootMeleeContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicOnFootMeleeContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicInVehicleFirstPersonContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicInVehicleFirstPersonContextMetadata, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0) + ); + case MetaName.camCinematicOnFootIdleContextMetadata: + return new PsoStructureInfo(MetaName.camCinematicOnFootIdleContextMetadata, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camCinematicShots), + new PsoStructureEntryInfo(MetaName.Shots, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camPreferredShotSelectionType), + new PsoStructureEntryInfo((MetaName)2569180342, PsoDataType.Array, 32, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)2437129562, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4114376857, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo((MetaName)2434943359, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo((MetaName)2838462683, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo((MetaName)2639584784, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3699223405, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo((MetaName)3274921789, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3966397175, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2910409886, PsoDataType.UInt, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1879525600, PsoDataType.UInt, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1202637816, PsoDataType.Float, 76, 0, 0) + ); + case MetaName.camSyncedSceneDirectorMetadata: + return new PsoStructureInfo(MetaName.camSyncedSceneDirectorMetadata, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2406434970, PsoDataType.String, 24, 7, 0) + ); + case MetaName.camScriptDirectorMetadata: + return new PsoStructureInfo(MetaName.camScriptDirectorMetadata, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3308601968, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo((MetaName)1044888659, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo((MetaName)609660376, PsoDataType.UInt, 32, 0, 0) + ); + case MetaName.camSwitchDirectorMetadata: + return new PsoStructureInfo(MetaName.camSwitchDirectorMetadata, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)4284026199, PsoDataType.String, 24, 7, 0) + ); + case MetaName.camCutsceneDirectorMetadata: + return new PsoStructureInfo(MetaName.camCutsceneDirectorMetadata, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1814055656, PsoDataType.String, 24, 7, 0) + ); + case MetaName.camReplayDirectorMetadata: + return new PsoStructureInfo(MetaName.camReplayDirectorMetadata, 0, 0, 160, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2721634605, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo((MetaName)2132680058, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo((MetaName)491767013, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo((MetaName)2648380967, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo((MetaName)4072288030, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo((MetaName)664486210, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo((MetaName)3903471436, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo((MetaName)3789126205, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)2319741638, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1596110048, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)1238798750, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1362065867, PsoDataType.String, 80, 7, 0), + new PsoStructureEntryInfo((MetaName)2640324566, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)3068943162, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)81027141, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)4246618820, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)1674718375, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)227690771, PsoDataType.String, 104, 7, 0), + new PsoStructureEntryInfo((MetaName)1982856886, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo((MetaName)881665360, PsoDataType.String, 112, 7, 0), + new PsoStructureEntryInfo((MetaName)2599823537, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo((MetaName)3206570060, PsoDataType.String, 120, 7, 0), + new PsoStructureEntryInfo((MetaName)1690145332, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)4171384554, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)3385138470, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)950635108, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)925408249, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo((MetaName)3918000719, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo((MetaName)1379084243, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo((MetaName)2245689292, PsoDataType.Float, 152, 0, 0) + ); + case MetaName.camDebugDirectorMetadata: + return new PsoStructureInfo(MetaName.camDebugDirectorMetadata, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2750009688, PsoDataType.String, 24, 7, 0) + ); + case MetaName.camMarketingDirectorMetadata: + return new PsoStructureInfo(MetaName.camMarketingDirectorMetadata, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.camMarketingDirectorMetadataMode), + new PsoStructureEntryInfo(MetaName.Modes, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case MetaName.camMarketingDirectorMetadataMode: + return new PsoStructureInfo(MetaName.camMarketingDirectorMetadataMode, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.CameraRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TextLabel, PsoDataType.String, 12, 0, (MetaName)1048576) + ); + case MetaName.CExplosionInfoManager: + return new PsoStructureInfo(MetaName.CExplosionInfoManager, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2541591167), + new PsoStructureEntryInfo(MetaName.aExplosionTagData, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)2541591167: + return new PsoStructureInfo((MetaName)2541591167, 0, 0, 136, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 3, 0), + new PsoStructureEntryInfo(MetaName.damageAtCentre, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.damageAtEdge, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.networkPlayerModifier, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.networkPedModifier, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.endRadius, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.initSpeed, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.decayFactor, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.forceFactor, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.fRagdollForceModifier, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.fSelfForceModifier, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.directedWidth, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.directedLifeTime, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.camShakeName, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo(MetaName.camShake, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.camShakeRollOffScaling, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.shockingEventVisualRangeOverride, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.shockingEventAudioRangeOverride, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.minorExplosion, PsoDataType.Bool, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.vfxTagHashName, PsoDataType.String, 96, 7, 0), + new PsoStructureEntryInfo(MetaName.fragDamage, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.bAppliesContinuousDamage, PsoDataType.Bool, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.bPostProcessCollisionsWithNoForce, PsoDataType.Bool, 105, 0, 0), + new PsoStructureEntryInfo(MetaName.bDamageVehicles, PsoDataType.Bool, 106, 0, 0), + new PsoStructureEntryInfo(MetaName.bDamageObjects, PsoDataType.Bool, 107, 0, 0), + new PsoStructureEntryInfo(MetaName.bOnlyAffectsLivePeds, PsoDataType.Bool, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.bIgnoreExplodingEntity, PsoDataType.Bool, 109, 0, 0), + new PsoStructureEntryInfo(MetaName.bNoOcclusion, PsoDataType.Bool, 110, 0, 0), + new PsoStructureEntryInfo(MetaName.explodeAttachEntityWhenFinished, PsoDataType.Bool, 111, 0, 0), + new PsoStructureEntryInfo(MetaName.bCanSetPedOnFire, PsoDataType.Bool, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.bCanSetPlayerOnFire, PsoDataType.Bool, 113, 0, 0), + new PsoStructureEntryInfo(MetaName.bSuppressCrime, PsoDataType.Bool, 114, 0, 0), + new PsoStructureEntryInfo(MetaName.bUseDistanceDamageCalc, PsoDataType.Bool, 115, 0, 0), + new PsoStructureEntryInfo(MetaName.bPreventWaterExplosionVFX, PsoDataType.Bool, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.bIgnoreRatioCheckForFire, PsoDataType.Bool, 117, 0, 0), + new PsoStructureEntryInfo(MetaName.bAllowUnderwaterExplosion, PsoDataType.Bool, 118, 0, 0), + new PsoStructureEntryInfo(MetaName.bForceVehicleExplosion, PsoDataType.Bool, 119, 0, 0), + new PsoStructureEntryInfo(MetaName.midRadius, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.damageAtMid, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.bApplyVehicleEMP, PsoDataType.Bool, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.bApplyVehicleSlick, PsoDataType.Bool, 129, 0, 0), + new PsoStructureEntryInfo(MetaName.bApplyVehicleSlowdown, PsoDataType.Bool, 130, 0, 0), + new PsoStructureEntryInfo(MetaName.bApplyVehicleTyrePop, PsoDataType.Bool, 131, 0, 0), + new PsoStructureEntryInfo(MetaName.bForcePetrolTankDamage, PsoDataType.Bool, 132, 0, 0) + ); + case MetaName.CPedModelInfo__PersonalityDataList: + return new PsoStructureInfo(MetaName.CPedModelInfo__PersonalityDataList, 0, 0, 88, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1111461724), + new PsoStructureEntryInfo(MetaName.MovementModeUnholsterData, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)29118966), + new PsoStructureEntryInfo(MetaName.MovementModes, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4185391031), + new PsoStructureEntryInfo(MetaName.PedPersonalities, PsoDataType.Array, 40, 0, (MetaName)4), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)905918498), + new PsoStructureEntryInfo(MetaName.BraveryTypes, PsoDataType.Array, 56, 0, (MetaName)6), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2072330808), + new PsoStructureEntryInfo(MetaName.CriminalityTypes, PsoDataType.Array, 72, 0, (MetaName)8) + ); + case (MetaName)1111461724: + return new PsoStructureInfo((MetaName)1111461724, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2934735155), + new PsoStructureEntryInfo(MetaName.UnholsterClips, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case (MetaName)2934735155: + return new PsoStructureInfo((MetaName)2934735155, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Weapons, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Clip, PsoDataType.String, 24, 7, 0) + ); + case (MetaName)29118966: + return new PsoStructureInfo((MetaName)29118966, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1727236615), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Array, 0, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.MovementModes, PsoDataType.Array, 16, 4, (MetaName)131074), + new PsoStructureEntryInfo(MetaName.LastBattleEventHighEnergyStartTime, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.LastBattleEventHighEnergyEndTime, PsoDataType.Float, 52, 0, 0) + ); + case (MetaName)1727236615: + return new PsoStructureInfo((MetaName)1727236615, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Weapons, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3455138791), + new PsoStructureEntryInfo(MetaName.ClipSets, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case (MetaName)3455138791: + return new PsoStructureInfo((MetaName)3455138791, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.MovementClipSetId, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.WeaponClipSetId, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.WeaponClipFilterId, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.UpperBodyShadowExpressionEnabled, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.UpperBodyFeatheredLeanEnabled, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo(MetaName.UseWeaponAnimsForGrip, PsoDataType.Bool, 22, 0, 0), + new PsoStructureEntryInfo(MetaName.UseLeftHandIk, PsoDataType.Bool, 23, 0, 0), + new PsoStructureEntryInfo(MetaName.IdleTransitionBlendOutTime, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.IdleTransitions, PsoDataType.Array, 32, 0, (MetaName)8), + new PsoStructureEntryInfo(MetaName.UnholsterClipSetId, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.UnholsterClipData, PsoDataType.String, 52, 7, 0) + ); + case (MetaName)4185391031: + return new PsoStructureInfo((MetaName)4185391031, 0, 0, 184, + new PsoStructureEntryInfo(MetaName.PersonalityName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultWeaponLoadout, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.Bravery, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.AgitatedPersonality, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.Criminality, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.AgitationTriggers, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo(MetaName.HealthConfigHash, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.WeaponAnimations, PsoDataType.Array, 40, 0, (MetaName)MetaTypeName.POINTER), + new PsoStructureEntryInfo(MetaName.AmbientAudio, PsoDataType.String, 56, 7, 0), + new PsoStructureEntryInfo(MetaName.WitnessPersonality, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo(MetaName.Agility, PsoDataType.Structure, 64, 0, (MetaName)265080325), + new PsoStructureEntryInfo(MetaName.IsMale, PsoDataType.Bool, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.IsHuman, PsoDataType.Bool, 81, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldRewardMoneyOnDeath, PsoDataType.Bool, 82, 0, 0), + new PsoStructureEntryInfo(MetaName.IsGang, PsoDataType.Bool, 83, 0, 0), + new PsoStructureEntryInfo(MetaName.IsSecurity, PsoDataType.Bool, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.IsWeird, PsoDataType.Bool, 85, 0, 0), + new PsoStructureEntryInfo(MetaName.IsDangerousAnimal, PsoDataType.Bool, 86, 0, 0), + new PsoStructureEntryInfo(MetaName.CausesRumbleWhenCollidesWithPlayer, PsoDataType.Bool, 87, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowSlowCruisingWithMusic, PsoDataType.Bool, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowRoadCrossHurryOnLightChange, PsoDataType.Bool, 89, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2920442291), + new PsoStructureEntryInfo(MetaName.VehicleTypes, PsoDataType.Flags, 92, 0, (MetaName)524310), + new PsoStructureEntryInfo(MetaName.AttackStrengthMin, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.AttackStrengthMax, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.StaminaEfficiency, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.ArmourEfficiency, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.HealthRegenEfficiency, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.ExplosiveDamageMod, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.HandGunDamageMod, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.RifleDamageMod, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.SmgDamageMod, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.PopulationFleeMod, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.HotwireRate, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MotivationMin, PsoDataType.UInt, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.MotivationMax, PsoDataType.UInt, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.DrivingAbilityMin, PsoDataType.UByte, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.DrivingAbilityMax, PsoDataType.UByte, 149, 0, 0), + new PsoStructureEntryInfo(MetaName.DrivingAggressivenessMin, PsoDataType.UByte, 150, 0, 0), + new PsoStructureEntryInfo(MetaName.DrivingAggressivenessMax, PsoDataType.UByte, 151, 0, 0), + new PsoStructureEntryInfo(MetaName.Affluence, PsoDataType.Enum, 152, 0, MetaName.Affluence), + new PsoStructureEntryInfo(MetaName.TechSavvy, PsoDataType.Enum, 156, 0, MetaName.TechSavvy), + new PsoStructureEntryInfo(MetaName.MovementModes, PsoDataType.String, 160, 7, 0), + new PsoStructureEntryInfo(MetaName.WeaponAnimsFPSIdle, PsoDataType.String, 164, 7, 0), + new PsoStructureEntryInfo(MetaName.WeaponAnimsFPSRNG, PsoDataType.String, 168, 7, 0), + new PsoStructureEntryInfo(MetaName.WeaponAnimsFPSLT, PsoDataType.String, 172, 7, 0), + new PsoStructureEntryInfo(MetaName.WeaponAnimsFPSScope, PsoDataType.String, 176, 7, 0) + ); + case (MetaName)265080325: + return new PsoStructureInfo((MetaName)265080325, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2675594832), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 8, 0, (MetaName)2097152), + new PsoStructureEntryInfo(MetaName.MovementCostModifier, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)905918498: + return new PsoStructureInfo((MetaName)905918498, 0, 0, 256, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3079935216), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 12, 0, (MetaName)2097153), + new PsoStructureEntryInfo(MetaName.TakedownProbability, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ThreatResponseUnarmed, PsoDataType.Structure, 24, 0, (MetaName)3637970520), + new PsoStructureEntryInfo(MetaName.ThreatResponseMelee, PsoDataType.Structure, 96, 0, (MetaName)3637970520), + new PsoStructureEntryInfo(MetaName.ThreatResponseArmed, PsoDataType.Structure, 168, 0, (MetaName)3637970520), + new PsoStructureEntryInfo(MetaName.FleeDuringCombat, PsoDataType.Structure, 240, 0, (MetaName)651017172) + ); + case (MetaName)3637970520: + return new PsoStructureInfo((MetaName)3637970520, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Action, PsoDataType.Structure, 8, 0, (MetaName)3450423538), + new PsoStructureEntryInfo(MetaName.Fight, PsoDataType.Structure, 32, 0, (MetaName)301719986) + ); + case (MetaName)3450423538: + return new PsoStructureInfo((MetaName)3450423538, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Weights, PsoDataType.Structure, 8, 0, (MetaName)3954379444) + ); + case (MetaName)3954379444: + return new PsoStructureInfo((MetaName)3954379444, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Fight, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Flee, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)301719986: + return new PsoStructureInfo((MetaName)301719986, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Weights, PsoDataType.Structure, 8, 0, (MetaName)272028034), + new PsoStructureEntryInfo(MetaName.ProbabilityDrawWeaponWhenLosing, PsoDataType.Float, 32, 0, 0) + ); + case (MetaName)272028034: + return new PsoStructureInfo((MetaName)272028034, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.KeepWeapon, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MatchTargetWeapon, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.EquipBestWeapon, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)651017172: + return new PsoStructureInfo((MetaName)651017172, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesWhenBuddyKilledWithScaryWeapon, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)2072330808: + return new PsoStructureInfo((MetaName)2072330808, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1639628591), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 12, 0, (MetaName)2097153) + ); + case MetaName.sStatsMetadataTuning: + return new PsoStructureInfo(MetaName.sStatsMetadataTuning, 0, 0, 72, + new PsoStructureEntryInfo((MetaName)1063717096, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.AwardVehicleJumpTime, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.AwardParachuteJumpTime, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SPLargeAccidenThresold, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MPLargeAccidenThresold, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.FreefallThresold, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.AwardVehicleJumpDistanceA, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AwardVehicleJumpDistanceB, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AwardParachuteJumpDistanceA, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AwardParachuteJumpDistanceB, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.nonFlyableAreas, PsoDataType.Structure, 48, 0, MetaName.NonFlyableAreaArray) + ); + case MetaName.CFiringPatternInfoManager: + return new PsoStructureInfo(MetaName.CFiringPatternInfoManager, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.Infos, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.CFiringPatternInfo: + return new PsoStructureInfo(MetaName.CFiringPatternInfo, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.NumberOfBurstsMin, PsoDataType.SShort, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.NumberOfBurstsMax, PsoDataType.SShort, 14, 0, 0), + new PsoStructureEntryInfo(MetaName.NumberOfShotsPerBurstMin, PsoDataType.SShort, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.NumberOfShotsPerBurstMax, PsoDataType.SShort, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenShotsMin, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenShotsMax, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenShotsAbsoluteMin, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenBurstsMin, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenBurstsMax, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenBurstsAbsoluteMin, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBeforeFiringMin, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBeforeFiringMax, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2922044807, PsoDataType.Bool, 52, 0, 0) + ); + case MetaName.CTuningFile: + return new PsoStructureInfo(MetaName.CTuningFile, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.Tunables, PsoDataType.Array, 0, 0, 0) + ); + case MetaName.CCombatTaskManager__Tunables: + return new PsoStructureInfo(MetaName.CCombatTaskManager__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenUpdates, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.iMaxPedsInCombatTask, PsoDataType.SInt, 20, 0, 0) + ); + case MetaName.CTaskAnimatedHitByExplosion__Tunables: + return new PsoStructureInfo(MetaName.CTaskAnimatedHitByExplosion__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.InitialRagdollDelay, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowPitchAndRoll, PsoDataType.Bool, 20, 0, 0) + ); + case MetaName.CTaskStandGuard__Tunables: + return new PsoStructureInfo(MetaName.CTaskStandGuard__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinStandWaitTimeMS, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStandWaitTimeMS, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDefendPointWaitTimeMS, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDefendPointWaitTimeMS, PsoDataType.SInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinNavmeshPatrolRadiusFactor, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxNavmeshPatrolRadiusFactor, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.RouteRadiusFactor, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CTaskCombatAdditionalTask__Tunables: + return new PsoStructureInfo(MetaName.CTaskCombatAdditionalTask__Tunables, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.iBulletEventResponseLengthMs, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fChanceOfDynamicRun, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxDynamicStrafeDistance, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeInState, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fMoveBlendRatioLerpTime, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceToClearCorner, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxDistanceFromCorner, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxLeavingCornerDistance, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fBlockedLosAimTime, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fStartAimingDistance, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.fStopAimingDistance, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinOtherPedDistanceDiff, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeBetweenRunDirectlyChecks, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxTimeStrafing, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeRunning, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.fForceStrafeDistance, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)2878670581, PsoDataType.Float, 80, 0, 0) + ); + case MetaName.CTaskCombatFlank__Tunables: + return new PsoStructureInfo(MetaName.CTaskCombatFlank__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fInfluenceSphereInnerWeight, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fInfluenceSphereOuterWeight, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fInfluenceSphereRequestRadius, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fInfluenceSphereCheckRouteRadius, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fSmallInfluenceSphereRadius, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fDistanceBetweenInfluenceSpheres, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fAbsoluteMinDistanceToTarget, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fCoverPointScoreMultiplier, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.CTaskHelicopterStrafe__Tunables: + return new PsoStructureInfo(MetaName.CTaskHelicopterStrafe__Tunables, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FlightHeightAboveTarget, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveTerrain, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetDirectionMinDot, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetOffset, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetMinSpeedToIgnore, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetMaxSpeedToStrafe, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToAvoidTargetAfterDamaged, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidOffsetXY, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidOffsetZ, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToBeConsideredInFront, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.BehindRotateAngleLookAhead, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.SearchRotateAngleLookAhead, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.CircleRotateAngleLookAhead, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.BehindTargetAngle, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetOffsetFilter, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenStrafeDirectionChanges, PsoDataType.Float, 76, 0, 0) + ); + case MetaName.CTaskMeleeActionResult__Tunables: + return new PsoStructureInfo(MetaName.CTaskMeleeActionResult__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ActionModeTime, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceRunDelayTime, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskMoveCombatMounted__Tunables: + return new PsoStructureInfo(MetaName.CTaskMoveCombatMounted__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.CircleTestRadii, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.CircleTestsMoveDistToTestNewPos, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeSinceAnyCircleJoined, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeSinceSameCircleJoined, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TransitionReactionTime, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.VelStartCircling, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.VelStopCircling, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeWaitingForCircleMs, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.CTaskDyingDead__Tunables: + return new PsoStructureInfo(MetaName.CTaskDyingDead__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.VehicleForwardInitialScale, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleForwardScale, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToApplyPushFromVehicleForce, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceToApply, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFallingSpeedForAnimatedDyingFall, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.SphereTestRadiusForDeadWaterSettle, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.RagdollAbortPoseDistanceThreshold, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.RagdollAbortPoseMaxVelocity, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToThrowWeaponMS, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToThrowWeaponPlayerMS, PsoDataType.UInt, 52, 0, 0) + ); + case MetaName.CTaskDamageElectric__Tunables: + return new PsoStructureInfo(MetaName.CTaskDamageElectric__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FallsOutofVehicleVelocity, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskInvestigate__Tunables: + return new PsoStructureInfo(MetaName.CTaskInvestigate__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.iTimeToStandAtSearchPoint, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceToUseVehicle, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceSavingToUseVehicle, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeToStandAtPerimeter, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fNewPositionThreshold, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.CTaskCombat__Tunables: + return new PsoStructureInfo(MetaName.CTaskCombat__Tunables, 0, 0, 704, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.BuddyShot, PsoDataType.Structure, 16, 0, (MetaName)4144542252), + new PsoStructureEntryInfo(MetaName.LackOfHostility, PsoDataType.Structure, 48, 0, (MetaName)455065356), + new PsoStructureEntryInfo(MetaName.EnemyAccuracyScaling, PsoDataType.Structure, 144, 0, (MetaName)1818844971), + new PsoStructureEntryInfo(MetaName.ChargeTuning, PsoDataType.Structure, 168, 0, (MetaName)3736726978), + new PsoStructureEntryInfo(MetaName.ThrowSmokeGrenadeTuning, PsoDataType.Structure, 240, 0, (MetaName)1530415684), + new PsoStructureEntryInfo(MetaName.MaxDistToCoverZ, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistToCoverXY, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo(MetaName.fAmbientAnimsMinDistToTargetSq, PsoDataType.Float, 296, 0, 0), + new PsoStructureEntryInfo(MetaName.fAmbientAnimsMaxDistToTargetSq, PsoDataType.Float, 300, 0, 0), + new PsoStructureEntryInfo(MetaName.fGoToDefAreaTimeOut, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo(MetaName.fFireContinuouslyDistMin, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo(MetaName.fFireContinuouslyDistMax, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo(MetaName.fLostTargetTime, PsoDataType.Float, 316, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeAfterAimPoseForStateChange, PsoDataType.Float, 320, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxAttemptMoveToCoverDelay, PsoDataType.Float, 324, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinAttemptMoveToCoverDelay, PsoDataType.Float, 328, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxAttemptMoveToCoverDelayGlobal, PsoDataType.Float, 332, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinAttemptMoveToCoverDelayGlobal, PsoDataType.Float, 336, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceForAltCover, PsoDataType.Float, 340, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeStandingAtCover, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeBetweenFrustratedPeds, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxTimeBetweenFrustratedPeds, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.fRetreatTime, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.fTargetTooCloseDistance, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenJackingAttempts, PsoDataType.Float, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenCoverSearchesMin, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenCoverSearchesMax, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenAltCoverSearches, PsoDataType.Float, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.fShoutTargetPositionInterval, PsoDataType.Float, 380, 0, 0), + new PsoStructureEntryInfo(MetaName.fShoutBlockingLosInterval, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenDragsMin, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenSecondaryTargetUsesMin, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenSecondaryTargetUsesMax, PsoDataType.Float, 396, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeToUseSecondaryTargetMin, PsoDataType.Float, 400, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeToUseSecondaryTargetMax, PsoDataType.Float, 404, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenCombatDirectorUpdates, PsoDataType.Float, 408, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenPassiveAnimsMin, PsoDataType.Float, 412, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenPassiveAnimsMax, PsoDataType.Float, 416, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenQuickGlancesMin, PsoDataType.Float, 420, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenQuickGlancesMax, PsoDataType.Float, 424, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenGestureAnimsMin, PsoDataType.Float, 428, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenGestureAnimsMax, PsoDataType.Float, 432, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenFailedGestureMin, PsoDataType.Float, 436, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenFailedGestureMax, PsoDataType.Float, 440, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenGesturesMinGlobal, PsoDataType.Float, 444, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenGesturesMaxGlobal, PsoDataType.Float, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeSinceLastAimedAtForGesture, PsoDataType.Float, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeBeforeReactToExplosion, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxTimeBeforeReactToExplosion, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetInfluenceSphereRadius, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetMinDistanceToRoute, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetMinDistanceToAwayFacingNavLink, PsoDataType.Float, 472, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxWaitForCoverExitTime, PsoDataType.Float, 476, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxDstanceToMoveAwayFromAlly, PsoDataType.Float, 480, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenAllyProximityChecks, PsoDataType.Float, 484, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceFromPrimaryTarget, PsoDataType.Float, 488, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxAngleBetweenTargets, PsoDataType.Float, 492, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceFromPedToHelpPed, PsoDataType.Float, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDotToTargetToHelpPed, PsoDataType.Float, 500, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeadingDifferenceForQuickGlanceInSameDirection, PsoDataType.Float, 504, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenQuickGlancesInSameDirection, PsoDataType.Float, 508, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedToStartJackingVehicle, PsoDataType.Float, 512, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedToContinueJackingVehicle, PsoDataType.Float, 516, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetJackRadius, PsoDataType.Float, 520, 0, 0), + new PsoStructureEntryInfo(MetaName.SafetyProportionInDefensiveAreaMin, PsoDataType.Float, 524, 0, 0), + new PsoStructureEntryInfo(MetaName.SafetyProportionInDefensiveAreaMax, PsoDataType.Float, 528, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMoveToDefensiveAreaAngleVariation, PsoDataType.Float, 532, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToEnterVehicleIfTargetEntersVehicle, PsoDataType.Float, 536, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToMyVehicleToChase, PsoDataType.Float, 540, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToVehicleForCommandeer, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.NumEarlyVehicleEntryDriversAllowed, PsoDataType.UByte, 548, 0, 0), + new PsoStructureEntryInfo(MetaName.SafeTimeBeforeLeavingCover, PsoDataType.UInt, 552, 0, 0), + new PsoStructureEntryInfo(MetaName.WaitTimeForJackingSlowedVehicle, PsoDataType.UInt, 556, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxInjuredTargetTimerVariation, PsoDataType.Float, 560, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxNumPedsChasingOnFoot, PsoDataType.UByte, 564, 0, 0), + new PsoStructureEntryInfo(MetaName.FireTimeAfterStaticMovementAbort, PsoDataType.Float, 568, 0, 0), + new PsoStructureEntryInfo(MetaName.MinMovingToCoverTimeToStop, PsoDataType.Float, 572, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToCoverToStop, PsoDataType.Float, 576, 0, 0), + new PsoStructureEntryInfo(MetaName.FireTimeAfterStoppingMoveToCover, PsoDataType.Float, 580, 0, 0), + new PsoStructureEntryInfo(MetaName.ApproachingTargetVehicleHoldFireDistance, PsoDataType.Float, 584, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDefensiveAreaRadiusForWillAdvance, PsoDataType.Float, 588, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToHoldFireForArrest, PsoDataType.Float, 592, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToDelayChaseOnFoot, PsoDataType.Float, 596, 0, 0), + new PsoStructureEntryInfo(MetaName.FireTimeAfterChaseOnFoot, PsoDataType.Float, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToChangeChaseOnFootSpeed, PsoDataType.UInt, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableForcedFireForTargetProximity, PsoDataType.Bool, 608, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForceFiringStateTime, PsoDataType.Float, 612, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForceFiringStateTime, PsoDataType.Float, 616, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBeforeInitialForcedFire, PsoDataType.Float, 620, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenForcedFireStates, PsoDataType.Float, 624, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInStateForForcedFire, PsoDataType.Float, 628, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForceFiringDistance, PsoDataType.Float, 632, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForceFiringDistance, PsoDataType.Float, 636, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForAimIntro, PsoDataType.Float, 640, 0, 0), + new PsoStructureEntryInfo((MetaName)3129989164, PsoDataType.Float, 644, 0, 0), + new PsoStructureEntryInfo((MetaName)4269476531, PsoDataType.Float, 648, 0, 0), + new PsoStructureEntryInfo(MetaName.AmbientAnimLengthBuffer, PsoDataType.Float, 652, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenPlayerArrestAttempts, PsoDataType.UInt, 656, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenArmedMeleeAttemptsInMs, PsoDataType.UInt, 660, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowMovingArmedMeleeAttack, PsoDataType.Bool, 664, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToHoldFireAfterJack, PsoDataType.Float, 668, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenMeleeJackAttempts, PsoDataType.UInt, 672, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenMeleeJackAttemptsOnNetworkClone, PsoDataType.UInt, 676, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToHoldFireAtTaskInitialization, PsoDataType.Float, 680, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToRejectRespawnedTarget, PsoDataType.UInt, 684, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForLawToFleeFromCombat, PsoDataType.Float, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForLawToReturnToCombatFromFlee, PsoDataType.Float, 692, 0, 0), + new PsoStructureEntryInfo((MetaName)2186966715, PsoDataType.Float, 696, 0, 0) + ); + case (MetaName)4144542252: + return new PsoStructureInfo((MetaName)4144542252, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBeforeReact, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeBeforeReact, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeSinceShot, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)455065356: + return new PsoStructureInfo((MetaName)455065356, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.WantedLevel1, PsoDataType.Structure, 8, 0, (MetaName)2841666617), + new PsoStructureEntryInfo(MetaName.WantedLevel2, PsoDataType.Structure, 24, 0, (MetaName)2841666617), + new PsoStructureEntryInfo(MetaName.WantedLevel3, PsoDataType.Structure, 40, 0, (MetaName)2841666617), + new PsoStructureEntryInfo(MetaName.WantedLevel4, PsoDataType.Structure, 56, 0, (MetaName)2841666617), + new PsoStructureEntryInfo(MetaName.WantedLevel5, PsoDataType.Structure, 72, 0, (MetaName)2841666617), + new PsoStructureEntryInfo(MetaName.MaxSpeedForVehicle, PsoDataType.Float, 88, 0, 0) + ); + case (MetaName)2841666617: + return new PsoStructureInfo((MetaName)2841666617, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeSinceLastHostileAction, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)1818844971: + return new PsoStructureInfo((MetaName)1818844971, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.iMinNumEnemiesForScaling, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fAccuracyReductionPerEnemy, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fAccuracyReductionFloor, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)3736726978: + return new PsoStructureInfo((MetaName)3736726978, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.bChargeTargetEnabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.uMaxNumActiveChargers, PsoDataType.UByte, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.uConsiderRecentChargeAsActiveTimeoutMS, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.uMinTimeBetweenChargesAtSameTargetMS, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.uMinTimeForSamePedToChargeAgainMS, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.uCheckForChargeTargetPeriodMS, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeInCombatSeconds, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceToTarget, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxDistanceToTarget, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistToNonTargetEnemy, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistBetweenTargetAndOtherEnemies, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fDistToHidingTarget_Outer, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fDistToHidingTarget_Inner, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.fChargeGoalCompletionRadius, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.fCancelTargetOutOfCoverMovedDist, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.fCancelTargetInCoverMovedDist, PsoDataType.Float, 64, 0, 0) + ); + case (MetaName)1530415684: + return new PsoStructureInfo((MetaName)1530415684, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.bThrowSmokeGrenadeEnabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.uMaxNumActiveThrowers, PsoDataType.UByte, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.uConsiderRecentThrowAsActiveTimeoutMS, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.uMinTimeBetweenThrowsAtSameTargetMS, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.uMinTimeForSamePedToThrowAgainMS, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.uCheckForSmokeThrowPeriodMS, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceToTarget, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxDistanceToTarget, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fDotMinThrowerToTarget, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinLoiteringTimeSeconds, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CTaskReactAimWeapon__Tunables: + return new PsoStructureInfo(MetaName.CTaskReactAimWeapon__Tunables, 0, 0, 680, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Professional, PsoDataType.Structure, 16, 0, (MetaName)3326118529), + new PsoStructureEntryInfo(MetaName.NotProfessional, PsoDataType.Structure, 344, 0, (MetaName)3326118529), + new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 672, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRateVariance, PsoDataType.Float, 676, 0, 0) + ); + case (MetaName)3326118529: + return new PsoStructureInfo((MetaName)3326118529, 0, 0, 328, + new PsoStructureEntryInfo(MetaName.Flinch, PsoDataType.Structure, 8, 0, (MetaName)2563725968), + new PsoStructureEntryInfo(MetaName.Surprised, PsoDataType.Structure, 88, 0, (MetaName)2563725968), + new PsoStructureEntryInfo(MetaName.Sniper, PsoDataType.Structure, 168, 0, (MetaName)2563725968), + new PsoStructureEntryInfo(MetaName.None, PsoDataType.Structure, 248, 0, (MetaName)2563725968) + ); + case (MetaName)2563725968: + return new PsoStructureInfo((MetaName)2563725968, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Pistol, PsoDataType.Structure, 8, 0, (MetaName)3972028972), + new PsoStructureEntryInfo(MetaName.Rifle, PsoDataType.Structure, 32, 0, (MetaName)3972028972), + new PsoStructureEntryInfo(MetaName.MicroSMG, PsoDataType.Structure, 56, 0, (MetaName)3972028972) + ); + case (MetaName)3972028972: + return new PsoStructureInfo((MetaName)3972028972, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ClipSetId, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.HasSixDirections, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.HasCreateWeaponTag, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.HasInterruptTag, PsoDataType.Bool, 18, 0, 0) + ); + case MetaName.CTaskSearch__Tunables: + return new PsoStructureInfo(MetaName.CTaskSearch__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeToStare, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MoveBlendRatio, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetReached, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CTaskSearchForUnknownThreat__Tunables: + return new PsoStructureInfo(MetaName.CTaskSearchForUnknownThreat__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.iMinTimeBeforeSearchingForNewHidingPlace, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.iMaxTimeBeforeSearchingForNewHidingPlace, PsoDataType.SInt, 20, 0, 0) + ); + case MetaName.CTaskSharkCircle__Tunables: + return new PsoStructureInfo(MetaName.CTaskSharkCircle__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AdvanceDistanceSquared, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MoveRateOverride, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskSharkAttack__Tunables: + return new PsoStructureInfo(MetaName.CTaskSharkAttack__Tunables, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SurfaceProjectionDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SurfaceZOffset, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDepthBelowSurface, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.CirclingAngularSpeed, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToCircle, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinCircleRadius, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCircleRadius, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.CirclingMBR, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DiveProjectionDistance, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DiveDepth, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DiveMBR, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinNumberFakeApproaches, PsoDataType.SInt, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxNumberFakeApproaches, PsoDataType.SInt, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.FakeLungeOffset, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.LungeForwardOffset, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.LungeZOffset, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.LungeChangeDistance, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.LungeTargetRadius, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowTimeout, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowYOffset, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowZOffset, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.LandProbeLength, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingVehicleVelocityThreshold, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.SharkFleeDist, PsoDataType.Float, 108, 0, 0) + ); + case MetaName.CTaskCover__Tunables: + return new PsoStructureInfo(MetaName.CTaskCover__Tunables, 0, 0, 192, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)3698046827, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1862046997, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1686691958, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3171144783, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1788624470, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)1235126752, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1335048013, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)2787523036, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.PriorityCoverWeighting, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleToCameraWeighting, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleToDynamicCoverWeighting, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceWeighting, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleToCoverWeighting, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleOfCoverWeighting, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeWeighting, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.NetworkBlendOutDurationRun, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.NetworkBlendOutDurationRunStart, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.NetworkBlendOutDuration, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPlayerToCoverDist, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)1534623417, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularDiffBetweenDynamicAndStaticCover, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.RangeToUseDynamicCoverPointMin, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.RangeToUseDynamicCoverPointMax, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistToCoverAnyDir, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistToPriorityCoverToForce, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistToCoverSpecificDir, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.BehindPedToCoverCosTolerance, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.SearchToCoverCosTolerance, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.CapsuleZOffset, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenTestSpheresIntersectingRoute, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistToCoverWhenPlayerIsClose, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MinCoverToPlayerCoverDist, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.MinMoveToCoverDistForCoverMeAudio, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSecondsAsTopLevelTask, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceStreamingFailure, PsoDataType.Bool, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.StreamedUnarmedCoverMovementClipSetId, PsoDataType.String, 156, 7, 0), + new PsoStructureEntryInfo((MetaName)1804897490, PsoDataType.String, 160, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamedOneHandedCoverMovementClipSetId, PsoDataType.String, 164, 7, 0), + new PsoStructureEntryInfo(MetaName.AIOneHandedAimingClipSetId, PsoDataType.String, 168, 7, 0), + new PsoStructureEntryInfo(MetaName.AITwoHandedAimingClipSetId, PsoDataType.String, 172, 7, 0), + new PsoStructureEntryInfo(MetaName.CoreWeaponClipSetId, PsoDataType.String, 176, 7, 0), + new PsoStructureEntryInfo((MetaName)3902347552, PsoDataType.String, 180, 7, 0), + new PsoStructureEntryInfo((MetaName)2620277506, PsoDataType.String, 184, 7, 0) + ); + case MetaName.CTaskEnterCover__Tunables: + return new PsoStructureInfo(MetaName.CTaskEnterCover__Tunables, 0, 0, 368, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryRatePlayer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryRateAI, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryShortDistanceAI, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryShortDistancePlayer, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryStandDistance, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryStandStrafeDistance, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryMinDistance, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryMaxDistance, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryMinDistanceAI, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryMaxDistanceAI, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryMaxDirectDistance, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryMinTimeNavigatingAI, PsoDataType.SInt, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryMinAngleToScale, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryHeadingReachedTol, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverEntryPositionReachedTol, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.FromCoverExitDistance, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.NetworkBlendInDuration, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.DistFromCoverToAllowReloadCache, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.WaitForFootPlant, PsoDataType.Bool, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableFootTagSyncing, PsoDataType.Bool, 89, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceToTarget, PsoDataType.Bool, 90, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableInitialHeadingBlend, PsoDataType.Bool, 91, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableTranslationScaling, PsoDataType.Bool, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableRotationScaling, PsoDataType.Bool, 93, 0, 0), + new PsoStructureEntryInfo(MetaName.PreventTranslationOvershoot, PsoDataType.Bool, 94, 0, 0), + new PsoStructureEntryInfo(MetaName.PreventRotationOvershoot, PsoDataType.Bool, 95, 0, 0), + new PsoStructureEntryInfo(MetaName.DoInitialHeadingBlend, PsoDataType.Bool, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.DoFinalHeadingFixUp, PsoDataType.Bool, 97, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistToPlayEntryAnim, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistToScale, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRotSpeed, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTransScale, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTransScale, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRotScale, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRotScale, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.DeltaTolerance, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRotDelta, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleToSetDirectly, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.AiEntryHalfAngleTolerance, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableNewAICoverEntry, PsoDataType.Bool, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableUseSwatClipSet, PsoDataType.Bool, 149, 0, 0), + new PsoStructureEntryInfo(MetaName.UseShortDistAngleRotation, PsoDataType.Bool, 150, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableAiCoverEntryStreamCheck, PsoDataType.Bool, 151, 0, 0), + new PsoStructureEntryInfo(MetaName.DistToUseShortestRotation, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.InCoverTolerance, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.DotThresholdForCenterEnter, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.AiEntryMinRate, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.AiEntryMaxRate, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerSprintEntryRate, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultPlayerStandEntryStartMovementPhase, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultPlayerStandEntryEndMovementPhase, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleToBeginRotationScale, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDefaultAngularVelocity, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverInterruptMinTime, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverInterruptDistanceTolerance, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverInterruptHeadingTolerance, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverAimInterruptDistanceTolerance, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverAimInterruptHeadingTolerance, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo((MetaName)3920645611, PsoDataType.Structure, 216, 0, (MetaName)1285383250), + new PsoStructureEntryInfo((MetaName)80713034, PsoDataType.Structure, 256, 0, (MetaName)1285383250), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)711010751), + new PsoStructureEntryInfo(MetaName.AIEnterCoverClips, PsoDataType.Array, 296, 0, (MetaName)62), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3590219800), + new PsoStructureEntryInfo(MetaName.AIStandEnterCoverClips, PsoDataType.Array, 312, 0, (MetaName)64), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)711010751), + new PsoStructureEntryInfo(MetaName.AIEnterTransitionClips, PsoDataType.Array, 328, 0, (MetaName)66), + new PsoStructureEntryInfo(MetaName.EnterCoverAIAimingBase1H, PsoDataType.String, 344, 7, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverAIAimingBase2H, PsoDataType.String, 348, 7, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverAIAimingSwat1H, PsoDataType.String, 352, 7, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverAIAimingSwat2H, PsoDataType.String, 356, 7, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverAITransition1H, PsoDataType.String, 360, 7, 0), + new PsoStructureEntryInfo(MetaName.EnterCoverAITransition2H, PsoDataType.String, 364, 7, 0) + ); + case (MetaName)1285383250: + return new PsoStructureInfo((MetaName)1285383250, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo((MetaName)611524654, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo((MetaName)1120845094, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case (MetaName)3038580099: + return new PsoStructureInfo((MetaName)3038580099, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Clips, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 24, 0, (MetaName)2097154) + ); + case (MetaName)711010751: + return new PsoStructureInfo((MetaName)711010751, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.EnterClipId, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 12, 0, (MetaName)2097153) + ); + case (MetaName)3590219800: + return new PsoStructureInfo((MetaName)3590219800, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.StandClip0Id, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.StandClip1Id, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.StandClip2Id, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 20, 0, (MetaName)2097155) + ); + case MetaName.CTaskExitCover__Tunables: + return new PsoStructureInfo(MetaName.CTaskExitCover__Tunables, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4010326834), + new PsoStructureEntryInfo(MetaName.CornerExitClips, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.ExitCoverBaseClipSetId, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo((MetaName)2123164199, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.ExitCoverExtraClipSetId, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo((MetaName)1757551615, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.MinInputToInterruptIdle, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.CornerExitHeadingModifier, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitCornerZOffset, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitCornerYOffset, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitCornerDirOffset, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)3920645611, PsoDataType.Structure, 72, 0, (MetaName)246682624), + new PsoStructureEntryInfo((MetaName)80713034, PsoDataType.Structure, 96, 0, (MetaName)246682624) + ); + case (MetaName)246682624: + return new PsoStructureInfo((MetaName)246682624, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo((MetaName)1123873278, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)4010326834: + return new PsoStructureInfo((MetaName)4010326834, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.ExitClipId, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 12, 0, (MetaName)2097153) + ); + case MetaName.CTaskInCover__Tunables: + return new PsoStructureInfo(MetaName.CTaskInCover__Tunables, 0, 0, 536, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MovementClipRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TurnClipRate, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxInputForIdleExit, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.InputYAxisCornerExitValue, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlDebugXPos, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlDebugYPos, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlDebugRadius, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlDebugBeginAngle, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.ControlDebugEndAngle, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStickInputToMoveInCover, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStickInputXAxisToTurnInCover, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)927329696, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.InputYAxisQuitValue, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.StartExtendedProbeTime, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToSpendInTask, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredDistanceToCover, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredDistanceToCoverToRequestStep, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.OptimumDistToRightCoverEdgeCrouched, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.OptimumDistToLeftCoverEdgeCrouched, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.OptimumDistToRightCoverEdge, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.OptimumDistToLeftCoverEdge, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.MinMovingProbeOffset, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMovingProbeOffset, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTurnProbeOffset, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTurnProbeOffset, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultProbeOffset, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStoppingEdgeCheckProbeOffset, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStoppingEdgeCheckProbeOffset, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStoppingProbeOffset, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStoppingProbeOffset, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingChangeRate, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBeforeAllowingCornerMove, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.CrouchedLeftFireOffset, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.CrouchedRightFireOffset, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverLeftFireModifier, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverRightFireModifier, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverLeftFireModifierLow, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverRightFireModifierLow, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)2625425324, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.CFriendlyIssues, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverLeftIncreaseModifier, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverRightIncreaseModifier, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.AimTurnCosAngleTolerance, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.InCoverMovementSpeedEnterCover, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.InCoverMovementSpeed, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.SteppingMovementSpeed, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.UseAutoPeekAimFromCoverControls, PsoDataType.Bool, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.ComeBackInWhenAimDirectChangeInHighCover, PsoDataType.Bool, 201, 0, 0), + new PsoStructureEntryInfo(MetaName.AlternateControlStickInputThreshold, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeCapsuleRadius, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeStartXOffset, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeEndXOffset, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeStartYOffset, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeEndYOffset, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.InsideEdgeStartYOffset, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.InsideEdgeEndYOffset, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.InsideEdgeStartXOffset, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.InsideEdgeEndXOffset, PsoDataType.Float, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.WallTestYOffset, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialLowEdgeWallTestYOffset, PsoDataType.Float, 248, 0, 0), + new PsoStructureEntryInfo(MetaName.HighCloseEdgeWallTestYOffset, PsoDataType.Float, 252, 0, 0), + new PsoStructureEntryInfo(MetaName.WallTestStartXOffset, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.WallTestEndXOffset, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo(MetaName.WallHighTestZOffset, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingEdgeTestStartYOffset, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingEdgeTestEndYOffset, PsoDataType.Float, 272, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverEdgeTestStartYOffset, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverEdgeTestEndYOffset, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo(MetaName.SteppingEdgeTestStartYOffset, PsoDataType.Float, 284, 0, 0), + new PsoStructureEntryInfo(MetaName.SteppingEdgeTestEndYOffset, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialLowEdgeTestStartYOffset, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialLowEdgeTestEndYOffset, PsoDataType.Float, 296, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeHighZOffset, PsoDataType.Float, 300, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeLowZOffset, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeMinimumOffsetDiff, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeMaximumOffsetDiff, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo(MetaName.PinnedDownPeekChance, PsoDataType.Float, 316, 0, 0), + new PsoStructureEntryInfo(MetaName.PinnedDownBlindFireChance, PsoDataType.Float, 320, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBeforeAllowingAutoPeek, PsoDataType.Float, 324, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableAimDirectlyIntros, PsoDataType.Bool, 328, 0, 0), + new PsoStructureEntryInfo(MetaName.PedDirToPedCoverCosAngleTol, PsoDataType.Float, 332, 0, 0), + new PsoStructureEntryInfo(MetaName.CamToPedDirCosAngleTol, PsoDataType.Float, 336, 0, 0), + new PsoStructureEntryInfo(MetaName.CamToCoverDirCosAngleTol, PsoDataType.Float, 340, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToTargetForPeek, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenPeeksWithoutLOS, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1466791495), + new PsoStructureEntryInfo(MetaName.ThrowProjectileClips, PsoDataType.Array, 352, 0, (MetaName)86), + new PsoStructureEntryInfo(MetaName.RecreateWeaponTime, PsoDataType.SInt, 368, 0, 0), + new PsoStructureEntryInfo(MetaName.BlindFireHighCoverMinPitchLimit, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.BlindFireHighCoverMaxPitchLimit, PsoDataType.Float, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableLeftHandIkInCover, PsoDataType.Bool, 380, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableReloadingWhilstMovingInCover, PsoDataType.Bool, 381, 0, 0), + new PsoStructureEntryInfo(MetaName.AimIntroRateForAi, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.AimOutroRateForAi, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.MinReactToFireRate, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxReactToFireRate, PsoDataType.Float, 396, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxReactToFireDelay, PsoDataType.Float, 400, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeUntilReturnToIdleFromAimAfterAimedAt, PsoDataType.Float, 404, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeUntilReturnToIdleFromAimAfterAimedAt, PsoDataType.Float, 408, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeUntilReturnToIdleFromAimDefault, PsoDataType.Float, 412, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeUntilReturnToIdleFromAimDefault, PsoDataType.Float, 416, 0, 0), + new PsoStructureEntryInfo(MetaName.GlobalLateralTorsoOffsetInLeftCover, PsoDataType.Float, 420, 0, 0), + new PsoStructureEntryInfo((MetaName)3668359056, PsoDataType.Float, 424, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponLongBlockingOffsetInLeftCover, PsoDataType.Float, 428, 0, 0), + new PsoStructureEntryInfo((MetaName)2805643991, PsoDataType.Float, 432, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponBlockingOffsetInLeftCover, PsoDataType.Float, 436, 0, 0), + new PsoStructureEntryInfo((MetaName)3824828934, PsoDataType.Float, 440, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponBlockingOffsetInRightCover, PsoDataType.Float, 444, 0, 0), + new PsoStructureEntryInfo((MetaName)3593181124, PsoDataType.Float, 448, 0, 0), + new PsoStructureEntryInfo((MetaName)1214766569, PsoDataType.Float, 452, 0, 0), + new PsoStructureEntryInfo((MetaName)2018978213, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponBlockingLengthOffset, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo((MetaName)2717483602, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverStepClipSetId, PsoDataType.String, 468, 7, 0), + new PsoStructureEntryInfo(MetaName.PinnedDownTakeCoverAmount, PsoDataType.Float, 472, 0, 0), + new PsoStructureEntryInfo(MetaName.AmountPinnedDownByDamage, PsoDataType.Float, 476, 0, 0), + new PsoStructureEntryInfo(MetaName.AmountPinnedDownByBullet, PsoDataType.Float, 480, 0, 0), + new PsoStructureEntryInfo(MetaName.AmountPinnedDownByWitnessKill, PsoDataType.Float, 484, 0, 0), + new PsoStructureEntryInfo(MetaName.PinnedDownByBulletRange, PsoDataType.Float, 488, 0, 0), + new PsoStructureEntryInfo(MetaName.PinnedDownDecreaseAmountPerSecond, PsoDataType.Float, 492, 0, 0), + new PsoStructureEntryInfo(MetaName.AimIntroTaskBlendOutDuration, PsoDataType.Float, 496, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToBePinnedDown, PsoDataType.UInt, 500, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenBurstsMaxRandomPercent, PsoDataType.Float, 504, 0, 0), + new PsoStructureEntryInfo(MetaName.AimOutroDelayTime, PsoDataType.UInt, 508, 0, 0), + new PsoStructureEntryInfo((MetaName)3531438516, PsoDataType.UInt, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)796325569, PsoDataType.UInt, 516, 0, 0), + new PsoStructureEntryInfo((MetaName)2152868269, PsoDataType.Bool, 520, 0, 0), + new PsoStructureEntryInfo((MetaName)1536785516, PsoDataType.Bool, 521, 0, 0), + new PsoStructureEntryInfo(MetaName.ThrowProjectileClipSetId, PsoDataType.String, 524, 7, 0), + new PsoStructureEntryInfo((MetaName)3576155857, PsoDataType.String, 528, 7, 0) + ); + case (MetaName)1466791495: + return new PsoStructureInfo((MetaName)1466791495, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.IntroClipId, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.PullPinClipId, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.BaseClipId, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.ThrowLongClipId, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.ThrowShortClipId, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo((MetaName)1925480184, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo((MetaName)3487669030, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 36, 0, (MetaName)2097159) + ); + case MetaName.CTaskMotionInCover__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionInCover__Tunables, 0, 0, 1112, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverClipRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableCoverToCoverTranslationScaling, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableCoverToCoverRotationScaling, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo(MetaName.UseButtonToMoveAroundCorner, PsoDataType.Bool, 22, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableCoverToCover, PsoDataType.Bool, 23, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableWalkStops, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableCoverPeekingVariations, PsoDataType.Bool, 25, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableCoverPinnedVariations, PsoDataType.Bool, 26, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableCoverIdleVariations, PsoDataType.Bool, 27, 0, 0), + new PsoStructureEntryInfo(MetaName.UseSprintButtonForCoverToCover, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.VerifyCoverInterval, PsoDataType.UByte, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeForCornerMove, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultSettleBlendDuration, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.HeightChangeSettleBlendDuration, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeStayPinned, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeStayPinned, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.PinnedDownThreshold, PsoDataType.UInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ForcePinnedDown, PsoDataType.Bool, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToTargetForIdleVariations, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenIdleVariations, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeBetweenIdleVariations, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MinWaitTimeToPlayPlayerIdleVariations, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenPlayerIdleVariations, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeBetweenPlayerIdleVariations, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverDuration, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMinScalePhase, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMaxScalePhase, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMinRotScalePhase, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMaxRotScalePhase, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRotationalSpeedScale, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRotationalSpeed, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStickInputToEnableMoveAroundCorner, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStickInputToEnableCoverToCover, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStickInputToMoveAroundCorner, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStoppingDuration, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStoppingDist, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToScale, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCDepthDistanceCompletionOffset, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeLowCoverMoveTime, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToStandUp, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMinDistToScale, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMinAngToScale, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMinAng, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverDistTol, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMaxDistToStep, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverAngTol, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMaxAngToStep, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMaxAccel, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.ForwardDistToStartSideScale, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverMinDepthToScale, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverToCoverSmallAnimDist, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingReachedTolerance, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendToIdleTime, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.InsideCornerStopDistance, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverHeadingCloseEnough, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverHeadingCloseEnoughTurn, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverPositionCloseEnough, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultStillToTurnBlendDuration, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultEdgeTurnBlendDuration, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.PeekToEdgeTurnBlendDuration, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMoveSpeedInCover, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.MinEdgeDistanceForStoppingAnim, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.UseNewStepAndWalkStarts, PsoDataType.Bool, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.UseNewTurns, PsoDataType.Bool, 237, 0, 0), + new PsoStructureEntryInfo(MetaName.UseNewTurnWalkStarts, PsoDataType.Bool, 238, 0, 0), + new PsoStructureEntryInfo(MetaName.CoreMotionClipSetId, PsoDataType.String, 240, 7, 0), + new PsoStructureEntryInfo((MetaName)1642317087, PsoDataType.String, 244, 7, 0), + new PsoStructureEntryInfo(MetaName.CoreAIMotionClipSetId, PsoDataType.String, 248, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.PeekingVariationAnimStateInfos, PsoDataType.Array, 256, 0, (MetaName)69), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PeekingLow1HVariationClipsets, PsoDataType.Array, 272, 0, (MetaName)71), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PeekingLow2HVariationClipsets, PsoDataType.Array, 288, 0, (MetaName)73), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PeekingHigh1HVariationClipsets, PsoDataType.Array, 304, 0, (MetaName)75), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PeekingHigh2HVariationClipsets, PsoDataType.Array, 320, 0, (MetaName)77), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PinnedLow1HVariationClipsets, PsoDataType.Array, 336, 0, (MetaName)79), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PinnedLow2HVariationClipsets, PsoDataType.Array, 352, 0, (MetaName)81), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PinnedHigh1HVariationClipsets, PsoDataType.Array, 368, 0, (MetaName)83), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PinnedHigh2HVariationClipsets, PsoDataType.Array, 384, 0, (MetaName)85), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.OutroReact1HVariationClipsets, PsoDataType.Array, 400, 0, (MetaName)87), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.OutroReact2HVariationClipsets, PsoDataType.Array, 416, 0, (MetaName)89), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.IdleLow1HVariationClipsets, PsoDataType.Array, 432, 0, (MetaName)91), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.IdleLow2HVariationClipsets, PsoDataType.Array, 448, 0, (MetaName)93), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.IdleHigh1HVariationClipsets, PsoDataType.Array, 464, 0, (MetaName)95), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.IdleHigh2HVariationClipsets, PsoDataType.Array, 480, 0, (MetaName)97), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PlayerIdleLow0HVariationClipsets, PsoDataType.Array, 496, 0, (MetaName)99), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PlayerIdleLow1HVariationClipsets, PsoDataType.Array, 512, 0, (MetaName)101), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PlayerIdleLow2HVariationClipsets, PsoDataType.Array, 528, 0, (MetaName)103), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PlayerIdleHigh0HVariationClipsets, PsoDataType.Array, 544, 0, (MetaName)105), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PlayerIdleHigh1HVariationClipsets, PsoDataType.Array, 560, 0, (MetaName)107), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.PlayerIdleHigh2HVariationClipsets, PsoDataType.Array, 576, 0, (MetaName)109), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.PinnedIntroAnimStateInfos, PsoDataType.Array, 592, 0, (MetaName)111), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.PinnedIdleAnimStateInfos, PsoDataType.Array, 608, 0, (MetaName)113), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.PinnedOutroAnimStateInfos, PsoDataType.Array, 624, 0, (MetaName)115), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.IdleVariationAnimStateInfos, PsoDataType.Array, 640, 0, (MetaName)117), + new PsoStructureEntryInfo((MetaName)3920645611, PsoDataType.Structure, 656, 0, (MetaName)2625948332), + new PsoStructureEntryInfo((MetaName)80713034, PsoDataType.Structure, 880, 0, (MetaName)2625948332), + new PsoStructureEntryInfo((MetaName)1230607954, PsoDataType.Bool, 1104, 0, 0), + new PsoStructureEntryInfo((MetaName)1949874056, PsoDataType.Bool, 1105, 0, 0), + new PsoStructureEntryInfo((MetaName)3098272438, PsoDataType.Bool, 1106, 0, 0), + new PsoStructureEntryInfo((MetaName)2038512667, PsoDataType.Bool, 1107, 0, 0) + ); + case (MetaName)2625948332: + return new PsoStructureInfo((MetaName)2625948332, 0, 0, 224, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.IdleAnimStateInfos, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.AtEdgeAnimStateInfos, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.PeekingAnimStateInfos, PsoDataType.Array, 40, 0, (MetaName)4), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.StoppingAnimStateInfos, PsoDataType.Array, 56, 0, (MetaName)6), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.MovingAnimStateInfos, PsoDataType.Array, 72, 0, (MetaName)8), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.EdgeTurnAnimStateInfos, PsoDataType.Array, 88, 0, (MetaName)10), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.CoverToCoverAnimStateInfos, PsoDataType.Array, 104, 0, (MetaName)MetaTypeName.PsoPOINTER), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.SteppingAnimStateInfos, PsoDataType.Array, 120, 0, (MetaName)14), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.WalkStartAnimStateInfos, PsoDataType.Array, 136, 0, (MetaName)MetaTypeName.STRING), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.SettleAnimStateInfos, PsoDataType.Array, 152, 0, (MetaName)18), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.TurnEnterAnimStateInfos, PsoDataType.Array, 168, 0, (MetaName)20), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.TurnEndAnimStateInfos, PsoDataType.Array, 184, 0, (MetaName)22), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo(MetaName.TurnWalkStartAnimStateInfos, PsoDataType.Array, 200, 0, (MetaName)24), + new PsoStructureEntryInfo((MetaName)3535710087, PsoDataType.String, 216, 7, 0) + ); + case MetaName.CTaskAimGunFromCoverIntro__Tunables: + return new PsoStructureInfo(MetaName.CTaskAimGunFromCoverIntro__Tunables, 0, 0, 312, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.UpperBodyAimBlendInDuration, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.IntroMovementDuration, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableIntroScaling, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableRotationScaling, PsoDataType.Bool, 25, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableIntroOverShootCheck, PsoDataType.Bool, 26, 0, 0), + new PsoStructureEntryInfo(MetaName.UseConstantIntroScaling, PsoDataType.Bool, 27, 0, 0), + new PsoStructureEntryInfo(MetaName.RenderArcsAtCoverPosition, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.RenderAimArcDebug, PsoDataType.Bool, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.UseMoverPositionWhilePeeking, PsoDataType.Bool, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableWeaponBlocking, PsoDataType.Bool, 31, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableTranslationScaling, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ArcRadius, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.IntroScalingDefaultStartPhase, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.IntroScalingDefaultEndPhase, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.IntroRotScalingDefaultStartPhase, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.IntroRotScalingDefaultEndPhase, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.AiAimIntroCloseEnoughTolerance, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStepBackDist, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStepOutDist, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStepOutDist, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.IntroMaxScale, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.IntroRate, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)2875886470, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.OutroRate, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)2575356761, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.SteppingApproachRateSlow, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.SteppingApproachRate, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.SteppingApproachRateFast, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.SteppingHeadingApproachRate, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRotationalSpeedScale, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRotationalSpeedScale, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingReachedTolerance, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.StepOutCapsuleRadiusScale, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.AimDirectlyMaxAngle, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.StepOutLeftX, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.StepOutRightX, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.StepOutY, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.LowXClearOffsetCapsuleTest, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.LowXOffsetCapsuleTest, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.LowYOffsetCapsuleTest, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.LowZOffsetCapsuleTest, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.LowOffsetCapsuleLength, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.LowOffsetCapsuleRadius, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.LowLeftStep, PsoDataType.Float2, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.LowRightStep, PsoDataType.Float2, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.LowBlockedBlend, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.LowStepOutLeftXBlocked, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.LowStepOutLeftYBlocked, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.LowStepBackLeftXBlocked, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.LowStepBackLeftYBlocked, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.LowStepOutRightXBlocked, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.LowStepOutRightYBlocked, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.LowStepBackRightXBlocked, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.LowStepBackRightYBlocked, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.LowSideZOffset, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.DistConsideredAtAimPosition, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPhaseToApplyExtraHeadingAi, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPhaseToApplyExtraHeadingPlayer, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityAi, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityPlayer, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityPlayerForcedStandAim, PsoDataType.Float, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.HighLeftAimStepInfoSet, PsoDataType.Structure, 248, 0, (MetaName)791301518), + new PsoStructureEntryInfo(MetaName.HighRightAimStepInfoSet, PsoDataType.Structure, 272, 0, (MetaName)791301518), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4162893736), + new PsoStructureEntryInfo(MetaName.AimIntroClips, PsoDataType.Array, 296, 0, (MetaName)64) + ); + case (MetaName)791301518: + return new PsoStructureInfo((MetaName)791301518, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2996437115), + new PsoStructureEntryInfo(MetaName.StepInfos, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)2996437115: + return new PsoStructureInfo((MetaName)2996437115, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.StepOutX, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.StepOutY, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.StepTransitionMinAngle, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StepTransitionMaxAngle, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.PreviousTransitionExtraScalar, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.NextTransitionExtraScalar, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.PreviousTransitionClipId, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.NextTransitionClipId, PsoDataType.String, 36, 7, 0) + ); + case (MetaName)4162893736: + return new PsoStructureInfo((MetaName)4162893736, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Clips, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 24, 0, (MetaName)2097154) + ); + case MetaName.CTaskAimGunFromCoverOutro__Tunables: + return new PsoStructureInfo(MetaName.CTaskAimGunFromCoverOutro__Tunables, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DisableOutroScaling, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableRotationScaling, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableOutroOverShootCheck, PsoDataType.Bool, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.UseConstantOutroScaling, PsoDataType.Bool, 19, 0, 0), + new PsoStructureEntryInfo(MetaName.OutroRotationScalingDefaultStartPhase, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.OutroRotationScalingDefaultEndPhase, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.OutroScalingDefaultStartPhase, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.OutroScalingDefaultEndPhase, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.OutroMaxScale, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AdditionalModifier, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.EndHeadingTolerance, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredDistanceToCover, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.InCoverMovementSpeed, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.OutroMovementDuration, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.UpperBodyAimBlendOutDuration, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityAi, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityPlayer, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)2412106599, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularHeadingVelocityPlayerForcedStandAim, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)3920645611, PsoDataType.Structure, 80, 0, (MetaName)1280972310), + new PsoStructureEntryInfo((MetaName)80713034, PsoDataType.Structure, 104, 0, (MetaName)1280972310) + ); + case (MetaName)1280972310: + return new PsoStructureInfo((MetaName)1280972310, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3038580099), + new PsoStructureEntryInfo((MetaName)2828309925, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.CTaskAimGunBlindFire__Tunables: + return new PsoStructureInfo(MetaName.CTaskAimGunBlindFire__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.RemoveReticuleDuringBlindFire, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DontRemoveReticuleDuringBlindFireNew, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.LowBlindFireAimingDirectlyLimitAngle, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.HighBlindFireAimingDirectlyLimitAngle, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)994532516), + new PsoStructureEntryInfo(MetaName.BlindFireAnimStateNewInfos, PsoDataType.Array, 32, 0, (MetaName)5) + ); + case (MetaName)994532516: + return new PsoStructureInfo((MetaName)994532516, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.IntroClip0Id, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.IntroClip1Id, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.SweepClip0Id, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.SweepClip1Id, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo(MetaName.SweepClip2Id, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.OutroClip0Id, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo((MetaName)2291961208, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo((MetaName)3610728325, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo((MetaName)1018316975, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.CockGunWeaponClipId, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1559228487), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 48, 0, (MetaName)2097162), + new PsoStructureEntryInfo(MetaName.MinHeadingAngle, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeadingAngle, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3127121455, PsoDataType.Structure, 64, 0, (MetaName)4209697792), + new PsoStructureEntryInfo((MetaName)465339689, PsoDataType.Structure, 88, 0, (MetaName)4209697792) + ); + case (MetaName)4209697792: + return new PsoStructureInfo((MetaName)4209697792, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.MinPitchAngle, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitchAngle, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPitchAngle2H, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitchAngle2H, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CAiCoverClipVariationHelper__Tunables: + return new PsoStructureInfo(MetaName.CAiCoverClipVariationHelper__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinUsesForPeekingVariationChange, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxUsesForPeekingVariationChange, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinUsesForPinnedVariationChange, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxUsesForPinnedVariationChange, PsoDataType.UInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinUsesForOutroReactVariationChange, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxUsesForOutroReactVariationChange, PsoDataType.UInt, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinUsesForIdleVariationChange, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxUsesForIdleVariationChange, PsoDataType.UInt, 44, 0, 0) + ); + case MetaName.CPlayerCoverClipVariationHelper__Tunables: + return new PsoStructureInfo(MetaName.CPlayerCoverClipVariationHelper__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinUsesForIdleVariationChange, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxUsesForIdleVariationChange, PsoDataType.UInt, 20, 0, 0) + ); + case MetaName.CDynamicCoverHelper__Tunables: + return new PsoStructureInfo(MetaName.CDynamicCoverHelper__Tunables, 0, 0, 176, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.EnableConflictingNormalCollisionRemoval, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.UseStickHistoryForCoverSearch, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.StickDownDuration, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.StickDownMinRange, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.UseCameraOrientationWeighting, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.UseCameraOrientationWhenStill, PsoDataType.Bool, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.UseCameraOrientationForBackwardsDirection, PsoDataType.Bool, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.BehindThreshold, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToWallStanding, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToWallCrouching, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToWallCoverToCover, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.OCMCrouchedForwardClearanceOffset, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.OCMStandingForwardClearanceOffset, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.OCMSideClearanceDepth, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.OCMClearanceCapsuleRadius, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.OCMSideTestDepth, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.OCMCrouchedHeightOffset, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.OCMStandingHeightOffset, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCSideOffset, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCProbeDepth, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCForwardOffset, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCSpacingOffset, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCCapsuleRadius, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCHeightOffset, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.LowCoverProbeHeight, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.HighCoverProbeHeight, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleRadius, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleStartForwardOffset, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleEndForwardOffset, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleStartZOffset, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCClearanceCapsuleEndZOffset, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.CTCMinDistance, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleEdgeProbeXOffset, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleEdgeProbeZOffset, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZDiffBetweenCoverPoints, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZDiffBetweenPedPos, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeadingDiffBetweenCTCPoints, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.PedToCoverCapsuleRadius, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.PedToCoverEndPullBackDistance, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.PedToCoverEndZOffset, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStickInputAngleInfluence, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.IdleYStartOffset, PsoDataType.Float, 168, 0, 0) + ); + case MetaName.CClipScalingHelper__Tunables: + return new PsoStructureInfo(MetaName.CClipScalingHelper__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DisableRotationScaling, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableRotationOvershoot, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableTranslationScaling, PsoDataType.Bool, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableTranslationOvershoot, PsoDataType.Bool, 19, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelocityToScale, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTransVelocity, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRemainingAnimDurationToScale, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAnimRotationDeltaToScale, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAnimTranslationDeltaToScale, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinCurrentRotationDeltaToScale, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultMinRotationScalingValue, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultMaxRotationScalingValue, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultMinTranslationScalingValue, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultMaxTranslationScalingValue, PsoDataType.Float, 56, 0, 0) + ); + case MetaName.CTaskAdvance__Tunables: + return new PsoStructureInfo(MetaName.CTaskAdvance__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeToWaitAtPosition, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenPointUpdates, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenSeekChecksAtTacticalPoint, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskAimFromGround__Tunables: + return new PsoStructureInfo(MetaName.CTaskAimFromGround__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxAimFromGroundTime, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskBoatChase__Tunables: + return new PsoStructureInfo(MetaName.CTaskBoatChase__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceForPursue, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskBoatCombat__Tunables: + return new PsoStructureInfo(MetaName.CTaskBoatCombat__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)384450892), + new PsoStructureEntryInfo(MetaName.MinSpeedForChase, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToLookAheadForCollision, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DepthForLandProbe, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToWait, PsoDataType.Float, 44, 0, 0) + ); + case (MetaName)384450892: + return new PsoStructureInfo((MetaName)384450892, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionProbe, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.LandProbe, PsoDataType.Bool, 10, 0, 0) + ); + case MetaName.CTaskBoatStrafe__Tunables: + return new PsoStructureInfo(MetaName.CTaskBoatStrafe__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AdditionalDistanceForApproach, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AdditionalDistanceForStrafe, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedForStrafe, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.RotationLookAhead, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAdjustmentLookAhead, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.CTaskDraggingToSafety__Tunables: + return new PsoStructureInfo(MetaName.CTaskDraggingToSafety__Tunables, 0, 0, 208, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ObstructionProbe, PsoDataType.Structure, 16, 0, (MetaName)1469164696), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 40, 0, (MetaName)512689970), + new PsoStructureEntryInfo(MetaName.MaxTimeForStream, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverMinDistance, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverMaxDistance, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.LookAtUpdateTime, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.LookAtTime, PsoDataType.SInt, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverWeightDistance, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverWeightUsage, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverWeightValue, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.SeparationPickup, PsoDataType.Float3, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.SeparationDrag, PsoDataType.Float3, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.SeparationPutdown, PsoDataType.Float3, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.AbortAimedAtMinDistance, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverResponseTimeout, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotForPickupDirection, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForHolster, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForPedToBeVeryCloseToCover, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxNumPedsAllowedToBeVeryCloseToCover, PsoDataType.SInt, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenCoverPointSearches, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToSetApproachPosition, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToConsiderTooClose, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToAlwaysLookAtTarget, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeightDifferenceToApproachTarget, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxXYDistanceToApproachTarget, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToBeObstructed, PsoDataType.Float, 192, 0, 0) + ); + case (MetaName)1469164696: + return new PsoStructureInfo((MetaName)1469164696, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Height, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Radius, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraHeightForGround, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)512689970: + return new PsoStructureInfo((MetaName)512689970, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ObstructionProbe, PsoDataType.Bool, 9, 0, 0) + ); + case MetaName.CTaskHeliChase__Tunables: + return new PsoStructureInfo(MetaName.CTaskHeliChase__Tunables, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DriftX, PsoDataType.Structure, 16, 0, (MetaName)1407012688), + new PsoStructureEntryInfo(MetaName.DriftY, PsoDataType.Structure, 40, 0, (MetaName)1407012688), + new PsoStructureEntryInfo(MetaName.DriftZ, PsoDataType.Structure, 64, 0, (MetaName)1407012688), + new PsoStructureEntryInfo(MetaName.MinHeightAboveTerrain, PsoDataType.SInt, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowDownDistanceMin, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowDownDistanceMax, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForOrientation, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.NearDistanceForOrientation, PsoDataType.Float, 108, 0, 0) + ); + case (MetaName)1407012688: + return new PsoStructureInfo((MetaName)1407012688, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.MinValueForCorrection, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxValueForCorrection, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRate, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskHeliCombat__Tunables: + return new PsoStructureInfo(MetaName.CTaskHeliCombat__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Chase, PsoDataType.Structure, 16, 0, (MetaName)960897278) + ); + case (MetaName)960897278: + return new PsoStructureInfo((MetaName)960897278, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.MinSpeed, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetOffsetX, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTargetOffsetX, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetOffsetY, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTargetOffsetY, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetOffsetZ, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTargetOffsetZ, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetOffsetZ_TargetInAir, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTargetOffsetZ_TargetInAir, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CTaskPlaneChase__Tunables: + return new PsoStructureInfo(MetaName.CTaskPlaneChase__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CTaskReactToBuddyShot__Tunables: + return new PsoStructureInfo(MetaName.CTaskReactToBuddyShot__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CTaskVariedAimPose__Tunables: + return new PsoStructureInfo(MetaName.CTaskVariedAimPose__Tunables, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBeforeCanChooseNewPose, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBeforeNewPose, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeBeforeNewPose, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceForMinTimeBeforeNewPose, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceForMaxTimeBeforeNewPose, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidNearbyPedHorizontal, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidNearbyPedVertical, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidNearbyPedDotThreshold, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenReactions, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAnimOffsetMagnitude, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToCareAboutBlockingLineOfSight, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToUseUrgentTransitions, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToUseUrgentTransitionsWhenThreatened, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenReactionChecksForGunAimedAt, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToReactForGunAimedAt, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxClipsToCheckPerFrame, PsoDataType.SInt, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.DebugDraw, PsoDataType.Bool, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultStandingPose, PsoDataType.String, 92, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultCrouchingPose, PsoDataType.String, 96, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)896772506), + new PsoStructureEntryInfo(MetaName.AimPoses, PsoDataType.Array, 104, 0, (MetaName)22) + ); + case (MetaName)896772506: + return new PsoStructureInfo((MetaName)896772506, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.IsCrouching, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.IsStationary, PsoDataType.Bool, 13, 0, 0), + new PsoStructureEntryInfo(MetaName.LoopClipSetId, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.LoopClipId, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2263463390), + new PsoStructureEntryInfo(MetaName.Transitions, PsoDataType.Array, 24, 0, (MetaName)5) + ); + case (MetaName)2263463390: + return new PsoStructureInfo((MetaName)2263463390, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ToPose, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ClipSetId, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.ClipId, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)966624441), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 24, 2, (MetaName)524292) + ); + case MetaName.CTaskVehicleChase__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleChase__Tunables, 0, 0, 264, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CloseDistance, PsoDataType.Structure, 16, 0, (MetaName)653343499), + new PsoStructureEntryInfo(MetaName.Block, PsoDataType.Structure, 32, 0, (MetaName)45194904), + new PsoStructureEntryInfo(MetaName.Pursue, PsoDataType.Structure, 56, 0, (MetaName)2956630463), + new PsoStructureEntryInfo(MetaName.Ram, PsoDataType.Structure, 80, 0, (MetaName)533527745), + new PsoStructureEntryInfo(MetaName.SpinOut, PsoDataType.Structure, 104, 0, (MetaName)2379651736), + new PsoStructureEntryInfo(MetaName.PullAlongside, PsoDataType.Structure, 128, 0, (MetaName)3309127383), + new PsoStructureEntryInfo(MetaName.AggressiveMove, PsoDataType.Structure, 152, 0, (MetaName)2082149421), + new PsoStructureEntryInfo(MetaName.Cheat, PsoDataType.Structure, 216, 0, (MetaName)3284002922), + new PsoStructureEntryInfo(MetaName.MaxDotForHandBrake, PsoDataType.Float, 248, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenCarChaseShockingEvents, PsoDataType.Float, 252, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceForCarChaseShockingEvents, PsoDataType.Float, 256, 0, 0) + ); + case (MetaName)653343499: + return new PsoStructureInfo((MetaName)653343499, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MinDistanceToStart, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToContinue, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)45194904: + return new PsoStructureInfo((MetaName)45194904, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.MaxDotToStartFromAnalyze, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDotToContinueFromAnalyze, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetSpeedToStartFromPursue, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetSpeedToContinueFromPursue, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)2956630463: + return new PsoStructureInfo((MetaName)2956630463, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.MinDotToStartFromAnalyze, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToContinueFromAnalyze, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistance, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)533527745: + return new PsoStructureInfo((MetaName)533527745, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.StraightLineDistance, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetSpeedToStartFromPursue, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetSpeedToContinueFromPursue, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)2379651736: + return new PsoStructureInfo((MetaName)2379651736, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.StraightLineDistance, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetSpeedToStartFromPursue, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetSpeedToContinueFromPursue, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)3309127383: + return new PsoStructureInfo((MetaName)3309127383, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.StraightLineDistance, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetSpeedToStartFromPursue, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetSpeedToContinueFromPursue, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)2082149421: + return new PsoStructureInfo((MetaName)2082149421, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.MaxDistanceToStartFromPursue, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToStartFromPursue, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedLeewayToStartFromPursue, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTargetSteerAngleToStartFromPursue, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToContinueFromPursue, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToContinueFromPursue, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeInStateToContinueFromPursue, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTargetSteerAngleToContinueFromPursue, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelay, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelay, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.WeightToRamFromPursue, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.WeightToBlockFromPursue, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.WeightToSpinOutFromPursue, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.WeightToPullAlongsideFromPursue, PsoDataType.Float, 60, 0, 0) + ); + case (MetaName)3284002922: + return new PsoStructureInfo((MetaName)3284002922, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MinSpeedDifferenceForPowerAdjustment, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedDifferenceForPowerAdjustment, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.PowerForMinAdjustment, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.PowerForMaxAdjustment, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.destroySuppressor, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskVehiclePersuit__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehiclePersuit__Tunables, 0, 0, 184, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ApproachTarget, PsoDataType.Structure, 16, 0, (MetaName)2385857407), + new PsoStructureEntryInfo(MetaName.ObstructionProbeAngleA, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.ObstructionProbeAngleB, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.ObstructionProbeAngleC, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceOnBikeAndTargetUnarmed, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceOnBikeAndTargetArmed, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceInVehicleAndTargetUnarmed, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceInVehicleAndTargetArmed, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceShotAt, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceCouldLeaveCar, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToStopMultiplier, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToStopMassIdeal, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToStopMassWeight, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDriverTimeToLeaveVehicle, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDriverTimeToLeaveVehicle, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPassengerTimeToLeaveVehicle, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPassengerTimeToLeaveVehicle, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedForEarlyCombatExit, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToJumpOutOfVehicle, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBoatOutOfWaterForExit, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidanceMarginForOtherLawEnforcementVehicles, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToWaitForOtherPedToExit, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelayExitTime, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayExitTime, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.PreventShufflingExtraRange, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeWaitForExitBeforeWarp, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTargetStandingOnTrainSpeed, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToFollowInCar, PsoDataType.SInt, 176, 0, 0) + ); + case (MetaName)2385857407: + return new PsoStructureInfo((MetaName)2385857407, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.TargetArriveDist, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToConsiderClose, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedWhenClose, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedWhenObstructedByLawEnforcementPed, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedWhenObstructedByLawEnforcementVehicle, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1208093369, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)4019091857, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2510151940, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1955661253, PsoDataType.SInt, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2422052515, PsoDataType.SInt, 48, 0, 0) + ); + case MetaName.CTaskVehicleCombat__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleCombat__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenShootOutTiresGlobal, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeBetweenShootOutTiresGlobal, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInCombatToShootOutTires, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeInCombatToShootOutTires, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToApplyReactionWhenShootingOutTire, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToPrepareWeapon, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToPrepareWeapon, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1726607124, PsoDataType.UInt, 44, 0, 0) + ); + case MetaName.CTaskSearchBase__Tunables: + return new PsoStructureInfo(MetaName.CTaskSearchBase__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeToGiveUp, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPositionVariance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDirectionVariance, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskSearchInAutomobile__Tunables: + return new PsoStructureInfo(MetaName.CTaskSearchInAutomobile__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FleeOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskSearchInBoat__Tunables: + return new PsoStructureInfo(MetaName.CTaskSearchInBoat__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CTaskSearchInHeli__Tunables: + return new PsoStructureInfo(MetaName.CTaskSearchInHeli__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FleeOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeightAboveTerrain, PsoDataType.SInt, 24, 0, 0) + ); + case MetaName.CTaskSearchOnFoot__Tunables: + return new PsoStructureInfo(MetaName.CTaskSearchOnFoot__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FleeOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.CompletionRadius, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowDownDistance, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeSafeDistance, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MoveBlendRatio, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.CTaskShootOutTire__Tunables: + return new PsoStructureInfo(MetaName.CTaskShootOutTire__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeoutToAcquireLineOfSight, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeoutToAcquireLineOfSight, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenLineOfSightChecks, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToWaitForShot, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToWaitForShot, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWaitForShotFailures, PsoDataType.SInt, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToApplyReaction, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CTaskTargetUnreachable__Tunables: + return new PsoStructureInfo(MetaName.CTaskTargetUnreachable__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fTimeBetweenRouteSearches, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskTargetUnreachableInInterior__Tunables: + return new PsoStructureInfo(MetaName.CTaskTargetUnreachableInInterior__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fDirectionTestProbeLength, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskTargetUnreachableInExterior__Tunables: + return new PsoStructureInfo(MetaName.CTaskTargetUnreachableInExterior__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.RangePercentage, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceFromNavMesh, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MoveBlendRatio, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.CompletionRadius, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToWait, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToWait, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CPedTargetting__Tunables: + return new PsoStructureInfo(MetaName.CPedTargetting__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fExistingTargetScoreWeight, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fTargetingInactiveDisableTime, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fBlockedLosWeighting, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fTimeToIgnoreBlockedLosWeighting, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fPlayerHighThreatWeighting, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)1742395925, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.iTargetNotSeenIgnoreTimeMs, PsoDataType.SInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fPlayerThreatDistance, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fPlayerDirectThreatDistance, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fPlayerBeingTargetedExtraDistance, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.iPlayerDirectThreatTimeMs, PsoDataType.SInt, 56, 0, 0) + ); + case MetaName.CTaskPursueCriminal__Tunables: + return new PsoStructureInfo(MetaName.CTaskPursueCriminal__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToFindVehicle, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToFindVehicle, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeightDifference, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DotProductFacing, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DotProductBehind, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToFollowVehicleBeforeFlee, PsoDataType.SInt, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToSignalVehiclePursuitToCriminal, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToSignalVehiclePursuitToCriminalMin, PsoDataType.SInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToSignalVehiclePursuitToCriminalMax, PsoDataType.SInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DrawDebug, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowPursuePlayer, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo(MetaName.CriminalVehicleMinStartSpeed, PsoDataType.Float, 56, 0, 0) + ); + case MetaName.CTaskReactToPursuit__Tunables: + return new PsoStructureInfo(MetaName.CTaskReactToPursuit__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToFleeInVehicle, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToFleeInVehicle, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeSpeedInVehicle, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskStealVehicle__Tunables: + return new PsoStructureInfo(MetaName.CTaskStealVehicle__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToFindVehicle, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToPursueVehicle, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToRunToVehicle, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.CanStealPlayersVehicle, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.CanStealCarsAtLights, PsoDataType.Bool, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.CanStealParkedCars, PsoDataType.Bool, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.CanStealStationaryCars, PsoDataType.Bool, 31, 0, 0) + ); + case MetaName.CLookAtHistory__Tunables: + return new PsoStructureInfo(MetaName.CLookAtHistory__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.HistoryCosineThreshold, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MemoryDuration, PsoDataType.UInt, 20, 0, 0) + ); + case MetaName.CAmbientLookAt__Tunables: + return new PsoStructureInfo(MetaName.CAmbientLookAt__Tunables, 0, 0, 416, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultLookAtThreshold, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultDistanceFromWorldCenter, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtendedDistanceFromWorldCenter, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToScanLookAts, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.BaseTimeToLook, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AITimeBetweenLookAtsFailureMin, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AITimeBetweenLookAtsFailureMax, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerTimeBetweenLookAtsMin, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerTimeBetweenLookAtsMax, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerTimeMyVehicleLookAtsMin, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerTimeMyVehicleLookAtsMax, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenScenarioScans, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioScanOffsetDistance, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioScanRadius, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPlayerScore, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.BasicPedScore, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.BasicVehicleScore, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.BasicObjectScore, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.BehindPedModifier, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerPedModifier, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.WalkingRoundPedModifier, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.RunningPedModifier, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.ClimbingOrJumpingPedModifier, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.FightingModifier, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.JackingModifier, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.HangingAroundVehicleModifier, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioToScenarioPedModifier, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.GangScenarioPedToPlayerModifier, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.ApproachingPlayerModifier, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.ClosePlayerModifier, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.InRangePlayerModifier, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.InRangeDrivingPlayerModifier, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.HoldingWeaponPlayerModifier, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.CoveredInBloodPlayerModifier, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.RagdollingModifier, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.PickingUpBikeModifier, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.RecklessCarModifier, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.RecentlyLookedAtPlayerModifier, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.RecentlyLookedAtEntityModifier, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.HighImportanceModifier, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.MediumImportanceModifier, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.LowImportanceModifier, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.ModelNamesToConsiderPlayersForScoringPurposes, PsoDataType.Array, 184, 0, (MetaName)43), + new PsoStructureEntryInfo(MetaName.RecklessCarSpeedMin, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.RecklessCarSpeedMax, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.CarSirenModifier, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerCopModifier, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerSexyPedModifier, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerSwankyCarModifier, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerCopCarModifier, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerHasslingModifier, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.HotPedMinDistance, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.HotPedMaxDistance, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.HotPedMinDotAngle, PsoDataType.Float, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.HotPedMaxDotAngle, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo(MetaName.HotPedMaxHeightDifference, PsoDataType.Float, 248, 0, 0), + new PsoStructureEntryInfo(MetaName.InRangePlayerDistanceThreshold, PsoDataType.Float, 252, 0, 0), + new PsoStructureEntryInfo(MetaName.InRangePlayerInRaceDistanceThreshold, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.ClosePlayerDistanceThreshold, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo(MetaName.ApproachingPlayerDistanceThreshold, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo(MetaName.ApproachingPlayerCosineThreshold, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo(MetaName.RagdollPlayerDistanceThreshold, PsoDataType.Float, 272, 0, 0), + new PsoStructureEntryInfo(MetaName.LookingInRangePlayerMaxDotAngle, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVelocityForVehicleLookAtSqr, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerSwankyCarMin, PsoDataType.UByte, 284, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerSwankyCarMax, PsoDataType.UByte, 285, 0, 0), + new PsoStructureEntryInfo(MetaName.HotPedRenderDebug, PsoDataType.Bool, 286, 0, 0), + new PsoStructureEntryInfo(MetaName.HotPedDisableSexinessFlagChecks, PsoDataType.Bool, 287, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBeforeSwitchLookAt, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLookBackAngle, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTurnSpeedMotionOverPOI, PsoDataType.Float, 296, 0, 0), + new PsoStructureEntryInfo(MetaName.SpeedForNarrowestAnglePickPOI, PsoDataType.Float, 300, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAnglePickPOI, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAnglePickPOI, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitchingAnglePickPOI, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerLookAtDebugDraw, PsoDataType.Bool, 316, 0, 0), + new PsoStructureEntryInfo(MetaName.CameraLookAtTurnRate, PsoDataType.Enum, 320, 0, MetaName.LookIkTurnRate), + new PsoStructureEntryInfo(MetaName.POILookAtTurnRate, PsoDataType.Enum, 324, 0, MetaName.LookIkTurnRate), + new PsoStructureEntryInfo(MetaName.MotionLookAtTurnRate, PsoDataType.Enum, 328, 0, MetaName.LookIkTurnRate), + new PsoStructureEntryInfo(MetaName.VehicleJumpLookAtTurnRate, PsoDataType.Enum, 332, 0, MetaName.LookIkTurnRate), + new PsoStructureEntryInfo(MetaName.CameraLookAtBlendRate, PsoDataType.Enum, 336, 0, MetaName.LookIkBlendRate), + new PsoStructureEntryInfo(MetaName.POILookAtBlendRate, PsoDataType.Enum, 340, 0, MetaName.LookIkBlendRate), + new PsoStructureEntryInfo(MetaName.MotionLookAtBlendRate, PsoDataType.Enum, 344, 0, MetaName.LookIkBlendRate), + new PsoStructureEntryInfo(MetaName.VehicleJumpLookAtBlendRate, PsoDataType.Enum, 348, 0, MetaName.LookIkBlendRate), + new PsoStructureEntryInfo(MetaName.CameraLookAtRotationLimit, PsoDataType.Enum, 352, 0, MetaName.LookIkRotationLimit), + new PsoStructureEntryInfo(MetaName.POILookAtRotationLimit, PsoDataType.Enum, 356, 0, MetaName.LookIkRotationLimit), + new PsoStructureEntryInfo(MetaName.MotionLookAtRotationLimit, PsoDataType.Enum, 360, 0, MetaName.LookIkRotationLimit), + new PsoStructureEntryInfo(MetaName.AITimeWaitingToCrossRoadMin, PsoDataType.Float, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.AITimeWaitingToCrossRoadMax, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo(MetaName.fAIGreetingDistanceMin, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.fAIGreetingDistanceMax, PsoDataType.Float, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.uAITimeBetweenGreeting, PsoDataType.UInt, 380, 0, 0), + new PsoStructureEntryInfo(MetaName.fAIGreetingPedModifier, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.uTimeBetweenLookBacks, PsoDataType.UInt, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.uTimeToLookBack, PsoDataType.UInt, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.uAimToIdleLookAtTime, PsoDataType.UInt, 396, 0, 0), + new PsoStructureEntryInfo(MetaName.fAimToIdleBreakOutAngle, PsoDataType.Float, 400, 0, 0), + new PsoStructureEntryInfo(MetaName.fAimToIdleAngleLimitLeft, PsoDataType.Float, 404, 0, 0), + new PsoStructureEntryInfo(MetaName.fAimToIdleAngleLimitRight, PsoDataType.Float, 408, 0, 0), + new PsoStructureEntryInfo((MetaName)3044687592, PsoDataType.UInt, 412, 0, 0) + ); + case MetaName.CTaskAmbientClips__Tunables: + return new PsoStructureInfo(MetaName.CTaskAmbientClips__Tunables, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.LowLodBaseClipSetId, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultChanceOfStandingWhileMoving, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTimeBetweenIdles, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeAfterGunshotToPlayIdles, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeAfterGunshotForPlayerToPlayIdles, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.playerNearToHangoutDistanceInMetersSquared, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.minSecondsNearPlayerUntilHangoutQuit, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.maxSecondsNearPlayerUntilHangoutQuit, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.maxHangoutChatDistSq, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.VFXCullRangeScaleNotVisible, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.SecondsSinceInWaterThatCountsAsWet, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVehicleVelocityForAmbientIdles, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSteeringAngleForAmbientIdles, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeSinceGetUpForAmbientIdles, PsoDataType.UInt, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)110858295, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)990057437, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.fArgumentProbability, PsoDataType.Float, 80, 0, 0) + ); + case MetaName.CTaskChat__Tunables: + return new PsoStructureInfo(MetaName.CTaskChat__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.HeadingToleranceDegrees, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWaitTime, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskCuffed__Tunables: + return new PsoStructureInfo(MetaName.CTaskCuffed__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.HandcuffedClipSetId, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.ActionsHandcuffedNetworkId, PsoDataType.String, 20, 7, 0) + ); + case MetaName.CTaskInCustody__Tunables: + return new PsoStructureInfo(MetaName.CTaskInCustody__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AbandonDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowRadius, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.FollowOffset, PsoDataType.Float3, 32, 0, 0) + ); + case MetaName.CTaskFlyingWander__Tunables: + return new PsoStructureInfo(MetaName.CTaskFlyingWander__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.RangeOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingWanderChange, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskPlayerOnFoot__Tunables: + return new PsoStructureInfo(MetaName.CTaskPlayerOnFoot__Tunables, 0, 0, 368, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ParachutePack, PsoDataType.Structure, 16, 0, (MetaName)810561649), + new PsoStructureEntryInfo(MetaName.ScubaGear, PsoDataType.Structure, 88, 0, (MetaName)4252665724), + new PsoStructureEntryInfo((MetaName)973020790, PsoDataType.Structure, 152, 0, (MetaName)2770060121), + new PsoStructureEntryInfo(MetaName.EvaluateThreatFromCoverPoints, PsoDataType.Bool, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.UseThreatWeighting, PsoDataType.Bool, 209, 0, 0), + new PsoStructureEntryInfo((MetaName)1978058747, PsoDataType.Bool, 210, 0, 0), + new PsoStructureEntryInfo((MetaName)3319528567, PsoDataType.Bool, 211, 0, 0), + new PsoStructureEntryInfo(MetaName.ArrestDistance, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.ArrestDot, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxEncumberedClimbHeight, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTrainClimbHeight, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.TakeCustodyDistance, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.UncuffDistance, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToTalk, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToTalk, PsoDataType.Float, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenPlayerEvents, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceBetweenAiPedsCoverAndPlayersCover, PsoDataType.Float, 248, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceAiPedFromTheirCoverToAbortPlayerEnterCover, PsoDataType.Float, 252, 0, 0), + new PsoStructureEntryInfo(MetaName.SmallCapsuleCoverPenalty, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.SmallCapsuleCoverRadius, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo(MetaName.PriorityCoverWeight, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo(MetaName.EdgeCoverWeight, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo(MetaName.DistToCoverWeightThreat, PsoDataType.Float, 272, 0, 0), + new PsoStructureEntryInfo(MetaName.DistToCoverWeight, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo(MetaName.DistToCoverWeightNoStickBonus, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo(MetaName.VeryCloseToCoverDist, PsoDataType.Float, 284, 0, 0), + new PsoStructureEntryInfo(MetaName.VeryCloseToCoverWeight, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredDirToCoverWeight, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredDirToCoverAimingWeight, PsoDataType.Float, 296, 0, 0), + new PsoStructureEntryInfo(MetaName.ThreatDirWeight, PsoDataType.Float, 300, 0, 0), + new PsoStructureEntryInfo(MetaName.ThreatEngageDirWeight, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverDirToCameraWeightMin, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverDirToCameraWeightMax, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverDirToCameraWeightMaxAimGun, PsoDataType.Float, 316, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverDirToCameraWeightMaxScaleDist, PsoDataType.Float, 320, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredDirToCoverMinDot, PsoDataType.Float, 324, 0, 0), + new PsoStructureEntryInfo(MetaName.CameraDirToCoverMinDot, PsoDataType.Float, 328, 0, 0), + new PsoStructureEntryInfo(MetaName.StaticLosTest1Offset, PsoDataType.Float, 332, 0, 0), + new PsoStructureEntryInfo(MetaName.StaticLosTest2Offset, PsoDataType.Float, 336, 0, 0), + new PsoStructureEntryInfo(MetaName.CollisionLosHeightOffset, PsoDataType.Float, 340, 0, 0), + new PsoStructureEntryInfo(MetaName.VeryCloseIgnoreDesAndCamToleranceDist, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo(MetaName.VeryCloseIgnoreDesAndCamToleranceDistAimGun, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo(MetaName.DeadZoneStickNorm, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.SearchThreatMaxDot, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo((MetaName)3328482583, PsoDataType.String, 360, 7, 0), + new PsoStructureEntryInfo((MetaName)1221942053, PsoDataType.Bool, 364, 0, 0), + new PsoStructureEntryInfo((MetaName)1138836382, PsoDataType.Bool, 365, 0, 0) + ); + case (MetaName)810561649: + return new PsoStructureInfo((MetaName)810561649, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.VelocityInheritance, PsoDataType.Structure, 8, 0, (MetaName)1276417684), + new PsoStructureEntryInfo(MetaName.AttachOffsetX, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOffsetY, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOffsetZ, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOrientationX, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOrientationY, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOrientationZ, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendInDeltaForPed, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendInDeltaForProp, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.PhaseToBlendOut, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutDelta, PsoDataType.Float, 68, 0, 0) + ); + case (MetaName)1276417684: + return new PsoStructureInfo((MetaName)1276417684, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)4252665724: + return new PsoStructureInfo((MetaName)4252665724, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.VelocityInheritance, PsoDataType.Structure, 8, 0, (MetaName)2201360486), + new PsoStructureEntryInfo(MetaName.AttachOffsetX, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOffsetY, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOffsetZ, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOrientationX, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOrientationY, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachOrientationZ, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.PhaseToBlendOut, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutDelta, PsoDataType.Float, 60, 0, 0) + ); + case (MetaName)2201360486: + return new PsoStructureInfo((MetaName)2201360486, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)2770060121: + return new PsoStructureInfo((MetaName)2770060121, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.VelocityInheritance, PsoDataType.Structure, 8, 0, (MetaName)549752042), + new PsoStructureEntryInfo(MetaName.PhaseToBlendOut, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutDelta, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3586541171, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)4160387967, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo((MetaName)2801649672, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo((MetaName)2028074979, PsoDataType.String, 52, 7, 0) + ); + case (MetaName)549752042: + return new PsoStructureInfo((MetaName)549752042, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskSwimmingWander__Tunables: + return new PsoStructureInfo(MetaName.CTaskSwimmingWander__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SurfaceSkimmerDepth, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.NormalPreferredDepth, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidanceProbeLength, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidanceProbePullback, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidanceProbeInterval, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AvoidanceSteerAngleDegrees, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.InstantProbeDurationMin, PsoDataType.UInt, 40, 0, 0) + ); + case MetaName.CTaskUnalerted__Tunables: + return new PsoStructureInfo(MetaName.CTaskUnalerted__Tunables, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterFailureMin, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterFailureMax, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterFailureWhenStationary, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterNotAbleToSearch, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterSuccessMin, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioDelayAfterSuccessMax, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioDelayInitialMin, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.ScenarioDelayInitialMax, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBeforeDriverAnimCheck, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenSearchesForNextScenarioInChain, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeMinBeforeLastPoint, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeMinBeforeLastPointType, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.PavementFloodFillSearchRadius, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.WaitTimeAfterFailedVehExit, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToReturnToLastUsedVehicle, PsoDataType.Float, 72, 0, 0) + ); + case MetaName.CTaskWander__Tunables: + return new PsoStructureInfo(MetaName.CTaskWander__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.uNumPedsToTransitionToRainPerPeriod, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fSecondsInRainTransitionPeriod, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskWanderInArea__Tunables: + return new PsoStructureInfo(MetaName.CTaskWanderInArea__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinWaitTime, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWaitTime, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CDispatchSpawnHelper__Tunables: + return new PsoStructureInfo(MetaName.CDispatchSpawnHelper__Tunables, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Restrictions, PsoDataType.Structure, 16, 0, (MetaName)2369454477), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 32, 0, (MetaName)3541869149), + new PsoStructureEntryInfo(MetaName.IdealSpawnDistance, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotForInFront, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceTraveledMultiplier, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToBeConsideredEscapingInVehicle, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForDispatchPosition, PsoDataType.Float, 64, 0, 0) + ); + case (MetaName)2369454477: + return new PsoStructureInfo((MetaName)2369454477, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MaxDistanceFromCameraForViewportChecks, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusForViewportCheck, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)3541869149: + return new PsoStructureInfo((MetaName)3541869149, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.DispatchNode, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.FindSpawnPointInDirection, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.IncidentLocation, PsoDataType.Bool, 11, 0, 0) + ); + case MetaName.CDispatchAdvancedSpawnHelper__Tunables: + return new PsoStructureInfo(MetaName.CDispatchAdvancedSpawnHelper__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)3744572044), + new PsoStructureEntryInfo(MetaName.TimeBetweenInvalidateInvalidDispatchVehicles, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenMarkDispatchVehiclesForDespawn, PsoDataType.Float, 36, 0, 0) + ); + case (MetaName)3744572044: + return new PsoStructureInfo((MetaName)3744572044, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0) + ); + case MetaName.CDispatchHelperSearchOnFoot__Tunables: + return new PsoStructureInfo(MetaName.CDispatchHelperSearchOnFoot__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2350715434), + new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.MaxDistanceFromNavMesh, PsoDataType.Float, 32, 0, 0) + ); + case (MetaName)2350715434: + return new PsoStructureInfo((MetaName)2350715434, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.MinTimeSinceLastSpotted, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeSinceLastSpotted, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRadiusForMinTimeSinceLastSpotted, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRadiusForMaxTimeSinceLastSpotted, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngle, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.UseLastSeenPosition, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.UseByDefault, PsoDataType.Bool, 33, 0, 0), + new PsoStructureEntryInfo(MetaName.UseEnclosedSearchRegions, PsoDataType.Bool, 34, 0, 0) + ); + case MetaName.CDispatchHelperSearchInAutomobile__Tunables: + return new PsoStructureInfo(MetaName.CDispatchHelperSearchInAutomobile__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2350715434), + new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.MaxDistanceFromRoadNode, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.CDispatchHelperSearchInBoat__Tunables: + return new PsoStructureInfo(MetaName.CDispatchHelperSearchInBoat__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2350715434), + new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.CruiseSpeed, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.CDispatchHelperSearchInHeli__Tunables: + return new PsoStructureInfo(MetaName.CDispatchHelperSearchInHeli__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2350715434), + new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case MetaName.CDispatchHelperVolumes__Tunables: + return new PsoStructureInfo(MetaName.CDispatchHelperVolumes__Tunables, 0, 0, 152, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)3452608618), + new PsoStructureEntryInfo(MetaName.LocationForNearestCarNodeOverrides, PsoDataType.Structure, 32, 0, (MetaName)3249772165), + new PsoStructureEntryInfo(MetaName.EnclosedSearchRegions, PsoDataType.Structure, 72, 0, (MetaName)898276026), + new PsoStructureEntryInfo(MetaName.BlockingAreas, PsoDataType.Structure, 112, 0, (MetaName)2312163633) + ); + case (MetaName)3452608618: + return new PsoStructureInfo((MetaName)3452608618, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.LocationForNearestCarNodeOverrides, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.EnclosedSearchRegions, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.BlockingAreas, PsoDataType.Bool, 11, 0, 0) + ); + case (MetaName)3249772165: + return new PsoStructureInfo((MetaName)3249772165, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1419890352), + new PsoStructureEntryInfo(MetaName.AngledAreas, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3809247475), + new PsoStructureEntryInfo(MetaName.Spheres, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case (MetaName)898276026: + return new PsoStructureInfo((MetaName)898276026, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2129766809), + new PsoStructureEntryInfo(MetaName.AngledAreas, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)253441159), + new PsoStructureEntryInfo(MetaName.Spheres, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case (MetaName)2312163633: + return new PsoStructureInfo((MetaName)2312163633, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3558216355), + new PsoStructureEntryInfo(MetaName.AngledAreas, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1335944774), + new PsoStructureEntryInfo(MetaName.Spheres, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case (MetaName)1419890352: + return new PsoStructureInfo((MetaName)1419890352, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.AngledArea, PsoDataType.Structure, 8, 0, (MetaName)3558216355), + new PsoStructureEntryInfo(MetaName.Position, PsoDataType.Structure, 72, 0, (MetaName)2431379611) + ); + case (MetaName)3558216355: + return new PsoStructureInfo((MetaName)3558216355, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 8, 0, (MetaName)2431379611), + new PsoStructureEntryInfo(MetaName.End, PsoDataType.Structure, 32, 0, (MetaName)2431379611), + new PsoStructureEntryInfo(MetaName.Width, PsoDataType.Float, 56, 0, 0) + ); + case (MetaName)2431379611: + return new PsoStructureInfo((MetaName)2431379611, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)2129766809: + return new PsoStructureInfo((MetaName)2129766809, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.AngledArea, PsoDataType.Structure, 8, 0, (MetaName)3558216355), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)4002001992), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 72, 0, (MetaName)2097153) + ); + case MetaName.CWantedHelicopterDispatch__Tunables: + return new PsoStructureInfo(MetaName.CWantedHelicopterDispatch__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenSpawnAttempts, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpawnTimeForPoliceHeliAfterDestroyed, PsoDataType.UInt, 20, 0, 0) + ); + case MetaName.CPoliceBoatDispatch__Tunables: + return new PsoStructureInfo(MetaName.CPoliceBoatDispatch__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenSpawnAttempts, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CEventPedJackingMyVehicle__Tunables: + return new PsoStructureInfo(MetaName.CEventPedJackingMyVehicle__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CEventEncroachingPed__Tunables: + return new PsoStructureInfo(MetaName.CEventEncroachingPed__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CEventRequestHelp__Tunables: + return new PsoStructureInfo(MetaName.CEventRequestHelp__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxRangeWithoutRadioForFistFights, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CEventCrimeCryForHelp__Tunables: + return new PsoStructureInfo(MetaName.CEventCrimeCryForHelp__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1405855513, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)4108300187, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1818772152, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)2579479361, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)977600457, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.CEventSuspiciousActivity__Tunables: + return new PsoStructureInfo(MetaName.CEventSuspiciousActivity__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceToBeConsideredSameEvent, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CEventAgitated__Tunables: + return new PsoStructureInfo(MetaName.CEventAgitated__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeToLive, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AmbientEventLifetime, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TriggerAmbientReactionChances, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForAmbientReaction, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForAmbientReaction, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeForAmbientReaction, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeForAmbientReaction, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AmbientEventType, PsoDataType.Enum, 44, 0, MetaName.AmbientEventType) + ); + case MetaName.CEventRespondedToThreat__Tunables: + return new PsoStructureInfo(MetaName.CEventRespondedToThreat__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskCallPolice__Tunables: + return new PsoStructureInfo(MetaName.CTaskCallPolice__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeMovingAwayToGiveToWitness, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeSinceTalkingEndedToMakeCall, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeSinceTargetTalkingEndedToMakeCall, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeTargetHasBeenTalkingToMakeCall, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeSinceTalkingEndedToSayContextForCall, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeSpentInEarLoopToSayContextForCall, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToSpendInEarLoopToPutDownPhone, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSpendInEarLoopToPutDownPhone, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.CTaskConversationHelper__Tunables: + return new PsoStructureInfo(MetaName.CTaskConversationHelper__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fMinSecondsDelayBetweenPhoneLines, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxSecondsDelayBetweenPhoneLines, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinSecondsDelayBetweenChatLines, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxSecondsDelayBetweenChatLines, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceSquaredToPlayerForAudio, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fChanceOfConversationRant, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fChanceOfArgumentChallenge, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fChanceOfArgumentChallengeBeingAccepted, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.uTimeInMSUntilNewWeirdPedComment, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.uMaxTimeInMSToPlayRingTone, PsoDataType.UInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.uTimeToWaitAfterNewSayFailureInSeconds, PsoDataType.UByte, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.uTicksUntilHangoutConversationCheck, PsoDataType.UByte, 57, 0, 0) + ); + case MetaName.CLegIkSolver__Tunables: + return new PsoStructureInfo(MetaName.CLegIkSolver__Tunables, 0, 0, 392, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.PelvisInterp, PsoDataType.Structure, 16, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.PelvisInterpMoving, PsoDataType.Structure, 40, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.PelvisInterpOnDynamic, PsoDataType.Structure, 64, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.FootInterp, PsoDataType.Structure, 88, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.FootInterpIntersecting, PsoDataType.Structure, 112, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.FootInterpMoving, PsoDataType.Structure, 136, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.FootInterpIntersectingMoving, PsoDataType.Structure, 160, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.FootInterpOnDynamic, PsoDataType.Structure, 184, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.StairsPelvisInterp, PsoDataType.Structure, 208, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.StairsPelvisInterpMoving, PsoDataType.Structure, 232, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.StairsPelvisInterpCoverAim, PsoDataType.Structure, 256, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.StairsFootInterp, PsoDataType.Structure, 280, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.StairsFootInterpIntersecting, PsoDataType.Structure, 304, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.StairsFootInterpCoverAim, PsoDataType.Structure, 328, 0, (MetaName)1560218317), + new PsoStructureEntryInfo(MetaName.UpStairsPelvisMaxDeltaZMoving, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.UpStairsPelvisMaxNegativeDeltaZMoving, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo(MetaName.DownStairsPelvisMaxDeltaZMoving, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo(MetaName.DownStairsPelvisMaxNegativeDeltaZMoving, PsoDataType.Float, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.StairsPelvisMaxNegativeDeltaZCoverAim, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo(MetaName.VelMagStairsSpringMin, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.VelMagStairsSpringMax, PsoDataType.Float, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.StairsSpringMultiplierMin, PsoDataType.Float, 380, 0, 0), + new PsoStructureEntryInfo(MetaName.StairsSpringMultiplierMax, PsoDataType.Float, 384, 0, 0) + ); + case (MetaName)1560218317: + return new PsoStructureInfo((MetaName)1560218317, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Rate, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.AccelerationBased, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleAccelWithDelta, PsoDataType.Bool, 13, 0, 0), + new PsoStructureEntryInfo(MetaName.ZeroRateOnDirectionChange, PsoDataType.Bool, 14, 0, 0), + new PsoStructureEntryInfo(MetaName.AccelRate, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CMiniMap__Tunables: + return new PsoStructureInfo(MetaName.CMiniMap__Tunables, 0, 0, 352, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Sonar, PsoDataType.Structure, 16, 0, (MetaName)53366421), + new PsoStructureEntryInfo(MetaName.HealthBar, PsoDataType.Structure, 132, 0, (MetaName)1902464991), + new PsoStructureEntryInfo(MetaName.Bitmap, PsoDataType.Structure, 140, 0, (MetaName)2026887270), + new PsoStructureEntryInfo((MetaName)1791333322, PsoDataType.Structure, 172, 0, (MetaName)1690619373), + new PsoStructureEntryInfo(MetaName.Camera, PsoDataType.Structure, 200, 0, (MetaName)283649933), + new PsoStructureEntryInfo(MetaName.Tiles, PsoDataType.Structure, 300, 0, (MetaName)3031405081), + new PsoStructureEntryInfo(MetaName.Overlay, PsoDataType.Structure, 320, 0, (MetaName)2449081679), + new PsoStructureEntryInfo(MetaName.Display, PsoDataType.Structure, 340, 0, (MetaName)1640186987) + ); + case (MetaName)53366421: + return new PsoStructureInfo((MetaName)53366421, 0, 0, 116, + new PsoStructureEntryInfo(MetaName.fSoundRange_BarelyAudible, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_MostlyAudible, PsoDataType.Float, 4, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_ClearlyAudible, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_Whisper, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_Talking, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_Shouting, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_Megaphone, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_FootstepBase, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_HeavyFootstep, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_FootstepFoliage, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_LandFromFall, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_WeaponSpinUp, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_Gunshot, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_SilencedGunshot, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)60903513, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_Explosion, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_ObjectCollision, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_GlassBreak, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_CarHorn, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_CarLowSpeed, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_CarHighSpeed, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_WaterSplashSmall, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.fSoundRange_WaterSplashLarge, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinListenerRangeToDrawSonarBlips, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.fRainSnowSoundReductionAmount, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.fRadioSoundReductionAmount, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.fRadioSoundReductionDistance, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.fConversationSoundReductionAmount, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.fConversationSoundReductionDistance, PsoDataType.Float, 112, 0, 0) + ); + case (MetaName)1902464991: + return new PsoStructureInfo((MetaName)1902464991, 0, 0, 8, + new PsoStructureEntryInfo(MetaName.fStaminaDepletionBlinkPercentage, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.iHealthDepletionBlinkPercentage, PsoDataType.SInt, 4, 0, 0) + ); + case (MetaName)2026887270: + return new PsoStructureInfo((MetaName)2026887270, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)2262853888, PsoDataType.UShort, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)735818480, PsoDataType.UShort, 2, 0, 0), + new PsoStructureEntryInfo((MetaName)4138858726, PsoDataType.Float2, 4, 0, 0), + new PsoStructureEntryInfo((MetaName)3205558428, PsoDataType.Float2, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)1388742013, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3712817443, PsoDataType.Enum, 24, 0, (MetaName)1049598006), + new PsoStructureEntryInfo((MetaName)1737696498, PsoDataType.Enum, 28, 0, (MetaName)1049598006) + ); + case (MetaName)1690619373: + return new PsoStructureInfo((MetaName)1690619373, 0, 0, 28, + new PsoStructureEntryInfo(MetaName.fWorldX, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.fWorldY, PsoDataType.Float, 4, 0, 0), + new PsoStructureEntryInfo(MetaName.fWorldW, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fWorldH, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fBaseAlpha, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2170322240, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fFowWaterHeight, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)283649933: + return new PsoStructureInfo((MetaName)283649933, 0, 0, 100, + new PsoStructureEntryInfo((MetaName)3708284943, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)1172300147, PsoDataType.Float, 4, 0, 0), + new PsoStructureEntryInfo(MetaName.fExteriorFootZoom, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fExteriorFootZoomRunning, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fExteriorFootZoomWanted, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fExteriorFootZoomWantedRunning, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1296848312, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)187030077, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fInteriorFootZoom, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)2652932444, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2075786872, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fParachutingZoom, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fVehicleStaticZoom, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fVehicleStaticWantedZoom, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.fVehicleMovingZoom, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.fVehicleMovingWantedZoom, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.fVehicleSpeedZoomScalar, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.fVehicleTilt, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.fVehicleOffset, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1912611271, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)4158832075, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)2229181525, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)1723892124, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.fRangeZoomedScalarStandard, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.fRangeZoomedScalarPlane, PsoDataType.Float, 96, 0, 0) + ); + case (MetaName)3031405081: + return new PsoStructureInfo((MetaName)3031405081, 0, 0, 20, + new PsoStructureEntryInfo((MetaName)2152230135, PsoDataType.Float2, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)4201231105, PsoDataType.Float2, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)142519492, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)866622976, PsoDataType.Bool, 17, 0, 0) + ); + case (MetaName)2449081679: + return new PsoStructureInfo((MetaName)2449081679, 0, 0, 20, + new PsoStructureEntryInfo(MetaName.vPos, PsoDataType.Float2, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.vScale, PsoDataType.Float2, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fDisplayZ, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)1640186987: + return new PsoStructureInfo((MetaName)1640186987, 0, 0, 12, + new PsoStructureEntryInfo((MetaName)717614933, PsoDataType.UShort, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)81490677, PsoDataType.UShort, 2, 0, 0), + new PsoStructureEntryInfo((MetaName)2014573657, PsoDataType.Float, 4, 0, 0), + new PsoStructureEntryInfo((MetaName)3269987179, PsoDataType.Float, 8, 0, 0) + ); + case MetaName.CTaskMotionAiming__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionAiming__Tunables, 0, 0, 144, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.PlayerMoveAccel, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerMoveDecel, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.PedMoveAccel, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.PedMoveDecel, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.FromOnFootAccelerationMod, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.WalkAngAccel, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.RunAngAccel, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1722146938, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1350763236, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)3375971933, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3611401160, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.Turn180ActivationAngle, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.Turn180ConsistentAngleTolerance, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.Turn, PsoDataType.Structure, 72, 0, (MetaName)150934045), + new PsoStructureEntryInfo(MetaName.PitchChangeRate, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchChangeRateAcceleration, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.OverwriteMaxPitch, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.AimIntroMaxAngleChangeRate, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.AimIntroMinPhaseChangeRate, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.AimIntroMaxPhaseChangeRate, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.AimIntroMaxTimedOutPhaseChangeRate, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerIdleIntroAnimRate, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingWalkAnimRateMin, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingWalkAnimRateMax, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingWalkAnimRateAcceleration, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.DoPostCameraClipUpdateForPlayer, PsoDataType.Bool, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableIkForAI, PsoDataType.Bool, 133, 0, 0), + new PsoStructureEntryInfo((MetaName)122800807, PsoDataType.Bool, 134, 0, 0), + new PsoStructureEntryInfo((MetaName)259313148, PsoDataType.Bool, 135, 0, 0), + new PsoStructureEntryInfo((MetaName)2900191858, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)827074596, PsoDataType.Bool, 140, 0, 0) + ); + case (MetaName)150934045: + return new PsoStructureInfo((MetaName)150934045, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MaxVariationForCurrentPitch, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVariationForDesiredPitch, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.CTaskBirdLocomotion__Tunables: + return new PsoStructureInfo(MetaName.CTaskBirdLocomotion__Tunables, 0, 0, 136, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinWaitTimeBetweenTakeOffsMS, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWaitTimeBetweenTakeOffsMS, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTakeOffRate, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTakeOffRate, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTakeOffHeadingChangeRate, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTakeOffHeadingChangeRate, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2759154614, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToFlapMin, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToFlapMax, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1388183900, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceNoTimeslicingHeadingDiff, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceFromPlayerToDeleteStuckBird, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeUntilDeletionWhenStuckOffscreen, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeWhenStuckToIgnoreBird, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.HighLodWalkHeadingLerpRate, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.LowLodWalkHeadingLerpRate, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)325409255, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)2032071225, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)171073592, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)2122727094, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)578605354, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)961953658, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)291845288, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)1918070033, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)677105748, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)2691956573, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)27278755, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)2575647854, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)3370383430, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)951644869, PsoDataType.String, 132, 7, 0) + ); + case MetaName.CTaskMotionSwimming__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionSwimming__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinStruggleTime, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStruggleTime, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4258712195), + new PsoStructureEntryInfo(MetaName.ScubaGearVariations, PsoDataType.Array, 24, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.fCargoFuel), + new PsoStructureEntryInfo(MetaName.ScubaMaskProps, PsoDataType.Array, 40, 0, (MetaName)5) + ); + case (MetaName)4258712195: + return new PsoStructureInfo((MetaName)4258712195, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3020467458), + new PsoStructureEntryInfo(MetaName.Variations, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case (MetaName)3020467458: + return new PsoStructureInfo((MetaName)3020467458, 0, 0, 72, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2469984956), + new PsoStructureEntryInfo(MetaName.Wearing, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ScubaGearWithLightsOn, PsoDataType.Structure, 24, 0, (MetaName)2354064210), + new PsoStructureEntryInfo(MetaName.ScubaGearWithLightsOff, PsoDataType.Structure, 48, 0, (MetaName)2354064210) + ); + case (MetaName)2354064210: + return new PsoStructureInfo((MetaName)2354064210, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), + new PsoStructureEntryInfo(MetaName.DrawableId, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DrawableAltId, PsoDataType.UInt, 16, 0, 0) + ); + case (MetaName)2469984956: + return new PsoStructureInfo((MetaName)2469984956, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.DrawableIds, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case MetaName.fCargoFuel: + return new PsoStructureInfo(MetaName.fCargoFuel, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Index, PsoDataType.SInt, 12, 0, 0) + ); + case MetaName.CTaskMotionBasicLocomotionLowLod__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionBasicLocomotionLowLod__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateAcceleration, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceUpdatesWhenTurningStartThresholdRadians, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceUpdatesWhenTurningStopThresholdRadians, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CTaskFishLocomotion__Tunables: + return new PsoStructureInfo(MetaName.CTaskFishLocomotion__Tunables, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.StartTurnThresholdDegrees, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StopTurnThresholdDegrees, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTurnApproachRate, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealTurnApproachRate, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)190400066, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TurnAcceleration, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)2035076014, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchAcceleration, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2691956573, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1242076965, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)2945548240, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)3350282721, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.FishOutOfWaterDelay, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1246801857, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.AssistanceAngle, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraHeadingRate, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.SurfaceProbeHead, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.SurfaceProbeTail, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.SurfacePitchLerpRate, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.SurfaceHeightFallingLerpRate, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.SurfaceHeightRisingLerpRate, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.SurfaceHeightFollowingTriggerRange, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)2334883967, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)487169156, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)951644869, PsoDataType.String, 112, 7, 0), + new PsoStructureEntryInfo((MetaName)1984559896, PsoDataType.Float, 116, 0, 0) + ); + case MetaName.CTaskHumanLocomotion__Tunables: + return new PsoStructureInfo(MetaName.CTaskHumanLocomotion__Tunables, 0, 0, 864, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Player_MBRAcceleration, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Player_MBRDeceleration, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.AI_MBRAcceleration, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.AI_MBRDeceleration, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.FromStrafeAccelerationMod, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.FastWalkRateMin, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.FastWalkRateMax, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowRunRateMin, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowRunRateMax, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.FastRunRateMin, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.FastRunRateMax, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.Turn180ActivationAngle, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.Turn180ConsistentAngleTolerance, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.IdleHeadingLerpRate, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.Player_IdleTurnRate, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.AI_IdleTurnRate, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.FromStrafe_WeightRate, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.FromStrafe_MovingBlendOutTime, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.IdleTransitionBlendTimeFromActionMode, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.IdleTransitionBlendTimeFromStealth, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2557519583), + new PsoStructureEntryInfo(MetaName.MovingVarsSet, PsoDataType.Array, 96, 4, (MetaName)196629) + ); + case (MetaName)2557519583: + return new PsoStructureInfo((MetaName)2557519583, 0, 0, 256, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Standard, PsoDataType.Structure, 16, 0, (MetaName)1246324819), + new PsoStructureEntryInfo(MetaName.StandardAI, PsoDataType.Structure, 96, 0, (MetaName)1246324819), + new PsoStructureEntryInfo(MetaName.TighterTurn, PsoDataType.Structure, 176, 0, (MetaName)1246324819) + ); + case (MetaName)1246324819: + return new PsoStructureInfo((MetaName)1246324819, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingAngleMin, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingAngleMax, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateMin, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateMaxWalk, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateMaxRun, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateAccelerationMin, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingRateAccelerationMax, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingForwardAngleWalk, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingForwardAngleRun, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingForwardRateMod, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingDirectionSmoothingForwardRateAccelerationMod, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeAngleMin, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeAngleMax, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateWalk, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateRun, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateAccelerationMin, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingExtraHeadingChangeRateAccelerationMax, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.UseExtraHeading, PsoDataType.Bool, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.UseMovingDirectionDiff, PsoDataType.Bool, 77, 0, 0) + ); + case MetaName.CTaskMotionTennis__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionTennis__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.StrafeDirectionLerpRateMinAI, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StrafeDirectionLerpRateMaxAI, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.StrafeDirectionLerpRateMinPlayer, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.StrafeDirectionLerpRateMaxPlayer, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CTaskQuadLocomotion__Tunables: + return new PsoStructureInfo(MetaName.CTaskQuadLocomotion__Tunables, 0, 0, 184, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.StartAnimatedTurnsD, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StopAnimatedTurnsD, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TurnTransitionDelay, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.TurnToIdleTransitionDelay, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.SteepSlopeStartAnimatedTurnsD, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.SteepSlopeStopAnimatedTurnsD, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.SteepSlopeThresholdD, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.InMotionAlignmentVelocityTolerance, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.InMotionTighterTurnsVelocityTolerance, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.InPlaceAlignmentVelocityTolerance, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.TurnSpeedMBRThreshold, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowMinTurnApproachRate, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.FastMinTurnApproachRate, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowTurnApproachRate, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.FastTurnApproachRate, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowTurnAcceleration, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.FastTurnAcceleration, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.TurnResetThresholdD, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.ProcessPhysicsApproachRate, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableTimeslicingHeadingThresholdD, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.LowLodExtraHeadingAdjustmentRate, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.StartLocomotionBlendoutThreshold, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.StartLocomotionHeadingDeltaBlendoutThreshold, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.StartLocomotionDefaultBlendDuration, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.StartLocomotionDefaultBlendOutDuration, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.StartLocomotionEarlyOutBlendOutDuration, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.StartLocomotionWalkRunBoundary, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.StartToIdleDirectlyPhaseThreshold, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MovementAcceleration, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MinMBRToStop, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.PursuitModeGallopRateFactor, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.PursuitModeExtraHeadingRate, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.StoppingDistanceWalkMBR, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.StoppingDistanceRunMBR, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.StoppingDistanceGallopMBR, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.StoppingGotoPointRemainingDist, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.StopPhaseThreshold, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStopPhaseToResumeMovement, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStopPhaseToResumeMovement, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo((MetaName)951644869, PsoDataType.String, 172, 7, 0), + new PsoStructureEntryInfo((MetaName)3492404675, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo((MetaName)3330274310, PsoDataType.Float, 180, 0, 0) + ); + case MetaName.CEventPotentialBeWalkedInto__Tunables: + return new PsoStructureInfo(MetaName.CEventPotentialBeWalkedInto__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)3702961077, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3689187240, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1651660816, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CEventPotentialGetRunOver__Tunables: + return new PsoStructureInfo(MetaName.CEventPotentialGetRunOver__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToDive, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SpeedToAlwaysDive, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedToDive, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToDive, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)4246045187, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelay, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelay, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CEventPotentialBlast__Tunables: + return new PsoStructureInfo(MetaName.CEventPotentialBlast__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CTaskComplexEvasiveStep__Tunables: + return new PsoStructureInfo(MetaName.CTaskComplexEvasiveStep__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.BlendOutDelta, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskFall__Tunables: + return new PsoStructureInfo(MetaName.CTaskFall__Tunables, 0, 0, 176, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ImmediateHighFallSpeedPlayer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ImmediateHighFallSpeedAi, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.HighFallProbeLength, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1694135928, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ContinuousGapHighFallTime, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3844027585, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)3197570465, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)391736247, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2495576534, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.InAirHeadingRate, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.InAirMovementRate, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.InAirMovementApproachRate, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.LandHeadingModifier, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.StandingLandHeadingModifier, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.FallLandThreshold, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.ReenterFallLandThreshold, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.PadShakeMinIntensity, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.PadShakeMaxIntensity, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.PadShakeMinHeight, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.PadShakeMaxHeight, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.PadShakeMinDuration, PsoDataType.UInt, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.PadShakeMaxDuration, PsoDataType.UInt, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)2719065213, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)358840176, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.VaultFallTestAngle, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.JumpFallTestAngle, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.FallTestAngleBlendOutTime, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.DiveControlMaxFallDistance, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.DiveControlExtraDistanceForDiveFromVehicle, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.DiveControlExtraDistanceBlendOutSpeed, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.DiveWaterOffsetToHitFullyInControlWeight, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.LandRollHeightFromJump, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.LandRollHeightFromVault, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.LandRollHeight, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo((MetaName)4229439207, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo((MetaName)2581310221, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo((MetaName)3807299066, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo((MetaName)2776570354, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)4036569890, PsoDataType.Float, 168, 0, 0) + ); + case MetaName.CTaskFlyToPoint__Tunables: + return new PsoStructureInfo(MetaName.CTaskFlyToPoint__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.HeightMapDelta, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.HeightMapLookAheadDist, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialTerrainAvoidanceAngleD, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ProgressiveTerrainAvoidanceAngleD, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenIncreasingAvoidanceAngle, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.CTaskGetUp__Tunables: + return new PsoStructureInfo(MetaName.CTaskGetUp__Tunables, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fPreferInjuredGetupPlayerHealthThreshold, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fInjuredGetupImpulseMag2, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeInGetUpToAllowCover, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowNonPlayerHighFallAbort, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowOffScreenHighFallAbort, PsoDataType.Bool, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.FallTimeBeforeHighFallAbort, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFallSpeedForHighFallAbort, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)866980885, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerMoverFixupMaxExtraHeadingChange, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.AiMoverFixupMaxExtraHeadingChange, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.StartClipWaitTimePlayer, PsoDataType.SInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.StartClipWaitTime, PsoDataType.SInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.StuckWaitTime, PsoDataType.SInt, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.StuckWaitTimeMp, PsoDataType.SInt, 64, 0, 0) + ); + case MetaName.CTaskGoToScenario__Tunables: + return new PsoStructureInfo(MetaName.CTaskGoToScenario__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ClosePointDistanceSquared, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ClosePointCounterMax, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingDiffStartBlendDegrees, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.PositionDiffStartBlend, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ExactStopTargetRadius, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.PreferNearWaterSurfaceArrivalRadius, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenBrokenPointChecks, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CTaskMoveToTacticalPoint__Tunables: + return new PsoStructureInfo(MetaName.CTaskMoveToTacticalPoint__Tunables, 0, 0, 224, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Scoring, PsoDataType.Structure, 16, 0, (MetaName)2164459263), + new PsoStructureEntryInfo(MetaName.TargetRadiusForMoveToPosition, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeUntilRelease, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToConsiderCloseToPositionToMoveTo, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenInfluenceSphereChecks, PsoDataType.Float, 220, 0, 0) + ); + case (MetaName)2164459263: + return new PsoStructureInfo((MetaName)2164459263, 0, 0, 192, + new PsoStructureEntryInfo(MetaName.CoverPoint, PsoDataType.Structure, 8, 0, (MetaName)3018405043), + new PsoStructureEntryInfo(MetaName.NavMeshPoint, PsoDataType.Structure, 88, 0, (MetaName)1211016943), + new PsoStructureEntryInfo(MetaName.Position, PsoDataType.Structure, 160, 0, (MetaName)3791189200) + ); + case (MetaName)3018405043: + return new PsoStructureInfo((MetaName)3018405043, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Base, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Bonus, PsoDataType.Structure, 16, 0, (MetaName)1890577968), + new PsoStructureEntryInfo(MetaName.Penalty, PsoDataType.Structure, 32, 0, (MetaName)3436208238) + ); + case (MetaName)1890577968: + return new PsoStructureInfo((MetaName)1890577968, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Current, PsoDataType.Float, 8, 0, 0) + ); + case (MetaName)3436208238: + return new PsoStructureInfo((MetaName)3436208238, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.BadRoute, PsoDataType.Structure, 8, 0, (MetaName)532562236), + new PsoStructureEntryInfo(MetaName.Arc, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.LineOfSight, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.Nearby, PsoDataType.Float, 40, 0, 0) + ); + case (MetaName)532562236: + return new PsoStructureInfo((MetaName)532562236, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ValueForMin, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMax, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Min, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)1211016943: + return new PsoStructureInfo((MetaName)1211016943, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Base, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Bonus, PsoDataType.Structure, 16, 0, (MetaName)1762528765), + new PsoStructureEntryInfo(MetaName.Penalty, PsoDataType.Structure, 32, 0, (MetaName)2194913513) + ); + case (MetaName)1762528765: + return new PsoStructureInfo((MetaName)1762528765, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Current, PsoDataType.Float, 8, 0, 0) + ); + case (MetaName)2194913513: + return new PsoStructureInfo((MetaName)2194913513, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.BadRoute, PsoDataType.Structure, 8, 0, (MetaName)333617339), + new PsoStructureEntryInfo(MetaName.LineOfSight, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.Nearby, PsoDataType.Float, 36, 0, 0) + ); + case (MetaName)333617339: + return new PsoStructureInfo((MetaName)333617339, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ValueForMin, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMax, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Min, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)3791189200: + return new PsoStructureInfo((MetaName)3791189200, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MaxDistanceFromPed, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMaxDistanceFromPed, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMinDistanceFromPed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceFromOptimal, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMaxDistanceFromOptimal, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMinDistanceFromOptimal, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CTaskMoveCrossRoadAtTrafficLights__Tunables: + return new PsoStructureInfo(MetaName.CTaskMoveCrossRoadAtTrafficLights__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.bTrafficLightPositioning, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)645072887), + new PsoStructureEntryInfo(MetaName.WaitingOffsets, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo(MetaName.iMaxPedsAtTrafficLights, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceBetweenPeds, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fDecideToRunChance, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fPlayerObstructionCheckRadius, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.fPlayerObstructionRadius, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.bDebugRender, PsoDataType.Bool, 60, 0, 0) + ); + case (MetaName)645072887: + return new PsoStructureInfo((MetaName)645072887, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Pos, PsoDataType.Float3, 16, 0, 0) + ); + case MetaName.CTaskMoveWithinAttackWindow__Tunables: + return new PsoStructureInfo(MetaName.CTaskMoveWithinAttackWindow__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fMaxAngleOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinAlliesForMaxAngleOffset, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxAllyDistance, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxRandomAdditionalOffset, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxRouteDistanceModifier, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeToWait, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxTimeToWait, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CTaskMoveFollowNavMesh__Tunables: + return new PsoStructureInfo(MetaName.CTaskMoveFollowNavMesh__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.uRepeatedAttemptsBeforeTeleportToLeader, PsoDataType.UByte, 16, 0, 0) + ); + case MetaName.CTaskParachute__Tunables: + return new PsoStructureInfo(MetaName.CTaskParachute__Tunables, 0, 0, 1312, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ChangeRatesForSkydiving, PsoDataType.Structure, 16, 0, (MetaName)2342773550), + new PsoStructureEntryInfo(MetaName.ChangeRatesForParachuting, PsoDataType.Structure, 40, 0, (MetaName)1918103038), + new PsoStructureEntryInfo(MetaName.FlightAngleLimitsForSkydiving, PsoDataType.Structure, 64, 0, (MetaName)3788337195), + new PsoStructureEntryInfo(MetaName.FlightAngleLimitsForParachutingNormal, PsoDataType.Structure, 96, 0, (MetaName)4209854321), + new PsoStructureEntryInfo(MetaName.FlightAngleLimitsForParachutingBraking, PsoDataType.Structure, 144, 0, (MetaName)4209854321), + new PsoStructureEntryInfo(MetaName.PedAngleLimitsForSkydiving, PsoDataType.Structure, 192, 0, (MetaName)3009185102), + new PsoStructureEntryInfo(MetaName.MoveParameters, PsoDataType.Structure, 208, 0, (MetaName)560894723), + new PsoStructureEntryInfo(MetaName.ForcesForSkydiving, PsoDataType.Structure, 264, 0, (MetaName)2934924657), + new PsoStructureEntryInfo(MetaName.ParachutingAi, PsoDataType.Structure, 280, 0, (MetaName)2046463254), + new PsoStructureEntryInfo(MetaName.Landing, PsoDataType.Structure, 464, 0, (MetaName)2206940602), + new PsoStructureEntryInfo(MetaName.CrashLanding, PsoDataType.Structure, 552, 0, (MetaName)954219518), + new PsoStructureEntryInfo(MetaName.Allow, PsoDataType.Structure, 592, 0, (MetaName)202257215), + new PsoStructureEntryInfo(MetaName.CameraSettings, PsoDataType.Structure, 616, 0, (MetaName)892940524), + new PsoStructureEntryInfo(MetaName.ParachutePhysics, PsoDataType.Structure, 640, 0, (MetaName)3266862316), + new PsoStructureEntryInfo(MetaName.ExtraForces, PsoDataType.Structure, 656, 0, (MetaName)889782022), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 1008, 0, (MetaName)629460530), + new PsoStructureEntryInfo(MetaName.LowLod, PsoDataType.Structure, 1024, 0, (MetaName)196547756), + new PsoStructureEntryInfo(MetaName.ParachuteBones, PsoDataType.Structure, 1040, 0, (MetaName)1078023650), + new PsoStructureEntryInfo(MetaName.Aiming, PsoDataType.Structure, 1144, 0, (MetaName)2787675897), + new PsoStructureEntryInfo(MetaName.PadShake, PsoDataType.Structure, 1160, 0, (MetaName)947557087), + new PsoStructureEntryInfo(MetaName.BrakingDifferenceForLinearVZMin, PsoDataType.Float, 1216, 0, 0), + new PsoStructureEntryInfo(MetaName.BrakingDifferenceForLinearVZMax, PsoDataType.Float, 1220, 0, 0), + new PsoStructureEntryInfo(MetaName.LinearVZForBrakingDifferenceMin, PsoDataType.Float, 1224, 0, 0), + new PsoStructureEntryInfo(MetaName.LinearVZForBrakingDifferenceMax, PsoDataType.Float, 1228, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchRatioForLinearVZMin, PsoDataType.Float, 1232, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchRatioForLinearVZMax, PsoDataType.Float, 1236, 0, 0), + new PsoStructureEntryInfo(MetaName.LinearVZForPitchRatioMin, PsoDataType.Float, 1240, 0, 0), + new PsoStructureEntryInfo(MetaName.LinearVZForPitchRatioMax, PsoDataType.Float, 1244, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBrakeForCloseUpCamera, PsoDataType.Float, 1248, 0, 0), + new PsoStructureEntryInfo(MetaName.ParachuteMass, PsoDataType.Float, 1252, 0, 0), + new PsoStructureEntryInfo(MetaName.ParachuteMassReduced, PsoDataType.Float, 1256, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToLookAheadForFutureTargetPosition, PsoDataType.Float, 1260, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDifferenceToAverageBrakes, PsoDataType.Float, 1264, 0, 0), + new PsoStructureEntryInfo(MetaName.ModelForParachuteInSP, PsoDataType.String, 1268, 7, 0), + new PsoStructureEntryInfo(MetaName.ModelForParachuteInMP, PsoDataType.String, 1272, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)974228846), + new PsoStructureEntryInfo(MetaName.ParachutePackVariations, PsoDataType.Array, 1280, 0, (MetaName)36), + new PsoStructureEntryInfo(MetaName.FirstPersonDriveByIKOffset, PsoDataType.Float3, 1296, 0, 0) + ); + case (MetaName)2342773550: + return new PsoStructureInfo((MetaName)2342773550, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Pitch, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Roll, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Yaw, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Heading, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)1918103038: + return new PsoStructureInfo((MetaName)1918103038, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Pitch, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Roll, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Yaw, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Brake, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)3788337195: + return new PsoStructureInfo((MetaName)3788337195, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.InflectionPitch, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxYaw, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)4209854321: + return new PsoStructureInfo((MetaName)4209854321, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRollFromStick, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRollFromBrake, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRoll, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxYawFromStick, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxYawFromRoll, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.RollForMinYaw, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.RollForMaxYaw, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxYaw, PsoDataType.Float, 44, 0, 0) + ); + case (MetaName)3009185102: + return new PsoStructureInfo((MetaName)3009185102, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MinPitch, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitch, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)560894723: + return new PsoStructureInfo((MetaName)560894723, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Parachuting, PsoDataType.Structure, 8, 0, (MetaName)801836577) + ); + case (MetaName)801836577: + return new PsoStructureInfo((MetaName)801836577, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.InterpRates, PsoDataType.Structure, 8, 0, (MetaName)2238420428), + new PsoStructureEntryInfo(MetaName.MinParachutePitch, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxParachutePitch, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxParachuteRoll, PsoDataType.Float, 40, 0, 0) + ); + case (MetaName)2238420428: + return new PsoStructureInfo((MetaName)2238420428, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.StickX, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.StickY, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.TotalStickInput, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.CurrentHeading, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)2934924657: + return new PsoStructureInfo((MetaName)2934924657, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MaxThrust, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLift, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)2046463254: + return new PsoStructureInfo((MetaName)2046463254, 0, 0, 184, + new PsoStructureEntryInfo(MetaName.Target, PsoDataType.Structure, 8, 0, (MetaName)4228543633), + new PsoStructureEntryInfo(MetaName.Brake, PsoDataType.Structure, 24, 0, (MetaName)1021020250), + new PsoStructureEntryInfo(MetaName.RollForNormal, PsoDataType.Structure, 56, 0, (MetaName)1305267132), + new PsoStructureEntryInfo(MetaName.RollForBraking, PsoDataType.Structure, 80, 0, (MetaName)1305267132), + new PsoStructureEntryInfo(MetaName.PitchForNormal, PsoDataType.Structure, 104, 0, (MetaName)2131363216), + new PsoStructureEntryInfo(MetaName.PitchForBraking, PsoDataType.Structure, 128, 0, (MetaName)2131363216), + new PsoStructureEntryInfo(MetaName.Drop, PsoDataType.Structure, 152, 0, (MetaName)209420440) + ); + case (MetaName)4228543633: + return new PsoStructureInfo((MetaName)4228543633, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MinDistanceToAdjust, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Adjustment, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)1021020250: + return new PsoStructureInfo((MetaName)1021020250, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToStart, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceForFull, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleForMin, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleForMax, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)1305267132: + return new PsoStructureInfo((MetaName)1305267132, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.AngleDifferenceForMin, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleDifferenceForMax, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.StickValueForMin, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StickValueForMax, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)2131363216: + return new PsoStructureInfo((MetaName)2131363216, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.DesiredTimeToResolveAngleDifference, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.DeltaForMaxStickChange, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStickChangePerSecond, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)209420440: + return new PsoStructureInfo((MetaName)209420440, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MinDistance, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeight, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeight, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDot, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)2206940602: + return new PsoStructureInfo((MetaName)2206940602, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.NormalThresholds, PsoDataType.Structure, 8, 0, (MetaName)3954319942), + new PsoStructureEntryInfo(MetaName.MaxVelocityForSlow, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelocityForFast, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ParachuteProbeRadius, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinStickMagnitudeForEarlyOutMovement, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.FramesToLookAheadForProbe, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendDurationForEarlyOut, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.AngleForRunway, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.LookAheadForRunway, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.DropForRunway, PsoDataType.Float, 80, 0, 0) + ); + case (MetaName)3954319942: + return new PsoStructureInfo((MetaName)3954319942, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Normal, PsoDataType.Structure, 8, 0, (MetaName)1558938460), + new PsoStructureEntryInfo(MetaName.Braking, PsoDataType.Structure, 24, 0, (MetaName)1558938460) + ); + case (MetaName)1558938460: + return new PsoStructureInfo((MetaName)1558938460, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Forward, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Collision, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)954219518: + return new PsoStructureInfo((MetaName)954219518, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.NoParachuteTimeForMinCollisionNormalThreshold, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.NoParachuteMaxCollisionNormalThreshold, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.NoParachuteMinCollisionNormalThreshold, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.NoParachuteMaxPitch, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ParachuteProbeRadius, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ParachuteUpThreshold, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.FramesToLookAheadForProbe, PsoDataType.Float, 32, 0, 0) + ); + case (MetaName)202257215: + return new PsoStructureInfo((MetaName)202257215, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.MinClearDistanceBelow, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFallingSpeedInRagdoll, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInRagdoll, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)892940524: + return new PsoStructureInfo((MetaName)892940524, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.SkyDivingCamera, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ParachuteCamera, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.ParachuteCloseUpCamera, PsoDataType.String, 16, 7, 0) + ); + case (MetaName)3266862316: + return new PsoStructureInfo((MetaName)3266862316, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.ParachuteInitialVelocityY, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ParachuteInitialVelocityZ, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)889782022: + return new PsoStructureInfo((MetaName)889782022, 0, 0, 352, + new PsoStructureEntryInfo(MetaName.Parachuting, PsoDataType.Structure, 8, 0, (MetaName)1386112053) + ); + case (MetaName)1386112053: + return new PsoStructureInfo((MetaName)1386112053, 0, 0, 344, + new PsoStructureEntryInfo(MetaName.Normal, PsoDataType.Structure, 8, 0, (MetaName)899207522), + new PsoStructureEntryInfo(MetaName.Braking, PsoDataType.Structure, 224, 0, (MetaName)3310740500) + ); + case (MetaName)899207522: + return new PsoStructureInfo((MetaName)899207522, 0, 0, 216, + new PsoStructureEntryInfo(MetaName.TurnFromStick, PsoDataType.Structure, 8, 0, (MetaName)3387028743), + new PsoStructureEntryInfo(MetaName.TurnFromRoll, PsoDataType.Structure, 120, 0, (MetaName)3597070589) + ); + case (MetaName)3387028743: + return new PsoStructureInfo((MetaName)3387028743, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.FromValue, PsoDataType.Structure, 8, 0, (MetaName)3597070589), + new PsoStructureEntryInfo(MetaName.UseVerticalAxis, PsoDataType.Bool, 104, 0, 0) + ); + case (MetaName)3597070589: + return new PsoStructureInfo((MetaName)3597070589, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.ValueForMin, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMax, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinValue, PsoDataType.Structure, 16, 0, (MetaName)162458425), + new PsoStructureEntryInfo(MetaName.ZeroValue, PsoDataType.Structure, 40, 0, (MetaName)162458425), + new PsoStructureEntryInfo(MetaName.MaxValue, PsoDataType.Structure, 64, 0, (MetaName)162458425), + new PsoStructureEntryInfo(MetaName.IsLocal, PsoDataType.Bool, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.ClearZ, PsoDataType.Bool, 89, 0, 0) + ); + case (MetaName)162458425: + return new PsoStructureInfo((MetaName)162458425, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)3310740500: + return new PsoStructureInfo((MetaName)3310740500, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.TurnFromStick, PsoDataType.Structure, 8, 0, (MetaName)3387028743) + ); + case (MetaName)629460530: + return new PsoStructureInfo((MetaName)629460530, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.RunwayProbes, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.ValidityProbes, PsoDataType.Bool, 10, 0, 0) + ); + case (MetaName)196547756: + return new PsoStructureInfo((MetaName)196547756, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MinDistance, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.AlwaysUse, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.NeverUse, PsoDataType.Bool, 13, 0, 0) + ); + case (MetaName)1078023650: + return new PsoStructureInfo((MetaName)1078023650, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.LeftGrip, PsoDataType.Structure, 8, 0, (MetaName)2874150626), + new PsoStructureEntryInfo(MetaName.RightGrip, PsoDataType.Structure, 32, 0, (MetaName)2874150626), + new PsoStructureEntryInfo(MetaName.LeftWire, PsoDataType.Structure, 56, 0, (MetaName)2874150626), + new PsoStructureEntryInfo(MetaName.RightWire, PsoDataType.Structure, 80, 0, (MetaName)2874150626) + ); + case (MetaName)2874150626: + return new PsoStructureInfo((MetaName)2874150626, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.X, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Y, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Z, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.UseOrientationFromParachuteBone, PsoDataType.Bool, 20, 0, 0) + ); + case (MetaName)2787675897: + return new PsoStructureInfo((MetaName)2787675897, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Disabled, PsoDataType.Bool, 8, 0, 0) + ); + case (MetaName)947557087: + return new PsoStructureInfo((MetaName)947557087, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Falling, PsoDataType.Structure, 8, 0, (MetaName)3452040071), + new PsoStructureEntryInfo(MetaName.Deploy, PsoDataType.Structure, 40, 0, (MetaName)2930279050) + ); + case (MetaName)3452040071: + return new PsoStructureInfo((MetaName)3452040071, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchForMinIntensity, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchForMaxIntensity, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinIntensity, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxIntensity, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)2930279050: + return new PsoStructureInfo((MetaName)2930279050, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Intensity, PsoDataType.Float, 12, 0, 0) + ); + case (MetaName)974228846: + return new PsoStructureInfo((MetaName)974228846, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1192596872), + new PsoStructureEntryInfo(MetaName.Variations, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case (MetaName)1192596872: + return new PsoStructureInfo((MetaName)1192596872, 0, 0, 48, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3788247444), + new PsoStructureEntryInfo(MetaName.Wearing, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ParachutePack, PsoDataType.Structure, 24, 0, (MetaName)3901274641) + ); + case (MetaName)3901274641: + return new PsoStructureInfo((MetaName)3901274641, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), + new PsoStructureEntryInfo(MetaName.DrawableId, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DrawableAltId, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TexId, PsoDataType.UInt, 20, 0, 0) + ); + case (MetaName)3788247444: + return new PsoStructureInfo((MetaName)3788247444, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 8, 0, MetaName.ePedVarComp), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.DrawableIds, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case MetaName.CTaskParachuteObject__Tunables: + return new PsoStructureInfo(MetaName.CTaskParachuteObject__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.PhaseDuringDeployToConsiderOut, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskTakeOffPedVariation__Tunables: + return new PsoStructureInfo(MetaName.CTaskTakeOffPedVariation__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CTaskHeliPassengerRappel__Tunables: + return new PsoStructureInfo(MetaName.CTaskHeliPassengerRappel__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fDefaultRopeLength, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fExtraRopeLength, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fExitDescendRate, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fDefaultDescendRate, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fStartDescendingDistToTargetSq, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fRopeUnwindRate, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinHeightToRappel, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxHeliSpeedForRappel, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.CTaskRappel__Tunables: + return new PsoStructureInfo(MetaName.CTaskRappel__Tunables, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fJumpDescendRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fLongJumpDescendRate, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fJumpToSmashWindowPhaseChange, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinJumpPhaseAllowDescend, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxJumpPhaseAllowDescend, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinJumpPhaseAllowSmashWindow, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxJumpPhaseAllowSmashWindow, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinSmashWindowPhase, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fGlassBreakRadius, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fGlassDamage, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinDistanceToBreakWindow, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinStickValueAllowDescend, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.bAllowSmashDuringJump, PsoDataType.Bool, 64, 0, 0) + ); + case MetaName.CTaskVault__Tunables: + return new PsoStructureInfo(MetaName.CTaskVault__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AngledClimbTheshold, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAngleForScaleVelocityExtension, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleForScaleVelocityExtension, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.AngledClimbScaleVelocityExtensionMax, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableVaultForwardDot, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.SlideWalkAnimRate, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.CTaskJump__Tunables: + return new PsoStructureInfo(MetaName.CTaskJump__Tunables, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinSuperJumpInitialVelocity, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSuperJumpInitialVelocity, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)3568425813, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)1477129396, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.HighJumpMinAngleForVelScale, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.HighJumpMaxAngleForVelScale, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.HighJumpMinVelScale, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.HighJumpMaxVelScale, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableJumpOnSteepStairs, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStairsJumpAngle, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.bEnableJumpCollisions, PsoDataType.Bool, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.bEnableJumpCollisionsMp, PsoDataType.Bool, 57, 0, 0), + new PsoStructureEntryInfo(MetaName.bBlockJumpCollisionAgainstRagdollBlocked, PsoDataType.Bool, 58, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveProbeZOffset, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveBraceStartDelay, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveBraceProbeLength, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveBraceBlendInDuration, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveBraceBlendOutDuration, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveBraceMaxUpDotSlope, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveRagdollIntersectionDot, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveRagdollStartDelay, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveRagdollProbeLength, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveRagdollProbeRadius, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.PredictiveRagdollRequiredVelocityMag, PsoDataType.Float, 100, 0, 0) + ); + case MetaName.CPedTargetEvaluator__Tunables: + return new PsoStructureInfo(MetaName.CPedTargetEvaluator__Tunables, 0, 0, 232, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitMelee, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitMeleeLockOnNoStick, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetDistanceWeightMelee, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2485794835, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetDistanceWeightMeleeRunning, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)2082223604, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetHeadingWeightMelee, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3532059041, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetHeadingWeightMeleeRunning, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)1974328161, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitVehicleWeapon, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MeleeLockOnStickWeighting, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MeleeLockOnCameraWeighting, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MeleeLockOnCameraWeightingNoStick, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MeleeLockOnPedWeightingNoStick, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioHarmless, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioNeutral, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioNeutralInjured, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioIngangOrFriend, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioPotentialThreat, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioMissionThreat, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioMissionThreatCuffed, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.DownedThreatModifier, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioPlayer2PlayerEveryone, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioPlayer2PlayerStrangers, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioPlayer2PlayerAttackers, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioPlayer2Player, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioPlayer2PlayerCuffed, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioScriptedHighPriority, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioMeleeDead, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioMeleeCombatThreat, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioMeleeDownedCombatThreat, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioMeleeInjured, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.PrioMeleePotentialThreat, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.InCoverScoreModifier, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.ClosestPointToLineDist, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.ClosestPointToLineBonusModifier, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.MeleeHeadingOverride, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.MeleeHeadingOverrideRunning, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.MeleeHeadingFalloffPowerRunning, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultMeleeRange, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetDistanceWeightingMin, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetDistanceWeightingMax, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetHeadingWeighting, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetDistanceMaxWeightingAimTime, PsoDataType.UInt, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetDistanceFallOffMin, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetDistanceFallOffMax, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.RejectLockonHeadingTheshold, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingScoreForCoverLockOnRejection, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo((MetaName)680689338, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeForTakedownTargetAcquiry, PsoDataType.UInt, 216, 0, 0), + new PsoStructureEntryInfo((MetaName)3508597107, PsoDataType.UInt, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.UseMeleeHeadingOverride, PsoDataType.Bool, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.LimitMeleeRangeToDefault, PsoDataType.Bool, 225, 0, 0), + new PsoStructureEntryInfo(MetaName.DebugTargetting, PsoDataType.Bool, 226, 0, 0), + new PsoStructureEntryInfo(MetaName.UseNonNormalisedScoringForPlayer, PsoDataType.Bool, 227, 0, 0), + new PsoStructureEntryInfo(MetaName.RejectLockIfBestTargetIsInCover, PsoDataType.Bool, 228, 0, 0) + ); + case MetaName.CGrabHelper__Tunables: + return new PsoStructureInfo(MetaName.CGrabHelper__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Sets, PsoDataType.Structure, 16, 0, (MetaName)2070432509) + ); + case (MetaName)2070432509: + return new PsoStructureInfo((MetaName)2070432509, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.sets, PsoDataType.Map, 8, 1, (MetaName)1) + ); + case MetaName.CNmTuningSet: + return new PsoStructureInfo(MetaName.CNmTuningSet, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Id, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Priority, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.Messages, PsoDataType.Array, 24, 0, (MetaName)3) + ); + case MetaName.CNmMessage: + return new PsoStructureInfo(MetaName.CNmMessage, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.Params, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.ForceNewMessage, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TaskMessage, PsoDataType.Bool, 33, 0, 0) + ); + case MetaName.CNmParameterBool: + return new PsoStructureInfo(MetaName.CNmParameterBool, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.Bool, 16, 0, 0) + ); + case MetaName.CNmParameterFloat: + return new PsoStructureInfo(MetaName.CNmParameterFloat, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CNmParameterRandomFloat: + return new PsoStructureInfo(MetaName.CNmParameterRandomFloat, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Min, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CNmParameterInt: + return new PsoStructureInfo(MetaName.CNmParameterInt, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.SInt, 16, 0, 0) + ); + case MetaName.CTaskNMControl__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMControl__Tunables, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DriveToGetup, PsoDataType.Structure, 16, 0, (MetaName)3336326859), + new PsoStructureEntryInfo(MetaName.OnEnableDriveToGetup, PsoDataType.Structure, 48, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnDisableDriveToGetup, PsoDataType.Structure, 88, 0, MetaName.CNmTuningSet) + ); + case (MetaName)3336326859: + return new PsoStructureInfo((MetaName)3336326859, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.AllowDriveToGetup, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.OnlyAllowForShot, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowWhenBalanced, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHealth, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxUprightRatio, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MatchTimer, PsoDataType.UInt, 24, 0, 0) + ); + case MetaName.CNmParameterString: + return new PsoStructureInfo(MetaName.CNmParameterString, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.String, 16, 8, 0) + ); + case MetaName.CTaskNMBehaviour__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMBehaviour__Tunables, 0, 0, 936, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.EnableRagdollPooling, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxGameplayNmAgents, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRageRagdolls, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ReserveLocalPlayerNmAgent, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableRagdollPoolingMp, PsoDataType.Bool, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxGameplayNmAgentsMp, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRageRagdollsMp, PsoDataType.SInt, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ReserveLocalPlayerNmAgentMp, PsoDataType.Bool, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.BlockOffscreenShotReactions, PsoDataType.Bool, 41, 0, 0), + new PsoStructureEntryInfo(MetaName.UsePreEmptiveEdgeActivation, PsoDataType.Bool, 42, 0, 0), + new PsoStructureEntryInfo(MetaName.UsePreEmptiveEdgeActivationMp, PsoDataType.Bool, 43, 0, 0), + new PsoStructureEntryInfo(MetaName.UseBalanceForEdgeActivation, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMaxVel, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMaxHeadingDiff, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMinDotVel, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMaxDistance, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.PreEmptiveEdgeActivationMinDesiredMBR2, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.StandardBlendOutThresholds, PsoDataType.Structure, 72, 0, (MetaName)3979439077), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4115910995), + new PsoStructureEntryInfo(MetaName.CamAttachPositionWeights, PsoDataType.Array, 176, 0, (MetaName)MetaTypeName.USHORT), + new PsoStructureEntryInfo(MetaName.SpActivationModifiers, PsoDataType.Structure, 192, 0, (MetaName)2720813484), + new PsoStructureEntryInfo(MetaName.MpActivationModifiers, PsoDataType.Structure, 272, 0, (MetaName)2720813484), + new PsoStructureEntryInfo(MetaName.PlayerBumpedByCloneCarActivationModifier, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo(MetaName.ClonePlayerBumpedByCarActivationModifier, PsoDataType.Float, 356, 0, 0), + //new PsoStructureEntryInfo(MetaName.ClonePlayerBumpedByCloneCarActivationModifier, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo((MetaName)2048881690, PsoDataType.Float, 360, 0, 0), //seems to be newer than above.. + new PsoStructureEntryInfo(MetaName.MaxVehicleCapsulePushTimeForRagdollActivation, PsoDataType.Float, 364, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVehicleCapsulePushTimeForPlayerRagdollActivation, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForContinuousPushActivation, PsoDataType.Float, 372, 0, 0), + new PsoStructureEntryInfo(MetaName.MinContactDepthForContinuousPushActivation, PsoDataType.Float, 376, 0, 0), + new PsoStructureEntryInfo(MetaName.DurationRampDownCapsulePushedByVehicle, PsoDataType.Float, 380, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForAiActivation, PsoDataType.Float, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForStationaryAiActivation, PsoDataType.Float, 388, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForPlayerActivation, PsoDataType.Float, 392, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForStationaryPlayerActivation, PsoDataType.Float, 396, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleMinSpeedForWarningActivation, PsoDataType.Float, 400, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleFallingSpeedWeight, PsoDataType.Float, 404, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierDefault, PsoDataType.Float, 408, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierBicycle, PsoDataType.Float, 412, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierBike, PsoDataType.Float, 416, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierBoat, PsoDataType.Float, 420, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierPlane, PsoDataType.Float, 424, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierQuadBike, PsoDataType.Float, 428, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierHeli, PsoDataType.Float, 432, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleActivationForceMultiplierTrain, PsoDataType.Float, 436, 0, 0), + new PsoStructureEntryInfo(MetaName.ExcludePedBumpAngleFromPushCalculation, PsoDataType.Bool, 440, 0, 0), + new PsoStructureEntryInfo(MetaName.PedActivationForceMultiplier, PsoDataType.Float, 444, 0, 0), + new PsoStructureEntryInfo(MetaName.ObjectMinSpeedForActivation, PsoDataType.Float, 448, 0, 0), + new PsoStructureEntryInfo(MetaName.ObjectActivationForceMultiplier, PsoDataType.Float, 452, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPlayerCapsulePushTimeForRagdollActivation, PsoDataType.SInt, 456, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerCapsuleMinSpeedForContinuousPushActivation, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo(MetaName.StuckOnVehicleMaxTime, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo(MetaName.StuckOnVehicleBlendOutThresholds, PsoDataType.Structure, 472, 0, (MetaName)3979439077), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 576, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.TeeterControl, PsoDataType.Structure, 616, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.animPoseDefault, PsoDataType.Structure, 656, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.animPoseAttachDefault, PsoDataType.Structure, 696, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.animPoseAttachToVehicle, PsoDataType.Structure, 736, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.animPoseHandsCuffed, PsoDataType.Structure, 776, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.forceFall, PsoDataType.Structure, 816, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.RagdollUnderWheelTuning, PsoDataType.Structure, 856, 0, (MetaName)267001783), + new PsoStructureEntryInfo(MetaName.KickOnGroundTuning, PsoDataType.Structure, 880, 0, (MetaName)2578171686), + new PsoStructureEntryInfo(MetaName.CapsuleVehicleHitTuning, PsoDataType.Structure, 896, 0, (MetaName)1040069698) + ); + case (MetaName)3979439077: + return new PsoStructureInfo((MetaName)3979439077, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.Ai, PsoDataType.Structure, 8, 0, (MetaName)3749122641), + new PsoStructureEntryInfo(MetaName.Player, PsoDataType.Structure, 40, 0, (MetaName)3749122641), + new PsoStructureEntryInfo(MetaName.PlayerMp, PsoDataType.Structure, 72, 0, (MetaName)3749122641) + ); + case (MetaName)3749122641: + return new PsoStructureInfo((MetaName)3749122641, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.MaxLinearVelocity, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularVelocity, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.SettledTimeMS, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.RandomiseSettledTime, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SettledTimeMinMS, PsoDataType.SInt, 24, 0, 0) + ); + case (MetaName)2720813484: + return new PsoStructureInfo((MetaName)2720813484, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.BumpedByCar, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByCarFriendly, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerBumpedByCar, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVehicleWarning, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByPedMinVel, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByPedMinDotVel, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByPed, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByPlayerRagdoll, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByPedRagdoll, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByPedFriendly, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByPedIsQuadruped, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BumpedByObject, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.Walking, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.Running, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.Sprinting, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPlayerActivationLimit, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAiActivationLimit, PsoDataType.Float, 72, 0, 0) + ); + case (MetaName)267001783: + return new PsoStructureInfo((MetaName)267001783, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.fImpulseMultLimbs, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fImpulseMultSpine, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinSpeedForPush, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fFastCarPushImpulseMult, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)2578171686: + return new PsoStructureInfo((MetaName)2578171686, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.fPronePedKickImpulse, PsoDataType.Float, 8, 0, 0) + ); + case (MetaName)1040069698: + return new PsoStructureInfo((MetaName)1040069698, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.EnableActivationsFromCapsuleImpacts, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleVelToImpactNormalMinDot, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableSideSwipeActivations, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2302810051, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSideNormalForSideSwipe, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelThroughNormalForSideSwipe, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAccumulatedImpactForSideSwipe, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVehVelMagForSideSwipe, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVehVelMagForBicycleSideSwipe, PsoDataType.Float, 36, 0, 0) + ); + case (MetaName)4115910995: + return new PsoStructureInfo((MetaName)4115910995, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Bound, PsoDataType.Enum, 8, 0, (MetaName)3509057257), + new PsoStructureEntryInfo(MetaName.Weight, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.CTaskNMBalance__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMBalance__Tunables, 0, 0, 912, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.InitialBumpComponent, PsoDataType.Enum, 16, 0, (MetaName)3509057257), + new PsoStructureEntryInfo(MetaName.InitialBumpForce, PsoDataType.Structure, 24, 0, (MetaName)760338219), + new PsoStructureEntryInfo(MetaName.InitialBumpOffset, PsoDataType.Float3, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleStayUprightWithVel, PsoDataType.Bool, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.StayUprightAtMaxVel, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVel, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.StayUprightAtMinVel, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVel, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.lookAtVelProbIfNoBumpTarget, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxTargetDistToUpdateFlinch, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxTargetDistToUpdateFlinchOnGround, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.fFlinchTargetZOffset, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.fFlinchTargetZOffsetOnGround, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinForwardVectorToFlinch, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinForwardVectorToFlinchOnGround, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.fHeadLookZOffset, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.fHeadLookZOffsetOnGround, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSteps, PsoDataType.SInt, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.timeToCatchfallMS, PsoDataType.SInt, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.StartWeak, PsoDataType.Structure, 176, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StartAggressive, PsoDataType.Structure, 216, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StartDefault, PsoDataType.Structure, 256, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.BumpedByPed, PsoDataType.Structure, 296, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnStairs, PsoDataType.Structure, 336, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnSteepSlope, PsoDataType.Structure, 376, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnMovingGround, PsoDataType.Structure, 416, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.LostBalanceAndGrabbing, PsoDataType.Structure, 456, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Teeter, PsoDataType.Structure, 496, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.FallOffAMovingCar, PsoDataType.Structure, 536, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.RollingFall, PsoDataType.Structure, 576, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.CatchFall, PsoDataType.Structure, 616, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 656, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.NotBeingPushedDelayMS, PsoDataType.SInt, 696, 0, 0), + new PsoStructureEntryInfo(MetaName.NotBeingPushedOnGroundDelayMS, PsoDataType.SInt, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.BeingPushedOnGroundTooLongMS, PsoDataType.SInt, 704, 0, 0), + new PsoStructureEntryInfo(MetaName.OnBeingPushed, PsoDataType.Structure, 712, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBeingPushedOnGround, PsoDataType.Structure, 752, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnNotBeingPushed, PsoDataType.Structure, 792, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBeingPushedOnGroundTooLong, PsoDataType.Structure, 832, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.PushedThresholdOnGround, PsoDataType.Structure, 872, 0, (MetaName)3749122641) + ); + case (MetaName)760338219: + return new PsoStructureInfo((MetaName)760338219, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Enable, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Mag, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleWithVelocity, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityMin, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityMax, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceAtMinVelocity, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceAtMaxVelocity, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ClampImpulse, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinImpulse, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxImpulse, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.Delay, PsoDataType.SInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.SInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleWithUpright, PsoDataType.Bool, 56, 0, 0) + ); + case MetaName.CNmParameterVector: + return new PsoStructureInfo(MetaName.CNmParameterVector, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.Float3, 16, 0, 0) + ); + case MetaName.CTaskNMBrace__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMBrace__Tunables, 0, 0, 1568, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.VehicleOverrides, PsoDataType.Structure, 16, 0, (MetaName)2216090795), + new PsoStructureEntryInfo(MetaName.InverseMassScales, PsoDataType.Structure, 40, 0, (MetaName)1267291753), + new PsoStructureEntryInfo(MetaName.AngularVelocityLimits, PsoDataType.Structure, 64, 0, (MetaName)238499603), + new PsoStructureEntryInfo(MetaName.InitialForce, PsoDataType.Structure, 144, 0, (MetaName)2808943365), + new PsoStructureEntryInfo(MetaName.ChestForce, PsoDataType.Structure, 176, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.FeetLiftForce, PsoDataType.Structure, 232, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.RootLiftForce, PsoDataType.Structure, 288, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.FlipForce, PsoDataType.Structure, 344, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.CapsuleHitForce, PsoDataType.Structure, 400, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.SideSwipeForce, PsoDataType.Structure, 456, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.ForceUnderVehicle, PsoDataType.Bool, 512, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceOverVehicle, PsoDataType.Bool, 513, 0, 0), + new PsoStructureEntryInfo(MetaName.ChestForcePitch, PsoDataType.Float, 516, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowWarningActivations, PsoDataType.Bool, 520, 0, 0), + new PsoStructureEntryInfo(MetaName.LowVelocityReactionThreshold, PsoDataType.Float, 524, 0, 0), + new PsoStructureEntryInfo(MetaName.FallingSpeedForHighFall, PsoDataType.Float, 528, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleCollisionElasticityMult, PsoDataType.Float, 532, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleCollisionFrictionMult, PsoDataType.Float, 536, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleCollisionNormalPitchOverVehicle, PsoDataType.Float, 540, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleCollisionNormalPitchUnderVehicle, PsoDataType.Float, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.AiClearedVehicleDelay, PsoDataType.SInt, 548, 0, 0), + new PsoStructureEntryInfo(MetaName.AiClearedVehicleSmartFallDelay, PsoDataType.SInt, 552, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerClearedVehicleDelay, PsoDataType.SInt, 556, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerClearedVehicleSmartFallDelay, PsoDataType.SInt, 560, 0, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 568, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnStairs, PsoDataType.Structure, 608, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Weak, PsoDataType.Structure, 648, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 688, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailedStairs, PsoDataType.Structure, 728, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HighVelocity, PsoDataType.Structure, 768, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StuckUnderVehicleMaxUpright, PsoDataType.Float, 808, 0, 0), + new PsoStructureEntryInfo(MetaName.StuckOnVehicle, PsoDataType.Structure, 816, 0, (MetaName)1649426998), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 1256, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Dead, PsoDataType.Structure, 1296, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OverVehicle, PsoDataType.Structure, 1336, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.UnderVehicle, PsoDataType.Structure, 1376, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.ClearedVehicle, PsoDataType.Structure, 1416, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HighVelocityBlendOut, PsoDataType.Structure, 1456, 0, (MetaName)3979439077) + ); + case (MetaName)2216090795: + return new PsoStructureInfo((MetaName)2216090795, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1768633733), + new PsoStructureEntryInfo(MetaName.sets, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)1267291753: + return new PsoStructureInfo((MetaName)1267291753, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ApplyVehicleScale, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleScale, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ApplyPedScale, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.PedScale, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)238499603: + return new PsoStructureInfo((MetaName)238499603, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Apply, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Constant, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Velocity, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.Velocity2, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.Delay, PsoDataType.SInt, 68, 0, 0) + ); + case (MetaName)2808943365: + return new PsoStructureInfo((MetaName)2808943365, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.VelocityMin, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityMax, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceAtMinVelocity, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceAtMaxVelocity, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleWithUpright, PsoDataType.Bool, 24, 0, 0) + ); + case (MetaName)3816043274: + return new PsoStructureInfo((MetaName)3816043274, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Apply, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleWithVelocity, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelThreshold, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVelThreshold, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelMag, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVelMag, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleWithUpright, PsoDataType.Bool, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleWithMass, PsoDataType.Bool, 29, 0, 0), + new PsoStructureEntryInfo(MetaName.ReduceWithPedVelocity, PsoDataType.Bool, 30, 0, 0), + new PsoStructureEntryInfo(MetaName.ReduceWithPedAngularVelocity, PsoDataType.Bool, 31, 0, 0), + new PsoStructureEntryInfo(MetaName.OnlyInContact, PsoDataType.Bool, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.OnlyNotInContact, PsoDataType.Bool, 33, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceMag, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinMag, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxMag, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.SInt, 48, 0, 0) + ); + case (MetaName)1649426998: + return new PsoStructureInfo((MetaName)1649426998, 0, 0, 440, + new PsoStructureEntryInfo(MetaName.InitialDelay, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.UnderVehicleInitialDelay, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityThreshold, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ContinuousContactTime, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.UnderVehicleVelocityThreshold, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.UnderVehicleContinuousContactTime, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.UnderCarMaxVelocity, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.StuckOnVehicle, PsoDataType.Structure, 40, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.EndStuckOnVehicle, PsoDataType.Structure, 80, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.UpdateOnVehicle, PsoDataType.Structure, 120, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StuckUnderVehicle, PsoDataType.Structure, 160, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.EndStuckUnderVehicle, PsoDataType.Structure, 200, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StuckOnVehiclePlayer, PsoDataType.Structure, 240, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.EndStuckOnVehiclePlayer, PsoDataType.Structure, 280, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.UpdateOnVehiclePlayer, PsoDataType.Structure, 320, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StuckUnderVehiclePlayer, PsoDataType.Structure, 360, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.EndStuckUnderVehiclePlayer, PsoDataType.Structure, 400, 0, MetaName.CNmTuningSet) + ); + case (MetaName)1768633733: + return new PsoStructureInfo((MetaName)1768633733, 0, 0, 736, + new PsoStructureEntryInfo(MetaName.Id, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.OverrideInverseMassScales, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.InverseMassScales, PsoDataType.Structure, 16, 0, (MetaName)1267291753), + new PsoStructureEntryInfo(MetaName.OverrideReactionType, PsoDataType.Bool, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceUnderVehicle, PsoDataType.Bool, 41, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceOverVehicle, PsoDataType.Bool, 42, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleCentreZOffset, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.OverrideRootLiftForce, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.RootLiftForce, PsoDataType.Structure, 56, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.OverrideFlipForce, PsoDataType.Bool, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.FlipForce, PsoDataType.Structure, 120, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.OverrideInitialForce, PsoDataType.Bool, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialForce, PsoDataType.Structure, 184, 0, (MetaName)2808943365), + new PsoStructureEntryInfo(MetaName.OverrideElasticity, PsoDataType.Bool, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleCollisionElasticityMult, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.OverrideFriction, PsoDataType.Bool, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleCollisionFrictionMult, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.LateralForce, PsoDataType.Structure, 232, 0, (MetaName)3816043274), + new PsoStructureEntryInfo(MetaName.OverrideStuckOnVehicleSets, PsoDataType.Bool, 288, 0, 0), + new PsoStructureEntryInfo(MetaName.AddToBaseStuckOnVehicleSets, PsoDataType.Bool, 289, 0, 0), + new PsoStructureEntryInfo(MetaName.StuckOnVehicle, PsoDataType.Structure, 296, 0, (MetaName)1649426998) + ); + case MetaName.CNmParameterResetMessage: + return new PsoStructureInfo(MetaName.CNmParameterResetMessage, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0) + ); + case MetaName.CTaskNMDraggingToSafety__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMDraggingToSafety__Tunables, 0, 0, 160, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Stiffness, PsoDataType.Structure, 16, 0, (MetaName)2241487041), + new PsoStructureEntryInfo(MetaName.DraggerArmIk, PsoDataType.Structure, 48, 0, (MetaName)1214269741), + new PsoStructureEntryInfo(MetaName.Constraints, PsoDataType.Structure, 96, 0, (MetaName)2410537644), + new PsoStructureEntryInfo(MetaName.Forces, PsoDataType.Structure, 112, 0, (MetaName)2059054874) + ); + case (MetaName)2241487041: + return new PsoStructureInfo((MetaName)2241487041, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Relaxation, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadAndNeck, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.AnkleAndWrist, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)1214269741: + return new PsoStructureInfo((MetaName)1214269741, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftBoneOffset, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.RightBoneOffset, PsoDataType.Float3, 32, 0, 0) + ); + case (MetaName)2410537644: + return new PsoStructureInfo((MetaName)2410537644, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 8, 0, 0) + ); + case (MetaName)2059054874: + return new PsoStructureInfo((MetaName)2059054874, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftHandOffset, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.RightHandOffset, PsoDataType.Float3, 32, 0, 0) + ); + case MetaName.CTaskNMDrunk__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMDrunk__Tunables, 0, 0, 256, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fMinHeadingDeltaToFixTurn, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fHeadingRandomizationRange, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.iHeadingRandomizationTimeMin, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.iHeadingRandomizationTimeMax, PsoDataType.SInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fForceLeanInDirectionAmountMin, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fForceLeanInDirectionAmountMax, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fForceRampMinSpeed, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fForceRampMaxSpeed, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fHeadLookHeadingRandomizationRange, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fHeadLookPitchRandomizationRange, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.iHeadLookRandomizationTimeMin, PsoDataType.SInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.iHeadlookRandomizationTimeMax, PsoDataType.SInt, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinHeadingDeltaToIdleTurn, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.iRunningTimeForVelocityBasedStayupright, PsoDataType.SInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.fStayUprightForceNonVelocityBased, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.fStayUprightForceMoving, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.fStayUprightForceIdle, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.fFallingSpeedForHighFall, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.bUseStayUpright, PsoDataType.Bool, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.bDrawIdleHeadLookTarget, PsoDataType.Bool, 89, 0, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 96, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Base, PsoDataType.Structure, 136, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Moving, PsoDataType.Structure, 176, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Idle, PsoDataType.Structure, 216, 0, MetaName.CNmTuningSet) + ); + case MetaName.CTaskNMElectrocute__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMElectrocute__Tunables, 0, 0, 400, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.InitialForceComponent, PsoDataType.Enum, 16, 0, (MetaName)3509057257), + new PsoStructureEntryInfo(MetaName.InitialForce, PsoDataType.Structure, 24, 0, (MetaName)760338219), + new PsoStructureEntryInfo(MetaName.InitialForceOffset, PsoDataType.Float3, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.FallingSpeedForHighFall, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 120, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Walking, PsoDataType.Structure, 160, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Running, PsoDataType.Structure, 200, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Sprinting, PsoDataType.Structure, 240, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 280, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnCatchFallSuccess, PsoDataType.Structure, 320, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnElectrocuteFinished, PsoDataType.Structure, 360, 0, MetaName.CNmTuningSet) + ); + case MetaName.CTaskNMExplosion__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMExplosion__Tunables, 0, 0, 344, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinStunnedTime, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStunnedTime, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowPlayerStunned, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.UseRelaxBehaviour, PsoDataType.Bool, 25, 0, 0), + new PsoStructureEntryInfo(MetaName.RollUpHeightThreshold, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.CatchFallHeightThresholdRollUp, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.CatchFallHeightThresholdWindmill, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.CatchFallHeightThresholdClipPose, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToStartCatchFall, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToStartCatchFallPlayer, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DoCatchFallRelax, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.CatchFallRelaxHeight, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.HeightToStartWrithe, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeForInitialState, PsoDataType.SInt, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeForInitialState, PsoDataType.SInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MinWritheTime, PsoDataType.SInt, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWritheTime, PsoDataType.SInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceRollUp, PsoDataType.Bool, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceWindmill, PsoDataType.Bool, 81, 0, 0), + new PsoStructureEntryInfo(MetaName.StartWindmill, PsoDataType.Structure, 88, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StartCatchFall, PsoDataType.Structure, 128, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StartRollDownStairs, PsoDataType.Structure, 168, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 208, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Explosion, PsoDataType.Structure, 248, 0, (MetaName)3490848491) + ); + case (MetaName)3490848491: + return new PsoStructureInfo((MetaName)3490848491, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.NMBodyScale, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.HumanBodyScale, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.HumanPelvisScale, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.HumanSpine0Scale, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.HumanSpine1Scale, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.AnimalBodyScale, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.AnimalPelvisScale, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.StrongBlastMagnitude, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.FastMovingPedSpeed, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceAbovePedPositionToClampPitch, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchClampMin, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchClampMax, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MagnitudeClamp, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.SideScale, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchSideAngle, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchTorqueMin, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.PitchTorqueMax, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.BlanketForceScale, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraTorqueTwistMax, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableInjuredBehaviorImpulseLimit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableInjuredBehaviorDistLimit, PsoDataType.Float, 88, 0, 0) + ); + case MetaName.CTaskNMFlinch__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMFlinch__Tunables, 0, 0, 624, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 16, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Passive, PsoDataType.Structure, 56, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.WaterCannon, PsoDataType.Structure, 96, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Armoured, PsoDataType.Structure, 136, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnStairs, PsoDataType.Structure, 176, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.BoundAnkles, PsoDataType.Structure, 216, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.FatallyInjured, PsoDataType.Structure, 256, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.PlayerDeath, PsoDataType.Structure, 296, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HoldingTwoHandedWeapon, PsoDataType.Structure, 336, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HoldingSingleHandedWeapon, PsoDataType.Structure, 376, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 416, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 456, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailedStairs, PsoDataType.Structure, 496, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.WeaponSets, PsoDataType.Structure, 536, 0, (MetaName)2070432509), + new PsoStructureEntryInfo(MetaName.ActionSets, PsoDataType.Structure, 568, 0, (MetaName)2070432509), + new PsoStructureEntryInfo(MetaName.RandomiseLeadingHand, PsoDataType.Bool, 600, 0, 0), + new PsoStructureEntryInfo(MetaName.MinLeanInDirectionTime, PsoDataType.SInt, 604, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLeanInDirectionTime, PsoDataType.SInt, 608, 0, 0), + new PsoStructureEntryInfo(MetaName.fImpulseReductionScaleMax, PsoDataType.Float, 612, 0, 0), + new PsoStructureEntryInfo(MetaName.fSpecialAbilityRageKickImpulseModifier, PsoDataType.Float, 616, 0, 0), + new PsoStructureEntryInfo(MetaName.fCounterImpulseScale, PsoDataType.Float, 620, 0, 0) + ); + case MetaName.CNmParameterRandomInt: + return new PsoStructureInfo(MetaName.CNmParameterRandomInt, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Min, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Max, PsoDataType.SInt, 20, 0, 0) + ); + case MetaName.CTaskNMHighFall__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMHighFall__Tunables, 0, 0, 1112, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.PitchInDirectionForce, PsoDataType.Structure, 16, 0, (MetaName)760338219), + new PsoStructureEntryInfo(MetaName.PitchInDirectionComponent, PsoDataType.SInt, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.StuntJumpPitchInDirectionForce, PsoDataType.Structure, 88, 0, (MetaName)760338219), + new PsoStructureEntryInfo(MetaName.StuntJumpPitchInDirectionComponent, PsoDataType.SInt, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.HighFallTimeToBlockInjuredOnGround, PsoDataType.SInt, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 160, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.InAir, PsoDataType.Structure, 200, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Vault, PsoDataType.Structure, 240, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.FromCarHit, PsoDataType.Structure, 280, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SlopeSlide, PsoDataType.Structure, 320, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.TeeterEdge, PsoDataType.Structure, 360, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SprintExhausted, PsoDataType.Structure, 400, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.JumpCollision, PsoDataType.Structure, 440, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StuntJump, PsoDataType.Structure, 480, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailedSprintExhausted, PsoDataType.Structure, 520, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.DisableStartMessageForSprintExhausted, PsoDataType.Bool, 560, 0, 0), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 568, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.BlendOut, PsoDataType.Structure, 608, 0, (MetaName)3979439077), + new PsoStructureEntryInfo(MetaName.PlayerQuickBlendOut, PsoDataType.Structure, 712, 0, (MetaName)3749122641), + new PsoStructureEntryInfo(MetaName.MpPlayerQuickBlendOut, PsoDataType.Structure, 744, 0, (MetaName)3749122641), + new PsoStructureEntryInfo(MetaName.MaxHealthLossForQuickGetup, PsoDataType.Float, 776, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHealthForQuickGetup, PsoDataType.Float, 780, 0, 0), + new PsoStructureEntryInfo(MetaName.MpMaxHealthLossForQuickGetup, PsoDataType.Float, 784, 0, 0), + new PsoStructureEntryInfo(MetaName.MpMinHealthForQuickGetup, PsoDataType.Float, 788, 0, 0), + new PsoStructureEntryInfo(MetaName.UseRemainingMinTimeForGroundWrithe, PsoDataType.Bool, 792, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeRemainingForGroundWrithe, PsoDataType.SInt, 796, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeElapsedForGroundWrithe, PsoDataType.SInt, 800, 0, 0), + new PsoStructureEntryInfo(MetaName.HighHighFallStart, PsoDataType.Structure, 808, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SuperHighFallStart, PsoDataType.Structure, 848, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HighHighFallEnd, PsoDataType.Structure, 888, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.AirResistanceOption, PsoDataType.UByte, 928, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceZThresholdForHighHighFall, PsoDataType.Float, 932, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityZThresholdForHighHighFall, PsoDataType.Float, 936, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityZThresholdForSuperHighFall, PsoDataType.Float, 940, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.RagdollComponentAirResistanceForce, PsoDataType.Array, 944, 4, (MetaName)1376291), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.RagdollComponentAirResistanceMinStiffness, PsoDataType.Array, 1028, 4, (MetaName)1310757) + ); + case MetaName.CTaskNMInjuredOnGround__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMInjuredOnGround__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fDoInjuredOnGroundChance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fFallingSpeedThreshold, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.iRandomDurationMin, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.iRandomDurationMax, PsoDataType.SInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.iMaxNumInjuredOnGroundAgents, PsoDataType.SInt, 32, 0, 0) + ); + case MetaName.CTaskNMJumpRollFromRoadVehicle__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMJumpRollFromRoadVehicle__Tunables, 0, 0, 304, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.GravityScale, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StartForceDownHeight, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 24, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.EntryPointSets, PsoDataType.Structure, 64, 0, (MetaName)2070432509), + new PsoStructureEntryInfo(MetaName.BlendOut, PsoDataType.Structure, 96, 0, (MetaName)3979439077), + new PsoStructureEntryInfo(MetaName.QuickBlendOut, PsoDataType.Structure, 200, 0, (MetaName)3979439077) + ); + case MetaName.CTaskNMOnFire__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMOnFire__Tunables, 0, 0, 176, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 16, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Weak, PsoDataType.Structure, 56, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 96, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 136, 0, MetaName.CNmTuningSet) + ); + case MetaName.CTaskNMPrototype__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMPrototype__Tunables, 0, 0, 288, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.RunForever, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SimulationTimeInMs, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.CheckForMovingGround, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 32, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 72, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailed, PsoDataType.Structure, 112, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CTaskNMPrototype__Tunables__TimedTuning), + new PsoStructureEntryInfo(MetaName.TimedMessages, PsoDataType.Array, 152, 0, (MetaName)MetaTypeName.POINTER), + new PsoStructureEntryInfo(MetaName.DynamicSet1, PsoDataType.Structure, 168, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.DynamicSet2, PsoDataType.Structure, 208, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.DynamicSet3, PsoDataType.Structure, 248, 0, MetaName.CNmTuningSet) + ); + case MetaName.CTaskNMPrototype__Tunables__TimedTuning: + return new PsoStructureInfo(MetaName.CTaskNMPrototype__Tunables__TimedTuning, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.TimeInSeconds, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Periodic, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Messages, PsoDataType.Structure, 16, 0, MetaName.CNmTuningSet) + ); + case MetaName.CTaskNMRiverRapids__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMRiverRapids__Tunables, 0, 0, 272, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fMinRiverFlowForRapids, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinRiverGroundClearanceForRapids, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.bHorizontalRighting, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fHorizontalRightingStrength, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fHorizontalRightingTime, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.bVerticalRighting, PsoDataType.Bool, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fVerticalRightingStrength, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fVerticalRightingTime, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.fRagdollComponentBuoyancy, PsoDataType.Array, 48, 4, (MetaName)1376265), + new PsoStructureEntryInfo(MetaName.BodyWrithe, PsoDataType.Structure, 136, 0, (MetaName)2361842970), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 192, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 232, 0, MetaName.CNmTuningSet) + ); + case (MetaName)2361842970: + return new PsoStructureInfo((MetaName)2361842970, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.bControlledByPlayerSprintInput, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinArmAmplitude, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxArmAmplitude, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinArmStiffness, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxArmStiffness, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinArmPeriod, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxArmPeriod, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinStroke, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxStroke, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinBuoyancy, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxBuoyancy, PsoDataType.Float, 48, 0, 0) + ); + case MetaName.CTaskNMShot__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMShot__Tunables, 0, 0, 2304, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinimumShotReactionTimePlayerMS, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinimumShotReactionTimeAIMS, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.bUseClipPoseHelper, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.bEnableDebugDraw, PsoDataType.Bool, 25, 0, 0), + new PsoStructureEntryInfo(MetaName.fImpactConeAngleFront, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fImpactConeAngleBack, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.eImpactConeRagdollComponent, PsoDataType.Enum, 36, 0, (MetaName)3509057257), + new PsoStructureEntryInfo(MetaName.iShotMinTimeBeforeGunThreaten, PsoDataType.SInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.iShotMaxTimeBeforeGunThreaten, PsoDataType.SInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.iShotMinTimeBetweenFireGun, PsoDataType.SInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.iShotMaxTimeBetweenFireGun, PsoDataType.SInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.iShotMaxBlindFireTimeL, PsoDataType.SInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.iShotMaxBlindFireTimeH, PsoDataType.SInt, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutDelayStanding, PsoDataType.SInt, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutDelayBalanceFailed, PsoDataType.SInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.fShotBlindFireProbability, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.fShotWeaponAngleToFireGun, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.fShotHeadAngleToFireGun, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.fFireWeaponStrengthForceMultiplier, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinFinisherShotgunTotalImpulseNormal, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinFinisherShotgunTotalImpulseBraced, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.fFinisherShotgunBonusArmedSpeedModifier, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleSnapWithSpineOrientation, PsoDataType.Bool, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSnap, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.ShotAgainstWall, PsoDataType.Structure, 112, 0, (MetaName)2342621138), + new PsoStructureEntryInfo(MetaName.BCRExclusionZone, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.Impulses, PsoDataType.Structure, 152, 0, (MetaName)209088469), + new PsoStructureEntryInfo(MetaName.HitRandomisation, PsoDataType.Structure, 352, 0, (MetaName)996969243), + new PsoStructureEntryInfo(MetaName.HitRandomisationAutomatic, PsoDataType.Structure, 392, 0, (MetaName)996969243), + new PsoStructureEntryInfo(MetaName.StayUpright, PsoDataType.Structure, 432, 0, (MetaName)1001943080), + new PsoStructureEntryInfo(MetaName.ArmShot, PsoDataType.Structure, 464, 0, (MetaName)2149258416), + new PsoStructureEntryInfo(MetaName.FallingSpeedForHighFall, PsoDataType.Float, 504, 0, 0), + new PsoStructureEntryInfo(MetaName.ReduceDownedTimeByPerformanceTime, PsoDataType.Bool, 508, 0, 0), + new PsoStructureEntryInfo(MetaName.MinimumDownedTime, PsoDataType.SInt, 512, 0, 0), + new PsoStructureEntryInfo(MetaName.ChanceOfFallToKneesOnCollapse, PsoDataType.Float, 516, 0, 0), + new PsoStructureEntryInfo(MetaName.ChanceOfFallToKneesAfterLastStand, PsoDataType.Float, 520, 0, 0), + new PsoStructureEntryInfo(MetaName.ChanceForGutShotKnockdown, PsoDataType.Float, 524, 0, 0), + new PsoStructureEntryInfo(MetaName.LastStandMaxTotalTime, PsoDataType.Float, 528, 0, 0), + new PsoStructureEntryInfo(MetaName.LastStandMaxArmouredTotalTime, PsoDataType.Float, 532, 0, 0), + new PsoStructureEntryInfo(MetaName.RapidHitCount, PsoDataType.SInt, 536, 0, 0), + new PsoStructureEntryInfo(MetaName.ArmouredRapidHitCount, PsoDataType.SInt, 540, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowArmouredLegShot, PsoDataType.Bool, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowArmouredKnockdown, PsoDataType.Bool, 545, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnHeadShot, PsoDataType.Bool, 546, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnHeadShotMinDelay, PsoDataType.SInt, 548, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnHeadShotMaxDelay, PsoDataType.SInt, 552, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnNeckShot, PsoDataType.Bool, 556, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnNeckShotMinDelay, PsoDataType.SInt, 560, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableReachForWoundOnNeckShotMaxDelay, PsoDataType.SInt, 564, 0, 0), + new PsoStructureEntryInfo(MetaName.ParamSets, PsoDataType.Structure, 568, 0, (MetaName)436100430), + new PsoStructureEntryInfo(MetaName.WeaponSets, PsoDataType.Structure, 2136, 0, (MetaName)2070432509), + new PsoStructureEntryInfo(MetaName.BlendOutThreshold, PsoDataType.Structure, 2168, 0, (MetaName)3979439077), + new PsoStructureEntryInfo(MetaName.SubmergedBlendOutThreshold, PsoDataType.Structure, 2272, 0, (MetaName)3749122641) + ); + case (MetaName)2342621138: + return new PsoStructureInfo((MetaName)2342621138, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.HealthRatioLimit, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.WallProbeRadius, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.WallProbeDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ProbeHeightAbovePelvis, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ImpulseMult, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWallAngle, PsoDataType.Float, 28, 0, 0) + ); + case (MetaName)209088469: + return new PsoStructureInfo((MetaName)209088469, 0, 0, 200, + new PsoStructureEntryInfo(MetaName.MaxArmourImpulseMult, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinArmourImpulseMult, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHealthImpulseMult, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHealthImpulseMult, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDamageTakenImpulseMult, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDamageTakenImpulseMult, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDamageTakenThreshold, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDamageTakenThreshold, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultKillShotImpulseMult, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultRapidFireKillShotImpulseMult, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultMPKillShotImpulseMult, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultMPRapidFireKillShotImpulseMult, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ShotgunMaxSpeedForLiftImpulse, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ShotgunMaxLiftImpulse, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ShotgunLiftNearThreshold, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ShotgunChanceToMoveSpine3ImpulseToSpine2, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.ShotgunChanceToMoveNeckImpulseToSpine2, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.ShotgunChanceToMoveHeadImpulseToSpine2, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.RapidFireBoostShotImpulseMult, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.RapidFireBoostShotMinRandom, PsoDataType.SInt, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.RapidFireBoostShotMaxRandom, PsoDataType.SInt, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.EqualizeAmount, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.COMImpulseScale, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)3509057257), + new PsoStructureEntryInfo(MetaName.COMImpulseComponent, PsoDataType.Flags, 100, 0, (MetaName)2097175), + new PsoStructureEntryInfo(MetaName.COMImpulseMaxRootVelocityMagnitude, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.COMImpulseOnlyWhileBalancing, PsoDataType.Bool, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadShotImpulseMultiplier, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadShotMPImpulseMultiplier, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.ScaleHeadShotImpulseWithSpineOrientation, PsoDataType.Bool, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeadShotImpulseMultiplier, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.AutomaticInitialSnapMult, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.BurstFireInitialSnapMult, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.FinalShotImpulseClampMax, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.RunningAgainstBulletImpulseMult, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.RunningAgainstBulletImpulseMultMax, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.RunningWithBulletImpulseMult, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.LegShotFallRootImpulseMinUpright, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.LegShotFallRootImpulseMult, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.SniperImpulses, PsoDataType.Structure, 160, 0, (MetaName)3192684380) + ); + case (MetaName)3192684380: + return new PsoStructureInfo((MetaName)3192684380, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.MaxHealthImpulseMult, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHealthImpulseMult, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDamageTakenImpulseMult, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDamageTakenImpulseMult, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDamageTakenThreshold, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDamageTakenThreshold, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultKillShotImpulseMult, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultMPKillShotImpulseMult, PsoDataType.Float, 36, 0, 0) + ); + case (MetaName)996969243: + return new PsoStructureInfo((MetaName)996969243, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Enable, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.TopSpread, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.BottomSpread, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Blend, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TopComponent, PsoDataType.Enum, 24, 0, (MetaName)3509057257), + new PsoStructureEntryInfo(MetaName.BottomComponent, PsoDataType.Enum, 28, 0, (MetaName)3509057257), + new PsoStructureEntryInfo(MetaName.BiasSide, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.BiasSideTime, PsoDataType.UInt, 36, 0, 0) + ); + case (MetaName)1001943080: + return new PsoStructureInfo((MetaName)1001943080, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.HoldingWeaponBonus, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.UnarmedBonus, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ArmouredBonus, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingMultiplierBonus, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.HealthMultiplierBonus, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)2149258416: + return new PsoStructureInfo((MetaName)2149258416, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.MinLookAtArmWoundTime, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLookAtArmWoundTime, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.UpperArmImpulseCap, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.LowerArmImpulseCap, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ClavicleImpulseScale, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.UpperArmNoTorsoHitImpulseCap, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.LowerArmNoTorseHitImpulseCap, PsoDataType.Float, 32, 0, 0) + ); + case (MetaName)436100430: + return new PsoStructureInfo((MetaName)436100430, 0, 0, 1568, + new PsoStructureEntryInfo(MetaName.Base, PsoDataType.Structure, 8, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Melee, PsoDataType.Structure, 48, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Electrocute, PsoDataType.Structure, 88, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SprintingLegShot, PsoDataType.Structure, 128, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SprintingDeath, PsoDataType.Structure, 168, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Sprinting, PsoDataType.Structure, 208, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.AutomaticHeadShot, PsoDataType.Structure, 248, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HeadShot, PsoDataType.Structure, 288, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.AutomaticNeckShot, PsoDataType.Structure, 328, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.NeckShot, PsoDataType.Structure, 368, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SniperLegShot, PsoDataType.Structure, 408, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.LegShot, PsoDataType.Structure, 448, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.ArmShot, PsoDataType.Structure, 488, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.BackShot, PsoDataType.Structure, 528, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Underwater, PsoDataType.Structure, 568, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.UnderwaterRelax, PsoDataType.Structure, 608, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Armoured, PsoDataType.Structure, 648, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.BoundAnkles, PsoDataType.Structure, 688, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.FatallyInjured, PsoDataType.Structure, 728, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.PlayerDeathSP, PsoDataType.Structure, 768, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.PlayerDeathMP, PsoDataType.Structure, 808, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnStairs, PsoDataType.Structure, 848, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.ShotAgainstWall, PsoDataType.Structure, 888, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.LastStand, PsoDataType.Structure, 928, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.LastStandArmoured, PsoDataType.Structure, 968, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HeadLook, PsoDataType.Structure, 1008, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.FallToKnees, PsoDataType.Structure, 1048, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.StaggerFall, PsoDataType.Structure, 1088, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.CatchFall, PsoDataType.Structure, 1128, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SetFallingReactionHealthy, PsoDataType.Structure, 1168, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SetFallingReactionInjured, PsoDataType.Structure, 1208, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SetFallingReactionFallOverWall, PsoDataType.Structure, 1248, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.SetFallingReactionFallOverVehicle, PsoDataType.Structure, 1288, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.RubberBulletKnockdown, PsoDataType.Structure, 1328, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Teeter, PsoDataType.Structure, 1368, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HoldingTwoHandedWeapon, PsoDataType.Structure, 1408, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.HoldingSingleHandedWeapon, PsoDataType.Structure, 1448, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.CrouchedOrLowCover, PsoDataType.Structure, 1488, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Female, PsoDataType.Structure, 1528, 0, MetaName.CNmTuningSet) + ); + case MetaName.CTaskNMSimple__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMSimple__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2610655349), + new PsoStructureEntryInfo(MetaName.Tuning, PsoDataType.Map, 16, 1, (MetaName)65538) + ); + case (MetaName)2610655349: + return new PsoStructureInfo((MetaName)2610655349, 0, 0, 176, + new PsoStructureEntryInfo(MetaName.iMinTime, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.iMaxTime, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fRagdollScore, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 24, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 64, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.OnBalanceFailure, PsoDataType.Structure, 104, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.BlendOutThreshold, PsoDataType.Structure, 144, 0, (MetaName)3749122641) + ); + case MetaName.CTaskNMThroughWindscreen__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMThroughWindscreen__Tunables, 0, 0, 232, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.GravityScale, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StartForceDownHeight, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeForwardMinComponent, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeForwardMaxComponent, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeUpMinComponent, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeUpMaxComponent, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikePitchMinComponent, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikePitchMaxComponent, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeMinSpeed, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeMaxSpeed, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeMinUpright, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeMaxUpright, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeEjectMaxImpactDepth, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.KnockOffBikeEjectImpactFriction, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.ClearVehicleTimeMS, PsoDataType.SInt, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultInverseMassScales, PsoDataType.Structure, 80, 0, (MetaName)1267291753), + new PsoStructureEntryInfo(MetaName.BicycleInverseMassScales, PsoDataType.Structure, 104, 0, (MetaName)1267291753), + new PsoStructureEntryInfo(MetaName.BikeInverseMassScales, PsoDataType.Structure, 128, 0, (MetaName)1267291753), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Structure, 152, 0, MetaName.CNmTuningSet), + new PsoStructureEntryInfo(MetaName.Update, PsoDataType.Structure, 192, 0, MetaName.CNmTuningSet) + ); + case MetaName.CTaskRageRagdoll__Tunables: + return new PsoStructureInfo(MetaName.CTaskRageRagdoll__Tunables, 0, 0, 168, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SpineStrengthTuning, PsoDataType.Structure, 16, 0, (MetaName)2579680791), + new PsoStructureEntryInfo(MetaName.NeckStrengthTuning, PsoDataType.Structure, 48, 0, (MetaName)2579680791), + new PsoStructureEntryInfo(MetaName.LimbStrengthTuning, PsoDataType.Structure, 80, 0, (MetaName)2579680791), + new PsoStructureEntryInfo(MetaName.RageRagdollImpulseTuning, PsoDataType.Structure, 112, 0, (MetaName)2715073781), + new PsoStructureEntryInfo(MetaName.fMuscleAngleStrengthRampDownRate, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.fMuscleSpeedStrengthRampDownRate, PsoDataType.Float, 164, 0, 0) + ); + case (MetaName)2579680791: + return new PsoStructureInfo((MetaName)2579680791, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.fInitialDelay, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fStartStrength, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fMidStrength, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fEndStrength, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fDurationStage1, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fDurationStage2, PsoDataType.Float, 28, 0, 0) + ); + case (MetaName)2715073781: + return new PsoStructureInfo((MetaName)2715073781, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.fImpulseReductionPerShot, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fImpulseRecoveryPerSecond, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxImpulseModifier, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinImpulseModifier, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fCounterImpulseRatio, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fTempInitialStiffnessWhenShot, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fAnimalMassMult, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fAnimalImpulseMultMin, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fAnimalImpulseMultMax, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fInitialHitImpulseMult, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.CPlayerInfo__Tunables: + return new PsoStructureInfo(MetaName.CPlayerInfo__Tunables, 0, 0, 992, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.EnemyCharging, PsoDataType.Structure, 16, 0, (MetaName)2968011987), + new PsoStructureEntryInfo(MetaName.CombatLoitering, PsoDataType.Structure, 48, 0, (MetaName)2859355160), + new PsoStructureEntryInfo(MetaName.MinVehicleCollisionDamageScale, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVehicleCollisionDamageScale, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngleConsidered, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToConsiderVehicleValid, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistToConsiderVehicleValid, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.SprintReplenishFinishedPercentage, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)3763989739, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.SprintReplenishRateMultiplier, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.SprintReplenishRateMultiplierBike, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWorldLimitsPlayerX, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWorldLimitsPlayerY, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MinWorldLimitsPlayerX, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MinWorldLimitsPlayerY, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToTrespassWhileSwimmingBeforeDeath, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MovementAwayWeighting, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceWeighting, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingWeighting, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.CameraWeighting, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceWeightingNoStick, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingWeightingNoStick, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.OnFireWeightingMult, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeMaxRestoreDuration, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeMinRestoreDuration, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleDepletionMinMult, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleDepletionMidMult, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleDepletionMaxMult, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleMinDepletionLimit, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleMidDepletionLimit, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleMaxDepletionLimit, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenSwitchToClearTasks, PsoDataType.UInt, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenShoutTargetPosition, PsoDataType.UInt, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.TrespassGuardModelName, PsoDataType.String, 188, 7, 0), + new PsoStructureEntryInfo(MetaName.GuardWorldExtents, PsoDataType.Bool, 192, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPlayerInfo__sSprintControlData), + new PsoStructureEntryInfo(MetaName.SprintControlData, PsoDataType.Array, 200, 1, (MetaName)262180), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPlayerInfo__sPlayerStatInfo), + new PsoStructureEntryInfo(MetaName.PlayerStatInfos, PsoDataType.Array, 336, 1, (MetaName)524326), + new PsoStructureEntryInfo((MetaName)4178328957, PsoDataType.Float, 984, 0, 0), + new PsoStructureEntryInfo((MetaName)1447073898, PsoDataType.Float, 988, 0, 0) + ); + case (MetaName)2968011987: + return new PsoStructureInfo((MetaName)2968011987, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.fChargeGoalBehindCoverCentralOffset, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fChargeGoalLateralOffset, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fChargeGoalRearOffset, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fChargeGoalMaxAdjustRadius, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fPlayerMoveDistToResetChargeGoals, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)2859355160: + return new PsoStructureInfo((MetaName)2859355160, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.fPlayerMoveDistToResetLoiterPosition, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.uDistanceCheckPeriodMS, PsoDataType.UInt, 12, 0, 0) + ); + case MetaName.CPlayerInfo__sSprintControlData: + return new PsoStructureInfo(MetaName.CPlayerInfo__sSprintControlData, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.TapAdd, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.HoldSub, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ReleaseSub, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Threshhold, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLimit, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ResultMult, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CPlayerInfo__sPlayerStatInfo: + return new PsoStructureInfo(MetaName.CPlayerInfo__sPlayerStatInfo, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinStaminaDuration, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxStaminaDuration, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHoldBreathDuration, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHoldBreathDuration, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinWheelieAbility, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWheelieAbility, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPlaneControlAbility, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPlaneControlAbility, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPlaneDamping, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPlaneDamping, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeliDamping, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeliDamping, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFallHeight, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxFallHeight, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDiveHeight, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDiveHeight, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.DiveRampPow, PsoDataType.Float, 76, 0, 0) + ); + case MetaName.CAnimSpeedUps__Tunables: + return new PsoStructureInfo(MetaName.CAnimSpeedUps__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MultiplayerClimbStandRateModifier, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MultiplayerClimbRunningRateModifier, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MultiplayerClimbClamberRateModifier, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MultiplayerEnterExitJackVehicleRateModifier, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MultiplayerLadderRateModifier, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MultiplayerReloadRateModifier, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MultiplayerCoverIntroRateModifier, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MultiplayerIdleTurnRateModifier, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceMPAnimRatesInSP, PsoDataType.Bool, 48, 0, 0) + ); + case MetaName.CPlayerPedTargeting__Tunables: + return new PsoStructureInfo(MetaName.CPlayerPedTargeting__Tunables, 0, 0, 3776, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fTargetableDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fTargetThreatOverride, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ArrestHardLockDistance, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.UnarmedInCoverTargetingDistance, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1109599945, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MeleeLostLOSBreakTime, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToAllowCachedStickInputForMelee, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.DoAynchronousProbesWhenFindingFreeAimAssistTarget, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowDriverLockOnToAmbientPeds, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowDriverLockOnToAmbientPedsInSP, PsoDataType.Bool, 46, 0, 0), + new PsoStructureEntryInfo(MetaName.DisplayAimAssistIntersections, PsoDataType.Bool, 47, 0, 0), + new PsoStructureEntryInfo((MetaName)2235947157, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DisplayAimAssistCurves, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo(MetaName.DisplayLockOnDistRanges, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo(MetaName.DisplayLockOnAngularRanges, PsoDataType.Bool, 51, 0, 0), + new PsoStructureEntryInfo(MetaName.DisplaySoftLockDebug, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DisplayFreeAimTargetDebug, PsoDataType.Bool, 53, 0, 0), + new PsoStructureEntryInfo(MetaName.DebugLockOnTargets, PsoDataType.Bool, 54, 0, 0), + new PsoStructureEntryInfo(MetaName.UseRagdollTargetIfNoAssistTarget, PsoDataType.Bool, 55, 0, 0), + new PsoStructureEntryInfo(MetaName.UseReticuleSlowDownStrafeClamp, PsoDataType.Bool, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.EasyTargettingDifficultyInfo, PsoDataType.Structure, 64, 0, MetaName.CTargettingDifficultyInfo), + new PsoStructureEntryInfo(MetaName.NormalTargettingDifficultyInfo, PsoDataType.Structure, 528, 0, MetaName.CTargettingDifficultyInfo), + new PsoStructureEntryInfo((MetaName)2843442022, PsoDataType.Structure, 992, 0, MetaName.CTargettingDifficultyInfo), + new PsoStructureEntryInfo((MetaName)933644170, PsoDataType.Structure, 1456, 0, MetaName.CTargettingDifficultyInfo), + new PsoStructureEntryInfo((MetaName)1051298047, PsoDataType.Structure, 1920, 0, MetaName.CTargettingDifficultyInfo), + new PsoStructureEntryInfo((MetaName)1712651720, PsoDataType.Structure, 2384, 0, MetaName.CTargettingDifficultyInfo), + new PsoStructureEntryInfo((MetaName)3769742750, PsoDataType.Structure, 2848, 0, MetaName.CTargettingDifficultyInfo), + new PsoStructureEntryInfo((MetaName)1604857901, PsoDataType.Structure, 3312, 0, MetaName.CTargettingDifficultyInfo) + ); + case MetaName.CTargettingDifficultyInfo: + return new PsoStructureInfo(MetaName.CTargettingDifficultyInfo, 0, 0, 464, + new PsoStructureEntryInfo(MetaName.LockType, PsoDataType.Enum, 8, 0, MetaName.LockType), + new PsoStructureEntryInfo((MetaName)3742855719, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.UseLockOnTargetSwitching, PsoDataType.Bool, 13, 0, 0), + new PsoStructureEntryInfo(MetaName.UseReticuleSlowDownForRunAndGun, PsoDataType.Bool, 14, 0, 0), + new PsoStructureEntryInfo(MetaName.UseReticuleSlowDown, PsoDataType.Bool, 15, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableBulletBending, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowSoftLockFineAim, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.UseFineAimSpring, PsoDataType.Bool, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.UseNewSlowDownCode, PsoDataType.Bool, 19, 0, 0), + new PsoStructureEntryInfo(MetaName.UseCapsuleTests, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.UseDriveByAssistedAim, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo((MetaName)3708089905, PsoDataType.Bool, 22, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnRangeModifier, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ReticuleSlowDownRadius, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ReticuleSlowDownCapsuleRadius, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ReticuleSlowDownCapsuleLength, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimit, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitClose, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitCloseDistMin, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAngularLimitCloseDistMax, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.WideTargetAngularLimit, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.CycleTargetAngularLimit, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.CycleTargetAngularLimitMelee, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAimPitchMin, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultTargetAimPitchMax, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.NoReticuleLockOnRangeModifier, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.NoReticuleMaxLockOnRange, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.NoReticuleTargetAngularLimit, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.NoReticuleTargetAngularLimitClose, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.NoReticuleTargetAngularLimitCloseDistMin, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.NoReticuleTargetAngularLimitCloseDistMax, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.NoReticuleTargetAimPitchLimit, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelocityForDriveByAssistedAim, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnDistanceRejectionModifier, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimVerticalMovement, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimDownwardsVerticalMovement, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimSidewaysScale, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSoftLockBreakTime, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSoftLockBreakTimeCloseRange, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSoftLockBreakAtMaxXStickTime, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockBreakDistanceMin, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockBreakDistanceMax, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFineAimTime, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.MinFineAimTimeHoldingStick, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.MinNoReticuleAimTime, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.AimAssistCapsuleRadius, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo((MetaName)2152729841, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.AimAssistCapsuleMaxLength, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo((MetaName)1099784311, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.AimAssistBlendInTime, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.AimAssistBlendOutTime, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockFineAimBreakXYValue, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockFineAimBreakZValue, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockFineAimXYAbsoluteValue, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockFineAimXYAbsoluteValueClose, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockBreakValue, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockTime, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.SoftLockTimeToAcquireTarget, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo((MetaName)2167138628, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimHorSpeedMin, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimHorSpeedMax, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimVerSpeed, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimSpeedMultiplier, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimHorWeightSpeedMultiplier, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimHorSpeedPower, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimSpeedMultiplierClose, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimSpeedMultiplierCloseDistMin, PsoDataType.Float, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.FineAimSpeedMultiplierCloseDistMax, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo((MetaName)1715236167, PsoDataType.Float, 248, 0, 0), + new PsoStructureEntryInfo((MetaName)1204531501, PsoDataType.Float, 252, 0, 0), + new PsoStructureEntryInfo((MetaName)2894104098, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo((MetaName)1976544803, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo((MetaName)922516025, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo((MetaName)3926385305, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo((MetaName)493048149, PsoDataType.Float, 272, 0, 0), + new PsoStructureEntryInfo((MetaName)2549641570, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnSwitchTimeExtensionBreakLock, PsoDataType.UInt, 280, 0, 0), + new PsoStructureEntryInfo(MetaName.LockOnSwitchTimeExtensionKillTarget, PsoDataType.UInt, 284, 0, 0), + new PsoStructureEntryInfo((MetaName)3957255740, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo((MetaName)3799655237, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCurveSet), + new PsoStructureEntryInfo(MetaName.CurveSets, PsoDataType.Array, 296, 1, (MetaName)262224), + new PsoStructureEntryInfo(MetaName.AimAssistDistanceCurve, PsoDataType.Structure, 432, 0, MetaName.CCurveSet) + ); + case MetaName.CCurveSet: + return new PsoStructureInfo(MetaName.CCurveSet, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCurve), + new PsoStructureEntryInfo(MetaName.curves, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case MetaName.CCurve: + return new PsoStructureInfo(MetaName.CCurve, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.fInputMax, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.fResultMax, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.fPow, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CRandomEventManager__Tunables: + return new PsoStructureInfo(MetaName.CRandomEventManager__Tunables, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.RenderDebug, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceCrime, PsoDataType.Bool, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.EventInterval, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.EventInitInterval, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1980648971), + new PsoStructureEntryInfo(MetaName.RandomEventType, PsoDataType.Array, 32, 0, (MetaName)6), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2790883352), + new PsoStructureEntryInfo(MetaName.RandomEventData, PsoDataType.Array, 48, 0, (MetaName)8), + new PsoStructureEntryInfo(MetaName.SpawningChasesEnabled, PsoDataType.Bool, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxNumberCopVehiclesInChase, PsoDataType.SInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.ProbSpawnHeli, PsoDataType.SInt, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAmbientVehiclesToSpawnChase, PsoDataType.SInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPlayerMoveDistanceToSpawnChase, PsoDataType.SInt, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.HeliVehicleModelId, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo(MetaName.HeliPedModelId, PsoDataType.String, 88, 7, 0) + ); + case (MetaName)1980648971: + return new PsoStructureInfo((MetaName)1980648971, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.RandomEventTypeName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.RandomEventTimeIntervalMin, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.RandomEventTimeIntervalMax, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DeltaScaleWhenPlayerStationary, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)2790883352: + return new PsoStructureInfo((MetaName)2790883352, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.RandomEventName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.RandomEventType, PsoDataType.Enum, 12, 0, (MetaName)3799765345) + ); + case MetaName.CEventExplosionHeard__Tunables: + return new PsoStructureInfo(MetaName.CEventExplosionHeard__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxCombineDistThresholdSquared, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CRelationshipManager__Tunables: + return new PsoStructureInfo(MetaName.CRelationshipManager__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DisplayRemovedGroups, PsoDataType.Bool, 16, 0, 0) + ); + case MetaName.CTaskAgitated__Tunables: + return new PsoStructureInfo(MetaName.CTaskAgitated__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)588501678), + new PsoStructureEntryInfo(MetaName.TimeBetweenLookAts, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MovingAwayVelocityMSThreshold, PsoDataType.Float, 36, 0, 0) + ); + case (MetaName)588501678: + return new PsoStructureInfo((MetaName)588501678, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Info, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.Hashes, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.History, PsoDataType.Bool, 11, 0, 0) + ); + case MetaName.CTaskConfront__Tunables: + return new PsoStructureInfo(MetaName.CTaskConfront__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceIfUnarmed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistanceIfArmed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToMove, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRadius, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToIntimidateArmedTarget, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToIntimidateUnarmedTarget, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.CTaskSmartFlee__Tunables: + return new PsoStructureInfo(MetaName.CTaskSmartFlee__Tunables, 0, 0, 136, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)2976849785, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2923989237, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo((MetaName)964747565, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2588997912, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3847831913, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)182226933, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3494668944, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)55450154, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)1156561437, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2850307001, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)4172340609, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)916666022, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1653710895, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitVehicleMaxDistance, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitVehicleRouteMinDistance, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenHandsUpChecks, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenExitVehicleDueToRouteChecks, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToCower, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeForHandsUp, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeForHandsUp, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimeForExitVehicle, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimeForExitVehicle, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ChanceToDeleteOnExitVehicle, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistFromPlayerToDeleteOnExitVehicle, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRouteLengthForCower, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistFromTargetWhenCoweringToCheckForExit, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeTargetTooCloseDistance, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)945475130, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)909291779, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRouteSizeForCower, PsoDataType.SInt, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceCower, PsoDataType.Bool, 132, 0, 0) + ); + case MetaName.CTaskScenarioFlee__Tunables: + return new PsoStructureInfo(MetaName.CTaskScenarioFlee__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fFleeProjectRange, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fInitialSearchRadius, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fSearchScaler, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fSearchRangeMax, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fFleeRange, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)1817496588, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fTargetScenarioRadius, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fProbeLength, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)3328108206, PsoDataType.UInt, 48, 0, 0) + ); + case MetaName.CTaskExhaustedFlee__Tunables: + return new PsoStructureInfo(MetaName.CTaskExhaustedFlee__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.StartingEnergy, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.EnergyLostPerSecond, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.OuterDistanceThreshold, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.InnerDistanceThreshold, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CTaskWalkAway__Tunables: + return new PsoStructureInfo(MetaName.CTaskWalkAway__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SafeDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenRouteAdjustments, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskGrowlAndFlee__Tunables: + return new PsoStructureInfo(MetaName.CTaskGrowlAndFlee__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FleeMBR, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskIntimidate__Tunables: + return new PsoStructureInfo(MetaName.CTaskIntimidate__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)920671881, PsoDataType.Bool, 16, 0, 0) + ); + case MetaName.CTaskReactAndFlee__Tunables: + return new PsoStructureInfo(MetaName.CTaskReactAndFlee__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinFleeMoveBlendRatio, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxFleeMoveBlendRatio, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.OverrideDirections, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.OverrideReactDirection, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.OverrideFleeDirection, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxReactionTime, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRate, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRate, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingChangeRate, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToRepeatLastAnimation, PsoDataType.Float, 52, 0, 0) + ); + case MetaName.CTaskReactInDirection__Tunables: + return new PsoStructureInfo(MetaName.CTaskReactInDirection__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CTaskReactToExplosion__Tunables: + return new PsoStructureInfo(MetaName.CTaskReactToExplosion__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxShellShockedDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxFlinchDistance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLookAtDistance, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskReactToImminentExplosion__Tunables: + return new PsoStructureInfo(MetaName.CTaskReactToImminentExplosion__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxEscapeDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxFlinchDistance, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskShockingEvent__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingEvent__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinRemainingRotationForScaling, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAngularVelocityScaleFactor, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAngularVelocityScaleFactor, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskShockingEventGoto__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingEventGoto__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DistSquaredThresholdAtCrowdRoundPos, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DistSquaredThresholdMovingToCrowdRoundPos, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DistVicinityOfCrowd, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraDistForGoto, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistFromOtherPeds, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MoveBlendRatioForFarGoto, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetRadiusForCloseNavMeshTask, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraToleranceForStopWatchDistance, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.CTaskShockingEventHurryAway__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingEventHurryAway__Tunables, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.LookAheadDistanceForBackAway, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToCallPolice, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToCallPolice, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToCallPolice, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancePlayingInitalTurnAnimSmallReact, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancePlayingCustomBackAwayAnimSmallReact, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancePlayingInitalTurnAnimBigReact, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancePlayingCustomBackAwayAnimBigReact, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldFleeDistance, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldFleeVehicleDistance, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldFleeFilmingDistance, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.EvasionThreshold, PsoDataType.UInt, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ClosePlayerSpeedupDistanceSquaredThreshold, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ClosePlayerSpeedupTimeThreshold, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceFromPlayerToDeleteHurriedPed, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeUntilDeletionWhenHurrying, PsoDataType.Float, 76, 0, 0) + ); + case MetaName.CTaskShockingEventWatch__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingEventWatch__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxTargetAngularMovementForWatch, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ThresholdWatchAfterFace, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ThresholdWatchStop, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceBetweenFilmingPeds, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)1440458015, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceAwayForFilming, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.CTaskShockingEventReact__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingEventReact__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TurningTolerance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TurningRate, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TurningEnergyUpperThreshold, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.TurningEnergyLowerThreshold, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenReactionIdlesMin, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenReactionIdlesMax, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendoutPhase, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CTaskShockingEventBackAway__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingEventBackAway__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxHeadingAdjustmentRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeadingAlignmentCosThreshold, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeadingAlignmentCosThreshold, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MoveNetworkBlendoutDuration, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultBackwardsProjectionRange, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AxesFacingTolerance, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForBackAway, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForBackAway, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWptAngle, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutPhase, PsoDataType.Float, 52, 0, 0) + ); + case MetaName.CTaskShockingEventReactToAircraft__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingEventReactToAircraft__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ThresholdWatch, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ThresholdRun, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskShockingPoliceInvestigate__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingPoliceInvestigate__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ExtraDistForGoto, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MoveBlendRatioForFarGoto, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistFromPlayerToDeleteOffscreen, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DeleteOffscreenTimeMS_MIN, PsoDataType.UInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DeleteOffscreenTimeMS_MAX, PsoDataType.UInt, 32, 0, 0) + ); + case MetaName.CTaskShockingEventStopAndStare__Tunables: + return new PsoStructureInfo(MetaName.CTaskShockingEventStopAndStare__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.BringVehicleToHaltDistance, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskShove__Tunables: + return new PsoStructureInfo(MetaName.CTaskShove__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 16, 0, (MetaName)838054604), + new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDot, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusForContact, PsoDataType.Float, 40, 0, 0) + ); + case (MetaName)838054604: + return new PsoStructureInfo((MetaName)838054604, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Contact, PsoDataType.Bool, 9, 0, 0) + ); + case MetaName.CTaskShoved__Tunables: + return new PsoStructureInfo(MetaName.CTaskShoved__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CScenarioClipHelper__Tunables: + return new PsoStructureInfo(MetaName.CScenarioClipHelper__Tunables, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CVehicleScenarioManager__AttractorTuning__Tunables: + return new PsoStructureInfo(MetaName.CVehicleScenarioManager__AttractorTuning__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ForwardDirectionThresholdCosSquared, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistToPathDefault, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistToVehicle, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistToVehicle, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.NumToUpdatePerFrame, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeAfterAttractionMs, PsoDataType.UInt, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeAfterChainTestFailedMs, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeAfterFailedConditionsMs, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeAfterNoBoundsMs, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPassengersForAttraction, PsoDataType.UShort, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPassengersForAttraction, PsoDataType.UShort, 54, 0, 0) + ); + case MetaName.CTaskCoupleScenario__Tunables: + return new PsoStructureInfo(MetaName.CTaskCoupleScenario__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ResumeDistSq, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StopDistSq, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetDistance, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskCowerScenario__Tunables: + return new PsoStructureInfo(MetaName.CTaskCowerScenario__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.EventDecayTimeMS, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ReturnToNormalDistanceSq, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.BackHeadingInterpRate, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.EventlessSwitchStateTimeRequirement, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.EventlessSwitchInactivityTimeRequirement, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.EventlessSwitchDistanceRequirement, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistFromPlayerToDeleteCoweringForever, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.CoweringForeverDeleteOffscreenTimeMS_MIN, PsoDataType.UInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.CoweringForeverDeleteOffscreenTimeMS_MAX, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.FlinchDecayTime, PsoDataType.UInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenFlinches, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.CTaskUseScenario__Tunables: + return new PsoStructureInfo(MetaName.CTaskUseScenario__Tunables, 0, 0, 152, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AdvanceUseTimeRandomMaxProportion, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.BreakAttachmentMoveSpeedThreshold, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.BreakAttachmentOrientationThreshold, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitAttachmentMoveSpeedThreshold, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.RouteLengthThresholdForFinalApproach, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ZThresholdForApproachOffset, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DetachExitDefaultPhaseThreshold, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.FastExitDefaultPhaseThreshold, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.RouteLengthThresholdForApproachOffset, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraFleeDistance, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.FindPropInEnvironmentDist, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRateToPlayCowerReaction, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRateToPlayCowerReaction, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDifferenceBetweenCowerReactionRates, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.ReactAndFleeBlendOutPhase, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.RegularExitDefaultPhaseThreshold, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeOfDayRandomnessHours, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToLeaveMinBetweenAnybody, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToLeaveRandomAmount, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToLeaveRandomFraction, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.PavementFloodFillSearchRadius, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.DelayBetweenPavementFloodFillSearches, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeMBRMin, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeMBRMax, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPathLengthForValidExit, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceNavmeshMayAdjustPath, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenChecksToLeaveCowering, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.SkipGotoXYDist, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.SkipGotoZDist, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.SkipGotoHeadingDeltaDegrees, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.MinExtraMoney, PsoDataType.SInt, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxExtraMoney, PsoDataType.SInt, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.UpdatesBeforeShiftingBounds, PsoDataType.SByte, 144, 0, 0) + ); + case MetaName.CTaskUseVehicleScenario__Tunables: + return new PsoStructureInfo(MetaName.CTaskUseVehicleScenario__Tunables, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.BringVehicleToHaltDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.IdleTimeRandomFactor, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowDownDist, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowDownSpeed, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.SwitchToStraightLineDist, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetArriveDist, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.PlaneTargetArriveDist, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.HeliTargetArriveDist, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.BoatTargetArriveDist, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.PlaneTargetArriveDistTaxiOnGround, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.PlaneDrivingSubtaskArrivalDist, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.BoatMaxAvoidanceAngle, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSearchDistance, PsoDataType.UShort, 64, 0, 0) + ); + case MetaName.CTaskWanderingScenario__Tunables: + return new PsoStructureInfo(MetaName.CTaskWanderingScenario__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeWaitingForBlockingArea, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SwitchToNextPointDistWalking, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SwitchToNextPointDistJogging, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.PreferNearWaterSurfaceArrivalRadius, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenBlockingAreaChecksMS, PsoDataType.UInt, 32, 0, 0) + ); + case MetaName.CTaskPoliceOrderResponse__Tunables: + return new PsoStructureInfo(MetaName.CTaskPoliceOrderResponse__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToWait, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedForVehicleMovingSlowly, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForVehicleMovingQuickly, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBeforeOvertakeToMatchSpeedWhenPulledOver, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBeforeOvertakeToMatchSpeedWhenCruising, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.CheatPowerIncreaseForMatchSpeed, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.HashOrdering, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)683308669, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)527303977, PsoDataType.Float, 48, 0, 0) + ); + case MetaName.CTaskArrestPed__Tunables: + return new PsoStructureInfo(MetaName.CTaskArrestPed__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AimDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ArrestDistance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ArrestInVehicleDistance, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MoveToDistanceInVehicle, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetDistanceFromVehicleEntry, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)1425198943, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)4218266421, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)305536610, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.RegainComet, PsoDataType.UInt, 48, 0, 0) + ); + case MetaName.CTaskSwatOrderResponse__Tunables: + return new PsoStructureInfo(MetaName.CTaskSwatOrderResponse__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.HashOrdering, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)683308669, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskHeliOrderResponse__Tunables: + return new PsoStructureInfo(MetaName.CTaskHeliOrderResponse__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)3905663903, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)143141277, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)490178156, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)2892876798, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)3618878970, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)3555374966, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.CTaskWitness__Tunables: + return new PsoStructureInfo(MetaName.CTaskWitness__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeMoveNearCrimeMs, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeMoveToLawMs, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeSearchMs, PsoDataType.UInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeMoveToLawFailedPathfindingMs, PsoDataType.UInt, 28, 0, 0) + ); + case MetaName.CEventShocking__Tunables: + return new PsoStructureInfo(MetaName.CEventShocking__Tunables, 0, 0, 224, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.LifeTime, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.VisualReactionRange, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.CopInVehicleVisualReactionRange, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.AudioReactionRange, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.AIOnlyReactionRangeScaleFactor, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.DuckAndCoverCanTriggerForPlayerTime, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.GotoWatchRange, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.StopWatchDistance, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.HurryAwayMBRChangeDelay, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.HurryAwayMBRChangeRange, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.HurryAwayInitialMBR, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.HurryAwayMoveBlendRatioWhenFar, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.HurryAwayMoveBlendRatioWhenNear, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinWatchTime, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWatchTime, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MinWatchTimeHurryAway, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxWatchTimeHurryAway, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.ChanceOfWatchRatherThanHurryAway, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPhoneFilmTime, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPhoneFilmTime, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPhoneFilmTimeHurryAway, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPhoneFilmTimeHurryAway, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.ChanceOfFilmingEventOnPhoneIfWatching, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.PedGenBlockedAreaMinRadius, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.WanderInfluenceSphereRadius, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.TriggerAmbientReactionChances, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForAmbientReaction, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForAmbientReaction, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.AmbientEventLifetime, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeForAmbientReaction, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeForAmbientReaction, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.PedFearImpact, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.ShockingSpeechChance, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.DuplicateDistanceCheck, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeForAudioReaction, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToUseGunfireReactAndFleeAnimations, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.PedGenBlockingAreaLifeTimeMS, PsoDataType.UInt, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.DuplicateTimeCheck, PsoDataType.UInt, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.ShockingSpeechHash, PsoDataType.String, 176, 7, 0), + new PsoStructureEntryInfo(MetaName.ShockingFilmSpeechHash, PsoDataType.String, 180, 7, 0), + new PsoStructureEntryInfo(MetaName.Priority, PsoDataType.SInt, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.AmbientEventType, PsoDataType.Enum, 188, 0, MetaName.AmbientEventType), + new PsoStructureEntryInfo(MetaName.AddPedGenBlockedArea, PsoDataType.Bool, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.CausesVehicleAvoidance, PsoDataType.Bool, 193, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowIgnoreAsLowPriority, PsoDataType.Bool, 194, 0, 0), + new PsoStructureEntryInfo(MetaName.DebugDisplayAlwaysUseEventPosition, PsoDataType.Bool, 195, 0, 0), + new PsoStructureEntryInfo(MetaName.DebugDisplayListPlayerInfo, PsoDataType.Bool, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.HurryAwayWatchFirst, PsoDataType.Bool, 197, 0, 0), + new PsoStructureEntryInfo(MetaName.MobileChatScenarioMayAbort, PsoDataType.Bool, 198, 0, 0), + new PsoStructureEntryInfo(MetaName.WatchSayFightCheers, PsoDataType.Bool, 199, 0, 0), + new PsoStructureEntryInfo(MetaName.WatchSayShocked, PsoDataType.Bool, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleSlowDown, PsoDataType.Bool, 201, 0, 0), + new PsoStructureEntryInfo(MetaName.IgnoreIfSensingPedIsOtherEntity, PsoDataType.Bool, 202, 0, 0), + new PsoStructureEntryInfo(MetaName.IgnorePavementChecks, PsoDataType.Bool, 203, 0, 0), + new PsoStructureEntryInfo(MetaName.AllowScanningEvenIfPreviouslyReacted, PsoDataType.Bool, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.ReactionMode, PsoDataType.Enum, 208, 0, (MetaName)1809724872), + new PsoStructureEntryInfo(MetaName.StopResponseWhenExpired, PsoDataType.Bool, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeIfApproachedByOtherEntity, PsoDataType.Bool, 213, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeIfApproachedBySourceEntity, PsoDataType.Bool, 214, 0, 0), + new PsoStructureEntryInfo(MetaName.CanCallPolice, PsoDataType.Bool, 215, 0, 0), + new PsoStructureEntryInfo(MetaName.IgnoreFovForHeadIk, PsoDataType.Bool, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.ReactToOtherEntity, PsoDataType.Bool, 217, 0, 0) + ); + case MetaName.CSituationalClipSetStreamer__Tunables: + return new PsoStructureInfo(MetaName.CSituationalClipSetStreamer__Tunables, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Avoids, PsoDataType.Structure, 16, 0, (MetaName)2341712397), + new PsoStructureEntryInfo(MetaName.FleeReactions, PsoDataType.Structure, 48, 0, MetaName.iVectorDefault) + ); + case (MetaName)2341712397: + return new PsoStructureInfo((MetaName)2341712397, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.ClipSet, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ClipSetForCasual, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1095110195), + new PsoStructureEntryInfo(MetaName.Variations, PsoDataType.Array, 16, 0, (MetaName)2) + ); + case MetaName.iVectorDefault: + return new PsoStructureInfo(MetaName.iVectorDefault, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.ClipSetForIntro, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)3696584734, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo((MetaName)4027846555, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.ClipSetForRuns, PsoDataType.String, 20, 7, 0), + new PsoStructureEntryInfo((MetaName)3482724306, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo((MetaName)551602790, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInCombatToNotStreamIn, PsoDataType.Float, 32, 0, 0) + ); + case (MetaName)1095110195: + return new PsoStructureInfo((MetaName)1095110195, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ClipSet, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.IsCasual, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Chances, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CEventFootStepHeard__Tunables: + return new PsoStructureInfo(MetaName.CEventFootStepHeard__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTacticalAnalysisNavMeshPoints__Tunables: + return new PsoStructureInfo(MetaName.CTacticalAnalysisNavMeshPoints__Tunables, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.BufferDistance, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenAttemptsToFindNewPosition, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenLineOfSightTests, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenAttemptsToFindNearby, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSearchRadiusForNavMesh, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusForFindNearby, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceBetweenPositionsWithClearLineOfSight, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceBetweenPositionsWithoutClearLineOfSightInExteriors, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceBetweenPositionsWithoutClearLineOfSightInInteriors, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxXYDistanceForNewPosition, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxNearbyToFindPerFrame, PsoDataType.SInt, 64, 0, 0) + ); + case MetaName.CTacticalAnalysisCoverPointSearch__Tunables: + return new PsoStructureInfo(MetaName.CTacticalAnalysisCoverPointSearch__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Scoring, PsoDataType.Structure, 16, 0, (MetaName)850484111), + new PsoStructureEntryInfo(MetaName.ScoreCalculationsPerFrame, PsoDataType.SInt, 48, 0, 0) + ); + case (MetaName)850484111: + return new PsoStructureInfo((MetaName)850484111, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Occupied, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Scripted, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.PointOnMap, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToBeConsideredOptimal, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToBeConsideredOptimal, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.Optimal, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CTacticalAnalysisCoverPoints__Tunables: + return new PsoStructureInfo(MetaName.CTacticalAnalysisCoverPoints__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceMovedToStartSearch, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeBetweenSearches, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForSearch, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForSearch, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenLineOfSightTests, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenAttemptsToFindNearby, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenStatusUpdates, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.RadiusForFindNearby, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxNearbyToFindPerFrame, PsoDataType.SInt, 48, 0, 0) + ); + case MetaName.CTacticalAnalysis__Tunables: + return new PsoStructureInfo(MetaName.CTacticalAnalysis__Tunables, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.BadRoute, PsoDataType.Structure, 16, 0, (MetaName)1310298123), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 40, 0, (MetaName)1230349399), + new PsoStructureEntryInfo(MetaName.MaxSpeedToActivate, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToDeactivate, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeWithNoReferences, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 76, 0, 0) + ); + case (MetaName)1310298123: + return new PsoStructureInfo((MetaName)1310298123, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ValueForUnableToFind, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForTooCloseToTarget, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForTaint, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DecayRate, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)1230349399: + return new PsoStructureInfo((MetaName)1230349399, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverPoints, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.NavMeshPoints, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.Position, PsoDataType.Bool, 11, 0, 0), + new PsoStructureEntryInfo(MetaName.LineOfSightStatus, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ArcStatus, PsoDataType.Bool, 13, 0, 0), + new PsoStructureEntryInfo(MetaName.Reserved, PsoDataType.Bool, 14, 0, 0), + new PsoStructureEntryInfo(MetaName.Nearby, PsoDataType.Bool, 15, 0, 0), + new PsoStructureEntryInfo(MetaName.BadRouteValue, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.Reservations, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.LineOfSightTests, PsoDataType.Bool, 18, 0, 0) + ); + case MetaName.CTaskVehicleApproach__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleApproach__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceAroundClosestRoadNode, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskVehicleBlock__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleBlock__Tunables, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DistanceToCapSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToStartCappingSpeed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.AdditionalSpeedCap, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceFromTargetToForceStraightLineMode, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToLookAhead, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToLookAhead, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToStartBackAndForth, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsOurSideToStartBackAndForth, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToContinueBackAndForth, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToStartBrakeInFront, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotMovingTowardsTargetToStartBrakeInFront, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToContinueBrakeInFront, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotMovingTowardsTargetToContinueBrakeInFront, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToStartCruiseInFront, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotMovingAwayFromTargetToStartCruiseInFront, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotTargetMovingTowardsUsToContinueCruiseInFront, PsoDataType.Float, 76, 0, 0) + ); + case MetaName.CTaskVehicleBlockCruiseInFront__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleBlockCruiseInFront__Tunables, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Probes, PsoDataType.Structure, 16, 0, (MetaName)3985328803), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 56, 0, (MetaName)999261493), + new PsoStructureEntryInfo(MetaName.StraightLineDistance, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToLookAhead, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToLookAhead, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotForSlowdown, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForSlowdown, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForSlowdown, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForMinSlowdown, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForMaxSlowdown, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealDistance, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToAdjustSpeed, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToAdjustSpeed, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MinCruiseSpeedMultiplier, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCruiseSpeedMultiplier, PsoDataType.Float, 120, 0, 0) + ); + case (MetaName)3985328803: + return new PsoStructureInfo((MetaName)3985328803, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Collision, PsoDataType.Structure, 8, 0, (MetaName)1883924946) + ); + case (MetaName)1883924946: + return new PsoStructureInfo((MetaName)1883924946, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)2241187664, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)3879165256, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo((MetaName)4154217054, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinLength, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxLength, PsoDataType.Float, 24, 0, 0) + ); + case (MetaName)999261493: + return new PsoStructureInfo((MetaName)999261493, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Probe, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.ProbeResults, PsoDataType.Bool, 10, 0, 0), + new PsoStructureEntryInfo((MetaName)2932215080, PsoDataType.Bool, 11, 0, 0), + new PsoStructureEntryInfo((MetaName)1537468920, PsoDataType.Bool, 12, 0, 0) + ); + case MetaName.CTaskVehicleBlockBrakeInFront__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleBlockBrakeInFront__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeAheadForGetInPosition, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinOffsetForGetInPosition, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeAheadForBrake, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeAheadForBrakeOnWideRoads, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeForBrake, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.FutureDistanceForMinSteerAngle, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.FutureDistanceForMaxSteerAngle, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedToUseHandBrake, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToClampCruiseSpeed, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToClampCruiseSpeed, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCruiseSpeedWhenClamped, PsoDataType.Float, 56, 0, 0) + ); + case MetaName.CTaskVehicleBlockBackAndForth__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleBlockBackAndForth__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ThrottleMultiplier, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskVehicleFlee__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleFlee__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ChancesForSwerve, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForSwerve, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToSwerve, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToSwerve, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesForHesitate, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedForHesitate, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToHesitate, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToHesitate, PsoDataType.Float, 44, 0, 0) + ); + case MetaName.CTaskVehicleCruiseBoat__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleCruiseBoat__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fTimeToPickNewPoint, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fDistToPickNewPoint, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fDistSearch, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskVehicleDeadDriver__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleDeadDriver__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SwerveTime, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.SteerAngleControl, PsoDataType.Enum, 20, 0, (MetaName)888350649), + new PsoStructureEntryInfo(MetaName.MinSteerAngle, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSteerAngle, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ThrottleControl, PsoDataType.Enum, 32, 0, (MetaName)2055586340), + new PsoStructureEntryInfo(MetaName.MinThrottle, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxThrottle, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.BrakeControl, PsoDataType.Enum, 44, 0, (MetaName)3374036042), + new PsoStructureEntryInfo(MetaName.MinBrake, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBrake, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.HandBrakeControl, PsoDataType.Enum, 56, 0, (MetaName)4001255574) + ); + case MetaName.CTaskVehicleFleeBoat__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleFleeBoat__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.FleeDistance, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskVehicleCrash__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleCrash__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForWreck, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskVehicleGoToPointWithAvoidanceAutomobile__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleGoToPointWithAvoidanceAutomobile__Tunables, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TailgateDistanceMax, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TailgateIdealDistanceMin, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TailgateIdealDistanceMax, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.TailgateSpeedMultiplierMin, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TailgateSpeedMultiplierMax, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.TailgateVelocityMin, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ChanceOfPedSeeingCarFromBehind, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForAvoid, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForAvoid, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedForAvoid, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForAvoid, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceForAvoidDirected, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForAvoidDirected, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceForAvoidDirected, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedForAvoidDirected, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAbsDotForAvoidDirected, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedForBrace, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForDive, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToConsiderDangerousDriving, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MultiplierForDangerousDriving, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToSideOnPavement, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToSideOnPavement, PsoDataType.Float, 100, 0, 0) + ); + case MetaName.CTaskVehicleGoToBoat__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleGoToBoat__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SlowdownDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.RouteArrivalDistance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.RouteLookAheadDistance, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskVehicleGoToHelicopter__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleGoToHelicopter__Tunables, 0, 0, 152, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.slowDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.maxCruiseSpeed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.maxPitchRoll, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.maxThrottle, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.leanKp, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.leanKi, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.leanKd, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.yawKp, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.yawKi, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.yawKd, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.throttleKp, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.throttleKi, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.throttleKd, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.whiskerForwardTestDistance, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.whiskerForwardSpeedScale, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.whiskerLateralTestDistance, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.whiskerVerticalTestDistance, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.whiskerTestAngle, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.avoidHeadingChangeSpeed, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.avoidHeadingJump, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.avoidPitchChangeSpeed, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.avoidPitchJump, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.avoidLockDuration, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)2436197334, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)1438517312, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)444775360, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)3623227512, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)3009403254, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.numHeightmapFutureSamples, PsoDataType.SInt, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.futureHeightmapSampleTime, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceXYToUseHeightMapAvoidance, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.TimesliceMinDistToTarget, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.TimesliceTimeAfterAvoidanceMs, PsoDataType.UInt, 144, 0, 0) + ); + case MetaName.CTaskVehicleGoToPlane__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleGoToPlane__Tunables, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.numFutureSamples, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.futureSampleTime, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.maxDesiredAngleYawDegrees, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.maxDesiredAnglePitchDegrees, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.maxDesiredAngleRollDegrees, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.angleToTargetDegreesToNotUseMinRadius, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.minMinDistanceForRollComputation, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.maxMinDistanceForRollComputation, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.maxYaw, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.maxPitch, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.maxRoll, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.maxThrottle, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.yawKp, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.yawKi, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.yawKd, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.pitchKp, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.pitchKi, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.pitchKd, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.rollKp, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.rollKi, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.rollKd, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.throttleKp, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.throttleKi, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.throttleKd, PsoDataType.Float, 108, 0, 0) + ); + case MetaName.CTaskVehicleLandPlane__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleLandPlane__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SlowDownDistance, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeOnGroundToDrive, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.HeightToStartLanding, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.LandSlopeNoseUpMin, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.LandSlopeNoseUpMax, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.CTaskVehicleMissionBase__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleMissionBase__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToKeepEngineAndLightsOnWhileParked, PsoDataType.UInt, 16, 0, 0) + ); + case MetaName.CTaskVehicleParkNew__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleParkNew__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ParkingSpaceBlockedWaitTimePerAttempt, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ParkingSpaceBlockedMaxAttempts, PsoDataType.UByte, 20, 0, 0) + ); + case MetaName.CTaskVehiclePlaneChase__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehiclePlaneChase__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeed, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskVehiclePullAlongside__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehiclePullAlongside__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeToLookAhead, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToLookAhead, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.OverlapSpeedMultiplier, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedDifference, PsoDataType.Float, 28, 0, 0) + ); + case MetaName.CTaskVehiclePursue__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehiclePursue__Tunables, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DriftX, PsoDataType.Structure, 16, 0, (MetaName)42267357), + new PsoStructureEntryInfo(MetaName.DriftY, PsoDataType.Structure, 40, 0, (MetaName)42267357), + new PsoStructureEntryInfo(MetaName.TimeToLookBehind, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToLookBehind, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.SpeedDifferenceForMinDistanceToStartMatchingSpeed, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.SpeedDifferenceForMaxDistanceToStartMatchingSpeed, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToStartMatchingSpeed, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToStartMatchingSpeed, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForBackOff, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.DotToClampSpeedToMinimum, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.DotToClampSpeedToMaximum, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.SpeedForMinimumDot, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenLineOfSightChecks, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceForStraightLineModeAlways, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceForStraightLineModeIfLos, PsoDataType.Float, 112, 0, 0) + ); + case (MetaName)42267357: + return new PsoStructureInfo((MetaName)42267357, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.MinValueForCorrection, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxValueForCorrection, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRate, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskVehicleRam__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleRam__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.BackOffTimer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBackOffDistance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxBackOffDistance, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForMinBackOffDistance, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseSpeedMultiplierForMaxBackOffDistance, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.CTaskVehicleShotTire__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleShotTire__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeInSwerve, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedInSwerve, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToApplyTorque, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDotToApplyTorque, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.TorqueMultiplier, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.CTaskVehicleSpinOut__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleSpinOut__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeToLookAhead, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToLookAhead, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.BumperOverlapForMaxSpeed, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.BumperOverlapForMinSpeed, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.CatchUpSpeed, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.BumperOverlapToBeInPosition, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSidePaddingForTurn, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TurnTime, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.InvMassScale, PsoDataType.Float, 48, 0, 0) + ); + case MetaName.CPrioritizedClipSetRequestManager__Tunables: + return new PsoStructureInfo(MetaName.CPrioritizedClipSetRequestManager__Tunables, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.RenderDebugDraw, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.vScroll, PsoDataType.Float2, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fIndent, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxNumRequestsPerContext, PsoDataType.SInt, 32, 0, 0) + ); + case MetaName.CVehicleClipRequestHelper__Tunables: + return new PsoStructureInfo(MetaName.CVehicleClipRequestHelper__Tunables, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToScanForNearbyVehicle, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToScanForNearbyVehicle, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistUpdateFrequency, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistUpdateFrequency, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistPercentageToScaleScanArc, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistScanArc, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistScanArc, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableVehicleDependencies, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableStreamedVehicleAnimRequestHelper, PsoDataType.Bool, 45, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableStreamedEntryAnims, PsoDataType.Bool, 46, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableStreamedInVehicleAnims, PsoDataType.Bool, 47, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableStreamedEntryVariationAnims, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.StreamConnectedSeatAnims, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo(MetaName.StreamInVehicleAndEntryAnimsTogether, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo(MetaName.StreamEntryAndInVehicleAnimsTogether, PsoDataType.Bool, 51, 0, 0) + ); + case MetaName.CTaskInVehicleBasic__Tunables: + return new PsoStructureInfo(MetaName.CTaskInVehicleBasic__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.fSecondsInAirBeforePassengerComment, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.CTaskPlayerDrive__Tunables: + return new PsoStructureInfo(MetaName.CTaskPlayerDrive__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.StealthNoisePeriodMS, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthSpeedThresholdLow, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthSpeedThresholdHigh, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.StealthVehicleTypeFactorBicycles, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPlayerJumpOutSpeedBike, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPlayerJumpOutSpeedCar, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenAddingDangerousVehicleEvents, PsoDataType.Float, 40, 0, 0) + ); + case MetaName.CTaskCarReactToVehicleCollision__Tunables: + return new PsoStructureInfo(MetaName.CTaskCarReactToVehicleCollision__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.SlowDown, PsoDataType.Structure, 16, 0, (MetaName)3933935552), + new PsoStructureEntryInfo(MetaName.MaxDamageToIgnore, PsoDataType.Float, 56, 0, 0) + ); + case (MetaName)3933935552: + return new PsoStructureInfo((MetaName)3933935552, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.MinTimeToReact, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToReact, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxCruiseSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToHonk, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToHonkHeldDown, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ChancesToFlipOff, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTime, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTime, PsoDataType.Float, 36, 0, 0) + ); + case MetaName.CTaskEnterVehicle__Tunables: + return new PsoStructureInfo(MetaName.CTaskEnterVehicle__Tunables, 0, 0, 408, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.UseCombatEntryForAiJack, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableJackRateOverride, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableDoorHandleArmIk, PsoDataType.Bool, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableBikeHandleArmIk, PsoDataType.Bool, 19, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableSeatBoneArmIk, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableTagSyncIntoAlign, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableMoverFixups, PsoDataType.Bool, 22, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableBikePickPullUpOffsetScale, PsoDataType.Bool, 23, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableNewBikeEntry, PsoDataType.Bool, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ForcedDoorHandleArmIk, PsoDataType.Bool, 25, 0, 0), + new PsoStructureEntryInfo(MetaName.IgnoreRotationBlend, PsoDataType.Bool, 26, 0, 0), + new PsoStructureEntryInfo(MetaName.EnableBikePickUpAlign, PsoDataType.Bool, 27, 0, 0), + new PsoStructureEntryInfo((MetaName)192421777, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)509809270, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.BikePickUpAlignBlendDuration, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.GetInRate, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinMagForBikeToBeOnSide, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DistanceToEvaluateDoors, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.NetworkBlendDuration, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.NetworkBlendDurationOpenDoorCombat, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.DoorRatioToConsiderDoorOpenSteps, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.DoorRatioToConsiderDoorOpen, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.DoorRatioToConsiderDoorOpenCombat, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.DoorRatioToConsiderDoorClosed, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.DistToEntryToAllowForcedActionMode, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.VaultDepth, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.VaultHorizClearance, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.VaultVertClearance, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftPickUpTargetLerpPhaseStart, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftPickUpTargetLerpPhaseEnd, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftPullUpTargetLerpPhaseStart, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftPullUpTargetLerpPhaseEnd, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.RightPickUpTargetLerpPhaseStart, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.RightPickUpTargetLerpPhaseEnd, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.RightPullUpTargetLerpPhaseStart, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.RightPullUpTargetLerpPhaseEnd, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftPickUpTargetLerpPhaseStartBicycle, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftPickUpTargetLerpPhaseEndBicycle, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftPullUpTargetLerpPhaseStartBicycle, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftPullUpTargetLerpPhaseEndBicycle, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.RightPickUpTargetLerpPhaseStartBicycle, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.RightPickUpTargetLerpPhaseEndBicycle, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.RightPullUpTargetLerpPhaseStartBicycle, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.RightPullUpTargetLerpPhaseEndBicycle, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo((MetaName)3408785399, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToAbortOpenDoor, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToAbortOpenDoorCombat, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToAbortOpenDoorPlayer, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToRagdollOpenDoor, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToRagdollOpenDoorCombat, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToRagdollOpenDoorPlayer, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackRate, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeEnterForce, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleEnterForce, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.FastEnterExitRate, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetRearDoorOpenRatio, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxOpenRatioForOpenDoorInitialOutside, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxOpenRatioForOpenDoorOutside, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxOscillationDisplacementOutside, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxOpenRatioForOpenDoorInitialInside, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxOpenRatioForOpenDoorInside, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxOscillationDisplacementInside, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeEnterLeanAngleOvershootAmt, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeEnterLeanAngleOvershootRate, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToCheckEntryCollisionWhenIgnoring, PsoDataType.Float, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.CombatEntryBlendDuration, PsoDataType.Float, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToReactToJackForGoToDoor, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeStreamClipSetInBeforeWarpSP, PsoDataType.Float, 248, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeStreamClipSetInBeforeWarpMP, PsoDataType.Float, 252, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeStreamClipSetInBeforeSkippingCloseDoor, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeStreamShuffleClipSetInBeforeWarp, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo(MetaName.ClimbAlignTolerance, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenDoorChecks, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo(MetaName.UseSlowInOut, PsoDataType.Bool, 272, 0, 0), + new PsoStructureEntryInfo(MetaName.OpenDoorBlendDurationFromNormalAlign, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo(MetaName.OpenDoorBlendDurationFromOnVehicleAlign, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo(MetaName.OpenDoorToJackBlendDuration, PsoDataType.Float, 284, 0, 0), + new PsoStructureEntryInfo(MetaName.GroupMemberWaitMinTime, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo(MetaName.GroupMemberSlowDownDistance, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo(MetaName.GroupMemberWalkCloseDistance, PsoDataType.Float, 296, 0, 0), + new PsoStructureEntryInfo(MetaName.GroupMemberWaitDistance, PsoDataType.Float, 300, 0, 0), + new PsoStructureEntryInfo(MetaName.SecondsBeforeWarpToLeader, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo((MetaName)119275101, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo((MetaName)2217815195, PsoDataType.UInt, 312, 0, 0), + new PsoStructureEntryInfo(MetaName.DurationHeldDownEnterButtonToJackFriendly, PsoDataType.UInt, 316, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackAlivePedFromOutsideClipId, PsoDataType.String, 320, 7, 0), + new PsoStructureEntryInfo((MetaName)3431653792, PsoDataType.String, 324, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackDeadPedFromOutsideClipId, PsoDataType.String, 328, 7, 0), + new PsoStructureEntryInfo((MetaName)1983954745, PsoDataType.String, 332, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackAlivePedFromWaterClipId, PsoDataType.String, 336, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackDeadPedFromWaterClipId, PsoDataType.String, 340, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackPedFromOnVehicleClipId, PsoDataType.String, 344, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackDeadPedFromOnVehicleClipId, PsoDataType.String, 348, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackPedOnVehicleIntoWaterClipId, PsoDataType.String, 352, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultJackDeadPedOnVehicleIntoWaterClipId, PsoDataType.String, 356, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultClimbUpClipId, PsoDataType.String, 360, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultClimbUpNoDoorClipId, PsoDataType.String, 364, 7, 0), + new PsoStructureEntryInfo((MetaName)1857752806, PsoDataType.String, 368, 7, 0), + new PsoStructureEntryInfo((MetaName)536807372, PsoDataType.String, 372, 7, 0), + new PsoStructureEntryInfo((MetaName)298521545, PsoDataType.String, 376, 7, 0), + new PsoStructureEntryInfo((MetaName)3045129247, PsoDataType.String, 380, 7, 0), + new PsoStructureEntryInfo((MetaName)2509236171, PsoDataType.String, 384, 7, 0), + new PsoStructureEntryInfo((MetaName)939217889, PsoDataType.String, 388, 7, 0), + new PsoStructureEntryInfo((MetaName)3905015036, PsoDataType.String, 392, 7, 0), + new PsoStructureEntryInfo((MetaName)3309036906, PsoDataType.String, 396, 7, 0), + new PsoStructureEntryInfo((MetaName)3854657159, PsoDataType.Bool, 400, 0, 0), + new PsoStructureEntryInfo((MetaName)1405627810, PsoDataType.Bool, 401, 0, 0), + new PsoStructureEntryInfo((MetaName)2067860370, PsoDataType.Float, 404, 0, 0) + ); + case MetaName.CTaskEnterVehicleAlign__Tunables: + return new PsoStructureInfo(MetaName.CTaskEnterVehicleAlign__Tunables, 0, 0, 136, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.UseAttachDuringAlign, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.RenderDebugToTTY, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.ApplyRotationScaling, PsoDataType.Bool, 18, 0, 0), + new PsoStructureEntryInfo(MetaName.ApplyTranslationScaling, PsoDataType.Bool, 19, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableRotationOvershootCheck, PsoDataType.Bool, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableTranslationOvershootCheck, PsoDataType.Bool, 21, 0, 0), + new PsoStructureEntryInfo(MetaName.ReverseLeftFootAlignAnims, PsoDataType.Bool, 22, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceStandEnterOnly, PsoDataType.Bool, 23, 0, 0), + new PsoStructureEntryInfo(MetaName.TranslationChangeRate, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.RotationChangeRate, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultAlignRate, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.FastAlignRate, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.CombatAlignRate, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.ActionCombatAlignRate, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.StandAlignMaxDist, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.AlignSuccessMaxDist, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultAlignStartFixupPhase, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultAlignEndFixupPhase, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetRadiusForOrientatedAlignWalk, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.TargetRadiusForOrientatedAlignRun, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRotationalSpeedScale, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRotationalSpeedScale, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRotationalSpeed, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTranslationalScale, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTranslationalScale, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTranslationalStandSpeed, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTranslationalMoveSpeed, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.HeadingReachedTolerance, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.StdVehicleMinPhaseToStartRotFixup, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeVehicleMinPhaseToStartRotFixup, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.VaultExtraZGroundTest, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSqdDistToSetPos, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistAwayFromEntryPointToConsiderFinished, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPedFwdToEntryDotToClampInitialOrientation, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistToAlwaysClampInitialOrientation, PsoDataType.Float, 128, 0, 0) + ); + case MetaName.CTaskOpenVehicleDoorFromOutside__Tunables: + return new PsoStructureInfo(MetaName.CTaskOpenVehicleDoorFromOutside__Tunables, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.EnableOpenDoorHandIk, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultOpenDoorStartPhase, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultOpenDoorEndPhase, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultOpenDoorStartIkPhase, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultOpenDoorEndIkPhase, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendWeightToUseHighClipEvents, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultOpenDoorRate, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHandleHeightDiffVan, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHandleHeightDiffVan, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHandleHeightDiff, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultOpenDoorClipId, PsoDataType.String, 56, 7, 0), + new PsoStructureEntryInfo(MetaName.HighOpenDoorClipId, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo(MetaName.CombatOpenDoorClipId, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultTryLockedDoorClipId, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultForcedEntryClipId, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo((MetaName)26377711, PsoDataType.String, 76, 7, 0) + ); + case MetaName.CTaskCloseVehicleDoorFromInside__Tunables: + return new PsoStructureInfo(MetaName.CTaskCloseVehicleDoorFromInside__Tunables, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.EnableCloseDoorHandIk, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultCloseDoorStartPhase, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultCloseDoorEndPhase, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultCloseDoorStartIkPhase, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultCloseDoorEndIkPhase, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinBlendWeightToUseFarClipEvents, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.CloseDoorForceMultiplier, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.VehicleSpeedToAbortCloseDoor, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.PedTestXOffset, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.PedTestYOffset, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.PedTestZStartOffset, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.PedTestZOffset, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.PedTestRadius, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinOpenDoorRatioToUseArmIk, PsoDataType.Float, 68, 0, 0) + ); + case MetaName.CTaskEnterVehicleSeat__Tunables: + return new PsoStructureInfo(MetaName.CTaskEnterVehicleSeat__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinVelocityToRagdollPed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVelocityToEnterBike, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultGetInClipId, PsoDataType.String, 24, 7, 0), + new PsoStructureEntryInfo(MetaName.GetOnQuickClipId, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo(MetaName.GetInFromWaterClipId, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.GetInStandOnClipId, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.GetInCombatClipId, PsoDataType.String, 40, 7, 0) + ); + case MetaName.CTaskExitVehicle__Tunables: + return new PsoStructureInfo(MetaName.CTaskExitVehicle__Tunables, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TimeSinceLastSpottedToLeaveEngineOn, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.BeJackedBlendInDuration, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitVehicleBlendInDuration, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.ThroughWindScreenBlendInDuration, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitVehicleBlendOutDuration, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitVehicleUnderWaterBlendOutDuration, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitVehicleAttempToFireBlendOutDuration, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeExitVehicleBlendOutDuration, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.LeaderExitVehicleDistance, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitProbeDistance, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.ExitDistance, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.RearExitSideOffset, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelocityToRagdollPed, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToReserveComponentBeforeWarp, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraOffsetForGroundCheck, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.JumpOutofSubNeutralBuoyancyTime, PsoDataType.UInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultClimbDownClipId, PsoDataType.String, 80, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultClimbDownNoDoorClipId, PsoDataType.String, 84, 7, 0) + ); + case MetaName.CTaskExitVehicleSeat__Tunables: + return new PsoStructureInfo(MetaName.CTaskExitVehicleSeat__Tunables, 0, 0, 232, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)3909498748, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.AdditionalWindscreenRagdollForceFwd, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.AdditionalWindscreenRagdollForceUp, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.SkyDiveProbeDistance, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.InAirProbeDistance, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.ArrestProbeDistance, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.InWaterExitDepth, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.InWaterExitProbeLength, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeVelocityToUseAnimatedJumpOff, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleVelocityToUseAnimatedJumpOff, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultGetOutBlendDuration, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultGetOutNoWindBlendDuration, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeForArrestBreakout, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.ThroughWindscreenDamagePlayer, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.ThroughWindscreenDamageAi, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultCrashExitOnSideClipId, PsoDataType.String, 76, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBeJackedAlivePedFromOutsideClipId, PsoDataType.String, 80, 7, 0), + new PsoStructureEntryInfo((MetaName)2529144140, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBeJackedDeadPedFromOutsideClipId, PsoDataType.String, 88, 7, 0), + new PsoStructureEntryInfo((MetaName)3459414413, PsoDataType.String, 92, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBeJackedAlivePedFromWaterClipId, PsoDataType.String, 96, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBeJackedDeadPedFromWaterClipId, PsoDataType.String, 100, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBeJackedAlivePedOnVehicleClipId, PsoDataType.String, 104, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBeJackedDeadPedOnVehicleClipId, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBeJackedAlivePedOnVehicleIntoWaterClipId, PsoDataType.String, 112, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultBeJackedDeadPedOnVehicleIntoWaterClipId, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultFleeExitClipId, PsoDataType.String, 120, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultGetOutClipId, PsoDataType.String, 124, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultGetOutToWaterClipId, PsoDataType.String, 128, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultGetOutOnToVehicleClipId, PsoDataType.String, 132, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultGetOutNoWingId, PsoDataType.String, 136, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultJumpOutClipId, PsoDataType.String, 140, 7, 0), + new PsoStructureEntryInfo(MetaName.DeadFallOutClipId, PsoDataType.String, 144, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)609992288), + new PsoStructureEntryInfo(MetaName.ExitToAimClipSets, PsoDataType.Array, 152, 0, (MetaName)34), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3736014569), + new PsoStructureEntryInfo(MetaName.ExitToAimVehicleInfos, PsoDataType.Array, 168, 0, (MetaName)36), + new PsoStructureEntryInfo(MetaName.BikeExitForce, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.RagdollIntoWaterVelocity, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.GroundFixupHeight, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.GroundFixupHeightLarge, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.GroundFixupHeightLargeOffset, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.GroundFixupHeightBoatInWaterInitial, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.GroundFixupHeightBoatInWater, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.ExtraWaterZGroundFixup, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeExitExtraRotationSpeed, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.FleeExitExtraTranslationSpeed, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo((MetaName)1345368814, PsoDataType.String, 224, 7, 0), + new PsoStructureEntryInfo((MetaName)1495472466, PsoDataType.String, 228, 7, 0) + ); + case (MetaName)609992288: + return new PsoStructureInfo((MetaName)609992288, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Clips, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case (MetaName)3736014569: + return new PsoStructureInfo((MetaName)3736014569, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1118518303), + new PsoStructureEntryInfo(MetaName.Seats, PsoDataType.Array, 16, 0, (MetaName)1) + ); + case (MetaName)1118518303: + return new PsoStructureInfo((MetaName)1118518303, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ExitToAimClipsName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.OneHandedClipSetName, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.TwoHandedClipSetName, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo(MetaName.SeatPosition, PsoDataType.Enum, 20, 0, (MetaName)894416699) + ); + case MetaName.CTaskReactToBeingAskedToLeaveVehicle__Tunables: + return new PsoStructureInfo(MetaName.CTaskReactToBeingAskedToLeaveVehicle__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToWatchVehicle, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToWatchVehicle, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskRideTrain__Tunables: + return new PsoStructureInfo(MetaName.CTaskRideTrain__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDelayForGetOff, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayForGetOff, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxWaitSeconds, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskTrainBase__Tunables: + return new PsoStructureInfo(MetaName.CTaskTrainBase__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TargetRadius, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.CompletionRadius, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowDownDistance, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskTryToGrabVehicleDoor__Tunables: + return new PsoStructureInfo(MetaName.CTaskTryToGrabVehicleDoor__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinGrabTime, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxGrabTime, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHandToHandleDistance, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CTaskVehicleFSM__Tunables: + return new PsoStructureInfo(MetaName.CTaskVehicleFSM__Tunables, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.AllowEntryToMPWarpInSeats, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ForceStreamingFailure, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.PushAngleDotTolerance, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.TowardsDoorPushAngleDotTolerance, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DeadZoneAnyInputDirection, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DisallowGroundProbeVelocity, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPedSpeedToActivateRagdoll, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPhysSpeedToActivateRagdoll, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHoverHeightDistToWarpIntoHeli, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToConsiderPedGoingToDoorPriority, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeToConsiderPedGoingToDoorPriority, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistToConsiderPedGoingToDoorPriority, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)1835160785, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)1964009554, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)2552082535, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)3034610967, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeToConsiderEnterInputValid, PsoDataType.UInt, 76, 0, 0) + ); + case MetaName.CTaskMotionInVehicle__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionInVehicle__Tunables, 0, 0, 208, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.DisableCloseDoor, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3306188437, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedForVehicleToBeConsideredStillSqr, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityDeltaThrownOut, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityDeltaThrownOutPlayerSP, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.VelocityDeltaThrownOutPlayerMP, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRateForInVehicleAnims, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRateForInVehicleAnims, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.HeavyBrakeYAcceleration, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MinRatioForClosingDoor, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.InAirZAccelTrigger, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.InAirProbeDistance, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.InAirProbeForwardOffset, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPitchDefault, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitchDefault, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPitchInAir, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitchInAir, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultPitchSmoothingRate, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.BikePitchSmoothingRate, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.BikePitchSmoothingPassengerRate, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.WheelieAccelerateControlThreshold, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.WheelieMaxSpeedThreshold, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.WheelieUpDownControlThreshold, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.WheelieDesiredLeanAngleTol, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.StillAccTol, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.StillPitchAngleTol, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.AccelerationSmoothing, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.AccelerationSmoothingBike, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.AccelerationScaleBike, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInCurrentStateForStill, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.AccelerationToStartLeaning, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.ZAccelerationToStartLeaning, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAccelerationForLean, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxXYAccelerationForLeanBike, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZAccelerationForLeanBike, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.StillDelayTime, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.ShuntAccelerateMag, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.ShuntAccelerateMagBike, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInShuntStateBeforeRestart, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAbsThrottleForCloseDoor, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVehSpeedToConsiderClosingDoor, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDoorSpeedToConsiderClosingDoor, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVehVelocityToGoThroughWindscreen, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVehVelocityToGoThroughWindscreenMP, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxZComponentForCollisionNormal, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeStreamInVehicleClipSetBeforeStartingEngine, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo((MetaName)599372255, PsoDataType.UInt, 200, 0, 0) + ); + case MetaName.CTaskMotionInAutomobile__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionInAutomobile__Tunables, 0, 0, 536, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.TestLowLodIdle, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3645563068, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2286839301, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInHornState, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxVelocityForSitIdles, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSteeringAngleForSitIdles, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MinCentredSteeringAngleTimeForSitIdles, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleSmoothingRateMin, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleSmoothingRateMax, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleSmoothingAcc, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleMinAccAngle, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanSidewaysAngleMaxAccAngle, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftRightStickInputSmoothingRate, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.LeftRightStickInputMin, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanForwardsAngleSmoothingRate, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.UpDownStickInputSmoothingRate, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.UpDownStickInputMin, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.ZAccForLowImpact, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.ZAccForMedImpact, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.ZAccForHighImpact, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.UseLegIkOnBikes, PsoDataType.Bool, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.LargeVerticalAccelerationDelta, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.NumFramesToPersistLargeVerticalAcceleration, PsoDataType.SInt, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.LowLodIdleClipSetId, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo(MetaName.SeatDisplacementSmoothingRateDriver, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.SeatDisplacementSmoothingRatePassenger, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)3038905403, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.StartEngineForce, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardsPitchSlope, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardsPitchSlope, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardsPitchSlopeBalance, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardsPitchSlopeBalance, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeInWheelieToEnforceMinPitch, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardsPitchWheelieBalance, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardsPitchWheelieBalance, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardsPitchWheelieBegin, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowFastSpeedThreshold, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardsPitchSlowSpeed, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardsPitchSlowSpeed, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardsPitchFastSpeed, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardsPitchFastSpeed, PsoDataType.Float, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowApproachRate, PsoDataType.Float, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.FastApproachRate, PsoDataType.Float, 184, 0, 0), + new PsoStructureEntryInfo(MetaName.WheelieApproachRate, PsoDataType.Float, 188, 0, 0), + new PsoStructureEntryInfo(MetaName.NewLeanSteerApproachRate, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenCloseDoorAttempts, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo(MetaName.ShuntDamageMultiplierAI, PsoDataType.Float, 200, 0, 0), + new PsoStructureEntryInfo(MetaName.ShuntDamageMultiplierPlayer, PsoDataType.Float, 204, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDamageTakenToApplyDamageAI, PsoDataType.Float, 208, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDamageTakenToApplyDamagePlayer, PsoDataType.Float, 212, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInTaskToCheckForDamage, PsoDataType.Float, 216, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDamageToCheckForRandomDeath, PsoDataType.Float, 220, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDamageToCheckForRandomDeath, PsoDataType.Float, 224, 0, 0), + new PsoStructureEntryInfo(MetaName.MinHeavyCrashDeathChance, PsoDataType.Float, 228, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxHeavyCrashDeathChance, PsoDataType.Float, 232, 0, 0), + new PsoStructureEntryInfo(MetaName.SteeringDeadZoneCentreTimeMS, PsoDataType.UInt, 236, 0, 0), + new PsoStructureEntryInfo(MetaName.SteeringDeadZoneTimeMS, PsoDataType.UInt, 240, 0, 0), + new PsoStructureEntryInfo(MetaName.SteeringDeadZone, PsoDataType.Float, 244, 0, 0), + new PsoStructureEntryInfo(MetaName.SteeringChangeToStartProcessMoveSignals, PsoDataType.Float, 248, 0, 0), + new PsoStructureEntryInfo(MetaName.SteeringChangeToStopProcessMoveSignals, PsoDataType.Float, 252, 0, 0), + new PsoStructureEntryInfo(MetaName.SeatBlendLinSpeed, PsoDataType.Float, 256, 0, 0), + new PsoStructureEntryInfo(MetaName.SeatBlendAngSpeed, PsoDataType.Float, 260, 0, 0), + new PsoStructureEntryInfo(MetaName.HoldLegOutVelocity, PsoDataType.Float, 264, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelStillStart, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo(MetaName.MinVelStillStop, PsoDataType.Float, 272, 0, 0), + new PsoStructureEntryInfo(MetaName.ForcedLegUpVelocity, PsoDataType.Float, 276, 0, 0), + new PsoStructureEntryInfo(MetaName.BurnOutBlendInTol, PsoDataType.Float, 280, 0, 0), + new PsoStructureEntryInfo(MetaName.BurnOutBlendInSpeed, PsoDataType.Float, 284, 0, 0), + new PsoStructureEntryInfo(MetaName.BurnOutBlendOutSpeed, PsoDataType.Float, 288, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeInAirDriveToStandUpTimeMin, PsoDataType.Float, 292, 0, 0), + new PsoStructureEntryInfo(MetaName.BikeInAirDriveToStandUpTimeMax, PsoDataType.Float, 296, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSpeedToBlendInDriveFastFacial, PsoDataType.Float, 300, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDisplacementScale, PsoDataType.Float, 304, 0, 0), + new PsoStructureEntryInfo(MetaName.DisplacementScaleApproachRateIn, PsoDataType.Float, 308, 0, 0), + new PsoStructureEntryInfo(MetaName.DisplacementScaleApproachRateOut, PsoDataType.Float, 312, 0, 0), + new PsoStructureEntryInfo((MetaName)640640576, PsoDataType.Float, 316, 0, 0), + new PsoStructureEntryInfo((MetaName)445721091, PsoDataType.Float, 320, 0, 0), + new PsoStructureEntryInfo((MetaName)2001571571, PsoDataType.Float, 324, 0, 0), + new PsoStructureEntryInfo((MetaName)1295618163, PsoDataType.Float, 328, 0, 0), + new PsoStructureEntryInfo((MetaName)622968896, PsoDataType.Float, 332, 0, 0), + new PsoStructureEntryInfo((MetaName)2029080904, PsoDataType.Float, 336, 0, 0), + new PsoStructureEntryInfo((MetaName)2895820001, PsoDataType.Float, 340, 0, 0), + new PsoStructureEntryInfo((MetaName)3604323696, PsoDataType.Float, 344, 0, 0), + new PsoStructureEntryInfo((MetaName)2175428814, PsoDataType.Float, 348, 0, 0), + new PsoStructureEntryInfo((MetaName)346108670, PsoDataType.Float, 352, 0, 0), + new PsoStructureEntryInfo((MetaName)3123171906, PsoDataType.Float, 356, 0, 0), + new PsoStructureEntryInfo((MetaName)3193879405, PsoDataType.Float, 360, 0, 0), + new PsoStructureEntryInfo((MetaName)1771118662, PsoDataType.Float, 364, 0, 0), + new PsoStructureEntryInfo((MetaName)1104842114, PsoDataType.Float, 368, 0, 0), + new PsoStructureEntryInfo((MetaName)2239621028, PsoDataType.UInt, 372, 0, 0), + new PsoStructureEntryInfo((MetaName)7898446, PsoDataType.UInt, 376, 0, 0), + new PsoStructureEntryInfo((MetaName)56684479, PsoDataType.UInt, 380, 0, 0), + new PsoStructureEntryInfo((MetaName)345487015, PsoDataType.UInt, 384, 0, 0), + new PsoStructureEntryInfo(MetaName.StartEngineClipId, PsoDataType.String, 388, 7, 0), + new PsoStructureEntryInfo((MetaName)2195918560, PsoDataType.String, 392, 7, 0), + new PsoStructureEntryInfo(MetaName.HotwireClipId, PsoDataType.String, 396, 7, 0), + new PsoStructureEntryInfo((MetaName)1348667163, PsoDataType.String, 400, 7, 0), + new PsoStructureEntryInfo(MetaName.PutOnHelmetClipId, PsoDataType.String, 404, 7, 0), + new PsoStructureEntryInfo((MetaName)1430534928, PsoDataType.String, 408, 7, 0), + new PsoStructureEntryInfo((MetaName)1851449258, PsoDataType.String, 412, 7, 0), + new PsoStructureEntryInfo((MetaName)2091354753, PsoDataType.String, 416, 7, 0), + new PsoStructureEntryInfo((MetaName)1023392893, PsoDataType.String, 420, 7, 0), + new PsoStructureEntryInfo((MetaName)2273702662, PsoDataType.String, 424, 7, 0), + new PsoStructureEntryInfo(MetaName.ChangeStationClipId, PsoDataType.String, 428, 7, 0), + new PsoStructureEntryInfo(MetaName.StillToSitClipId, PsoDataType.String, 432, 7, 0), + new PsoStructureEntryInfo(MetaName.SitToStillClipId, PsoDataType.String, 436, 7, 0), + new PsoStructureEntryInfo(MetaName.BurnOutClipId, PsoDataType.String, 440, 7, 0), + new PsoStructureEntryInfo((MetaName)1920935636, PsoDataType.String, 444, 7, 0), + new PsoStructureEntryInfo(MetaName.BikeHornClipId, PsoDataType.String, 448, 7, 0), + new PsoStructureEntryInfo((MetaName)4017603423, PsoDataType.String, 452, 7, 0), + new PsoStructureEntryInfo((MetaName)1797630730, PsoDataType.Float, 456, 0, 0), + new PsoStructureEntryInfo((MetaName)2658529211, PsoDataType.Float, 460, 0, 0), + new PsoStructureEntryInfo((MetaName)3474960988, PsoDataType.Float, 464, 0, 0), + new PsoStructureEntryInfo((MetaName)3061913457, PsoDataType.Float, 468, 0, 0), + new PsoStructureEntryInfo((MetaName)2713284751, PsoDataType.Float, 472, 0, 0), + new PsoStructureEntryInfo((MetaName)2044390676, PsoDataType.Float, 476, 0, 0), + new PsoStructureEntryInfo((MetaName)137806659, PsoDataType.Float, 480, 0, 0), + new PsoStructureEntryInfo((MetaName)402428981, PsoDataType.Float, 484, 0, 0), + new PsoStructureEntryInfo((MetaName)1039484179, PsoDataType.Float, 488, 0, 0), + new PsoStructureEntryInfo((MetaName)342194320, PsoDataType.Float, 492, 0, 0), + new PsoStructureEntryInfo((MetaName)2083391331, PsoDataType.Float, 496, 0, 0), + new PsoStructureEntryInfo((MetaName)2714021858, PsoDataType.Float, 500, 0, 0), + new PsoStructureEntryInfo((MetaName)2266547610, PsoDataType.Float, 504, 0, 0), + new PsoStructureEntryInfo((MetaName)1896779219, PsoDataType.Float, 508, 0, 0), + new PsoStructureEntryInfo((MetaName)1233910025, PsoDataType.Float, 512, 0, 0), + new PsoStructureEntryInfo((MetaName)1743777174, PsoDataType.Float, 516, 0, 0), + new PsoStructureEntryInfo((MetaName)868848233, PsoDataType.Float, 520, 0, 0), + new PsoStructureEntryInfo((MetaName)1182962200, PsoDataType.Float, 524, 0, 0), + new PsoStructureEntryInfo((MetaName)1798674235, PsoDataType.Float, 528, 0, 0), + new PsoStructureEntryInfo((MetaName)647907606, PsoDataType.Float, 532, 0, 0) + ); + case MetaName.CTaskMotionOnBicycle__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionOnBicycle__Tunables, 0, 0, 224, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.LeanAngleSmoothingRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.StillToSitPedalGearApproachRate, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.PedalGearApproachRate, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinXYVelForWantsToMove, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedForStill, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedForStillReverse, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxThrottleForStill, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultPedalToFreewheelBlendDuration, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.SlowPedalToFreewheelBlendDuration, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxRateForSlowBlendDuration, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.StillToSitLeanRate, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.StillToSitApproachRate, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.UpHillMinPitchToStandUp, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.DownHillMinPitchToStandUp, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInStandState, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1621924028, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.MinSprintResultToStand, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeSinceShiftedWeightForwardToAllowWheelie, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.WheelieShiftThreshold, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.MinPitchDefault, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitchDefault, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForwardsPitchSlope, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxForwardsPitchSlope, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.OnSlopeThreshold, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxJumpHeightForSmallImpact, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.LongitudinalBodyLeanApproachRateSlope, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.LongitudinalBodyLeanApproachRate, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.LongitudinalBodyLeanApproachRateSlow, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.SideZoneThreshold, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.ReturnZoneThreshold, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxYIntentionToUseSlowApproach, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeToStayUprightAfterImpact, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultSitToStandBlendDuration, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.WheelieSitToStandBlendDuration, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.WheelieStickPullBackMinIntention, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeSinceNotWantingToTrackStandToAllowStillTransition, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInSitToStillStateToReverse, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.PreventDirectTransitionToReverseFromSit, PsoDataType.Bool, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultSmallImpactCharClipId, PsoDataType.String, 168, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultImpactCharClipId, PsoDataType.String, 172, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultSmallImpactBikeClipId, PsoDataType.String, 176, 7, 0), + new PsoStructureEntryInfo(MetaName.DefaultImpactBikeClipId, PsoDataType.String, 180, 7, 0), + new PsoStructureEntryInfo(MetaName.DownHillSmallImpactCharClipId, PsoDataType.String, 184, 7, 0), + new PsoStructureEntryInfo(MetaName.DownHillImpactCharClipId, PsoDataType.String, 188, 7, 0), + new PsoStructureEntryInfo(MetaName.DownHillSmallImpactBikeClipId, PsoDataType.String, 192, 7, 0), + new PsoStructureEntryInfo(MetaName.DownHillImpactBikeClipId, PsoDataType.String, 196, 7, 0), + new PsoStructureEntryInfo(MetaName.SitToStillCharClipId, PsoDataType.String, 200, 7, 0), + new PsoStructureEntryInfo(MetaName.SitToStillBikeClipId, PsoDataType.String, 204, 7, 0), + new PsoStructureEntryInfo(MetaName.TrackStandToStillLeftCharClipId, PsoDataType.String, 208, 7, 0), + new PsoStructureEntryInfo(MetaName.TrackStandToStillLeftBikeClipId, PsoDataType.String, 212, 7, 0), + new PsoStructureEntryInfo(MetaName.TrackStandToStillRightCharClipId, PsoDataType.String, 216, 7, 0), + new PsoStructureEntryInfo(MetaName.TrackStandToStillRightBikeClipId, PsoDataType.String, 220, 7, 0) + ); + case MetaName.CTaskMotionOnBicycleController__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionOnBicycleController__Tunables, 0, 0, 184, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInStateToAllowTransitionFromFixieSkid, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeStillToTransitionToTrackStand, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInPedalState, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeInFreewheelState, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAiSpeedForStandingUp, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedToTriggerTrackStandTransition, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxSpeedToTriggerFixieSkidTransition, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.CruiseDuckPrepLeftCharClipId, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.CruiseDuckPrepRightCharClipId, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.CruiseDuckPrepLeftBikeClipId, PsoDataType.String, 52, 7, 0), + new PsoStructureEntryInfo(MetaName.CruiseDuckPrepRightBikeClipId, PsoDataType.String, 56, 7, 0), + new PsoStructureEntryInfo(MetaName.FastDuckPrepLeftCharClipId, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo(MetaName.FastDuckPrepRightCharClipId, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo(MetaName.FastDuckPrepLeftBikeClipId, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo(MetaName.FastDuckPrepRightBikeClipId, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo(MetaName.LaunchLeftCharClipId, PsoDataType.String, 76, 7, 0), + new PsoStructureEntryInfo(MetaName.LaunchRightCharClipId, PsoDataType.String, 80, 7, 0), + new PsoStructureEntryInfo(MetaName.LaunchLeftBikeClipId, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo(MetaName.LaunchRightBikeClipId, PsoDataType.String, 88, 7, 0), + new PsoStructureEntryInfo(MetaName.TrackStandLeftCharClipId, PsoDataType.String, 92, 7, 0), + new PsoStructureEntryInfo(MetaName.TrackStandRightCharClipId, PsoDataType.String, 96, 7, 0), + new PsoStructureEntryInfo(MetaName.TrackStandLeftBikeClipId, PsoDataType.String, 100, 7, 0), + new PsoStructureEntryInfo(MetaName.TrackStandRightBikeClipId, PsoDataType.String, 104, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidLeftCharClip0Id, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidLeftCharClip1Id, PsoDataType.String, 112, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidRightCharClip0Id, PsoDataType.String, 116, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidRightCharClip1Id, PsoDataType.String, 120, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidLeftBikeClip0Id, PsoDataType.String, 124, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidLeftBikeClip1Id, PsoDataType.String, 128, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidRightBikeClip0Id, PsoDataType.String, 132, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidRightBikeClip1Id, PsoDataType.String, 136, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidToBalanceLeftCharClip1Id, PsoDataType.String, 140, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidToBalanceRightCharClip1Id, PsoDataType.String, 144, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidToBalanceLeftBikeClip1Id, PsoDataType.String, 148, 7, 0), + new PsoStructureEntryInfo(MetaName.FixieSkidToBalanceRightBikeClip1Id, PsoDataType.String, 152, 7, 0), + new PsoStructureEntryInfo(MetaName.CruisePedalCharClipId, PsoDataType.String, 156, 7, 0), + new PsoStructureEntryInfo(MetaName.InAirFreeWheelCharClipId, PsoDataType.String, 160, 7, 0), + new PsoStructureEntryInfo(MetaName.InAirFreeWheelBikeClipId, PsoDataType.String, 164, 7, 0), + new PsoStructureEntryInfo(MetaName.DownHillInAirFreeWheelCharClipId, PsoDataType.String, 168, 7, 0), + new PsoStructureEntryInfo(MetaName.DownHillInAirFreeWheelBikeClipId, PsoDataType.String, 172, 7, 0), + new PsoStructureEntryInfo(MetaName.TuckFreeWheelToTrackStandRightCharClipId, PsoDataType.String, 176, 7, 0), + new PsoStructureEntryInfo(MetaName.TuckFreeWheelToTrackStandRightBikeClipId, PsoDataType.String, 180, 7, 0) + ); + case MetaName.CBikeLeanAngleHelper__Tunables: + return new PsoStructureInfo(MetaName.CBikeLeanAngleHelper__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.UseReturnOvershoot, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.UseInitialLeanForcing, PsoDataType.Bool, 17, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredLeanAngleTolToBringLegIn, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredSpeedToBringLegIn, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredLeanAngleRate, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredLeanAngleRateQuad, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanAngleReturnRate, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanAngleDefaultRate, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanAngleDefaultRatePassenger, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.DesiredOvershootLeanAngle, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.LeanAngleReturnedTol, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.HasStickInputThreshold, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.LeaningExtremeThreshold, PsoDataType.Float, 60, 0, 0) + ); + case MetaName.CTaskMotionInTurret__Tunables: + return new PsoStructureInfo(MetaName.CTaskMotionInTurret__Tunables, 0, 0, 248, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)4093217060, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)4102381397, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2540703340, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3512769803, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo((MetaName)171275597, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)2073783636, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)1235675432, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)2737439830, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)1027124968, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2183745831, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3114603561, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)943989780, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2556074717, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1811862646, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)216639291, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)1460193378, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)3098186043, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)1012095486, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)1934656831, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)2982819675, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)2624331049, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo((MetaName)1324859893, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo((MetaName)1057562451, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo((MetaName)1546988642, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo((MetaName)3067513344, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo((MetaName)1707713717, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo((MetaName)2395321832, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)1059545904, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)3062906436, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo((MetaName)2949666078, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo((MetaName)705780320, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo((MetaName)459162028, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo((MetaName)1797630730, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo((MetaName)1465756410, PsoDataType.String, 148, 7, 0), + new PsoStructureEntryInfo((MetaName)1144665981, PsoDataType.String, 152, 7, 0), + new PsoStructureEntryInfo((MetaName)790728667, PsoDataType.String, 156, 7, 0), + new PsoStructureEntryInfo((MetaName)2997429282, PsoDataType.String, 160, 7, 0), + new PsoStructureEntryInfo((MetaName)2148334725, PsoDataType.String, 164, 7, 0), + new PsoStructureEntryInfo((MetaName)356569692, PsoDataType.String, 168, 7, 0), + new PsoStructureEntryInfo((MetaName)2567235955, PsoDataType.String, 172, 7, 0), + new PsoStructureEntryInfo((MetaName)3042448153, PsoDataType.String, 176, 7, 0), + new PsoStructureEntryInfo(MetaName.TurnLeftSlowClipId, PsoDataType.String, 180, 7, 0), + new PsoStructureEntryInfo(MetaName.TurnLeftFastClipId, PsoDataType.String, 184, 7, 0), + new PsoStructureEntryInfo((MetaName)1206230540, PsoDataType.String, 188, 7, 0), + new PsoStructureEntryInfo((MetaName)3713053450, PsoDataType.String, 192, 7, 0), + new PsoStructureEntryInfo((MetaName)2463362878, PsoDataType.String, 196, 7, 0), + new PsoStructureEntryInfo((MetaName)3874294070, PsoDataType.String, 200, 7, 0), + new PsoStructureEntryInfo(MetaName.TurnRightSlowClipId, PsoDataType.String, 204, 7, 0), + new PsoStructureEntryInfo(MetaName.TurnRightFastClipId, PsoDataType.String, 208, 7, 0), + new PsoStructureEntryInfo((MetaName)1611862735, PsoDataType.String, 212, 7, 0), + new PsoStructureEntryInfo((MetaName)413072568, PsoDataType.String, 216, 7, 0), + new PsoStructureEntryInfo((MetaName)1114189303, PsoDataType.String, 220, 7, 0), + new PsoStructureEntryInfo((MetaName)531096295, PsoDataType.String, 224, 7, 0), + new PsoStructureEntryInfo((MetaName)2077576253, PsoDataType.String, 228, 7, 0), + new PsoStructureEntryInfo((MetaName)3278999439, PsoDataType.String, 232, 7, 0), + new PsoStructureEntryInfo((MetaName)4038706223, PsoDataType.String, 236, 7, 0), + new PsoStructureEntryInfo((MetaName)1558752243, PsoDataType.String, 240, 7, 0), + new PsoStructureEntryInfo((MetaName)4031618294, PsoDataType.String, 244, 7, 0) + ); + case MetaName.CWanted__Tunables: + return new PsoStructureInfo(MetaName.CWanted__Tunables, 0, 0, 2696, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.WantedClean, PsoDataType.Structure, 16, 0, MetaName.CWanted__Tunables__WantedLevel), + new PsoStructureEntryInfo(MetaName.WantedLevel1, PsoDataType.Structure, 128, 0, MetaName.CWanted__Tunables__WantedLevel), + new PsoStructureEntryInfo(MetaName.WantedLevel2, PsoDataType.Structure, 240, 0, MetaName.CWanted__Tunables__WantedLevel), + new PsoStructureEntryInfo(MetaName.WantedLevel3, PsoDataType.Structure, 352, 0, MetaName.CWanted__Tunables__WantedLevel), + new PsoStructureEntryInfo(MetaName.WantedLevel4, PsoDataType.Structure, 464, 0, MetaName.CWanted__Tunables__WantedLevel), + new PsoStructureEntryInfo(MetaName.WantedLevel5, PsoDataType.Structure, 576, 0, MetaName.CWanted__Tunables__WantedLevel), + new PsoStructureEntryInfo(MetaName.Difficulty, PsoDataType.Structure, 688, 0, (MetaName)2685546187), + new PsoStructureEntryInfo(MetaName.Rendering, PsoDataType.Structure, 2640, 0, (MetaName)1581603972), + new PsoStructureEntryInfo(MetaName.Timers, PsoDataType.Structure, 2656, 0, (MetaName)4245193745), + new PsoStructureEntryInfo(MetaName.MaxTimeTargetVehicleMoving, PsoDataType.UInt, 2672, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultAmnestyTime, PsoDataType.UInt, 2676, 0, 0), + new PsoStructureEntryInfo(MetaName.DefaultHiddenEvasionTimeReduction, PsoDataType.UInt, 2680, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialAreaTimeoutWhenSeen, PsoDataType.UInt, 2684, 0, 0), + new PsoStructureEntryInfo(MetaName.InitialAreaTimeoutWhenCrimeReported, PsoDataType.UInt, 2688, 0, 0), + new PsoStructureEntryInfo((MetaName)2940774268, PsoDataType.Float, 2692, 0, 0) + ); + case MetaName.CWanted__Tunables__WantedLevel: + return new PsoStructureInfo(MetaName.CWanted__Tunables__WantedLevel, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.Difficulty, PsoDataType.Structure, 8, 0, (MetaName)3660423994) + ); + case (MetaName)3660423994: + return new PsoStructureInfo((MetaName)3660423994, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.Calculation, PsoDataType.Structure, 8, 0, (MetaName)1037717481), + new PsoStructureEntryInfo(MetaName.Helis, PsoDataType.Structure, 72, 0, (MetaName)3986648608) + ); + case (MetaName)1037717481: + return new PsoStructureInfo((MetaName)1037717481, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.FromWantedLevel, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Weights, PsoDataType.Structure, 16, 0, (MetaName)1310408174), + new PsoStructureEntryInfo(MetaName.Decay, PsoDataType.Structure, 40, 0, (MetaName)3442100148) + ); + case (MetaName)1310408174: + return new PsoStructureInfo((MetaName)1310408174, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.WantedLevel, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.LastSpottedDistance, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Randomness, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)3442100148: + return new PsoStructureInfo((MetaName)3442100148, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.TimeEvadingForMaxValue, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxValue, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableWhenOffMission, PsoDataType.Bool, 16, 0, 0) + ); + case (MetaName)3986648608: + return new PsoStructureInfo((MetaName)3986648608, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Refuel, PsoDataType.Structure, 8, 0, (MetaName)2123007699) + ); + case (MetaName)2123007699: + return new PsoStructureInfo((MetaName)2123007699, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBefore, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.Delay, PsoDataType.Float, 16, 0, 0) + ); + case (MetaName)2685546187: + return new PsoStructureInfo((MetaName)2685546187, 0, 0, 1952, + new PsoStructureEntryInfo(MetaName.Spawning, PsoDataType.Structure, 8, 0, (MetaName)2145739988), + new PsoStructureEntryInfo(MetaName.Despawning, PsoDataType.Structure, 152, 0, (MetaName)1602748523), + new PsoStructureEntryInfo(MetaName.Peds, PsoDataType.Structure, 280, 0, (MetaName)3209293959), + new PsoStructureEntryInfo(MetaName.Dispatch, PsoDataType.Structure, 1920, 0, (MetaName)3840146119) + ); + case (MetaName)2145739988: + return new PsoStructureInfo((MetaName)2145739988, 0, 0, 144, + new PsoStructureEntryInfo(MetaName.Scoring, PsoDataType.Structure, 8, 0, (MetaName)3801009121), + new PsoStructureEntryInfo(MetaName.IdealDistance, PsoDataType.Structure, 96, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.ChancesToForceWaitInFront, PsoDataType.Structure, 120, 0, (MetaName)2528332511) + ); + case (MetaName)3801009121: + return new PsoStructureInfo((MetaName)3801009121, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.Weights, PsoDataType.Structure, 8, 0, (MetaName)2379615087) + ); + case (MetaName)2379615087: + return new PsoStructureInfo((MetaName)2379615087, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Distance, PsoDataType.Structure, 8, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.Direction, PsoDataType.Structure, 32, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.Randomness, PsoDataType.Structure, 56, 0, (MetaName)2528332511) + ); + case (MetaName)2528332511: + return new PsoStructureInfo((MetaName)2528332511, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Min, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Max, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMin, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.ValueForMax, PsoDataType.Float, 20, 0, 0) + ); + case (MetaName)1602748523: + return new PsoStructureInfo((MetaName)1602748523, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.MaxFacingThreshold, PsoDataType.Structure, 8, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.MaxMovingThreshold, PsoDataType.Structure, 32, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.MinDistanceToBeConsideredLaggingBehind, PsoDataType.Structure, 56, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.MinDistanceToCheckClumped, PsoDataType.Structure, 80, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.MaxDistanceToBeConsideredClumped, PsoDataType.Structure, 104, 0, (MetaName)2528332511) + ); + case (MetaName)3209293959: + return new PsoStructureInfo((MetaName)3209293959, 0, 0, 1640, + new PsoStructureEntryInfo(MetaName.Cops, PsoDataType.Structure, 8, 0, (MetaName)2022711333), + new PsoStructureEntryInfo(MetaName.Swat, PsoDataType.Structure, 552, 0, (MetaName)2022711333), + new PsoStructureEntryInfo(MetaName.Army, PsoDataType.Structure, 1096, 0, (MetaName)2022711333) + ); + case (MetaName)2022711333: + return new PsoStructureInfo((MetaName)2022711333, 0, 0, 544, + new PsoStructureEntryInfo(MetaName.Situations, PsoDataType.Structure, 8, 0, (MetaName)1181208064), + new PsoStructureEntryInfo(MetaName.AutomobileSpeedModifier, PsoDataType.Structure, 496, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.HeliSpeedModifier, PsoDataType.Structure, 520, 0, (MetaName)2528332511) + ); + case (MetaName)1181208064: + return new PsoStructureInfo((MetaName)1181208064, 0, 0, 488, + new PsoStructureEntryInfo(MetaName.Default, PsoDataType.Structure, 8, 0, (MetaName)3795144262), + new PsoStructureEntryInfo(MetaName.InVehicle, PsoDataType.Structure, 128, 0, (MetaName)3795144262), + new PsoStructureEntryInfo(MetaName.InHeli, PsoDataType.Structure, 248, 0, (MetaName)3795144262), + new PsoStructureEntryInfo(MetaName.InBoat, PsoDataType.Structure, 368, 0, (MetaName)3795144262) + ); + case (MetaName)3795144262: + return new PsoStructureInfo((MetaName)3795144262, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.SensesRange, PsoDataType.Structure, 8, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.IdentificationRange, PsoDataType.Structure, 32, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.ShootRateModifier, PsoDataType.Structure, 56, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.WeaponAccuracy, PsoDataType.Structure, 80, 0, (MetaName)2528332511), + new PsoStructureEntryInfo(MetaName.WeaponAccuracyModifierForEvasiveMovement, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponAccuracyModifierForOffScreen, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponAccuracyModifierForAimedAt, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MinForDrivebys, PsoDataType.Float, 116, 0, 0) + ); + case (MetaName)3840146119: + return new PsoStructureInfo((MetaName)3840146119, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.TimeBetweenSpawnAttemptsModifier, PsoDataType.Structure, 8, 0, (MetaName)2528332511) + ); + case (MetaName)1581603972: + return new PsoStructureInfo((MetaName)1581603972, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.Enabled, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.Witnesses, PsoDataType.Bool, 9, 0, 0), + new PsoStructureEntryInfo(MetaName.Crimes, PsoDataType.Bool, 10, 0, 0) + ); + case (MetaName)4245193745: + return new PsoStructureInfo((MetaName)4245193745, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.TimeBetweenDifficultyUpdates, PsoDataType.Float, 8, 0, 0) + ); + case MetaName.CEventGunAimedAt__Tunables: + return new PsoStructureInfo(MetaName.CEventGunAimedAt__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CEventGunShot__Tunables: + return new PsoStructureInfo(MetaName.CEventGunShot__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.GunShotThresholdDistance, PsoDataType.Float, 24, 0, 0) + ); + case MetaName.CEventMeleeAction__Tunables: + return new PsoStructureInfo(MetaName.CEventMeleeAction__Tunables, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinDelayTimer, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDelayTimer, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.CTaskAimAndThrowProjectile__Tunables: + return new PsoStructureInfo(MetaName.CTaskAimAndThrowProjectile__Tunables, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.bEnableGaitAdditive, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinHoldThrowPitch, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.iMaxRandomExplosionTime, PsoDataType.UInt, 24, 0, 0) + ); + case MetaName.CTaskSwapWeapon__Tunables: + return new PsoStructureInfo(MetaName.CTaskSwapWeapon__Tunables, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.OnFootClipRate, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.OnFootBlendInDuration, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.LowCoverClipRate, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.LowCoverBlendInDuration, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.HighCoverClipRate, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.HighCoverBlendInDuration, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.ActionClipRate, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.ActionBlendInDuration, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.BlendOutDuration, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2181619027, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DebugSwapInstantly, PsoDataType.Bool, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.SkipHolsterWeapon, PsoDataType.Bool, 57, 0, 0) + ); + case MetaName.CTaskAimGunOnFoot__Tunables: + return new PsoStructureInfo(MetaName.CTaskAimGunOnFoot__Tunables, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenFiringVariations, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.IdealPitchForFiringVariation, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxPitchDifferenceForFiringVariation, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.AssistedAimOutroTime, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.RunAndGunOutroTime, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AimOutroTime, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AimOutroTimeIfAimingOnStick, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AimOutroMinTaskTimeWhenRunPressed, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.AimingOnStickExitCooldown, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeForRunAndGunOutroDelays, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.DampenRootTargetWeight, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.DampenRootTargetHeight, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.AlternativeAnimBlockedHeight, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.CoverAimOffsetFromBlocked, PsoDataType.Float3, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.DelayTimeWhenOutOfAmmoInScope, PsoDataType.UInt, 96, 0, 0) + ); + case MetaName.CTaskGun__Tunables: + return new PsoStructureInfo(MetaName.CTaskGun__Tunables, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.iMinLookAtTime, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.iMaxLookAtTime, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeBetweenBulletReactions, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxTimeBetweenBulletReactions, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxDistForOverheadReactions, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxAboveHeadForOverheadReactions, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fBulletReactionPosAdjustmentZ, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fMinTimeBetweenLookAt, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fMaxTimeBetweenLookAt, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.bDisable2HandedGetups, PsoDataType.Bool, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeForEyeIk, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenEyeIkProcesses, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToPointGunAtPositionWhenUnableToTurn, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.AssistedAimCamera, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo(MetaName.RunAndGunAimCamera, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo(MetaName.AssistedAimInterpolateInDuration, PsoDataType.UInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.RunAndGunInterpolateInDuration, PsoDataType.UInt, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenOverheadBulletReactions, PsoDataType.UInt, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxTimeInBulletReactionState, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo((MetaName)3228655867, PsoDataType.UInt, 92, 0, 0), + new PsoStructureEntryInfo((MetaName)270252777, PsoDataType.UInt, 96, 0, 0) + ); + case MetaName.CTaskAimGunVehicleDriveBy__Tunables: + return new PsoStructureInfo(MetaName.CTaskAimGunVehicleDriveBy__Tunables, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenInsults, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToInsult, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDotToInsult, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.MinAimTimeMs, PsoDataType.UInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxAimTimeOnStickMs, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.AimingOnStickCooldownMs, PsoDataType.UInt, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.BicycleDrivebyFilterId, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.BikeDrivebyFilterId, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.JetskiDrivebyFilterId, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.ParachutingFilterId, PsoDataType.String, 52, 7, 0), + new PsoStructureEntryInfo((MetaName)2221302483, PsoDataType.String, 56, 7, 0), + new PsoStructureEntryInfo((MetaName)3323392529, PsoDataType.String, 60, 7, 0), + new PsoStructureEntryInfo((MetaName)2684719351, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo((MetaName)4246561663, PsoDataType.String, 68, 7, 0) + ); + case MetaName.CWildlifeManager__Tunables: + return new PsoStructureInfo(MetaName.CWildlifeManager__Tunables, 0, 0, 136, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.BirdHeightMapDeltaMin, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.BirdHeightMapDeltaMax, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.BirdSpawnXYRangeMin, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.BirdSpawnXYRangeMax, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.IncreasedAerialSpawningFactor, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToSearchForGroundWildlifePoints, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToSearchForGroundWildlifePoints, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenGroundProbes, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.GroundMaterialProbeDepth, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.GroundMaterialProbeOffset, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.GroundMaterialSpawnCoordNormalZTolerance, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.MinDistanceToSearchForAquaticPoints, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxDistanceToSearchForAquaticPoints, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenWaterHeightMapChecks, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.TimeBetweenWaterProbes, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.WaterProbeDepth, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.WaterProbeOffset, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.AquaticSpawnDepth, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.AquaticSpawnMaxHeightAbovePlayer, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.IncreasedAquaticSpawningFactor, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.CloseSpawningViewMultiplier, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.IncreasedGroundWildlifeSpawningFactor, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.SharkModelName, PsoDataType.String, 104, 7, 0), + new PsoStructureEntryInfo(MetaName.DeepWaterThreshold, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.PlayerSwimTimeThreshold, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.MinTimeBetweenSharkDispatches, PsoDataType.UInt, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.SharkAddRangeInViewMin, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo((MetaName)3653722296, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo((MetaName)1235067475, PsoDataType.Float, 128, 0, 0) + ); + case MetaName.CPopGroupList: + return new PsoStructureInfo(MetaName.CPopGroupList, 0, 0, 56, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPopulationGroup), + new PsoStructureEntryInfo(MetaName.pedGroups, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPopulationGroup), + new PsoStructureEntryInfo(MetaName.vehGroups, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.wildlifeHabitats, PsoDataType.Array, 40, 0, (MetaName)4) + ); + case MetaName.CPopulationGroup: + return new PsoStructureInfo(MetaName.CPopulationGroup, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3852980612), + new PsoStructureEntryInfo(MetaName.models, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)4186696686), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.Flags, 32, 0, (MetaName)2097155) + ); + case MetaName.CDoorTuningFile: + return new PsoStructureInfo(MetaName.CDoorTuningFile, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)607870603), + new PsoStructureEntryInfo(MetaName.NamedTuningArray, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)934147895), + new PsoStructureEntryInfo(MetaName.ModelToTuneMapping, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case (MetaName)607870603: + return new PsoStructureInfo((MetaName)607870603, 0, 0, 144, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 2, 0), + new PsoStructureEntryInfo(MetaName.Tuning, PsoDataType.Structure, 16, 0, (MetaName)2175119364) + ); + case (MetaName)2175119364: + return new PsoStructureInfo((MetaName)2175119364, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.AutoOpenVolumeOffset, PsoDataType.Float3a, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)2809332931), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 32, 0, (MetaName)2097153), + new PsoStructureEntryInfo(MetaName.AutoOpenRadiusModifier, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AutoOpenRate, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.AutoOpenCosineAngleBetweenThreshold, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.AutoOpenCloseRateTaper, PsoDataType.Bool, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.UseAutoOpenTriggerBox, PsoDataType.Bool, 49, 0, 0), + new PsoStructureEntryInfo(MetaName.CustomTriggerBox, PsoDataType.Bool, 50, 0, 0), + new PsoStructureEntryInfo(MetaName.TriggerBoxMinMax, PsoDataType.Structure, 64, 0, MetaName.rage__spdAABB), + new PsoStructureEntryInfo(MetaName.BreakableByVehicle, PsoDataType.Bool, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.BreakingImpulse, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.ShouldLatchShut, PsoDataType.Bool, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.MassMultiplier, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.WeaponImpulseMultiplier, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.RotationLimitAngle, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.TorqueAngularVelocityLimit, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.StdDoorRotDir, PsoDataType.Enum, 124, 0, MetaName.StdDoorRotDir) + ); + case (MetaName)934147895: + return new PsoStructureInfo((MetaName)934147895, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 2, 0), + new PsoStructureEntryInfo(MetaName.TuningName, PsoDataType.String, 16, 2, 0) + ); + case (MetaName)3852980612: + return new PsoStructureInfo((MetaName)3852980612, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Variations, PsoDataType.Structure, 16, 3, 0) + ); + case MetaName.CAmbientPedModelVariations: + return new PsoStructureInfo(MetaName.CAmbientPedModelVariations, 0, 0, 48, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3553377863), + new PsoStructureEntryInfo(MetaName.CompRestrictions, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3159204365), + new PsoStructureEntryInfo(MetaName.PropRestrictions, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo(MetaName.LoadOut, PsoDataType.String, 40, 7, 0) + ); + case (MetaName)3553377863: + return new PsoStructureInfo((MetaName)3553377863, 0, 0, 12, + new PsoStructureEntryInfo(MetaName.Component, PsoDataType.Enum, 0, 0, MetaName.ePedVarComp), + new PsoStructureEntryInfo(MetaName.DrawableIndex, PsoDataType.SInt, 4, 0, 0), + new PsoStructureEntryInfo(MetaName.Restriction, PsoDataType.Enum, 8, 0, (MetaName)2065671281) + ); + case MetaName.CSlownessZoneManager: + return new PsoStructureInfo(MetaName.CSlownessZoneManager, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1778476350), + new PsoStructureEntryInfo(MetaName.aSlownessZone, PsoDataType.Array, 8, 0, 0) + ); + case (MetaName)1778476350: + return new PsoStructureInfo((MetaName)1778476350, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.bBox, PsoDataType.Structure, 16, 0, MetaName.rage__spdAABB) + ); + case MetaName.CScenarioPointManifest: + return new PsoStructureInfo(MetaName.CScenarioPointManifest, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.VersionNumber, PsoDataType.SInt, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.RegionDefs, PsoDataType.Array, 8, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.Groups, PsoDataType.Array, 24, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.InteriorNames, PsoDataType.Array, 40, 0, (MetaName)5) + ); + case MetaName.CScenarioPointRegionDef: + return new PsoStructureInfo(MetaName.CScenarioPointRegionDef, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 8, 0), + new PsoStructureEntryInfo(MetaName.AABB, PsoDataType.Structure, 16, 0, MetaName.rage__spdAABB) + ); + case MetaName.CScenarioPointGroup: + return new PsoStructureInfo(MetaName.CScenarioPointGroup, 0, 0, 8, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.EnabledByDefault, PsoDataType.Bool, 4, 0, 0) + ); + case MetaName.strRequestRecording: + return new PsoStructureInfo(MetaName.strRequestRecording, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.strRecordedRequest), + new PsoStructureEntryInfo(MetaName.Requests, PsoDataType.Array, 0, 0, 0) + ); + case MetaName.strRecordedRequest: + return new PsoStructureInfo(MetaName.strRecordedRequest, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Resource, PsoDataType.Structure, 0, 0, MetaName.strResourceReference), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.SInt, 24, 0, 0) + ); + case MetaName.strResourceReference: + return new PsoStructureInfo(MetaName.strResourceReference, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.AssetName, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.Extension, PsoDataType.String, 16, 0, (MetaName)524288) + ); + case (MetaName)62557530: + return new PsoStructureInfo((MetaName)62557530, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3112305802), + new PsoStructureEntryInfo(MetaName.zones, PsoDataType.Array, 0, 0, 0) + ); + case (MetaName)3112305802: + return new PsoStructureInfo((MetaName)3112305802, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.zoneName, PsoDataType.String, 0, 2, 0), + new PsoStructureEntryInfo(MetaName.spName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.mpName, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.vfxRegion, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)1896983690, PsoDataType.UByte, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)1856972365, PsoDataType.Enum, 24, 0, (MetaName)1756502932), + new PsoStructureEntryInfo(MetaName.lawResponseTime, PsoDataType.Enum, 28, 0, (MetaName)3204395397), + new PsoStructureEntryInfo(MetaName.lawResponseType, PsoDataType.Enum, 32, 0, (MetaName)4286852891), + new PsoStructureEntryInfo(MetaName.specialZoneAttribute, PsoDataType.Enum, 36, 0, (MetaName)4095090001), + new PsoStructureEntryInfo(MetaName.vehDirtMin, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.vehDirtMax, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.vehDirtGrowScale, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.pedDirtMin, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.pedDirtMax, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.dirtRed, PsoDataType.UByte, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.dirtGreen, PsoDataType.UByte, 61, 0, 0), + new PsoStructureEntryInfo(MetaName.dirtBlue, PsoDataType.UByte, 62, 0, 0), + new PsoStructureEntryInfo((MetaName)1430479029, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)2056852733, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo((MetaName)1457405649, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo((MetaName)2304154060, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo((MetaName)1018913504, PsoDataType.SInt, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)9361713, PsoDataType.Bool, 84, 0, 0), + new PsoStructureEntryInfo((MetaName)2931752685, PsoDataType.Bool, 85, 0, 0) + ); + case MetaName.CCoverTuningFile: + return new PsoStructureInfo(MetaName.CCoverTuningFile, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)912106952), + new PsoStructureEntryInfo(MetaName.NamedTuningArray, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3821651387), + new PsoStructureEntryInfo(MetaName.ModelToTuneMapping, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case (MetaName)912106952: + return new PsoStructureInfo((MetaName)912106952, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 2, 0), + new PsoStructureEntryInfo(MetaName.Tuning, PsoDataType.Structure, 16, 0, (MetaName)61864478) + ); + case (MetaName)61864478: + return new PsoStructureInfo((MetaName)61864478, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)98189892), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 8, 0, (MetaName)2097152) + ); + case (MetaName)3821651387: + return new PsoStructureInfo((MetaName)3821651387, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ModelName, PsoDataType.String, 8, 2, 0), + new PsoStructureEntryInfo(MetaName.TuningName, PsoDataType.String, 16, 2, 0) + ); + case MetaName.CScenarioPointRegion: + return new PsoStructureInfo(MetaName.CScenarioPointRegion, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.VersionNumber, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CExtensionDefSpawnPoint), + new PsoStructureEntryInfo(MetaName.ScenarioPoints, PsoDataType.Array, 16, 0, (MetaName)1), + new PsoStructureEntryInfo(MetaName.ChainingGraph, PsoDataType.Structure, 32, 0, MetaName.CScenarioChainingGraph) + ); + case MetaName.CExtensionDefSpawnPoint: + return new PsoStructureInfo(MetaName.CExtensionDefSpawnPoint, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.offsetPosition, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.offsetRotation, PsoDataType.Float4, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.spawnType, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.pedType, PsoDataType.String, 52, 7, 0), + new PsoStructureEntryInfo(MetaName.group, PsoDataType.String, 56, 7, 0), + new PsoStructureEntryInfo(MetaName.availableInMpSp, PsoDataType.Enum, 60, 0, MetaName.CSpawnPoint__AvailabilityMpSp), + new PsoStructureEntryInfo(MetaName.timeTillPedLeaves, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.start, PsoDataType.UByte, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.end, PsoDataType.UByte, 69, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.CScenarioPointFlags__Flags), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.Flags, 72, 0, (MetaName)196618), + new PsoStructureEntryInfo(MetaName.highPri, PsoDataType.Bool, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.extendedRange, PsoDataType.Bool, 77, 0, 0) + ); + case MetaName.CScenarioChainingGraph: + return new PsoStructureInfo(MetaName.CScenarioChainingGraph, 0, 0, 40, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CScenarioChainingNode), + new PsoStructureEntryInfo(MetaName.Nodes, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CScenarioChainingEdge), + new PsoStructureEntryInfo(MetaName.Edges, PsoDataType.Array, 24, 0, (MetaName)2) + ); + case MetaName.CScenarioChainingNode: + return new PsoStructureInfo(MetaName.CScenarioChainingNode, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Position, PsoDataType.Float3a, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2602393771, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.ScenarioType, PsoDataType.String, 36, 7, 0), + new PsoStructureEntryInfo(MetaName.HasIncomingEdges, PsoDataType.Bool, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.HasOutgoingEdges, PsoDataType.Bool, 41, 0, 0) + ); + case MetaName.CScenarioChainingEdge: + return new PsoStructureInfo(MetaName.CScenarioChainingEdge, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.NodeIndexFrom, PsoDataType.UShort, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.NodeIndexTo, PsoDataType.UShort, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.NavMode, PsoDataType.Enum, 12, 2, MetaName.CScenarioChainingEdge__eNavMode), + new PsoStructureEntryInfo(MetaName.NavSpeed, PsoDataType.Enum, 13, 2, MetaName.CScenarioChainingEdge__eNavSpeed) + ); + case MetaName.CPedVariationInfo: + return new PsoStructureInfo(MetaName.CPedVariationInfo, 0, 0, 112, + new PsoStructureEntryInfo(MetaName.bHasTexVariations, PsoDataType.Bool, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.bHasDrawblVariations, PsoDataType.Bool, 1, 0, 0), + new PsoStructureEntryInfo(MetaName.bHasLowLODs, PsoDataType.Bool, 2, 0, 0), + new PsoStructureEntryInfo(MetaName.bIsSuperLOD, PsoDataType.Bool, 3, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.availComp, PsoDataType.Array, 4, 4, (MetaName)786436), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPVComponentData), + new PsoStructureEntryInfo(MetaName.aComponentData3, PsoDataType.Array, 16, 0, (MetaName)6), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedSelectionSet), + new PsoStructureEntryInfo(MetaName.aSelectionSets, PsoDataType.Array, 32, 0, (MetaName)8), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CComponentInfo), + new PsoStructureEntryInfo(MetaName.compInfos, PsoDataType.Array, 48, 0, (MetaName)10), + new PsoStructureEntryInfo(MetaName.propInfo, PsoDataType.Structure, 64, 0, MetaName.CPedPropInfo), + new PsoStructureEntryInfo(MetaName.dlcName, PsoDataType.String, 104, 8, 0) + ); + case MetaName.CPedPropInfo: + return new PsoStructureInfo(MetaName.CPedPropInfo, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.numAvailProps, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedPropMetaData), + new PsoStructureEntryInfo(MetaName.aPropMetaData, PsoDataType.Array, 8, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CAnchorProps), + new PsoStructureEntryInfo(MetaName.aAnchors, PsoDataType.Array, 24, 0, (MetaName)3) + ); + case MetaName.CPVComponentData: + return new PsoStructureInfo(MetaName.CPVComponentData, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.numAvailTex, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPVDrawblData), + new PsoStructureEntryInfo(MetaName.aDrawblData3, PsoDataType.Array, 8, 0, (MetaName)1) + ); + case MetaName.CPVDrawblData: + return new PsoStructureInfo(MetaName.CPVDrawblData, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.propMask, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.numAlternatives, PsoDataType.UByte, 1, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPVTextureData), + new PsoStructureEntryInfo(MetaName.aTexData, PsoDataType.Array, 8, 0, (MetaName)2), + new PsoStructureEntryInfo(MetaName.clothData, PsoDataType.Structure, 24, 0, MetaName.CPVDrawblData__CPVClothComponentData) + ); + case MetaName.CPVDrawblData__CPVClothComponentData: + return new PsoStructureInfo(MetaName.CPVDrawblData__CPVClothComponentData, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ownsCloth, PsoDataType.Bool, 0, 0, 0) + ); + case MetaName.CPVTextureData: + return new PsoStructureInfo(MetaName.CPVTextureData, 0, 0, 3, + new PsoStructureEntryInfo(MetaName.texId, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.distribution, PsoDataType.UByte, 1, 0, 0) + ); + case MetaName.CComponentInfo: + return new PsoStructureInfo(MetaName.CComponentInfo, 0, 0, 48, + new PsoStructureEntryInfo((MetaName)802196719, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)4233133352, PsoDataType.String, 4, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)128864925, PsoDataType.Array, 8, 4, (MetaName)327682), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.inclusions, PsoDataType.Flags, 32, 0, (MetaName)2101247), + new PsoStructureEntryInfo(MetaName.exclusions, PsoDataType.Flags, 36, 0, (MetaName)2101247), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.ePedVarComp), + new PsoStructureEntryInfo((MetaName)1613922652, PsoDataType.Flags, 40, 1, (MetaName)1048583), + new PsoStructureEntryInfo((MetaName)2114993291, PsoDataType.UShort, 42, 0, 0), + new PsoStructureEntryInfo((MetaName)3509540765, PsoDataType.UByte, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)4196345791, PsoDataType.UByte, 45, 0, 0) + ); + case MetaName.CCreatureMetaData: + return new PsoStructureInfo(MetaName.CCreatureMetaData, 0, 0, 56, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CShaderVariableComponent), + new PsoStructureEntryInfo(MetaName.shaderVariableComponents, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedPropExpressionData), + new PsoStructureEntryInfo(MetaName.pedPropExpressions, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedCompExpressionData), + new PsoStructureEntryInfo(MetaName.pedCompExpressions, PsoDataType.Array, 40, 0, (MetaName)4) + ); + case MetaName.CShaderVariableComponent: + return new PsoStructureInfo(MetaName.CShaderVariableComponent, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.pedcompID, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.maskID, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.shaderVariableHashString, PsoDataType.String, 16, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.tracks, PsoDataType.Array, 24, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UShort, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.ids, PsoDataType.Array, 40, 0, (MetaName)5), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.components, PsoDataType.Array, 56, 0, (MetaName)MetaTypeName.POINTER) + ); + case MetaName.CPedPropExpressionData: + return new PsoStructureInfo(MetaName.CPedPropExpressionData, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.pedPropID, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.pedPropVarIndex, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.pedPropExpressionIndex, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.tracks, PsoDataType.Array, 24, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UShort, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.ids, PsoDataType.Array, 40, 0, (MetaName)5), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.types, PsoDataType.Array, 56, 0, (MetaName)MetaTypeName.POINTER), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.components, PsoDataType.Array, 72, 0, (MetaName)9) + ); + case MetaName.CPedCompExpressionData: + return new PsoStructureInfo(MetaName.CPedCompExpressionData, 0, 0, 88, + new PsoStructureEntryInfo(MetaName.pedCompID, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.pedCompVarIndex, PsoDataType.SInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.pedCompExpressionIndex, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.tracks, PsoDataType.Array, 24, 0, (MetaName)3), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UShort, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.ids, PsoDataType.Array, 40, 0, (MetaName)5), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.types, PsoDataType.Array, 56, 0, (MetaName)MetaTypeName.POINTER), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.components, PsoDataType.Array, 72, 0, (MetaName)9) + ); + case MetaName.rage__cutfCutsceneFile2: + return new PsoStructureInfo(MetaName.rage__cutfCutsceneFile2, 0, 0, 3360, + new PsoStructureEntryInfo(MetaName.fTotalDuration, PsoDataType.Float, 268, 0, 0), + new PsoStructureEntryInfo(MetaName.cFaceDir, PsoDataType.String, 272, 0, (MetaName)16777216), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.iCutsceneFlags, PsoDataType.Array, 528, 4, (MetaName)262146), + new PsoStructureEntryInfo(MetaName.vOffset, PsoDataType.Float3, 544, 0, 0), + new PsoStructureEntryInfo(MetaName.fRotation, PsoDataType.Float, 560, 0, 0), + new PsoStructureEntryInfo(MetaName.vTriggerOffset, PsoDataType.Float3, 576, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.pCutsceneObjects, PsoDataType.Array, 592, 0, (MetaName)7), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.pCutsceneLoadEventList, PsoDataType.Array, 608, 0, (MetaName)9), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.pCutsceneEventList, PsoDataType.Array, 624, 0, (MetaName)11), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.pCutsceneEventArgsList, PsoDataType.Array, 640, 0, (MetaName)13), + new PsoStructureEntryInfo(MetaName.attributes, PsoDataType.Structure, 656, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 672, 4, 0), + new PsoStructureEntryInfo(MetaName.iRangeStart, PsoDataType.SInt, 680, 0, 0), + new PsoStructureEntryInfo(MetaName.iRangeEnd, PsoDataType.SInt, 684, 0, 0), + new PsoStructureEntryInfo(MetaName.iAltRangeEnd, PsoDataType.SInt, 688, 0, 0), + new PsoStructureEntryInfo(MetaName.fSectionByTimeSliceDuration, PsoDataType.Float, 692, 0, 0), + new PsoStructureEntryInfo(MetaName.fFadeOutCutsceneDuration, PsoDataType.Float, 696, 0, 0), + new PsoStructureEntryInfo(MetaName.fFadeInGameDuration, PsoDataType.Float, 700, 0, 0), + new PsoStructureEntryInfo(MetaName.fadeInColor, PsoDataType.UInt, 704, 1, 0), + new PsoStructureEntryInfo(MetaName.iBlendOutCutsceneDuration, PsoDataType.SInt, 708, 0, 0), + new PsoStructureEntryInfo(MetaName.iBlendOutCutsceneOffset, PsoDataType.SInt, 712, 0, 0), + new PsoStructureEntryInfo(MetaName.fFadeOutGameDuration, PsoDataType.Float, 716, 0, 0), + new PsoStructureEntryInfo(MetaName.fFadeInCutsceneDuration, PsoDataType.Float, 720, 0, 0), + new PsoStructureEntryInfo(MetaName.fadeOutColor, PsoDataType.UInt, 724, 1, 0), + new PsoStructureEntryInfo(MetaName.DayCoCHours, PsoDataType.UInt, 728, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.cameraCutList, PsoDataType.Array, 736, 0, (MetaName)30), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.sectionSplitList, PsoDataType.Array, 752, 0, (MetaName)32), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.rage__cutfCutsceneFile2__SConcatData), + new PsoStructureEntryInfo(MetaName.concatDataList, PsoDataType.Array, 768, 1, (MetaName)2621474), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.vHaltFrequency), + new PsoStructureEntryInfo(MetaName.discardFrameList, PsoDataType.Array, 3344, 0, (MetaName)36) + ); + case MetaName.rage__parAttributeList: + return new PsoStructureInfo(MetaName.rage__parAttributeList, 0, 0, 12, + new PsoStructureEntryInfo(MetaName.UserData1, PsoDataType.UByte, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.UserData2, PsoDataType.UByte, 9, 0, 0) + ); + case MetaName.rage__cutfCutsceneFile2__SConcatData: + return new PsoStructureInfo(MetaName.rage__cutfCutsceneFile2__SConcatData, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.cSceneName, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.vOffset, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fStartTime, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fRotation, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.fPitch, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.fRoll, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.iRangeStart, PsoDataType.SInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.iRangeEnd, PsoDataType.SInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.bValidForPlayBack, PsoDataType.Bool, 56, 0, 0) + ); + case MetaName.rage__cutfAssetManagerObject: + return new PsoStructureInfo(MetaName.rage__cutfAssetManagerObject, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0) + ); + case MetaName.rage__cutfAnimationManagerObject: + return new PsoStructureInfo(MetaName.rage__cutfAnimationManagerObject, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0) + ); + case MetaName.rage__cutfCameraObject: + return new PsoStructureInfo(MetaName.rage__cutfCameraObject, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fNearDrawDistance, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.fFarDrawDistance, PsoDataType.Float, 60, 0, 0) + ); + case MetaName.rage__cutfPedModelObject: + return new PsoStructureInfo(MetaName.rage__cutfPedModelObject, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.cAnimExportCtrlSpecFile, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo(MetaName.cFaceExportCtrlSpecFile, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo(MetaName.cAnimCompressionFile, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo(MetaName.cHandle, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo(MetaName.typeFile, PsoDataType.String, 88, 7, 0), + new PsoStructureEntryInfo(MetaName.overrideFaceAnimationFilename, PsoDataType.String, 96, 7, 0), + new PsoStructureEntryInfo(MetaName.bFoundFaceAnimation, PsoDataType.Bool, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.bFaceAndBodyAreMerged, PsoDataType.Bool, 105, 0, 0), + new PsoStructureEntryInfo(MetaName.bOverrideFaceAnimation, PsoDataType.Bool, 106, 0, 0), + new PsoStructureEntryInfo(MetaName.faceAnimationNodeName, PsoDataType.String, 108, 7, 0), + new PsoStructureEntryInfo(MetaName.faceAttributesFilename, PsoDataType.String, 112, 7, 0) + ); + case MetaName.rage__cutfPropModelObject: + return new PsoStructureInfo(MetaName.rage__cutfPropModelObject, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.cAnimExportCtrlSpecFile, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo(MetaName.cFaceExportCtrlSpecFile, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo(MetaName.cAnimCompressionFile, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo(MetaName.cHandle, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo(MetaName.typeFile, PsoDataType.String, 88, 7, 0) + ); + case MetaName.rage__cutfBlockingBoundsObject: + return new PsoStructureInfo(MetaName.rage__cutfBlockingBoundsObject, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float3, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.vCorners, PsoDataType.Array, 48, 4, (MetaName)262148), + new PsoStructureEntryInfo(MetaName.fHeight, PsoDataType.Float, 112, 0, 0) + ); + case MetaName.rage__cutfAudioObject: + return new PsoStructureInfo(MetaName.rage__cutfAudioObject, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 3, 0), + new PsoStructureEntryInfo(MetaName.fOffset, PsoDataType.Float, 56, 0, 0) + ); + case MetaName.rage__cutfHiddenModelObject: + return new PsoStructureInfo(MetaName.rage__cutfHiddenModelObject, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fRadius, PsoDataType.Float, 64, 0, 0) + ); + case MetaName.rage__cutfOverlayObject: + return new PsoStructureInfo(MetaName.rage__cutfOverlayObject, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 3, 0), + new PsoStructureEntryInfo(MetaName.cRenderTargetName, PsoDataType.String, 56, 3, 0), + new PsoStructureEntryInfo(MetaName.iOverlayType, PsoDataType.UInt, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.modelHashName, PsoDataType.String, 76, 7, 0) + ); + case MetaName.rage__cutfSubtitleObject: + return new PsoStructureInfo(MetaName.rage__cutfSubtitleObject, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0) + ); + case MetaName.rage__cutfLightObject: + return new PsoStructureInfo(MetaName.rage__cutfLightObject, 0, 0, 192, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.vDirection, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.vColour, PsoDataType.Float3, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.fIntensity, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.fFallOff, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.fConeAngle, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.fVolumeIntensity, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.fVolumeSizeScale, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.fCoronaSize, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.fCoronaIntensity, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.fCoronaZBias, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.fInnerConeAngle, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.fExponentialFallOff, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.fShadowBlur, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.iLightType, PsoDataType.SInt, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.iLightProperty, PsoDataType.SInt, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.TextureDictID, PsoDataType.SInt, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.TextureKey, PsoDataType.SInt, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.uLightFlags, PsoDataType.UInt, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.uHourFlags, PsoDataType.UInt, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.bStatic, PsoDataType.Bool, 186, 0, 0) + ); + case MetaName.rage__cutfAnimatedLightObject: + return new PsoStructureInfo(MetaName.rage__cutfAnimatedLightObject, 0, 0, 208, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.vDirection, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.vColour, PsoDataType.Float3, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.fIntensity, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.fFallOff, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.fConeAngle, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.fVolumeIntensity, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.fVolumeSizeScale, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.fCoronaSize, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.fCoronaIntensity, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.fCoronaZBias, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.fInnerConeAngle, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.fExponentialFallOff, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.fShadowBlur, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.iLightType, PsoDataType.SInt, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.iLightProperty, PsoDataType.SInt, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.TextureDictID, PsoDataType.SInt, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.TextureKey, PsoDataType.SInt, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.uLightFlags, PsoDataType.UInt, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.uHourFlags, PsoDataType.UInt, 180, 0, 0), + new PsoStructureEntryInfo(MetaName.bStatic, PsoDataType.Bool, 186, 0, 0), + new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 192, 0, 0) + ); + case MetaName.rage__cutfObjectIdEvent: + return new PsoStructureInfo(MetaName.rage__cutfObjectIdEvent, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.fTime, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.iEventId, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.iEventArgsIndex, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.pChildEvents, PsoDataType.Structure, 32, 3, 0), + new PsoStructureEntryInfo(MetaName.StickyId, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.IsChild, PsoDataType.Bool, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 48, 0, 0) + ); + case MetaName.rage__cutfObjectVariationEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfObjectVariationEventArgs, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.iComponent, PsoDataType.SInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.iDrawable, PsoDataType.SInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.iTexture, PsoDataType.SInt, 48, 0, 0) + ); + case MetaName.rage__cutfEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfEventArgs, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0) + ); + case MetaName.rage__cutfAttributeList: + return new PsoStructureInfo(MetaName.rage__cutfAttributeList, 0, 0, 16, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.Items, PsoDataType.Array, 0, 0, 0) + ); + case MetaName.cutf_int: + return new PsoStructureInfo(MetaName.cutf_int, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.SInt, 16, 0, 0) + ); + case MetaName.cutf_float: + return new PsoStructureInfo(MetaName.cutf_float, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.Float, 16, 0, 0) + ); + case MetaName.rage__cutfLoadSceneEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfLoadSceneEventArgs, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.vOffset, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fRotation, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.fPitch, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.fRoll, PsoDataType.Float, 72, 0, 0) + ); + case MetaName.rage__cutfObjectIdEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfObjectIdEventArgs, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0) + ); + case MetaName.rage__cutfObjectIdListEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfObjectIdListEventArgs, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.SInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.iObjectIdList, PsoDataType.Array, 32, 0, (MetaName)2) + ); + case MetaName.rage__cutfNameEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfNameEventArgs, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 7, 0) + ); + case MetaName.rage__cutfCameraCutEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfCameraCutEventArgs, 0, 0, 272, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.vRotationQuaternion, PsoDataType.Float4, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.fNearDrawDistance, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.fFarDrawDistance, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.fMapLodScale, PsoDataType.Float, 88, 0, 0), + new PsoStructureEntryInfo(MetaName.ReflectionLodRangeStart, PsoDataType.Float, 92, 0, 0), + new PsoStructureEntryInfo(MetaName.ReflectionLodRangeEnd, PsoDataType.Float, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.ReflectionSLodRangeStart, PsoDataType.Float, 100, 0, 0), + new PsoStructureEntryInfo(MetaName.ReflectionSLodRangeEnd, PsoDataType.Float, 104, 0, 0), + new PsoStructureEntryInfo(MetaName.LodMultHD, PsoDataType.Float, 108, 0, 0), + new PsoStructureEntryInfo(MetaName.LodMultOrphanedHD, PsoDataType.Float, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.LodMultLod, PsoDataType.Float, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.LodMultSLod1, PsoDataType.Float, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.LodMultSLod2, PsoDataType.Float, 124, 0, 0), + new PsoStructureEntryInfo(MetaName.LodMultSLod3, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.LodMultSLod4, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.WaterReflectionFarClip, PsoDataType.Float, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.SSAOLightInten, PsoDataType.Float, 140, 0, 0), + new PsoStructureEntryInfo(MetaName.ExposurePush, PsoDataType.Float, 144, 0, 0), + new PsoStructureEntryInfo(MetaName.LightFadeDistanceMult, PsoDataType.Float, 148, 0, 0), + new PsoStructureEntryInfo(MetaName.LightShadowFadeDistanceMult, PsoDataType.Float, 152, 0, 0), + new PsoStructureEntryInfo(MetaName.LightSpecularFadeDistMult, PsoDataType.Float, 156, 0, 0), + new PsoStructureEntryInfo(MetaName.LightVolumetricFadeDistanceMult, PsoDataType.Float, 160, 0, 0), + new PsoStructureEntryInfo(MetaName.DirectionalLightMultiplier, PsoDataType.Float, 164, 0, 0), + new PsoStructureEntryInfo(MetaName.LensArtefactMultiplier, PsoDataType.Float, 168, 0, 0), + new PsoStructureEntryInfo(MetaName.BloomMax, PsoDataType.Float, 172, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableHighQualityDof, PsoDataType.Bool, 176, 0, 0), + new PsoStructureEntryInfo(MetaName.FreezeReflectionMap, PsoDataType.Bool, 177, 0, 0), + new PsoStructureEntryInfo(MetaName.DisableDirectionalLighting, PsoDataType.Bool, 178, 0, 0), + new PsoStructureEntryInfo(MetaName.AbsoluteIntensityEnabled, PsoDataType.Bool, 179, 0, 0), + new PsoStructureEntryInfo(MetaName.CharacterLight, PsoDataType.Structure, 192, 0, MetaName.rage__cutfCameraCutCharacterLightParams), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.rage__cutfCameraCutTimeOfDayDofModifier), + new PsoStructureEntryInfo(MetaName.TimeOfDayDofModifers, PsoDataType.Array, 256, 0, (MetaName)34) + ); + case MetaName.rage__cutfCameraCutCharacterLightParams: + return new PsoStructureInfo(MetaName.rage__cutfCameraCutCharacterLightParams, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.bUseTimeCycleValues, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.vDirection, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.vColour, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fIntensity, PsoDataType.Float, 48, 0, 0) + ); + case MetaName.rage__cutfSubtitleEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfSubtitleEventArgs, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.iLanguageID, PsoDataType.SInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.iTransitionIn, PsoDataType.SInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.fTransitionInDuration, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.iTransitionOut, PsoDataType.SInt, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.fTransitionOutDuration, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.fSubtitleDuration, PsoDataType.Float, 60, 0, 0) + ); + case MetaName.rage__cutfFinalNameEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfFinalNameEventArgs, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 32, 3, 0) + ); + case MetaName.rage__cutfObjectIdNameEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfObjectIdNameEventArgs, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0) + ); + case MetaName.vHaltFrequency: + return new PsoStructureInfo(MetaName.vHaltFrequency, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.cSceneName, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.SInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.frames, PsoDataType.Array, 8, 0, (MetaName)1) + ); + case MetaName.rage__cutfVehicleModelObject: + return new PsoStructureInfo(MetaName.rage__cutfVehicleModelObject, 0, 0, 120, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.cAnimExportCtrlSpecFile, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo(MetaName.cFaceExportCtrlSpecFile, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo(MetaName.cAnimCompressionFile, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo(MetaName.cHandle, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo(MetaName.typeFile, PsoDataType.String, 88, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.cRemoveBoneNameList, PsoDataType.Array, 96, 0, (MetaName)11), + new PsoStructureEntryInfo(MetaName.bCanApplyRealDamage, PsoDataType.Bool, 112, 0, 0) + ); + case MetaName.rage__cutfEvent: + return new PsoStructureInfo(MetaName.rage__cutfEvent, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.fTime, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.iEventId, PsoDataType.SInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.iEventArgsIndex, PsoDataType.SInt, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.pChildEvents, PsoDataType.Structure, 32, 3, 0), + new PsoStructureEntryInfo(MetaName.StickyId, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.IsChild, PsoDataType.Bool, 44, 0, 0) + ); + case MetaName.rage__cutfCascadeShadowEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfCascadeShadowEventArgs, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.cameraCutHashName, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo(MetaName.position, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.radius, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.interpTime, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.cascadeIndex, PsoDataType.SInt, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.enabled, PsoDataType.Bool, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.interpolateToDisabled, PsoDataType.Bool, 77, 0, 0) + ); + case MetaName.rage__cutfFloatValueEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfFloatValueEventArgs, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.fValue, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.rage__cutfAnimatedParticleEffectObject: + return new PsoStructureInfo(MetaName.rage__cutfAnimatedParticleEffectObject, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.athFxListHash, PsoDataType.String, 64, 7, 0) + ); + case MetaName.rage__cutfWeaponModelObject: + return new PsoStructureInfo(MetaName.rage__cutfWeaponModelObject, 0, 0, 104, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.AnimStreamingBase, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.cAnimExportCtrlSpecFile, PsoDataType.String, 64, 7, 0), + new PsoStructureEntryInfo(MetaName.cFaceExportCtrlSpecFile, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo(MetaName.cAnimCompressionFile, PsoDataType.String, 72, 7, 0), + new PsoStructureEntryInfo(MetaName.cHandle, PsoDataType.String, 84, 7, 0), + new PsoStructureEntryInfo(MetaName.typeFile, PsoDataType.String, 88, 7, 0), + new PsoStructureEntryInfo(MetaName.GenericWeaponType, PsoDataType.UInt, 96, 0, 0) + ); + case MetaName.rage__cutfPlayParticleEffectEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfPlayParticleEffectEventArgs, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.vInitialBoneRotation, PsoDataType.Float4, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.vInitialBoneOffset, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.iAttachParentId, PsoDataType.SInt, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.iAttachBoneHash, PsoDataType.UShort, 68, 0, 0) + ); + case MetaName.rage__cutfBoolValueEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfBoolValueEventArgs, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.bValue, PsoDataType.Bool, 32, 0, 0) + ); + case MetaName.rage__cutfRayfireObject: + return new PsoStructureInfo(MetaName.rage__cutfRayfireObject, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.vStartPosition, PsoDataType.Float3, 64, 0, 0) + ); + case MetaName.rage__cutfParticleEffectObject: + return new PsoStructureInfo(MetaName.rage__cutfParticleEffectObject, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.athFxListHash, PsoDataType.String, 56, 7, 0) + ); + case MetaName.rage__cutfDecalObject: + return new PsoStructureInfo(MetaName.rage__cutfDecalObject, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.StreamingName, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo(MetaName.RenderId, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.rage__cutfDecalEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfDecalEventArgs, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.vRotation, PsoDataType.Float4, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fWidth, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.fHeight, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.Colour, PsoDataType.UInt, 72, 1, 0), + new PsoStructureEntryInfo(MetaName.fLifeTime, PsoDataType.Float, 76, 0, 0) + ); + case MetaName.rage__cutfScreenFadeObject: + return new PsoStructureInfo(MetaName.rage__cutfScreenFadeObject, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0) + ); + case MetaName.rage__cutfVehicleVariationEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfVehicleVariationEventArgs, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.iMainBodyColour, PsoDataType.SInt, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.iSecondBodyColour, PsoDataType.SInt, 44, 0, 0), + new PsoStructureEntryInfo(MetaName.iSpecularColour, PsoDataType.SInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.iWheelTrimColour, PsoDataType.SInt, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)2747538743, PsoDataType.SInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.iLivery, PsoDataType.SInt, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.iLivery2, PsoDataType.SInt, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.fDirtLevel, PsoDataType.Float, 68, 0, 0) + ); + case MetaName.cutf_string: + return new PsoStructureInfo(MetaName.cutf_string, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 8, 0), + new PsoStructureEntryInfo(MetaName.Value, PsoDataType.String, 16, 3, 0) + ); + case MetaName.rage__cutfScreenFadeEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfScreenFadeEventArgs, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.fValue, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 40, 1, 0) + ); + case MetaName.rage__cutfTriggerLightEffectEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfTriggerLightEffectEventArgs, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.iAttachParentId, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.iAttachBoneHash, PsoDataType.UShort, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.AttachedParentName, PsoDataType.String, 40, 7, 0) + ); + case MetaName.rage__cutfVehicleExtraEventArgs: + return new PsoStructureInfo(MetaName.rage__cutfVehicleExtraEventArgs, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 12, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 24, 4, 0), + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.SInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.pExtraBoneIds, PsoDataType.Array, 40, 0, (MetaName)3) + ); + case MetaName.rage__cutfFixupModelObject: + return new PsoStructureInfo(MetaName.rage__cutfFixupModelObject, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.iObjectId, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.attributeList, PsoDataType.Structure, 20, 0, MetaName.rage__parAttributeList), + new PsoStructureEntryInfo(MetaName.cutfAttributes, PsoDataType.Structure, 32, 4, 0), + new PsoStructureEntryInfo(MetaName.cName, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo(MetaName.vPosition, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.fRadius, PsoDataType.Float, 64, 0, 0) + ); + case MetaName.CPackFileMetaData: + return new PsoStructureInfo(MetaName.CPackFileMetaData, 0, 0, 96, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CMapDataGroup), + new PsoStructureEntryInfo(MetaName.MapDataGroups, PsoDataType.Array, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CHDTxdAssetBinding), + new PsoStructureEntryInfo(MetaName.HDTxdBindingArray, PsoDataType.Array, 16, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CImapDependency), + new PsoStructureEntryInfo(MetaName.imapDependencies, PsoDataType.Array, 32, 0, (MetaName)4), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CImapDependencies), + new PsoStructureEntryInfo(MetaName.imapDependencies_2, PsoDataType.Array, 48, 0, (MetaName)6), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CItypDependencies), + new PsoStructureEntryInfo(MetaName.itypDependencies_2, PsoDataType.Array, 64, 0, (MetaName)8), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CInteriorBoundsFiles), + new PsoStructureEntryInfo(MetaName.Interiors, PsoDataType.Array, 80, 0, (MetaName)10) + ); + case MetaName.CMapDataGroup: + return new PsoStructureInfo(MetaName.CMapDataGroup, 0, 0, 56, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Bounds, PsoDataType.Array, 8, 0, (MetaName)1), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, (MetaName)1193003611), + new PsoStructureEntryInfo(MetaName.Flags, PsoDataType.Flags, 24, 0, (MetaName)2097155), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.WeatherTypes, PsoDataType.Array, 32, 0, (MetaName)5), + new PsoStructureEntryInfo(MetaName.HoursOnOff, PsoDataType.UInt, 48, 0, 0) + ); + case MetaName.CHDTxdAssetBinding: + return new PsoStructureInfo(MetaName.CHDTxdAssetBinding, 0, 0, 132, + new PsoStructureEntryInfo(MetaName.assetType, PsoDataType.Enum, 0, 0, (MetaName)3387532954), + new PsoStructureEntryInfo(MetaName.targetAsset, PsoDataType.String, 4, 0, (MetaName)4194304), + new PsoStructureEntryInfo(MetaName.HDTxd, PsoDataType.String, 68, 0, (MetaName)4194304) + ); + case MetaName.CImapDependencies: + return new PsoStructureInfo(MetaName.CImapDependencies, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.imapName, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.manifestFlags), + new PsoStructureEntryInfo(MetaName.manifestFlags, PsoDataType.Flags, 4, 0, (MetaName)2097153), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.itypDepArray, PsoDataType.Array, 8, 0, (MetaName)3) + ); + case MetaName.CItypDependencies: + return new PsoStructureInfo(MetaName.CItypDependencies, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.itypName, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Enum, 0, 0, MetaName.manifestFlags), + new PsoStructureEntryInfo(MetaName.manifestFlags, PsoDataType.Flags, 4, 0, (MetaName)2097153), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.itypDepArray, PsoDataType.Array, 8, 0, (MetaName)3) + ); + case MetaName.CInteriorBoundsFiles: + return new PsoStructureInfo(MetaName.CInteriorBoundsFiles, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.Bounds, PsoDataType.Array, 8, 0, (MetaName)1) + ); + case MetaName.CMapTypes: + return new PsoStructureInfo(MetaName.CMapTypes, 0, 0, 96, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.extensions, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.archetypes, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 40, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.dependencies, PsoDataType.Array, 48, 0, (MetaName)5), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CTxdRelationship), + new PsoStructureEntryInfo(MetaName.txdRelationships, PsoDataType.Array, 64, 0, (MetaName)MetaTypeName.POINTER), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCompositeEntityType), + new PsoStructureEntryInfo(MetaName.compositeEntityTypes, PsoDataType.Array, 80, 0, (MetaName)9) + ); + case MetaName.CTxdRelationship: + return new PsoStructureInfo(MetaName.CTxdRelationship, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.parent, PsoDataType.String, 8, 3, 0), + new PsoStructureEntryInfo(MetaName.child, PsoDataType.String, 24, 3, 0) + ); + case MetaName.CCompositeEntityType: + return new PsoStructureInfo(MetaName.CCompositeEntityType, 0, 0, 336, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 0, 0, (MetaName)4194304), + new PsoStructureEntryInfo(MetaName.lodDist, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.specialAttribute, PsoDataType.UInt, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.bbMin, PsoDataType.Float3, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.bbMax, PsoDataType.Float3, 96, 0, 0), + new PsoStructureEntryInfo(MetaName.bsCentre, PsoDataType.Float3, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.bsRadius, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.StartModel, PsoDataType.String, 136, 0, (MetaName)4194304), + new PsoStructureEntryInfo(MetaName.EndModel, PsoDataType.String, 200, 0, (MetaName)4194304), + new PsoStructureEntryInfo(MetaName.StartImapFile, PsoDataType.String, 264, 3, 0), + new PsoStructureEntryInfo(MetaName.EndImapFile, PsoDataType.String, 280, 3, 0), + new PsoStructureEntryInfo(MetaName.PtFxAssetName, PsoDataType.String, 296, 3, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCompEntityAnims), + new PsoStructureEntryInfo(MetaName.Animations, PsoDataType.Array, 312, 0, (MetaName)13) + ); + case MetaName.CCompEntityAnims: + return new PsoStructureInfo(MetaName.CCompEntityAnims, 0, 0, 216, + new PsoStructureEntryInfo(MetaName.AnimDict, PsoDataType.String, 0, 0, (MetaName)4194304), + new PsoStructureEntryInfo(MetaName.AnimName, PsoDataType.String, 64, 0, (MetaName)4194304), + new PsoStructureEntryInfo(MetaName.AnimatedModel, PsoDataType.String, 128, 0, (MetaName)4194304), + new PsoStructureEntryInfo(MetaName.punchInPhase, PsoDataType.Float, 192, 0, 0), + new PsoStructureEntryInfo(MetaName.punchOutPhase, PsoDataType.Float, 196, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCompEntityEffectsData), + new PsoStructureEntryInfo(MetaName.effectsData, PsoDataType.Array, 200, 0, (MetaName)5) + ); + case MetaName.CCompEntityEffectsData: + return new PsoStructureInfo(MetaName.CCompEntityEffectsData, 0, 0, 160, + new PsoStructureEntryInfo(MetaName.fxType, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.fxOffsetPos, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.fxOffsetRot, PsoDataType.Float4, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.boneTag, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.startPhase, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.endPhase, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxIsTriggered, PsoDataType.Bool, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxTag, PsoDataType.String, 61, 0, (MetaName)4194304), + new PsoStructureEntryInfo(MetaName.ptFxScale, PsoDataType.Float, 128, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxProbability, PsoDataType.Float, 132, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxHasTint, PsoDataType.Bool, 136, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxTintR, PsoDataType.UByte, 137, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxTintG, PsoDataType.UByte, 138, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxTintB, PsoDataType.UByte, 139, 0, 0), + new PsoStructureEntryInfo(MetaName.ptFxSize, PsoDataType.Float3, 144, 0, 0) + ); + case MetaName.CExtensionDefParticleEffect: + return new PsoStructureInfo(MetaName.CExtensionDefParticleEffect, 0, 0, 96, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.offsetPosition, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.offsetRotation, PsoDataType.Float4, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.fxName, PsoDataType.String, 48, 3, 0), + new PsoStructureEntryInfo(MetaName.fxType, PsoDataType.SInt, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.boneTag, PsoDataType.SInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.scale, PsoDataType.Float, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.probability, PsoDataType.SInt, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.SInt, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.color, PsoDataType.UInt, 84, 1, 0) + ); + case MetaName.CBaseArchetypeDef: + return new PsoStructureInfo(MetaName.CBaseArchetypeDef, 0, 0, 176, + new PsoStructureEntryInfo(MetaName.lodDist, PsoDataType.Float, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.specialAttribute, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.bbMin, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.bbMax, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.bsCentre, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.bsRadius, PsoDataType.Float, 80, 0, 0), + new PsoStructureEntryInfo(MetaName.hdTextureDist, PsoDataType.Float, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 88, 3, 0), + new PsoStructureEntryInfo(MetaName.textureDictionary, PsoDataType.String, 104, 3, 0), + new PsoStructureEntryInfo(MetaName.clipDictionary, PsoDataType.String, 120, 3, 0), + new PsoStructureEntryInfo(MetaName.drawableDictionary, PsoDataType.String, 136, 3, 0), + new PsoStructureEntryInfo(MetaName.physicsDictionary, PsoDataType.String, 152, 7, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.extensions, PsoDataType.Array, 160, 0, (MetaName)13) + ); + case MetaName.CImapDependency: + return new PsoStructureInfo(MetaName.CImapDependency, 0, 0, 12, + new PsoStructureEntryInfo(MetaName.imapName, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.itypName, PsoDataType.String, 4, 7, 0), + new PsoStructureEntryInfo(MetaName.packFileName, PsoDataType.String, 8, 7, 0) + ); + case MetaName.CMapData: + return new PsoStructureInfo(MetaName.CMapData, 0, 0, 304, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.parent, PsoDataType.String, 12, 7, 0), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.contentFlags, PsoDataType.UInt, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.streamingExtentsMin, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.streamingExtentsMax, PsoDataType.Float3, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.entitiesExtentsMin, PsoDataType.Float3, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.entitiesExtentsMax, PsoDataType.Float3, 80, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.entities, PsoDataType.Array, 96, 0, (MetaName)8), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.rage__fwContainerLodDef), + new PsoStructureEntryInfo(MetaName.containerLods, PsoDataType.Array, 112, 0, (MetaName)10), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.BoxOccluder), + new PsoStructureEntryInfo(MetaName.boxOccluders, PsoDataType.Array, 128, 0, (MetaName)MetaTypeName.PsoPOINTER), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.OccludeModel), + new PsoStructureEntryInfo(MetaName.occludeModels, PsoDataType.Array, 144, 0, (MetaName)14), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.physicsDictionaries, PsoDataType.Array, 160, 0, (MetaName)MetaTypeName.STRING), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CTimeCycleModifier), + new PsoStructureEntryInfo(MetaName.timeCycleModifiers, PsoDataType.Array, 176, 0, (MetaName)18), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CCarGen), + new PsoStructureEntryInfo(MetaName.carGenerators, PsoDataType.Array, 192, 0, (MetaName)20), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CLODLight), + new PsoStructureEntryInfo(MetaName.LODLights, PsoDataType.Array, 208, 0, (MetaName)22), + new PsoStructureEntryInfo(MetaName.block, PsoDataType.Structure, 224, 0, MetaName.CBlockDesc) + ); + case MetaName.rage__fwContainerLodDef: + return new PsoStructureInfo(MetaName.rage__fwContainerLodDef, 0, 0, 8, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 0, 7, 0), + new PsoStructureEntryInfo(MetaName.parentIndex, PsoDataType.UInt, 4, 0, 0) + ); + case MetaName.BoxOccluder: + return new PsoStructureInfo(MetaName.BoxOccluder, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.iCenterX, PsoDataType.SShort, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.iCenterY, PsoDataType.SShort, 2, 0, 0), + new PsoStructureEntryInfo(MetaName.iCenterZ, PsoDataType.SShort, 4, 0, 0), + new PsoStructureEntryInfo(MetaName.iCosZ, PsoDataType.SShort, 6, 0, 0), + new PsoStructureEntryInfo(MetaName.iLength, PsoDataType.SShort, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.iWidth, PsoDataType.SShort, 10, 0, 0), + new PsoStructureEntryInfo(MetaName.iHeight, PsoDataType.SShort, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.iSinZ, PsoDataType.SShort, 14, 0, 0) + ); + case MetaName.OccludeModel: + return new PsoStructureInfo(MetaName.OccludeModel, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.bmin, PsoDataType.Float3a, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.bmax, PsoDataType.Float3a, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.dataSize, PsoDataType.UInt, 32, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.verts, PsoDataType.Array, 40, 6, (MetaName)2097155), + new PsoStructureEntryInfo(MetaName.numVertsInBytes, PsoDataType.UShort, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.numTris, PsoDataType.UShort, 50, 0, 0) + ); + case MetaName.CTimeCycleModifier: + return new PsoStructureInfo(MetaName.CTimeCycleModifier, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.minExtents, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.maxExtents, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.percentage, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.range, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo(MetaName.startHour, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.endHour, PsoDataType.UInt, 60, 0, 0) + ); + case MetaName.CCarGen: + return new PsoStructureInfo(MetaName.CCarGen, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.position, PsoDataType.Float3, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.orientX, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.orientY, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.perpendicularLength, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.carModel, PsoDataType.String, 44, 7, 0), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)2431193454, PsoDataType.UInt, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)379378343, PsoDataType.UInt, 56, 0, 0), + new PsoStructureEntryInfo(MetaName.bodyColorRemap1, PsoDataType.SInt, 60, 0, 0), + new PsoStructureEntryInfo(MetaName.bodyColorRemap2, PsoDataType.SInt, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.bodyColorRemap3, PsoDataType.SInt, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.bodyColorRemap4, PsoDataType.SInt, 72, 0, 0) + ); + case MetaName.CLODLight: + return new PsoStructureInfo(MetaName.CLODLight, 0, 0, 136, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.FloatXYZ), + new PsoStructureEntryInfo(MetaName.direction, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.falloff, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Float, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.falloffExponent, PsoDataType.Array, 40, 0, (MetaName)4), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.timeAndStateFlags, PsoDataType.Array, 56, 0, (MetaName)6), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.hash, PsoDataType.Array, 72, 0, (MetaName)8), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.coneInnerAngle, PsoDataType.Array, 88, 0, (MetaName)10), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.coneOuterAngleOrCapExt, PsoDataType.Array, 104, 0, (MetaName)MetaTypeName.PsoPOINTER), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.coronaIntensity, PsoDataType.Array, 120, 0, (MetaName)14) + ); + case MetaName.CBlockDesc: + return new PsoStructureInfo(MetaName.CBlockDesc, 0, 0, 72, + new PsoStructureEntryInfo(MetaName.version, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 4, 0, 0), + new PsoStructureEntryInfo(MetaName.name, PsoDataType.String, 8, 3, 0), + new PsoStructureEntryInfo(MetaName.exportedBy, PsoDataType.String, 24, 3, 0), + new PsoStructureEntryInfo(MetaName.owner, PsoDataType.String, 40, 3, 0), + new PsoStructureEntryInfo(MetaName.time, PsoDataType.String, 56, 3, 0) + ); + case MetaName.CEntityDef: + return new PsoStructureInfo(MetaName.CEntityDef, 0, 0, 128, + new PsoStructureEntryInfo(MetaName.archetypeName, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.flags, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.guid, PsoDataType.UInt, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.position, PsoDataType.Float3, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.rotation, PsoDataType.Float4, 48, 0, 0), + new PsoStructureEntryInfo(MetaName.scaleXY, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo(MetaName.scaleZ, PsoDataType.Float, 68, 0, 0), + new PsoStructureEntryInfo(MetaName.parentIndex, PsoDataType.SInt, 72, 0, 0), + new PsoStructureEntryInfo(MetaName.lodDist, PsoDataType.Float, 76, 0, 0), + new PsoStructureEntryInfo(MetaName.lodLevel, PsoDataType.Enum, 80, 0, MetaName.rage__eLodType), + new PsoStructureEntryInfo(MetaName.numChildren, PsoDataType.UInt, 84, 0, 0), + new PsoStructureEntryInfo(MetaName.priorityLevel, PsoDataType.Enum, 88, 0, MetaName.rage__ePriorityLevel), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 3, 0), + new PsoStructureEntryInfo(MetaName.extensions, PsoDataType.Array, 96, 0, (MetaName)MetaTypeName.PsoPOINTER), + new PsoStructureEntryInfo(MetaName.ambientOcclusionMultiplier, PsoDataType.SInt, 112, 0, 0), + new PsoStructureEntryInfo(MetaName.artificialAmbientOcclusion, PsoDataType.SInt, 116, 0, 0), + new PsoStructureEntryInfo(MetaName.tintValue, PsoDataType.UInt, 120, 0, 0), + new PsoStructureEntryInfo(MetaName.lightGroup, PsoDataType.UInt, 124, 0, 0) + ); + case MetaName.CDistantLODLight: + return new PsoStructureInfo(MetaName.CDistantLODLight, 0, 0, 48, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.FloatXYZ), + new PsoStructureEntryInfo(MetaName.position, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.RGBI, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo(MetaName.numStreetLights, PsoDataType.UShort, 40, 0, 0), + new PsoStructureEntryInfo(MetaName.category, PsoDataType.UShort, 42, 0, 0) + ); + case (MetaName)3730683074: + return new PsoStructureInfo((MetaName)3730683074, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2166096847), + new PsoStructureEntryInfo(MetaName.PortalInfoList, PsoDataType.Array, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1998468471), + new PsoStructureEntryInfo(MetaName.PathNodeList, PsoDataType.Array, 16, 0, (MetaName)2) + ); + case (MetaName)2166096847: + return new PsoStructureInfo((MetaName)2166096847, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.InteriorProxyHash, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.PortalIdx, PsoDataType.SInt, 4, 0, 0), + new PsoStructureEntryInfo(MetaName.RoomIdx, PsoDataType.SInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.DestInteriorHash, PsoDataType.UInt, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.DestRoomIdx, PsoDataType.SInt, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)4133637881), + new PsoStructureEntryInfo(MetaName.PortalEntityList, PsoDataType.Array, 24, 0, (MetaName)5) + ); + case (MetaName)4133637881: + return new PsoStructureInfo((MetaName)4133637881, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.LinkType, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.MaxOcclusion, PsoDataType.Float, 4, 0, 0), + new PsoStructureEntryInfo((MetaName)3815194629, PsoDataType.UInt, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.IsDoor, PsoDataType.Bool, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.IsGlass, PsoDataType.Bool, 13, 0, 0) + ); + case (MetaName)1998468471: + return new PsoStructureInfo((MetaName)1998468471, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.Key, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)2301425487), + new PsoStructureEntryInfo(MetaName.PathNodeChildList, PsoDataType.Array, 8, 0, (MetaName)1) + ); + case (MetaName)2301425487: + return new PsoStructureInfo((MetaName)2301425487, 0, 0, 8, + new PsoStructureEntryInfo(MetaName.PathNodeKey, PsoDataType.UInt, 0, 0, 0), + new PsoStructureEntryInfo(MetaName.PortalInfoIdx, PsoDataType.SInt, 4, 0, 0) + ); + case MetaName.camMotionBlurSettingsMetadata: + return new PsoStructureInfo(MetaName.camMotionBlurSettingsMetadata, 0, 0, 64, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.MovementMotionBlurMinSpeed, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.MovementMotionBlurMaxSpeed, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.MovementMotionBlurMaxStrength, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.DamageMotionBlurMinDamage, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.DamageMotionBlurMaxDamage, PsoDataType.Float, 32, 0, 0), + new PsoStructureEntryInfo(MetaName.DamageMotionBlurMaxStrength, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo(MetaName.DamageMotionBlurDuration, PsoDataType.UInt, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)3109021193, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)2711268798, PsoDataType.Float, 48, 0, 0), + new PsoStructureEntryInfo((MetaName)960288180, PsoDataType.Float, 52, 0, 0), + new PsoStructureEntryInfo((MetaName)3693477470, PsoDataType.UInt, 56, 0, 0) + ); + case MetaName.camVehicleRocketSettings: + return new PsoStructureInfo(MetaName.camVehicleRocketSettings, 0, 0, 16, + new PsoStructureEntryInfo(MetaName.ShakeRef, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.ShakeAmplitude, PsoDataType.Float, 12, 0, 0) + ); + case MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring: + return new PsoStructureInfo(MetaName.camThirdPersonCameraMetadataQuadrupedalHeightSpring, 0, 0, 24, + new PsoStructureEntryInfo(MetaName.ShouldApply, PsoDataType.Bool, 8, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringConstant, PsoDataType.Float, 12, 0, 0), + new PsoStructureEntryInfo(MetaName.SpringDampingRatio, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)1065492607, PsoDataType.Float, 20, 0, 0) + ); + case MetaName.camInterpolatorMetadata: + return new PsoStructureInfo(MetaName.camInterpolatorMetadata, 0, 0, 40, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.Duration, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo(MetaName.EaseIn, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo(MetaName.EaseOut, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo(MetaName.Start, PsoDataType.Float, 28, 0, 0), + new PsoStructureEntryInfo(MetaName.End, PsoDataType.Float, 32, 0, 0) + ); + case MetaName.camAnimSceneDirectorMetadata: + return new PsoStructureInfo(MetaName.camAnimSceneDirectorMetadata, 0, 0, 32, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.CanBePaused, PsoDataType.Bool, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)2406434970, PsoDataType.String, 24, 7, 0) + ); + case MetaName.NonFlyableAreaArray: + return new PsoStructureInfo(MetaName.NonFlyableAreaArray, 0, 0, 24, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.NonFlyableArea), + new PsoStructureEntryInfo(MetaName.areas, PsoDataType.Array, 8, 0, 0) + ); + case MetaName.NonFlyableArea: + return new PsoStructureInfo(MetaName.NonFlyableArea, 0, 0, 32, + new PsoStructureEntryInfo((MetaName)2473579981, PsoDataType.Float4, 16, 0, 0) + ); + case MetaName.CAssassinsDispatch__Tunables: + return new PsoStructureInfo(MetaName.CAssassinsDispatch__Tunables, 0, 0, 80, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo((MetaName)2394623568, PsoDataType.Float, 16, 0, 0), + new PsoStructureEntryInfo((MetaName)3368196277, PsoDataType.Float, 20, 0, 0), + new PsoStructureEntryInfo((MetaName)2477967991, PsoDataType.Float, 24, 0, 0), + new PsoStructureEntryInfo((MetaName)3376433583, PsoDataType.String, 28, 7, 0), + new PsoStructureEntryInfo((MetaName)689054964, PsoDataType.String, 32, 7, 0), + new PsoStructureEntryInfo((MetaName)147587300, PsoDataType.Float, 36, 0, 0), + new PsoStructureEntryInfo((MetaName)201820320, PsoDataType.Float, 40, 0, 0), + new PsoStructureEntryInfo((MetaName)4035657267, PsoDataType.Float, 44, 0, 0), + new PsoStructureEntryInfo((MetaName)3058832678, PsoDataType.String, 48, 7, 0), + new PsoStructureEntryInfo((MetaName)2649613364, PsoDataType.String, 52, 7, 0), + new PsoStructureEntryInfo((MetaName)4282874513, PsoDataType.Float, 56, 0, 0), + new PsoStructureEntryInfo((MetaName)969882415, PsoDataType.Float, 60, 0, 0), + new PsoStructureEntryInfo((MetaName)2143223731, PsoDataType.Float, 64, 0, 0), + new PsoStructureEntryInfo((MetaName)1149455399, PsoDataType.String, 68, 7, 0), + new PsoStructureEntryInfo((MetaName)835576115, PsoDataType.String, 72, 7, 0) + ); + case MetaName.CTaskNMBuoyancy__Tunables: + return new PsoStructureInfo(MetaName.CTaskNMBuoyancy__Tunables, 0, 0, 48, + new PsoStructureEntryInfo(MetaName.Name, PsoDataType.String, 8, 7, 0), + new PsoStructureEntryInfo(MetaName.BlendOutThreshold, PsoDataType.Structure, 16, 0, (MetaName)3749122641) + ); + case MetaName.fwProfanityFilter: + return new PsoStructureInfo(MetaName.fwProfanityFilter, 0, 0, 56, + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), + new PsoStructureEntryInfo(MetaName.profaneTerms, PsoDataType.Array, 8, 0, 0), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), + new PsoStructureEntryInfo(MetaName.reservedTerms, PsoDataType.Array, 24, 0, (MetaName)2), + new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.String, 0, 2, 0), + new PsoStructureEntryInfo(MetaName.reservedFSCharacters, PsoDataType.Array, 40, 0, (MetaName)4) + ); + default: + return null; + } + } +} diff --git a/CodeWalker.Core/GameFiles/MetaTypes/Rbf.cs b/CodeWalker.Core/GameFiles/MetaTypes/Rbf.cs index bbb5db6..dab302f 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/Rbf.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/Rbf.cs @@ -24,59 +24,72 @@ using System; +using System.Buffers; +using System.Buffers.Binary; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; +using CodeWalker.Core.Utils; +using Collections.Pooled; +using CommunityToolkit.Diagnostics; +using Microsoft.Extensions.ObjectPool; namespace CodeWalker.GameFiles { - [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfFile + [TypeConverter(typeof(ExpandableObjectConverter))] + public class RbfFile : IDisposable { - private const int RBF_IDENT = 0x30464252; + public const uint RBF_IDENT_LITTLE_ENDIAN = 0x30464252; public RbfStructure current { get; set; } - public Stack stack { get; set; } public List descriptors { get; set; } public Dictionary outDescriptors { get; private set; } = new Dictionary(); - public void Load(byte[] data) + public RbfStructure Load(byte[] data) { - using (var ms = new MemoryStream(data)) - Load(ms); + var sequence = new ReadOnlySequence(data); + var reader = new SequenceReader(sequence); + return Load(ref reader); } public RbfStructure Load(string fileName) { - using (var fileStream = new FileStream(fileName, FileMode.Open)) - { - return Load(fileStream); - } + var data = File.ReadAllBytes(fileName); + return Load(data); } - public RbfStructure Load(Stream stream) + public RbfStructure Load(ref SequenceReader reader) { - stack = new Stack(); + var stack = new Stack(); descriptors = new List(); - var reader = new DataReader(stream); + //var reader = new DataReader(stream); var ident = reader.ReadInt32(); - if (ident != RBF_IDENT) - throw new Exception("The file identifier does not match."); + if (ident != RBF_IDENT_LITTLE_ENDIAN) + { + ThrowHelper.ThrowInvalidOperationException("The file identifier does not match."); + return default; + } - while (reader.Position < reader.Length) + while (reader.Consumed < reader.Length) { var descriptorIndex = reader.ReadByte(); if (descriptorIndex == 0xFF) // close tag { var b = reader.ReadByte(); if (b != 0xFF) - throw new Exception("Expected 0xFF but was " + b.ToString("X2")); + { + ThrowHelper.ThrowInvalidOperationException($"Expected 0xFF but was {b:X2}"); + return default; + } + if (stack.Count > 0) { @@ -84,8 +97,12 @@ namespace CodeWalker.GameFiles } else { - if (reader.Position != reader.Length) - throw new Exception("Expected end of stream but was not."); + if (reader.Consumed != reader.Length) + { + ThrowHelper.ThrowInvalidOperationException("Expected end of stream but was not."); + return default; + } + return current; } } @@ -93,14 +110,17 @@ namespace CodeWalker.GameFiles { var b = reader.ReadByte(); if (b != 0xFF) - throw new Exception("Expected 0xFF but was " + b.ToString("X2")); + { + ThrowHelper.ThrowInvalidOperationException($"Expected 0xFF but was {b:X2}"); + return default; + } var dataLength = reader.ReadInt32(); var data = reader.ReadBytes(dataLength); var bytesValue = new RbfBytes(); - bytesValue.Value = data; - current.Children.Add(bytesValue); + bytesValue.Value = data.ToArray(); + current.AddChild(bytesValue); } else { @@ -116,10 +136,15 @@ namespace CodeWalker.GameFiles descriptor.Type = dataType; descriptors.Add(descriptor); - ParseElement(reader, descriptors.Count - 1, dataType); + ParseElement(ref reader, descriptors.Count - 1, dataType, stack); } else // existing descriptor + data { + if (descriptorIndex >= descriptors.Count) + { + ThrowHelper.ThrowInvalidOperationException("Index out of range"); + return default; + } if (dataType != descriptors[descriptorIndex].Type) { //throw new Exception("Data type does not match. Expected " @@ -127,15 +152,16 @@ namespace CodeWalker.GameFiles // + dataType.ToString() + ". Descriptor: " + descriptors[descriptorIndex].Name); } - ParseElement(reader, descriptorIndex, dataType); + ParseElement(ref reader, descriptorIndex, dataType, stack); } } } - throw new Exception("Unexpected end of stream."); + ThrowHelper.ThrowInvalidOperationException("Unexpected end of stream."); + return default; } - private void ParseElement(DataReader reader, int descriptorIndex, byte dataType) + private void ParseElement(ref SequenceReader reader, int descriptorIndex, byte dataType, Stack stack) { var descriptor = descriptors[descriptorIndex]; switch (dataType) @@ -145,9 +171,9 @@ namespace CodeWalker.GameFiles var structureValue = new RbfStructure(); structureValue.Name = descriptor.Name; - if (current != null) + if (current is not null) { - current.AddChild(structureValue); + current.AddChildOrAttribute(structureValue); stack.Push(current); } @@ -163,7 +189,7 @@ namespace CodeWalker.GameFiles var intValue = new RbfUint32(); intValue.Name = descriptor.Name; intValue.Value = reader.ReadUInt32(); - current.AddChild(intValue); + current.AddChildOrAttribute(intValue); break; } case 0x20: @@ -171,7 +197,7 @@ namespace CodeWalker.GameFiles var booleanValue = new RbfBoolean(); booleanValue.Name = descriptor.Name; booleanValue.Value = true; - current.AddChild(booleanValue); + current.AddChildOrAttribute(booleanValue); break; } case 0x30: @@ -179,7 +205,7 @@ namespace CodeWalker.GameFiles var booleanValue = new RbfBoolean(); booleanValue.Name = descriptor.Name; booleanValue.Value = false; - current.AddChild(booleanValue); + current.AddChildOrAttribute(booleanValue); break; } case 0x40: @@ -187,7 +213,7 @@ namespace CodeWalker.GameFiles var floatValue = new RbfFloat(); floatValue.Name = descriptor.Name; floatValue.Value = reader.ReadSingle(); - current.AddChild(floatValue); + current.AddChildOrAttribute(floatValue); break; } case 0x50: @@ -197,7 +223,7 @@ namespace CodeWalker.GameFiles floatVectorValue.X = reader.ReadSingle(); floatVectorValue.Y = reader.ReadSingle(); floatVectorValue.Z = reader.ReadSingle(); - current.AddChild(floatVectorValue); + current.AddChildOrAttribute(floatVectorValue); break; } case 0x60: @@ -207,24 +233,38 @@ namespace CodeWalker.GameFiles var stringValue = new RbfString(); stringValue.Name = descriptor.Name; stringValue.Value = value; - current.AddChild(stringValue); + current.AddChildOrAttribute(stringValue); break; } default: - throw new Exception("Unsupported data type."); + ThrowHelper.ThrowInvalidOperationException("Unsupported data type."); + return; } } public static bool IsRBF(Stream stream) { - var reader = new DataReader(stream); var origpos = stream.Position; - var ident = reader.ReadInt32(); - var isrbf = (ident == RBF_IDENT); + + Span buffer = stackalloc byte[4]; + + stream.Read(buffer); stream.Position = origpos; - return isrbf; + + return IsRBF(buffer); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsRBF(Span ident) + { + return IsRBF(BinaryPrimitives.ReadUInt32LittleEndian(ident)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsRBF(uint ident) + { + return ident == RBF_IDENT_LITTLE_ENDIAN; + } public byte GetDescriptorIndex(IRbfType t, out bool isNew) { @@ -268,12 +308,11 @@ namespace CodeWalker.GameFiles outDescriptors = new Dictionary(); var writer = new DataWriter(stream); - writer.Write(RBF_IDENT); + writer.Write(RBF_IDENT_LITTLE_ENDIAN); current.Save(this, writer); } - public void WriteRecordId(IRbfType type, DataWriter writer) { writer.Write(GetDescriptorIndex(type, out var isNew)); @@ -285,21 +324,36 @@ namespace CodeWalker.GameFiles writer.Write(Encoding.ASCII.GetBytes(type.Name)); } } + + public void Dispose() + { + current?.Dispose(); + GC.SuppressFinalize(this); + } + + ~RbfFile() + { + Dispose(); + } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfEntryDescription + [TypeConverter(typeof(ExpandableObjectConverter))] + public class RbfEntryDescription { public string Name { get; set; } public int Type { get; set; } - public override string ToString() { return Name + ": " + Type.ToString(); } + public override string ToString() => $"{Name}: {Type}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public interface IRbfType + [TypeConverter(typeof(ExpandableObjectConverter))] + public interface IRbfType { string Name { get; set; } byte DataType { get; } void Save(RbfFile file, DataWriter writer); } - [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfBytes : IRbfType + + [TypeConverter(typeof(ExpandableObjectConverter))] + public class RbfBytes : IRbfType { public string Name { get; set; } public byte[] Value { get; set; } @@ -311,8 +365,20 @@ namespace CodeWalker.GameFiles writer.Write(Value.Length); writer.Write(Value); } - public override string ToString() { return Name + ": " + Value.ToString(); } + + public string GetNullTerminatedString() + { + var span = Value.AsSpan(); + var index = span.IndexOf((byte)0); + if (index == -1) + return Encoding.ASCII.GetString(span); + + return Encoding.ASCII.GetString(span.Slice(0, index)); + } + + public override string ToString() => $"{Name}: {Value}"; } + [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfUint32 : IRbfType { public string Name { get; set; } @@ -323,9 +389,11 @@ namespace CodeWalker.GameFiles file.WriteRecordId(this, writer); writer.Write(Value); } - public override string ToString() { return Name + ": " + Value.ToString(); } + public override string ToString() => $"{Name}: {Value}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfBoolean : IRbfType + + [TypeConverter(typeof(ExpandableObjectConverter))] + public class RbfBoolean : IRbfType { public string Name { get; set; } public bool Value { get; set; } @@ -334,7 +402,7 @@ namespace CodeWalker.GameFiles { file.WriteRecordId(this, writer); } - public override string ToString() { return Name + ": " + Value.ToString(); } + public override string ToString() => $"{Name}: {Value}"; } [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfFloat : IRbfType { @@ -346,9 +414,10 @@ namespace CodeWalker.GameFiles file.WriteRecordId(this, writer); writer.Write(Value); } - public override string ToString() { return Name + ": " + Value.ToString(); } + public override string ToString() => $"{Name}: {Value}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfFloat3 : IRbfType + [TypeConverter(typeof(ExpandableObjectConverter))] + public class RbfFloat3 : IRbfType { public string Name { get; set; } public float X { get; set; } @@ -362,9 +431,10 @@ namespace CodeWalker.GameFiles writer.Write(Y); writer.Write(Z); } - public override string ToString() { return string.Format("{0}: X:{1}, Y:{2}, Z:{3}", Name, X, Y, Z); } + public override string ToString() => $"{Name}: X:{X}, Y:{Y}, Z:{Z}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfString : IRbfType + [TypeConverter(typeof(ExpandableObjectConverter))] + public class RbfString : IRbfType { public string Name { get; set; } public string Value { get; set; } @@ -375,32 +445,47 @@ namespace CodeWalker.GameFiles writer.Write((short)Value.Length); writer.Write(Encoding.ASCII.GetBytes(Value)); } - public override string ToString() { return Name + ": " + Value.ToString(); } + public override string ToString() => $"{Name}: {Value}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class RbfStructure : IRbfType + [TypeConverter(typeof(ExpandableObjectConverter))] + public class RbfStructure : IRbfType, IDisposable { + private static ObjectPool> listPool = ObjectPool.Create(new DefaultPooledObjectPolicy>()); public string Name { get; set; } - public List Children { get; set; } = new List(); - public List Attributes { get; set; } = new List(); + + public PooledList? Children { get; set; } + public PooledList? Attributes { get; set; } internal int PendingAttributes { get; set; } public byte DataType => 0; - public override string ToString() { return Name + ": {" + Children.Count.ToString() + "}"; } - public IRbfType FindChild(string name) + public override string ToString() => $"{ Name }: {{{ Children?.Count ?? 0 }}}"; + public IRbfType? FindChild(string name) { + if (Children is null || Children.Count == 0) + return null; + foreach (var child in Children) { - if (child == null) continue; - if (child.Name == name) return child; + if (child is null) + continue; + + if (child.Name == name) + return child; } return null; } - public IRbfType FindAttribute(string name) + public IRbfType? FindAttribute(string name) { + if (Attributes is null || Attributes.Count == 0) + return null; + foreach (var attr in Attributes) { - if (attr == null) continue; - if (attr.Name == name) return attr; + if (attr is null) + continue; + if (attr.Name == name) + return attr; } + return null; } public void Save(RbfFile root, DataWriter writer) @@ -410,32 +495,71 @@ namespace CodeWalker.GameFiles writer.Write(new byte[4]); // 00 // count of non-primitive fields in this (... attributes??) - writer.Write((short)Attributes.Count); //writer.Write((short)Children.TakeWhile(a => !(a is RbfBytes || a is RbfStructure)).Count()); + writer.Write((short)(Attributes?.Count ?? 0)); //writer.Write((short)Children.TakeWhile(a => !(a is RbfBytes || a is RbfStructure)).Count()); - foreach (var attr in Attributes) + if (Attributes is not null) { - attr.Save(root, writer); + foreach (var attr in Attributes) + { + attr.Save(root, writer); + } } - foreach (var child in Children) + + if (Children is not null) { - child.Save(root, writer); + foreach (var child in Children) + { + child.Save(root, writer); + } } writer.Write((byte)0xFF); writer.Write((byte)0xFF); } + internal void AddChild(IRbfType value) + { + Children ??= listPool.Get(); + Children.Add(value); + } + + internal void AddAttribute(IRbfType value) + { + Attributes ??= listPool.Get(); + Attributes.Add(value); + } + + internal void AddChildOrAttribute(IRbfType value) { if (PendingAttributes > 0) { PendingAttributes--; - Attributes.Add(value); + AddAttribute(value); } else { - Children.Add(value); + AddChild(value); } } + + public void Dispose() + { + if (Children is PooledList children) + { + listPool.Return(children); + } + if (Attributes is PooledList attributes) + { + listPool.Return(attributes); + } + + GC.SuppressFinalize(this); + } + + ~RbfStructure() + { + Dispose(); + } } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/XmlMeta.cs b/CodeWalker.Core/GameFiles/MetaTypes/XmlMeta.cs index ed52163..32a2bcd 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/XmlMeta.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/XmlMeta.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Globalization; using System.Text.RegularExpressions; using System.Xml; +using CodeWalker.Core.Utils; +using Collections.Pooled; using SharpDX; namespace CodeWalker.GameFiles @@ -64,150 +66,174 @@ namespace CodeWalker.GameFiles case MetaFormat.Mrf: return GetMrfData(doc); } - return null; + return []; } public static byte[] GetRSCData(XmlDocument doc) { var meta = GetMeta(doc); - if ((meta.DataBlocks?.Data == null) || (meta.DataBlocks.Count == 0)) return null; + if (meta.DataBlocks?.Data is null || meta.DataBlocks.Count == 0) + return []; return ResourceBuilder.Build(meta, 2); //meta is RSC V:2 } public static byte[] GetPSOData(XmlDocument doc) { var pso = XmlPso.GetPso(doc); - if ((pso.DataSection == null) || (pso.DataMapSection == null) || (pso.SchemaSection == null)) return null; + if (pso.DataSection == null || pso.DataMapSection == null || pso.SchemaSection == null) + return []; return pso.Save(); } public static byte[] GetRBFData(XmlDocument doc) { var rbf = XmlRbf.GetRbf(doc); - if (rbf.current == null) return null; + if (rbf.current is null) + return []; return rbf.Save(); } public static byte[] GetRelData(XmlDocument doc) { var rel = XmlRel.GetRel(doc); - if ((rel.RelDatasSorted == null) || (rel.RelDatas == null)) return null; + if (rel.RelDatas == null) + return []; return rel.Save(); } public static byte[] GetYndData(XmlDocument doc) { var ynd = XmlYnd.GetYnd(doc); - if (ynd.NodeDictionary == null) return null; + if (ynd.NodeDictionary == null) + return []; return ynd.Save(); } public static byte[] GetYnvData(XmlDocument doc) { var ynv = XmlYnv.GetYnv(doc); - if (ynv.Nav == null) return null; + if (ynv.Nav == null) + return []; return ynv.Save(); } public static byte[] GetYcdData(XmlDocument doc) { var ycd = XmlYcd.GetYcd(doc); - if (ycd.ClipDictionary == null) return null; + if (ycd.ClipDictionary == null) + return []; return ycd.Save(); } public static byte[] GetYbnData(XmlDocument doc) { var ybn = XmlYbn.GetYbn(doc); - if (ybn.Bounds == null) return null; + if (ybn.Bounds == null) + return []; return ybn.Save(); } public static byte[] GetYtdData(XmlDocument doc, string fpathin) { var ytd = XmlYtd.GetYtd(doc, fpathin); - if (ytd.TextureDict == null) return null; + if (ytd.TextureDict == null) + return []; return ytd.Save(); } public static byte[] GetYdrData(XmlDocument doc, string fpathin) { var ydr = XmlYdr.GetYdr(doc, fpathin); - if (ydr.Drawable == null) return null; + if (ydr.Drawable == null) + return []; return ydr.Save(); } public static byte[] GetYddData(XmlDocument doc, string fpathin) { var ydd = XmlYdd.GetYdd(doc, fpathin); - if (ydd.DrawableDict == null) return null; + if (ydd.DrawableDict == null) + return []; return ydd.Save(); } public static byte[] GetYftData(XmlDocument doc, string fpathin) { var yft = XmlYft.GetYft(doc, fpathin); - if (yft.Fragment == null) return null; + if (yft.Fragment == null) + return []; return yft.Save(); } public static byte[] GetYptData(XmlDocument doc, string fpathin) { var ypt = XmlYpt.GetYpt(doc, fpathin); - if (ypt.PtfxList == null) return null; + if (ypt.PtfxList == null) + return []; return ypt.Save(); } public static byte[] GetYldData(XmlDocument doc, string fpathin) { var yld = XmlYld.GetYld(doc, fpathin); - if (yld.ClothDictionary == null) return null; + if (yld.ClothDictionary == null) + return []; return yld.Save(); } public static byte[] GetYedData(XmlDocument doc, string fpathin) { var yed = XmlYed.GetYed(doc, fpathin); - if (yed.ExpressionDictionary == null) return null; + if (yed.ExpressionDictionary == null) + return []; return yed.Save(); } public static byte[] GetYwrData(XmlDocument doc, string fpathin) { var ywr = XmlYwr.GetYwr(doc, fpathin); - if (ywr.Waypoints == null) return null; + if (ywr.Waypoints == null) + return []; return ywr.Save(); } public static byte[] GetYvrData(XmlDocument doc, string fpathin) { var yvr = XmlYvr.GetYvr(doc, fpathin); - if (yvr.Records == null) return null; + if (yvr.Records == null) + return []; return yvr.Save(); } public static byte[] GetAwcData(XmlDocument doc, string fpathin) { var awc = XmlAwc.GetAwc(doc, fpathin); - if (awc.Streams == null) return null; + if (awc.Streams == null) + return []; return awc.Save(); } public static byte[] GetFxcData(XmlDocument doc, string fpathin) { var fxc = XmlFxc.GetFxc(doc, fpathin); - if (fxc.Shaders == null) return null; + if (fxc.Shaders == null) + return []; return fxc.Save(); } public static byte[] GetCacheFileData(XmlDocument doc) { var cdf = XmlCacheDat.GetCacheDat(doc); - if (cdf == null) return null; + if (cdf == null) + return []; return cdf.Save(); } public static byte[] GetHeightmapData(XmlDocument doc) { var hmf = XmlHmap.GetHeightmap(doc); - if (hmf.MaxHeights == null) return null; + if (hmf.MaxHeights == null) + return []; return hmf.Save(); } public static byte[] GetYpdbData(XmlDocument doc) { var ypdb = XmlYpdb.GetYpdb(doc); - if (ypdb.WeightSet == null) return null; + if (ypdb.WeightSet == null) + return []; return ypdb.Save(); } public static byte[] GetYfdData(XmlDocument doc) { var yfd = XmlYfd.GetYfd(doc); - if (yfd.FrameFilterDictionary == null) return null; + if (yfd.FrameFilterDictionary == null) + return []; return yfd.Save(); } public static byte[] GetMrfData(XmlDocument doc) { var mrf = XmlMrf.GetMrf(doc); - if (mrf == null) return null; + if (mrf == null) + return []; return mrf.Save(); } @@ -463,7 +489,7 @@ namespace CodeWalker.GameFiles if (!string.IsNullOrEmpty(cnode.InnerText)) { var ptr = mb.AddStringPtr(cnode.InnerText); - var val = MetaTypes.ConvertToBytes(ptr); + var val = MetaTypes.ConvertToBytes(in ptr); Buffer.BlockCopy(val, 0, data, entry.DataOffset, val.Length); } @@ -481,6 +507,7 @@ namespace CodeWalker.GameFiles var bytes = new List(); for (int j = 0; j < split.Length; j++) { + Console.WriteLine("Parsing byte"); byte val;// = Convert.ToByte(split[j], 10); if (byte.TryParse(split[j].Trim(), ns, ic, out val)) { @@ -488,7 +515,7 @@ namespace CodeWalker.GameFiles } } var ptr = mb.AddDataBlockPtr(bytes.ToArray(), (MetaName)MetaTypeName.BYTE); - var byt = MetaTypes.ConvertToBytes(ptr); + var byt = MetaTypes.ConvertToBytes(in ptr); Buffer.BlockCopy(byt, 0, data, entry.DataOffset, byt.Length); break; } @@ -1014,7 +1041,7 @@ namespace CodeWalker.GameFiles private static Array_uint TraverseHashArray(XmlNode node, MetaBuilder mb) { - var items = new List(); + using var items = new PooledList(); foreach (XmlNode cnode in node.ChildNodes) { @@ -1216,7 +1243,7 @@ namespace CodeWalker.GameFiles var inodes = vnode.SelectNodes("Item"); if (inodes?.Count > 0) { - var vlist = new List(); + using var vlist = new PooledList(); foreach (XmlNode inode in inodes) { vlist.Add(GetHash(inode.InnerText)); @@ -1258,7 +1285,7 @@ namespace CodeWalker.GameFiles public Dictionary Float_XYZs; public Dictionary Hashes; - public void WriteArrays(byte[] data) + public readonly void WriteArrays(byte[] data) { foreach (KeyValuePair ptr in Structures) { diff --git a/CodeWalker.Core/GameFiles/MetaTypes/XmlPso.cs b/CodeWalker.Core/GameFiles/MetaTypes/XmlPso.cs index 6ed6e3a..0e2a8a7 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/XmlPso.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/XmlPso.cs @@ -32,7 +32,7 @@ namespace CodeWalker.GameFiles type = (MetaName)(uint)GetHash(node.Name); } - var infos = PsoTypes.GetStructureInfo(type); + var infos = PsoTypesStructureInfo.GetStructureInfo(type); if (infos != null) { byte[] data = new byte[infos.StructureLength]; @@ -49,7 +49,7 @@ namespace CodeWalker.GameFiles Array.Clear(data, 0, infos.StructureLength); //shouldn't really be necessary... - PsoStructureEntryInfo arrEntry = null; + PsoStructureEntryInfo arrEntry = default; //if (isRoot) @@ -78,7 +78,7 @@ namespace CodeWalker.GameFiles { case PsoDataType.Array: { - TraverseArray(cnode, pb, entry, arrEntry, arrayResults, data, infos); + TraverseArray(cnode, pb, in entry, in arrEntry, in arrayResults, data, infos); break; } case PsoDataType.Structure: @@ -110,8 +110,8 @@ namespace CodeWalker.GameFiles var bptr = pb.AddItem(stype, struc); var ptr = new PsoPOINTER(bptr.BlockID, bptr.Offset); - ptr.SwapEnd(); - var ptrb = MetaTypes.ConvertToBytes(ptr); + ptr = ptr.SwapEnd(); + var ptrb = MetaTypes.ConvertToBytes(in ptr); Buffer.BlockCopy(ptrb, 0, data, entry.DataOffset, ptrb.Length); @@ -263,24 +263,16 @@ namespace CodeWalker.GameFiles //uint fCount = (entry.ReferenceKey >> 16) & 0x0000FFFF; uint fEntry = (entry.ReferenceKey & 0xFFF); var fEnt = (fEntry != 0xFFF) ? infos.GetEntry((int)fEntry) : null; - PsoEnumInfo flagsInfo = null; + PsoEnumInfo? flagsInfo = null; MetaName fEnum = (MetaName)(fEnt?.ReferenceKey ?? 0); - if ((fEnt != null) && (fEnt.EntryNameHash == (MetaName)MetaTypeName.ARRAYINFO)) + if (fEnt is not null && (fEnt?.EntryNameHash == (MetaName)MetaTypeName.ARRAYINFO)) { - flagsInfo = PsoTypes.GetEnumInfo(fEnum); - } - if (flagsInfo == null) - { - if (fEntry != 0xFFF) - { } - //flagsInfo = PsoTypes.GetEnumInfo(entry.EntryNameHash); + flagsInfo = PsoTypesEnumInfo.GetEnumInfo(fEnum); } if (flagsInfo != null) { pb.AddEnumInfo(flagsInfo.IndexInfo.NameHash); } - else - { }//error? switch (entry.Unk_5h) { @@ -377,11 +369,8 @@ namespace CodeWalker.GameFiles var xStruct = pb.AddMapNodeStructureInfo((MetaName)mapreftype2.ReferenceKey); var xName = xStruct.IndexInfo.NameHash; - var kEntry = xStruct?.FindEntry(MetaName.Key); - var iEntry = xStruct?.FindEntry(MetaName.Item); - - if (kEntry.Type != PsoDataType.String) - { } + var kEntry = xStruct?.FindEntry(MetaName.Key) ?? default; + var iEntry = xStruct?.FindEntry(MetaName.Item) ?? default; @@ -408,8 +397,8 @@ namespace CodeWalker.GameFiles { //normal ARRAYINFO with pointer value var itemptr = pb.AddItemPtr(thash, strucBytes); - itemptr.SwapEnd(); //big schmigg - var ptrbytes = MetaTypes.ConvertToBytes(itemptr); + itemptr = itemptr.SwapEnd(); //big schmigg + var ptrbytes = MetaTypes.ConvertToBytes(in itemptr); Buffer.BlockCopy(ptrbytes, 0, nodeBytes, iEntry.DataOffset, ptrbytes.Length); } @@ -425,7 +414,7 @@ namespace CodeWalker.GameFiles arrayResults.Structures[entry.DataOffset + 8] = pb.AddItemArrayPtr(xName, nodesData.ToArray()); //pb.AddPointerArray(nodeptrs); } - private static void TraverseArray(XmlNode node, PsoBuilder pb, PsoStructureEntryInfo entry, PsoStructureEntryInfo arrEntry, PsoArrayResults results, byte[] data, PsoStructureInfo structInfo) + private static void TraverseArray(XmlNode node, PsoBuilder pb, in PsoStructureEntryInfo entry, in PsoStructureEntryInfo arrEntry, in PsoArrayResults results, byte[] data, PsoStructureInfo structInfo) { int offset = entry.DataOffset; uint aCount = (entry.ReferenceKey >> 16) & 0x0000FFFF; @@ -643,20 +632,17 @@ namespace CodeWalker.GameFiles if (arrEntry.ReferenceKey != 0) { - var _infos = PsoTypes.GetEnumInfo((MetaName)arrEntry.ReferenceKey); + var _infos = PsoTypesEnumInfo.GetEnumInfo((MetaName)arrEntry.ReferenceKey); pb.AddEnumInfo(_infos.IndexInfo.NameHash); var values = new uint[hashes.Length]; for (int i = 0; i < hashes.Length; i++) { var enumname = (MetaName)MetaTypes.SwapBytes(hashes[i]);//yeah swap it back to little endian..! - var enuminf = _infos.FindEntryByName(enumname); - if (enuminf != null) + if (_infos.TryFindEntryByName(enumname, out var enuminf)) { values[i] = MetaTypes.SwapBytes((uint)enuminf.EntryKey); } - else - { } //error? } if (embedded) @@ -682,18 +668,19 @@ namespace CodeWalker.GameFiles var rk1 = arrEntry.ReferenceKey & 0x0000FFFF; if (rk0 > 0) //should be count of items { - var subarrEntry = structInfo.GetEntry((int)rk1); - var subarrType = (MetaName)subarrEntry.ReferenceKey; + var subarrEntry = structInfo.GetEntry((int)rk1) ?? throw new InvalidOperationException("SubarrEntry not found!"); + //var subarrType = (MetaName)subarrEntry.ReferenceKey; - var origOffset = arrEntry.DataOffset; - arrEntry.DataOffset = entry.DataOffset;//slight hack for traversing array array + //var origOffset = arrEntry.DataOffset; + var _arrEntry = arrEntry; + _arrEntry = _arrEntry with { DataOffset = entry.DataOffset };//slight hack for traversing array array foreach (XmlNode cnode in node.ChildNodes) { - TraverseArray(cnode, pb, arrEntry, subarrEntry, results, data, structInfo); + TraverseArray(cnode, pb, in arrEntry, in subarrEntry, in results, data, structInfo); - arrEntry.DataOffset += 16;//ptr size... todo: what if not pointer array? + _arrEntry = _arrEntry with { DataOffset = (ushort)(arrEntry.DataOffset + 16) };//ptr size... todo: what if not pointer array? } - arrEntry.DataOffset = origOffset; + //arrEntry = arrEntry with { DataOffset = origOffset }; } @@ -748,9 +735,8 @@ namespace CodeWalker.GameFiles if (!string.IsNullOrEmpty(str)) { var bptr = pb.AddString(str); - var ptr = new PsoPOINTER(bptr.BlockID, bptr.Offset); - ptr.SwapEnd(); - var val = MetaTypes.ConvertToBytes(ptr); + var ptr = new PsoPOINTER(bptr.BlockID, bptr.Offset).SwapEnd(); + var val = MetaTypes.ConvertToBytes(in ptr); Buffer.BlockCopy(val, 0, data, entry.DataOffset, val.Length); } break; @@ -758,9 +744,8 @@ namespace CodeWalker.GameFiles if (!string.IsNullOrEmpty(str)) { var bptr = pb.AddString(str); - var ptr = new CharPointer(bptr.Pointer, str.Length); - ptr.SwapEnd(); - var val = MetaTypes.ConvertToBytes(ptr); + var ptr = new CharPointer(bptr.Pointer, str.Length).SwapEnd(); + var val = MetaTypes.ConvertToBytes(in ptr); Buffer.BlockCopy(val, 0, data, entry.DataOffset, val.Length); } break; @@ -816,7 +801,7 @@ namespace CodeWalker.GameFiles if (struc != null) { var ptr = pb.AddItemPtr(type, struc); - ptr.SwapEnd(); //big schmigg + ptr = ptr.SwapEnd(); //big schmigg ptrs.Add(ptr); } else @@ -1107,7 +1092,7 @@ namespace CodeWalker.GameFiles private static int GetEnumInt(MetaName type, string enumString, PsoDataType dataType) { - var infos = PsoTypes.GetEnumInfo(type); + var infos = PsoTypesEnumInfo.GetEnumInfo(type); if (infos == null) { @@ -1175,69 +1160,61 @@ namespace CodeWalker.GameFiles public Dictionary Float_XYZs; public Dictionary Hashes; - public void WriteArrays(byte[] data) + public readonly void WriteArrays(byte[] data) { foreach (KeyValuePair ptr in Structures) { - var val = ptr.Value; - val.SwapEnd(); - var _data = MetaTypes.ConvertToBytes(val); + var val = ptr.Value.SwapEnd(); + var _data = MetaTypes.ConvertToBytes(in val); Buffer.BlockCopy(_data, 0, data, ptr.Key, _data.Length); } foreach (KeyValuePair ptr in StructurePointers) { - var val = ptr.Value; - val.SwapEnd(); - var _data = MetaTypes.ConvertToBytes(val); + var val = ptr.Value.SwapEnd(); + var _data = MetaTypes.ConvertToBytes(in val); Buffer.BlockCopy(_data, 0, data, ptr.Key, _data.Length); } foreach (KeyValuePair ptr in UInts) { - var val = ptr.Value; - val.SwapEnd(); - var _data = MetaTypes.ConvertToBytes(val); + var val = ptr.Value.SwapEnd(); + var _data = MetaTypes.ConvertToBytes(in val); Buffer.BlockCopy(_data, 0, data, ptr.Key, _data.Length); } foreach (KeyValuePair ptr in UShorts) { - var val = ptr.Value; - val.SwapEnd(); - var _data = MetaTypes.ConvertToBytes(val); + var val = ptr.Value.SwapEnd(); + var _data = MetaTypes.ConvertToBytes(in val); Buffer.BlockCopy(_data, 0, data, ptr.Key, _data.Length); } foreach (KeyValuePair ptr in UBytes) { - var val = ptr.Value; - val.SwapEnd(); - var _data = MetaTypes.ConvertToBytes(val); + var val = ptr.Value.SwapEnd(); + var _data = MetaTypes.ConvertToBytes(in val); Buffer.BlockCopy(_data, 0, data, ptr.Key, _data.Length); } foreach (KeyValuePair ptr in Floats) { - var val = ptr.Value; - val.SwapEnd(); - var _data = MetaTypes.ConvertToBytes(val); + var val = ptr.Value.SwapEnd(); + var _data = MetaTypes.ConvertToBytes(in val); Buffer.BlockCopy(_data, 0, data, ptr.Key, _data.Length); } foreach (KeyValuePair ptr in Float_XYZs) { - var val = ptr.Value; - val.SwapEnd(); - var _data = MetaTypes.ConvertToBytes(val); + var val = ptr.Value.SwapEnd(); + var _data = MetaTypes.ConvertToBytes(in val); Buffer.BlockCopy(_data, 0, data, ptr.Key, _data.Length); } foreach (KeyValuePair ptr in Hashes) { - var val = ptr.Value; - val.SwapEnd(); - var _data = MetaTypes.ConvertToBytes(val); + var val = ptr.Value.SwapEnd(); + var _data = MetaTypes.ConvertToBytes(in val); Buffer.BlockCopy(_data, 0, data, ptr.Key, _data.Length); } } diff --git a/CodeWalker.Core/GameFiles/MetaTypes/XmlRbf.cs b/CodeWalker.Core/GameFiles/MetaTypes/XmlRbf.cs index 49db172..c699d14 100644 --- a/CodeWalker.Core/GameFiles/MetaTypes/XmlRbf.cs +++ b/CodeWalker.Core/GameFiles/MetaTypes/XmlRbf.cs @@ -1,4 +1,5 @@ -using SharpDX; +using Collections.Pooled; +using SharpDX; using System; using System.Collections.Generic; using System.Globalization; @@ -27,13 +28,13 @@ namespace CodeWalker.GameFiles return rbf; } - private static IRbfType Traverse(XNode node) + private static IRbfType? Traverse(XNode node) { if (node is XElement element) { - if (element.Attribute("value") != null) + if (element.TryGetAttribute("value", out var value)) { - var val = element.Attribute("value").Value; + var val = value.Value; if (!string.IsNullOrEmpty(val)) { var rval = CreateValueNode(element.Name.LocalName, val); @@ -43,11 +44,11 @@ namespace CodeWalker.GameFiles } } } - else if ((element.Attributes().Count() == 3) && (element.Attribute("x") != null) && (element.Attribute("y") != null) && (element.Attribute("z") != null)) + else if (element.Attributes().Count() == 3 && element.TryGetAttribute("x", out var xAttr) && element.TryGetAttribute("y", out var yAttr) && element.TryGetAttribute("z", out var zAttr)) { - FloatUtil.TryParse(element.Attribute("x").Value, out float x); - FloatUtil.TryParse(element.Attribute("y").Value, out float y); - FloatUtil.TryParse(element.Attribute("z").Value, out float z); + FloatUtil.TryParse(xAttr.Value, out float x); + FloatUtil.TryParse(yAttr.Value, out float y); + FloatUtil.TryParse(zAttr.Value, out float z); return new RbfFloat3() { Name = element.Name.LocalName, @@ -56,7 +57,7 @@ namespace CodeWalker.GameFiles Z = z }; } - else if ((element.Elements().Count() == 0) && (element.Attributes().Count() == 0) && (!element.IsEmpty)) //else if (element.Name == "type" || element.Name == "key" || element.Name == "platform") + else if (!element.HasElements && !element.HasAttributes && !element.IsEmpty) //else if (element.Name == "type" || element.Name == "key" || element.Name == "platform") { var bytearr = Encoding.ASCII.GetBytes(element.Value); var bytearrnt = new byte[bytearr.Length + 1]; @@ -69,7 +70,7 @@ namespace CodeWalker.GameFiles var n = new RbfStructure(); n.Name = element.Name.LocalName; - n.Children = element.Nodes().Select(c => Traverse(c)).ToList(); + n.Children = element.Nodes().Select(Traverse).ToPooledList(); foreach (var attr in element.Attributes()) { @@ -85,9 +86,8 @@ namespace CodeWalker.GameFiles } else if (node is XText text) { - byte[] bytes = null; - var contentAttr = node.Parent?.Attribute("content"); - if (contentAttr != null) + byte[]? bytes = null; + if (node.Parent?.TryGetAttribute("content", out var contentAttr) ?? false) { if (contentAttr.Value == "char_array") { @@ -97,14 +97,12 @@ namespace CodeWalker.GameFiles { bytes = GetUshortArray(text.Value); } - else - { } } else { bytes = Encoding.ASCII.GetBytes(text.Value).Concat(new byte[] { 0x00 }).ToArray(); } - if (bytes != null) + if (bytes is not null) { return new RbfBytes() { @@ -138,7 +136,7 @@ namespace CodeWalker.GameFiles } else if (val.StartsWith("0x")) { - uint.TryParse(val.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint u); + uint.TryParse(val.AsSpan(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint u); return new RbfUint32() { Name = name, @@ -167,37 +165,32 @@ namespace CodeWalker.GameFiles - private static byte[] GetByteArray(string text) + private static byte[]? GetByteArray(string text) { - if (string.IsNullOrEmpty(text)) return null; - var data = new List(); + if (string.IsNullOrEmpty(text)) + return null; + using var data = new PooledList(); var split = Regex.Split(text, @"[\s\r\n\t]"); - for (int i = 0; i < split.Length; i++) + foreach(var str in split) { - if (!string.IsNullOrEmpty(split[i])) - { - var str = split[i]; - if (string.IsNullOrEmpty(str)) continue; - var val = Convert.ToByte(str); - data.Add(val); - } + if (string.IsNullOrEmpty(str)) + continue; + var val = Convert.ToByte(str); + data.Add(val); } return data.ToArray(); } private static byte[] GetUshortArray(string text) { - var data = new List(); + using var data = new PooledList(); var split = Regex.Split(text, @"[\s\r\n\t]"); - for (int i = 0; i < split.Length; i++) + foreach(var str in split) { - if (!string.IsNullOrEmpty(split[i])) - { - var str = split[i]; - if (string.IsNullOrEmpty(str)) continue; - var val = Convert.ToUInt16(str); - data.Add((byte)((val >> 0) & 0xFF)); - data.Add((byte)((val >> 8) & 0xFF)); - } + if (string.IsNullOrEmpty(str)) + continue; + var val = Convert.ToUInt16(str); + data.Add((byte)((val >> 0) & 0xFF)); + data.Add((byte)((val >> 8) & 0xFF)); } return data.ToArray(); } diff --git a/CodeWalker.Core/GameFiles/Resources/Bounds.cs b/CodeWalker.Core/GameFiles/Resources/Bounds.cs index f2b0a71..572b9ba 100644 --- a/CodeWalker.Core/GameFiles/Resources/Bounds.cs +++ b/CodeWalker.Core/GameFiles/Resources/Bounds.cs @@ -37,6 +37,9 @@ using CodeWalker.World; using TC = System.ComponentModel.TypeConverterAttribute; using EXP = System.ComponentModel.ExpandableObjectConverter; +using Collections.Pooled; +using CommunityToolkit.HighPerformance; +using static CodeWalker.GameFiles.MetaXmlBase; namespace CodeWalker.GameFiles { @@ -89,11 +92,11 @@ namespace CodeWalker.GameFiles writer.WriteBlock(this.Bounds); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, BoundNameHashes), - new Tuple(0x30, Bounds) + return new (long, IResourceBlock)[] { + (0x20, BoundNameHashes), + (0x30, Bounds) }; } } @@ -114,11 +117,7 @@ namespace CodeWalker.GameFiles [TC(typeof(EXP))] public class Bounds : ResourceFileBase, IResourceXXSystemBlock { - public override long BlockLength - { - get { return 112; } - } - + public override long BlockLength => 112; // structure data public BoundsType Type { get; set; } public byte Unknown_11h { get; set; } // 0x00000000 @@ -126,9 +125,9 @@ namespace CodeWalker.GameFiles public float SphereRadius { get; set; } public uint Unknown_18h { get; set; } // 0x00000000 public uint Unknown_1Ch { get; set; } // 0x00000000 - public Vector3 BoxMax { get; set; } + public Vector3 BoxMax; public float Margin { get; set; } - public Vector3 BoxMin { get; set; } + public Vector3 BoxMin; public uint Unknown_3Ch { get; set; } = 1; //1, 2 (yft only) public Vector3 BoxCenter { get; set; } public byte MaterialIndex { get; set; } @@ -144,10 +143,7 @@ namespace CodeWalker.GameFiles public byte RoomId { - get - { - return (byte)(RoomId_and_PedDensity & 0x1F); - } + get => (byte)(RoomId_and_PedDensity & 0x1F); set { RoomId_and_PedDensity = (byte)((RoomId_and_PedDensity & 0xE0) + (value & 0x1F)); @@ -155,10 +151,7 @@ namespace CodeWalker.GameFiles } public byte PedDensity { - get - { - return (byte)(RoomId_and_PedDensity >> 5); - } + get => (byte)(RoomId_and_PedDensity >> 5); set { RoomId_and_PedDensity = (byte)((RoomId_and_PedDensity & 0x1F) + ((value & 0x7) << 5)); @@ -170,13 +163,7 @@ namespace CodeWalker.GameFiles public YbnFile OwnerYbn { get; set; } public object Owner { get; set; } public string OwnerName { get; set; } - public bool OwnerIsFragment - { - get - { - return ((Owner is FragPhysicsLOD) || (Owner is FragPhysArchetype) || (Owner is FragDrawable)); - } - } + public bool OwnerIsFragment => (Owner is FragPhysicsLOD) || (Owner is FragPhysArchetype) || (Owner is FragDrawable); public string GetName() { string n = OwnerName; @@ -188,17 +175,12 @@ namespace CodeWalker.GameFiles } return n; } - public string GetTitle() - { - var n = GetName(); - var t = Type.ToString(); - return t + ": " + n; - } + public string GetTitle() => $"{Type}: {GetName()}"; public YbnFile GetRootYbn() { var r = OwnerYbn; var p = Parent; - while ((p != null) && (r == null)) + while (p is not null && r is null) { r = p.OwnerYbn; p = p.Parent; @@ -209,7 +191,7 @@ namespace CodeWalker.GameFiles { var r = Owner; var p = Parent; - while ((p != null) && (r == null)) + while (p is not null && r is null) { r = p.Owner; p = p.Parent; @@ -217,7 +199,9 @@ namespace CodeWalker.GameFiles return r; } - public Matrix Transform { get; set; } = Matrix.Identity; //when it's the child of a bound composite + + public Matrix _Transform = Matrix.Identity; + public Matrix Transform { get => _Transform; set => _Transform = value; } //when it's the child of a bound composite public Matrix TransformInv { get; set; } = Matrix.Identity; public BoundCompositeChildrenFlags CompositeFlags1 { get; set; } @@ -226,10 +210,7 @@ namespace CodeWalker.GameFiles public virtual Vector3 Scale { - get - { - return Transform.ScaleVector; - } + get => Transform.ScaleVector; set { var m = Transform; @@ -240,10 +221,7 @@ namespace CodeWalker.GameFiles } public virtual Vector3 Position { - get - { - return Transform.TranslationVector; - } + get => Transform.TranslationVector; set { var m = Transform; @@ -254,10 +232,7 @@ namespace CodeWalker.GameFiles } public virtual Quaternion Orientation { - get - { - return Transform.ToQuaternion(); - } + get => Transform.ToQuaternion(); set { var m = value.ToMatrix(); @@ -294,86 +269,6 @@ namespace CodeWalker.GameFiles this.Unknown_5Eh = reader.ReadUInt16(); this.Unknown_60h = reader.ReadVector3(); this.Volume = reader.ReadSingle(); - - if (Unknown_11h != 0) - { } - if (Unknown_12h != 0) - { } - if (Unknown_18h != 0) - { } - if (Unknown_1Ch != 0) - { } - if (Unknown_5Eh != 0) - { } - - - switch (Unknown_3Ch) - { - case 1: - case 2: // only found in .yft - case 0: //only found in .ypt - break; - default: - break; - } - switch (UnkFlags)//yeah it's probably flags - { - case 0://for all .ybn files - case 26: //v_corp_banktrolley.ydr - case 18: //v_corp_banktrolley.ydr - case 16: //v_corp_banktrolley.ydr - case 2: //v_corp_bk_bust.ydr - case 10: //v_corp_bk_bust.ydr - case 130://v_corp_bk_chair2.ydr - case 30: //v_corp_bk_flag.ydr - case 144://v_corp_bombbin.ydr - case 8: //v_corp_conftable2.ydr - case 12: //v_corp_conftable3.ydr - case 4: //v_corp_cubiclefd.ydr - case 22: //v_corp_hicksdoor.ydr - case 150://v_corp_hicksdoor.ydr - case 128://v_corp_officedesk003.ydr - case 24: //v_corp_potplant1.ydr - case 14: //v_ind_cm_aircomp.ydr - case 146://v_ind_rc_rubbish.ydr - case 134://v_ilev_bk_door.ydr - case 64: //v_ilev_carmod3lamp.ydr - case 28: //v_ilev_cbankvaulgate02.ydr - case 132://v_ilev_ch_glassdoor.ydr - case 6: //v_ilev_cs_door01.ydr - case 20: //v_ilev_fib_atrgl1s.ydr - case 94: //v_ilev_uvcheetah.ydr - case 148://v_serv_metro_elecpole_singlel.ydr - case 48: //v_serv_metro_statseat1.ydr - case 50: //v_serv_securitycam_03.ydr - case 80: //prop_bmu_02_ld.ydr - case 92: //prop_bmu_02_ld.ydr - case 82: //prop_roofvent_08a.ydr - case 1: //prop_portasteps_02.ydr - case 65: //prop_storagetank_01_cr.ydr - case 90: //prop_storagetank_01_cr.ydr - case 68: //prop_sub_frame_01a.ydr - case 66: //prop_ld_cable.ydr - case 78: //prop_ld_cable.ydr - case 72: //prop_snow_oldlight_01b.ydr - case 13: //prop_conslift_steps.ydr - case 86: //prop_scafold_01a.ydr - case 84: //prop_scafold_04a.ydr - case 76: //prop_fruitstand_b_nite.ydr - case 88: //prop_telegwall_01a.ydr - case 17: //prop_air_stair_04a_cr.ydr - case 196://prop_dock_rtg_ld.ydr - case 70: //prop_fnclink_02gate5.ydr - case 214://prop_facgate_04_l.ydr - case 198://prop_fncsec_01a.ydr - case 210://prop_rub_cardpile_01.yft - case 212://prop_streetlight_01b.yft - case 208://prop_streetlight_03e.yft - break; - default: - break; - } - } public override void Write(ResourceDataWriter writer, params object[] parameters) { @@ -464,7 +359,7 @@ namespace CodeWalker.GameFiles } public static void WriteXmlNode(Bounds b, StringBuilder sb, int indent, string name = "Bounds") { - if (b == null) + if (b is null) { YbnXml.SelfClosingTag(sb, indent, name + " type=\"" + BoundsType.None.ToString() + "\""); } @@ -475,9 +370,11 @@ namespace CodeWalker.GameFiles YbnXml.CloseTag(sb, indent, name); } } - public static Bounds ReadXmlNode(XmlNode node, object owner = null, BoundComposite parent = null) + public static Bounds? ReadXmlNode(XmlNode node, object owner = null, BoundComposite parent = null) { - if (node == null) return null; + if (node is null) + return null; + var typestr = Xml.GetStringAttribute(node, "type"); var type = Xml.GetEnumValue(typestr); var b = Create(type); @@ -498,27 +395,29 @@ namespace CodeWalker.GameFiles reader.Position -= 17; return Create(type); } - public static Bounds Create(BoundsType type) + public static Bounds? Create(BoundsType type) { - switch (type) + return type switch { - case BoundsType.None: return null; - case BoundsType.Sphere: return new BoundSphere(); - case BoundsType.Capsule: return new BoundCapsule(); - case BoundsType.Box: return new BoundBox(); - case BoundsType.Geometry: return new BoundGeometry(); - case BoundsType.GeometryBVH: return new BoundBVH(); - case BoundsType.Composite: return new BoundComposite(); - case BoundsType.Disc: return new BoundDisc(); - case BoundsType.Cylinder: return new BoundCylinder(); - case BoundsType.Cloth: return new BoundCloth(); - default: return null; // throw new Exception("Unknown bound type"); - } + BoundsType.None => null, + BoundsType.Sphere => new BoundSphere(), + BoundsType.Capsule => new BoundCapsule(), + BoundsType.Box => new BoundBox(), + BoundsType.Geometry => new BoundGeometry(), + BoundsType.GeometryBVH => new BoundBVH(), + BoundsType.Composite => new BoundComposite(), + BoundsType.Disc => new BoundDisc(), + BoundsType.Cylinder => new BoundCylinder(), + BoundsType.Cloth => new BoundCloth(), + _ => null,// throw new Exception("Unknown bound type"); + }; } - public virtual void CopyFrom(Bounds other) + public virtual void CopyFrom(Bounds? other) { - if (other == null) return; + if (other is null) + return; + SphereRadius = other.SphereRadius; SphereCenter = other.SphereCenter; BoxCenter = other.BoxCenter; @@ -546,7 +445,8 @@ namespace CodeWalker.GameFiles } } - [TC(typeof(EXP))] public class BoundSphere : Bounds + [TC(typeof(EXP))] + public class BoundSphere : Bounds { public override void ReadXml(XmlNode node) { @@ -632,7 +532,7 @@ namespace CodeWalker.GameFiles bcap.PointA = SphereCenter - extent; bcap.PointB = SphereCenter + extent; bcap.Radius = Margin; - if (sph.Intersects(ref bcap, out res.Normal)) + if (sph.Intersects(in bcap, out res.Normal)) { res.Hit = true; } @@ -647,13 +547,13 @@ namespace CodeWalker.GameFiles bcap.PointB = SphereCenter + extent; bcap.Radius = Margin; float testdist; - if (ray.Intersects(ref bcap, out testdist) && (testdist < maxdist)) + if (ray.Intersects(in bcap, out testdist) && (testdist < maxdist)) { res.Hit = true; res.HitDist = testdist; res.HitBounds = this; res.Position = ray.Position + ray.Direction * testdist; - res.Normal = bcap.Normal(ref res.Position); + res.Normal = bcap.Normal(in res.Position); res.Material.Type = MaterialIndex; } return res; @@ -780,7 +680,7 @@ namespace CodeWalker.GameFiles bcyl.Radius = SphereRadius; Vector3 n; float testdist; - if (ray.Intersects(ref bcyl, out testdist, out n) && (testdist < maxdist)) + if (ray.Intersects(in bcyl, out testdist, out n) && (testdist < maxdist)) { res.Hit = true; res.HitDist = testdist; @@ -841,7 +741,7 @@ namespace CodeWalker.GameFiles bcap.PointA = SphereCenter - size; bcap.PointB = SphereCenter + size; bcap.Radius = extent.X * 0.5f; - if (sph.Intersects(ref bcap, out res.Normal)) + if (sph.Intersects(in bcap, out res.Normal)) { res.Hit = true; } @@ -858,7 +758,7 @@ namespace CodeWalker.GameFiles bcyl.Radius = extent.X * 0.5f; Vector3 n; float testdist; - if (ray.Intersects(ref bcyl, out testdist, out n) && (testdist < maxdist)) + if (ray.Intersects(in bcyl, out testdist, out n) && (testdist < maxdist)) { res.Hit = true; res.HitDist = testdist; @@ -1266,17 +1166,16 @@ namespace CodeWalker.GameFiles UpdateEdgeIndices(); UpdateTriangleAreas(); - var list = new List(base.GetReferences()); + using var list = new PooledList(base.GetReferences()); if (VerticesShrunk != null) { - var verts = new List(); - foreach (var v in VerticesShrunk) + var verts = new BoundVertex_s[VerticesShrunk.Length]; + for (int i = 0; i < VerticesShrunk.Length; i++) { - var vq = v / Quantum; - var vs = new BoundVertex_s(vq); - verts.Add(vs); + var vq = VerticesShrunk[i] / Quantum; + verts[i] = new BoundVertex_s(vq); } - VerticesShrunkBlock = new ResourceSystemStructBlock(verts.ToArray()); + VerticesShrunkBlock = new ResourceSystemStructBlock(verts); list.Add(VerticesShrunkBlock); } if (Polygons != null) @@ -1359,8 +1258,8 @@ namespace CodeWalker.GameFiles byte b0 = polygonData[offset]; polygonData[offset] = (byte)(b0 & 0xF8);//mask it off BoundPolygonType type = (BoundPolygonType)(b0 & 7); - BoundPolygon p = CreatePolygon(type); - if (p != null) + BoundPolygon? p = CreatePolygon(type); + if (p is not null) { p.Index = i; p.Read(polygonData, offset); @@ -1387,18 +1286,21 @@ namespace CodeWalker.GameFiles } return r; } - public Vector3 GetVertex(int index) + public ref readonly Vector3 GetVertex(int index) { - return ((index >= 0) && (index < Vertices.Length)) ? Vertices[index] : Vector3.Zero; + if (index < 0 || index >= Vertices.Length) + return ref Vector3.Zero; + + return ref Vertices[index]; } public Vector3 GetVertexPos(int index) { var v = GetVertex(index) + CenterGeom; - return Vector3.Transform(v, Transform).XYZ(); + return Vector3.Transform(v, _Transform).XYZ(); } public void SetVertexPos(int index, Vector3 v) { - if ((index >= 0) && (index < Vertices.Length)) + if (index >= 0 && index < Vertices.Length) { var t = Vector3.Transform(v, TransformInv).XYZ() - CenterGeom; Vertices[index] = t; @@ -1497,7 +1399,7 @@ namespace CodeWalker.GameFiles tcap.PointA = GetVertexPos(pcap.capsuleIndex1); tcap.PointB = GetVertexPos(pcap.capsuleIndex2); tcap.Radius = pcap.capsuleRadius; - polyhit = sph.Intersects(ref tcap, out n1); + polyhit = sph.Intersects(in tcap, out n1); break; case BoundPolygonType.Box: var pbox = polygon as BoundPolygonBox; @@ -1550,7 +1452,7 @@ namespace CodeWalker.GameFiles ttcap.PointA = GetVertexPos(pcyl.cylinderIndex1); ttcap.PointB = GetVertexPos(pcyl.cylinderIndex2); ttcap.Radius = pcyl.cylinderRadius; - polyhit = sph.Intersects(ref ttcap, out n1); + polyhit = sph.Intersects(in ttcap, out n1); break; default: break; @@ -1604,9 +1506,9 @@ namespace CodeWalker.GameFiles tcap.PointA = GetVertexPos(pcap.capsuleIndex1); tcap.PointB = GetVertexPos(pcap.capsuleIndex2); tcap.Radius = pcap.capsuleRadius; - polyhit = ray.Intersects(ref tcap, out polyhittestdist); + polyhit = ray.Intersects(in tcap, out polyhittestdist); res.Position = (ray.Position + ray.Direction * polyhittestdist); - if (polyhit) n1 = tcap.Normal(ref res.Position); + if (polyhit) n1 = tcap.Normal(in res.Position); break; case BoundPolygonType.Box: var pbox = polygon as BoundPolygonBox; @@ -1650,7 +1552,7 @@ namespace CodeWalker.GameFiles tcyl.PointA = GetVertexPos(pcyl.cylinderIndex1); tcyl.PointB = GetVertexPos(pcyl.cylinderIndex2); tcyl.Radius = pcyl.cylinderRadius; - polyhit = ray.Intersects(ref tcyl, out polyhittestdist, out n1); + polyhit = ray.Intersects(in tcyl, out polyhittestdist, out n1); break; default: break; @@ -1799,8 +1701,7 @@ namespace CodeWalker.GameFiles for (int i = 0; i < Polygons.Length; i++) { - var tri = Polygons[i] as BoundPolygonTriangle; - if (tri == null) { continue; } + if (Polygons[i] is not BoundPolygonTriangle tri) { continue; } var p1 = tri.Vertex1; var p2 = tri.Vertex2; @@ -2017,7 +1918,7 @@ namespace CodeWalker.GameFiles var v1 = btri.Vertex1; var v2 = btri.Vertex2; var v3 = btri.Vertex3; - var area = TriangleMath.Area(ref v1, ref v2, ref v3); + var area = TriangleMath.Area(in v1, in v2, in v3); //if (Math.Abs(btri.triArea - area) > Math.Max(area*0.1f,0.1f)) //{ }//ehh good enough btri.triArea = area; @@ -2157,10 +2058,10 @@ namespace CodeWalker.GameFiles public int AddVertex() { - var verts = Vertices?.ToList() ?? new List(); - var verts2 = VerticesShrunk?.ToList(); - var vertcols = VertexColours?.ToList(); - var vertobjs = VertexObjects?.ToList(); + using var verts = Vertices?.ToPooledList() ?? new PooledList(); + using var verts2 = VerticesShrunk?.ToPooledList(); + using var vertcols = VertexColours?.ToPooledList(); + using var vertobjs = VertexObjects?.ToPooledList(); var index = verts.Count; verts.Add(Vector3.Zero); @@ -2206,30 +2107,19 @@ namespace CodeWalker.GameFiles return p; } - private BoundPolygon CreatePolygon(BoundPolygonType type) + private BoundPolygon? CreatePolygon(BoundPolygonType type) { - BoundPolygon p = null; - switch (type) + BoundPolygon? p = type switch { - case BoundPolygonType.Triangle: - p = new BoundPolygonTriangle(); - break; - case BoundPolygonType.Sphere: - p = new BoundPolygonSphere(); - break; - case BoundPolygonType.Capsule: - p = new BoundPolygonCapsule(); - break; - case BoundPolygonType.Box: - p = new BoundPolygonBox(); - break; - case BoundPolygonType.Cylinder: - p = new BoundPolygonCylinder(); - break; - default: - break; - } - if (p != null) + BoundPolygonType.Triangle => new BoundPolygonTriangle(), + BoundPolygonType.Sphere => new BoundPolygonSphere(), + BoundPolygonType.Capsule => new BoundPolygonCapsule(), + BoundPolygonType.Box => new BoundPolygonBox(), + BoundPolygonType.Cylinder => new BoundPolygonCylinder(), + _ => null, + }; + + if (p is not null) { p.Owner = this; } @@ -2254,7 +2144,7 @@ namespace CodeWalker.GameFiles public uint Unknown_14Ch { get; set; } // 0x00000000 // reference data - public BVH BVH { get; set; } + public BVH? BVH { get; set; } public override void Read(ResourceDataReader reader, params object[] parameters) { @@ -2322,8 +2212,12 @@ namespace CodeWalker.GameFiles { BuildBVH(false); - var list = new List(base.GetReferences()); - if (BVH != null) list.Add(BVH); + if (BVH is null) + return base.GetReferences(); + + using var list = new PooledList(base.GetReferences()); + if (BVH != null) + list.Add(BVH); return list.ToArray(); } @@ -2334,8 +2228,6 @@ namespace CodeWalker.GameFiles { if ((Polygons?.Length ?? 0) <= 0) //in some des_ drawables? { - if (BVH != null) - { } BVH = null; return; } @@ -2344,17 +2236,19 @@ namespace CodeWalker.GameFiles //var tnodes = BVHBuilder.Unbuild(BVH); } - var items = new List(); + var items = new List(Polygons.Length); for (int i = 0; i < Polygons.Length; i++) { var poly = Polygons[i]; if (poly != null) { - var it = new BVHBuilderItem(); - it.Min = poly.BoxMin; - it.Max = poly.BoxMax; - it.Index = i; - it.Polygon = poly; + var it = new BVHBuilderItem + { + Min = poly.BoxMin, + Max = poly.BoxMax, + Index = i, + Polygon = poly + }; items.Add(it); } } @@ -2568,20 +2462,20 @@ namespace CodeWalker.GameFiles // reference data public ResourcePointerArray64 Children { get; set; } - public Matrix4F_s[] ChildrenTransformation1 { get; set; } - public Matrix4F_s[] ChildrenTransformation2 { get; set; } - public AABB_s[] ChildrenBoundingBoxes { get; set; } - public BoundCompositeChildrenFlags[] ChildrenFlags1 { get; set; } - public BoundCompositeChildrenFlags[] ChildrenFlags2 { get; set; } + public Matrix4F_s[]? ChildrenTransformation1 { get; set; } + public Matrix4F_s[]? ChildrenTransformation2 { get; set; } + public AABB_s[]? ChildrenBoundingBoxes { get; set; } + public BoundCompositeChildrenFlags[] ChildrenFlags1 { get; set; } = []; + public BoundCompositeChildrenFlags[] ChildrenFlags2 { get; set; } = []; - public BVH BVH { get; set; } + public BVH? BVH { get; set; } - private ResourceSystemStructBlock ChildrenTransformation1Block = null; - private ResourceSystemStructBlock ChildrenTransformation2Block = null; - private ResourceSystemStructBlock ChildrenBoundingBoxesBlock = null; - private ResourceSystemStructBlock ChildrenFlags1Block = null; - private ResourceSystemStructBlock ChildrenFlags2Block = null; + private ResourceSystemStructBlock? ChildrenTransformation1Block = null; + private ResourceSystemStructBlock? ChildrenTransformation2Block = null; + private ResourceSystemStructBlock? ChildrenBoundingBoxesBlock = null; + private ResourceSystemStructBlock? ChildrenFlags1Block = null; + private ResourceSystemStructBlock? ChildrenFlags2Block = null; public override void Read(ResourceDataReader reader, params object[] parameters) @@ -2605,8 +2499,8 @@ namespace CodeWalker.GameFiles this.ChildrenTransformation1 = reader.ReadStructsAt(this.ChildrenTransformation1Pointer, this.ChildrenCount1); this.ChildrenTransformation2 = reader.ReadStructsAt(this.ChildrenTransformation2Pointer, this.ChildrenCount1); this.ChildrenBoundingBoxes = reader.ReadStructsAt(this.ChildrenBoundingBoxesPointer, this.ChildrenCount1); - this.ChildrenFlags1 = reader.ReadStructsAt(this.ChildrenFlags1Pointer, this.ChildrenCount1); - this.ChildrenFlags2 = reader.ReadStructsAt(this.ChildrenFlags2Pointer, this.ChildrenCount1); + this.ChildrenFlags1 = reader.ReadStructsAt(this.ChildrenFlags1Pointer, this.ChildrenCount1) ?? []; + this.ChildrenFlags2 = reader.ReadStructsAt(this.ChildrenFlags2Pointer, this.ChildrenCount1) ?? []; this.BVH = reader.ReadBlockAt(this.BVHPointer); //if (BVH != null) @@ -2630,8 +2524,8 @@ namespace CodeWalker.GameFiles var xform = ((childTransforms != null) && (i < childTransforms.Length)) ? childTransforms[i].ToMatrix() : Matrix.Identity; child.Transform = xform; child.TransformInv = Matrix.Invert(xform); - child.CompositeFlags1 = ((ChildrenFlags1 != null) && (i < ChildrenFlags1.Length)) ? ChildrenFlags1[i] : new BoundCompositeChildrenFlags(); - child.CompositeFlags2 = ((ChildrenFlags2 != null) && (i < ChildrenFlags2.Length)) ? ChildrenFlags2[i] : new BoundCompositeChildrenFlags(); + child.CompositeFlags1 = i < ChildrenFlags1.Length ? ChildrenFlags1[i] : new BoundCompositeChildrenFlags(); + child.CompositeFlags2 = i < ChildrenFlags2.Length ? ChildrenFlags2[i] : new BoundCompositeChildrenFlags(); //if ((child.CompositeFlags1.Flags1 != child.CompositeFlags2.Flags1) || (child.CompositeFlags1.Flags2 != child.CompositeFlags2.Flags2)) //{ } //no hits @@ -2805,34 +2699,63 @@ namespace CodeWalker.GameFiles UpdateChildrenBounds(); UpdateChildrenTransformations(); - var list = new List(base.GetReferences()); - if (Children != null) list.Add(Children); - if (ChildrenTransformation1 != null) + using var list = new PooledList(base.GetReferences()); + if (Children is not null) + list.Add(Children); + + if (ChildrenTransformation1 is not null && ChildrenTransformation1.Length > 0) { ChildrenTransformation1Block = new ResourceSystemStructBlock(ChildrenTransformation1); list.Add(ChildrenTransformation1Block); } - if (ChildrenTransformation2 != null) + else + { + ChildrenTransformation1Block = null; + } + + if (ChildrenTransformation2 is not null && ChildrenTransformation2.Length > 0) { ChildrenTransformation2Block = new ResourceSystemStructBlock(ChildrenTransformation2); list.Add(ChildrenTransformation2Block); } - if (ChildrenBoundingBoxes != null) + else + { + ChildrenTransformation2Block = null; + } + + if (ChildrenBoundingBoxes is not null && ChildrenBoundingBoxes.Length > 0) { ChildrenBoundingBoxesBlock = new ResourceSystemStructBlock(ChildrenBoundingBoxes); list.Add(ChildrenBoundingBoxesBlock); } - if (ChildrenFlags1 != null) + else + { + ChildrenBoundingBoxesBlock = null; + } + + if (ChildrenFlags1.Length > 0) { ChildrenFlags1Block = new ResourceSystemStructBlock(ChildrenFlags1); list.Add(ChildrenFlags1Block); } - if (ChildrenFlags2 != null) + else + { + ChildrenFlags1Block = null; + } + + if (ChildrenFlags2.Length > 0) { ChildrenFlags2Block = new ResourceSystemStructBlock(ChildrenFlags2); list.Add(ChildrenFlags2Block); } - if (BVH != null) list.Add(BVH); + else + { + ChildrenFlags2Block = null; + } + + if (BVH is not null) + list.Add(BVH); + return list.ToArray(); } @@ -2842,26 +2765,19 @@ namespace CodeWalker.GameFiles public void BuildBVH() { - if (Children?.data_items == null) + if (Children?.data_items is null || Children.data_items.Length <= 5) //composites only get BVHs if they have 6 or more children. { BVH = null; return; } - if (Children.data_items.Length <= 5) //composites only get BVHs if they have 6 or more children. - { - if (BVH != null) - { } - BVH = null; - return; - } - if (BVH != null) + if (BVH is not null) { //var tnodes = BVHBuilder.Unbuild(BVH); } else { //why are we here? yft's hit this... (and when loading XML!) - if (!(Owner is FragPhysicsLOD) && !(Owner is FragPhysArchetype) && !(Owner is VerletCloth)) + if (Owner is not FragPhysicsLOD && Owner is not FragPhysArchetype && Owner is not VerletCloth) { } } if (Owner is FragPhysArchetype fpa) @@ -2873,7 +2789,7 @@ namespace CodeWalker.GameFiles } } - var items = new List(); + var items = new List(Children.data_items.Length); for (int i = 0; i < Children.data_items.Length; i++) { var child = Children.data_items[i]; @@ -2881,11 +2797,13 @@ namespace CodeWalker.GameFiles { var cbox = new BoundingBox(child.BoxMin, child.BoxMax); var tcbox = cbox.Transform(child.Transform); - var it = new BVHBuilderItem(); - it.Min = tcbox.Minimum; - it.Max = tcbox.Maximum; - it.Index = i; - it.Bounds = child; + var it = new BVHBuilderItem + { + Min = tcbox.Minimum, + Max = tcbox.Maximum, + Index = i, + Bounds = child + }; items.Add(it); } else @@ -2899,37 +2817,38 @@ namespace CodeWalker.GameFiles public void UpdateChildrenFlags() { - if (Children?.data_items == null) + if (Children?.data_items is null) { - ChildrenFlags1 = null; - ChildrenFlags2 = null; + ChildrenFlags1 = []; + ChildrenFlags2 = []; return; } if (OwnerIsFragment)//don't use flags in fragments { - ChildrenFlags1 = null; - ChildrenFlags2 = null; + ChildrenFlags1 = []; + ChildrenFlags2 = []; return; } - var cf1 = new List(); - var cf2 = new List(); + var cf1 = new BoundCompositeChildrenFlags[Children.data_items.Length]; + var cf2 = new BoundCompositeChildrenFlags[Children.data_items.Length]; - foreach (var child in Children.data_items) + for(int i = 0; i < Children.data_items.Length; i++) { + var child = Children.data_items[i]; var f1 = new BoundCompositeChildrenFlags(); var f2 = new BoundCompositeChildrenFlags(); - if (child != null) + if (child is not null) { f1 = child.CompositeFlags1; f2 = child.CompositeFlags2; } - cf1.Add(f1); - cf2.Add(f2); + cf1[i] = f1; + cf2[i] = f2; } - ChildrenFlags1 = cf1.ToArray(); - ChildrenFlags2 = cf2.ToArray(); + ChildrenFlags1 = cf1; + ChildrenFlags2 = cf2; } public void UpdateChildrenBounds() @@ -2940,61 +2859,60 @@ namespace CodeWalker.GameFiles return; } - var cbl = new List(); - foreach (var child in Children.data_items) + var cbl = new AABB_s[Children.data_items.Length]; + for(int i = 0; i < Children.data_items.Length; i++) { - var aabb = new AABB_s(); - if (child != null) + var child = Children.data_items[i]; + if (child is not null) { - aabb.Min = new Vector4(child.BoxMin, float.Epsilon); - aabb.Max = new Vector4(child.BoxMax, child.Margin); + cbl[i] = new AABB_s() + { + Min = new Vector4(child.BoxMin, float.Epsilon), + Max = new Vector4(child.BoxMax, child.Margin), + }; } - cbl.Add(aabb); } - ChildrenBoundingBoxes = cbl.ToArray(); - + ChildrenBoundingBoxes = cbl; } public void UpdateChildrenTransformations() { - if (Children?.data_items == null) + var dataItems = Children?.data_items; + if (dataItems is null) { - ChildrenTransformation1 = null; - ChildrenTransformation2 = null; + ChildrenTransformation1 = []; + ChildrenTransformation2 = []; return; } - var ct1 = new List(); - foreach (var child in Children.data_items) + var ct1 = new Matrix4F_s[dataItems.Length]; + for (int i = 0; i < dataItems.Length; i++) { + var child = dataItems[i]; var m = Matrix4F_s.Identity; - if (child != null) + var ownerIsFragment = OwnerIsFragment; + if (child is not null) { - m = new Matrix4F_s(child.Transform); + m = new Matrix4F_s(in child._Transform); } - if (OwnerIsFragment) + if (!OwnerIsFragment) { - m.Flags1 = 0x7f800001; - m.Flags2 = 0x7f800001; - m.Flags3 = 0x7f800001; - m.Flags4 = 0x7f800001; - } - else - { - //m.Column4 = new Vector4(0.0f, float.Epsilon, float.Epsilon, 0.0f);//is this right? TODO: check! - m.Flags1 = 0; - m.Flags2 = 1; - m.Flags3 = 1; - m.Flags4 = 0; + m = m with + { + Flags1 = 0U, + Flags2 = 1U, + Flags3 = 1U, + Flags4 = 0U + }; } - ct1.Add(m); + ct1[i] = m; } - ChildrenTransformation1 = ct1.ToArray(); - ChildrenTransformation2 = null; + ChildrenTransformation1 = ct1; + ChildrenTransformation2 = []; } @@ -3011,7 +2929,8 @@ namespace CodeWalker.GameFiles for (int i = 0; i < compchilds.Length; i++) { var c = compchilds[i]; - if (c == null) continue; + if (c == null) + continue; tsph.Center = c.TransformInv.Multiply(sph.Center); @@ -3032,13 +2951,14 @@ namespace CodeWalker.GameFiles var tray = ray; var compchilds = Children?.data_items; - if (compchilds == null) - { return res; } + if (compchilds is null) + return res; for (int i = 0; i < compchilds.Length; i++) { var c = compchilds[i]; - if (c == null) continue; + if (c is null) + continue; tray.Position = c.TransformInv.Multiply(ray.Position); tray.Direction = c.TransformInv.MultiplyRot(ray.Direction); @@ -3048,7 +2968,7 @@ namespace CodeWalker.GameFiles chit.Position = c.Transform.Multiply(chit.Position); chit.Normal = c.Transform.MultiplyRot(chit.Normal); - res.TryUpdate(ref chit); + res.TryUpdate(in chit); } return res; @@ -3091,7 +3011,8 @@ namespace CodeWalker.GameFiles public void AddChild(Bounds child) { - if (Children == null) Children = new ResourcePointerArray64(); + if (Children is null) + Children = new ResourcePointerArray64(); var children = Children.data_items?.ToList() ?? new List(); var transforms1 = ChildrenTransformation1?.ToList() ?? new List(); @@ -3133,7 +3054,8 @@ namespace CodeWalker.GameFiles Box = 3, Cylinder = 4, } - [TC(typeof(EXP))] public abstract class BoundPolygon : IMetaXmlItem + [TC(typeof(EXP))] + public abstract class BoundPolygon : IMetaXmlItem { public BoundPolygonType Type { get; set; } public BoundGeometry Owner { get; set; } //for browsing/editing convenience @@ -3196,17 +3118,8 @@ namespace CodeWalker.GameFiles public abstract void Write(BinaryWriter bw); public abstract void WriteXml(StringBuilder sb, int indent); public abstract void ReadXml(XmlNode node); - public virtual string Title - { - get - { - return Type.ToString() + " " + Index.ToString(); - } - } - public override string ToString() - { - return Type.ToString(); - } + public virtual string Title => $"{Type} {Index}"; + public override string ToString() => Type.ToString(); } [TC(typeof(EXP))] public class BoundPolygonTriangle : BoundPolygon { @@ -3227,34 +3140,22 @@ namespace CodeWalker.GameFiles public Vector3 Vertex1 { - get { return (Owner != null) ? Owner.GetVertexPos(vertIndex1) : Vector3.Zero; } - set { if (Owner != null) Owner.SetVertexPos(vertIndex1, value); } + get => Owner?.GetVertexPos(vertIndex1) ?? Vector3.Zero; + set => Owner?.SetVertexPos(vertIndex1, value); } public Vector3 Vertex2 { - get { return (Owner != null) ? Owner.GetVertexPos(vertIndex2) : Vector3.Zero; } - set { if (Owner != null) Owner.SetVertexPos(vertIndex2, value); } + get => Owner?.GetVertexPos(vertIndex2) ?? Vector3.Zero; + set => Owner?.SetVertexPos(vertIndex2, value); } public Vector3 Vertex3 { - get { return (Owner != null) ? Owner.GetVertexPos(vertIndex3) : Vector3.Zero; } - set { if (Owner != null) Owner.SetVertexPos(vertIndex3, value); } + get => Owner?.GetVertexPos(vertIndex3) ?? Vector3.Zero; + set => Owner?.SetVertexPos(vertIndex3, value); } - public override Vector3 BoxMin - { - get - { - return Vector3.Min(Vector3.Min(Vertex1, Vertex2), Vertex3); - } - } - public override Vector3 BoxMax - { - get - { - return Vector3.Max(Vector3.Max(Vertex1, Vertex2), Vertex3); - } - } + public override Vector3 BoxMin => Vector3.Min(Vector3.Min(Vertex1, Vertex2), Vertex3); + public override Vector3 BoxMax => Vector3.Max(Vector3.Max(Vertex1, Vertex2), Vertex3); public override Vector3 Scale { get @@ -3325,10 +3226,7 @@ namespace CodeWalker.GameFiles public override int[] VertexIndices { - get - { - return new[] { vertIndex1, vertIndex2, vertIndex3 }; - } + get => [vertIndex1, vertIndex2, vertIndex3]; set { if (value?.Length >= 3) @@ -3363,18 +3261,12 @@ namespace CodeWalker.GameFiles switch (edgeid) { case 1: - if (edgeIndex1 != polyindex) - { } edgeIndex1 = polyindex; break; case 2: - if (edgeIndex2 != polyindex) - { } edgeIndex2 = polyindex; break; case 3: - if (edgeIndex3 != polyindex) - { } edgeIndex3 = polyindex; break; default: @@ -3516,11 +3408,11 @@ namespace CodeWalker.GameFiles } public override void Read(byte[] bytes, int offset) { - sphereType = BitConverter.ToUInt16(bytes, offset + 0); - sphereIndex = BitConverter.ToUInt16(bytes, offset + 2); - sphereRadius = BitConverter.ToSingle(bytes, offset + 4); - unused0 = BitConverter.ToUInt32(bytes, offset + 8); - unused1 = BitConverter.ToUInt32(bytes, offset + 12); + sphereType = BitConverter.ToUInt16(bytes.AsSpan(offset)); + sphereIndex = BitConverter.ToUInt16(bytes.AsSpan(offset + 2)); + sphereRadius = BitConverter.ToSingle(bytes.AsSpan(offset + 4)); + unused0 = BitConverter.ToUInt32(bytes.AsSpan(offset + 8)); + unused1 = BitConverter.ToUInt32(bytes.AsSpan(offset + 12)); } public override void Write(BinaryWriter bw) { @@ -3532,12 +3424,7 @@ namespace CodeWalker.GameFiles } public override void WriteXml(StringBuilder sb, int indent) { - var s = string.Format("{0} m=\"{1}\" v=\"{2}\" radius=\"{3}\"", - Type, - MaterialIndex, - sphereIndex, - FloatUtil.ToString(sphereRadius) - ); + var s = $"{Type} m=\"{MaterialIndex}\" v=\"{sphereIndex}\" radius=\"{FloatUtil.ToString(sphereRadius)}\""; YbnXml.SelfClosingTag(sb, indent, s); } public override void ReadXml(XmlNode node) @@ -3546,10 +3433,7 @@ namespace CodeWalker.GameFiles sphereIndex = (ushort)Xml.GetUIntAttribute(node, "v"); sphereRadius = Xml.GetFloatAttribute(node, "radius"); } - public override string ToString() - { - return base.ToString() + ": " + sphereIndex.ToString() + ", " + sphereRadius.ToString(); - } + public override string ToString() => $"{base.ToString()}: {sphereIndex}, {sphereRadius}"; } [TC(typeof(EXP))] public class BoundPolygonCapsule : BoundPolygon { @@ -3562,29 +3446,17 @@ namespace CodeWalker.GameFiles public Vector3 Vertex1 { - get { return (Owner != null) ? Owner.GetVertexPos(capsuleIndex1) : Vector3.Zero; } - set { if (Owner != null) Owner.SetVertexPos(capsuleIndex1, value); } + get => Owner?.GetVertexPos(capsuleIndex1) ?? Vector3.Zero; + set => Owner?.SetVertexPos(capsuleIndex1, value); } public Vector3 Vertex2 { - get { return (Owner != null) ? Owner.GetVertexPos(capsuleIndex2) : Vector3.Zero; } - set { if (Owner != null) Owner.SetVertexPos(capsuleIndex2, value); } + get => Owner?.GetVertexPos(capsuleIndex2) ?? Vector3.Zero; + set => Owner?.SetVertexPos(capsuleIndex2, value); } - public override Vector3 BoxMin - { - get - { - return Vector3.Min(Vertex1, Vertex2) - capsuleRadius; - } - } - public override Vector3 BoxMax - { - get - { - return Vector3.Max(Vertex1, Vertex2) + capsuleRadius; - } - } + public override Vector3 BoxMin => Vector3.Min(Vertex1, Vertex2) - capsuleRadius; + public override Vector3 BoxMax => Vector3.Max(Vertex1, Vertex2) + capsuleRadius; public override Vector3 Scale { get @@ -3609,10 +3481,7 @@ namespace CodeWalker.GameFiles } public override Vector3 Position { - get - { - return (Vertex1 + Vertex2) * 0.5f; - } + get => (Vertex1 + Vertex2) * 0.5f; set { var offset = value - Position; @@ -4100,7 +3969,8 @@ namespace CodeWalker.GameFiles } - [TC(typeof(EXP))] public struct BoundEdgeRef //convenience struct for updating edge indices + [TC(typeof(EXP))] public struct BoundEdgeRef : IEquatable + //convenience struct for updating edge indices { public int Vertex1 { get; set; } public int Vertex2 { get; set; } @@ -4110,6 +3980,32 @@ namespace CodeWalker.GameFiles Vertex1 = Math.Min(i1, i2); Vertex2 = Math.Max(i1, i2); } + + public override bool Equals(object? obj) + { + return obj is BoundEdgeRef @ref && Equals(@ref); + } + + public bool Equals(BoundEdgeRef other) + { + return Vertex1 == other.Vertex1 && + Vertex2 == other.Vertex2; + } + + public override int GetHashCode() + { + return HashCode.Combine(Vertex1, Vertex2); + } + + public static bool operator ==(BoundEdgeRef left, BoundEdgeRef right) + { + return left.Equals(right); + } + + public static bool operator !=(BoundEdgeRef left, BoundEdgeRef right) + { + return !(left == right); + } } [TC(typeof(EXP))] public class BoundEdge //convenience class for updating edge indices { @@ -4136,7 +4032,8 @@ namespace CodeWalker.GameFiles Distance = dist; } } - [TC(typeof(EXP))] public class BoundVertex //class for editing convenience, to hold a reference to a BoundGeometry vertex + [TC(typeof(EXP))] + public class BoundVertex //class for editing convenience, to hold a reference to a BoundGeometry vertex { public BoundGeometry Owner { get; set; } public int Index { get; set; } @@ -4144,12 +4041,12 @@ namespace CodeWalker.GameFiles public Vector3 Position { get { return (Owner != null) ? Owner.GetVertexPos(Index) : Vector3.Zero; } - set { if (Owner != null) Owner.SetVertexPos(Index, value); } + set { Owner?.SetVertexPos(Index, value); } } public BoundMaterialColour Colour { get { return (Owner != null) ? Owner.GetVertexColour(Index) : new BoundMaterialColour(); } - set { if (Owner != null) Owner.SetVertexColour(Index, value); } + set { Owner?.SetVertexColour(Index, value); } } public BoundVertex(BoundGeometry owner, int index) @@ -4158,32 +4055,19 @@ namespace CodeWalker.GameFiles Index = index; } - public virtual string Title - { - get - { - return "Vertex " + Index.ToString(); - } - } + public virtual string Title => $"Vertex {Index}"; } - [TC(typeof(EXP))] public struct BoundVertex_s + [TC(typeof(EXP))] + public readonly struct BoundVertex_s(in Vector3 v) { - public short X { get; set; } - public short Y { get; set; } - public short Z { get; set; } - - public BoundVertex_s(Vector3 v) - { - X = (short)v.X; - Y = (short)v.Y; - Z = (short)v.Z; - } + public short X { get; init; } = (short)v.X; + public short Y { get; init; } = (short)v.Y; + public short Z { get; init; } = (short)v.Z; public Vector3 Vector { - get { return new Vector3(X, Y, Z); } - set { X = (short)value.X; Y = (short)value.Y; Z = (short)value.Z; } + get => new Vector3(X, Y, Z); } } @@ -4316,13 +4200,14 @@ namespace CodeWalker.GameFiles MAP_STAIRS = 1u << 30, MAP_DEEP_SURFACE = 1u << 31, } - [TC(typeof(EXP))] public struct BoundCompositeChildrenFlags + [TC(typeof(EXP))] + public struct BoundCompositeChildrenFlags { public EBoundCompositeFlags Flags1 { get; set; } public EBoundCompositeFlags Flags2 { get; set; } - public override string ToString() + public override readonly string ToString() { - return Flags1.ToString() + ", " + Flags2.ToString(); + return $"{Flags1}, {Flags2}"; } } @@ -4330,10 +4215,7 @@ namespace CodeWalker.GameFiles [TC(typeof(EXP))] public class BVH : ResourceSystemBlock { - public override long BlockLength - { - get { return 128; } - } + public override long BlockLength => 128; // structure data public ResourceSimpleList64b_s Nodes { get; set; } @@ -4392,21 +4274,22 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); + //var list = new List(); //if (Nodes != null) list.Add(Nodes); //if (Trees != null) list.Add(Trees); - return list.ToArray(); + return []; } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x0, Nodes), - new Tuple(0x70, Trees) + return new (long, IResourceBlock)[] { + (0x0, Nodes), + (0x70, Trees) }; } } - [TC(typeof(EXP))] public struct BVHTreeInfo_s + [TC(typeof(EXP))] + public struct BVHTreeInfo_s { public short MinX { get; set; } public short MinY { get; set; } @@ -4419,21 +4302,22 @@ namespace CodeWalker.GameFiles public Vector3 Min { - get { return new Vector3(MinX, MinY, MinZ); } + readonly get { return new Vector3(MinX, MinY, MinZ); } set { MinX = (short)value.X; MinY = (short)value.Y; MinZ = (short)value.Z; } } public Vector3 Max { - get { return new Vector3(MaxX, MaxY, MaxZ); } + readonly get { return new Vector3(MaxX, MaxY, MaxZ); } set { MaxX = (short)value.X; MaxY = (short)value.Y; MaxZ = (short)value.Z; } } - public override string ToString() + public override readonly string ToString() { - return NodeIndex1.ToString() + ", " + NodeIndex2.ToString() + " (" + (NodeIndex2 - NodeIndex1).ToString() + " nodes)"; + return $"{NodeIndex1}, {NodeIndex2} ({NodeIndex2 - NodeIndex1} nodes)"; } } - [TC(typeof(EXP))] public struct BVHNode_s + [TC(typeof(EXP))] + public struct BVHNode_s { public short MinX { get; set; } public short MinY { get; set; } @@ -4446,18 +4330,18 @@ namespace CodeWalker.GameFiles public Vector3 Min { - get { return new Vector3(MinX, MinY, MinZ); } + readonly get { return new Vector3(MinX, MinY, MinZ); } set { MinX = (short)value.X; MinY = (short)value.Y; MinZ = (short)value.Z; } } public Vector3 Max { - get { return new Vector3(MaxX, MaxY, MaxZ); } + readonly get { return new Vector3(MaxX, MaxY, MaxZ); } set { MaxX = (short)value.X; MaxY = (short)value.Y; MaxZ = (short)value.Z; } } - public override string ToString() + public override readonly string ToString() { - return ItemId.ToString() + ": " + ItemCount.ToString(); + return $"{ItemId}: {ItemCount}"; } } @@ -4468,23 +4352,33 @@ namespace CodeWalker.GameFiles public static int MaxTreeNodeCount = 127; //max number of nodes found in any tree - public static BVH Build(List items, int itemThreshold) + public static BVH? Build(List items, int itemThreshold) { - if (items == null) return null; + if (items is null) + return null; var bvh = new BVH(); var min = new Vector3(float.MaxValue); var max = new Vector3(float.MinValue); - var nodes = new List(); - var trees = new List(); - var iteml = new List(); - for (int i = 0; i < items.Count; i++) + using var nodes = new PooledList(); + using var trees = new PooledList(); + var iteml = new List(items.Count); + foreach(var item in items.AsSpan()) { - var item = items[i]; - if (item == null) continue; + if (item is null) + continue; iteml.Add(item); - min = Vector3.Min(min, item.Min); - max = Vector3.Max(max, item.Max); + Vector3.Min(ref min, ref item.Min, out min); + Vector3.Max(ref max, ref item.Max, out max); } + //for (int i = 0; i < items.Count; i++) + //{ + // var item = items[i]; + // if (item is null) + // continue; + // iteml.Add(item); + // Vector3.Min(ref min, ref item.Min, out min); + // Vector3.Max(ref max, ref item.Max, out max); + //} var cen = (min + max) * 0.5f; bvh.BoundingBoxMin = new Vector4(min, float.NaN); bvh.BoundingBoxMax = new Vector4(max, float.NaN); @@ -4493,7 +4387,7 @@ namespace CodeWalker.GameFiles bvh.QuantumInverse = new Vector4(1.0f / bvh.Quantum.XYZ(), float.NaN); var root = new BVHBuilderNode(); - root.Items = iteml.ToList(); + root.Items = iteml; root.Build(itemThreshold); root.GatherNodes(nodes); root.GatherTrees(trees); @@ -4502,11 +4396,11 @@ namespace CodeWalker.GameFiles if (itemThreshold > 1) //need to reorder items, since they need to be grouped by node for the node's item index { items.Clear(); - foreach (var node in nodes) + foreach (var node in nodes.Span) { if (node.Items != null) { - foreach (var item in node.Items) + foreach (var item in node.Items.AsSpan()) { item.Index = items.Count; items.Add(item); @@ -4517,13 +4411,12 @@ namespace CodeWalker.GameFiles else //don't need to reorder items, since nodes only have one item and one item index { } - var bvhtrees = new List(); - var bvhnodes = new List(); + using var bvhtrees = new PooledList(trees.Count); + using var bvhnodes = new PooledList(nodes.Count); var qi = bvh.QuantumInverse.XYZ(); var c = bvh.BoundingBoxCenter.XYZ(); - for (int i = 0; i < nodes.Count; i++) + foreach(var node in nodes.Span) { - var node = nodes[i]; var id = ((node.Items?.Count ?? 0) > 0) ? node.Items[0].Index : 0; var tn = node.TotalNodes; var bn = new BVHNode_s(); @@ -4534,9 +4427,8 @@ namespace CodeWalker.GameFiles bvhnodes.Add(bn); } - for (int i = 0; i < trees.Count; i++) + foreach(var tree in trees.Span) { - var tree = trees[i]; var bt = new BVHTreeInfo_s(); bt.Min = (tree.Min - c) * qi; bt.Max = (tree.Max - c) * qi; @@ -4586,8 +4478,8 @@ namespace CodeWalker.GameFiles } public class BVHBuilderNode { - public List Children; - public List Items; + public List? Children; + public List? Items; public Vector3 Min; public Vector3 Max; public int Index; @@ -4597,9 +4489,9 @@ namespace CodeWalker.GameFiles get { int c = 1; - if (Children != null) + if (Children is not null) { - foreach (var child in Children) + foreach (var child in Children.AsSpan()) { c += child.TotalNodes; } @@ -4612,9 +4504,9 @@ namespace CodeWalker.GameFiles get { int c = Items?.Count ?? 0; - if (Children != null) + if (Children is not null) { - foreach (var child in Children) + foreach (var child in Children.AsSpan()) { c += child.TotalItems; } @@ -4626,18 +4518,20 @@ namespace CodeWalker.GameFiles public void Build(int itemThreshold) { UpdateMinMax(); - if (Items == null) return; - if (Items.Count <= itemThreshold) return; + if (Items == null) + return; + if (Items.Count <= itemThreshold) + return; var avgsum = Vector3.Zero; - foreach (var item in Items) + foreach (var item in Items.AsSpan()) { avgsum += item.Min; avgsum += item.Max; } var avg = avgsum * (0.5f / Items.Count); int countx = 0, county = 0, countz = 0; - foreach (var item in Items) + foreach (var item in Items.AsSpan()) { var icen = (item.Min + item.Max) * 0.5f; if (icen.X < avg.X) countx++; @@ -4655,22 +4549,21 @@ namespace CodeWalker.GameFiles var l1 = new List(); var l2 = new List(); - foreach (var item in Items) + foreach (var item in Items.AsSpan()) { var icen = (item.Min + item.Max) * 0.5f; bool s = false; - switch (axis) + s = axis switch { - default: - case 0: s = (icen.X > avg.X); break; - case 1: s = (icen.Y > avg.Y); break; - case 2: s = (icen.Z > avg.Z); break; - } + 1 => (icen.Y > avg.Y), + 2 => (icen.Z > avg.Z), + _ => (icen.X > avg.X), + }; if (s) l1.Add(item); else l2.Add(item); } - if ((l1.Count == 0) || (l2.Count == 0)) //don't get stuck in a stack overflow... + if (l1.Count == 0 || l2.Count == 0) //don't get stuck in a stack overflow... { var l3 = new List();//we can recover from this... l3.AddRange(l1); @@ -4679,8 +4572,10 @@ namespace CodeWalker.GameFiles { l3.Sort((a, b) => { - var c = a.Min.CompareTo(b.Min); if (c != 0) return c; - return a.Max.CompareTo(b.Max); + var c = a.Min.CompareTo(in b.Min); + if (c != 0) + return c; + return a.Max.CompareTo(in b.Max); }); l1.Clear(); l2.Clear(); @@ -4715,43 +4610,43 @@ namespace CodeWalker.GameFiles { var min = new Vector3(float.MaxValue); var max = new Vector3(float.MinValue); - if (Items != null) + if (Items is not null) { - foreach (var item in Items) + foreach (var item in Items.AsSpan()) { - min = Vector3.Min(min, item.Min); - max = Vector3.Max(max, item.Max); + Vector3.Min(ref min, ref item.Min, out min); + Vector3.Max(ref max, ref item.Max, out max); } } - if (Children != null) + if (Children is not null) { - foreach (var child in Children) + foreach (var child in Children.AsSpan()) { child.UpdateMinMax(); - min = Vector3.Min(min, child.Min); - max = Vector3.Max(max, child.Max); + Vector3.Min(ref min, ref child.Min, out min); + Vector3.Max(ref max, ref child.Max, out max); } } Min = min; Max = max; } - public void GatherNodes(List nodes) + public void GatherNodes(IList nodes) { Index = nodes.Count; nodes.Add(this); - if (Children != null) + if (Children is not null) { - foreach (var child in Children) + foreach (var child in Children.AsSpan()) { child.GatherNodes(nodes); } } } - public void GatherTrees(List trees) + public void GatherTrees(IList trees) { if ((TotalNodes > BVHBuilder.MaxTreeNodeCount) && ((Children?.Count ?? 0) > 0)) { - foreach (var child in Children) + foreach (var child in Children.AsSpan()) { child.GatherTrees(trees); } @@ -4786,11 +4681,12 @@ namespace CodeWalker.GameFiles Children.Add(chi); cind1 = cind2; } + Console.WriteLine($"Children.Count: {Children.Count}; cind1: {nodeind + 1}; lcind: {nodeind + node.ItemId}"); nodeind += node.ItemId; } else //leaf node, with polygons { - Items = new List(); + Items = new List(node.ItemCount); for (int i = 0; i < node.ItemCount; i++) { var item = new BVHBuilderItem(); @@ -4807,12 +4703,14 @@ namespace CodeWalker.GameFiles public override string ToString() { - var fstr = (Children != null) ? (TotalNodes.ToString() + ", 0 - ") : (Items != null) ? ("i, " + TotalItems.ToString() + " - ") : "error!"; - var cstr = (Children != null) ? (Children.Count.ToString() + " children") : ""; - var istr = (Items != null) ? (Items.Count.ToString() + " items") : ""; - if (string.IsNullOrEmpty(cstr)) return fstr + istr; - if (string.IsNullOrEmpty(istr)) return fstr + cstr; - return cstr + ", " + istr; + var fstr = (Children != null) ? $"{TotalNodes}, 0 - " : (Items != null) ? ($"i, {TotalItems} - ") : "error!"; + var cstr = (Children != null) ? $"{Children.Count} children" : ""; + var istr = (Items != null) ? $"{Items.Count} items" : ""; + if (string.IsNullOrEmpty(cstr)) + return fstr + istr; + if (string.IsNullOrEmpty(istr)) + return fstr + cstr; + return $"{cstr}, {istr}"; } } public class BVHBuilderItem @@ -4846,7 +4744,7 @@ namespace CodeWalker.GameFiles FLAG_NO_NETWORK_SPAWN = 1 << 14, FLAG_NO_CAM_COLLISION_ALLOW_CLIPPING = 1 << 15, } - [TC(typeof(EXP))] public struct BoundMaterial_s : IMetaXmlItem + [TC(typeof(EXP))] public struct BoundMaterial_s : IMetaXmlItem, IEquatable { public uint Data1; @@ -4927,6 +4825,31 @@ namespace CodeWalker.GameFiles + Flags.ToString() + ", " + MaterialColorIndex.ToString() + ", " + Unk4.ToString(); } + public override bool Equals(object? obj) + { + return obj is BoundMaterial_s s && Equals(s); + } + + public bool Equals(BoundMaterial_s other) + { + return Data1 == other.Data1 && + Data2 == other.Data2; + } + + public override int GetHashCode() + { + return HashCode.Combine(Data1, Data2); + } + + public static bool operator ==(BoundMaterial_s left, BoundMaterial_s right) + { + return left.Equals(right); + } + + public static bool operator !=(BoundMaterial_s left, BoundMaterial_s right) + { + return !(left == right); + } } [TC(typeof(EXP))] public struct BoundMaterialColour { diff --git a/CodeWalker.Core/GameFiles/Resources/Clip.cs b/CodeWalker.Core/GameFiles/Resources/Clip.cs index ca35490..83dbd62 100644 --- a/CodeWalker.Core/GameFiles/Resources/Clip.cs +++ b/CodeWalker.Core/GameFiles/Resources/Clip.cs @@ -1,4 +1,5 @@ -using SharpDX; +using Collections.Pooled; +using SharpDX; using System; using System.Collections.Generic; using System.ComponentModel; @@ -8,6 +9,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; +using static CodeWalker.GameFiles.MetaXmlBase; /* Copyright(c) 2016 Neodymium @@ -41,10 +43,7 @@ namespace CodeWalker.GameFiles [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipDictionary : ResourceFileBase { - public override long BlockLength - { - get { return 64; } - } + public override long BlockLength => 64; // structure data public uint Unknown_10h { get; set; } // 0x00000000 @@ -61,11 +60,11 @@ namespace CodeWalker.GameFiles // reference data public AnimationMap Animations { get; set; } - public ResourcePointerArray64 Clips { get; set; } + public ResourcePointerArray64 Clips { get; set; } //data used by CW for loading/saving - public Dictionary ClipMap { get; set; } - public Dictionary AnimMap { get; set; } + public Dictionary ClipMap { get; set; } + public Dictionary AnimMap { get; set; } public override void Read(ResourceDataReader reader, params object[] parameters) @@ -138,14 +137,14 @@ namespace CodeWalker.GameFiles public void BuildMaps() { - ClipMap = new Dictionary(); - AnimMap = new Dictionary(); + ClipMap = new Dictionary(); + AnimMap = new Dictionary(); - if ((Clips != null) && (Clips.data_items != null)) + if (Clips?.data_items is not null) { foreach (var cme in Clips.data_items) { - if (cme != null) + if (cme is not null) { ClipMap[cme.Hash] = cme; var nxt = cme.Next; @@ -157,11 +156,11 @@ namespace CodeWalker.GameFiles } } } - if ((Animations != null) && (Animations.Animations != null) && (Animations.Animations.data_items != null)) + if (Animations?.Animations?.data_items is not null) { foreach (var ame in Animations.Animations.data_items) { - if (ame != null) + if (ame is not null) { AnimMap[ame.Hash] = ame; var nxt = ame.NextEntry; @@ -174,21 +173,22 @@ namespace CodeWalker.GameFiles } } - foreach (var cme in ClipMap.Values) - { - var clip = cme.Clip; - if (clip == null) continue; + //foreach (var cme in ClipMap.Values) + //{ + // var clip = cme.Clip; + // if (clip == null) + // continue; - var name = clip.ShortName; //just to make sure ShortName is generated and in JenkIndex... + // var name = clip.ShortName; //just to make sure ShortName is generated and in JenkIndex... - //if (name.EndsWith("_uv_0")) //hash for these entries match string with this removed, +1 - //{ - //} - //if (name.EndsWith("_uv_1")) //same as above, but +2 - //{ - //} + // //if (name.EndsWith("_uv_0")) //hash for these entries match string with this removed, +1 + // //{ + // //} + // //if (name.EndsWith("_uv_1")) //same as above, but +2 + // //{ + // //} - } + //} //foreach (var ame in AnimMap.Values) //{ // var anim = ame.Animation; @@ -337,8 +337,7 @@ namespace CodeWalker.GameFiles foreach (var cme in clipList) { var cb = cme?.Clip; - var clipanim = cb as ClipAnimation; - if (clipanim != null) + if (cb is ClipAnimation clipanim) { animDict.TryGetValue(clipanim.AnimationHash, out Animation a); clipanim.Animation = a; @@ -370,25 +369,25 @@ namespace CodeWalker.GameFiles { var numClipBuckets = GetNumHashBuckets(clips?.Length ?? 0); var clipBuckets = new List[numClipBuckets]; - if (clips != null) + if (clips is not null) { foreach (var cme in clips) { var b = cme.Hash % numClipBuckets; - var bucket = clipBuckets[b]; - if (bucket == null) + ref var bucket = ref clipBuckets[b]; + if (bucket is null) { - bucket = new List(); - clipBuckets[b] = bucket; + bucket = new List(); } bucket.Add(cme); } } - var newClips = new List(); + var newClips = new List(); foreach (var b in clipBuckets) { - if ((b?.Count ?? 0) == 0) newClips.Add(null); + if ((b?.Count ?? 0) == 0) + newClips.Add(null); else { newClips.Add(b[0]); @@ -403,33 +402,33 @@ namespace CodeWalker.GameFiles } } - Clips = new ResourcePointerArray64(); + Clips = new ResourcePointerArray64(); Clips.data_items = newClips.ToArray(); } public void CreateAnimationsMap(AnimationMapEntry[] anims) { var numAnimBuckets = GetNumHashBuckets(anims?.Length ?? 0); - var animBuckets = new List[numAnimBuckets]; - if (anims != null) + var animBuckets = new List[numAnimBuckets]; + if (anims is not null) { foreach (var ame in anims) { var b = ame.Hash % numAnimBuckets; - var bucket = animBuckets[b]; - if (bucket == null) + ref var bucket = ref animBuckets[b]; + if (bucket is null) { - bucket = new List(); - animBuckets[b] = bucket; + bucket = new List(); } bucket.Add(ame); } } - var newAnims = new List(); + var newAnims = new List(); foreach (var b in animBuckets) { - if ((b?.Count ?? 0) == 0) newAnims.Add(null); + if (b is null || b.Count == 0) + newAnims.Add(null); else { newAnims.Add(b[0]); @@ -479,10 +478,7 @@ namespace CodeWalker.GameFiles [TypeConverter(typeof(ExpandableObjectConverter))] public class AnimationMap : ResourceSystemBlock { - public override long BlockLength - { - get { return 48; } - } + public override long BlockLength => 48; // structure data public uint VFT { get; set; } @@ -548,17 +544,17 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - if (Animations != null) list.Add(Animations); - return list.ToArray(); + if (Animations is null) + { + return []; + } + + return [ Animations ]; } } [TypeConverter(typeof(ExpandableObjectConverter))] public class AnimationMapEntry : ResourceSystemBlock { - public override long BlockLength - { - get { return 32; } - } + public override long BlockLength => 32; // structure data public MetaHash Hash { get; set; } @@ -569,8 +565,8 @@ namespace CodeWalker.GameFiles public uint Unknown_1Ch { get; set; } // 0x00000000 // reference data - public Animation Animation { get; set; } - public AnimationMapEntry NextEntry { get; set; } + public Animation? Animation { get; set; } + public AnimationMapEntry? NextEntry { get; set; } public override void Read(ResourceDataReader reader, params object[] parameters) { @@ -590,10 +586,8 @@ namespace CodeWalker.GameFiles this.NextEntryPtr // offset ); - if (Animation != null) + if (Animation is not null) { - if (Animation.Hash != 0) - { } Animation.Hash = Hash; } } @@ -616,23 +610,19 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - if (Animation != null) list.Add(Animation); - if (NextEntry != null) list.Add(NextEntry); + if (Animation is not null) + list.Add(Animation); + if (NextEntry is not null) + list.Add(NextEntry); return list.ToArray(); } - public override string ToString() - { - return Hash.ToString(); - } + public override string ToString() => Hash.ToString(); } [TypeConverter(typeof(ExpandableObjectConverter))] public class Animation : ResourceSystemBlock, IMetaXmlItem { - public override long BlockLength - { - get { return 96; } - } + public override long BlockLength => 96; // structure data public uint VFT { get; set; } @@ -687,80 +677,6 @@ namespace CodeWalker.GameFiles this.BoneIds = reader.ReadBlock>(); AssignSequenceBoneIds(); - - - - //bool hasUVs = false; - //if (BoneIds?.data_items != null) - //{ - // foreach (var boneid in BoneIds.data_items) - // { - // if (boneid.Track == 17)//UV0 - // { hasUVs = true; } - // if (boneid.Track == 18)//UV1 - // { hasUVs = true; } - // } - //} - - //bool hasRootMotion = false; // (Unknown_10h & 16) == hasRootMotion - //if (Sequences?.data_items != null) - //{ - // foreach (var seq in Sequences.data_items) - // { - // if (seq == null) continue; - // if (seq.RootMotionRefCounts != 0) { hasRootMotion = true; } - // } - //} - - //var b0 = (Unknown_1Ch) & 0xFF; - //var b1 = (Unknown_1Ch >> 8) & 0xFF; - //var b2 = (Unknown_1Ch >> 16) & 0xFF; - //var b3 = (Unknown_1Ch >> 24) & 0xFF; - //if (hasUVs) - //{ - // if (Unknown_1Ch != 0x6B002400) - // { } - //} - //else - //{ - //} - - - //switch (Unknown_10h) - //{ - // case 0: - // if (hasRootMotion) { } - // break; - // case 1://is prop? - // if (hasRootMotion) { } - // break; - // case 8: - // if (hasRootMotion) { } - // break; - // case 16: - // if (!hasRootMotion) { } - // break; - // case 24: - // if (!hasRootMotion) { } - // break; - // default: break; - //} - - - - - - - - //if (Unknown_04h != 1) - //{ } - //if (Unknown_11h != 1) - //{ } - - - - - } public override void Write(ResourceDataWriter writer, params object[] parameters) @@ -791,13 +707,13 @@ namespace CodeWalker.GameFiles writer.WriteBlock(this.BoneIds); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { BuildSequencesData();//TODO: move this somewhere better? - return new Tuple[] { - new Tuple(0x40, Sequences), - new Tuple(0x50, BoneIds) + return new (long, IResourceBlock)[] { + (0x40, Sequences), + (0x50, BoneIds) }; } @@ -879,29 +795,34 @@ namespace CodeWalker.GameFiles - public struct FramePosition + public readonly struct FramePosition { - public int Frame0; - public int Frame1; - public float Alpha0; - public float Alpha1; + public int Frame0 { get; init; } + public int Frame1 { get; init; } + public float Alpha0 { get; init; } + public float Alpha1 { get; init; } } + public FramePosition GetFramePosition(float t) { bool ignoreLastFrame = true;//if last frame is equivalent to the first one, eg rollercoaster small light "globes" don't - FramePosition p = new FramePosition(); var nframes = (ignoreLastFrame) ? (Frames - 1) : Frames; var curPos = (t / Duration) * nframes; - p.Frame0 = ((ushort)curPos) % Frames; - p.Frame1 = (p.Frame0 + 1);// % frames; - p.Alpha1 = (float)(curPos - Math.Floor(curPos)); - p.Alpha0 = 1.0f - p.Alpha1; - return p; + var frame0 = ((ushort)curPos) % Frames; + var alpha1 = (float)(curPos - Math.Floor(curPos)); + + return new FramePosition + { + Frame0 = frame0, + Frame1 = frame0 + 1, + Alpha0 = 1.0f - alpha1, + Alpha1 = alpha1, + }; } - public Vector4 EvaluateVector4(FramePosition frame, int boneIndex, bool interpolate) + public Vector4 EvaluateVector4(in FramePosition frame, int boneIndex, bool interpolate) { var s = frame.Frame0 / SequenceFrameLimit; int f0 = frame.Frame0 % SequenceFrameLimit; @@ -913,7 +834,7 @@ namespace CodeWalker.GameFiles var v = interpolate ? (v0 * frame.Alpha0) + (v1 * frame.Alpha1) : v0; return v; } - public Quaternion EvaluateQuaternion(FramePosition frame, int boneIndex, bool interpolate) + public Quaternion EvaluateQuaternion(in FramePosition frame, int boneIndex, bool interpolate) { var s = frame.Frame0 / SequenceFrameLimit; int f0 = frame.Frame0 % SequenceFrameLimit; @@ -922,7 +843,7 @@ namespace CodeWalker.GameFiles var aseq = seq.Sequences[boneIndex]; var q0 = aseq.EvaluateQuaternion(f0); var q1 = aseq.EvaluateQuaternion(f1); - var q = interpolate ? QuaternionExtension.FastLerp(q0, q1, frame.Alpha1) : q0; + var q = interpolate ? QuaternionExtension.FastLerp(in q0, in q1, frame.Alpha1) : q0; return q; } @@ -939,20 +860,18 @@ namespace CodeWalker.GameFiles } return -1; } - } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct AnimationBoneId : IMetaXmlItem + + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct AnimationBoneId : IMetaXmlItem { public ushort BoneId { get; set; } public byte Unk0 { get; set; } public byte Track { get; set; } - public override string ToString() - { - return BoneId.ToString() + ": " + Unk0.ToString() + ", " + Track.ToString(); - } + public readonly override string ToString() => $"{BoneId}: {Unk0}, {Track}"; - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { YcdXml.ValueTag(sb, indent, "BoneId", BoneId.ToString()); YcdXml.ValueTag(sb, indent, "Track", Track.ToString()); @@ -1292,7 +1211,7 @@ namespace CodeWalker.GameFiles YcdXml.ValueTag(sb, indent, "Quantum", FloatUtil.ToString(Quantum)); YcdXml.ValueTag(sb, indent, "Offset", FloatUtil.ToString(Offset)); YcdXml.WriteRawArray(sb, Values, indent, "Values", "", FloatUtil.ToString, 10);// (Values?.Length ?? 0) + 1); - YcdXml.WriteRawArray(sb, Frames, indent, "Frames", "", null, 10);// (Frames?.Length ?? 0) + 1); + YcdXml.WriteRawArray(sb, Frames, indent, "Frames", "", (FormatterRef?)null, 10);// (Frames?.Length ?? 0) + 1); } public override void ReadXml(XmlNode node) { @@ -1687,7 +1606,7 @@ namespace CodeWalker.GameFiles public override void ReadFrame(AnimChannelDataReader reader) { uint bits = reader.ReadFrameBits(32); - float v = MetaTypes.ConvertData(MetaTypes.ConvertToBytes(bits)); + float v = MetaTypes.ConvertData(MetaTypes.ConvertToBytes(in bits)); Values[reader.Frame] = v; } public override void WriteFrame(AnimChannelDataWriter writer) @@ -2180,8 +2099,8 @@ namespace CodeWalker.GameFiles ); } - var t7 = Channels[3] as AnimChannelCachedQuaternion;//type 1 - if (t7 == null) t7 = Channels[4] as AnimChannelCachedQuaternion;//type 2 + //type 1 + if (Channels[3] is not AnimChannelCachedQuaternion t7) t7 = Channels[4] as AnimChannelCachedQuaternion;//type 2 var x = Channels[0].EvaluateFloat(frame); var y = Channels[1].EvaluateFloat(frame); @@ -2219,9 +2138,7 @@ namespace CodeWalker.GameFiles { if (c >= 4) break; var channel = Channels[i]; - var sv3c = channel as AnimChannelStaticVector3; - var ssqc = channel as AnimChannelStaticQuaternion; - if (sv3c != null) + if (channel is AnimChannelStaticVector3 sv3c) { for (int n = 0; n < 3; n++) { @@ -2230,7 +2147,7 @@ namespace CodeWalker.GameFiles } c += 3; } - else if (ssqc != null) + else if (channel is AnimChannelStaticQuaternion ssqc) { for (int n = 0; n < 4; n++) { @@ -2898,8 +2815,8 @@ namespace CodeWalker.GameFiles public uint Unknown_1Ch { get; set; } // 0x00000000 // reference data - public ClipBase Clip { get; set; } - public ClipMapEntry Next { get; set; } + public ClipBase? Clip { get; set; } + public ClipMapEntry? Next { get; set; } public bool EnableRootMotion { get; set; } = false; //used by CW to toggle whether or not to include root motion when playing animations public bool OverridePlayTime { get; set; } = false; //used by CW to manually override the animation playback time @@ -2925,12 +2842,10 @@ namespace CodeWalker.GameFiles ); - if (Clip != null) + if (Clip is not null) { Clip.Hash = Hash; } - else - { } } public override void Write(ResourceDataWriter writer, params object[] parameters) @@ -2956,18 +2871,12 @@ namespace CodeWalker.GameFiles return list.ToArray(); } - public override string ToString() - { - return Clip?.Name ?? Hash.ToString(); - } + public override string ToString() => Clip?.Name ?? Hash.ToString(); } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipBase : ResourceSystemBlock, IResourceXXSystemBlock, IMetaXmlItem { - public override long BlockLength - { - get { return 112; } - } + public override long BlockLength => 112; // structure data public uint VFT { get; set; } @@ -3054,9 +2963,6 @@ namespace CodeWalker.GameFiles this.PropertiesPointer // offset ); - if (Unknown_28hPtr != 0x50000000) - { } - switch (VFT)//some examples { case 1079664808: @@ -3074,9 +2980,6 @@ namespace CodeWalker.GameFiles default: break; } - - if (Tags?.Tags?.data_items == null) - { } } public override void Write(ResourceDataWriter writer, params object[] parameters) @@ -3117,8 +3020,10 @@ namespace CodeWalker.GameFiles NameBlock = (string_r)Name; list.Add(NameBlock); } - if (Tags != null) list.Add(Tags); - if (Properties != null) list.Add(Properties); + if (Tags is not null) + list.Add(Tags); + if (Properties is not null) + list.Add(Properties); return list.ToArray(); } @@ -3132,21 +3037,18 @@ namespace CodeWalker.GameFiles } - public static ClipBase ConstructClip(ClipType type) + public static ClipBase? ConstructClip(ClipType type) { - switch (type) + return type switch { - case ClipType.Animation: return new ClipAnimation(); - case ClipType.AnimationList: return new ClipAnimationList(); - default: return null;// throw new Exception("Unknown type"); - } + ClipType.Animation => new ClipAnimation(), + ClipType.AnimationList => new ClipAnimationList(), + _ => null,// throw new Exception("Unknown type"); + }; } - public override string ToString() - { - return Name; - } + public override string ToString() => Name; public virtual void WriteXml(StringBuilder sb, int indent) @@ -3179,12 +3081,11 @@ namespace CodeWalker.GameFiles Properties.CreatePropertyMap(props); } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipAnimation : ClipBase + + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ClipAnimation : ClipBase { - public override long BlockLength - { - get { return 112; } - } + public override long BlockLength => 112; // structure data public ulong AnimationPointer { get; set; } @@ -3196,7 +3097,7 @@ namespace CodeWalker.GameFiles public uint Unknown_6Ch { get; set; } // 0x00000000 // reference data - public Animation Animation { get; set; } + public Animation? Animation { get; set; } public MetaHash AnimationHash { get; set; } //used when reading XML. public ClipAnimation() @@ -3239,7 +3140,8 @@ namespace CodeWalker.GameFiles { var list = new List(); list.AddRange(base.GetReferences()); - if (Animation != null) list.Add(Animation); + if (Animation is not null) + list.Add(Animation); return list.ToArray(); } @@ -3270,10 +3172,7 @@ namespace CodeWalker.GameFiles } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipAnimationList : ClipBase { - public override long BlockLength - { - get { return 112; } - } + public override long BlockLength => 112; // structure data public ulong AnimationsPointer { get; set; } @@ -3286,7 +3185,7 @@ namespace CodeWalker.GameFiles public uint Unknown_6Ch { get; set; } // 0x00000000 // reference data - public ResourceSimpleArray Animations { get; set; } + public ResourceSimpleArray? Animations { get; set; } public ClipAnimationList() @@ -3334,7 +3233,8 @@ namespace CodeWalker.GameFiles { var list = new List(); list.AddRange(base.GetReferences()); - if (Animations != null) list.Add(Animations); + if (Animations is not null) + list.Add(Animations); return list.ToArray(); } @@ -3360,18 +3260,22 @@ namespace CodeWalker.GameFiles base.ReadXml(node); Duration = Xml.GetChildFloatAttribute(node, "Duration", "value"); - Animations = new ResourceSimpleArray(); - Animations.Data = new List(); var anims = XmlMeta.ReadItemArrayNullable(node, "Animations"); - if (anims != null) Animations.Data.AddRange(anims); + Animations = new ResourceSimpleArray(); + + if (anims != null) + { + Animations.Data = anims.ToList(); + } else + { + Animations.Data = new List(); + } } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipAnimationsEntry : ResourceSystemBlock, IMetaXmlItem + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ClipAnimationsEntry : ResourceSystemBlock, IMetaXmlItem { - public override long BlockLength - { - get { return 24; } - } + public override long BlockLength => 24; // structure data public float StartTime { get; set; } @@ -3381,7 +3285,7 @@ namespace CodeWalker.GameFiles public ulong AnimationPointer { get; set; } // reference data - public Animation Animation { get; set; } + public Animation? Animation { get; set; } public MetaHash AnimationHash { get; set; } //used when reading XML. public override void Read(ResourceDataReader reader, params object[] parameters) @@ -3402,7 +3306,7 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - this.AnimationPointer = (ulong)(this.Animation != null ? this.Animation.FilePosition : 0); + AnimationPointer = (ulong)(Animation?.FilePosition ?? 0); // write structure data writer.Write(this.StartTime); @@ -3451,12 +3355,10 @@ namespace CodeWalker.GameFiles } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyMap : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ClipPropertyMap : ResourceSystemBlock { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong PropertyEntriesPointer { get; set; } @@ -3465,10 +3367,10 @@ namespace CodeWalker.GameFiles public uint Unknown_0Ch { get; set; } = 0x01000000; // 0x01000000 // reference data - public ResourcePointerArray64 Properties { get; set; } + public ResourcePointerArray64? Properties { get; set; } - public ClipProperty[] AllProperties { get; set; } - public Dictionary PropertyMap { get; set; } + public ClipProperty[]? AllProperties { get; set; } + public Dictionary? PropertyMap { get; set; } public override void Read(ResourceDataReader reader, params object[] parameters) @@ -3509,17 +3411,14 @@ namespace CodeWalker.GameFiles return list.ToArray(); } - public override string ToString() - { - return "Count: " + (AllProperties?.Length ?? 0).ToString(); - } + public override string ToString() => $"Count: {AllProperties?.Length ?? 0}"; public void BuildPropertyMap() { - if (Properties?.data_items != null) + if (Properties?.data_items is not null) { - List pl = new List(); + using PooledList pl = new PooledList(); foreach (var pme in Properties.data_items) { ClipPropertyMapEntry cpme = pme; @@ -3562,10 +3461,11 @@ namespace CodeWalker.GameFiles } } - var newProperties = new List(); + var newProperties = new List(); foreach (var b in buckets) { - if ((b?.Count ?? 0) == 0) newProperties.Add(null); + if (b is null || b.Count == 0) + newProperties.Add(null); else { newProperties.Add(b[0]); @@ -3580,19 +3480,18 @@ namespace CodeWalker.GameFiles } } - Properties = new ResourcePointerArray64(); + Properties = new ResourcePointerArray64(); Properties.data_items = newProperties.ToArray(); AllProperties = properties; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyMapEntry : ResourceSystemBlock + + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ClipPropertyMapEntry : ResourceSystemBlock { - public override long BlockLength - { - get { return 32; } - } + public override long BlockLength => 32; // structure data public MetaHash PropertyNameHash { get; set; } @@ -3651,10 +3550,7 @@ namespace CodeWalker.GameFiles } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipProperty : ResourceSystemBlock, IMetaXmlItem { - public override long BlockLength - { - get { return 64; } - } + public override long BlockLength => 64; // structure data public uint VFT { get; set; } @@ -3744,23 +3640,25 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - if (Attributes != null) list.Add(Attributes); - return list.ToArray(); + if (Attributes is null) + return []; + + return [Attributes]; } public override string ToString() { - StringBuilder sb = new StringBuilder(); - if ((Attributes != null) && (Attributes.data_items != null)) + if (Attributes?.data_items is not null) { + StringBuilder sb = new StringBuilder(); foreach (var item in Attributes.data_items) { if (sb.Length > 0) sb.Append(", "); sb.Append(item.ToString()); } + return $"{NameHash}: {UnkHash}: {sb}"; } - return NameHash.ToString() + ": " + UnkHash.ToString() + ": " + sb.ToString(); + return $"{NameHash}: {UnkHash}"; } @@ -3798,10 +3696,7 @@ namespace CodeWalker.GameFiles } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyAttribute : ResourceSystemBlock, IResourceXXSystemBlock, IMetaXmlItem { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; public uint VFT { get; set; } public uint Unknown_04h { get; set; } = 1; // 0x00000001 @@ -3896,10 +3791,7 @@ namespace CodeWalker.GameFiles } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyAttributeFloat : ClipPropertyAttribute { - public override long BlockLength - { - get { return 48; } - } + public override long BlockLength => 48; public float Value { get; set; } public uint Unknown_24h { get; set; } // 0x00000000 @@ -3930,7 +3822,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "Float:" + FloatUtil.ToString(Value); + return $"Float:{FloatUtil.ToString(Value)}"; } @@ -3947,10 +3839,7 @@ namespace CodeWalker.GameFiles } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyAttributeInt : ClipPropertyAttribute { - public override long BlockLength - { - get { return 48; } - } + public override long BlockLength => 48; public int Value { get; set; } public uint Unknown_24h { get; set; } // 0x00000000 @@ -3981,7 +3870,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "Int:" + Value.ToString(); + return $"Int:{Value}"; } @@ -3998,10 +3887,7 @@ namespace CodeWalker.GameFiles } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyAttributeBool : ClipPropertyAttribute { - public override long BlockLength - { - get { return 48; } - } + public override long BlockLength => 48; public uint Value { get; set; } public uint Unknown_24h { get; set; } // 0x00000000 @@ -4032,7 +3918,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "Uint:" + Value.ToString(); + return $"Uint:{Value}"; } @@ -4049,10 +3935,7 @@ namespace CodeWalker.GameFiles } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyAttributeString : ClipPropertyAttribute { - public override long BlockLength - { - get { return 48; } - } + public override long BlockLength => 48; public ulong ValuePointer { get; set; } public ushort ValueLength { get; set; } @@ -4095,17 +3978,19 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(base.GetReferences()); - if (Value != null) + + if (Value is not null) { ValueBlock = (string_r)Value; list.Add(ValueBlock); } + return list.ToArray(); } public override string ToString() { - return "String:" + Value; + return $"String:{Value}"; } @@ -4122,12 +4007,10 @@ namespace CodeWalker.GameFiles ValueCapacity = ValueLength; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyAttributeVector3 : ClipPropertyAttribute + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ClipPropertyAttributeVector3 : ClipPropertyAttribute { - public override long BlockLength - { - get { return 48; } - } + public override long BlockLength => 48; public Vector3 Value { get; set; } public float Unknown_02Ch { get; set; } @@ -4152,7 +4035,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "Vector3:" + FloatUtil.GetVector3String(Value); + return $"Vector3:{FloatUtil.GetVector3String(Value)}"; } @@ -4171,10 +4054,7 @@ namespace CodeWalker.GameFiles } [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyAttributeVector4 : ClipPropertyAttribute { - public override long BlockLength - { - get { return 48; } - } + public override long BlockLength => 48; public Vector4 Value { get; set; } @@ -4196,7 +4076,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "Vector4:" + FloatUtil.GetVector4String(Value); + return $"Vector4:{FloatUtil.GetVector4String(Value)}"; } @@ -4211,7 +4091,8 @@ namespace CodeWalker.GameFiles Value = Xml.GetChildVector4Attributes(node, "Value"); } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipPropertyAttributeHashString : ClipPropertyAttribute + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ClipPropertyAttributeHashString : ClipPropertyAttribute { public override long BlockLength => 0x30; @@ -4244,7 +4125,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "Hash:" + Value.ToString(); + return $"Hash:{Value}"; } @@ -4313,9 +4194,6 @@ namespace CodeWalker.GameFiles ); BuildAllTags(); - - if (TagCount1 != TagCount2) - { } } public override void Write(ResourceDataWriter writer, params object[] parameters) @@ -4340,72 +4218,72 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - if (Tags != null) list.Add(Tags); - return list.ToArray(); + if (Tags is null) + return []; + + return [Tags]; } public override string ToString() { - return "Count: " + (AllTags?.Length ?? 0).ToString(); + return $"Count: {AllTags?.Length ?? 0}"; } public void BuildAllTags() { - if ((Tags != null) && (Tags.data_items != null)) + if (Tags?.data_items is not null) { - List tl = new List(); + using var tl = new PooledList(); foreach (var te in Tags.data_items) { - if (te.Tags != this) - { } - if (te != null) - { - tl.Add(te); - } + if (te is null) + continue; + + tl.Add(te); } AllTags = tl.ToArray(); } uint hasBlock = 0; - if (AllTags != null) + if (AllTags is not null) { foreach (var tag in AllTags) { if (tag.NameHash == (uint)MetaName.block) - { hasBlock = 1; break; } + { + hasBlock = 1; + break; + } } } - if (HasBlockTag != hasBlock) - { } HasBlockTag = hasBlock; } public void AssignTagOwners() { - if (Tags?.data_items == null) return; + if (Tags?.data_items is null) + return; + foreach (var tag in Tags.data_items) { tag.Tags = this; } } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipTag : ClipProperty + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ClipTag : ClipProperty { - public override long BlockLength - { - get { return 80; } - } + public override long BlockLength => 80; public float StartPhase { get; set; } public float EndPhase { get; set; } public ulong TagsPointer { get; set; } // reference data - public ClipTagList Tags { get; set; } + public ClipTagList? Tags { get; set; } public override void Read(ResourceDataReader reader, params object[] parameters) @@ -4439,13 +4317,14 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(base.GetReferences()); - if (Tags != null) list.Add(Tags); + if (Tags is not null) + list.Add(Tags); return list.ToArray(); } public override string ToString() { - return base.ToString() + ": " + StartPhase.ToString() + ", " + EndPhase.ToString(); + return $"{base.ToString()}: {StartPhase}, {EndPhase}"; } diff --git a/CodeWalker.Core/GameFiles/Resources/Clothes.cs b/CodeWalker.Core/GameFiles/Resources/Clothes.cs index 24dcd31..4a65b06 100644 --- a/CodeWalker.Core/GameFiles/Resources/Clothes.cs +++ b/CodeWalker.Core/GameFiles/Resources/Clothes.cs @@ -1,4 +1,5 @@ -using SharpDX; +using Collections.Pooled; +using SharpDX; using System; using System.Collections.Generic; using System.ComponentModel; @@ -6,6 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; +using static CodeWalker.GameFiles.MetaXmlBase; /* Copyright(c) 2017 Neodymium @@ -101,8 +103,8 @@ namespace CodeWalker.GameFiles } public void ReadXml(XmlNode node) { - var clothes = new List(); - var clothhashes = new List(); + using var clothes = new PooledList(); + using var clothhashes = new PooledList(); var inodes = node.SelectNodes("Item"); if (inodes != null) @@ -144,17 +146,18 @@ namespace CodeWalker.GameFiles return cd; } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, ClothNameHashes), - new Tuple(0x30, Clothes) + return new (long, IResourceBlock)[] { + (0x20, ClothNameHashes), + (0x30, Clothes) }; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ClothController : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ClothController : ResourceSystemBlock { // clothController public override long BlockLength => 0x80; @@ -333,12 +336,17 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - if (BridgeSimGfx != null) list.Add(BridgeSimGfx); - if (MorphController != null) list.Add(MorphController); - if (VerletCloth1 != null) list.Add(VerletCloth1); - if (VerletCloth2 != null) list.Add(VerletCloth2); - if (VerletCloth3 != null) list.Add(VerletCloth3); + using var list = new PooledList(); + if (BridgeSimGfx is not null) + list.Add(BridgeSimGfx); + if (MorphController is not null) + list.Add(MorphController); + if (VerletCloth1 is not null) + list.Add(VerletCloth1); + if (VerletCloth2 is not null) + list.Add(VerletCloth2); + if (VerletCloth3 is not null) + list.Add(VerletCloth3); return list.ToArray(); } } @@ -535,55 +543,55 @@ namespace CodeWalker.GameFiles YldXml.ValueTag(sb, indent, "VertexCount", VertexCount.ToString()); YldXml.ValueTag(sb, indent, "Unknown14", Unknown_14h.ToString()); YldXml.ValueTag(sb, indent, "Unknown18", Unknown_18h.ToString()); - if (Unknown_20h?.data_items != null) + if (Unknown_20h?.data_items is not null && Unknown_20h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_20h.data_items, indent, "Unknown20", "", FloatUtil.ToString); } - if (Unknown_30h?.data_items != null) + if (Unknown_30h?.data_items != null && Unknown_30h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_30h.data_items, indent, "Unknown30", "", FloatUtil.ToString); } - if (Unknown_40h?.data_items != null) + if (Unknown_40h?.data_items != null && Unknown_40h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_40h.data_items, indent, "Unknown40", "", FloatUtil.ToString); } - if (Unknown_60h?.data_items != null) + if (Unknown_60h?.data_items != null && Unknown_60h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_60h.data_items, indent, "Unknown60", "", FloatUtil.ToString); } - if (Unknown_70h?.data_items != null) + if (Unknown_70h?.data_items != null && Unknown_70h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_70h.data_items, indent, "Unknown70", ""); } - if (Unknown_80h?.data_items != null) + if (Unknown_80h?.data_items != null && Unknown_80h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_80h.data_items, indent, "Unknown80", ""); } - if (Unknown_A0h?.data_items != null) + if (Unknown_A0h?.data_items != null && Unknown_A0h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_A0h.data_items, indent, "UnknownA0", "", FloatUtil.ToString); } - if (Unknown_B0h?.data_items != null) + if (Unknown_B0h?.data_items != null && Unknown_B0h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_B0h.data_items, indent, "UnknownB0", ""); } - if (Unknown_C0h?.data_items != null) + if (Unknown_C0h?.data_items != null && Unknown_C0h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_C0h.data_items, indent, "UnknownC0", ""); } - if (Unknown_E0h?.data_items != null) + if (Unknown_E0h?.data_items != null && Unknown_E0h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_E0h.data_items, indent, "UnknownE0", ""); } - if (Unknown_F0h?.data_items != null) + if (Unknown_F0h?.data_items != null && Unknown_F0h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_F0h.data_items, indent, "UnknownF0", ""); } - if (Unknown_100h?.data_items != null) + if (Unknown_100h?.data_items != null && Unknown_100h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_100h.data_items, indent, "Unknown100", ""); } - if (Unknown_128h?.data_items != null) + if (Unknown_128h?.data_items != null && Unknown_128h.data_items.Length > 0) { YldXml.WriteRawArray(sb, Unknown_128h.data_items, indent, "Unknown128", ""); } @@ -622,22 +630,22 @@ namespace CodeWalker.GameFiles } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, Unknown_20h), - new Tuple(0x30, Unknown_30h), - new Tuple(0x40, Unknown_40h), - new Tuple(0x60, Unknown_60h), - new Tuple(0x70, Unknown_70h), - new Tuple(0x80, Unknown_80h), - new Tuple(0xA0, Unknown_A0h), - new Tuple(0xB0, Unknown_B0h), - new Tuple(0xC0, Unknown_C0h), - new Tuple(0xE0, Unknown_E0h), - new Tuple(0xF0, Unknown_F0h), - new Tuple(0x100, Unknown_100h), - new Tuple(0x128, Unknown_128h) + return new (long, IResourceBlock)[] { + (0x20, Unknown_20h), + (0x30, Unknown_30h), + (0x40, Unknown_40h), + (0x60, Unknown_60h), + (0x70, Unknown_70h), + (0x80, Unknown_80h), + (0xA0, Unknown_A0h), + (0xB0, Unknown_B0h), + (0xC0, Unknown_C0h), + (0xE0, Unknown_E0h), + (0xF0, Unknown_F0h), + (0x100, Unknown_100h), + (0x128, Unknown_128h) }; } } @@ -1335,20 +1343,23 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - if (Bound != null) list.Add(Bound); - if (Behavior != null) list.Add(Behavior); - if (Unknown_140h_Data != null) list.Add(Unknown_140h_Data); + using var list = new PooledList(); + if (Bound is not null) + list.Add(Bound); + if (Behavior is not null) + list.Add(Behavior); + if (Unknown_140h_Data is not null) + list.Add(Unknown_140h_Data); return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x70, Vertices2), - new Tuple(0x80, Vertices), - new Tuple(0x100, Constraints2), - new Tuple(0x110, Constraints) + return new (long, IResourceBlock)[] { + (0x70, Vertices2), + (0x80, Vertices), + (0x100, Constraints2), + (0x110, Constraints) }; } } @@ -1794,12 +1805,12 @@ namespace CodeWalker.GameFiles return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x10, Unknown_10h), - new Tuple(0x30, Unknown_30h), - new Tuple(0x90, Unknown_90h) + return new (long, IResourceBlock)[] { + (0x10, Unknown_10h), + (0x30, Unknown_30h), + (0x90, Unknown_90h) }; } } @@ -1923,14 +1934,14 @@ namespace CodeWalker.GameFiles } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x80, Indices), - new Tuple(0x90, Vertices), - new Tuple(0xB0, Unknown_B0h), - new Tuple(0xC0, BoneWeightsInds), - new Tuple(0xE0, BoneIds) + return new (long, IResourceBlock)[] { + (0x80, Indices), + (0x90, Vertices), + (0xB0, Unknown_B0h), + (0xC0, BoneWeightsInds), + (0xE0, BoneIds) }; } } @@ -2339,7 +2350,7 @@ namespace CodeWalker.GameFiles YldXml.ValueTag(sb, indent, "Unknown180", FloatUtil.ToString(Unknown_180h)); if (Unknown_50h?.data_items != null) { - YldXml.WriteRawArray(sb, Unknown_50h.data_items, indent, "Unknown50", "", v => FloatUtil.GetVector4String(v), 1); + YldXml.WriteRawArray(sb, Unknown_50h.data_items, indent, "Unknown50", "", FloatUtil.GetVector4String, 1); } if (Unknown_60h?.data_items != null) { @@ -2359,7 +2370,7 @@ namespace CodeWalker.GameFiles } if (Unknown_A0h?.data_items != null) { - YldXml.WriteRawArray(sb, Unknown_A0h.data_items, indent, "UnknownA0", "", v => FloatUtil.GetVector4String(v), 1); + YldXml.WriteRawArray(sb, Unknown_A0h.data_items, indent, "UnknownA0", "", FloatUtil.GetVector4String, 1); } if (Unknown_B0h?.data_items != null) { @@ -2415,21 +2426,21 @@ namespace CodeWalker.GameFiles Unknown_160h.data_items = Xml.GetChildRawUshortArrayNullable(node, "Unknown160"); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x50, Unknown_50h), - new Tuple(0x60, Unknown_60h), - new Tuple(0x70, Unknown_70h), - new Tuple(0x80, Unknown_80h), - new Tuple(0x90, Unknown_90h), - new Tuple(0xA0, Unknown_A0h), - new Tuple(0xB0, Unknown_B0h), - new Tuple(0xC0, Unknown_C0h), - new Tuple(0xD0, Unknown_D0h), - new Tuple(0xE0, Unknown_E0h), - new Tuple(0x150, Unknown_150h), - new Tuple(0x160, Unknown_160h) + return new (long, IResourceBlock)[] { + (0x50, Unknown_50h), + (0x60, Unknown_60h), + (0x70, Unknown_70h), + (0x80, Unknown_80h), + (0x90, Unknown_90h), + (0xA0, Unknown_A0h), + (0xB0, Unknown_B0h), + (0xC0, Unknown_C0h), + (0xD0, Unknown_D0h), + (0xE0, Unknown_E0h), + (0x150, Unknown_150h), + (0x160, Unknown_160h) }; } } diff --git a/CodeWalker.Core/GameFiles/Resources/Drawable.cs b/CodeWalker.Core/GameFiles/Resources/Drawable.cs index 54d2518..2ec84b8 100644 --- a/CodeWalker.Core/GameFiles/Resources/Drawable.cs +++ b/CodeWalker.Core/GameFiles/Resources/Drawable.cs @@ -1,4 +1,5 @@ -using SharpDX; +using Collections.Pooled; +using SharpDX; using System; using System.Collections.Generic; using System.ComponentModel; @@ -7,6 +8,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; +using static CodeWalker.GameFiles.MetaXmlBase; namespace CodeWalker.GameFiles { @@ -444,7 +446,7 @@ namespace CodeWalker.GameFiles Count = Convert.ToInt32(parameters[0]); Owner = parameters[1] as ShaderFX; - var paras = new List(); + using var paras = new PooledList(); for (int i = 0; i < Count; i++) { var p = new ShaderParameter(); @@ -478,7 +480,7 @@ namespace CodeWalker.GameFiles reader.Position += offset; //Vector4 data gets embedded here... but why pointers in params also??? - var hashes = new List(); + using var hashes = new PooledList(); for (int i = 0; i < Count; i++) { hashes.Add((MetaName)reader.ReadUInt32()); @@ -672,8 +674,8 @@ namespace CodeWalker.GameFiles } public void ReadXml(XmlNode node) { - var plist = new List(); - var hlist = new List(); + using var plist = new PooledList(); + using var hlist = new PooledList(); var pnodes = node.SelectNodes("Item"); foreach (XmlNode pnode in pnodes) { @@ -702,7 +704,7 @@ namespace CodeWalker.GameFiles } else if (type == "Array") { - var vecs = new List(); + using var vecs = new PooledList(); var inodes = pnode.SelectNodes("Value"); foreach (XmlNode inode in inodes) { @@ -749,7 +751,7 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); + var list = new List(Parameters.Length); list.AddRange(base.GetReferences()); foreach (var x in Parameters) @@ -763,9 +765,9 @@ namespace CodeWalker.GameFiles return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - var list = new List>(); + var list = new List<(long, IResourceBlock)>(); list.AddRange(base.GetParts()); long offset = Parameters.Length * 16; @@ -775,15 +777,13 @@ namespace CodeWalker.GameFiles { if (x.DataType != 0) { - var vecs = x.Data as Vector4[]; - if (vecs == null) + if (x.Data is not Vector4[] vecs) { vecs = new[] { (Vector4)x.Data }; } - if (vecs == null) - { } + var block = new ResourceSystemStructBlock(vecs); - list.Add(new Tuple(offset, block)); + list.Add((offset, (IResourceBlock)block)); blist.Add(block); } else @@ -802,10 +802,7 @@ namespace CodeWalker.GameFiles [TypeConverter(typeof(ExpandableObjectConverter))] public class Skeleton : ResourceSystemBlock { - public override long BlockLength - { - get { return 112; } - } + public override long BlockLength => 112; // structure data public uint VFT { get; set; } = 1080114336; @@ -1308,9 +1305,9 @@ namespace CodeWalker.GameFiles m.Column4 = bone.TransformUnk;// new Vector4(0, 4, -3, 0);//??? var pbone = bone.Parent; - while (pbone != null) + while (pbone is not null) { - pos = pbone.Rotation.Multiply(pos /** pbone.Scale*/) + pbone.Translation; + pos = pbone.Rotation.Multiply(in pos /** pbone.Scale*/) + pbone.Translation; ori = pbone.Rotation * ori; pbone = pbone.Parent; } @@ -1404,11 +1401,12 @@ namespace CodeWalker.GameFiles { var bone = Bones.Items[i]; Matrix b = bone.SkinTransform; - Matrix3_s bt = new Matrix3_s(); - bt.Row1 = b.Column1; - bt.Row2 = b.Column2; - bt.Row3 = b.Column3; - BoneTransforms[i] = bt; + BoneTransforms[i] = new Matrix3_s + { + Row1 = b.Column1, + Row2 = b.Column2, + Row3 = b.Column3 + }; } } @@ -1569,19 +1567,23 @@ namespace CodeWalker.GameFiles } } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - var list = new List>(); - long length = 16; - if (Items != null) + if (Items is null || Items.Length == 0) { - foreach (var b in Items) - { - list.Add(new Tuple(length, b)); - length += b.BlockLength; - } + return Array.Empty<(long, IResourceBlock)>(); } - return list.ToArray(); + + var result = new (long, IResourceBlock)[Items.Length]; + long length = 16; + + for (int i = 0; i < Items.Length; i++) + { + result[i] = (length, Items[i]); + length += Items[i].BlockLength; + } + + return result; } } @@ -2023,10 +2025,7 @@ namespace CodeWalker.GameFiles [TypeConverter(typeof(ExpandableObjectConverter))] public class Bone : ResourceSystemBlock, IMetaXmlItem { - public override long BlockLength - { - get { return 80; } - } + public override long BlockLength => 80; // structure data public Quaternion Rotation { get; set; } @@ -2047,9 +2046,9 @@ namespace CodeWalker.GameFiles // reference data public string Name { get; set; } - public Bone Parent { get; set; } + public Bone? Parent { get; set; } - private string_r NameBlock = null; + private string_r? NameBlock = null; //used by CW for animating skeletons. @@ -2152,28 +2151,29 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - if (Name != null) + if (Name is null) { - NameBlock = (string_r)Name; - list.Add(NameBlock); + return Array.Empty(); } - return list.ToArray(); + + NameBlock = (string_r)Name; + + return new[] { NameBlock }; } public override string ToString() { - return Tag.ToString() + ": " + Name; + return $"{Tag}: {Name}"; } public void UpdateAnimTransform() { - AnimTransform = Matrix.AffineTransformation(1.0f, AnimRotation, AnimTranslation); + Matrix.AffineTransformation(1.0f, ref AnimRotation, ref AnimTranslation, out AnimTransform); AnimTransform.ScaleVector *= AnimScale; - if (Parent != null) + if (Parent is not null) { - AnimTransform = AnimTransform * Parent.AnimTransform; + AnimTransform *= Parent.AnimTransform; } ////AnimTransform = Matrix.AffineTransformation(1.0f, AnimRotation, AnimTranslation);//(local transform) @@ -2237,12 +2237,10 @@ namespace CodeWalker.GameFiles } - [TypeConverter(typeof(ExpandableObjectConverter))] public class Joints : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class Joints : ResourceSystemBlock { - public override long BlockLength - { - get { return 64; } - } + public override long BlockLength => 64; // structure data public uint VFT { get; set; } = 1080130656; @@ -2262,8 +2260,8 @@ namespace CodeWalker.GameFiles public JointRotationLimit_s[] RotationLimits { get; set; } public JointTranslationLimit_s[] TranslationLimits { get; set; } - private ResourceSystemStructBlock RotationLimitsBlock = null; //for saving only - private ResourceSystemStructBlock TranslationLimitsBlock = null; + private ResourceSystemStructBlock? RotationLimitsBlock = null; //for saving only + private ResourceSystemStructBlock? TranslationLimitsBlock = null; public override void Read(ResourceDataReader reader, params object[] parameters) @@ -2283,8 +2281,8 @@ namespace CodeWalker.GameFiles this.Unknown_38h = reader.ReadUInt64(); // read reference data - this.RotationLimits = reader.ReadStructsAt(this.RotationLimitsPointer, this.RotationLimitsCount); - this.TranslationLimits = reader.ReadStructsAt(this.TranslationLimitsPointer, this.TranslationLimitsCount); + this.RotationLimits = reader.ReadStructsAt(this.RotationLimitsPointer, this.RotationLimitsCount) ?? Array.Empty(); + this.TranslationLimits = reader.ReadStructsAt(this.TranslationLimitsPointer, this.TranslationLimitsCount) ?? Array.Empty(); //if (Unknown_4h != 1) //{ } @@ -2306,10 +2304,10 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - this.RotationLimitsPointer = (ulong)(this.RotationLimitsBlock != null ? this.RotationLimitsBlock.FilePosition : 0); - this.TranslationLimitsPointer = (ulong)(this.TranslationLimitsBlock != null ? this.TranslationLimitsBlock.FilePosition : 0); - this.RotationLimitsCount = (ushort)(this.RotationLimitsBlock != null ? this.RotationLimitsBlock.ItemCount : 0); - this.TranslationLimitsCount = (ushort)(this.TranslationLimitsBlock != null ? this.TranslationLimitsBlock.ItemCount : 0); + this.RotationLimitsPointer = (ulong)(this.RotationLimitsBlock is not null ? this.RotationLimitsBlock.FilePosition : 0); + this.TranslationLimitsPointer = (ulong)(this.TranslationLimitsBlock is not null ? this.TranslationLimitsBlock.FilePosition : 0); + this.RotationLimitsCount = (ushort)(this.RotationLimitsBlock is not null ? this.RotationLimitsBlock.ItemCount : 0); + this.TranslationLimitsCount = (ushort)(this.TranslationLimitsBlock is not null ? this.TranslationLimitsBlock.ItemCount : 0); // write structure data @@ -2328,11 +2326,11 @@ namespace CodeWalker.GameFiles } public void WriteXml(StringBuilder sb, int indent) { - if (RotationLimits != null) + if (RotationLimits is not null && RotationLimits.Length > 0) { YdrXml.WriteItemArray(sb, RotationLimits, indent, "RotationLimits"); } - if (TranslationLimits != null) + if (TranslationLimits is not null && TranslationLimits.Length > 0) { YdrXml.WriteItemArray(sb, TranslationLimits, indent, "TranslationLimits"); } @@ -2346,12 +2344,12 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - if (RotationLimits != null) + if (RotationLimits.Length > 0) { RotationLimitsBlock = new ResourceSystemStructBlock(RotationLimits); list.Add(RotationLimitsBlock); } - if (TranslationLimits != null) + if (TranslationLimits.Length > 0) { TranslationLimitsBlock = new ResourceSystemStructBlock(TranslationLimits); list.Add(TranslationLimitsBlock); @@ -2360,7 +2358,8 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct JointRotationLimit_s : IMetaXmlItem + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct JointRotationLimit_s : IMetaXmlItem { // structure data public uint Unknown_0h { get; set; } // 0x00000000 @@ -2459,7 +2458,7 @@ namespace CodeWalker.GameFiles Unknown_BCh = 0x100; } - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { YdrXml.ValueTag(sb, indent, "BoneId", BoneId.ToString()); YdrXml.ValueTag(sb, indent, "UnknownA", Unknown_Ah.ToString()); @@ -2476,7 +2475,8 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct JointTranslationLimit_s : IMetaXmlItem + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct JointTranslationLimit_s : IMetaXmlItem { public uint Unknown_0h { get; set; } // 0x00000000 public uint Unknown_4h { get; set; } // 0x00000000 @@ -2491,7 +2491,7 @@ namespace CodeWalker.GameFiles public Vector3 Max { get; set; } public uint Unknown_3Ch { get; set; } // 0x00000000 - public void WriteXml(StringBuilder sb, int indent) + public readonly void WriteXml(StringBuilder sb, int indent) { YdrXml.ValueTag(sb, indent, "BoneId", BoneId.ToString()); YdrXml.SelfClosingTag(sb, indent, "Min " + FloatUtil.GetVector3XmlString(Min)); @@ -2509,7 +2509,8 @@ namespace CodeWalker.GameFiles - [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableModelsBlock : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class DrawableModelsBlock : ResourceSystemBlock { public override long BlockLength { @@ -2525,64 +2526,64 @@ namespace CodeWalker.GameFiles } } - public DrawableBase Owner; + public DrawableBase? Owner; - public DrawableModel[] High { get; set; } - public DrawableModel[] Med { get; set; } - public DrawableModel[] Low { get; set; } - public DrawableModel[] VLow { get; set; } - public DrawableModel[] Extra { get; set; } //shouldn't be used + public DrawableModel[]? High { get; set; } + public DrawableModel[]? Med { get; set; } + public DrawableModel[]? Low { get; set; } + public DrawableModel[]? VLow { get; set; } + public DrawableModel[]? Extra { get; set; } //shouldn't be used - public ResourcePointerListHeader HighHeader { get; set; } - public ResourcePointerListHeader MedHeader { get; set; } - public ResourcePointerListHeader LowHeader { get; set; } - public ResourcePointerListHeader VLowHeader { get; set; } - public ResourcePointerListHeader ExtraHeader { get; set; } + public ResourcePointerListHeader HighHeader; + public ResourcePointerListHeader MedHeader; + public ResourcePointerListHeader LowHeader; + public ResourcePointerListHeader VLowHeader; + public ResourcePointerListHeader ExtraHeader; - public ulong[] HighPointers { get; set; } - public ulong[] MedPointers { get; set; } - public ulong[] LowPointers { get; set; } - public ulong[] VLowPointers { get; set; } - public ulong[] ExtraPointers { get; set; } + public ulong[]? HighPointers { get; set; } + public ulong[]? MedPointers { get; set; } + public ulong[]? LowPointers { get; set; } + public ulong[]? VLowPointers { get; set; } + public ulong[]? ExtraPointers { get; set; } public override void Read(ResourceDataReader reader, params object[] parameters) { Owner = parameters[0] as DrawableBase; var pos = (ulong)reader.Position; - var highPointer = (Owner?.DrawableModelsHighPointer ?? 0); - var medPointer = (Owner?.DrawableModelsMediumPointer ?? 0); - var lowPointer = (Owner?.DrawableModelsLowPointer ?? 0); - var vlowPointer = (Owner?.DrawableModelsVeryLowPointer ?? 0); + var highPointer = Owner?.DrawableModelsHighPointer ?? 0; + var medPointer = Owner?.DrawableModelsMediumPointer ?? 0; + var lowPointer = Owner?.DrawableModelsLowPointer ?? 0; + var vlowPointer = Owner?.DrawableModelsVeryLowPointer ?? 0; var extraPointer = (pos != highPointer) ? pos : 0; if (highPointer != 0) { - HighHeader = reader.ReadStructAt((long)highPointer); + reader.TryReadStructAt((long)highPointer, out HighHeader); HighPointers = reader.ReadUlongsAt(HighHeader.Pointer, HighHeader.Capacity, false); High = reader.ReadBlocks(HighPointers); } if (medPointer != 0) { - MedHeader = reader.ReadStructAt((long)medPointer); + reader.TryReadStructAt((long)medPointer, out MedHeader); MedPointers = reader.ReadUlongsAt(MedHeader.Pointer, MedHeader.Capacity, false); Med = reader.ReadBlocks(MedPointers); } if (lowPointer != 0) { - LowHeader = reader.ReadStructAt((long)lowPointer); + reader.TryReadStructAt((long)lowPointer, out LowHeader); LowPointers = reader.ReadUlongsAt(LowHeader.Pointer, LowHeader.Capacity, false); Low = reader.ReadBlocks(LowPointers); } if (vlowPointer != 0) { - VLowHeader = reader.ReadStructAt((long)vlowPointer); + reader.TryReadStructAt((long)vlowPointer, out VLowHeader); VLowPointers = reader.ReadUlongsAt(VLowHeader.Pointer, VLowHeader.Capacity, false); VLow = reader.ReadBlocks(VLowPointers); } if (extraPointer != 0) { - ExtraHeader = reader.ReadStructAt((long)extraPointer); + reader.TryReadStructAt((long)extraPointer, out ExtraHeader); ExtraPointers = reader.ReadUlongsAt(ExtraHeader.Pointer, ExtraHeader.Capacity, false); Extra = reader.ReadBlocks(ExtraPointers); } @@ -2656,32 +2657,39 @@ namespace CodeWalker.GameFiles } - private long Pad(long o) => ((16 - (o % 16)) % 16); + private long Pad(long o) => (16 - (o % 16)) % 16; private long HeaderLength(int listlength) => 16 + ((listlength) * 8); - private long ListLength(DrawableModel[] list, long o) + private long ListLength(DrawableModel[]? list, long o) { - if (list == null) return 0; + if (list is null) + return 0; + long l = 0; l += HeaderLength(list.Length); - foreach (var m in list) l += Pad(l) + m.BlockLength; + foreach (var m in list) + { + l += Pad(l) + m.BlockLength; + } return Pad(o) + l; } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - var parts = new List>(); + var parts = new List<(long, IResourceBlock)>(); parts.AddRange(base.GetParts()); - void addParts(ref long p, DrawableModel[] a) + void addParts(ref long p, DrawableModel[]? a) { - if (a == null) return; + if (a is null) + return; + p += Pad(p); p += HeaderLength(a.Length); foreach (var m in a) { p += Pad(p); - parts.Add(new Tuple(p, m)); + parts.Add((p, m)); p += m.BlockLength; } } @@ -2699,12 +2707,14 @@ namespace CodeWalker.GameFiles public long GetHighPointer() { - if (High == null) return 0; + if (High is null) + return 0; return FilePosition; } public long GetMedPointer() { - if (Med == null) return 0; + if (Med is null) + return 0; var p = FilePosition; p += ListLength(High, p); p += Pad(p); @@ -2712,7 +2722,8 @@ namespace CodeWalker.GameFiles } public long GetLowPointer() { - if (Low == null) return 0; + if (Low is null) + return 0; var p = GetMedPointer(); p += ListLength(Med, p); p += Pad(p); @@ -2720,7 +2731,8 @@ namespace CodeWalker.GameFiles } public long GetVLowPointer() { - if (VLow == null) return 0; + if (VLow is null) + return 0; var p = GetLowPointer(); p += ListLength(Low, p); p += Pad(p); @@ -2728,7 +2740,8 @@ namespace CodeWalker.GameFiles } public long GetExtraPointer() { - if (Extra == null) return 0; + if (Extra is null) + return 0; var p = GetVLowPointer(); p += ListLength(VLow, p); p += Pad(p); @@ -2737,7 +2750,8 @@ namespace CodeWalker.GameFiles } - [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableModel : ResourceSystemBlock, IMetaXmlItem + [TypeConverter(typeof(ExpandableObjectConverter))] + public class DrawableModel : ResourceSystemBlock, IMetaXmlItem { public override long BlockLength { @@ -2752,8 +2766,8 @@ namespace CodeWalker.GameFiles off += (GeometriesCount1 + ((GeometriesCount1 > 1) ? 1 : 0)) * 32; //BoundsData for (int i = 0; i < GeometriesCount1; i++) { - var geom = (Geometries != null) ? Geometries[i] : null; - if (geom != null) + var geom = (Geometries is not null && i < Geometries.Length) ? Geometries[i] : null; + if (geom is not null) { off += ((16 - (off % 16)) % 16); off += geom.BlockLength; //Geometries @@ -2782,34 +2796,34 @@ namespace CodeWalker.GameFiles public byte BoneIndex { - get { return (byte)((SkeletonBinding >> 24) & 0xFF); } - set { SkeletonBinding = (SkeletonBinding & 0x00FFFFFF) + ((value & 0xFFu) << 24); } + get => (byte)((SkeletonBinding >> 24) & 0xFF); + set => SkeletonBinding = (SkeletonBinding & 0x00FFFFFF) + ((value & 0xFFu) << 24); } public byte SkeletonBindUnk2 //always 0 { - get { return (byte)((SkeletonBinding >> 16) & 0xFF); } - set { SkeletonBinding = (SkeletonBinding & 0xFF00FFFF) + ((value & 0xFFu) << 16); } + get => (byte)((SkeletonBinding >> 16) & 0xFF); + set => SkeletonBinding = (SkeletonBinding & 0xFF00FFFF) + ((value & 0xFFu) << 16); } public byte HasSkin //only 0 or 1 { - get { return (byte)((SkeletonBinding >> 8) & 0xFF); } - set { SkeletonBinding = (SkeletonBinding & 0xFFFF00FF) + ((value & 0xFFu) << 8); } + get => (byte)((SkeletonBinding >> 8) & 0xFF); + set => SkeletonBinding = (SkeletonBinding & 0xFFFF00FF) + ((value & 0xFFu) << 8); } public byte SkeletonBindUnk1 //only 0 or 43 (in rare cases, see below) { - get { return (byte)((SkeletonBinding >> 0) & 0xFF); } - set { SkeletonBinding = (SkeletonBinding & 0xFFFFFF00) + ((value & 0xFFu) << 0); } + get => (byte)((SkeletonBinding >> 0) & 0xFF); + set => SkeletonBinding = (SkeletonBinding & 0xFFFFFF00) + ((value & 0xFFu) << 0); } public byte RenderMask { - get { return (byte)((RenderMaskFlags >> 0) & 0xFF); } - set { RenderMaskFlags = (ushort)((RenderMaskFlags & 0xFF00u) + ((value & 0xFFu) << 0)); } + get => (byte)((RenderMaskFlags >> 0) & 0xFF); + set => RenderMaskFlags = (ushort)((RenderMaskFlags & 0xFF00u) + ((value & 0xFFu) << 0)); } public byte Flags { - get { return (byte)((RenderMaskFlags >> 8) & 0xFF); } - set { RenderMaskFlags = (ushort)((RenderMaskFlags & 0xFFu) + ((value & 0xFFu) << 8)); } + get => (byte)((RenderMaskFlags >> 8) & 0xFF); + set => RenderMaskFlags = (ushort)((RenderMaskFlags & 0xFFu) + ((value & 0xFFu) << 8)); } @@ -2871,20 +2885,20 @@ namespace CodeWalker.GameFiles this.RenderMaskFlags = reader.ReadUInt16(); this.GeometriesCount3 = reader.ReadUInt16(); - this.ShaderMapping = reader.ReadUshortsAt(this.ShaderMappingPointer, this.GeometriesCount1, false); - this.GeometryPointers = reader.ReadUlongsAt(this.GeometriesPointer, this.GeometriesCount1, false); - this.BoundsData = reader.ReadStructsAt(this.BoundsPointer, (uint)(this.GeometriesCount1 > 1 ? this.GeometriesCount1 + 1 : this.GeometriesCount1), false); - this.Geometries = reader.ReadBlocks(this.GeometryPointers); + this.ShaderMapping = reader.ReadUshortsAt(this.ShaderMappingPointer, this.GeometriesCount1, false) ?? Array.Empty(); + this.GeometryPointers = reader.ReadUlongsAt(this.GeometriesPointer, this.GeometriesCount1, false) ?? Array.Empty(); + this.BoundsData = reader.ReadStructsAt(this.BoundsPointer, (uint)(this.GeometriesCount1 > 1 ? this.GeometriesCount1 + 1 : this.GeometriesCount1), false) ?? Array.Empty(); + this.Geometries = reader.ReadBlocks(this.GeometryPointers) ?? Array.Empty(); - if (Geometries != null) + if (Geometries is not null) { for (int i = 0; i < Geometries.Length; i++) { var geom = Geometries[i]; - if (geom != null) + if (geom is not null) { - geom.ShaderID = ((ShaderMapping != null) && (i < ShaderMapping.Length)) ? ShaderMapping[i] : (ushort)0; - geom.AABB = (BoundsData != null) ? ((BoundsData.Length > 1) && ((i + 1) < BoundsData.Length)) ? BoundsData[i + 1] : BoundsData[0] : new AABB_s(); + geom.ShaderID = ((ShaderMapping.Length > 0) && (i < ShaderMapping.Length)) ? ShaderMapping[i] : (ushort)0; + geom.AABB = (BoundsData.Length > 0) ? ((BoundsData.Length > 1) && ((i + 1) < BoundsData.Length)) ? BoundsData[i + 1] : BoundsData[0] : new AABB_s(); } } } @@ -2953,7 +2967,7 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - this.GeometriesCount1 = (ushort)(this.Geometries != null ? this.Geometries.Length : 0); + this.GeometriesCount1 = (ushort)(this.Geometries?.Length ?? 0); this.GeometriesCount2 = this.GeometriesCount1;//is this correct? this.GeometriesCount3 = this.GeometriesCount1;//is this correct? @@ -2971,8 +2985,8 @@ namespace CodeWalker.GameFiles this.GeometryPointers = new ulong[GeometriesCount1]; for (int i = 0; i < GeometriesCount1; i++) { - var geom = (Geometries != null) ? Geometries[i] : null; - if (geom != null) + var geom = Geometries[i]; + if (geom is not null) { off += pad(off); this.GeometryPointers[i] = (ulong)off; @@ -3019,8 +3033,8 @@ namespace CodeWalker.GameFiles } for (int i = 0; i < GeometriesCount1; i++) { - var geom = (Geometries != null) ? Geometries[i] : null; - if (geom != null) + var geom = Geometries[i]; + if (geom is not null) { writer.WritePadding(16); writer.WriteBlock(geom); @@ -3036,7 +3050,7 @@ namespace CodeWalker.GameFiles YdrXml.ValueTag(sb, indent, "BoneIndex", BoneIndex.ToString()); YdrXml.ValueTag(sb, indent, "Unknown1", SkeletonBindUnk1.ToString()); - if (Geometries != null) + if (Geometries is not null) { YdrXml.WriteItemArray(sb, Geometries, indent, "Geometries"); } @@ -3050,12 +3064,12 @@ namespace CodeWalker.GameFiles BoneIndex = (byte)Xml.GetChildUIntAttribute(node, "BoneIndex", "value"); SkeletonBindUnk1 = (byte)Xml.GetChildUIntAttribute(node, "Unknown1", "value"); - var aabbs = new List(); - var shids = new List(); + using var aabbs = new PooledList(); + using var shids = new PooledList(); var min = new Vector4(float.MaxValue); var max = new Vector4(float.MinValue); var geoms = XmlMeta.ReadItemArray(node, "Geometries"); - if (geoms != null) + if (geoms is not null) { Geometries = geoms; foreach (var geom in geoms) @@ -3069,18 +3083,18 @@ namespace CodeWalker.GameFiles } if (aabbs.Count > 1) { - var outeraabb = new AABB_s() { Min = min, Max = max }; + var outeraabb = new AABB_s(min, max); aabbs.Insert(0, outeraabb); } - BoundsData = (aabbs.Count > 0) ? aabbs.ToArray() : null; - ShaderMapping = (shids.Count > 0) ? shids.ToArray() : null; + BoundsData = (aabbs.Count > 0) ? aabbs.ToArray() : []; + ShaderMapping = (shids.Count > 0) ? shids.ToArray() : []; } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - var parts = new List>(); + var parts = new List<(long, IResourceBlock)>(); parts.AddRange(base.GetParts()); var off = (long)48; @@ -3092,11 +3106,11 @@ namespace CodeWalker.GameFiles off += (GeometriesCount1 + ((GeometriesCount1 > 1) ? 1 : 0)) * 32; //BoundsData for (int i = 0; i < GeometriesCount1; i++) { - var geom = (Geometries != null) ? Geometries[i] : null; + var geom = (Geometries != null && i < Geometries.Length) ? Geometries[i] : null; if (geom != null) { off += ((16 - (off % 16)) % 16); - parts.Add(new Tuple(off, geom)); + parts.Add((off, geom)); off += geom.BlockLength; //Geometries } } @@ -3106,19 +3120,21 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "(" + (Geometries?.Length ?? 0).ToString() + " geometr" + ((Geometries?.Length ?? 0) != 1 ? "ies)" : "y)"); + var suffix = (Geometries?.Length ?? 0) != 1 ? "ies" : "y"; + return $"({Geometries?.Length ?? 0} geometr{suffix} {Geometries?.Sum(p => p.VerticesCount) ?? 0} verts)"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableGeometry : ResourceSystemBlock, IMetaXmlItem + [TypeConverter(typeof(ExpandableObjectConverter))] + public class DrawableGeometry : ResourceSystemBlock, IMetaXmlItem { public override long BlockLength { get { long l = 152; - if (BoneIds != null) + if (BoneIds is not null) { if (BoneIds.Length > 4) l += 8; l += (BoneIds.Length) * 2; @@ -3155,11 +3171,11 @@ namespace CodeWalker.GameFiles public ulong Unknown_90h; // 0x0000000000000000 // reference data - public VertexBuffer VertexBuffer { get; set; } - public IndexBuffer IndexBuffer { get; set; } - public VertexData VertexData { get; set; } - public ushort[] BoneIds { get; set; }//embedded at the end of this struct - public ShaderFX Shader { get; set; }//written by parent DrawableBase, using ShaderID + public VertexBuffer? VertexBuffer { get; set; } + public IndexBuffer? IndexBuffer { get; set; } + public VertexData? VertexData { get; set; } + public ushort[]? BoneIds { get; set; }//embedded at the end of this struct + public ShaderFX? Shader { get; set; }//written by parent DrawableBase, using ShaderID public ushort ShaderID { get; set; }//read/written by parent model public AABB_s AABB { get; set; }//read/written by parent model @@ -3204,7 +3220,7 @@ namespace CodeWalker.GameFiles this.IndexBufferPointer // offset ); this.BoneIds = reader.ReadUshortsAt(this.BoneIdsPointer, this.BoneIdsCount, false); - if (this.BoneIds != null) //skinned mesh bones to use? peds, also yft props... + if (this.BoneIds is not null) //skinned mesh bones to use? peds, also yft props... { } //if (BoneIdsPointer != 0) @@ -3215,7 +3231,7 @@ namespace CodeWalker.GameFiles // { }//no hit - interesting alignment, boneids array always packed after this struct //} - if (this.VertexBuffer != null) + if (this.VertexBuffer is not null) { this.VertexData = this.VertexBuffer.Data1 ?? this.VertexBuffer.Data2; @@ -3284,14 +3300,14 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - this.VertexBufferPointer = (ulong)(this.VertexBuffer != null ? this.VertexBuffer.FilePosition : 0); - this.IndexBufferPointer = (ulong)(this.IndexBuffer != null ? this.IndexBuffer.FilePosition : 0); - this.VertexDataPointer = (ulong)(this.VertexData != null ? this.VertexData.FilePosition : 0); - this.VerticesCount = (ushort)(this.VertexData != null ? this.VertexData.VertexCount : 0); //TODO: fix? - this.VertexStride = (ushort)(this.VertexBuffer != null ? this.VertexBuffer.VertexStride : 0); //TODO: fix? - this.IndicesCount = (this.IndexBuffer != null ? this.IndexBuffer.IndicesCount : 0); //TODO: fix? - this.TrianglesCount = this.IndicesCount / 3; //TODO: fix? - this.BoneIdsPointer = (BoneIds != null) ? (ulong)(writer.Position + 152 + ((BoneIds.Length > 4) ? 8 : 0)) : 0; + this.VertexBufferPointer = (ulong)(VertexBuffer?.FilePosition ?? 0); + this.IndexBufferPointer = (ulong)(IndexBuffer?.FilePosition ?? 0); + this.VertexDataPointer = (ulong)(VertexData?.FilePosition ?? 0); + this.VerticesCount = (ushort)(VertexData?.VertexCount ?? 0); //TODO: fix? + this.VertexStride = (ushort)(VertexBuffer?.VertexStride ?? 0); //TODO: fix? + this.IndicesCount = (IndexBuffer?.IndicesCount ?? 0); //TODO: fix? + this.TrianglesCount = IndicesCount / 3; //TODO: fix? + this.BoneIdsPointer = (BoneIds is not null) ? (ulong)(writer.Position + 152 + ((BoneIds.Length > 4) ? 8 : 0)) : 0; this.BoneIdsCount = (ushort)(BoneIds?.Length ?? 0); @@ -3366,12 +3382,14 @@ namespace CodeWalker.GameFiles public void ReadXml(XmlNode node) { ShaderID = (ushort)Xml.GetChildUIntAttribute(node, "ShaderIndex", "value"); - var aabb = new AABB_s(); - aabb.Min = Xml.GetChildVector4Attributes(node, "BoundingBoxMin"); - aabb.Max = Xml.GetChildVector4Attributes(node, "BoundingBoxMax"); + var aabb = new AABB_s + { + Min = Xml.GetChildVector4Attributes(node, "BoundingBoxMin"), + Max = Xml.GetChildVector4Attributes(node, "BoundingBoxMax"), + }; AABB = aabb; var bnode = node.SelectSingleNode("BoneIDs"); - if (bnode != null) + if (bnode is not null) { var astr = bnode.InnerText; var arr = astr.Split(','); @@ -3388,14 +3406,14 @@ namespace CodeWalker.GameFiles BoneIds = (blist.Count > 0) ? blist.ToArray() : null; } var vnode = node.SelectSingleNode("VertexBuffer"); - if (vnode != null) + if (vnode is not null) { VertexBuffer = new VertexBuffer(); VertexBuffer.ReadXml(vnode); VertexData = VertexBuffer.Data1 ?? VertexBuffer.Data2; } var inode = node.SelectSingleNode("IndexBuffer"); - if (inode != null) + if (inode is not null) { IndexBuffer = new IndexBuffer(); IndexBuffer.ReadXml(inode); @@ -3405,9 +3423,12 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - if (VertexBuffer != null) list.Add(VertexBuffer); - if (IndexBuffer != null) list.Add(IndexBuffer); - if (VertexData != null) list.Add(VertexData); + if (VertexBuffer is not null) + list.Add(VertexBuffer); + if (IndexBuffer is not null) + list.Add(IndexBuffer); + if (VertexData is not null) + list.Add(VertexData); return list.ToArray(); } @@ -3417,12 +3438,10 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class VertexBuffer : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class VertexBuffer : ResourceSystemBlock { - public override long BlockLength - { - get { return 128; } - } + public override long BlockLength => 128; // structure data public uint VFT { get; set; } = 1080153080; @@ -3613,25 +3632,21 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - if (Data1 != null) list.Add(Data1); - if (Data2 != null) list.Add(Data2); - if (Info != null) list.Add(Info); + if (Data1 is not null) + list.Add(Data1); + if (Data2 is not null) + list.Add(Data2); + if (Info is not null) + list.Add(Info); return list.ToArray(); } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class VertexData : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class VertexData : ResourceSystemBlock { - - //private int length = 0; - public override long BlockLength - { - get - { - return VertexBytes?.Length ?? 0; //this.length; - } - } + public override long BlockLength => VertexBytes?.Length ?? 0; public int VertexStride { get; set; } @@ -3639,16 +3654,10 @@ namespace CodeWalker.GameFiles public VertexDeclaration Info { get; set; } public VertexType VertexType { get; set; } - public byte[] VertexBytes { get; set; } + public byte[]? VertexBytes { get; set; } - public long MemoryUsage - { - get - { - return (long)VertexCount * (long)VertexStride; - } - } + public long MemoryUsage => VertexCount * VertexStride; public override void Read(ResourceDataReader reader, params object[] parameters) { @@ -3684,7 +3693,7 @@ namespace CodeWalker.GameFiles } public override void Write(ResourceDataWriter writer, params object[] parameters) { - if (VertexBytes != null) + if (VertexBytes is not null) { writer.Write(VertexBytes); //not dealing with individual vertex data here any more! } @@ -3727,7 +3736,8 @@ namespace CodeWalker.GameFiles foreach (var row in rows) { var rowt = row.Trim(); - if (string.IsNullOrEmpty(rowt)) continue; + if (string.IsNullOrEmpty(rowt)) + continue; var cols = row.Split(coldelim, StringSplitOptions.RemoveEmptyEntries); vstrs.Add(cols); } @@ -3825,162 +3835,163 @@ namespace CodeWalker.GameFiles } public void SetVector3(int v, int c, Vector3 val) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 12;//sizeof(Vector3) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 12;//sizeof(Vector3) - if (e <= VertexBytes.Length) - { - var x = BitConverter.GetBytes(val.X); - var y = BitConverter.GetBytes(val.Y); - var z = BitConverter.GetBytes(val.Z); - Buffer.BlockCopy(x, 0, VertexBytes, o + 0, 4); - Buffer.BlockCopy(y, 0, VertexBytes, o + 4, 4); - Buffer.BlockCopy(z, 0, VertexBytes, o + 8, 4); - } + var x = BitConverter.GetBytes(val.X); + var y = BitConverter.GetBytes(val.Y); + var z = BitConverter.GetBytes(val.Z); + Buffer.BlockCopy(x, 0, VertexBytes, o + 0, 4); + Buffer.BlockCopy(y, 0, VertexBytes, o + 4, 4); + Buffer.BlockCopy(z, 0, VertexBytes, o + 8, 4); } } public void SetVector4(int v, int c, Vector4 val) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 16;//sizeof(Vector4) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 16;//sizeof(Vector4) - if (e <= VertexBytes.Length) - { - var x = BitConverter.GetBytes(val.X); - var y = BitConverter.GetBytes(val.Y); - var z = BitConverter.GetBytes(val.Z); - var w = BitConverter.GetBytes(val.W); - Buffer.BlockCopy(x, 0, VertexBytes, o + 0, 4); - Buffer.BlockCopy(y, 0, VertexBytes, o + 4, 4); - Buffer.BlockCopy(z, 0, VertexBytes, o + 8, 4); - Buffer.BlockCopy(w, 0, VertexBytes, o + 12, 4); - } + var x = BitConverter.GetBytes(val.X); + var y = BitConverter.GetBytes(val.Y); + var z = BitConverter.GetBytes(val.Z); + var w = BitConverter.GetBytes(val.W); + Buffer.BlockCopy(x, 0, VertexBytes, o + 0, 4); + Buffer.BlockCopy(y, 0, VertexBytes, o + 4, 4); + Buffer.BlockCopy(z, 0, VertexBytes, o + 8, 4); + Buffer.BlockCopy(w, 0, VertexBytes, o + 12, 4); } } public void SetDec3N(int v, int c, Vector3 val) { + if (Info is null || VertexBytes is null) + return; //see https://docs.microsoft.com/en-us/previous-versions/windows/desktop/bb322868(v%3Dvs.85) - if ((Info != null) && (VertexBytes != null)) + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 4;//sizeof(Dec3N) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 4;//sizeof(Dec3N) - if (e <= VertexBytes.Length) - { - var sx = (val.X < 0.0f); - var sy = (val.X < 0.0f); - var sz = (val.X < 0.0f); - var x = Math.Min((uint)(Math.Abs(val.X) * 511.0f), 511); - var y = Math.Min((uint)(Math.Abs(val.Y) * 511.0f), 511); - var z = Math.Min((uint)(Math.Abs(val.Z) * 511.0f), 511); - var ux = ((sx ? ~x : x) & 0x1FF) + (sx ? 0x200 : 0); - var uy = ((sy ? ~y : y) & 0x1FF) + (sy ? 0x200 : 0); - var uz = ((sz ? ~z : z) & 0x1FF) + (sz ? 0x200 : 0); - var uw = 0u; - var u = ux + (uy << 10) + (uz << 20) + (uw << 30); - var b = BitConverter.GetBytes(u); - Buffer.BlockCopy(b, 0, VertexBytes, o, 4); - } + var sx = (val.X < 0.0f); + var sy = (val.X < 0.0f); + var sz = (val.X < 0.0f); + var x = Math.Min((uint)(Math.Abs(val.X) * 511.0f), 511); + var y = Math.Min((uint)(Math.Abs(val.Y) * 511.0f), 511); + var z = Math.Min((uint)(Math.Abs(val.Z) * 511.0f), 511); + var ux = ((sx ? ~x : x) & 0x1FF) + (sx ? 0x200 : 0); + var uy = ((sy ? ~y : y) & 0x1FF) + (sy ? 0x200 : 0); + var uz = ((sz ? ~z : z) & 0x1FF) + (sz ? 0x200 : 0); + var uw = 0u; + var u = ux + (uy << 10) + (uz << 20) + (uw << 30); + var b = BitConverter.GetBytes(u); + Buffer.BlockCopy(b, 0, VertexBytes, o, 4); } } public void SetHalf2(int v, int c, Half2 val) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 4;//sizeof(Half2) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 4;//sizeof(Half2) - if (e <= VertexBytes.Length) - { - var x = BitConverter.GetBytes(val.X.RawValue); - var y = BitConverter.GetBytes(val.Y.RawValue); - Buffer.BlockCopy(x, 0, VertexBytes, o + 0, 2); - Buffer.BlockCopy(y, 0, VertexBytes, o + 2, 2); - } + var x = BitConverter.GetBytes(val.X.RawValue); + var y = BitConverter.GetBytes(val.Y.RawValue); + Buffer.BlockCopy(x, 0, VertexBytes, o + 0, 2); + Buffer.BlockCopy(y, 0, VertexBytes, o + 2, 2); } } public void SetHalf4(int v, int c, Half4 val) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 8;//sizeof(Half4) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 8;//sizeof(Half4) - if (e <= VertexBytes.Length) - { - var x = BitConverter.GetBytes(val.X.RawValue); - var y = BitConverter.GetBytes(val.Y.RawValue); - var z = BitConverter.GetBytes(val.Z.RawValue); - var w = BitConverter.GetBytes(val.W.RawValue); - Buffer.BlockCopy(x, 0, VertexBytes, o + 0, 2); - Buffer.BlockCopy(y, 0, VertexBytes, o + 2, 2); - Buffer.BlockCopy(z, 0, VertexBytes, o + 4, 2); - Buffer.BlockCopy(w, 0, VertexBytes, o + 6, 2); - } + var x = BitConverter.GetBytes(val.X.RawValue); + var y = BitConverter.GetBytes(val.Y.RawValue); + var z = BitConverter.GetBytes(val.Z.RawValue); + var w = BitConverter.GetBytes(val.W.RawValue); + Buffer.BlockCopy(x, 0, VertexBytes, o + 0, 2); + Buffer.BlockCopy(y, 0, VertexBytes, o + 2, 2); + Buffer.BlockCopy(z, 0, VertexBytes, o + 4, 2); + Buffer.BlockCopy(w, 0, VertexBytes, o + 6, 2); } } public void SetColour(int v, int c, Color val) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 4;//sizeof(Color) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 4;//sizeof(Color) - if (e <= VertexBytes.Length) - { - var u = val.ToRgba(); - var b = BitConverter.GetBytes(u); - Buffer.BlockCopy(b, 0, VertexBytes, o, 4); - } + var u = val.ToRgba(); + var b = BitConverter.GetBytes(u); + Buffer.BlockCopy(b, 0, VertexBytes, o, 4); } } public void SetUByte4(int v, int c, Color val) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 4;//sizeof(UByte4) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 4;//sizeof(UByte4) - if (e <= VertexBytes.Length) - { - var u = val.ToRgba(); - var b = BitConverter.GetBytes(u); - Buffer.BlockCopy(b, 0, VertexBytes, o, 4); - } + var u = val.ToRgba(); + var b = BitConverter.GetBytes(u); + Buffer.BlockCopy(b, 0, VertexBytes, o, 4); } } public string GetString(int v, int c, string d = ", ") { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return string.Empty; + + var ct = Info.GetComponentType(c); + switch (ct) { - var ct = Info.GetComponentType(c); - switch (ct) - { - case VertexComponentType.Float: return FloatUtil.ToString(GetFloat(v, c)); - case VertexComponentType.Float2: return FloatUtil.GetVector2String(GetVector2(v, c), d); - case VertexComponentType.Float3: return FloatUtil.GetVector3String(GetVector3(v, c), d); - case VertexComponentType.Float4: return FloatUtil.GetVector4String(GetVector4(v, c), d); - case VertexComponentType.Dec3N: return FloatUtil.GetVector3String(GetDec3N(v, c), d); - case VertexComponentType.Half2: return FloatUtil.GetHalf2String(GetHalf2(v, c), d); - case VertexComponentType.Half4: return FloatUtil.GetHalf4String(GetHalf4(v, c), d); - case VertexComponentType.Colour: return FloatUtil.GetColourString(GetColour(v, c), d); - case VertexComponentType.UByte4: return FloatUtil.GetColourString(GetUByte4(v, c), d); - default: - break; - } + case VertexComponentType.Float: return FloatUtil.ToString(GetFloat(v, c)); + case VertexComponentType.Float2: return FloatUtil.GetVector2String(GetVector2(v, c), d); + case VertexComponentType.Float3: return FloatUtil.GetVector3String(GetVector3(v, c), d); + case VertexComponentType.Float4: return FloatUtil.GetVector4String(GetVector4(v, c), d); + case VertexComponentType.Dec3N: return FloatUtil.GetVector3String(GetDec3N(v, c), d); + case VertexComponentType.Half2: return FloatUtil.GetHalf2String(GetHalf2(v, c), d); + case VertexComponentType.Half4: return FloatUtil.GetHalf4String(GetHalf4(v, c), d); + case VertexComponentType.Colour: return FloatUtil.GetColourString(GetColour(v, c), d); + case VertexComponentType.UByte4: return FloatUtil.GetColourString(GetUByte4(v, c), d); + default: + break; } + return string.Empty; } public float GetFloat(int v, int c) @@ -4001,151 +4012,153 @@ namespace CodeWalker.GameFiles } public Vector2 GetVector2(int v, int c) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return Vector2.Zero; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 8;//sizeof(Vector2) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 8;//sizeof(Vector2) - if (e <= VertexBytes.Length) - { - var x = BitConverter.ToSingle(VertexBytes, o + 0); - var y = BitConverter.ToSingle(VertexBytes, o + 4); - return new Vector2(x, y); - } + var x = BitConverter.ToSingle(VertexBytes, o + 0); + var y = BitConverter.ToSingle(VertexBytes, o + 4); + return new Vector2(x, y); } + return Vector2.Zero; } public Vector3 GetVector3(int v, int c) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return Vector3.Zero; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 12;//sizeof(Vector3) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 12;//sizeof(Vector3) - if (e <= VertexBytes.Length) - { - var x = BitConverter.ToSingle(VertexBytes, o + 0); - var y = BitConverter.ToSingle(VertexBytes, o + 4); - var z = BitConverter.ToSingle(VertexBytes, o + 8); - return new Vector3(x, y, z); - } + var x = BitConverter.ToSingle(VertexBytes, o + 0); + var y = BitConverter.ToSingle(VertexBytes, o + 4); + var z = BitConverter.ToSingle(VertexBytes, o + 8); + return new Vector3(x, y, z); } return Vector3.Zero; } public Vector4 GetVector4(int v, int c) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return Vector4.Zero; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 16;//sizeof(Vector4) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 16;//sizeof(Vector4) - if (e <= VertexBytes.Length) - { - var x = BitConverter.ToSingle(VertexBytes, o + 0); - var y = BitConverter.ToSingle(VertexBytes, o + 4); - var z = BitConverter.ToSingle(VertexBytes, o + 8); - var w = BitConverter.ToSingle(VertexBytes, o + 12); - return new Vector4(x, y, z, w); - } + var x = BitConverter.ToSingle(VertexBytes, o + 0); + var y = BitConverter.ToSingle(VertexBytes, o + 4); + var z = BitConverter.ToSingle(VertexBytes, o + 8); + var w = BitConverter.ToSingle(VertexBytes, o + 12); + return new Vector4(x, y, z, w); } + return Vector4.Zero; } public Vector3 GetDec3N(int v, int c) { + if (Info is null || VertexBytes is null) + return Vector3.Zero; + //see https://docs.microsoft.com/en-us/previous-versions/windows/desktop/bb322868(v%3Dvs.85) - if ((Info != null) && (VertexBytes != null)) + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 4;//sizeof(Dec3N) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 4;//sizeof(Dec3N) - if (e <= VertexBytes.Length) - { - var u = BitConverter.ToUInt32(VertexBytes, o); - var ux = (u >> 0) & 0x3FF; - var uy = (u >> 10) & 0x3FF; - var uz = (u >> 20) & 0x3FF; - var uw = (u >> 30); - var sx = (ux & 0x200) > 0; - var sy = (uy & 0x200) > 0; - var sz = (uz & 0x200) > 0; - var x = ((sx ? ~ux : ux) & 0x1FF) / (sx ? -511.0f : 511.0f); - var y = ((sy ? ~uy : uy) & 0x1FF) / (sy ? -511.0f : 511.0f); - var z = ((sz ? ~uz : uz) & 0x1FF) / (sz ? -511.0f : 511.0f); - return new Vector3(x, y, z); - } + var u = BitConverter.ToUInt32(VertexBytes, o); + var ux = (u >> 0) & 0x3FF; + var uy = (u >> 10) & 0x3FF; + var uz = (u >> 20) & 0x3FF; + var uw = (u >> 30); + var sx = (ux & 0x200) > 0; + var sy = (uy & 0x200) > 0; + var sz = (uz & 0x200) > 0; + var x = ((sx ? ~ux : ux) & 0x1FF) / (sx ? -511.0f : 511.0f); + var y = ((sy ? ~uy : uy) & 0x1FF) / (sy ? -511.0f : 511.0f); + var z = ((sz ? ~uz : uz) & 0x1FF) / (sz ? -511.0f : 511.0f); + return new Vector3(x, y, z); } return Vector3.Zero; } public Half2 GetHalf2(int v, int c) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return new Half2(0, 0); + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 4;//sizeof(Half2) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 4;//sizeof(Half2) - if (e <= VertexBytes.Length) - { - var x = BitConverter.ToUInt16(VertexBytes, o + 0); - var y = BitConverter.ToUInt16(VertexBytes, o + 2); - return new Half2(x, y); - } + var x = BitConverter.ToUInt16(VertexBytes, o + 0); + var y = BitConverter.ToUInt16(VertexBytes, o + 2); + return new Half2(x, y); } return new Half2(0, 0); } public Half4 GetHalf4(int v, int c) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return new Half4(0, 0, 0, 0); + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 8;//sizeof(Half4) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 8;//sizeof(Half4) - if (e <= VertexBytes.Length) - { - var x = BitConverter.ToUInt16(VertexBytes, o + 0); - var y = BitConverter.ToUInt16(VertexBytes, o + 2); - var z = BitConverter.ToUInt16(VertexBytes, o + 4); - var w = BitConverter.ToUInt16(VertexBytes, o + 6); - return new Half4(x, y, z, w); - } + var x = BitConverter.ToUInt16(VertexBytes, o + 0); + var y = BitConverter.ToUInt16(VertexBytes, o + 2); + var z = BitConverter.ToUInt16(VertexBytes, o + 4); + var w = BitConverter.ToUInt16(VertexBytes, o + 6); + return new Half4(x, y, z, w); } return new Half4(0, 0, 0, 0); } public Color GetColour(int v, int c) { - if ((Info != null) && (VertexBytes != null)) + if (Info is null || VertexBytes is null) + return Color.Black; + + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 4;//sizeof(Color) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 4;//sizeof(Color) - if (e <= VertexBytes.Length) - { - var rgba = BitConverter.ToUInt32(VertexBytes, o); - return new Color(rgba); - } + var rgba = BitConverter.ToUInt32(VertexBytes, o); + return new Color(rgba); } return Color.Black; } public Color GetUByte4(int v, int c) { + if (Info is null || VertexBytes is null) + return new Color(0, 0, 0, 0); + //Color is the same as UByte4 really - if ((Info != null) && (VertexBytes != null)) + var s = Info.Stride; + var co = Info.GetComponentOffset(c); + var o = (v * s) + co; + var e = o + 4;//sizeof(UByte4) + if (e <= VertexBytes.Length) { - var s = Info.Stride; - var co = Info.GetComponentOffset(c); - var o = (v * s) + co; - var e = o + 4;//sizeof(UByte4) - if (e <= VertexBytes.Length) - { - var rgba = BitConverter.ToUInt32(VertexBytes, o); - return new Color(rgba); - } + var rgba = BitConverter.ToUInt32(VertexBytes, o); + return new Color(rgba); } return new Color(0, 0, 0, 0); } @@ -4157,12 +4170,10 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class VertexDeclaration : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class VertexDeclaration : ResourceSystemBlock { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public uint Flags { get; set; } @@ -4296,12 +4307,10 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class IndexBuffer : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class IndexBuffer : ResourceSystemBlock { - public override long BlockLength - { - get { return 96; } - } + public override long BlockLength => 96; // structure data public uint VFT { get; set; } = 1080152408; @@ -4401,15 +4410,15 @@ namespace CodeWalker.GameFiles } public void WriteXml(StringBuilder sb, int indent) { - if (Indices != null) + if (Indices is not null && Indices.Length > 0) { - YdrXml.WriteRawArray(sb, Indices, indent, "Data", "", null, 24); + YdrXml.WriteRawArray(sb, Indices, indent, "Data", "", (FormatterRef?)null, 24); } } public void ReadXml(XmlNode node) { var inode = node.SelectSingleNode("Data"); - if (inode != null) + if (inode is not null) { Indices = Xml.GetRawUshortArray(node); IndicesCount = (uint)(Indices?.Length ?? 0); @@ -4420,7 +4429,7 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - if (Indices != null) + if (Indices is not null) { IndicesBlock = new ResourceSystemStructBlock(Indices); list.Add(IndicesBlock); @@ -4437,17 +4446,14 @@ namespace CodeWalker.GameFiles Capsule = 4, } - [TypeConverter(typeof(ExpandableObjectConverter))] public class LightAttributes : ResourceSystemBlock, IMetaXmlItem + [TypeConverter(typeof(ExpandableObjectConverter))] + public class LightAttributes : ResourceSystemBlock, IMetaXmlItem { - public override long BlockLength - { - get { return 168; } - } - + public override long BlockLength => 168; // structure data public uint Unknown_0h { get; set; } // 0x00000000 public uint Unknown_4h { get; set; } // 0x00000000 - public Vector3 Position { get; set; } + public Vector3 Position; public uint Unknown_14h { get; set; } // 0x00000000 public byte ColorR { get; set; } public byte ColorG { get; set; } @@ -4717,23 +4723,25 @@ namespace CodeWalker.GameFiles - [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableBase : ResourceFileBase + [TypeConverter(typeof(ExpandableObjectConverter))] + public class DrawableBase : ResourceFileBase { - private DrawableModel[] allModels; + private DrawableModel[]? allModels; - public override long BlockLength - { - get { return 168; } - } + public override long BlockLength => 168; // structure data public ulong ShaderGroupPointer { get; set; } public ulong SkeletonPointer { get; set; } public Vector3 BoundingCenter { get; set; } public float BoundingSphereRadius { get; set; } - public Vector3 BoundingBoxMin { get; set; } + + public Vector3 _BoundingBoxMin; + public ref Vector3 BoundingBoxMin { get => ref _BoundingBoxMin; } public uint Unknown_3Ch { get; set; } = 0x7f800001; - public Vector3 BoundingBoxMax { get; set; } + + public Vector3 _BoundingBoxMax; + public ref Vector3 BoundingBoxMax { get => ref _BoundingBoxMax; } public uint Unknown_4Ch { get; set; } = 0x7f800001; public ulong DrawableModelsHighPointer { get; set; } public ulong DrawableModelsMediumPointer { get; set; } @@ -4755,43 +4763,43 @@ namespace CodeWalker.GameFiles public byte FlagsHigh { - get { return (byte)(RenderMaskFlagsHigh & 0xFF); } - set { RenderMaskFlagsHigh = (RenderMaskFlagsHigh & 0xFFFFFF00) + (value & 0xFFu); } + get => (byte)(RenderMaskFlagsHigh & 0xFF); + set => RenderMaskFlagsHigh = (RenderMaskFlagsHigh & 0xFFFFFF00) + (value & 0xFFu); } public byte FlagsMed { - get { return (byte)(RenderMaskFlagsMed & 0xFF); } - set { RenderMaskFlagsMed = (RenderMaskFlagsMed & 0xFFFFFF00) + (value & 0xFFu); } + get => (byte)(RenderMaskFlagsMed & 0xFF); + set => RenderMaskFlagsMed = (RenderMaskFlagsMed & 0xFFFFFF00) + (value & 0xFFu); } public byte FlagsLow { - get { return (byte)(RenderMaskFlagsLow & 0xFF); } - set { RenderMaskFlagsLow = (RenderMaskFlagsLow & 0xFFFFFF00) + (value & 0xFFu); } + get => (byte)(RenderMaskFlagsLow & 0xFF); + set => RenderMaskFlagsLow = (RenderMaskFlagsLow & 0xFFFFFF00) + (value & 0xFFu); } public byte FlagsVlow { - get { return (byte)(RenderMaskFlagsVlow & 0xFF); } - set { RenderMaskFlagsVlow = (RenderMaskFlagsVlow & 0xFFFFFF00) + (value & 0xFFu); } + get => (byte)(RenderMaskFlagsVlow & 0xFF); + set => RenderMaskFlagsVlow = (RenderMaskFlagsVlow & 0xFFFFFF00) + (value & 0xFFu); } public byte RenderMaskHigh { - get { return (byte)((RenderMaskFlagsHigh >> 8) & 0xFF); } - set { RenderMaskFlagsHigh = (RenderMaskFlagsHigh & 0xFFFF00FF) + ((value & 0xFFu) << 8); } + get => (byte)((RenderMaskFlagsHigh >> 8) & 0xFF); + set => RenderMaskFlagsHigh = (RenderMaskFlagsHigh & 0xFFFF00FF) + ((value & 0xFFu) << 8); } public byte RenderMaskMed { - get { return (byte)((RenderMaskFlagsMed >> 8) & 0xFF); } - set { RenderMaskFlagsMed = (RenderMaskFlagsMed & 0xFFFF00FF) + ((value & 0xFFu) << 8); } + get => (byte)((RenderMaskFlagsMed >> 8) & 0xFF); + set => RenderMaskFlagsMed = (RenderMaskFlagsMed & 0xFFFF00FF) + ((value & 0xFFu) << 8); } public byte RenderMaskLow { - get { return (byte)((RenderMaskFlagsLow >> 8) & 0xFF); } - set { RenderMaskFlagsLow = (RenderMaskFlagsLow & 0xFFFF00FF) + ((value & 0xFFu) << 8); } + get => (byte)((RenderMaskFlagsLow >> 8) & 0xFF); + set => RenderMaskFlagsLow = (RenderMaskFlagsLow & 0xFFFF00FF) + ((value & 0xFFu) << 8); } public byte RenderMaskVlow { - get { return (byte)((RenderMaskFlagsVlow >> 8) & 0xFF); } - set { RenderMaskFlagsVlow = (RenderMaskFlagsVlow & 0xFFFF00FF) + ((value & 0xFFu) << 8); } + get => (byte)((RenderMaskFlagsVlow >> 8) & 0xFF); + set => RenderMaskFlagsVlow = (RenderMaskFlagsVlow & 0xFFFF00FF) + ((value & 0xFFu) << 8); } @@ -4809,7 +4817,7 @@ namespace CodeWalker.GameFiles { BuildAllModels(); } - return allModels; + return allModels!; } set => allModels = value; } @@ -4817,14 +4825,16 @@ namespace CodeWalker.GameFiles public object Owner { get; set; } - public long MemoryUsage + public long MemoryUsage => PhysicalMemoryUsage + VirtualMemoryUsage; + + public long VirtualMemoryUsage { get { long val = 0; if (AllModels != null) { - foreach(DrawableModel m in AllModels) + foreach (DrawableModel m in AllModels) { if (m != null) { @@ -4832,14 +4842,13 @@ namespace CodeWalker.GameFiles } } } - if ((ShaderGroup != null) && (ShaderGroup.TextureDictionary != null)) - { - val += ShaderGroup.TextureDictionary.MemoryUsage; - } + return val; } } + public long PhysicalMemoryUsage => ShaderGroup?.TextureDictionary?.MemoryUsage ?? 0; + public override void Read(ResourceDataReader reader, params object[] parameters) { @@ -5114,43 +5123,46 @@ namespace CodeWalker.GameFiles YdrXml.ValueTag(sb, indent, "FlagsMed", FlagsMed.ToString()); YdrXml.ValueTag(sb, indent, "FlagsLow", FlagsLow.ToString()); YdrXml.ValueTag(sb, indent, "FlagsVlow", FlagsVlow.ToString()); - if (ShaderGroup != null) + if (ShaderGroup is not null) { YdrXml.OpenTag(sb, indent, "ShaderGroup"); ShaderGroup.WriteXml(sb, indent + 1, ddsfolder); YdrXml.CloseTag(sb, indent, "ShaderGroup"); } - if (Skeleton != null) + if (Skeleton is not null) { YdrXml.OpenTag(sb, indent, "Skeleton"); Skeleton.WriteXml(sb, indent + 1); YdrXml.CloseTag(sb, indent, "Skeleton"); } - if (Joints != null) + if (Joints is not null) { YdrXml.OpenTag(sb, indent, "Joints"); Joints.WriteXml(sb, indent + 1); YdrXml.CloseTag(sb, indent, "Joints"); } - if (DrawableModels?.High != null) + if (DrawableModels is not null) { - YdrXml.WriteItemArray(sb, DrawableModels.High, indent, "DrawableModelsHigh"); - } - if (DrawableModels?.Med != null) - { - YdrXml.WriteItemArray(sb, DrawableModels.Med, indent, "DrawableModelsMedium"); - } - if (DrawableModels?.Low != null) - { - YdrXml.WriteItemArray(sb, DrawableModels.Low, indent, "DrawableModelsLow"); - } - if (DrawableModels?.VLow != null) - { - YdrXml.WriteItemArray(sb, DrawableModels.VLow, indent, "DrawableModelsVeryLow"); - } - if (DrawableModels?.Extra != null)//is this right? duplicates..? - { - YdrXml.WriteItemArray(sb, DrawableModels.Extra, indent, "DrawableModelsX"); + if (DrawableModels.High is not null) + { + YdrXml.WriteItemArray(sb, DrawableModels.High, indent, "DrawableModelsHigh"); + } + if (DrawableModels.Med is not null) + { + YdrXml.WriteItemArray(sb, DrawableModels.Med, indent, "DrawableModelsMedium"); + } + if (DrawableModels.Low is not null) + { + YdrXml.WriteItemArray(sb, DrawableModels.Low, indent, "DrawableModelsLow"); + } + if (DrawableModels.VLow is not null) + { + YdrXml.WriteItemArray(sb, DrawableModels.VLow, indent, "DrawableModelsVeryLow"); + } + if (DrawableModels.Extra is not null)//is this right? duplicates..? + { + YdrXml.WriteItemArray(sb, DrawableModels.Extra, indent, "DrawableModelsX"); + } } } public virtual void ReadXml(XmlNode node, string ddsfolder) @@ -5206,10 +5218,16 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(base.GetReferences()); - if (ShaderGroup != null) list.Add(ShaderGroup); - if (Skeleton != null) list.Add(Skeleton); - if (Joints != null) list.Add(Joints); - if (DrawableModels != null) list.Add(DrawableModels); + + if (ShaderGroup is not null) + list.Add(ShaderGroup); + if (Skeleton is not null) + list.Add(Skeleton); + if (Joints is not null) + list.Add(Joints); + if (DrawableModels is not null) + list.Add(DrawableModels); + return list.ToArray(); } @@ -5222,17 +5240,16 @@ namespace CodeWalker.GameFiles //} //map the shaders to the geometries - if (shaderGrp != null) + if (shaderGrp is not null) { var shaders = shaderGrp.Shaders.data_items; foreach (DrawableModel model in AllModels) { - if (model?.Geometries == null) continue; + if (model?.Geometries is null) + continue; - int geomcount = model.Geometries.Length; - for (int i = 0; i < geomcount; i++) + foreach(var geom in model.Geometries) { - var geom = model.Geometries[i]; var sid = geom.ShaderID; geom.Shader = (sid < shaders.Length) ? shaders[sid] : null; } @@ -5254,45 +5271,50 @@ namespace CodeWalker.GameFiles return; } var length = (DrawableModels.High?.Length ?? 0) + (DrawableModels.Med?.Length ?? 0) + (DrawableModels.Low?.Length ?? 0) + (DrawableModels.VLow?.Length ?? 0); + if (length == 0) + { + allModels = Array.Empty(); + return; + } allModels = new DrawableModel[length]; var currIndex = 0; - if (DrawableModels.High != null) + if (DrawableModels.High is not null) { - for (int i = 0; i < DrawableModels.High.Length; i++) + foreach(var model in DrawableModels.High) { - allModels[currIndex] = DrawableModels.High[i]; + allModels[currIndex] = model; currIndex++; } } - if (DrawableModels.Med != null) + if (DrawableModels.Med is not null) { - for (int i = 0; i < DrawableModels.Med.Length; i++) + foreach(var model in DrawableModels.Med) { - allModels[currIndex] = DrawableModels.Med[i]; + allModels[currIndex] = model; currIndex++; } } - if (DrawableModels.Low != null) + if (DrawableModels.Low is not null) { - for (int i = 0; i < DrawableModels.Low.Length; i++) + foreach(var model in DrawableModels.Low) { - allModels[currIndex] = DrawableModels.Low[i]; + allModels[currIndex] = model; currIndex++; } } - if (DrawableModels.VLow != null) + if (DrawableModels.VLow is not null) { - for (int i = 0; i < DrawableModels.VLow.Length; i++) + foreach(var model in DrawableModels.VLow) { - allModels[currIndex] = DrawableModels.VLow[i]; + allModels[currIndex] = model; currIndex++; } } - if (DrawableModels.Extra != null) + if (DrawableModels.Extra is not null) { - for (int i = 0; i < DrawableModels.Extra.Length; i++) + foreach(var model in DrawableModels.Extra) { - allModels[currIndex] = DrawableModels.Extra[i]; + allModels[currIndex] = model; currIndex++; } } @@ -5303,25 +5325,22 @@ namespace CodeWalker.GameFiles var vds = new Dictionary(); foreach (DrawableModel model in AllModels) { - if (model.Geometries == null) continue; + if (model.Geometries is null) + continue; + foreach (var geom in model.Geometries) { + if (geom.VertexBuffer is null) + continue; + var info = geom.VertexBuffer.Info; var declid = info.GetDeclarationId(); - if (!vds.ContainsKey(declid)) - { - vds.Add(declid, info); - } - //else //debug test - //{ - // if ((VertexDecls[declid].Stride != info.Stride)||(VertexDecls[declid].Types != info.Types)) - // { - // } - //} + _ = vds.TryAdd(declid, info); } } - VertexDecls = new Dictionary(vds); + + VertexDecls = vds; } @@ -5332,31 +5351,20 @@ namespace CodeWalker.GameFiles var lmask = BuildRenderMask(DrawableModels?.Low); var vmask = BuildRenderMask(DrawableModels?.VLow); - ////just testing - //if (hmask != RenderMaskHigh) - //{ }//no hit - //if (mmask != RenderMaskMed) - //{ }//no hit - //if (lmask != RenderMaskLow) - //{ }//no hit - //if (vmask != RenderMaskVlow) - //{ }//no hit - RenderMaskHigh = hmask; RenderMaskMed = mmask; RenderMaskLow = lmask; RenderMaskVlow = vmask; } - private byte BuildRenderMask(DrawableModel[] models) + private byte BuildRenderMask(DrawableModel[]? models) { + if (models is null) + return 0; byte mask = 0; - if (models != null) + foreach (var model in models) { - foreach (var model in models) - { - mask = (byte)(mask | model.RenderMask); - } + mask = (byte)(mask | model.RenderMask); } return mask; } @@ -5364,7 +5372,7 @@ namespace CodeWalker.GameFiles public DrawableBase ShallowCopy() { - DrawableBase r = null; + DrawableBase? r = null; if (this is FragDrawable fd) { var f = new FragDrawable(); @@ -5431,12 +5439,10 @@ namespace CodeWalker.GameFiles } - [TypeConverter(typeof(ExpandableObjectConverter))] public class Drawable : DrawableBase + [TypeConverter(typeof(ExpandableObjectConverter))] + public class Drawable : DrawableBase { - public override long BlockLength - { - get { return 208; } - } + public override long BlockLength => 208; // structure data public ulong NamePointer { get; set; } @@ -5445,14 +5451,14 @@ namespace CodeWalker.GameFiles public ulong BoundPointer { get; set; } // reference data - public string Name { get; set; } + public string? Name { get; set; } public uint Hash { get; set; } public Bounds Bound { get; set; } public string ErrorMessage { get; set; } - private string_r NameBlock = null;//only used when saving.. + private string_r? NameBlock = null;//only used when saving.. #if DEBUG @@ -5472,7 +5478,6 @@ namespace CodeWalker.GameFiles try { - // read reference data this.Name = reader.ReadStringAt(//BlockAt( this.NamePointer // offset @@ -5486,17 +5491,12 @@ namespace CodeWalker.GameFiles { Bound.Owner = this; } - } catch (Exception ex) { ErrorMessage = ex.ToString(); } - if (UnkPointer != 0) - { } - - #if DEBUG Analyzer = new ResourceAnalyzer(reader); #endif @@ -5567,34 +5567,33 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(base.GetReferences()); - if (Name != null) + if (Name is not null) { NameBlock = (string_r)Name; list.Add(NameBlock); } - if (Bound != null) list.Add(Bound); + if (Bound is not null) + list.Add(Bound); return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0xB0, LightAttributes), - }; + return [ + (0xB0, LightAttributes), + ]; } - public override string ToString() + public override string? ToString() { return Name; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawablePtfx : DrawableBase + [TypeConverter(typeof(ExpandableObjectConverter))] + public class DrawablePtfx : DrawableBase { - public override long BlockLength - { - get { return 176; } - } + public override long BlockLength => 176; // structure data public ulong UnkPointer { get; set; } @@ -5606,9 +5605,6 @@ namespace CodeWalker.GameFiles // read structure data this.UnkPointer = reader.ReadUInt64(); - - if (UnkPointer != 0) - { } } public override void Write(ResourceDataWriter writer, params object[] parameters) { @@ -5642,12 +5638,10 @@ namespace CodeWalker.GameFiles } - [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawablePtfxDictionary : ResourceFileBase + [TypeConverter(typeof(ExpandableObjectConverter))] + public class DrawablePtfxDictionary : ResourceFileBase { - public override long BlockLength - { - get { return 64; } - } + public override long BlockLength => 64; // structure data public ulong Unknown_10h; // 0x0000000000000000 @@ -5666,10 +5660,8 @@ namespace CodeWalker.GameFiles public uint[] Hashes { get; set; } public ResourcePointerArray64 Drawables { get; set; } - private ResourceSystemStructBlock HashesBlock = null;//only used for saving - public override void Read(ResourceDataReader reader, params object[] parameters) { base.Read(reader, parameters); @@ -5689,16 +5681,8 @@ namespace CodeWalker.GameFiles // read reference data this.Hashes = reader.ReadUintsAt(this.HashesPointer, this.HashesCount1); this.Drawables = reader.ReadBlockAt>(this.DrawablesPointer, this.DrawablesCount1); - - //if (Unknown_10h != 0) - //{ } - //if (Unknown_18h != 1) - //{ } - //if (Unknown_2Ch != 0) - //{ } - //if (Unknown_3Ch != 0) - //{ } } + public override void Write(ResourceDataWriter writer, params object[] parameters) { base.Write(writer, parameters); @@ -5764,7 +5748,8 @@ namespace CodeWalker.GameFiles } public static void WriteXmlNode(DrawablePtfxDictionary d, StringBuilder sb, int indent, string ddsfolder, string name = "DrawableDictionary") { - if (d == null) return; + if (d == null) + return; YddXml.OpenTag(sb, indent, name); d.WriteXml(sb, indent + 1, ddsfolder); YddXml.CloseTag(sb, indent, name); @@ -5785,17 +5770,16 @@ namespace CodeWalker.GameFiles HashesBlock = new ResourceSystemStructBlock(Hashes); list.Add(HashesBlock); } - if (Drawables != null) list.Add(Drawables); + if (Drawables != null) + list.Add(Drawables); return list.ToArray(); } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableDictionary : ResourceFileBase + [TypeConverter(typeof(ExpandableObjectConverter))] + public class DrawableDictionary : ResourceFileBase { - public override long BlockLength - { - get { return 64; } - } + public override long BlockLength => 64; // structure data public ulong Unknown_10h; // 0x0000000000000000 @@ -5834,6 +5818,38 @@ namespace CodeWalker.GameFiles } } + public long PhysicalMemoryUsage + { + get + { + long val = 0; + if (Drawables?.data_items != null) + { + foreach (var drawable in Drawables.data_items) + { + val += drawable.PhysicalMemoryUsage; + } + } + return val; + } + } + + public long VirtualMemoryUsage + { + get + { + long val = 0; + if (Drawables?.data_items != null) + { + foreach (var drawable in Drawables.data_items) + { + val += drawable.VirtualMemoryUsage; + } + } + return val; + } + } + public override void Read(ResourceDataReader reader, params object[] parameters) { base.Read(reader, parameters); @@ -5959,6 +5975,4 @@ namespace CodeWalker.GameFiles return list.ToArray(); } } - - } diff --git a/CodeWalker.Core/GameFiles/Resources/Expression.cs b/CodeWalker.Core/GameFiles/Resources/Expression.cs index 47b726f..d679493 100644 --- a/CodeWalker.Core/GameFiles/Resources/Expression.cs +++ b/CodeWalker.Core/GameFiles/Resources/Expression.cs @@ -147,11 +147,11 @@ namespace CodeWalker.GameFiles var list = new List(base.GetReferences()); return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, ExpressionNameHashes), - new Tuple(0x30, Expressions) + return new (long, IResourceBlock)[] { + (0x20, ExpressionNameHashes), + (0x30, Expressions) }; } @@ -416,13 +416,13 @@ namespace CodeWalker.GameFiles if (Name != null) list.Add(Name); return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, Streams), - new Tuple(0x30, BoneTracks), - new Tuple(0x40, JiggleData), - new Tuple(0x50, ItemHashes) + return new (long, IResourceBlock)[] { + (0x20, Streams), + (0x30, BoneTracks), + (0x40, JiggleData), + (0x50, ItemHashes) }; } diff --git a/CodeWalker.Core/GameFiles/Resources/Filter.cs b/CodeWalker.Core/GameFiles/Resources/Filter.cs index 172ec46..093f741 100644 --- a/CodeWalker.Core/GameFiles/Resources/Filter.cs +++ b/CodeWalker.Core/GameFiles/Resources/Filter.cs @@ -90,11 +90,11 @@ namespace CodeWalker.GameFiles writer.WriteBlock(this.Filters); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, FilterNameHashes), - new Tuple(0x30, Filters) + return new (long, IResourceBlock)[] { + (0x20, FilterNameHashes), + (0x30, Filters) }; } @@ -215,9 +215,9 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_14h); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return Array.Empty>(); + return Array.Empty<(long, IResourceBlock)>(); } public IResourceSystemBlock GetType(ResourceDataReader reader, params object[] parameters) @@ -364,11 +364,11 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_38h); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x18, Entries), - new Tuple(0x28, Weights) + return new (long, IResourceBlock)[] { + (0x18, Entries), + (0x28, Weights) }; } @@ -396,7 +396,7 @@ namespace CodeWalker.GameFiles public void SortEntries() { - if (Entries?.data_items == null) + if (Entries?.data_items == null || Entries.data_items.Length == 0) { return; } @@ -408,12 +408,12 @@ namespace CodeWalker.GameFiles { // CRC-32 hash of the Entries and Weights arrays uint s = 0; - if (Entries?.data_items != null && Entries?.data_items.Length > 0) + if (Entries?.data_items is not null && Entries?.data_items.Length > 0) { var data = MetaTypes.ConvertArrayToBytes(Entries.data_items); s = Crc32Hash(data, s); } - if (Weights?.data_items != null && Weights?.data_items.Length > 0) + if (Weights?.data_items is not null && Weights?.data_items.Length > 0) { var data = MetaTypes.ConvertArrayToBytes(Weights.data_items); s = Crc32Hash(data, s); @@ -430,7 +430,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return BoneId + ", " + Track + ": " + WeightIndex; + return $"{BoneId}, {Track}: {WeightIndex}"; } public uint GetSortKey() => (uint)(BoneId | (Track << 16)); diff --git a/CodeWalker.Core/GameFiles/Resources/Frag.cs b/CodeWalker.Core/GameFiles/Resources/Frag.cs index b197f9d..4427771 100644 --- a/CodeWalker.Core/GameFiles/Resources/Frag.cs +++ b/CodeWalker.Core/GameFiles/Resources/Frag.cs @@ -32,6 +32,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; +using static CodeWalker.GameFiles.MetaXmlBase; namespace CodeWalker.GameFiles { @@ -736,11 +737,11 @@ namespace CodeWalker.GameFiles return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x60, Cloths), - new Tuple(0x110, LightAttributes) + return new (long, IResourceBlock)[] { + (0x60, Cloths), + (0x110, LightAttributes) }; } } @@ -2854,11 +2855,11 @@ namespace CodeWalker.GameFiles { if (ItemIndices != null) { - YftXml.WriteRawArray(sb, ItemIndices, indent, "ItemIndices", "", null, 22); + YftXml.WriteRawArray(sb, ItemIndices, indent, "ItemIndices", "", (FormatterRef?)null, 22); } if (ItemFlags != null) { - YftXml.WriteRawArray(sb, ItemFlags, indent, "ItemFlags", "", null, 22); + YftXml.WriteRawArray(sb, ItemFlags, indent, "ItemFlags", "", (FormatterRef?)null, 22); } if (UnknownVectors != null) { @@ -4362,7 +4363,7 @@ namespace CodeWalker.GameFiles Unknown_24h = u(36); } - public override string ToString() + public override readonly string ToString() { UintStringBuilder usb = new UintStringBuilder(); usb.Add(Unknown_00h); diff --git a/CodeWalker.Core/GameFiles/Resources/Nav.cs b/CodeWalker.Core/GameFiles/Resources/Nav.cs index f5b95dd..8e40ed4 100644 --- a/CodeWalker.Core/GameFiles/Resources/Nav.cs +++ b/CodeWalker.Core/GameFiles/Resources/Nav.cs @@ -350,12 +350,13 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "(Size: " + FloatUtil.GetVector3String(AABBSize) + ")"; + return $"(Size: {FloatUtil.GetVector3String(AABBSize)})"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct NavMeshUintArray + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct NavMeshUintArray { public uint Count { get; set; } public uint v00; @@ -391,7 +392,7 @@ namespace CodeWalker.GameFiles public uint v30; // 0x00000000 public uint v31; // 0x00000000 - public uint[] RawValues + public readonly uint[] RawValues { get { @@ -404,7 +405,7 @@ namespace CodeWalker.GameFiles public uint[] Values { - get + readonly get { uint[] vals = new uint[Count]; uint[] rvals = RawValues; @@ -452,44 +453,43 @@ namespace CodeWalker.GameFiles } } - public uint Get(uint i) + public readonly uint Get(uint i) { - switch (i) + return i switch { - default: - case 0: return v00; - case 1: return v01; - case 2: return v02; - case 3: return v03; - case 4: return v04; - case 5: return v05; - case 6: return v06; - case 7: return v07; - case 8: return v08; - case 9: return v09; - case 10: return v10; - case 11: return v11; - case 12: return v12; - case 13: return v13; - case 14: return v14; - case 15: return v15; - case 16: return v16; - case 17: return v17; - case 18: return v18; - case 19: return v19; - case 20: return v20; - case 21: return v21; - case 22: return v22; - case 23: return v23; - case 24: return v24; - case 25: return v25; - case 26: return v26; - case 27: return v27; - case 28: return v28; - case 29: return v29; - case 30: return v30; - case 31: return v31; - } + 1 => v01, + 2 => v02, + 3 => v03, + 4 => v04, + 5 => v05, + 6 => v06, + 7 => v07, + 8 => v08, + 9 => v09, + 10 => v10, + 11 => v11, + 12 => v12, + 13 => v13, + 14 => v14, + 15 => v15, + 16 => v16, + 17 => v17, + 18 => v18, + 19 => v19, + 20 => v20, + 21 => v21, + 22 => v22, + 23 => v23, + 24 => v24, + 25 => v25, + 26 => v26, + 27 => v27, + 28 => v28, + 29 => v29, + 30 => v30, + 31 => v31, + _ => v00, + }; } public void Set(uint[] arr) @@ -497,19 +497,17 @@ namespace CodeWalker.GameFiles Values = arr; } - public override string ToString() + public override readonly string ToString() { - return "(Count: " + Count.ToString() + ")"; + return $"(Count: {Count})"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class NavMeshList : ResourceSystemBlock where T : struct + [TypeConverter(typeof(ExpandableObjectConverter))] + public class NavMeshList : ResourceSystemBlock where T : struct { - public override long BlockLength - { - get { return 48; } - } + public override long BlockLength => 48; public uint VFT { get; set; } public uint Unknown_04h { get; set; } // 0x00000001 @@ -525,16 +523,9 @@ namespace CodeWalker.GameFiles public ResourceSimpleArray> ListParts { get; set; } public uint[] ListOffsets { get; set; } - private ResourceSystemStructBlock ListOffsetsBlock = null; - public int ItemSize { get { return System.Runtime.InteropServices.Marshal.SizeOf(); } } - - public uint ByteCount - { - get - { - return ItemCount * (uint)ItemSize; - } - } + private ResourceSystemStructBlock? ListOffsetsBlock = null; + public int ItemSize => System.Runtime.InteropServices.Marshal.SizeOf(); + public uint ByteCount => ItemCount * (uint)ItemSize; @@ -577,13 +568,18 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - if (ListParts != null) list.Add(ListParts); + if (ListParts is not null) + list.Add(ListParts); - if ((ListOffsets != null) && (ListOffsets.Length > 0)) + if (ListOffsets is not null && ListOffsets.Length > 0) { ListOffsetsBlock = new ResourceSystemStructBlock(ListOffsets); list.Add(ListOffsetsBlock); } + else + { + ListOffsetsBlock = null; + } return list.ToArray(); } @@ -594,11 +590,11 @@ namespace CodeWalker.GameFiles { List list = new List((int)ItemCount); - if (ListParts != null) + if (ListParts is not null) { foreach (var part in ListParts) { - if (part.Items != null) + if (part.Items is not null) { list.AddRange(part.Items); } @@ -646,16 +642,14 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "(" + ItemCount.ToString() + " total items, " + ListPartsCount.ToString() + " parts)"; + return $"({ItemCount} total items, {ListPartsCount} parts)"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class NavMeshListPart : ResourceSystemBlock where T : struct + [TypeConverter(typeof(ExpandableObjectConverter))] + public class NavMeshListPart : ResourceSystemBlock where T : struct { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; public ulong Pointer { get; set; } public uint Count { get; set; } @@ -701,7 +695,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "(" + Count.ToString() + " items)"; + return $"({Count} items)"; } } @@ -714,14 +708,14 @@ namespace CodeWalker.GameFiles public ushort Z { get; set; } - public Vector3 Position { get { return ToVector3(); } set { FromVector3(value); } } + public Vector3 Position { readonly get { return ToVector3(); } set { FromVector3(value); } } - public Vector3 ToVector3() + public readonly Vector3 ToVector3() { const float usmax = ushort.MaxValue; return new Vector3(X / usmax, Y / usmax, Z / usmax); } - public void FromVector3(Vector3 v) + public void FromVector3(in Vector3 v) { const float usmax = ushort.MaxValue; X = (ushort)Math.Round(v.X * usmax); @@ -729,44 +723,53 @@ namespace CodeWalker.GameFiles Z = (ushort)Math.Round(v.Z * usmax); } - public static NavMeshVertex Create(Vector3 v) + public static NavMeshVertex Create(in Vector3 v) { var nmv = new NavMeshVertex(); - nmv.FromVector3(v); + nmv.FromVector3(in v); return nmv; } - public override string ToString() - { - return X.ToString() + ", " + Y.ToString() + ", " + Z.ToString(); - } + public override readonly string ToString() => $"{X}, {Y}, {Z}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct NavMeshAABB + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct NavMeshAABB(in Vector3 min, in Vector3 max) { - public short MinX { get; set; } - public short MaxX { get; set; } - public short MinY { get; set; } - public short MaxY { get; set; } - public short MinZ { get; set; } - public short MaxZ { get; set; } + public short MinX { get; init; } = (short)Math.Floor(min.X * 4.0f); + public short MaxX { get; init; } = (short)Math.Ceiling(max.X * 4.0f); + public short MinY { get; init; } = (short)Math.Floor(min.Y * 4.0f); + public short MaxY { get; init; } = (short)Math.Ceiling(max.Y * 4.0f); + public short MinZ { get; init; } = (short)Math.Floor(min.Z * 4.0f); + public short MaxZ { get; init; } = (short)Math.Ceiling(max.Z * 4.0f); - public Vector3 Min + public readonly Vector3 Min { - get { return new Vector3(MinX / 4.0f, MinY / 4.0f, MinZ / 4.0f); } - set { var v = value * 4.0f; MinX = (short)Math.Floor(v.X); MinY = (short)Math.Floor(v.Y); MinZ = (short)Math.Floor(v.Z); } + get => new Vector3(MinX / 4.0f, MinY / 4.0f, MinZ / 4.0f); + //set + //{ + // var v = value * 4.0f; + // MinX = (short)Math.Floor(v.X); + // MinY = (short)Math.Floor(v.Y); + // MinZ = (short)Math.Floor(v.Z); + //} } - public Vector3 Max + public readonly Vector3 Max { - get { return new Vector3(MaxX / 4.0f, MaxY / 4.0f, MaxZ / 4.0f); } - set { var v = value * 4.0f; MaxX = (short)Math.Ceiling(v.X); MaxY = (short)Math.Ceiling(v.Y); MaxZ = (short)Math.Ceiling(v.Z); } + get => new Vector3(MaxX / 4.0f, MaxY / 4.0f, MaxZ / 4.0f); + //set { + // var v = value * 4.0f; + // MaxX = (short)Math.Ceiling(v.X); + // MaxY = (short)Math.Ceiling(v.Y); + // MaxZ = (short)Math.Ceiling(v.Z); + //} } - public override string ToString() + public override readonly string ToString() { Vector3 min = Min; Vector3 max = Max; - return string.Format("({0}, {1}, {2}) | ({3}, {4}, {5})", min.X, min.Y, min.Z, max.X, max.Y, max.Z); + return $"({min.X}, {min.Y}, {min.Z}) | ({max.X}, {max.Y}, {max.Z})"; //return string.Format("({0}, {1}, {2}) | ({3}, {4}, {5})", MinX, MinY, MinZ, MaxX, MaxY, MaxZ); } } @@ -777,43 +780,35 @@ namespace CodeWalker.GameFiles { public NavMeshEdgePart _Poly1; public NavMeshEdgePart _Poly2; - public NavMeshEdgePart Poly1 { get { return _Poly1; } set { _Poly1 = value; } } - public NavMeshEdgePart Poly2 { get { return _Poly2; } set { _Poly2 = value; } } + public readonly NavMeshEdgePart Poly1 => _Poly1; + public readonly NavMeshEdgePart Poly2 => _Poly2; - public override string ToString() - { - return //Poly1.Bin + " | " + Poly2.Bin + " | " + - _Poly1.ToString() + " | " + _Poly2.ToString(); - } + public override readonly string ToString() => $"{_Poly1} | {_Poly2}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct NavMeshEdgePart + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct NavMeshEdgePart { public uint Value { get; set; } - public string Bin - { - get - { - return Convert.ToString(Value, 2).PadLeft(32, '0'); - } - } + public readonly string Bin => Value.ToString("b32"); - public uint AreaIDInd { get { return (Value >> 0) & 0x1F; } set { Value = (Value & 0xFFFFFFE0) | (value & 0x1F); } } - public uint PolyID { get { return (Value >> 5) & 0x3FFF; } set { Value = (Value & 0xFFF8001F) | ((value & 0x3FFF) << 5); } } - public uint Unk2 { get { return (Value >> 19) & 0x3; } set { Value = (Value & 0xFFE7FFFF) | ((value & 0x3) << 19); } } - public uint Unk3 { get { return (Value >> 21) & 0x7FF; } set { Value = (Value & 0x001FFFFF) | ((value & 0x7FF) << 21); } } + public uint AreaIDInd { readonly get { return (Value >> 0) & 0x1F; } set { Value = (Value & 0xFFFFFFE0) | (value & 0x1F); } } + public uint PolyID { readonly get { return (Value >> 5) & 0x3FFF; } set { Value = (Value & 0xFFF8001F) | ((value & 0x3FFF) << 5); } } + public uint Unk2 { readonly get { return (Value >> 19) & 0x3; } set { Value = (Value & 0xFFE7FFFF) | ((value & 0x3) << 19); } } + public uint Unk3 { readonly get { return (Value >> 21) & 0x7FF; } set { Value = (Value & 0x001FFFFF) | ((value & 0x7FF) << 21); } } - public override string ToString() + public override readonly string ToString() { string pid = (PolyID == 0x3FFF) ? "-" : PolyID.ToString(); - return AreaIDInd.ToString() + ", " + pid + ", " + Unk2.ToString() + ", " + Unk3.ToString(); + return $"{AreaIDInd}, {pid}, {Unk2}, {Unk3}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct NavMeshPoly + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct NavMeshPoly { public ushort PolyFlags0 { get; set; } public ushort IndexFlags { get; set; } @@ -830,52 +825,36 @@ namespace CodeWalker.GameFiles //public int IndexUnk { get { return (IndexFlags >> 0) & 31; } } //always 0 - public int IndexCount { get { return (IndexFlags >> 5); } set { IndexFlags = (ushort)((IndexFlags & 31) | ((value & 0x7FF) << 5)); } } + public int IndexCount { readonly get { return (IndexFlags >> 5); } set { IndexFlags = (ushort)((IndexFlags & 31) | ((value & 0x7FF) << 5)); } } //public int PartUnk1 { get { return (PartFlags >> 0) & 0xF; } } //always 0 - public ushort PartID { get { return (ushort)((PartFlags >> 4) & 0xFF); } set { PartFlags = ((PartFlags & 0xFFFFF00F) | (((uint)value & 0xFF) << 4)); } } - public byte PortalLinkCount { get { return (byte)((PartFlags >> 12) & 0x7); } set { PartFlags = ((PartFlags & 0xFFFF8FFF) | (((uint)value & 0x7) << 12)); } } - public uint PortalLinkID { get { return ((PartFlags >> 15) & 0x1FFFF); } set { PartFlags = ((PartFlags & 0x7FFF) | ((value & 0x1FFFF) << 15)); } } + public ushort PartID { readonly get { return (ushort)((PartFlags >> 4) & 0xFF); } set { PartFlags = ((PartFlags & 0xFFFFF00F) | (((uint)value & 0xFF) << 4)); } } + public byte PortalLinkCount { readonly get { return (byte)((PartFlags >> 12) & 0x7); } set { PartFlags = ((PartFlags & 0xFFFF8FFF) | (((uint)value & 0x7) << 12)); } } + public uint PortalLinkID { readonly get { return ((PartFlags >> 15) & 0x1FFFF); } set { PartFlags = ((PartFlags & 0x7FFF) | ((value & 0x1FFFF) << 15)); } } - public byte UnkX { get { return (byte)((PolyFlags2 >> 0) & 0xFF); } set { PolyFlags2 = (PolyFlags2 & 0xFFFFFF00) | ((value & 0xFFu)<<0); } } - public byte UnkY { get { return (byte)((PolyFlags2 >> 8) & 0xFF); } set { PolyFlags2 = (PolyFlags2 & 0xFFFF00FF) | ((value & 0xFFu)<<8); } } + public byte UnkX { readonly get { return (byte)((PolyFlags2 >> 0) & 0xFF); } set { PolyFlags2 = (PolyFlags2 & 0xFFFFFF00) | ((value & 0xFFu)<<0); } } + public byte UnkY { readonly get { return (byte)((PolyFlags2 >> 8) & 0xFF); } set { PolyFlags2 = (PolyFlags2 & 0xFFFF00FF) | ((value & 0xFFu)<<8); } } - public byte Flags1 { get { return (byte)(PolyFlags0 & 0xFF); } set { PolyFlags0 = (ushort)((PolyFlags0 & 0xFF00) | (value & 0xFF)); } } - public byte Flags2 { get { return (byte)((PolyFlags1 >> 0) & 0xFF); } set { PolyFlags1 = ((PolyFlags1 & 0xFFFFFF00u) | ((value & 0xFFu) << 0)); } } - public byte Flags3 { get { return (byte)((PolyFlags1 >> 9) & 0xFF); } set { PolyFlags1 = ((PolyFlags1 & 0xFFFE01FFu) | ((value & 0xFFu) << 9)); } } - public byte Flags4 { get { return (byte)((PolyFlags2 >> 16) & 0xFF); } set { PolyFlags2 = ((PolyFlags2 & 0xFF00FFFFu) | ((value & 0xFFu) << 16)); } } + public byte Flags1 { readonly get { return (byte)(PolyFlags0 & 0xFF); } set { PolyFlags0 = (ushort)((PolyFlags0 & 0xFF00) | (value & 0xFF)); } } + public byte Flags2 { readonly get { return (byte)((PolyFlags1 >> 0) & 0xFF); } set { PolyFlags1 = ((PolyFlags1 & 0xFFFFFF00u) | ((value & 0xFFu) << 0)); } } + public byte Flags3 { readonly get { return (byte)((PolyFlags1 >> 9) & 0xFF); } set { PolyFlags1 = ((PolyFlags1 & 0xFFFE01FFu) | ((value & 0xFFu) << 9)); } } + public byte Flags4 { readonly get { return (byte)((PolyFlags2 >> 16) & 0xFF); } set { PolyFlags2 = ((PolyFlags2 & 0xFF00FFFFu) | ((value & 0xFFu) << 16)); } } //public uint UnkFlags0 { get { return (uint)((PolyFlags0 >> 8) & 0xFF); } } //always 0 //public uint UnkFlags1 { get { return (uint)((PolyFlags1 >> 17) & 0xFFFF); } } //always 0 //public uint UnkFlags2 { get { return (uint)((PolyFlags2 >> 24) & 0xFF); } } //always 0 - public override string ToString() - { - return - PolyFlags0.ToString() + ", " + - //IndexFlags.ToString() + ", " + - IndexCount.ToString() + ", " + //IndexUnk.ToString() + ", " + - IndexID.ToString() + ", " + AreaID.ToString() + ", " + - CellAABB.ToString() + ", " + - //PolyFlags1.ToString() + ", " + - //PolyFlags2.ToString() + ", " + - //PartFlags.ToString() + ", " + //PartUnk1.ToString() + ", " + - PartID.ToString() + ", " + - PortalLinkCount.ToString() + ", " + - PortalLinkID.ToString(); - } + public override readonly string ToString() => $"{PolyFlags0}, {IndexCount}, {IndexID}, {AreaID}, {CellAABB}, {PartID}, {PortalLinkCount}, {PortalLinkID}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class NavMeshSector : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class NavMeshSector : ResourceSystemBlock { - public override long BlockLength - { - get { return 96; } - } + public override long BlockLength => 96; public Vector4 AABBMin { get; set; } //W==NaN public Vector4 AABBMax { get; set; } //W==NaN @@ -913,7 +892,8 @@ namespace CodeWalker.GameFiles { get { - if (Data == null) return 0; + if (Data == null) + return 0; return Data.PointsCount; } } @@ -976,22 +956,17 @@ namespace CodeWalker.GameFiles { AABBMin = new Vector4(min, float.NaN); AABBMax = new Vector4(max, float.NaN); - CellAABB = new NavMeshAABB() { Min = min, Max = max }; + CellAABB = new NavMeshAABB(in min, in max); } - public override string ToString() - { - return "[Min: "+AABBMin.ToString() + "], [Max:" + AABBMax.ToString() + "]"; - } + public override string ToString() => $"[Min: {AABBMin}], [Max:{AABBMax}]"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class NavMeshSectorData : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class NavMeshSectorData : ResourceSystemBlock { - public override long BlockLength - { - get { return 32; } - } + public override long BlockLength => 32; public uint PointsStartID { get; set; } public uint Unused_04h { get; set; } // 0x00000000 @@ -1004,8 +979,8 @@ namespace CodeWalker.GameFiles public ushort[] PolyIDs { get; set; } public NavMeshPoint[] Points { get; set; } - public ResourceSystemStructBlock PolyIDsBlock = null; - public ResourceSystemStructBlock PointsBlock = null; + public ResourceSystemStructBlock? PolyIDsBlock = null; + public ResourceSystemStructBlock? PointsBlock = null; public override void Read(ResourceDataReader reader, params object[] parameters) { @@ -1043,12 +1018,12 @@ namespace CodeWalker.GameFiles { var list = new List(); - if ((PolyIDs != null) && (PolyIDs.Length > 0)) + if (PolyIDs != null && PolyIDs.Length > 0) { PolyIDsBlock = new ResourceSystemStructBlock(PolyIDs); list.Add(PolyIDsBlock); } - if ((Points != null) && (Points.Length > 0)) + if (Points != null && Points.Length > 0) { PointsBlock = new ResourceSystemStructBlock(Points); list.Add(PointsBlock); @@ -1060,7 +1035,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return "(Polys: " + PolyIDsCount.ToString() + ", PointsCount: " + PointsCount.ToString() + ", PointsStartID: " + PointsStartID.ToString() + ")"; + return $"(Polys: {PolyIDsCount}, PointsCount: {PointsCount}, PointsStartID: {PointsStartID})"; } } @@ -1075,7 +1050,7 @@ namespace CodeWalker.GameFiles public Vector3 Position { - get + readonly get { const float usmax = ushort.MaxValue; return new Vector3(X / usmax, Y / usmax, Z / usmax); @@ -1089,9 +1064,9 @@ namespace CodeWalker.GameFiles } } - public override string ToString() + public override readonly string ToString() { - return Type.ToString() + ": " + Angle.ToString() + ", " + Position.ToString(); + return $"{Type}: {Angle}, {Position}"; } @@ -1099,7 +1074,8 @@ namespace CodeWalker.GameFiles - [TypeConverter(typeof(ExpandableObjectConverter))] public struct NavMeshPortal + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct NavMeshPortal { public byte Type { get; set; }//1,2,3 public byte Angle { get; set; } @@ -1112,18 +1088,11 @@ namespace CodeWalker.GameFiles public ushort PolyIDTo2 { get; set; } //always same as PolyIDTo1 public uint AreaFlags { get; set; } - public ushort AreaIDFrom { get { return (ushort)(AreaFlags & 0x3FFF); } set { AreaFlags = (AreaFlags & 0xFFFFC000) | (value & 0x3FFFu); } }//always Ynv.AreaID - public ushort AreaIDTo { get { return (ushort)((AreaFlags >> 14) & 0x3FFF); } set { AreaFlags = (AreaFlags & 0xF0003FFF) | ((value & 0x3FFFu) << 14); } }//always Ynv.AreaID - public byte AreaUnk { get { return (byte)((AreaFlags >> 28) & 0xF); } set { AreaFlags = (AreaFlags & 0x0FFFFFFF) | ((value & 0xFu) << 28); } }//always 0 + public ushort AreaIDFrom { readonly get { return (ushort)(AreaFlags & 0x3FFF); } set { AreaFlags = (AreaFlags & 0xFFFFC000) | (value & 0x3FFFu); } }//always Ynv.AreaID + public ushort AreaIDTo { readonly get { return (ushort)((AreaFlags >> 14) & 0x3FFF); } set { AreaFlags = (AreaFlags & 0xF0003FFF) | ((value & 0x3FFFu) << 14); } }//always Ynv.AreaID + public byte AreaUnk { readonly get { return (byte)((AreaFlags >> 28) & 0xF); } set { AreaFlags = (AreaFlags & 0x0FFFFFFF) | ((value & 0xFu) << 28); } }//always 0 - public override string ToString() - { - return AreaIDFrom.ToString() + ", " + AreaIDTo.ToString() + ", " + AreaUnk.ToString() + ", " + - PolyIDFrom1.ToString() + ", " + PolyIDFrom2.ToString() + ", " + - PolyIDTo1.ToString() + ", " + PolyIDTo2.ToString() + ", " + - Type.ToString() + ", " + Angle.ToString() + ", " + FlagsUnk.ToString() + ", " + - "(" + PositionFrom.ToString() + " | " + PositionTo.ToString() + ")"; - } + public override readonly string ToString() => $"{AreaIDFrom}, {AreaIDTo}, {AreaUnk}, {PolyIDFrom1}, {PolyIDFrom2}, {PolyIDTo1}, {PolyIDTo2}, {Type}, {Angle}, {FlagsUnk}, ({PositionFrom} | {PositionTo})"; } diff --git a/CodeWalker.Core/GameFiles/Resources/Node.cs b/CodeWalker.Core/GameFiles/Resources/Node.cs index 6d24ead..62a0635 100644 --- a/CodeWalker.Core/GameFiles/Resources/Node.cs +++ b/CodeWalker.Core/GameFiles/Resources/Node.cs @@ -23,6 +23,7 @@ //mangled to fit +using Collections.Pooled; using SharpDX; using System; using System.Collections.Generic; @@ -36,10 +37,7 @@ namespace CodeWalker.GameFiles { [TypeConverter(typeof(ExpandableObjectConverter))] public class NodeDictionary : ResourceFileBase, IMetaXmlItem { - public override long BlockLength - { - get { return 112; } - } + public override long BlockLength => 112; public ulong NodesPointer { get; set; } public uint NodesCount { get; set; } @@ -62,18 +60,18 @@ namespace CodeWalker.GameFiles public uint Unk68 { get; set; } // 0x00000000 public uint Unk6C { get; set; } // 0x00000000 - public Node[] Nodes { get; set; } - public NodeLink[] Links { get; set; } - public NodeJunction[] Junctions { get; set; } - public byte[] JunctionHeightmapBytes { get; set; } - public NodeJunctionRef[] JunctionRefs { get; set; } + public Node[]? Nodes { get; set; } + public NodeLink[]? Links { get; set; } + public NodeJunction[]? Junctions { get; set; } + public byte[]? JunctionHeightmapBytes { get; set; } + public NodeJunctionRef[]? JunctionRefs { get; set; } - private ResourceSystemStructBlock NodesBlock = null; - private ResourceSystemStructBlock LinksBlock = null; - private ResourceSystemStructBlock JunctionsBlock = null; - private ResourceSystemStructBlock JunctionHeightmapBytesBlock = null; - private ResourceSystemStructBlock JunctionRefsBlock = null; + private ResourceSystemStructBlock? NodesBlock = null; + private ResourceSystemStructBlock? LinksBlock = null; + private ResourceSystemStructBlock? JunctionsBlock = null; + private ResourceSystemStructBlock? JunctionHeightmapBytesBlock = null; + private ResourceSystemStructBlock? JunctionRefsBlock = null; @@ -155,29 +153,29 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(base.GetReferences()); + using var list = new PooledList(base.GetReferences()); - if ((JunctionRefs != null) && (JunctionRefs.Length > 0)) + if (JunctionRefs is not null && JunctionRefs.Length > 0) { JunctionRefsBlock = new ResourceSystemStructBlock(JunctionRefs); list.Add(JunctionRefsBlock); } - if ((JunctionHeightmapBytes != null) && (JunctionHeightmapBytes.Length > 0)) + if (JunctionHeightmapBytes is not null && JunctionHeightmapBytes.Length > 0) { JunctionHeightmapBytesBlock = new ResourceSystemStructBlock(JunctionHeightmapBytes); list.Add(JunctionHeightmapBytesBlock); } - if ((Junctions != null) && (Junctions.Length > 0)) + if (Junctions is not null && Junctions.Length > 0) { JunctionsBlock = new ResourceSystemStructBlock(Junctions); list.Add(JunctionsBlock); } - if ((Links != null) && (Links.Length > 0)) + if (Links is not null && Links.Length > 0) { LinksBlock = new ResourceSystemStructBlock(Links); list.Add(LinksBlock); } - if ((Nodes != null) && (Nodes.Length > 0)) + if (Nodes is not null && Nodes.Length > 0) { NodesBlock = new ResourceSystemStructBlock(Nodes); list.Add(NodesBlock); @@ -195,7 +193,7 @@ namespace CodeWalker.GameFiles YndXml.ValueTag(sb, indent, "VehicleNodeCount", NodesCountVehicle.ToString()); YndXml.ValueTag(sb, indent, "PedNodeCount", NodesCountPed.ToString()); - XmlNodeWrapper[] nodes = null; + XmlNodeWrapper[]? nodes = null; int nodecount = Nodes?.Length ?? 0; if (nodecount > 0) { @@ -208,7 +206,7 @@ namespace CodeWalker.GameFiles YndXml.WriteItemArray(sb, nodes, indent, "Nodes"); - XmlJunctionWrapper[] juncs = null; + XmlJunctionWrapper[]? juncs = null; int junccount = Junctions?.Length ?? 0; if (junccount > 0) { @@ -337,7 +335,8 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct Node + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct Node { public uint Unused0 { get; set; } // 0x00000000 public uint Unused1 { get; set; } // 0x00000000 @@ -358,7 +357,7 @@ namespace CodeWalker.GameFiles public FlagsByte Flags3 { get; set; } public FlagsByte Flags4 { get; set; } - public override string ToString() + public override readonly string ToString() { //return Unused0.ToString() + ", " + Unused1.ToString() + ", " + Unused2.ToString() + ", " + // Unused3.ToString() + ", " + AreaID.ToString() + ", " + NodeID.ToString() + ", " + @@ -366,7 +365,7 @@ namespace CodeWalker.GameFiles // PositionX.ToString() + ", " + PositionY.ToString() + ", " + Unk20.ToString() + ", " + Unk21.ToString() + ", " + // Unk22.ToString() + ", " + Unk24.ToString() + ", " + Unk26.ToString(); - return AreaID.ToString() + ", " + NodeID.ToString() + ", " + StreetName.ToString();// + ", X:" + + return $"{AreaID}, {NodeID}, {StreetName}";// + ", X:" + //PositionX.ToString() + ", Y:" + PositionY.ToString() + ", " + PositionZ.ToString();// + ", " + //Flags0.ToString() + ", " + Flags1.ToString() + ", Z:" + //Flags2.ToString() + ", " + LinkCountFlags.ToString() + ", " + @@ -374,7 +373,7 @@ namespace CodeWalker.GameFiles } - public void WriteXml(StringBuilder sb, int indent, NodeLink[] allLinks) + public readonly void WriteXml(StringBuilder sb, int indent, NodeLink[] allLinks) { Vector3 p = new Vector3(); p.X = PositionX / 4.0f; @@ -449,9 +448,9 @@ namespace CodeWalker.GameFiles public FlagsByte Flags2 { get; set; } public FlagsByte LinkLength { get; set; } - public override string ToString() + public override readonly string ToString() { - return AreaID.ToString() + ", " + NodeID.ToString() + ", " + Flags0.Value.ToString() + ", " + Flags1.Value.ToString() + ", " + Flags2.Value.ToString() + ", " + LinkLength.Value.ToString(); + return $"{AreaID}, {NodeID}, {Flags0.Value}, {Flags1.Value}, {Flags2.Value}, {LinkLength.Value}"; } public void WriteXml(StringBuilder sb, int indent) @@ -486,7 +485,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return PositionX.ToString() + ", " + PositionY.ToString() + ": " + MinZ.ToString() + ", " + MaxZ.ToString() + ": " + HeightmapDimX.ToString() + " x " + HeightmapDimY.ToString(); + return $"{PositionX}, {PositionY}: {MinZ}, {MaxZ}: {HeightmapDimX} x {HeightmapDimY}"; } public void WriteXml(StringBuilder sb, int indent, byte[] allHeightmapData) @@ -544,7 +543,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return AreaID.ToString() + ", " + NodeID.ToString() + ", " + JunctionID.ToString(); + return $"{AreaID}, {NodeID}, {JunctionID}"; } public void WriteXml(StringBuilder sb, int indent) diff --git a/CodeWalker.Core/GameFiles/Resources/Particle.cs b/CodeWalker.Core/GameFiles/Resources/Particle.cs index 03b3bff..8c6653a 100644 --- a/CodeWalker.Core/GameFiles/Resources/Particle.cs +++ b/CodeWalker.Core/GameFiles/Resources/Particle.cs @@ -453,11 +453,11 @@ namespace CodeWalker.GameFiles ParticleRules.data_items = rules.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, ParticleRuleNameHashes), - new Tuple(0x30, ParticleRules) + return new (long, IResourceBlock)[] { + (0x20, ParticleRuleNameHashes), + (0x30, ParticleRules) }; } } @@ -551,11 +551,11 @@ namespace CodeWalker.GameFiles EffectRules.data_items = rules.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, EffectRuleNameHashes), - new Tuple(0x30, EffectRules) + return new (long, IResourceBlock)[] { + (0x20, EffectRuleNameHashes), + (0x30, EffectRules) }; } } @@ -652,11 +652,11 @@ namespace CodeWalker.GameFiles EmitterRules.data_items = rules.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, EmitterRuleNameHashes), - new Tuple(0x30, EmitterRules) + return new (long, IResourceBlock)[] { + (0x20, EmitterRuleNameHashes), + (0x30, EmitterRules) }; } } @@ -1439,19 +1439,19 @@ namespace CodeWalker.GameFiles return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(88, Spawner1), - new Tuple(96, Spawner2), - new Tuple(0x128, BehaviourList1), - new Tuple(0x138, BehaviourList2), - new Tuple(0x148, BehaviourList3), - new Tuple(0x158, BehaviourList4), - new Tuple(0x168, BehaviourList5), - new Tuple(0x188, UnknownList1), - new Tuple(0x1F0, ShaderVars), - new Tuple(0x210, Drawables) + return new (long, IResourceBlock)[] { + (88, Spawner1), + (96, Spawner2), + (0x128, BehaviourList1), + (0x138, BehaviourList2), + (0x148, BehaviourList3), + (0x158, BehaviourList4), + (0x168, BehaviourList5), + (0x188, UnknownList1), + (0x1F0, ShaderVars), + (0x210, Drawables) }; } @@ -1556,10 +1556,10 @@ namespace CodeWalker.GameFiles Unknown_40h.data_items = XmlMeta.ReadHashItemArray(node, "Unknown40"); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x40, Unknown_40h) + return new (long, IResourceBlock)[] { + (0x40, Unknown_40h) }; } @@ -2685,14 +2685,14 @@ namespace CodeWalker.GameFiles return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(192, KeyframeProp0), - new Tuple(336, KeyframeProp1), - new Tuple(480, KeyframeProp2), - new Tuple(624, KeyframeProp3), - new Tuple(768, KeyframeProp4) + return new (long, IResourceBlock)[] { + (192, KeyframeProp0), + (336, KeyframeProp1), + (480, KeyframeProp2), + (624, KeyframeProp3), + (768, KeyframeProp4) }; } @@ -3134,12 +3134,12 @@ namespace CodeWalker.GameFiles } } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0, EventEmitterFlags), - new Tuple(0x10, Unknown_10h), - new Tuple(0x28, Unknown_28h) + return new (long, IResourceBlock)[] { + (0, EventEmitterFlags), + (0x10, Unknown_10h), + (0x28, Unknown_28h) }; } @@ -3307,10 +3307,10 @@ namespace CodeWalker.GameFiles Unknown_0h.data_items = XmlMeta.ReadItemArray(node, "Items"); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0, Unknown_0h) + return new (long, IResourceBlock)[] { + (0, Unknown_0h) }; } @@ -3397,10 +3397,10 @@ namespace CodeWalker.GameFiles Unknown_0h.data_items = XmlMeta.ReadItemArray(node, "Keyframes"); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0, Unknown_0h) + return new (long, IResourceBlock)[] { + (0, Unknown_0h) }; } @@ -3675,19 +3675,19 @@ namespace CodeWalker.GameFiles return list.ToArray(); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(120, KeyframeProps1[0]), - new Tuple(264, KeyframeProps1[1]), - new Tuple(408, KeyframeProps1[2]), - new Tuple(552, KeyframeProps1[3]), - new Tuple(696, KeyframeProps1[4]), - new Tuple(840, KeyframeProps1[5]), - new Tuple(984, KeyframeProps1[6]), - new Tuple(1128, KeyframeProps1[7]), - new Tuple(1272, KeyframeProps1[8]), - new Tuple(1416, KeyframeProps1[9]), + return new (long, IResourceBlock)[] { + (120, KeyframeProps1[0]), + (264, KeyframeProps1[1]), + (408, KeyframeProps1[2]), + (552, KeyframeProps1[3]), + (696, KeyframeProps1[4]), + (840, KeyframeProps1[5]), + (984, KeyframeProps1[6]), + (1128, KeyframeProps1[7]), + (1272, KeyframeProps1[8]), + (1416, KeyframeProps1[9]), }; } @@ -3728,13 +3728,15 @@ namespace CodeWalker.GameFiles public override string ToString() { var str = ParticleKeyframeProp.GetName(Hash); - if (!string.IsNullOrEmpty(str)) return str; + if (!string.IsNullOrEmpty(str)) + return str; return YptXml.HashString((MetaHash)Hash); } public string ToCleanString() { - if (Hash == 0) return string.Empty; + if (Hash == 0) + return string.Empty; return ToString(); } @@ -3754,7 +3756,8 @@ namespace CodeWalker.GameFiles } - [TC(typeof(EXP))] public class ParticleKeyframeProp : ResourceSystemBlock, IMetaXmlItem + [TC(typeof(EXP))] + public class ParticleKeyframeProp : ResourceSystemBlock, IMetaXmlItem { // datBase // ptxKeyframeProp @@ -3917,16 +3920,16 @@ namespace CodeWalker.GameFiles } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x70, Values) + return new (long, IResourceBlock)[] { + (0x70, Values) }; } public override string ToString() { - return Name.ToString() + " (" + (Values?.data_items?.Length ?? 0).ToString() + " values)"; + return $"{Name} ({ Values?.data_items?.Length ?? 0} values)"; } @@ -4014,10 +4017,12 @@ namespace CodeWalker.GameFiles d[0x851d3d14] = "ptxAttractorDomain:m_sizeInnerKFP"; NameDict = d; } + if (NameDict.TryGetValue(hash, out string str)) { return str; } + return YptXml.HashString((MetaHash)hash); } private static Dictionary NameDict; @@ -4193,7 +4198,8 @@ namespace CodeWalker.GameFiles Attractor = 3, } - [TC(typeof(EXP))] public class ParticleDomain : ResourceSystemBlock, IResourceXXSystemBlock, IMetaXmlItem + [TC(typeof(EXP))] + public class ParticleDomain : ResourceSystemBlock, IResourceXXSystemBlock, IMetaXmlItem { // datBase // ptxDomain @@ -4397,21 +4403,21 @@ namespace CodeWalker.GameFiles } public static void WriteXmlNode(ParticleDomain d, StringBuilder sb, int indent, string name) { - if (d != null) + if (d is not null) { YptXml.OpenTag(sb, indent, name); d.WriteXml(sb, indent + 1); YptXml.CloseTag(sb, indent, name); } } - public static ParticleDomain ReadXmlNode(XmlNode node) + public static ParticleDomain? ReadXmlNode(XmlNode node) { if (node != null) { var typestr = Xml.GetChildStringAttribute(node, "Type"); var type = Xml.GetEnumValue(typestr); var s = Create(type); - if (s != null) + if (s is not null) { s.ReadXml(node); } @@ -4420,19 +4426,19 @@ namespace CodeWalker.GameFiles return null; } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { KeyframeProps.ManualCountOverride = true; KeyframeProps.ManualReferenceOverride = true; KeyframeProps.EntriesCount = 4; KeyframeProps.EntriesCapacity = 16; - return new Tuple[] { - new Tuple(24, KeyframeProp0), - new Tuple(168, KeyframeProp1), - new Tuple(312, KeyframeProp2), - new Tuple(456, KeyframeProp3), - new Tuple(0x260, KeyframeProps) + return new (long, IResourceBlock)[] { + (24, KeyframeProp0), + (168, KeyframeProp1), + (312, KeyframeProp2), + (456, KeyframeProp3), + (0x260, KeyframeProps) }; } @@ -4591,14 +4597,14 @@ namespace CodeWalker.GameFiles YptXml.CloseTag(sb, indent, name); } } - public static ParticleBehaviour ReadXmlNode(XmlNode node) + public static ParticleBehaviour? ReadXmlNode(XmlNode node) { if (node != null) { var typestr = Xml.GetChildStringAttribute(node, "Type"); var type = Xml.GetEnumValue(typestr); var s = Create(type); - if (s != null) + if (s is not null) { s.ReadXml(node); } @@ -4673,10 +4679,10 @@ namespace CodeWalker.GameFiles } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x10, KeyframeProps) + return new (long, IResourceBlock)[] { + (0x10, KeyframeProps) }; } @@ -4814,12 +4820,12 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x10, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1) + return new (long, IResourceBlock)[] { + (0x10, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1) }; } } @@ -5011,14 +5017,14 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1, KeyframeProp2, KeyframeProp3); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1), - new Tuple(336, KeyframeProp2), - new Tuple(480, KeyframeProp3) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1), + (336, KeyframeProp2), + (480, KeyframeProp3) }; } } @@ -5154,14 +5160,14 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1, KeyframeProp2, KeyframeProp3); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1), - new Tuple(336, KeyframeProp2), - new Tuple(480, KeyframeProp3) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1), + (336, KeyframeProp2), + (480, KeyframeProp3) }; } } @@ -5263,12 +5269,12 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1) }; } } @@ -5344,11 +5350,11 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0) }; } } @@ -5496,12 +5502,12 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1) }; } } @@ -5622,11 +5628,11 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0) }; } } @@ -5746,13 +5752,13 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1, KeyframeProp2); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1), - new Tuple(336, KeyframeProp2) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1), + (336, KeyframeProp2) }; } } @@ -6146,11 +6152,11 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0) }; } } @@ -6405,19 +6411,19 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1, KeyframeProp2, KeyframeProp3, KeyframeProp4, KeyframeProp5, KeyframeProp6, KeyframeProp7, KeyframeProp8); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1), - new Tuple(336, KeyframeProp2), - new Tuple(480, KeyframeProp3), - new Tuple(624, KeyframeProp4), - new Tuple(768, KeyframeProp5), - new Tuple(912, KeyframeProp6), - new Tuple(1056, KeyframeProp7), - new Tuple(1200, KeyframeProp8) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1), + (336, KeyframeProp2), + (480, KeyframeProp3), + (624, KeyframeProp4), + (768, KeyframeProp5), + (912, KeyframeProp6), + (1056, KeyframeProp7), + (1200, KeyframeProp8) }; } } @@ -6706,12 +6712,12 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1) }; } } @@ -6825,12 +6831,12 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1) }; } } @@ -6956,14 +6962,14 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1, KeyframeProp2, KeyframeProp3); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1), - new Tuple(336, KeyframeProp2), - new Tuple(480, KeyframeProp3) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1), + (336, KeyframeProp2), + (480, KeyframeProp3) }; } } @@ -7016,11 +7022,11 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0) }; } } @@ -7215,11 +7221,11 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0) }; } } @@ -7415,17 +7421,17 @@ namespace CodeWalker.GameFiles CreateKeyframeProps(KeyframeProp0, KeyframeProp1, KeyframeProp2, KeyframeProp3, KeyframeProp4, KeyframeProp5, KeyframeProp6); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, KeyframeProps), - new Tuple(48, KeyframeProp0), - new Tuple(192, KeyframeProp1), - new Tuple(336, KeyframeProp2), - new Tuple(480, KeyframeProp3), - new Tuple(624, KeyframeProp4), - new Tuple(768, KeyframeProp5), - new Tuple(912, KeyframeProp6) + return new (long, IResourceBlock)[] { + (16, KeyframeProps), + (48, KeyframeProp0), + (192, KeyframeProp1), + (336, KeyframeProp2), + (480, KeyframeProp3), + (624, KeyframeProp4), + (768, KeyframeProp5), + (912, KeyframeProp6) }; } } @@ -8113,8 +8119,10 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(base.GetReferences()); - if (Texture != null) list.Add(Texture); - if (TextureName != null) list.Add(TextureName); + if (Texture != null) + list.Add(Texture); + if (TextureName != null) + list.Add(TextureName); return list.ToArray(); } } @@ -8199,10 +8207,10 @@ namespace CodeWalker.GameFiles Items.data_items = XmlMeta.ReadItemArray(node, "Items"); } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x28, Items) + return new (long, IResourceBlock)[] { + (0x28, Items) }; } } diff --git a/CodeWalker.Core/GameFiles/Resources/PedsFiles.cs b/CodeWalker.Core/GameFiles/Resources/PedsFiles.cs new file mode 100644 index 0000000..e5b917c --- /dev/null +++ b/CodeWalker.Core/GameFiles/Resources/PedsFiles.cs @@ -0,0 +1,158 @@ +using CodeWalker.GameFiles; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CodeWalker.Core.GameFiles.Resources +{ + public class CustomTypeConverter : ExpandableObjectConverter + { + public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext? context, object value, Attribute[]? attributes) + { + Console.WriteLine($"{context}: {value}"); + + var properties = TypeDescriptor.GetProperties(value, attributes); + + Console.WriteLine(properties); + + return properties; + } + } + + public class DictionaryTypeConverter : ExpandableObjectConverter + { + public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext? context, object value, Attribute[]? attributes) + { + Console.WriteLine($"{context}: {value}"); + + var properties = TypeDescriptor.GetProperties(value, attributes); + + if (value is IDictionary dict) + { + foreach (var v in dict) + { + properties.Add(TypeDescriptor.GetDefaultProperty(v.Value)); + } + } + + + Console.WriteLine(properties); + + return properties; + } + } + + + public class DictionaryConvert : TypeConverter + { + public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext? context, object value, Attribute[]? attributes) + { + Console.WriteLine($"{context}: {value}"); + + var properties = TypeDescriptor.GetProperties(value, attributes); + + Console.WriteLine(properties); + + return properties; + } + } + + + [TypeConverter(typeof(CustomTypeConverter))] + public class PedsDlcFiles + { + public MetaHash DlcName { get; set; } + public PedsDlcFiles(MetaHash dlcName) + { + DlcName = dlcName; + } + [Browsable(true)] + public PedFile PedFile { get; set; } + [Browsable(true)] + public ConcurrentDictionary Drawables { get; set; } = new ConcurrentDictionary(); + [Browsable(true)] + public ConcurrentDictionary TextureDicts { get; set; } = new ConcurrentDictionary(); + [Browsable(true)] + public ConcurrentDictionary ClothDicts { get; set; } = new ConcurrentDictionary(); + + public int Index + { + get { + if (!GameFileCache.Instance.DlcNameLookup.TryGetValue(DlcName, out var dlcName)) + { + return -1; + } + + return GameFileCache.Instance.DlcNameList.FindIndex(0, (value) => value.Equals(dlcName, StringComparison.OrdinalIgnoreCase)); + } + } + } + + [TypeConverter(typeof(CustomTypeConverter))] + public class PedsFiles + { + [Browsable(true)] + [TypeConverter(typeof(DictionaryTypeConverter))] + public ConcurrentDictionary Dlcs { get; set; } = new ConcurrentDictionary(); + [Browsable(true)] + [TypeConverter(typeof(CollectionConverter))] + public ICollection Ymts { get; set; } = new HashSet(GameFileByPathComparer.Instance); + + public string kaas = "Kaas"; + + public PedsDlcFiles GetPedsDlcFiles(PedFile pedFile) + { + var pedsDlcFiles = GetPedsDlcFiles(pedFile.DlcName); + pedsDlcFiles.PedFile = pedFile; + return pedsDlcFiles; + } + + public PedsDlcFiles GetPedsDlcFiles(MetaHash dlcName) + { + if (!Dlcs.TryGetValue(dlcName, out var pedsFiles)) + { + _ = Dlcs.TryAdd(dlcName, new PedsDlcFiles(dlcName)); + + pedsFiles = Dlcs[dlcName]; + } + + return pedsFiles; + } + + public bool TryGetPedsDlcFiles(PedFile pedFile, out PedsDlcFiles pedsDlcFiles) + { + return TryGetPedsDlcFiles(pedFile.DlcName, out pedsDlcFiles); + } + + public bool TryGetPedsDlcFiles(MetaHash dlcName, out PedsDlcFiles pedsDlcFiles) + { + return Dlcs.TryGetValue(dlcName, out pedsDlcFiles); + } + + public void AddDrawable(PedFile pedFile, RpfFileEntry entry) + { + var pedsFiles = GetPedsDlcFiles(pedFile); + + pedsFiles.Drawables.TryAdd(entry.ShortNameHash, entry); + } + + public void AddTextureDict(PedFile pedFile, RpfFileEntry entry) + { + var pedsFiles = GetPedsDlcFiles(pedFile); + + pedsFiles.TextureDicts.TryAdd(entry.ShortNameHash, entry); + } + + public void AddClothsDict(PedFile pedFile, RpfFileEntry entry) + { + var pedsFiles = GetPedsDlcFiles(pedFile); + + pedsFiles.ClothDicts.TryAdd(entry.ShortNameHash, entry); + } + } +} diff --git a/CodeWalker.Core/GameFiles/Resources/ResourceAnalyzer.cs b/CodeWalker.Core/GameFiles/Resources/ResourceAnalyzer.cs index 6cb556a..9d2b095 100644 --- a/CodeWalker.Core/GameFiles/Resources/ResourceAnalyzer.cs +++ b/CodeWalker.Core/GameFiles/Resources/ResourceAnalyzer.cs @@ -63,6 +63,7 @@ namespace CodeWalker.GameFiles GraphicsPages = FileEntry?.GraphicsFlags.Pages; var dlist = new List(); +#if DEBUG foreach (var kvp in reader.blockPool) { var item = new ResourceAnalyzerItem(); @@ -98,6 +99,7 @@ namespace CodeWalker.GameFiles } dlist.Add(item); } +#endif dlist.Sort((a, b) => a.Position.CompareTo(b.Position)); diff --git a/CodeWalker.Core/GameFiles/Resources/ResourceBaseTypes.cs b/CodeWalker.Core/GameFiles/Resources/ResourceBaseTypes.cs index e14e037..dd59078 100644 --- a/CodeWalker.Core/GameFiles/Resources/ResourceBaseTypes.cs +++ b/CodeWalker.Core/GameFiles/Resources/ResourceBaseTypes.cs @@ -23,8 +23,13 @@ //shamelessly stolen and mangled +using CodeWalker.Core.Utils; +using Collections.Pooled; +using CommunityToolkit.HighPerformance; using SharpDX; using System; +using System.Buffers; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Linq; @@ -37,17 +42,15 @@ namespace CodeWalker.GameFiles - [TypeConverter(typeof(ExpandableObjectConverter))] public class string_r : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class string_r : ResourceSystemBlock { // Represents a string that can be referenced in a resource structure. /// /// Gets the length of the string. /// - public override long BlockLength - { - get { return Value.Length + 1; } - } + public override long BlockLength => Value.Length + 1; /// /// Gets or sets the string value. @@ -71,22 +74,22 @@ namespace CodeWalker.GameFiles public static explicit operator string_r(string value) { - var x = new string_r(); - x.Value = value; + var x = new string_r + { + Value = value + }; return x; } - public override string ToString() - { - return Value; - } + public override string ToString() => Value; } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct Matrix3_s + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct Matrix3_s { - public Vector4 Row1 { get; set; } - public Vector4 Row2 { get; set; } - public Vector4 Row3 { get; set; } + public Vector4 Row1 { get; init; } + public Vector4 Row2 { get; init; } + public Vector4 Row3 { get; init; } // structure data //public float Unknown_01 { get; set; } @@ -118,23 +121,24 @@ namespace CodeWalker.GameFiles Row3 = new Vector4(0, 0, 1, 0); } } - public float[] ToArray() + public readonly float[] ToArray() { - return new[] { Row1.X, Row1.Y, Row1.Z, Row1.W, Row2.X, Row2.Y, Row2.Z, Row2.W, Row3.X, Row3.Y, Row3.Z, Row3.W }; + return [Row1.X, Row1.Y, Row1.Z, Row1.W, Row2.X, Row2.Y, Row2.Z, Row2.W, Row3.X, Row3.Y, Row3.Z, Row3.W]; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct Matrix4F_s + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct Matrix4F_s { - public Vector3 Column1 { get; set; } - public uint Flags1 { get; set; } - public Vector3 Column2 { get; set; } - public uint Flags2 { get; set; } - public Vector3 Column3 { get; set; } - public uint Flags3 { get; set; } - public Vector3 Column4 { get; set; } - public uint Flags4 { get; set; } + public Vector3 Column1 { get; init; } + public uint Flags1 { get; init; } + public Vector3 Column2 { get; init; } + public uint Flags2 { get; init; } + public Vector3 Column3 { get; init; } + public uint Flags3 { get; init; } + public Vector3 Column4 { get; init; } + public uint Flags4 { get; init; } public Matrix4F_s(bool identity) { @@ -189,7 +193,7 @@ namespace CodeWalker.GameFiles Flags3 = 0x7f800001; Flags4 = 0x7f800001; } - public Matrix4F_s(Matrix m) + public Matrix4F_s(in Matrix m) { Column1 = new Vector3(m.M11, m.M12, m.M13); Column2 = new Vector3(m.M21, m.M22, m.M23); @@ -201,236 +205,112 @@ namespace CodeWalker.GameFiles Flags4 = 0x7f800001; } - public float[] ToArray() + public readonly float[] ToArray() { - return new[] { Column1.X, Column1.Y, Column1.Z, Column2.X, Column2.Y, Column2.Z, Column3.X, Column3.Y, Column3.Z, Column4.X, Column4.Y, Column4.Z }; + return [Column1.X, Column1.Y, Column1.Z, Column2.X, Column2.Y, Column2.Z, Column3.X, Column3.Y, Column3.Z, Column4.X, Column4.Y, Column4.Z]; } - public Matrix ToMatrix() + public readonly Matrix ToMatrix() { return new Matrix(Column1.X, Column1.Y, Column1.Z, 0, Column2.X, Column2.Y, Column2.Z, 0, Column3.X, Column3.Y, Column3.Z, 0, Column4.X, Column4.Y, Column4.Z, 1); } - - public static Matrix4F_s Identity { get { return new Matrix4F_s(true); } } - public static Matrix4F_s Zero { get { return new Matrix4F_s(false); } } - - - + public static Matrix4F_s Identity => new Matrix4F_s(true); + public static Matrix4F_s Zero => new Matrix4F_s(false); } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct AABB_s + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct AABB_s(Vector4 min, Vector4 max) { - public Vector4 Min { get; set; } - public Vector4 Max { get; set; } + public readonly Vector4 _Min = min; + public readonly Vector4 _Max = max; + public Vector4 Min { get => _Min; init => _Min = value; } + public Vector4 Max { get => _Max; init => _Max = value; } } - - - [TypeConverter(typeof(ExpandableObjectConverter))] public struct FlagsByte + + + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly record struct FlagsByte(byte Value) { - public byte Value { get; set; } + public string Hex => Value.ToString("X2"); - public string Hex - { - get - { - return Convert.ToString(Value, 16).ToUpper().PadLeft(2, '0'); - } - } + public string Bin => Value.ToString("b8"); - public string Bin - { - get - { - return Convert.ToString(Value, 2).PadLeft(8, '0'); - } - } + public override string ToString() => $"{Bin} | 0x{Hex} | {Value}"; + public string ToShortString() => $"{Bin} | 0x{Hex}"; + public string ToHexString() => $"0x{Hex}"; + public static implicit operator FlagsByte(byte v) => new FlagsByte(v); - public FlagsByte(byte v) - { - Value = v; - } - - public override string ToString() - { - return Bin + " | 0x" + Hex + " | " + Value.ToString(); - } - public string ToShortString() - { - return Bin + " | 0x" + Hex; - } - public string ToHexString() - { - return "0x" + Hex; - } - - public static implicit operator FlagsByte(byte v) - { - return new FlagsByte(v); - } - public static implicit operator byte(FlagsByte v) - { - return v.Value; //implicit conversion - } + public static implicit operator byte(FlagsByte v) => v.Value; } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct FlagsUshort + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly record struct FlagsUshort(ushort Value) { - public ushort Value { get; set; } + public string Hex => Value.ToString("X4"); + public string Bin => Value.ToString("b16"); - public string Hex - { - get - { - return Convert.ToString(Value, 16).ToUpper().PadLeft(4, '0'); - } - } + public override string ToString() => $"{Bin} | 0x{Hex} | {Value}"; + public string ToShortString() => $"{Bin} | 0x{Hex}"; - public string Bin - { - get - { - return Convert.ToString(Value, 2).PadLeft(16, '0'); - } - } - - public FlagsUshort(ushort v) - { - Value = v; - } - - public override string ToString() - { - return Bin + " | 0x" + Hex + " | " + Value.ToString(); - } - public string ToShortString() - { - return Bin + " | 0x" + Hex; - } - - public static implicit operator FlagsUshort(ushort v) - { - return new FlagsUshort(v); - } - public static implicit operator ushort(FlagsUshort v) - { - return v.Value; //implicit conversion - } + public static implicit operator FlagsUshort(ushort v) => new FlagsUshort(v); + public static implicit operator ushort(FlagsUshort v) => v.Value; } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct FlagsUint + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly record struct FlagsUint(uint Value) : IEquatable { - public uint Value { get; set; } + //public uint Value { get; init; } = v; - public string Hex - { - get - { - return Convert.ToString(Value, 16).ToUpper().PadLeft(8, '0'); - } - } + public string Hex => Value.ToString("X8"); - public string Bin - { - get - { - return Convert.ToString(Value, 2).PadLeft(32, '0'); - } - } + public string Bin => Value.ToString("b32"); - public FlagsUint(uint v) - { - Value = v; - } - - public override string ToString() - { - return Bin + " | 0x" + Hex + " | " + Value.ToString(); - } - public string ToShortString() - { - return Bin + " | 0x" + Hex; - } - - public static implicit operator FlagsUint(uint v) - { - return new FlagsUint(v); - } - public static implicit operator uint(FlagsUint v) - { - return v.Value; //implicit conversion - } + public override string ToString() => $"{Bin} | 0x{Hex} | {Value}"; + public string ToShortString() => $"{Bin} | 0x{Hex}"; + public static implicit operator FlagsUint(uint v) => new FlagsUint(v); + public static implicit operator uint(FlagsUint v) => v.Value; } - [TypeConverter(typeof(ExpandableObjectConverter))] public abstract class ListBase : ResourceSystemBlock, ICustomTypeDescriptor, IList where T : IResourceSystemBlock, new() + [TypeConverter(typeof(ExpandableObjectConverter))] + public abstract class ListBase : ResourceSystemBlock, ICustomTypeDescriptor, IList where T : IResourceSystemBlock, new() { // this is the data... public List Data { get; set; } - - - public T this[int index] { - get - { - return Data[index]; - } - set - { - Data[index] = value; - } + get => Data[index]; + set => Data[index] = value; } - public int Count - { - get - { - return Data?.Count ?? 0; - } - } - - public bool IsReadOnly - { - get - { - return false; - } - } - - - + public int Count => Data?.Count ?? 0; + public bool IsReadOnly => false; + public Span Span => Data.AsSpan(); public ListBase() { //Data = new List(); } - - - - public void Add(T item) { - if (Data == null) - { - Data = new List(); - } + Data ??= new List(); Data.Add(item); } @@ -449,11 +329,16 @@ namespace CodeWalker.GameFiles Data.CopyTo(array, arrayIndex); } - public IEnumerator GetEnumerator() + public List.Enumerator GetEnumerator() { return Data.GetEnumerator(); } + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + public int IndexOf(T item) { return Data.IndexOf(item); @@ -479,6 +364,11 @@ namespace CodeWalker.GameFiles return Data.GetEnumerator(); } + public ref T GetByRef(int index) + { + return ref Data.AsSpan()[index]; + } + @@ -555,68 +445,29 @@ namespace CodeWalker.GameFiles private ListBase collection = null; private int index = -1; - public ListBasePropertyDescriptor(ListBase coll, int i) : base("#" + i.ToString(), null) + public ListBasePropertyDescriptor(ListBase coll, int i) : base($"#{i}", null) { collection = coll; index = i; } - public override AttributeCollection Attributes - { - get - { - return new AttributeCollection(null); - } - } + public override AttributeCollection Attributes => new AttributeCollection(null); - public override bool CanResetValue(object component) - { - return true; - } + public override bool CanResetValue(object component) => true; - public override Type ComponentType - { - get - { - return this.collection.GetType(); - } - } + public override Type ComponentType => this.collection.GetType(); - public override string DisplayName - { - get - { - return "[" + index.ToString() + "]"; - } - } + public override string DisplayName => $"[{index}]"; - public override string Description - { - get - { - return collection[index].ToString(); - } - } + public override string Description => collection[index].ToString(); - public override object GetValue(object component) - { - return this.collection[index]; - } + public override object GetValue(object component) => this.collection[index]; - public override bool IsReadOnly - { - get { return true; } - } + public override bool IsReadOnly => true; - public override string Name - { - get { return "#" + index.ToString(); } - } + public override string Name => $"#{index}"; - public override Type PropertyType - { - get { return this.collection[index].GetType(); } - } + public override Type PropertyType => this.collection[index].GetType(); public override void ResetValue(object component) { } @@ -636,7 +487,8 @@ namespace CodeWalker.GameFiles - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleArray : ListBase, IResourceNoCacheBlock where T : IResourceSystemBlock, new() + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleArray : ListBase, IResourceNoCacheBlock where T : IResourceSystemBlock, new() { /// /// Gets the length of the data block. @@ -645,11 +497,14 @@ namespace CodeWalker.GameFiles { get { + if (Data is null || Data.Count == 0) + return 0; + long length = 0; - if (Data != null) + + foreach(ref var data in Span) { - foreach (var x in Data) - length += x.BlockLength; + length += data.BlockLength; } return length; } @@ -661,6 +516,11 @@ namespace CodeWalker.GameFiles //Data = new List(); } + public ResourceSimpleArray(IEnumerable items) + { + Data = new List(items); + } + @@ -688,46 +548,43 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { foreach (var f in Data) + { f.Write(writer); + } } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - var list = new List>(); + if (Data is null || Data.Count == 0) + return []; + + var result = new (long, IResourceBlock)[Data.Count]; long length = 0; - if (Data != null) + for (int i = 0; i < Data.Count; i++) { - foreach (var x in Data) - { - list.Add(new Tuple(length, x)); - length += x.BlockLength; - } + result[i] = (length, Data[i]); + length += Data[i].BlockLength; } - return list.ToArray(); + return result; } - public override string ToString() - { - return "(Count: " + Count.ToString() + ")"; - } + public override string ToString() => $"(Count: {Count})"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleList64 : ResourceSystemBlock, IResourceNoCacheBlock where T : IResourceSystemBlock, new() + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleList64 : ResourceSystemBlock, IResourceNoCacheBlock where T : IResourceSystemBlock, new() { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -736,9 +593,9 @@ namespace CodeWalker.GameFiles // reference data //public ResourceSimpleArray Entries; - public T[] data_items { get; set; } + public T[] data_items { get; set; } = []; - private ResourceSimpleArray data_block;//used for saving. + private ResourceSimpleArray? data_block;//used for saving. /// @@ -758,6 +615,12 @@ namespace CodeWalker.GameFiles // this.EntriesCount //); + if (EntriesCount == 0) + { + data_items = []; + return; + } + //TODO: NEEDS TO BE TESTED!!! data_items = new T[EntriesCount]; var posbckp = reader.Position; @@ -771,7 +634,6 @@ namespace CodeWalker.GameFiles } reader.Position = posbckp; - } /// @@ -780,9 +642,9 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data //TODO: fix - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); - this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.Count : 0); - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.Count : 0); + this.EntriesPointer = (ulong)(this.data_block?.FilePosition ?? 0); + this.EntriesCount = (ushort)(this.data_block?.Count ?? 0); + this.EntriesCapacity = (ushort)(this.data_block?.Count ?? 0); // write structure data writer.Write(this.EntriesPointer); @@ -796,34 +658,25 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourceSimpleArray(); - data_block.Data = new List(); - data_block.Data.AddRange(data_items); - list.Add(data_block); - } - else + if (data_items is null || data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); + data_block = new ResourceSimpleArray(); + data_block.Data = new List(data_items); + + return [data_block]; } - public override string ToString() - { - return "(Count: " + EntriesCount.ToString() + ")"; - } + public override string ToString() => $"(Count: {EntriesCount})"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleList64_s : ResourceSystemBlock, IResourceNoCacheBlock where T : struct + + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleList64_s : ResourceSystemBlock, IResourceNoCacheBlock, IResourceBlockSpan where T : struct { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -831,9 +684,9 @@ namespace CodeWalker.GameFiles public ushort EntriesCapacity { get; private set; } // reference data - public T[] data_items { get; set; } + public T[] data_items { get; set; } = Array.Empty(); - private ResourceSystemStructBlock data_block;//used for saving. + private ResourceSystemStructBlock? data_block;//used for saving. /// @@ -850,10 +703,21 @@ namespace CodeWalker.GameFiles // read reference data //TODO: NEEDS TO BE TESTED!!! - data_items = reader.ReadStructsAt(EntriesPointer, EntriesCount); + data_items = reader.ReadStructsAt(EntriesPointer, EntriesCount) ?? Array.Empty(); + } - if (EntriesCount != EntriesCapacity) - { } + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.EntriesPointer = reader.ReadUInt64(); + this.EntriesCount = reader.ReadUInt16(); + this.EntriesCapacity = reader.ReadUInt16(); + reader.Advance(4); + + // read reference data + + //TODO: NEEDS TO BE TESTED!!! + data_items = reader.ReadStructsAt(EntriesPointer, EntriesCount).ToArray(); } /// @@ -862,9 +726,9 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data //TODO: fix - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); - this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); + this.EntriesPointer = (ulong)(data_block?.FilePosition ?? 0); + this.EntriesCount = (ushort)(data_block?.ItemCount ?? 0); + this.EntriesCapacity = (ushort)(data_block?.ItemCount ?? 0); // write structure data writer.Write(this.EntriesPointer); @@ -878,35 +742,31 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourceSystemStructBlock(data_items); - - list.Add(data_block); - } - else + if (data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); + data_block = new ResourceSystemStructBlock(data_items); + + return [data_block]; } - public override string ToString() + public Span.Enumerator GetEnumerator() { - return "(Count: " + EntriesCount.ToString() + ")"; + return data_items.AsSpan().GetEnumerator(); } + + public override string ToString() => $"(Count: {EntriesCount})"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleList64b_s : ResourceSystemBlock, IResourceNoCacheBlock where T : struct + + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleList64b_s : ResourceSystemBlock, IResourceNoCacheBlock, IResourceBlockSpan where T : struct { //this version uses uints for the count/cap! - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -914,9 +774,9 @@ namespace CodeWalker.GameFiles public uint EntriesCapacity { get; private set; } // reference data - public T[] data_items { get; set; } + public T[] data_items { get; set; } = []; - private ResourceSystemStructBlock data_block;//used for saving. + private ResourceSystemStructBlock? data_block;//used for saving. /// @@ -933,7 +793,21 @@ namespace CodeWalker.GameFiles // read reference data //TODO: NEEDS TO BE TESTED!!! - data_items = reader.ReadStructsAt(EntriesPointer, EntriesCapacity); + data_items = reader.ReadStructsAt(EntriesPointer, EntriesCapacity) ?? []; + } + + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.EntriesPointer = reader.ReadUInt64(); + this.EntriesCount = reader.ReadUInt32(); + this.EntriesCapacity = reader.ReadUInt32(); + //reader.Position += 4; + + // read reference data + + //TODO: NEEDS TO BE TESTED!!! + data_items = reader.ReadStructsAt(EntriesPointer, EntriesCapacity).ToArray(); } /// @@ -942,9 +816,9 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data //TODO: fix - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); + this.EntriesPointer = (ulong)(data_block?.FilePosition ?? 0); //this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); + this.EntriesCapacity = (ushort)(data_block?.ItemCount ?? 0); // write structure data writer.Write(this.EntriesPointer); @@ -958,33 +832,28 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourceSystemStructBlock(data_items); - - list.Add(data_block); - } - else + if (data_items is null || data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); + data_block = new ResourceSystemStructBlock(data_items); + + return [data_block]; } - public override string ToString() + public Span.Enumerator GetEnumerator() { - return "(Count: " + EntriesCount.ToString() + ")"; + return data_items.AsSpan().GetEnumerator(); } + + public override string ToString() => $"(Count: {EntriesCount})"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleList64_byte : ResourceSystemBlock, IResourceNoCacheBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleList64_byte : ResourceSystemBlock, IResourceBlockSpan, IResourceNoCacheBlock { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -992,9 +861,9 @@ namespace CodeWalker.GameFiles public ushort EntriesCapacity { get; private set; } // reference data - public byte[] data_items { get; private set; } + public byte[] data_items { get; private set; } = []; - private ResourceSystemStructBlock data_block;//used for saving. + private ResourceSystemStructBlock? data_block;//used for saving. /// @@ -1011,7 +880,21 @@ namespace CodeWalker.GameFiles // read reference data //TODO: NEEDS TO BE TESTED!!! - data_items = reader.ReadBytesAt(EntriesPointer, EntriesCount); + data_items = reader.ReadBytesAt(EntriesPointer, EntriesCount) ?? []; + } + + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.EntriesPointer = reader.ReadUInt64(); + this.EntriesCount = reader.ReadUInt16(); + this.EntriesCapacity = reader.ReadUInt16(); + reader.Advance(4); + + // read reference data + + //TODO: NEEDS TO BE TESTED!!! + data_items = reader.ReadBytesAt(EntriesPointer, EntriesCount).ToArray(); } /// @@ -1020,9 +903,9 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data //TODO: fix - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); - this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); + this.EntriesPointer = (ulong)(this.data_block?.FilePosition ?? 0); + this.EntriesCount = (ushort)(this.data_block?.ItemCount ?? 0); + this.EntriesCapacity = (ushort)(this.data_block?.ItemCount ?? 0); // write structure data writer.Write(this.EntriesPointer); @@ -1036,33 +919,23 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourceSystemStructBlock(data_items); - - list.Add(data_block); - } - else + if (data_items is null || data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); + data_block = new ResourceSystemStructBlock(data_items); + + return [data_block]; } - public override string ToString() - { - return "(Count: " + EntriesCount.ToString() + ")"; - } + public override string ToString() => $"(Count: {EntriesCount})"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleList64_ushort : ResourceSystemBlock, IResourceNoCacheBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleList64_ushort : ResourceSystemBlock, IResourceNoCacheBlock { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -1070,9 +943,9 @@ namespace CodeWalker.GameFiles public ushort EntriesCapacity { get; private set; } // reference data - public ushort[] data_items { get; set; } + public ushort[] data_items { get; set; } = []; - private ResourceSystemStructBlock data_block;//used for saving. + private ResourceSystemStructBlock? data_block;//used for saving. /// @@ -1089,7 +962,7 @@ namespace CodeWalker.GameFiles // read reference data //TODO: NEEDS TO BE TESTED!!! - data_items = reader.ReadUshortsAt(EntriesPointer, EntriesCount); + data_items = reader.ReadUshortsAt(EntriesPointer, EntriesCount) ?? []; } /// @@ -1098,9 +971,9 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data //TODO: fix - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); - this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); + this.EntriesPointer = (ulong)(this.data_block?.FilePosition ?? 0); + this.EntriesCount = (ushort)(data_block?.ItemCount ?? 0); + this.EntriesCapacity = (ushort)(data_block?.ItemCount ?? 0); // write structure data writer.Write(this.EntriesPointer); @@ -1114,33 +987,26 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourceSystemStructBlock(data_items); - - list.Add(data_block); - } - else + if (data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); + data_block = new ResourceSystemStructBlock(data_items); + + return [data_block]; } - public override string ToString() - { - return "(Count: " + EntriesCount.ToString() + ")"; - } + public override string ToString() => $"(Count: {EntriesCount})"; + + + } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleList64_uint : ResourceSystemBlock, IResourceNoCacheBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleList64_uint : ResourceSystemBlock, IResourceNoCacheBlock { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -1148,9 +1014,9 @@ namespace CodeWalker.GameFiles public ushort EntriesCapacity { get; private set; } // reference data - public uint[] data_items { get; set; } + public uint[] data_items { get; set; } = Array.Empty(); - private ResourceSystemStructBlock data_block;//used for saving. + private ResourceSystemStructBlock? data_block;//used for saving. /// @@ -1167,7 +1033,7 @@ namespace CodeWalker.GameFiles // read reference data //TODO: NEEDS TO BE TESTED!!! - data_items = reader.ReadUintsAt(EntriesPointer, EntriesCount); + data_items = reader.ReadUintsAt(EntriesPointer, EntriesCount) ?? Array.Empty(); } /// @@ -1176,9 +1042,9 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data //TODO: fix - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); - this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); + this.EntriesPointer = (ulong)(data_block?.FilePosition ?? 0); + this.EntriesCount = (ushort)(data_block?.ItemCount ?? 0); + this.EntriesCapacity = (ushort)(data_block?.ItemCount ?? 0); // write structure data writer.Write(this.EntriesPointer); @@ -1192,33 +1058,26 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourceSystemStructBlock(data_items); - - list.Add(data_block); - } - else + if (data_items is null || data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); + data_block = new ResourceSystemStructBlock(data_items); + + return [data_block]; } public override string ToString() { - return "(Count: " + EntriesCount.ToString() + ")"; + return $"(Count: {EntriesCount})"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleList64_ulong : ResourceSystemBlock, IResourceNoCacheBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleList64_ulong : ResourceSystemBlock, IResourceNoCacheBlock { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -1228,7 +1087,7 @@ namespace CodeWalker.GameFiles // reference data public ulong[] data_items { get; private set; } - private ResourceSystemStructBlock data_block;//used for saving. + private ResourceSystemStructBlock? data_block;//used for saving. /// @@ -1245,7 +1104,21 @@ namespace CodeWalker.GameFiles // read reference data //TODO: NEEDS TO BE TESTED!!! - data_items = reader.ReadUlongsAt(EntriesPointer, EntriesCount); + data_items = reader.ReadUlongsAt(EntriesPointer, EntriesCount) ?? Array.Empty(); + } + + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.EntriesPointer = reader.ReadUInt64(); + this.EntriesCount = reader.ReadUInt16(); + this.EntriesCapacity = reader.ReadUInt16(); + reader.Advance(4); + + // read reference data + + //TODO: NEEDS TO BE TESTED!!! + data_items = reader.ReadUlongsAt(EntriesPointer, EntriesCount).ToArray(); } /// @@ -1254,9 +1127,9 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data //TODO: fix - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); - this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); + this.EntriesPointer = (ulong)(data_block?.FilePosition ?? 0); + this.EntriesCount = (ushort)(data_block?.ItemCount ?? 0); + this.EntriesCapacity = (ushort)(data_block?.ItemCount ?? 0); // write structure data writer.Write(this.EntriesPointer); @@ -1270,33 +1143,25 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourceSystemStructBlock(data_items); - - list.Add(data_block); - } - else + if (data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); + data_block = new ResourceSystemStructBlock(data_items); + return [data_block]; } public override string ToString() { - return "(Count: " + EntriesCount.ToString() + ")"; + return $"(Count: {EntriesCount})"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceSimpleList64_float : ResourceSystemBlock, IResourceNoCacheBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceSimpleList64_float : ResourceSystemBlock, IResourceNoCacheBlock { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -1306,7 +1171,7 @@ namespace CodeWalker.GameFiles // reference data public float[] data_items { get; set; } - private ResourceSystemStructBlock data_block;//used for saving. + private ResourceSystemStructBlock? data_block;//used for saving. /// @@ -1332,9 +1197,9 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data //TODO: fix - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); - this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.ItemCount : 0); + this.EntriesPointer = (ulong)(data_block?.FilePosition ?? 0); + this.EntriesCount = (ushort)(data_block?.ItemCount ?? 0); + this.EntriesCapacity = (ushort)(data_block?.ItemCount ?? 0); // write structure data writer.Write(this.EntriesPointer); @@ -1348,48 +1213,38 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourceSystemStructBlock(data_items); - - list.Add(data_block); - } - else + if (data_items is null || data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); + data_block = new ResourceSystemStructBlock(data_items); + + return [data_block]; } public override string ToString() { - return "(Count: " + EntriesCount.ToString() + ")"; + return $"(Count: {EntriesCount})"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourcePointerArray64 : ResourceSystemBlock, IList where T : IResourceSystemBlock, new() + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourcePointerArray64 : ResourceSystemBlock, IList where T : IResourceSystemBlock, new() { public int GetNonEmptyNumber() { int i = 0; foreach (var q in data_items) - if (q != null) + if (q is not null) i++; return i; } - public override long BlockLength - { - get - { - return (data_items != null) ? 8 * data_items.Length : 0; - } - } + public override long BlockLength => (data_items != null) ? 8 * data_items.Length : 0; public ulong[] data_pointers { get; set; } @@ -1406,8 +1261,15 @@ namespace CodeWalker.GameFiles { int numElements = Convert.ToInt32(parameters[0]); + if (numElements == 0) + { + data_pointers = []; + data_items = []; + return; + } - data_pointers = reader.ReadUlongsAt((ulong)reader.Position, (uint)numElements, false); + + data_pointers = reader.ReadUlongsAt((ulong)reader.Position, (uint)numElements, false) ?? []; data_items = new T[numElements]; @@ -1422,10 +1284,10 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update... - var list = new List(); + using var list = new PooledList(data_items.Length); foreach (var x in data_items) { - if (x != null) + if (x is not null) { list.Add((uint)x.FilePosition); } @@ -1434,6 +1296,7 @@ namespace CodeWalker.GameFiles list.Add(0); } } + data_pointers = list.ToArray(); @@ -1445,17 +1308,12 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (ManualReferenceOverride == false) + if (ManualReferenceOverride || data_items is null || data_items.Length == 0) { - foreach (var x in data_items) - { - list.Add(x); - } + return []; } - return list.ToArray(); + return [.. data_items]; } @@ -1480,14 +1338,8 @@ namespace CodeWalker.GameFiles public T this[int index] { - get - { - return data_items[index]; - } - set - { - throw new NotImplementedException(); - } + get => data_items[index]; + set => throw new NotImplementedException(); } public void Add(T item) @@ -1496,65 +1348,36 @@ namespace CodeWalker.GameFiles throw new NotImplementedException(); } - public void Clear() - { - throw new NotImplementedException(); - } + public void Clear() => throw new NotImplementedException(); - public bool Contains(T item) - { - throw new NotImplementedException(); - } + public bool Contains(T item) => throw new NotImplementedException(); - public void CopyTo(T[] array, int arrayIndex) - { - throw new NotImplementedException(); - } + public void CopyTo(T[] array, int arrayIndex) => throw new NotImplementedException(); - public int Count - { - //get { return data_items.Count; } - get { return (data_items != null) ? data_items.Length : 0; } - } + public int Count => data_items?.Length ?? 0; - public bool IsReadOnly - { - get { return false; } - } + public bool IsReadOnly => false; - public bool Remove(T item) - { - //return data_items.Remove(item); - throw new NotImplementedException(); - } + public bool Remove(T item) => throw new NotImplementedException(); - public IEnumerator GetEnumerator() - { - //return data_items.GetEnumerator(); - throw new NotImplementedException(); - } + public IEnumerator GetEnumerator() => throw new NotImplementedException(); - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - throw new NotImplementedException(); - } + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw new NotImplementedException(); public override string ToString() { - return "(Count: " + ((data_items != null) ? data_items.Length : 0).ToString() + ")"; + return $"(Count: {data_items?.Length ?? 0})"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourcePointerList64 : ResourceSystemBlock, IList where T : IResourceSystemBlock, new() + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourcePointerList64 : ResourceSystemBlock, IList where T : IResourceSystemBlock, new() { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public ulong EntriesPointer { get; private set; } @@ -1564,13 +1387,13 @@ namespace CodeWalker.GameFiles // reference data //public ResourcePointerArray64 Entries; - public ulong[] data_pointers { get; private set; } - public T[] data_items { get; set; } + public ulong[] data_pointers { get; private set; } = []; + public T[] data_items { get; set; } = []; public bool ManualCountOverride = false; //use this to manually specify the count public bool ManualReferenceOverride = false; //use this if the items are embedded in something else - private ResourcePointerArray64 data_block;//used for saving. + private ResourcePointerArray64? data_block;//used for saving. public override void Read(ResourceDataReader reader, params object[] parameters) @@ -1585,7 +1408,14 @@ namespace CodeWalker.GameFiles // this.EntriesCount //); - data_pointers = reader.ReadUlongsAt(EntriesPointer, EntriesCapacity); + data_pointers = reader.ReadUlongsAt(EntriesPointer, EntriesCapacity) ?? []; + + if (EntriesCount == 0) + { + data_items = []; + return; + } + data_items = new T[EntriesCount]; for (int i = 0; i < EntriesCount; i++) { @@ -1598,11 +1428,11 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update... - this.EntriesPointer = (ulong)(this.data_block != null ? this.data_block.FilePosition : 0); + this.EntriesPointer = (ulong)(data_block?.FilePosition ?? 0); if (ManualCountOverride == false) { - this.EntriesCapacity = (ushort)(this.data_block != null ? this.data_block.Count : 0); - this.EntriesCount = (ushort)(this.data_block != null ? this.data_block.Count : 0); + this.EntriesCapacity = (ushort)(data_block?.Count ?? 0); + this.EntriesCount = (ushort)(data_block?.Count ?? 0); } @@ -1615,118 +1445,57 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - - if (data_items?.Length > 0) - { - data_block = new ResourcePointerArray64(); - data_block.data_items = data_items; - data_block.ManualReferenceOverride = ManualReferenceOverride; - list.Add(data_block); - } - else + if (data_items.Length == 0) { data_block = null; + return []; } - return list.ToArray(); - } + data_block = new ResourcePointerArray64(); + data_block.data_items = data_items; + data_block.ManualReferenceOverride = ManualReferenceOverride; - - - - public int IndexOf(T item) - { - throw new NotImplementedException(); - } - - public void Insert(int index, T item) - { - throw new NotImplementedException(); - } - - public void RemoveAt(int index) - { - throw new NotImplementedException(); + return [data_block]; } public T this[int index] { - get - { - return data_items[index]; - } - set - { - throw new NotImplementedException(); - } + get => data_items[index]; + set => throw new NotImplementedException(); } - public void Add(T item) - { - throw new NotImplementedException(); - } + public int IndexOf(T item) => throw new NotImplementedException(); + public void Insert(int index, T item) => throw new NotImplementedException(); + public void RemoveAt(int index) => throw new NotImplementedException(); + public void Add(T item) => throw new NotImplementedException(); + public void Clear() => throw new NotImplementedException(); + public bool Contains(T item) => throw new NotImplementedException(); + public void CopyTo(T[] array, int arrayIndex) => throw new NotImplementedException(); - public void Clear() - { - throw new NotImplementedException(); - } + public int Count => EntriesCount; - public bool Contains(T item) - { - throw new NotImplementedException(); - } + public bool IsReadOnly => false; - public void CopyTo(T[] array, int arrayIndex) - { - throw new NotImplementedException(); - } - - public int Count - { - get { return EntriesCount; } - } - - public bool IsReadOnly - { - get { return false; } - } - - public bool Remove(T item) - { - throw new NotImplementedException(); - } - - public IEnumerator GetEnumerator() - { - throw new NotImplementedException(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - throw new NotImplementedException(); - } - - - public IResourceBlock CheckForCast(ResourceDataReader reader, params object[] parameters) - { - throw new NotImplementedException(); - } + public bool Remove(T item) => throw new NotImplementedException(); + public IEnumerator GetEnumerator() => throw new NotImplementedException(); + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw new NotImplementedException(); + public IResourceBlock CheckForCast(ResourceDataReader reader, params object[] parameters) => throw new NotImplementedException(); public override string ToString() { - return "(Count: " + EntriesCount.ToString() + ")"; + return $"(Count: {EntriesCount})"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct ResourcePointerListHeader + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly record struct ResourcePointerListHeader { - public ulong Pointer { get; set; } - public ushort Count { get; set; } - public ushort Capacity { get; set; } - public uint Unknown { get; set; } + public ulong Pointer { get; init; } + public ushort Count { get; init; } + public ushort Capacity { get; init; } + public uint Unknown { get; init; } } @@ -1743,19 +1512,13 @@ namespace CodeWalker.GameFiles public byte[] Data { get; set; } public int DataLength { get; set; } - public override long BlockLength - { - get - { - return (Data != null) ? Data.Length : DataLength; - } - } + public override long BlockLength => (Data != null) ? Data.Length : DataLength; public ResourceSystemDataBlock(byte[] data) { Data = data; - DataLength = (Data != null) ? Data.Length : 0; + DataLength = Data?.Length ?? 0; } @@ -1776,18 +1539,12 @@ namespace CodeWalker.GameFiles public int ItemCount { get; set; } public int StructureSize { get; set; } - public override long BlockLength - { - get - { - return ((Items != null) ? Items.Length : ItemCount) * StructureSize; - } - } + public override long BlockLength => (Items?.Length ?? ItemCount) * StructureSize; public ResourceSystemStructBlock(T[] items) { Items = items; - ItemCount = (Items != null) ? Items.Length : 0; + ItemCount = Items?.Length ?? 0; StructureSize = Marshal.SizeOf(typeof(T)); } @@ -1802,13 +1559,15 @@ namespace CodeWalker.GameFiles { byte[] data = MetaTypes.ConvertArrayToBytes(Items); - if (data != null) + if (data is not null) { writer.Write(data); } } + + public Span.Enumerator GetEnumerator() + { + return Items.AsSpan().GetEnumerator(); + } } - - - } diff --git a/CodeWalker.Core/GameFiles/Resources/ResourceBuilder.cs b/CodeWalker.Core/GameFiles/Resources/ResourceBuilder.cs index 5c0f05e..22299f1 100644 --- a/CodeWalker.Core/GameFiles/Resources/ResourceBuilder.cs +++ b/CodeWalker.Core/GameFiles/Resources/ResourceBuilder.cs @@ -459,7 +459,7 @@ namespace CodeWalker.GameFiles { using (MemoryStream ms = RpfFile.recyclableMemoryStreamManager.GetStream()) { - DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress, true); + DeflateStream ds = new DeflateStream(ms, CompressionLevel.SmallestSize, true); ds.Write(data, 0, data.Length); ds.Close(); return ms.ToArray(); @@ -470,12 +470,23 @@ namespace CodeWalker.GameFiles using (MemoryStream ms = new MemoryStream(data)) { DeflateStream ds = new DeflateStream(ms, CompressionMode.Decompress); - MemoryStream outstr = RpfFile.recyclableMemoryStreamManager.GetStream("Decompress", data.Length); + MemoryStream outstr = RpfFile.recyclableMemoryStreamManager.GetStream("Decompress", data.Length * 2); ds.CopyTo(outstr, 524288); return outstr.ToArray(); } } + public static async Task DecompressAsync(byte[] data) + { + using (MemoryStream ms = new MemoryStream(data)) + { + DeflateStream ds = new DeflateStream(ms, CompressionMode.Decompress); + MemoryStream outstr = RpfFile.recyclableMemoryStreamManager.GetStream("Decompress", data.Length * 2); + await ds.CopyToAsync(outstr, 524288); + return outstr.ToArray(); + } + } + public static DeflateStream Decompress(Stream stream) { DeflateStream ds = new DeflateStream(stream, CompressionMode.Decompress); diff --git a/CodeWalker.Core/GameFiles/Resources/ResourceData.cs b/CodeWalker.Core/GameFiles/Resources/ResourceData.cs index 779e307..6031b6b 100644 --- a/CodeWalker.Core/GameFiles/Resources/ResourceData.cs +++ b/CodeWalker.Core/GameFiles/Resources/ResourceData.cs @@ -22,16 +22,21 @@ //shamelessly stolen and mangled - using CodeWalker.Utils; using System; using System.Buffers; +using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; +using System.Linq.Expressions; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace CodeWalker.GameFiles @@ -47,29 +52,23 @@ namespace CodeWalker.GameFiles private readonly Stream systemStream; private readonly Stream graphicsStream; - private readonly long systemSize = 0; - private readonly long graphicsSize = 0; + private readonly int systemSize = 0; + private readonly int graphicsSize = 0; public RpfResourceFileEntry FileEntry { get; set; } // this is a dictionary that contains all the resource blocks // which were read from this resource reader - public Dictionary blockPool - { - get - { - return _blockPool ??= new Dictionary(); - } - } - public Dictionary arrayPool { - get - { - return _arrayPool ??= new Dictionary(); - } - } + // This is needed to avoid a stack overflow because a ResourcePointerArray will try to read itself + private Dictionary _blockPool; + public Dictionary blockPool => _blockPool ??= new Dictionary(17); + +#if DEBUG + public Dictionary arrayPool => _arrayPool ??= new Dictionary(); private Dictionary _arrayPool; - private Dictionary _blockPool; +#endif + private long position = SYSTEM_BASE; /// @@ -109,16 +108,16 @@ namespace CodeWalker.GameFiles /// Initializes a new resource data reader for the specified system- and graphics-stream. /// public ResourceDataReader(Stream systemStream, Stream graphicsStream, Endianess endianess = Endianess.LittleEndian) - : base(null, endianess) + : base((Stream?)null, endianess) { this.systemStream = systemStream; this.graphicsStream = graphicsStream; - this.systemSize = systemStream.Length; - this.graphicsSize = graphicsStream.Length; + this.systemSize = (int)systemStream.Length; + this.graphicsSize = (int)graphicsStream.Length; } public ResourceDataReader(RpfResourceFileEntry resentry, byte[] data, Endianess endianess = Endianess.LittleEndian) - : base(null, endianess) + : this(resentry.SystemSize, resentry.GraphicsSize, data, endianess) { FileEntry = resentry; this.systemSize = resentry.SystemSize; @@ -137,11 +136,11 @@ namespace CodeWalker.GameFiles // } //} - if ((int)systemSize > data.Length) + if (systemSize > data.Length) { throw new ArgumentException($"systemSize {systemSize} is larger than data length ({data.Length})", nameof(resentry)); } - if ((int)graphicsSize > data.Length) + if (graphicsSize > data.Length) { throw new ArgumentException($"graphicsSize {graphicsSize} is larger than data length ({data.Length})", nameof(resentry)); } @@ -150,8 +149,21 @@ namespace CodeWalker.GameFiles } public ResourceDataReader(int systemSize, int graphicsSize, byte[] data, Endianess endianess = Endianess.LittleEndian) - : base(null, endianess) + : base((Stream)null, endianess) { + if (systemSize > data.Length) + { + throw new ArgumentException($"systemSize {systemSize} is larger than data length ({data.Length})", nameof(systemSize)); + } + if (graphicsSize > data.Length) + { + throw new ArgumentException($"graphicsSize {graphicsSize} is larger than data length ({data.Length})", nameof(graphicsSize)); + } + if (systemSize + graphicsSize > data.Length) + { + throw new ArgumentException($"systemSize + graphicsSize {systemSize} is larger than data length ({data.Length})", nameof(systemSize)); + } + this.systemStream = new MemoryStream(data, 0, systemSize); this.graphicsStream = new MemoryStream(data, systemSize, graphicsSize); } @@ -188,22 +200,38 @@ namespace CodeWalker.GameFiles } } + private static ConcurrentDictionary cacheableTypes = new ConcurrentDictionary(); + private static bool fetchUsePool(Type type) + { + return !typeof(IResourceNoCacheBlock).IsAssignableFrom(type); + } + private static bool usePool() where T : IResourceBlock, new() + { + return cacheableTypes.GetOrAdd(typeof(T), fetchUsePool); + } + + public static T validate(Func instantiator) + where T : IResourceBlock + { + return instantiator(); + } + /// /// Reads a block. /// public T ReadBlock(params object[] parameters) where T : IResourceBlock, new() { - var usepool = !typeof(IResourceNoCacheBlock).IsAssignableFrom(typeof(T)); + var usepool = usePool(); if (usepool) { // make sure to return the same object if the same // block is read again... - if (blockPool.ContainsKey(Position)) + if (blockPool.TryGetValue(Position, out IResourceBlock? value)) { - var block = blockPool[Position]; - if (block is T tblk) + var cachedBlock = value; + if (cachedBlock is T tblk) { - Position += block.BlockLength; + Position += cachedBlock.BlockLength; return tblk; } else @@ -217,14 +245,9 @@ namespace CodeWalker.GameFiles // replace with correct type... - if (result is IResourceXXSystemBlock) + if (result is IResourceXXSystemBlock block) { - result = (T)((IResourceXXSystemBlock)result).GetType(this, parameters); - } - - if (result == null) - { - return default; + result = (T)block.GetType(this, parameters); } if (usepool) @@ -240,27 +263,28 @@ namespace CodeWalker.GameFiles /// /// Reads a block at a specified position. /// - public T ReadBlockAt(ulong position, params object[] parameters) where T : IResourceBlock, new() + public T? ReadBlockAt(ulong position, params object[] parameters) where T : IResourceBlock, new() { - if (position != 0) + if (position == 0) { - var positionBackup = Position; - - Position = (long)position; - var result = ReadBlock(parameters); - Position = positionBackup; - - return result; - } - else - { - return default(T); + return default; } + + var positionBackup = Position; + + Position = (long)position; + var result = ReadBlock(parameters); + Position = positionBackup; + + return result; } - public T[] ReadBlocks(ulong[] pointers) where T : IResourceBlock, new() + [return: NotNullIfNotNull(nameof(pointers))] + public T[]? ReadBlocks(ulong[]? pointers) where T : IResourceBlock, new() { - if (pointers == null) return null; + if (pointers is null) + return null; + var count = pointers.Length; var items = new T[count]; for (int i = 0; i < count; i++) @@ -270,20 +294,40 @@ namespace CodeWalker.GameFiles return items; } - public unsafe byte[] ReadBytesAt(ulong position, uint count, bool cache = true, byte[] buffer = null) +#if DEBUG + public static int EntryAddedToCache = 0; +#endif + // Only used for ResourceAnalyzer so can be made conditional, this optimizes away the if branch and arrayPool adition + [Conditional("DEBUG")] + private void AddEntryToArrayPool(long position, object result) + { +#if DEBUG + Interlocked.Increment(ref EntryAddedToCache); + arrayPool[position] = result; +#endif + } + + public unsafe byte[]? ReadBytesAt(ulong position, uint count, bool cache = true, byte[]? buffer = null) { long pos = (long)position; - if ((pos <= 0) || (count == 0)) return null; + if ((pos <= 0) || (count == 0)) + return null; + var posbackup = Position; Position = pos; - var result = ReadBytes((int)count, buffer); + var result = ReadFromStream((int)count, true, buffer); Position = posbackup; - if (cache) arrayPool[(long)position] = result; + + if (cache) + { + AddEntryToArrayPool((long)position, result); + } return result; } - public ushort[] ReadUshortsAt(ulong position, uint count, bool cache = true) + public ushort[]? ReadUshortsAt(ulong position, uint count, bool cache = true) { - if ((position <= 0) || (count == 0)) return null; + if ((position <= 0) || (count == 0)) + return null; var result = new ushort[count]; var length = count * sizeof(ushort); @@ -308,11 +352,14 @@ namespace CodeWalker.GameFiles //} //Position = posbackup; - if (cache) arrayPool[(long)position] = result; + if (cache) + { + AddEntryToArrayPool((long)position, result); + } return result; } - public short[] ReadShortsAt(ulong position, uint count, bool cache = true) + public short[]? ReadShortsAt(ulong position, uint count, bool cache = true) { if ((position <= 0) || (count == 0)) return null; var result = new short[count]; @@ -329,13 +376,17 @@ namespace CodeWalker.GameFiles } - if (cache) arrayPool[(long)position] = result; + if (cache) + { + AddEntryToArrayPool((long)position, result); + } return result; } - public uint[] ReadUintsAt(ulong position, uint count, bool cache = true) + public uint[]? ReadUintsAt(ulong position, uint count, bool cache = true) { - if ((position <= 0) || (count == 0)) return null; + if ((position <= 0) || (count == 0)) + return null; var result = new uint[count]; var length = count * sizeof(uint); @@ -350,13 +401,17 @@ namespace CodeWalker.GameFiles } - if (cache) arrayPool[(long)position] = result; + if (cache) + { + AddEntryToArrayPool((long)position, result); + } return result; } - public ulong[] ReadUlongsAt(ulong position, uint count, bool cache = true) + public ulong[]? ReadUlongsAt(ulong position, uint count, bool cache = true) { - if ((position <= 0) || (count == 0)) return null; + if (position <= 0 || count == 0) + return null; var result = new ulong[count]; var length = count * sizeof(ulong); @@ -371,13 +426,17 @@ namespace CodeWalker.GameFiles ArrayPool.Shared.Return(data); } - if (cache) arrayPool[(long)position] = result; + if (cache) + { + AddEntryToArrayPool((long)position, result); + } return result; } - public float[] ReadFloatsAt(ulong position, uint count, bool cache = true) + public float[]? ReadFloatsAt(ulong position, uint count, bool cache = true) { - if ((position <= 0) || (count == 0)) return null; + if ((position <= 0) || (count == 0)) + return null; var result = new float[count]; var length = count * sizeof(float); @@ -392,13 +451,17 @@ namespace CodeWalker.GameFiles ArrayPool.Shared.Return(data); } - if (cache) arrayPool[(long)position] = result; + if (cache) + { + AddEntryToArrayPool((long)position, result); + } return result; } - public T[] ReadStructsAt(ulong position, uint count, bool cache = true) where T : struct + public T[]? ReadStructsAt(ulong position, uint count, bool cache = true) where T : struct { - if ((position <= 0) || (count == 0)) return null; + if ((position <= 0) || (count == 0)) + return null; uint structsize = (uint)Marshal.SizeOf(typeof(T)); var length = count * structsize; @@ -412,7 +475,10 @@ namespace CodeWalker.GameFiles var resultSpan = MemoryMarshal.Cast(data.AsSpan(0, (int)length)); resultSpan.CopyTo(result); - if (cache) arrayPool[(long)position] = result; + if (cache) + { + AddEntryToArrayPool((long)position, result); + } return result; } @@ -421,7 +487,7 @@ namespace CodeWalker.GameFiles ArrayPool.Shared.Return(data); } } - public T[] ReadStructs(uint count) where T : struct + public T[]? ReadStructs(uint count) where T : struct { uint structsize = (uint)Marshal.SizeOf(typeof(T)); var result = new T[count]; @@ -443,43 +509,66 @@ namespace CodeWalker.GameFiles } - public T ReadStruct() where T : struct + public bool TryReadStruct(out T result) where T : struct { - uint structsize = (uint)Marshal.SizeOf(typeof(T)); + var structsize = Marshal.SizeOf(typeof(T)); var length = structsize; - var data = ArrayPool.Shared.Rent((int)length); + var data = ArrayPool.Shared.Rent(length); try { - ReadBytes((int)length, data); - MemoryMarshal.TryRead(data, out var value); - - return value; - } finally + var buffer = data.AsSpan(0, length); + ReadBytes(buffer); + return MemoryMarshal.TryRead(buffer, out result); + } + finally { ArrayPool.Shared.Return(data); } + } + public T ReadStruct() where T : struct + { + TryReadStruct(out var result); + return result; + } + + public bool TryReadStructAt(long position, out T result) where T : struct + { + if (position <= 0) + { + result = default; + return false; + } + + var posbackup = Position; + try + { + Position = position; + return TryReadStruct(out result); + } + finally + { + Position = posbackup; + } } public T ReadStructAt(long position) where T : struct { - if ((position <= 0)) return default(T); - var posbackup = Position; - Position = (long)position; - var result = ReadStruct(); - Position = posbackup; + TryReadStructAt(position, out var result); return result; } - public string ReadStringAt(ulong position) + public string? ReadStringAt(ulong position) { long newpos = (long)position; - if ((newpos <= 0)) return null; + if (newpos <= 0) + return null; + var lastpos = Position; Position = newpos; var result = ReadString(); Position = lastpos; - arrayPool[newpos] = result; + AddEntryToArrayPool((long)position, result); return result; } @@ -587,7 +676,7 @@ namespace CodeWalker.GameFiles var arr = new byte[size]; - MemoryMarshal.TryWrite(arr, ref val); + MemoryMarshal.TryWrite(arr, in val); Write(arr); @@ -654,7 +743,15 @@ namespace CodeWalker.GameFiles + public interface IResourceBlockSpan + { + void Read(ref SequenceReader reader, params object[] parameters); + } + public interface IResourceXXSytemBlockSpan + { + IResourceSystemBlock GetType(ref SequenceReader reader, params object[] parameters); + } /// /// Represents a data block in a resource file. @@ -690,7 +787,7 @@ namespace CodeWalker.GameFiles /// /// Returns a list of data blocks that are part of this block. /// - Tuple[] GetParts(); + (long, IResourceBlock)[] GetParts(); /// /// Returns a list of data blocks that are referenced by this block. @@ -721,7 +818,8 @@ namespace CodeWalker.GameFiles /// /// Represents a data block of the system segement in a resource file. /// - [TypeConverter(typeof(ExpandableObjectConverter))] public abstract class ResourceSystemBlock : IResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public abstract class ResourceSystemBlock : IResourceSystemBlock { private long position; @@ -765,9 +863,9 @@ namespace CodeWalker.GameFiles /// /// Returns a list of data blocks that are part of this block. /// - public virtual Tuple[] GetParts() + public virtual (long, IResourceBlock)[] GetParts() { - return new Tuple[0]; + return Array.Empty<(long, IResourceBlock)>(); } /// @@ -775,7 +873,7 @@ namespace CodeWalker.GameFiles /// public virtual IResourceBlock[] GetReferences() { - return new IResourceBlock[0]; + return Array.Empty(); } } diff --git a/CodeWalker.Core/GameFiles/Resources/ResourceFile.cs b/CodeWalker.Core/GameFiles/Resources/ResourceFile.cs index 65d9b2d..7277fb7 100644 --- a/CodeWalker.Core/GameFiles/Resources/ResourceFile.cs +++ b/CodeWalker.Core/GameFiles/Resources/ResourceFile.cs @@ -23,8 +23,10 @@ //shamelessly stolen and mangled +using CodeWalker.Core.Utils; using SharpDX; using System; +using System.Buffers; using System.Collections.Generic; using System.ComponentModel; using System.IO; @@ -35,12 +37,10 @@ using System.Threading.Tasks; namespace CodeWalker.GameFiles { - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourceFileBase : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourceFileBase : ResourceSystemBlock { - public override long BlockLength - { - get { return 16; } - } + public override long BlockLength => 16; // structure data public uint FileVFT { get; set; } @@ -66,6 +66,19 @@ namespace CodeWalker.GameFiles ); } + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.FileVFT = reader.ReadUInt32(); + this.FileUnknown = reader.ReadUInt32(); + this.FilePagesInfoPointer = reader.ReadUInt64(); + + // read reference data + this.FilePagesInfo = reader.ReadBlockAt( + this.FilePagesInfoPointer // offset + ); + } + /// /// Writes the data-block to a stream. /// @@ -85,19 +98,20 @@ namespace CodeWalker.GameFiles /// public override IResourceBlock[] GetReferences() { - var list = new List(); - if (FilePagesInfo != null) list.Add(FilePagesInfo); - return list.ToArray(); + if (FilePagesInfo is null) + { + return []; + } + + return [FilePagesInfo]; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ResourcePagesInfo : ResourceSystemBlock + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ResourcePagesInfo : ResourceSystemBlock, IResourceBlockSpan { - public override long BlockLength - { - get { return 20 + (256 * 16); } - } + public override long BlockLength => 20 + (256 * 16); // structure data public uint Unknown_0h { get; set; } @@ -123,6 +137,18 @@ namespace CodeWalker.GameFiles this.Unknown_10h = reader.ReadUInt32(); } + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.Unknown_0h = reader.ReadUInt32(); + this.Unknown_4h = reader.ReadUInt32(); + this.SystemPagesCount = reader.ReadByte(); + this.GraphicsPagesCount = reader.ReadByte(); + this.Unknown_Ah = reader.ReadUInt16(); + this.Unknown_Ch = reader.ReadUInt32(); + this.Unknown_10h = reader.ReadUInt32(); + } + /// /// Writes the data-block to a stream. /// @@ -143,7 +169,7 @@ namespace CodeWalker.GameFiles public override string ToString() { - return SystemPagesCount.ToString() + ", " + GraphicsPagesCount.ToString(); + return $"{SystemPagesCount}, {GraphicsPagesCount}"; } } diff --git a/CodeWalker.Core/GameFiles/Resources/Texture.cs b/CodeWalker.Core/GameFiles/Resources/Texture.cs index 89d7788..8872f1d 100644 --- a/CodeWalker.Core/GameFiles/Resources/Texture.cs +++ b/CodeWalker.Core/GameFiles/Resources/Texture.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; +using static CodeWalker.Utils.DDSIO; namespace CodeWalker.GameFiles { @@ -136,11 +137,11 @@ namespace CodeWalker.GameFiles } - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(0x20, TextureNameHashes), - new Tuple(0x30, Textures) + return new (long, IResourceBlock)[] { + (0x20, TextureNameHashes), + (0x30, Textures) }; } @@ -422,27 +423,20 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(); - if (!string.IsNullOrEmpty(Name)) - { - NameBlock = (string_r)Name; - list.Add(NameBlock); - } - return list.ToArray(); + if (string.IsNullOrEmpty(Name)) + return []; + + NameBlock = (string_r)Name; + return [NameBlock]; } - public override string ToString() - { - return "TextureBase: " + Name; - } + public override string ToString() => $"TextureBase: {Name}"; } - [TypeConverter(typeof(ExpandableObjectConverter))] public class Texture : TextureBase + [TypeConverter(typeof(ExpandableObjectConverter))] + public class Texture : TextureBase { - public override long BlockLength - { - get { return 144; } - } + public override long BlockLength => 144; // structure data public ushort Width { get; set; } @@ -469,18 +463,7 @@ namespace CodeWalker.GameFiles // reference data public TextureData Data { get; set; } - public long MemoryUsage - { - get - { - long val = 0; - if (Data != null) - { - val += Data.FullData.LongLength; - } - return val; - } - } + public long MemoryUsage => Data?.FullData?.LongLength ?? 0; public override void Read(ResourceDataReader reader, params object[] parameters) { @@ -560,7 +543,9 @@ namespace CodeWalker.GameFiles File.WriteAllBytes(filepath, dds); } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } public override void ReadXml(XmlNode node, string ddsfolder) { @@ -608,26 +593,19 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { - var list = new List(base.GetReferences()); - list.Add(Data); + var list = new List(base.GetReferences()) + { + Data + }; return list.ToArray(); } - public override string ToString() - { - return "Texture: " + Width.ToString() + "x" + Height.ToString() + ": " + Name; - } + public override string ToString() => $"Texture: {Width}x{Height}: {Name}"; } [TypeConverter(typeof(ExpandableObjectConverter))] public class TextureData : ResourceGraphicsBlock { - public override long BlockLength - { - get - { - return FullData.Length; - } - } + public override long BlockLength => FullData.Length; public byte[] FullData { get; set; } @@ -636,17 +614,34 @@ namespace CodeWalker.GameFiles /// public override void Read(ResourceDataReader reader, params object[] parameters) { - //uint format = Convert.ToUInt32(parameters[0]); - //int Width = Convert.ToInt32(parameters[1]); + uint format = Convert.ToUInt32(parameters[0]); + + var dxgiFormat = DDSIO.GetDXGIFormat((TextureFormat)format); + + int Width = Convert.ToInt32(parameters[1]); int Height = Convert.ToInt32(parameters[2]); int Levels = Convert.ToInt32(parameters[3]); int Stride = Convert.ToInt32(parameters[4]); + int div = 1; int fullLength = 0; int length = Stride * Height; for (int i = 0; i < Levels; i++) { - fullLength += Math.Max(length, 4 * 4); + //var thisLength = Math.Max(length, 4 * 4); + //if (thisLength % 16 != 0) + //{ + // thisLength += (16 - (thisLength % 16)); + //} + + var width = Math.Max(Width / div, 1); + var height = Math.Max(Height / div, 1); + + DXTex.ComputePitch(dxgiFormat, width, height, out var ddsRowPitch, out var ddsSlicePitch, 0); + + div *= 2; + + fullLength += ddsSlicePitch; length /= 4; } @@ -670,6 +665,7 @@ namespace CodeWalker.GameFiles D3DFMT_A1R5G5B5 = 25, D3DFMT_A8 = 28, D3DFMT_A8B8G8R8 = 32, + D3DFMT_A16R16G16B16 = 36, D3DFMT_L8 = 50, // fourCC diff --git a/CodeWalker.Core/GameFiles/Resources/VehicleRecord.cs b/CodeWalker.Core/GameFiles/Resources/VehicleRecord.cs index 723f428..67a0735 100644 --- a/CodeWalker.Core/GameFiles/Resources/VehicleRecord.cs +++ b/CodeWalker.Core/GameFiles/Resources/VehicleRecord.cs @@ -89,10 +89,10 @@ namespace CodeWalker.GameFiles - public override Tuple[] GetParts() + public override (long, IResourceBlock)[] GetParts() { - return new Tuple[] { - new Tuple(16, Entries) + return new (long, IResourceBlock)[] { + (16, Entries) }; } } diff --git a/CodeWalker.Core/GameFiles/Resources/VertexType.cs b/CodeWalker.Core/GameFiles/Resources/VertexType.cs index d154bab..0bf3c2b 100644 --- a/CodeWalker.Core/GameFiles/Resources/VertexType.cs +++ b/CodeWalker.Core/GameFiles/Resources/VertexType.cs @@ -185,10 +185,15 @@ namespace CodeWalker.GameFiles public Half4 Tangent; } - public struct EditorVertex //vertex data to be used by the editor. TODO: maybe move somewhere else. + public struct EditorVertex(Vector3 position, uint colour) //vertex data to be used by the editor. TODO: maybe move somewhere else. { - public Vector3 Position; - public uint Colour; + public Vector3 Position = position; + public uint Colour = colour; + + public EditorVertex(): this(default, default) + { + + } } diff --git a/CodeWalker.Core/GameFiles/Resources/WaypointRecord.cs b/CodeWalker.Core/GameFiles/Resources/WaypointRecord.cs index 8421d08..3308a3e 100644 --- a/CodeWalker.Core/GameFiles/Resources/WaypointRecord.cs +++ b/CodeWalker.Core/GameFiles/Resources/WaypointRecord.cs @@ -1,5 +1,7 @@ -using SharpDX; +using CodeWalker.Core.Utils; +using SharpDX; using System; +using System.Buffers; using System.Collections.Generic; using System.Linq; using System.Text; @@ -141,6 +143,17 @@ namespace CodeWalker.GameFiles this.Unk2 = reader.ReadUInt16(); this.Unk3 = reader.ReadUInt16(); } + + public void Read(ref SequenceReader reader, params object[] parameters) + { + // read structure data + this.Position = reader.ReadVector3(); + this.Unk0 = reader.ReadUInt16(); + this.Unk1 = reader.ReadUInt16(); + this.Unk2 = reader.ReadUInt16(); + this.Unk3 = reader.ReadUInt16(); + } + public override void Write(ResourceDataWriter writer, params object[] parameters) { // write structure data diff --git a/CodeWalker.Core/GameFiles/RpfFile.cs b/CodeWalker.Core/GameFiles/RpfFile.cs index 4002ece..a5b69f8 100644 --- a/CodeWalker.Core/GameFiles/RpfFile.cs +++ b/CodeWalker.Core/GameFiles/RpfFile.cs @@ -1,4 +1,7 @@ using CodeWalker.Core.Utils; +using CodeWalker.World; +using Collections.Pooled; +using Microsoft.Extensions.ObjectPool; using Microsoft.IO; using System; using System.Buffers; @@ -6,10 +9,15 @@ using System.Buffers.Binary; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Drawing; using System.IO; using System.IO.Compression; using System.IO.Pipes; using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading; @@ -25,7 +33,17 @@ namespace CodeWalker.GameFiles public uint Resources; public uint BinaryFiles; - public static FileCounts operator +(FileCounts a, FileCounts b) + public readonly bool Equals(in FileCounts b) + { + return + Rpfs == b.Rpfs + && Files == b.Files + && Folders == b.Folders + && Resources == b.Resources + && BinaryFiles == b.BinaryFiles; + } + + public static FileCounts operator +(in FileCounts a, in FileCounts b) { return new FileCounts { @@ -36,6 +54,16 @@ namespace CodeWalker.GameFiles BinaryFiles = a.BinaryFiles + b.BinaryFiles }; } + + public static bool operator ==(in FileCounts left, in FileCounts right) + { + return left.Equals(in right); + } + + public static bool operator !=(in FileCounts left, in FileCounts right) + { + return !(left == right); + } } public class RpfFile @@ -63,8 +91,8 @@ namespace CodeWalker.GameFiles public RpfEncryption Encryption { get; set; } //object linkage - public List AllEntries { get; set; } - public List Children { get; set; } + public PooledList AllEntries { get; set; } + public PooledList Children { get; set; } public RpfFile Parent { get; set; } public RpfBinaryFileEntry ParentFileEntry { get; set; } @@ -74,29 +102,6 @@ namespace CodeWalker.GameFiles public uint TotalFileCount { get; set; } - static RpfFile() - { - recyclableMemoryStreamManager.BufferDiscarded += (sender, args) => - { - Console.WriteLine($"Buffer Discarded: BufferType: {args.BufferType}; Reason: {args.Reason};"); - }; - - recyclableMemoryStreamManager.StreamDoubleDisposed += (sender, args) => - { - Console.WriteLine($"StreamDoubleDisposed: Stack1: {args.DisposeStack1}; Stack2: {args.DisposeStack2};"); - }; - - recyclableMemoryStreamManager.StreamOverCapacity += (sender, args) => - { - Console.WriteLine($"StreamOverCapacity: MaximumCapacity is {args.MaximumCapacity / 1024f / 1024f} MB, requisted: {args.RequestedCapacity / 1024f / 1024f:0.##} MB Stack: {args.AllocationStack}"); - }; - - recyclableMemoryStreamManager.StreamFinalized += (sender, args) => - { - Console.WriteLine($"StreamFinalized: {args.AllocationStack}"); - }; - } - public RpfFile(FileInfo fileInfo) { Name = fileInfo.Name; @@ -179,14 +184,15 @@ namespace CodeWalker.GameFiles throw new Exception("Invalid Resource - not GTAV!"); } + [ThreadStatic] + private static Stack cachedStack; private void ReadHeader(BinaryReader br) { - CurrentFileReader = br; - StartPos = br.BaseStream.Position; Version = br.ReadUInt32(); //RPF Version - GTAV should be 0x52504637 (1380992567) - EntryCount = br.ReadUInt32(); //Number of Entries + var entryCount = br.ReadUInt32(); //Number of Entries + EntryCount = entryCount; NamesLength = br.ReadUInt32(); Encryption = (RpfEncryption)br.ReadUInt32(); //0x04E45504F (1313165391): none; 0x0ffffff9 (268435449): AES @@ -195,7 +201,7 @@ namespace CodeWalker.GameFiles ThrowInvalidResource(); } - var entriesLength = (int)EntryCount * 16; + var entriesLength = (int)entryCount * 16; var namesLength = (int)NamesLength; byte[] entriesdata = ArrayPool.Shared.Rent(entriesLength); byte[] namesdata = ArrayPool.Shared.Rent(namesLength); @@ -207,6 +213,7 @@ namespace CodeWalker.GameFiles { case RpfEncryption.NONE: //no encryption case RpfEncryption.OPEN: //OpenIV style RPF with unencrypted TOC + case RpfEncryption.CFXP: break; case RpfEncryption.AES: GTACrypto.DecryptAES(entriesdata, entriesLength); @@ -216,26 +223,30 @@ namespace CodeWalker.GameFiles break; case RpfEncryption.NG: default: - GTACrypto.DecryptNG(entriesdata.AsSpan(0, entriesLength), Name, (uint)FileSize); - GTACrypto.DecryptNG(namesdata.AsSpan(0, namesLength), Name, (uint)FileSize); + GTACrypto.DecryptNG(entriesdata.AsMemory(0, entriesLength), Name, (uint)FileSize); + GTACrypto.DecryptNG(namesdata.AsMemory(0, namesLength), Name, (uint)FileSize); IsNGEncrypted = true; break; } - using var entriesrdr = new DataReader(new MemoryStream(entriesdata, 0, entriesLength)); - using var namesrdr = new DataReader(new MemoryStream(namesdata, 0, namesLength)); + + var entriessequence = new ReadOnlySequence(entriesdata); + var entriesrdr = new SequenceReader(entriessequence); + + var namessequence = new ReadOnlySequence(namesdata); + var namesrdr = new SequenceReader(namessequence); - AllEntries = new List((int)EntryCount); - TotalFileCount = 0; + var allEntries = new PooledList((int)entryCount); + AllEntries = allEntries; + var totalFileCount = 0u; - for (uint i = 0; i < EntryCount; i++) + for (uint i = 0; i < entryCount; i++) { - //entriesrdr.Position += 4; - uint y = entriesrdr.ReadUInt32(); - uint x = entriesrdr.ReadUInt32(); - entriesrdr.Position -= 8; + ulong xy = entriesrdr.ReadUInt64(); + + uint x = (uint)(xy >> 32); RpfEntry e; @@ -246,133 +257,124 @@ namespace CodeWalker.GameFiles else if ((x & 0x80000000) == 0) //binary file entry { e = new RpfBinaryFileEntry(); - TotalFileCount++; + totalFileCount++; } else //assume resource file entry { e = new RpfResourceFileEntry(); - TotalFileCount++; + totalFileCount++; } e.File = this; - e.H1 = y; - e.H2 = x; + e.Header = xy; - e.Read(entriesrdr); + e.Read(ref entriesrdr, br); - AllEntries.Add(e); - } + namesrdr.SetPosition(e.NameOffset); - foreach(var entry in AllEntries) - { - namesrdr.Position = entry.NameOffset; - entry.Name = namesrdr.ReadString(256); - JenkIndex.EnsureLower(entry.Name); - if (entry is RpfResourceFileEntry rfe)// && string.IsNullOrEmpty(e.Name)) + namesrdr.TryReadTo(out ReadOnlySpan buffer, 0); + if (buffer.Length > 256) + { + buffer = buffer.Slice(0, 256); + } + + e.Name = Encoding.UTF8.GetStringPooled(buffer); + JenkIndex.EnsureLower(e.Name); + if (e is RpfResourceFileEntry rfe)// && string.IsNullOrEmpty(e.Name)) { rfe.IsEncrypted = rfe.IsExtension(".ysc");//any other way to know..? } + + + allEntries.Add(e); } - Root = (RpfDirectoryEntry)AllEntries[0]; - Root.Path = Path;// + "\\" + Root.Name; - //var stack = new Stack(); + TotalFileCount = totalFileCount; - void addSubDirectory(RpfDirectoryEntry item) + Root = (RpfDirectoryEntry)allEntries[0]; + Root.Path = Path; + + var entriesSpan = AllEntries.Span; + + var stack = new Stack();; + stack.Push(Root); + while (stack.Count > 0) { + var item = stack.Pop(); + int starti = (int)item.EntriesIndex; - int endi = (int)(item.EntriesIndex + item.EntriesCount); + int endi = (int)(starti + item.EntriesCount); for (int i = starti; i < endi; i++) { - RpfEntry e = AllEntries[i]; + RpfEntry e = entriesSpan[i]; e.Parent = item; if (e is RpfDirectoryEntry rde) { - rde.Path = item.Path + '\\' + rde.Name; + rde.Path = $"{item.Path}\\{rde.Name}"; item.Directories.Add(rde); - addSubDirectory(rde); + stack.Push(rde); } else if (e is RpfFileEntry rfe) { - rfe.Path = item.Path + '\\' + rfe.Name; + rfe.Path = $"{item.Path}\\{rfe.Name}"; item.Files.Add(rfe); } } } - addSubDirectory(Root); - //stack.Push(Root); - //while (stack.Count > 0) - //{ - // var item = stack.Pop(); - - // int starti = (int)item.EntriesIndex; - // int endi = (int)(item.EntriesIndex + item.EntriesCount); - - // for (int i = starti; i < endi; i++) - // { - // RpfEntry e = AllEntries[i]; - // e.Parent = item; - // if (e is RpfDirectoryEntry rde) - // { - // rde.Path = item.Path + "\\" + rde.Name; - // item.Directories.Add(rde); - // stack.Push(rde); - // } - // else if (e is RpfFileEntry) - // { - // RpfFileEntry rfe = e as RpfFileEntry; - // rfe.Path = item.Path + "\\" + rfe.Name; - // item.Files.Add(rfe); - // } - // } - //} - br.BaseStream.Position = StartPos; - CurrentFileReader = null; ArrayPool.Shared.Return(entriesdata); ArrayPool.Shared.Return(namesdata); + stack.Clear(); } - public FileCounts ScanStructure(Action updateStatus, Action errorLog) + public bool ScanStructure(Action? updateStatus, Action? errorLog, out FileCounts fileCounts) { using var fileStream = File.OpenRead(FilePath); using var br = new BinaryReader(fileStream); try { - return ScanStructure(br, updateStatus, errorLog) ?? default; + return ScanStructure(br, updateStatus, errorLog, out fileCounts); } catch (Exception ex) { LastError = ex.ToString(); LastException = ex; - errorLog?.Invoke(FilePath + ": " + LastError); - return default; + errorLog?.Invoke($"{FilePath}: {ex}"); + Console.WriteLine($"{FilePath}: {ex}"); + fileCounts = default; + return false; } } - private FileCounts? ScanStructure(BinaryReader br, Action updateStatus, Action errorLog) + private bool ScanStructure(BinaryReader br, Action? updateStatus, Action? errorLog, out FileCounts fileCounts) { - if (FilePath == "update\\update.rpf\\dlc_patch\\patchday1ng\\x64\\patch\\data\\lang\\chinesesimp.rpf") return null; + if (FilePath == "update\\update.rpf\\dlc_patch\\patchday1ng\\x64\\patch\\data\\lang\\chinesesimp.rpf") + { + fileCounts = default; + return false; + } try { ReadHeader(br); - } catch + } + catch { - return null; + fileCounts = default; + return false; } - var fileCounts = new FileCounts + fileCounts = new FileCounts { Rpfs = 1, Files = 1 }; - Children = new List(); + Children = new PooledList(); - updateStatus?.Invoke("Scanning " + Path + "..."); + updateStatus?.Invoke($"Scanning {Path}..."); foreach (RpfEntry entry in AllEntries) { @@ -391,11 +393,11 @@ namespace CodeWalker.GameFiles subfile.Parent = this; subfile.ParentFileEntry = binentry; - var result = subfile.ScanStructure(br, updateStatus, errorLog); + var success = subfile.ScanStructure(br, updateStatus, errorLog, out var result); - if (result is not null) + if (success) { - fileCounts += result.Value; + fileCounts += result; Children.Add(subfile); } } @@ -418,10 +420,11 @@ namespace CodeWalker.GameFiles } catch (Exception ex) { - errorLog?.Invoke(entry.Path + ": " + ex.ToString()); + Console.WriteLine(ex); + errorLog?.Invoke($"{entry.Path}: {ex}"); } } - return fileCounts; + return true; } @@ -446,7 +449,7 @@ namespace CodeWalker.GameFiles } private void ExtractScripts(BinaryReader br, string outputfolder, Action updateStatus) { - updateStatus?.Invoke("Searching " + Name + "..."); + updateStatus?.Invoke($"Searching {Name}..."); ReadHeader(br); @@ -478,10 +481,10 @@ namespace CodeWalker.GameFiles if (resentry.IsExtension(".ysc")) { - updateStatus?.Invoke("Extracting " + resentry.Name + "..."); + updateStatus?.Invoke($"Extracting {resentry.Name}..."); //found a YSC file. extract it! - string ofpath = outputfolder + "\\" + resentry.Name; + string ofpath = $"{outputfolder}\\{resentry.Name}"; br.BaseStream.Position = StartPos + ((long)resentry.FileOffset * 512); @@ -501,11 +504,11 @@ namespace CodeWalker.GameFiles GTACrypto.DecryptAES(tbytes); //special case! probable duplicate pilot_school.ysc - ofpath = outputfolder + "\\" + Name + "___" + resentry.Name; + ofpath = $"{outputfolder}\\{Name}___{resentry.Name}"; } else { - GTACrypto.DecryptNG(tbytes.AsSpan(0, (int)totlen), resentry.Name, resentry.FileSize); + GTACrypto.DecryptNG(tbytes.AsMemory(0, (int)totlen), resentry.Name, resentry.FileSize); } @@ -521,10 +524,10 @@ namespace CodeWalker.GameFiles bool pathok = true; if (File.Exists(ofpath)) { - ofpath = outputfolder + "\\" + Name + "_" + resentry.Name; + ofpath = $"{outputfolder}\\{Name}_{resentry.Name}"; if (File.Exists(ofpath)) { - LastError = "Output file " + ofpath + " already exists!"; + LastError = $"Output file {ofpath} already exists!"; pathok = false; } } @@ -582,11 +585,11 @@ namespace CodeWalker.GameFiles // } //} - public byte[] ExtractFile(RpfFileEntry entry) + public byte[]? ExtractFile(RpfFileEntry entry) { try { - using var fileStream = new FileStream(GetPhysicalFilePath(), FileMode.Open, FileAccess.Read, FileShare.Read, 4096); + using var fileStream = new FileStream(GetPhysicalFilePath(), FileMode.Open, FileAccess.Read, FileShare.Read, 0); using (BinaryReader br = new BinaryReader(fileStream)) { if (entry is RpfBinaryFileEntry binaryFileEntry) @@ -612,26 +615,23 @@ namespace CodeWalker.GameFiles } } - public async ValueTask ExtractFileAsync(RpfFileEntry entry) + public async ValueTask ExtractFileAsync(RpfFileEntry entry) { try { - using var fileStream = new FileStream(GetPhysicalFilePath(), FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous); - using (BinaryReader br = new BinaryReader(fileStream)) + using var fileStream = new FileStream(GetPhysicalFilePath(), FileMode.Open, FileAccess.Read, FileShare.Read, 0, FileOptions.Asynchronous); + if (entry is RpfBinaryFileEntry binaryFileEntry) { - if (entry is RpfBinaryFileEntry binaryFileEntry) - { - return await ExtractFileBinaryAsync(binaryFileEntry, br).ConfigureAwait(false); - } - else if (entry is RpfResourceFileEntry resourceFileEntry) - { - return await ExtractFileResourceAsync(resourceFileEntry, br).ConfigureAwait(false); - } - else - { - Console.WriteLine($"{entry} is not a BinaryFileEntry of ResourceFileEntry"); - return null; - } + return await ExtractFileBinaryAsync(binaryFileEntry, fileStream); + } + else if (entry is RpfResourceFileEntry resourceFileEntry) + { + return await ExtractFileResourceAsync(resourceFileEntry, fileStream); + } + else + { + Console.WriteLine($"{entry} is not a BinaryFileEntry of ResourceFileEntry"); + return null; } } catch (Exception ex) @@ -642,9 +642,9 @@ namespace CodeWalker.GameFiles } } - public async ValueTask ExtractFileBinaryAsync(RpfBinaryFileEntry entry, BinaryReader br) + public async ValueTask ExtractFileBinaryAsync(RpfBinaryFileEntry entry, Stream stream) { - br.BaseStream.Position = StartPos + ((long)entry.FileOffset * 512); + stream.Position = StartPos + ((long)entry.FileOffset * 512); long l = entry.GetFileSize(); @@ -658,8 +658,8 @@ namespace CodeWalker.GameFiles byte[] tbytes = ArrayPool.Shared.Rent((int)totlen); - br.BaseStream.Position += offset; - await br.ReadAsync(tbytes, 0, (int)totlen).ConfigureAwait(false); + stream.Position += offset; + await stream.ReadAsync(tbytes, 0, (int)totlen).ConfigureAwait(false); if (entry.IsEncrypted) { @@ -669,14 +669,14 @@ namespace CodeWalker.GameFiles } else //if (IsNGEncrypted) //assume the archive is set to NG encryption if not AES... (comment: fix for openIV modded files) { - GTACrypto.DecryptNG(tbytes.AsSpan(0, (int)totlen), entry.Name, entry.FileUncompressedSize); + GTACrypto.DecryptNG(tbytes.AsMemory(0, (int)totlen), entry.Name, entry.FileUncompressedSize); } } byte[] defl; if (entry.FileSize > 0) //apparently this means it's compressed { - defl = await DecompressBytesAsync(tbytes).ConfigureAwait(false); + defl = await DecompressBytesAsync(tbytes, entry.GetUncompressedFileSize()).ConfigureAwait(false); } else { @@ -689,7 +689,12 @@ namespace CodeWalker.GameFiles return defl; } - public byte[] ExtractFileBinary(RpfBinaryFileEntry entry, BinaryReader br) + public ValueTask ExtractFileBinaryAsync(RpfBinaryFileEntry entry, BinaryReader br) + { + return ExtractFileBinaryAsync(entry, br.BaseStream); + } + + public byte[]? ExtractFileBinary(RpfBinaryFileEntry entry, BinaryReader br) { br.BaseStream.Position = StartPos + ((long)entry.FileOffset * 512); @@ -716,14 +721,14 @@ namespace CodeWalker.GameFiles } else //if (IsNGEncrypted) //assume the archive is set to NG encryption if not AES... (comment: fix for openIV modded files) { - GTACrypto.DecryptNG(tbytes.AsSpan(0, (int)totlen), entry.Name, entry.FileUncompressedSize); + GTACrypto.DecryptNG(tbytes.AsMemory(0, (int)totlen), entry.Name, entry.FileUncompressedSize); } } byte[] defl; if (entry.FileSize > 0) //apparently this means it's compressed { - defl = DecompressBytes(tbytes); + defl = DecompressBytes(tbytes, entry.GetUncompressedFileSize()); } else { @@ -736,9 +741,9 @@ namespace CodeWalker.GameFiles return defl; } - public async ValueTask ExtractFileResourceAsync(RpfResourceFileEntry entry, BinaryReader br) + public async ValueTask ExtractFileResourceAsync(RpfResourceFileEntry entry, Stream stream) { - br.BaseStream.Position = StartPos + ((long)entry.FileOffset * 512); + stream.Position = StartPos + ((long)entry.FileOffset * 512); if (entry.FileSize <= 0) { @@ -751,9 +756,9 @@ namespace CodeWalker.GameFiles byte[] tbytes = ArrayPool.Shared.Rent((int)totlen); - br.BaseStream.Position += offset; + stream.Position += offset; - await br.ReadAsync(tbytes, 0, (int)totlen); + await stream.ReadAsync(tbytes, 0, (int)totlen).ConfigureAwait(false); if (entry.IsEncrypted) { if (IsAESEncrypted) @@ -762,11 +767,11 @@ namespace CodeWalker.GameFiles } else //if (IsNGEncrypted) //assume the archive is set to NG encryption if not AES... (comment: fix for openIV modded files) { - GTACrypto.DecryptNG(tbytes.AsSpan(0, (int)totlen), entry.Name, entry.FileSize); + GTACrypto.DecryptNG(tbytes.AsMemory(0, (int)totlen), entry.Name, entry.FileSize); } } - byte[] deflated = await DecompressBytesAsync(tbytes); + byte[] deflated = await DecompressBytesAsync(tbytes, entry.GetUncompressedFileSize()); byte[] data; if (deflated != null) @@ -786,7 +791,12 @@ namespace CodeWalker.GameFiles return data; } - public byte[] ExtractFileResource(RpfResourceFileEntry entry, BinaryReader br) + public ValueTask ExtractFileResourceAsync(RpfResourceFileEntry entry, BinaryReader br) + { + return ExtractFileResourceAsync(entry, br.BaseStream); + } + + public byte[]? ExtractFileResource(RpfResourceFileEntry entry, BinaryReader br) { br.BaseStream.Position = StartPos + ((long)entry.FileOffset * 512); @@ -813,11 +823,11 @@ namespace CodeWalker.GameFiles } else //if (IsNGEncrypted) //assume the archive is set to NG encryption if not AES... (comment: fix for openIV modded files) { - GTACrypto.DecryptNG(tbytes.AsSpan(0, (int)totlen), entry.Name, entry.FileSize); + GTACrypto.DecryptNG(tbytes.AsMemory(0, (int)totlen), entry.Name, entry.FileSize); } } - byte[] deflated = DecompressBytes(tbytes); + byte[] deflated = DecompressBytes(tbytes, entry.GetUncompressedFileSize()); byte[] data; if (deflated != null) @@ -837,11 +847,11 @@ namespace CodeWalker.GameFiles return data; } - public static T GetFile(RpfEntry e) where T : class, PackedFile, new() + public static T? GetFile(RpfEntry e) where T : class, PackedFile, new() { - T file = null; - byte[] data = null; - RpfFileEntry entry = e as RpfFileEntry; + T? file = null; + byte[]? data = null; + RpfFileEntry? entry = e as RpfFileEntry; if (entry != null) { data = entry.File.ExtractFile(entry); @@ -855,27 +865,23 @@ namespace CodeWalker.GameFiles } public static T GetFile(RpfEntry e, byte[] data) where T : class, PackedFile, new() { - T file = null; - RpfFileEntry entry = e as RpfFileEntry; - if ((data != null)) + ArgumentNullException.ThrowIfNull(data, nameof(data)); + if (e is not RpfFileEntry entry) { - if (entry == null) - { - entry = CreateResourceFileEntry(ref data, 0); - } - file = new T(); - file.Load(data, entry); + entry = CreateResourceFileEntry(ref data, 0); } + var file = new T(); + file.Load(data, entry); return file; } public static T GetFile(RpfEntry e, Stream data) where T : class, PackedFileStream, new() { - T file = null; - RpfFileEntry entry = e as RpfFileEntry; - if ((data != null)) + ArgumentNullException.ThrowIfNull(data, nameof(data)); + T? file = null; + if (data is not null) { - if (entry == null) + if (e is not RpfFileEntry entry) { entry = CreateResourceFileEntry(data, 0); } @@ -887,11 +893,11 @@ namespace CodeWalker.GameFiles - public static T GetResourceFile(byte[] data) where T : class, PackedFile, new() + public static T? GetResourceFile(byte[] data) where T : class, PackedFile, new() { - T file = null; + T? file = null; RpfFileEntry entry = CreateResourceFileEntry(ref data, 0); - if ((data != null) && (entry != null)) + if (data != null && entry != null) { data = ResourceBuilder.Decompress(data); file = new T(); @@ -911,8 +917,7 @@ namespace CodeWalker.GameFiles { GameFile gfile = file as GameFile; - var oldresentry = gfile.RpfFileEntry as RpfResourceFileEntry; - if (oldresentry != null) //update the existing entry with the new one + if (gfile.RpfFileEntry is RpfResourceFileEntry oldresentry) //update the existing entry with the new one { oldresentry.SystemFlags = resentry.SystemFlags; oldresentry.GraphicsFlags = resentry.GraphicsFlags; @@ -935,12 +940,9 @@ namespace CodeWalker.GameFiles RpfResourceFileEntry resentry = CreateResourceFileEntry(ref data, ver); - if (file is GameFile) + if (file is GameFile gfile) { - GameFile gfile = file as GameFile; - - var oldresentry = gfile.RpfFileEntry as RpfResourceFileEntry; - if (oldresentry != null) //update the existing entry with the new one + if (gfile.RpfFileEntry is RpfResourceFileEntry oldresentry) //update the existing entry with the new one { oldresentry.SystemFlags = resentry.SystemFlags; oldresentry.GraphicsFlags = resentry.GraphicsFlags; @@ -955,7 +957,29 @@ namespace CodeWalker.GameFiles data = ResourceBuilder.Decompress(data); file.Load(data, resentry); + } + public static async Task LoadResourceFileAsync(T file, byte[] data, uint ver) where T : class, PackedFile + { + RpfResourceFileEntry resentry = CreateResourceFileEntry(ref data, ver); + + if (file is GameFile gfile) + { + if (gfile.RpfFileEntry is RpfResourceFileEntry oldresentry) //update the existing entry with the new one + { + oldresentry.SystemFlags = resentry.SystemFlags; + oldresentry.GraphicsFlags = resentry.GraphicsFlags; + resentry.Name = oldresentry.Name; + } + else + { + gfile.RpfFileEntry = resentry; //just stick it in there for later... + } + } + + data = await ResourceBuilder.DecompressAsync(data); + + file.Load(data, resentry); } public static RpfResourceFileEntry CreateResourceFileEntry(Stream stream, uint ver, uint? header = null) @@ -1049,51 +1073,58 @@ namespace CodeWalker.GameFiles LastException = null; if (!entry.IsExtension(".rpf")) //don't try to extract rpf's, they will be done separately.. { - if (entry is RpfBinaryFileEntry) + if (entry is RpfBinaryFileEntry binentry) { - RpfBinaryFileEntry binentry = entry as RpfBinaryFileEntry; - byte[] data = ExtractFileBinary(binentry, br); - if (data == null) + try { - if (binentry.FileSize == 0) + byte[]? data = ExtractFileBinary(binentry, br); + if (data is null) { - sb.AppendFormat("{0} : Binary FileSize is 0.", entry.Path); - sb.AppendLine(); + if (binentry.FileSize == 0) + { + sb.AppendLine($"{entry.Path} : Binary FileSize is 0."); + } + else + { + sb.AppendLine($"{entry.Path} : {LastError}"); + } } - else + else if (data.Length == 0) { - sb.AppendFormat("{0} : {1}", entry.Path, LastError); - sb.AppendLine(); + sb.AppendLine($"{entry.Path} : Decompressed output was empty."); } } - else if (data.Length == 0) + catch(Exception ex) { - sb.AppendFormat("{0} : Decompressed output was empty.", entry.Path); - sb.AppendLine(); + sb.AppendLine($"{entry.Path} : {ex}"); } } - else if (entry is RpfResourceFileEntry) + else if (entry is RpfResourceFileEntry resentry) { - RpfResourceFileEntry resentry = entry as RpfResourceFileEntry; - byte[] data = ExtractFileResource(resentry, br); - if (data == null) + try { - if (resentry.FileSize == 0) + byte[]? data = ExtractFileResource(resentry, br); + if (data == null) { - sb.AppendFormat("{0} : Resource FileSize is 0.", entry.Path); - sb.AppendLine(); + if (resentry.FileSize == 0) + { + sb.AppendLine($"{entry.Path} : Resource FileSize is 0."); + } + else + { + sb.AppendLine($"{entry.Path} : {LastError}"); + } } - else + else if (data.Length == 0) { - sb.AppendFormat("{0} : {1}", entry.Path, LastError); - sb.AppendLine(); + sb.AppendLine($"{entry.Path} : Decompressed output was empty."); } } - else if (data.Length == 0) + catch(Exception ex) { - sb.AppendFormat("{0} : Decompressed output was empty.", entry.Path); - sb.AppendLine(); + sb.AppendLine($"{entry.Path} : {ex}"); } + } } } @@ -1101,8 +1132,8 @@ namespace CodeWalker.GameFiles { LastError = ex.ToString(); LastException = ex; - sb.AppendFormat("{0} : {1}", entry.Path, ex.Message); - sb.AppendLine(); + Console.WriteLine(ex); + sb.AppendLine($"{entry.Path} : {ex.Message}"); } } } @@ -1111,8 +1142,8 @@ namespace CodeWalker.GameFiles { LastError = ex.ToString(); LastException = ex; - sb.AppendFormat("{0} : {1}", Path, ex.Message); - sb.AppendLine(); + Console.WriteLine(ex); + sb.AppendLine($"{Path} : {ex.Message}"); return null; } return sb.ToString(); @@ -1121,13 +1152,13 @@ namespace CodeWalker.GameFiles - public List GetFiles(string folder, bool recurse) + public IReadOnlyCollection GetFiles(string folder, bool recurse) { if (Root == null) { - return new List(); + return []; } - List result = new List(); + PooledList result = new PooledList(); //folder.AsSpan().Split RpfDirectoryEntry dir = Root; foreach(var part in folder.EnumerateSplit('\\')) @@ -1135,13 +1166,17 @@ namespace CodeWalker.GameFiles if (part.Length == 0) continue; dir = FindSubDirectory(dir, part); + //if (dir is null) + //{ + // return Array.Empty(); + //} } GetFiles(dir, result, recurse); return result; } - public void GetFiles(RpfDirectoryEntry dir, List result, bool recurse) + public void GetFiles(RpfDirectoryEntry dir, PooledList result, bool recurse) { if (dir.Files != null) { @@ -1151,30 +1186,15 @@ namespace CodeWalker.GameFiles { if (dir.Directories != null) { - for (int i = 0; i < dir.Directories.Count; i++) + foreach(var dirEntry in dir.Directories) { - GetFiles(dir.Directories[i], result, recurse); + GetFiles(dirEntry, result, recurse); } } } } - private RpfDirectoryEntry FindSubDirectory(RpfDirectoryEntry dir, string name) - { - if (dir == null) return null; - if (dir.Directories == null) return null; - for (int i = 0; i < dir.Directories.Count; i++) - { - var cdir = dir.Directories[i]; - if (cdir.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) - { - return cdir; - } - } - return null; - } - - private RpfDirectoryEntry FindSubDirectory(RpfDirectoryEntry dir, ReadOnlySpan name) + private RpfDirectoryEntry? FindSubDirectory(RpfDirectoryEntry dir, ReadOnlySpan name) { if (dir == null) return null; if (dir.Directories == null) return null; @@ -1192,18 +1212,32 @@ namespace CodeWalker.GameFiles } - private static readonly Stopwatch compression = new Stopwatch(); public static RecyclableMemoryStreamManager recyclableMemoryStreamManager = new RecyclableMemoryStreamManager(256 * 1024, 1024 * 1024, 128 * 1024 * 1024, false, 256 * 1024 * 100, 1024 * 1024 * 128 * 4); - public byte[] DecompressBytes(byte[] bytes) + public byte[] DecompressBytes(byte[] bytes, long requiredSize = -1) { try { + if (requiredSize == -1) + { + requiredSize = bytes.Length; + } using DeflateStream ds = new DeflateStream(new MemoryStream(bytes), CompressionMode.Decompress); - using var outstr = recyclableMemoryStreamManager.GetStream("DecompressBytes", bytes.Length); + using var outstr = new MemoryStream((int)requiredSize); ds.CopyTo(outstr, 524288); - byte[] outbuf = outstr.ToArray(); //need to copy to the right size buffer for output. + + byte[] outbuf = Array.Empty(); + try + { + outbuf = outstr.GetBuffer(); + } + catch (Exception ex) + { + // Failed to get buffer + Console.WriteLine(ex); + outbuf = outstr.ToArray(); + } if (outbuf.Length <= bytes.Length) { @@ -1211,6 +1245,18 @@ namespace CodeWalker.GameFiles //return null; //could still be OK for tiny things! } + if (outbuf.Length != requiredSize) + { + Console.WriteLine($"Buffer was resized for expectedSize: {requiredSize}; actualSize: {outbuf.Length}"); + } + + // Ensure array is correct size (this ensures everything works even is expectedSize is incorrect, but adds allocation overhead) + if (outbuf.Length != outstr.Length) + { + Console.WriteLine($"Calling to array on MemoryStream"); + outbuf = outbuf.ToArray(); + } + return outbuf; } catch (Exception ex) @@ -1221,15 +1267,28 @@ namespace CodeWalker.GameFiles } } - public async Task DecompressBytesAsync(byte[] bytes) + public async Task DecompressBytesAsync(byte[] bytes, long expectedSize = -1) { try { + if (expectedSize == -1) + { + expectedSize = bytes.Length; + } using DeflateStream ds = new DeflateStream(new MemoryStream(bytes), CompressionMode.Decompress); - using var outstr = recyclableMemoryStreamManager.GetStream("DecompressBytes", bytes.Length); + using var outstr = new MemoryStream((int)expectedSize); await ds.CopyToAsync(outstr, 524288).ConfigureAwait(false); - byte[] outbuf = outstr.ToArray(); //need to copy to the right size buffer for output. + byte[] outbuf = Array.Empty(); + try + { + outbuf = outstr.GetBuffer(); + } + catch(Exception ex) + { + Console.WriteLine(ex); + outbuf = outstr.ToArray(); + } if (outbuf.Length <= bytes.Length) { @@ -1237,6 +1296,18 @@ namespace CodeWalker.GameFiles //return null; //could still be OK for tiny things! } + if (outbuf.Length != expectedSize) + { + Console.WriteLine($"Buffer was resized for expectedSize: {expectedSize}; actualSize: {outbuf.Length}"); + } + + // Ensure array is correct size (this ensures everything works even is expectedSize is incorrect, but adds allocation overhead) + if (outbuf.Length != outstr.Length) + { + Console.WriteLine($"Calling to array on MemoryStream"); + outbuf = outbuf.ToArray(); + } + return outbuf; } catch (Exception ex) @@ -1249,9 +1320,9 @@ namespace CodeWalker.GameFiles public static byte[] CompressBytes(byte[] data) //TODO: refactor this with ResourceBuilder.Compress/Decompress { - using (MemoryStream ms = recyclableMemoryStreamManager.GetStream("CompressBytes", data.Length)) + using (MemoryStream ms = recyclableMemoryStreamManager.GetStream("CompressBytes")) { - using (var ds = new DeflateStream(ms, CompressionMode.Compress, true)) + using (var ds = new DeflateStream(ms, CompressionLevel.SmallestSize, true)) { ds.Write(data, 0, data.Length); ds.Close(); @@ -1291,6 +1362,7 @@ namespace CodeWalker.GameFiles { case RpfEncryption.NONE: //no encryption case RpfEncryption.OPEN: //OpenIV style RPF with unencrypted TOC + case RpfEncryption.CFXP: break; case RpfEncryption.AES: entriesdata = GTACrypto.EncryptAES(entriesdata); @@ -1331,13 +1403,13 @@ namespace CodeWalker.GameFiles } } - + [MemberNotNull(nameof(AllEntries))] private void EnsureAllEntries() { if (AllEntries == null) { //assume this is a new RPF, create the root directory entry - AllEntries = new List(); + AllEntries = new PooledList(); Root = new RpfDirectoryEntry(); Root.File = this; Root.Name = string.Empty; @@ -1345,14 +1417,18 @@ namespace CodeWalker.GameFiles } if (Children == null) { - Children = new List(); + Children = new PooledList(); } //re-build the AllEntries list from the root node. List temp = new List(); //for sorting + + //using var tempList = new PooledList(); + AllEntries.Clear(); + //tempList.Add(Root); AllEntries.Add(Root); Stack stack = new Stack(); stack.Push(Root); @@ -1371,15 +1447,17 @@ namespace CodeWalker.GameFiles foreach (var entry in temp) { + //tempList.Add(entry); AllEntries.Add(entry); - RpfDirectoryEntry dir = entry as RpfDirectoryEntry; - if (dir != null) + if (entry is RpfDirectoryEntry dir) { stack.Push(dir); } } } + //AllEntries.AddRange(tempRange); + EntryCount = (uint)AllEntries.Count; } @@ -1444,8 +1522,7 @@ namespace CodeWalker.GameFiles RpfFileEntry nextentry = null; foreach (var entry in AllEntries) { - RpfFileEntry fe = entry as RpfFileEntry; - if ((fe != null) && (fe.FileOffset > block)) + if ((entry is RpfFileEntry fe) && (fe.FileOffset > block)) { if ((nextentry == null) || (fe.FileOffset < nextentry.FileOffset)) { @@ -1466,8 +1543,7 @@ namespace CodeWalker.GameFiles List allfiles = new List(); foreach (var entry in AllEntries) { - RpfFileEntry rfe = entry as RpfFileEntry; - if (rfe != null) + if (entry is RpfFileEntry rfe) { allfiles.Add(rfe); } @@ -1509,8 +1585,7 @@ namespace CodeWalker.GameFiles uint endblock = 0; foreach (var entry in AllEntries) { - RpfFileEntry e = entry as RpfFileEntry; - if (e != null) + if (entry is RpfFileEntry e) { uint ecnt = GetBlockCount(e.GetFileSize()); uint eend = e.FileOffset + ecnt; @@ -1701,8 +1776,7 @@ namespace CodeWalker.GameFiles { file.Path = dir.Path + "\\" + file.Name; - RpfBinaryFileEntry binf = file as RpfBinaryFileEntry; - if ((binf != null) && file.IsExtension(".rpf")) + if ((file is RpfBinaryFileEntry binf) && file.IsExtension(".rpf")) { RpfFile childrpf = FindChildArchive(binf); if (childrpf != null) @@ -1748,8 +1822,7 @@ namespace CodeWalker.GameFiles foreach (var entry in AllEntries) { - var fentry = entry as RpfFileEntry; - if (fentry != null) + if (entry is RpfFileEntry fentry) { blockcount += GetBlockCount(fentry.GetFileSize()); } @@ -2079,7 +2152,7 @@ namespace CodeWalker.GameFiles using var fstream = File.OpenRead(fpath); using var br = new BinaryReader(fstream); fstream.Position = file.StartPos; - file.ScanStructure(br, null, null); + file.ScanStructure(br, null, null, out _); } return entry; @@ -2146,13 +2219,13 @@ namespace CodeWalker.GameFiles } RpfDirectoryEntry entryasdir = entry as RpfDirectoryEntry; - RpfFileEntry entryasfile = entry as RpfFileEntry;//it has to be one or the other... + //it has to be one or the other... if (entryasdir != null) { var deldirs = entryasdir.Directories.ToArray(); var delfiles = entryasdir.Files.ToArray(); - foreach(var deldir in deldirs) + foreach (var deldir in deldirs) { DeleteEntry(deldir); } @@ -2171,7 +2244,7 @@ namespace CodeWalker.GameFiles { entry.Parent.Directories.Remove(entryasdir); } - if (entryasfile != null) + if (entry is RpfFileEntry entryasfile) { entry.Parent.Files.Remove(entryasfile); @@ -2262,8 +2335,7 @@ namespace CodeWalker.GameFiles var allfiles = new List(); for (int i = 0; i < file.AllEntries.Count; i++) { - var entry = file.AllEntries[i] as RpfFileEntry; - if (entry != null) allfiles.Add(entry); + if (file.AllEntries[i] is RpfFileEntry entry) allfiles.Add(entry); } //make sure we process everything in the current order that they are in the archive allfiles.Sort((a, b) => { return a.FileOffset.CompareTo(b.FileOffset); }); @@ -2361,6 +2433,13 @@ namespace CodeWalker.GameFiles OPEN = 0x4E45504F, //1313165391 "OPEN", ie. "no encryption" AES = 0x0FFFFFF9, //268435449 NG = 0x0FEFFFFF, //267386879 + CFXP = 0x50584643, + } + + public enum FileHeader : uint + { + RSC7 = 0x37435352, + FXAP = 0x50415846, } @@ -2369,10 +2448,8 @@ namespace CodeWalker.GameFiles public RpfFile File { get; set; } public RpfDirectoryEntry Parent { get; set; } - public static int ExtensionHits = 0; - public static int ExtensionMisses = 0; - - public uint NameHash { get + public uint NameHash { + get { if (nameHash == 0 && !string.IsNullOrEmpty(Name)) { @@ -2385,9 +2462,10 @@ namespace CodeWalker.GameFiles nameHash = value; } } - public uint ShortNameHash { get + public uint ShortNameHash { + get { - if (shortNameHash == 0 && !string.IsNullOrEmpty(ShortName)) + if (shortNameHash == 0 && !ShortName.IsEmpty) { shortNameHash = JenkHash.GenHashLower(ShortName); } @@ -2399,8 +2477,15 @@ namespace CodeWalker.GameFiles } } - public uint NameOffset { get; set; } - public string Name { get => name; set + public virtual uint NameOffset + { + get => (uint)(Header & 0xFFFF); + set => Header = (Header & ~0xFFFFUL) | (value & 0xFFFF); + } + + public string Name { + get => name; + set { if (name == value) { @@ -2409,16 +2494,14 @@ namespace CodeWalker.GameFiles name = value; nameHash = 0; shortNameHash = 0; - shortName = null; - extension = null; + shortNameIndex = -1; } } - public string Extension - { + public ReadOnlySpan ShortName { get { - if (extension == null) + if (shortNameIndex == -1 && !string.IsNullOrEmpty(Name)) { int length = Name.Length; for (int i = length; --i >= 0;) @@ -2426,67 +2509,42 @@ namespace CodeWalker.GameFiles char ch = Name[i]; if (ch == '.') { - var result = Name.AsSpan(i, length - i); - Span lowered = stackalloc char[result.Length]; - result.ToLowerInvariant(lowered); - extension = lowered.ToString(); + shortNameIndex = i; + //shortName = Name.Substring(0, i); break; } if (ch == System.IO.Path.DirectorySeparatorChar || ch == System.IO.Path.AltDirectorySeparatorChar) { + shortNameIndex = Name.Length; break; } } - extension ??= string.Empty; } - return extension; - } - } - - public string ShortName { - get - { - if (string.IsNullOrEmpty(shortName) && !string.IsNullOrEmpty(Name)) + if (shortNameIndex == -1 || shortNameIndex == Name.Length) { - int length = Name.Length; - for (int i = length; --i >= 0;) - { - char ch = Name[i]; - if (ch == '.') - { - Interlocked.Increment(ref ExtensionHits); - shortName = Name.Substring(0, i); - break; - } - if (ch == System.IO.Path.DirectorySeparatorChar || ch == System.IO.Path.AltDirectorySeparatorChar) - { - Interlocked.Increment(ref ExtensionMisses); - shortName = Name; - break; - } - } + return Name; } - return shortName; - } - set - { - shortName = value; + return Name.AsSpan(0, shortNameIndex); } } public string Path { get; set; } - public uint H1; //first 2 header values from RPF table... - public uint H2; + //public uint H1; //first 2 header values from RPF table... + //public uint H2; + public ulong Header; private string name; private uint shortNameHash; private uint nameHash; - private string shortName; - private string extension; - public abstract void Read(DataReader reader); + private int shortNameIndex = -1; + + public abstract void Read(DataReader reader, BinaryReader br); + + public abstract void Read(ref SequenceReader reader, BinaryReader br); + public abstract void Write(DataWriter writer); public override string ToString() @@ -2496,7 +2554,7 @@ namespace CodeWalker.GameFiles public bool IsExtension(string ext) { - return Extension.Equals(ext, StringComparison.Ordinal); + return Name.EndsWith(ext, StringComparison.OrdinalIgnoreCase); } } @@ -2506,20 +2564,38 @@ namespace CodeWalker.GameFiles public uint EntriesIndex { get; set; } public uint EntriesCount { get; set; } - public List Directories = new List(); - public List Files = new List(); + public override uint NameOffset => (uint)(Header & 0xFFFFFFFF); - public override void Read(DataReader reader) + public uint Ident { - NameOffset = reader.ReadUInt32(); - uint ident = reader.ReadUInt32(); - if (ident != 0x7FFFFF00u) + get => (uint)((Header >> 32) & 0xFFFFFFFF); + set => Header = (Header & 0xFFFFFFFF) | (value << 32); + } + + public PooledList Directories = new PooledList(); + public PooledList Files = new PooledList(); + + + public override void Read(DataReader reader, BinaryReader _) + { + if (Ident != 0x7FFFFF00u) { throw new Exception("Error in RPF7 directory entry."); } EntriesIndex = reader.ReadUInt32(); EntriesCount = reader.ReadUInt32(); } + + public override void Read(ref SequenceReader reader, BinaryReader br) + { + if (Ident != 0x7FFFFF00u) + { + throw new Exception("Error in RPF7 directory entry."); + } + EntriesIndex = reader.ReadUInt32(); + EntriesCount = reader.ReadUInt32(); + } + public override void Write(DataWriter writer) { writer.Write(NameOffset); @@ -2527,35 +2603,75 @@ namespace CodeWalker.GameFiles writer.Write(EntriesIndex); writer.Write(EntriesCount); } + + public void Dispose() + { + Directories.Dispose(); + Files.Dispose(); + GC.SuppressFinalize(this); + } + + //[MemberNotNull(nameof(files), nameof(directories))] + //public void InitFilesAndDirectories() + //{ + // int starti = (int)EntriesIndex; + // int endi = (int)(EntriesIndex + EntriesCount); + + // var AllEntries = File.AllEntries; + + // files = new List(); + // directories = new List(); + + // for (int i = starti; i < endi; i++) + // { + // RpfEntry e = AllEntries[i]; + // e.Parent = this; + // if (e is RpfDirectoryEntry rde) + // { + // directories.Add(rde); + // } + // else if (e is RpfFileEntry rfe) + // { + // files.Add(rfe); + // } + // } + //} + public override string ToString() { - return "Directory: " + Path; + return $"Directory: {Path}"; } } [TypeConverter(typeof(ExpandableObjectConverter))] public abstract class RpfFileEntry : RpfEntry { - public uint FileOffset { get; set; } - public uint FileSize { get; set; } + public uint FileOffset { + get => (uint) ((Header >> 40) & 0x7FFFFFU); + set => Header = (Header & ~(0x7FFFFFUL << 40)) | (((value & 0x7FFFFFUL) | 0x800000UL) << 40); + } + public abstract uint FileSize { get; set; } public bool IsEncrypted { get; set; } + public abstract long GetUncompressedFileSize(); public abstract long GetFileSize(); public abstract void SetFileSize(uint s); } - [TypeConverter(typeof(ExpandableObjectConverter))] public class RpfBinaryFileEntry : RpfFileEntry + [TypeConverter(typeof(ExpandableObjectConverter))] + public class RpfBinaryFileEntry : RpfFileEntry { public uint FileUncompressedSize { get; set; } public uint EncryptionType { get; set; } - public override void Read(DataReader reader) + public override uint FileSize { - ulong buf = reader.ReadUInt64(); - NameOffset = (uint)buf & 0xFFFF; - FileSize = (uint)(buf >> 16) & 0xFFFFFF; - FileOffset = (uint)(buf >> 40) & 0xFFFFFF; + get => (uint)((Header >> 16) & 0xFFFFFF); + set => Header = (Header & ~0xFFFFFF0000UL) | ((value & 0xFFFFFFUL) << 16); + } + public override void Read(DataReader reader, BinaryReader _) + { FileUncompressedSize = reader.ReadUInt32(); EncryptionType = reader.ReadUInt32(); @@ -2569,6 +2685,23 @@ namespace CodeWalker.GameFiles } } + + public override void Read(ref SequenceReader reader, BinaryReader _) + { + FileUncompressedSize = reader.ReadUInt32(); + + EncryptionType = reader.ReadUInt32(); + + switch (EncryptionType) + { + case 0: IsEncrypted = false; break; + case 1: IsEncrypted = true; break; + default: + throw new Exception($"Error in RPF7 file entry. {EncryptionType}"); + } + + } + public override void Write(DataWriter writer) { writer.Write((ushort)NameOffset); @@ -2596,7 +2729,12 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return "Binary file: " + Path; + return $"Binary file: {Path}"; + } + + public override long GetUncompressedFileSize() + { + return FileUncompressedSize; } public override long GetFileSize() @@ -2619,16 +2757,16 @@ namespace CodeWalker.GameFiles public static int GetSizeFromFlags(uint flags) { //dexfx simplified version - var s0 = ((flags >> 27) & 0x1) << 0; // 1 bit - 27 (*1) - var s1 = ((flags >> 26) & 0x1) << 1; // 1 bit - 26 (*2) - var s2 = ((flags >> 25) & 0x1) << 2; // 1 bit - 25 (*4) - var s3 = ((flags >> 24) & 0x1) << 3; // 1 bit - 24 (*8) + var s0 = ((flags >> 27) & 0x1) << 0; // 1 bit - 27 (*1) + var s1 = ((flags >> 26) & 0x1) << 1; // 1 bit - 26 (*2) + var s2 = ((flags >> 25) & 0x1) << 2; // 1 bit - 25 (*4) + var s3 = ((flags >> 24) & 0x1) << 3; // 1 bit - 24 (*8) var s4 = ((flags >> 17) & 0x7F) << 4; // 7 bits - 17 - 23 (*16) (max 127 * 16) var s5 = ((flags >> 11) & 0x3F) << 5; // 6 bits - 11 - 16 (*32) (max 63 * 32) - var s6 = ((flags >> 7) & 0xF) << 6; // 4 bits - 7 - 10 (*64) (max 15 * 64) - var s7 = ((flags >> 5) & 0x3) << 7; // 2 bits - 5 - 6 (*128) (max 3 * 128) - var s8 = ((flags >> 4) & 0x1) << 8; // 1 bit - 4 (*256) - var ss = ((flags >> 0) & 0xF); // 4 bits - 0 - 3 + var s6 = ((flags >> 7) & 0xF) << 6; // 4 bits - 7 - 10 (*64) (max 15 * 64) + var s7 = ((flags >> 5) & 0x3) << 7; // 2 bits - 5 - 6 (*128) (max 3 * 128) + var s8 = ((flags >> 4) & 0x1) << 8; // 1 bit - 4 (*256) + var ss = ((flags >> 0) & 0xF); // 4 bits - 0 - 3 var baseSize = 0x200 << (int)ss; var size = baseSize * (s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8); return (int)size; @@ -2766,7 +2904,7 @@ namespace CodeWalker.GameFiles size = origsize; blocksize = blocksize << (int)ss; //adjust the block size to reduce the block count. remainder = size & blocksize; - if(remainder!=0) + if (remainder != 0) { size = (size - remainder) + blocksize; //readjust size with round-up } @@ -2797,7 +2935,7 @@ namespace CodeWalker.GameFiles f |= (s3 & 0x1) << 24; f |= (s4 & 0x7F) << 17; f |= (ss & 0xF); - + return f; @@ -2911,63 +3049,81 @@ namespace CodeWalker.GameFiles } - public int Version + public int Version => GetVersionFromFlags(SystemFlags, GraphicsFlags); + + public uint FileSizeHeader { + get => (uint) ((Header >> 16) & 0xFFFFFF); + set => Header = (Header & ~0xFFFFFF0000UL) | ((value & 0xFFFFFFUL) << 16); + } + + public uint fileSize; + public override uint FileSize { - get - { - return GetVersionFromFlags(SystemFlags, GraphicsFlags); + get => fileSize; + set { + + if (value > 0xFFFFFF) + { + FileSizeHeader = 0xFFFFFF; + } else + { + FileSizeHeader = value; + } + fileSize = value; } } + public int SystemSize => (int)SystemFlags.Size; + public int GraphicsSize => (int)GraphicsFlags.Size; - public int SystemSize + [SkipLocalsInit] + public override void Read(DataReader reader, BinaryReader cfr) { - get - { - return (int)SystemFlags.Size; - } - } - public int GraphicsSize - { - get - { - return (int)GraphicsFlags.Size; - } - } + fileSize = FileSizeHeader; - public override void Read(DataReader reader) - { - var buffer = ArrayPool.Shared.Rent(3); - NameOffset = reader.ReadUInt16(); - - reader.ReadBytes(3, buffer); - FileSize = (uint)buffer[0] + (uint)(buffer[1] << 8) + (uint)(buffer[2] << 16); - - reader.ReadBytes(3, buffer); - FileOffset = ((uint)buffer[0] + (uint)(buffer[1] << 8) + (uint)(buffer[2] << 16)) & 0x7FFFFF; - ArrayPool.Shared.Return(buffer); SystemFlags = reader.ReadUInt32(); GraphicsFlags = reader.ReadUInt32(); // there are sometimes resources with length=0xffffff which actually // means length>=0xffffff - if (FileSize == 0xFFFFFF) + if (fileSize == 0xFFFFFF) { - BinaryReader cfr = File.CurrentFileReader; long opos = cfr.BaseStream.Position; cfr.BaseStream.Position = File.StartPos + ((long)FileOffset * 512); //need to use the base offset!! - var buf = cfr.ReadBytes(16); - FileSize = ((uint)buf[7] << 0) | ((uint)buf[14] << 8) | ((uint)buf[5] << 16) | ((uint)buf[2] << 24); + Span buf = stackalloc byte[16]; + cfr.BaseStream.ReadAtLeast(buf, 16); + fileSize = ((uint)buf[7] << 0) | ((uint)buf[14] << 8) | ((uint)buf[5] << 16) | ((uint)buf[2] << 24); cfr.BaseStream.Position = opos; } - } + + [SkipLocalsInit] + public override void Read(ref SequenceReader reader, BinaryReader cfr) + { + fileSize = FileSizeHeader; + SystemFlags = reader.ReadUInt32(); + GraphicsFlags = reader.ReadUInt32(); + + // there are sometimes resources with length=0xffffff which actually + // means length>=0xffffff + if (fileSize == 0xFFFFFF) + { + long opos = cfr.BaseStream.Position; + cfr.BaseStream.Position = File.StartPos + ((long)FileOffset * 512); //need to use the base offset!! + Span buf = stackalloc byte[16]; + cfr.BaseStream.ReadAtLeast(buf, 16); + fileSize = ((uint)buf[7] << 0) | ((uint)buf[14] << 8) | ((uint)buf[5] << 16) | ((uint)buf[2] << 24); + cfr.BaseStream.Position = opos; + } + } + public override void Write(DataWriter writer) { writer.Write((ushort)NameOffset); var fs = FileSize; - if (fs > 0xFFFFFF) fs = 0xFFFFFF;//will also need to make sure the RSC header is updated... + if (fs > 0xFFFFFF) + fs = 0xFFFFFF;//will also need to make sure the RSC header is updated... var buf1 = new byte[] { (byte)((fs >> 0) & 0xFF), @@ -2988,20 +3144,27 @@ namespace CodeWalker.GameFiles } public override string ToString() { - return "Resource file: " + Path; + return $"Resource file: {Path}"; } public override long GetFileSize() { return (FileSize == 0) ? (long)(SystemSize + GraphicsSize) : FileSize; } + + public override long GetUncompressedFileSize() + { + return (long)(SystemSize + GraphicsSize); + } + public override void SetFileSize(uint s) { FileSize = s; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct RpfResourcePageFlags + [TypeConverter(typeof(ExpandableObjectConverter))] + public struct RpfResourcePageFlags { public uint Value { get; set; } @@ -3010,7 +3173,8 @@ namespace CodeWalker.GameFiles get { var count = Count; - if (count == 0) return null; + if (count == 0) + return null; var pages = new RpfResourcePage[count]; var counts = PageCounts; var sizes = BaseSizes; @@ -3022,7 +3186,7 @@ namespace CodeWalker.GameFiles var s = sizes[i]; for (int p = 0; p < c; p++) { - pages[n] = new RpfResourcePage() { Size = s, Offset = o }; + pages[n] = new RpfResourcePage(s, o); o += s; n++; } @@ -3031,9 +3195,9 @@ namespace CodeWalker.GameFiles } } - public readonly uint TypeVal { get { return (Value >> 28) & 0xF; } } - public readonly uint BaseShift { get { return (Value & 0xF); } } - public readonly uint BaseSize { get { return (0x200u << (int)BaseShift); } } + public readonly uint TypeVal => (Value >> 28) & 0xF; + public readonly uint BaseShift => (Value & 0xF); + public readonly uint BaseSize => (0x200u << (int)BaseShift); public readonly uint[] BaseSizes { get @@ -3095,8 +3259,9 @@ namespace CodeWalker.GameFiles { get { - var c = PageCounts; - return c[0] + c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8]; + return Vector256.Sum(Vector256.Create(PageCounts.AsSpan())) + PageCounts[8]; + //var c = PageCounts; + //return c[0] + c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8]; } } public readonly uint Size @@ -3153,18 +3318,19 @@ namespace CodeWalker.GameFiles public override readonly string ToString() { - return "Size: " + Size.ToString() + ", Pages: " + Count.ToString(); + return $"Size: {Size}, Pages: {Count}"; } } - [TypeConverter(typeof(ExpandableObjectConverter))] public struct RpfResourcePage + [TypeConverter(typeof(ExpandableObjectConverter))] + public readonly struct RpfResourcePage(uint size, uint offset) { - public uint Size { get; set; } - public uint Offset { get; set; } + public uint Size { get; init; } = size; + public uint Offset { get; init; } = offset; public override string ToString() { - return Size.ToString() + ": " + Offset.ToString(); + return $"{Size}: {Offset}"; } } diff --git a/CodeWalker.Core/GameFiles/RpfManager.cs b/CodeWalker.Core/GameFiles/RpfManager.cs index 231dbaf..773e7a0 100644 --- a/CodeWalker.Core/GameFiles/RpfManager.cs +++ b/CodeWalker.Core/GameFiles/RpfManager.cs @@ -1,12 +1,16 @@  using CodeWalker.Core.Utils; +using CodeWalker.World; +using CommunityToolkit.HighPerformance; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -49,7 +53,7 @@ namespace CodeWalker.GameFiles public void Init(string folder, Action updateStatus, Action errorLog, bool rootOnly = false, bool buildIndex = true) { - using var _ = new DisposableTimer("RpfManager.Init"); + using var timer = new DisposableTimer("RpfManager.Init"); UpdateStatus += updateStatus; ErrorLog += errorLog; @@ -89,7 +93,7 @@ namespace CodeWalker.GameFiles if (excl) return; //skip files in exclude paths. } - rf.ScanStructure(updateStatus, errorLog); + rf.ScanStructure(updateStatus, errorLog, out _); if (rf.LastException != null) //incase of corrupted rpf (or renamed NG encrypted RPF) { @@ -101,7 +105,8 @@ namespace CodeWalker.GameFiles } catch (Exception ex) { - errorLog(rpfpath + ": " + ex.ToString()); + Console.WriteLine(ex); + errorLog?.Invoke($"{rpfpath}: {ex}"); } }); @@ -180,7 +185,7 @@ namespace CodeWalker.GameFiles private void AddRpfFile(RpfFile file, bool isdlc, bool ismod) { - if (file.AllEntries == null && file.Children == null) + if (file.AllEntries is null && file.Children is null) return; isdlc = isdlc || (file.Name.EndsWith(".rpf", StringComparison.OrdinalIgnoreCase) && (file.Name.StartsWith("dlc", StringComparison.OrdinalIgnoreCase) || file.Name.Equals("update.rpf", StringComparison.OrdinalIgnoreCase))); @@ -246,7 +251,7 @@ namespace CodeWalker.GameFiles } } - if (file.Children != null) + if (file.Children is not null) { foreach (RpfFile cfile in file.Children) { @@ -256,13 +261,12 @@ namespace CodeWalker.GameFiles } - public RpfFile FindRpfFile(string path) => FindRpfFile(path, false); + public RpfFile? FindRpfFile(string path) => FindRpfFile(path, false); - public RpfFile FindRpfFile(string path, bool exactPathOnly) + public RpfFile? FindRpfFile(string path, bool exactPathOnly) { - RpfFile file; - if (EnableMods && ModRpfDict.TryGetValue(path, out file)) + if (EnableMods && ModRpfDict.TryGetValue(path, out RpfFile? file)) { return file; } @@ -288,15 +292,14 @@ namespace CodeWalker.GameFiles } - public RpfEntry GetEntry(string path) + public RpfEntry? GetEntry(string path) { - RpfEntry entry; - if (EnableMods && ModEntryDict.TryGetValue(path, out entry)) + if (EnableMods && ModEntryDict.TryGetValue(path, out RpfEntry? entry)) { return entry; } EntryDict.TryGetValue(path, out entry); - if (entry == null) + if (entry is null) { path = path.Replace("/", "\\"); path = path.Replace("common:", "common.rpf"); @@ -308,11 +311,10 @@ namespace CodeWalker.GameFiles } return entry; } - public byte[] GetFileData(string path) + public byte[]? GetFileData(string path) { - byte[] data = null; - RpfFileEntry entry = GetEntry(path) as RpfFileEntry; - if (entry != null) + byte[]? data = null; + if (GetEntry(path) is RpfFileEntry entry) { data = entry.File.ExtractFile(entry); } @@ -320,8 +322,17 @@ namespace CodeWalker.GameFiles } public string GetFileUTF8Text(string path) { - byte[] bytes = GetFileData(path); - return TextUtil.GetUTF8Text(bytes); + byte[]? bytes = GetFileData(path); + var text = TextUtil.GetUTF8Text(bytes); + + return text; + } + + public StreamReader GetFileUTF8TextStream(string path) + { + byte[]? bytes = GetFileData(path); + + return new StreamReader(bytes.AsMemory().AsStream(), new UTF8Encoding(false), true); ; } public XmlDocument GetFileXml(string path) @@ -336,50 +347,66 @@ namespace CodeWalker.GameFiles return doc; } - public T GetFile(string path) where T : class, PackedFile, new() + public XmlReader GetFileXmlReader(string path, XmlNameTable nameTable) { - T file = null; - byte[] data = null; - RpfFileEntry entry = GetEntry(path) as RpfFileEntry; - if (entry != null) - { - data = entry.File.ExtractFile(entry); - } - if (data != null) + var text = GetFileUTF8TextStream(path); + + var reader = XmlReader.Create(text, new XmlReaderSettings { NameTable = nameTable }); + + return reader; + } + + public XmlReader GetFileXmlReader(string path) + { + var text = GetFileUTF8TextStream(path); + + var reader = XmlReader.Create(text); + + return reader; + } + + public T? GetFile(string path) where T : class, PackedFile, new() + { + if (GetEntry(path) is not RpfFileEntry entry) + return null; + + return GetFile(entry); + } + public static T? GetFile(RpfEntry e) where T : class, PackedFile, new() + { + if (e is not RpfFileEntry entry) + return null; + + byte[]? data = entry.File.ExtractFile(entry); + T? file = null; + if (data is not null) { file = new T(); file.Load(data, entry); } return file; } - public T GetFile(RpfEntry e) where T : class, PackedFile, new() + + public ValueTask GetFileAsync(string path) where T : class, PackedFile, new() { - T file = null; - byte[] data = null; - RpfFileEntry entry = e as RpfFileEntry; - if (entry != null) - { - data = entry.File.ExtractFile(entry); - } - if (data != null) - { - file = new T(); - file.Load(data, entry); - } - return file; + RpfFileEntry? entry = GetEntry(path) as RpfFileEntry; + + if (entry is null) + return ValueTask.FromResult((T?)null); + + return GetFileAsync(entry); } - public async Task GetFileAsync(RpfEntry e) where T : class, PackedFile, new() + + public static async ValueTask GetFileAsync(RpfEntry e) where T : class, PackedFile, new() { + if (e is not RpfFileEntry entry) + return null; + try { - T file = null; - byte[] data = null; - RpfFileEntry entry = e as RpfFileEntry; - if (entry != null) - { - data = await entry.File.ExtractFileAsync(entry).ConfigureAwait(false); - } - if (data != null) + byte[]? data = await entry.File.ExtractFileAsync(entry); + T? file = null; + if (data is not null && data.Length > 0) { file = new T(); file.Load(data, entry); @@ -394,13 +421,14 @@ namespace CodeWalker.GameFiles } public bool LoadFile(T file, RpfEntry e) where T : class, PackedFile { - byte[] data = null; - RpfFileEntry entry = e as RpfFileEntry; - if (entry != null) + byte[]? data = null; + RpfFileEntry? entry = e as RpfFileEntry; + if (entry is not null) { data = entry.File.ExtractFile(entry); } - if (data != null) + + if (data is not null && data.Length > 0) { try { @@ -409,7 +437,7 @@ namespace CodeWalker.GameFiles } catch(Exception ex) { - Console.WriteLine($"Error occured while loading {entry.Name} at {entry.Path}:\n{ex}"); + Console.WriteLine($"Error occured while loading {e.Name} at {e.Path}:\n{ex}"); throw; } } @@ -418,13 +446,13 @@ namespace CodeWalker.GameFiles public async ValueTask LoadFileAsync(T file, RpfEntry e) where T : class, PackedFile { - byte[] data = null; - RpfFileEntry entry = e as RpfFileEntry; - if (entry != null) + byte[]? data = null; + RpfFileEntry? entry = e as RpfFileEntry; + if (entry is not null) { - data = await entry.File.ExtractFileAsync(entry).ConfigureAwait(false); + data = await entry.File.ExtractFileAsync(entry); } - if (data != null && data.Length > 0) + if (data is not null && data.Length > 0) { try { @@ -433,7 +461,7 @@ namespace CodeWalker.GameFiles } catch(Exception ex) { - Console.WriteLine($"Error occured while loading {entry.Name} at {entry.Path}:\n{ex}"); + Console.WriteLine($"Error occured while loading {e.Name} at {e.Path}:\n{ex}"); throw; } } @@ -441,6 +469,9 @@ namespace CodeWalker.GameFiles } private ConcurrentDictionary counts = new ConcurrentDictionary(); + private string[] stringLookup; + + [SkipLocalsInit] public void AddAllLods(string name) { var idx = name.LastIndexOf('_'); @@ -452,88 +483,120 @@ namespace CodeWalker.GameFiles { // Filter some peds and clothing models (ydd's) which don't have LOD hashes we're interested in. // This saves about 50% of the time it takes to do initial hashing - var str2 = str1.Slice(0, idx2 + 1); + var str2 = str1.Slice(0, idx2 + 1).ToString(); if (str2.Length <= 2) { return; } - switch(str2) + var ignore = str2 switch { - case "uppr_": - case "p_": - case "accs_": - case "decl_": - case "berd_": - case "hair_": - case "teef_": - case "lowr_": - case "jbib_": - case "hand_": - case "feet_": - case "task_": - case "head_": - case "s_m_y_": - case "s_m_": - case "s_m_m_": - case "s_f_y_": - case "a_m_y_": - case "ig_": - case "u_m_y_": - case "u_m_m_": - case "u_m_": - case "minimap_": - case "a_": - case "u_f_": - case "csb_": - case "g_m_y_": - case "a_f_m_": - case "a_m_m_": - case "g_m_m_": - case "mp_m_": - case "mp_f_": - case "hand_000_": - case "hand_001_": - case "hair_000_": - case "a_f_y_": - return; - default: - break; - } + "p_" => true, + "s_m_y_" => true, + "s_m_" => true, + "s_m_m_" => true, + "s_f_y_" => true, + "a_m_y_" => true, + "ig_" => true, + "u_m_y_" => true, + "u_m_m_" => true, + "u_m_" => true, + "minimap_" => true, + "a_" => true, + "u_f_" => true, + "csb_" => true, + "g_m_y_" => true, + "a_f_m_" => true, + "a_m_m_" => true, + "g_m_m_" => true, + "mp_m_" => true, + "mp_f_" => true, + "mp_" => true, + "a_f_y_" => true, + var str when str.StartsWith("accs_") => true, + var str when str.StartsWith("decl_") => true, + var str when str.StartsWith("berd_") => true, + var str when str.StartsWith("hair_") => true, + var str when str.StartsWith("teef_") => true, + var str when str.StartsWith("lowr_") => true, + var str when str.StartsWith("jbib_") => true, + var str when str.StartsWith("hand_") => true, + var str when str.StartsWith("feet_") => true, + var str when str.StartsWith("task_") => true, + var str when str.StartsWith("head_") => true, + var str when str.StartsWith("uppr_") => true, + _ => false, + }; + if (ignore) + return; + Span buff = stackalloc char[str2.Length + 2 + 4]; str2.CopyTo(buff.Slice(0, str2.Length)); - "lod".AsSpan().CopyTo(buff.Slice(str2.Length, 3)); + stackalloc char[] { 'l', 'o', 'd' }.CopyTo(buff.Slice(str2.Length, 3)); //Console.WriteLine(buff.Slice(0, str2.Length + 3).ToString()); JenkIndex.EnsureLower(buff.Slice(0, str2.Length + 3)); - var maxi = 99; + const int maxi = 99; + + stackalloc char[] { '0', '0', '_', 'l', 'o', 'd' }.CopyTo(buff.Slice(str2.Length, 6)); + + if (stringLookup is null) + { + stringLookup = new string[maxi + 1]; + for (int i = 0; i <= maxi; i++) + { + stringLookup[i] = i.ToString().PadLeft(2, '0'); + } + } - "00_lod".AsSpan().CopyTo(buff.Slice(str2.Length, 6)); for (int i = 1; i <= maxi; i++) { - if (i < 10) - { - i.ToString().AsSpan().CopyTo(buff.Slice(str2.Length + 1, 1)); - } - else - { - i.ToString().AsSpan().CopyTo(buff.Slice(str2.Length, 2)); - } + stringLookup[i].AsSpan().CopyTo(buff.Slice(str2.Length, 2)); + + var hash = JenkHash.GenHashLower(buff); //Console.WriteLine(buff.ToString()); //JenkIndex.Ensure(buff); - JenkIndex.EnsureLower(buff); + JenkIndex.Ensure(str2, hash); } } } } + [SkipLocalsInit] + private void parseAwc(string path) + { + var enumerator = path.ReverseEnumerateSplit('\\'); + if (enumerator.MoveNext()) + { + ReadOnlySpan fn = enumerator.Current; + if (enumerator.MoveNext()) + { + ReadOnlySpan fd = enumerator.Current; + + fn = fn.Slice(0, fn.Length - 4); + + if (fd.EndsWith(['.', 'r', 'p', 'f'], StringComparison.OrdinalIgnoreCase)) + { + fd = fd.Slice(0, fd.Length - 4); + } + + Span hpath = stackalloc char[fd.Length + fn.Length + 1]; + + fd.CopyTo(hpath); + hpath[fd.Length] = '/'; + fn.CopyTo(hpath.Slice(fd.Length + 1)); + JenkIndex.EnsureLower(hpath); + } + } + } + public void BuildBaseJenkIndex() { - using var _ = new DisposableTimer("BuildBaseJenkIndex"); - Parallel.ForEach(AllRpfs, (file) => + var yddFiles = new ConcurrentBag(); + using var timer = new DisposableTimer("BuildBaseJenkIndex"); + Parallel.ForEach(AllRpfs, new ParallelOptions { MaxDegreeOfParallelism = 4 }, [SkipLocalsInit] (file) => { try { - StringBuilder sb = new StringBuilder(); JenkIndex.Ensure(file.Name); foreach (RpfEntry entry in file.AllEntries) { @@ -555,10 +618,10 @@ namespace CodeWalker.GameFiles if (name.EndsWith(".ydr", StringComparison.OrdinalIgnoreCase))// || nlow.EndsWith(".yft")) //do yft's get lods? { var sname = entry.ShortName; - var nameLod = sname + "_lod"; + var nameLod = $"{sname}_lod"; JenkIndex.EnsureLower(nameLod); - JenkIndex.EnsureLower(nameLod + 'a'); - JenkIndex.EnsureLower(nameLod + 'b'); + JenkIndex.EnsureLower($"{nameLod}a"); + JenkIndex.EnsureLower($"{nameLod}b"); } else if (name.EndsWith(".ydd", StringComparison.OrdinalIgnoreCase)) { @@ -566,11 +629,13 @@ namespace CodeWalker.GameFiles { var strn = entry.Name.Substring(0, name.Length - 13); JenkIndex.EnsureLower(strn); - var nameChildrenLod = strn + "_lod"; + var nameChildrenLod = $"{strn}_lod"; JenkIndex.EnsureLower(nameChildrenLod); - JenkIndex.EnsureLower(nameChildrenLod + 'a'); - JenkIndex.EnsureLower(nameChildrenLod + 'b'); + JenkIndex.EnsureLower($"{nameChildrenLod}a"); + JenkIndex.EnsureLower($"{nameChildrenLod}b"); } + + yddFiles.Add(name); //var idx = name.LastIndexOf('_'); //if (idx > 0) //{ @@ -590,7 +655,7 @@ namespace CodeWalker.GameFiles // } // } //} - AddAllLods(name); + //AddAllLods(name); } else if(name.EndsWith(".sps", StringComparison.OrdinalIgnoreCase)) { @@ -598,56 +663,57 @@ namespace CodeWalker.GameFiles } else if(name.EndsWith(".awc", StringComparison.OrdinalIgnoreCase)) //create audio container path hashes... { - string[] parts = entry.Path.Split('\\'); - int pl = parts.Length; - if (pl > 2) - { - string fn = parts[pl - 1]; - string fd = parts[pl - 2]; - string hpath = fn.Substring(0, fn.Length - 4); - if (fd.EndsWith(".rpf", StringComparison.OrdinalIgnoreCase)) - { - fd = fd.Substring(0, fd.Length - 4); - } - hpath = fd + '/' + hpath; - - JenkIndex.EnsureLower(hpath); - } + parseAwc(entry.Path); } else if(name.EndsWith(".nametable", StringComparison.OrdinalIgnoreCase)) { if (entry is RpfBinaryFileEntry binfe) { - byte[] data = file.ExtractFile(binfe); - if (data != null) + byte[] rawData = file.ExtractFile(binfe); + if (rawData != null) { - sb.Clear(); - for (int i = 0; i < data.Length; i++) + foreach(var bytes in rawData.AsSpan().EnumerateSplit((byte)0)) { - byte c = data[i]; - if (c == 0) + string str = Encoding.ASCII.GetString(bytes); + if (!string.IsNullOrEmpty(str)) { - string str = sb.ToString(); - if (!string.IsNullOrEmpty(str)) - { - //JenkIndex.Ensure(str); - JenkIndex.EnsureLower(str); + //JenkIndex.Ensure(str); - ////DirMod_Sounds_ entries apparently can be used to infer SP audio strings - ////no luck here yet though - //if (strl.StartsWith("dirmod_sounds_") && (strl.Length > 14)) - //{ - // strl = strl.Substring(14); - // JenkIndex.Ensure(strl); - //} - } - sb.Clear(); - } - else - { - sb.Append((char)c); + JenkIndex.EnsureLower(str); + + ////DirMod_Sounds_ entries apparently can be used to infer SP audio strings + ////no luck here yet though + //if (strl.StartsWith("dirmod_sounds_") && (strl.Length > 14)) + //{ + // strl = strl.Substring(14); + // JenkIndex.Ensure(strl); + //} } } + //int startIndex = 0; + //for (int i = 0; i < rawData.Length; i++) + //{ + // byte c = rawData[i]; + // if (c == 0) + // { + // string str = Encoding.ASCII.GetString(rawData.AsSpan(startIndex, i - startIndex)); + // if (!string.IsNullOrEmpty(str)) + // { + // //JenkIndex.Ensure(str); + + // JenkIndex.EnsureLower(str); + + // ////DirMod_Sounds_ entries apparently can be used to infer SP audio strings + // ////no luck here yet though + // //if (strl.StartsWith("dirmod_sounds_") && (strl.Length > 14)) + // //{ + // // strl = strl.Substring(14); + // // JenkIndex.Ensure(strl); + // //} + // } + // startIndex = i + 1; + // } + //} } } } @@ -672,6 +738,14 @@ namespace CodeWalker.GameFiles JenkIndex.Ensure(i.ToString("00")); } + _ = Task.Run(() => { + using var timer2 = new DisposableTimer("BuildBaseJenkIndex -> AddAllLods"); + foreach (var name in yddFiles) + { + AddAllLods(name); + } + }); + //Task.Run(() => //{ // foreach (var count in counts.OrderBy(p => p.Value)) diff --git a/CodeWalker.Core/GameFiles/Utils/DDSIO.cs b/CodeWalker.Core/GameFiles/Utils/DDSIO.cs index b96e030..896ed91 100644 --- a/CodeWalker.Core/GameFiles/Utils/DDSIO.cs +++ b/CodeWalker.Core/GameFiles/Utils/DDSIO.cs @@ -141,11 +141,6 @@ namespace CodeWalker.Utils int ddsRowPitch, ddsSlicePitch; DXTex.ComputePitch(meta.format, i0.width, i0.height, out ddsRowPitch, out ddsSlicePitch, 0); - if (i0.slicePitch == ddsSlicePitch) - { } - else - { } - int w = i0.width; int h = i0.height; int imglen = i0.slicePitch;// h * i0.rowPitch; @@ -153,16 +148,19 @@ namespace CodeWalker.Utils byte[] px = null;// = new byte[w * h * 4]; if (i0.pixels + imglen > img.Data.Length) - { throw new Exception("Mipmap not in texture!"); } + { + throw new Exception("Mipmap not in texture!"); + } Buffer.BlockCopy(img.Data, i0.pixels, imgdata, 0, imglen); bool swaprb = true; - if (DirectXTexNet.TexHelper.Instance.IsCompressed((DirectXTexNet.DXGI_FORMAT)format)) + if (TexHelper.Instance.IsCompressed((DirectXTexNet.DXGI_FORMAT)format)) { px = Decompress(imgdata, w, h, format); - } else + } + else { switch (format) { @@ -530,51 +528,59 @@ namespace CodeWalker.Utils - private static TextureFormat GetTextureFormat(DXGI_FORMAT f) + public static TextureFormat GetTextureFormat(this DXGI_FORMAT f) { var format = (TextureFormat)0; switch (f) { // compressed - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM: format = TextureFormat.D3DFMT_DXT1; break; - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM: format = TextureFormat.D3DFMT_DXT3; break; - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM: format = TextureFormat.D3DFMT_DXT5; break; - case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM: format = TextureFormat.D3DFMT_ATI1; break; - case DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM: format = TextureFormat.D3DFMT_ATI2; break; - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM: format = TextureFormat.D3DFMT_BC7; break; + case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM: return TextureFormat.D3DFMT_DXT1; + case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM: return TextureFormat.D3DFMT_DXT3; + case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM: return TextureFormat.D3DFMT_DXT5; + case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM: return TextureFormat.D3DFMT_ATI1; + case DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM: return TextureFormat.D3DFMT_ATI2; + case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM: return TextureFormat.D3DFMT_BC7; // uncompressed - case DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM: format = TextureFormat.D3DFMT_A1R5G5B5; break; - case DXGI_FORMAT.DXGI_FORMAT_A8_UNORM: format = TextureFormat.D3DFMT_A8; break; - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: format = TextureFormat.D3DFMT_A8B8G8R8; break; - case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: format = TextureFormat.D3DFMT_L8; break; - case DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM: format = TextureFormat.D3DFMT_A8R8G8B8; break; - case DXGI_FORMAT.DXGI_FORMAT_B8G8R8X8_UNORM: format = TextureFormat.D3DFMT_X8R8G8B8; break; + case DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM: return TextureFormat.D3DFMT_A1R5G5B5; + case DXGI_FORMAT.DXGI_FORMAT_A8_UNORM: return TextureFormat.D3DFMT_A8; + case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: return TextureFormat.D3DFMT_A8B8G8R8; + case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: return TextureFormat.D3DFMT_L8; + case DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM: return TextureFormat.D3DFMT_A8R8G8B8; + case DXGI_FORMAT.DXGI_FORMAT_B8G8R8X8_UNORM: return TextureFormat.D3DFMT_X8R8G8B8; + case DXGI_FORMAT.DXGI_FORMAT_R16G16B16A16_UNORM: return TextureFormat.D3DFMT_A16R16G16B16; } return format; } - private static DXGI_FORMAT GetDXGIFormat(TextureFormat f) + public static DXGI_FORMAT GetDXGIFormat(this TextureFormat f) { var format = DXGI_FORMAT.DXGI_FORMAT_UNKNOWN; switch (f) { // compressed - case TextureFormat.D3DFMT_DXT1: format = DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM; break; - case TextureFormat.D3DFMT_DXT3: format = DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM; break; - case TextureFormat.D3DFMT_DXT5: format = DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM; break; - case TextureFormat.D3DFMT_ATI1: format = DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM; break; - case TextureFormat.D3DFMT_ATI2: format = DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM; break; - case TextureFormat.D3DFMT_BC7: format = DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM; break; + case TextureFormat.D3DFMT_DXT1: return DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM; + case TextureFormat.D3DFMT_DXT3: return DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM; + case TextureFormat.D3DFMT_DXT5: return DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM; + case TextureFormat.D3DFMT_ATI1: return DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM; + case TextureFormat.D3DFMT_ATI2: return DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM; + case TextureFormat.D3DFMT_BC7: return DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM; // uncompressed - case TextureFormat.D3DFMT_A1R5G5B5: format = DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM; break; - case TextureFormat.D3DFMT_A8: format = DXGI_FORMAT.DXGI_FORMAT_A8_UNORM; break; - case TextureFormat.D3DFMT_A8B8G8R8: format = DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM; break; - case TextureFormat.D3DFMT_L8: format = DXGI_FORMAT.DXGI_FORMAT_R8_UNORM; break; - case TextureFormat.D3DFMT_A8R8G8B8: format = DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM; break; - case TextureFormat.D3DFMT_X8R8G8B8: format = DXGI_FORMAT.DXGI_FORMAT_B8G8R8X8_UNORM; break; + case TextureFormat.D3DFMT_A1R5G5B5: return DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM; + case TextureFormat.D3DFMT_A8: return DXGI_FORMAT.DXGI_FORMAT_A8_UNORM; + case TextureFormat.D3DFMT_A8B8G8R8: return DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM; + case TextureFormat.D3DFMT_L8: return DXGI_FORMAT.DXGI_FORMAT_R8_UNORM; + case TextureFormat.D3DFMT_A8R8G8B8: return DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM; + case TextureFormat.D3DFMT_X8R8G8B8: return DXGI_FORMAT.DXGI_FORMAT_B8G8R8X8_UNORM; + case TextureFormat.D3DFMT_A16R16G16B16: return DXGI_FORMAT.DXGI_FORMAT_R16G16B16A16_UNORM; } + + if (format == DXGI_FORMAT.DXGI_FORMAT_UNKNOWN) + { + Console.WriteLine($"Format: {f} ({(int)f}) is unknown!"); + } + return format; } @@ -830,7 +836,7 @@ namespace CodeWalker.Utils break; default: - assert(IsValid(fmt), $"{fmt} is not a valid texture format"); + assert(IsValid(fmt), $"{fmt} ({(int)fmt}) is not a valid texture format"); assert(!IsCompressed(fmt) && !IsPacked(fmt) && !IsPlanar(fmt)); { diff --git a/CodeWalker.Core/GameFiles/Utils/Data.cs b/CodeWalker.Core/GameFiles/Utils/Data.cs index 1dedf5b..625f5e4 100644 --- a/CodeWalker.Core/GameFiles/Utils/Data.cs +++ b/CodeWalker.Core/GameFiles/Utils/Data.cs @@ -37,6 +37,9 @@ using System.Buffers; using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Threading; +using SharpDX.Win32; +using CommunityToolkit.HighPerformance; +using System.Linq; namespace CodeWalker.GameFiles { @@ -60,6 +63,7 @@ namespace CodeWalker.GameFiles String = 9, } + [SkipLocalsInit] public class DataReader : IDisposable { private Stream baseStream; @@ -67,32 +71,20 @@ namespace CodeWalker.GameFiles /// /// Gets or sets the endianess of the underlying stream. /// - public Endianess Endianess { get; set; } = Endianess.LittleEndian; + public readonly Endianess Endianess = Endianess.LittleEndian; /// /// Gets the length of the underlying stream. /// - public virtual long Length - { - get - { - return baseStream.Length; - } - } + public virtual long Length => baseStream.Length; /// /// Gets or sets the position within the underlying stream. /// public virtual long Position { - get - { - return baseStream.Position; - } - set - { - baseStream.Position = value; - } + get => baseStream.Position; + set => baseStream.Position = value; } public DataReader(Stream stream) @@ -106,22 +98,25 @@ namespace CodeWalker.GameFiles /// /// Initializes a new data reader for the specified stream. /// - public DataReader(Stream stream, Endianess endianess) : this(stream) + public DataReader(Stream stream, Endianess endianess) + : this(stream) { this.Endianess = endianess; } - public virtual Stream GetStream() + public DataReader(byte[] data, Endianess endianess = Endianess.LittleEndian) + : this(new MemoryStream(data)) { - return baseStream; + this.Endianess = endianess; } + public virtual Stream GetStream() => baseStream; internal virtual void SetPositionAfterRead(Stream stream) { return; } - protected virtual void ReadFromStream(Span buffer, bool ignoreEndianess = false) + public virtual void ReadFromStream(Span buffer, bool ignoreEndianess = false) { var stream = GetStream(); @@ -134,7 +129,7 @@ namespace CodeWalker.GameFiles SetPositionAfterRead(stream); } - if (!ignoreEndianess && (Endianess == Endianess.BigEndian)) + if (Endianess == Endianess.BigEndian && !ignoreEndianess) { buffer.Reverse(); } @@ -144,10 +139,10 @@ namespace CodeWalker.GameFiles /// Reads data from the underlying stream. This is the only method that directly accesses /// the data in the underlying stream. /// - protected virtual byte[] ReadFromStream(int count, bool ignoreEndianess = false, byte[] buffer = null) + protected virtual byte[] ReadFromStream(int count, bool ignoreEndianess = false, byte[]? buffer = null) { var stream = GetStream(); - buffer ??= new byte[count]; + buffer ??= GC.AllocateUninitializedArray(count); try { @@ -159,7 +154,7 @@ namespace CodeWalker.GameFiles } // handle endianess - if (!ignoreEndianess && (Endianess == Endianess.BigEndian)) + if (Endianess == Endianess.BigEndian && !ignoreEndianess) { Array.Reverse(buffer, 0, count); } @@ -199,9 +194,15 @@ namespace CodeWalker.GameFiles return ReadFromStream(count, true, buffer); } + public void ReadBytes(Span buffer) + { + ReadFromStream(buffer, true); + } + /// /// Reads a signed 16-bit value. /// + [SkipLocalsInit] public short ReadInt16() { Span _buffer = stackalloc byte[sizeof(short)]; @@ -220,6 +221,7 @@ namespace CodeWalker.GameFiles /// /// Reads a signed 32-bit value. /// + [SkipLocalsInit] public int ReadInt32() { Span _buffer = stackalloc byte[sizeof(int)]; @@ -238,6 +240,7 @@ namespace CodeWalker.GameFiles /// /// Reads a signed 64-bit value. /// + [SkipLocalsInit] public long ReadInt64() { Span _buffer = stackalloc byte[sizeof(long)]; @@ -256,6 +259,7 @@ namespace CodeWalker.GameFiles /// /// Reads an unsigned 16-bit value. /// + [SkipLocalsInit] public ushort ReadUInt16() { Span _buffer = stackalloc byte[sizeof(ushort)]; @@ -274,6 +278,7 @@ namespace CodeWalker.GameFiles /// /// Reads an unsigned 32-bit value. /// + [SkipLocalsInit] public uint ReadUInt32() { Span _buffer = stackalloc byte[sizeof(uint)]; @@ -292,6 +297,7 @@ namespace CodeWalker.GameFiles /// /// Reads an unsigned 64-bit value. /// + [SkipLocalsInit] public ulong ReadUInt64() { Span _buffer = stackalloc byte[sizeof(ulong)]; @@ -311,6 +317,7 @@ namespace CodeWalker.GameFiles /// /// Reads a single precision floating point value. /// + [SkipLocalsInit] public float ReadSingle() { Span _buffer = stackalloc byte[sizeof(float)]; @@ -329,6 +336,7 @@ namespace CodeWalker.GameFiles /// /// Reads a double precision floating point value. /// + [SkipLocalsInit] public double ReadDouble() { Span _buffer = stackalloc byte[sizeof(double)]; @@ -354,13 +362,13 @@ namespace CodeWalker.GameFiles { return string.Empty; } - var bytes = stackalloc byte[length]; + Span bytes = stackalloc byte[length]; for (int i = 0; i < length; i++) { bytes[i] = ReadByte(); } - return new string((sbyte*)bytes, 0, length, Encoding.ASCII); + return Encoding.UTF8.GetString(bytes); //return Encoding.UTF8.GetString(bytes, Math.Min(charsRead, maxLength)); } @@ -371,7 +379,6 @@ namespace CodeWalker.GameFiles unsafe public string ReadString(int maxLength = 1024) { Span bytes = stackalloc byte[Math.Min(maxLength, 1024)]; - Span chars = stackalloc char[Math.Min(maxLength, 1024)]; var temp = ReadByte(); var bytesRead = 0; var length = Length; @@ -385,13 +392,11 @@ namespace CodeWalker.GameFiles bytesRead++; } - var charsRead = Encoding.UTF8.GetChars(bytes.Slice(0, bytesRead), chars); - - return chars.Slice(0, charsRead).ToString(); + return Encoding.UTF8.GetString(bytes.Slice(0, bytesRead)); //return Encoding.UTF8.GetString(bytes, Math.Min(charsRead, maxLength)); } - + [SkipLocalsInit] public Vector3 ReadVector3() { Vector3 v = new Vector3(); @@ -400,6 +405,8 @@ namespace CodeWalker.GameFiles v.Z = ReadSingle(); return v; } + + [SkipLocalsInit] public Vector4 ReadVector4() { Vector4 v = new Vector4(); @@ -410,6 +417,7 @@ namespace CodeWalker.GameFiles return v; } + [SkipLocalsInit] public Matrix ReadMatrix() { Matrix m = new Matrix(); @@ -470,7 +478,7 @@ namespace CodeWalker.GameFiles public Endianess Endianess { get; - set; + init; } /// @@ -519,6 +527,8 @@ namespace CodeWalker.GameFiles this.Endianess = endianess; } + protected bool ShouldReverse(bool ignoreEndianness) => !ignoreEndianness && Endianess == Endianess.BigEndian; + /// /// Writes data to the underlying stream. This is the only method that directly accesses /// the data in the underlying stream. @@ -530,7 +540,7 @@ namespace CodeWalker.GameFiles { count = value.Length; } - if (!ignoreEndianess && (Endianess == Endianess.BigEndian)) + if (ShouldReverse(ignoreEndianess)) { var buffer = ArrayPool.Shared.Rent(count); try @@ -551,13 +561,26 @@ namespace CodeWalker.GameFiles SetPositionAfterWrite(stream); } - protected virtual void WriteToStream(Span value, bool ignoreEndianess = false) + protected virtual void WriteToStream(ReadOnlySpan value, bool ignoreEndianess = false) { + if (!ShouldReverse(ignoreEndianess)) + { + var stream = GetStream(); + stream.Write(value); + SetPositionAfterWrite(stream); + return; + } + byte[] sharedBuffer = ArrayPool.Shared.Rent(value.Length); try { value.CopyTo(sharedBuffer); - WriteToStream(sharedBuffer, count: value.Length); + Array.Reverse(sharedBuffer, 0, value.Length); + var stream = GetStream(); + + stream.Write(sharedBuffer.AsSpan()); + + SetPositionAfterWrite(stream); } finally { @@ -565,23 +588,31 @@ namespace CodeWalker.GameFiles } } - protected virtual void WriteToStream(Memory buffer, bool ignoreEndianess = false) + protected virtual async ValueTask WriteToStreamAsync(ReadOnlyMemory buffer, bool ignoreEndianess = false) { - if (MemoryMarshal.TryGetArray(buffer, out ArraySegment array)) + if (!ShouldReverse(ignoreEndianess)) { - WriteToStream(array.Array!, offset: array.Offset, count: array.Count); + var stream = GetStream(); + await stream.WriteAsync(buffer); + SetPositionAfterWrite(stream); return; } - byte[] sharedBuffer = ArrayPool.Shared.Rent(buffer.Length); + var arr = ArrayPool.Shared.Rent(buffer.Length); try { - buffer.Span.CopyTo(sharedBuffer); - WriteToStream(sharedBuffer, count: buffer.Length); + buffer.CopyTo(arr); + Array.Reverse(arr, 0, buffer.Length); + + var stream = GetStream(); + + await stream.WriteAsync(arr.AsMemory(0, buffer.Length)); + + SetPositionAfterWrite(stream); } finally { - ArrayPool.Shared.Return(sharedBuffer); + ArrayPool.Shared.Return(arr); } } @@ -601,14 +632,14 @@ namespace CodeWalker.GameFiles WriteToStream(value, true); } - public void Write(Span value) + public void Write(ReadOnlySpan value) { WriteToStream(value, true); } - public void Write(Memory value) + public ValueTask WriteAsync(Memory value) { - WriteToStream(value, true); + return WriteToStreamAsync(value, true); } /// diff --git a/CodeWalker.Core/GameFiles/Utils/GTACrypto.cs b/CodeWalker.Core/GameFiles/Utils/GTACrypto.cs index 7c2f38f..e62509d 100644 --- a/CodeWalker.Core/GameFiles/Utils/GTACrypto.cs +++ b/CodeWalker.Core/GameFiles/Utils/GTACrypto.cs @@ -23,6 +23,7 @@ //shamelessly stolen +using CommunityToolkit.HighPerformance.Helpers; using System; using System.Buffers; using System.Collections.Generic; @@ -31,9 +32,11 @@ using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Runtime.Intrinsics; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace CodeWalker.GameFiles { @@ -108,7 +111,9 @@ namespace CodeWalker.GameFiles { var encryptor = rijndael.CreateEncryptor(); for (var roundIndex = 0; roundIndex < rounds; roundIndex++) + { encryptor.TransformBlock(buffer, 0, length, buffer, 0); + } } return buffer; @@ -130,11 +135,11 @@ namespace CodeWalker.GameFiles { var key = GetNGKey(name, fileSize); length ??= data.Length; - DecryptNG(data.AsSpan(offset, length.Value), key); + DecryptNG(data.AsMemory(offset, length.Value), key); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void DecryptNG(Span data, string name, uint fileSize) + public static void DecryptNG(Memory data, string name, uint fileSize) { var key = GetNGKey(name, fileSize); DecryptNG(data, key); @@ -144,16 +149,36 @@ namespace CodeWalker.GameFiles public unsafe static void DecryptNG(byte[] data, uint[][] key, int offset = 0, int? length = null) { length ??= data.Length; - DecryptNG(data.AsSpan(offset, length.Value), key); + DecryptNG(data.AsMemory(offset, length.Value), key); + } + + public readonly struct DecryptNGBLock : IAction + { + private readonly Memory arr; + private readonly uint[][] key; + + public DecryptNGBLock(Memory array, uint[][] key) + { + this.arr = array; + this.key = key; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Invoke(int blockIndex) + { + DecryptNGBlock(arr.Slice(16 * blockIndex, 16).Span, key); + } } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void DecryptNG(Span data, uint[][] key) + public static void DecryptNG(in Memory data, uint[][] key) { - for (int blockIndex = 0; blockIndex < data.Length / 16; blockIndex++) - { - DecryptNGBlock(data.Slice(16 * blockIndex, 16), key); - } + var action = new DecryptNGBLock(data, key); + ParallelHelper.For(new Range(0, data.Length / 16), in action, 25); + //for (int blockIndex = 0; blockIndex < data.Length / 16; blockIndex++) + //{ + // DecryptNGBlock(data.Slice(16 * blockIndex, 16), key); + //} } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -161,8 +186,21 @@ namespace CodeWalker.GameFiles { DecryptNGRoundA(data, key[0], GTA5Keys.PC_NG_DECRYPT_TABLES[0]); DecryptNGRoundA(data, key[1], GTA5Keys.PC_NG_DECRYPT_TABLES[1]); - for (int k = 2; k <= 15; k++) - DecryptNGRoundB(data, key[k], GTA5Keys.PC_NG_DECRYPT_TABLES[k]); + //for (int k = 2; k <= 15; k++) + DecryptNGRoundB(data, key[2], GTA5Keys.PC_NG_DECRYPT_TABLES[2]); + DecryptNGRoundB(data, key[3], GTA5Keys.PC_NG_DECRYPT_TABLES[3]); + DecryptNGRoundB(data, key[4], GTA5Keys.PC_NG_DECRYPT_TABLES[4]); + DecryptNGRoundB(data, key[5], GTA5Keys.PC_NG_DECRYPT_TABLES[5]); + DecryptNGRoundB(data, key[6], GTA5Keys.PC_NG_DECRYPT_TABLES[6]); + DecryptNGRoundB(data, key[7], GTA5Keys.PC_NG_DECRYPT_TABLES[7]); + DecryptNGRoundB(data, key[8], GTA5Keys.PC_NG_DECRYPT_TABLES[8]); + DecryptNGRoundB(data, key[9], GTA5Keys.PC_NG_DECRYPT_TABLES[9]); + DecryptNGRoundB(data, key[10], GTA5Keys.PC_NG_DECRYPT_TABLES[10]); + DecryptNGRoundB(data, key[11], GTA5Keys.PC_NG_DECRYPT_TABLES[11]); + DecryptNGRoundB(data, key[12], GTA5Keys.PC_NG_DECRYPT_TABLES[12]); + DecryptNGRoundB(data, key[13], GTA5Keys.PC_NG_DECRYPT_TABLES[13]); + DecryptNGRoundB(data, key[14], GTA5Keys.PC_NG_DECRYPT_TABLES[14]); + DecryptNGRoundB(data, key[15], GTA5Keys.PC_NG_DECRYPT_TABLES[15]); DecryptNGRoundA(data, key[16], GTA5Keys.PC_NG_DECRYPT_TABLES[16]); } @@ -194,16 +232,19 @@ namespace CodeWalker.GameFiles table[15][data[15]] ^ key[3]; - MemoryMarshal.Write(data.Slice(0, 4), ref x1); - MemoryMarshal.Write(data.Slice(4, 4), ref x2); - MemoryMarshal.Write(data.Slice(8, 4), ref x3); - MemoryMarshal.Write(data.Slice(12, 4), ref x4); + Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data[..8]), x1 | (ulong)x2 << 32); + Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data.Slice(8, 8)), x3 | (ulong)x4 << 32); + + //Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data[..4]), x1); + //Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data.Slice(4, 4)), x2); + //Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data.Slice(8, 4)), x3); + //Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data.Slice(12, 4)), x4); } // round 3-15 [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe static void DecryptNGRoundB(Span data, uint[] key, uint[][] table) + public unsafe static void DecryptNGRoundB(Span data, Span key, uint[][] table) { var x1 = table[0][data[0]] ^ @@ -230,10 +271,13 @@ namespace CodeWalker.GameFiles table[12][data[12]] ^ key[3]; - MemoryMarshal.Write(data.Slice(0, 4), ref x1); - MemoryMarshal.Write(data.Slice(4, 4), ref x2); - MemoryMarshal.Write(data.Slice(8, 4), ref x3); - MemoryMarshal.Write(data.Slice(12, 4), ref x4); + Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data[..8]), x1 | (ulong)x2 << 32); + Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data.Slice(8, 8)), x3 | (ulong)x4 << 32); + + //Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data[..4]), x1); + //Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data.Slice(4, 4)), x2); + //Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data.Slice(8, 4)), x3); + //Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(data.Slice(12, 4)), x4); } diff --git a/CodeWalker.Core/GameFiles/Utils/GTAKeys.cs b/CodeWalker.Core/GameFiles/Utils/GTAKeys.cs index a3b4128..44f4f43 100644 --- a/CodeWalker.Core/GameFiles/Utils/GTAKeys.cs +++ b/CodeWalker.Core/GameFiles/Utils/GTAKeys.cs @@ -196,8 +196,10 @@ namespace CodeWalker.GameFiles var exeStr = new MemoryStream(exeData); updateStatus?.Invoke("Searching for AES key..."); + Console.WriteLine("Searching for AES key..."); PC_AES_KEY = HashSearch.SearchHash(exeStr, GTA5KeyHashes.PC_AES_KEY_HASH, 0x20); + Console.WriteLine("Complete."); updateStatus?.Invoke("Complete."); } @@ -290,9 +292,9 @@ namespace CodeWalker.GameFiles private static void UseMagicData(string path, string key) { - if (string.IsNullOrEmpty(key)) { + Console.WriteLine($"Reading keys from {path}\\gta5.exe"); byte[] exedata = File.ReadAllBytes(path + "\\gta5.exe"); GenerateV2(exedata, null); } @@ -302,6 +304,11 @@ namespace CodeWalker.GameFiles } //GenerateMagicData(); + if (PC_AES_KEY is null) + { + Console.WriteLine($"PC_AES_KEY is null!"); + } + Random rnd = new Random((int)JenkHash.GenHash(PC_AES_KEY)); byte[] m = Resources.magic; @@ -782,7 +789,7 @@ namespace CodeWalker.GameFiles public static class HashSearch { private const long BLOCK_LENGTH = 1048576; - private const long ALIGN_LENGTH = 16; + private const long ALIGN_LENGTH = 8; public static byte[] SearchHash(Stream stream, byte[] hash, int length = 32) { @@ -794,10 +801,12 @@ namespace CodeWalker.GameFiles stream = Stream.Synchronized(stream); var result = new byte[hashes.Count][]; - Parallel.For(0, (stream.Length / BLOCK_LENGTH), (long k) => { + Parallel.For(0, (stream.Length / BLOCK_LENGTH), [SkipLocalsInit] (long k) => { var hashProvider = new SHA1CryptoServiceProvider(); // TODO: Convert to stack alloc when length appropriate (1024 or lower probs) - var buffer = new byte[length]; + Span buffer = length < 1024 ? stackalloc byte[length] : new byte[length]; + Span hash = length < 1024 ? stackalloc byte[length] : new byte[length]; + //var buffer = new byte[length]; for (long i = 0; i < (BLOCK_LENGTH / ALIGN_LENGTH); i++) { var position = k * BLOCK_LENGTH + i * ALIGN_LENGTH; @@ -806,15 +815,18 @@ namespace CodeWalker.GameFiles stream.Position = position; - stream.Read(buffer, 0, length); + stream.Read(buffer); - var hash = hashProvider.ComputeHash(buffer); + hashProvider.TryComputeHash(buffer, hash, out var bytesWritten); + //var hash = hashProvider.ComputeHash(buffer); for (int j = 0; j < hashes.Count; j++) - if (hash.SequenceEqual(hashes[j])) - result[j] = (byte[])buffer.Clone(); + { + if (hash.Slice(0, bytesWritten).SequenceEqual(hashes[j])) + { + result[j] = buffer.ToArray(); + } + } } - - }); return result; @@ -867,6 +879,7 @@ namespace CodeWalker.GameFiles { private const int TEST_ITERATIONS = 100000; + [SkipLocalsInit] public static bool[] Solve( uint[][] tables, int inByte0, int inByte1, int inByte2, int inByte3, @@ -1510,9 +1523,8 @@ namespace CodeWalker.GameFiles uint result = 0; - for (int index = 0; index < text.Length; index++) - { - var temp = 1025 * (LUT[text[index]] + result); + foreach(var c in text) { + var temp = 1025 * (LUT[c] + result); result = (temp >> 6) ^ temp; } diff --git a/CodeWalker.Core/GameFiles/Utils/Jenk.cs b/CodeWalker.Core/GameFiles/Utils/Jenk.cs index 0530f3b..5ee6633 100644 --- a/CodeWalker.Core/GameFiles/Utils/Jenk.cs +++ b/CodeWalker.Core/GameFiles/Utils/Jenk.cs @@ -1,13 +1,19 @@ -using System; +using CommunityToolkit.HighPerformance; +using CommunityToolkit.HighPerformance.Buffers; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Intrinsics; using System.Text; using System.Threading; using System.Threading.Tasks; +using static System.Net.Mime.MediaTypeNames; namespace CodeWalker.GameFiles { @@ -29,10 +35,19 @@ namespace CodeWalker.GameFiles HashHex = "0x" + HashUint.ToString("X"); } + private const int minInclusive = 'A'; + private const int maxInclusive = 'Z' - minInclusive; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static char ToLower(char c) + public static byte ToLower(char c) { - return (c >= 'A' && c <= 'Z') ? (char)(c - 'A' + 'a') : c; + return ToLower((byte)c); + //return (c >= 'A' && c <= 'Z') ? (byte)(c - 'A' + 'a') : (byte)c; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte ToLower(byte c) + { + return ('A' <= c && c <= 'Z') ? (byte)(c | 0x20) : c; } public static uint GenHash(string text, JenkHashInputEncoding encoding) @@ -54,105 +69,126 @@ namespace CodeWalker.GameFiles for (uint i = 0; i < chars.Length; i++) { h += chars[i]; - h += (h << 10); - h ^= (h >> 6); + h += h << 10; + h ^= h >> 6; } - h += (h << 3); - h ^= (h >> 11); - h += (h << 15); + h += h << 3; + h ^= h >> 11; + h += h << 15; return h; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint GenHashLowerInline(string text) + { + return GenHashLower(text.AsSpan()); + } + public static uint GenHashLower(string text) { - if (text == null) return 0; - uint h = 0; - for (int i = 0; i < text.Length; i++) - { - h += (byte)ToLower(text[i]); - h += (h << 10); - h ^= (h >> 6); - } - h += (h << 3); - h ^= (h >> 11); - h += (h << 15); - - return h; - } - - public static uint GenHashLower(ReadOnlySpan text, ReadOnlySpan str2 = default) - { - if (text == null) return 0; - uint h = 0; - for (int i = 0; i < text.Length; i++) - { - h += (byte)ToLower(text[i]); - h += (h << 10); - h ^= (h >> 6); - } - for (int i = 0; i < str2.Length; i++) - { - h += (byte)ToLower(str2[i]); - h += (h << 10); - h ^= (h >> 6); - } - h += (h << 3); - h ^= (h >> 11); - h += (h << 15); - - return h; + return GenHashLower(text.AsSpan()); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint GenHash(ReadOnlySpan text) { - if (text == null) return 0; uint h = 0; - for (int i = 0; i < text.Length; i++) + foreach(var c in text) { - h += (byte)text[i]; - h += (h << 10); - h ^= (h >> 6); + h += (byte)c; + h += h << 10; + h ^= h >> 6; } - h += (h << 3); - h ^= (h >> 11); - h += (h << 15); + h += h << 3; + h ^= h >> 11; + h += h << 15; return h; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint GenHashInline(string text) + { + return GenHash(text.AsSpan()); + } + public static uint GenHash(string text) { - if (text == null) return 0; + return GenHash(text.AsSpan()); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint GenHashLower(ReadOnlySpan data) + { + uint h = 0; + foreach(var b in data) + { + h += ToLower(b); + h += h << 10; + h ^= h >> 6; + } + h += h << 3; + h ^= h >> 11; + h += h << 15; + + return h; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint GenHashLower(ReadOnlySpan text) + { + uint h = 0; + foreach(var c in text) + { + h += ToLower(c); + h += h << 10; + h ^= h >> 6; + } + h += h << 3; + h ^= h >> 11; + h += h << 15; + + return h; + } + + public static uint GenHashLower(ReadOnlySpan text, ReadOnlySpan str2) + { uint h = 0; for (int i = 0; i < text.Length; i++) { - h += (byte)text[i]; - h += (h << 10); - h ^= (h >> 6); + h += ToLower(text[i]); + h += h << 10; + h ^= h >> 6; } - h += (h << 3); - h ^= (h >> 11); - h += (h << 15); + for (int i = 0; i < str2.Length; i++) + { + h += ToLower(str2[i]); + h += h << 10; + h ^= h >> 6; + } + h += h << 3; + h ^= h >> 11; + h += h << 15; return h; } - public static uint GenHash(byte[] data) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint GenHash(ReadOnlySpan data) { uint h = 0; - for (uint i = 0; i < data.Length; i++) + foreach(var c in data) { - h += data[i]; - h += (h << 10); - h ^= (h >> 6); + h += c; + h += h << 10; + h ^= h >> 6; } - h += (h << 3); - h ^= (h >> 11); - h += (h << 15); + h += h << 3; + h ^= h >> 11; + h += h << 15; return h; } - } public enum JenkHashInputEncoding @@ -256,68 +292,65 @@ namespace CodeWalker.GameFiles } } - - - public static class DictionaryExtension - { - public static bool TryAdd(this Dictionary dict, TKey key, TValue value) - { - if (dict.ContainsKey(key)) - { - return false; - } - - dict[key] = value; - return true; - } - } - - - public static class JenkIndex { //public static ConcurrentDictionary Index = new ConcurrentDictionary(Environment.ProcessorCount * 2, 2000000); - public static Dictionary Index = new Dictionary(2000000); + public static ConcurrentDictionary Index = new ConcurrentDictionary(Environment.ProcessorCount, 2097152); public static void Ensure(string str) { - uint hash = JenkHash.GenHash(str); - Ensure(str, hash); + uint hash = JenkHash.GenHashInline(str); + + addString(str, hash); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void addString(string str, uint hash) + { + //lock(Index) + //{ + Index.TryAdd(hash, str); + //} } public static void Ensure(string str, uint hash) { - if (hash == 0) return; - - if (Index.ContainsKey(hash)) - { + if (hash == 0) return; - } - lock(Index) - { - Index[hash] = str; - } + addString(str, hash); } - public static void Ensure(ReadOnlySpan str, uint hash) + public static void Ensure(ReadOnlySpan span, uint hash) { - if (hash == 0) return; + if (hash == 0) + return; if (Index.ContainsKey(hash)) { return; } - lock(Index) + var str = StringPool.Shared.GetOrAdd(span); + addString(str, hash); + } + + public static void Ensure(ReadOnlySpan str, uint hash) + { + if (hash == 0) + return; + + if (Index.ContainsKey(hash)) { - Index[hash] = str.ToString(); + return; } + + addString(Encoding.ASCII.GetString(str), hash); } public static void EnsureLower(string str) { - uint hash = JenkHash.GenHashLower(str); + uint hash = JenkHash.GenHashLowerInline(str); Ensure(str, hash); } @@ -329,8 +362,8 @@ namespace CodeWalker.GameFiles public static void EnsureBoth(string str) { - uint hash = JenkHash.GenHash(str); - uint hashLower = JenkHash.GenHashLower(str); + uint hash = JenkHash.GenHashInline(str); + uint hashLower = JenkHash.GenHashLowerInline(str); Ensure(str, hash); if (hash != hashLower) { @@ -338,14 +371,23 @@ namespace CodeWalker.GameFiles } } - public static void EnsureBoth(ReadOnlySpan str) + public static void EnsureBoth(ReadOnlySpan strSpan) { - uint hash = JenkHash.GenHash(str); - uint hashLower = JenkHash.GenHashLower(str); - Ensure(str, hash); + uint hash = JenkHash.GenHash(strSpan); + uint hashLower = JenkHash.GenHashLower(strSpan); + + var contains = Index.ContainsKey(hash); + var containsLower = Index.ContainsKey(hashLower); + if (contains && containsLower) + { + return; + } + + var str = StringPool.Shared.GetOrAdd(strSpan); + addString(str, hash); if (hash != hashLower) { - Ensure(str, hashLower); + addString(str, hashLower); } } @@ -368,6 +410,8 @@ namespace CodeWalker.GameFiles return res; } + public static bool TryGetString(uint hash, [MaybeNullWhen(false)] out string res) => Index.TryGetValue(hash, out res); + public static ICollection GetAllStrings() { var res = Index.Values; diff --git a/CodeWalker.Core/GlobalSuppressions.cs b/CodeWalker.Core/GlobalSuppressions.cs new file mode 100644 index 0000000..db5375e --- /dev/null +++ b/CodeWalker.Core/GlobalSuppressions.cs @@ -0,0 +1,8 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Style", "IDE0305:Simplify collection initialization", Justification = "", Scope = "member", Target = "~M:CodeWalker.GameFiles.YmapFile.EnsureEntities(CodeWalker.GameFiles.Meta)")] diff --git a/CodeWalker.Core/Properties/PublishProfiles/FolderProfile.pubxml b/CodeWalker.Core/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..0da6487 --- /dev/null +++ b/CodeWalker.Core/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,15 @@ + + + + + Release + Any CPU + ..\publish\ + FileSystem + <_TargetId>Folder + net8.0 + false + + \ No newline at end of file diff --git a/CodeWalker.Core/Tests/GameFileCache.cs b/CodeWalker.Core/Tests/GameFileCache.cs index 35e6ffb..de9d8b9 100644 --- a/CodeWalker.Core/Tests/GameFileCache.cs +++ b/CodeWalker.Core/Tests/GameFileCache.cs @@ -22,10 +22,10 @@ namespace CodeWalker.GameFiles if (entry.Name.EndsWith("cache_y.dat", StringComparison.OrdinalIgnoreCase))// || entry.NameLower.EndsWith("cache_y_bank.dat")) { UpdateStatus?.Invoke(string.Format(entry.Path)); - var cdfile = RpfMan.GetFile(entry); - if (cdfile != null) + var cdfile = RpfManager.GetFile(entry); + if (cdfile is not null) { - var odata = entry.File.ExtractFile(entry as RpfFileEntry); + var odata = entry.File.ExtractFile((RpfFileEntry)entry); //var ndata = cdfile.Save(); var xml = CacheDatXml.GetXml(cdfile); @@ -67,7 +67,7 @@ namespace CodeWalker.GameFiles { UpdateStatus?.Invoke(string.Format(entry.Path)); HeightmapFile hmf = null; - hmf = RpfMan.GetFile(entry); + hmf = RpfManager.GetFile(entry); var d1 = hmf.RawFileData; //var d2 = hmf.Save(); var xml = HmapXml.GetXml(hmf); @@ -104,7 +104,7 @@ namespace CodeWalker.GameFiles { UpdateStatus?.Invoke(string.Format(entry.Path)); WatermapFile wmf = null; - wmf = RpfMan.GetFile(entry); + wmf = RpfManager.GetFile(entry); //var d1 = wmf.RawFileData; //var d2 = wmf.Save(); //var xml = WatermapXml.GetXml(wmf); @@ -144,8 +144,7 @@ namespace CodeWalker.GameFiles foreach (RpfEntry entry in rpf.AllEntries) { var rfe = entry as RpfFileEntry; - var rbfe = rfe as RpfBinaryFileEntry; - if ((rfe == null) || (rbfe == null)) continue; + if ((rfe == null) || (rfe is not RpfBinaryFileEntry rbfe)) continue; if (rfe.IsExtension(".rel")) { @@ -162,7 +161,7 @@ namespace CodeWalker.GameFiles { data = rel.Save(); - if (data != null) + if (data.Length > 0) { if (data.Length != rbfe.FileUncompressedSize) { } @@ -172,22 +171,15 @@ namespace CodeWalker.GameFiles { for (int i = 0; i < data.Length; i++) //raw file test if (data[i] != rel.RawFileData[i]) - { break; } + { + break; + } } RelFile rel2 = new RelFile(); rel2.Load(data, rfe);//roundtrip test - - if (rel2.IndexCount != rel.IndexCount) - { } - if (rel2.RelDatas == null) - { } - } - else - { } - } if (xmltest) @@ -210,7 +202,9 @@ namespace CodeWalker.GameFiles { for (int i = 0; i < data.Length; i++) //raw file test if (data[i] != rel.RawFileData[i]) - { break; } + { + break; + } } var relxml2 = RelXml.GetXml(rel4); //full insanity @@ -336,7 +330,7 @@ namespace CodeWalker.GameFiles uint s2 = (un / 80000); float f1 = s1 / 5000.0f; float f2 = s2 / 5000.0f; - sb.AppendFormat("{0}, {1}, 0, {2}\r\n", f1, f2, sn); + sb.AppendFormat("{0}, {1}, 0, {2}\r\n", f1, f2, sn.ToString()); } } @@ -386,7 +380,7 @@ namespace CodeWalker.GameFiles if (entry.IsExtension(".awc")) { UpdateStatus?.Invoke(string.Format(entry.Path)); - var awcfile = RpfMan.GetFile(entry); + var awcfile = RpfManager.GetFile(entry); if (awcfile != null) { } } @@ -443,8 +437,7 @@ namespace CodeWalker.GameFiles if (n.EndsWith(".ymap", StringComparison.OrdinalIgnoreCase) || n.EndsWith(".ytyp", StringComparison.OrdinalIgnoreCase) || n.EndsWith(".ymt", StringComparison.OrdinalIgnoreCase)) { - var rfe = entry as RpfResourceFileEntry; - if (rfe == null) continue; + if (entry is not RpfResourceFileEntry rfe) continue; UpdateStatus?.Invoke(string.Format(entry.Path)); @@ -603,55 +596,52 @@ namespace CodeWalker.GameFiles var data = entry.File.ExtractFile(fentry); if (data != null) { - using (MemoryStream ms = new MemoryStream(data)) + if (RbfFile.IsRBF(data)) { - if (RbfFile.IsRBF(ms)) + UpdateStatus?.Invoke(string.Format(entry.Path)); + + var rbf = new RbfFile(); + _ = rbf.Load(data); + + allrbfs.Add(fentry.Path); + + var xml = RbfXml.GetXml(rbf); + if (!string.IsNullOrEmpty(xml)) + { } + + var xdoc = new XmlDocument(); + xdoc.LoadXml(xml); + var rbf2 = XmlRbf.GetRbf(xdoc); + var rbf2b = rbf2.Save(); + + var rbf3 = new RbfFile(); + rbf3.Load(rbf2b); + var xml3 = RbfXml.GetXml(rbf3); + + if (xml.Length != xml3.Length) + { } + if (xml != xml3) { - UpdateStatus?.Invoke(string.Format(entry.Path)); + diffrbfs.Add(fentry.Path); + } - var rbf = new RbfFile(); - rbf.Load(ms); - - allrbfs.Add(fentry.Path); - - var xml = RbfXml.GetXml(rbf); - if (!string.IsNullOrEmpty(xml)) - { } - - var xdoc = new XmlDocument(); - xdoc.LoadXml(xml); - var rbf2 = XmlRbf.GetRbf(xdoc); - var rbf2b = rbf2.Save(); - - var rbf3 = new RbfFile(); - rbf3.Load(rbf2b); - var xml3 = RbfXml.GetXml(rbf3); - - if (xml.Length != xml3.Length) - { } - if (xml != xml3) + if (data.Length != rbf2b.Length) + { + //File.WriteAllBytes("C:\\GitHub\\CodeWalkerResearch\\RBF\\" + fentry.Name + ".dat0", data); + //File.WriteAllBytes("C:\\GitHub\\CodeWalkerResearch\\RBF\\" + fentry.Name + ".dat1", rbf2b); + } + else + { + for (int i = 0; i < data.Length; i++) { - diffrbfs.Add(fentry.Path); - } - - if (data.Length != rbf2b.Length) - { - //File.WriteAllBytes("C:\\GitHub\\CodeWalkerResearch\\RBF\\" + fentry.Name + ".dat0", data); - //File.WriteAllBytes("C:\\GitHub\\CodeWalkerResearch\\RBF\\" + fentry.Name + ".dat1", rbf2b); - } - else - { - for (int i = 0; i < data.Length; i++) + if (data[i] != rbf2b[i]) { - if (data[i] != rbf2b[i]) - { - diffrbfs.Add(fentry.Path); - break; - } + diffrbfs.Add(fentry.Path); + break; } } - } + } } @@ -677,8 +667,7 @@ namespace CodeWalker.GameFiles try #endif { - var rfe = entry as RpfFileEntry; - if (rfe == null) continue; + if (entry is not RpfFileEntry rfe) continue; if (rfe.IsExtension(".cut")) { @@ -720,8 +709,7 @@ namespace CodeWalker.GameFiles try #endif { - var rfe = entry as RpfFileEntry; - if (rfe == null) continue; + if (entry is not RpfFileEntry rfe) continue; if (rfe.IsExtension(".yld")) { @@ -760,8 +748,7 @@ namespace CodeWalker.GameFiles try #endif { - var rfe = entry as RpfFileEntry; - if (rfe == null) continue; + if (entry is not RpfFileEntry rfe) continue; if (rfe.IsExtension(".yed")) { @@ -810,7 +797,7 @@ namespace CodeWalker.GameFiles if (entry.IsExtension(".ycd")) { UpdateStatus?.Invoke(string.Format(entry.Path)); - YcdFile ycd1 = RpfMan.GetFile(entry); + YcdFile ycd1 = RpfManager.GetFile(entry); if (ycd1 == null) { errorentries.Add(entry); @@ -1084,7 +1071,7 @@ namespace CodeWalker.GameFiles YtdFile ytdfile = null; try { - ytdfile = RpfMan.GetFile(entry); + ytdfile = RpfManager.GetFile(entry); } catch (Exception ex) { @@ -1110,8 +1097,7 @@ namespace CodeWalker.GameFiles } if (savetest && (ytdfile != null) && (ytdfile.TextureDict != null)) { - var fentry = entry as RpfFileEntry; - if (fentry == null) + if (entry is not RpfFileEntry fentry) { continue; } //shouldn't happen var bytes = ytdfile.Save(); @@ -1181,7 +1167,7 @@ namespace CodeWalker.GameFiles YbnFile ybn = null; try { - ybn = RpfMan.GetFile(entry); + ybn = RpfManager.GetFile(entry); } catch (Exception ex) { @@ -1198,8 +1184,7 @@ namespace CodeWalker.GameFiles } if (savetest && (ybn != null) && (ybn.Bounds != null)) { - var fentry = entry as RpfFileEntry; - if (fentry == null) + if (entry is not RpfFileEntry fentry) { continue; } //shouldn't happen var bytes = ybn.Save(); @@ -1225,32 +1210,28 @@ namespace CodeWalker.GameFiles case BoundsType.Sphere: { var a = ybn.Bounds as BoundSphere; - var b = ybn2.Bounds as BoundSphere; - if (b == null) + if (ybn2.Bounds is not BoundSphere b) { continue; } break; } case BoundsType.Capsule: { var a = ybn.Bounds as BoundCapsule; - var b = ybn2.Bounds as BoundCapsule; - if (b == null) + if (ybn2.Bounds is not BoundCapsule b) { continue; } break; } case BoundsType.Box: { var a = ybn.Bounds as BoundBox; - var b = ybn2.Bounds as BoundBox; - if (b == null) + if (ybn2.Bounds is not BoundBox b) { continue; } break; } case BoundsType.Geometry: { var a = ybn.Bounds as BoundGeometry; - var b = ybn2.Bounds as BoundGeometry; - if (b == null) + if (ybn2.Bounds is not BoundGeometry b) { continue; } if (a.Polygons?.Length != b.Polygons?.Length) { continue; } @@ -1266,8 +1247,7 @@ namespace CodeWalker.GameFiles case BoundsType.GeometryBVH: { var a = ybn.Bounds as BoundBVH; - var b = ybn2.Bounds as BoundBVH; - if (b == null) + if (ybn2.Bounds is not BoundBVH b) { continue; } if (a.BVH?.Nodes?.data_items?.Length != b.BVH?.Nodes?.data_items?.Length) { } @@ -1285,8 +1265,7 @@ namespace CodeWalker.GameFiles case BoundsType.Composite: { var a = ybn.Bounds as BoundComposite; - var b = ybn2.Bounds as BoundComposite; - if (b == null) + if (ybn2.Bounds is not BoundComposite b) { continue; } if (a.Children?.data_items?.Length != b.Children?.data_items?.Length) { } @@ -1295,24 +1274,21 @@ namespace CodeWalker.GameFiles case BoundsType.Disc: { var a = ybn.Bounds as BoundDisc; - var b = ybn2.Bounds as BoundDisc; - if (b == null) + if (ybn2.Bounds is not BoundDisc b) { continue; } break; } case BoundsType.Cylinder: { var a = ybn.Bounds as BoundCylinder; - var b = ybn2.Bounds as BoundCylinder; - if (b == null) + if (ybn2.Bounds is not BoundCylinder b) { continue; } break; } case BoundsType.Cloth: { var a = ybn.Bounds as BoundCloth; - var b = ybn2.Bounds as BoundCloth; - if (b == null) + if (ybn2.Bounds is not BoundCloth b) { continue; } break; } @@ -1353,7 +1329,7 @@ namespace CodeWalker.GameFiles YdrFile ydr = null; try { - ydr = RpfMan.GetFile(entry); + ydr = RpfManager.GetFile(entry); } catch (Exception ex) { @@ -1362,8 +1338,7 @@ namespace CodeWalker.GameFiles } if (savetest && (ydr != null) && (ydr.Drawable != null)) { - var fentry = entry as RpfFileEntry; - if (fentry == null) + if (entry is not RpfFileEntry fentry) { continue; } //shouldn't happen if (boundsonly && (ydr.Drawable.Bound == null)) @@ -1412,7 +1387,7 @@ namespace CodeWalker.GameFiles YddFile ydd = null; try { - ydd = RpfMan.GetFile(entry); + ydd = RpfManager.GetFile(entry); } catch (Exception ex) { @@ -1421,8 +1396,7 @@ namespace CodeWalker.GameFiles } if (savetest && (ydd != null) && (ydd.DrawableDict != null)) { - var fentry = entry as RpfFileEntry; - if (fentry == null) + if (entry is not RpfFileEntry fentry) { continue; } //shouldn't happen var bytes = ydd.Save(); @@ -1481,7 +1455,7 @@ namespace CodeWalker.GameFiles YftFile yft = null; try { - yft = RpfMan.GetFile(entry); + yft = RpfManager.GetFile(entry); } catch (Exception ex) { @@ -1490,8 +1464,7 @@ namespace CodeWalker.GameFiles } if (savetest && (yft != null) && (yft.Fragment != null)) { - var fentry = entry as RpfFileEntry; - if (fentry == null) + if (entry is not RpfFileEntry fentry) { continue; } //shouldn't happen var bytes = yft.Save(); @@ -1558,7 +1531,7 @@ namespace CodeWalker.GameFiles YptFile ypt = null; try { - ypt = RpfMan.GetFile(entry); + ypt = RpfManager.GetFile(entry); } catch (Exception ex) { @@ -1567,8 +1540,7 @@ namespace CodeWalker.GameFiles } if (savetest && (ypt != null) && (ypt.PtfxList != null)) { - var fentry = entry as RpfFileEntry; - if (fentry == null) + if (entry is not RpfFileEntry fentry) { continue; } //shouldn't happen var bytes = ypt.Save(); @@ -1616,7 +1588,7 @@ namespace CodeWalker.GameFiles YnvFile ynv = null; try { - ynv = RpfMan.GetFile(entry); + ynv = RpfManager.GetFile(entry); } catch (Exception ex) { @@ -1646,8 +1618,7 @@ namespace CodeWalker.GameFiles } if (savetest && (ynv != null) && (ynv.Nav != null)) { - var fentry = entry as RpfFileEntry; - if (fentry == null) + if (entry is not RpfFileEntry fentry) { continue; } //shouldn't happen var bytes = ynv.Save(); @@ -1688,8 +1659,7 @@ namespace CodeWalker.GameFiles try #endif { - var rfe = entry as RpfFileEntry; - if (rfe == null) continue; + if (entry is not RpfFileEntry rfe) continue; if (rfe.IsExtension(".yvr")) { @@ -1785,7 +1755,7 @@ namespace CodeWalker.GameFiles if (entry.IsExtension(".ymap")) { UpdateStatus?.Invoke(string.Format(entry.Path)); - YmapFile ymapfile = RpfMan.GetFile(entry); + YmapFile ymapfile = RpfManager.GetFile(entry); if ((ymapfile != null))// && (ymapfile.Meta != null)) { } } @@ -1805,15 +1775,14 @@ namespace CodeWalker.GameFiles { foreach (RpfEntry entry in file.AllEntries) { - var rfe = entry as RpfFileEntry; - if (rfe == null) continue; + if (entry is not RpfFileEntry rfe) continue; try { if (rfe.IsExtension(".ypdb")) { UpdateStatus?.Invoke(string.Format(entry.Path)); - YpdbFile ypdb = RpfMan.GetFile(entry); + YpdbFile ypdb = RpfManager.GetFile(entry); if (ypdb != null) { var odata = entry.File.ExtractFile(entry as RpfFileEntry); @@ -1854,15 +1823,14 @@ namespace CodeWalker.GameFiles { foreach (RpfEntry entry in file.AllEntries) { - var rfe = entry as RpfFileEntry; - if (rfe == null) continue; + if (entry is not RpfFileEntry rfe) continue; try { if (rfe.IsExtension(".yfd")) { UpdateStatus?.Invoke(string.Format(entry.Path)); - YfdFile yfd = RpfMan.GetFile(entry); + YfdFile yfd = RpfManager.GetFile(entry); if (yfd != null) { if (yfd.FrameFilterDictionary != null) @@ -1909,7 +1877,7 @@ namespace CodeWalker.GameFiles if (entry.IsExtension(".mrf")) { UpdateStatus?.Invoke(string.Format(entry.Path)); - MrfFile mrffile = RpfMan.GetFile(entry); + MrfFile mrffile = RpfManager.GetFile(entry); if (mrffile != null) { var odata = entry.File.ExtractFile(entry as RpfFileEntry); @@ -2079,10 +2047,10 @@ namespace CodeWalker.GameFiles if (entry.IsExtension(".fxc")) { UpdateStatus?.Invoke(string.Format(entry.Path)); - var fxcfile = RpfMan.GetFile(entry); - if (fxcfile != null) + var fxcfile = RpfManager.GetFile(entry); + if (fxcfile is not null) { - var odata = entry.File.ExtractFile(entry as RpfFileEntry); + var odata = entry.File.ExtractFile((RpfFileEntry)entry); var ndata = fxcfile.Save(); if (ndata.Length == odata.Length) { @@ -2294,7 +2262,7 @@ namespace CodeWalker.GameFiles if (doydr && entry.IsExtension(".ydr")) { UpdateStatus?.Invoke(entry.Path); - YdrFile ydr = RpfMan.GetFile(entry); + YdrFile ydr = RpfManager.GetFile(entry); if (ydr == null) { @@ -2323,7 +2291,7 @@ namespace CodeWalker.GameFiles else if (doydd & entry.IsExtension(".ydd")) { UpdateStatus?.Invoke(entry.Path); - YddFile ydd = RpfMan.GetFile(entry); + YddFile ydd = RpfManager.GetFile(entry); if (ydd == null) { @@ -2355,7 +2323,7 @@ namespace CodeWalker.GameFiles else if (doyft && entry.IsExtension(".yft")) { UpdateStatus?.Invoke(entry.Path); - YftFile yft = RpfMan.GetFile(entry); + YftFile yft = RpfManager.GetFile(entry); if (yft == null) { diff --git a/CodeWalker.Core/Utils/BoundingBoxes.cs b/CodeWalker.Core/Utils/BoundingBoxes.cs index d602c8f..60cd4ae 100644 --- a/CodeWalker.Core/Utils/BoundingBoxes.cs +++ b/CodeWalker.Core/Utils/BoundingBoxes.cs @@ -5,7 +5,7 @@ namespace CodeWalker.Core.Utils { public static class BoundingBoxExtensions { - public static Vector3 Size(this BoundingBox bounds) + public static Vector3 Size(in this BoundingBox bounds) { return new Vector3( Math.Abs(bounds.Maximum.X - bounds.Minimum.X), @@ -13,25 +13,25 @@ namespace CodeWalker.Core.Utils Math.Abs(bounds.Maximum.Z - bounds.Minimum.Z)); } - public static Vector3 Center(this BoundingBox bounds) + public static Vector3 Center(in this BoundingBox bounds) { return (bounds.Minimum + bounds.Maximum) * 0.5F; } - public static BoundingBox Encapsulate(this BoundingBox box, BoundingBox bounds) + public static BoundingBox Encapsulate(ref this BoundingBox box, ref BoundingBox bounds) { - box.Minimum = Vector3.Min(box.Minimum, bounds.Minimum); - box.Maximum = Vector3.Max(box.Maximum, bounds.Maximum); + Vector3.Min(ref box.Minimum, ref bounds.Minimum, out box.Minimum); + Vector3.Max(ref box.Maximum, ref bounds.Maximum, out box.Maximum); return box; } - public static float Radius(this BoundingBox box) + public static float Radius(in this BoundingBox box) { var extents = (box.Maximum - box.Minimum) * 0.5F; return extents.Length(); } - public static BoundingBox Expand(this BoundingBox b, float amount) + public static BoundingBox Expand(in this BoundingBox b, float amount) { return new BoundingBox(b.Minimum - Vector3.One * amount, b.Maximum + Vector3.One * amount); } diff --git a/CodeWalker.Core/Utils/Cache.cs b/CodeWalker.Core/Utils/Cache.cs index 7329c7c..0a16bb8 100644 --- a/CodeWalker.Core/Utils/Cache.cs +++ b/CodeWalker.Core/Utils/Cache.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace CodeWalker { - public class Cache where TVal : Cacheable + public class Cache where TVal : Cacheable where TKey : notnull { public long MaxMemoryUsage = 536870912; //512mb public long CurrentMemoryUsage = 0; @@ -21,13 +21,7 @@ namespace CodeWalker private object loadedListLock = new object(); private ConcurrentDictionary> loadedListDict = new ConcurrentDictionary>(); - public int Count - { - get - { - return loadedList.Count; - } - } + public int Count => loadedList.Count; public Cache() { @@ -40,11 +34,16 @@ namespace CodeWalker public void BeginFrame() { + var now = DateTime.Now; + if (now - CurrentTime < TimeSpan.FromSeconds(0.05)) + { + return; + } CurrentTime = DateTime.Now; Compact(); } - public TVal TryGet(TKey key) + public TVal? TryGet(in TKey key) { lock (loadedListLock) { @@ -55,7 +54,7 @@ namespace CodeWalker lln.Value.LastUseTime = CurrentTime; } - return (lln != null) ? lln.Value : null; + return lln?.Value; } } public bool TryAdd(TKey key, TVal item) @@ -80,9 +79,9 @@ namespace CodeWalker var oldlln = loadedList.First; var cachetime = LoadingCacheTime; int iter = 0, maxiter = 2; - while (!CanAdd() && (iter cachetime)) + while (!CanAdd() && oldlln is not null && (CurrentTime - oldlln.Value.LastUseTime).TotalSeconds > cachetime) { Interlocked.Add(ref CurrentMemoryUsage, -oldlln.Value.MemoryUsage); lock (loadedListLock) @@ -92,8 +91,11 @@ namespace CodeWalker loadedListDict.TryRemove(oldlln.Value.Key, out _); - oldlln.Value = null; - oldlln = null; + if (oldlln.Value is IDisposable disposable) + { + disposable.Dispose(); + } + //GC.Collect(); oldlln = loadedList.First; } @@ -119,10 +121,7 @@ namespace CodeWalker return false; } - public bool CanAdd() - { - return Interlocked.Read(ref CurrentMemoryUsage) < MaxMemoryUsage; - } + public bool CanAdd() => CurrentMemoryUsage < MaxMemoryUsage; public void Clear() @@ -135,7 +134,7 @@ namespace CodeWalker Interlocked.Exchange(ref CurrentMemoryUsage, 0); } - public void Remove(TKey key) + public void Remove(in TKey key) { if (!loadedListDict.ContainsKey(key)) { @@ -148,6 +147,10 @@ namespace CodeWalker { loadedList.Remove(n); } + if (n is IDisposable disposable) + { + disposable.Dispose(); + } Interlocked.Add(ref CurrentMemoryUsage, -n.Value.MemoryUsage); } } @@ -158,15 +161,19 @@ namespace CodeWalker lock(loadedListLock) { var oldlln = loadedList.First; - while (oldlln != null) + while (oldlln is not null) { - if ((CurrentTime - oldlln.Value.LastUseTime).TotalSeconds < CacheTime) break; + if ((CurrentTime - oldlln.Value.LastUseTime).TotalSeconds < CacheTime) + break; var nextln = oldlln.Next; Interlocked.Add(ref CurrentMemoryUsage, -oldlln.Value.MemoryUsage); - loadedListDict.TryRemove(oldlln.Value.Key, out _); + loadedListDict.TryRemove(oldlln.Value.Key, out var n); + if (n is IDisposable disposable) + { + disposable.Dispose(); + } loadedList.Remove(oldlln); //gc should free up memory later.. - oldlln.Value = null; oldlln = nextln; } } @@ -175,7 +182,7 @@ namespace CodeWalker } - public abstract class Cacheable + public abstract class Cacheable where TKey : notnull { public TKey Key; public DateTime LastUseTime; diff --git a/CodeWalker.Core/Utils/ETWEvents.cs b/CodeWalker.Core/Utils/ETWEvents.cs index 5181f8a..2a9e9fd 100644 --- a/CodeWalker.Core/Utils/ETWEvents.cs +++ b/CodeWalker.Core/Utils/ETWEvents.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace CodeWalker.Core.Utils; -[EventSource(Name = "CodeWalker-Diagnostics")] +[EventSource(Name = "CodeWalker-Diagnostics", Guid = "911cf260-f98c-5a05-7f16-f11db360be50")] public class ETWEvents : EventSource { public static class Keywords @@ -25,7 +25,7 @@ public class ETWEvents : EventSource } - public ETWEvents(bool throwOnEventWriteErrors) : base(throwOnEventWriteErrors) + private ETWEvents(bool throwOnEventWriteErrors) : base(throwOnEventWriteErrors) { } [Event(1, Message = "Starting up.", Keywords = Keywords.Performance, Level = EventLevel.Informational)] @@ -33,11 +33,32 @@ public class ETWEvents : EventSource WriteEvent(1); } - [Event(2, Message = "Creating form {0}", Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] - public void CreatingForm(string form) { WriteEvent(2, form); } + [Event(2, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void CreatingFormStart(string form) { WriteEvent(2, form); } + [Event(3, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void CreatingFormStop() { WriteEvent(3); } + + [Event(4, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void LoadingForm(string form) { WriteEvent(4, form); } + + [Event(5, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void RefreshingMainTreeViewStart(string path) { WriteEvent(5, path); } + [Event(6, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void RefreshingMainTreeViewStop() { WriteEvent(6); } + + [Event(7, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void RefreshMainTreeViewStart() { WriteEvent(7); } + [Event(8, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void RefreshMainTreeViewStop() { WriteEvent(8); } + + [Event(9, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void InitFileCacheStart() { + WriteEvent(9); + } + [Event(10, Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] + public void InitFileCacheStop() { WriteEvent(10); } + - [Event(3, Message = "Loading form {0}", Keywords = Keywords.Performance | Keywords.StateChanges, Level = EventLevel.Verbose)] - public void LoadingForm(string form) { WriteEvent(3, form); } public static readonly ETWEvents Log = new ETWEvents(true); } diff --git a/CodeWalker.Core/Utils/Fbx.cs b/CodeWalker.Core/Utils/Fbx.cs index 75bacb4..7cab301 100644 --- a/CodeWalker.Core/Utils/Fbx.cs +++ b/CodeWalker.Core/Utils/Fbx.cs @@ -239,8 +239,7 @@ namespace CodeWalker public override bool Equals(object obj) { - var id = obj as Identifier; - if (id != null) + if (obj is Identifier id) return String == id.String; return false; } @@ -383,8 +382,7 @@ namespace CodeWalker { ret = ReadTokenSingle(); } while (ret == null); - var id = ret as Identifier; - if (id != null) + if (ret is Identifier id) { object colon; do @@ -553,8 +551,7 @@ namespace CodeWalker public FbxNode ReadNode() { var first = ReadToken(); - var id = first as Identifier; - if (id == null) + if (first is not Identifier id) { if (first is EndOfStream) return null; @@ -1311,7 +1308,7 @@ namespace CodeWalker private delegate void PropertyWriter(BinaryWriter sw, object obj); - struct WriterInfo + readonly struct WriterInfo { public readonly char id; public readonly PropertyWriter writer; diff --git a/CodeWalker.Core/Utils/FbxConverter.cs b/CodeWalker.Core/Utils/FbxConverter.cs index d62fb67..8e40a91 100644 --- a/CodeWalker.Core/Utils/FbxConverter.cs +++ b/CodeWalker.Core/Utils/FbxConverter.cs @@ -110,7 +110,7 @@ namespace CodeWalker var vc = g.VertexData.VertexCount; for (int i = 0; i < vc; i++) { - var vp = MetaTypes.ConvertData(vb, i * vs);//position offset should always be 0! + MetaTypes.TryConvertData(vb, i * vs, out var vp); allVerts.Add(vp); bbMin = Vector3.Min(bbMin, vp); bbMax = Vector3.Max(bbMax, vp); @@ -228,7 +228,6 @@ namespace CodeWalker private FbxModel TryConvertModel(FbxNode mnode) { - FbxNode geonode = null; var matnodes = new List(); foreach (var cnode in mnode.Connections) @@ -250,10 +249,8 @@ namespace CodeWalker return null; //need atleast one material... var fnEdges = geonode["Edges"]?.Value as int[];//do we need this? maybe for collision/navmesh - var fnVerts = geonode["Vertices"]?.Value as double[]; - var fnIndices = geonode["PolygonVertexIndex"]?.Value as int[]; - if ((fnVerts == null) || (fnIndices == null)) + if ((geonode["Vertices"]?.Value is not double[] fnVerts) || (geonode["PolygonVertexIndex"]?.Value is not int[] fnIndices)) { return null; } //no mesh data.. abort! var fnNormals = new List(); @@ -476,12 +473,18 @@ namespace CodeWalker if (dGeomAABBs.Count > 1)//need to include whole model AABB first, if more than one geometry.. { var dGeomAABBs2 = new List(); - dModelAABB.Min = new Vector4(float.MaxValue); - dModelAABB.Max = new Vector4(float.MinValue); + dModelAABB = new AABB_s + { + Min = new Vector4(float.MaxValue), + Max = new Vector4(float.MinValue), + }; foreach (var aabb in dGeomAABBs) { - dModelAABB.Min = Vector4.Min(dModelAABB.Min, aabb.Min); - dModelAABB.Max = Vector4.Max(dModelAABB.Max, aabb.Max); + dModelAABB = new AABB_s + { + Min = Vector4.Min(dModelAABB.Min, aabb.Min), + Max = Vector4.Max(dModelAABB.Max, aabb.Max) + }; } dGeomAABBs2.Add(dModelAABB); dGeomAABBs2.AddRange(dGeomAABBs); @@ -577,13 +580,20 @@ namespace CodeWalker if (vList.Count > 0) { - aabb.Min = new Vector4(float.MaxValue); - aabb.Max = new Vector4(float.MinValue); + aabb = new AABB_s + { + Min = new Vector4(float.MaxValue), + Max = new Vector4(float.MinValue), + }; foreach (var vert in vList) { var v = new Vector4(vert.Position, vert.Position.X); - aabb.Min = Vector4.Min(aabb.Min, v); - aabb.Max = Vector4.Max(aabb.Max, v); + + aabb = new AABB_s + { + Min = Vector4.Min(aabb.Min, v), + Max = Vector4.Max(aabb.Max, v) + }; } } @@ -664,15 +674,9 @@ namespace CodeWalker { texConns.Add(conn); var texName = GetStringFromObjectList(conn.Properties, 1)?.Replace("Texture::", ""); - var ftexName = conn["FileName"]?.Value as string; - if (ftexName != null) + if (conn["FileName"]?.Value is string ftexName) { - try - { - texName = Path.GetFileNameWithoutExtension(ftexName); - } - catch - { } + texName = Path.GetFileNameWithoutExtension(ftexName); } texNames.Add(texName); } @@ -959,7 +963,7 @@ namespace CodeWalker } private void WriteBytes(T val, int offset) where T : struct { - var data = MetaTypes.ConvertToBytes(val); + var data = MetaTypes.ConvertToBytes(in val); for (int i = 0; i < data.Length; i++) { Bytes[offset + i] = data[i]; diff --git a/CodeWalker.Core/Utils/FileUtils.cs b/CodeWalker.Core/Utils/FileUtils.cs new file mode 100644 index 0000000..015c39f --- /dev/null +++ b/CodeWalker.Core/Utils/FileUtils.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace CodeWalker.Core.Utils +{ + public static class FileUtils + { + public static bool TryFindFolder(string dirToFind, out string folder) + { + return TryFindFolder(dirToFind, null, out folder); + } + + public static bool TryFindFolder(string dirToFind, string? basePath, [NotNullWhen(true)]out string folder) + { + basePath ??= Assembly.GetExecutingAssembly().Location; + // Search up directory tree starting at assembly path looking for 'Images' dir. + var searchPath = Path.GetDirectoryName(basePath); + + ArgumentNullException.ThrowIfNullOrEmpty(basePath, nameof(basePath)); + while (true) + { + var testPath = Path.Combine(searchPath, dirToFind); + if (Directory.Exists(testPath)) + { + // Found it! + folder = testPath; + return true; + } + + // Move up one directory. + var newSearchPath = Path.GetFullPath(Path.Combine(searchPath, "..")); + if (newSearchPath == searchPath) + { + // Didn't move up, so we're at the root. + folder = null; + return false; + } + searchPath = newSearchPath; + } + } + } +} diff --git a/CodeWalker.Core/Utils/Matrices.cs b/CodeWalker.Core/Utils/Matrices.cs index 15441c8..99201f8 100644 --- a/CodeWalker.Core/Utils/Matrices.cs +++ b/CodeWalker.Core/Utils/Matrices.cs @@ -5,12 +5,14 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using MatrixSystem = System.Numerics.Matrix4x4; + namespace CodeWalker { public static class MatrixExtensions { - public static Vector3 MultiplyW(this Matrix m, Vector3 v) + public static Vector3 MultiplyW(in this Matrix m, Vector3 v) { float x = (((m.M11 * v.X) + (m.M21 * v.Y)) + (m.M31 * v.Z)) + m.M41; float y = (((m.M12 * v.X) + (m.M22 * v.Y)) + (m.M32 * v.Z)) + m.M42; @@ -19,7 +21,18 @@ namespace CodeWalker float iw = 1.0f / Math.Abs(w); return new Vector3(x * iw, y * iw, z * iw); } - public static Vector3 Multiply(this Matrix m, Vector3 v) + + public static Vector3 MultiplyW(in this Matrix m, in Vector3 v) + { + float x = (((m.M11 * v.X) + (m.M21 * v.Y)) + (m.M31 * v.Z)) + m.M41; + float y = (((m.M12 * v.X) + (m.M22 * v.Y)) + (m.M32 * v.Z)) + m.M42; + float z = (((m.M13 * v.X) + (m.M23 * v.Y)) + (m.M33 * v.Z)) + m.M43; + float w = (((m.M14 * v.X) + (m.M24 * v.Y)) + (m.M34 * v.Z)) + m.M44; + float iw = 1.0f / Math.Abs(w); + return new Vector3(x * iw, y * iw, z * iw); + } + + public static Vector3 Multiply(in this Matrix m, Vector3 v) { float x = (((m.M11 * v.X) + (m.M21 * v.Y)) + (m.M31 * v.Z)) + m.M41; float y = (((m.M12 * v.X) + (m.M22 * v.Y)) + (m.M32 * v.Z)) + m.M42; @@ -27,7 +40,7 @@ namespace CodeWalker return new Vector3(x, y, z); //this quick mul ignores W... } - public static Vector3 MultiplyRot(this Matrix m, Vector3 v) + public static Vector3 MultiplyRot(in this Matrix m, Vector3 v) { float x = (((m.M11 * v.X) + (m.M21 * v.Y)) + (m.M31 * v.Z));// + m.M41; float y = (((m.M12 * v.X) + (m.M22 * v.Y)) + (m.M32 * v.Z));// + m.M42; @@ -36,7 +49,7 @@ namespace CodeWalker //this quick mul ignores W and translation... } - public static Vector4 Multiply(this Matrix m, Vector4 v) + public static Vector4 Multiply(in this Matrix m, Vector4 v) { float x = (((m.M11 * v.X) + (m.M21 * v.Y)) + (m.M31 * v.Z)) + m.M41; float y = (((m.M12 * v.X) + (m.M22 * v.Y)) + (m.M32 * v.Z)) + m.M42; @@ -45,11 +58,12 @@ namespace CodeWalker return new Vector4(x, y, z, w); } - public static Quaternion ToQuaternion(this Matrix m) + public static Quaternion ToQuaternion(in this Matrix m) { var rmat = m; rmat.TranslationVector = Vector3.Zero; - return Quaternion.RotationMatrix(rmat); + Quaternion.RotationMatrix(ref rmat, out var result); + return result; } } diff --git a/CodeWalker.Core/Utils/Quaternions.cs b/CodeWalker.Core/Utils/Quaternions.cs index 3d99dc7..0021834 100644 --- a/CodeWalker.Core/Utils/Quaternions.cs +++ b/CodeWalker.Core/Utils/Quaternions.cs @@ -12,7 +12,7 @@ namespace CodeWalker public static class QuaternionExtension { - public static Vector3 Multiply(this Quaternion a, Vector3 b) + public static Vector3 Multiply(in this Quaternion a, in Vector3 b) { float axx = a.X * 2.0f; float ayy = a.Y * 2.0f; @@ -31,7 +31,7 @@ namespace CodeWalker ((b.X * (axzz - awyy)) + (b.Y * (ayzz + awxx))) + (b.Z * ((1.0f - axxx) - ayyy))); } - public static Matrix ToMatrix(this Quaternion q) + public static Matrix ToMatrix(in this Quaternion q) { float xx = q.X * q.X; float yy = q.Y * q.Y; @@ -62,12 +62,12 @@ namespace CodeWalker return result; } - public static Vector4 ToVector4(this Quaternion q) + public static Vector4 ToVector4(in this Quaternion q) { return new Vector4(q.X, q.Y, q.Z, q.W); } - public static Quaternion FastLerp(Quaternion a, Quaternion b, float v) + public static Quaternion FastLerp(in Quaternion a, in Quaternion b, float v) { var r = new Quaternion(); var vi = 1.0f - v; diff --git a/CodeWalker.Core/Utils/SharedObjectPool.cs b/CodeWalker.Core/Utils/SharedObjectPool.cs new file mode 100644 index 0000000..f3f8b74 --- /dev/null +++ b/CodeWalker.Core/Utils/SharedObjectPool.cs @@ -0,0 +1,59 @@ +using Collections.Pooled; +using CommunityToolkit.HighPerformance.Buffers; +using Microsoft.Extensions.ObjectPool; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace CodeWalker.Core.Utils +{ + public class SharedObjectPool where T : class, new() + { + private static readonly ObjectPool s_shared = ObjectPool.Create(); + + public static ObjectPool Shared => s_shared; + } + + public class PooledListObjectPolicy : PooledObjectPolicy> + { + public PooledList Get() + { + return new PooledList(); + } + + public override PooledList Create() + { + return new PooledList(); + } + + public override bool Return(PooledList list) + { + foreach (var entry in list.Span) + { + if (entry is IDisposable disposable) + disposable.Dispose(); + if (entry is IResettable resettable) + resettable.TryReset(); + } + + list.Clear(); + return true; + } + } + + public static class StringPoolExtension + { + [SkipLocalsInit] + public static string GetStringPooled(this Encoding encoding, ReadOnlySpan bytes) + { + Span buffer = stackalloc char[bytes.Length]; + + var charsWritten = encoding.GetChars(bytes, buffer); + + return StringPool.Shared.GetOrAdd(buffer.Slice(0, charsWritten)); + } + } +} diff --git a/CodeWalker.Core/Utils/SplitEnumerator.cs b/CodeWalker.Core/Utils/SplitEnumerator.cs index 7571320..660a622 100644 --- a/CodeWalker.Core/Utils/SplitEnumerator.cs +++ b/CodeWalker.Core/Utils/SplitEnumerator.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; @@ -12,14 +13,15 @@ namespace CodeWalker.Core.Utils /// /// To get an instance of this type, use . /// - public ref struct SpanSplitEnumerator + public ref struct SpanSplitEnumerator where T : IEquatable? { - private ReadOnlySpan _remaining; - private ReadOnlySpan _current; + private ReadOnlySpan _remaining; + private ReadOnlySpan _current; private bool _isEnumeratorActive; - private char _splitBy; + private readonly T _splitBy; + private readonly ReadOnlySpan _splitBySpan; - internal SpanSplitEnumerator(ReadOnlySpan buffer, char splitBy) + internal SpanSplitEnumerator(ReadOnlySpan buffer, T splitBy) { _remaining = buffer; _current = default; @@ -30,12 +32,12 @@ namespace CodeWalker.Core.Utils /// /// Gets the line at the current position of the enumerator. /// - public ReadOnlySpan Current => _current; + public ReadOnlySpan Current => _current; /// /// Returns this instance as an enumerator. /// - public SpanSplitEnumerator GetEnumerator() => this; + public readonly SpanSplitEnumerator GetEnumerator() => this; /// /// Advances the enumerator to the next line of the span. @@ -51,7 +53,7 @@ namespace CodeWalker.Core.Utils return false; // EOF previously reached or enumerator was never initialized } - ReadOnlySpan remaining = _remaining; + ReadOnlySpan remaining = _remaining; int idx = remaining.IndexOf(_splitBy); @@ -74,21 +76,175 @@ namespace CodeWalker.Core.Utils } } + public ref struct SpanSplitEnumeratorAny where T : IEquatable? + { + private ReadOnlySpan _remaining; + private ReadOnlySpan _current; + private bool _isEnumeratorActive; + private readonly ReadOnlySpan _splitBy; + + internal SpanSplitEnumeratorAny(ReadOnlySpan buffer, ReadOnlySpan splitBy) + { + _remaining = buffer; + _current = default; + _isEnumeratorActive = true; + _splitBy = splitBy; + } + + /// + /// Gets the line at the current position of the enumerator. + /// + public readonly ReadOnlySpan Current => _current; + + /// + /// Returns this instance as an enumerator. + /// + public readonly SpanSplitEnumeratorAny GetEnumerator() => this; + + /// + /// Advances the enumerator to the next line of the span. + /// + /// + /// True if the enumerator successfully advanced to the next line; false if + /// the enumerator has advanced past the end of the span. + /// + public bool MoveNext() + { + if (!_isEnumeratorActive) + { + return false; // EOF previously reached or enumerator was never initialized + } + + ReadOnlySpan remaining = _remaining; + + int idx = remaining.IndexOfAny(_splitBy); + + if ((uint)idx < (uint)remaining.Length) + { + _current = remaining.Slice(0, idx); + _remaining = remaining.Slice(idx + 1); + } + else + { + // We've reached EOF, but we still need to return 'true' for this final + // iteration so that the caller can query the Current property once more. + + _current = remaining; + _remaining = default; + _isEnumeratorActive = false; + } + + return true; + } + } + public static class EnumerateSplitExtensions { - public static SpanSplitEnumerator EnumerateSplit(this ReadOnlySpan span, char splitBy) + public static SpanSplitEnumerator EnumerateSplit(this ReadOnlySpan span, T splitBy) where T : IEquatable { - return new SpanSplitEnumerator(span, splitBy); + return new SpanSplitEnumerator(span, splitBy); } - public static SpanSplitEnumerator EnumerateSplit(this Span span, char splitBy) + public static SpanSplitEnumeratorAny EnumerateSplitAny(this ReadOnlySpan span, ReadOnlySpan splitBy) where T : IEquatable { - return new SpanSplitEnumerator(span, splitBy); + return new SpanSplitEnumeratorAny(span, splitBy); } - public static SpanSplitEnumerator EnumerateSplit(this string str, char splitBy) + public static SpanSplitEnumerator EnumerateSplit(this Span span, T splitBy) where T : IEquatable { - return new SpanSplitEnumerator(str.AsSpan(), splitBy); + return new SpanSplitEnumerator(span, splitBy); + } + + public static SpanSplitEnumeratorAny EnumerateSplitAny(this Span span, ReadOnlySpan splitBy) where T : IEquatable + { + return new SpanSplitEnumeratorAny(span, splitBy); + } + + public static SpanSplitEnumerator EnumerateSplit(this string str, char splitBy) + { + return EnumerateSplit(str.AsSpan(), splitBy); + } + + public static SpanSplitEnumeratorAny EnumerateSplitAny(this string str, ReadOnlySpan splitBy) + { + return EnumerateSplitAny(str.AsSpan(), splitBy); + } + + public static ReverseSpanSplitEnumerator ReverseEnumerateSplit(this ReadOnlySpan span, T splitBy) where T : IEquatable + { + return new ReverseSpanSplitEnumerator(span, splitBy); + } + + public static ReverseSpanSplitEnumerator ReverseEnumerateSplit(this Span span, T splitBy) where T : IEquatable + { + return new ReverseSpanSplitEnumerator(span, splitBy); + } + + public static ReverseSpanSplitEnumerator ReverseEnumerateSplit(this string str, char splitBy) + { + return ReverseEnumerateSplit(str.AsSpan(), splitBy); + } + } + + public ref struct ReverseSpanSplitEnumerator where T : IEquatable? + { + private ReadOnlySpan _remaining; + private ReadOnlySpan _current; + private bool _isEnumeratorActive; + private T _splitBy; + + internal ReverseSpanSplitEnumerator(ReadOnlySpan buffer, T splitBy) + { + _remaining = buffer; + _current = default; + _isEnumeratorActive = true; + _splitBy = splitBy; + } + + /// + /// Gets the line at the current position of the enumerator. + /// + public readonly ReadOnlySpan Current => _current; + + /// + /// Returns this instance as an enumerator. + /// + public readonly ReverseSpanSplitEnumerator GetEnumerator() => this; + + /// + /// Advances the enumerator to the next line of the span. + /// + /// + /// True if the enumerator successfully advanced to the next line; false if + /// the enumerator has advanced past the end of the span. + /// + public bool MoveNext() + { + if (!_isEnumeratorActive) + { + return false; // EOF previously reached or enumerator was never initialized + } + + ReadOnlySpan remaining = _remaining; + + int idx = remaining.LastIndexOf(_splitBy); + + if ((uint)idx < (uint)remaining.Length) + { + _current = remaining.Slice(idx + 1); + _remaining = remaining.Slice(0, idx); + } + else + { + // We've reached EOF, but we still need to return 'true' for this final + // iteration so that the caller can query the Current property once more. + + _current = remaining; + _remaining = default; + _isEnumeratorActive = false; + } + + return true; } } } diff --git a/CodeWalker.Core/Utils/StreamingExtensions.cs b/CodeWalker.Core/Utils/StreamingExtensions.cs index f6621f2..94a159f 100644 --- a/CodeWalker.Core/Utils/StreamingExtensions.cs +++ b/CodeWalker.Core/Utils/StreamingExtensions.cs @@ -1,9 +1,16 @@ -using System; +using CodeWalker.GameFiles; +using CommunityToolkit.Diagnostics; +using CommunityToolkit.HighPerformance; +using SharpDX; +using System; using System.Buffers; using System.Buffers.Binary; +using System.Collections.Concurrent; using System.Collections.Generic; +using System.Diagnostics; using System.Diagnostics.Contracts; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading; @@ -19,6 +26,436 @@ namespace CodeWalker.Core.Utils } } + public static class SequenceReaderExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool TryReadLittleEndian(ref this SequenceReader reader, out uint value) + { + reader.TryReadLittleEndian(out int _value); + value = (uint) _value; + return true; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool TryReadLittleEndian(ref this SequenceReader reader, out ushort value) + { + reader.TryReadLittleEndian(out short _value); + value = (ushort)_value; + return true; + } + + public static long ReadInt64(ref this SequenceReader reader) + { + reader.TryRead(out long value); + return value; + } + + public static long ReadInt64BigEndian(ref this SequenceReader reader) + { + reader.TryReadBigEndian(out long value); + return value; + } + + public static ulong ReadUInt64(ref this SequenceReader reader) + { + reader.TryRead(out ulong value); + return value; + } + + public static ulong ReadUInt64BigEndian(ref this SequenceReader reader) + { + reader.TryReadBigEndian(out long value); + return (ulong)value; + } + + public static uint ReadUInt32(ref this SequenceReader reader) + { + reader.TryRead(out uint value); + return value; + } + + public static uint ReadUInt32BigEndian(ref this SequenceReader reader) + { + reader.TryReadBigEndian(out int value); + return (uint)value; + } + + public static int ReadInt32(ref this SequenceReader reader) + { + reader.TryReadLittleEndian(out int value); + return value; + } + + public static int ReadInt32BigEndian(ref this SequenceReader reader) + { + reader.TryReadBigEndian(out int value); + return value; + } + + public static short ReadInt16(ref this SequenceReader reader) + { + reader.TryReadLittleEndian(out short value); + return value; + } + + public static short ReadInt16BigEndian(ref this SequenceReader reader) + { + reader.TryReadBigEndian(out short value); + return value; + } + + public static ushort ReadUInt16(ref this SequenceReader reader) + { + reader.TryReadLittleEndian(out ushort value); + return value; + } + + public static ushort ReadUInt16BigEndian(ref this SequenceReader reader) + { + reader.TryReadBigEndian(out short value); + return (ushort)value; + } + + public static byte ReadByte(ref this SequenceReader reader) + { + reader.TryRead(out byte value); + return value; + } + + public static float ReadSingle(ref this SequenceReader reader) + { + reader.TryRead(out float value); + return value; + } + + public static double ReadDouble(ref this SequenceReader reader) + { + reader.TryRead(out double value); + return value; + } + + public static float ReadSingleBigEndian(ref this SequenceReader reader) + { + reader.TryRead(out int value); + + return BitConverter.Int32BitsToSingle(BinaryPrimitives.ReverseEndianness(value)); + } + + public static double ReadDoubleBigEndian(ref this SequenceReader reader) + { + reader.TryRead(out long value); + + return BitConverter.Int64BitsToDouble(BinaryPrimitives.ReverseEndianness(value)); + } + + public static Vector3 ReadVector3(ref this SequenceReader reader) + { + Vector3 v = new Vector3 { + X = ReadSingle(ref reader), + Y = ReadSingle(ref reader), + Z = ReadSingle(ref reader), + }; + return v; + } + public static Vector4 ReadVector4(ref this SequenceReader reader) + { + Vector4 v = new Vector4 + { + X = ReadSingle(ref reader), + Y = ReadSingle(ref reader), + Z = ReadSingle(ref reader), + W = ReadSingle(ref reader) + }; + return v; + } + + public static Matrix ReadMatrix(ref this SequenceReader reader) + { + Matrix m = new Matrix + { + M11 = ReadSingle(ref reader), + M21 = ReadSingle(ref reader), + M31 = ReadSingle(ref reader), + M41 = ReadSingle(ref reader), + M12 = ReadSingle(ref reader), + M22 = ReadSingle(ref reader), + M32 = ReadSingle(ref reader), + M42 = ReadSingle(ref reader), + M13 = ReadSingle(ref reader), + M23 = ReadSingle(ref reader), + M33 = ReadSingle(ref reader), + M43 = ReadSingle(ref reader), + M14 = ReadSingle(ref reader), + M24 = ReadSingle(ref reader), + M34 = ReadSingle(ref reader), + M44 = ReadSingle(ref reader) + }; + return m; + } + + public static ReadOnlySpan ReadUlongsAt(ref this SequenceReader reader, ulong position, uint count, bool cache = true) + { + if ((position <= 0) || (count == 0)) + return ReadOnlySpan.Empty; + + var length = count * sizeof(ulong); + + var data = reader.ReadBytesAt(position, length, false); + if (data.IsEmpty) + { + return ReadOnlySpan.Empty; + } + var result = MemoryMarshal.Cast(data); + + return result; + } + + public static ReadOnlySpan ReadBytes(ref this SequenceReader reader, int count) + { + var unread = reader.UnreadSpan; + if (unread.Length > count) + { + var resultSpan = unread.Slice(0, count); + reader.Advance(count); + return resultSpan; + } + + var result = reader.UnreadSequence.Slice(0, count).ToArray(); + reader.Advance(count); + return result; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ReadOnlySpan ReadBytesAt(ref this SequenceReader reader, ulong position, uint count, bool cache = true) + { + return reader.ReadBytesAt(position, (int)count, cache); + } + + public static ReadOnlySpan ReadBytesAt(ref this SequenceReader reader, ulong position, int count, bool cache = true) + { + var positionBackup = reader.Consumed; + + reader.SetPosition((long)position); + var result = reader.ReadBytes(count); + reader.SetPosition((long)positionBackup); + + return result; + } + + public static ReadOnlySequence ReadSubSequence(ref this SequenceReader reader, int count) + { + var result = reader.UnreadSequence.Slice(0, count); + reader.Advance(count); + return result; + } + + [SkipLocalsInit] + public static string ReadStringLength(ref this SequenceReader reader, int length, bool ignoreNullTerminator = true) + { + if (length == 0) + { + return string.Empty; + } + + var bytes = reader.ReadBytes(length); + + if (!ignoreNullTerminator) + { + var nullTerminatorIndex = bytes.IndexOf((byte)0); + + if (nullTerminatorIndex != -1) + { + bytes.Slice(0, nullTerminatorIndex); + } + } + + return Encoding.UTF8.GetString(bytes); + //return Encoding.UTF8.GetString(bytes, Math.Min(charsRead, maxLength)); + } + + public static string ReadString(ref this SequenceReader reader, int maxLength) + { + reader.TryReadTo(out ReadOnlySpan span, 0); + + if (span.Length > maxLength) + { + reader.Rewind(span.Length - maxLength); + return Encoding.UTF8.GetString(span.Slice(0, maxLength)); + } + + return Encoding.UTF8.GetString(span); + //return Encoding.UTF8.GetString(bytes, Math.Min(charsRead, maxLength)); + } + + public static string ReadString(ref this SequenceReader reader) + { + reader.TryReadTo(out ReadOnlySpan span, 0); + + return Encoding.UTF8.GetString(span); + //return Encoding.UTF8.GetString(bytes, Math.Min(charsRead, maxLength)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static unsafe bool TryRead(ref this SequenceReader reader, out T value) where T : unmanaged + { + ReadOnlySpan span = reader.UnreadSpan; + if (span.Length < sizeof(T)) + return TryReadMultisegment(ref reader, out value); + + value = Unsafe.ReadUnaligned(ref MemoryMarshal.GetReference(span)); + reader.Advance(Marshal.SizeOf()); + return true; + } + + private static unsafe bool TryReadMultisegment(ref SequenceReader reader, out T value) where T : unmanaged + { + Debug.Assert(reader.UnreadSpan.Length < sizeof(T)); + + // Not enough data in the current segment, try to peek for the data we need. + T buffer = default; + Span tempSpan = new Span(&buffer, sizeof(T)); + + if (!reader.TryCopyTo(tempSpan)) + { + value = default; + return false; + } + + value = Unsafe.ReadUnaligned(ref MemoryMarshal.GetReference(tempSpan)); + reader.Advance(sizeof(T)); + return true; + } + + private static bool TryReadReverseEndianness(ref SequenceReader reader, out short value) + { + if (reader.TryRead(out value)) + { + value = BinaryPrimitives.ReverseEndianness(value); + return true; + } + + return false; + } + + private static ConcurrentDictionary cacheableTypes = new ConcurrentDictionary(); + private static bool fetchUsePool(Type type) + { + return !typeof(IResourceNoCacheBlock).IsAssignableFrom(type); + } + private static bool usePool() where T : IResourceBlock, new() + { + return cacheableTypes.GetOrAdd(typeof(T), fetchUsePool); + } + + public static T validate(Func instantiator) + where T : IResourceBlock + { + return instantiator(); + } + + /// + /// Reads a block. + /// + public static T ReadBlock(this ref SequenceReader reader, params object[] parameters) where T : IResourceBlockSpan, IResourceBlock, new() + { + var result = validate(() => new T()); + + + // replace with correct type... + if (result is IResourceXXSytemBlockSpan block) + { + result = (T)block.GetType(ref reader, parameters); + } + + result.Read(ref reader, parameters); + + return result; + } + + public static void SetPosition(this ref SequenceReader reader, long position) + { + var consumed = reader.Consumed; + if (position == consumed) + { + return; + } + + if (consumed > position) + { + reader.Rewind(consumed - position); + } + else + { + reader.Advance(position - consumed); + } + } + + /// + /// Reads a block at a specified position. + /// + public static T ReadBlockAt(this ref SequenceReader reader, ulong position, params object[] parameters) where T : IResourceBlock, IResourceBlockSpan, new() + { + if (position != 0) + { + var positionBackup = reader.Consumed; + + reader.SetPosition((long)position); + var result = reader.ReadBlock(parameters); + reader.SetPosition((long)positionBackup); + + return result; + } + else + { + return default(T); + } + } + + public static ReadOnlySpan ReadStructsAt(this ref SequenceReader reader, ulong position, uint count, bool cache = true) where T : struct + { + return reader.ReadStructsAt(position, (int)count, cache); + } + + public static ReadOnlySpan ReadStructsAt(this ref SequenceReader reader, ulong position, int count, bool cache = true) where T : struct + { + if ((position <= 0) || (count == 0)) + return null; + + var structsize = Marshal.SizeOf(typeof(T)); + var length = (int)(count * structsize); + var data = reader.ReadBytesAt(position, length, false); + + var resultSpan = MemoryMarshal.Cast(data); + + return resultSpan; + } + } + + public static class SpanExtension + { + public static ReadOnlySpan ReadTill(this ReadOnlySpan span, T searchFor) where T : IEquatable? + { + var index = span.IndexOf(searchFor); + if (index < 0) + { + return span; + } + + return span.Slice(index); + } + + public static Span ReadTill(this Span span, T searchFor) where T : IEquatable? + { + var index = span.IndexOf(searchFor); + if (index < 0) + { + return span; + } + + return span.Slice(0, index); + } + } + public ref struct SpanStream { public Span Buffer { get; private set; } @@ -38,7 +475,8 @@ namespace CodeWalker.Core.Utils if ((uint)newPos > (uint)Buffer.Length) { _position = Buffer.Length; - ThrowHelper.ThrowEndOfFileException(); + throw new EndOfStreamException(); + return default; } var span = Buffer.Slice(origPos, count); @@ -54,7 +492,7 @@ namespace CodeWalker.Core.Utils public uint ReadUInt32() => BinaryPrimitives.ReadUInt32LittleEndian(InternalRead(sizeof(uint))); public long ReadInt64() => BinaryPrimitives.ReadInt64LittleEndian(InternalRead(sizeof(long))); public ulong ReadUInt64() => BinaryPrimitives.ReadUInt64LittleEndian(InternalRead(sizeof(ulong))); - public unsafe Half ReadHalf() => BinaryPrimitives.ReadHalfLittleEndian(InternalRead(sizeof(Half))); + public unsafe System.Half ReadHalf() => BinaryPrimitives.ReadHalfLittleEndian(InternalRead(sizeof(System.Half))); public unsafe float ReadSingle() => BinaryPrimitives.ReadSingleLittleEndian(InternalRead(sizeof(float))); public unsafe double ReadDouble() => BinaryPrimitives.ReadDoubleLittleEndian(InternalRead(sizeof(double))); } diff --git a/CodeWalker.Core/Utils/ThrowHelper.cs b/CodeWalker.Core/Utils/ThrowHelper.cs index 9afc41c..cc31a68 100644 --- a/CodeWalker.Core/Utils/ThrowHelper.cs +++ b/CodeWalker.Core/Utils/ThrowHelper.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +//using System; +//using System.Collections.Generic; +//using System.Diagnostics.CodeAnalysis; +//using System.IO; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; -namespace CodeWalker.Core.Utils -{ - internal class ThrowHelper - { - internal static Exception CreateEndOfFileException() => - new EndOfStreamException("Tried to read stream beyond end"); +//namespace CodeWalker.Core.Utils +//{ +// internal class ThrowHelper +// { +// internal static Exception CreateEndOfFileException() => +// new EndOfStreamException("Tried to read stream beyond end"); - [DoesNotReturn] - internal static void ThrowEndOfFileException() - { - throw CreateEndOfFileException(); - } - } -} +// [DoesNotReturn] +// internal static void ThrowEndOfFileException() +// { +// throw CreateEndOfFileException(); +// } +// } +//} diff --git a/CodeWalker.Core/Utils/Timer.cs b/CodeWalker.Core/Utils/Timer.cs index 3bc52cd..72a34c1 100644 --- a/CodeWalker.Core/Utils/Timer.cs +++ b/CodeWalker.Core/Utils/Timer.cs @@ -8,7 +8,7 @@ namespace CodeWalker.Core.Utils public class DisposableTimer : IDisposable { public static event Action TimerStopped; - public readonly Stopwatch _stopwatch; + public Stopwatch Stopwatch { get; init; } static DisposableTimer() { @@ -22,14 +22,25 @@ namespace CodeWalker.Core.Utils public DisposableTimer(string name) { - _stopwatch = Stopwatch.StartNew(); + Stopwatch = Stopwatch.StartNew(); Name = name; } + public DisposableTimer(string name, bool start) + { + Name = name; + if (start) + { + Stopwatch = Stopwatch.StartNew(); + } else + { + Stopwatch = new Stopwatch(); + } + } public void Dispose() { - _stopwatch.Stop(); - TimerStopped?.Invoke(_stopwatch.Elapsed, Name ?? string.Empty); + Stopwatch.Stop(); + TimerStopped?.Invoke(Stopwatch.Elapsed, Name ?? string.Empty); } } } diff --git a/CodeWalker.Core/Utils/TriangleBVH.cs b/CodeWalker.Core/Utils/TriangleBVH.cs index ef80a19..449e730 100644 --- a/CodeWalker.Core/Utils/TriangleBVH.cs +++ b/CodeWalker.Core/Utils/TriangleBVH.cs @@ -1,4 +1,5 @@ -using SharpDX; +using Collections.Pooled; +using SharpDX; using System; using System.Collections.Generic; using System.Text; @@ -10,17 +11,18 @@ namespace CodeWalker public TriangleBVH(TriangleBVHItem[] tris, int depth = 8) { - if (tris == null) return; + if (tris is null || tris.Length == 0) + return; var min = new Vector3(float.MaxValue); var max = new Vector3(float.MinValue); for (int i = 0; i < tris.Length; i++) { var tri = tris[i]; tri.UpdateBox(); - min = Vector3.Min(min, tri.Box.Minimum); - max = Vector3.Max(max, tri.Box.Maximum); + Vector3.Min(ref min, ref tri.Box.Minimum, out min); + Vector3.Max(ref max, ref tri.Box.Maximum, out max); } - Box = new BoundingBox(min, max); + _Box = new BoundingBox(min, max); Build(tris, depth); @@ -30,9 +32,11 @@ namespace CodeWalker public class TriangleBVHNode { public TriangleBVHItem[] Triangles { get; set; } - public TriangleBVHNode Node1 { get; set; } - public TriangleBVHNode Node2 { get; set; } - public BoundingBox Box { get; set; } + public TriangleBVHNode? Node1 { get; set; } + public TriangleBVHNode? Node2 { get; set; } + + public BoundingBox _Box; + public BoundingBox Box => _Box; public void Build(TriangleBVHItem[] tris, int depth) { @@ -45,10 +49,10 @@ namespace CodeWalker } else { - var min = Box.Minimum; - var max = Box.Maximum; - var cen = Box.Center; - var siz = Box.Size; + var min = _Box.Minimum; + var max = _Box.Maximum; + var cen = _Box.Center; + var siz = _Box.Size; BoundingBox b1, b2; if ((siz.X >= siz.Y) && (siz.X >= siz.Z)) { @@ -65,16 +69,16 @@ namespace CodeWalker b1 = new BoundingBox(min, new Vector3(max.X, max.Y, cen.Z)); b2 = new BoundingBox(new Vector3(min.X, min.Y, cen.Z), max); } - var l1 = new List(); - var l2 = new List(); + using var l1 = new PooledList(); + using var l2 = new PooledList(); for (int i = 0; i < tris.Length; i++) { var tri = tris[i]; - if (tri.Box.Contains(b1) != ContainmentType.Disjoint)// (tri.Box.Intersects(b1)) + if (tri.Box.Contains(ref b1) != ContainmentType.Disjoint)// (tri.Box.Intersects(b1)) { l1.Add(tri); } - if (tri.Box.Contains(b2) != ContainmentType.Disjoint)// (tri.Box.Intersects(b2)) + if (tri.Box.Contains(ref b2) != ContainmentType.Disjoint)// (tri.Box.Intersects(b2)) { l2.Add(tri); } @@ -82,54 +86,51 @@ namespace CodeWalker if (l1.Count > 0) { Node1 = new TriangleBVHNode(); - Node1.Box = b1; + Node1._Box = b1; Node1.Build(l1.ToArray(), depth - 1); } if (l2.Count > 0) { Node2 = new TriangleBVHNode(); - Node2.Box = b2; + Node2._Box = b2; Node2.Build(l2.ToArray(), depth - 1); } } } - public TriangleBVHItem RayIntersect(ref Ray ray, ref float hitdist) + public TriangleBVHItem? RayIntersect(ref Ray ray, ref float hitdist) { - if (ray.Intersects(Box) == false) return null; + if (!ray.Intersects(ref _Box)) + return null; - TriangleBVHItem hit = null; - if (Triangles != null) + TriangleBVHItem? hit = null; + if (Triangles is not null) { - for (int i = 0; i < Triangles.Length; i++) + foreach(var tri in Triangles) { - var tri = Triangles[i]; - var v1 = tri.Corner1; - var v2 = tri.Corner2; - var v3 = tri.Corner3; - if (ray.Intersects(ref v1, ref v2, ref v3, out float d) && (d < hitdist) && (d > 0)) + if (ray.Intersects(ref tri.Corner1, ref tri.Corner2, ref tri.Corner3, out float d) && d < hitdist && d > 0) { hitdist = d; hit = tri; } } } - if (Node1 != null) + if (Node1 is not null) { var hd = hitdist; var h = Node1.RayIntersect(ref ray, ref hd); - if ((h != null) && (hd < hitdist)) + if (h != null && hd < hitdist) { hitdist = hd; hit = h; } } - if (Node2 != null) + if (Node2 is not null) { var hd = hitdist; var h = Node2.RayIntersect(ref ray, ref hd); - if ((h != null) && (hd < hitdist)) + if (h != null && hd < hitdist) { hitdist = hd; hit = h; @@ -143,17 +144,14 @@ namespace CodeWalker public abstract class TriangleBVHItem { - public Vector3 Corner1 { get; set; } - public Vector3 Corner2 { get; set; } - public Vector3 Corner3 { get; set; } - public BoundingBox Box { get; set; } + public Vector3 Corner1; + public Vector3 Corner2; + public Vector3 Corner3; + public BoundingBox Box; public Vector3 Center { - get - { - return (Corner1 + Corner2 + Corner3) * 0.3333333f; - } + get => (Corner1 + Corner2 + Corner3) * 0.3333333f; set { var delta = value - Center; @@ -164,13 +162,10 @@ namespace CodeWalker } public Quaternion Orientation { - get - { - return _Orientation; - } + get => _Orientation; set { - var inv = Quaternion.Invert(_Orientation); + Quaternion.Invert(ref _Orientation, out var inv); var delta = value * inv; var cen = Center; Corner1 = cen + delta.Multiply(Corner1 - cen); @@ -182,13 +177,10 @@ namespace CodeWalker private Quaternion _Orientation = Quaternion.Identity; public Vector3 Scale { - get - { - return _Scale; - } + get => _Scale; set { - var inv = Quaternion.Invert(_Orientation); + Quaternion.Invert(ref _Orientation, out var inv); var delta = value / _Scale; var cen = Center; Corner1 = cen + _Orientation.Multiply(inv.Multiply(Corner1 - cen) * delta); @@ -203,12 +195,12 @@ namespace CodeWalker { var min = new Vector3(float.MaxValue); var max = new Vector3(float.MinValue); - min = Vector3.Min(min, Corner1); - min = Vector3.Min(min, Corner2); - min = Vector3.Min(min, Corner3); - max = Vector3.Max(max, Corner1); - max = Vector3.Max(max, Corner2); - max = Vector3.Max(max, Corner3); + Vector3.Min(ref min, ref Corner1, out min); + Vector3.Min(ref min, ref Corner2, out min); + Vector3.Min(ref min, ref Corner3, out min); + Vector3.Max(ref max, ref Corner1, out max); + Vector3.Max(ref max, ref Corner2, out max); + Vector3.Max(ref max, ref Corner3, out max); Box = new BoundingBox(min, max); } diff --git a/CodeWalker.Core/Utils/Utils.cs b/CodeWalker.Core/Utils/Utils.cs index f291e45..590b962 100644 --- a/CodeWalker.Core/Utils/Utils.cs +++ b/CodeWalker.Core/Utils/Utils.cs @@ -5,9 +5,12 @@ using System.Drawing; using System.Globalization; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; +using System.Threading; using System.Threading.Tasks; +using CodeWalker.Core.Utils; using SharpDX; using Color = SharpDX.Color; using Half = SharpDX.Half; @@ -26,7 +29,7 @@ namespace CodeWalker // Returns the human-readable file size for an arbitrary, 64-bit file size // The default format is "0.### XB", e.g. "4.2 KB" or "1.434 GB" // Get absolute value - long absolute_i = (i < 0 ? -i : i); + long absolute_i = Math.Abs(i); // Determine the suffix and readable value string suffix; double readable; @@ -82,7 +85,7 @@ namespace CodeWalker } // Return formatted number with suffix - return readable.ToString(fmt) + suffix; + return $"{readable.ToString(fmt)}{suffix}"; } @@ -139,130 +142,148 @@ namespace CodeWalker public static class FloatUtil { - public static bool TryParse(string s, out float f) + //public static bool TryParse(string? s, out float f) + //{ + // return float.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out f); + //} + + public static bool TryParse(ReadOnlySpan s, out float f) { - if (float.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out f)) - { - return true; - } - return false; + return float.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out f); } - public static float Parse(string s) + + public static float Parse(ReadOnlySpan s) { TryParse(s, out float f); return f; } - public static string ToString(float f) + public static string ToString(float value) { - var c = CultureInfo.InvariantCulture; - var s = f.ToString(c); - var t = Parse(s); - if (t == f) return s; - return f.ToString("G9", c); + return value.ToString(CultureInfo.InvariantCulture); } public static string GetVector2String(Vector2 v, string d = ", ") { - return ToString(v.X) + d + ToString(v.Y); + return $"{ToString(v.X)}{d}{ToString(v.Y)}"; } public static string GetVector2XmlString(Vector2 v) { - return string.Format("x=\"{0}\" y=\"{1}\"", ToString(v.X), ToString(v.Y)); + return $"x=\"{ToString(v.X)}\" y=\"{ToString(v.Y)}\""; } - public static string GetVector3String(Vector3 v, string d = ", ") + public static string GetVector3String(in Vector3 v, string d = ", ") { - return ToString(v.X) + d + ToString(v.Y) + d + ToString(v.Z); + return $"{ToString(v.X)}{d}{ToString(v.Y)}{d}{ToString(v.Z)}"; } - public static string GetVector3StringFormat(Vector3 v, string format) + public static string GetVector3StringFormat(in Vector3 v, string format) { var c = CultureInfo.InvariantCulture; - return v.X.ToString(format, c) + ", " + v.Y.ToString(format, c) + ", " + v.Z.ToString(format, c); + return $"{v.X.ToString(format, c)}, {v.Y.ToString(format, c)}, {v.Z.ToString(format, c)}"; } - public static string GetVector3XmlString(Vector3 v) + public static string GetVector3XmlString(in Vector3 v) { - return string.Format("x=\"{0}\" y=\"{1}\" z=\"{2}\"", ToString(v.X), ToString(v.Y), ToString(v.Z)); + return $"x=\"{ToString(v.X)}\" y=\"{ToString(v.Y)}\" z=\"{ToString(v.Z)}\""; } - public static string GetVector4String(Vector4 v, string d = ", ") + + public static string GetVector4String(in Vector4 v) { - return ToString(v.X) + d + ToString(v.Y) + d + ToString(v.Z) + d + ToString(v.W); + return GetVector4String(in v, ", "); } - public static string GetVector4XmlString(Vector4 v) + public static string GetVector4String(in Vector4 v, string d) { - return string.Format("x=\"{0}\" y=\"{1}\" z=\"{2}\" w=\"{3}\"", ToString(v.X), ToString(v.Y), ToString(v.Z), ToString(v.W)); + return $"{ToString(v.X)}{d}{ToString(v.Y)}{d}{ToString(v.Z)}{d}{ToString(v.W)}"; } - public static string GetQuaternionXmlString(Quaternion q) + public static string GetVector4XmlString(in Vector4 v) { - return string.Format("x=\"{0}\" y=\"{1}\" z=\"{2}\" w=\"{3}\"", ToString(q.X), ToString(q.Y), ToString(q.Z), ToString(q.W)); + return $"x=\"{ToString(v.X)}\" y=\"{ToString(v.Y)}\" z=\"{ToString(v.Z)}\" w=\"{ToString(v.W)}\""; } + public static string GetQuaternionXmlString(in Quaternion q) + { + return $"x=\"{ToString(q.X)}\" y=\"{ToString(q.Y)}\" z=\"{ToString(q.Z)}\" w=\"{ToString(q.W)}\""; + } + + public static Span ConvertToFloat(Span values) + { + Span array = new float[values.Length]; + for (int i = 0; i < array.Length; i++) + { + array[i] = values[i]; + } + + return array; + } + public static string GetHalf2String(Half2 v, string d = ", ") { - var f = Half.ConvertToFloat(new[] { v.X, v.Y }); - return ToString(f[0]) + d + ToString(f[1]); + var f = ConvertToFloat([v.X, v.Y]); + return $"{ToString(f[0])}{d}{ToString(f[1])}"; } public static string GetHalf4String(Half4 v, string d = ", ") { - var f = Half.ConvertToFloat(new[] { v.X, v.Y, v.Z, v.W }); - return ToString(f[0]) + d + ToString(f[1]) + d + ToString(f[2]) + d + ToString(f[3]); + var f = ConvertToFloat([v.X, v.Y, v.Z, v.W]); + return $"{ToString(f[0])}{d}{ToString(f[1])}{d}{ToString(f[2])}{d}{ToString(f[3])}"; } public static string GetColourString(Color v, string d = ", ") { var c = CultureInfo.InvariantCulture; - return v.R.ToString(c) + d + v.G.ToString(c) + d + v.B.ToString(c) + d + v.A.ToString(c); + return $"{v.R.ToString(c)}{d}{v.G.ToString(c)}{d}{v.B.ToString(c)}{d}{v.A.ToString(c)}"; } public static Vector2 ParseVector2String(string s) { Vector2 p = new Vector2(0.0f); - string[] ss = s.Split(','); - if (ss.Length > 0) + + var enumerator = s.EnumerateSplit(','); + if (enumerator.MoveNext()) { - TryParse(ss[0].Trim(), out p.X); + _ = TryParse(enumerator.Current.Trim(), out p.X); } - if (ss.Length > 1) + if (enumerator.MoveNext()) { - TryParse(ss[1].Trim(), out p.Y); + _ = TryParse(enumerator.Current.Trim(), out p.Y); } return p; } public static Vector3 ParseVector3String(string s) { Vector3 p = new Vector3(0.0f); - string[] ss = s.Split(','); - if (ss.Length > 0) + + var enumerator = s.EnumerateSplit(','); + + if (enumerator.MoveNext()) { - TryParse(ss[0].Trim(), out p.X); + _ = TryParse(enumerator.Current.Trim(), out p.X); } - if (ss.Length > 1) + if (enumerator.MoveNext()) { - TryParse(ss[1].Trim(), out p.Y); + _ = TryParse(enumerator.Current.Trim(), out p.Y); } - if (ss.Length > 2) + if (enumerator.MoveNext()) { - TryParse(ss[2].Trim(), out p.Z); + _ = TryParse(enumerator.Current.Trim(), out p.Z); } return p; } public static Vector4 ParseVector4String(string s) { Vector4 p = new Vector4(0.0f); - string[] ss = s.Split(','); - if (ss.Length > 0) + var enumerator = s.EnumerateSplit(','); + if (enumerator.MoveNext()) { - TryParse(ss[0].Trim(), out p.X); + _ = TryParse(enumerator.Current.Trim(), out p.X); } - if (ss.Length > 1) + if (enumerator.MoveNext()) { - TryParse(ss[1].Trim(), out p.Y); + TryParse(enumerator.Current.Trim(), out p.Y); } - if (ss.Length > 2) + if (enumerator.MoveNext()) { - TryParse(ss[2].Trim(), out p.Z); + _ = TryParse(enumerator.Current.Trim(), out p.Z); } - if (ss.Length > 3) + if (enumerator.MoveNext()) { - TryParse(ss[3].Trim(), out p.W); + _ = TryParse(enumerator.Current.Trim(), out p.W); } return p; } @@ -308,4 +329,67 @@ namespace CodeWalker return (value >> count) | (value << (32 - count)); } } + + public static class SemaphoreSlimExtension + { + public struct SemaphoreLock : IDisposable + { + private bool _isDisposed = false; + private readonly SemaphoreSlim? _semaphore; + private readonly string _callerName; + private readonly string _callerFilePath; + public readonly bool LockTaken => _semaphore is not null; + + public SemaphoreLock(SemaphoreSlim? semaphore, string callerName = "", string callerFilePath = "") + { + _callerFilePath = callerFilePath; + _callerName = callerName; + _semaphore = semaphore; + + Console.WriteLine($"Lock taken from {callerFilePath} -> {callerName}"); + } + + public void Dispose() + { + if (_isDisposed) + return; + + Console.WriteLine($"Lock for {_callerFilePath} -> {_callerName} released"); + _semaphore?.Release(); + _isDisposed = true; + } + } + + public static async ValueTask WaitAsyncDisposable(this SemaphoreSlim semaphore) + { + await semaphore.WaitAsync(); + return new SemaphoreLock(semaphore); + } + + public static SemaphoreLock WaitDisposable(this SemaphoreSlim semaphore, [CallerMemberName] string callerName = "", [CallerFilePath] string callerFilePath = "") + { + semaphore.Wait(); + return new SemaphoreLock(semaphore, callerName, callerFilePath); + } + + public static SemaphoreLock WaitDisposable(this SemaphoreSlim semaphore, TimeSpan timeout, CancellationToken cancellationToken, [CallerMemberName] string callerName = "", [CallerFilePath] string callerFilePath = "") + { + if (semaphore.Wait(timeout, cancellationToken)) + { + return new SemaphoreLock(semaphore, callerName, callerFilePath); + } + + return new SemaphoreLock(null); + } + + public static SemaphoreLock WaitDisposable(this SemaphoreSlim semaphore, int timeout, [CallerMemberName] string callerName = "", [CallerFilePath] string callerFilePath = "") + { + if (semaphore.Wait(timeout)) + { + return new SemaphoreLock(semaphore, callerName, callerFilePath); + } + + return new SemaphoreLock(null); + } + } } diff --git a/CodeWalker.Core/Utils/Vectors.cs b/CodeWalker.Core/Utils/Vectors.cs index 1c9ab3d..cac4a6e 100644 --- a/CodeWalker.Core/Utils/Vectors.cs +++ b/CodeWalker.Core/Utils/Vectors.cs @@ -10,17 +10,124 @@ namespace CodeWalker { public static class Vectors { - public static Vector3 XYZ(this Vector4 v) + public static Vector3 XYZ(in this Vector4 v) { return new Vector3(v.X, v.Y, v.Z); } - public static Vector3 Round(this Vector3 v) + public static Vector3 Round(in this Vector3 v) { return new Vector3((float)Math.Round(v.X), (float)Math.Round(v.Y), (float)Math.Round(v.Z)); } - public static Vector3 GetPerpVec(this Vector3 n) + public static void Cross(in this Vector3 left, in Vector3 right, out Vector3 result) + { + result = new Vector3(left.Y * right.Z - left.Z * right.Y, left.Z * right.X - left.X * right.Z, left.X * right.Y - left.Y * right.X); + } + + public static Vector3 Cross(in this Vector3 left, in Vector3 right) + { + return new Vector3(left.Y * right.Z - left.Z * right.Y, left.Z * right.X - left.X * right.Z, left.X * right.Y - left.Y * right.X); + } + + public static void Add(in this Vector3 left, in Vector3 right, out Vector3 result) + { + result = new Vector3(left.X + right.X, left.Y + right.Y, left.Z + right.Z); + } + + public static Vector3 Add(in this Vector3 left, in Vector3 right) + { + return new Vector3(left.X + right.X, left.Y + right.Y, left.Z + right.Z); + } + + public static void Min(in this Vector3 left, in MetaVECTOR3 right, out Vector3 result) + { + result.X = ((left.X < right.X) ? left.X : right.X); + result.Y = ((left.Y < right.Y) ? left.Y : right.Y); + result.Z = ((left.Z < right.Z) ? left.Z : right.Z); + } + public static void Min(in this MetaVECTOR3 left, in MetaVECTOR3 right, out Vector3 result) + { + result.X = ((left.X < right.X) ? left.X : right.X); + result.Y = ((left.Y < right.Y) ? left.Y : right.Y); + result.Z = ((left.Z < right.Z) ? left.Z : right.Z); + } + + public static void Min(in this MetaVECTOR3 left, in Vector3 right, out Vector3 result) + { + result.X = ((left.X < right.X) ? left.X : right.X); + result.Y = ((left.Y < right.Y) ? left.Y : right.Y); + result.Z = ((left.Z < right.Z) ? left.Z : right.Z); + } + + public static void Min(in this Vector3 left, in Vector3 right, out Vector3 result) + { + result.X = ((left.X < right.X) ? left.X : right.X); + result.Y = ((left.Y < right.Y) ? left.Y : right.Y); + result.Z = ((left.Z < right.Z) ? left.Z : right.Z); + } + + public static Vector3 Min(in this Vector3 left, in Vector3 right) + { + Min(in left, in right, out var result); + return result; + } + + public static Vector4 Min(in this Vector4 left, in Vector4 right) + { + Min(in left, in right, out var result); + return result; + } + + public static void Min(in this Vector4 left, in Vector4 right, out Vector4 result) + { + result.X = ((left.X < right.X) ? left.X : right.X); + result.Y = ((left.Y < right.Y) ? left.Y : right.Y); + result.Z = ((left.Z < right.Z) ? left.Z : right.Z); + result.W = ((left.W < right.W) ? left.W : right.W); + } + + public static void Max(in this Vector3 left, in MetaVECTOR3 right, out Vector3 result) + { + result.X = ((left.X > right.X) ? left.X : right.X); + result.Y = ((left.Y > right.Y) ? left.Y : right.Y); + result.Z = ((left.Z > right.Z) ? left.Z : right.Z); + } + + public static void Max(in this MetaVECTOR3 left, in Vector3 right, out Vector3 result) + { + result.X = ((left.X > right.X) ? left.X : right.X); + result.Y = ((left.Y > right.Y) ? left.Y : right.Y); + result.Z = ((left.Z > right.Z) ? left.Z : right.Z); + } + + public static void Max(in this MetaVECTOR3 left, in MetaVECTOR3 right, out Vector3 result) + { + result.X = ((left.X > right.X) ? left.X : right.X); + result.Y = ((left.Y > right.Y) ? left.Y : right.Y); + result.Z = ((left.Z > right.Z) ? left.Z : right.Z); + } + + public static void Max(in this Vector3 left, in Vector3 right, out Vector3 result) + { + result.X = ((left.X > right.X) ? left.X : right.X); + result.Y = ((left.Y > right.Y) ? left.Y : right.Y); + result.Z = ((left.Z > right.Z) ? left.Z : right.Z); + } + + public static Vector3 Max(in this Vector3 left, in Vector3 right) + { + Max(in left, in right, out var result); + return result; + } + + public static Vector3 GetPerpVec(in this Vector3 n) + { + n.GetPerpVec(out var result); + return result; + } + + public static void GetPerpVec(in this Vector3 n, out Vector3 result) { //make a vector perpendicular to the given one float nx = Math.Abs(n.X); @@ -28,33 +135,36 @@ namespace CodeWalker float nz = Math.Abs(n.Z); if ((nx < ny) && (nx < nz)) { - return Vector3.Cross(n, Vector3.Right); + n.Cross(in Vector3.Right, out result); + return; } else if (ny < nz) { - return Vector3.Cross(n, Vector3.Up); + n.Cross(in Vector3.Up, out result); + return; } else { - return Vector3.Cross(n, Vector3.ForwardLH); + n.Cross(in Vector3.ForwardLH, out result); + return; } } - public static Vector3 Floor(this Vector3 v) + public static Vector3 Floor(in this Vector3 v) { return new Vector3((float)Math.Floor(v.X), (float)Math.Floor(v.Y), (float)Math.Floor(v.Z)); } - public static Vector3 Ceiling(this Vector3 v) + public static Vector3 Ceiling(in this Vector3 v) { return new Vector3((float)Math.Ceiling(v.X), (float)Math.Ceiling(v.Y), (float)Math.Ceiling(v.Z)); } - public static Vector3 Abs(this Vector3 v) + public static Vector3 Abs(in this Vector3 v) { return new Vector3(Math.Abs(v.X), Math.Abs(v.Y), Math.Abs(v.Z)); } - public static int CompareTo(this Vector3 a, Vector3 b) + public static int CompareTo(in this Vector3 a, in Vector3 b) { int c; c = a.X.CompareTo(b.X); if (c != 0) return c; @@ -64,24 +174,35 @@ namespace CodeWalker } - public static Vector4 Floor(this Vector4 v) + public static Vector4 Floor(in this Vector4 v) { return new Vector4((float)Math.Floor(v.X), (float)Math.Floor(v.Y), (float)Math.Floor(v.Z), (float)Math.Floor(v.W)); } - public static Vector4 Ceiling(this Vector4 v) + public static Vector4 Ceiling(in this Vector4 v) { return new Vector4((float)Math.Ceiling(v.X), (float)Math.Ceiling(v.Y), (float)Math.Ceiling(v.Z), (float)Math.Ceiling(v.W)); } - public static Vector4 Abs(this Vector4 v) + public static Vector4 Abs(in this Vector4 v) { return new Vector4(Math.Abs(v.X), Math.Abs(v.Y), Math.Abs(v.Z), Math.Abs(v.W)); } - public static Quaternion ToQuaternion(this Vector4 v) + public static Quaternion ToQuaternion(in this Vector4 v) { return new Quaternion(v); } + + public static Quaternion RotationAxis(in this Vector3 axis, float angle) + { + var result2 = axis; + result2.Normalize(); + float num = angle * 0.5f; + float num2 = (float)Math.Sin(num); + float w = (float)Math.Cos(num); + + return new Quaternion(result2.X * num2, result2.Y * num2, result2.Z * num2, w); + } } @@ -103,7 +224,7 @@ namespace CodeWalker public override string ToString() { - return X.ToString() + ", " + Y.ToString(); + return $"{X}, {Y}"; } @@ -142,19 +263,19 @@ namespace CodeWalker public static class BoundingBoxMath { - public static BoundingBox Transform(this BoundingBox b, Vector3 position, Quaternion orientation, Vector3 scale) + public static BoundingBox Transform(this BoundingBox b, in Vector3 position, in Quaternion orientation, in Vector3 scale) { var mat = Matrix.Transformation(Vector3.Zero, Quaternion.Identity, scale, Vector3.Zero, orientation, position); - return b.Transform(mat); + return b.Transform(in mat); } - public static BoundingBox Transform(this BoundingBox b, Matrix mat) + public static BoundingBox Transform(this BoundingBox b, in Matrix mat) { var matabs = mat; - matabs.Column1 = mat.Column1.Abs(); - matabs.Column2 = mat.Column2.Abs(); - matabs.Column3 = mat.Column3.Abs(); - matabs.Column4 = mat.Column4.Abs(); + matabs.Column1 = matabs.Column1.Abs(); + matabs.Column2 = matabs.Column2.Abs(); + matabs.Column3 = matabs.Column3.Abs(); + matabs.Column4 = matabs.Column4.Abs(); var bbcenter = (b.Maximum + b.Minimum) * 0.5f; var bbextent = (b.Maximum - b.Minimum) * 0.5f; var ncenter = Vector3.TransformCoordinate(bbcenter, mat); @@ -176,7 +297,7 @@ namespace CodeWalker public static class BoundingCapsuleMath { - public static bool Intersects(this Ray r, ref BoundingCapsule capsule, out float dist) + public static bool Intersects(in this Ray r, in BoundingCapsule capsule, out float dist) { // intersect capsule : http://www.iquilezles.org/www/articles/intersectors/intersectors.htm Vector3 ba = capsule.PointB - capsule.PointA; @@ -220,7 +341,7 @@ namespace CodeWalker dist = -1.0f; return false; } - public static Vector3 Normal(this BoundingCapsule c, ref Vector3 position) + public static Vector3 Normal(this BoundingCapsule c, in Vector3 position) { Vector3 ba = c.PointB - c.PointA; Vector3 pa = position - c.PointA; @@ -228,14 +349,27 @@ namespace CodeWalker return Vector3.Normalize((pa - h * ba) / c.Radius); } - - public static bool Intersects(this BoundingSphere sph, ref BoundingCapsule capsule, out Vector3 norm) + public static void Normalize(in this Vector3 value, out Vector3 result) { - var dist = LineMath.PointSegmentDistance(ref sph.Center, ref capsule.PointA, ref capsule.PointB); + result = value; + result.Normalize(); + } + + public static Vector3 Normalize(in this Vector3 value) + { + var result = value; + result.Normalize(); + return result; + } + + + public static bool Intersects(in this BoundingSphere sph, in BoundingCapsule capsule, out Vector3 norm) + { + var dist = LineMath.PointSegmentDistance(in sph.Center, in capsule.PointA, in capsule.PointB); var rads = sph.Radius + capsule.Radius; if (dist <= rads) { - norm = LineMath.PointSegmentNormal(ref sph.Center, ref capsule.PointA, ref capsule.PointB); + norm = LineMath.PointSegmentNormal(in sph.Center, in capsule.PointA, in capsule.PointB); return true; } else @@ -258,7 +392,7 @@ namespace CodeWalker public static class BoundingCylinderMath { - public static bool Intersects(this Ray r, ref BoundingCylinder cylinder, out float dist, out Vector3 norm) + public static bool Intersects(in this Ray r, in BoundingCylinder cylinder, out float dist, out Vector3 norm) { // intersect cylinder : https://www.shadertoy.com/view/4lcSRn Vector3 ba = cylinder.PointB - cylinder.PointA; @@ -313,7 +447,7 @@ namespace CodeWalker { - public static float PointSegmentDistance(ref Vector3 v, ref Vector3 a, ref Vector3 b) + public static float PointSegmentDistance(in Vector3 v, in Vector3 a, in Vector3 b) { //https://stackoverflow.com/questions/4858264/find-the-distance-from-a-3d-point-to-a-line-segment Vector3 ab = b - a; @@ -333,7 +467,7 @@ namespace CodeWalker return Vector3.Cross(ab, av).Length() / ab.Length();// Perpendicular distance of point to segment. } - public static Vector3 PointSegmentNormal(ref Vector3 v, ref Vector3 a, ref Vector3 b) + public static Vector3 PointSegmentNormal(in Vector3 v, in Vector3 a, in Vector3 b) { Vector3 ab = b - a; Vector3 av = v - a; @@ -352,7 +486,7 @@ namespace CodeWalker return Vector3.Normalize(Vector3.Cross(Vector3.Cross(ab, av), ab)); } - public static float PointRayDist(ref Vector3 p, ref Vector3 ro, ref Vector3 rd) + public static float PointRayDist(in Vector3 p, in Vector3 ro, in Vector3 rd) { return Vector3.Cross(rd, p - ro).Length(); } @@ -363,7 +497,7 @@ namespace CodeWalker public static class TriangleMath { - public static float AreaPart(ref Vector3 v1, ref Vector3 v2, ref Vector3 v3, out float angle) + public static float AreaPart(in Vector3 v1, in Vector3 v2, in Vector3 v3, out float angle) { var va = v2 - v1; var vb = v3 - v1; @@ -377,11 +511,11 @@ namespace CodeWalker return area; } - public static float Area(ref Vector3 v1, ref Vector3 v2, ref Vector3 v3) + public static float Area(in Vector3 v1, in Vector3 v2, in Vector3 v3) { - var a1 = AreaPart(ref v1, ref v2, ref v3, out float t1); - var a2 = AreaPart(ref v2, ref v3, ref v1, out float t2); - var a3 = AreaPart(ref v3, ref v1, ref v2, out float t3); + var a1 = AreaPart(in v1, in v2, in v3, out float t1); + var a2 = AreaPart(in v2, in v3, in v1, out float t2); + var a3 = AreaPart(in v3, in v1, in v2, out float t3); var fp = (float)Math.PI; var d1 = Math.Min(t1, Math.Abs(t1 - fp)); var d2 = Math.Min(t2, Math.Abs(t2 - fp)); diff --git a/CodeWalker.Core/Utils/Xml.cs b/CodeWalker.Core/Utils/Xml.cs index 96e643a..a2fa702 100644 --- a/CodeWalker.Core/Utils/Xml.cs +++ b/CodeWalker.Core/Utils/Xml.cs @@ -1,8 +1,13 @@ using CodeWalker.GameFiles; +using Collections.Pooled; +using CommunityToolkit.HighPerformance.Buffers; using SharpDX; using System; +using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Runtime.Intrinsics.Arm; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -15,7 +20,7 @@ namespace CodeWalker { public static void ValidateReaderState(XmlReader reader, string element) { - if (reader == null) + if (reader is null) { throw new ArgumentNullException(nameof(reader)); } @@ -29,61 +34,84 @@ namespace CodeWalker } } - public static string GetStringAttribute(XmlNode node, string attribute) + public static bool TryGetAttribute(this XElement element, string attribute, [NotNullWhen(true)] out XAttribute? attr) { - if (node == null) return null; + attr = element.Attribute(attribute); + if (attr is null) + return false; + + return true; + } + + public static string? GetStringAttribute(this XmlNode? node, string attribute) + { + if (node is null || node.Attributes is null) + return null; return node.Attributes[attribute]?.InnerText; } - public static bool GetBoolAttribute(XmlNode node, string attribute) + public static bool GetBoolAttribute(this XElement element, string attribute = "value") { - if (node == null) return false; - string val = node.Attributes[attribute]?.InnerText; - bool b; - bool.TryParse(val, out b); + ArgumentNullException.ThrowIfNull(element, nameof(element)); + + var val = element.Attribute(attribute); + if (val is null) return false; + + bool.TryParse(val.Value, out var b); return b; } - public static int GetIntAttribute(XmlNode node, string attribute) + + public static bool GetBoolAttribute(this XmlNode? node, string attribute) { - if (node == null) return 0; - string val = node.Attributes[attribute]?.InnerText; - int i; - int.TryParse(val, out i); + if (node is null) + return false; + string? val = node.Attributes?[attribute]?.InnerText; + _ = bool.TryParse(val, out var b); + return b; + } + public static int GetIntAttribute(this XmlNode? node, string attribute) + { + if (node is null) + return 0; + string? val = node.Attributes?[attribute]?.InnerText; + _ = int.TryParse(val, out var i); return i; } - public static uint GetUIntAttribute(XmlNode node, string attribute) + public static uint GetUIntAttribute(this XmlNode? node, string attribute) { - if (node == null) return 0; - string val = node.Attributes[attribute]?.InnerText; - uint i; - uint.TryParse(val, out i); + if (node is null) + return 0; + string? val = node.Attributes?[attribute]?.InnerText; + _ = uint.TryParse(val, out var i); return i; } - public static ulong GetULongAttribute(XmlNode node, string attribute) + public static ulong GetULongAttribute(this XmlNode? node, string attribute) { - if (node == null) return 0; - string val = node.Attributes[attribute]?.InnerText; - ulong i; - ulong.TryParse(val, out i); + if (node is null) + return 0; + string? val = node.Attributes?[attribute]?.InnerText; + _ = ulong.TryParse(val, out var i); return i; } - public static float GetFloatAttribute(XmlNode node, string attribute) + public static float GetFloatAttribute(this XmlNode? node, string attribute) { - if (node == null) return 0; - string val = node.Attributes[attribute]?.InnerText; - float f; - FloatUtil.TryParse(val, out f); + if (node is null) + return 0; + string? val = node.Attributes?[attribute]?.InnerText; + _ = FloatUtil.TryParse(val, out var f); return f; } - public static string GetChildInnerText(XmlNode node, string name) + public static string? GetChildInnerText(this XmlNode? node, string name) { - if (node == null) return null; + if (node is null) + return null; return node.SelectSingleNode(name)?.InnerText; } - public static string GetChildInnerText(XElement node, string name) { - if (node == null) return null; - return node.Element(name).Value; + public static string? GetChildInnerText(this XElement? node, string name) { + if (node is null) + return null; + return node.Element(name)?.Value; } public static string GetChildInnerText(XmlReader reader, string name) @@ -94,7 +122,7 @@ namespace CodeWalker if (reader.IsEmptyElement) { reader.ReadStartElement(); - return ""; + return string.Empty; } return reader.ReadElementContentAsString(); } @@ -104,13 +132,15 @@ namespace CodeWalker } } - public static bool GetChildBoolInnerText(XElement node, string name) + public static bool GetChildBoolInnerText(this XElement? node, string name) { - if (node == null) return false; - string val = node.Element(name).Value; + if (node is null) + return false; + string? val = node.Element(name)?.Value; + if (string.IsNullOrEmpty(val)) + return false; - bool b; - bool.TryParse(val, out b); + _ = bool.TryParse(val, out var b); return b; } @@ -129,28 +159,28 @@ namespace CodeWalker } - public static bool GetChildBoolInnerText(XmlNode node, string name) + public static bool GetChildBoolInnerText(this XmlNode? node, string name) { - if (node == null) return false; - string val = node.SelectSingleNode(name)?.InnerText; - bool b; - bool.TryParse(val, out b); + if (node is null) + return false; + string? val = node.SelectSingleNode(name)?.InnerText; + _ = bool.TryParse(val, out var b); return b; } - public static int GetChildIntInnerText(XmlNode node, string name) + public static int GetChildIntInnerText(this XmlNode? node, string name) { - if (node == null) return 0; - string val = node.SelectSingleNode(name)?.InnerText; - int i; - int.TryParse(val, out i); + if (node is null) + return 0; + string? val = node.SelectSingleNode(name)?.InnerText; + _ = int.TryParse(val, out var i); return i; } - public static float GetChildFloatInnerText(XmlNode node, string name) + public static float GetChildFloatInnerText(this XmlNode? node, string name) { - if (node == null) return 0; - string val = node.SelectSingleNode(name)?.InnerText; - float f; - FloatUtil.TryParse(val, out f); + if (node is null) + return 0; + string? val = node.SelectSingleNode(name)?.InnerText; + _ = FloatUtil.TryParse(val, out var f); return f; } @@ -163,22 +193,25 @@ namespace CodeWalker public static T GetChildEnumInnerText(XmlNode node, string name) where T : struct { - if (node == null) return new T(); - string val = node.SelectSingleNode(name)?.InnerText; + if (node is null) + return new T(); + + string? val = node.SelectSingleNode(name)?.InnerText; return GetEnumValue(val); } - public static T GetEnumValue(string val) where T : struct + public static T GetEnumValue(string? val) where T : struct { if (string.IsNullOrEmpty(val)) { - return default(T); + return default; } if (val.StartsWith("hash_", StringComparison.OrdinalIgnoreCase)) { //convert hash_12ABC to Unk_12345 - var substr = val.Substring(5); - var uval = Convert.ToUInt32(substr, 16); - val = "Unk_" + uval.ToString(); + //var substr = val.Substring(5); + //var uval = Convert.ToUInt32(substr, 16); + _ = int.TryParse(val.AsSpan(5), System.Globalization.NumberStyles.HexNumber, null, out var result); + val = $"Unk_{result}"; } T enumval; Enum.TryParse(val, out enumval); @@ -236,12 +269,13 @@ namespace CodeWalker string val = reader.GetAttribute(attribute); if (val?.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ?? false) { - var subs = val.Substring(2); - i = Convert.ToUInt32(subs, 16); + //var subs = val.Substring(2); + //i = Convert.ToUInt32(subs, 16); + _ = uint.TryParse(val.AsSpan(2), System.Globalization.NumberStyles.HexNumber, null, out i); } else { - uint.TryParse(val, out i); + _ = uint.TryParse(val, out i); } return i; } @@ -253,12 +287,13 @@ namespace CodeWalker uint i; if (val?.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ?? false) { - var subs = val.Substring(2); - i = Convert.ToUInt32(subs, 16); + //var subs = val.Substring(2); + //i = Convert.ToUInt32(subs, 16); + _ = uint.TryParse(val.AsSpan(2), System.Globalization.NumberStyles.HexNumber, null, out i); } else { - uint.TryParse(val, out i); + _ = uint.TryParse(val, out i); } return i; } @@ -269,12 +304,13 @@ namespace CodeWalker ulong i; if (val?.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ?? false) { - var subs = val.Substring(2); - i = Convert.ToUInt64(subs, 16); + //var subs = val.Substring(2); + //i = Convert.ToUInt64(subs, 16); + _ = ulong.TryParse(val.AsSpan(2), System.Globalization.NumberStyles.HexNumber, null, out i); } else { - ulong.TryParse(val, out i); + _ = ulong.TryParse(val, out i); } return i; } @@ -298,22 +334,23 @@ namespace CodeWalker return f; } - public static float GetChildFloatAttribute(XmlNode node, string name, string attribute = "value") + public static float GetChildFloatAttribute(XmlNode? node, string name, string attribute = "value") { - if (node == null) return 0; - string val = node.SelectSingleNode(name)?.Attributes[attribute]?.InnerText; + if (node is null) + return 0; + string? val = node.SelectSingleNode(name)?.Attributes?[attribute]?.InnerText; float f; FloatUtil.TryParse(val, out f); return f; } - public static string GetChildStringAttribute(XmlNode node, string name, string attribute = "value") + public static string? GetChildStringAttribute(XmlNode node, string name, string attribute = "value") { - if (node == null) return string.Empty; - string val = node.SelectSingleNode(name)?.Attributes[attribute]?.InnerText; + if (node is null) return string.Empty; + string? val = node.SelectSingleNode(name)?.Attributes?[attribute]?.InnerText; return val; } - public static string GetChildStringAttribute(XmlReader reader, string name, string attribute = "value") + public static string? GetChildStringAttribute(XmlReader reader, string name, string attribute = "value") { ValidateReaderState(reader, name); @@ -381,7 +418,19 @@ namespace CodeWalker return false; } - public static IEnumerable IterateItems(XmlReader reader, string parentElementName) + public static void MoveToStartElement(this XmlReader reader, string name) + { + var startDepth = reader.Depth; + while (reader.Read() && startDepth <= reader.Depth) + { + if (reader.IsStartElement() && reader.Name == name) + { + break; + } + } + } + + public static IEnumerable IterateItems(this XmlReader reader, string parentElementName) { ValidateReaderState(reader, parentElementName); reader.MoveToContent(); @@ -391,8 +440,9 @@ namespace CodeWalker reader.ReadStartElement(parentElementName); yield break; } + var startDepth = reader.Depth; reader.ReadStartElement(parentElementName); - while(reader.IsItemElement()) + while(reader.IsItemElement() && startDepth < reader.Depth) { if (XNode.ReadFrom(reader) is XElement el) { @@ -417,10 +467,11 @@ namespace CodeWalker - public static byte[] GetRawByteArray(XmlNode node, int fromBase = 16) + public static byte[] GetRawByteArray(XmlNode? node, int fromBase = 16) { - if (node == null) return new byte[0]; - var data = new List(); + if (node == null) + return []; + using var data = new PooledList(); var split = Regex.Split(node.InnerText, @"[\s\r\n\t]"); for (int i = 0; i < split.Length; i++) { @@ -439,17 +490,18 @@ namespace CodeWalker var cnode = node.SelectSingleNode(name); return GetRawByteArray(cnode, fromBase); } - public static byte[] GetChildRawByteArrayNullable(XmlNode node, string name, int fromBase = 16) + public static byte[]? GetChildRawByteArrayNullable(XmlNode node, string name, int fromBase = 16) { var cnode = node.SelectSingleNode(name); var arr = GetRawByteArray(cnode, fromBase); - return ((arr != null) && (arr.Length > 0)) ? arr : null; + return arr.Length > 0 ? arr : null; } - public static ushort[] GetRawUshortArray(XmlNode node) + public static ushort[] GetRawUshortArray(XmlNode? node) { - if (node == null) return new ushort[0]; - var data = new List(); + if (node is null) + return []; + using var data = new PooledList(); var split = Regex.Split(node.InnerText, @"[\s\r\n\t]"); for (int i = 0; i < split.Length; i++) { @@ -469,17 +521,18 @@ namespace CodeWalker var cnode = node.SelectSingleNode(name); return GetRawUshortArray(cnode); } - public static ushort[] GetChildRawUshortArrayNullable(XmlNode node, string name) + public static ushort[]? GetChildRawUshortArrayNullable(XmlNode node, string name) { var cnode = node.SelectSingleNode(name); var arr = GetRawUshortArray(cnode); - return ((arr != null) && (arr.Length > 0)) ? arr : null; + return arr.Length > 0 ? arr : null; } - public static uint[] GetRawUintArray(XmlNode node) + public static uint[] GetRawUintArray(XmlNode? node) { - if (node == null) return new uint[0]; - var data = new List(); + if (node == null) + return []; + using var data = new PooledList(); var split = Regex.Split(node.InnerText, @"[\s\r\n\t]"); for (int i = 0; i < split.Length; i++) { @@ -499,17 +552,18 @@ namespace CodeWalker var cnode = node.SelectSingleNode(name); return GetRawUintArray(cnode); } - public static uint[] GetChildRawUintArrayNullable(XmlNode node, string name) + public static uint[]? GetChildRawUintArrayNullable(XmlNode node, string name) { var cnode = node.SelectSingleNode(name); var arr = GetRawUintArray(cnode); - return ((arr != null) && (arr.Length > 0)) ? arr : null; + return arr.Length > 0 ? arr : null; } - public static int[] GetRawIntArray(XmlNode node) + public static int[] GetRawIntArray(XmlNode? node) { - if (node == null) return new int[0]; - var data = new List(); + if (node is null) + return []; + using var data = new PooledList(); var split = Regex.Split(node.InnerText, @"[\s\r\n\t]"); for (int i = 0; i < split.Length; i++) { @@ -529,17 +583,18 @@ namespace CodeWalker var cnode = node.SelectSingleNode(name); return GetRawIntArray(cnode); } - public static int[] GetChildRawIntArrayNullable(XmlNode node, string name) + public static int[]? GetChildRawIntArrayNullable(XmlNode node, string name) { var cnode = node.SelectSingleNode(name); var arr = GetRawIntArray(cnode); return ((arr != null) && (arr.Length > 0)) ? arr : null; } - public static float[] GetRawFloatArray(XmlNode node) + public static float[] GetRawFloatArray(XmlNode? node) { - if (node == null) return new float[0]; - var items = new List(); + if (node is null) + return []; + using var items = new PooledList(); var split = Regex.Split(node.InnerText, @"[\s\r\n\t]");//node.InnerText.Split('\n');// for (int i = 0; i < split.Length; i++) { @@ -555,19 +610,20 @@ namespace CodeWalker var cnode = node.SelectSingleNode(name); return GetRawFloatArray(cnode); } - public static float[] GetChildRawFloatArrayNullable(XmlNode node, string name) + public static float[]? GetChildRawFloatArrayNullable(XmlNode node, string name) { var cnode = node.SelectSingleNode(name); var arr = GetRawFloatArray(cnode); - return ((arr != null) && (arr.Length > 0)) ? arr : null; + return arr.Length > 0 ? arr : null; } - public static Vector2[] GetRawVector2Array(XmlNode node) + public static Vector2[] GetRawVector2Array(XmlNode? node) { - if (node == null) return new Vector2[0]; + if (node is null) + return []; float x = 0f; float y = 0f; - var items = new List(); + using var items = new PooledList(); var split = node.InnerText.Split('\n');// Regex.Split(node.InnerText, @"[\s\r\n\t]"); for (int i = 0; i < split.Length; i++) { @@ -604,13 +660,14 @@ namespace CodeWalker return GetRawVector2Array(cnode); } - public static Vector3[] GetRawVector3Array(XmlNode node) + public static Vector3[] GetRawVector3Array(XmlNode? node) { - if (node == null) return new Vector3[0]; + if (node is null) + return []; float x = 0f; float y = 0f; float z = 0f; - var items = new List(); + using var items = new PooledList(); var split = node.InnerText.Split('\n');// Regex.Split(node.InnerText, @"[\s\r\n\t]"); for (int i = 0; i < split.Length; i++) { @@ -646,21 +703,20 @@ namespace CodeWalker var cnode = node.SelectSingleNode(name); return GetRawVector3Array(cnode); } - public static Vector3[] GetChildRawVector3ArrayNullable(XmlNode node, string name) + public static Vector3[]? GetChildRawVector3ArrayNullable(XmlNode node, string name) { var cnode = node.SelectSingleNode(name); var arr = GetRawVector3Array(cnode); - return ((arr != null) && (arr.Length > 0)) ? arr : null; + return arr.Length > 0 ? arr : null; } - public static Vector4[] GetRawVector4Array(XmlNode node) + public static Vector4[] GetRawVector4Array(XmlNode? node) { - if (node == null) return new Vector4[0]; - float x = 0f; - float y = 0f; + if (node is null) + return []; float z = 0f; float w = 0f; - var items = new List(); + using var items = new PooledList(); var split = node.InnerText.Split('\n');// Regex.Split(node.InnerText, @"[\s\r\n\t]"); for (int i = 0; i < split.Length; i++) { @@ -668,11 +724,13 @@ namespace CodeWalker if (string.IsNullOrEmpty(s)) continue; var split2 = s.Split(',');// Regex.Split(s, @"[\s\t]"); int c = 0; - x = 0f; y = 0f; + float x = 0f; + float y = 0f; for (int n = 0; n < split2.Length; n++) { var ts = split2[n]?.Trim(); - if (string.IsNullOrEmpty(ts)) continue; + if (string.IsNullOrEmpty(ts)) + continue; var f = FloatUtil.Parse(ts); switch (c) { @@ -697,18 +755,21 @@ namespace CodeWalker var cnode = node.SelectSingleNode(name); return GetRawVector4Array(cnode); } - public static Vector4[] GetChildRawVector4ArrayNullable(XmlNode node, string name) + public static Vector4[]? GetChildRawVector4ArrayNullable(XmlNode node, string name) { var cnode = node.SelectSingleNode(name); var arr = GetRawVector4Array(cnode); - return ((arr != null) && (arr.Length > 0)) ? arr : null; + return arr.Length > 0 ? arr : null; } - public static Matrix GetMatrix(XmlNode node) + public static Matrix GetMatrix(XmlNode? node) { - if (node == null) return Matrix.Identity; + if (node is null) + return Matrix.Identity; var arr = GetRawFloatArray(node); - if ((arr == null) || (arr.Length != 16)) return Matrix.Identity; + if (arr.Length != 16) + return Matrix.Identity; + return new Matrix(arr); } public static Matrix GetChildMatrix(XmlNode node, string name) @@ -718,4 +779,45 @@ namespace CodeWalker } } + + public class XmlNameTableThreadSafe : NameTable + { + //private object _locker = new object(); + + public StringPool StringPool; + public XmlNameTableThreadSafe() + : this(256) + { } + + public XmlNameTableThreadSafe(int stringPoolSize) + : base() + { + StringPool = new StringPool(stringPoolSize); + } + + + + public override string Add(string key) + { + return StringPool.GetOrAdd(key); + } + + public override string Add(char[] key, int start, int len) + { + return StringPool.GetOrAdd(key.AsSpan(start, len)); + } + + public override string? Get(char[] key, int start, int len) + { + StringPool.TryGet(key.AsSpan(start, len), out var value); + return value; + //return stringPool.Get(key.AsSpan(start, len)); + } + + public override string? Get(string value) + { + StringPool.TryGet(value, out var result); + return result; + } + } } diff --git a/CodeWalker.Core/World/AudioZones.cs b/CodeWalker.Core/World/AudioZones.cs index 7fea6e0..b723874 100644 --- a/CodeWalker.Core/World/AudioZones.cs +++ b/CodeWalker.Core/World/AudioZones.cs @@ -1,4 +1,5 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; using SharpDX; using System; using System.Collections.Generic; @@ -22,6 +23,7 @@ namespace CodeWalker.World public void Init(GameFileCache gameFileCache, Action updateStatus) { + using var _ = new DisposableTimer("AudioZones Init"); Inited = false; GameFileCache = gameFileCache; @@ -30,14 +32,13 @@ namespace CodeWalker.World Emitters.Clear(); AllItems.Clear(); - - List placements = new List(); - - if (GameFileCache.AudioDatRelFiles != null) + if (GameFileCache.AudioDatRelFiles is not null && GameFileCache.AudioDatRelFiles.Count > 0) { + List placements = new List(); foreach (var relfile in GameFileCache.AudioDatRelFiles) { - if (relfile == null) continue; + if (relfile is null) + continue; placements.Clear(); @@ -58,18 +59,20 @@ namespace CodeWalker.World { foreach (var reldata in relfile.RelDatas) { - AudioPlacement placement = null; - if (reldata is Dat151AmbientZone) + AudioPlacement? placement = null; + if (reldata is Dat151AmbientZone dat151AmbientZone) { - placement = new AudioPlacement(relfile, reldata as Dat151AmbientZone); - if (addtoLists) Zones.Add(placement); + placement = new AudioPlacement(relfile, dat151AmbientZone); + if (addtoLists) + Zones.Add(placement); } - else if (reldata is Dat151AmbientRule) + else if (reldata is Dat151AmbientRule dat151AmbientRule) { - placement = new AudioPlacement(relfile, reldata as Dat151AmbientRule); - if (addtoLists) Emitters.Add(placement); + placement = new AudioPlacement(relfile, dat151AmbientRule); + if (addtoLists) + Emitters.Add(placement); } - if (placement != null) + if (placement is not null) { placements.Add(placement); } @@ -82,7 +85,7 @@ namespace CodeWalker.World foreach (var relfile in relfiles) { - AudioPlacement[] fileplacements = null; + AudioPlacement[]? fileplacements = null; if (!PlacementsDict.TryGetValue(relfile, out fileplacements)) { List newplacements = new List(); @@ -90,7 +93,7 @@ namespace CodeWalker.World fileplacements = newplacements.ToArray(); PlacementsDict[relfile] = fileplacements; } - if (fileplacements != null) + if (fileplacements is not null) { placements.AddRange(fileplacements); } @@ -153,7 +156,8 @@ namespace CodeWalker.World public void UpdateFromZone() { - if (AudioZone == null) return; + if (AudioZone is null) + return; var zone = AudioZone; Name = zone.Name; @@ -207,7 +211,8 @@ namespace CodeWalker.World public void UpdateFromEmitter() { - if (AudioEmitter == null) return; + if (AudioEmitter is null) + return; var emitter = AudioEmitter; Name = emitter.Name; @@ -240,12 +245,12 @@ namespace CodeWalker.World OuterPos += delta; Position = useouter ? OuterPos : InnerPos; - if (AudioZone != null) + if (AudioZone is not null) { AudioZone.PlaybackZonePosition = InnerPos; AudioZone.ActivationZonePosition = OuterPos; } - if (AudioEmitter != null) + if (AudioEmitter is not null) { AudioEmitter.Position = InnerPos; } @@ -255,7 +260,7 @@ namespace CodeWalker.World Orientation = ori; OrientationInv = Quaternion.Invert(ori); - Vector3 t = ori.Multiply(Vector3.UnitX); + Vector3 t = ori.Multiply(in Vector3.UnitX); float angl = (float)Math.Atan2(t.Y, t.X); while (angl < 0) angl += ((float)Math.PI * 2.0f); float rad2deg = (float)(180.0 / Math.PI); diff --git a/CodeWalker.Core/World/Camera.cs b/CodeWalker.Core/World/Camera.cs index efa716d..47e6bec 100644 --- a/CodeWalker.Core/World/Camera.cs +++ b/CodeWalker.Core/World/Camera.cs @@ -153,9 +153,9 @@ namespace CodeWalker.World Vector3 cpos = new Vector3(); if (FollowEntity != null) { - up = FollowEntity.Orientation.Multiply(up); - lookat = FollowEntity.Orientation.Multiply(lookat); - rdir = FollowEntity.Orientation.Multiply(rdir); + up = FollowEntity.Orientation.Multiply(in up); + lookat = FollowEntity.Orientation.Multiply(in lookat); + rdir = FollowEntity.Orientation.Multiply(in rdir); cpos = FollowEntity.Position; } LocalLookAt = (rdir * CurrentDistance) + lookat; diff --git a/CodeWalker.Core/World/Clouds.cs b/CodeWalker.Core/World/Clouds.cs index 60c15b4..b4a00d3 100644 --- a/CodeWalker.Core/World/Clouds.cs +++ b/CodeWalker.Core/World/Clouds.cs @@ -1,4 +1,5 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; using SharpDX; using System; using System.Collections.Generic; @@ -73,6 +74,7 @@ namespace CodeWalker.World public void Init(GameFileCache gameFileCache, Action updateStatus, Weather weather) { + using var _ = new DisposableTimer("Clouds Init"); Weather = weather; Timecycle = weather.Timecycle; var rpfman = gameFileCache.RpfMan; @@ -121,8 +123,7 @@ namespace CodeWalker.World XmlNodeList frags = xml.SelectNodes("mCloudHatFrags/Item"); foreach (XmlNode node in frags) { - XmlElement fragel = node as XmlElement; - if (fragel != null) + if (node is XmlElement fragel) { CloudHatFrag frag = new CloudHatFrag(); frag.Init(fragel); @@ -136,7 +137,7 @@ namespace CodeWalker.World AltitudeScrollScaler = Xml.GetChildFloatAttribute(xml, "mAltitudeScrollScaler", "value"); } - public CloudHatFrag FindFrag(string name) + public CloudHatFrag? FindFrag(string name) { for (int i = 0; i < CloudHatFrags.Length; i++) { @@ -179,8 +180,7 @@ namespace CodeWalker.World XmlNodeList layersxml = xml.SelectNodes("mLayers/Item"); foreach (XmlNode node in layersxml) { - XmlElement layerel = node as XmlElement; - if (layerel != null) + if (node is XmlElement layerel) { CloudHatFragLayer layer = new CloudHatFragLayer(); layer.Init(layerel); @@ -298,8 +298,7 @@ namespace CodeWalker.World XmlNodeList mapxml = xml.SelectNodes("SettingsMap/Item"); foreach (XmlNode node in mapxml) { - XmlElement itemel = node as XmlElement; - if (itemel != null) + if (node is XmlElement itemel) { CloudSettingsMapItem item = new CloudSettingsMapItem(); item.Init(itemel); diff --git a/CodeWalker.Core/World/Entity.cs b/CodeWalker.Core/World/Entity.cs index 1792752..36d5969 100644 --- a/CodeWalker.Core/World/Entity.cs +++ b/CodeWalker.Core/World/Entity.cs @@ -108,7 +108,7 @@ namespace CodeWalker.World Vector3 raydir = new Vector3(0.0f, 0.0f, -1.0f); Vector3 rayoff = new Vector3(0.0f, 0.0f, 0.0f); Ray ray = new Ray(targetpos + Center + rayoff, raydir); - var rayhit = Space.RayIntersect(ray, 1.0f); + var rayhit = Space.RayIntersect(ref ray, 1.0f); if (rayhit.Hit) { if (rayhit.HitDist > 0) @@ -164,12 +164,12 @@ namespace CodeWalker.World var raydir = new Vector3(0.0f, 0.0f, -1.0f); var ray = new Ray(Position, raydir); - var rayhit = Space.RayIntersect(ray, float.MaxValue); + var rayhit = Space.RayIntersect(ref ray, float.MaxValue); if (!rayhit.Hit && rayhit.TestComplete) { //must be under the map? try to find the ground... ray.Position = Position + new Vector3(0.0f, 0.0f, 1000.0f); - rayhit = Space.RayIntersect(ray, float.MaxValue); + rayhit = Space.RayIntersect(ref ray, float.MaxValue); if (rayhit.Hit) { Position = rayhit.Position + new Vector3(0.0f, 0.0f, Radius) - Center; diff --git a/CodeWalker.Core/World/Heightmaps.cs b/CodeWalker.Core/World/Heightmaps.cs index e5f614d..d7e8474 100644 --- a/CodeWalker.Core/World/Heightmaps.cs +++ b/CodeWalker.Core/World/Heightmaps.cs @@ -1,4 +1,6 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; +using Collections.Pooled; using SharpDX; using System; using System.Collections.Generic; @@ -18,21 +20,18 @@ namespace CodeWalker.World { return NodePositions; } - public EditorVertex[] GetPathVertices() - { - return null; - } public EditorVertex[] GetTriangleVertices() { return TriangleVerts; } - public Vector4[] NodePositions; - public EditorVertex[] TriangleVerts; + public Vector4[] NodePositions = []; + public EditorVertex[] TriangleVerts = []; public void Init(GameFileCache gameFileCache, Action updateStatus) { + using var _ = new DisposableTimer("Heightmaps Init"); Inited = false; GameFileCache = gameFileCache; @@ -68,8 +67,8 @@ namespace CodeWalker.World public void BuildVertices() { - var vlist = new List(); - var nlist = new List(); + using var vlist = new PooledList(); + using var nlist = new PooledList(); foreach (var hmf in HeightmapFiles) { @@ -82,7 +81,7 @@ namespace CodeWalker.World } else { - TriangleVerts = null; + TriangleVerts = []; } if (nlist.Count > 0) { @@ -90,16 +89,16 @@ namespace CodeWalker.World } else { - NodePositions = null; + NodePositions = []; } } - private void BuildHeightmapVertices(HeightmapFile hmf, List vl, List nl) + private void BuildHeightmapVertices(HeightmapFile hmf, PooledList vl, PooledList nl) { - var v1 = new EditorVertex(); - var v2 = new EditorVertex(); - var v3 = new EditorVertex(); - var v4 = new EditorVertex(); + EditorVertex v1; + EditorVertex v2; + EditorVertex v3; + EditorVertex v4; uint cgrn = (uint)new Color(0, 128, 0, 60).ToRgba(); uint cyel = (uint)new Color(128, 128, 0, 200).ToRgba(); @@ -113,7 +112,6 @@ namespace CodeWalker.World var siz = max - min; var step = siz / new Vector3(w - 1, h - 1, 255); - v1.Colour = v2.Colour = v3.Colour = v4.Colour = cyel; for (int yi = 1; yi < h; yi++) { var yo = yi - 1; @@ -124,15 +122,15 @@ namespace CodeWalker.World var o2 = yo * w + xi; var o3 = yi * w + xo; var o4 = yi * w + xi; - v1.Position = min + step * new Vector3(xo, yo, hmin[o1]); - v2.Position = min + step * new Vector3(xi, yo, hmin[o2]); - v3.Position = min + step * new Vector3(xo, yi, hmin[o3]); - v4.Position = min + step * new Vector3(xi, yi, hmin[o4]); + v1 = new EditorVertex(min + step * new Vector3(xo, yo, hmin[o1]), cyel); + v2 = new EditorVertex(min + step * new Vector3(xi, yo, hmin[o2]), cyel); + v3 = new EditorVertex(min + step * new Vector3(xo, yi, hmin[o3]), cyel); + v4 = new EditorVertex(min + step * new Vector3(xi, yi, hmin[o4]), cyel); vl.Add(v1); vl.Add(v2); vl.Add(v3); vl.Add(v3); vl.Add(v2); vl.Add(v4); } } - v1.Colour = v2.Colour = v3.Colour = v4.Colour = cgrn; + for (int yi = 1; yi < h; yi++) { var yo = yi - 1; @@ -143,10 +141,10 @@ namespace CodeWalker.World var o2 = yo * w + xi; var o3 = yi * w + xo; var o4 = yi * w + xi; - v1.Position = min + step * new Vector3(xo, yo, hmax[o1]); - v2.Position = min + step * new Vector3(xi, yo, hmax[o2]); - v3.Position = min + step * new Vector3(xo, yi, hmax[o3]); - v4.Position = min + step * new Vector3(xi, yi, hmax[o4]); + v1 = new EditorVertex(min + step * new Vector3(xo, yo, hmax[o1]), cgrn); + v2 = new EditorVertex(min + step * new Vector3(xi, yo, hmax[o2]), cgrn); + v3 = new EditorVertex(min + step * new Vector3(xo, yi, hmax[o3]), cgrn); + v4 = new EditorVertex(min + step * new Vector3(xi, yi, hmax[o4]), cgrn); vl.Add(v1); vl.Add(v2); vl.Add(v3); vl.Add(v3); vl.Add(v2); vl.Add(v4); } diff --git a/CodeWalker.Core/World/Ped.cs b/CodeWalker.Core/World/Ped.cs index 6c6ab32..a33340a 100644 --- a/CodeWalker.Core/World/Ped.cs +++ b/CodeWalker.Core/World/Ped.cs @@ -1,4 +1,5 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.GameFiles.Resources; +using CodeWalker.GameFiles; using SharpDX; using System; using System.Collections.Generic; @@ -10,33 +11,40 @@ using System.Threading.Tasks; namespace CodeWalker.World { - [TypeConverter(typeof(ExpandableObjectConverter))] public class Ped + [TypeConverter(typeof(ExpandableObjectConverter))] + public class Ped { public string Name { get; set; } = string.Empty; public MetaHash NameHash { get; set; } = 0;//ped name hash - public CPedModelInfo__InitData InitData { get; set; } = null; //ped init data - public YddFile Ydd { get; set; } = null; //ped drawables - public YtdFile Ytd { get; set; } = null; //ped textures - public YldFile Yld { get; set; } = null; //ped clothes - public YcdFile Ycd { get; set; } = null; //ped animations - public YedFile Yed { get; set; } = null; //ped expressions - public YftFile Yft { get; set; } = null; //ped skeleton YFT - public PedFile Ymt { get; set; } = null; //ped variation info - public Dictionary DrawableFilesDict { get; set; } = null; - public Dictionary TextureFilesDict { get; set; } = null; - public Dictionary ClothFilesDict { get; set; } = null; - public RpfFileEntry[] DrawableFiles { get; set; } = null; - public RpfFileEntry[] TextureFiles { get; set; } = null; - public RpfFileEntry[] ClothFiles { get; set; } = null; - public ClipMapEntry AnimClip { get; set; } = null; - public Expression Expression { get; set; } = null; + public CPedModelInfo__InitData? InitData { get; set; } = null; //ped init data + public YddFile? Ydd { get; set; } = null; //ped drawables + public YtdFile? Ytd { get; set; } = null; //ped textures + public YldFile? Yld { get; set; } = null; //ped clothes + public YcdFile? Ycd { get; set; } = null; //ped animations + public YedFile? Yed { get; set; } = null; //ped expressions + public YftFile? Yft { get; set; } = null; //ped skeleton YFT + public PedFile? Ymt { get; set; } = null; //ped variation info + [Browsable(true)] + [EditorBrowsable(EditorBrowsableState.Always)] + public PedsFiles PedsFiles { get; set; } + public ICollection Ymts { get; set; } = new List(); + public ICollection Dlcs { get; set; } = new List(); + public PedsDlcFiles? PedsDlcFiles { get; set; } = null; + public IDictionary? DrawableFilesDict { get; set; } = null; + public IDictionary? TextureFilesDict { get; set; } = null; + public IDictionary? ClothFilesDict { get; set; } = null; + public RpfFileEntry[]? DrawableFiles { get; set; } = null; + public RpfFileEntry[]? TextureFiles { get; set; } = null; + public RpfFileEntry[]? ClothFiles { get; set; } = null; + public ClipMapEntry? AnimClip { get; set; } = null; + public Expression? Expression { get; set; } = null; public string[] DrawableNames { get; set; } = new string[12]; public Drawable[] Drawables { get; set; } = new Drawable[12]; public Texture[] Textures { get; set; } = new Texture[12]; public Expression[] Expressions { get; set; } = new Expression[12]; public ClothInstance[] Clothes { get; set; } = new ClothInstance[12]; public bool EnableRootMotion { get; set; } = false; //used to toggle whether or not to include root motion when playing animations - public Skeleton Skeleton { get; set; } = null; + public Skeleton? Skeleton { get; set; } = null; public Vector3 Position { get; set; } = Vector3.Zero; public Quaternion Rotation { get; set; } = Quaternion.Identity; @@ -44,13 +52,13 @@ namespace CodeWalker.World public YmapEntityDef RenderEntity = new YmapEntityDef(); //placeholder entity object for rendering - public async ValueTask InitAsync(string name, GameFileCache gfc) + public async ValueTask InitAsync(string name, GameFileCache gfc, MetaHash? selectedDlc = null) { - var hash = JenkHash.GenHash(name.ToLowerInvariant()); - await InitAsync(hash, gfc); + var hash = JenkHash.GenHashLower(name); + await InitAsync(hash, gfc, selectedDlc); Name = name; } - public async ValueTask InitAsync(MetaHash pedhash, GameFileCache gfc) + public async ValueTask InitAsync(MetaHash pedhash, GameFileCache gfc, MetaHash? selectedDlc = null) { Name = string.Empty; @@ -71,12 +79,22 @@ namespace CodeWalker.World Expressions[i] = null; } + Console.WriteLine($"{selectedDlc} selected"); - CPedModelInfo__InitData initdata = null; - if (!gfc.PedsInitDict.TryGetValue(pedhash, out initdata)) return; + if (!gfc.PedsFiles.TryGetValue(pedhash, out var pedsFiles)) + { + Console.WriteLine("PedsFile not found"); + } else + { + PedsFiles = pedsFiles; + } + if (!gfc.PedsInitDict.TryGetValue(pedhash, out CPedModelInfo__InitData initdata)) + { + return; + } - var ycdhash = JenkHash.GenHash(initdata.ClipDictionaryName.ToLowerInvariant()); - var yedhash = JenkHash.GenHash(initdata.ExpressionDictionaryName.ToLowerInvariant()); + var ycdhash = JenkHash.GenHashLower(initdata.ClipDictionaryName); + var yedhash = JenkHash.GenHashLower(initdata.ExpressionDictionaryName); //bool pedchange = NameHash != pedhash; //Name = pedname; @@ -88,20 +106,60 @@ namespace CodeWalker.World Yed = gfc.GetYed(yedhash); Yft = gfc.GetYft(pedhash); - PedFile pedFile = null; - gfc.PedVariationsDict?.TryGetValue(pedhash, out pedFile); - Ymt = pedFile; + if (selectedDlc is not null) + { + Ymt = PedsFiles.Dlcs[selectedDlc.Value].PedFile; + } else + { + Ymt = PedsFiles.Dlcs.Values.First().PedFile; + } + + + var dlcsOrdered = pedsFiles.Dlcs.Where(p => + { + if (GameFileCache.Instance.DlcNameLookup.TryGetValue(p.Key, out var dlcName)) + { + if (dlcName.Contains("g9", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } + return true; + }).OrderBy(p => p.Value.Index).ToList(); + Ymts = dlcsOrdered.Select(p => p.Value.PedFile).ToList(); + Dlcs = dlcsOrdered.Select(p => p.Key).ToList(); + + //if (gfc.PedVariationsDict?.TryGetValue(pedhash, out var pedFiles) ?? false) + //{ + // Ymt = pedFiles.First(); + // Ymts = pedsFiles.Dlcs.Values.Select(p => p.PedFile).ToList(); + //} + + //Ymt = selectedFile ?? Ymt; Dictionary peddict = null; - gfc.PedDrawableDicts.TryGetValue(NameHash, out peddict); - DrawableFilesDict = peddict; - DrawableFiles = DrawableFilesDict?.Values.ToArray(); - gfc.PedTextureDicts.TryGetValue(NameHash, out peddict); - TextureFilesDict = peddict; - TextureFiles = TextureFilesDict?.Values.ToArray(); - gfc.PedClothDicts.TryGetValue(NameHash, out peddict); - ClothFilesDict = peddict; - ClothFiles = ClothFilesDict?.Values.ToArray(); + if (PedsFiles.TryGetPedsDlcFiles(Ymt, out var pedsDlcFiles)) + { + Console.WriteLine($"Found {Ymt.RpfFileEntry.Path} in pedsDlclist"); + PedsDlcFiles = pedsDlcFiles; + DrawableFilesDict = PedsDlcFiles.Drawables; + TextureFilesDict = PedsDlcFiles.TextureDicts; + ClothFilesDict = PedsDlcFiles.ClothDicts; + } + else + { + Console.WriteLine($"{Ymt.RpfFileEntry.Path} not found in pedsDlclist"); + gfc.PedDrawableDicts.TryGetValue(NameHash, out peddict); + DrawableFilesDict = peddict; + gfc.PedTextureDicts.TryGetValue(NameHash, out peddict); + TextureFilesDict = peddict; + gfc.PedClothDicts.TryGetValue(NameHash, out peddict); + ClothFilesDict = peddict; + } + + DrawableFiles = DrawableFilesDict.Values.ToArray(); + TextureFiles = TextureFilesDict.Values.ToArray(); + ClothFiles = ClothFilesDict?.Values?.ToArray() ?? Array.Empty(); RpfFileEntry clothFile = null; if (ClothFilesDict?.TryGetValue(pedhash, out clothFile) ?? false) @@ -115,31 +173,30 @@ namespace CodeWalker.World } - while ((Ydd != null) && (!Ydd.Loaded)) { await Task.Delay(1);//kinda hacky - Ydd = gfc.GetYdd(pedhash); + await gfc.TryLoadEnqueue(Ydd); } while ((Ytd != null) && (!Ytd.Loaded)) { await Task.Delay(1);//kinda hacky - Ytd = gfc.GetYtd(pedhash); + await gfc.TryLoadEnqueue(Ytd); } while ((Ycd != null) && (!Ycd.Loaded)) { await Task.Delay(1);//kinda hacky - Ycd = gfc.GetYcd(ycdhash); + await gfc.TryLoadEnqueue(Ycd); } while ((Yed != null) && (!Yed.Loaded)) { await Task.Delay(1);//kinda hacky - Yed = gfc.GetYed(yedhash); + await gfc.TryLoadEnqueue(Yed); } while ((Yft != null) && (!Yft.Loaded)) { await Task.Delay(1);//kinda hacky - Yft = gfc.GetYft(pedhash); + await gfc.TryLoadEnqueue(Yft); } @@ -163,7 +220,7 @@ namespace CodeWalker.World - public async ValueTask SetComponentDrawableAsync(int index, string name, string tex, GameFileCache gfc) + public async ValueTask SetComponentDrawableAsync(int index, string name, string tex, MetaHash dlc, GameFileCache gfc) { if (string.IsNullOrEmpty(name)) { @@ -174,16 +231,33 @@ namespace CodeWalker.World return; } + Console.WriteLine($"{index}: {name} - {tex} - {dlc}"); MetaHash namehash = JenkHash.GenHashLower(name); + PedsDlcFiles pedsDlcFiles; Drawable d = null; if (Ydd?.Dict != null) { Ydd.Dict.TryGetValue(namehash, out d); } + if (PedsFiles.TryGetPedsDlcFiles(dlc, out pedsDlcFiles)) + { + if (pedsDlcFiles.Drawables.TryGetValue(namehash, out var file)) + { + var ydd = await gfc.GetFileUncachedAsync(file); + while ((ydd != null) && (!ydd.Loaded)) + { + await Task.Delay(1);//kinda hacky + await gfc.TryLoadEnqueue(ydd); + } + if (ydd?.Drawables?.Length > 0) + { + d = ydd.Drawables[0];//should only be one in this dict + } + } + } if ((d == null) && (DrawableFilesDict != null)) { - RpfFileEntry file = null; - if (DrawableFilesDict.TryGetValue(namehash, out file)) + if (DrawableFilesDict.TryGetValue(namehash, out var file)) { var ydd = await gfc.GetFileUncachedAsync(file); while ((ydd != null) && (!ydd.Loaded)) @@ -198,12 +272,35 @@ namespace CodeWalker.World } } - MetaHash texhash = JenkHash.GenHash(tex.ToLowerInvariant()); - Texture t = null; - if (Ytd?.TextureDict?.Dict != null) + MetaHash texhash = JenkHash.GenHashLower(tex); + Texture? t = null; + + if (t is null && PedsFiles.TryGetPedsDlcFiles(dlc, out pedsDlcFiles)) + { + if (pedsDlcFiles.TextureDicts.TryGetValue(texhash, out var file)) + { + var ytd = await gfc.GetFileUncachedAsync(file); + while (ytd != null && !ytd.Loaded) + { + await Task.Delay(1);//kinda hacky + await gfc.TryLoadEnqueue(ytd); + } + if (ytd?.TextureDict?.Textures?.data_items.Length > 0) + { + t = ytd.TextureDict.Textures.data_items[0];//should only be one in this dict + } + } + else + { + Console.WriteLine($"Couldn't find texture file in PedsFiles"); + } + } + + if (t is null && Ytd?.TextureDict?.Dict != null) { Ytd.TextureDict.Dict.TryGetValue(texhash, out t); } + if ((t == null) && (TextureFilesDict != null)) { RpfFileEntry file = null; @@ -227,10 +324,25 @@ namespace CodeWalker.World { Yld.Dict.TryGetValue(namehash, out cc); } + if (cc == null && PedsFiles.TryGetPedsDlcFiles(dlc, out pedsDlcFiles)) + { + if (pedsDlcFiles.TextureDicts.TryGetValue(namehash, out var file)) + { + var yld = await gfc.GetFileUncachedAsync(file); + while ((yld != null) && (!yld.Loaded)) + { + await Task.Delay(1);//kinda hacky + await gfc.TryLoadEnqueue(yld); + } + if (yld?.ClothDictionary?.Clothes?.data_items?.Length > 0) + { + cc = yld.ClothDictionary.Clothes.data_items[0];//should only be one in this dict + } + } + } if ((cc == null) && (ClothFilesDict != null)) { - RpfFileEntry file = null; - if (ClothFilesDict.TryGetValue(namehash, out file)) + if (ClothFilesDict.TryGetValue(namehash, out RpfFileEntry file)) { var yld = await gfc.GetFileUncachedAsync(file); while ((yld != null) && (!yld.Loaded)) @@ -279,7 +391,7 @@ namespace CodeWalker.World { var name = item?.GetDrawableName(alt); var texn = item?.GetTextureName(tex); - await SetComponentDrawableAsync(index, name, texn, gfc); + await SetComponentDrawableAsync(index, name, texn, 0, gfc); } } } diff --git a/CodeWalker.Core/World/PopZones.cs b/CodeWalker.Core/World/PopZones.cs index 2d2a33b..b7aa6b1 100644 --- a/CodeWalker.Core/World/PopZones.cs +++ b/CodeWalker.Core/World/PopZones.cs @@ -1,8 +1,11 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; +using Collections.Pooled; using SharpDX; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; @@ -15,25 +18,18 @@ namespace CodeWalker.World public Dictionary Groups = new Dictionary(); - public Vector4[] GetNodePositions() - { - return null; - } - public EditorVertex[] GetPathVertices() - { - return null; - } public EditorVertex[] GetTriangleVertices() { return TriangleVerts; } - public EditorVertex[] TriangleVerts; + public EditorVertex[] TriangleVerts = Array.Empty(); public void Init(GameFileCache gameFileCache, Action updateStatus) { + using var _ = new DisposableTimer("PopZones Init"); Inited = false; GameFileCache = gameFileCache; @@ -55,9 +51,9 @@ namespace CodeWalker.World Groups.Clear(); - var ipllines = ipltext.Split('\n'); + //var ipllines = ipltext.Split('\n'); bool inzone = false; - foreach (var iplline in ipllines) + foreach (var iplline in ipltext.EnumerateSplit('\n')) { var linet = iplline.Trim(); if (linet == "zone") @@ -73,8 +69,7 @@ namespace CodeWalker.World PopZoneBox box = new PopZoneBox(); box.Init(linet); - PopZone group; - if (!Groups.TryGetValue(box.NameLabel, out group)) + if (!Groups.TryGetValue(box.NameLabel, out var group)) { group = new PopZone(); group.NameLabel = box.NameLabel; @@ -88,7 +83,7 @@ namespace CodeWalker.World foreach (var group in Groups.Values) { - var hash = JenkHash.GenHash(group.NameLabel.ToLowerInvariant()); + var hash = JenkHash.GenHashLower(group.NameLabel); group.Name = GlobalText.TryGetString(hash); } @@ -103,34 +98,26 @@ namespace CodeWalker.World public void BuildVertices() { - var vlist = new List(); - var v1 = new EditorVertex(); - var v2 = new EditorVertex(); - var v3 = new EditorVertex(); - var v4 = new EditorVertex(); + using var vlist = new PooledList(); foreach (var group in Groups.Values) { - var hash = JenkHash.GenHash(group.NameLabel.ToLowerInvariant()); + var hash = JenkHash.GenHashLower(group.NameLabel); byte cr = (byte)((hash >> 8) & 0xFF); byte cg = (byte)((hash >> 16) & 0xFF); byte cb = (byte)((hash >> 24) & 0xFF); byte ca = 60; uint cv = (uint)new Color(cr, cg, cb, ca).ToRgba(); - v1.Colour = cv; - v2.Colour = cv; - v3.Colour = cv; - v4.Colour = cv; foreach (var box in group.Boxes) { var min = box.Box.Minimum; var max = box.Box.Maximum; - v1.Position = new Vector3(min.X, min.Y, 0); - v2.Position = new Vector3(max.X, min.Y, 0); - v3.Position = new Vector3(min.X, max.Y, 0); - v4.Position = new Vector3(max.X, max.Y, 0); + var v1 = new EditorVertex(new Vector3(min.X, min.Y, 0), cv); + var v2 = new EditorVertex(new Vector3(max.X, min.Y, 0), cv); + var v3 = new EditorVertex(new Vector3(min.X, max.Y, 0), cv); + var v4 = new EditorVertex(new Vector3(max.X, max.Y, 0), cv); vlist.Add(v1); vlist.Add(v2); @@ -147,7 +134,7 @@ namespace CodeWalker.World } else { - TriangleVerts = null; + TriangleVerts = []; } } @@ -165,7 +152,7 @@ namespace CodeWalker.World public override string ToString() { - return NameLabel + ": " + Name; + return $"{NameLabel}: {Name}"; } } @@ -177,29 +164,31 @@ namespace CodeWalker.World public string NameLabel { get; set; } public float UnkVal { get; set; } - - public void Init(string iplline) + [SkipLocalsInit] + public void Init(ReadOnlySpan iplline) { - var parts = iplline.Split(','); - if (parts.Length >= 9) + Span parts = stackalloc Range[10]; + var numParts = iplline.Split(parts, ',', StringSplitOptions.TrimEntries); + //var parts = iplline.Split(','); + if (numParts >= 9) { - ID = parts[0].Trim(); + ID = iplline[parts[0]].ToString(); BoundingBox b = new BoundingBox(); - b.Minimum.X = FloatUtil.Parse(parts[1].Trim()); - b.Minimum.Y = FloatUtil.Parse(parts[2].Trim()); - b.Minimum.Z = FloatUtil.Parse(parts[3].Trim()); - b.Maximum.X = FloatUtil.Parse(parts[4].Trim()); - b.Maximum.Y = FloatUtil.Parse(parts[5].Trim()); - b.Maximum.Z = FloatUtil.Parse(parts[6].Trim()); + b.Minimum.X = FloatUtil.Parse(iplline[parts[1]]); + b.Minimum.Y = FloatUtil.Parse(iplline[parts[2]]); + b.Minimum.Z = FloatUtil.Parse(iplline[parts[3]]); + b.Maximum.X = FloatUtil.Parse(iplline[parts[4]]); + b.Maximum.Y = FloatUtil.Parse(iplline[parts[5]]); + b.Maximum.Z = FloatUtil.Parse(iplline[parts[6]]); Box = b; - NameLabel = parts[7].Trim(); - UnkVal = FloatUtil.Parse(parts[8].Trim()); + NameLabel = iplline[parts[7]].ToString(); + UnkVal = FloatUtil.Parse(iplline[parts[8]]); } } public override string ToString() { - return ID + ": " + NameLabel + ": " + Box.ToString(); + return $"{ID}: {NameLabel}: {Box}"; } } diff --git a/CodeWalker.Core/World/Scenarios.cs b/CodeWalker.Core/World/Scenarios.cs index 4fd1f72..c2a95a9 100644 --- a/CodeWalker.Core/World/Scenarios.cs +++ b/CodeWalker.Core/World/Scenarios.cs @@ -7,6 +7,10 @@ using System.Threading.Tasks; using SharpDX; using System.Xml; using System.ComponentModel; +using System.Xml.Linq; +using CodeWalker.Core.Utils; +using System.Runtime.InteropServices; +using System.Diagnostics.Metrics; namespace CodeWalker.World { @@ -19,11 +23,12 @@ namespace CodeWalker.World public static ScenarioTypes ScenarioTypes { get; set; } - public List ScenarioRegions { get; set; } + public List ScenarioRegions { get; set; } = new List(); - public void Init(GameFileCache gameFileCache, Action updateStatus, Timecycle timecycle) + public async Task InitAsync(GameFileCache gameFileCache, Action updateStatus, Timecycle timecycle) { + using var _ = new DisposableTimer("Scenarios Init"); Timecycle = timecycle; GameFileCache = gameFileCache; @@ -31,7 +36,7 @@ namespace CodeWalker.World EnsureScenarioTypes(gameFileCache); - ScenarioRegions = new List(); + ScenarioRegions.Clear(); //rubidium: @@ -48,8 +53,8 @@ namespace CodeWalker.World var rpfman = gameFileCache.RpfMan; string manifestfilename = "update\\update.rpf\\x64\\levels\\gta5\\sp_manifest.ymt"; - YmtFile manifestymt = rpfman.GetFile(manifestfilename); - if ((manifestymt != null) && (manifestymt.CScenarioPointManifest != null)) + YmtFile? manifestymt = await rpfman.GetFileAsync(manifestfilename); + if (manifestymt is not null && manifestymt.CScenarioPointManifest is not null) { foreach (var region in manifestymt.CScenarioPointManifest.RegionDefs) @@ -63,14 +68,9 @@ namespace CodeWalker.World { usefilename = basefilename; } - YmtFile regionymt = rpfman.GetFile(usefilename); + YmtFile? regionymt = await rpfman.GetFileAsync(usefilename) ?? await rpfman.GetFileAsync(basefilename); - if (regionymt == null) - { - regionymt = rpfman.GetFile(basefilename); - } - - if (regionymt != null) + if (regionymt is not null) { var sregion = regionymt.ScenarioRegion; if (sregion != null) @@ -118,18 +118,13 @@ namespace CodeWalker.World [TypeConverter(typeof(ExpandableObjectConverter))] public class ScenarioRegion : BasePathData { - public EditorVertex[] PathVerts { get; set; } - public EditorVertex[] TriangleVerts { get; set; } - public Vector4[] NodePositions { get; set; } + public EditorVertex[] PathVerts { get; set; } = []; + public Vector4[] NodePositions { get; set; } = []; public EditorVertex[] GetPathVertices() { return PathVerts; } - public EditorVertex[] GetTriangleVertices() - { - return TriangleVerts; - } public Vector4[] GetNodePositions() { return NodePositions; @@ -168,17 +163,25 @@ namespace CodeWalker.World public void LoadTypes() { - if ((Ymt == null) || (Region == null)) - { return; } + if (Ymt == null || Region == null) + { + return; + } if (Region.LookUps == null) - { return; } + { + return; + } if (Scenarios.ScenarioTypes == null) //these are loaded by Scenarios.Init - { return; } + { + return; + } if (Nodes == null) //nodes not loaded yet - BuildVertices needs to be called first! - { return; } + { + return; + } foreach (var node in Nodes) { @@ -190,11 +193,12 @@ namespace CodeWalker.World private void LoadTypes(MCScenarioPointRegion r, MCScenarioPoint scp) { - if (scp == null) return; + if (scp is null) + return; var types = Scenarios.ScenarioTypes; //these are loaded by Scenarios.Init - if (types == null) - { return; } + if (types is null) + return; var typhashes = r.LookUps.TypeNames; var pedhashes = r.LookUps.PedModelSetNames; @@ -211,8 +215,6 @@ namespace CodeWalker.World scp.Type = types.GetScenarioTypeRef(hash); isveh = scp.Type?.IsVehicle ?? false; //TODO: make a warning about this if scp.Type is null? } - else - { } var msind = scp.ModelSetId; if (isveh) @@ -221,13 +223,7 @@ namespace CodeWalker.World { var hash = vehhashes[msind]; scp.ModelSet = types.GetVehicleModelSet(hash); - if (scp.ModelSet != null) - { } - else if (hash != 493038497)//"None" - { } } - else - { } } else { @@ -235,13 +231,7 @@ namespace CodeWalker.World { var hash = pedhashes[msind]; scp.ModelSet = types.GetPedModelSet(hash); - if (scp.ModelSet != null) - { } - else if (hash != 493038497)//"None" - { } } - else - { } } var intind = scp.InteriorId; @@ -268,10 +258,13 @@ namespace CodeWalker.World } private void LoadTypes(MCScenarioPointRegion r, MCScenarioChainingNode spn) { - if (spn == null) return; + if (spn == null) + return; var types = Scenarios.ScenarioTypes; //these are loaded by Scenarios.Init if (types == null) - { return; } + { + return; + } uint hash = spn._Data.ScenarioType; if ((hash != 0) && (hash != 493038497)) @@ -279,10 +272,6 @@ namespace CodeWalker.World bool isveh = false; spn.Type = types.GetScenarioTypeRef(hash); isveh = spn.Type?.IsVehicle ?? false; - if (isveh) - { } - else - { } } } @@ -294,11 +283,11 @@ namespace CodeWalker.World NodeDict = new Dictionary(); Nodes = new List(); - if ((Ymt != null) && (Ymt.CScenarioPointRegion != null)) + if (Ymt?.CScenarioPointRegion is not null) { var r = Ymt.CScenarioPointRegion; - if ((r.Paths != null) && (r.Paths.Nodes != null)) + if (r.Paths?.Nodes is not null) { foreach (var node in r.Paths.Nodes) { @@ -428,7 +417,7 @@ namespace CodeWalker.World public void BuildBVH() { - BVH = new PathBVH(Nodes, 10, 10); + BVH = new PathBVH(Nodes.ToArray(), 10, 10); } public void BuildVertices() @@ -441,11 +430,9 @@ namespace CodeWalker.World uint cgrn = (uint)Color.Green.ToBgra(); uint cblk = (uint)Color.Black.ToBgra(); - if ((Ymt != null) && (Ymt.CScenarioPointRegion != null)) + if (Ymt?.CScenarioPointRegion is not null) { var r = Ymt.CScenarioPointRegion; - EditorVertex pv1 = new EditorVertex(); - EditorVertex pv2 = new EditorVertex(); if ((r.Paths != null) && (r.Paths.Nodes != null)) { @@ -470,12 +457,10 @@ namespace CodeWalker.World byte cb1 = (byte)(255 - cr1); byte cb2 = (byte)(255 - cr2); - pv1.Position = v1.Position; - pv2.Position = v2.Position; - pv1.Colour = (uint)new Color(cr1, cg, cb1, (byte)255).ToRgba();// (v1._Data.HasIncomingEdges == 1) ? cred : cblu; - pv2.Colour = (uint)new Color(cr2, cg, cb2, (byte)255).ToRgba();// (v2._Data.HasIncomingEdges == 1) ? cred : cblu; - pathverts.Add(pv1); - pathverts.Add(pv2); + var colour1 = (uint)new Color(cr1, cg, cb1, (byte)255).ToRgba(); + var colour2 = (uint)new Color(cr2, cg, cb2, (byte)255).ToRgba(); + pathverts.Add(new EditorVertex(v1.Position, colour1)); + pathverts.Add(new EditorVertex(v2.Position, colour2)); } } } @@ -528,25 +513,18 @@ namespace CodeWalker.World } else { - PathVerts = null; + PathVerts = []; } - List nodes = new List(Nodes.Count); - foreach (var node in Nodes) + Vector4[] nodes = new Vector4[Nodes.Count]; + for (int i = 0; i < Nodes.Count; i++) { - nodes.Add(new Vector4(node.Position, 1.0f)); - } - if (nodes.Count > 0) - { - NodePositions = nodes.ToArray(); - } - else - { - NodePositions = null; + nodes[i] = new Vector4(Nodes[i].Position, 1.0f); } + NodePositions = nodes; } @@ -556,17 +534,18 @@ namespace CodeWalker.World private ScenarioNode EnsureNode(MCScenarioChainingNode cnode) { - ScenarioNode exnode; - if (NodeDict.TryGetValue(cnode.Position, out exnode) && (exnode.ChainingNode == null)) + ref var exnode = ref CollectionsMarshal.GetValueRefOrAddDefault(NodeDict, cnode.Position, out var exists); + if (exists && (exnode?.ChainingNode is null)) { - exnode.ChainingNode = cnode; + exnode!.ChainingNode = cnode; } else { - exnode = new ScenarioNode(cnode.Region?.Ymt); - exnode.ChainingNode = cnode; - exnode.Position = cnode.Position; - NodeDict[cnode.Position] = exnode; + exnode = new ScenarioNode(cnode.Region?.Ymt) + { + ChainingNode = cnode, + Position = cnode.Position, + }; Nodes.Add(exnode); } cnode.ScenarioNode = exnode; @@ -574,8 +553,8 @@ namespace CodeWalker.World } private ScenarioNode EnsureNode(MCScenarioPoint point) { - ScenarioNode exnode; - if (NodeDict.TryGetValue(point.Position, out exnode) && (exnode.MyPoint == null)) + ref var exnode = ref CollectionsMarshal.GetValueRefOrAddDefault(NodeDict, point.Position, out var exists); + if (exists && (exnode!.MyPoint is null)) { exnode.MyPoint = point; exnode.Orientation = point.Orientation; @@ -586,15 +565,14 @@ namespace CodeWalker.World exnode.MyPoint = point; exnode.Position = point.Position; exnode.Orientation = point.Orientation; - NodeDict[point.Position] = exnode; Nodes.Add(exnode); } return exnode; } private ScenarioNode EnsureNode(MCExtensionDefSpawnPoint point) { - ScenarioNode exnode; - if (NodeDict.TryGetValue(point.Position, out exnode) && (exnode.LoadSavePoint == null)) + ref var exnode = ref CollectionsMarshal.GetValueRefOrAddDefault(NodeDict, point.Position, out var exists); + if (exists && (exnode!.LoadSavePoint is null)) { exnode.LoadSavePoint = point; } @@ -611,8 +589,8 @@ namespace CodeWalker.World } private ScenarioNode EnsureClusterNode(MCScenarioPointCluster cluster) { - ScenarioNode exnode; - if (NodeDict.TryGetValue(cluster.Position, out exnode) && (exnode.Cluster == null)) + ref var exnode = ref CollectionsMarshal.GetValueRefOrAddDefault(NodeDict, cluster.Position, out var exists); + if (exists && (exnode!.Cluster is null)) { exnode.Cluster = cluster; } @@ -628,8 +606,8 @@ namespace CodeWalker.World } private ScenarioNode EnsureClusterNode(MCScenarioPoint point) { - ScenarioNode exnode; - if (NodeDict.TryGetValue(point.Position, out exnode) && (exnode.ClusterMyPoint == null)) + ref var exnode = ref CollectionsMarshal.GetValueRefOrAddDefault(NodeDict, point.Position, out var exists); + if (exists && (exnode!.ClusterMyPoint is null)) { exnode.ClusterMyPoint = point; exnode.Orientation = point.Orientation; @@ -647,8 +625,8 @@ namespace CodeWalker.World } private ScenarioNode EnsureClusterNode(MCExtensionDefSpawnPoint point) { - ScenarioNode exnode; - if (NodeDict.TryGetValue(point.Position, out exnode) && (exnode.ClusterLoadSavePoint == null)) + ref var exnode = ref CollectionsMarshal.GetValueRefOrAddDefault(NodeDict, point.Position, out var exists); + if (exists && exnode is not null && exnode.ClusterLoadSavePoint is null) { exnode.ClusterLoadSavePoint = point; } @@ -664,8 +642,8 @@ namespace CodeWalker.World } private ScenarioNode EnsureEntityNode(MCExtensionDefSpawnPoint point) { - ScenarioNode exnode; - if (NodeDict.TryGetValue(point.Position, out exnode) && (exnode.EntityPoint == null)) + ref var exnode = ref CollectionsMarshal.GetValueRefOrAddDefault(NodeDict, point.Position, out var exists); + if (exists && exnode is not null && exnode.EntityPoint is null) { exnode.EntityPoint = point; } @@ -682,8 +660,8 @@ namespace CodeWalker.World } private ScenarioNode EnsureEntityNode(MCScenarioEntityOverride entity) { - ScenarioNode exnode; - if (NodeDict.TryGetValue(entity.Position, out exnode) && (exnode.Entity == null)) + ref var exnode = ref CollectionsMarshal.GetValueRefOrAddDefault(NodeDict, entity.Position, out var exists); + if (exists && exnode is not null && exnode.Entity is null) { exnode.Entity = entity; } @@ -703,40 +681,42 @@ namespace CodeWalker.World - public ScenarioNode AddNode(ScenarioNode copy = null) + public ScenarioNode AddNode(ScenarioNode? copy = null) { var n = new ScenarioNode(Ymt); var rgn = Ymt.CScenarioPointRegion; - if (copy != null) + if (copy is not null) { - if (copy.MyPoint != null) n.MyPoint = new MCScenarioPoint(rgn, copy.MyPoint); - if (copy.LoadSavePoint != null) n.LoadSavePoint = new MCExtensionDefSpawnPoint(rgn, copy.LoadSavePoint); - if (copy.ClusterMyPoint != null) + if (copy.MyPoint is not null) + n.MyPoint = new MCScenarioPoint(rgn, copy.MyPoint); + if (copy.LoadSavePoint is not null) + n.LoadSavePoint = new MCExtensionDefSpawnPoint(rgn, copy.LoadSavePoint); + if (copy.ClusterMyPoint is not null) { n.Cluster = copy.Cluster; n.ClusterMyPoint = new MCScenarioPoint(rgn, copy.ClusterMyPoint); } - else if (copy.ClusterLoadSavePoint != null) + else if (copy.ClusterLoadSavePoint is not null) { n.Cluster = copy.Cluster; n.ClusterLoadSavePoint = new MCExtensionDefSpawnPoint(rgn, copy.ClusterLoadSavePoint); } - else if (copy.Cluster != null) + else if (copy.Cluster is not null) { n.Cluster = new MCScenarioPointCluster(rgn, copy.Cluster); } - if (copy.EntityPoint != null) + if (copy.EntityPoint is not null) { n.Entity = copy.Entity; n.EntityPoint = new MCExtensionDefSpawnPoint(rgn, copy.EntityPoint); } - else if (copy.Entity != null) + else if (copy.Entity is not null) { n.Entity = new MCScenarioEntityOverride(rgn, copy.Entity); } - if (copy.ChainingNode != null) + if (copy.ChainingNode is not null) { n.ChainingNode = new MCScenarioChainingNode(rgn, copy.ChainingNode); n.ChainingNode.ScenarioNode = n; @@ -1046,7 +1026,8 @@ namespace CodeWalker.World public void RebuildAccelGrid() { - if (Region == null) return; + if (Region == null) + return; //find the grid extents, then sort points into the cell buckets. //output cell end point indexes to the accel grid data. @@ -1179,7 +1160,8 @@ namespace CodeWalker.World } public void RebuildLookUps() { - if (Region == null) return; + if (Region is null) + return; //find all unique hashes from the points, and assign new indices on points. @@ -1208,7 +1190,7 @@ namespace CodeWalker.World int interiorid = 0; int groupid = 0; int imapid = 0; - if ((mp.Type != null) && (!typeNames.TryGetValue(mp.Type.NameHash, out typeid))) + if (mp.Type != null && !typeNames.TryGetValue(mp.Type.NameHash, out typeid)) { typeid = typeNames.Count; typeNames[mp.Type.NameHash] = typeid; @@ -1233,17 +1215,17 @@ namespace CodeWalker.World } } } - if ((mp.InteriorName != 0) && (!interiorNames.TryGetValue(mp.InteriorName, out interiorid))) + if (mp.InteriorName != 0 && !interiorNames.TryGetValue(mp.InteriorName, out interiorid)) { interiorid = interiorNames.Count; interiorNames[mp.InteriorName] = interiorid; } - if ((mp.GroupName != 0) && (!groupNames.TryGetValue(mp.GroupName, out groupid))) + if (mp.GroupName != 0 && !groupNames.TryGetValue(mp.GroupName, out groupid)) { groupid = groupNames.Count; groupNames[mp.GroupName] = groupid; } - if ((mp.IMapName != 0) && (!imapNames.TryGetValue(mp.IMapName, out imapid))) + if (mp.IMapName != 0 && !imapNames.TryGetValue(mp.IMapName, out imapid)) { imapid = imapNames.Count; imapNames[mp.IMapName] = imapid; @@ -1254,44 +1236,39 @@ namespace CodeWalker.World mp.GroupId = (ushort)groupid; mp.IMapId = (byte)imapid; } - if (node.LoadSavePoint != null) + if (node.LoadSavePoint is not null) { var sp = node.LoadSavePoint; - int typeid = 0; - int modelsetid = 0; - int interiorid = 0; - int groupid = 0; - int imapid = 0; - if ((sp.SpawnType != 0) && (!typeNames.TryGetValue(sp.SpawnType, out typeid))) + if (sp.SpawnType != 0 && !typeNames.TryGetValue(sp.SpawnType, out var typeid)) { typeid = typeNames.Count; typeNames[sp.SpawnType] = typeid; } - if ((sp.PedType != 0) && (!pedModelSetNames.TryGetValue(sp.PedType, out modelsetid))) + if (sp.PedType != 0 && !pedModelSetNames.TryGetValue(sp.PedType, out var modelsetid)) { modelsetid = pedModelSetNames.Count; pedModelSetNames[sp.PedType] = modelsetid; } - if ((sp.Group != 0) && (!groupNames.TryGetValue(sp.Group, out groupid))) + if (sp.Group != 0 && !groupNames.TryGetValue(sp.Group, out var groupid)) { groupid = groupNames.Count; groupNames[sp.Group] = groupid; } - if ((sp.Interior != 0) && (!interiorNames.TryGetValue(sp.Interior, out interiorid))) + if (sp.Interior != 0 && !interiorNames.TryGetValue(sp.Interior, out var interiorid)) { interiorid = interiorNames.Count; interiorNames[sp.Interior] = interiorid; } - if ((sp.RequiredImap != 0) && (!imapNames.TryGetValue(sp.RequiredImap, out imapid))) + if (sp.RequiredImap != 0 && !imapNames.TryGetValue(sp.RequiredImap, out var imapid)) { imapid = imapNames.Count; imapNames[sp.RequiredImap] = imapid; } } - if (node.Cluster != null) - { - var cl = node.Cluster; - } + //if (node.Cluster is not null) + //{ + // var cl = node.Cluster; + //} if (node.ClusterMyPoint != null) { var mp = node.ClusterMyPoint; @@ -1300,7 +1277,7 @@ namespace CodeWalker.World int interiorid = 0; int groupid = 0; int imapid = 0; - if ((mp.Type != null) && (!typeNames.TryGetValue(mp.Type.NameHash, out typeid))) + if (mp.Type != null && !typeNames.TryGetValue(mp.Type.NameHash, out typeid)) { typeid = typeNames.Count; typeNames[mp.Type.NameHash] = typeid; @@ -1346,89 +1323,89 @@ namespace CodeWalker.World mp.GroupId = (ushort)groupid; mp.IMapId = (byte)imapid; } - if (node.ClusterLoadSavePoint != null) - { - var sp = node.ClusterLoadSavePoint; - //int typeid = 0; - //int modelsetid = 0; - //int interiorid = 0; - //int groupid = 0; - //int imapid = 0; - //if ((sp.SpawnType != 0) && (!typeNames.TryGetValue(sp.SpawnType, out typeid))) - //{ - // typeid = typeNames.Count; - // typeNames[sp.SpawnType] = typeid; - //} - //if ((sp.PedType != 0) && (!pedModelSetNames.TryGetValue(sp.PedType, out modelsetid))) - //{ - // modelsetid = pedModelSetNames.Count; - // pedModelSetNames[sp.PedType] = modelsetid; - //} - //if ((sp.Group != 0) && (!groupNames.TryGetValue(sp.Group, out groupid))) - //{ - // groupid = groupNames.Count; - // groupNames[sp.Group] = groupid; - //} - //if ((sp.Interior != 0) && (!interiorNames.TryGetValue(sp.Interior, out interiorid))) - //{ - // interiorid = interiorNames.Count; - // interiorNames[sp.Interior] = interiorid; - //} - //if ((sp.RequiredImap != 0) && (!imapNames.TryGetValue(sp.RequiredImap, out imapid))) - //{ - // imapid = imapNames.Count; - // imapNames[sp.RequiredImap] = imapid; - //} - } - if (node.Entity != null) - { - var en = node.Entity; - } - if (node.EntityPoint != null) - { - var sp = node.EntityPoint; - //int typeid = 0; - //int modelsetid = 0; - //int interiorid = 0; - //int groupid = 0; - //int imapid = 0; - //if ((sp.SpawnType != 0) && (!typeNames.TryGetValue(sp.SpawnType, out typeid))) - //{ - // typeid = typeNames.Count; - // typeNames[sp.SpawnType] = typeid; - //} - //if ((sp.PedType != 0) && (!pedModelSetNames.TryGetValue(sp.PedType, out modelsetid))) - //{ - // modelsetid = pedModelSetNames.Count; - // pedModelSetNames[sp.PedType] = modelsetid; - //} - //if ((sp.Group != 0) && (!groupNames.TryGetValue(sp.Group, out groupid))) - //{ - // groupid = groupNames.Count; - // groupNames[sp.Group] = groupid; - //} - //if ((sp.Interior != 0) && (!interiorNames.TryGetValue(sp.Interior, out interiorid))) - //{ - // interiorid = interiorNames.Count; - // interiorNames[sp.Interior] = interiorid; - //} - //if ((sp.RequiredImap != 0) && (!imapNames.TryGetValue(sp.RequiredImap, out imapid))) - //{ - // imapid = imapNames.Count; - // imapNames[sp.RequiredImap] = imapid; - //} - } - if (node.ChainingNode != null) - { - var cn = node.ChainingNode; - //int typeid = 0; - //if ((cn.Type != null) && (!typeNames.TryGetValue(cn.Type.NameHash, out typeid))) - //{ - // typeid = typeNames.Count; - // typeNames[cn.Type.NameHash] = typeid; - //} - //cn.TypeHash = cn.Type?.NameHash ?? 0; - } + //if (node.ClusterLoadSavePoint != null) + //{ + // var sp = node.ClusterLoadSavePoint; + // //int typeid = 0; + // //int modelsetid = 0; + // //int interiorid = 0; + // //int groupid = 0; + // //int imapid = 0; + // //if ((sp.SpawnType != 0) && (!typeNames.TryGetValue(sp.SpawnType, out typeid))) + // //{ + // // typeid = typeNames.Count; + // // typeNames[sp.SpawnType] = typeid; + // //} + // //if ((sp.PedType != 0) && (!pedModelSetNames.TryGetValue(sp.PedType, out modelsetid))) + // //{ + // // modelsetid = pedModelSetNames.Count; + // // pedModelSetNames[sp.PedType] = modelsetid; + // //} + // //if ((sp.Group != 0) && (!groupNames.TryGetValue(sp.Group, out groupid))) + // //{ + // // groupid = groupNames.Count; + // // groupNames[sp.Group] = groupid; + // //} + // //if ((sp.Interior != 0) && (!interiorNames.TryGetValue(sp.Interior, out interiorid))) + // //{ + // // interiorid = interiorNames.Count; + // // interiorNames[sp.Interior] = interiorid; + // //} + // //if ((sp.RequiredImap != 0) && (!imapNames.TryGetValue(sp.RequiredImap, out imapid))) + // //{ + // // imapid = imapNames.Count; + // // imapNames[sp.RequiredImap] = imapid; + // //} + //} + //if (node.Entity != null) + //{ + // var en = node.Entity; + //} + //if (node.EntityPoint != null) + //{ + // var sp = node.EntityPoint; + // //int typeid = 0; + // //int modelsetid = 0; + // //int interiorid = 0; + // //int groupid = 0; + // //int imapid = 0; + // //if ((sp.SpawnType != 0) && (!typeNames.TryGetValue(sp.SpawnType, out typeid))) + // //{ + // // typeid = typeNames.Count; + // // typeNames[sp.SpawnType] = typeid; + // //} + // //if ((sp.PedType != 0) && (!pedModelSetNames.TryGetValue(sp.PedType, out modelsetid))) + // //{ + // // modelsetid = pedModelSetNames.Count; + // // pedModelSetNames[sp.PedType] = modelsetid; + // //} + // //if ((sp.Group != 0) && (!groupNames.TryGetValue(sp.Group, out groupid))) + // //{ + // // groupid = groupNames.Count; + // // groupNames[sp.Group] = groupid; + // //} + // //if ((sp.Interior != 0) && (!interiorNames.TryGetValue(sp.Interior, out interiorid))) + // //{ + // // interiorid = interiorNames.Count; + // // interiorNames[sp.Interior] = interiorid; + // //} + // //if ((sp.RequiredImap != 0) && (!imapNames.TryGetValue(sp.RequiredImap, out imapid))) + // //{ + // // imapid = imapNames.Count; + // // imapNames[sp.RequiredImap] = imapid; + // //} + //} + //if (node.ChainingNode != null) + //{ + // var cn = node.ChainingNode; + // //int typeid = 0; + // //if ((cn.Type != null) && (!typeNames.TryGetValue(cn.Type.NameHash, out typeid))) + // //{ + // // typeid = typeNames.Count; + // // typeNames[cn.Type.NameHash] = typeid; + // //} + // //cn.TypeHash = cn.Type?.NameHash ?? 0; + //} } @@ -1441,42 +1418,42 @@ namespace CodeWalker.World foreach (var kvp in typeNames) { if (kvp.Value >= htypeNames.Length) - { continue; } + continue; htypeNames[kvp.Value] = kvp.Key; } foreach (var kvp in pedModelSetNames) { if (kvp.Value >= hpedModelSetNames.Length) - { continue; } + continue; hpedModelSetNames[kvp.Value] = kvp.Key; } foreach (var kvp in vehicleModelSetNames) { if (kvp.Value >= hvehicleModelSetNames.Length) - { continue; } + continue; hvehicleModelSetNames[kvp.Value] = kvp.Key; } foreach (var kvp in interiorNames) { if (kvp.Value >= hinteriorNames.Length) - { continue; } + continue; hinteriorNames[kvp.Value] = kvp.Key; } foreach (var kvp in groupNames) { if (kvp.Value >= hgroupNames.Length) - { continue; } + continue; hgroupNames[kvp.Value] = kvp.Key; } foreach (var kvp in imapNames) { if (kvp.Value >= himapNames.Length) - { continue; } + continue; himapNames[kvp.Value] = kvp.Key; } - if (Region.LookUps == null) + if (Region.LookUps is null) { Region.LookUps = new MCScenarioPointLookUps(); Region.LookUps.Region = Region; @@ -1494,7 +1471,7 @@ namespace CodeWalker.World } public void RebuildChains() { - if (Region == null) return; + if (Region is null) return; //update chain nodes array, update from/to indexes //currently not necessary - editor updates indexes and arrays already. @@ -1510,7 +1487,8 @@ namespace CodeWalker.World - [TypeConverter(typeof(ExpandableObjectConverter))] public class ScenarioNode : BasePathNode + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ScenarioNode : BasePathNode { public YmtFile Ymt { get; set; } public MCScenarioPointRegion Region { get; set; } @@ -1524,21 +1502,40 @@ namespace CodeWalker.World public MCExtensionDefSpawnPoint EntityPoint { get; set; } public MCScenarioChainingNode ChainingNode { get; set; } - public Vector3 Position { get; set; } - public Quaternion Orientation { get; set; } = Quaternion.Identity; + public Vector3 _Position; + public ref Vector3 Position => ref _Position; + + public Quaternion _Orientation = Quaternion.Identity; + public ref Quaternion Orientation => ref _Orientation; public string ShortTypeName { get { - if (MyPoint != null) return "ScenarioPoint"; - if (LoadSavePoint != null) return "ScenarioPoint"; - if (ClusterMyPoint != null) return "ScenarioPoint"; - if (ClusterLoadSavePoint != null) return "ScenarioPoint"; - if (Cluster != null) return "ScenarioCluster"; - if (EntityPoint != null) return "ScenarioPoint"; - if (Entity != null) return "ScenarioPoint"; - if (ChainingNode != null) return "ScenarioPoint"; + if (MyPoint is not null) + return "ScenarioPoint"; + + if (LoadSavePoint is not null) + return "ScenarioPoint"; + + if (ClusterMyPoint is not null) + return "ScenarioPoint"; + + if (ClusterLoadSavePoint is not null) + return "ScenarioPoint"; + + if (Cluster is not null) + return "ScenarioCluster"; + + if (EntityPoint is not null) + return "ScenarioPoint"; + + if (Entity is not null) + return "ScenarioPoint"; + + if (ChainingNode is not null) + return "ScenarioPoint"; + return "ScenarioPoint"; } } @@ -1546,14 +1543,30 @@ namespace CodeWalker.World { get { - if (MyPoint != null) return "Scenario MyPoint"; - if (LoadSavePoint != null) return "Scenario LoadSavePoint"; - if (ClusterMyPoint != null) return "Scenario Cluster MyPoint"; - if (ClusterLoadSavePoint != null) return "Scenario Cluster LoadSavePoint"; - if (Cluster != null) return "Scenario Cluster"; - if (EntityPoint != null) return "Scenario Entity Override Point"; - if (Entity != null) return "Scenario Entity Override"; - if (ChainingNode != null) return "Scenario Chaining Node"; + if (MyPoint is not null) + return "Scenario MyPoint"; + + if (LoadSavePoint is not null) + return "Scenario LoadSavePoint"; + + if (ClusterMyPoint is not null) + return "Scenario Cluster MyPoint"; + + if (ClusterLoadSavePoint is not null) + return "Scenario Cluster LoadSavePoint"; + + if (Cluster is not null) + return "Scenario Cluster"; + + if (EntityPoint is not null) + return "Scenario Entity Override Point"; + + if (Entity is not null) + return "Scenario Entity Override"; + + if (ChainingNode is not null) + return "Scenario Chaining Node"; + return "Scenario Point"; } } @@ -1561,14 +1574,22 @@ namespace CodeWalker.World { get { - if (MyPoint != null) return "MyPoint"; - if (LoadSavePoint != null) return "LoadSavePoint"; - if (ClusterMyPoint != null) return "Cluster MyPoint"; - if (ClusterLoadSavePoint != null) return "Cluster LoadSavePoint"; - if (Cluster != null) return "Cluster"; - if (EntityPoint != null) return "Entity Override Point"; - if (Entity != null) return "Entity Override"; - if (ChainingNode != null) return "Chaining Node"; + if (MyPoint is not null) + return "MyPoint"; + if (LoadSavePoint is not null) + return "LoadSavePoint"; + if (ClusterMyPoint is not null) + return "Cluster MyPoint"; + if (ClusterLoadSavePoint is not null) + return "Cluster LoadSavePoint"; + if (Cluster is not null) + return "Cluster"; + if (EntityPoint is not null) + return "Entity Override Point"; + if (Entity is not null) + return "Entity Override"; + if (ChainingNode is not null) + return "Chaining Node"; return "Point"; } } @@ -1576,14 +1597,30 @@ namespace CodeWalker.World { get { - if (MyPoint != null) return MyPoint.ToString(); - if (LoadSavePoint != null) return LoadSavePoint.ToString(); - if (ClusterMyPoint != null) return ClusterMyPoint.ToString(); - if (ClusterLoadSavePoint != null) return ClusterLoadSavePoint.ToString(); - if (Cluster != null) return Cluster.ToString(); - if (EntityPoint != null) return EntityPoint.ToString(); - if (Entity != null) return Entity.ToString(); - if (ChainingNode != null) return ChainingNode.ToString(); + if (MyPoint is not null) + return MyPoint.ToString(); + + if (LoadSavePoint is not null) + return LoadSavePoint.ToString(); + + if (ClusterMyPoint is not null) + return ClusterMyPoint.ToString(); + + if (ClusterLoadSavePoint is not null) + return ClusterLoadSavePoint.ToString(); + + if (Cluster is not null) + return Cluster.ToString(); + + if (EntityPoint is not null) + return EntityPoint.ToString(); + + if (Entity is not null) + return Entity.ToString(); + + if (ChainingNode is not null) + return ChainingNode.ToString(); + return FloatUtil.GetVector3String(Position); } } @@ -1601,34 +1638,58 @@ namespace CodeWalker.World { Position = position; - if (MyPoint != null) MyPoint.Position = position; - if (LoadSavePoint != null) LoadSavePoint.Position = position; - if (ClusterMyPoint != null) ClusterMyPoint.Position = position; - if (ClusterLoadSavePoint != null) ClusterLoadSavePoint.Position = position; - if ((Cluster != null) && (ClusterMyPoint == null) && (ClusterLoadSavePoint == null)) Cluster.Position = position; - if (EntityPoint != null) EntityPoint.Position = position; - if ((Entity != null) && (EntityPoint == null)) Entity.Position = position; - if (ChainingNode != null) ChainingNode.Position = position; + if (MyPoint is not null) + MyPoint.Position = position; + + if (LoadSavePoint is not null) + LoadSavePoint.Position = position; + + if (ClusterMyPoint is not null) + ClusterMyPoint.Position = position; + + if (ClusterLoadSavePoint is not null) + ClusterLoadSavePoint.Position = position; + + if (Cluster is not null && ClusterMyPoint is null && ClusterLoadSavePoint is null) + Cluster.Position = position; + + if (EntityPoint is not null) + EntityPoint.Position = position; + + if (Entity is not null && EntityPoint is null) + Entity.Position = position; + + if (ChainingNode is not null) + ChainingNode.Position = position; } public void SetOrientation(Quaternion orientation) { Orientation = orientation; - if (MyPoint != null) MyPoint.Orientation = orientation; - if (LoadSavePoint != null) LoadSavePoint.Orientation = orientation; - if (ClusterMyPoint != null) ClusterMyPoint.Orientation = orientation; - if (ClusterLoadSavePoint != null) ClusterLoadSavePoint.Orientation = orientation; + if (MyPoint is not null) + MyPoint.Orientation = orientation; + + if (LoadSavePoint is not null) + LoadSavePoint.Orientation = orientation; + + if (ClusterMyPoint is not null) + ClusterMyPoint.Orientation = orientation; + + if (ClusterLoadSavePoint is not null) + ClusterLoadSavePoint.Orientation = orientation; + //if (Cluster != null) Cluster.Orientation = orientation; - if (EntityPoint != null) EntityPoint.Orientation = orientation; + if (EntityPoint is not null) + EntityPoint.Orientation = orientation; + //if (Entity != null) Entity.Orientation = orientation; //if (ChainingNode != null) ChainingNode.Orientation = orientation; } - public override string ToString() { - return MedTypeName + " " + StringText; + return $"{MedTypeName} {StringText}"; } } @@ -1640,7 +1701,7 @@ namespace CodeWalker.World public class ScenarioTypes { - private object SyncRoot = new object(); //keep this thread-safe.. technically shouldn't be necessary, but best to be safe + private readonly object SyncRoot = new object(); //keep this thread-safe.. technically shouldn't be necessary, but best to be safe private Dictionary TypeRefs { get; set; } private Dictionary Types { get; set; } @@ -1663,7 +1724,7 @@ namespace CodeWalker.World VehicleModelSets = LoadModelSets(gfc, "common:\\data\\ai\\vehiclemodelsets.meta"); AnimGroups = LoadAnimGroups(gfc, "common:\\data\\ai\\conditionalanims.meta"); - TypeRefs = new Dictionary(); + TypeRefs = new Dictionary(Types.Count + TypeGroups.Count); foreach (var kvp in Types) { TypeRefs[kvp.Key] = new ScenarioTypeRef(kvp.Value); @@ -1695,7 +1756,7 @@ namespace CodeWalker.World var xml = LoadXml(gfc, filename); - if ((xml == null) || (xml.DocumentElement == null)) + if (xml?.DocumentElement is null) { return types; } @@ -1706,7 +1767,7 @@ namespace CodeWalker.World foreach (XmlNode item in items) { var typestr = Xml.GetStringAttribute(item, "type"); - ScenarioType typeobj = null; + ScenarioType typeobj; switch (typestr) { case "CScenarioPlayAnimsInfo": @@ -1728,17 +1789,15 @@ namespace CodeWalker.World break; } - if (typeobj != null) + if (typeobj is not null) { typeobj.Load(item); - if (!string.IsNullOrEmpty(typeobj.NameLower)) + if (!string.IsNullOrEmpty(typeobj.Name)) { - JenkIndex.Ensure(typeobj.NameLower); - uint hash = JenkHash.GenHash(typeobj.NameLower); + JenkIndex.EnsureLower(typeobj.Name); + uint hash = JenkHash.GenHashLower(typeobj.Name); types[hash] = typeobj; } - else - { } } } @@ -1754,7 +1813,7 @@ namespace CodeWalker.World var xml = LoadXml(gfc, filename); - if ((xml == null) || (xml.DocumentElement == null)) + if (xml?.DocumentElement == null) { return types; } @@ -1767,14 +1826,12 @@ namespace CodeWalker.World ScenarioTypeGroup group = new ScenarioTypeGroup(); group.Load(item); - if (!string.IsNullOrEmpty(group.NameLower)) + if (!string.IsNullOrEmpty(group.Name)) { - JenkIndex.Ensure(group.NameLower); - uint hash = JenkHash.GenHash(group.NameLower); + JenkIndex.EnsureLower(group.Name); + uint hash = JenkHash.GenHashLower(group.Name); types[hash] = group; } - else - { } } JenkIndex.Ensure("none"); @@ -1788,7 +1845,7 @@ namespace CodeWalker.World var xml = LoadXml(gfc, filename); - if ((xml == null) || (xml.DocumentElement == null)) + if (xml?.DocumentElement == null) { return sets; } @@ -1796,7 +1853,6 @@ namespace CodeWalker.World var setsxml = xml.DocumentElement; var items = setsxml.SelectNodes("ModelSets/Item"); - var noneset = new AmbientModelSet(); noneset.Name = "NONE"; noneset.NameHash = JenkHash.GenHash("none"); @@ -1824,7 +1880,7 @@ namespace CodeWalker.World var xml = LoadXml(gfc, filename); - if ((xml == null) || (xml.DocumentElement == null)) + if (xml?.DocumentElement == null) { return groups; } @@ -1852,87 +1908,89 @@ namespace CodeWalker.World - public ScenarioTypeRef GetScenarioTypeRef(uint hash) + public ScenarioTypeRef? GetScenarioTypeRef(uint hash) { lock (SyncRoot) { - if (TypeRefs == null) return null; + if (TypeRefs == null) + return null; ScenarioTypeRef st; TypeRefs.TryGetValue(hash, out st); return st; } } - public ScenarioType GetScenarioType(uint hash) + public ScenarioType? GetScenarioType(uint hash) { lock (SyncRoot) { - if (Types == null) return null; - ScenarioType st; - Types.TryGetValue(hash, out st); + if (Types == null) + return null; + Types.TryGetValue(hash, out var st); return st; } } - public ScenarioTypeGroup GetScenarioTypeGroup(uint hash) + public ScenarioTypeGroup? GetScenarioTypeGroup(uint hash) { lock (SyncRoot) { - if (TypeGroups == null) return null; - ScenarioTypeGroup tg; - TypeGroups.TryGetValue(hash, out tg); + if (TypeGroups == null) + return null; + TypeGroups.TryGetValue(hash, out var tg); return tg; } } - public AmbientModelSet GetPropSet(uint hash) + public AmbientModelSet? GetPropSet(uint hash) { lock (SyncRoot) { - if (PropSets == null) return null; - AmbientModelSet ms; - PropSets.TryGetValue(hash, out ms); + if (PropSets == null) + return null; + PropSets.TryGetValue(hash, out var ms); return ms; } } - public AmbientModelSet GetPedModelSet(uint hash) + public AmbientModelSet? GetPedModelSet(uint hash) { lock (SyncRoot) { - if (PedModelSets == null) return null; - AmbientModelSet ms; - if(!PedModelSets.TryGetValue(hash, out ms)) + if (PedModelSets == null) + return null; + if(!PedModelSets.TryGetValue(hash, out var ms)) { string s_hash = hash.ToString("X"); ms = new AmbientModelSet(); ms.Name = $"UNKNOWN PED MODELSET ({s_hash})"; ms.NameHash = new MetaHash(hash); - ms.Models = new AmbientModel[] { }; + ms.Models = []; PedModelSets.Add(hash, ms); } return ms; } } - public AmbientModelSet GetVehicleModelSet(uint hash) + public AmbientModelSet? GetVehicleModelSet(uint hash) { lock (SyncRoot) { - if (VehicleModelSets == null) return null; - AmbientModelSet ms; - if(!VehicleModelSets.TryGetValue(hash, out ms)) + if (VehicleModelSets == null) + return null; + if(!VehicleModelSets.TryGetValue(hash, out var ms)) { string s_hash = hash.ToString("X"); ms = new AmbientModelSet(); ms.Name = $"UNKNOWN VEHICLE MODELSET ({s_hash})"; ms.NameHash = new MetaHash(hash); - ms.Models = new AmbientModel[] {}; + ms.Models = []; VehicleModelSets.Add(hash, ms); } return ms; } } - public ConditionalAnimsGroup GetAnimGroup(uint hash) + public ConditionalAnimsGroup? GetAnimGroup(uint hash) { lock (SyncRoot) { - if (AnimGroups == null) return null; + if (AnimGroups == null) + return null; ConditionalAnimsGroup ag; AnimGroups.TryGetValue(hash, out ag); return ag; @@ -1943,7 +2001,8 @@ namespace CodeWalker.World { lock (SyncRoot) { - if (TypeRefs == null) return null; + if (TypeRefs == null) + return []; return TypeRefs.Values.ToArray(); } } @@ -1951,7 +2010,8 @@ namespace CodeWalker.World { lock (SyncRoot) { - if (Types == null) return null; + if (Types == null) + return []; return Types.Values.ToArray(); } } @@ -1959,7 +2019,8 @@ namespace CodeWalker.World { lock (SyncRoot) { - if (TypeGroups == null) return null; + if (TypeGroups == null) + return []; return TypeGroups.Values.ToArray(); } } @@ -1967,7 +2028,8 @@ namespace CodeWalker.World { lock (SyncRoot) { - if (PropSets == null) return null; + if (PropSets == null) + return []; return PropSets.Values.ToArray(); } } @@ -1975,7 +2037,8 @@ namespace CodeWalker.World { lock (SyncRoot) { - if (PedModelSets == null) return null; + if (PedModelSets == null) + return []; return PedModelSets.Values.ToArray(); } } @@ -1983,7 +2046,8 @@ namespace CodeWalker.World { lock (SyncRoot) { - if (VehicleModelSets == null) return null; + if (VehicleModelSets == null) + return []; return VehicleModelSets.Values.ToArray(); } } @@ -1991,14 +2055,16 @@ namespace CodeWalker.World { lock (SyncRoot) { - if (AnimGroups == null) return null; + if (AnimGroups == null) + return []; return AnimGroups.Values.ToArray(); } } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ScenarioTypeRef + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ScenarioTypeRef { /// /// Represents a scenario type that may either be a or a . @@ -2006,7 +2072,6 @@ namespace CodeWalker.World /// public string Name => IsGroup ? Group.Name : Type.Name; - public string NameLower => IsGroup ? Group.NameLower : Type.NameLower; public MetaHash NameHash => IsGroup ? Group.NameHash : Type.NameHash; public bool IsVehicle => IsGroup ? false : Type.IsVehicle; // groups don't support vehicle infos, so always false public string VehicleModelSet => IsGroup ? null : Type.VehicleModelSet; @@ -2037,23 +2102,20 @@ namespace CodeWalker.World } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ScenarioType + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ScenarioType { - public string OuterXml { get; set; } - public string Name { get; set; } - public string NameLower { get; set; } + public string? Name { get; set; } public MetaHash NameHash { get; set; } public bool IsVehicle { get; set; } - public string VehicleModelSet { get; set; } + public string? VehicleModelSet { get; set; } public MetaHash VehicleModelSetHash { get; set; } public virtual void Load(XmlNode node) { - OuterXml = node.OuterXml; Name = Xml.GetChildInnerText(node, "Name"); - NameLower = Name.ToLowerInvariant(); - NameHash = JenkHash.GenHash(NameLower); + NameHash = JenkHash.GenHashLower(Name); if (IsVehicle) @@ -2061,12 +2123,12 @@ namespace CodeWalker.World VehicleModelSet = Xml.GetChildStringAttribute(node, "VehicleModelSet", "ref"); if (!string.IsNullOrEmpty(VehicleModelSet) && (VehicleModelSet != "NULL")) { - VehicleModelSetHash = JenkHash.GenHash(VehicleModelSet.ToLowerInvariant()); + VehicleModelSetHash = JenkHash.GenHashLower(VehicleModelSet); } } } - public override string ToString() + public override string? ToString() { return Name; } @@ -2081,26 +2143,20 @@ namespace CodeWalker.World } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ScenarioTypeGroup + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ScenarioTypeGroup { - public string OuterXml { get; set; } public string Name { get; set; } - public string NameLower { get; set; } public MetaHash NameHash { get; set; } public void Load(XmlNode node) { - OuterXml = node.OuterXml; Name = Xml.GetChildInnerText(node, "Name"); - NameLower = Name.ToLowerInvariant(); - NameHash = JenkHash.GenHash(NameLower); + NameHash = JenkHash.GenHashLower(Name); } - public override string ToString() - { - return Name; - } + public override string ToString() => Name; } @@ -2182,15 +2238,14 @@ namespace CodeWalker.World } - [TypeConverter(typeof(ExpandableObjectConverter))] public class ConditionalAnimsGroup + [TypeConverter(typeof(ExpandableObjectConverter))] + public class ConditionalAnimsGroup { - public string OuterXml { get; set; } public string Name { get; set; } public void Load(XmlNode node) { - OuterXml = node.OuterXml; Name = Xml.GetChildInnerText(node, "Name"); } diff --git a/CodeWalker.Core/World/Space.cs b/CodeWalker.Core/World/Space.cs index b6df1dd..2ffa429 100644 --- a/CodeWalker.Core/World/Space.cs +++ b/CodeWalker.Core/World/Space.cs @@ -1,9 +1,13 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; +using Collections.Pooled; +using CommunityToolkit.HighPerformance; using SharpDX; using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace CodeWalker.World { @@ -50,48 +54,50 @@ namespace CodeWalker.World private MetaHash CurrentWeather; - public void Init(GameFileCache gameFileCache, Action updateStatus) + public async Task InitAsync(GameFileCache gameFileCache, Action? updateStatus) { + using var _ = new DisposableTimer("Space Init"); GameFileCache = gameFileCache; - updateStatus("Scanning manifests..."); + updateStatus?.Invoke("Scanning manifests..."); InitManifestData(); - updateStatus("Scanning caches..."); + updateStatus?.Invoke("Scanning caches..."); - InitCacheData(); + await InitCacheDataAsync(); - updateStatus("Building map data store..."); + updateStatus?.Invoke("Building map data store..."); InitMapDataStore(); - updateStatus("Building bounds store..."); + updateStatus?.Invoke("Building bounds store..."); InitBoundsStore(); - updateStatus("Loading paths..."); + updateStatus?.Invoke("Loading paths..."); InitNodeGrid(); - updateStatus("Loading nav meshes..."); + updateStatus?.Invoke("Loading nav meshes..."); InitNavGrid(); Inited = true; - updateStatus("World initialised."); + updateStatus?.Invoke("World initialised."); } private void InitManifestData() { + using var _ = new DisposableTimer("InitManifestData"); interiorLookup.Clear(); interiorManifest.Clear(); ymaptimes.Clear(); @@ -102,54 +108,40 @@ namespace CodeWalker.World foreach (var manifest in manifests) { //build interior lookup - maps child->parent interior bounds - if (manifest.Interiors != null) - { - foreach (var interior in manifest.Interiors) - { - var intname = interior.Interior.Name; - if (interiorManifest.ContainsKey(intname)) - { } - interiorManifest[intname] = interior; - if (interior.Bounds != null) + foreach(var interior in manifest.Interiors) + { + var intname = interior.Interior.Name; + interiorManifest[intname] = interior; + + if (interior.Bounds != null) + { + foreach (var intbound in interior.Bounds) { - foreach (var intbound in interior.Bounds) - { - if (interiorLookup.ContainsKey(intbound)) - { }//updates can hit here - interiorLookup[intbound] = intname; - } + interiorLookup[intbound] = intname; } - else - { } } } //these appear to be all the dynamic "togglable" ymaps.... - if (manifest.MapDataGroups != null) + if (manifest.MapDataGroups.Length > 0) { - foreach (var mapgroup in manifest.MapDataGroups) + foreach(var mapgroup in manifest.MapDataGroups) { if (mapgroup.HoursOnOff != 0) { ymaptimes[mapgroup.Name] = mapgroup.HoursOnOff; } - if (mapgroup.WeatherTypes != null) + if (mapgroup.WeatherTypes.Length > 0) { ymapweathertypes[mapgroup.Name] = mapgroup.WeatherTypes; } if (dataGroupDict.ContainsKey(mapgroup.DataGroup.Name)) { - if (mapgroup.Bounds != null) + if (mapgroup.Bounds.Length == 0) { - var ex = dataGroupDict[mapgroup.DataGroup.Name]; - if (ex.Bounds != null) - { } //only 1 hit here - redcarpet - } - else - { - continue;//nothing to replace with + continue; } } dataGroupDict[mapgroup.DataGroup.Name] = mapgroup; @@ -174,178 +166,167 @@ namespace CodeWalker.World } - private void InitCacheData() + private async Task InitCacheDataAsync() { //build the grid from the cached data + using var _ = new DisposableTimer("InitCacheDataAsync"); var caches = GameFileCache.AllCacheFiles; - nodedict = new Dictionary(); - MetaHash inthash; - List intlist = new List(); - boundsdict = new Dictionary(); - usedboundsdict = new Dictionary(); - interiorProxies = new Dictionary(); + nodedict = new Dictionary(6000); + //List intlist = new List(); + boundsdict = new Dictionary(10000); + usedboundsdict = new Dictionary(10000); + interiorProxies = new Dictionary(1000); - Dictionary filedates = new Dictionary(); - Dictionary filedates2 = new Dictionary(); + //Dictionary filedates = new Dictionary(1500); + //Dictionary filedates2 = new Dictionary(1500); - foreach (var cache in caches) + using(new DisposableTimer("caches loop")) { - foreach (var filedate in cache.FileDates) + foreach (var cache in caches) { - CacheFileDate exdate; - if (filedates.TryGetValue(filedate.FileName, out exdate)) + //foreach (var filedate in cache.FileDates) + //{ + // if (filedates.TryGetValue(filedate.FileName, out CacheFileDate? exdate)) + // { + // if (filedate.TimeStamp >= exdate.TimeStamp) + // { + // filedates[filedate.FileName] = filedate; + // } + // } + // else + // { + // filedates[filedate.FileName] = filedate; + // } + + // if (filedates2.TryGetValue(filedate.FileID, out exdate)) + // { + // if (filedate.TimeStamp >= exdate.TimeStamp) + // { + // filedates2[filedate.FileID] = filedate; + // } + // } + // else + // { + // filedates2[filedate.FileID] = filedate; + // } + + //} + + + foreach (var node in cache.AllMapNodes) { - if (filedate.TimeStamp >= exdate.TimeStamp) + if (!GameFileCache.YmapDict.ContainsKey(node.Name)) + continue; + nodedict[node.Name] = node; + } + + foreach (var intprx in cache.AllCInteriorProxies) + { + //these might need to go into the grid. which grid..? + //but might need to map back to the bounds store... this has more info though! + SpaceBoundsKey key = new SpaceBoundsKey(intprx.Name, intprx.Position); + //if (interiorProxies.ContainsKey(key)) + //{ }//updates/dlc hit here + interiorProxies[key] = intprx; + } + + foreach (var item in cache.AllBoundsStoreItems) + { + if (!GameFileCache.YbnDict.ContainsKey(item.Name)) + continue; + + if (!interiorLookup.TryGetValue(item.Name, out var inthash)) { - filedates[filedate.FileName] = filedate; + SpaceBoundsKey key = new SpaceBoundsKey(item.Name, item.Min); + boundsdict[key] = item; } - else //if (filedate.TimeStamp < exdate.TimeStamp) - { } - } - else - { - filedates[filedate.FileName] = filedate; + //else + //{ + // intlist.Add(item);//handle it later? use the parent for a dict? + //} + usedboundsdict[item.Name] = item; } - if (filedates2.TryGetValue(filedate.FileID, out exdate)) - { - if (filedate.FileName != exdate.FileName) - { } - if (filedate.TimeStamp >= exdate.TimeStamp) - { - filedates2[filedate.FileID] = filedate; - } - else - { } - } - else - { - filedates2[filedate.FileID] = filedate; - } - - } - - - - foreach (var node in cache.AllMapNodes) - { - if (!GameFileCache.YmapDict.ContainsKey(node.Name)) - { continue; } - nodedict[node.Name] = node; - } - - foreach (var intprx in cache.AllCInteriorProxies) - { - //these might need to go into the grid. which grid..? - //but might need to map back to the bounds store... this has more info though! - SpaceBoundsKey key = new SpaceBoundsKey(intprx.Name, intprx.Position); - if (interiorProxies.ContainsKey(key)) - { }//updates/dlc hit here - interiorProxies[key] = intprx; - } - - foreach (var item in cache.AllBoundsStoreItems) - { - if (!GameFileCache.YbnDict.ContainsKey(item.Name)) - { continue; } - - if ((item.Layer < 0) || (item.Layer > 3)) - { } //won't hit here.. - if (interiorLookup.TryGetValue(item.Name, out inthash)) - { - //it's an interior... the vectors are in local space... - intlist.Add(item);//handle it later? use the parent for a dict? - } - else //interiors filtered out - { - SpaceBoundsKey key = new SpaceBoundsKey(item.Name, item.Min); - if (boundsdict.ContainsKey(key)) - { }//updates/dlc hit here - boundsdict[key] = item; - - } - usedboundsdict[item.Name] = item; } } - - //try and generate the cache data for uncached ymaps... mainly for mod maps! - var maprpfs = GameFileCache.ActiveMapRpfFiles; - foreach (var maprpf in maprpfs.Values) + using var ymapTimer = new DisposableTimer("ymaps"); + using var ybnTimer = new DisposableTimer("ybns"); + using(new DisposableTimer("maprpfs.Values")) { - foreach (var entry in maprpf.AllEntries) + //try and generate the cache data for uncached ymaps... mainly for mod maps! + var maprpfs = GameFileCache.ActiveMapRpfFiles; + foreach (var maprpf in maprpfs.Values) { - if (entry.IsExtension(".ymap")) + foreach (var entry in maprpf.AllEntries) { - if (!nodedict.ContainsKey(new MetaHash(entry.ShortNameHash))) + if (entry.IsExtension(".ymap")) { - //non-cached ymap. mostly only mods... but some interesting test things also - var ymap = GameFileCache.RpfMan.GetFile(entry); - if (ymap != null) + if (!nodedict.ContainsKey(new MetaHash(entry.ShortNameHash))) { - MapDataStoreNode dsn = new MapDataStoreNode(ymap); - if (dsn.Name != 0) + //non-cached ymap. mostly only mods... but some interesting test things also + var ymap = await RpfManager.GetFileAsync(entry); + if (ymap is not null) { - nodedict[dsn.Name] = dsn;//perhaps should add as entry.ShortNameHash? + MapDataStoreNode dsn = new MapDataStoreNode(ymap); + if (dsn.Name != 0) + { + nodedict[dsn.Name] = dsn;//perhaps should add as entry.ShortNameHash? + } } - else - { } } - else - { } } - } - if (entry.IsExtension(".ybn")) - { - MetaHash ehash = new MetaHash(entry.ShortNameHash); - if (!usedboundsdict.ContainsKey(ehash)) + if (entry.IsExtension(".ybn")) { - if (interiorLookup.ContainsKey(ehash)) + MetaHash ehash = new MetaHash(entry.ShortNameHash); + if (!usedboundsdict.ContainsKey(ehash)) { - } - else - { - //exterior ybn's that aren't already cached... only noncached modded bounds hit here... - //load the ybn and cache its extents. - var ybn = GameFileCache.RpfMan.GetFile(entry); - BoundsStoreItem item = new BoundsStoreItem(ybn.Bounds); - item.Name = ehash; - SpaceBoundsKey key = new SpaceBoundsKey(ehash, item.Min); - if (boundsdict.ContainsKey(key)) - { } - boundsdict[key] = item; + if (!interiorLookup.ContainsKey(ehash)) + { + //exterior ybn's that aren't already cached... only noncached modded bounds hit here... + //load the ybn and cache its extents. + var ybn = await RpfManager.GetFileAsync(entry); + if (ybn is not null) + { + BoundsStoreItem item = new BoundsStoreItem(ybn.Bounds); + item.Name = ehash; + SpaceBoundsKey key = new SpaceBoundsKey(ehash, item.Min); + boundsdict[key] = item; + } + } } } } } } + Console.WriteLine($"nodedict: {nodedict.Count}; boundsdict: {boundsdict.Count}; usedboundsdict: {usedboundsdict.Count}; interiorProxies: {interiorProxies.Count}"); } private void InitMapDataStore() { - + using var _ = new DisposableTimer("InitMapDataStore"); MapDataStore = new SpaceMapDataStore(); - MapDataStore.Init(nodedict.Values.ToList()); + MapDataStore.Init(nodedict.Values); } private void InitBoundsStore() { - + using var _ = new DisposableTimer("InitBoundsStore"); BoundsStore = new SpaceBoundsStore(); - BoundsStore.Init(boundsdict.Values.ToList()); + BoundsStore.Init(boundsdict.Values); } private void InitNodeGrid() { - + using var _ = new DisposableTimer("InitNodeGrid"); NodeGrid = new SpaceNodeGrid(); AllYnds.Clear(); @@ -358,7 +339,7 @@ namespace CodeWalker.World if (GameFileCache.EnableDlc) { var updrpf = rpfman.FindRpfFile("update\\update.rpf"); //load nodes from patch area... - if (updrpf != null) + if (updrpf is not null) { foreach (var rpffile in updrpf.Children) { @@ -367,7 +348,8 @@ namespace CodeWalker.World } foreach (var dlcrpf in GameFileCache.DlcActiveRpfs) //load nodes from current dlc rpfs { - if (dlcrpf.Path.StartsWith("x64", StringComparison.OrdinalIgnoreCase)) continue; //don't override update.rpf YNDs with x64 ones! *hack + if (dlcrpf.Path.StartsWith("x64", StringComparison.OrdinalIgnoreCase)) + continue; //don't override update.rpf YNDs with x64 ones! *hack foreach (var rpffile in dlcrpf.Children) { AddRpfYnds(rpffile, yndentries); @@ -384,12 +366,11 @@ namespace CodeWalker.World for (int y = 0; y < NodeGrid.CellCountY; y++) { var cell = NodeGrid.Cells[x, y]; - string fname = "nodes" + cell.ID + ".ynd"; + string fname = $"nodes{cell.ID}.ynd"; uint fnhash = JenkHash.GenHash(fname); - RpfFileEntry fentry = null; - if (yndentries.TryGetValue(fnhash, out fentry)) + if (yndentries.TryGetValue(fnhash, out RpfFileEntry? fentry)) { - cell.Ynd = rpfman.GetFile(fentry); + cell.Ynd = RpfManager.GetFile(fentry); cell.Ynd.BBMin = corner + (cellsize * new Vector3(x, y, 0)); cell.Ynd.BBMax = cell.Ynd.BBMin + cellsize; cell.Ynd.CellX = x; @@ -482,8 +463,8 @@ namespace CodeWalker.World //join the dots.... //StringBuilder sb = new StringBuilder(); List tverts = new List(); - List tlinks = new List(); - List nlinks = new List(); + using PooledList tlinks = new PooledList(); + using PooledList nlinks = new PooledList(); foreach (var ynd in AllYnds.Values) { BuildYndData(ynd, tverts, tlinks, nlinks); @@ -503,35 +484,34 @@ namespace CodeWalker.World private void AddRpfYnds(RpfFile rpffile, Dictionary yndentries) { - if (rpffile.AllEntries == null) return; + if (rpffile.AllEntries is null) + return; foreach (var entry in rpffile.AllEntries) { - if (entry is RpfFileEntry) + if (entry is RpfFileEntry fentry) { - RpfFileEntry fentry = entry as RpfFileEntry; - if (entry.IsExtension(".ynd")) + if (fentry.IsExtension(".ynd")) { - if (yndentries.ContainsKey(entry.NameHash)) - { } yndentries[entry.NameHash] = fentry; } } } } - public void BuildYndLinks(YndFile ynd, List tlinks = null, List nlinks = null) + public void BuildYndLinks(YndFile ynd, IList? tlinks = null, IList? nlinks = null) { var ynodes = ynd.Nodes; var nodes = ynd.NodeDictionary?.Nodes; var links = ynd.NodeDictionary?.Links; - if ((ynodes == null) || (nodes == null) || (links == null)) return; + if (ynodes is null || nodes is null || links is null) return; int nodecount = ynodes.Length; //build the links arrays. - if(tlinks==null) tlinks = new List(); - if(nlinks==null) nlinks = new List(); + tlinks ??= new PooledList(); + nlinks ??= new PooledList(); + tlinks.Clear(); for (int i = 0; i < nodecount; i++) { @@ -570,26 +550,26 @@ namespace CodeWalker.World ynd.Links = tlinks.ToArray(); } - public void BuildYndVerts(YndFile ynd, YndNode[] selectedNodes, List tverts = null) + public void BuildYndVerts(YndFile ynd, YndNode[]? selectedNodes, IList? tverts = null) { var laneColour = (uint) new Color4(0f, 0f, 1f, 1f).ToRgba(); var ynodes = ynd.Nodes; - if (ynodes == null) return; + if (ynodes is null) + return; int nodecount = ynodes.Length; //build the main linked vertex array (used by the renderable to draw the lines). - if(tverts==null) tverts = new List(); + tverts ??= new PooledList(); tverts.Clear(); for (int i = 0; i < nodecount; i++) { var node = ynodes[i]; - if (node.Links == null) continue; + if (node.Links is null) + continue; - var nvert = new EditorVertex(); - nvert.Position = node.Position; - nvert.Colour = (uint)node.Colour.ToRgba(); + var nvert = new EditorVertex(node.Position, (uint)node.Colour.ToRgba()); for (int l = 0; l < node.Links.Length; l++) @@ -607,10 +587,9 @@ namespace CodeWalker.World var tnode = yl.Node2; - if (tnode == null) continue; //invalid links could hit here - var tvert = new EditorVertex(); - tvert.Position = tnode.Position; - tvert.Colour = (uint)tnode.Colour.ToRgba(); + if (tnode == null) + continue; //invalid links could hit here + var tvert = new EditorVertex(tnode.Position, (uint)tnode.Colour.ToRgba()); tverts.Add(nvert); tverts.Add(tvert); @@ -621,17 +600,8 @@ namespace CodeWalker.World var vertOffset = laneDirCross * (offset + laneWidth * j); vertOffset.Z = 0.1f; - var lvert1 = new EditorVertex - { - Position = nvert.Position + vertOffset, - Colour = laneColour - }; - - var lvert2 = new EditorVertex - { - Position = tvert.Position + vertOffset, - Colour = laneColour - }; + var lvert1 = new EditorVertex(nvert.Position + vertOffset, laneColour); + var lvert2 = new EditorVertex(tvert.Position + vertOffset, laneColour); tverts.Add(lvert1); tverts.Add(lvert2); @@ -640,10 +610,10 @@ namespace CodeWalker.World var apos = lvert1.Position + laneDir * yl.LinkLength / 2; const float asize = 0.5f; const float negasize = asize * -1f; - tverts.Add(new EditorVertex(){ Position = apos, Colour = laneColour}); - tverts.Add(new EditorVertex() { Position = apos + laneDir * negasize + laneDirCross * asize, Colour = laneColour }); - tverts.Add(new EditorVertex() { Position = apos, Colour = laneColour }); - tverts.Add(new EditorVertex() { Position = apos + laneDir * negasize + laneDirCross * negasize, Colour = laneColour }); + tverts.Add(new EditorVertex(apos, laneColour)); + tverts.Add(new EditorVertex(apos + laneDir * negasize + laneDirCross * asize, laneColour)); + tverts.Add(new EditorVertex(apos, laneColour)); + tverts.Add(new EditorVertex(apos + laneDir * negasize + laneDirCross * negasize, laneColour)); } } } @@ -662,8 +632,8 @@ namespace CodeWalker.World { var junc = yjuncs[i]; var cell = NodeGrid.GetCell(junc.RefData.AreaID); - if ((cell == null) || (cell.Ynd == null) || (cell.Ynd.Nodes == null)) - { continue; } + if (cell?.Ynd?.Nodes is null) + continue; var jynd = cell.Ynd; if (cell.Ynd != ynd) //junc in different ynd..? no hits here, except ynds in project.. @@ -677,7 +647,7 @@ namespace CodeWalker.World } if (junc.RefData.NodeID >= jynd.Nodes.Length) - { continue; } + continue; var jnode = jynd.Nodes[junc.RefData.NodeID]; jnode.Junction = junc; @@ -686,7 +656,7 @@ namespace CodeWalker.World } } - public void BuildYndData(YndFile ynd, List tverts = null, List tlinks = null, List nlinks = null) + public void BuildYndData(YndFile ynd, IList? tverts = null, IList? tlinks = null, IList? nlinks = null) { BuildYndLinks(ynd, tlinks, nlinks); @@ -755,6 +725,7 @@ namespace CodeWalker.World private void InitNavGrid() { + using var _ = new DisposableTimer("InitNavGrid"); NavGrid = new SpaceNavGrid(); var rpfman = GameFileCache.RpfMan; @@ -968,7 +939,7 @@ namespace CodeWalker.World BoundingSphere sph = new BoundingSphere(r.HitPos + e.Center, e.Radius); - r.SphereHit = SphereIntersect(sph, CollisionLayers); + r.SphereHit = SphereIntersect(ref sph, CollisionLayers); if (!r.SphereHit.Hit) { @@ -976,7 +947,7 @@ namespace CodeWalker.World { Ray rayt = new Ray(sphpos, r.HitVelDir); float rayl = absdisp + e.Radius * 4.0f; //include some extra incase of glancing hit - var rayhit = RayIntersect(rayt, rayl); + var rayhit = RayIntersect(ref rayt, rayl); if (rayhit.Hit) //looks like it is tunnelling... need to find the sphere hit point { sph.Center = rayhit.Position - (r.HitVelDir*Math.Min(e.Radius*0.5f, rayhit.HitDist)); @@ -988,7 +959,7 @@ namespace CodeWalker.World sph.Center = r.HitPos + e.Center; //this really shouldn't happen... but just in case of glancing hit.. } - r.SphereHit = SphereIntersect(sph, CollisionLayers); //this really should be a hit! + r.SphereHit = SphereIntersect(ref sph, CollisionLayers); //this really should be a hit! } } } @@ -1003,7 +974,7 @@ namespace CodeWalker.World while (curiter < maxiter) //iterate to find a closer hit time... improve this! { sph.Center = sphpos + disp * curt; - var tcollres = SphereIntersect(sph, CollisionLayers); + var tcollres = SphereIntersect(ref sph, CollisionLayers); if (tcollres.Hit) { r.HitT = curt; @@ -1060,24 +1031,23 @@ namespace CodeWalker.World private bool IsYmapAvailable(uint ymaphash, int hour, MetaHash weather) { - MetaHash ymapname = new MetaHash(ymaphash); - uint ymaptime; - MetaHash[] weathers; - if ((hour >= 0) && (hour <= 23)) + if (hour >= 0 && hour <= 23) { - if (ymaptimes.TryGetValue(ymapname, out ymaptime)) + if (ymaptimes.TryGetValue(ymaphash, out var ymaptime)) { uint mask = 1u << hour; - if ((ymaptime & mask) == 0) return false; + if ((ymaptime & mask) == 0) + return false; } } if (weather.Hash != 0) { - if (ymapweathertypes.TryGetValue(ymapname, out weathers)) + if (ymapweathertypes.TryGetValue(ymaphash, out var weathers)) { for (int i = 0; i < weathers.Length; i++) { - if (weathers[i] == weather) return true; + if (weathers[i] == weather) + return true; } return false; } @@ -1087,15 +1057,17 @@ namespace CodeWalker.World public void GetVisibleYmaps(Camera cam, int hour, MetaHash weather, Dictionary ymaps) { - if (!Inited) return; - if (MapDataStore == null) return; + if (!Inited) + return; + if (MapDataStore is null) + return; CurrentHour = hour; CurrentWeather = weather; - var items = MapDataStore.GetItems(ref cam.Position); - for (int i = 0; i < items.Count; i++) + var items = MapDataStore.GetItems(in cam.Position); + + foreach(var item in items.AsSpan()) { - var item = items[i]; - if (item == null) + if (item is null) { continue; } @@ -1104,12 +1076,21 @@ namespace CodeWalker.World if (!ymaps.ContainsKey(hash)) { var ymap = (hash > 0) ? GameFileCache.GetYmap(hash) : null; - while ((ymap != null) && (ymap.Loaded)) + while (ymap is not null && ymap.Loaded) { - if (!IsYmapAvailable(hash, hour, weather)) break; + if (!IsYmapAvailable(hash, hour, weather)) + { + break; + } + ymaps[hash] = ymap; hash = ymap._CMapData.parent; - if (ymaps.ContainsKey(hash)) break; + if (ymaps.ContainsKey(hash)) + { + break; + } + + ymap = (hash > 0) ? GameFileCache.GetYmap(hash) : null; } } @@ -1119,22 +1100,26 @@ namespace CodeWalker.World public void GetVisibleBounds(Camera cam, int gridrange, bool[] layers, List boundslist) { - if (!Inited) return; + if (!Inited) + return; - if (BoundsStore == null) return; + if (BoundsStore is null) + return; float dist = 50.0f * gridrange; var pos = cam.Position; var min = pos - dist; var max = pos + dist; - var items = BoundsStore.GetItems(ref min, ref max, layers); + var items = BoundsStore.GetItems(in min, in max, layers); boundslist.AddRange(items); } public void GetVisibleYnds(Camera cam, List ynds) { - if (!Inited) return; - if (NodeGrid == null) return; + if (!Inited) + return; + if (NodeGrid is null) + return; //int x = 9; //int y = 15; //== nodes489.ynd @@ -1148,8 +1133,10 @@ namespace CodeWalker.World public void GetVisibleYnvs(Camera cam, int gridrange, List ynvs) { - if (!Inited) return; - if (NavGrid == null) return; + if (!Inited) + return; + if (NavGrid is null) + return; ynvs.Clear(); @@ -1181,16 +1168,18 @@ namespace CodeWalker.World } - public SpaceRayIntersectResult RayIntersect(Ray ray, float maxdist = float.MaxValue, bool[] layers = null) + public SpaceRayIntersectResult RayIntersect(ref Ray ray, float maxdist = float.MaxValue, bool[]? layers = null) { var res = new SpaceRayIntersectResult(); - if (GameFileCache == null) return res; + if (GameFileCache is null) + return res; bool testcomplete = true; res.HitDist = maxdist; var box = new BoundingBox(); float boxhitdisttest; - if ((BoundsStore == null) || (MapDataStore == null)) return res; + if (BoundsStore is null || MapDataStore is null) + return res; var boundslist = BoundsStore.GetItems(ref ray, layers); var mapdatalist = MapDataStore.GetItems(ref ray); @@ -1203,24 +1192,33 @@ namespace CodeWalker.World if (ray.Intersects(ref box, out boxhitdisttest)) { if (boxhitdisttest > res.HitDist) - { continue; } //already a closer hit + { + continue; + } //already a closer hit YbnFile ybn = GameFileCache.GetYbn(bound.Name); if (ybn == null) - { continue; } //ybn not found? + { + continue; + } //ybn not found? if (!ybn.Loaded) - { testcomplete = false; continue; } //ybn not loaded yet... + { + testcomplete = false; + continue; + } //ybn not loaded yet... var b = ybn.Bounds; - if (b == null) - { continue; } + if (b is null) + { + continue; + } var bhit = b.RayIntersect(ref ray, res.HitDist); if (bhit.Hit) { bhit.HitYbn = ybn; } - res.TryUpdate(ref bhit); + res.TryUpdate(in bhit); } } @@ -1232,50 +1230,58 @@ namespace CodeWalker.World continue; } if ((mapdata.ContentFlags & 1) == 0) - { continue; } //only test HD ymaps + { + continue; + } //only test HD ymaps box.Minimum = mapdata.entitiesExtentsMin; box.Maximum = mapdata.entitiesExtentsMax; if (ray.Intersects(ref box, out boxhitdisttest)) { if (boxhitdisttest > res.HitDist) - { continue; } //already a closer hit + { + continue; + } //already a closer hit var hash = mapdata.Name; var ymap = (hash > 0) ? GameFileCache.GetYmap(hash) : null; - if ((ymap != null) && (ymap.Loaded) && (ymap.AllEntities != null)) + if (ymap is not null && ymap.Loaded && ymap.AllEntities.Length > 0) { if (!IsYmapAvailable(hash, CurrentHour, CurrentWeather)) - { continue; } - - for (int e = 0; e < ymap.AllEntities.Length; e++) { - var ent = ymap.AllEntities[e]; + continue; + } + foreach(var ent in ymap.AllEntities) + { if (!EntityCollisionsEnabled(ent)) - { continue; } + { + continue; + } box.Minimum = ent.BBMin; box.Maximum = ent.BBMax; if (ray.Intersects(ref box, out boxhitdisttest)) { if (boxhitdisttest > res.HitDist) - { continue; } //already a closer hit + { + continue; + } //already a closer hit if (ent.IsMlo) { var ihit = RayIntersectInterior(ref ray, ent, res.HitDist); - res.TryUpdate(ref ihit); + res.TryUpdate(in ihit); } else { var ehit = RayIntersectEntity(ref ray, ent, res.HitDist); - res.TryUpdate(ref ehit); + res.TryUpdate(in ehit); } } } } - else if ((ymap != null) && (!ymap.Loaded)) + else if (ymap is not null && !ymap.Loaded) { testcomplete = false; } @@ -1306,40 +1312,40 @@ namespace CodeWalker.World var eorinv = Quaternion.Invert(ent.Orientation); var eray = new Ray(); eray.Position = eorinv.Multiply(ray.Position - ent.Position); - eray.Direction = eorinv.Multiply(ray.Direction); + eray.Direction = eorinv.Multiply(in ray.Direction); if ((drawable is Drawable sdrawable) && (sdrawable.Bound != null)) { var dhit = sdrawable.Bound.RayIntersect(ref eray, res.HitDist); if (dhit.Hit) { - dhit.Position = eori.Multiply(dhit.Position) + ent.Position; - dhit.Normal = eori.Multiply(dhit.Normal); + dhit.Position = eori.Multiply(in dhit.Position) + ent.Position; + dhit.Normal = eori.Multiply(in dhit.Normal); } - res.TryUpdate(ref dhit); + res.TryUpdate(in dhit); } else if (drawable is FragDrawable fdrawable) { - if (fdrawable.Bound != null) + if (fdrawable.Bound is not null) { var fhit = fdrawable.Bound.RayIntersect(ref eray, res.HitDist); if (fhit.Hit) { - fhit.Position = eori.Multiply(fhit.Position) + ent.Position; - fhit.Normal = eori.Multiply(fhit.Normal); + fhit.Position = eori.Multiply(in fhit.Position) + ent.Position; + fhit.Normal = eori.Multiply(in fhit.Normal); } - res.TryUpdate(ref fhit); + res.TryUpdate(in fhit); } var fbound = fdrawable.OwnerFragment?.PhysicsLODGroup?.PhysicsLOD1?.Bound; - if (fbound != null) + if (fbound is not null) { var fhit = fbound.RayIntersect(ref eray, res.HitDist);//TODO: these probably have extra transforms..! if (fhit.Hit) { - fhit.Position = eori.Multiply(fhit.Position) + ent.Position; - fhit.Normal = eori.Multiply(fhit.Normal); + fhit.Position = eori.Multiply(in fhit.Position) + ent.Position; + fhit.Normal = eori.Multiply(in fhit.Normal); } - res.TryUpdate(ref fhit); + res.TryUpdate(in fhit); } } } @@ -1355,84 +1361,97 @@ namespace CodeWalker.World var res = new SpaceRayIntersectResult(); res.HitDist = maxdist; - if (mlo.Archetype == null) - { return res; } + if (mlo.Archetype is null) + { + return res; + } var iori = mlo.Orientation; var iorinv = Quaternion.Invert(mlo.Orientation); var iray = new Ray(); iray.Position = iorinv.Multiply(ray.Position - mlo.Position); - iray.Direction = iorinv.Multiply(ray.Direction); + iray.Direction = iorinv.Multiply(in ray.Direction); var hash = mlo.Archetype.Hash; var ybn = GameFileCache.GetYbn(hash); - if ((ybn != null) && (ybn.Loaded)) + if (ybn is not null && ybn.Loaded) { var ihit = ybn.Bounds.RayIntersect(ref iray, res.HitDist); if (ihit.Hit) { ihit.HitYbn = ybn; ihit.HitEntity = mlo; - ihit.Position = iori.Multiply(ihit.Position) + mlo.Position; - ihit.Normal = iori.Multiply(ihit.Normal); + ihit.Position = iori.Multiply(in ihit.Position) + mlo.Position; + ihit.Normal = iori.Multiply(in ihit.Normal); } - res.TryUpdate(ref ihit); + res.TryUpdate(in ihit); } var mlodat = mlo.MloInstance; - if (mlodat == null) - { return res; } + if (mlodat is null) + { + return res; + } var box = new BoundingBox(); float boxhitdisttest; - if (mlodat.Entities != null) + if (mlodat.Entities != null && mlodat.Entities.Length > 0) { - for (int j = 0; j < mlodat.Entities.Length; j++) //should really improve this by using rooms! + foreach(var intent in mlodat.Entities) { - var intent = mlodat.Entities[j]; - if (intent.Archetype == null) continue; //missing archetype... + if (intent.Archetype is null) + continue; //missing archetype... if (!EntityCollisionsEnabled(intent)) - { continue; } + { + continue; + } box.Minimum = intent.BBMin; box.Maximum = intent.BBMax; if (ray.Intersects(ref box, out boxhitdisttest)) { if (boxhitdisttest > res.HitDist) - { continue; } //already a closer hit + { + continue; + } //already a closer hit var ehit = RayIntersectEntity(ref ray, intent, res.HitDist); - res.TryUpdate(ref ehit); + res.TryUpdate(in ehit); } } } - if (mlodat.EntitySets != null) + if (mlodat.EntitySets is not null && mlodat.EntitySets.Length > 0) { - for (int e = 0; e < mlodat.EntitySets.Length; e++) + foreach(var entityset in mlodat.EntitySets) { - var entityset = mlodat.EntitySets[e]; - if (!entityset.Visible) continue; + if (!entityset.Visible) + continue; var entities = entityset.Entities; - if (entities == null) continue; + if (entities is null) + continue; for (int i = 0; i < entities.Count; i++) //should really improve this by using rooms! { var intent = entities[i]; if (intent.Archetype == null) continue; //missing archetype... if (!EntityCollisionsEnabled(intent)) - { continue; } + { + continue; + } box.Minimum = intent.BBMin; box.Maximum = intent.BBMax; if (ray.Intersects(ref box, out boxhitdisttest)) { if (boxhitdisttest > res.HitDist) - { continue; } //already a closer hit + { + continue; + } //already a closer hit var ehit = RayIntersectEntity(ref ray, intent, res.HitDist); - res.TryUpdate(ref ehit); + res.TryUpdate(in ehit); } } } @@ -1441,7 +1460,7 @@ namespace CodeWalker.World return res; } - public SpaceSphereIntersectResult SphereIntersect(BoundingSphere sph, bool[] layers = null) + public SpaceSphereIntersectResult SphereIntersect(ref BoundingSphere sph, bool[] layers = null) { var res = new SpaceSphereIntersectResult(); if (GameFileCache == null) return res; @@ -1450,10 +1469,11 @@ namespace CodeWalker.World Vector3 sphmax = sph.Center + sph.Radius; var box = new BoundingBox(); - if ((BoundsStore == null) || (MapDataStore == null)) return res; + if (BoundsStore is null || MapDataStore is null) + return res; - var boundslist = BoundsStore.GetItems(ref sphmin, ref sphmax, layers); - var mapdatalist = MapDataStore.GetItems(ref sphmin, ref sphmax); + var boundslist = BoundsStore.GetItems(in sphmin, in sphmax, layers); + var mapdatalist = MapDataStore.GetItems(in sphmin, in sphmax); for (int i = 0; i < boundslist.Count; i++) { @@ -1462,15 +1482,15 @@ namespace CodeWalker.World box.Maximum = bound.Max; if (sph.Intersects(ref box)) { - YbnFile ybn = GameFileCache.GetYbn(bound.Name); - if (ybn == null) - { continue; } //ybn not found? + YbnFile? ybn = GameFileCache.GetYbn(bound.Name); + if (ybn is null) + continue; //ybn not found? if (!ybn.Loaded) { testcomplete = false; continue; } //ybn not loaded yet... var b = ybn.Bounds; - if (b == null) - { continue; } + if (b is null) + continue; var bhit = b.SphereIntersect(ref sph); res.TryUpdate(ref bhit); @@ -1489,17 +1509,21 @@ namespace CodeWalker.World { var hash = mapdata.Name; var ymap = (hash > 0) ? GameFileCache.GetYmap(hash) : null; - if ((ymap != null) && (ymap.Loaded) && (ymap.AllEntities != null)) + if (ymap is not null && ymap.Loaded && ymap.AllEntities.Length > 0) { if (!IsYmapAvailable(hash, CurrentHour, CurrentWeather)) - { continue; } + { + continue; + } for (int e = 0; e < ymap.AllEntities.Length; e++) { var ent = ymap.AllEntities[e]; if (!EntityCollisionsEnabled(ent)) - { continue; } + { + continue; + } box.Minimum = ent.BBMin; box.Maximum = ent.BBMax; @@ -1552,8 +1576,8 @@ namespace CodeWalker.World var dhit = sdrawable.Bound.SphereIntersect(ref esph); if (dhit.Hit) { - dhit.Position = eori.Multiply(dhit.Position) + ent.Position; - dhit.Normal = eori.Multiply(dhit.Normal); + dhit.Position = eori.Multiply(in dhit.Position) + ent.Position; + dhit.Normal = eori.Multiply(in dhit.Normal); } res.TryUpdate(ref dhit); } @@ -1564,8 +1588,8 @@ namespace CodeWalker.World var fhit = fdrawable.Bound.SphereIntersect(ref esph); if (fhit.Hit) { - fhit.Position = eori.Multiply(fhit.Position) + ent.Position; - fhit.Normal = eori.Multiply(fhit.Normal); + fhit.Position = eori.Multiply(in fhit.Position) + ent.Position; + fhit.Normal = eori.Multiply(in fhit.Normal); } res.TryUpdate(ref fhit); } @@ -1575,8 +1599,8 @@ namespace CodeWalker.World var fhit = fbound.SphereIntersect(ref esph);//TODO: these probably have extra transforms..! if (fhit.Hit) { - fhit.Position = eori.Multiply(fhit.Position) + ent.Position; - fhit.Normal = eori.Multiply(fhit.Normal); + fhit.Position = eori.Multiply(in fhit.Position) + ent.Position; + fhit.Normal = eori.Multiply(in fhit.Normal); } res.TryUpdate(ref fhit); } @@ -1604,8 +1628,8 @@ namespace CodeWalker.World var ihit = ybn.Bounds.SphereIntersect(ref isph); if (ihit.Hit) { - ihit.Position = iori.Multiply(ihit.Position) + mlo.Position; - ihit.Normal = iori.Multiply(ihit.Normal); + ihit.Position = iori.Multiply(in ihit.Position) + mlo.Position; + ihit.Normal = iori.Multiply(in ihit.Normal); } res.TryUpdate(ref ihit); } @@ -1699,7 +1723,7 @@ namespace CodeWalker.World public List VisibleItems = new List(); - public void Init(List rootnodes) + public void Init(IEnumerable rootnodes) { RootNode = new SpaceMapDataStoreNode(); RootNode.Owner = this; @@ -1710,25 +1734,19 @@ namespace CodeWalker.World RootNode.TrySplit(SplitThreshold); } - public List GetItems(ref Vector3 p) //get items at a point, using the streaming extents + public List GetItems(in Vector3 p) //get items at a point, using the streaming extents { VisibleItems.Clear(); - if (RootNode != null) - { - RootNode.GetItems(ref p, VisibleItems); - } + RootNode?.GetItems(in p, VisibleItems); return VisibleItems; } - public List GetItems(ref Vector3 min, ref Vector3 max) //get items intersecting a box, using the entities extents + public List GetItems(in Vector3 min, in Vector3 max) //get items intersecting a box, using the entities extents { VisibleItems.Clear(); - if (RootNode != null) - { - RootNode.GetItems(ref min, ref max, VisibleItems); - } + RootNode?.GetItems(in min, in max, VisibleItems); return VisibleItems; } @@ -1736,38 +1754,33 @@ namespace CodeWalker.World { VisibleItems.Clear(); - if (RootNode != null) - { - RootNode.GetItems(ref ray, VisibleItems); - } + RootNode?.GetItems(ref ray, VisibleItems); return VisibleItems; } } public class SpaceMapDataStoreNode { - public SpaceMapDataStore Owner = null; - public SpaceMapDataStoreNode[] Children = null; - public List Items = null; + public SpaceMapDataStore? Owner = null; + public SpaceMapDataStoreNode[]? Children = null; + public List? Items = null; public Vector3 BBMin = new Vector3(float.MaxValue); public Vector3 BBMax = new Vector3(float.MinValue); public int Depth = 0; public void Add(MapDataStoreNode item) { - if (Items == null) - { - Items = new List(); - } - BBMin = Vector3.Min(BBMin, item.streamingExtentsMin); - BBMax = Vector3.Max(BBMax, item.streamingExtentsMax); + Items ??= new List(); + + Vectors.Min(in BBMin, item.streamingExtentsMin, out BBMin); + Vectors.Max(in BBMax, item.streamingExtentsMax, out BBMax); Items.Add(item); } public void TrySplit(int threshold) { - if ((Items == null) || (Items.Count <= threshold)) - { return; } + if (Items is null || Items.Count <= threshold) + return; Children = new SpaceMapDataStoreNode[4]; @@ -1794,7 +1807,7 @@ namespace CodeWalker.World { var cind = ((icen.X > ncen.X) ? 1 : 0) + ((icen.Y > ncen.Y) ? 2 : 0); var c = Children[cind]; - if (c == null) + if (c is null) { c = new SpaceMapDataStoreNode(); c.Owner = Owner; @@ -1807,72 +1820,58 @@ namespace CodeWalker.World for (int i = 0; i < 4; i++) { - var c = Children[i]; - if (c != null) - { - c.TrySplit(threshold); - } + Children[i]?.TrySplit(threshold); } Items = newItems; } - public void GetItems(ref Vector3 p, List items) //get items at a point, using the streaming extents + public void GetItems(in Vector3 p, List items) //get items at a point, using the streaming extents { - if ((p.X >= BBMin.X) && (p.X <= BBMax.X) && (p.Y >= BBMin.Y) && (p.Y <= BBMax.Y)) + if (p.X >= BBMin.X && p.X <= BBMax.X && p.Y >= BBMin.Y && p.Y <= BBMax.Y) { - if (Items != null) + if (Items is not null) { - for (int i = 0; i < Items.Count; i++) + foreach (var item in Items.AsSpan()) { - var item = Items[i]; var imin = item.streamingExtentsMin; var imax = item.streamingExtentsMax; - if ((p.X >= imin.X) && (p.X <= imax.X) && (p.Y >= imin.Y) && (p.Y <= imax.Y)) + if (p.X >= imin.X && p.X <= imax.X && p.Y >= imin.Y && p.Y <= imax.Y) { items.Add(item); } } } - if (Children != null) + if (Children is not null) { - for (int i = 0; i < 4; i++) + foreach(var c in Children) { - var c = Children[i]; - if (c != null) - { - c.GetItems(ref p, items); - } + c?.GetItems(in p, items); } } } } - public void GetItems(ref Vector3 min, ref Vector3 max, List items) //get items intersecting a box, using the entities extents + public void GetItems(in Vector3 min, in Vector3 max, List items) //get items intersecting a box, using the entities extents { if ((max.X >= BBMin.X) && (min.X <= BBMax.X) && (max.Y >= BBMin.Y) && (min.Y <= BBMax.Y)) { - if (Items != null) + if (Items is not null) { - for (int i = 0; i < Items.Count; i++) + foreach(var item in Items.AsSpan()) { - var item = Items[i]; var imin = item.entitiesExtentsMin; var imax = item.entitiesExtentsMax; - if ((max.X >= imin.X) && (min.X <= imax.X) && (max.Y >= imin.Y) && (min.Y <= imax.Y)) + if (max.X >= imin.X && min.X <= imax.X && max.Y >= imin.Y && min.Y <= imax.Y) { items.Add(item); } } } - if (Children != null) + if (Children is not null) { - for (int i = 0; i < 4; i++) + foreach(var child in Children) { - var c = Children[i]; - if (c != null) - { - c.GetItems(ref min, ref max, items); - } + child?.GetItems(in min, in max, items); } } } @@ -1884,9 +1883,8 @@ namespace CodeWalker.World { if (Items != null) { - for (int i = 0; i < Items.Count; i++) + foreach(var item in Items.AsSpan()) { - var item = Items[i]; bb.Minimum = item.entitiesExtentsMin; bb.Maximum = item.entitiesExtentsMax; if (ray.Intersects(ref bb)) @@ -1900,10 +1898,7 @@ namespace CodeWalker.World for (int i = 0; i < 4; i++) { var c = Children[i]; - if (c != null) - { - c.GetItems(ref ray, items); - } + c?.GetItems(ref ray, items); } } } @@ -1918,7 +1913,7 @@ namespace CodeWalker.World public List VisibleItems = new List(); - public void Init(List items) + public void Init(IEnumerable items) { RootNode = new SpaceBoundsStoreNode(); RootNode.Owner = this; @@ -1929,25 +1924,19 @@ namespace CodeWalker.World RootNode.TrySplit(SplitThreshold); } - public List GetItems(ref Vector3 min, ref Vector3 max, bool[] layers = null) + public List GetItems(in Vector3 min, in Vector3 max, bool[]? layers = null) { VisibleItems.Clear(); - if (RootNode != null) - { - RootNode.GetItems(ref min, ref max, VisibleItems, layers); - } + RootNode?.GetItems(in min, in max, VisibleItems, layers); return VisibleItems; } - public List GetItems(ref Ray ray, bool[] layers = null) + public List GetItems(ref Ray ray, bool[]? layers = null) { VisibleItems.Clear(); - if (RootNode != null) - { - RootNode.GetItems(ref ray, VisibleItems, layers); - } + RootNode?.GetItems(ref ray, VisibleItems, layers); return VisibleItems; } @@ -2015,17 +2004,13 @@ namespace CodeWalker.World for (int i = 0; i < 4; i++) { - var c = Children[i]; - if (c != null) - { - c.TrySplit(threshold); - } + Children[i]?.TrySplit(threshold); } Items = newItems; } - public void GetItems(ref Vector3 min, ref Vector3 max, List items, bool[] layers = null) + public void GetItems(in Vector3 min, in Vector3 max, List items, bool[] layers = null) { if ((max.X >= BBMin.X) && (min.X <= BBMax.X) && (max.Y >= BBMin.Y) && (min.Y <= BBMax.Y)) { @@ -2036,7 +2021,9 @@ namespace CodeWalker.World var item = Items[i]; if ((layers != null) && (item.Layer < 3) && (!layers[item.Layer])) - { continue; } + { + continue; + } if ((max.X >= item.Min.X) && (min.X <= item.Max.X) && (max.Y >= item.Min.Y) && (min.Y <= item.Max.Y)) { @@ -2048,45 +2035,39 @@ namespace CodeWalker.World { for (int i = 0; i < 4; i++) { - var c = Children[i]; - if (c != null) - { - c.GetItems(ref min, ref max, items, layers); - } + Children[i]?.GetItems(in min, in max, items, layers); } } } } - public void GetItems(ref Ray ray, List items, bool[] layers = null) + public void GetItems(ref Ray ray, List items, bool[]? layers = null) { var box = new BoundingBox(BBMin, BBMax); if (ray.Intersects(ref box)) { - if (Items != null) + if (Items is not null) { for (int i = 0; i < Items.Count; i++) { var item = Items[i]; - if ((layers != null) && (item.Layer < 3) && (!layers[item.Layer])) - { continue; } + if (layers is not null && item.Layer < 3 && !layers[item.Layer]) + { + continue; + } box = new BoundingBox(item.Min, item.Max); - if (ray.Intersects(box)) + if (ray.Intersects(ref box)) { items.Add(item); } } } - if (Children != null) + if (Children is not null) { for (int i = 0; i < 4; i++) { - var c = Children[i]; - if (c != null) - { - c.GetItems(ref ray, items, layers); - } + Children[i]?.GetItems(ref ray, items, layers); } } } @@ -2131,7 +2112,7 @@ namespace CodeWalker.World return null; } - public SpaceNodeGridCell GetCellForPosition(Vector3 position) + public SpaceNodeGridCell? GetCellForPosition(in Vector3 position) { var x = (int)((position.X - CornerX) / CellSize); var y = (int)((position.Y - CornerY) / CellSize); @@ -2145,11 +2126,11 @@ namespace CodeWalker.World } - public YndNode GetYndNode(ushort areaid, ushort nodeid) + public YndNode? GetYndNode(ushort areaid, ushort nodeid) { var cell = GetCell(areaid); - if ((cell == null) || (cell.Ynd == null) || (cell.Ynd.Nodes == null)) - { return null; } + if (cell?.Ynd?.Nodes is null) + return null; if (nodeid >= cell.Ynd.Nodes.Length) { return null; } return cell.Ynd.Nodes[nodeid]; @@ -2309,7 +2290,7 @@ namespace CodeWalker.World public bool TestComplete; public BoundMaterial_s Material; - public void TryUpdate(ref SpaceRayIntersectResult r) + public void TryUpdate(in SpaceRayIntersectResult r) { if (r.Hit) { diff --git a/CodeWalker.Core/World/Timecycle.cs b/CodeWalker.Core/World/Timecycle.cs index 0dfb8e2..453112c 100644 --- a/CodeWalker.Core/World/Timecycle.cs +++ b/CodeWalker.Core/World/Timecycle.cs @@ -1,4 +1,5 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; using SharpDX; using System; using System.Collections.Generic; @@ -31,17 +32,18 @@ namespace CodeWalker.World public void Init(GameFileCache gameFileCache, Action updateStatus) { + using var _ = new DisposableTimer("Timecycle Init"); var rpfman = gameFileCache.RpfMan; string filename = "common.rpf\\data\\levels\\gta5\\time.xml"; XmlDocument timexml = rpfman.GetFileXml(filename); - XmlElement time = timexml.DocumentElement; - XmlNode suninfo = time.SelectSingleNode("suninfo"); - XmlNode mooninfo = time.SelectSingleNode("mooninfo"); - XmlNodeList samples = time.SelectNodes("sample"); - XmlNodeList regions = time.SelectNodes("region"); + XmlElement? time = timexml.DocumentElement; + XmlNode? suninfo = time?.SelectSingleNode("suninfo"); + XmlNode? mooninfo = time?.SelectSingleNode("mooninfo"); + XmlNodeList? samples = time?.SelectNodes("sample"); + XmlNodeList? regions = time?.SelectNodes("region"); sun_roll = Xml.GetFloatAttribute(suninfo, "sun_roll"); sun_yaw = Xml.GetFloatAttribute(suninfo, "sun_yaw"); @@ -51,19 +53,36 @@ namespace CodeWalker.World moon_wobble_offset = Xml.GetFloatAttribute(mooninfo, "moon_wobble_offset"); Samples.Clear(); - for (int i = 0; i < samples.Count; i++) + if (samples is not null) { - TimecycleSample tcs = new TimecycleSample(); - tcs.Init(samples[i]); - Samples.Add(tcs); + Samples.EnsureCapacity(samples.Count); + for (int i = 0; i < samples.Count; i++) + { + var sample = samples.Item(i); + if (sample is not null) + { + TimecycleSample tcs = new TimecycleSample(); + tcs.Init(sample); + Samples.Add(tcs); + } + } } Regions.Clear(); - for (int i = 0; i < regions.Count; i++) + if (regions is not null) { - Regions.Add(Xml.GetStringAttribute(regions[i], "name")); + Regions.EnsureCapacity(regions.Count); + for (int i = 0; i < regions.Count; i++) + { + var attr = regions[i]?.GetStringAttribute("name"); + if (attr is not null) + { + Regions.Add(attr); + } + } } + Inited = true; } @@ -95,13 +114,7 @@ namespace CodeWalker.World } } - public bool IsNightTime - { - get - { - return (CurrentHour < 6.0f) || (CurrentHour > 20.0f); - } - } + public bool IsNightTime => (CurrentHour < 6.0f) || (CurrentHour > 20.0f); } public class TimecycleSample @@ -113,10 +126,10 @@ namespace CodeWalker.World public void Init(XmlNode node) { - name = Xml.GetStringAttribute(node, "name"); - hour = Xml.GetFloatAttribute(node, "hour"); - duration = Xml.GetFloatAttribute(node, "duration"); - uw_tc_mod = Xml.GetStringAttribute(node, "uw_tc_mod"); + name = node.GetStringAttribute("name"); + hour = node.GetFloatAttribute("hour"); + duration = node.GetFloatAttribute("duration"); + uw_tc_mod = node.GetStringAttribute("uw_tc_mod"); } } diff --git a/CodeWalker.Core/World/TimecycleMods.cs b/CodeWalker.Core/World/TimecycleMods.cs index 0e64065..230a67e 100644 --- a/CodeWalker.Core/World/TimecycleMods.cs +++ b/CodeWalker.Core/World/TimecycleMods.cs @@ -59,17 +59,17 @@ namespace CodeWalker.World float version = Xml.GetFloatAttribute(root, "version"); var modnodes = root.SelectNodes("modifier"); - foreach (XmlNode modnode in modnodes) + if (modnodes is not null) { - if (!(modnode is XmlElement)) continue; - TimecycleMod mod = new TimecycleMod(); - mod.Init(modnode); - Dict[mod.nameHash] = mod; + foreach (XmlNode modnode in modnodes) + { + if (!(modnode is XmlElement)) continue; + TimecycleMod mod = new TimecycleMod(); + mod.Init(modnode); + Dict[mod.nameHash] = mod; + } } - } - - } @@ -113,7 +113,7 @@ namespace CodeWalker.World public override string ToString() { - return name + " (" + numMods.ToString() + " mods, userFlags: " + userFlags.ToString() + ")"; + return $"{name} ({numMods} mods, userFlags: {userFlags})"; } } @@ -141,7 +141,7 @@ namespace CodeWalker.World public override string ToString() { - return name + ": " + FloatUtil.ToString(value1) + ", " + FloatUtil.ToString(value2); + return $"{name}: {FloatUtil.ToString(value1)}, {FloatUtil.ToString(value2)}"; } } diff --git a/CodeWalker.Core/World/Trains.cs b/CodeWalker.Core/World/Trains.cs index 1267951..13709c3 100644 --- a/CodeWalker.Core/World/Trains.cs +++ b/CodeWalker.Core/World/Trains.cs @@ -6,6 +6,7 @@ using System.Text; using System.Threading.Tasks; using System.Xml; using SharpDX; +using CodeWalker.Core.Utils; namespace CodeWalker.World { @@ -19,6 +20,7 @@ namespace CodeWalker.World public void Init(GameFileCache gameFileCache, Action updateStatus) { + using var _ = new DisposableTimer("Trains Init"); GameFileCache = gameFileCache; var rpfman = gameFileCache.RpfMan; @@ -69,7 +71,7 @@ namespace CodeWalker.World get { int sc = 0; - if (Nodes != null) + if (Nodes.Count > 0) { foreach (var node in Nodes) { @@ -79,22 +81,19 @@ namespace CodeWalker.World } } } + return sc; } } - public EditorVertex[] LinkedVerts { get; set; } - public Vector4[] NodePositions { get; set; } + public EditorVertex[] LinkedVerts { get; set; } = Array.Empty(); + public Vector4[] NodePositions { get; set; } = Array.Empty(); public EditorVertex[] GetPathVertices() { return LinkedVerts; } - public EditorVertex[] GetTriangleVertices() - { - return null; - } public Vector4[] GetNodePositions() { return NodePositions; @@ -194,8 +193,7 @@ namespace CodeWalker.World string[] trackstrs = trackstr.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); if (trackstrs.Length > 1) { - int nodecount; - int.TryParse(trackstrs[0], out nodecount); + int.TryParse(trackstrs[0], out var nodecount); NodeCount = nodecount; List nodes = new List(); for (int i = 1; i < trackstrs.Length; i++) @@ -208,41 +206,30 @@ namespace CodeWalker.World var x = FloatUtil.Parse(nodevals[0]); var y = FloatUtil.Parse(nodevals[1]); var z = FloatUtil.Parse(nodevals[2]); - int nodetype; - int.TryParse(nodevals[3], out nodetype); + int.TryParse(nodevals[3], out var nodetype); ttnode.Position = new Vector3(x, y, z); ttnode.NodeType = nodetype; ttnode.Track = this; ttnode.Index = nodes.Count; ttnode.Links[0] = (nodes.Count > 0) ? nodes[nodes.Count - 1] : null; - if (ttnode.Links[0] != null) + if (ttnode.Links[0] is not null) { - ttnode.Links[0].Links[1] = ttnode; + ttnode.Links[0]!.Links[1] = ttnode; } nodes.Add(ttnode); } - else - { } } Nodes = nodes; } - else - { } - } - else - { } - - if (Nodes == null) - { - Nodes = new List(); } + Nodes ??= new List(); } public void BuildVertices() { - if ((Nodes != null) && (Nodes.Count > 0)) + if (Nodes != null && Nodes.Count > 0) { var nc = Nodes.Count; var lc = nc - 1; @@ -300,7 +287,7 @@ namespace CodeWalker.World public void BuildBVH() { - BVH = new PathBVH(Nodes, 10, 10); + BVH = new PathBVH(Nodes.ToArray(), 10, 10); } @@ -400,12 +387,13 @@ namespace CodeWalker.World public class TrainTrackNode : BasePathNode { - public Vector3 Position { get; set; } + public Vector3 _Position; + public ref Vector3 Position => ref _Position; public int NodeType { get; set; } - public TrainTrack Track { get; set; } + public TrainTrack? Track { get; set; } public int Index { get; set; } - public TrainTrackNode[] Links { get; set; } = new TrainTrackNode[2]; + public TrainTrackNode?[] Links { get; set; } = new TrainTrackNode[2]; public int GetColour() { diff --git a/CodeWalker.Core/World/Water.cs b/CodeWalker.Core/World/Water.cs index 9503eca..734f193 100644 --- a/CodeWalker.Core/World/Water.cs +++ b/CodeWalker.Core/World/Water.cs @@ -1,4 +1,5 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; using SharpDX; using System; using System.Collections.Generic; @@ -19,6 +20,7 @@ namespace CodeWalker.World public void Init(GameFileCache gameFileCache, Action updateStatus) { + using var _ = new DisposableTimer("Water Init"); GameFileCache = gameFileCache; var rpfman = gameFileCache.RpfMan; @@ -27,10 +29,11 @@ namespace CodeWalker.World XmlDocument waterxml = rpfman.GetFileXml(filename); - XmlElement waterdata = waterxml.DocumentElement; + XmlElement? waterdata = waterxml.DocumentElement; - XmlNodeList waterquads = waterdata.SelectNodes("WaterQuads/Item"); + XmlNodeList? waterquads = waterdata.SelectNodes("WaterQuads/Item"); WaterQuads.Clear(); + WaterQuads.EnsureCapacity(waterquads.Count); for (int i = 0; i < waterquads.Count; i++) { var waterquad = new WaterQuad(); @@ -38,8 +41,9 @@ namespace CodeWalker.World WaterQuads.Add(waterquad); } - XmlNodeList calmingquads = waterdata.SelectNodes("CalmingQuads/Item"); + XmlNodeList? calmingquads = waterdata.SelectNodes("CalmingQuads/Item"); CalmingQuads.Clear(); + CalmingQuads.EnsureCapacity(calmingquads.Count); for (int i = 0; i < calmingquads.Count; i++) { var calmingquad = new WaterCalmingQuad(); @@ -47,8 +51,9 @@ namespace CodeWalker.World CalmingQuads.Add(calmingquad); } - XmlNodeList wavequads = waterdata.SelectNodes("WaveQuads/Item"); + XmlNodeList? wavequads = waterdata.SelectNodes("WaveQuads/Item"); WaveQuads.Clear(); + WaveQuads.EnsureCapacity(wavequads.Count); for (int i = 0; i < wavequads.Count; i++) { var wavequad = new WaterWaveQuad(); @@ -65,7 +70,8 @@ namespace CodeWalker.World { List quads = new List(); - if (!Inited) return quads; + if (!Inited) + return quads; var vf = camera.ViewFrustum; foreach (var quad in allQuads) @@ -104,7 +110,7 @@ namespace CodeWalker.World public override string ToString() { - return string.Format("[{0}] X=({1} : {2}), Y=({3} : {4})", xmlNodeIndex, minX, maxX, minY, maxY); + return $"[{xmlNodeIndex}] X=({minX} : {maxX}), Y=({minY} : {maxY})"; } } @@ -188,7 +194,8 @@ namespace CodeWalker.World public float Amplitude { get; set; } public float XDirection { get; set; } public float YDirection { get; set; } - public Quaternion WaveOrientation { get; set; } + public Quaternion _WaveOrientation; + public ref Quaternion WaveOrientation => ref _WaveOrientation; public override void Init(XmlNode node, int index) @@ -203,7 +210,7 @@ namespace CodeWalker.World YDirection = Xml.GetChildFloatAttribute(node, "YDirection", "value"); float angl = (float)Math.Atan2(YDirection, XDirection); - WaveOrientation = Quaternion.RotationYawPitchRoll(0.0f, 0.0f, angl); + Quaternion.RotationYawPitchRoll(0.0f, 0.0f, angl, out WaveOrientation); /* diff --git a/CodeWalker.Core/World/Watermaps.cs b/CodeWalker.Core/World/Watermaps.cs index f715ae4..b5b876c 100644 --- a/CodeWalker.Core/World/Watermaps.cs +++ b/CodeWalker.Core/World/Watermaps.cs @@ -1,4 +1,6 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; +using Collections.Pooled; using SharpDX; using System; using System.Collections.Generic; @@ -18,21 +20,18 @@ namespace CodeWalker.World { return NodePositions; } - public EditorVertex[] GetPathVertices() - { - return null; - } public EditorVertex[] GetTriangleVertices() { return TriangleVerts; } - public Vector4[] NodePositions; - public EditorVertex[] TriangleVerts; + public Vector4[] NodePositions = []; + public EditorVertex[] TriangleVerts = []; public void Init(GameFileCache gameFileCache, Action updateStatus) { + using var _ = new DisposableTimer("Watermaps Init"); Inited = false; GameFileCache = gameFileCache; @@ -61,8 +60,8 @@ namespace CodeWalker.World public void BuildVertices() { - var vlist = new List(); - var nlist = new List(); + using var vlist = new PooledList(); + using var nlist = new PooledList(); foreach (var wmf in WatermapFiles) { @@ -73,26 +72,18 @@ namespace CodeWalker.World { TriangleVerts = vlist.ToArray(); } - else - { - TriangleVerts = null; - } if (nlist.Count > 0) { NodePositions = nlist.ToArray(); } - else - { - NodePositions = null; - } } - private void BuildWatermapVertices(WatermapFile wmf, List vl, List nl) + private void BuildWatermapVertices(WatermapFile wmf, IList vl, IList nl) { - var v1 = new EditorVertex(); - var v2 = new EditorVertex(); - var v3 = new EditorVertex(); - var v4 = new EditorVertex(); + EditorVertex v1; + EditorVertex v2; + EditorVertex v3; + EditorVertex v4; uint cblu = (uint)new Color(0, 0, 128, 60).ToRgba(); @@ -121,41 +112,44 @@ namespace CodeWalker.World uint getColour(int o) { var harr = wmf.GridWatermapRefs[o]; - if (harr == null) return cblu; - if (harr.Length == 0) return cblu; + if (harr == null) + return cblu; + if (harr.Length == 0) + return cblu; var i0 = harr[0].Item; - if (i0 == null) return cblu; + if (i0 == null) + return cblu; var c = i0.Colour; c.A = 128; return (uint)c.ToRgba(); } - var w = wmf.Width; - var h = wmf.Height; - var min = new Vector3(wmf.CornerX, wmf.CornerY, 0.0f); - var step = new Vector3(wmf.TileX, -wmf.TileY, 1.0f); + //var w = wmf.Width; + //var h = wmf.Height; + //var min = new Vector3(wmf.CornerX, wmf.CornerY, 0.0f); + //var step = new Vector3(wmf.TileX, -wmf.TileY, 1.0f); //var siz = new Vector3(w, h, 1) * step; - for (int yi = 1; yi < h; yi++) - { - var yo = yi - 1; - for (int xi = 1; xi < w; xi++) - { - var xo = xi - 1; - var o1 = yi * w + xo; - var o2 = yi * w + xi; - var o3 = yo * w + xo; - var o4 = yo * w + xi; - v1.Position = min + step * new Vector3(xo, yi, getHeight(o1)); - v2.Position = min + step * new Vector3(xi, yi, getHeight(o2)); - v3.Position = min + step * new Vector3(xo, yo, getHeight(o3)); - v4.Position = min + step * new Vector3(xi, yo, getHeight(o4)); - v1.Colour = getColour(o1); - v2.Colour = getColour(o2); - v3.Colour = getColour(o3); - v4.Colour = getColour(o4); - //vl.Add(v1); vl.Add(v2); vl.Add(v3); - //vl.Add(v3); vl.Add(v2); vl.Add(v4); - } - } + //for (int yi = 1; yi < h; yi++) + //{ + // var yo = yi - 1; + // for (int xi = 1; xi < w; xi++) + // { + // var xo = xi - 1; + // var o1 = yi * w + xo; + // var o2 = yi * w + xi; + // var o3 = yo * w + xo; + // var o4 = yo * w + xi; + // v1.Position = min + step * new Vector3(xo, yi, getHeight(o1)); + // v2.Position = min + step * new Vector3(xi, yi, getHeight(o2)); + // v3.Position = min + step * new Vector3(xo, yo, getHeight(o3)); + // v4.Position = min + step * new Vector3(xi, yo, getHeight(o4)); + // v1.Colour = getColour(o1); + // v2.Colour = getColour(o2); + // v3.Colour = getColour(o3); + // v4.Colour = getColour(o4); + // //vl.Add(v1); vl.Add(v2); vl.Add(v3); + // //vl.Add(v3); vl.Add(v2); vl.Add(v4); + // } + //} //for (int y = 0; y < h; y++) //{ // for (int x = 0; x < w; x++) @@ -166,23 +160,23 @@ namespace CodeWalker.World //} - void addQuad(Quad q) + void addQuad(in Quad q, uint color) { - v1.Position = q.P1; - v2.Position = q.P2; - v3.Position = q.P3; - v4.Position = q.P4; - vl.Add(v1); vl.Add(v2); vl.Add(v3); + v1 = new EditorVertex(q.P1, color); + v2 = new EditorVertex(q.P2, color); + v3 = new EditorVertex(q.P3, color); + v4 = new EditorVertex(q.P4, color); + vl.Add(new EditorVertex()); vl.Add(v2); vl.Add(v3); vl.Add(v3); vl.Add(v2); vl.Add(v4); } - void addRivEnd(Vector3 p, Vector3 s, Vector3 d, float r) + void addRivEnd(in Vector3 p, in Vector3 s, in Vector3 d, float r, uint color) { - v1.Position = p; - v2.Position = p + s * r; - v3.Position = p + d * r; - v4.Position = p - s * r; - vl.Add(v1); vl.Add(v2); vl.Add(v3); - vl.Add(v1); vl.Add(v3); vl.Add(v4); + v1 = new EditorVertex(p, color); + v2 = new EditorVertex(p + s * r, color); + v3 = new EditorVertex(p + d * r, color); + v4 = new EditorVertex(p - s * r, color); + vl.Add(new EditorVertex()); vl.Add(v2); vl.Add(v3); + vl.Add(new EditorVertex()); vl.Add(v3); vl.Add(v4); } var rivers = wmf.Rivers; if (rivers != null) @@ -195,7 +189,7 @@ namespace CodeWalker.World var rwid = 20.0f; var rc = river.Colour; rc.A = 128; - v1.Colour = v2.Colour = v3.Colour = v4.Colour = (uint)rc.ToRgba(); + var riverColor = (uint)rc.ToRgba(); var quads = new Quad[river.Vectors.Length - 1]; var li = river.Vectors.Length - 1; for (int i = 1; i < river.Vectors.Length; i++) @@ -215,8 +209,8 @@ namespace CodeWalker.World quads[o].P2 = vo.XYZ() + sid*rwid; quads[o].P3 = vi.XYZ() - sid*rwid; quads[o].P4 = vi.XYZ() + sid*rwid; - if (i == 1) addRivEnd(vo.XYZ(), -sid, -dir, rwid); - if (i == li) addRivEnd(vi.XYZ(), sid, dir, rwid); + if (i == 1) addRivEnd(vo.XYZ(), -sid, -dir, rwid, riverColor); + if (i == li) addRivEnd(vi.XYZ(), in sid, in dir, rwid, riverColor); } for (int i = 1; i < quads.Length; i++) { @@ -226,7 +220,7 @@ namespace CodeWalker.World } for (int i = 0; i < quads.Length; i++) { - addQuad(quads[i]); + addQuad(in quads[i], riverColor); } } } @@ -241,17 +235,19 @@ namespace CodeWalker.World var lp = lake.Position; var lc = lake.Colour; lc.A = 128; - v1.Colour = v2.Colour = v3.Colour = v4.Colour = (uint)lc.ToRgba(); + var lakeColor = (uint)lc.ToRgba(); for (int i = 0; i < lake.Vectors.Length; i++) { var vi = lake.Vectors[i]; var vp = new Vector3(vi.X, vi.Y, lp.Z); - var q = new Quad(); - q.P1 = vp + new Vector3(vi.Z, -vi.W, 0); - q.P2 = vp + new Vector3(vi.Z, vi.W, 0); - q.P3 = vp + new Vector3(-vi.Z, -vi.W, 0); - q.P4 = vp + new Vector3(-vi.Z, vi.W, 0); - addQuad(q); + var q = new Quad + { + P1 = vp + new Vector3(vi.Z, -vi.W, 0), + P2 = vp + new Vector3(vi.Z, vi.W, 0), + P3 = vp + new Vector3(-vi.Z, -vi.W, 0), + P4 = vp + new Vector3(-vi.Z, vi.W, 0), + }; + addQuad(in q, lakeColor); } } } @@ -264,13 +260,14 @@ namespace CodeWalker.World var ps = pool.Size; var pc = pool.Colour; pc.A = 128; - v1.Colour = v2.Colour = v3.Colour = v4.Colour = (uint)pc.ToRgba(); - var q = new Quad(); - q.P1 = pp + new Vector3(ps.X, -ps.Y, 0); - q.P2 = pp + new Vector3(ps.X, ps.Y, 0); - q.P3 = pp + new Vector3(-ps.X, -ps.Y, 0); - q.P4 = pp + new Vector3(-ps.X, ps.Y, 0); - addQuad(q); + var q = new Quad + { + P1 = pp + new Vector3(ps.X, -ps.Y, 0), + P2 = pp + new Vector3(ps.X, ps.Y, 0), + P3 = pp + new Vector3(-ps.X, -ps.Y, 0), + P4 = pp + new Vector3(-ps.X, ps.Y, 0) + }; + addQuad(in q, (uint)pc.ToRgba()); } } diff --git a/CodeWalker.Core/World/Weather.cs b/CodeWalker.Core/World/Weather.cs index 8e43042..1c16cfa 100644 --- a/CodeWalker.Core/World/Weather.cs +++ b/CodeWalker.Core/World/Weather.cs @@ -1,4 +1,5 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; using SharpDX; using System; using System.Collections.Generic; @@ -32,6 +33,7 @@ namespace CodeWalker.World public void Init(GameFileCache gameFileCache, Action updateStatus, Timecycle timecycle) { + using var _ = new DisposableTimer("Weather Init"); Timecycle = timecycle; var rpfman = gameFileCache.RpfMan; diff --git a/CodeWalker.Peds/CodeWalker.Peds.csproj b/CodeWalker.Peds/CodeWalker.Peds.csproj index b63529e..2cbbe5f 100644 --- a/CodeWalker.Peds/CodeWalker.Peds.csproj +++ b/CodeWalker.Peds/CodeWalker.Peds.csproj @@ -1,7 +1,7 @@  WinExe - net6.0-windows + net8.0-windows true CWPeds.ico dexyfex diff --git a/CodeWalker.Peds/Program.cs b/CodeWalker.Peds/Program.cs index c07a408..bbfc67f 100644 --- a/CodeWalker.Peds/Program.cs +++ b/CodeWalker.Peds/Program.cs @@ -1,5 +1,7 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; using CodeWalker.Properties; +using CodeWalker.Utils; using System; using System.Collections.Generic; using System.Linq; @@ -18,11 +20,15 @@ namespace CodeWalker.Peds { //Process.Start("CodeWalker.exe", "peds"); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new PedsForm()); + if (!NamedPipe.TrySendMessageToOtherProcess("peds-mode")) + { + ConsoleWindow.Hide(); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new PedsForm()); - GTAFolder.UpdateSettings(); + GTAFolder.UpdateSettings(); + } } } } diff --git a/CodeWalker.Peds/Properties/PublishProfiles/FolderProfile.pubxml b/CodeWalker.Peds/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..74d593d --- /dev/null +++ b/CodeWalker.Peds/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,18 @@ + + + + + Release + Any CPU + ..\publish\ + FileSystem + <_TargetId>Folder + net8.0-windows + win-x64 + false + false + true + + \ No newline at end of file diff --git a/CodeWalker.RPFExplorer/CodeWalker.RPFExplorer.csproj b/CodeWalker.RPFExplorer/CodeWalker.RPFExplorer.csproj index e03e61c..be85dc3 100644 --- a/CodeWalker.RPFExplorer/CodeWalker.RPFExplorer.csproj +++ b/CodeWalker.RPFExplorer/CodeWalker.RPFExplorer.csproj @@ -1,7 +1,7 @@  WinExe - net6.0-windows + net8.0-windows true true CWRPFExplorer.ico @@ -10,6 +10,7 @@ dexyfex CodeWalker RPF Explorer latest + true x64 @@ -17,6 +18,9 @@ x64 + + + diff --git a/CodeWalker.RPFExplorer/Program.cs b/CodeWalker.RPFExplorer/Program.cs index baa1d9c..9dd697f 100644 --- a/CodeWalker.RPFExplorer/Program.cs +++ b/CodeWalker.RPFExplorer/Program.cs @@ -8,6 +8,8 @@ using System.Threading.Tasks; using System.Windows.Forms; using CodeWalker.Utils; using CodeWalker.Core.Utils; +using System.Diagnostics.Tracing; +using System.Threading; namespace CodeWalker.RPFExplorer { @@ -23,6 +25,7 @@ namespace CodeWalker.RPFExplorer { if (!NamedPipe.TrySendMessageToOtherProcess("explorer")) { + CodeWalker.Program.LoadConfig(); ConsoleWindow.Hide(); //Process.Start("CodeWalker.exe", "explorer"); Application.EnableVisualStyles(); @@ -30,7 +33,7 @@ namespace CodeWalker.RPFExplorer var form = new ExploreForm(); var namedPipe = new NamedPipe(form); - namedPipe.Init(); + namedPipe.StartServer(); Application.Run(form); diff --git a/CodeWalker.RPFExplorer/Properties/PublishProfiles/FolderProfile.pubxml b/CodeWalker.RPFExplorer/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..2027c54 --- /dev/null +++ b/CodeWalker.RPFExplorer/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,18 @@ + + + + + Release + Any CPU + ..\publish\ + FileSystem + <_TargetId>Folder + net8.0-windows + false + win-x64 + false + true + + \ No newline at end of file diff --git a/CodeWalker.Shaders/CodeWalker.Shaders.vcxproj b/CodeWalker.Shaders/CodeWalker.Shaders.vcxproj index da33fd1..a7748f9 100644 --- a/CodeWalker.Shaders/CodeWalker.Shaders.vcxproj +++ b/CodeWalker.Shaders/CodeWalker.Shaders.vcxproj @@ -68,7 +68,10 @@ - + + true + $(ProjectDir)..\Shaders\ + Level3 @@ -105,7 +108,7 @@ $(ProjectDir)..\Shaders\%(Filename).cso - 4.0 + 5.0 true diff --git a/CodeWalker.Shaders/LightPS.hlsl b/CodeWalker.Shaders/LightPS.hlsl index 429a517..c831ab9 100644 --- a/CodeWalker.Shaders/LightPS.hlsl +++ b/CodeWalker.Shaders/LightPS.hlsl @@ -1,5 +1,6 @@ #include "LightPS.hlsli" +SamplerState TextureSS : register(s0); Texture2D DepthTex : register(t0); Texture2D DiffuseTex : register(t2); @@ -18,7 +19,7 @@ float4 main(VS_Output input) : SV_TARGET { uint3 ssloc = uint3(input.Pos.xy, 0); //pixel location float depth = DepthTex.Load(ssloc).r; - if (depth == 0) + if (depth <= 9.99999997e-07) discard; //no existing pixel rendered here float4 diffuse = DiffuseTex.Load(ssloc); diff --git a/CodeWalker.Shaders/LightPS.hlsli b/CodeWalker.Shaders/LightPS.hlsli index d143386..c834dd9 100644 --- a/CodeWalker.Shaders/LightPS.hlsli +++ b/CodeWalker.Shaders/LightPS.hlsli @@ -171,6 +171,31 @@ float4 DeferredLODLight(float3 camRel, float3 norm, float4 diffuse, float4 specu return float4(lcol, 1); } +bool IsInRange(float3 camRel) +{ + float3 srpos = InstPosition - camRel; + float ldist = length(srpos); + + if (InstType == 4) + { + float3 ext = InstDirection.xyz * (InstCapsuleExtent.y * 0.5); + float4 lsn = GetLineSegmentNearestPoint(srpos, ext, -ext); + ldist = lsn.w; + srpos.xyz = lsn.xyz; + } + + if (ldist > InstFalloff) + return false; + if (ldist <= 0) + return false; + + float d = dot(srpos, InstCullingPlaneNormal) - InstCullingPlaneOffset; + if (d > 0) + return false; + + return true; +} + float4 DeferredLight(float3 camRel, float3 norm, float4 diffuse, float4 specular, float4 irradiance) { float3 srpos = InstPosition - camRel; //light position relative to surface position diff --git a/CodeWalker.Shaders/LightPS_MS.hlsl b/CodeWalker.Shaders/LightPS_MS.hlsl index e998070..3eabcdb 100644 --- a/CodeWalker.Shaders/LightPS_MS.hlsl +++ b/CodeWalker.Shaders/LightPS_MS.hlsl @@ -1,5 +1,6 @@ #include "LightPS.hlsli" +SamplerState TextureSS : register(s0); Texture2DMS DepthTex : register(t0); Texture2DMS DiffuseTex : register(t2); @@ -24,7 +25,7 @@ float4 main(VS_Output input) : SV_TARGET for (int i = 0; i < sc; i++) { float depth = DepthTex.Load(ssloc, i); - if (depth == 0) + if (depth <= 9.99999997e-07) continue; //no existing subpixel rendered here float4 diffuse = DiffuseTex.Load(ssloc, i); diff --git a/CodeWalker.Shaders/LodLightsVS.hlsl b/CodeWalker.Shaders/LodLightsVS.hlsl index d0409d3..704bf88 100644 --- a/CodeWalker.Shaders/LodLightsVS.hlsl +++ b/CodeWalker.Shaders/LodLightsVS.hlsl @@ -58,6 +58,7 @@ VS_Output main(float4 ipos : POSITION, uint iid : SV_InstanceID) cpos.y += (ipos.w * 2 - 1) * lodlight.OuterAngleOrCapExt; opos = (cpos.x * lodlight.TangentX.xyz) + (cpos.y * lodlight.Direction.xyz) + (cpos.z * lodlight.TangentY.xyz); } + opos += (lodlight.Position - CameraPos.xyz); float4 spos = mul(float4(opos, 1), ViewProj); VS_Output output; diff --git a/CodeWalker.Shaders/Shadowmap.hlsli b/CodeWalker.Shaders/Shadowmap.hlsli index 1dba4ed..c2441db 100644 --- a/CodeWalker.Shaders/Shadowmap.hlsli +++ b/CodeWalker.Shaders/Shadowmap.hlsli @@ -1,5 +1,8 @@ #include "Common.hlsli" +#define PCFSTART -1 +#define PCFEND 2 + //Texture2DArray Depthmap : register(t1); //SamplerState DepthmapSS : register(s1); Texture2D Depthmap : register(t1); @@ -54,9 +57,11 @@ void ShadowmapCalculatePCFPercentLit(in float4 vShadowTexCoord, fPercentLit = 0.0f; // This loop could be unrolled, and texture immediate offsets could be used if the kernel size were fixed. // This would be performance improvment. - for (int x = PCFLoopStart; x < PCFLoopEnd; ++x) + [unroll] + for (int x = PCFSTART; x < PCFEND; ++x) { - for (int y = PCFLoopStart; y < PCFLoopEnd; ++y) + [unroll] + for (int y = PCFSTART; y < PCFEND; ++y) { float depthcompare = vShadowTexCoord.z; // A very simple solution to the depth bias problems of PCF is to use an offset. diff --git a/CodeWalker.Test/CodeWalker.Test.csproj b/CodeWalker.Test/CodeWalker.Test.csproj index 1fca3ae..e67d4a8 100644 --- a/CodeWalker.Test/CodeWalker.Test.csproj +++ b/CodeWalker.Test/CodeWalker.Test.csproj @@ -1,18 +1,18 @@  - net6.0 + net8.0 enable false latest - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/CodeWalker.Test/Files/content.xml b/CodeWalker.Test/Files/content.xml new file mode 100644 index 0000000..fd43264 --- /dev/null +++ b/CodeWalker.Test/Files/content.xml @@ -0,0 +1,382 @@ + + + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_JetSki_Ramp.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_JetSki_Ramp.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_stunt.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_stunt.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_Inflatable_CP.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_Inflatable_CP.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/prop_ar_signs.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_prop_ar_signs.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/prop_ar_tubes.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_prop_ar_tubes.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/prop_ar_neongates.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_prop_ar_neongates.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_CP_Towers.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_CP_Towers.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_Blocks.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_Blocks.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_FireHoops.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_FireHoops.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/prop_ar_checkpoints.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_prop_ar_checkpoints.ityp + DLC_ITYP_REQUEST + + + + CONTENTS_PROPS + + + dlc_mpAirracesCRC:/common/data/contentunlocks.meta + CONTENT_UNLOCKING_META_FILE + + + + + + dlc_mpAirraces:/common/data/overlayinfo.xml + OVERLAY_INFO_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/data/effects/ptfx.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/anim/creaturemetadata.rpf + RPF_FILE + + + + + + dlc_mpAirracesCRC:/common/data/pedalternatevariations.meta + ALTERNATE_VARIATIONS_FILE + + + + + + dlc_mpAirraces:/common/data/effects/peds/first_person.meta + PED_FIRST_PERSON_ASSET_DATA + + + + + + dlc_mpAirracesCRC:/common/data/mp_f_freemode_01_airraces_shop.meta + SHOP_PED_APPAREL_META_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirRaces_female.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirRaces_female_p.rpf + RPF_FILE + + + + + + dlc_mpAirracesCRC:/common/data/mp_m_freemode_01_airraces_shop.meta + SHOP_PED_APPAREL_META_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirRaces_male.rpf + RPF_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirRaces_male_p.rpf + RPF_FILE + + + + + + dlc_mpAirracesCRC:/common/data/shop_tattoo.meta + TATTOO_SHOP_DLC_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/audio/dlcAirraces_game.dat + AUDIO_GAMEDATA + + + + + + dlc_mpAirraces:/%PLATFORM%/audio/dlcAirraces_sounds.dat + AUDIO_SOUNDDATA + + + + + + dlc_mpAirraces:/%PLATFORM%/audio/dlcAirraces_mix.dat + AUDIO_DYNAMIXDATA + + + + + + dlc_mpAirraces:/%PLATFORM%/audio/dlcAirraces_amp.dat + AUDIO_SYNTHDATA + + + + + + dlc_mpAirraces:/%PLATFORM%/audio/sfx/dlc_Airraces + AUDIO_WAVEPACK + + + + + + dlc_mpAirracesCRC:/common/data/effects/peds/mpAirraces_overlays.xml + PED_OVERLAY_FILE + + + + + + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirraces_ped_mp_overlay_txds.rpf + RPF_FILE + + + + + + + + MPAIRRACES_AUTOGEN + + + + + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_JetSki_Ramp.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_JetSki_Ramp.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_stunt.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_stunt.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_Inflatable_CP.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_Inflatable_CP.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/prop_ar_signs.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_prop_ar_signs.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/prop_ar_tubes.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_prop_ar_tubes.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/prop_ar_neongates.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_prop_ar_neongates.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_CP_Towers.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_CP_Towers.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_Blocks.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_Blocks.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/Prop_AR_FireHoops.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_Prop_AR_FireHoops.ityp + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/prop_ar_checkpoints.rpf + dlc_mpAirraces:/%PLATFORM%/levels/gta5/props/ar_prop_ar_checkpoints.ityp + dlc_mpAirraces:/%PLATFORM%/data/effects/ptfx.rpf + dlc_mpAirraces:/%PLATFORM%/anim/creaturemetadata.rpf + dlc_mpAirracesCRC:/common/data/pedalternatevariations.meta + dlc_mpAirraces:/common/data/effects/peds/first_person.meta + dlc_mpAirraces:/common/data/overlayinfo.xml + dlc_mpAirracesCRC:/common/data/mp_f_freemode_01_airraces_shop.meta + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirRaces_female.rpf + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirRaces_female_p.rpf + dlc_mpAirracesCRC:/common/data/mp_m_freemode_01_airraces_shop.meta + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirRaces_male.rpf + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirRaces_male_p.rpf + dlc_mpAirracesCRC:/common/data/shop_tattoo.meta + dlc_mpAirraces:/%PLATFORM%/audio/dlcAirraces_game.dat + dlc_mpAirraces:/%PLATFORM%/audio/dlcAirraces_sounds.dat + dlc_mpAirraces:/%PLATFORM%/audio/dlcAirraces_mix.dat + dlc_mpAirraces:/%PLATFORM%/audio/dlcAirraces_amp.dat + dlc_mpAirraces:/%PLATFORM%/audio/sfx/dlc_Airraces + dlc_mpAirracesCRC:/common/data/effects/peds/mpAirraces_overlays.xml + dlc_mpAirraces:/%PLATFORM%/models/cdimages/mpAirraces_ped_mp_overlay_txds.rpf + + + + + + + + + MPAIRRACES_UNLOCKS_AUTOGEN + + + + + dlc_mpAirracesCRC:/common/data/contentunlocks.meta + + + + + + + + + MPAIRRACES_INTERIOR_ADDITIONS + + + MO_JIM_L11 + + + + + + + + LOADINGSCREEN_CONTEXT_LAST_FRAME + + + + + diff --git a/CodeWalker.Test/FloatUtilTests.cs b/CodeWalker.Test/FloatUtilTests.cs new file mode 100644 index 0000000..1db8976 --- /dev/null +++ b/CodeWalker.Test/FloatUtilTests.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; +using Xunit.Abstractions; + +namespace CodeWalker.Test +{ + public class FloatUtilTests(ITestOutputHelper testOutputHelper) + { + [Fact] + public void FloatUtilTest() + { + float num = 1234.1234128934612983542364891263489125346758128793648972634921783945981234f; + Assert.Equal(num.ToString(), FloatUtil.ToString(num)); + Assert.Equal(num, float.Parse(FloatUtil.ToString(num))); + Assert.Equal(num, float.Parse(num.ToString())); + var random = new Random(42); + + for (int i = 0; i < 100000; i++) + { + var number = (float)(random.NextDouble() * random.Next(int.MinValue, int.MaxValue)); + + var numToString = number.ToString(); + + var floatUtilToString = FloatUtil.ToString(number); + + Assert.Equal(numToString, floatUtilToString); + } + + } + } +} diff --git a/CodeWalker.Test/GTACryptTests.cs b/CodeWalker.Test/GTACryptTests.cs index 17f063f..ab6fdff 100644 --- a/CodeWalker.Test/GTACryptTests.cs +++ b/CodeWalker.Test/GTACryptTests.cs @@ -96,7 +96,7 @@ namespace CodeWalker.Test public void DecryptWithSpanShouldReturnExpectedData() { var data = Convert.FromBase64String(InputData); - GTACrypto.DecryptNG(data.AsSpan(), Key); + GTACrypto.DecryptNG(data.AsMemory(), Key); Assert.Equal(OutputData, Convert.ToBase64String(data)); } diff --git a/CodeWalker.Test/GameFileTests.cs b/CodeWalker.Test/GameFileTests.cs new file mode 100644 index 0000000..3bec430 --- /dev/null +++ b/CodeWalker.Test/GameFileTests.cs @@ -0,0 +1,70 @@ +using CodeWalker.GameFiles; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace CodeWalker.Test +{ + public class GameFileTests + { + [Fact] + public void SettingLoadedShouldUpdateLoaded() + { + var gameFile = new YmapFile(); + + gameFile.Loaded = true; + + Assert.True(gameFile.Loaded); + + gameFile.Loaded = false; + + Assert.False(gameFile.Loaded); + } + + [Fact] + public void SettingLoadQueuedShouldUpdateLoadQueued() + { + var gameFile = new YmapFile(); + + gameFile.LoadQueued = true; + + Assert.True(gameFile.LoadQueued); + + gameFile.LoadQueued = false; + + Assert.False(gameFile.LoadQueued); + } + + [Fact] + // This is a requirement for thread safety, this allows an if statement which is atomic when checking for load state + public void SetLoadQueuedShouldReturnFalseWhenValueNotUpdated() + { + var gameFile = new YmapFile(); + + Assert.False(gameFile.LoadQueued); + + Assert.True(gameFile.SetLoadQueued(true)); + Assert.False(gameFile.SetLoadQueued(true)); + + Assert.True(gameFile.SetLoadQueued(false)); + Assert.False(gameFile.SetLoadQueued(false)); + } + + [Fact] + public void SetLoadedShouldReturnFalseWhenValueNotUpdated() + { + var gameFile = new YmapFile(); + + Assert.False(gameFile.Loaded); + + Assert.True(gameFile.SetLoaded(true)); + Assert.False(gameFile.SetLoaded(true)); + + Assert.True(gameFile.SetLoaded(false)); + Assert.False(gameFile.SetLoaded(false)); + } + } +} diff --git a/CodeWalker.Test/MetaTypesTests.cs b/CodeWalker.Test/MetaTypesTests.cs new file mode 100644 index 0000000..b07e1c4 --- /dev/null +++ b/CodeWalker.Test/MetaTypesTests.cs @@ -0,0 +1,716 @@ +using CodeWalker.GameFiles; +using System; +using System.Buffers.Binary; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Xml.Linq; +using Xunit; +using Xunit.Abstractions; + +namespace CodeWalker.Test +{ + public static class TestData + { + public const string ReferenceDataBytes = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAADWA9YDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAATABMAAAAAAAAAAAAAAAAACgAAAAAAAADZAdkBAAAAAAYAAAAAAAAAogGiAQAAAAABAAAAAAAAADsAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3///8mAAAANgAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAACAQgAAgEIAAAAAAAAAAAAAAAAIQDQAAAAAAEgDSAMAAAAABwAAAAAAAAAGAAYAAAAAAAgAAAAAAAAANwA3AAAAAAAIwA0AAAAAAB4AHgAAAAAACEAVAAAAAAAOAA4AAAAAAAjAGAAAAAAACQAJAAAAAAAIABsAAAAAAAIAAgAAAAAACIAbAAAAAAABAAEAAAAAAA=="; + public static CScenarioPointRegion ReferenceData => new CScenarioPointRegion + { + AccelGrid = new rage__spdGrid2D + { + CellDimX = 64, + CellDimY = 64, + MaxCellX = 38, + MaxCellY = 73, + MinCellX = -3, + MinCellY = 54, + }, + ChainingGraph = new CodeWalker.GameFiles.CScenarioChainingGraph + { + Chains = new CodeWalker.GameFiles.Array_Structure + { + Count1 = 59, + Count2 = 59, + Pointer = 1, + }, + Edges = new CodeWalker.GameFiles.Array_Structure + { + Count1 = 418, + Count2 = 418, + Pointer = 6, + }, + Nodes = new CodeWalker.GameFiles.Array_Structure + { + Count1 = 473, + Count2 = 473, + Pointer = 10, + } + }, + Clusters = new CodeWalker.GameFiles.Array_Structure + { + Count1 = 6, + Count2 = 6, + Pointer = 7, + }, + EntityOverrides = new CodeWalker.GameFiles.Array_Structure + { + Count1 = 19, + Count2 = 19, + Pointer = 2, + }, + LookUps = new CodeWalker.GameFiles.CScenarioPointLookUps + { + GroupNames = new CodeWalker.GameFiles.Array_uint + { + Count1 = 9, + Count2 = 9, + Pointer = 1622024, + }, + InteriorNames = new CodeWalker.GameFiles.Array_uint + { + Count1 = 2, + Count2 = 2, + Pointer = 1769480, + }, + PedModelSetNames = new CodeWalker.GameFiles.Array_uint + { + Count1 = 30, + Count2 = 30, + Pointer = 901128, + }, + RequiredIMapNames = new CodeWalker.GameFiles.Array_uint + { + Count1 = 1, + Count2 = 1, + Pointer = 1802248, + }, + TypeNames = new CodeWalker.GameFiles.Array_uint + { + Count1 = 55, + Count2 = 55, + Pointer = 8, + }, + VehicleModelSetNames = new CodeWalker.GameFiles.Array_uint + { + Count1 = 14, + Count2 = 14, + Pointer = 1392648, + }, + }, + Points = new CodeWalker.GameFiles.CScenarioPointContainer + { + LoadSavePoints = new CodeWalker.GameFiles.Array_Structure + { + PointerDataIndex = 4294967295, + }, + MyPoints = new CodeWalker.GameFiles.Array_Structure + { + Count1 = 982, + Count2 = 982, + Pointer = 3, + } + }, + Unk_3844724227 = new CodeWalker.GameFiles.Array_ushort + { + Count1 = 840, + Count2 = 840, + Pointer = 3424264, + } + }; + } + + public class PsoTypesTests + { + private readonly ITestOutputHelper _output; + public PsoTypesTests(ITestOutputHelper testOutputHelper) + { + _output = testOutputHelper; + } + + private const string ExpectedResult = "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTAraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTEraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTMraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTQraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTUraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTYraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMytoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWw3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsNytoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsOCtoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWw5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsOStoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3QzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0MytoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0NCtoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0NStoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0NitoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0NytoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0OCtoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; + private const string InputData = "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTAraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTEraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTMraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTQraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTUraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwxNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMTYraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWwzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsMytoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWw3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsNytoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsOCtoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N0d2hlZWw5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdHdoZWVsOStoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3QzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0MytoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0NCtoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0NStoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0NitoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0NytoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pyMzUwX3N1c3Q4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6cjM1MF9zdXN0OCtoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; + + [Fact] + public void TestConvertData() + { + var data = Convert.FromBase64String(InputData); + var result = PsoTypes.ConvertDataArrayRaw(data, 0, 43); + Assert.Equal(43, result.Length); + + var firstResult = result[0]; + + Assert.Equal(768, firstResult.Unused02); + Assert.Equal("zr350_dash1+hifr", firstResult.HDTxd.ToString()); + Assert.Equal("zr350_dash1", firstResult.targetAsset.ToString()); + + var outputData = Convert.ToBase64String(MemoryMarshal.AsBytes(result.AsSpan())); + + Assert.Equal(ExpectedResult, outputData); + + Assert.Equal(InputData, outputData); + } + + private const string InputDataWithOffset = "UFNJTgAAAXhwcHBwcHBwcAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnYl9idW1mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2JfYnVtZitoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnYl9idW1yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2JfYnVtcitoaWZyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="; + + [Fact] + public void TestConvertDataWithOffset() + { + var data = Convert.FromBase64String(InputDataWithOffset); + + var result = PsoTypes.ConvertDataArrayRaw(data, 112, 2); + Assert.Equal(2, result.Length); + + var firstResult = result[0]; + + Assert.Equal(768, firstResult.Unused02); + Assert.Equal("gb_bumf+hifr", firstResult.HDTxd.ToString()); + Assert.Equal("gb_bumf", firstResult.targetAsset.ToString()); + + var secondResult = result[1]; + + Assert.Equal(768, secondResult.Unused02); + Assert.Equal("gb_bumr+hifr", secondResult.HDTxd.ToString()); + Assert.Equal("gb_bumr", secondResult.targetAsset.ToString()); + + data = Convert.FromBase64String("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"); + var result2 = PsoTypes.ConvertDataArrayRaw(data, 144, 160); + Assert.Equal(160, result2.Length); + + var firstResult2 = result2[0]; + + Assert.Equal(0, firstResult2.Unused0); + Assert.Equal(1254242044u, firstResult2.imapName.Hash); + Assert.Equal(256, firstResult2.itypDepArray.Count1); + Assert.Equal(256, firstResult2.itypDepArray.Count2); + Assert.Equal(50331648ul, firstResult2.itypDepArray.Pointer); + + var lastResult = result2[159]; + + Assert.Equal(0, lastResult.Unused0); + Assert.Equal(2255575624, lastResult.imapName.Hash); + Assert.Equal(256, lastResult.itypDepArray.Count1); + Assert.Equal(256, lastResult.itypDepArray.Count2); + Assert.Equal(54542593ul, lastResult.itypDepArray.Pointer); + } + + [Fact] + public void TestStringConversion() + { + var arr = new byte[64]; + + for (int i = 0; i <= 'j' - 'a'; i++) + { + arr[i] = (byte)('a' + i); + } + + MemoryMarshal.TryRead(arr, out var str1); + MemoryMarshal.TryRead(arr, out var str2); + + Assert.Equal("abcdefghij", str1.ToString()); + Assert.Equal("abcdefghij", str2.ToString()); + + for (int i = 0; i <= 'Z' - 'A'; i++) + { + arr[i] = (byte)('A' + i); + } + + MemoryMarshal.TryRead(arr, out str1); + MemoryMarshal.TryRead(arr, out str2); + + Assert.Equal("ABCDEFGHIJKLMNOPQRSTUVWXYZ", str1.ToString()); + Assert.Equal("ABCDEFGHIJKLMNOPQRSTUVWXYZ", str2.ToString()); + } + + [Fact] + public void StringConversionShouldRespectNullTerminators() + { + var arr = new byte[64]; + + for (int i = 0; i <= 'Z' - 'A'; i++) + { + arr[i] = (byte)('A' + i); + } + + arr[15] = (byte)'\0'; + + MemoryMarshal.TryRead(arr, out var str1); + + Assert.Equal("ABCDEFGHIJKLMNO", str1.ToString()); + + MemoryMarshal.TryRead(arr, out var str2); + + Assert.Equal("ABCDEFGHIJKLMNO", str2.ToString()); + } + + [Fact] + public void TestGetItem() + { + var data = Convert.FromBase64String("UFNJTgAAAoBwcHBwcHBwcAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6aGFiX2Noc3NfMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAemhhYl9jaHNzXzMraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6aGFiX2ZlbmRfMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAemhhYl9mZW5kXzIraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6aGFiX21pcnJfMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAemhhYl9taXJyXzEraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6aGFiX21pcnJfMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAemhhYl9taXJyXzIraGlmcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="); + + var result = PsoTypes.ConvertData(data, 16); + + Assert.Equal(4, result._HDTxdBindingArray.Count1); + Assert.Equal(4, result._HDTxdBindingArray.Count2); + Assert.Equal(2ul, result._HDTxdBindingArray.Pointer); + + + Assert.Equal(0, result._Interiors.Count1); + Assert.Equal(0, result._Interiors.Count2); + Assert.Equal(0ul, result._Interiors.Pointer); + + Assert.Equal(0, result._MapDataGroups.Count1); + Assert.Equal(0, result._MapDataGroups.Count2); + Assert.Equal(0ul, result._MapDataGroups.Pointer); + + Assert.Equal(0, result._imapDependencies.Count1); + Assert.Equal(0, result._imapDependencies.Count2); + Assert.Equal(0ul, result._imapDependencies.Pointer); + + Assert.Equal(0, result._imapDependencies_2.Count1); + Assert.Equal(0, result._imapDependencies_2.Count2); + Assert.Equal(0ul, result._imapDependencies_2.Pointer); + + Assert.Equal(0, result._itypDependencies_2.Count1); + Assert.Equal(0, result._itypDependencies_2.Count2); + Assert.Equal(0ul, result._itypDependencies_2.Pointer); + } + } + + public class MetaTypesTests + { + private readonly ITestOutputHelper _output; + public MetaTypesTests(ITestOutputHelper testOutputHelper) + { + _output = testOutputHelper; + } + [Fact] + public void TestConvertData() + { + var data = BitConverter.GetBytes((uint)1234); + var number = MetaTypes.ConvertData(data); + + Assert.Equal(1234U, number); + } + + [Fact] + public void Test_Convert_Data_From_Bytes() + { + var bytes = Convert.FromBase64String(TestData.ReferenceDataBytes); + + var newData = MetaTypes.ConvertData(bytes); + + Assert.Equivalent(TestData.ReferenceData, newData); + } + + [Fact] + public void Test_Convert_Data_From_Bytes_Offset() + { + var bytes = Convert.FromBase64String(TestData.ReferenceDataBytes); + bytes = new byte[4].Concat(bytes).ToArray(); + + var newData = MetaTypes.ConvertData(bytes, 4); + + Assert.Equivalent(TestData.ReferenceData, newData); + + MetaTypes.TryConvertData(bytes, 4, out newData); + + Assert.Equivalent(TestData.ReferenceData, newData); + } + + [Fact] + public void Test_Convert_To_Bytes() + { + var bytes = MetaTypes.ConvertToBytes(TestData.ReferenceData); + + var bytesBase64 = Convert.ToBase64String(bytes); + + Assert.Equivalent(TestData.ReferenceDataBytes, bytesBase64); + } + + [Fact] + public void Test_Convert_Data_From_And_To_Bytes() + { + var bytes = MetaTypes.ConvertToBytes(TestData.ReferenceData); + + var newData = MetaTypes.ConvertData(bytes); + + Assert.Equivalent(TestData.ReferenceData, newData); + } + + private readonly SharpDX.Vector3[] referenceArray = new SharpDX.Vector3[] { new SharpDX.Vector3(12.5f, 23.0f, 65.0f), new SharpDX.Vector3(1234.234f, 17896.22f, 9845.12f), new SharpDX.Vector3(-12.3f, -82349.123f, 1234.9f), new SharpDX.Vector3(-23412.4f, 1289.2f, 948.0f) }; + private readonly string referenceArrayBytes = "AABIQQAAuEEAAIJCfUeaRHHQi0Z71BlGzcxEwZDWoMfNXJpEzei2xmYmoUQAAG1E"; + + [Fact] + public void Test_Convert_Array_To_Bytes() + { + var bytes = MetaTypes.ConvertArrayToBytes(referenceArray); + + var base64 = Convert.ToBase64String(bytes); + + Assert.Equal(referenceArrayBytes, base64); + } + + [Fact] + public void Test_Convert_Bytes_To_Array() + { + var bytes = Convert.FromBase64String(referenceArrayBytes); + var arr = MetaTypes.ConvertDataArray(bytes, 0, referenceArray.Length).ToArray(); + Assert.Equal(referenceArray, arr); + + var newBytes = MetaTypes.ConvertArrayToBytes(arr); + + var base64 = Convert.ToBase64String(newBytes); + + Assert.Equal(referenceArrayBytes, base64); + } + + [Fact] + public void TestSwapBytes() + { + ushort testValue = (ushort)12345u; + ushort result = MetaTypes.SwapBytes(testValue); + + Assert.Equal(14640, result); + Assert.Equal(testValue, MetaTypes.SwapBytes(result)); + + uint testValueUInt = 12345u; + uint resultUInt = MetaTypes.SwapBytes(testValueUInt); + + Assert.Equal(959447040u, resultUInt); + Assert.Equal(testValueUInt, MetaTypes.SwapBytes(resultUInt)); + + int testValueInt = 12345; + int resultInt = MetaTypes.SwapBytes(testValueInt); + + Assert.Equal(959447040, resultInt); + Assert.Equal(testValueInt, MetaTypes.SwapBytes(resultInt)); + + short testValueShort = (short)12345; + short resultShort = MetaTypes.SwapBytes(testValueShort); + + Assert.Equal(14640, resultShort); + Assert.Equal(testValueShort, MetaTypes.SwapBytes(resultShort)); + + ulong testValueUlong = 0x123456789ABCDEFFUL; + ulong resultUlong = MetaTypes.SwapBytes(testValueUlong); + + Assert.Equal(0x78563412FFDEBC9AUL, resultUlong); + Assert.Equal(testValueUlong, MetaTypes.SwapBytes(resultUlong)); + + float testValueFloat = 12345.12345f; + float resultFloat = MetaTypes.SwapBytes(testValueFloat); + + Assert.Equal(1.5169885490328965E+38, resultFloat); + Assert.Equal(testValueFloat, MetaTypes.SwapBytes(resultFloat)); + } + } + + public class TestResourceData + { + [Fact] + public void Test_Write_Struct() + { + using var systemStream = new MemoryStream(); + using var graphicsStream = new MemoryStream(); + + using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream); + dataWriter.Position = 0x50000000; + + dataWriter.WriteStruct(TestData.ReferenceData); + + var buffer = systemStream.ToArray(); + + var base64 = Convert.ToBase64String(buffer); + + Assert.Equal(TestData.ReferenceDataBytes, base64); + } + + [Fact] + public void Test_Read_Struct() + { + var buffer = Convert.FromBase64String(TestData.ReferenceDataBytes); + using var systemStream = new MemoryStream(buffer); + using var graphicsStream = new MemoryStream(); + + using var dataReader = new ResourceDataReader(systemStream, graphicsStream); + + var region = dataReader.ReadStruct(); + + Assert.Equal(TestData.ReferenceData, region); + } + + [Fact] + public void Test_Write_Single() + { + using var systemStream = new MemoryStream(); + using var graphicsStream = new MemoryStream(); + + using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream); + dataWriter.Position = 0x50000000; + + dataWriter.Write(20.0f); + + var buffer = systemStream.ToArray(); + var result = BitConverter.ToSingle(buffer, 0); + + Assert.Equal(20.0f, result); + } + + [Fact] + public void Test_Write_Single_Big_Endian() + { + using var systemStream = new MemoryStream(); + using var graphicsStream = new MemoryStream(); + + using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream, Endianess.BigEndian); + dataWriter.Position = 0x50000000; + + dataWriter.Write(20.0f); + + var buffer = systemStream.ToArray(); + + var valueInt = BinaryPrimitives.ReadInt32BigEndian(buffer); + var valueFloat = Unsafe.ReadUnaligned(ref Unsafe.As(ref valueInt)); + //BinaryPrimitives.ReverseEndianness(20.0f) + + Assert.Equal(20.0f, valueFloat); + + dataWriter.Position = 0x50000000; + + dataWriter.Write(double.MaxValue); + + buffer = systemStream.ToArray(); + + var valueLong = BinaryPrimitives.ReadInt64BigEndian(buffer); + var valueDouble = Unsafe.ReadUnaligned(ref Unsafe.As(ref valueLong)); + + Assert.Equal(double.MaxValue, valueDouble); + } + + [Fact] + public void Test_Write_Multiple_Structs() + { + using var systemStream = new MemoryStream(); + using var graphicsStream = new MemoryStream(); + + using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream); + dataWriter.Position = 0x50000000; + + dataWriter.WriteStructs(new[] + { + TestData.ReferenceData, + TestData.ReferenceData, + TestData.ReferenceData, + TestData.ReferenceData + }); + + var buffer = systemStream.ToArray(); + + var structs = MemoryMarshal.Cast(buffer); + + Assert.Equal(4, structs.Length); + + foreach (var scenarioRegion in structs) + { + Assert.Equal(TestData.ReferenceData, scenarioRegion); + } + } + + [Fact] + public void Test_Read_Multiple_Structs() + { + using var systemStream = new MemoryStream(); + using var graphicsStream = new MemoryStream(); + + using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream); + dataWriter.Position = 0x50000000; + + dataWriter.WriteStructs(new[] + { + TestData.ReferenceData, + TestData.ReferenceData, + TestData.ReferenceData, + TestData.ReferenceData + }); + + var buffer = systemStream.ToArray(); + systemStream.Position = 0; + var dataReader = new ResourceDataReader(systemStream, graphicsStream); + + + var structs = dataReader.ReadStructs(4); + + Assert.Equal(4, structs.Length); + + foreach (var scenarioRegion in structs) + { + Assert.Equal(TestData.ReferenceData, scenarioRegion); + } + + structs = dataReader.ReadStructsAt(0 | 0x50000000, 4); + + foreach (var scenarioRegion in structs) + { + Assert.Equal(TestData.ReferenceData, scenarioRegion); + } + + systemStream.Position = 0; + dataWriter.Position = 0x50000000; + + dataWriter.Write(new byte[] { 0, 0, 0, 0 }); + + dataWriter.WriteStructs(new[] +{ + TestData.ReferenceData, + TestData.ReferenceData, + TestData.ReferenceData, + TestData.ReferenceData + }); + + structs = dataReader.ReadStructsAt(4 | 0x50000000, 4); + + foreach (var scenarioRegion in structs) + { + Assert.Equal(TestData.ReferenceData, scenarioRegion); + } + } + + //[Fact] + //public void Test() + //{ + // var attachedObjects = MetaTypes.GetUintArray(meta, _Data.attachedObjects); + //} + + private const string ArchetypeData = "AAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAACYimfA1ehVuLYT5b4BAIB/JopnQFmFTTiUE+U+AQCAfwAAZLfAN4a1AAAItQEAgH/sTWlAAACgQFVVCx0lzgxeAAAAAAAAAAAAAAAAAgAAAFVVCx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAAAY0EjAAAAAAC6txr4BAIB/MdBIQL03hjUMrcY+AQCAfwAAQDa9NwY1AAAItQEAgH/FV0pAAACgQNUOy/klzgxeAAAAAAAAAAAAAAAAAgAAANUOy/kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAAAx0EjAvTeGtS6txr4BAIB/GNBIQAAAAAAMrcY+AQCAfwAAULa9Nwa1AAAItQEAgH/FV0pAAACgQEiqhAclzgxeAAAAAAAAAAAAAAAAAgAAAEiqhAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAAAY0EjAkwEgvC6txr4BAIB/MdBIQGH9H7wMrcY+AQCAfwAAQDZ6/x+8AAAItQEAgH/FV0pAAACgQKSeG4ElzgxeAAAAAAAAAAAAAAAAAgAAAKSeG4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAAAxtGa/csLov5Jc7r4BAIB/MbRmP4vC6D8OgpA/AQCAfwAAAAAAAMA10tWpPgEAgH/jjAtAAACgQIfyZY4lzgxeAAAAAAAAAAAAAAAAAgAAAIfyZY4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAAALJAPB8jGNwZaxG8ABAIB/NAYFQeBdl0FFuWFAAQCAfwAVcT3gviI/YA8MPwEAgH8sQqJBAACgQHL9S+klzgxeAAAAAAAAAAAAAAAAAgAAAHL9S+kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAAAKLn/ABr2HQCHIl78BAIB/v5s+wMU4s0ArFKE/AQCAf+TkXsDmep1AoMAUPQEAgH9vRb4/AACgQFfFB8MlzgxeAAAAAAAAAAAAAAAAAgAAAFfFB8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAACi49fArIuHwUSHNMABAIB/uePXQCvaikFEhzRAAQCAfwAAwDYAoFM+AAAAAAEAgH9xJpVBAACgQHfsUVglzgxeAAAAAAAAAAAAAAAAAgAAAHfsUVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAAALiATB8jGNwZaxG8ABAIB/NAYFQeBdl0ETZG9AAQCAfwBUfDzgviI/+GQnPwEAgH8mh6JBAACgQBJukFolzgxeAAAAAAAAAAAAAAAAAgAAABJukFoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAABCa4rAzOZiwV1wB8ABAIB/LdDSQFwRgEEnUEBAAQCAf9jJkD9g32k/KH/jPgEAgH/3B4JBAACgQAPtbvIlzgxeAAAAAAAAAAAAAAAAAgAAAAPtbvIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAgAAAAAAAAAAAAAAAAAAAAAAABw/QLBnTGhwUn1278BAIB/VEUPQa5Ll0G0TJ1AAQCAf0B+xD7gXh6/w57MPwEAgH+hraxBAACgQMJw94QAAAAAAAAAAAAAAAAAAAAAAgAAAMJw94QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAABQmNbAvGduwY4GYL8BAIB/X7TVQDqwQ0EctYY/AQCAfwDwY7wI3qq/qI61PQEAgH8dg3JBAACgQF2sfxslzgxeAAAAAAAAAAAAAAAAAgAAAF2sfxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAACnXNjAzySKwT7MAUABAIB/FD7TQA7RjUEhr1BAAQCAf0DSo72AD2s+sD0pQAEAgH9G65VBAACgQP9/spclzgxeAAAAAAAAAAAAAAAAAgAAAP9/spcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAAAANwu9enIzwFxymr8BAIB/lSkmPXVyM0BUcpo/AQCAf6CUVzsAAAC1AAAAtQEAgH9bX0NAAACgQC4F4xglzgxeAAAAAAAAAAAAAAAAAgAAAC4F4xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAACHiFu9cXIzwFxymr8BAIB/4PZEPXpyM0BUcpo/AQCAfzCNNLsAAKA1AAAAtQEAgH+RYkNAAACgQP3hSkclzgxeAAAAAAAAAAAAAAAAAgAAAP3hSkcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAAAJNri/F/HdvX7gLr8BAIB/pDW4PzDz3T1+4C4/AQCAfwAAzLYAgAY2AAAAAAEAgH9jYcw/AACgQM6jquglzgxeAAAAAAAAAAAAAAAAAgAAAM6jqugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCAAAAAAAAAAAAAAAAAAAAAAAAAACHiFu9dXIzwFxymr8BAIB/4PZEPXVyM0BUcpo/AQCAfzCNNLsAAAAAAAAAtQEAgH+NYkNAAACgQDjw2rUlzgxeAAAAAAAAAAAAAAAAAgAAADjw2rUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAABHdwTAqd0awJKRs7oBAIB/gXcEQKXdGkCSkbM6AQCAfwAA6DYAAAC1AAAAAAEAgH99yktAAACgQLF+sQIlzgxeAAAAAAAAAAAAAAAAAgAAALF+sQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAABVL7m/3EjpvwAAAAABAIB/LzC5PwZJ6T8AAAAAAQCAfwAAWjcAACg2AAAAAAEAgH8U7RRAAACgQIFf4BwlzgxeAAAAAAAAAAAAAAAAAgAAAIFf4BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAADG+0XAsDpHwL03hrUBAIB/ZftFQKw6R0C9NwY2AQCAfwAAQLcAAAC1vjcGNQEAgH+zb4xAAACgQCUyMgYlzgxeAAAAAAAAAAAAAAAAAgAAACUyMgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAAD/JX2/AHAjwL03hrUBAIB/ryR9P+9vI0AAAAAAAQCAfwAAKLcAAAC2vTcGtQEAgH81Qy9AAACgQJqWbPglzgxeAAAAAAAAAAAAAAAAAgAAAJqWbPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAAAAxgXA/3l5wJxTSbYBAIB/68UFQAd6eUCcU0k2AQCAfwAAILYAAIA1AAAAAAEAgH8kio1AAACgQPUilP4lzgxeAAAAAAAAAAAAAAAAAgAAAPUilP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAAADQ7y/9pcIwAAAAAABAIB/fEK8P/aXCEC9N4Y1AQCAfwAABrcAAAAAvTcGNQEAgH/z4iVAAACgQJaGZPAlzgxeAAAAAAAAAAAAAAAAAgAAAJaGZPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAACKAQ7A93bXvxb7y7wBAIB/AAIOQP921z8v/cs8AQCAfwAAbDcAAAA1AAAGNQEAgH86QTJAAACgQLwZ/DklzgxeAAAAAAAAAAAAAAAAAgAAALwZ/DkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAADUIwPBslSewcrf7b8BAIB/MgYFQeBdl0Ho2OG/AQCAfwAvcT1A2t6+WdznvwEAgH8QWKhBAACgQDcbq+MlzgxeAAAAAAAAAAAAAAAAAgAAADcbq+MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhCACAAAAAAAAAAAAAAAAAAAAAAAADYfszAdjI/wSdPCb8BAIB/qH7MQHUyP0EnTwk/AQCAfwAAQLcAAAAAAAAAAAEAgH9h/VhBAACgQL+uSSUlzgxeAAAAAAAAAAAAAAAAAgAAAL+uSSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; + + private readonly CBaseArchetypeDef referenceArchetype = new CBaseArchetypeDef + { + assetName = new MetaHash((uint)0x1d0b5555), + assetType = rage__fwArchetypeDef__eAssetType.ASSET_TYPE_DRAWABLE, + bbMax = new SharpDX.Vector3(3.617807f, 4.9E-05f, 0.447415f), + bbMin = new SharpDX.Vector3(-3.617834f, -5.1E-05f, -0.447416f), + bsCentre = new SharpDX.Vector3(-1.3589859E-05f, -1.00000034E-06f, -5.066395E-07f), + bsRadius = 3.645381f, + hdTextureDist = 5, + lodDist = 100, + Unused05 = float.NaN, + Unused06 = float.NaN, + Unused07 = float.NaN, + name = new MetaHash((uint)0x1d0b5555), + textureDictionary = new MetaHash((uint)0x5e0cce25), + flags = 0x00002000, + }; + + [Fact] + public void TestConvertDataRaw() + { + var data = Convert.FromBase64String(ArchetypeData); + var basearch = PsoTypes.ConvertDataRawOld(data, 0); + + Assert.Equivalent(referenceArchetype, basearch); + + var basearch2 = PsoTypes.ConvertDataRaw(data, 0); + + Assert.Equivalent(basearch, basearch2); + + var random = new Random(); + var length = random.Next(100); + + var newData = Enumerable.Empty().Concat(new byte[length]).Concat(data).ToArray(); + + basearch = PsoTypes.ConvertDataRawOld(newData, length); + Assert.Equivalent(basearch, referenceArchetype); + + basearch2 = PsoTypes.ConvertDataRaw(newData, length); + + Assert.Equivalent(basearch, basearch2); + + //a.Extensions = MetaTypes.GetExtensions(Meta, basearch.extensions); + } + } + + public class TestConvertDataArray + { + private readonly ITestOutputHelper _output; + public TestConvertDataArray(ITestOutputHelper output) + { + _output = output; + } + private static string GetFilePath(string filename) + { + // Directory we're looking for. + var dirToFind = Path.Combine(@"CodeWalker.Test", "Files"); + + // Search up directory tree starting at assembly path looking for 'Images' dir. + var searchPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + while (true) + { + var testPath = Path.Combine(searchPath, dirToFind); + if (Directory.Exists(testPath)) + { + // Found it! + return Path.Combine(testPath, filename); + } + + // Move up one directory. + var newSearchPath = Path.GetFullPath(Path.Combine(searchPath, "..")); + if (newSearchPath == searchPath) + { + // Didn't move up, so we're at the root. + throw new FileNotFoundException($"Could not find '{dirToFind}' directory."); + } + searchPath = newSearchPath; + } + } + + public string TestData = "AAAAAAAAAAAFAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAKDAAACgwAAAAMAAAAAAAACgQAAAoEAAAABAAAAAAAAAgD9kViJCAAAAAGAAAAABAAAAAAAAAP////8AAAAABgAAAAAAAAABAAEAAAAAAAAAAAAAAAAABWAAAAAAAAAKAAoAAAAAAAAAAAAAAAAAgPEnwiB/QcIAcFzBAAAAAADgDsL9ke/BHKgswQAAAAAAAIA/yyTUkwAAAABgAAAAAQAAAAEAAAD/////AAAAAAYAAQAAAAAALgAuAAAAAAA="; + [Fact] + public void ConvertDataArrayShouldReturnSameAsConvertData() + { + var data = Convert.FromBase64String(TestData); + + var referenceData = MetaTypes.ConvertData(data); + + var arrayData = MetaTypes.ConvertDataArray(data, 0, 2); + + var path = GetFilePath("anwblokaal.ytyp"); + var bytes = File.ReadAllBytes(path); + var entry = RpfFile.CreateFileEntry("anwblokaal.ytyp", path, ref bytes); + var ytypFile = RpfFile.GetFile(entry, bytes); + + var rooms = ytypFile.AllArchetypes + .Where(p => p is MloArchetype) + .Select(p => p as MloArchetype) + .SelectMany(p => p.rooms) + .Select(p => p.Data); + + var secondRoom = rooms.Last(); + + var arr = new byte[Marshal.SizeOf() * rooms.Count()]; + //MemoryMarshal.Write(arr.AsSpan(), ref rooms); + + _output.WriteLine(Convert.ToBase64String(MemoryMarshal.AsBytes(rooms.ToArray().AsSpan()))); + + // I know the bbMax values don't really make sense here, seems to be a weird ytyp, but it's mostly about testing the serialization, not about using a 100% correct ytyp + // And didn't want to include a ytyp from Rockstar Games since that could cause some legal issues down the road + // Another possible solution would be to do abest attempt to find the GTA V installed on the user's computer running the tests and use files from there, but this would add complexity and links which could break tests + // However this would be more in the scope of implementation testing as it tests the whole chain including encryption which is not wanted here + Assert.Equivalent(new SharpDX.Vector3(-41.98584f, -48.3741455f, -13.7773438f), secondRoom.bbMin); + Assert.Equivalent(new SharpDX.Vector3(-35.71875f, -29.9462833f, -10.7910423f), secondRoom.bbMax); + Assert.Equivalent(new Array_uint(65542, 46), secondRoom.attachedObjects); + Assert.Equal(96u, secondRoom.flags); + Assert.Equal(1, secondRoom.floorId); + Assert.Equivalent(new CharPointer() { Count1 = 10, Count2 = 10, Pointer = 24581 }, secondRoom.name); + Assert.Equal(1u, secondRoom.portalCount); + Assert.Equal(2480153803, secondRoom.timecycleName.Hash); + + // First room is limbo, so this check isn't that useful, but just make sure, and the following check will compare the entire array anyways + Assert.Equivalent(referenceData, rooms.First()); + + Assert.Equivalent(arrayData.ToArray(), rooms); + } + } +} \ No newline at end of file diff --git a/CodeWalker.Test/ResourceBaseTypesTests.cs b/CodeWalker.Test/ResourceBaseTypesTests.cs new file mode 100644 index 0000000..d144c76 --- /dev/null +++ b/CodeWalker.Test/ResourceBaseTypesTests.cs @@ -0,0 +1,37 @@ +using CodeWalker.GameFiles; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace CodeWalker.Test +{ + public class ResourceBaseTypesTests + { + [Fact] + public void AddingItemsToResourceSimpleArrayShouldAddItem() + { + var list = new ResourceSimpleArray(); + + var entry1 = new ClipAnimationsEntry(); + list.Add(entry1); + + var entry2 = new ClipAnimationsEntry(); + list.Add(entry2); + + Assert.Equal(entry1, list[0]); + Assert.Equal(entry2, list[1]); + + list = new ResourceSimpleArray(); + list.Data = new List(); + + list.Add(entry1); + list.Add(entry2); + + Assert.Equal(entry1, list[0]); + Assert.Equal(entry2, list[1]); + } + } +} diff --git a/CodeWalker.Test/RpfFileTests.cs b/CodeWalker.Test/RpfFileTests.cs new file mode 100644 index 0000000..a1b47c6 --- /dev/null +++ b/CodeWalker.Test/RpfFileTests.cs @@ -0,0 +1,58 @@ +using CodeWalker.GameFiles; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; +using Xunit.Abstractions; + +namespace CodeWalker.Test +{ + public class RpfFileTests(ITestOutputHelper testOutputHelper) + { + public static IEnumerable RpfFiles => new List + { + new object[] { new RpfResourceFileEntry() }, + new object[] { new RpfBinaryFileEntry() }, + }; + + [Theory] + [MemberData(nameof(RpfFiles))] + public void SettingFileSizeShouldUpdateHFileSize(RpfFileEntry fileEntry) + { + fileEntry.FileSize = 0x64U; + + Assert.Equal(0x64U, fileEntry.FileSize); + } + + [Theory] + [MemberData(nameof(RpfFiles))] + public void SettingFileOffsetShouldRemoveSystemPosition(RpfFileEntry fileEntry) + { + fileEntry.FileOffset = 0x021D30U; + + Assert.Equal(0x021D30U, fileEntry.FileOffset); + } + + [Theory] + [MemberData(nameof(RpfFiles))] + public void SettingNameOffsetShouldUpdateNameOffset(RpfFileEntry fileEntry) + { + fileEntry.NameOffset = 0x022E; + + Assert.Equal(0x022EU, fileEntry.NameOffset); + } + + [Theory] + [MemberData(nameof(RpfFiles))] + public void HeaderRelatedChangesShouldBeReflectedInHeader(RpfFileEntry fileEntry) + { + fileEntry.NameOffset = 0x022E; + fileEntry.FileOffset = 0x021D30U; + fileEntry.FileSize = 0x147067; + + Assert.Equal(0x821D30147067022EUL, fileEntry.Header); + } + } +} diff --git a/CodeWalker.Test/SequenceReaderTests.cs b/CodeWalker.Test/SequenceReaderTests.cs new file mode 100644 index 0000000..773264c --- /dev/null +++ b/CodeWalker.Test/SequenceReaderTests.cs @@ -0,0 +1,34 @@ +using CodeWalker.Core.Utils; +using System; +using System.Buffers; +using System.Buffers.Binary; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace CodeWalker.Test +{ + public class SequenceReaderTests + { + [Fact] + public void SetPositionShouldSetConsumedToGivenValue() + { + var bytes = new byte[1024]; + BinaryPrimitives.WriteDoubleLittleEndian(bytes.AsSpan(0, 8), 12.6d); + var sequence = new ReadOnlySequence(bytes); + var reader = new SequenceReader(sequence); + + Assert.Equal(0, reader.Consumed); + Assert.Equal(12.6d, reader.ReadDouble()); + Assert.Equal(8, reader.Consumed); + reader.SetPosition(2); + Assert.Equal(2, reader.Consumed); + + reader.SetPosition(197); + Assert.Equal(197, reader.Consumed); + + } + } +} diff --git a/CodeWalker.Test/TestBinaryConversions.cs b/CodeWalker.Test/TestBinaryConversions.cs deleted file mode 100644 index 4b69b2f..0000000 --- a/CodeWalker.Test/TestBinaryConversions.cs +++ /dev/null @@ -1,534 +0,0 @@ -using CodeWalker.GameFiles; -using System; -using System.Buffers.Binary; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Text; -using System.Xml.Linq; -using Xunit; -using Xunit.Abstractions; - -namespace CodeWalker.Test -{ - public static class TestData - { - public const string ReferenceDataBytes = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAADWA9YDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAATABMAAAAAAAAAAAAAAAAACgAAAAAAAADZAdkBAAAAAAYAAAAAAAAAogGiAQAAAAABAAAAAAAAADsAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP3///8mAAAANgAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAACAQgAAgEIAAAAAAAAAAAAAAAAIQDQAAAAAAEgDSAMAAAAABwAAAAAAAAAGAAYAAAAAAAgAAAAAAAAANwA3AAAAAAAIwA0AAAAAAB4AHgAAAAAACEAVAAAAAAAOAA4AAAAAAAjAGAAAAAAACQAJAAAAAAAIABsAAAAAAAIAAgAAAAAACIAbAAAAAAABAAEAAAAAAA=="; - public static CScenarioPointRegion ReferenceData => new CScenarioPointRegion - { - AccelGrid = new rage__spdGrid2D - { - CellDimX = 64, - CellDimY = 64, - MaxCellX = 38, - MaxCellY = 73, - MinCellX = -3, - MinCellY = 54, - }, - ChainingGraph = new CodeWalker.GameFiles.CScenarioChainingGraph - { - Chains = new CodeWalker.GameFiles.Array_Structure - { - Count1 = 59, - Count2 = 59, - Pointer = 1, - }, - Edges = new CodeWalker.GameFiles.Array_Structure - { - Count1 = 418, - Count2 = 418, - Pointer = 6, - }, - Nodes = new CodeWalker.GameFiles.Array_Structure - { - Count1 = 473, - Count2 = 473, - Pointer = 10, - } - }, - Clusters = new CodeWalker.GameFiles.Array_Structure - { - Count1 = 6, - Count2 = 6, - Pointer = 7, - }, - EntityOverrides = new CodeWalker.GameFiles.Array_Structure - { - Count1 = 19, - Count2 = 19, - Pointer = 2, - }, - LookUps = new CodeWalker.GameFiles.CScenarioPointLookUps - { - GroupNames = new CodeWalker.GameFiles.Array_uint - { - Count1 = 9, - Count2 = 9, - Pointer = 1622024, - }, - InteriorNames = new CodeWalker.GameFiles.Array_uint - { - Count1 = 2, - Count2 = 2, - Pointer = 1769480, - }, - PedModelSetNames = new CodeWalker.GameFiles.Array_uint - { - Count1 = 30, - Count2 = 30, - Pointer = 901128, - }, - RequiredIMapNames = new CodeWalker.GameFiles.Array_uint - { - Count1 = 1, - Count2 = 1, - Pointer = 1802248, - }, - TypeNames = new CodeWalker.GameFiles.Array_uint - { - Count1 = 55, - Count2 = 55, - Pointer = 8, - }, - VehicleModelSetNames = new CodeWalker.GameFiles.Array_uint - { - Count1 = 14, - Count2 = 14, - Pointer = 1392648, - }, - }, - Points = new CodeWalker.GameFiles.CScenarioPointContainer - { - LoadSavePoints = new CodeWalker.GameFiles.Array_Structure - { - PointerDataIndex = 4294967295, - }, - MyPoints = new CodeWalker.GameFiles.Array_Structure - { - Count1 = 982, - Count2 = 982, - Pointer = 3, - } - }, - Unk_3844724227 = new CodeWalker.GameFiles.Array_ushort - { - Count1 = 840, - Count2 = 840, - Pointer = 3424264, - } - }; - } - - public class TestBinaryConversions - { - private readonly ITestOutputHelper _output; - public TestBinaryConversions(ITestOutputHelper testOutputHelper) - { - _output = testOutputHelper; - } - [Fact] - public void TestConvertData() - { - var data = BitConverter.GetBytes((uint)1234); - var number = MetaTypes.ConvertData(data); - if (number != (uint)1234) - { - throw new Exception("number 1234 converted back to itself doesn't equal 1234"); - } - } - - public bool Equals(Array_Structure a, Array_Structure b) - { - return a.Count1 == b.Count1 && a.Count2 == b.Count2 && a.Pointer == b.Pointer; - } - - public bool Equals(Array_uint a, Array_uint b) - { - return a.Count1 == b.Count1 && a.Count2 == b.Count2 && a.Pointer == b.Pointer; - } - - public bool Equals(rage__spdGrid2D a, rage__spdGrid2D b) - { - return a.Dimensions == b.Dimensions && a.Max == b.Max && a.Min == b.Min; - } - - [Fact] - public void Test_Convert_Data_From_Bytes() - { - var bytes = Convert.FromBase64String(TestData.ReferenceDataBytes); - - var newData = MetaTypes.ConvertData(bytes); - - Assert.Equal(TestData.ReferenceData, newData); - } - - [Fact] - public void Test_Convert_Data_From_Bytes_Offset() - { - var bytes = Convert.FromBase64String(TestData.ReferenceDataBytes); - bytes = new byte[4].Concat(bytes).ToArray(); - - var newData = MetaTypes.ConvertData(bytes, 4); - - Assert.Equal(TestData.ReferenceData, newData); - } - - [Fact] - public void Test_Convert_To_Bytes() - { - var bytes = MetaTypes.ConvertToBytes(TestData.ReferenceData); - - var bytesBase64 = Convert.ToBase64String(bytes); - - Assert.Equal(TestData.ReferenceDataBytes, bytesBase64); - } - - [Fact] - public void Test_Convert_Data_From_And_To_Bytes() - { - var bytes = MetaTypes.ConvertToBytes(TestData.ReferenceData); - - var newData = MetaTypes.ConvertData(bytes); - - Assert.Equal(TestData.ReferenceData, newData); - } - - private readonly SharpDX.Vector3[] referenceArray = new SharpDX.Vector3[] { new SharpDX.Vector3(12.5f, 23.0f, 65.0f), new SharpDX.Vector3(1234.234f, 17896.22f, 9845.12f), new SharpDX.Vector3(-12.3f, -82349.123f, 1234.9f), new SharpDX.Vector3(-23412.4f, 1289.2f, 948.0f) }; - private readonly string referenceArrayBytes = "AABIQQAAuEEAAIJCfUeaRHHQi0Z71BlGzcxEwZDWoMfNXJpEzei2xmYmoUQAAG1E"; - - [Fact] - public void Test_Convert_Array_To_Bytes() - { - var bytes = MetaTypes.ConvertArrayToBytes(referenceArray); - - var base64 = Convert.ToBase64String(bytes); - - Assert.Equal(referenceArrayBytes, base64); - } - - [Fact] - public void Test_Convert_Bytes_To_Array() - { - var bytes = Convert.FromBase64String(referenceArrayBytes); - var arr = MetaTypes.ConvertDataArray(bytes, 0, referenceArray.Length).ToArray(); - Assert.Equal(referenceArray, arr); - - var newBytes = MetaTypes.ConvertArrayToBytes(arr); - - var base64 = Convert.ToBase64String(newBytes); - - Assert.Equal(referenceArrayBytes, base64); - } - } - - public class TestResourceData - { - [Fact] - public void Test_Write_Struct() - { - using var systemStream = new MemoryStream(); - using var graphicsStream = new MemoryStream(); - - using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream); - dataWriter.Position = 0x50000000; - - dataWriter.WriteStruct(TestData.ReferenceData); - - var buffer = systemStream.ToArray(); - - var base64 = Convert.ToBase64String(buffer); - - Assert.Equal(TestData.ReferenceDataBytes, base64); - } - - [Fact] - public void Test_Read_Struct() - { - var buffer = Convert.FromBase64String(TestData.ReferenceDataBytes); - using var systemStream = new MemoryStream(buffer); - using var graphicsStream = new MemoryStream(); - - using var dataReader = new ResourceDataReader(systemStream, graphicsStream); - - var region = dataReader.ReadStruct(); - - Assert.Equal(TestData.ReferenceData, region); - } - - [Fact] - public void Test_Write_Single() - { - using var systemStream = new MemoryStream(); - using var graphicsStream = new MemoryStream(); - - using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream); - dataWriter.Position = 0x50000000; - - dataWriter.Write(20.0f); - - var buffer = systemStream.ToArray(); - var result = BitConverter.ToSingle(buffer, 0); - - Assert.Equal(20.0f, result); - } - - [Fact] - public void Test_Write_Single_Big_Endian() - { - using var systemStream = new MemoryStream(); - using var graphicsStream = new MemoryStream(); - - using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream, Endianess.BigEndian); - dataWriter.Position = 0x50000000; - - dataWriter.Write(20.0f); - - var buffer = systemStream.ToArray(); - - var valueInt = BinaryPrimitives.ReadInt32BigEndian(buffer); - var valueFloat = Unsafe.ReadUnaligned(ref Unsafe.As(ref valueInt)); - //BinaryPrimitives.ReverseEndianness(20.0f) - - Assert.Equal(20.0f, valueFloat); - - dataWriter.Position = 0x50000000; - - dataWriter.Write(double.MaxValue); - - buffer = systemStream.ToArray(); - - var valueLong = BinaryPrimitives.ReadInt64BigEndian(buffer); - var valueDouble = Unsafe.ReadUnaligned(ref Unsafe.As(ref valueLong)); - - Assert.Equal(double.MaxValue, valueDouble); - } - - [Fact] - public void Test_Write_Multiple_Structs() - { - using var systemStream = new MemoryStream(); - using var graphicsStream = new MemoryStream(); - - using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream); - dataWriter.Position = 0x50000000; - - dataWriter.WriteStructs(new[] - { - TestData.ReferenceData, - TestData.ReferenceData, - TestData.ReferenceData, - TestData.ReferenceData - }); - - var buffer = systemStream.ToArray(); - - var structs = MemoryMarshal.Cast(buffer); - - Assert.Equal(4, structs.Length); - - foreach (var scenarioRegion in structs) - { - Assert.Equal(TestData.ReferenceData, scenarioRegion); - } - } - - [Fact] - public void Test_Read_Multiple_Structs() - { - using var systemStream = new MemoryStream(); - using var graphicsStream = new MemoryStream(); - - using var dataWriter = new ResourceDataWriter(systemStream, graphicsStream); - dataWriter.Position = 0x50000000; - - dataWriter.WriteStructs(new[] - { - TestData.ReferenceData, - TestData.ReferenceData, - TestData.ReferenceData, - TestData.ReferenceData - }); - - var buffer = systemStream.ToArray(); - systemStream.Position = 0; - var dataReader = new ResourceDataReader(systemStream, graphicsStream); - - - var structs = dataReader.ReadStructs(4); - - Assert.Equal(4, structs.Length); - - foreach (var scenarioRegion in structs) - { - Assert.Equal(TestData.ReferenceData, scenarioRegion); - } - - structs = dataReader.ReadStructsAt(0 | 0x50000000, 4); - - foreach (var scenarioRegion in structs) - { - Assert.Equal(TestData.ReferenceData, scenarioRegion); - } - - systemStream.Position = 0; - dataWriter.Position = 0x50000000; - - dataWriter.Write(new byte[] { 0, 0, 0, 0 }); - - dataWriter.WriteStructs(new[] -{ - TestData.ReferenceData, - TestData.ReferenceData, - TestData.ReferenceData, - TestData.ReferenceData - }); - - structs = dataReader.ReadStructsAt(4 | 0x50000000, 4); - - foreach (var scenarioRegion in structs) - { - Assert.Equal(TestData.ReferenceData, scenarioRegion); - } - } - - //[Fact] - //public void Test() - //{ - // var attachedObjects = MetaTypes.GetUintArray(meta, _Data.attachedObjects); - //} - - private const string ArchetypeData = "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"; - - private readonly CBaseArchetypeDef referenceArchetype = new CBaseArchetypeDef - { - assetName = new MetaHash((uint)0x1d0b5555), - assetType = rage__fwArchetypeDef__eAssetType.ASSET_TYPE_DRAWABLE, - bbMax = new SharpDX.Vector3(3.617807f, 4.9E-05f, 0.447415f), - bbMin = new SharpDX.Vector3(-3.617834f, -5.1E-05f, -0.447416f), - bsCentre = new SharpDX.Vector3(-1.3589859E-05f, -1.00000034E-06f, -5.066395E-07f), - bsRadius = 3.645381f, - hdTextureDist = 5, - lodDist = 100, - Unused05 = float.NaN, - Unused06 = float.NaN, - Unused07 = float.NaN, - name = new MetaHash((uint)0x1d0b5555), - textureDictionary = new MetaHash((uint)0x5e0cce25), - flags = 0x00002000, - }; - - [Fact] - public void TestConvertDataRaw() - { - var data = Convert.FromBase64String(ArchetypeData); - var basearch = PsoTypes.ConvertDataRawOld(data, 0); - - Assert.Equivalent(referenceArchetype, basearch); - - var basearch2 = PsoTypes.ConvertDataRaw(data, 0); - - Assert.Equivalent(basearch, basearch2); - - var random = new Random(); - var length = random.Next(100); - - var newData = Enumerable.Empty().Concat(new byte[length]).Concat(data).ToArray(); - - basearch = PsoTypes.ConvertDataRawOld(newData, length); - Assert.Equivalent(basearch, referenceArchetype); - - basearch2 = PsoTypes.ConvertDataRaw(newData, length); - - Assert.Equivalent(basearch, basearch2); - - //a.Extensions = MetaTypes.GetExtensions(Meta, basearch.extensions); - - - } - } - - public class TestConvertDataArray - { - private readonly ITestOutputHelper _output; - public TestConvertDataArray(ITestOutputHelper output) - { - _output = output; - } - private string GetFilePath(string filename) - { - // Directory we're looking for. - var dirToFind = Path.Combine(@"CodeWalker.Test", "Files"); - - // Search up directory tree starting at assembly path looking for 'Images' dir. - var searchPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - while (true) - { - var testPath = Path.Combine(searchPath, dirToFind); - if (Directory.Exists(testPath)) - { - // Found it! - return Path.Combine(testPath, filename); - } - - // Move up one directory. - var newSearchPath = Path.GetFullPath(Path.Combine(searchPath, "..")); - if (newSearchPath == searchPath) - { - // Didn't move up, so we're at the root. - throw new FileNotFoundException($"Could not find '{dirToFind}' directory."); - } - searchPath = newSearchPath; - } - } - - public string TestData = "AAAAAAAAAAAFAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAKDAAACgwAAAAMAAAAAAAACgQAAAoEAAAABAAAAAAAAAgD9kViJCAAAAAGAAAAABAAAAAAAAAP////8AAAAABgAAAAAAAAABAAEAAAAAAAAAAAAAAAAABWAAAAAAAAAKAAoAAAAAAAAAAAAAAAAAgPEnwiB/QcIAcFzBAAAAAADgDsL9ke/BHKgswQAAAAAAAIA/yyTUkwAAAABgAAAAAQAAAAEAAAD/////AAAAAAYAAQAAAAAALgAuAAAAAAA="; - [Fact] - public void ConvertDataArrayShouldReturnSameAsConvertData() - { - var data = Convert.FromBase64String(TestData); - - var referenceData = MetaTypes.ConvertData(data); - - var arrayData = MetaTypes.ConvertDataArray(data, 0, 2); - - var path = GetFilePath("anwblokaal.ytyp"); - var bytes = File.ReadAllBytes(path); - var entry = RpfFile.CreateFileEntry("anwblokaal.ytyp", path, ref bytes); - var ytypFile = RpfFile.GetFile(entry, bytes); - - var rooms = ytypFile.AllArchetypes - .Where(p => p is MloArchetype) - .Select(p => p as MloArchetype) - .SelectMany(p => p.rooms) - .Select(p => p.Data); - - var secondRoom = rooms.Last(); - - var arr = new byte[Marshal.SizeOf() * rooms.Count()]; - //MemoryMarshal.Write(arr.AsSpan(), ref rooms); - - _output.WriteLine(Convert.ToBase64String(MemoryMarshal.AsBytes(rooms.ToArray().AsSpan()))); - - // I know the bbMax values don't really make sense here, seems to be a weird ytyp, but it's mostly about testing the serialization, not about using a 100% correct ytyp - // And didn't want to include a ytyp from Rockstar Games since that could cause some legal issues down the road - // Another possible solution would be to do abest attempt to find the GTA V installed on the user's computer running the tests and use files from there, but this would add complexity and links which could break tests - // However this would be more in the scope of implementation testing as it tests the whole chain including encryption which is not wanted here - Assert.Equivalent(new SharpDX.Vector3(-41.98584f, -48.3741455f, -13.7773438f), secondRoom.bbMin); - Assert.Equivalent(new SharpDX.Vector3(-35.71875f, -29.9462833f, -10.7910423f), secondRoom.bbMax); - Assert.Equivalent(new Array_uint(65542, 46), secondRoom.attachedObjects); - Assert.Equal(96u, secondRoom.flags); - Assert.Equal(1, secondRoom.floorId); - Assert.Equivalent(new CharPointer() { Count1 = 10, Count2 = 10, Pointer = 24581 }, secondRoom.name); - Assert.Equal(1u, secondRoom.portalCount); - Assert.Equal(2480153803, secondRoom.timecycleName.Hash); - - // First room is limbo, so this check isn't that useful, but just make sure, and the following check will compare the entire array anyways - Assert.Equivalent(referenceData, rooms.First()); - - Assert.Equivalent(arrayData.ToArray(), rooms); - } - } -} \ No newline at end of file diff --git a/CodeWalker.Test/XmlTests.cs b/CodeWalker.Test/XmlTests.cs index a00b248..07d8721 100644 --- a/CodeWalker.Test/XmlTests.cs +++ b/CodeWalker.Test/XmlTests.cs @@ -960,19 +960,18 @@ namespace CodeWalker.Test var xdoc = new XmlDocument(); xdoc.LoadXml(markup); - XmlNodeList items = xdoc.SelectNodes("CVehicleModelInfo__InitDataList/InitDatas/Item | CVehicleModelInfo__InitDataList/InitDatas/item"); + XmlNodeList? items = xdoc.SelectNodes("CVehicleModelInfo__InitDataList/InitDatas/Item | CVehicleModelInfo__InitDataList/InitDatas/item"); + VehicleInitData? initDataExpected = null; + VehicleInitData? initData = null; - - string modelName = null; - string gameName = null; - VehicleInitData initDataExpected = null; - VehicleInitData initData = null; - - var InitDatas = new List(); + string? modelName; + string? gameName; for (int i = 0; i < items.Count; i++) { var node = items[i]; + Assert.NotNull(node); + initDataExpected = new VehicleInitData(); initDataExpected.Load(node); @@ -992,7 +991,7 @@ namespace CodeWalker.Test //Assert.Null(initDataExpected.trailers); Assert.Equal(9, initDataExpected.trailers.Length); Assert.Single(initDataExpected.drivers); - Assert.Equal("S_M_Y_Cop_01", initDataExpected.drivers[0].driverName); + Assert.Equal("S_M_Y_Cop_01", initDataExpected.drivers[0].DriverName); Assert.Equal("trailers4", initDataExpected.trailers[4]); using XmlReader xmlReader = XmlReader.Create(new StringReader(markup)); @@ -1019,8 +1018,10 @@ namespace CodeWalker.Test Assert.NotNull(initData.pOverrideRagdollThreshold); + Assert.Equal(initDataExpected.pOverrideRagdollThreshold, initData.pOverrideRagdollThreshold); + Assert.Equal(initDataExpected.requiredExtras, initData.requiredExtras); + Assert.Equivalent(initDataExpected, initData); - Assert.Equal(initDataExpected.GetHashCode(), initData.GetHashCode()); var bytes = Encoding.UTF8.GetBytes(markup); @@ -1063,6 +1064,7 @@ namespace CodeWalker.Test xDocument.LoadXml(xmlText); var pedsFile = new CPedModelInfo__InitDataList(xmlReader); + Assert.NotNull(xDocument?.DocumentElement); var pedsFileExpected = new CPedModelInfo__InitDataList(xDocument.DocumentElement); for (int i = 0; i < pedsFileExpected.InitDatas.Length; i++) @@ -1077,5 +1079,29 @@ namespace CodeWalker.Test Assert.Equivalent(pedsFileExpected, pedsFile); } + + [Fact] + public void ContentFileShouldBeTheSame() + { + var fileStream = File.OpenRead(TestFiles.GetFilePath("content.xml")); + + var xmlReader = XmlReader.Create(fileStream); + + var contentFile = new DlcContentFile(); + contentFile.Load(xmlReader); + + var xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(TextUtil.GetUTF8Text(File.ReadAllBytes(TestFiles.GetFilePath("content.xml")))); + + var contentFileExpected = new DlcContentFile(); + contentFileExpected.Load(xmlDocument); + + for (int i = 0; i < contentFileExpected.contentChangeSets.Count; i++) + { + Assert.Equivalent(contentFileExpected.contentChangeSets[i], contentFile.contentChangeSets[i]); + } + + Assert.Equivalent(contentFileExpected, contentFile); + } } } diff --git a/CodeWalker.Vehicles/CodeWalker.Vehicles.csproj b/CodeWalker.Vehicles/CodeWalker.Vehicles.csproj index 21f6fc1..f70ec58 100644 --- a/CodeWalker.Vehicles/CodeWalker.Vehicles.csproj +++ b/CodeWalker.Vehicles/CodeWalker.Vehicles.csproj @@ -1,7 +1,7 @@  WinExe - net6.0-windows + net8.0-windows true CWVehicles.ico dexyfex diff --git a/CodeWalker.WinForms/CodeWalker.WinForms.csproj b/CodeWalker.WinForms/CodeWalker.WinForms.csproj index c728afd..ed755ec 100644 --- a/CodeWalker.WinForms/CodeWalker.WinForms.csproj +++ b/CodeWalker.WinForms/CodeWalker.WinForms.csproj @@ -1,7 +1,7 @@  Library - net6.0-windows + net8.0-windows true true latest @@ -14,7 +14,6 @@ - diff --git a/CodeWalker.WinForms/FormUtils.cs b/CodeWalker.WinForms/FormUtils.cs index cf11d71..df4036f 100644 --- a/CodeWalker.WinForms/FormUtils.cs +++ b/CodeWalker.WinForms/FormUtils.cs @@ -1,10 +1,13 @@ -using System; +using Microsoft.Win32; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Windows.Forms; +using System.Windows.Threading; using WeifenLuo.WinFormsUI.Docking; using Point = System.Drawing.Point; @@ -240,46 +243,52 @@ namespace CodeWalker { if (Environment.OSVersion.Version.Major >= 6) { - var ofd = new OpenFileDialog(); - ofd.Filter = "Folders|\n"; - ofd.AddExtension = false; - ofd.CheckFileExists = false; + var ofd = new OpenFolderDialog(); + //ofd.Filter = "Folders|\n"; + //ofd.AddExtension = false; + //ofd.CheckFileExists = false; ofd.DereferenceLinks = true; ofd.Multiselect = false; ofd.InitialDirectory = fbd.SelectedPath; - int result = 0; - var ns = "MS.Internal.AppModel"; - var asmb = Assembly.Load("System.Windows.Forms.Primitives"); - //var asmb = Assembly.LoadWithPartialName("PresentationFramework"); - var dialogint = asmb.GetType("Interop+Shell32+IFileDialog"); - //var dialogint = GetType(asmb, ns, "IFileDialog"); - var dialog = Call(typeof(OpenFileDialog), ofd, "CreateVistaDialog"); - Call(typeof(OpenFileDialog), ofd, "OnBeforeVistaDialog", dialog); - var options = Convert.ToUInt32(Call(typeof(FileDialog), ofd, "GetOptions")); + ofd.ValidateNames = true; - var enumValue = GetEnumValue("System.Windows.Forms.Primitives", "Interop+Shell32+FOS", "PICKFOLDERS"); - options |= Convert.ToUInt32(enumValue); + var result = ofd.ShowDialog() ?? false; - Call(dialogint, dialog, "SetOptions", options); - dynamic pfde = New("System.Windows.Forms", "System.Windows.Forms.FileDialog+VistaDialogEvents", ofd); - var parameters = new object[] { pfde, (uint)0 }; - Call(dialogint, dialog, "Advise", parameters); - var adviseres = Convert.ToUInt32(parameters[1]); - try { - result = Convert.ToInt32(Call(dialogint, dialog, "Show", hWndOwner)); - } - finally { - //pfde.Dispose(); - Call(dialogint, dialog, "Unadvise", adviseres); - } - GC.KeepAlive(pfde); + //int result = 0; + //var ns = "MS.Internal.AppModel"; + //var asmb = Assembly.Load("System.Windows.Forms.Primitives"); + ////var asmb = Assembly.LoadWithPartialName("PresentationFramework"); + //var dialogint = asmb.GetType("Interop+Shell32+IFileDialog"); + ////var dialogint = GetType(asmb, ns, "IFileDialog"); + //var dialog = Call(typeof(OpenFileDialog), ofd, "CreateVistaDialog"); + //Call(typeof(OpenFileDialog), ofd, "OnBeforeVistaDialog", dialog); + //var options = Convert.ToUInt32(Call(typeof(FileDialog), ofd, "GetOptions")); + + //var enumValue = GetEnumValue("System.Windows.Forms.Primitives", "Interop+Shell32+FOS", "PICKFOLDERS"); + //options |= Convert.ToUInt32(enumValue); + + //Call(dialogint, dialog, "SetOptions", options); + //dynamic pfde = New("System.Windows.Forms", "System.Windows.Forms.FileDialog+VistaDialogEvents", ofd); + //var parameters = new object[] { pfde, (uint)0 }; + //Call(dialogint, dialog, "Advise", parameters); + //var adviseres = Convert.ToUInt32(parameters[1]); + //try { + // result = Convert.ToInt32(Call(dialogint, dialog, "Show", hWndOwner)); + //} + //finally { + // //pfde.Dispose(); + // Call(dialogint, dialog, "Unadvise", adviseres); + //} + //GC.KeepAlive(pfde); - fbd.SelectedPath = ofd.FileName; + fbd.SelectedPath = ofd.FolderName; - return (result == 0) ? DialogResult.OK : DialogResult.Cancel; + //return (result == 0) ? DialogResult.OK : DialogResult.Cancel; + + return result ? DialogResult.OK : DialogResult.Cancel; } else { @@ -302,11 +311,22 @@ namespace CodeWalker } return type; } + private static object Call(Type type, object obj, string func, params object[] parameters) { var mi = type.GetMethod(func, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); - if (mi == null) return null; - return mi.Invoke(obj, parameters); + if (mi == null) + return null; + try + { + return mi.Invoke(obj, parameters); + } + catch(Exception ex) + { + Console.WriteLine($"Exception occured while invoking method {type} {func}"); + Console.WriteLine(ex.ToString()); + throw; + } } private static object GetEnumValue(string assemblyName, string typeName, string name) @@ -459,6 +479,55 @@ namespace CodeWalker } + public static class InvokeExtensions + { + public static void InvokeIfRequired(this Form form, System.Windows.Forms.MethodInvoker method) + { + if (form.InvokeRequired) + { + form.Invoke(method); + return; + } + + method?.Invoke(); + } + + public static void InvokeIfRequired(this Form form, Action action, params object[] args) + { + if (form.InvokeRequired) + { + form.Invoke(action, args); + return; + } + + action?.Invoke(args); + } + + public static SwitchToUiAwaitable SwitchToUi(this Form form) + { + return new SwitchToUiAwaitable(form); + } + + public readonly struct SwitchToUiAwaitable(Form form) : INotifyCompletion + { + public SwitchToUiAwaitable GetAwaiter() + { + return this; + } + + public void GetResult() + { + } + + public bool IsCompleted => !form.InvokeRequired; + + public void OnCompleted(Action continuation) + { + form.BeginInvoke(continuation); + } + } + } + //unused //public class AccurateTimer diff --git a/CodeWalker.WinForms/PropertyGridFix.Designer.cs b/CodeWalker.WinForms/PropertyGridFix.Designer.cs index 6d96a50..e9743cf 100644 --- a/CodeWalker.WinForms/PropertyGridFix.Designer.cs +++ b/CodeWalker.WinForms/PropertyGridFix.Designer.cs @@ -1,6 +1,8 @@ -namespace CodeWalker.WinForms +using System.Windows.Forms; + +namespace CodeWalker.WinForms { - partial class PropertyGridFix + public partial class PropertyGridFix : PropertyGrid { /// /// Required designer variable. diff --git a/CodeWalker.WinForms/ReadOnlyPropertyGrid.Designer.cs b/CodeWalker.WinForms/ReadOnlyPropertyGrid.Designer.cs index 958ef32..2dde2d0 100644 --- a/CodeWalker.WinForms/ReadOnlyPropertyGrid.Designer.cs +++ b/CodeWalker.WinForms/ReadOnlyPropertyGrid.Designer.cs @@ -1,6 +1,6 @@ namespace CodeWalker.WinForms { - partial class ReadOnlyPropertyGrid + public partial class ReadOnlyPropertyGrid : PropertyGridFix { /// /// Required designer variable. diff --git a/CodeWalker.WinForms/ReadOnlyPropertyGrid.resx b/CodeWalker.WinForms/ReadOnlyPropertyGrid.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/CodeWalker.WinForms/ReadOnlyPropertyGrid.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CodeWalker.sln b/CodeWalker.sln index 4cc8a7a..747299b 100644 --- a/CodeWalker.sln +++ b/CodeWalker.sln @@ -1,4 +1,3 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.7.34031.279 @@ -27,6 +26,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CodeWalker.Test", "CodeWalk EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CodeWalker.Benchmarks", "CodeWalker.Benchmarks\CodeWalker.Benchmarks.csproj", "{EDDA8A8E-5333-4E28-8221-A31E3B70EB7A}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5017C2E3-D441-4BDF-AC7C-46CAEC2F38F4}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/CodeWalker/.editorconfig b/CodeWalker/.editorconfig new file mode 100644 index 0000000..e69de29 diff --git a/CodeWalker/CodeWalker.csproj b/CodeWalker/CodeWalker.csproj index 83c35d6..78ffc23 100644 --- a/CodeWalker/CodeWalker.csproj +++ b/CodeWalker/CodeWalker.csproj @@ -1,15 +1,18 @@  WinExe - net6.0-windows + net8.0-windows + net8.0-windows true true CW.ico dexyfex dexyfex software dexyfex - latest - annotations + 12.0 + enable + true + true x64 @@ -18,16 +21,13 @@ x64 + + + - - - + - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - @@ -35,13 +35,26 @@ - - + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers + + + + + + ..\..\FastColoredTextBox\FastColoredTextBox\bin\Release\net8.0-windows\FastColoredTextBox.dll + + True @@ -55,4 +68,10 @@ Settings.Designer.cs + + + + + + \ No newline at end of file diff --git a/CodeWalker/ExploreForm.cs b/CodeWalker/ExploreForm.cs index 6687061..fa91962 100644 --- a/CodeWalker/ExploreForm.cs +++ b/CodeWalker/ExploreForm.cs @@ -22,6 +22,10 @@ using WeifenLuo.WinFormsUI.Docking; using System.Runtime.CompilerServices; using static CodeWalker.GameFiles.GameFileCache; using System.Diagnostics.CodeAnalysis; +using CodeWalker.Rendering; +using CommunityToolkit.HighPerformance; +using Collections.Pooled; +using Microsoft.Extensions.ObjectPool; namespace CodeWalker { @@ -38,7 +42,7 @@ namespace CodeWalker public MainTreeFolder? RootFolder; public List ExtraRootFolders = new List(); public MainTreeFolder? CurrentFolder; - public List? CurrentFiles; + public PooledList? CurrentFiles; private bool FirstRefreshed = false; private List CopiedFiles = new List(); @@ -55,7 +59,7 @@ namespace CodeWalker private List? AllRpfs { get; set; } private static GameFileCache FileCache => GameFileCacheFactory.Instance; - private readonly object FileCacheSyncRoot = new object(); + private readonly SemaphoreSlim FileCacheSyncRoot = new SemaphoreSlim(1, 1); public bool EditMode { get; private set; } = false; @@ -72,13 +76,15 @@ namespace CodeWalker public ExploreForm() { - ETWEvents.Log.CreatingForm(nameof(ExploreForm)); + ETWEvents.Log.CreatingFormStart(nameof(ExploreForm)); Instance = this; - SuspendLayout(); InitializeComponent(); - ResumeLayout(); - SetTheme(Settings.Default.ExplorerWindowTheme, false); + _ = Task.Run(() => + { + SetTheme(Settings.Default.ExplorerWindowTheme, false); + }); + ShowMainListViewPathColumn(false); @@ -87,6 +93,7 @@ namespace CodeWalker UpdateStatus += UpdateStatus_EventHandler; ErrorLog += UpdateErrorLog; ForceTreeRefresh += RefreshMainTreeView_EventHandler; + ETWEvents.Log.CreatingFormStop(); } private void SetTheme(string themestr, bool changing = true) @@ -95,6 +102,12 @@ namespace CodeWalker //MainDockPanel.SaveAsXml(configFile); //CloseAllContents(); + if (InvokeRequired) + { + BeginInvoke(SetTheme, themestr, changing); + return; + } + foreach (ToolStripMenuItem menu in ViewThemeMenu.DropDownItems) { menu.Checked = false; @@ -193,7 +206,7 @@ namespace CodeWalker Settings.Default.Save(); } - [MemberNotNull(nameof(FileCache))] + [SuppressMessage("CodeSmell", "EPC17:Avoid async-void delegates", Justification = "Long running background thread which handles errors")] private void Init() { ETWEvents.Log.LoadingForm(nameof(ExploreForm)); @@ -216,8 +229,9 @@ namespace CodeWalker { GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key); } - catch + catch(Exception ex) { + Console.WriteLine(ex); UpdateStatus?.Invoke("Unable to load gta5.exe!"); return; } @@ -250,7 +264,6 @@ namespace CodeWalker } catch(Exception e) { Console.WriteLine(e); - throw; } }, CancellationTokenSource.Token, TaskCreationOptions.LongRunning).Start(TaskScheduler.Default); } @@ -259,11 +272,12 @@ namespace CodeWalker { if (FileCache.IsInited) { - return new ValueTask(); + return ValueTask.CompletedTask; } - return new ValueTask(Task.Run(() => + return new ValueTask(Task.Run(async () => { - lock (FileCacheSyncRoot) + FileCacheSyncRoot.Wait(); + try { if (!FileCache.IsInited) { @@ -272,7 +286,7 @@ namespace CodeWalker UpdateStatus?.Invoke("Loading file cache..."); var allRpfs = AllRpfs; - FileCache.Init(updateStatus: null, ErrorLog, allRpfs); //inits main dicts and archetypes only... + await FileCache.InitAsync(updateStatus: null, ErrorLog, allRpfs); //inits main dicts and archetypes only... UpdateStatus?.Invoke("Loading materials..."); BoundsMaterialTypes.Init(FileCache); @@ -281,24 +295,20 @@ namespace CodeWalker Scenarios.EnsureScenarioTypes(FileCache); UpdateStatus?.Invoke("File cache loaded."); - } catch(Exception ex) + } + catch (Exception ex) { MessageBox.Show(ex.ToString(), ex.Message); } } } + finally + { + FileCacheSyncRoot.Release(); + } }, CancellationTokenSource.Token)); } - public GameFileCache GetFileCache() - { - lock (FileCacheSyncRoot) - { - if (FileCache.IsInited) return FileCache; - } - InitFileCache(); //if we got here, it's not inited yet - init it! - return FileCache; //return it even though it's probably not inited yet.. - } [MemberNotNull(nameof(FileTypes))] public static void InitFileTypes() @@ -432,36 +442,53 @@ namespace CodeWalker public event Action UpdateStatus; public event Action ErrorLog; - public void InvokeUpdateStatus(string msg) + private Stopwatch lastStatusUpdate = Stopwatch.StartNew(); + private TimeSpan updateInterval = TimeSpan.FromSeconds(0.05); + public void InvokeUpdateStatus(string msg, bool force = false) { + if (!force) + { + var elapsed = lastStatusUpdate.Elapsed; + if (elapsed < updateInterval) + return; + } + UpdateStatus?.Invoke(msg); } - public void UpdateStatus_EventHandler(string text) + private void doUpdateStatus(string text) { - try + if (InvokeRequired) { - if (InvokeRequired) - { - BeginInvoke(new Action(() => { UpdateStatus_EventHandler(text); })); - } - else - { - StatusLabel.Text = text; - } + BeginInvoke(doUpdateStatus, text); } - catch(Exception ex) { - Console.WriteLine(ex); - Debug.WriteLine(ex); + else + { + StatusLabel.Text = text; } } + + private void UpdateStatus_EventHandler(string text) + { + + lastStatusUpdate.Restart(); + try + { + doUpdateStatus(text); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + public void UpdateErrorLog(string text) { try { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateErrorLog(text); })); + BeginInvoke(UpdateErrorLog, text); } else { @@ -479,15 +506,16 @@ namespace CodeWalker public void Navigate(MainTreeFolder? f) { - if (!Ready) return; - if (f == CurrentFolder) return; //already there! - ArgumentNullException.ThrowIfNull(f); + if (!Ready) + return; + if (f == CurrentFolder) + return; //already there! if (f.IsSearchResults) { AddMainTreeViewRoot(f); //add the current search result node - TreeNode sr = FindTreeNode(f, null); - if (sr != null) + TreeNode? sr = FindTreeNode(f, null); + if (sr is not null) { MainTreeView.SelectedNode = sr; //navigate to the new search results node } @@ -505,7 +533,7 @@ namespace CodeWalker } List hierarchy = new List(); var pf = f; - while (pf != null) + while (pf is not null) { hierarchy.Add(pf); pf = pf.Parent; @@ -515,7 +543,7 @@ namespace CodeWalker { n = FindTreeNode(hierarchy[i], n); } - if (n != null) + if (n is not null) { if (MainTreeView.SelectedNode != n) { @@ -530,11 +558,14 @@ namespace CodeWalker } public void Navigate(string path) { - if (!Ready) return; + if (!Ready) + return; + var pathl = path.Replace('/', '\\'); - if ((CurrentFolder != null) && (CurrentFolder.Path.Equals(path, StringComparison.InvariantCultureIgnoreCase))) + if (CurrentFolder != null && CurrentFolder.Path.Equals(path, StringComparison.InvariantCultureIgnoreCase)) return; //already there - var hierarchy = pathl.Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); + + var hierarchy = pathl.Split('\\', StringSplitOptions.RemoveEmptyEntries); TreeNode? n = null;// FindTreeNode("gta v", null); if (!string.IsNullOrEmpty(path)) { @@ -553,6 +584,10 @@ namespace CodeWalker } } + else + { + n = MainTreeView.Nodes[0]; // Main node + } if (n != null) { if (MainTreeView.SelectedNode != n) @@ -567,7 +602,7 @@ namespace CodeWalker } private void NavigateFailed(string path) { - MessageBox.Show("Unable to navigate to \"" + path + "\"."); + MessageBox.Show($"Unable to navigate to \"{path}\"."); } private void NavigateComplete(MainTreeFolder prevFolder) { @@ -578,7 +613,7 @@ namespace CodeWalker if (!HistoryNavigating) //only do this if not currently navigating forward or back { - if (prevFolder != null) + if (prevFolder is not null) { ForwardSteps.Clear(); BackSteps.Push(prevFolder); @@ -603,7 +638,7 @@ namespace CodeWalker if (BackSteps.Count == 0) return; var s = BackSteps.Pop(); ForwardSteps.Push(CurrentFolder); - while ((toFolder != null) && (s != toFolder) && (BackSteps.Count > 0)) + while (toFolder is not null && s != toFolder && BackSteps.Count > 0) { ForwardSteps.Push(s); s = BackSteps.Pop(); @@ -618,7 +653,7 @@ namespace CodeWalker if (ForwardSteps.Count == 0) return; var s = ForwardSteps.Pop(); BackSteps.Push(CurrentFolder); - while ((toFolder != null) && (s != toFolder) && (ForwardSteps.Count > 0)) + while (toFolder is not null && s != toFolder && ForwardSteps.Count > 0) { BackSteps.Push(s); s = ForwardSteps.Pop(); @@ -634,7 +669,7 @@ namespace CodeWalker UpButton.DropDownItems.Clear(); var pf = CurrentFolder?.Parent; int i = 0; - while (pf != null) + while (pf is not null) { var button = UpButton.DropDownItems.Add(pf.GetToolText()); button.Tag = pf; @@ -674,7 +709,7 @@ namespace CodeWalker { var ic = MainListView.VirtualListSize; var sc = MainListView.SelectedIndices.Count; - var str = ic.ToString() + " item" + ((ic != 1) ? "s" : "") + " shown"; + var str = $"{ic} item{((ic != 1) ? "s" : "")} shown"; bool isitem = false; bool isfile = false; bool issearch = CurrentFolder?.IsSearchResults ?? false; @@ -705,13 +740,13 @@ namespace CodeWalker canedit = EditMode && !issearch; } } - str += ", " + sc.ToString() + " selected"; + str += $", {sc} selected"; if (bc > 0) { - str += ", " + TextUtil.GetBytesReadable(bc); + str += $", {TextUtil.GetBytesReadable(bc)}"; } } - UpdateStatus(str); + UpdateStatus?.Invoke(str); @@ -739,7 +774,7 @@ namespace CodeWalker private TreeNode? FindTreeNode(MainTreeFolder f, TreeNode? parent) { - var tnc = (parent != null) ? parent.Nodes : MainTreeView.Nodes; + var tnc = parent?.Nodes ?? MainTreeView.Nodes; foreach (TreeNode node in tnc) { if (node.Tag == f) @@ -751,7 +786,7 @@ namespace CodeWalker } private TreeNode? FindTreeNode(string text, TreeNode? parent) { - var tnc = (parent != null) ? parent.Nodes : MainTreeView.Nodes; + var tnc = parent?.Nodes ?? MainTreeView.Nodes; foreach (TreeNode node in tnc) { if (node.Text.Equals(text, StringComparison.OrdinalIgnoreCase)) @@ -771,8 +806,6 @@ namespace CodeWalker Ready = false; AllRpfs = null; - BeginInvoke(() => MainTreeView.BeginUpdate); - UpdateStatus?.Invoke("Scanning..."); @@ -798,15 +831,7 @@ namespace CodeWalker if (Directory.Exists(extraroot.FullPath)) { - try - { - tasks.Add(Task.Run(() => RefreshMainTreeViewRoot(extraroot))); - } - catch(Exception ex) - { - remFolders.Add(extraroot); - } - + tasks.Add(Task.Run(() => RefreshMainTreeViewRoot(extraroot))); } else { @@ -823,23 +848,35 @@ namespace CodeWalker BeginInvoke(() => { - SuspendLayout(); - MainTreeView.BeginUpdate(); - ClearMainTreeView(); + try + { + MainTreeView.BeginUpdate(); + ClearMainTreeView(); - MainTreeView.Nodes.AddRange(nodes); + MainTreeView.Nodes.AddRange(nodes); - Ready = true; + Ready = true; - MainTreeView.EndUpdate(); - ResumeLayout(); - MainTreeViewRefreshComplete(); + MainTreeView.EndUpdate(); + MainTreeViewRefreshComplete(); + } + catch(Exception ex) + { + Console.WriteLine(ex); + } }); } + private struct RpfFileScanData + { + public required RpfFile RpfFile; + public required MainTreeFolder Node; + } + private TreeNode RefreshMainTreeViewRoot(MainTreeFolder f, bool gameRoot = false) { + ETWEvents.Log.RefreshingMainTreeViewStart(f.Path); var allRpfs = new ConcurrentBag(); var fullPath = f.FullPath; var subPath = f.Path; @@ -847,69 +884,65 @@ namespace CodeWalker using (new DisposableTimer("RefreshMainTreeViewRoot -> EnumerateFileSystemInfos")) { - allpaths = new DirectoryInfo(fullPath).EnumerateFileSystemInfos("*", SearchOption.AllDirectories).ToArray(); + // Randomizing order is done to avoid lock contention (all files in same folder get read in order we don't want that) + var random = new Random(42); + allpaths = new DirectoryInfo(fullPath).EnumerateFileSystemInfos("*", SearchOption.AllDirectories).OrderBy(order => random.Next()).ToArray(); } - using var _ = new DisposableTimer("RefreshMainTreeViewRoot"); + using var timer = new DisposableTimer("RefreshMainTreeViewRoot"); //var allpaths = Directory.EnumerateFileSystemEntries(fullPath, "*", SearchOption.AllDirectories); //var allDirs = new HashSet(Directory.EnumerateDirectories(fullPath, "*", SearchOption.AllDirectories)); //var allfiles = new HashSet(Directory.GetFiles(fullPath, "*", SearchOption.AllDirectories)); - var nodes = new ConcurrentDictionary(4, allpaths.Length, StringComparer.OrdinalIgnoreCase); + var nodes = new ConcurrentDictionary(Environment.ProcessorCount, allpaths.Length); - var partitioner = Partitioner.Create(allpaths, EnumerablePartitionerOptions.NoBuffering); - - Parallel.ForEach(partitioner, new ParallelOptions { MaxDegreeOfParallelism = 4, TaskScheduler = TaskScheduler.Default }, (fileEntryInfo) => + Parallel.ForEach(allpaths, (fileEntryInfo) => { try { var path = fileEntryInfo.FullName; - var relpath = path.Substring(fullPath.Length); + var relpath = path.AsSpan(fullPath.Length..); var isFile = fileEntryInfo is FileInfo; //var isFile = !path.I.Contains(path); //could be a folder //UpdateStatus?.Invoke("Scanning " + relpath + "..."); - MainTreeFolder parentnode = null, prevnode = null, node = null; - var prevnodepath = ""; + MainTreeFolder? parentnode = null, prevnode = null, node = null; + var prevnodepath = ReadOnlySpan.Empty; var idx = isFile ? relpath.LastIndexOf('\\') : relpath.Length; while (idx > 0) //create the folder tree nodes and build up the hierarchy { - var parentpath = relpath.Substring(0, idx); + var parentpath = relpath[..idx]; var parentidx = parentpath.LastIndexOf('\\'); - var parentname = parentpath.Substring(parentidx + 1); var exists = true; - MainTreeFolder _node = null; - node = nodes.GetOrAdd(parentpath, (key) => + var parentpathHash = string.GetHashCode(parentpath, StringComparison.OrdinalIgnoreCase); + if (!nodes.TryGetValue(parentpathHash, out node)) { - //Console.WriteLine($"Creating treenode for {parentpath}"); - var node = CreateRootDirTreeFolder(parentname, subPath + parentpath, fullPath + parentpath); - _node = node; - exists = false; - return node; - }); - if (_node != null && node != _node) - { - exists = true; + var parentname = parentpath[(parentidx + 1)..]; + node = CreateRootDirTreeFolder(parentname.ToString(), $"{subPath}{parentpath}", $"{fullPath}{parentpath}"); + exists = !nodes.TryAdd(parentpathHash, node); + node = nodes[parentpathHash]; } + //if (_node is not null && node != _node) + //{ + // exists = true; + //} parentnode ??= node; - if (prevnode != null) + if (prevnode is not null) { node.AddChild(prevnode); } prevnode = node; prevnodepath = parentpath; - idx = relpath.LastIndexOf('\\', idx - 1); - if (exists) break; + if (exists) + break; + + idx = relpath.Slice(0, idx - 1).LastIndexOf('\\'); if (idx < 0) { - lock (f) - { - f.AddChild(node); - } - + f.AddChild(node); } } @@ -917,17 +950,17 @@ namespace CodeWalker { if (path.EndsWith(".rpf", StringComparison.OrdinalIgnoreCase)) //add RPF nodes { - RpfFile rpf = new RpfFile(path, relpath); + RpfFile rpf = new RpfFile(path, relpath.ToString()); - rpf.ScanStructure(updateStatus: null, ErrorLog); + var result = rpf.ScanStructure(updateStatus: null, ErrorLog, out _); - if (rpf.LastException != null) //incase of corrupted rpf (or renamed NG encrypted RPF) + if (!result) //incase of corrupted rpf (or renamed NG encrypted RPF) { Console.WriteLine(rpf.LastException); return; } - node = CreateRpfTreeFolder(rpf, relpath, path); + node = CreateRpfTreeFolder(rpf, rpf.Path, rpf.FilePath); RecurseMainTreeViewRPF(node, allRpfs); @@ -942,8 +975,8 @@ namespace CodeWalker } else { - JenkIndex.EnsureLower(Path.GetFileNameWithoutExtension(path)); - if (parentnode != null) + JenkIndex.EnsureLower(Path.GetFileNameWithoutExtension(path.AsSpan())); + if (parentnode is not null) { parentnode.AddFile(path); } @@ -954,7 +987,8 @@ namespace CodeWalker } } } - catch (Exception ex) { + catch (Exception ex) + { Console.WriteLine(ex); ErrorLog?.Invoke(ex.ToString()); } @@ -962,11 +996,11 @@ namespace CodeWalker var rootNode = CreateTreeNode(f); - if (f.Children != null) + if (f.Children is not null) { - f.Children.Sort((n1, n2) => StringComparer.OrdinalIgnoreCase.Compare(n1.Name, n2.Name)); + f.Children.Sort(new MainTreeFolderComparer(StringComparer.OrdinalIgnoreCase)); - foreach (var node in f.Children) + foreach (var node in f.Children.Span) { AddMainTreeViewNode(node); } @@ -975,20 +1009,24 @@ namespace CodeWalker if (gameRoot) { AllRpfs = allRpfs.ToList(); + rootNode.Expand(); } + ETWEvents.Log.RefreshingMainTreeViewStop(); + return rootNode; } + private void RecurseMainTreeViewRPF(MainTreeFolder f, ConcurrentBag allRpfs) { var rootpath = GTAFolder.GetCurrentGTAFolderWithTrailingSlash(); var fld = f.RpfFolder; - if (fld != null) + if (fld is not null) { - if (fld.Directories != null) + if (fld.Directories is not null) { - foreach (var dir in fld.Directories) + foreach (var dir in fld.Directories.Span) { var dtnf = CreateRpfDirTreeFolder(dir, dir.Path, rootpath + dir.Path); f.AddChild(dtnf); @@ -998,13 +1036,13 @@ namespace CodeWalker } var rpf = f.RpfFile; - if (rpf != null) + if (rpf is not null) { allRpfs.Add(rpf); - if (rpf.Children != null) + if (rpf.Children is not null) { - foreach (var child in rpf.Children) + foreach (var child in rpf.Children.Span) { var ctnf = CreateRpfTreeFolder(child, child.Path, rootpath + child.Path); f.AddChildToHierarchy(ctnf); @@ -1013,9 +1051,9 @@ namespace CodeWalker } //JenkIndex.Ensure(rpf.Name); - if (rpf.AllEntries != null) + if (rpf.AllEntries is not null) { - foreach (RpfEntry entry in rpf.AllEntries) + foreach (RpfEntry entry in rpf.AllEntries.Span) { if (string.IsNullOrEmpty(entry.Name)) continue; var shortName = entry.ShortName; @@ -1030,7 +1068,7 @@ namespace CodeWalker { if (InvokeRequired) { - Invoke(new Action(() => { ClearMainTreeView(); })); + Invoke(ClearMainTreeView); } else { @@ -1045,7 +1083,9 @@ namespace CodeWalker MainListView.VirtualListSize = 0; //also clear the list view... } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private TreeNode CreateTreeNode(MainTreeFolder f) @@ -1068,7 +1108,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { AddMainTreeViewRoot(f); })); + BeginInvoke(AddMainTreeViewRoot, f); } else { @@ -1076,51 +1116,74 @@ namespace CodeWalker MainTreeView.Nodes.Add(node); } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void AddMainTreeViewNode(MainTreeFolder f) { try { - //if (InvokeRequired) - //{ - // Invoke(new Action(() => { AddMainTreeViewNode(f); })); - //} - //else - //{ + if (InvokeRequired) + { + Invoke(AddMainTreeViewNode, f); + } + else + { string n = f.Name; var root = f.Parent?.TreeNode; RecurseAddMainTreeViewNodes(f, root); - - root.Expand(); - //} + } + } + catch(Exception ex) { + Console.WriteLine(ex); } - catch { } } + + public class MainTreeFolderComparer : IComparer + { + private readonly StringComparer _comparer; + public MainTreeFolderComparer(StringComparer comparer) + { + _comparer = comparer; + } + + public int Compare(MainTreeFolder? x, MainTreeFolder? y) + { + return _comparer.Compare(x?.Name, y?.Name); + } + } + private void RecurseAddMainTreeViewNodes(MainTreeFolder f, TreeNode parent) { int imgIndex = 1; //FOLDER imageIndex - if (f.RpfFile != null) imgIndex = 3; //RPF FILE imageIndex + if (f.RpfFile is not null) + imgIndex = 3; //RPF FILE imageIndex - var nc = (parent != null) ? parent.Nodes : MainTreeView.Nodes; + var nc = parent?.Nodes ?? MainTreeView.Nodes; - var tn = nc.Add(f.Path, f.Name, imgIndex, imgIndex); + var tn = new TreeNode(f.Name, imgIndex, imgIndex) + { + Name = f.Path + }; tn.ToolTipText = f.Path; tn.Tag = f; f.TreeNode = tn; - if (f.Children != null) + if (f.Children is not null) { - f.Children.Sort((n1, n2) => StringComparer.OrdinalIgnoreCase.Compare(n1.Name, n2.Name)); + f.Children.Sort(new MainTreeFolderComparer(StringComparer.OrdinalIgnoreCase)); - foreach (var child in f.Children) + foreach (var child in f.Children.Span) { RecurseAddMainTreeViewNodes(child, tn); } } + + nc.Add(tn); } private void MainTreeViewRefreshComplete() { @@ -1128,7 +1191,7 @@ namespace CodeWalker { if (InvokeRequired) { - Invoke(new Action(() => { MainTreeViewRefreshComplete(); })); + Invoke(MainTreeViewRefreshComplete); } else { @@ -1248,7 +1311,7 @@ namespace CodeWalker } } } - private void RemoveTreeFolder(MainTreeFolder f) + private static void RemoveTreeFolder(MainTreeFolder f) { if (f.Parent == null) return; @@ -1328,7 +1391,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { RefreshMainListView(); })); + BeginInvoke(RefreshMainListView); } else { @@ -1345,10 +1408,11 @@ namespace CodeWalker private void RefreshMainListView() { MainListView.VirtualListSize = 0; - if (CurrentFolder != null) + if (CurrentFolder is not null) { if (!CurrentFolder.IsSearchResults) { + CurrentFolder.ListItems?.Dispose(); CurrentFolder.ListItems = null; //makes sure to rebuild the current files list } CurrentFiles = CurrentFolder.GetListItems(); @@ -1371,7 +1435,8 @@ namespace CodeWalker } private void SortMainListView(int col, SortOrder dir) { - if (dir == SortOrder.None) dir = SortOrder.Ascending; //none not supported for actual sorting! + if (dir == SortOrder.None) + dir = SortOrder.Ascending; //none not supported for actual sorting! SortColumnIndex = col; SortDirection = dir; @@ -1380,7 +1445,8 @@ namespace CodeWalker MainListView.VirtualListSize = 0; - if (CurrentFiles == null) return; + if (CurrentFiles == null) + return; CurrentFiles.Sort((i1, i2) => i1.SortCompare(i2, col, dir)); @@ -1410,8 +1476,10 @@ namespace CodeWalker public void Search(string text) { - if (!Ready) return; - if (Searching) return; + if (!Ready) + return; + if (Searching) + return; if (string.IsNullOrEmpty(text)) return; SearchTextBox.Text = text; @@ -1422,8 +1490,8 @@ namespace CodeWalker SearchResults = new MainTreeFolder { - Name = "Search Results: " + text, - Path = "Search Results: " + text, + Name = $"Search Results: {text}", + Path = $"Search Results: {text}", IsSearchResults = true, SearchTerm = text, }; @@ -1436,7 +1504,7 @@ namespace CodeWalker CurrentFiles?.Clear(); - UpdateStatus?.Invoke("Searching..."); + InvokeUpdateStatus("Searching...", true); var term = text; @@ -1456,11 +1524,11 @@ namespace CodeWalker if (Searching) { Searching = false; - UpdateStatus?.Invoke("Search complete. " + resultcount.ToString() + " items found."); + InvokeUpdateStatus($"Search complete. {resultcount} items found.", true); } else { - UpdateStatus?.Invoke("Search aborted. " + resultcount.ToString() + " items found."); + InvokeUpdateStatus($"Search aborted. {resultcount} items found.", true); } Cursor = Cursors.Default; @@ -1483,10 +1551,10 @@ namespace CodeWalker public void AddSearchResult(MainListItem? item) { - if (SearchResults == null) return; - if (SearchResults.ListItems != CurrentFiles) return; + if (SearchResults?.ListItems != CurrentFiles) + return; - if (item != null) + if (item is not null) { CurrentFiles.Add(item); } @@ -1512,9 +1580,9 @@ namespace CodeWalker - private byte[] GetFileData(MainListItem file) + private byte[]? GetFileData(MainListItem file) { - byte[] data = null; + byte[]? data = null; if (file.Folder != null) { var entry = file.Folder.RpfFile?.ParentFileEntry; @@ -1533,22 +1601,47 @@ namespace CodeWalker { data = file.File.File.ExtractFile(file.File); } - else - { } } else if (!string.IsNullOrEmpty(file.FullPath)) { data = File.ReadAllBytes(file.FullPath); //load file from filesystem } - else - { } return data; } + + private async ValueTask GetFileDataAsync(MainListItem file) + { + byte[]? data = null; + if (file.Folder != null) + { + var entry = file.Folder.RpfFile?.ParentFileEntry; + if (entry != null) + { + data = await entry.File.ExtractFileAsync(entry);//extract an RPF from another. + } + else if (!string.IsNullOrEmpty(file.FullPath) && (file.Folder.RpfFile != null)) + { + data = await File.ReadAllBytesAsync(file.FullPath); //load RPF file from filesystem + } + } + else if (file.File != null) //load file from RPF + { + if (file.File.File != null) //need the reference to the RPF archive + { + data = await file.File.File.ExtractFileAsync(file.File); + } + } + else if (!string.IsNullOrEmpty(file.FullPath)) + { + data = await File.ReadAllBytesAsync(file.FullPath); //load file from filesystem + } + return data; + } + private byte[] GetFileDataCompressResources(MainListItem file) { byte[] data = GetFileData(file); - RpfResourceFileEntry rrfe = file.File as RpfResourceFileEntry; - if (rrfe != null) //add resource header if this is a resource file. + if (file.File is RpfResourceFileEntry rrfe) //add resource header if this is a resource file. { data = ResourceBuilder.Compress(data); //not completely ideal to recompress it... data = ResourceBuilder.AddResourceHeader(rrfe, data); @@ -1598,8 +1691,10 @@ namespace CodeWalker private bool CanExportXml(MainListItem item) { - if (item == null) return false; - if (item.FileType == null) return false; + if (item == null) + return false; + if (item.FileType == null) + return false; return item.FileType.XmlConvertible; } @@ -1616,7 +1711,7 @@ namespace CodeWalker return; } - byte[] data = null; + byte[]? data = null; string name = ""; string path = ""; if (item.File != null) @@ -1635,7 +1730,7 @@ namespace CodeWalker path = item.FullPath; } - if (data == null) return; + if (data is null) return; var ft = item.FileType; var fe = item.File; @@ -1771,6 +1866,7 @@ namespace CodeWalker } catch (Exception ex) { + Console.WriteLine(ex); ErrorLog?.Invoke(ex.ToString()); return; } @@ -2174,13 +2270,18 @@ namespace CodeWalker public string SelectFolder() { + if (InvokeRequired) + { + return Invoke(SelectFolder); + } var selpath = Settings.Default.RPFExplorerSelectedFolder; if (!string.IsNullOrEmpty(selpath)) { FolderBrowserDialog.SelectedPath = selpath; } - if (FolderBrowserDialog.ShowDialogNew() != DialogResult.OK) return ""; + if (FolderBrowserDialog.ShowDialogNew() != DialogResult.OK) + return ""; string folderpath = FolderBrowserDialog.SelectedPath; if (!folderpath.EndsWith("\\")) folderpath += "\\"; @@ -2210,7 +2311,8 @@ namespace CodeWalker for (int i = 0; i < MainListView.SelectedIndices.Count; i++) { var idx = MainListView.SelectedIndices[i]; - if ((idx < 0) || (idx >= CurrentFiles.Count)) continue; + if ((idx < 0) || (idx >= CurrentFiles.Count)) + continue; var file = CurrentFiles[idx]; if (file.Folder == null) { @@ -2239,10 +2341,12 @@ namespace CodeWalker void collectDrawable(DrawableBase d) { - if (d?.AllModels == null) return; + if (d?.AllModels == null || d.AllModels.Length == 0) + return; foreach (var model in d.AllModels) { - if (model?.Geometries == null) continue; + if (model?.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { var s = geom?.Shader; @@ -2262,22 +2366,26 @@ namespace CodeWalker void collectTextures(DrawableBase d) { collectTexturesFromDict(d?.ShaderGroup?.TextureDictionary, (d.Owner as GameFile)?.Name ?? ""); - if (d?.AllModels == null) return; + if (d?.AllModels is null || d.AllModels.Length == 0) + return; foreach (var model in d.AllModels) { - if (model?.Geometries == null) continue; + if (model.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { - var s = geom?.Shader; - if (s == null) continue; + var s = geom.Shader; + if (s is null) + continue; addTextureuse(s, geom, d); } } } - void collectTexturesFromDict(TextureDictionary textureDictionary, string ownerName) + void collectTexturesFromDict(TextureDictionary? textureDictionary, string ownerName) { - if (textureDictionary == null) return; + if (textureDictionary == null) + return; foreach(var texture in textureDictionary.Dict) { if (!textures.TryGetValue(texture.Value.Name, out var tex)) @@ -2379,8 +2487,9 @@ namespace CodeWalker UpdateStatus?.Invoke(entry.Path); YdrFile ydr = RpfFile.GetFile(entry, fileData); - if (ydr == null) { continue; } - if (ydr.Drawable == null) { continue; } + if (ydr?.Drawable is null) + continue; + collectDrawable(ydr.Drawable); collectTextures(ydr.Drawable); } @@ -2389,8 +2498,8 @@ namespace CodeWalker UpdateStatus?.Invoke(entry.Path); YddFile ydd = RpfFile.GetFile(entry, fileData); - if (ydd == null) { continue; } - if (ydd.Dict == null) { continue; } + if (ydd?.Dict is null) + continue; foreach (var drawable in ydd.Dict.Values) { collectDrawable(drawable); @@ -2402,9 +2511,10 @@ namespace CodeWalker UpdateStatus?.Invoke(entry.Path); YftFile yft = RpfFile.GetFile(entry, fileData); - if (yft == null) { continue; } - if (yft.Fragment == null) { continue; } - if (yft.Fragment.Drawable != null) + if (yft?.Fragment is null) + continue; + + if (yft.Fragment?.Drawable is not null) { collectDrawable(yft.Fragment.Drawable); collectTextures(yft.Fragment.Drawable); @@ -2531,8 +2641,13 @@ namespace CodeWalker File.WriteAllText(Path.Combine(CurrentFolder.FullPath, "shaders.xml"), xml); } - private void ExportXml() + private async ValueTask ExportXmlAsync() { + if (!InvokeRequired) + { + await Task.Run(ExportXmlAsync); + return; + } bool needfolder = false;//need a folder to output ytd XML to, for the texture .dds files if (MainListView.SelectedIndices.Count == 1) { @@ -2542,7 +2657,8 @@ namespace CodeWalker var nl = file?.File?.Name ?? file?.Name; if (!string.IsNullOrEmpty(nl)) { - needfolder = nl.EndsWith(".ytd", StringComparison.OrdinalIgnoreCase) + needfolder = + nl.EndsWith(".ytd", StringComparison.OrdinalIgnoreCase) || nl.EndsWith(".ydr", StringComparison.OrdinalIgnoreCase) || nl.EndsWith(".ydd", StringComparison.OrdinalIgnoreCase) || nl.EndsWith(".yft", StringComparison.OrdinalIgnoreCase) @@ -2557,15 +2673,21 @@ namespace CodeWalker if ((MainListView.SelectedIndices.Count == 1) && (!needfolder)) { var idx = MainListView.SelectedIndices[0]; - if ((idx < 0) || (idx >= CurrentFiles.Count)) return; + if ((idx < 0) || (idx >= CurrentFiles.Count)) + { + Console.WriteLine("SelectedIndex not found!"); + return; + } + var file = CurrentFiles[idx]; if (file.Folder == null) { if (CanExportXml(file)) { - byte[] data = GetFileData(file); + byte[] data = await GetFileDataAsync(file); if (data == null) { + Console.WriteLine($"Unable to extract file: {file.Path}"); MessageBox.Show("Unable to extract file: " + file.Path); return; } @@ -2582,7 +2704,8 @@ namespace CodeWalker string xml = MetaXml.GetXml(fentry, data, out newfn); if (string.IsNullOrEmpty(xml)) { - MessageBox.Show("Unable to convert file to XML: " + file.Path); + Console.WriteLine($"Unable to convert file to XML: {file.Path}"); + MessageBox.Show($"Unable to convert file to XML: {file.Path}"); return; } @@ -2592,13 +2715,12 @@ namespace CodeWalker string path = SaveFileDialog.FileName; try { - File.WriteAllText(path, xml); + await File.WriteAllTextAsync(path, xml); if (CurrentFolder.FullPath.Equals(Path.GetDirectoryName(path), StringComparison.OrdinalIgnoreCase)) { CurrentFolder.EnsureFile(path); refreshNeeded = true; } - } catch (Exception ex) { @@ -2611,7 +2733,8 @@ namespace CodeWalker else { var folderpath = SelectFolder(); - if (string.IsNullOrEmpty(folderpath)) return; + if (string.IsNullOrEmpty(folderpath)) + return; StringBuilder errors = new StringBuilder(); @@ -2631,7 +2754,7 @@ namespace CodeWalker continue; } - string newfn; + string newfn = string.Empty; var fentry = file?.File; if (fentry == null) { @@ -2640,26 +2763,34 @@ namespace CodeWalker fentry = RpfFile.CreateFileEntry(name, file.FullPath, ref data); } - string xml = MetaXml.GetXml(fentry, data, out newfn, folderpath); - if (string.IsNullOrEmpty(xml)) - { - errors.AppendLine("Unable to convert file to XML: " + file.Path); - continue; - } - - var path = folderpath + newfn; try { - File.WriteAllText(path, xml); - if (CurrentFolder?.FullPath?.Equals(Path.GetDirectoryName(path), StringComparison.OrdinalIgnoreCase) ?? false) + string xml = await Task.Run(() => MetaXml.GetXml(fentry, data, out newfn, folderpath)); + if (string.IsNullOrEmpty(xml)) { - CurrentFolder.EnsureFile(path); - refreshNeeded = true; + errors.AppendLine($"Unable to convert file to XML: {file?.Path}"); + continue; + } + + var path = folderpath + newfn; + try + { + File.WriteAllText(path, xml); + if (CurrentFolder?.FullPath?.Equals(Path.GetDirectoryName(path), StringComparison.OrdinalIgnoreCase) ?? false) + { + CurrentFolder.EnsureFile(path); + refreshNeeded = true; + } + } + catch (Exception ex) + { + errors.AppendLine("Error saving file " + path + ":\n" + ex.ToString()); } } - catch (Exception ex) + catch(Exception ex) { - errors.AppendLine("Error saving file " + path + ":\n" + ex.ToString()); + errors.AppendLine($"Unable to convert file to XML: {file?.Path}\n{ex}"); + Console.WriteLine(ex); } } } @@ -2669,6 +2800,10 @@ namespace CodeWalker { MessageBox.Show("Errors were encountered:\n" + errstr); } + else + { + UpdateStatus?.Invoke("Exporting file done"); + } } if (refreshNeeded) { @@ -2912,7 +3047,7 @@ namespace CodeWalker //create a folder in the filesystem. if (Directory.Exists(fullpath)) { - throw new Exception("Folder " + fullpath + " already exists!"); + throw new Exception($"Folder {fullpath} already exists!"); } Directory.CreateDirectory(fullpath); @@ -2931,7 +3066,8 @@ namespace CodeWalker } catch (Exception ex) { - MessageBox.Show("Error creating new folder: " + ex.Message, "Unable to create new folder"); + MessageBox.Show($"Error creating new folder: {ex.Message}", "Unable to create new folder"); + Console.WriteLine(ex); return; } @@ -3196,7 +3332,7 @@ namespace CodeWalker byte[] data = XmlMeta.GetData(doc, mformat, fpathin); - if (data != null) + if (data != null && data.Length > 0) { if (CurrentFolder.RpfFolder != null) { @@ -3698,10 +3834,11 @@ namespace CodeWalker { try { - Process.Start("explorer", "/select, \"" + path + "\""); + Process.Start("explorer", $"/select, \"{path}\""); } catch (Exception ex) { + Console.WriteLine(ex); ErrorLog?.Invoke(ex.ToString()); } } @@ -3817,8 +3954,7 @@ namespace CodeWalker foreach (var item in ViewMenu.DropDownItems) { - var menu = item as ToolStripMenuItem; - if (menu != null) + if (item is ToolStripMenuItem menu) { menu.Checked = false; } @@ -3957,7 +4093,7 @@ namespace CodeWalker private void MainListView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) { var lvi = new ListViewItem(); - if ((CurrentFiles != null) && (e.ItemIndex < CurrentFiles.Count)) + if (CurrentFiles is not null && e.ItemIndex < CurrentFiles.Count) { var file = CurrentFiles[e.ItemIndex]; var fld = file.Folder; @@ -4005,7 +4141,7 @@ namespace CodeWalker UpdateSelectionUI(); //need to use this instead of SelectedIndexChanged because of shift-click bug :/ } - private void MainListView_KeyDown(object sender, KeyEventArgs e) + private async void MainListView_KeyDown(object sender, KeyEventArgs e) { var ctrl = (e.Control && !e.Shift); var ctrlshft = (e.Control && e.Shift); @@ -4020,7 +4156,10 @@ namespace CodeWalker if (ctrl) ViewSelectedHex(); break; case Keys.S: - if (ctrl) ExportXml(); + if (ctrl) + { + await ExportXmlAsync(); + } break; case Keys.E: if (ctrlshft) ExtractAll(); @@ -4082,7 +4221,7 @@ namespace CodeWalker private void MainListView_AfterLabelEdit(object sender, LabelEditEventArgs e) { - if ((CurrentFiles != null) && (CurrentFiles.Count > e.Item) && (!string.IsNullOrEmpty(e.Label))) + if (CurrentFiles is not null && CurrentFiles.Count > e.Item && !string.IsNullOrEmpty(e.Label)) { RenameItem(CurrentFiles[e.Item], e.Label); } @@ -4159,7 +4298,7 @@ namespace CodeWalker } } } - filenames.Add(dir + "\\" + file.Name); + filenames.Add($"{dir}\\{file.Name}"); } } @@ -4186,8 +4325,7 @@ namespace CodeWalker if (CurrentFolder?.IsSearchResults ?? false) return; if (e.Data.GetDataPresent(DataFormats.FileDrop)) { - var files = e.Data.GetData(DataFormats.FileDrop) as string[]; - if ((files != null) && (files.Length > 0)) + if ((e.Data.GetData(DataFormats.FileDrop) is string[] files) && (files.Length > 0)) { if (!files[0].StartsWith(GetDropFolder(), StringComparison.InvariantCultureIgnoreCase)) //don't dry to drop on ourselves... { @@ -4203,8 +4341,7 @@ namespace CodeWalker if (CurrentFolder?.IsSearchResults ?? false) return; if (e.Data.GetDataPresent(DataFormats.FileDrop)) { - var files = e.Data.GetData(DataFormats.FileDrop) as string[]; - if ((files == null) || (files.Length <= 0)) return; + if ((e.Data.GetData(DataFormats.FileDrop) is not string[] files) || (files.Length <= 0)) return; if (files[0].StartsWith(GetDropFolder(), StringComparison.InvariantCultureIgnoreCase)) return; //don't dry to drop on ourselves... //Import as raw regardless of file type while pressing shift @@ -4229,8 +4366,7 @@ namespace CodeWalker private void BackListButton_Click(object sender, EventArgs e) { - var step = (sender as ToolStripItem)?.Tag as MainTreeFolder; - if (step == null) return; + if ((sender as ToolStripItem)?.Tag is not MainTreeFolder step) return; GoBack(step); } @@ -4241,8 +4377,7 @@ namespace CodeWalker private void ForwardListButton_Click(object sender, EventArgs e) { - var step = (sender as ToolStripItem)?.Tag as MainTreeFolder; - if (step == null) return; + if ((sender as ToolStripItem)?.Tag is not MainTreeFolder step) return; GoForward(step); } @@ -4253,8 +4388,7 @@ namespace CodeWalker private void UpListButton_Click(object sender, EventArgs e) { - var step = (sender as ToolStripItem)?.Tag as MainTreeFolder; - if (step == null) return; + if ((sender as ToolStripItem)?.Tag is not MainTreeFolder step) return; GoUp(step); } @@ -4269,7 +4403,7 @@ namespace CodeWalker private void LocationTextBox_Enter(object sender, EventArgs e) { - BeginInvoke(new Action(() => LocationTextBox.SelectAll())); + BeginInvoke(LocationTextBox.SelectAll); } private void GoButton_Click(object sender, EventArgs e) @@ -4282,7 +4416,7 @@ namespace CodeWalker if (!Ready) return; Task.Run(async () => { - await RefreshMainTreeView(); + await RefreshMainTreeView().ConfigureAwait(false); UpdateStatus?.Invoke("Scan complete."); }, CancellationTokenSource.Token); @@ -4304,7 +4438,7 @@ namespace CodeWalker private void SearchTextBox_Enter(object sender, EventArgs e) { - BeginInvoke(new Action(() => SearchTextBox.SelectAll())); + BeginInvoke(SearchTextBox.SelectAll); } private void SearchButton_ButtonClick(object sender, EventArgs e) @@ -4331,8 +4465,7 @@ namespace CodeWalker private void TreeContextCopyPathMenu_Click(object sender, EventArgs e) { - var f = MainTreeView.SelectedNode?.Tag as MainTreeFolder; - if (f != null) + if (MainTreeView.SelectedNode?.Tag is MainTreeFolder f) { CopyPath(f.FullPath); } @@ -4399,9 +4532,9 @@ namespace CodeWalker GetShadersXml(); } - private void ListContextExportXmlMenu_Click(object sender, EventArgs e) + private async void ListContextExportXmlMenu_Click(object sender, EventArgs e) { - ExportXml(); + await ExportXmlAsync(); } private void ListContextExtractRawMenu_Click(object sender, EventArgs e) @@ -4514,9 +4647,9 @@ namespace CodeWalker ViewSelectedHex(); } - private void EditExportXmlMenu_Click(object sender, EventArgs e) + private async void EditExportXmlMenu_Click(object sender, EventArgs e) { - ExportXml(); + await ExportXmlAsync(); } private void EditExtractRawMenu_Click(object sender, EventArgs e) @@ -4676,32 +4809,19 @@ namespace CodeWalker - public class MainTreeFolder + public class MainTreeFolder : IDisposable, IResettable { public required string Name { get; set; } - - private string? _nameLower; - public string NameLower - { - get - { - return _nameLower ??= Name.ToLowerInvariant(); - } - set - { - _nameLower = value; - } - } public required string Path { get; set; } public string? FullPath { get; set; } public RpfFile? RpfFile { get; set; } public RpfDirectoryEntry? RpfFolder { get; set; } - public HashSet? Files { get; set; } + public PooledList? Files { get; set; } private object filesLock = new object(); public MainTreeFolder? Parent { get; set; } - public List? Children { get; set; } + public PooledList? Children { get; set; } private readonly object childrenLock = new object(); - public List? ListItems { get; set; } + public PooledList? ListItems { get; set; } public TreeNode? TreeNode { get; set; } public bool IsSearchResults { get; set; } = false; public string? SearchTerm { get; set; } @@ -4711,116 +4831,137 @@ namespace CodeWalker { lock (filesLock) { - if (Files == null) - { - Files = new(); - } + Files ??= new(); Files.Add(file); + if (ListItems is not null) + populateListItems(); } } public void AddChild(MainTreeFolder child) { lock(childrenLock) { - if (Children == null) Children = new List(); + Children ??= new PooledList(); Children.Add(child); child.Parent = this; + if (ListItems is not null) + populateListItems(); } } public void RemoveChild(MainTreeFolder child) { - if (Children == null) return; + if (Children is null) return; lock(childrenLock) { Children.Remove(child); child.Parent = null; + if (ListItems is not null) + populateListItems(); + } + } + + public void EnsureFile(string file) + { + if (Files is not null) + { + if (Files.Contains(file)) + return; + } + AddFile(file); + } + public void RemoveFile(string file) + { + if (Files is null) + return; + + lock (filesLock) + { + Files.Remove(file); + if (ListItems is not null) + populateListItems(); } } public void AddChildToHierarchy(MainTreeFolder child) { - var relpath = child.Path.Replace(Path + '\\', ""); + var relpath = child.Path.AsSpan(Path.Length + 1); var idx = relpath.IndexOf('\\'); var lidx = 0; var parent = this; while (idx > 0) { - var pname = relpath.Substring(lidx, idx - lidx); - if (parent.Children == null) break; + var pname = relpath[lidx..idx]; + if (parent.Children == null) + break; foreach (var tc in parent.Children) { - if (tc.Name.Equals(pname, StringComparison.OrdinalIgnoreCase)) + if (pname.Equals(tc.Name, StringComparison.OrdinalIgnoreCase)) { parent = tc; break; } } lidx = idx + 1; - if (lidx >= relpath.Length) break; - idx = relpath.IndexOf('\\', lidx); + if (lidx >= relpath.Length) + break; + idx = relpath.Slice(lidx).IndexOf('\\'); + if (idx > -1) + { + idx += lidx; + } } parent.AddChild(child); } - public void EnsureFile(string file) + [MemberNotNull(nameof(ListItems))] + private void populateListItems() { - if (Files != null) + ListItems ??= new PooledList(); + ListItems.Clear(); + var rootpath = GTAFolder.GetCurrentGTAFolderWithTrailingSlash(); + + if (Children is not null) { - if (Files.Contains(file)) return; + foreach (var child in Children.Span) + { + ListItems.Add(new MainListItem(child)); + } } - AddFile(file); - } - public void RemoveFile(string file) - { - lock(filesLock) + if (Files is not null) { - Files?.Remove(file); + foreach (var file in Files.Span) + { + ListItems.Add(new MainListItem(file, rootpath, this)); + } + } + if (RpfFolder?.Files is not null) + { + foreach (var file in RpfFolder.Files.Span) + { + if (file.IsExtension(".rpf")) + continue; //RPF files are already added.. + + ListItems.Add(new MainListItem(file, rootpath, this)); + } } } - public List GetListItems() + public PooledList GetListItems() { - if (ListItems == null) + if (ListItems is null) { - ListItems = new List(); - var rootpath = GTAFolder.GetCurrentGTAFolderWithTrailingSlash(); - - if (Children != null) - { - foreach (var child in Children) - { - ListItems.Add(new MainListItem(child)); - } - } - if (Files != null) - { - lock(filesLock) - { - foreach (var file in Files) - { - ListItems.Add(new MainListItem(file, rootpath, this)); - } - } - } - if ((RpfFolder != null) && (RpfFolder.Files != null)) - { - foreach (var file in RpfFolder.Files) - { - if (file.IsExtension(".rpf")) - continue; //RPF files are already added.. - ListItems.Add(new MainListItem(file, rootpath, this)); - } - } + populateListItems(); } return ListItems; } public int GetItemCount() { int ic = 0; - if (Children != null) ic += Children.Count; - if (Files != null) ic += Files.Count; - if ((RpfFolder != null) && (RpfFolder.Files != null)) + if (Children is not null) + ic += Children.Count; + if (Files is not null) ic += Files.Count; + if (RpfFolder?.Files is not null) { foreach (var file in RpfFolder.Files) { @@ -4834,16 +4975,33 @@ namespace CodeWalker public string GetToolText() { - if (string.IsNullOrEmpty(Path)) return Name; + if (string.IsNullOrEmpty(Path)) + return Name; + return Path; } + public ReadOnlySpan GetFileName(ReadOnlySpan path) + { + if (path.IsEmpty) + return path; + + int i = path.LastIndexOfAny(System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar); + + if (i == -1) + { + return path; + } + + return path.Slice(i + 1); + } + public int Search(string term, ExploreForm form) { int resultcount = 0; //if (!form.Searching) return resultcount; - form.InvokeUpdateStatus("Searching " + Path + "..."); + form.InvokeUpdateStatus($"Searching {Path}..."); if (Name.Contains(term, StringComparison.OrdinalIgnoreCase)) { @@ -4853,20 +5011,20 @@ namespace CodeWalker var rootpath = GTAFolder.GetCurrentGTAFolderWithTrailingSlash(); - if (Files != null) + if (Files is not null) { foreach (var file in Files) { //if (!form.Searching) return resultcount; - var fi = new FileInfo(file); - if (fi.Name.Contains(term, StringComparison.OrdinalIgnoreCase)) + //var fi = new FileInfo(file); + if (GetFileName(file).Contains(term, StringComparison.OrdinalIgnoreCase)) { form.AddSearchResult(new MainListItem(file, rootpath, this)); resultcount++; } } } - if ((RpfFolder != null) && (RpfFolder.Files != null)) + if (RpfFolder?.Files is not null) { foreach (var file in RpfFolder.Files) { @@ -4881,7 +5039,7 @@ namespace CodeWalker } } - if (Children != null) + if (Children is not null) { foreach (var child in Children) { @@ -4892,7 +5050,7 @@ namespace CodeWalker if (this == form.RootFolder) { - var texDict = form.GetFileCache().TryGetTextureDictForTexture(JenkHash.GenHashLower(term)) ?? form.GetFileCache().TryGetTextureDictForTexture(JenkHash.GenHash(term)); + var texDict = GameFileCacheFactory.Instance.TryGetTextureDictForTexture(JenkHash.GenHashLower(term)) ?? GameFileCacheFactory.Instance.TryGetTextureDictForTexture(JenkHash.GenHash(term)); if (texDict != null) { form.AddSearchResult(new MainListItem(texDict.RpfFileEntry, rootpath, this)); @@ -4909,24 +5067,52 @@ namespace CodeWalker { RpfFile = null; RpfFolder = null; + Files?.Dispose(); Files = null; Parent = null; + if (Children is not null) + { + foreach(var child in Children.Span) + { + child.Dispose(); + } + } + Children?.Dispose(); Children = null; + ListItems?.Dispose(); ListItems = null; TreeNode = null; } + public void Dispose() + { + Clear(); + GC.SuppressFinalize(this); + } + public override string ToString() { return Name; } + + public bool TryReset() + { + Clear(); + Name = string.Empty; + Path = string.Empty; + FullPath = null; + IsSearchResults = false; + SearchTerm = null; + IsExtraFolder = false; + return true; + } } public class MainListItem { private string path; private string attributes; - private long fileSize = -1l; + private long fileSize = -1L; private string fileSizeText; private string fileTypeText; @@ -4937,7 +5123,7 @@ namespace CodeWalker public string Path { get => path; set => path = value; } public string FullPath { get; set; } - public FileTypeInfo FileType { get => ExploreForm.GetFileType(Name); } + public FileTypeInfo FileType => ExploreForm.GetFileType(Name); public string FileTypeText { get { @@ -4982,7 +5168,7 @@ namespace CodeWalker { if (File is RpfResourceFileEntry resf) { - attributes += "Resource [V." + resf.Version.ToString() + "]"; + attributes += $"Resource [V.{resf.Version}]"; } if (File.IsEncrypted) { @@ -4997,7 +5183,7 @@ namespace CodeWalker { if (fld.RpfFile != null) { - attributes += fld.RpfFile.Encryption.ToString() + " encryption"; + attributes += $"{fld.RpfFile.Encryption} encryption"; } } } @@ -5037,6 +5223,7 @@ namespace CodeWalker return Name; } + [MemberNotNull(nameof(fileSizeText), nameof(fileTypeText))] public void CacheDetails() { var fld = Folder; @@ -5061,7 +5248,7 @@ namespace CodeWalker ImageIndex = 1; //FOLDER imageIndex var ic = fld.GetItemCount(); fileSize = ic; - fileSizeText = ic.ToString() + " item" + ((ic != 1) ? "s" : ""); + fileSizeText = $"{ic} item{((ic != 1) ? "s" : "")}"; } } else @@ -5073,8 +5260,8 @@ namespace CodeWalker fileSizeText = TextUtil.GetBytesReadable(fi.Length); } } - fileSizeText ??= ""; - fileTypeText ??= ""; + fileSizeText ??= string.Empty; + fileTypeText ??= string.Empty; } public int SortCompare(MainListItem i, int col, SortOrder dir) diff --git a/CodeWalker/Forms/HexForm.cs b/CodeWalker/Forms/HexForm.cs index 6184043..390d7ba 100644 --- a/CodeWalker/Forms/HexForm.cs +++ b/CodeWalker/Forms/HexForm.cs @@ -98,16 +98,16 @@ namespace CodeWalker.Forms int poslim = pos + charsperln; hexb.Clear(); texb.Clear(); - hexb.AppendFormat("{0:X4}: ", pos); + hexb.Append($"{pos:X4}: "); for (int c = pos; c < poslim; c++) { if (c < data.Length) { byte b = data[c]; - hexb.AppendFormat("{0:X2} ", b); + hexb.Append($"{b:X2} "); if (char.IsControl((char)b)) { - texb.Append("."); + texb.Append('.'); } else { @@ -117,12 +117,12 @@ namespace CodeWalker.Forms else { hexb.Append(" "); - texb.Append(" "); + texb.Append(' '); } } //if (i == selline) selstartc = finb.Length; - finb.AppendLine(hexb.ToString() + "| " + texb.ToString()); + finb.AppendLine($"{hexb}| {texb}"); //if (i == selline) selendc = finb.Length - 1; } diff --git a/CodeWalker/Forms/MetaForm.cs b/CodeWalker/Forms/MetaForm.cs index d793ff1..760366b 100644 --- a/CodeWalker/Forms/MetaForm.cs +++ b/CodeWalker/Forms/MetaForm.cs @@ -21,7 +21,7 @@ namespace CodeWalker.Forms private string xml; public string Xml { - get { return xml; } + get => xml; set { xml = value; @@ -32,7 +32,7 @@ namespace CodeWalker.Forms private string fileName; public string FileName { - get { return fileName; } + get => fileName; set { fileName = value; @@ -45,7 +45,7 @@ namespace CodeWalker.Forms private bool LoadingXml = false; private bool DelayHighlight = false; - public RpfFileEntry rpfFileEntry { get; private set; } = null; + public RpfFileEntry? rpfFileEntry { get; private set; } = null; private MetaFormat metaFormat = MetaFormat.XML; @@ -63,44 +63,52 @@ namespace CodeWalker.Forms private void UpdateTextBoxFromData() { - LoadingXml = true; - XmlTextBox.Text = ""; - XmlTextBox.Language = Language.XML; - DelayHighlight = false; - - if (string.IsNullOrEmpty(xml)) + if (InvokeRequired) { - LoadingXml = false; + BeginInvoke(UpdateTextBoxFromData); return; } - //if (xml.Length > (1048576 * 5)) - //{ - // XmlTextBox.Language = Language.Custom; - // XmlTextBox.Text = "[XML size > 10MB - Not shown due to performance limitations - Please use an external viewer for this file.]"; - // return; - //} - //else - if (xml.Length > (1024 * 512)) - { - XmlTextBox.Language = Language.Custom; - DelayHighlight = true; - } - //else - //{ - // XmlTextBox.Language = Language.XML; - //} - - + LoadingXml = true; Cursor = Cursors.WaitCursor; + try + { + XmlTextBox.BeginUpdate(); + XmlTextBox.Clear(); + XmlTextBox.Language = Language.XML; + DelayHighlight = false; + if (string.IsNullOrEmpty(xml)) + { + LoadingXml = false; + return; + } + //if (xml.Length > (1048576 * 5)) + //{ + // XmlTextBox.Language = Language.Custom; + // XmlTextBox.Text = "[XML size > 10MB - Not shown due to performance limitations - Please use an external viewer for this file.]"; + // return; + //} + //else + if (xml.Length > (1024 * 512)) + { + XmlTextBox.Language = Language.Custom; + DelayHighlight = true; + } + //else + //{ + // XmlTextBox.Language = Language.XML; + //} - - XmlTextBox.Text = xml; - //XmlTextBox.IsChanged = false; - XmlTextBox.ClearUndo(); - - Cursor = Cursors.Default; - LoadingXml = false; + XmlTextBox.Text = xml; + //XmlTextBox.IsChanged = false; + XmlTextBox.ClearUndo(); + } + finally + { + Cursor = Cursors.Default; + LoadingXml = false; + XmlTextBox.EndUpdate(); + } } @@ -130,24 +138,28 @@ namespace CodeWalker.Forms } private void NewDocument() { - if (!CloseDocument()) return; + if (!CloseDocument()) + return; FileName = "New.xml"; rpfFileEntry = null; //TODO: decide XML/RSC/PSO/RBF format..? } - private void OpenDocument() + private async ValueTask OpenDocument() { - if (OpenFileDialog.ShowDialog() != DialogResult.OK) return; + if (OpenFileDialog.ShowDialog() != DialogResult.OK) + return; - if (!CloseDocument()) return; + if (!CloseDocument()) + return; var fn = OpenFileDialog.FileName; - if (!File.Exists(fn)) return; //couldn't find file? + if (!File.Exists(fn)) + return; //couldn't find file? - Xml = File.ReadAllText(fn); + Xml = await File.ReadAllTextAsync(fn); modified = false; FilePath = fn; @@ -190,7 +202,8 @@ namespace CodeWalker.Forms if (!string.IsNullOrEmpty(fn)) { var dir = new FileInfo(fn).DirectoryName; - if (!Directory.Exists(dir)) dir = ""; + if (!Directory.Exists(dir)) + dir = ""; SaveFileDialog.InitialDirectory = dir; } SaveFileDialog.FileName = FileName; @@ -235,9 +248,12 @@ namespace CodeWalker.Forms metaFormat = MetaFormat.XML; if (ymf != null) { - if (ymf.Meta != null) metaFormat = MetaFormat.RSC; - if (ymf.Pso != null) metaFormat = MetaFormat.PSO; - if (ymf.Rbf != null) metaFormat = MetaFormat.RBF; + if (ymf.Meta != null) + metaFormat = MetaFormat.RSC; + if (ymf.Pso != null) + metaFormat = MetaFormat.PSO; + if (ymf.Rbf != null) + metaFormat = MetaFormat.RBF; } } public void LoadMeta(YmapFile ymap) @@ -251,9 +267,12 @@ namespace CodeWalker.Forms metaFormat = MetaFormat.XML; if (ymap != null) { - if (ymap.Meta != null) metaFormat = MetaFormat.RSC; - if (ymap.Pso != null) metaFormat = MetaFormat.PSO; - if (ymap.Rbf != null) metaFormat = MetaFormat.RBF; + if (ymap.Meta != null) + metaFormat = MetaFormat.RSC; + if (ymap.Pso != null) + metaFormat = MetaFormat.PSO; + if (ymap.Rbf != null) + metaFormat = MetaFormat.RBF; } } public void LoadMeta(YtypFile ytyp) @@ -267,9 +286,12 @@ namespace CodeWalker.Forms metaFormat = MetaFormat.XML; if (ytyp != null) { - if (ytyp.Meta != null) metaFormat = MetaFormat.RSC; - if (ytyp.Pso != null) metaFormat = MetaFormat.PSO; - if (ytyp.Rbf != null) metaFormat = MetaFormat.RBF; + if (ytyp.Meta != null) + metaFormat = MetaFormat.RSC; + if (ytyp.Pso != null) + metaFormat = MetaFormat.PSO; + if (ytyp.Rbf != null) + metaFormat = MetaFormat.RBF; } } public void LoadMeta(JPsoFile jpso) @@ -283,7 +305,8 @@ namespace CodeWalker.Forms metaFormat = MetaFormat.XML; if (jpso != null) { - if (jpso.Pso != null) metaFormat = MetaFormat.PSO; + if (jpso.Pso != null) + metaFormat = MetaFormat.PSO; } } public void LoadMeta(CutFile cut) @@ -297,7 +320,8 @@ namespace CodeWalker.Forms metaFormat = MetaFormat.XML; if (cut != null) { - if (cut.Pso != null) metaFormat = MetaFormat.PSO; + if (cut.Pso != null) + metaFormat = MetaFormat.PSO; } } public void LoadMeta(YndFile ynd) @@ -415,7 +439,7 @@ namespace CodeWalker.Forms public void LoadMeta(PackedFile gameFile) { - gameFile = gameFile ?? throw new ArgumentNullException(nameof(gameFile)); + ArgumentNullException.ThrowIfNull(gameFile, nameof(gameFile)); if (gameFile is YmfFile ymfFile) { @@ -484,33 +508,32 @@ namespace CodeWalker.Forms //otherwise, save the generated file to disk? //(currently just return false and revert to XML file save) - if (!(ExploreForm.Instance?.EditMode ?? false)) return false; + if (!(ExploreForm.Instance?.EditMode ?? false)) + return false; - if(metaFormat == MetaFormat.XML) return false;//what are we even doing here? + if(metaFormat == MetaFormat.XML) + return false;//what are we even doing here? - byte[] data = null; + byte[] data; -#if !DEBUG try -#endif { data = XmlMeta.GetData(doc, metaFormat, string.Empty); - if (data == null) + if (data.Length == 0) { MessageBox.Show("Schema not supported.", "Cannot import " + XmlMeta.GetXMLFormatName(metaFormat)); return false; } } -#if !DEBUG catch (Exception ex) { MessageBox.Show("Exception encountered!\r\n" + ex.ToString(), "Cannot convert XML"); + Console.WriteLine(ex); return false; } -#endif if (rpfFileEntry?.Parent != null) { @@ -524,11 +547,10 @@ namespace CodeWalker.Forms try { - if (!(ExploreForm.EnsureRpfValidEncryption(rpfFileEntry.File))) return false; + if (!ExploreForm.EnsureRpfValidEncryption(rpfFileEntry.File)) + return false; var newentry = RpfFile.CreateFile(rpfFileEntry.Parent, rpfFileEntry.Name, data); - if (newentry != rpfFileEntry) - { } rpfFileEntry = newentry; ExploreForm.RefreshMainListViewInvoke(); //update the file details in explorer... @@ -541,6 +563,7 @@ namespace CodeWalker.Forms } catch (Exception ex) { + Console.WriteLine(ex); MessageBox.Show("Error saving file to RPF! The RPF archive may be corrupted...\r\n" + ex.ToString(), "Really Bad Error"); } } @@ -560,6 +583,7 @@ namespace CodeWalker.Forms } catch (Exception ex) { + Console.WriteLine(ex); MessageBox.Show("Error saving file to filesystem!\r\n" + ex.ToString(), "File I/O Error"); } } @@ -616,9 +640,9 @@ namespace CodeWalker.Forms NewDocument(); } - private void OpenButton_ButtonClick(object sender, EventArgs e) + private async void OpenButton_ButtonClick(object sender, EventArgs e) { - OpenDocument(); + await OpenDocument(); } private void SaveButton_ButtonClick(object sender, EventArgs e) @@ -631,9 +655,9 @@ namespace CodeWalker.Forms NewDocument(); } - private void FileOpenMenu_Click(object sender, EventArgs e) + private async void FileOpenMenu_Click(object sender, EventArgs e) { - OpenDocument(); + await OpenDocument(); } private void FileSaveMenu_Click(object sender, EventArgs e) diff --git a/CodeWalker/Forms/ModelForm.cs b/CodeWalker/Forms/ModelForm.cs index afb136e..159fd97 100644 --- a/CodeWalker/Forms/ModelForm.cs +++ b/CodeWalker/Forms/ModelForm.cs @@ -17,6 +17,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using System.Windows.Markup; namespace CodeWalker.Forms { @@ -38,6 +39,7 @@ namespace CodeWalker.Forms Clouds clouds; public CancellationTokenSource CancellationTokenSource { get; } = new CancellationTokenSource(); + public CancellationToken CancellationToken { get; } bool MouseLButtonDown = false; bool MouseRButtonDown = false; @@ -47,7 +49,8 @@ namespace CodeWalker.Forms System.Drawing.Point MouseLastPoint; bool MouseInvert = Settings.Default.MouseInvert; - int VerticesCount = 0; + uint VerticesCount = 0; + uint PolyCount = 0; @@ -131,7 +134,7 @@ namespace CodeWalker.Forms public ModelForm() { - if (this.DesignMode) return; + CancellationToken = CancellationTokenSource.Token; InitializeComponent(); if (ExploreForm.Instance == null) @@ -143,10 +146,10 @@ namespace CodeWalker.Forms gameFileCache.LoadArchetypes = false;//to speed things up a little gameFileCache.BuildExtendedJenkIndex = true;//to speed things up a little gameFileCache.DoFullStringIndex = false;//to get all global text from DLC... - Task.Run(() => { + Task.Run(async () => { try { - gameFileCache.Init(); + await gameFileCache.InitAsync(); if (DetailsPropertyGrid.SelectedObject is DrawableBase drawableBase) { UpdateDrawableUI(drawableBase); @@ -298,7 +301,7 @@ namespace CodeWalker.Forms camera.TargetRotation.X = 0.5f * (float)Math.PI; camera.CurrentRotation.X = 0.5f * (float)Math.PI; - Renderer.shaders.deferred = false; //no point using this here yet + Renderer.Shaders.deferred = false; //no point using this here yet LoadSettings(); @@ -310,12 +313,18 @@ namespace CodeWalker.Forms frametimer.Start(); } - public void CleanupScene() + public ValueTask CleanupScene() { + if (!CancellationTokenSource.IsCancellationRequested) + { + CancellationTokenSource.Cancel(); + } formopen = false; Renderer.DeviceDestroyed(); + return default; + //int count = 0; //while (running && (count < 5000)) //wait for the content thread to exit gracefully //{ @@ -347,42 +356,47 @@ namespace CodeWalker.Forms if (Pauserendering) return; - if (!Monitor.TryEnter(Renderer.RenderSyncRoot, 50)) + if (!await Renderer.RenderSyncRoot.WaitAsync(50)) { return; } //couldn't get a lock, try again next time - UpdateControlInputs(elapsed); + try + { + UpdateControlInputs(elapsed); - Renderer.Update(elapsed, MouseLastPoint.X, MouseLastPoint.Y); + Renderer.Update(elapsed, MouseLastPoint.X, MouseLastPoint.Y); - UpdateWidgets(); + UpdateWidgets(); - Renderer.BeginRender(context); + Renderer.BeginRender(context); - Renderer.RenderSkyAndClouds(); + Renderer.RenderSkyAndClouds(); - RenderSingleItem(); + RenderSingleItem(); - RenderGrid(context); + RenderGrid(context); - RenderLightSelection(); + RenderLightSelection(); - Renderer.RenderQueued(); + Renderer.RenderQueued(); - Renderer.RenderSelectionGeometry(MapSelectionMode.Entity); + Renderer.RenderSelectionGeometry(MapSelectionMode.Entity); - Renderer.RenderFinalPass(); + Renderer.RenderFinalPass(); - RenderWidgets(); + RenderWidgets(); - Renderer.EndRender(); - - Monitor.Exit(Renderer.RenderSyncRoot); + Renderer.EndRender(); + } + finally + { + Renderer.RenderSyncRoot.Release(); + } } public bool ConfirmQuit() { @@ -465,9 +479,9 @@ namespace CodeWalker.Forms bool rcItemsPending = Renderer.ContentThreadProc(); - if (!(rcItemsPending)) //gameFileCache.ItemsStillPending || + if (!rcItemsPending) //gameFileCache.ItemsStillPending || { - await Task.Delay(ActiveForm == null ? 50 : 1).ConfigureAwait(false); + await Task.Delay(ActiveForm == null ? 50 : 5).ConfigureAwait(false); } } @@ -484,7 +498,7 @@ namespace CodeWalker.Forms { if (InvokeRequired) { - BeginInvoke(new Action(() => { InitAnimation(); })); + BeginInvoke(InitAnimation); } else { @@ -496,7 +510,7 @@ namespace CodeWalker.Forms List ycdlist = new List(); foreach (var ycde in ycds) { - ycdlist.Add(ycde.ShortName); + ycdlist.Add(ycde.ShortName.ToString()); } ClipDictComboBox.AutoCompleteCustomSource.AddRange(ycdlist.ToArray()); ClipDictComboBox.Text = ""; @@ -663,7 +677,7 @@ namespace CodeWalker.Forms } public void SetWidgetMode(WidgetMode mode) { - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { Widget.Mode = mode; } @@ -915,17 +929,19 @@ namespace CodeWalker.Forms FileName = yft.Name; Yft = yft; rpfFileEntry = Yft.RpfFileEntry; - ModelHash = Yft.RpfFileEntry?.ShortNameHash ?? 0; - var name = Yft.RpfFileEntry?.ShortName; - if (name?.EndsWith("_hi", StringComparison.OrdinalIgnoreCase) ?? false) + if (rpfFileEntry is not null) { - ModelHash = JenkHash.GenHashLower(name.AsSpan(0, name.Length - 3)); + ModelHash = Yft.RpfFileEntry.ShortNameHash; + var name = Yft.RpfFileEntry.ShortName; + if (name.EndsWith("_hi", StringComparison.OrdinalIgnoreCase)) + { + ModelHash = JenkHash.GenHashLower(name.Slice(0, name.Length - 3)); + } + if (ModelHash != 0) + { + ModelArchetype = TryGetArchetype(ModelHash); + } } - if (ModelHash != 0) - { - ModelArchetype = TryGetArchetype(ModelHash); - } - var dr = yft.Fragment?.Drawable; if (dr != null) @@ -1034,14 +1050,16 @@ namespace CodeWalker.Forms { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateStatus(text); })); + BeginInvoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void LogError(string text) @@ -1050,14 +1068,16 @@ namespace CodeWalker.Forms { if (InvokeRequired) { - Invoke(new Action(() => { LogError(text); })); + Invoke(LogError, text); } else { ConsoleTextBox.AppendText(text + "\r\n"); } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } @@ -1237,8 +1257,7 @@ namespace CodeWalker.Forms AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false); //AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false); - var fdrawable = drawable as FragDrawable; - if (fdrawable != null) + if (drawable is FragDrawable fdrawable) { var plod1 = fdrawable.OwnerFragment?.PhysicsLODGroup?.PhysicsLOD1; if ((plod1 != null) && (plod1.Children?.data_items != null)) @@ -1367,6 +1386,7 @@ namespace CodeWalker.Forms dnode.Checked = check; VerticesCount = 0; + PolyCount = 0; AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true, dnode); AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false, dnode); AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false, dnode); @@ -1376,7 +1396,8 @@ namespace CodeWalker.Forms } private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null) { - if (models == null) return; + if (models is null) + return; for (int mi = 0; mi < models.Length; mi++) { @@ -1396,12 +1417,14 @@ namespace CodeWalker.Forms Renderer.SelectionModelDrawFlags[model] = false; } - if (model.Geometries == null) continue; + if (model.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { var gname = geom.ToString(); VerticesCount += geom.VerticesCount; + PolyCount += geom.IndicesCount / 3; var gnode = mnode.Nodes.Add(gname); gnode.Tag = geom; gnode.Checked = true;// check; @@ -1418,12 +1441,10 @@ namespace CodeWalker.Forms { var hash = pl.Hashes[ip]; var parm = pl.Parameters[ip]; - var tex = parm.Data as TextureBase; - if (tex != null) + if (parm.Data is TextureBase tex) { - var t = tex as Texture; var tstr = tex.Name.Trim(); - if (t != null) + if (tex is Texture t) { tstr = string.Format("{0} ({1}x{2}, embedded)", tex.Name, t.Width, t.Height); } @@ -1442,49 +1463,36 @@ namespace CodeWalker.Forms } private void UpdateSelectionDrawFlags(TreeNode node) { - //update the selection draw flags depending on tag and checked/unchecked - var drwbl = node.Tag as DrawableBase; - var model = node.Tag as DrawableModel; - var geom = node.Tag as DrawableGeometry; bool rem = node.Checked; - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { - if (drwbl != null) + if (node.Tag is DrawableBase drwbl) { if (rem) { - if (DrawableDrawFlags.ContainsKey(drwbl)) - { - DrawableDrawFlags.Remove(drwbl); - } + DrawableDrawFlags.Remove(drwbl); } else { DrawableDrawFlags[drwbl] = false; } } - if (model != null) + if (node.Tag is DrawableModel model) { if (rem) { - if (Renderer.SelectionModelDrawFlags.ContainsKey(model)) - { - Renderer.SelectionModelDrawFlags.Remove(model); - } + Renderer.SelectionModelDrawFlags.Remove(model); } else { Renderer.SelectionModelDrawFlags[model] = false; } } - if (geom != null) + if (node.Tag is DrawableGeometry geom) { if (rem) { - if (Renderer.SelectionGeometryDrawFlags.ContainsKey(geom)) - { - Renderer.SelectionGeometryDrawFlags.Remove(geom); - } + Renderer.SelectionGeometryDrawFlags.Remove(geom); } else { @@ -1530,7 +1538,8 @@ namespace CodeWalker.Forms foreach (var model in dwbl.AllModels) { - if (model?.Geometries == null) continue; + if (model?.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { geom.UpdateRenderableParameters = true; @@ -1772,19 +1781,23 @@ namespace CodeWalker.Forms - private void Save(bool saveAs = false) + private async ValueTask SaveAsync(bool saveAs = false) { var editMode = ExploreForm.Instance?.EditMode ?? false; if (string.IsNullOrEmpty(FilePath)) { - if (!editMode) saveAs = true; - if (rpfFileEntry == null) saveAs = true; + if (!editMode) + saveAs = true; + if (this.rpfFileEntry == null) + saveAs = true; } else { - if (FilePath.StartsWith(GTAFolder.CurrentGTAFolder, StringComparison.OrdinalIgnoreCase)) saveAs = true; - if (!File.Exists(FilePath)) saveAs = true; + if (FilePath.StartsWith(GTAFolder.CurrentGTAFolder, StringComparison.OrdinalIgnoreCase)) + saveAs = true; + if (!File.Exists(FilePath)) + saveAs = true; } var fn = FilePath; @@ -1793,7 +1806,8 @@ namespace CodeWalker.Forms if (!string.IsNullOrEmpty(fn)) { var dir = new FileInfo(fn).DirectoryName; - if (!Directory.Exists(dir)) dir = ""; + if (!Directory.Exists(dir)) + dir = ""; SaveFileDialog.InitialDirectory = dir; } SaveFileDialog.FileName = FileName; @@ -1803,53 +1817,90 @@ namespace CodeWalker.Forms { fileExt = fileExt.Substring(1); } - SaveFileDialog.Filter = fileExt.ToUpperInvariant() + " files|*." + fileExt + "|All files|*.*"; + SaveFileDialog.Filter = $"{fileExt.ToUpperInvariant()} files|*.{fileExt}|Export XML|*.{fileExt}.xml|All files|*.*"; - if (SaveFileDialog.ShowDialog() != DialogResult.OK) return; + if (SaveFileDialog.ShowDialog() != DialogResult.OK) + return; fn = SaveFileDialog.FileName; FilePath = fn; } - byte[] fileBytes = null; + byte[]? fileBytes = null; + RpfFileEntry? rpfFileEntry = null; + + var exportXml = fn.EndsWith(".xml"); + string xml = string.Empty; -#if !DEBUG try { -#endif - if (Ydr != null) - { - fileBytes = Ydr.Save(); - } - else if (Ydd != null) - { - fileBytes = Ydd.Save(); - } - else if (Yft != null) - { - fileBytes = Yft.Save(); - } - else if (Ybn != null) - { - fileBytes = Ybn.Save(); - } - else if (Ypt != null) - { - fileBytes = Ypt.Save(); - } - else if (Ynv != null) - { - fileBytes = Ynv.Save(); - } -#if !DEBUG + if (Ydr != null) + { + fileBytes = Ydr.Save(); + rpfFileEntry = Ydr.RpfFileEntry; + if (exportXml) + { + xml = MetaXml.GetXml(Ydr, out _, Path.Join(Path.GetDirectoryName(fn), Ydr.RpfFileEntry.ShortName)); + } + } + else if (Ydd != null) + { + fileBytes = Ydd.Save(); + rpfFileEntry = Ydd.RpfFileEntry; + if (exportXml) + { + xml = MetaXml.GetXml(Ydd, out _, Path.Join(Path.GetDirectoryName(fn), Ydd.RpfFileEntry.ShortName)); + } + } + else if (Yft != null) + { + fileBytes = Yft.Save(); + rpfFileEntry = Yft.RpfFileEntry; + if (exportXml) + { + xml = MetaXml.GetXml(Yft, out _, Path.Join(Path.GetDirectoryName(fn), Yft.RpfFileEntry.ShortName)); + } + } + else if (Ybn != null) + { + fileBytes = Ybn.Save(); + rpfFileEntry = Ybn.RpfFileEntry; + if (exportXml) + { + xml = MetaXml.GetXml(Ybn, out _); + } + } + else if (Ypt != null) + { + fileBytes = Ypt.Save(); + rpfFileEntry = Ypt.RpfFileEntry; + if (exportXml) + { + xml = MetaXml.GetXml(Ypt, out _, Path.Join(Path.GetDirectoryName(fn), Ypt.RpfFileEntry.ShortName)); + } + } + else if (Ynv != null) + { + fileBytes = Ynv.Save(); + rpfFileEntry = Ypt.RpfFileEntry; + if (exportXml) + { + xml = MetaXml.GetXml(Ynv, out _); + } + } + + if (exportXml) + { + fileBytes = Encoding.UTF8.GetBytes(xml); + } } catch(Exception ex) { + Console.WriteLine(ex); MessageBox.Show("Error saving file!\n" + ex.ToString()); return; } -#endif if (fileBytes == null) { MessageBox.Show("Error saving file!\n fileBytes was null!"); @@ -1857,11 +1908,11 @@ namespace CodeWalker.Forms } - var rpfSave = editMode && (rpfFileEntry?.Parent != null) && !saveAs; + var rpfSave = editMode && (this.rpfFileEntry?.Parent != null) && !saveAs; - if (rpfSave) + if (rpfSave && !exportXml) { - if (!rpfFileEntry.Path.StartsWith("mods", StringComparison.OrdinalIgnoreCase)) + if (!this.rpfFileEntry.Path.StartsWith("mods", StringComparison.OrdinalIgnoreCase)) { if (MessageBox.Show("This file is NOT located in the mods folder - Are you SURE you want to save this file?\r\nWARNING: This could cause permanent damage to your game!!!", "WARNING: Are you sure about this?", MessageBoxButtons.YesNo) != DialogResult.Yes) { @@ -1871,22 +1922,22 @@ namespace CodeWalker.Forms try { - if (!(ExploreForm.EnsureRpfValidEncryption(rpfFileEntry.File))) return; + if (!ExploreForm.EnsureRpfValidEncryption(this.rpfFileEntry.File)) + return; - var newentry = RpfFile.CreateFile(rpfFileEntry.Parent, rpfFileEntry.Name, fileBytes); - if (newentry != rpfFileEntry) - { } - rpfFileEntry = newentry; + var newentry = RpfFile.CreateFile(this.rpfFileEntry.Parent, this.rpfFileEntry.Name, fileBytes); + this.rpfFileEntry = newentry; ExploreForm.RefreshMainListViewInvoke(); //update the file details in explorer... - StatusLabel.Text = rpfFileEntry.Name + " saved successfully at " + DateTime.Now.ToString(); + StatusLabel.Text = $"{this.rpfFileEntry.Name} saved successfully at {DateTime.Now}"; //victory! } catch (Exception ex) { MessageBox.Show("Error saving file to RPF! The RPF archive may be corrupted...\r\n" + ex.ToString(), "Really Bad Error"); + Console.WriteLine(ex); } } @@ -1894,22 +1945,38 @@ namespace CodeWalker.Forms { if (string.IsNullOrEmpty(fn)) { - fn = rpfFileEntry?.Path; + fn = this.rpfFileEntry?.Path; + } + if (string.IsNullOrEmpty(fn)) + { + MessageBox.Show("File name is empty!", "Filename missing"); + return; } try { - File.WriteAllBytes(fn, fileBytes); + if (!string.IsNullOrWhiteSpace(xml)) + { + await File.WriteAllTextAsync(fn, xml); + } + else + { + await File.WriteAllBytesAsync(fn, fileBytes); + } fileName = Path.GetFileName(fn); ExploreForm.RefreshMainListViewInvoke(); //update the file details in explorer... - StatusLabel.Text = fileName + " saved successfully at " + DateTime.Now.ToString(); + this.InvokeIfRequired(() => + { + StatusLabel.Text = $"{fileName} saved successfully at {DateTime.Now}"; + }); } catch (Exception ex) { MessageBox.Show("Error writing file to disk!\n" + ex.ToString()); + Console.WriteLine(ex); return; } } @@ -1924,22 +1991,26 @@ namespace CodeWalker.Forms - private void SaveAllTextures(bool includeEmbedded) + private async ValueTask SaveAllTexturesAsync(bool includeEmbedded) { - if (gameFileCache == null) + if (gameFileCache is null) { MessageBox.Show("This operation requires GameFileCache to continue. This shouldn't happen!"); return; } - if (FolderBrowserDialog.ShowDialogNew() != DialogResult.OK) return; + if (FolderBrowserDialog.ShowDialogNew() != DialogResult.OK) + return; + string folderpath = FolderBrowserDialog.SelectedPath; - if (!folderpath.EndsWith("\\")) folderpath += "\\"; + if (!folderpath.EndsWith('\\')) + folderpath += '\\'; - - var tryGetTextureFromYtd = new Func((texHash, ytd) => + var tryGetTextureFromYtd = new Func((texHash, ytd) => { - if (ytd == null) return null; + if (ytd is null) + return null; + int tries = 0; while (!ytd.Loaded && (tries < 500)) //wait upto ~5 sec { @@ -1952,7 +2023,7 @@ namespace CodeWalker.Forms } return null; }); - var tryGetTexture = new Func((texHash, txdHash) => + var tryGetTexture = new Func((texHash, txdHash) => { if (txdHash != 0) { @@ -1976,7 +2047,7 @@ namespace CodeWalker.Forms textures.Add(tex); } } - if ((d?.Owner is YptFile ypt) && (ypt.PtfxList?.TextureDictionary?.Textures?.data_items != null)) + if (d?.Owner is YptFile ypt && ypt.PtfxList?.TextureDictionary?.Textures?.data_items != null) { foreach (var tex in ypt.PtfxList.TextureDictionary.Textures.data_items) { @@ -1989,7 +2060,7 @@ namespace CodeWalker.Forms if (d?.ShaderGroup?.Shaders?.data_items == null) return; var archhash = 0u; - if (d is Drawable dwbl) + if (d is Drawable dwbl && !string.IsNullOrEmpty(dwbl.Name)) { var dname = dwbl.Name.ToLowerInvariant(); dname = dname.Replace(".#dr", "").Replace(".#dd", ""); @@ -2013,13 +2084,13 @@ namespace CodeWalker.Forms foreach (var s in d.ShaderGroup.Shaders.data_items) { - if (s?.ParametersList?.Parameters == null) continue; + if (s?.ParametersList?.Parameters is null) + continue; foreach (var p in s.ParametersList.Parameters) { - var t = p.Data as TextureBase; - if (t == null) continue; - var tex = t as Texture; - if (tex != null) + if (p.Data is not TextureBase t) + continue; + if (t is Texture tex) { if (includeEmbedded) { @@ -2030,28 +2101,28 @@ namespace CodeWalker.Forms { var texhash = t.NameHash; tex = tryGetTexture(texhash, txdHash); - if (tex == null) + if (tex is null) { var ptxdhash = gameFileCache.TryGetParentYtdHash(txdHash); - while ((ptxdhash != 0) && (tex == null)) + while (ptxdhash != 0 && tex is null) { tex = tryGetTexture(texhash, ptxdhash); - if (tex == null) + if (tex is null) { ptxdhash = gameFileCache.TryGetParentYtdHash(ptxdhash); } } - if (tex == null) + if (tex is null) { var ytd = gameFileCache.TryGetTextureDictForTexture(texhash); tex = tryGetTextureFromYtd(texhash, ytd); } - if (tex == null) + if (tex is null) { texturesMissing.Add(t.Name); } } - if (tex != null) + if (tex is not null) { textures.Add(tex); } @@ -2060,30 +2131,30 @@ namespace CodeWalker.Forms } }); - if (Ydr != null) + if (Ydr is not null) { collectTextures(Ydr.Drawable); } - if (Ydd?.Drawables != null) + if (Ydd?.Drawables is not null) { foreach (var d in Ydd.Drawables) { collectTextures(d); } } - if (Yft?.Fragment != null) + if (Yft?.Fragment is not null) { var f = Yft.Fragment; collectTextures(f.Drawable); collectTextures(f.DrawableCloth); - if (f.DrawableArray?.data_items != null) + if (f.DrawableArray?.data_items is not null) { foreach (var d in f.DrawableArray.data_items) { collectTextures(d); } } - if (f.Cloths?.data_items != null) + if (f.Cloths?.data_items is not null) { foreach (var c in f.Cloths.data_items) { @@ -2091,7 +2162,7 @@ namespace CodeWalker.Forms } } var fc = f.PhysicsLODGroup?.PhysicsLOD1?.Children?.data_items; - if (fc != null) + if (fc is not null) { foreach (var fcc in fc) { @@ -2100,7 +2171,7 @@ namespace CodeWalker.Forms } } } - if (Ypt?.DrawableDict != null) + if (Ypt?.DrawableDict is not null) { foreach (var d in Ypt.DrawableDict.Values) { @@ -2114,29 +2185,30 @@ namespace CodeWalker.Forms { try { - string fpath = folderpath + tex.Name + ".dds"; + string fpath = $"{folderpath}{tex.Name}.dds"; byte[] dds = DDSIO.GetDDSFile(tex); - File.WriteAllBytes(fpath, dds); + await File.WriteAllBytesAsync(fpath, dds); successcount++; } catch(Exception ex) { errordds.Add(tex.Name ?? "???"); + Console.WriteLine(ex); } } var sb = new StringBuilder(); if (successcount > 0) { - sb.AppendLine(successcount.ToString() + " textures successfully exported."); + sb.AppendLine($"{successcount} textures successfully exported."); } if (texturesMissing.Count > 0) { - sb.AppendLine(texturesMissing.Count.ToString() + " textures weren't found!"); + sb.AppendLine($"{texturesMissing.Count} textures weren't found!"); } if (errordds.Count > 0) { - sb.AppendLine(errordds.Count.ToString() + " textures couldn't be converted to .dds!"); + sb.AppendLine($"{errordds.Count} textures couldn't be converted to .dds!"); } if (sb.Length > 0) { @@ -2437,7 +2509,7 @@ namespace CodeWalker.Forms private void StatsUpdateTimer_Tick(object sender, EventArgs e) { - StatsLabel.Text = Renderer.GetStatusText() + $" verts: {VerticesCount}"; + StatsLabel.Text = Renderer.GetStatusText() + $" verts: {VerticesCount}; tris: {PolyCount};"; if (Renderer.timerunning) { @@ -2509,17 +2581,22 @@ namespace CodeWalker.Forms private void HDRRenderingCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + if (Renderer.Shaders is null) + return; + using(Renderer.RenderSyncRoot.WaitDisposable()) { - Renderer.shaders.hdr = HDRRenderingCheckBox.Checked; + Renderer.Shaders.hdr = HDRRenderingCheckBox.Checked; } } private void ShadowsCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + if (Renderer.Shaders is null) + return; + + using(Renderer.RenderSyncRoot.WaitDisposable()) { - Renderer.shaders.shadows = ShadowsCheckBox.Checked; + Renderer.Shaders.shadows = ShadowsCheckBox.Checked; } } @@ -2539,7 +2616,7 @@ namespace CodeWalker.Forms int v = TimeOfDayTrackBar.Value; float fh = v / 60.0f; UpdateTimeOfDayLabel(); - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { Renderer.timeofday = fh; timecycle.SetTime(Renderer.timeofday); @@ -2554,12 +2631,16 @@ namespace CodeWalker.Forms private void WireframeCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.wireframe = WireframeCheckBox.Checked; + if (Renderer.Shaders is null) + return; + Renderer.Shaders.wireframe = WireframeCheckBox.Checked; } private void AnisotropicFilteringCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.AnisotropicFiltering = AnisotropicFilteringCheckBox.Checked; + if (Renderer.Shaders is null) + return; + Renderer.Shaders.AnisotropicFiltering = AnisotropicFilteringCheckBox.Checked; } private void HDTexturesCheckBox_CheckedChanged(object sender, EventArgs e) @@ -2575,42 +2656,42 @@ namespace CodeWalker.Forms { default: case "Default": - Renderer.shaders.RenderMode = WorldRenderMode.Default; + Renderer.Shaders.RenderMode = WorldRenderMode.Default; break; case "Single texture": - Renderer.shaders.RenderMode = WorldRenderMode.SingleTexture; + Renderer.Shaders.RenderMode = WorldRenderMode.SingleTexture; TextureSamplerComboBox.Enabled = true; TextureCoordsComboBox.Enabled = true; break; case "Vertex normals": - Renderer.shaders.RenderMode = WorldRenderMode.VertexNormals; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexNormals; break; case "Vertex tangents": - Renderer.shaders.RenderMode = WorldRenderMode.VertexTangents; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexTangents; break; case "Vertex colour 1": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 1; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 1; break; case "Vertex colour 2": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 2; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 2; break; case "Vertex colour 3": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 3; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 3; break; case "Texture coord 1": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 1; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 1; break; case "Texture coord 2": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 2; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 2; break; case "Texture coord 3": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 3; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 3; break; } } @@ -2619,7 +2700,7 @@ namespace CodeWalker.Forms { if (TextureSamplerComboBox.SelectedItem is ShaderParamNames) { - Renderer.shaders.RenderTextureSampler = (ShaderParamNames)TextureSamplerComboBox.SelectedItem; + Renderer.Shaders.RenderTextureSampler = (ShaderParamNames)TextureSamplerComboBox.SelectedItem; } } @@ -2629,13 +2710,13 @@ namespace CodeWalker.Forms { default: case "Texture coord 1": - Renderer.shaders.RenderTextureSamplerCoord = 1; + Renderer.Shaders.RenderTextureSamplerCoord = 1; break; case "Texture coord 2": - Renderer.shaders.RenderTextureSamplerCoord = 2; + Renderer.Shaders.RenderTextureSamplerCoord = 2; break; case "Texture coord 3": - Renderer.shaders.RenderTextureSamplerCoord = 3; + Renderer.Shaders.RenderTextureSamplerCoord = 3; break; } } @@ -2687,39 +2768,39 @@ namespace CodeWalker.Forms StatusStrip.Visible = StatusBarCheckBox.Checked; } - private void SaveAllTexturesButton_Click(object sender, EventArgs e) + private async void SaveAllTexturesButton_Click(object sender, EventArgs e) { - SaveAllTextures(true); + await SaveAllTexturesAsync(true); } - private void SaveSharedTexturesButton_Click(object sender, EventArgs e) + private async void SaveSharedTexturesButton_Click(object sender, EventArgs e) { - SaveAllTextures(false); + await SaveAllTexturesAsync(false); } - private void SaveButton_ButtonClick(object sender, EventArgs e) + private async void SaveButton_ButtonClick(object sender, EventArgs e) { - Save(); + await SaveAsync(); } - private void SaveMenuButton_Click(object sender, EventArgs e) + private async void SaveMenuButton_Click(object sender, EventArgs e) { - Save(); + await SaveAsync(); } - private void SaveAsMenuButton_Click(object sender, EventArgs e) + private async void SaveAsMenuButton_Click(object sender, EventArgs e) { - Save(true); + await SaveAsync(true); } - private void SaveAllTexturesMenuButton_Click(object sender, EventArgs e) + private async void SaveAllTexturesMenuButton_Click(object sender, EventArgs e) { - SaveAllTextures(true); + await SaveAllTexturesAsync(true); } - private void SaveSharedTexturesMenuButton_Click(object sender, EventArgs e) + private async void SaveSharedTexturesMenuButton_Click(object sender, EventArgs e) { - SaveAllTextures(false); + await SaveAllTexturesAsync(false); } private void ClipDictComboBox_TextChanged(object sender, EventArgs e) @@ -2739,7 +2820,7 @@ namespace CodeWalker.Forms private void DeferredShadingCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.deferred = DeferredShadingCheckBox.Checked; + Renderer.Shaders.deferred = DeferredShadingCheckBox.Checked; } private void HDLightsCheckBox_CheckedChanged(object sender, EventArgs e) diff --git a/CodeWalker/Forms/ModelLightForm.cs b/CodeWalker/Forms/ModelLightForm.cs index 58b25e5..0822a81 100644 --- a/CodeWalker/Forms/ModelLightForm.cs +++ b/CodeWalker/Forms/ModelLightForm.cs @@ -37,10 +37,7 @@ namespace CodeWalker.Forms LightsTreeView.Nodes.Clear(); LightsTreeView.ShowRootLines = false; - var dr = drawable as Drawable; - var fr = drawable as FragDrawable; - - if (dr != null) + if (drawable is Drawable dr) { Drawable = dr; var lights = dr.LightAttributes; @@ -49,7 +46,7 @@ namespace CodeWalker.Forms AddLightsTreeNodes(lights.data_items); } } - else if (fr != null) + else if (drawable is FragDrawable fr) { FragDrawable = fr; var lights = fr.OwnerFragment?.LightAttributes; @@ -353,8 +350,7 @@ namespace CodeWalker.Forms var n = LightsTreeView.SelectedNode; if (n != null) { - var dr = n.Tag as Drawable; - if (dr == null) { dr = n.Parent.Tag as Drawable; } //try parent node tag also + if (n.Tag is not Drawable dr) { dr = n.Parent.Tag as Drawable; } //try parent node tag also if (dr!= null) { if (dr.LightAttributes == null) dr.LightAttributes = new ResourceSimpleList64(); @@ -389,8 +385,7 @@ namespace CodeWalker.Forms } else { - var dr = LightsTreeView.SelectedNode.Parent.Tag as Drawable; - if (dr != null) + if (LightsTreeView.SelectedNode.Parent.Tag is Drawable dr) { List lights = dr.LightAttributes.data_items.ToList(); lights.Remove(selectedLight); @@ -429,8 +424,7 @@ namespace CodeWalker.Forms var n = LightsTreeView.SelectedNode; if (n != null) { - var dr = n.Tag as Drawable; - if (dr == null) { dr = n.Parent.Tag as Drawable; } //try parent node tag also + if (n.Tag is not Drawable dr) { dr = n.Parent.Tag as Drawable; } //try parent node tag also if (dr != null) { if (dr.LightAttributes == null) dr.LightAttributes = new ResourceSimpleList64(); diff --git a/CodeWalker/Forms/ModelMatForm.cs b/CodeWalker/Forms/ModelMatForm.cs index 0bbeac4..58122dc 100644 --- a/CodeWalker/Forms/ModelMatForm.cs +++ b/CodeWalker/Forms/ModelMatForm.cs @@ -41,8 +41,7 @@ namespace CodeWalker.Forms AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail"); AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail"); - var fdrawable = drawable as FragDrawable; - if (fdrawable != null) + if (drawable is FragDrawable fdrawable) { var plod1 = fdrawable.OwnerFragment?.PhysicsLODGroup?.PhysicsLOD1; if ((plod1 != null) && (plod1.Children?.data_items != null)) @@ -114,7 +113,8 @@ namespace CodeWalker.Forms private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, TreeNode parentDrawableNode = null) { - if (models == null) return; + if (models is null) + return; for (int mi = 0; mi < models.Length; mi++) { @@ -125,7 +125,8 @@ namespace CodeWalker.Forms var mnode = tnc.Add(mprefix + " " + model.ToString()); mnode.Tag = model; - if (model.Geometries == null) continue; + if (model.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { @@ -213,17 +214,19 @@ namespace CodeWalker.Forms private void ParamTextBox_TextChanged(object sender, EventArgs e) { - var tb = sender as TextBox; - var parm = tb?.Tag as ShaderParameter; - var txt = tb?.Text; + if (sender is not TextBox tb) + { + throw new InvalidOperationException($"TextBox is not a textbox on {nameof(ParamTextBox_TextChanged)}"); + } + var txt = tb.Text; - if (parm == null) return; + if (tb.Tag is not ShaderParameter parm) + return; if (parm.DataType == 0)//texture { var tex = parm.Data as TextureBase; - var ttex = tex as Texture; - if (ttex == null)//don't do this for embedded textures! + if (tex is not null && tex is not Texture ttex)//don't do this for embedded textures! { tex.Name = txt; tex.NameHash = JenkHash.GenHashLower(txt); @@ -254,8 +257,7 @@ namespace CodeWalker.Forms } - var geom = ModelsTreeView.SelectedNode?.Tag as DrawableGeometry; - if (geom != null) + if (ModelsTreeView.SelectedNode?.Tag is DrawableGeometry geom) { if (Drawable != null) { diff --git a/CodeWalker/Forms/RelForm.Designer.cs b/CodeWalker/Forms/RelForm.Designer.cs index 8307057..692a471 100644 --- a/CodeWalker/Forms/RelForm.Designer.cs +++ b/CodeWalker/Forms/RelForm.Designer.cs @@ -28,638 +28,592 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); + components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RelForm)); - System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); - System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); - System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); - this.RelPropertyGrid = new CodeWalker.WinForms.PropertyGridFix(); - this.MainTabControl = new System.Windows.Forms.TabControl(); - this.XmlTabPage = new System.Windows.Forms.TabPage(); - this.XmlTextBox = new FastColoredTextBoxNS.FastColoredTextBox(); - this.DetailsTabPage = new System.Windows.Forms.TabPage(); - this.NameTableTabPage = new System.Windows.Forms.TabPage(); - this.MainTextBox = new CodeWalker.WinForms.TextBoxFix(); - this.SearchTabPage = new System.Windows.Forms.TabPage(); - this.SearchTextRadio = new System.Windows.Forms.RadioButton(); - this.SearchHashRadio = new System.Windows.Forms.RadioButton(); - this.label12 = new System.Windows.Forms.Label(); - this.SearchTextBox = new System.Windows.Forms.TextBox(); - this.SearchButton = new System.Windows.Forms.Button(); - this.SearchResultsGrid = new CodeWalker.WinForms.PropertyGridFix(); - this.SynthsTabPage = new System.Windows.Forms.TabPage(); - this.SynthStopButton = new System.Windows.Forms.Button(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.SynthVariablesTextBox = new System.Windows.Forms.TextBox(); - this.SynthOutputsTextBox = new System.Windows.Forms.TextBox(); - this.SynthBufferChart = new System.Windows.Forms.DataVisualization.Charting.Chart(); - this.SynthPlayButton = new System.Windows.Forms.Button(); - this.SynthCopyXMLButton = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); - this.SynthsComboBox = new System.Windows.Forms.ComboBox(); - this.SynthTextBox = new FastColoredTextBoxNS.FastColoredTextBox(); - this.MainToolbar = new System.Windows.Forms.ToolStrip(); - this.NewButton = new System.Windows.Forms.ToolStripSplitButton(); - this.OpenButton = new System.Windows.Forms.ToolStripSplitButton(); - this.SaveButton = new System.Windows.Forms.ToolStripSplitButton(); - this.MainStatusStrip = new System.Windows.Forms.StatusStrip(); - this.StatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.MainMenu = new System.Windows.Forms.MenuStrip(); - this.FileMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.FileNewMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.FileOpenMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.FileSaveMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.FileSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.FileCloseMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.EditMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.wIPToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ViewMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.wIPToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.OpenFileDialog = new System.Windows.Forms.OpenFileDialog(); - this.SaveFileDialog = new System.Windows.Forms.SaveFileDialog(); - this.MainTabControl.SuspendLayout(); - this.XmlTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.XmlTextBox)).BeginInit(); - this.DetailsTabPage.SuspendLayout(); - this.NameTableTabPage.SuspendLayout(); - this.SearchTabPage.SuspendLayout(); - this.SynthsTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.SynthBufferChart)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.SynthTextBox)).BeginInit(); - this.MainToolbar.SuspendLayout(); - this.MainStatusStrip.SuspendLayout(); - this.MainMenu.SuspendLayout(); - this.SuspendLayout(); + RelPropertyGrid = new WinForms.PropertyGridFix(); + MainTabControl = new System.Windows.Forms.TabControl(); + XmlTabPage = new System.Windows.Forms.TabPage(); + XmlTextBox = new FastColoredTextBoxNS.FastColoredTextBox(); + DetailsTabPage = new System.Windows.Forms.TabPage(); + NameTableTabPage = new System.Windows.Forms.TabPage(); + MainTextBox = new WinForms.TextBoxFix(); + SearchTabPage = new System.Windows.Forms.TabPage(); + SearchTextRadio = new System.Windows.Forms.RadioButton(); + SearchHashRadio = new System.Windows.Forms.RadioButton(); + label12 = new System.Windows.Forms.Label(); + SearchTextBox = new System.Windows.Forms.TextBox(); + SearchButton = new System.Windows.Forms.Button(); + SearchResultsGrid = new WinForms.PropertyGridFix(); + SynthsTabPage = new System.Windows.Forms.TabPage(); + SynthStopButton = new System.Windows.Forms.Button(); + label3 = new System.Windows.Forms.Label(); + label2 = new System.Windows.Forms.Label(); + SynthVariablesTextBox = new System.Windows.Forms.TextBox(); + SynthOutputsTextBox = new System.Windows.Forms.TextBox(); + SynthPlayButton = new System.Windows.Forms.Button(); + SynthCopyXMLButton = new System.Windows.Forms.Button(); + label1 = new System.Windows.Forms.Label(); + SynthsComboBox = new System.Windows.Forms.ComboBox(); + SynthTextBox = new FastColoredTextBoxNS.FastColoredTextBox(); + MainToolbar = new System.Windows.Forms.ToolStrip(); + NewButton = new System.Windows.Forms.ToolStripSplitButton(); + OpenButton = new System.Windows.Forms.ToolStripSplitButton(); + SaveButton = new System.Windows.Forms.ToolStripSplitButton(); + MainStatusStrip = new System.Windows.Forms.StatusStrip(); + StatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + MainMenu = new System.Windows.Forms.MenuStrip(); + FileMenu = new System.Windows.Forms.ToolStripMenuItem(); + FileNewMenu = new System.Windows.Forms.ToolStripMenuItem(); + FileOpenMenu = new System.Windows.Forms.ToolStripMenuItem(); + FileSaveMenu = new System.Windows.Forms.ToolStripMenuItem(); + FileSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem(); + toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + FileCloseMenu = new System.Windows.Forms.ToolStripMenuItem(); + EditMenu = new System.Windows.Forms.ToolStripMenuItem(); + wIPToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + ViewMenu = new System.Windows.Forms.ToolStripMenuItem(); + wIPToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + OpenFileDialog = new System.Windows.Forms.OpenFileDialog(); + SaveFileDialog = new System.Windows.Forms.SaveFileDialog(); + MainTabControl.SuspendLayout(); + XmlTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)XmlTextBox).BeginInit(); + DetailsTabPage.SuspendLayout(); + NameTableTabPage.SuspendLayout(); + SearchTabPage.SuspendLayout(); + SynthsTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)SynthTextBox).BeginInit(); + MainToolbar.SuspendLayout(); + MainStatusStrip.SuspendLayout(); + MainMenu.SuspendLayout(); + SuspendLayout(); // // RelPropertyGrid // - this.RelPropertyGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.RelPropertyGrid.HelpVisible = false; - this.RelPropertyGrid.Location = new System.Drawing.Point(6, 6); - this.RelPropertyGrid.Name = "RelPropertyGrid"; - this.RelPropertyGrid.Size = new System.Drawing.Size(819, 448); - this.RelPropertyGrid.TabIndex = 0; + RelPropertyGrid.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + RelPropertyGrid.HelpVisible = false; + RelPropertyGrid.Location = new System.Drawing.Point(7, 7); + RelPropertyGrid.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + RelPropertyGrid.Name = "RelPropertyGrid"; + RelPropertyGrid.Size = new System.Drawing.Size(955, 517); + RelPropertyGrid.TabIndex = 0; // // MainTabControl // - this.MainTabControl.Controls.Add(this.XmlTabPage); - this.MainTabControl.Controls.Add(this.DetailsTabPage); - this.MainTabControl.Controls.Add(this.NameTableTabPage); - this.MainTabControl.Controls.Add(this.SearchTabPage); - this.MainTabControl.Controls.Add(this.SynthsTabPage); - this.MainTabControl.Dock = System.Windows.Forms.DockStyle.Fill; - this.MainTabControl.Location = new System.Drawing.Point(0, 49); - this.MainTabControl.Margin = new System.Windows.Forms.Padding(0); - this.MainTabControl.Name = "MainTabControl"; - this.MainTabControl.SelectedIndex = 0; - this.MainTabControl.Size = new System.Drawing.Size(839, 486); - this.MainTabControl.TabIndex = 1; + MainTabControl.Controls.Add(XmlTabPage); + MainTabControl.Controls.Add(DetailsTabPage); + MainTabControl.Controls.Add(NameTableTabPage); + MainTabControl.Controls.Add(SearchTabPage); + MainTabControl.Controls.Add(SynthsTabPage); + MainTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + MainTabControl.Location = new System.Drawing.Point(0, 49); + MainTabControl.Margin = new System.Windows.Forms.Padding(0); + MainTabControl.Name = "MainTabControl"; + MainTabControl.SelectedIndex = 0; + MainTabControl.Size = new System.Drawing.Size(979, 572); + MainTabControl.TabIndex = 1; // // XmlTabPage // - this.XmlTabPage.Controls.Add(this.XmlTextBox); - this.XmlTabPage.Location = new System.Drawing.Point(4, 22); - this.XmlTabPage.Name = "XmlTabPage"; - this.XmlTabPage.Padding = new System.Windows.Forms.Padding(3); - this.XmlTabPage.Size = new System.Drawing.Size(831, 460); - this.XmlTabPage.TabIndex = 3; - this.XmlTabPage.Text = "XML"; - this.XmlTabPage.UseVisualStyleBackColor = true; + XmlTabPage.Controls.Add(XmlTextBox); + XmlTabPage.Location = new System.Drawing.Point(4, 24); + XmlTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + XmlTabPage.Name = "XmlTabPage"; + XmlTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + XmlTabPage.Size = new System.Drawing.Size(971, 544); + XmlTabPage.TabIndex = 3; + XmlTabPage.Text = "XML"; + XmlTabPage.UseVisualStyleBackColor = true; // // XmlTextBox // - this.XmlTextBox.AutoCompleteBracketsList = new char[] { - '(', - ')', - '{', - '}', - '[', - ']', - '\"', - '\"', - '\'', - '\''}; - this.XmlTextBox.AutoIndentChars = false; - this.XmlTextBox.AutoIndentCharsPatterns = ""; - this.XmlTextBox.AutoIndentExistingLines = false; - this.XmlTextBox.AutoScrollMinSize = new System.Drawing.Size(27, 14); - this.XmlTextBox.BackBrush = null; - this.XmlTextBox.CharHeight = 14; - this.XmlTextBox.CharWidth = 8; - this.XmlTextBox.CommentPrefix = null; - this.XmlTextBox.Cursor = System.Windows.Forms.Cursors.IBeam; - this.XmlTextBox.DelayedEventsInterval = 1; - this.XmlTextBox.DisabledColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); - this.XmlTextBox.Dock = System.Windows.Forms.DockStyle.Fill; - this.XmlTextBox.Font = new System.Drawing.Font("Courier New", 9.75F); - this.XmlTextBox.IsReplaceMode = false; - this.XmlTextBox.Language = FastColoredTextBoxNS.Language.XML; - this.XmlTextBox.LeftBracket = '<'; - this.XmlTextBox.LeftBracket2 = '('; - this.XmlTextBox.Location = new System.Drawing.Point(3, 3); - this.XmlTextBox.Name = "XmlTextBox"; - this.XmlTextBox.Paddings = new System.Windows.Forms.Padding(0); - this.XmlTextBox.RightBracket = '>'; - this.XmlTextBox.RightBracket2 = ')'; - this.XmlTextBox.SelectionColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))); - this.XmlTextBox.ServiceColors = ((FastColoredTextBoxNS.ServiceColors)(resources.GetObject("XmlTextBox.ServiceColors"))); - this.XmlTextBox.Size = new System.Drawing.Size(825, 454); - this.XmlTextBox.TabIndex = 2; - this.XmlTextBox.Zoom = 100; - this.XmlTextBox.TextChanged += new System.EventHandler(this.XmlTextBox_TextChanged); - this.XmlTextBox.VisibleRangeChangedDelayed += new System.EventHandler(this.XmlTextBox_VisibleRangeChangedDelayed); + XmlTextBox.AutoCompleteBracketsList = new char[] { '(', ')', '{', '}', '[', ']', '"', '"', '\'', '\'' }; + XmlTextBox.AutoIndentChars = false; + XmlTextBox.AutoIndentCharsPatterns = ""; + XmlTextBox.AutoIndentExistingLines = false; + XmlTextBox.AutoScrollMinSize = new System.Drawing.Size(27, 14); + XmlTextBox.BackBrush = null; + XmlTextBox.CharHeight = 14; + XmlTextBox.CharWidth = 8; + XmlTextBox.CommentPrefix = null; + XmlTextBox.Cursor = System.Windows.Forms.Cursors.IBeam; + XmlTextBox.DelayedEventsInterval = 1; + XmlTextBox.DisabledColor = System.Drawing.Color.FromArgb(100, 180, 180, 180); + XmlTextBox.Dock = System.Windows.Forms.DockStyle.Fill; + XmlTextBox.IsReplaceMode = false; + XmlTextBox.Language = FastColoredTextBoxNS.Language.XML; + XmlTextBox.LeftBracket = '<'; + XmlTextBox.LeftBracket2 = '('; + XmlTextBox.Location = new System.Drawing.Point(4, 3); + XmlTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + XmlTextBox.Name = "XmlTextBox"; + XmlTextBox.Paddings = new System.Windows.Forms.Padding(0); + XmlTextBox.RightBracket = '>'; + XmlTextBox.RightBracket2 = ')'; + XmlTextBox.SelectionColor = System.Drawing.Color.FromArgb(60, 0, 0, 255); + XmlTextBox.ServiceColors = (FastColoredTextBoxNS.ServiceColors)resources.GetObject("XmlTextBox.ServiceColors"); + XmlTextBox.Size = new System.Drawing.Size(963, 538); + XmlTextBox.TabIndex = 2; + XmlTextBox.Zoom = 100; + XmlTextBox.TextChanged += XmlTextBox_TextChanged; + XmlTextBox.VisibleRangeChangedDelayed += XmlTextBox_VisibleRangeChangedDelayed; // // DetailsTabPage // - this.DetailsTabPage.Controls.Add(this.RelPropertyGrid); - this.DetailsTabPage.Location = new System.Drawing.Point(4, 22); - this.DetailsTabPage.Name = "DetailsTabPage"; - this.DetailsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.DetailsTabPage.Size = new System.Drawing.Size(831, 460); - this.DetailsTabPage.TabIndex = 1; - this.DetailsTabPage.Text = "Details"; - this.DetailsTabPage.UseVisualStyleBackColor = true; + DetailsTabPage.Controls.Add(RelPropertyGrid); + DetailsTabPage.Location = new System.Drawing.Point(4, 24); + DetailsTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + DetailsTabPage.Name = "DetailsTabPage"; + DetailsTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + DetailsTabPage.Size = new System.Drawing.Size(971, 533); + DetailsTabPage.TabIndex = 1; + DetailsTabPage.Text = "Details"; + DetailsTabPage.UseVisualStyleBackColor = true; // // NameTableTabPage // - this.NameTableTabPage.Controls.Add(this.MainTextBox); - this.NameTableTabPage.Location = new System.Drawing.Point(4, 22); - this.NameTableTabPage.Name = "NameTableTabPage"; - this.NameTableTabPage.Padding = new System.Windows.Forms.Padding(3); - this.NameTableTabPage.Size = new System.Drawing.Size(831, 460); - this.NameTableTabPage.TabIndex = 0; - this.NameTableTabPage.Text = "Names"; - this.NameTableTabPage.UseVisualStyleBackColor = true; + NameTableTabPage.Controls.Add(MainTextBox); + NameTableTabPage.Location = new System.Drawing.Point(4, 24); + NameTableTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + NameTableTabPage.Name = "NameTableTabPage"; + NameTableTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + NameTableTabPage.Size = new System.Drawing.Size(971, 544); + NameTableTabPage.TabIndex = 0; + NameTableTabPage.Text = "Names"; + NameTableTabPage.UseVisualStyleBackColor = true; // // MainTextBox // - this.MainTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.MainTextBox.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.MainTextBox.HideSelection = false; - this.MainTextBox.Location = new System.Drawing.Point(6, 6); - this.MainTextBox.Multiline = true; - this.MainTextBox.Name = "MainTextBox"; - this.MainTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.MainTextBox.Size = new System.Drawing.Size(819, 448); - this.MainTextBox.TabIndex = 1; - this.MainTextBox.WordWrap = false; + MainTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + MainTextBox.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + MainTextBox.HideSelection = false; + MainTextBox.Location = new System.Drawing.Point(7, 7); + MainTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MainTextBox.Multiline = true; + MainTextBox.Name = "MainTextBox"; + MainTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + MainTextBox.Size = new System.Drawing.Size(955, 527); + MainTextBox.TabIndex = 1; + MainTextBox.WordWrap = false; // // SearchTabPage // - this.SearchTabPage.Controls.Add(this.SearchTextRadio); - this.SearchTabPage.Controls.Add(this.SearchHashRadio); - this.SearchTabPage.Controls.Add(this.label12); - this.SearchTabPage.Controls.Add(this.SearchTextBox); - this.SearchTabPage.Controls.Add(this.SearchButton); - this.SearchTabPage.Controls.Add(this.SearchResultsGrid); - this.SearchTabPage.Location = new System.Drawing.Point(4, 22); - this.SearchTabPage.Name = "SearchTabPage"; - this.SearchTabPage.Size = new System.Drawing.Size(831, 460); - this.SearchTabPage.TabIndex = 2; - this.SearchTabPage.Text = "Search"; - this.SearchTabPage.UseVisualStyleBackColor = true; + SearchTabPage.Controls.Add(SearchTextRadio); + SearchTabPage.Controls.Add(SearchHashRadio); + SearchTabPage.Controls.Add(label12); + SearchTabPage.Controls.Add(SearchTextBox); + SearchTabPage.Controls.Add(SearchButton); + SearchTabPage.Controls.Add(SearchResultsGrid); + SearchTabPage.Location = new System.Drawing.Point(4, 24); + SearchTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SearchTabPage.Name = "SearchTabPage"; + SearchTabPage.Size = new System.Drawing.Size(971, 533); + SearchTabPage.TabIndex = 2; + SearchTabPage.Text = "Search"; + SearchTabPage.UseVisualStyleBackColor = true; // // SearchTextRadio // - this.SearchTextRadio.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.SearchTextRadio.AutoSize = true; - this.SearchTextRadio.Location = new System.Drawing.Point(518, 4); - this.SearchTextRadio.Name = "SearchTextRadio"; - this.SearchTextRadio.Size = new System.Drawing.Size(46, 17); - this.SearchTextRadio.TabIndex = 36; - this.SearchTextRadio.Text = "Text"; - this.SearchTextRadio.UseVisualStyleBackColor = true; + SearchTextRadio.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + SearchTextRadio.AutoSize = true; + SearchTextRadio.Location = new System.Drawing.Point(612, 5); + SearchTextRadio.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SearchTextRadio.Name = "SearchTextRadio"; + SearchTextRadio.Size = new System.Drawing.Size(46, 19); + SearchTextRadio.TabIndex = 36; + SearchTextRadio.Text = "Text"; + SearchTextRadio.UseVisualStyleBackColor = true; // // SearchHashRadio // - this.SearchHashRadio.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.SearchHashRadio.AutoSize = true; - this.SearchHashRadio.Checked = true; - this.SearchHashRadio.Location = new System.Drawing.Point(462, 4); - this.SearchHashRadio.Name = "SearchHashRadio"; - this.SearchHashRadio.Size = new System.Drawing.Size(50, 17); - this.SearchHashRadio.TabIndex = 35; - this.SearchHashRadio.TabStop = true; - this.SearchHashRadio.Text = "Hash"; - this.SearchHashRadio.UseVisualStyleBackColor = true; + SearchHashRadio.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + SearchHashRadio.AutoSize = true; + SearchHashRadio.Checked = true; + SearchHashRadio.Location = new System.Drawing.Point(546, 5); + SearchHashRadio.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SearchHashRadio.Name = "SearchHashRadio"; + SearchHashRadio.Size = new System.Drawing.Size(52, 19); + SearchHashRadio.TabIndex = 35; + SearchHashRadio.TabStop = true; + SearchHashRadio.Text = "Hash"; + SearchHashRadio.UseVisualStyleBackColor = true; // // label12 // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(8, 6); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(30, 13); - this.label12.TabIndex = 32; - this.label12.Text = "Find:"; + label12.AutoSize = true; + label12.Location = new System.Drawing.Point(9, 7); + label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label12.Name = "label12"; + label12.Size = new System.Drawing.Size(33, 15); + label12.TabIndex = 32; + label12.Text = "Find:"; // // SearchTextBox // - this.SearchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SearchTextBox.Location = new System.Drawing.Point(44, 3); - this.SearchTextBox.Name = "SearchTextBox"; - this.SearchTextBox.Size = new System.Drawing.Size(412, 20); - this.SearchTextBox.TabIndex = 33; - this.SearchTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SearchTextBox_KeyDown); + SearchTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SearchTextBox.Location = new System.Drawing.Point(51, 3); + SearchTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SearchTextBox.Name = "SearchTextBox"; + SearchTextBox.Size = new System.Drawing.Size(480, 23); + SearchTextBox.TabIndex = 33; + SearchTextBox.KeyDown += SearchTextBox_KeyDown; // // SearchButton // - this.SearchButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.SearchButton.Location = new System.Drawing.Point(570, 2); - this.SearchButton.Name = "SearchButton"; - this.SearchButton.Size = new System.Drawing.Size(68, 23); - this.SearchButton.TabIndex = 34; - this.SearchButton.Text = "Search"; - this.SearchButton.UseVisualStyleBackColor = true; - this.SearchButton.Click += new System.EventHandler(this.SearchButton_Click); + SearchButton.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + SearchButton.Location = new System.Drawing.Point(665, 2); + SearchButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SearchButton.Name = "SearchButton"; + SearchButton.Size = new System.Drawing.Size(79, 27); + SearchButton.TabIndex = 34; + SearchButton.Text = "Search"; + SearchButton.UseVisualStyleBackColor = true; + SearchButton.Click += SearchButton_Click; // // SearchResultsGrid // - this.SearchResultsGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SearchResultsGrid.HelpVisible = false; - this.SearchResultsGrid.Location = new System.Drawing.Point(3, 31); - this.SearchResultsGrid.Name = "SearchResultsGrid"; - this.SearchResultsGrid.Size = new System.Drawing.Size(822, 423); - this.SearchResultsGrid.TabIndex = 1; + SearchResultsGrid.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SearchResultsGrid.HelpVisible = false; + SearchResultsGrid.Location = new System.Drawing.Point(4, 36); + SearchResultsGrid.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SearchResultsGrid.Name = "SearchResultsGrid"; + SearchResultsGrid.Size = new System.Drawing.Size(959, 488); + SearchResultsGrid.TabIndex = 1; // // SynthsTabPage // - this.SynthsTabPage.Controls.Add(this.SynthStopButton); - this.SynthsTabPage.Controls.Add(this.label3); - this.SynthsTabPage.Controls.Add(this.label2); - this.SynthsTabPage.Controls.Add(this.SynthVariablesTextBox); - this.SynthsTabPage.Controls.Add(this.SynthOutputsTextBox); - this.SynthsTabPage.Controls.Add(this.SynthBufferChart); - this.SynthsTabPage.Controls.Add(this.SynthPlayButton); - this.SynthsTabPage.Controls.Add(this.SynthCopyXMLButton); - this.SynthsTabPage.Controls.Add(this.label1); - this.SynthsTabPage.Controls.Add(this.SynthsComboBox); - this.SynthsTabPage.Controls.Add(this.SynthTextBox); - this.SynthsTabPage.Location = new System.Drawing.Point(4, 22); - this.SynthsTabPage.Name = "SynthsTabPage"; - this.SynthsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.SynthsTabPage.Size = new System.Drawing.Size(831, 460); - this.SynthsTabPage.TabIndex = 4; - this.SynthsTabPage.Text = "Synths"; - this.SynthsTabPage.UseVisualStyleBackColor = true; + SynthsTabPage.Controls.Add(SynthStopButton); + SynthsTabPage.Controls.Add(label3); + SynthsTabPage.Controls.Add(label2); + SynthsTabPage.Controls.Add(SynthVariablesTextBox); + SynthsTabPage.Controls.Add(SynthOutputsTextBox); + SynthsTabPage.Controls.Add(SynthPlayButton); + SynthsTabPage.Controls.Add(SynthCopyXMLButton); + SynthsTabPage.Controls.Add(label1); + SynthsTabPage.Controls.Add(SynthsComboBox); + SynthsTabPage.Controls.Add(SynthTextBox); + SynthsTabPage.Location = new System.Drawing.Point(4, 24); + SynthsTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthsTabPage.Name = "SynthsTabPage"; + SynthsTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthsTabPage.Size = new System.Drawing.Size(971, 533); + SynthsTabPage.TabIndex = 4; + SynthsTabPage.Text = "Synths"; + SynthsTabPage.UseVisualStyleBackColor = true; // // SynthStopButton // - this.SynthStopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.SynthStopButton.Enabled = false; - this.SynthStopButton.Location = new System.Drawing.Point(724, 2); - this.SynthStopButton.Name = "SynthStopButton"; - this.SynthStopButton.Size = new System.Drawing.Size(104, 23); - this.SynthStopButton.TabIndex = 43; - this.SynthStopButton.Text = "Stop"; - this.SynthStopButton.UseVisualStyleBackColor = true; - this.SynthStopButton.Click += new System.EventHandler(this.SynthStopButton_Click); + SynthStopButton.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + SynthStopButton.Enabled = false; + SynthStopButton.Location = new System.Drawing.Point(845, 2); + SynthStopButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthStopButton.Name = "SynthStopButton"; + SynthStopButton.Size = new System.Drawing.Size(121, 27); + SynthStopButton.TabIndex = 43; + SynthStopButton.Text = "Stop"; + SynthStopButton.UseVisualStyleBackColor = true; + SynthStopButton.Click += SynthStopButton_Click; // // label3 // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(8, 59); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(53, 13); - this.label3.TabIndex = 42; - this.label3.Text = "Variables:"; + label3.AutoSize = true; + label3.Location = new System.Drawing.Point(9, 68); + label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(56, 15); + label3.TabIndex = 42; + label3.Text = "Variables:"; // // label2 // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(8, 33); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(47, 13); - this.label2.TabIndex = 41; - this.label2.Text = "Outputs:"; + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(9, 38); + label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(53, 15); + label2.TabIndex = 41; + label2.Text = "Outputs:"; // // SynthVariablesTextBox // - this.SynthVariablesTextBox.Location = new System.Drawing.Point(64, 56); - this.SynthVariablesTextBox.Multiline = true; - this.SynthVariablesTextBox.Name = "SynthVariablesTextBox"; - this.SynthVariablesTextBox.Size = new System.Drawing.Size(293, 87); - this.SynthVariablesTextBox.TabIndex = 40; - this.SynthVariablesTextBox.TextChanged += new System.EventHandler(this.SynthVariablesTextBox_TextChanged); + SynthVariablesTextBox.Location = new System.Drawing.Point(75, 65); + SynthVariablesTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthVariablesTextBox.Multiline = true; + SynthVariablesTextBox.Name = "SynthVariablesTextBox"; + SynthVariablesTextBox.Size = new System.Drawing.Size(341, 100); + SynthVariablesTextBox.TabIndex = 40; + SynthVariablesTextBox.TextChanged += SynthVariablesTextBox_TextChanged; // // SynthOutputsTextBox // - this.SynthOutputsTextBox.Location = new System.Drawing.Point(64, 30); - this.SynthOutputsTextBox.Name = "SynthOutputsTextBox"; - this.SynthOutputsTextBox.Size = new System.Drawing.Size(293, 20); - this.SynthOutputsTextBox.TabIndex = 39; - this.SynthOutputsTextBox.TextChanged += new System.EventHandler(this.SynthOutputsTextBox_TextChanged); - // - // SynthBufferChart - // - this.SynthBufferChart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - chartArea1.Name = "ChartArea1"; - this.SynthBufferChart.ChartAreas.Add(chartArea1); - legend1.Name = "Legend1"; - this.SynthBufferChart.Legends.Add(legend1); - this.SynthBufferChart.Location = new System.Drawing.Point(363, 31); - this.SynthBufferChart.Name = "SynthBufferChart"; - series1.ChartArea = "ChartArea1"; - series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; - series1.IsXValueIndexed = true; - series1.Legend = "Legend1"; - series1.Name = "Buffer"; - this.SynthBufferChart.Series.Add(series1); - this.SynthBufferChart.Size = new System.Drawing.Size(460, 112); - this.SynthBufferChart.TabIndex = 38; - this.SynthBufferChart.Text = "chart1"; + SynthOutputsTextBox.Location = new System.Drawing.Point(75, 35); + SynthOutputsTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthOutputsTextBox.Name = "SynthOutputsTextBox"; + SynthOutputsTextBox.Size = new System.Drawing.Size(341, 23); + SynthOutputsTextBox.TabIndex = 39; + SynthOutputsTextBox.TextChanged += SynthOutputsTextBox_TextChanged; // // SynthPlayButton // - this.SynthPlayButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.SynthPlayButton.Location = new System.Drawing.Point(615, 2); - this.SynthPlayButton.Name = "SynthPlayButton"; - this.SynthPlayButton.Size = new System.Drawing.Size(104, 23); - this.SynthPlayButton.TabIndex = 37; - this.SynthPlayButton.Text = "Play"; - this.SynthPlayButton.UseVisualStyleBackColor = true; - this.SynthPlayButton.Click += new System.EventHandler(this.SynthPlayButton_Click); + SynthPlayButton.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + SynthPlayButton.Location = new System.Drawing.Point(718, 2); + SynthPlayButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthPlayButton.Name = "SynthPlayButton"; + SynthPlayButton.Size = new System.Drawing.Size(121, 27); + SynthPlayButton.TabIndex = 37; + SynthPlayButton.Text = "Play"; + SynthPlayButton.UseVisualStyleBackColor = true; + SynthPlayButton.Click += SynthPlayButton_Click; // // SynthCopyXMLButton // - this.SynthCopyXMLButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.SynthCopyXMLButton.Location = new System.Drawing.Point(463, 2); - this.SynthCopyXMLButton.Name = "SynthCopyXMLButton"; - this.SynthCopyXMLButton.Size = new System.Drawing.Size(146, 23); - this.SynthCopyXMLButton.TabIndex = 35; - this.SynthCopyXMLButton.Text = "Copy XML to clipboard"; - this.SynthCopyXMLButton.UseVisualStyleBackColor = true; - this.SynthCopyXMLButton.Click += new System.EventHandler(this.SynthCopyXMLButton_Click); + SynthCopyXMLButton.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + SynthCopyXMLButton.Location = new System.Drawing.Point(540, 2); + SynthCopyXMLButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthCopyXMLButton.Name = "SynthCopyXMLButton"; + SynthCopyXMLButton.Size = new System.Drawing.Size(170, 27); + SynthCopyXMLButton.TabIndex = 35; + SynthCopyXMLButton.Text = "Copy XML to clipboard"; + SynthCopyXMLButton.UseVisualStyleBackColor = true; + SynthCopyXMLButton.Click += SynthCopyXMLButton_Click; // // label1 // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(8, 6); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(37, 13); - this.label1.TabIndex = 33; - this.label1.Text = "Synth:"; + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(9, 7); + label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(40, 15); + label1.TabIndex = 33; + label1.Text = "Synth:"; // // SynthsComboBox // - this.SynthsComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SynthsComboBox.FormattingEnabled = true; - this.SynthsComboBox.Location = new System.Drawing.Point(64, 3); - this.SynthsComboBox.Name = "SynthsComboBox"; - this.SynthsComboBox.Size = new System.Drawing.Size(393, 21); - this.SynthsComboBox.TabIndex = 4; - this.SynthsComboBox.SelectedIndexChanged += new System.EventHandler(this.SynthsComboBox_SelectedIndexChanged); + SynthsComboBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SynthsComboBox.FormattingEnabled = true; + SynthsComboBox.Location = new System.Drawing.Point(75, 3); + SynthsComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthsComboBox.Name = "SynthsComboBox"; + SynthsComboBox.Size = new System.Drawing.Size(458, 23); + SynthsComboBox.TabIndex = 4; + SynthsComboBox.SelectedIndexChanged += SynthsComboBox_SelectedIndexChanged; // // SynthTextBox // - this.SynthTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SynthTextBox.AutoCompleteBracketsList = new char[] { - '(', - ')', - '{', - '}', - '[', - ']', - '\"', - '\"', - '\'', - '\''}; - this.SynthTextBox.AutoIndentChars = false; - this.SynthTextBox.AutoIndentCharsPatterns = ""; - this.SynthTextBox.AutoIndentExistingLines = false; - this.SynthTextBox.AutoScrollMinSize = new System.Drawing.Size(27, 14); - this.SynthTextBox.BackBrush = null; - this.SynthTextBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.SynthTextBox.CharHeight = 14; - this.SynthTextBox.CharWidth = 8; - this.SynthTextBox.CommentPrefix = null; - this.SynthTextBox.Cursor = System.Windows.Forms.Cursors.IBeam; - this.SynthTextBox.DelayedEventsInterval = 1; - this.SynthTextBox.DisabledColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); - this.SynthTextBox.IsReplaceMode = false; - this.SynthTextBox.Language = FastColoredTextBoxNS.Language.XML; - this.SynthTextBox.LeftBracket = '<'; - this.SynthTextBox.LeftBracket2 = '('; - this.SynthTextBox.Location = new System.Drawing.Point(3, 149); - this.SynthTextBox.Name = "SynthTextBox"; - this.SynthTextBox.Paddings = new System.Windows.Forms.Padding(0); - this.SynthTextBox.RightBracket = '>'; - this.SynthTextBox.RightBracket2 = ')'; - this.SynthTextBox.SelectionColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))); - this.SynthTextBox.ServiceColors = ((FastColoredTextBoxNS.ServiceColors)(resources.GetObject("SynthTextBox.ServiceColors"))); - this.SynthTextBox.Size = new System.Drawing.Size(825, 308); - this.SynthTextBox.TabIndex = 3; - this.SynthTextBox.Zoom = 100; - this.SynthTextBox.TextChangedDelayed += new System.EventHandler(this.SynthTextBox_TextChangedDelayed); + SynthTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SynthTextBox.AutoCompleteBracketsList = new char[] { '(', ')', '{', '}', '[', ']', '"', '"', '\'', '\'' }; + SynthTextBox.AutoIndentChars = false; + SynthTextBox.AutoIndentCharsPatterns = ""; + SynthTextBox.AutoIndentExistingLines = false; + SynthTextBox.AutoScrollMinSize = new System.Drawing.Size(2, 14); + SynthTextBox.BackBrush = null; + SynthTextBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + SynthTextBox.CharHeight = 14; + SynthTextBox.CharWidth = 8; + SynthTextBox.CommentPrefix = null; + SynthTextBox.Cursor = System.Windows.Forms.Cursors.IBeam; + SynthTextBox.DelayedEventsInterval = 1; + SynthTextBox.DisabledColor = System.Drawing.Color.FromArgb(100, 180, 180, 180); + SynthTextBox.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + SynthTextBox.IsReplaceMode = false; + SynthTextBox.Language = FastColoredTextBoxNS.Language.XML; + SynthTextBox.LeftBracket = '<'; + SynthTextBox.LeftBracket2 = '('; + SynthTextBox.Location = new System.Drawing.Point(4, 172); + SynthTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SynthTextBox.Name = "SynthTextBox"; + SynthTextBox.Paddings = new System.Windows.Forms.Padding(0); + SynthTextBox.RightBracket = '>'; + SynthTextBox.RightBracket2 = ')'; + SynthTextBox.SelectionColor = System.Drawing.Color.FromArgb(60, 0, 0, 255); + SynthTextBox.ServiceColors = (FastColoredTextBoxNS.ServiceColors)resources.GetObject("SynthTextBox.ServiceColors"); + SynthTextBox.Size = new System.Drawing.Size(962, 355); + SynthTextBox.TabIndex = 3; + SynthTextBox.Zoom = 100; + SynthTextBox.TextChangedDelayed += SynthTextBox_TextChangedDelayed; // // MainToolbar // - this.MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.NewButton, - this.OpenButton, - this.SaveButton}); - this.MainToolbar.Location = new System.Drawing.Point(0, 24); - this.MainToolbar.Name = "MainToolbar"; - this.MainToolbar.Size = new System.Drawing.Size(839, 25); - this.MainToolbar.TabIndex = 9; - this.MainToolbar.Text = "Main Toolbar"; + MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { NewButton, OpenButton, SaveButton }); + MainToolbar.Location = new System.Drawing.Point(0, 24); + MainToolbar.Name = "MainToolbar"; + MainToolbar.Size = new System.Drawing.Size(979, 25); + MainToolbar.TabIndex = 9; + MainToolbar.Text = "Main Toolbar"; // // NewButton // - this.NewButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.NewButton.Image = ((System.Drawing.Image)(resources.GetObject("NewButton.Image"))); - this.NewButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.NewButton.Name = "NewButton"; - this.NewButton.Size = new System.Drawing.Size(32, 22); - this.NewButton.Text = "New..."; - this.NewButton.ButtonClick += new System.EventHandler(this.NewButton_ButtonClick); + NewButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + NewButton.Image = (System.Drawing.Image)resources.GetObject("NewButton.Image"); + NewButton.ImageTransparentColor = System.Drawing.Color.Magenta; + NewButton.Name = "NewButton"; + NewButton.Size = new System.Drawing.Size(32, 22); + NewButton.Text = "New..."; + NewButton.ButtonClick += NewButton_ButtonClick; // // OpenButton // - this.OpenButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.OpenButton.Image = ((System.Drawing.Image)(resources.GetObject("OpenButton.Image"))); - this.OpenButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.OpenButton.Name = "OpenButton"; - this.OpenButton.Size = new System.Drawing.Size(32, 22); - this.OpenButton.Text = "Open..."; - this.OpenButton.ButtonClick += new System.EventHandler(this.OpenButton_ButtonClick); + OpenButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + OpenButton.Image = (System.Drawing.Image)resources.GetObject("OpenButton.Image"); + OpenButton.ImageTransparentColor = System.Drawing.Color.Magenta; + OpenButton.Name = "OpenButton"; + OpenButton.Size = new System.Drawing.Size(32, 22); + OpenButton.Text = "Open..."; + OpenButton.ButtonClick += OpenButton_ButtonClick; // // SaveButton // - this.SaveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.SaveButton.Image = ((System.Drawing.Image)(resources.GetObject("SaveButton.Image"))); - this.SaveButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.SaveButton.Name = "SaveButton"; - this.SaveButton.Size = new System.Drawing.Size(32, 22); - this.SaveButton.Text = "Save"; - this.SaveButton.ButtonClick += new System.EventHandler(this.SaveButton_ButtonClick); + SaveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + SaveButton.Image = (System.Drawing.Image)resources.GetObject("SaveButton.Image"); + SaveButton.ImageTransparentColor = System.Drawing.Color.Magenta; + SaveButton.Name = "SaveButton"; + SaveButton.Size = new System.Drawing.Size(32, 22); + SaveButton.Text = "Save"; + SaveButton.ButtonClick += SaveButton_ButtonClick; // // MainStatusStrip // - this.MainStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.StatusLabel}); - this.MainStatusStrip.Location = new System.Drawing.Point(0, 535); - this.MainStatusStrip.Name = "MainStatusStrip"; - this.MainStatusStrip.Size = new System.Drawing.Size(839, 22); - this.MainStatusStrip.TabIndex = 7; - this.MainStatusStrip.Text = "Main Status Strip"; + MainStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { StatusLabel }); + MainStatusStrip.Location = new System.Drawing.Point(0, 621); + MainStatusStrip.Name = "MainStatusStrip"; + MainStatusStrip.Padding = new System.Windows.Forms.Padding(1, 0, 16, 0); + MainStatusStrip.Size = new System.Drawing.Size(979, 22); + MainStatusStrip.TabIndex = 7; + MainStatusStrip.Text = "Main Status Strip"; // // StatusLabel // - this.StatusLabel.Name = "StatusLabel"; - this.StatusLabel.Size = new System.Drawing.Size(824, 17); - this.StatusLabel.Spring = true; - this.StatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + StatusLabel.Name = "StatusLabel"; + StatusLabel.Size = new System.Drawing.Size(962, 17); + StatusLabel.Spring = true; + StatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // MainMenu // - this.MainMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.FileMenu, - this.EditMenu, - this.ViewMenu}); - this.MainMenu.Location = new System.Drawing.Point(0, 0); - this.MainMenu.Name = "MainMenu"; - this.MainMenu.Size = new System.Drawing.Size(839, 24); - this.MainMenu.TabIndex = 8; - this.MainMenu.Text = "Main Menu"; + MainMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { FileMenu, EditMenu, ViewMenu }); + MainMenu.Location = new System.Drawing.Point(0, 0); + MainMenu.Name = "MainMenu"; + MainMenu.Padding = new System.Windows.Forms.Padding(7, 2, 0, 2); + MainMenu.Size = new System.Drawing.Size(979, 24); + MainMenu.TabIndex = 8; + MainMenu.Text = "Main Menu"; // // FileMenu // - this.FileMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.FileNewMenu, - this.FileOpenMenu, - this.FileSaveMenu, - this.FileSaveAsMenu, - this.toolStripSeparator1, - this.FileCloseMenu}); - this.FileMenu.Name = "FileMenu"; - this.FileMenu.Size = new System.Drawing.Size(37, 20); - this.FileMenu.Text = "File"; + FileMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { FileNewMenu, FileOpenMenu, FileSaveMenu, FileSaveAsMenu, toolStripSeparator1, FileCloseMenu }); + FileMenu.Name = "FileMenu"; + FileMenu.Size = new System.Drawing.Size(37, 20); + FileMenu.Text = "File"; // // FileNewMenu // - this.FileNewMenu.Name = "FileNewMenu"; - this.FileNewMenu.Size = new System.Drawing.Size(145, 22); - this.FileNewMenu.Text = "New"; - this.FileNewMenu.Click += new System.EventHandler(this.FileNewMenu_Click); + FileNewMenu.Name = "FileNewMenu"; + FileNewMenu.Size = new System.Drawing.Size(145, 22); + FileNewMenu.Text = "New"; + FileNewMenu.Click += FileNewMenu_Click; // // FileOpenMenu // - this.FileOpenMenu.Name = "FileOpenMenu"; - this.FileOpenMenu.Size = new System.Drawing.Size(145, 22); - this.FileOpenMenu.Text = "Open..."; - this.FileOpenMenu.Click += new System.EventHandler(this.FileOpenMenu_Click); + FileOpenMenu.Name = "FileOpenMenu"; + FileOpenMenu.Size = new System.Drawing.Size(145, 22); + FileOpenMenu.Text = "Open..."; + FileOpenMenu.Click += FileOpenMenu_Click; // // FileSaveMenu // - this.FileSaveMenu.Name = "FileSaveMenu"; - this.FileSaveMenu.Size = new System.Drawing.Size(145, 22); - this.FileSaveMenu.Text = "Save"; - this.FileSaveMenu.Click += new System.EventHandler(this.FileSaveMenu_Click); + FileSaveMenu.Name = "FileSaveMenu"; + FileSaveMenu.Size = new System.Drawing.Size(145, 22); + FileSaveMenu.Text = "Save"; + FileSaveMenu.Click += FileSaveMenu_Click; // // FileSaveAsMenu // - this.FileSaveAsMenu.Name = "FileSaveAsMenu"; - this.FileSaveAsMenu.Size = new System.Drawing.Size(145, 22); - this.FileSaveAsMenu.Text = "Save As..."; - this.FileSaveAsMenu.Click += new System.EventHandler(this.FileSaveAsMenu_Click); + FileSaveAsMenu.Name = "FileSaveAsMenu"; + FileSaveAsMenu.Size = new System.Drawing.Size(145, 22); + FileSaveAsMenu.Text = "Save As..."; + FileSaveAsMenu.Click += FileSaveAsMenu_Click; // // toolStripSeparator1 // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(142, 6); + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(142, 6); // // FileCloseMenu // - this.FileCloseMenu.Name = "FileCloseMenu"; - this.FileCloseMenu.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); - this.FileCloseMenu.Size = new System.Drawing.Size(145, 22); - this.FileCloseMenu.Text = "Close"; - this.FileCloseMenu.Click += new System.EventHandler(this.FileCloseMenu_Click); + FileCloseMenu.Name = "FileCloseMenu"; + FileCloseMenu.ShortcutKeys = System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4; + FileCloseMenu.Size = new System.Drawing.Size(145, 22); + FileCloseMenu.Text = "Close"; + FileCloseMenu.Click += FileCloseMenu_Click; // // EditMenu // - this.EditMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.wIPToolStripMenuItem}); - this.EditMenu.Enabled = false; - this.EditMenu.Name = "EditMenu"; - this.EditMenu.Size = new System.Drawing.Size(39, 20); - this.EditMenu.Text = "Edit"; + EditMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { wIPToolStripMenuItem }); + EditMenu.Enabled = false; + EditMenu.Name = "EditMenu"; + EditMenu.Size = new System.Drawing.Size(39, 20); + EditMenu.Text = "Edit"; // // wIPToolStripMenuItem // - this.wIPToolStripMenuItem.Name = "wIPToolStripMenuItem"; - this.wIPToolStripMenuItem.Size = new System.Drawing.Size(106, 22); - this.wIPToolStripMenuItem.Text = "[WIP!]"; + wIPToolStripMenuItem.Name = "wIPToolStripMenuItem"; + wIPToolStripMenuItem.Size = new System.Drawing.Size(106, 22); + wIPToolStripMenuItem.Text = "[WIP!]"; // // ViewMenu // - this.ViewMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.wIPToolStripMenuItem1}); - this.ViewMenu.Enabled = false; - this.ViewMenu.Name = "ViewMenu"; - this.ViewMenu.Size = new System.Drawing.Size(44, 20); - this.ViewMenu.Text = "View"; + ViewMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { wIPToolStripMenuItem1 }); + ViewMenu.Enabled = false; + ViewMenu.Name = "ViewMenu"; + ViewMenu.Size = new System.Drawing.Size(44, 20); + ViewMenu.Text = "View"; // // wIPToolStripMenuItem1 // - this.wIPToolStripMenuItem1.Name = "wIPToolStripMenuItem1"; - this.wIPToolStripMenuItem1.Size = new System.Drawing.Size(106, 22); - this.wIPToolStripMenuItem1.Text = "[WIP!]"; + wIPToolStripMenuItem1.Name = "wIPToolStripMenuItem1"; + wIPToolStripMenuItem1.Size = new System.Drawing.Size(106, 22); + wIPToolStripMenuItem1.Text = "[WIP!]"; // // OpenFileDialog // - this.OpenFileDialog.Filter = "XML files|*.xml|All files|*.*"; + OpenFileDialog.Filter = "XML files|*.xml|All files|*.*"; // // SaveFileDialog // - this.SaveFileDialog.Filter = "XML files|*.xml|All files|*.*"; + SaveFileDialog.Filter = "XML files|*.xml|All files|*.*"; // // RelForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(839, 557); - this.Controls.Add(this.MainTabControl); - this.Controls.Add(this.MainToolbar); - this.Controls.Add(this.MainStatusStrip); - this.Controls.Add(this.MainMenu); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "RelForm"; - this.Text = "Audio dat.rel Editor - CodeWalker by dexyfex"; - this.MainTabControl.ResumeLayout(false); - this.XmlTabPage.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.XmlTextBox)).EndInit(); - this.DetailsTabPage.ResumeLayout(false); - this.NameTableTabPage.ResumeLayout(false); - this.NameTableTabPage.PerformLayout(); - this.SearchTabPage.ResumeLayout(false); - this.SearchTabPage.PerformLayout(); - this.SynthsTabPage.ResumeLayout(false); - this.SynthsTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.SynthBufferChart)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.SynthTextBox)).EndInit(); - this.MainToolbar.ResumeLayout(false); - this.MainToolbar.PerformLayout(); - this.MainStatusStrip.ResumeLayout(false); - this.MainStatusStrip.PerformLayout(); - this.MainMenu.ResumeLayout(false); - this.MainMenu.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(979, 643); + Controls.Add(MainTabControl); + Controls.Add(MainToolbar); + Controls.Add(MainStatusStrip); + Controls.Add(MainMenu); + Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon"); + Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + Name = "RelForm"; + Text = "Audio dat.rel Editor - CodeWalker by dexyfex"; + MainTabControl.ResumeLayout(false); + XmlTabPage.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)XmlTextBox).EndInit(); + DetailsTabPage.ResumeLayout(false); + NameTableTabPage.ResumeLayout(false); + NameTableTabPage.PerformLayout(); + SearchTabPage.ResumeLayout(false); + SearchTabPage.PerformLayout(); + SynthsTabPage.ResumeLayout(false); + SynthsTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)SynthTextBox).EndInit(); + MainToolbar.ResumeLayout(false); + MainToolbar.PerformLayout(); + MainStatusStrip.ResumeLayout(false); + MainStatusStrip.PerformLayout(); + MainMenu.ResumeLayout(false); + MainMenu.PerformLayout(); + ResumeLayout(false); + PerformLayout(); } #endregion @@ -704,7 +658,7 @@ private FastColoredTextBoxNS.FastColoredTextBox SynthTextBox; private System.Windows.Forms.Button SynthCopyXMLButton; private System.Windows.Forms.Button SynthPlayButton; - private System.Windows.Forms.DataVisualization.Charting.Chart SynthBufferChart; + //private System.Windows.Forms.DataVisualization.Charting.Chart SynthBufferChart; private System.Windows.Forms.TextBox SynthOutputsTextBox; private System.Windows.Forms.TextBox SynthVariablesTextBox; private System.Windows.Forms.Label label3; diff --git a/CodeWalker/Forms/RelForm.cs b/CodeWalker/Forms/RelForm.cs index df4adfe..9cf0fe0 100644 --- a/CodeWalker/Forms/RelForm.cs +++ b/CodeWalker/Forms/RelForm.cs @@ -12,7 +12,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; -using System.Windows.Forms.DataVisualization.Charting; +//using System.Windows.Forms.DataVisualization.Charting; using System.Xml; using Range = FastColoredTextBoxNS.Range; using TextStyle = FastColoredTextBoxNS.TextStyle; @@ -168,7 +168,7 @@ namespace CodeWalker.Forms } else { - sb.AppendLine("0x" + h.ToString("X").PadLeft(8, '0')); + sb.AppendLine("0x" + h.ToString("X8")); } } sb.AppendLine(); @@ -203,13 +203,12 @@ namespace CodeWalker.Forms private bool SaveRel(XmlDocument doc) { - if (!(ExploreForm.Instance?.EditMode ?? false)) return false; + if (!(ExploreForm.Instance?.EditMode ?? false)) + return false; - byte[] data = null; + byte[] data; -#if !DEBUG try -#endif { switch (metaFormat) { @@ -227,14 +226,13 @@ namespace CodeWalker.Forms break; } } -#if !DEBUG catch (Exception ex) { MessageBox.Show("Exception encountered!\r\n" + ex.ToString(), "Cannot convert XML"); return false; } -#endif - if (data == null) + + if (data.Length == 0) { MessageBox.Show("Schema not supported. (Unspecified error - data was null!)", "Cannot convert XML"); return false; @@ -255,8 +253,6 @@ namespace CodeWalker.Forms if (!(ExploreForm.EnsureRpfValidEncryption(rpfFileEntry.File))) return false; var newentry = RpfFile.CreateFile(rpfFileEntry.Parent, rpfFileEntry.Name, data); - if (newentry != rpfFileEntry) - { } rpfFileEntry = newentry; ExploreForm.RefreshMainListViewInvoke(); //update the file details in explorer... @@ -327,7 +323,8 @@ namespace CodeWalker.Forms } private void NewDocument() { - if (!CloseDocument()) return; + if (!CloseDocument()) + return; FileName = "New.xml"; rpfFileEntry = null; @@ -336,13 +333,16 @@ namespace CodeWalker.Forms } private void OpenDocument() { - if (OpenFileDialog.ShowDialog() != DialogResult.OK) return; + if (OpenFileDialog.ShowDialog() != DialogResult.OK) + return; - if (!CloseDocument()) return; + if (!CloseDocument()) + return; var fn = OpenFileDialog.FileName; - if (!File.Exists(fn)) return; //couldn't find file? + if (!File.Exists(fn)) + return; //couldn't find file? Xml = File.ReadAllText(fn); @@ -377,10 +377,14 @@ namespace CodeWalker.Forms saveAs = true; } - if (string.IsNullOrEmpty(FileName)) saveAs = true; - if (string.IsNullOrEmpty(FilePath)) saveAs = true; - else if (FilePath.StartsWith(GTAFolder.CurrentGTAFolder, StringComparison.OrdinalIgnoreCase)) saveAs = true; - if (!File.Exists(FilePath)) saveAs = true; + if (string.IsNullOrEmpty(FileName)) + saveAs = true; + if (string.IsNullOrEmpty(FilePath)) + saveAs = true; + else if (FilePath.StartsWith(GTAFolder.CurrentGTAFolder, StringComparison.OrdinalIgnoreCase)) + saveAs = true; + if (!File.Exists(FilePath)) + saveAs = true; var fn = FilePath; if (saveAs) @@ -504,20 +508,20 @@ namespace CodeWalker.Forms { SearchResultsGrid.SelectedObject = null; - if (CurrentFile?.RelDatasSorted == null) return; + if (CurrentFile?.RelDatas == null || CurrentFile.RelDatas.Length == 0) + return; bool textsearch = SearchTextRadio.Checked; var text = SearchTextBox.Text; - uint hash = 0; - uint hashl = 0; - if (!uint.TryParse(text, out hash))//don't re-hash hashes + uint hashl; + if (!uint.TryParse(text, out uint hash))//don't re-hash hashes { hash = JenkHash.GenHash(text); - JenkIndex.Ensure(text); + JenkIndex.Ensure(text, hash); hashl = JenkHash.GenHashLower(text); - JenkIndex.EnsureLower(text); + JenkIndex.Ensure(text, hashl); } else { @@ -715,16 +719,16 @@ namespace CodeWalker.Forms } else { -//#if !DEBUG + //#if !DEBUG try { -//#endif + //#endif if (synthesizer == null) { synthesizer = new Synthesizer(); synthesizer.Stopped += (t, _) => { - BeginInvoke((Action)(() => + BeginInvoke((() => { SynthPlayButton.Enabled = true; SynthStopButton.Enabled = false; @@ -739,37 +743,37 @@ namespace CodeWalker.Forms Array.Copy(synthesizer.Buffers[i], buffersCopy[i], synthesizer.Buffers[i].Length); } - BeginInvoke((Action)(() => + BeginInvoke((() => { //for (int i = 0; i < buffersCopy.Length; i++) int i = synthesizer.Synth.OutputsIndices[0]; try { - var series = SynthBufferChart.Series.FindByName($"B{i}"); - if (series != null) - { - series.Points.Clear(); - foreach (var v in buffersCopy[i]) - series.Points.AddY(Math.Max(Math.Min(v, 2.0f), -2.0f));//make sure crazy accidental values don't crash it later - } + //var series = SynthBufferChart.Series.FindByName($"B{i}"); + //if (series != null) + //{ + // series.Points.Clear(); + // foreach (var v in buffersCopy[i]) + // series.Points.AddY(Math.Max(Math.Min(v, 2.0f), -2.0f));//make sure crazy accidental values don't crash it later + //} } catch { } })); }; } - SynthBufferChart.Series.Clear(); - for (int i = 0; i < newSynth.BuffersCount; i++) - { - var series = SynthBufferChart.Series.Add($"B{i}"); - series.IsXValueIndexed = true; - series.ChartType = SeriesChartType.FastLine; - } + //SynthBufferChart.Series.Clear(); + //for (int i = 0; i < newSynth.BuffersCount; i++) + //{ + // var series = SynthBufferChart.Series.Add($"B{i}"); + // series.IsXValueIndexed = true; + // series.ChartType = SeriesChartType.FastLine; + //} SynthPlayButton.Enabled = false; SynthStopButton.Enabled = true; synthesizer.Play(newSynth); -//#if !DEBUG + //#if !DEBUG } catch (Exception ex) { @@ -777,7 +781,7 @@ namespace CodeWalker.Forms SynthStopButton.Enabled = false; StatusLabel.Text = $"Synthesizer error: {ex}"; } -//#endif + //#endif } } diff --git a/CodeWalker/Forms/RelForm.resx b/CodeWalker/Forms/RelForm.resx index cbdfdac..18ff938 100644 --- a/CodeWalker/Forms/RelForm.resx +++ b/CodeWalker/Forms/RelForm.resx @@ -1,17 +1,17 @@  - @@ -117,40 +117,40 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdGYXN0Q29sb3JlZFRleHRCb3gsIFZlcnNpb249Mi4xNi4yNC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWZiOGFhMTJiOTk0ZWY2MWIMAwAAAFFTeXN0 - ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu - PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACJGYXN0Q29sb3JlZFRleHRCb3hOUy5TZXJ2aWNlQ29sb3JzBgAA - ACg8Q29sbGFwc2VNYXJrZXJGb3JlQ29sb3I+a19fQmFja2luZ0ZpZWxkKDxDb2xsYXBzZU1hcmtlckJh - Y2tDb2xvcj5rX19CYWNraW5nRmllbGQqPENvbGxhcHNlTWFya2VyQm9yZGVyQ29sb3I+a19fQmFja2lu - Z0ZpZWxkJjxFeHBhbmRNYXJrZXJGb3JlQ29sb3I+a19fQmFja2luZ0ZpZWxkJjxFeHBhbmRNYXJrZXJC - YWNrQ29sb3I+a19fQmFja2luZ0ZpZWxkKDxFeHBhbmRNYXJrZXJCb3JkZXJDb2xvcj5rX19CYWNraW5n - RmllbGQEBAQEBAQUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAA - ABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5E - cmF3aW5nLkNvbG9yAwAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAACAAAABfz///8UU3lzdGVtLkRy - YXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAACgAAAAAA - AAAAlgABAAH7/////P///woAAAAAAAAAAKQAAQAB+v////z///8KAAAAAAAAAACWAAEAAfn////8//// - CgAAAAAAAAAATgABAAH4/////P///woAAAAAAAAAAKQAAQAB9/////z///8KAAAAAAAAAACWAAEACw== - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdGYXN0Q29sb3JlZFRleHRCb3gsIFZlcnNpb249Mi4xNi4yNC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWZiOGFhMTJiOTk0ZWY2MWIMAwAAAFFTeXN0 - ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu - PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACJGYXN0Q29sb3JlZFRleHRCb3hOUy5TZXJ2aWNlQ29sb3JzBgAA - ACg8Q29sbGFwc2VNYXJrZXJGb3JlQ29sb3I+a19fQmFja2luZ0ZpZWxkKDxDb2xsYXBzZU1hcmtlckJh - Y2tDb2xvcj5rX19CYWNraW5nRmllbGQqPENvbGxhcHNlTWFya2VyQm9yZGVyQ29sb3I+a19fQmFja2lu - Z0ZpZWxkJjxFeHBhbmRNYXJrZXJGb3JlQ29sb3I+a19fQmFja2luZ0ZpZWxkJjxFeHBhbmRNYXJrZXJC - YWNrQ29sb3I+a19fQmFja2luZ0ZpZWxkKDxFeHBhbmRNYXJrZXJCb3JkZXJDb2xvcj5rX19CYWNraW5n - RmllbGQEBAQEBAQUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAA - ABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5E - cmF3aW5nLkNvbG9yAwAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAACAAAABfz///8UU3lzdGVtLkRy - YXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAACgAAAAAA - AAAAlgABAAH7/////P///woAAAAAAAAAAKQAAQAB+v////z///8KAAAAAAAAAACWAAEAAfn////8//// - CgAAAAAAAAAATgABAAH4/////P///woAAAAAAAAAAKQAAQAB9/////z///8KAAAAAAAAAACWAAEACw== + AAEAAAD/////AQAAAAAAAAAMAgAAAERGYXN0Q29sb3JlZFRleHRCb3gsIEN1bHR1cmU9bmV1dHJhbCwg + UHVibGljS2V5VG9rZW49ZmI4YWExMmI5OTRlZjYxYgwDAAAAUVN5c3RlbS5EcmF3aW5nLCBWZXJzaW9u + PTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUB + AAAAIkZhc3RDb2xvcmVkVGV4dEJveE5TLlNlcnZpY2VDb2xvcnMGAAAAKDxDb2xsYXBzZU1hcmtlckZv + cmVDb2xvcj5rX19CYWNraW5nRmllbGQoPENvbGxhcHNlTWFya2VyQmFja0NvbG9yPmtfX0JhY2tpbmdG + aWVsZCo8Q29sbGFwc2VNYXJrZXJCb3JkZXJDb2xvcj5rX19CYWNraW5nRmllbGQmPEV4cGFuZE1hcmtl + ckZvcmVDb2xvcj5rX19CYWNraW5nRmllbGQmPEV4cGFuZE1hcmtlckJhY2tDb2xvcj5rX19CYWNraW5n + RmllbGQoPEV4cGFuZE1hcmtlckJvcmRlckNvbG9yPmtfX0JhY2tpbmdGaWVsZAQEBAQEBBRTeXN0ZW0u + RHJhd2luZy5Db2xvcgMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5EcmF3aW5nLkNv + bG9yAwAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5 + c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAIAAAAF/P///xRTeXN0ZW0uRHJhd2luZy5Db2xvcgQAAAAEbmFt + ZQV2YWx1ZQprbm93bkNvbG9yBXN0YXRlAQAAAAkHBwMAAAAKAAAAAAAAAACWAAEAAfv////8////CgAA + AAAAAAAApAABAAH6/////P///woAAAAAAAAAAJYAAQAB+f////z///8KAAAAAAAAAABOAAEAAfj////8 + ////CgAAAAAAAAAApAABAAH3/////P///woAAAAAAAAAAJYAAQAL + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAERGYXN0Q29sb3JlZFRleHRCb3gsIEN1bHR1cmU9bmV1dHJhbCwg + UHVibGljS2V5VG9rZW49ZmI4YWExMmI5OTRlZjYxYgwDAAAAUVN5c3RlbS5EcmF3aW5nLCBWZXJzaW9u + PTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUB + AAAAIkZhc3RDb2xvcmVkVGV4dEJveE5TLlNlcnZpY2VDb2xvcnMGAAAAKDxDb2xsYXBzZU1hcmtlckZv + cmVDb2xvcj5rX19CYWNraW5nRmllbGQoPENvbGxhcHNlTWFya2VyQmFja0NvbG9yPmtfX0JhY2tpbmdG + aWVsZCo8Q29sbGFwc2VNYXJrZXJCb3JkZXJDb2xvcj5rX19CYWNraW5nRmllbGQmPEV4cGFuZE1hcmtl + ckZvcmVDb2xvcj5rX19CYWNraW5nRmllbGQmPEV4cGFuZE1hcmtlckJhY2tDb2xvcj5rX19CYWNraW5n + RmllbGQoPEV4cGFuZE1hcmtlckJvcmRlckNvbG9yPmtfX0JhY2tpbmdGaWVsZAQEBAQEBBRTeXN0ZW0u + RHJhd2luZy5Db2xvcgMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5EcmF3aW5nLkNv + bG9yAwAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5 + c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAIAAAAF/P///xRTeXN0ZW0uRHJhd2luZy5Db2xvcgQAAAAEbmFt + ZQV2YWx1ZQprbm93bkNvbG9yBXN0YXRlAQAAAAkHBwMAAAAKAAAAAAAAAACWAAEAAfv////8////CgAA + AAAAAAAApAABAAH6/////P///woAAAAAAAAAAJYAAQAB+f////z///8KAAAAAAAAAABOAAEAAfj////8 + ////CgAAAAAAAAAApAABAAH3/////P///woAAAAAAAAAAJYAAQAL diff --git a/CodeWalker/Forms/TextForm.cs b/CodeWalker/Forms/TextForm.cs index 75dce17..f6c38b9 100644 --- a/CodeWalker/Forms/TextForm.cs +++ b/CodeWalker/Forms/TextForm.cs @@ -92,7 +92,7 @@ namespace CodeWalker.Forms private void UpdateFormTitle() { - Text = fileName + " - " + fileType.ToString() + " Editor - CodeWalker by dexyfex"; + Text = $"{fileName} - {fileType} Editor - CodeWalker by dexyfex"; } private void UpdateTextBoxFromData() diff --git a/CodeWalker/Forms/YtdForm.cs b/CodeWalker/Forms/YtdForm.cs index dd5cbad..ac7b84d 100644 --- a/CodeWalker/Forms/YtdForm.cs +++ b/CodeWalker/Forms/YtdForm.cs @@ -152,8 +152,8 @@ namespace CodeWalker.Forms { int cmip = Math.Min(Math.Max(mip, 0), tex.Levels - 1); byte[] pixels = DDSIO.GetPixels(tex, cmip); - int w = tex.Width >> cmip; - int h = tex.Height >> cmip; + int w = Math.Max(tex.Width >> cmip, 1); + int h = Math.Max(tex.Height >> cmip, 1); //Image bmp = Image.FromStream(new MemoryStream(pixels)); @@ -188,6 +188,7 @@ namespace CodeWalker.Forms { UpdateStatus("Error reading texture mip: " + ex.ToString()); SelTexturePictureBox.Image = null; + Console.WriteLine(ex); } UpdateZoom(); diff --git a/CodeWalker/GameFiles/GameFileCacheFactory.cs b/CodeWalker/GameFiles/GameFileCacheFactory.cs index cf52ee1..54bde04 100644 --- a/CodeWalker/GameFiles/GameFileCacheFactory.cs +++ b/CodeWalker/GameFiles/GameFileCacheFactory.cs @@ -26,11 +26,6 @@ namespace CodeWalker.GameFiles return _instance; } } - public static GameFileCache GetInstance() - { - return Instance; - } - } } \ No newline at end of file diff --git a/CodeWalker/GameFiles/TextureFormats.cs b/CodeWalker/GameFiles/TextureFormats.cs index 7afbe4e..3378757 100644 --- a/CodeWalker/GameFiles/TextureFormats.cs +++ b/CodeWalker/GameFiles/TextureFormats.cs @@ -31,6 +31,7 @@ namespace CodeWalker.GameFiles case TextureFormat.D3DFMT_L8: format = Format.R8_UNorm; break; case TextureFormat.D3DFMT_A8R8G8B8: format = Format.B8G8R8A8_UNorm; break; case TextureFormat.D3DFMT_X8R8G8B8: format = Format.B8G8R8X8_UNorm; break; + case TextureFormat.D3DFMT_A16R16G16B16: format = Format.R16G16B16A16_UNorm; break; } return format; } @@ -54,6 +55,7 @@ namespace CodeWalker.GameFiles case TextureFormat.D3DFMT_L8: return 8;// R8_UNorm case TextureFormat.D3DFMT_A8R8G8B8: return 32;// B8G8R8A8_UNorm case TextureFormat.D3DFMT_X8R8G8B8: return 32;// B8G8R8X8_UNorm + case TextureFormat.D3DFMT_A16R16G16B16: return 32; default: return 0; } diff --git a/CodeWalker/PedsForm.Designer.cs b/CodeWalker/PedsForm.Designer.cs index 57c3f4c..c501991 100644 --- a/CodeWalker/PedsForm.Designer.cs +++ b/CodeWalker/PedsForm.Designer.cs @@ -28,1092 +28,1391 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); + components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PedsForm)); - this.ConsoleTextBox = new CodeWalker.WinForms.TextBoxFix(); - this.ToolsPanelShowButton = new System.Windows.Forms.Button(); - this.ToolsPanelHideButton = new System.Windows.Forms.Button(); - this.ToolsDragPanel = new System.Windows.Forms.Panel(); - this.ConsolePanel = new System.Windows.Forms.Panel(); - this.HDTexturesCheckBox = new System.Windows.Forms.CheckBox(); - this.SkeletonsCheckBox = new System.Windows.Forms.CheckBox(); - this.TimeOfDayLabel = new System.Windows.Forms.Label(); - this.ToolsOptionsTabPage = new System.Windows.Forms.TabPage(); - this.label19 = new System.Windows.Forms.Label(); - this.TimeOfDayTrackBar = new System.Windows.Forms.TrackBar(); - this.ControlLightDirCheckBox = new System.Windows.Forms.CheckBox(); - this.ShowCollisionMeshesCheckBox = new System.Windows.Forms.CheckBox(); - this.GridCheckBox = new System.Windows.Forms.CheckBox(); - this.GridCountComboBox = new System.Windows.Forms.ComboBox(); - this.label2 = new System.Windows.Forms.Label(); - this.GridSizeComboBox = new System.Windows.Forms.ComboBox(); - this.label1 = new System.Windows.Forms.Label(); - this.StatusBarCheckBox = new System.Windows.Forms.CheckBox(); - this.ErrorConsoleCheckBox = new System.Windows.Forms.CheckBox(); - this.HDRRenderingCheckBox = new System.Windows.Forms.CheckBox(); - this.SkydomeCheckBox = new System.Windows.Forms.CheckBox(); - this.ShadowsCheckBox = new System.Windows.Forms.CheckBox(); - this.WireframeCheckBox = new System.Windows.Forms.CheckBox(); - this.RenderModeComboBox = new System.Windows.Forms.ComboBox(); - this.label11 = new System.Windows.Forms.Label(); - this.TextureSamplerComboBox = new System.Windows.Forms.ComboBox(); - this.TextureCoordsComboBox = new System.Windows.Forms.ComboBox(); - this.label10 = new System.Windows.Forms.Label(); - this.AnisotropicFilteringCheckBox = new System.Windows.Forms.CheckBox(); - this.label14 = new System.Windows.Forms.Label(); - this.DetailsPropertyGrid = new CodeWalker.WinForms.ReadOnlyPropertyGrid(); - this.ToolsDetailsTabPage = new System.Windows.Forms.TabPage(); - this.TextureViewerButton = new System.Windows.Forms.Button(); - this.TexturesTreeView = new CodeWalker.WinForms.TreeViewFix(); - this.ToolsTexturesTabPage = new System.Windows.Forms.TabPage(); - this.ModelsTreeView = new CodeWalker.WinForms.TreeViewFix(); - this.StatusStrip = new System.Windows.Forms.StatusStrip(); - this.StatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.MousedLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.StatsLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.ToolsModelsTabPage = new System.Windows.Forms.TabPage(); - this.label3 = new System.Windows.Forms.Label(); - this.PedNameComboBox = new System.Windows.Forms.ComboBox(); - this.StatsUpdateTimer = new System.Windows.Forms.Timer(this.components); - this.ToolsPedTabPage = new System.Windows.Forms.TabPage(); - this.EnableRootMotionCheckBox = new System.Windows.Forms.CheckBox(); - this.label23 = new System.Windows.Forms.Label(); - this.label22 = new System.Windows.Forms.Label(); - this.ClipComboBox = new System.Windows.Forms.ComboBox(); - this.label21 = new System.Windows.Forms.Label(); - this.ClipDictComboBox = new System.Windows.Forms.ComboBox(); - this.label20 = new System.Windows.Forms.Label(); - this.CompJbibComboBox = new System.Windows.Forms.ComboBox(); - this.label18 = new System.Windows.Forms.Label(); - this.CompDeclComboBox = new System.Windows.Forms.ComboBox(); - this.label17 = new System.Windows.Forms.Label(); - this.CompTaskComboBox = new System.Windows.Forms.ComboBox(); - this.label16 = new System.Windows.Forms.Label(); - this.CompAccsComboBox = new System.Windows.Forms.ComboBox(); - this.label15 = new System.Windows.Forms.Label(); - this.CompTeefComboBox = new System.Windows.Forms.ComboBox(); - this.label13 = new System.Windows.Forms.Label(); - this.CompFeetComboBox = new System.Windows.Forms.ComboBox(); - this.label12 = new System.Windows.Forms.Label(); - this.CompHandComboBox = new System.Windows.Forms.ComboBox(); - this.label9 = new System.Windows.Forms.Label(); - this.CompLowrComboBox = new System.Windows.Forms.ComboBox(); - this.label8 = new System.Windows.Forms.Label(); - this.CompUpprComboBox = new System.Windows.Forms.ComboBox(); - this.label7 = new System.Windows.Forms.Label(); - this.CompHairComboBox = new System.Windows.Forms.ComboBox(); - this.label6 = new System.Windows.Forms.Label(); - this.CompBerdComboBox = new System.Windows.Forms.ComboBox(); - this.label5 = new System.Windows.Forms.Label(); - this.CompHeadComboBox = new System.Windows.Forms.ComboBox(); - this.label4 = new System.Windows.Forms.Label(); - this.ToolsTabControl = new System.Windows.Forms.TabControl(); - this.ToolsPanel = new System.Windows.Forms.Panel(); - this.ConsolePanel.SuspendLayout(); - this.ToolsOptionsTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.TimeOfDayTrackBar)).BeginInit(); - this.ToolsDetailsTabPage.SuspendLayout(); - this.ToolsTexturesTabPage.SuspendLayout(); - this.StatusStrip.SuspendLayout(); - this.ToolsModelsTabPage.SuspendLayout(); - this.ToolsPedTabPage.SuspendLayout(); - this.ToolsTabControl.SuspendLayout(); - this.ToolsPanel.SuspendLayout(); - this.SuspendLayout(); + ConsoleTextBox = new WinForms.TextBoxFix(); + ToolsPanelShowButton = new System.Windows.Forms.Button(); + ToolsPanelHideButton = new System.Windows.Forms.Button(); + ToolsDragPanel = new System.Windows.Forms.Panel(); + ConsolePanel = new System.Windows.Forms.Panel(); + HDTexturesCheckBox = new System.Windows.Forms.CheckBox(); + SkeletonsCheckBox = new System.Windows.Forms.CheckBox(); + TimeOfDayLabel = new System.Windows.Forms.Label(); + ToolsOptionsTabPage = new System.Windows.Forms.TabPage(); + label19 = new System.Windows.Forms.Label(); + TimeOfDayTrackBar = new System.Windows.Forms.TrackBar(); + ControlLightDirCheckBox = new System.Windows.Forms.CheckBox(); + ShowCollisionMeshesCheckBox = new System.Windows.Forms.CheckBox(); + GridCheckBox = new System.Windows.Forms.CheckBox(); + GridCountComboBox = new System.Windows.Forms.ComboBox(); + label2 = new System.Windows.Forms.Label(); + GridSizeComboBox = new System.Windows.Forms.ComboBox(); + label1 = new System.Windows.Forms.Label(); + StatusBarCheckBox = new System.Windows.Forms.CheckBox(); + ErrorConsoleCheckBox = new System.Windows.Forms.CheckBox(); + HDRRenderingCheckBox = new System.Windows.Forms.CheckBox(); + SkydomeCheckBox = new System.Windows.Forms.CheckBox(); + ShadowsCheckBox = new System.Windows.Forms.CheckBox(); + WireframeCheckBox = new System.Windows.Forms.CheckBox(); + RenderModeComboBox = new System.Windows.Forms.ComboBox(); + label11 = new System.Windows.Forms.Label(); + TextureSamplerComboBox = new System.Windows.Forms.ComboBox(); + TextureCoordsComboBox = new System.Windows.Forms.ComboBox(); + label10 = new System.Windows.Forms.Label(); + AnisotropicFilteringCheckBox = new System.Windows.Forms.CheckBox(); + label14 = new System.Windows.Forms.Label(); + DetailsPropertyGrid = new WinForms.ReadOnlyPropertyGrid(); + ToolsDetailsTabPage = new System.Windows.Forms.TabPage(); + TextureViewerButton = new System.Windows.Forms.Button(); + TexturesTreeView = new WinForms.TreeViewFix(); + ToolsTexturesTabPage = new System.Windows.Forms.TabPage(); + ModelsTreeView = new WinForms.TreeViewFix(); + StatusStrip = new System.Windows.Forms.StatusStrip(); + StatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + MousedLabel = new System.Windows.Forms.ToolStripStatusLabel(); + StatsLabel = new System.Windows.Forms.ToolStripStatusLabel(); + ToolsModelsTabPage = new System.Windows.Forms.TabPage(); + label3 = new System.Windows.Forms.Label(); + PedNameComboBox = new System.Windows.Forms.ComboBox(); + StatsUpdateTimer = new System.Windows.Forms.Timer(components); + ToolsPedTabPage = new System.Windows.Forms.TabPage(); + tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + label5 = new System.Windows.Forms.Label(); + CompHeadComboBox = new System.Windows.Forms.ComboBox(); + label6 = new System.Windows.Forms.Label(); + CompBerdComboBox = new System.Windows.Forms.ComboBox(); + label7 = new System.Windows.Forms.Label(); + CompHairComboBox = new System.Windows.Forms.ComboBox(); + label8 = new System.Windows.Forms.Label(); + CompUpprComboBox = new System.Windows.Forms.ComboBox(); + CompJbibComboBox = new System.Windows.Forms.ComboBox(); + label20 = new System.Windows.Forms.Label(); + label9 = new System.Windows.Forms.Label(); + label12 = new System.Windows.Forms.Label(); + CompDeclComboBox = new System.Windows.Forms.ComboBox(); + label18 = new System.Windows.Forms.Label(); + label13 = new System.Windows.Forms.Label(); + label15 = new System.Windows.Forms.Label(); + CompTaskComboBox = new System.Windows.Forms.ComboBox(); + label17 = new System.Windows.Forms.Label(); + CompLowrComboBox = new System.Windows.Forms.ComboBox(); + CompHandComboBox = new System.Windows.Forms.ComboBox(); + CompAccsComboBox = new System.Windows.Forms.ComboBox(); + label16 = new System.Windows.Forms.Label(); + CompFeetComboBox = new System.Windows.Forms.ComboBox(); + CompTeefComboBox = new System.Windows.Forms.ComboBox(); + CompBerdTexture = new System.Windows.Forms.ComboBox(); + CompHeadTexture = new System.Windows.Forms.ComboBox(); + CompHairTexture = new System.Windows.Forms.ComboBox(); + CompUpprTexture = new System.Windows.Forms.ComboBox(); + CompLowrTexture = new System.Windows.Forms.ComboBox(); + CompHandTexture = new System.Windows.Forms.ComboBox(); + CompFeetTexture = new System.Windows.Forms.ComboBox(); + CompTeefTexture = new System.Windows.Forms.ComboBox(); + CompAccsTexture = new System.Windows.Forms.ComboBox(); + CompTaskTexture = new System.Windows.Forms.ComboBox(); + CompDeclTexture = new System.Windows.Forms.ComboBox(); + CompJbibTexture = new System.Windows.Forms.ComboBox(); + label24 = new System.Windows.Forms.Label(); + YmtNameComboBox = new System.Windows.Forms.ComboBox(); + EnableRootMotionCheckBox = new System.Windows.Forms.CheckBox(); + label23 = new System.Windows.Forms.Label(); + label22 = new System.Windows.Forms.Label(); + ClipComboBox = new System.Windows.Forms.ComboBox(); + label21 = new System.Windows.Forms.Label(); + ClipDictComboBox = new System.Windows.Forms.ComboBox(); + label4 = new System.Windows.Forms.Label(); + ToolsTabControl = new System.Windows.Forms.TabControl(); + ToolsPanel = new System.Windows.Forms.Panel(); + ConsolePanel.SuspendLayout(); + ToolsOptionsTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)TimeOfDayTrackBar).BeginInit(); + ToolsDetailsTabPage.SuspendLayout(); + ToolsTexturesTabPage.SuspendLayout(); + StatusStrip.SuspendLayout(); + ToolsModelsTabPage.SuspendLayout(); + ToolsPedTabPage.SuspendLayout(); + tableLayoutPanel1.SuspendLayout(); + ToolsTabControl.SuspendLayout(); + ToolsPanel.SuspendLayout(); + SuspendLayout(); // // ConsoleTextBox // - this.ConsoleTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ConsoleTextBox.Location = new System.Drawing.Point(3, 3); - this.ConsoleTextBox.Multiline = true; - this.ConsoleTextBox.Name = "ConsoleTextBox"; - this.ConsoleTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.ConsoleTextBox.Size = new System.Drawing.Size(695, 95); - this.ConsoleTextBox.TabIndex = 0; + ConsoleTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ConsoleTextBox.Location = new System.Drawing.Point(4, 3); + ConsoleTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ConsoleTextBox.Multiline = true; + ConsoleTextBox.Name = "ConsoleTextBox"; + ConsoleTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + ConsoleTextBox.Size = new System.Drawing.Size(786, 109); + ConsoleTextBox.TabIndex = 0; // // ToolsPanelShowButton // - this.ToolsPanelShowButton.Location = new System.Drawing.Point(15, 15); - this.ToolsPanelShowButton.Name = "ToolsPanelShowButton"; - this.ToolsPanelShowButton.Size = new System.Drawing.Size(30, 23); - this.ToolsPanelShowButton.TabIndex = 8; - this.ToolsPanelShowButton.Text = ">>"; - this.ToolsPanelShowButton.UseVisualStyleBackColor = true; - this.ToolsPanelShowButton.Click += new System.EventHandler(this.ToolsPanelShowButton_Click); + ToolsPanelShowButton.Location = new System.Drawing.Point(18, 17); + ToolsPanelShowButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsPanelShowButton.Name = "ToolsPanelShowButton"; + ToolsPanelShowButton.Size = new System.Drawing.Size(35, 27); + ToolsPanelShowButton.TabIndex = 8; + ToolsPanelShowButton.Text = ">>"; + ToolsPanelShowButton.UseVisualStyleBackColor = true; + ToolsPanelShowButton.Click += ToolsPanelShowButton_Click; // // ToolsPanelHideButton // - this.ToolsPanelHideButton.Location = new System.Drawing.Point(3, 3); - this.ToolsPanelHideButton.Name = "ToolsPanelHideButton"; - this.ToolsPanelHideButton.Size = new System.Drawing.Size(30, 23); - this.ToolsPanelHideButton.TabIndex = 0; - this.ToolsPanelHideButton.Text = "<<"; - this.ToolsPanelHideButton.UseVisualStyleBackColor = true; - this.ToolsPanelHideButton.Click += new System.EventHandler(this.ToolsPanelHideButton_Click); + ToolsPanelHideButton.Location = new System.Drawing.Point(4, 3); + ToolsPanelHideButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsPanelHideButton.Name = "ToolsPanelHideButton"; + ToolsPanelHideButton.Size = new System.Drawing.Size(35, 27); + ToolsPanelHideButton.TabIndex = 0; + ToolsPanelHideButton.Text = "<<"; + ToolsPanelHideButton.UseVisualStyleBackColor = true; + ToolsPanelHideButton.Click += ToolsPanelHideButton_Click; // // ToolsDragPanel // - this.ToolsDragPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.ToolsDragPanel.Cursor = System.Windows.Forms.Cursors.VSplit; - this.ToolsDragPanel.Location = new System.Drawing.Point(249, 0); - this.ToolsDragPanel.Name = "ToolsDragPanel"; - this.ToolsDragPanel.Size = new System.Drawing.Size(4, 666); - this.ToolsDragPanel.TabIndex = 17; - this.ToolsDragPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ToolsDragPanel_MouseDown); - this.ToolsDragPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ToolsDragPanel_MouseMove); - this.ToolsDragPanel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ToolsDragPanel_MouseUp); + ToolsDragPanel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + ToolsDragPanel.Cursor = System.Windows.Forms.Cursors.VSplit; + ToolsDragPanel.Location = new System.Drawing.Point(318, 0); + ToolsDragPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsDragPanel.Name = "ToolsDragPanel"; + ToolsDragPanel.Size = new System.Drawing.Size(5, 768); + ToolsDragPanel.TabIndex = 17; + ToolsDragPanel.MouseDown += ToolsDragPanel_MouseDown; + ToolsDragPanel.MouseMove += ToolsDragPanel_MouseMove; + ToolsDragPanel.MouseUp += ToolsDragPanel_MouseUp; // // ConsolePanel // - this.ConsolePanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ConsolePanel.BackColor = System.Drawing.SystemColors.Control; - this.ConsolePanel.Controls.Add(this.ConsoleTextBox); - this.ConsolePanel.Location = new System.Drawing.Point(271, 577); - this.ConsolePanel.Name = "ConsolePanel"; - this.ConsolePanel.Size = new System.Drawing.Size(701, 101); - this.ConsolePanel.TabIndex = 9; - this.ConsolePanel.Visible = false; + ConsolePanel.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ConsolePanel.BackColor = System.Drawing.SystemColors.Control; + ConsolePanel.Controls.Add(ConsoleTextBox); + ConsolePanel.Location = new System.Drawing.Point(340, 666); + ConsolePanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ConsolePanel.Name = "ConsolePanel"; + ConsolePanel.Size = new System.Drawing.Size(794, 117); + ConsolePanel.TabIndex = 9; + ConsolePanel.Visible = false; // // HDTexturesCheckBox // - this.HDTexturesCheckBox.AutoSize = true; - this.HDTexturesCheckBox.Checked = true; - this.HDTexturesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.HDTexturesCheckBox.Location = new System.Drawing.Point(19, 242); - this.HDTexturesCheckBox.Name = "HDTexturesCheckBox"; - this.HDTexturesCheckBox.Size = new System.Drawing.Size(82, 17); - this.HDTexturesCheckBox.TabIndex = 10; - this.HDTexturesCheckBox.Text = "HD textures"; - this.HDTexturesCheckBox.UseVisualStyleBackColor = true; - this.HDTexturesCheckBox.CheckedChanged += new System.EventHandler(this.HDTexturesCheckBox_CheckedChanged); + HDTexturesCheckBox.AutoSize = true; + HDTexturesCheckBox.Checked = true; + HDTexturesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + HDTexturesCheckBox.Location = new System.Drawing.Point(22, 279); + HDTexturesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + HDTexturesCheckBox.Name = "HDTexturesCheckBox"; + HDTexturesCheckBox.Size = new System.Drawing.Size(88, 19); + HDTexturesCheckBox.TabIndex = 10; + HDTexturesCheckBox.Text = "HD textures"; + HDTexturesCheckBox.UseVisualStyleBackColor = true; + HDTexturesCheckBox.CheckedChanged += HDTexturesCheckBox_CheckedChanged; // // SkeletonsCheckBox // - this.SkeletonsCheckBox.AutoSize = true; - this.SkeletonsCheckBox.Location = new System.Drawing.Point(19, 444); - this.SkeletonsCheckBox.Name = "SkeletonsCheckBox"; - this.SkeletonsCheckBox.Size = new System.Drawing.Size(103, 17); - this.SkeletonsCheckBox.TabIndex = 22; - this.SkeletonsCheckBox.Text = "Show Skeletons"; - this.SkeletonsCheckBox.UseVisualStyleBackColor = true; - this.SkeletonsCheckBox.CheckedChanged += new System.EventHandler(this.SkeletonsCheckBox_CheckedChanged); + SkeletonsCheckBox.AutoSize = true; + SkeletonsCheckBox.Location = new System.Drawing.Point(22, 512); + SkeletonsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SkeletonsCheckBox.Name = "SkeletonsCheckBox"; + SkeletonsCheckBox.Size = new System.Drawing.Size(108, 19); + SkeletonsCheckBox.TabIndex = 22; + SkeletonsCheckBox.Text = "Show Skeletons"; + SkeletonsCheckBox.UseVisualStyleBackColor = true; + SkeletonsCheckBox.CheckedChanged += SkeletonsCheckBox_CheckedChanged; // // TimeOfDayLabel // - this.TimeOfDayLabel.AutoSize = true; - this.TimeOfDayLabel.Location = new System.Drawing.Point(78, 109); - this.TimeOfDayLabel.Name = "TimeOfDayLabel"; - this.TimeOfDayLabel.Size = new System.Drawing.Size(34, 13); - this.TimeOfDayLabel.TabIndex = 5; - this.TimeOfDayLabel.Text = "12:00"; + TimeOfDayLabel.AutoSize = true; + TimeOfDayLabel.Location = new System.Drawing.Point(91, 126); + TimeOfDayLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + TimeOfDayLabel.Name = "TimeOfDayLabel"; + TimeOfDayLabel.Size = new System.Drawing.Size(34, 15); + TimeOfDayLabel.TabIndex = 5; + TimeOfDayLabel.Text = "12:00"; // // ToolsOptionsTabPage // - this.ToolsOptionsTabPage.Controls.Add(this.HDTexturesCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.SkeletonsCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.TimeOfDayLabel); - this.ToolsOptionsTabPage.Controls.Add(this.label19); - this.ToolsOptionsTabPage.Controls.Add(this.TimeOfDayTrackBar); - this.ToolsOptionsTabPage.Controls.Add(this.ControlLightDirCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.ShowCollisionMeshesCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.GridCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.GridCountComboBox); - this.ToolsOptionsTabPage.Controls.Add(this.label2); - this.ToolsOptionsTabPage.Controls.Add(this.GridSizeComboBox); - this.ToolsOptionsTabPage.Controls.Add(this.label1); - this.ToolsOptionsTabPage.Controls.Add(this.StatusBarCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.ErrorConsoleCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.HDRRenderingCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.SkydomeCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.ShadowsCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.WireframeCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.RenderModeComboBox); - this.ToolsOptionsTabPage.Controls.Add(this.label11); - this.ToolsOptionsTabPage.Controls.Add(this.TextureSamplerComboBox); - this.ToolsOptionsTabPage.Controls.Add(this.TextureCoordsComboBox); - this.ToolsOptionsTabPage.Controls.Add(this.label10); - this.ToolsOptionsTabPage.Controls.Add(this.AnisotropicFilteringCheckBox); - this.ToolsOptionsTabPage.Controls.Add(this.label14); - this.ToolsOptionsTabPage.Location = new System.Drawing.Point(4, 22); - this.ToolsOptionsTabPage.Name = "ToolsOptionsTabPage"; - this.ToolsOptionsTabPage.Size = new System.Drawing.Size(239, 607); - this.ToolsOptionsTabPage.TabIndex = 3; - this.ToolsOptionsTabPage.Text = "Options"; - this.ToolsOptionsTabPage.UseVisualStyleBackColor = true; + ToolsOptionsTabPage.Controls.Add(HDTexturesCheckBox); + ToolsOptionsTabPage.Controls.Add(SkeletonsCheckBox); + ToolsOptionsTabPage.Controls.Add(TimeOfDayLabel); + ToolsOptionsTabPage.Controls.Add(label19); + ToolsOptionsTabPage.Controls.Add(TimeOfDayTrackBar); + ToolsOptionsTabPage.Controls.Add(ControlLightDirCheckBox); + ToolsOptionsTabPage.Controls.Add(ShowCollisionMeshesCheckBox); + ToolsOptionsTabPage.Controls.Add(GridCheckBox); + ToolsOptionsTabPage.Controls.Add(GridCountComboBox); + ToolsOptionsTabPage.Controls.Add(label2); + ToolsOptionsTabPage.Controls.Add(GridSizeComboBox); + ToolsOptionsTabPage.Controls.Add(label1); + ToolsOptionsTabPage.Controls.Add(StatusBarCheckBox); + ToolsOptionsTabPage.Controls.Add(ErrorConsoleCheckBox); + ToolsOptionsTabPage.Controls.Add(HDRRenderingCheckBox); + ToolsOptionsTabPage.Controls.Add(SkydomeCheckBox); + ToolsOptionsTabPage.Controls.Add(ShadowsCheckBox); + ToolsOptionsTabPage.Controls.Add(WireframeCheckBox); + ToolsOptionsTabPage.Controls.Add(RenderModeComboBox); + ToolsOptionsTabPage.Controls.Add(label11); + ToolsOptionsTabPage.Controls.Add(TextureSamplerComboBox); + ToolsOptionsTabPage.Controls.Add(TextureCoordsComboBox); + ToolsOptionsTabPage.Controls.Add(label10); + ToolsOptionsTabPage.Controls.Add(AnisotropicFilteringCheckBox); + ToolsOptionsTabPage.Controls.Add(label14); + ToolsOptionsTabPage.Location = new System.Drawing.Point(4, 24); + ToolsOptionsTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsOptionsTabPage.Name = "ToolsOptionsTabPage"; + ToolsOptionsTabPage.Size = new System.Drawing.Size(308, 702); + ToolsOptionsTabPage.TabIndex = 3; + ToolsOptionsTabPage.Text = "Options"; + ToolsOptionsTabPage.UseVisualStyleBackColor = true; // // label19 // - this.label19.AutoSize = true; - this.label19.Location = new System.Drawing.Point(7, 109); - this.label19.Name = "label19"; - this.label19.Size = new System.Drawing.Size(65, 13); - this.label19.TabIndex = 4; - this.label19.Text = "Time of day:"; + label19.AutoSize = true; + label19.Location = new System.Drawing.Point(8, 126); + label19.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label19.Name = "label19"; + label19.Size = new System.Drawing.Size(72, 15); + label19.TabIndex = 4; + label19.Text = "Time of day:"; // // TimeOfDayTrackBar // - this.TimeOfDayTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TimeOfDayTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.TimeOfDayTrackBar.LargeChange = 60; - this.TimeOfDayTrackBar.Location = new System.Drawing.Point(9, 125); - this.TimeOfDayTrackBar.Maximum = 1440; - this.TimeOfDayTrackBar.Name = "TimeOfDayTrackBar"; - this.TimeOfDayTrackBar.Size = new System.Drawing.Size(222, 45); - this.TimeOfDayTrackBar.TabIndex = 6; - this.TimeOfDayTrackBar.TickFrequency = 60; - this.TimeOfDayTrackBar.Value = 720; - this.TimeOfDayTrackBar.Scroll += new System.EventHandler(this.TimeOfDayTrackBar_Scroll); + TimeOfDayTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + TimeOfDayTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + TimeOfDayTrackBar.LargeChange = 60; + TimeOfDayTrackBar.Location = new System.Drawing.Point(10, 144); + TimeOfDayTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimeOfDayTrackBar.Maximum = 1440; + TimeOfDayTrackBar.Name = "TimeOfDayTrackBar"; + TimeOfDayTrackBar.Size = new System.Drawing.Size(259, 45); + TimeOfDayTrackBar.TabIndex = 6; + TimeOfDayTrackBar.TickFrequency = 60; + TimeOfDayTrackBar.Value = 720; + TimeOfDayTrackBar.Scroll += TimeOfDayTrackBar_Scroll; // // ControlLightDirCheckBox // - this.ControlLightDirCheckBox.AutoSize = true; - this.ControlLightDirCheckBox.Location = new System.Drawing.Point(19, 83); - this.ControlLightDirCheckBox.Name = "ControlLightDirCheckBox"; - this.ControlLightDirCheckBox.Size = new System.Drawing.Size(124, 17); - this.ControlLightDirCheckBox.TabIndex = 3; - this.ControlLightDirCheckBox.Text = "Control light direction"; - this.ControlLightDirCheckBox.UseVisualStyleBackColor = true; - this.ControlLightDirCheckBox.CheckedChanged += new System.EventHandler(this.ControlLightDirCheckBox_CheckedChanged); + ControlLightDirCheckBox.AutoSize = true; + ControlLightDirCheckBox.Location = new System.Drawing.Point(22, 96); + ControlLightDirCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ControlLightDirCheckBox.Name = "ControlLightDirCheckBox"; + ControlLightDirCheckBox.Size = new System.Drawing.Size(143, 19); + ControlLightDirCheckBox.TabIndex = 3; + ControlLightDirCheckBox.Text = "Control light direction"; + ControlLightDirCheckBox.UseVisualStyleBackColor = true; + ControlLightDirCheckBox.CheckedChanged += ControlLightDirCheckBox_CheckedChanged; // // ShowCollisionMeshesCheckBox // - this.ShowCollisionMeshesCheckBox.AutoSize = true; - this.ShowCollisionMeshesCheckBox.Location = new System.Drawing.Point(19, 173); - this.ShowCollisionMeshesCheckBox.Name = "ShowCollisionMeshesCheckBox"; - this.ShowCollisionMeshesCheckBox.Size = new System.Drawing.Size(132, 17); - this.ShowCollisionMeshesCheckBox.TabIndex = 7; - this.ShowCollisionMeshesCheckBox.Text = "Show collision meshes"; - this.ShowCollisionMeshesCheckBox.UseVisualStyleBackColor = true; - this.ShowCollisionMeshesCheckBox.CheckedChanged += new System.EventHandler(this.ShowCollisionMeshesCheckBox_CheckedChanged); + ShowCollisionMeshesCheckBox.AutoSize = true; + ShowCollisionMeshesCheckBox.Location = new System.Drawing.Point(22, 200); + ShowCollisionMeshesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ShowCollisionMeshesCheckBox.Name = "ShowCollisionMeshesCheckBox"; + ShowCollisionMeshesCheckBox.Size = new System.Drawing.Size(145, 19); + ShowCollisionMeshesCheckBox.TabIndex = 7; + ShowCollisionMeshesCheckBox.Text = "Show collision meshes"; + ShowCollisionMeshesCheckBox.UseVisualStyleBackColor = true; + ShowCollisionMeshesCheckBox.CheckedChanged += ShowCollisionMeshesCheckBox_CheckedChanged; // // GridCheckBox // - this.GridCheckBox.AutoSize = true; - this.GridCheckBox.Location = new System.Drawing.Point(19, 364); - this.GridCheckBox.Name = "GridCheckBox"; - this.GridCheckBox.Size = new System.Drawing.Size(45, 17); - this.GridCheckBox.TabIndex = 17; - this.GridCheckBox.Text = "Grid"; - this.GridCheckBox.UseVisualStyleBackColor = true; - this.GridCheckBox.CheckedChanged += new System.EventHandler(this.GridCheckBox_CheckedChanged); + GridCheckBox.AutoSize = true; + GridCheckBox.Location = new System.Drawing.Point(22, 420); + GridCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + GridCheckBox.Name = "GridCheckBox"; + GridCheckBox.Size = new System.Drawing.Size(48, 19); + GridCheckBox.TabIndex = 17; + GridCheckBox.Text = "Grid"; + GridCheckBox.UseVisualStyleBackColor = true; + GridCheckBox.CheckedChanged += GridCheckBox_CheckedChanged; // // GridCountComboBox // - this.GridCountComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.GridCountComboBox.FormattingEnabled = true; - this.GridCountComboBox.Items.AddRange(new object[] { - "20", - "40", - "60", - "100"}); - this.GridCountComboBox.Location = new System.Drawing.Point(83, 411); - this.GridCountComboBox.Name = "GridCountComboBox"; - this.GridCountComboBox.Size = new System.Drawing.Size(114, 21); - this.GridCountComboBox.TabIndex = 21; - this.GridCountComboBox.SelectedIndexChanged += new System.EventHandler(this.GridCountComboBox_SelectedIndexChanged); + GridCountComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + GridCountComboBox.FormattingEnabled = true; + GridCountComboBox.Items.AddRange(new object[] { "20", "40", "60", "100" }); + GridCountComboBox.Location = new System.Drawing.Point(97, 474); + GridCountComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + GridCountComboBox.Name = "GridCountComboBox"; + GridCountComboBox.Size = new System.Drawing.Size(132, 23); + GridCountComboBox.TabIndex = 21; + GridCountComboBox.SelectedIndexChanged += GridCountComboBox_SelectedIndexChanged; // // label2 // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(7, 414); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(59, 13); - this.label2.TabIndex = 20; - this.label2.Text = "Grid count:"; + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(8, 478); + label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(66, 15); + label2.TabIndex = 20; + label2.Text = "Grid count:"; // // GridSizeComboBox // - this.GridSizeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.GridSizeComboBox.FormattingEnabled = true; - this.GridSizeComboBox.Items.AddRange(new object[] { - "0.1", - "1.0", - "10", - "100"}); - this.GridSizeComboBox.Location = new System.Drawing.Point(83, 384); - this.GridSizeComboBox.Name = "GridSizeComboBox"; - this.GridSizeComboBox.Size = new System.Drawing.Size(114, 21); - this.GridSizeComboBox.TabIndex = 19; - this.GridSizeComboBox.SelectedIndexChanged += new System.EventHandler(this.GridSizeComboBox_SelectedIndexChanged); + GridSizeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + GridSizeComboBox.FormattingEnabled = true; + GridSizeComboBox.Items.AddRange(new object[] { "0.1", "1.0", "10", "100" }); + GridSizeComboBox.Location = new System.Drawing.Point(97, 443); + GridSizeComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + GridSizeComboBox.Name = "GridSizeComboBox"; + GridSizeComboBox.Size = new System.Drawing.Size(132, 23); + GridSizeComboBox.TabIndex = 19; + GridSizeComboBox.SelectedIndexChanged += GridSizeComboBox_SelectedIndexChanged; // // label1 // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(7, 387); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(70, 13); - this.label1.TabIndex = 18; - this.label1.Text = "Grid unit size:"; + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(8, 447); + label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(78, 15); + label1.TabIndex = 18; + label1.Text = "Grid unit size:"; // // StatusBarCheckBox // - this.StatusBarCheckBox.AutoSize = true; - this.StatusBarCheckBox.Checked = true; - this.StatusBarCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.StatusBarCheckBox.Location = new System.Drawing.Point(19, 480); - this.StatusBarCheckBox.Name = "StatusBarCheckBox"; - this.StatusBarCheckBox.Size = new System.Drawing.Size(74, 17); - this.StatusBarCheckBox.TabIndex = 23; - this.StatusBarCheckBox.Text = "Status bar"; - this.StatusBarCheckBox.UseVisualStyleBackColor = true; - this.StatusBarCheckBox.CheckedChanged += new System.EventHandler(this.StatusBarCheckBox_CheckedChanged); + StatusBarCheckBox.AutoSize = true; + StatusBarCheckBox.Checked = true; + StatusBarCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + StatusBarCheckBox.Location = new System.Drawing.Point(22, 554); + StatusBarCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + StatusBarCheckBox.Name = "StatusBarCheckBox"; + StatusBarCheckBox.Size = new System.Drawing.Size(78, 19); + StatusBarCheckBox.TabIndex = 23; + StatusBarCheckBox.Text = "Status bar"; + StatusBarCheckBox.UseVisualStyleBackColor = true; + StatusBarCheckBox.CheckedChanged += StatusBarCheckBox_CheckedChanged; // // ErrorConsoleCheckBox // - this.ErrorConsoleCheckBox.AutoSize = true; - this.ErrorConsoleCheckBox.Location = new System.Drawing.Point(105, 480); - this.ErrorConsoleCheckBox.Name = "ErrorConsoleCheckBox"; - this.ErrorConsoleCheckBox.Size = new System.Drawing.Size(88, 17); - this.ErrorConsoleCheckBox.TabIndex = 24; - this.ErrorConsoleCheckBox.Text = "Error console"; - this.ErrorConsoleCheckBox.UseVisualStyleBackColor = true; - this.ErrorConsoleCheckBox.CheckedChanged += new System.EventHandler(this.ErrorConsoleCheckBox_CheckedChanged); + ErrorConsoleCheckBox.AutoSize = true; + ErrorConsoleCheckBox.Location = new System.Drawing.Point(122, 554); + ErrorConsoleCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ErrorConsoleCheckBox.Name = "ErrorConsoleCheckBox"; + ErrorConsoleCheckBox.Size = new System.Drawing.Size(95, 19); + ErrorConsoleCheckBox.TabIndex = 24; + ErrorConsoleCheckBox.Text = "Error console"; + ErrorConsoleCheckBox.UseVisualStyleBackColor = true; + ErrorConsoleCheckBox.CheckedChanged += ErrorConsoleCheckBox_CheckedChanged; // // HDRRenderingCheckBox // - this.HDRRenderingCheckBox.AutoSize = true; - this.HDRRenderingCheckBox.Checked = true; - this.HDRRenderingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.HDRRenderingCheckBox.Location = new System.Drawing.Point(19, 14); - this.HDRRenderingCheckBox.Name = "HDRRenderingCheckBox"; - this.HDRRenderingCheckBox.Size = new System.Drawing.Size(97, 17); - this.HDRRenderingCheckBox.TabIndex = 0; - this.HDRRenderingCheckBox.Text = "HDR rendering"; - this.HDRRenderingCheckBox.UseVisualStyleBackColor = true; - this.HDRRenderingCheckBox.CheckedChanged += new System.EventHandler(this.HDRRenderingCheckBox_CheckedChanged); + HDRRenderingCheckBox.AutoSize = true; + HDRRenderingCheckBox.Checked = true; + HDRRenderingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + HDRRenderingCheckBox.Location = new System.Drawing.Point(22, 16); + HDRRenderingCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + HDRRenderingCheckBox.Name = "HDRRenderingCheckBox"; + HDRRenderingCheckBox.Size = new System.Drawing.Size(104, 19); + HDRRenderingCheckBox.TabIndex = 0; + HDRRenderingCheckBox.Text = "HDR rendering"; + HDRRenderingCheckBox.UseVisualStyleBackColor = true; + HDRRenderingCheckBox.CheckedChanged += HDRRenderingCheckBox_CheckedChanged; // // SkydomeCheckBox // - this.SkydomeCheckBox.AutoSize = true; - this.SkydomeCheckBox.Location = new System.Drawing.Point(19, 60); - this.SkydomeCheckBox.Name = "SkydomeCheckBox"; - this.SkydomeCheckBox.Size = new System.Drawing.Size(70, 17); - this.SkydomeCheckBox.TabIndex = 2; - this.SkydomeCheckBox.Text = "Skydome"; - this.SkydomeCheckBox.UseVisualStyleBackColor = true; - this.SkydomeCheckBox.CheckedChanged += new System.EventHandler(this.SkydomeCheckBox_CheckedChanged); + SkydomeCheckBox.AutoSize = true; + SkydomeCheckBox.Location = new System.Drawing.Point(22, 69); + SkydomeCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SkydomeCheckBox.Name = "SkydomeCheckBox"; + SkydomeCheckBox.Size = new System.Drawing.Size(75, 19); + SkydomeCheckBox.TabIndex = 2; + SkydomeCheckBox.Text = "Skydome"; + SkydomeCheckBox.UseVisualStyleBackColor = true; + SkydomeCheckBox.CheckedChanged += SkydomeCheckBox_CheckedChanged; // // ShadowsCheckBox // - this.ShadowsCheckBox.AutoSize = true; - this.ShadowsCheckBox.Checked = true; - this.ShadowsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.ShadowsCheckBox.Location = new System.Drawing.Point(19, 37); - this.ShadowsCheckBox.Name = "ShadowsCheckBox"; - this.ShadowsCheckBox.Size = new System.Drawing.Size(70, 17); - this.ShadowsCheckBox.TabIndex = 1; - this.ShadowsCheckBox.Text = "Shadows"; - this.ShadowsCheckBox.UseVisualStyleBackColor = true; - this.ShadowsCheckBox.CheckedChanged += new System.EventHandler(this.ShadowsCheckBox_CheckedChanged); + ShadowsCheckBox.AutoSize = true; + ShadowsCheckBox.Checked = true; + ShadowsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + ShadowsCheckBox.Location = new System.Drawing.Point(22, 43); + ShadowsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ShadowsCheckBox.Name = "ShadowsCheckBox"; + ShadowsCheckBox.Size = new System.Drawing.Size(73, 19); + ShadowsCheckBox.TabIndex = 1; + ShadowsCheckBox.Text = "Shadows"; + ShadowsCheckBox.UseVisualStyleBackColor = true; + ShadowsCheckBox.CheckedChanged += ShadowsCheckBox_CheckedChanged; // // WireframeCheckBox // - this.WireframeCheckBox.AutoSize = true; - this.WireframeCheckBox.Location = new System.Drawing.Point(19, 196); - this.WireframeCheckBox.Name = "WireframeCheckBox"; - this.WireframeCheckBox.Size = new System.Drawing.Size(74, 17); - this.WireframeCheckBox.TabIndex = 8; - this.WireframeCheckBox.Text = "Wireframe"; - this.WireframeCheckBox.UseVisualStyleBackColor = true; - this.WireframeCheckBox.CheckedChanged += new System.EventHandler(this.WireframeCheckBox_CheckedChanged); + WireframeCheckBox.AutoSize = true; + WireframeCheckBox.Location = new System.Drawing.Point(22, 226); + WireframeCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WireframeCheckBox.Name = "WireframeCheckBox"; + WireframeCheckBox.Size = new System.Drawing.Size(81, 19); + WireframeCheckBox.TabIndex = 8; + WireframeCheckBox.Text = "Wireframe"; + WireframeCheckBox.UseVisualStyleBackColor = true; + WireframeCheckBox.CheckedChanged += WireframeCheckBox_CheckedChanged; // // RenderModeComboBox // - this.RenderModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.RenderModeComboBox.FormattingEnabled = true; - this.RenderModeComboBox.Items.AddRange(new object[] { - "Default", - "Single texture", - "Vertex normals", - "Vertex tangents", - "Vertex colour 1", - "Vertex colour 2", - "Texture coord 1", - "Texture coord 2", - "Texture coord 3"}); - this.RenderModeComboBox.Location = new System.Drawing.Point(83, 274); - this.RenderModeComboBox.Name = "RenderModeComboBox"; - this.RenderModeComboBox.Size = new System.Drawing.Size(114, 21); - this.RenderModeComboBox.TabIndex = 12; - this.RenderModeComboBox.SelectedIndexChanged += new System.EventHandler(this.RenderModeComboBox_SelectedIndexChanged); + RenderModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + RenderModeComboBox.FormattingEnabled = true; + RenderModeComboBox.Items.AddRange(new object[] { "Default", "Single texture", "Vertex normals", "Vertex tangents", "Vertex colour 1", "Vertex colour 2", "Texture coord 1", "Texture coord 2", "Texture coord 3" }); + RenderModeComboBox.Location = new System.Drawing.Point(97, 316); + RenderModeComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + RenderModeComboBox.Name = "RenderModeComboBox"; + RenderModeComboBox.Size = new System.Drawing.Size(132, 23); + RenderModeComboBox.TabIndex = 12; + RenderModeComboBox.SelectedIndexChanged += RenderModeComboBox_SelectedIndexChanged; // // label11 // - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(7, 304); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(67, 13); - this.label11.TabIndex = 13; - this.label11.Text = "Tex sampler:"; + label11.AutoSize = true; + label11.Location = new System.Drawing.Point(8, 351); + label11.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label11.Name = "label11"; + label11.Size = new System.Drawing.Size(72, 15); + label11.TabIndex = 13; + label11.Text = "Tex sampler:"; // // TextureSamplerComboBox // - this.TextureSamplerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.TextureSamplerComboBox.Enabled = false; - this.TextureSamplerComboBox.FormattingEnabled = true; - this.TextureSamplerComboBox.Location = new System.Drawing.Point(83, 301); - this.TextureSamplerComboBox.Name = "TextureSamplerComboBox"; - this.TextureSamplerComboBox.Size = new System.Drawing.Size(114, 21); - this.TextureSamplerComboBox.TabIndex = 14; - this.TextureSamplerComboBox.SelectedIndexChanged += new System.EventHandler(this.TextureSamplerComboBox_SelectedIndexChanged); + TextureSamplerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + TextureSamplerComboBox.Enabled = false; + TextureSamplerComboBox.FormattingEnabled = true; + TextureSamplerComboBox.Location = new System.Drawing.Point(97, 347); + TextureSamplerComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TextureSamplerComboBox.Name = "TextureSamplerComboBox"; + TextureSamplerComboBox.Size = new System.Drawing.Size(132, 23); + TextureSamplerComboBox.TabIndex = 14; + TextureSamplerComboBox.SelectedIndexChanged += TextureSamplerComboBox_SelectedIndexChanged; // // TextureCoordsComboBox // - this.TextureCoordsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.TextureCoordsComboBox.Enabled = false; - this.TextureCoordsComboBox.FormattingEnabled = true; - this.TextureCoordsComboBox.Items.AddRange(new object[] { - "Texture coord 1", - "Texture coord 2", - "Texture coord 3"}); - this.TextureCoordsComboBox.Location = new System.Drawing.Point(83, 328); - this.TextureCoordsComboBox.Name = "TextureCoordsComboBox"; - this.TextureCoordsComboBox.Size = new System.Drawing.Size(114, 21); - this.TextureCoordsComboBox.TabIndex = 16; - this.TextureCoordsComboBox.SelectedIndexChanged += new System.EventHandler(this.TextureCoordsComboBox_SelectedIndexChanged); + TextureCoordsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + TextureCoordsComboBox.Enabled = false; + TextureCoordsComboBox.FormattingEnabled = true; + TextureCoordsComboBox.Items.AddRange(new object[] { "Texture coord 1", "Texture coord 2", "Texture coord 3" }); + TextureCoordsComboBox.Location = new System.Drawing.Point(97, 378); + TextureCoordsComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TextureCoordsComboBox.Name = "TextureCoordsComboBox"; + TextureCoordsComboBox.Size = new System.Drawing.Size(132, 23); + TextureCoordsComboBox.TabIndex = 16; + TextureCoordsComboBox.SelectedIndexChanged += TextureCoordsComboBox_SelectedIndexChanged; // // label10 // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(7, 277); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(74, 13); - this.label10.TabIndex = 11; - this.label10.Text = "Render mode:"; + label10.AutoSize = true; + label10.Location = new System.Drawing.Point(8, 320); + label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label10.Name = "label10"; + label10.Size = new System.Drawing.Size(81, 15); + label10.TabIndex = 11; + label10.Text = "Render mode:"; // // AnisotropicFilteringCheckBox // - this.AnisotropicFilteringCheckBox.AutoSize = true; - this.AnisotropicFilteringCheckBox.Checked = true; - this.AnisotropicFilteringCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.AnisotropicFilteringCheckBox.Location = new System.Drawing.Point(19, 219); - this.AnisotropicFilteringCheckBox.Name = "AnisotropicFilteringCheckBox"; - this.AnisotropicFilteringCheckBox.Size = new System.Drawing.Size(114, 17); - this.AnisotropicFilteringCheckBox.TabIndex = 9; - this.AnisotropicFilteringCheckBox.Text = "Anisotropic filtering"; - this.AnisotropicFilteringCheckBox.UseVisualStyleBackColor = true; - this.AnisotropicFilteringCheckBox.CheckedChanged += new System.EventHandler(this.AnisotropicFilteringCheckBox_CheckedChanged); + AnisotropicFilteringCheckBox.AutoSize = true; + AnisotropicFilteringCheckBox.Checked = true; + AnisotropicFilteringCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + AnisotropicFilteringCheckBox.Location = new System.Drawing.Point(22, 253); + AnisotropicFilteringCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AnisotropicFilteringCheckBox.Name = "AnisotropicFilteringCheckBox"; + AnisotropicFilteringCheckBox.Size = new System.Drawing.Size(131, 19); + AnisotropicFilteringCheckBox.TabIndex = 9; + AnisotropicFilteringCheckBox.Text = "Anisotropic filtering"; + AnisotropicFilteringCheckBox.UseVisualStyleBackColor = true; + AnisotropicFilteringCheckBox.CheckedChanged += AnisotropicFilteringCheckBox_CheckedChanged; // // label14 // - this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(7, 331); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(63, 13); - this.label14.TabIndex = 15; - this.label14.Text = "Tex coords:"; + label14.AutoSize = true; + label14.Location = new System.Drawing.Point(8, 382); + label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label14.Name = "label14"; + label14.Size = new System.Drawing.Size(66, 15); + label14.TabIndex = 15; + label14.Text = "Tex coords:"; // // DetailsPropertyGrid // - this.DetailsPropertyGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.DetailsPropertyGrid.HelpVisible = false; - this.DetailsPropertyGrid.Location = new System.Drawing.Point(0, 3); - this.DetailsPropertyGrid.Name = "DetailsPropertyGrid"; - this.DetailsPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; - this.DetailsPropertyGrid.ReadOnly = true; - this.DetailsPropertyGrid.Size = new System.Drawing.Size(239, 604); - this.DetailsPropertyGrid.TabIndex = 1; - this.DetailsPropertyGrid.ToolbarVisible = false; + DetailsPropertyGrid.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + DetailsPropertyGrid.HelpVisible = false; + DetailsPropertyGrid.Location = new System.Drawing.Point(0, 3); + DetailsPropertyGrid.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + DetailsPropertyGrid.Name = "DetailsPropertyGrid"; + DetailsPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; + DetailsPropertyGrid.ReadOnly = true; + DetailsPropertyGrid.Size = new System.Drawing.Size(279, 697); + DetailsPropertyGrid.TabIndex = 1; + DetailsPropertyGrid.ToolbarVisible = false; // // ToolsDetailsTabPage // - this.ToolsDetailsTabPage.Controls.Add(this.DetailsPropertyGrid); - this.ToolsDetailsTabPage.Location = new System.Drawing.Point(4, 22); - this.ToolsDetailsTabPage.Name = "ToolsDetailsTabPage"; - this.ToolsDetailsTabPage.Size = new System.Drawing.Size(239, 607); - this.ToolsDetailsTabPage.TabIndex = 2; - this.ToolsDetailsTabPage.Text = "Details"; - this.ToolsDetailsTabPage.UseVisualStyleBackColor = true; + ToolsDetailsTabPage.Controls.Add(DetailsPropertyGrid); + ToolsDetailsTabPage.Location = new System.Drawing.Point(4, 24); + ToolsDetailsTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsDetailsTabPage.Name = "ToolsDetailsTabPage"; + ToolsDetailsTabPage.Size = new System.Drawing.Size(308, 702); + ToolsDetailsTabPage.TabIndex = 2; + ToolsDetailsTabPage.Text = "Details"; + ToolsDetailsTabPage.UseVisualStyleBackColor = true; // // TextureViewerButton // - this.TextureViewerButton.Location = new System.Drawing.Point(6, 6); - this.TextureViewerButton.Name = "TextureViewerButton"; - this.TextureViewerButton.Size = new System.Drawing.Size(113, 23); - this.TextureViewerButton.TabIndex = 2; - this.TextureViewerButton.Text = "Open texture viewer"; - this.TextureViewerButton.UseVisualStyleBackColor = true; - this.TextureViewerButton.Click += new System.EventHandler(this.TextureViewerButton_Click); + TextureViewerButton.Location = new System.Drawing.Point(7, 7); + TextureViewerButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TextureViewerButton.Name = "TextureViewerButton"; + TextureViewerButton.Size = new System.Drawing.Size(132, 27); + TextureViewerButton.TabIndex = 2; + TextureViewerButton.Text = "Open texture viewer"; + TextureViewerButton.UseVisualStyleBackColor = true; + TextureViewerButton.Click += TextureViewerButton_Click; // // TexturesTreeView // - this.TexturesTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TexturesTreeView.Location = new System.Drawing.Point(0, 34); - this.TexturesTreeView.Name = "TexturesTreeView"; - this.TexturesTreeView.ShowRootLines = false; - this.TexturesTreeView.Size = new System.Drawing.Size(239, 573); - this.TexturesTreeView.TabIndex = 1; + TexturesTreeView.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + TexturesTreeView.Location = new System.Drawing.Point(0, 39); + TexturesTreeView.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TexturesTreeView.Name = "TexturesTreeView"; + TexturesTreeView.ShowRootLines = false; + TexturesTreeView.Size = new System.Drawing.Size(278, 661); + TexturesTreeView.TabIndex = 1; // // ToolsTexturesTabPage // - this.ToolsTexturesTabPage.Controls.Add(this.TextureViewerButton); - this.ToolsTexturesTabPage.Controls.Add(this.TexturesTreeView); - this.ToolsTexturesTabPage.Location = new System.Drawing.Point(4, 22); - this.ToolsTexturesTabPage.Name = "ToolsTexturesTabPage"; - this.ToolsTexturesTabPage.Padding = new System.Windows.Forms.Padding(3); - this.ToolsTexturesTabPage.Size = new System.Drawing.Size(239, 607); - this.ToolsTexturesTabPage.TabIndex = 1; - this.ToolsTexturesTabPage.Text = "Textures"; - this.ToolsTexturesTabPage.UseVisualStyleBackColor = true; + ToolsTexturesTabPage.Controls.Add(TextureViewerButton); + ToolsTexturesTabPage.Controls.Add(TexturesTreeView); + ToolsTexturesTabPage.Location = new System.Drawing.Point(4, 24); + ToolsTexturesTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsTexturesTabPage.Name = "ToolsTexturesTabPage"; + ToolsTexturesTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsTexturesTabPage.Size = new System.Drawing.Size(308, 702); + ToolsTexturesTabPage.TabIndex = 1; + ToolsTexturesTabPage.Text = "Textures"; + ToolsTexturesTabPage.UseVisualStyleBackColor = true; // // ModelsTreeView // - this.ModelsTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ModelsTreeView.CheckBoxes = true; - this.ModelsTreeView.Location = new System.Drawing.Point(0, 3); - this.ModelsTreeView.Name = "ModelsTreeView"; - this.ModelsTreeView.ShowRootLines = false; - this.ModelsTreeView.Size = new System.Drawing.Size(239, 604); - this.ModelsTreeView.TabIndex = 2; - this.ModelsTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.ModelsTreeView_AfterCheck); - this.ModelsTreeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.ModelsTreeView_NodeMouseDoubleClick); - this.ModelsTreeView.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ModelsTreeView_KeyPress); + ModelsTreeView.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModelsTreeView.CheckBoxes = true; + ModelsTreeView.Location = new System.Drawing.Point(0, 3); + ModelsTreeView.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ModelsTreeView.Name = "ModelsTreeView"; + ModelsTreeView.ShowRootLines = false; + ModelsTreeView.Size = new System.Drawing.Size(278, 696); + ModelsTreeView.TabIndex = 2; + ModelsTreeView.AfterCheck += ModelsTreeView_AfterCheck; + ModelsTreeView.NodeMouseDoubleClick += ModelsTreeView_NodeMouseDoubleClick; + ModelsTreeView.KeyPress += ModelsTreeView_KeyPress; // // StatusStrip // - this.StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.StatusLabel, - this.MousedLabel, - this.StatsLabel}); - this.StatusStrip.Location = new System.Drawing.Point(0, 689); - this.StatusStrip.Name = "StatusStrip"; - this.StatusStrip.Size = new System.Drawing.Size(984, 22); - this.StatusStrip.TabIndex = 6; - this.StatusStrip.Text = "statusStrip1"; + StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { StatusLabel, MousedLabel, StatsLabel }); + StatusStrip.Location = new System.Drawing.Point(0, 798); + StatusStrip.Name = "StatusStrip"; + StatusStrip.Padding = new System.Windows.Forms.Padding(1, 0, 16, 0); + StatusStrip.Size = new System.Drawing.Size(1148, 22); + StatusStrip.TabIndex = 6; + StatusStrip.Text = "statusStrip1"; // // StatusLabel // - this.StatusLabel.BackColor = System.Drawing.SystemColors.Control; - this.StatusLabel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.StatusLabel.Name = "StatusLabel"; - this.StatusLabel.Size = new System.Drawing.Size(878, 17); - this.StatusLabel.Spring = true; - this.StatusLabel.Text = "Initialising"; - this.StatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + StatusLabel.BackColor = System.Drawing.SystemColors.Control; + StatusLabel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + StatusLabel.Name = "StatusLabel"; + StatusLabel.Size = new System.Drawing.Size(1040, 17); + StatusLabel.Spring = true; + StatusLabel.Text = "Initialising"; + StatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // MousedLabel // - this.MousedLabel.BackColor = System.Drawing.SystemColors.Control; - this.MousedLabel.Name = "MousedLabel"; - this.MousedLabel.Size = new System.Drawing.Size(16, 17); - this.MousedLabel.Text = " "; + MousedLabel.BackColor = System.Drawing.SystemColors.Control; + MousedLabel.Name = "MousedLabel"; + MousedLabel.Size = new System.Drawing.Size(16, 17); + MousedLabel.Text = " "; // // StatsLabel // - this.StatsLabel.BackColor = System.Drawing.SystemColors.Control; - this.StatsLabel.Name = "StatsLabel"; - this.StatsLabel.Size = new System.Drawing.Size(75, 17); - this.StatsLabel.Text = "0 geometries"; + StatsLabel.BackColor = System.Drawing.SystemColors.Control; + StatsLabel.Name = "StatsLabel"; + StatsLabel.Size = new System.Drawing.Size(75, 17); + StatsLabel.Text = "0 geometries"; // // ToolsModelsTabPage // - this.ToolsModelsTabPage.Controls.Add(this.ModelsTreeView); - this.ToolsModelsTabPage.Location = new System.Drawing.Point(4, 22); - this.ToolsModelsTabPage.Name = "ToolsModelsTabPage"; - this.ToolsModelsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.ToolsModelsTabPage.Size = new System.Drawing.Size(239, 607); - this.ToolsModelsTabPage.TabIndex = 0; - this.ToolsModelsTabPage.Text = "Models"; - this.ToolsModelsTabPage.UseVisualStyleBackColor = true; + ToolsModelsTabPage.Controls.Add(ModelsTreeView); + ToolsModelsTabPage.Location = new System.Drawing.Point(4, 24); + ToolsModelsTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsModelsTabPage.Name = "ToolsModelsTabPage"; + ToolsModelsTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsModelsTabPage.Size = new System.Drawing.Size(308, 702); + ToolsModelsTabPage.TabIndex = 0; + ToolsModelsTabPage.Text = "Models"; + ToolsModelsTabPage.UseVisualStyleBackColor = true; // // label3 // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(3, 11); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(29, 13); - this.label3.TabIndex = 1; - this.label3.Text = "Ped:"; + label3.AutoSize = true; + label3.Location = new System.Drawing.Point(4, 13); + label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(30, 15); + label3.TabIndex = 1; + label3.Text = "Ped:"; // // PedNameComboBox // - this.PedNameComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.PedNameComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.PedNameComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.PedNameComboBox.FormattingEnabled = true; - this.PedNameComboBox.Location = new System.Drawing.Point(54, 8); - this.PedNameComboBox.Name = "PedNameComboBox"; - this.PedNameComboBox.Size = new System.Drawing.Size(182, 21); - this.PedNameComboBox.TabIndex = 0; - this.PedNameComboBox.SelectedIndexChanged += new System.EventHandler(this.PedNameComboBox_SelectedIndexChanged); + PedNameComboBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + PedNameComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + PedNameComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + PedNameComboBox.FormattingEnabled = true; + PedNameComboBox.Location = new System.Drawing.Point(55, 9); + PedNameComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + PedNameComboBox.Name = "PedNameComboBox"; + PedNameComboBox.Size = new System.Drawing.Size(175, 23); + PedNameComboBox.TabIndex = 0; + PedNameComboBox.SelectedIndexChanged += PedNameComboBox_SelectedIndexChanged; // // StatsUpdateTimer // - this.StatsUpdateTimer.Enabled = true; - this.StatsUpdateTimer.Interval = 500; - this.StatsUpdateTimer.Tick += new System.EventHandler(this.StatsUpdateTimer_Tick); + StatsUpdateTimer.Enabled = true; + StatsUpdateTimer.Interval = 500; + StatsUpdateTimer.Tick += StatsUpdateTimer_Tick; // // ToolsPedTabPage // - this.ToolsPedTabPage.Controls.Add(this.EnableRootMotionCheckBox); - this.ToolsPedTabPage.Controls.Add(this.label23); - this.ToolsPedTabPage.Controls.Add(this.label22); - this.ToolsPedTabPage.Controls.Add(this.ClipComboBox); - this.ToolsPedTabPage.Controls.Add(this.label21); - this.ToolsPedTabPage.Controls.Add(this.ClipDictComboBox); - this.ToolsPedTabPage.Controls.Add(this.label20); - this.ToolsPedTabPage.Controls.Add(this.CompJbibComboBox); - this.ToolsPedTabPage.Controls.Add(this.label18); - this.ToolsPedTabPage.Controls.Add(this.CompDeclComboBox); - this.ToolsPedTabPage.Controls.Add(this.label17); - this.ToolsPedTabPage.Controls.Add(this.CompTaskComboBox); - this.ToolsPedTabPage.Controls.Add(this.label16); - this.ToolsPedTabPage.Controls.Add(this.CompAccsComboBox); - this.ToolsPedTabPage.Controls.Add(this.label15); - this.ToolsPedTabPage.Controls.Add(this.CompTeefComboBox); - this.ToolsPedTabPage.Controls.Add(this.label13); - this.ToolsPedTabPage.Controls.Add(this.CompFeetComboBox); - this.ToolsPedTabPage.Controls.Add(this.label12); - this.ToolsPedTabPage.Controls.Add(this.CompHandComboBox); - this.ToolsPedTabPage.Controls.Add(this.label9); - this.ToolsPedTabPage.Controls.Add(this.CompLowrComboBox); - this.ToolsPedTabPage.Controls.Add(this.label8); - this.ToolsPedTabPage.Controls.Add(this.CompUpprComboBox); - this.ToolsPedTabPage.Controls.Add(this.label7); - this.ToolsPedTabPage.Controls.Add(this.CompHairComboBox); - this.ToolsPedTabPage.Controls.Add(this.label6); - this.ToolsPedTabPage.Controls.Add(this.CompBerdComboBox); - this.ToolsPedTabPage.Controls.Add(this.label5); - this.ToolsPedTabPage.Controls.Add(this.CompHeadComboBox); - this.ToolsPedTabPage.Controls.Add(this.label4); - this.ToolsPedTabPage.Controls.Add(this.label3); - this.ToolsPedTabPage.Controls.Add(this.PedNameComboBox); - this.ToolsPedTabPage.Location = new System.Drawing.Point(4, 22); - this.ToolsPedTabPage.Name = "ToolsPedTabPage"; - this.ToolsPedTabPage.Size = new System.Drawing.Size(239, 607); - this.ToolsPedTabPage.TabIndex = 4; - this.ToolsPedTabPage.Text = "Ped"; - this.ToolsPedTabPage.UseVisualStyleBackColor = true; + ToolsPedTabPage.AutoScroll = true; + ToolsPedTabPage.Controls.Add(tableLayoutPanel1); + ToolsPedTabPage.Controls.Add(label24); + ToolsPedTabPage.Controls.Add(YmtNameComboBox); + ToolsPedTabPage.Controls.Add(EnableRootMotionCheckBox); + ToolsPedTabPage.Controls.Add(label23); + ToolsPedTabPage.Controls.Add(label22); + ToolsPedTabPage.Controls.Add(ClipComboBox); + ToolsPedTabPage.Controls.Add(label21); + ToolsPedTabPage.Controls.Add(ClipDictComboBox); + ToolsPedTabPage.Controls.Add(label4); + ToolsPedTabPage.Controls.Add(label3); + ToolsPedTabPage.Controls.Add(PedNameComboBox); + ToolsPedTabPage.Location = new System.Drawing.Point(4, 24); + ToolsPedTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsPedTabPage.Name = "ToolsPedTabPage"; + ToolsPedTabPage.Size = new System.Drawing.Size(308, 702); + ToolsPedTabPage.TabIndex = 4; + ToolsPedTabPage.Text = "Ped"; + ToolsPedTabPage.UseVisualStyleBackColor = true; // - // EnableRootMotionCheckBox + // tableLayoutPanel1 // - this.EnableRootMotionCheckBox.AutoSize = true; - this.EnableRootMotionCheckBox.Location = new System.Drawing.Point(54, 503); - this.EnableRootMotionCheckBox.Name = "EnableRootMotionCheckBox"; - this.EnableRootMotionCheckBox.Size = new System.Drawing.Size(114, 17); - this.EnableRootMotionCheckBox.TabIndex = 32; - this.EnableRootMotionCheckBox.Text = "Enable root motion"; - this.EnableRootMotionCheckBox.UseVisualStyleBackColor = true; - this.EnableRootMotionCheckBox.CheckedChanged += new System.EventHandler(this.EnableRootMotionCheckBox_CheckedChanged); - // - // label23 - // - this.label23.AutoSize = true; - this.label23.Location = new System.Drawing.Point(3, 422); - this.label23.Name = "label23"; - this.label23.Size = new System.Drawing.Size(56, 13); - this.label23.TabIndex = 31; - this.label23.Text = "Animation:"; - // - // label22 - // - this.label22.AutoSize = true; - this.label22.Location = new System.Drawing.Point(24, 472); - this.label22.Name = "label22"; - this.label22.Size = new System.Drawing.Size(27, 13); - this.label22.TabIndex = 30; - this.label22.Text = "Clip:"; - // - // ClipComboBox - // - this.ClipComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ClipComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.ClipComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.ClipComboBox.FormattingEnabled = true; - this.ClipComboBox.Location = new System.Drawing.Point(54, 469); - this.ClipComboBox.Name = "ClipComboBox"; - this.ClipComboBox.Size = new System.Drawing.Size(182, 21); - this.ClipComboBox.TabIndex = 29; - this.ClipComboBox.TextChanged += new System.EventHandler(this.ClipComboBox_TextChanged); - // - // label21 - // - this.label21.AutoSize = true; - this.label21.Location = new System.Drawing.Point(2, 445); - this.label21.Name = "label21"; - this.label21.Size = new System.Drawing.Size(49, 13); - this.label21.TabIndex = 28; - this.label21.Text = "Clip Dict:"; - // - // ClipDictComboBox - // - this.ClipDictComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ClipDictComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.ClipDictComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; - this.ClipDictComboBox.FormattingEnabled = true; - this.ClipDictComboBox.Location = new System.Drawing.Point(54, 442); - this.ClipDictComboBox.Name = "ClipDictComboBox"; - this.ClipDictComboBox.Size = new System.Drawing.Size(182, 21); - this.ClipDictComboBox.TabIndex = 27; - this.ClipDictComboBox.TextChanged += new System.EventHandler(this.ClipDictComboBox_TextChanged); - // - // label20 - // - this.label20.AutoSize = true; - this.label20.Location = new System.Drawing.Point(22, 373); - this.label20.Name = "label20"; - this.label20.Size = new System.Drawing.Size(29, 13); - this.label20.TabIndex = 26; - this.label20.Text = "Jbib:"; - // - // CompJbibComboBox - // - this.CompJbibComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompJbibComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompJbibComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompJbibComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompJbibComboBox.FormattingEnabled = true; - this.CompJbibComboBox.Location = new System.Drawing.Point(54, 370); - this.CompJbibComboBox.Name = "CompJbibComboBox"; - this.CompJbibComboBox.Size = new System.Drawing.Size(182, 21); - this.CompJbibComboBox.TabIndex = 25; - this.CompJbibComboBox.SelectedIndexChanged += new System.EventHandler(this.CompJbibComboBox_SelectedIndexChanged); - // - // label18 - // - this.label18.AutoSize = true; - this.label18.Location = new System.Drawing.Point(19, 346); - this.label18.Name = "label18"; - this.label18.Size = new System.Drawing.Size(32, 13); - this.label18.TabIndex = 24; - this.label18.Text = "Decl:"; - // - // CompDeclComboBox - // - this.CompDeclComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompDeclComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompDeclComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompDeclComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompDeclComboBox.FormattingEnabled = true; - this.CompDeclComboBox.Location = new System.Drawing.Point(54, 343); - this.CompDeclComboBox.Name = "CompDeclComboBox"; - this.CompDeclComboBox.Size = new System.Drawing.Size(182, 21); - this.CompDeclComboBox.TabIndex = 23; - this.CompDeclComboBox.SelectedIndexChanged += new System.EventHandler(this.CompDeclComboBox_SelectedIndexChanged); - // - // label17 - // - this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(17, 319); - this.label17.Name = "label17"; - this.label17.Size = new System.Drawing.Size(34, 13); - this.label17.TabIndex = 22; - this.label17.Text = "Task:"; - // - // CompTaskComboBox - // - this.CompTaskComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompTaskComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompTaskComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompTaskComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompTaskComboBox.FormattingEnabled = true; - this.CompTaskComboBox.Location = new System.Drawing.Point(54, 316); - this.CompTaskComboBox.Name = "CompTaskComboBox"; - this.CompTaskComboBox.Size = new System.Drawing.Size(182, 21); - this.CompTaskComboBox.TabIndex = 21; - this.CompTaskComboBox.SelectedIndexChanged += new System.EventHandler(this.CompTaskComboBox_SelectedIndexChanged); - // - // label16 - // - this.label16.AutoSize = true; - this.label16.Location = new System.Drawing.Point(17, 292); - this.label16.Name = "label16"; - this.label16.Size = new System.Drawing.Size(34, 13); - this.label16.TabIndex = 20; - this.label16.Text = "Accs:"; - // - // CompAccsComboBox - // - this.CompAccsComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompAccsComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompAccsComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompAccsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompAccsComboBox.FormattingEnabled = true; - this.CompAccsComboBox.Location = new System.Drawing.Point(54, 289); - this.CompAccsComboBox.Name = "CompAccsComboBox"; - this.CompAccsComboBox.Size = new System.Drawing.Size(182, 21); - this.CompAccsComboBox.TabIndex = 19; - this.CompAccsComboBox.SelectedIndexChanged += new System.EventHandler(this.CompAccsComboBox_SelectedIndexChanged); - // - // label15 - // - this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(19, 265); - this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(32, 13); - this.label15.TabIndex = 18; - this.label15.Text = "Teef:"; - // - // CompTeefComboBox - // - this.CompTeefComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompTeefComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompTeefComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompTeefComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompTeefComboBox.FormattingEnabled = true; - this.CompTeefComboBox.Location = new System.Drawing.Point(54, 262); - this.CompTeefComboBox.Name = "CompTeefComboBox"; - this.CompTeefComboBox.Size = new System.Drawing.Size(182, 21); - this.CompTeefComboBox.TabIndex = 17; - this.CompTeefComboBox.SelectedIndexChanged += new System.EventHandler(this.CompTeefComboBox_SelectedIndexChanged); - // - // label13 - // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(20, 238); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(31, 13); - this.label13.TabIndex = 16; - this.label13.Text = "Feet:"; - // - // CompFeetComboBox - // - this.CompFeetComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompFeetComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompFeetComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompFeetComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompFeetComboBox.FormattingEnabled = true; - this.CompFeetComboBox.Location = new System.Drawing.Point(54, 235); - this.CompFeetComboBox.Name = "CompFeetComboBox"; - this.CompFeetComboBox.Size = new System.Drawing.Size(182, 21); - this.CompFeetComboBox.TabIndex = 15; - this.CompFeetComboBox.SelectedIndexChanged += new System.EventHandler(this.CompFeetComboBox_SelectedIndexChanged); - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(15, 211); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(36, 13); - this.label12.TabIndex = 14; - this.label12.Text = "Hand:"; - // - // CompHandComboBox - // - this.CompHandComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompHandComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompHandComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompHandComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompHandComboBox.FormattingEnabled = true; - this.CompHandComboBox.Location = new System.Drawing.Point(54, 208); - this.CompHandComboBox.Name = "CompHandComboBox"; - this.CompHandComboBox.Size = new System.Drawing.Size(182, 21); - this.CompHandComboBox.TabIndex = 13; - this.CompHandComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHandComboBox_SelectedIndexChanged); - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(18, 184); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(33, 13); - this.label9.TabIndex = 12; - this.label9.Text = "Lowr:"; - // - // CompLowrComboBox - // - this.CompLowrComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompLowrComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompLowrComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompLowrComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompLowrComboBox.FormattingEnabled = true; - this.CompLowrComboBox.Location = new System.Drawing.Point(54, 181); - this.CompLowrComboBox.Name = "CompLowrComboBox"; - this.CompLowrComboBox.Size = new System.Drawing.Size(182, 21); - this.CompLowrComboBox.TabIndex = 11; - this.CompLowrComboBox.SelectedIndexChanged += new System.EventHandler(this.CompLowrComboBox_SelectedIndexChanged); - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(18, 157); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(33, 13); - this.label8.TabIndex = 10; - this.label8.Text = "Uppr:"; - // - // CompUpprComboBox - // - this.CompUpprComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompUpprComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompUpprComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompUpprComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompUpprComboBox.FormattingEnabled = true; - this.CompUpprComboBox.Location = new System.Drawing.Point(54, 154); - this.CompUpprComboBox.Name = "CompUpprComboBox"; - this.CompUpprComboBox.Size = new System.Drawing.Size(182, 21); - this.CompUpprComboBox.TabIndex = 9; - this.CompUpprComboBox.SelectedIndexChanged += new System.EventHandler(this.CompUpprComboBox_SelectedIndexChanged); - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(22, 130); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(29, 13); - this.label7.TabIndex = 8; - this.label7.Text = "Hair:"; - // - // CompHairComboBox - // - this.CompHairComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompHairComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompHairComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompHairComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompHairComboBox.FormattingEnabled = true; - this.CompHairComboBox.Location = new System.Drawing.Point(54, 127); - this.CompHairComboBox.Name = "CompHairComboBox"; - this.CompHairComboBox.Size = new System.Drawing.Size(182, 21); - this.CompHairComboBox.TabIndex = 7; - this.CompHairComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHairComboBox_SelectedIndexChanged); - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(19, 103); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(32, 13); - this.label6.TabIndex = 6; - this.label6.Text = "Berd:"; - // - // CompBerdComboBox - // - this.CompBerdComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompBerdComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompBerdComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompBerdComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompBerdComboBox.FormattingEnabled = true; - this.CompBerdComboBox.Location = new System.Drawing.Point(54, 100); - this.CompBerdComboBox.Name = "CompBerdComboBox"; - this.CompBerdComboBox.Size = new System.Drawing.Size(182, 21); - this.CompBerdComboBox.TabIndex = 5; - this.CompBerdComboBox.SelectedIndexChanged += new System.EventHandler(this.CompBerdComboBox_SelectedIndexChanged); + tableLayoutPanel1.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + tableLayoutPanel1.AutoSize = true; + tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + tableLayoutPanel1.ColumnCount = 2; + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 80F)); + tableLayoutPanel1.Controls.Add(CompHeadComboBox, 1, 0); + tableLayoutPanel1.Controls.Add(label6, 0, 2); + tableLayoutPanel1.Controls.Add(CompBerdComboBox, 1, 2); + tableLayoutPanel1.Controls.Add(label7, 0, 4); + tableLayoutPanel1.Controls.Add(CompHairComboBox, 1, 4); + tableLayoutPanel1.Controls.Add(label8, 0, 6); + tableLayoutPanel1.Controls.Add(CompUpprComboBox, 1, 6); + tableLayoutPanel1.Controls.Add(CompJbibComboBox, 1, 22); + tableLayoutPanel1.Controls.Add(label20, 0, 22); + tableLayoutPanel1.Controls.Add(label9, 0, 8); + tableLayoutPanel1.Controls.Add(label12, 0, 10); + tableLayoutPanel1.Controls.Add(CompDeclComboBox, 1, 20); + tableLayoutPanel1.Controls.Add(label18, 0, 20); + tableLayoutPanel1.Controls.Add(label13, 0, 12); + tableLayoutPanel1.Controls.Add(label15, 0, 14); + tableLayoutPanel1.Controls.Add(CompTaskComboBox, 1, 18); + tableLayoutPanel1.Controls.Add(label17, 0, 18); + tableLayoutPanel1.Controls.Add(CompLowrComboBox, 1, 8); + tableLayoutPanel1.Controls.Add(CompHandComboBox, 1, 10); + tableLayoutPanel1.Controls.Add(CompAccsComboBox, 1, 16); + tableLayoutPanel1.Controls.Add(label16, 0, 16); + tableLayoutPanel1.Controls.Add(CompFeetComboBox, 1, 12); + tableLayoutPanel1.Controls.Add(CompTeefComboBox, 1, 14); + tableLayoutPanel1.Controls.Add(CompBerdTexture, 1, 3); + tableLayoutPanel1.Controls.Add(CompHeadTexture, 1, 1); + tableLayoutPanel1.Controls.Add(CompHairTexture, 1, 5); + tableLayoutPanel1.Controls.Add(CompUpprTexture, 1, 7); + tableLayoutPanel1.Controls.Add(CompLowrTexture, 1, 9); + tableLayoutPanel1.Controls.Add(CompHandTexture, 1, 11); + tableLayoutPanel1.Controls.Add(CompFeetTexture, 1, 13); + tableLayoutPanel1.Controls.Add(CompTeefTexture, 1, 15); + tableLayoutPanel1.Controls.Add(CompAccsTexture, 1, 17); + tableLayoutPanel1.Controls.Add(CompTaskTexture, 1, 19); + tableLayoutPanel1.Controls.Add(CompDeclTexture, 1, 21); + tableLayoutPanel1.Controls.Add(CompJbibTexture, 1, 23); + tableLayoutPanel1.Controls.Add(label5, 0, 0); + tableLayoutPanel1.Location = new System.Drawing.Point(4, 105); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 24; + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + tableLayoutPanel1.Size = new System.Drawing.Size(235, 672); + tableLayoutPanel1.TabIndex = 35; // // label5 // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(15, 76); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(36, 13); - this.label5.TabIndex = 4; - this.label5.Text = "Head:"; + label5.Anchor = System.Windows.Forms.AnchorStyles.None; + label5.AutoEllipsis = true; + label5.Location = new System.Drawing.Point(4, 6); + label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label5.Name = "label5"; + label5.Size = new System.Drawing.Size(38, 15); + label5.TabIndex = 4; + label5.Text = "Head:"; + label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // CompHeadComboBox // - this.CompHeadComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CompHeadComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.CompHeadComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; - this.CompHeadComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CompHeadComboBox.FormattingEnabled = true; - this.CompHeadComboBox.Location = new System.Drawing.Point(54, 73); - this.CompHeadComboBox.Name = "CompHeadComboBox"; - this.CompHeadComboBox.Size = new System.Drawing.Size(182, 21); - this.CompHeadComboBox.TabIndex = 3; - this.CompHeadComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHeadComboBox_SelectedIndexChanged); + CompHeadComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompHeadComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompHeadComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompHeadComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompHeadComboBox.Location = new System.Drawing.Point(51, 3); + CompHeadComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompHeadComboBox.Name = "CompHeadComboBox"; + CompHeadComboBox.Size = new System.Drawing.Size(180, 23); + CompHeadComboBox.TabIndex = 3; + CompHeadComboBox.SelectedIndexChanged += CompHeadComboBox_SelectedIndexChanged; + // + // label6 + // + label6.Anchor = System.Windows.Forms.AnchorStyles.None; + label6.AutoSize = true; + label6.Location = new System.Drawing.Point(6, 62); + label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label6.Name = "label6"; + label6.Size = new System.Drawing.Size(34, 15); + label6.TabIndex = 6; + label6.Text = "Berd:"; + // + // CompBerdComboBox + // + CompBerdComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompBerdComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompBerdComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompBerdComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompBerdComboBox.FormattingEnabled = true; + CompBerdComboBox.Location = new System.Drawing.Point(51, 59); + CompBerdComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompBerdComboBox.Name = "CompBerdComboBox"; + CompBerdComboBox.Size = new System.Drawing.Size(180, 23); + CompBerdComboBox.TabIndex = 5; + CompBerdComboBox.SelectedIndexChanged += CompBerdComboBox_SelectedIndexChanged; + // + // label7 + // + label7.Anchor = System.Windows.Forms.AnchorStyles.None; + label7.AutoSize = true; + label7.Location = new System.Drawing.Point(7, 118); + label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label7.Name = "label7"; + label7.Size = new System.Drawing.Size(32, 15); + label7.TabIndex = 8; + label7.Text = "Hair:"; + // + // CompHairComboBox + // + CompHairComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompHairComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompHairComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompHairComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompHairComboBox.FormattingEnabled = true; + CompHairComboBox.Location = new System.Drawing.Point(51, 115); + CompHairComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompHairComboBox.Name = "CompHairComboBox"; + CompHairComboBox.Size = new System.Drawing.Size(180, 23); + CompHairComboBox.TabIndex = 7; + CompHairComboBox.SelectedIndexChanged += CompHairComboBox_SelectedIndexChanged; + // + // label8 + // + label8.Anchor = System.Windows.Forms.AnchorStyles.None; + label8.AutoSize = true; + label8.Location = new System.Drawing.Point(5, 174); + label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label8.Name = "label8"; + label8.Size = new System.Drawing.Size(36, 15); + label8.TabIndex = 10; + label8.Text = "Uppr:"; + // + // CompUpprComboBox + // + CompUpprComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompUpprComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompUpprComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompUpprComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompUpprComboBox.FormattingEnabled = true; + CompUpprComboBox.Location = new System.Drawing.Point(51, 171); + CompUpprComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompUpprComboBox.Name = "CompUpprComboBox"; + CompUpprComboBox.Size = new System.Drawing.Size(180, 23); + CompUpprComboBox.TabIndex = 9; + CompUpprComboBox.SelectedIndexChanged += CompUpprComboBox_SelectedIndexChanged; + // + // CompJbibComboBox + // + CompJbibComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompJbibComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompJbibComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompJbibComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompJbibComboBox.FormattingEnabled = true; + CompJbibComboBox.Location = new System.Drawing.Point(51, 619); + CompJbibComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompJbibComboBox.Name = "CompJbibComboBox"; + CompJbibComboBox.Size = new System.Drawing.Size(180, 23); + CompJbibComboBox.TabIndex = 25; + CompJbibComboBox.SelectedIndexChanged += CompJbibComboBox_SelectedIndexChanged; + // + // label20 + // + label20.Anchor = System.Windows.Forms.AnchorStyles.None; + label20.AutoSize = true; + label20.Location = new System.Drawing.Point(8, 622); + label20.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label20.Name = "label20"; + label20.Size = new System.Drawing.Size(31, 15); + label20.TabIndex = 26; + label20.Text = "Jbib:"; + // + // label9 + // + label9.Anchor = System.Windows.Forms.AnchorStyles.None; + label9.AutoSize = true; + label9.Location = new System.Drawing.Point(5, 230); + label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label9.Name = "label9"; + label9.Size = new System.Drawing.Size(36, 15); + label9.TabIndex = 12; + label9.Text = "Lowr:"; + // + // label12 + // + label12.Anchor = System.Windows.Forms.AnchorStyles.None; + label12.AutoSize = true; + label12.Location = new System.Drawing.Point(4, 286); + label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label12.Name = "label12"; + label12.Size = new System.Drawing.Size(39, 15); + label12.TabIndex = 14; + label12.Text = "Hand:"; + // + // CompDeclComboBox + // + CompDeclComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompDeclComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompDeclComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompDeclComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompDeclComboBox.FormattingEnabled = true; + CompDeclComboBox.Location = new System.Drawing.Point(51, 563); + CompDeclComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompDeclComboBox.Name = "CompDeclComboBox"; + CompDeclComboBox.Size = new System.Drawing.Size(180, 23); + CompDeclComboBox.TabIndex = 23; + CompDeclComboBox.SelectedIndexChanged += CompDeclComboBox_SelectedIndexChanged; + // + // label18 + // + label18.Anchor = System.Windows.Forms.AnchorStyles.None; + label18.AutoSize = true; + label18.Location = new System.Drawing.Point(7, 566); + label18.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label18.Name = "label18"; + label18.Size = new System.Drawing.Size(33, 15); + label18.TabIndex = 24; + label18.Text = "Decl:"; + // + // label13 + // + label13.Anchor = System.Windows.Forms.AnchorStyles.None; + label13.AutoSize = true; + label13.Location = new System.Drawing.Point(7, 342); + label13.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label13.Name = "label13"; + label13.Size = new System.Drawing.Size(32, 15); + label13.TabIndex = 16; + label13.Text = "Feet:"; + // + // label15 + // + label15.Anchor = System.Windows.Forms.AnchorStyles.None; + label15.AutoSize = true; + label15.Location = new System.Drawing.Point(8, 398); + label15.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label15.Name = "label15"; + label15.Size = new System.Drawing.Size(31, 15); + label15.TabIndex = 18; + label15.Text = "Teef:"; + // + // CompTaskComboBox + // + CompTaskComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompTaskComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompTaskComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompTaskComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompTaskComboBox.FormattingEnabled = true; + CompTaskComboBox.Location = new System.Drawing.Point(51, 507); + CompTaskComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompTaskComboBox.Name = "CompTaskComboBox"; + CompTaskComboBox.Size = new System.Drawing.Size(180, 23); + CompTaskComboBox.TabIndex = 21; + CompTaskComboBox.SelectedIndexChanged += CompTaskComboBox_SelectedIndexChanged; + // + // label17 + // + label17.Anchor = System.Windows.Forms.AnchorStyles.None; + label17.AutoSize = true; + label17.Location = new System.Drawing.Point(7, 510); + label17.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label17.Name = "label17"; + label17.Size = new System.Drawing.Size(32, 15); + label17.TabIndex = 22; + label17.Text = "Task:"; + // + // CompLowrComboBox + // + CompLowrComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompLowrComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompLowrComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompLowrComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompLowrComboBox.FormattingEnabled = true; + CompLowrComboBox.Location = new System.Drawing.Point(51, 227); + CompLowrComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompLowrComboBox.Name = "CompLowrComboBox"; + CompLowrComboBox.Size = new System.Drawing.Size(180, 23); + CompLowrComboBox.TabIndex = 11; + CompLowrComboBox.SelectedIndexChanged += CompLowrComboBox_SelectedIndexChanged; + // + // CompHandComboBox + // + CompHandComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompHandComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompHandComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompHandComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompHandComboBox.FormattingEnabled = true; + CompHandComboBox.Location = new System.Drawing.Point(51, 283); + CompHandComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompHandComboBox.Name = "CompHandComboBox"; + CompHandComboBox.Size = new System.Drawing.Size(180, 23); + CompHandComboBox.TabIndex = 13; + CompHandComboBox.SelectedIndexChanged += CompHandComboBox_SelectedIndexChanged; + // + // CompAccsComboBox + // + CompAccsComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompAccsComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompAccsComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompAccsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompAccsComboBox.FormattingEnabled = true; + CompAccsComboBox.Location = new System.Drawing.Point(51, 451); + CompAccsComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompAccsComboBox.Name = "CompAccsComboBox"; + CompAccsComboBox.Size = new System.Drawing.Size(180, 23); + CompAccsComboBox.TabIndex = 19; + CompAccsComboBox.SelectedIndexChanged += CompAccsComboBox_SelectedIndexChanged; + // + // label16 + // + label16.Anchor = System.Windows.Forms.AnchorStyles.None; + label16.AutoSize = true; + label16.Location = new System.Drawing.Point(6, 454); + label16.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label16.Name = "label16"; + label16.Size = new System.Drawing.Size(35, 15); + label16.TabIndex = 20; + label16.Text = "Accs:"; + // + // CompFeetComboBox + // + CompFeetComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompFeetComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompFeetComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompFeetComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompFeetComboBox.FormattingEnabled = true; + CompFeetComboBox.Location = new System.Drawing.Point(51, 339); + CompFeetComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompFeetComboBox.Name = "CompFeetComboBox"; + CompFeetComboBox.Size = new System.Drawing.Size(180, 23); + CompFeetComboBox.TabIndex = 15; + CompFeetComboBox.SelectedIndexChanged += CompFeetComboBox_SelectedIndexChanged; + // + // CompTeefComboBox + // + CompTeefComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompTeefComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompTeefComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompTeefComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompTeefComboBox.FormattingEnabled = true; + CompTeefComboBox.Location = new System.Drawing.Point(51, 395); + CompTeefComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompTeefComboBox.Name = "CompTeefComboBox"; + CompTeefComboBox.Size = new System.Drawing.Size(180, 23); + CompTeefComboBox.TabIndex = 17; + CompTeefComboBox.SelectedIndexChanged += CompTeefComboBox_SelectedIndexChanged; + // + // CompBerdTexture + // + CompBerdTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompBerdTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompBerdTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompBerdTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompBerdTexture.FormattingEnabled = true; + CompBerdTexture.Location = new System.Drawing.Point(51, 87); + CompBerdTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompBerdTexture.Name = "CompBerdTexture"; + CompBerdTexture.Size = new System.Drawing.Size(180, 23); + CompBerdTexture.TabIndex = 29; + CompBerdTexture.SelectedIndexChanged += CompBerdTexture_SelectedIndexChanged; + // + // CompHeadTexture + // + CompHeadTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompHeadTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompHeadTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompHeadTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompHeadTexture.FormattingEnabled = true; + CompHeadTexture.Location = new System.Drawing.Point(51, 31); + CompHeadTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompHeadTexture.Name = "CompHeadTexture"; + CompHeadTexture.Size = new System.Drawing.Size(180, 23); + CompHeadTexture.TabIndex = 30; + CompHeadTexture.SelectedIndexChanged += CompHeadTexture_SelectedIndexChanged; + // + // CompHairTexture + // + CompHairTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompHairTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompHairTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompHairTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompHairTexture.FormattingEnabled = true; + CompHairTexture.Location = new System.Drawing.Point(51, 143); + CompHairTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompHairTexture.Name = "CompHairTexture"; + CompHairTexture.Size = new System.Drawing.Size(180, 23); + CompHairTexture.TabIndex = 31; + CompHairTexture.SelectedIndexChanged += CompHairTexture_SelectedIndexChanged; + // + // CompUpprTexture + // + CompUpprTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompUpprTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompUpprTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompUpprTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompUpprTexture.FormattingEnabled = true; + CompUpprTexture.Location = new System.Drawing.Point(51, 199); + CompUpprTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompUpprTexture.Name = "CompUpprTexture"; + CompUpprTexture.Size = new System.Drawing.Size(180, 23); + CompUpprTexture.TabIndex = 32; + CompUpprTexture.SelectedIndexChanged += CompUpprTexture_SelectedIndexChanged; + // + // CompLowrTexture + // + CompLowrTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompLowrTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompLowrTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompLowrTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompLowrTexture.FormattingEnabled = true; + CompLowrTexture.Location = new System.Drawing.Point(51, 255); + CompLowrTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompLowrTexture.Name = "CompLowrTexture"; + CompLowrTexture.Size = new System.Drawing.Size(180, 23); + CompLowrTexture.TabIndex = 33; + CompLowrTexture.SelectedIndexChanged += CompLowrTexture_SelectedIndexChanged; + // + // CompHandTexture + // + CompHandTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompHandTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompHandTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompHandTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompHandTexture.FormattingEnabled = true; + CompHandTexture.Location = new System.Drawing.Point(51, 311); + CompHandTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompHandTexture.Name = "CompHandTexture"; + CompHandTexture.Size = new System.Drawing.Size(180, 23); + CompHandTexture.TabIndex = 34; + CompHandTexture.SelectedIndexChanged += CompHandTexture_SelectedIndexChanged; + // + // CompFeetTexture + // + CompFeetTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompFeetTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompFeetTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompFeetTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompFeetTexture.FormattingEnabled = true; + CompFeetTexture.Location = new System.Drawing.Point(51, 367); + CompFeetTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompFeetTexture.Name = "CompFeetTexture"; + CompFeetTexture.Size = new System.Drawing.Size(180, 23); + CompFeetTexture.TabIndex = 35; + CompFeetTexture.SelectedIndexChanged += CompFeetTexture_SelectedIndexChanged; + // + // CompTeefTexture + // + CompTeefTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompTeefTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompTeefTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompTeefTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompTeefTexture.FormattingEnabled = true; + CompTeefTexture.Location = new System.Drawing.Point(51, 423); + CompTeefTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompTeefTexture.Name = "CompTeefTexture"; + CompTeefTexture.Size = new System.Drawing.Size(180, 23); + CompTeefTexture.TabIndex = 36; + CompTeefTexture.SelectedIndexChanged += CompTeefTexture_SelectedIndexChanged; + // + // CompAccsTexture + // + CompAccsTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompAccsTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompAccsTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompAccsTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompAccsTexture.FormattingEnabled = true; + CompAccsTexture.Location = new System.Drawing.Point(51, 479); + CompAccsTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompAccsTexture.Name = "CompAccsTexture"; + CompAccsTexture.Size = new System.Drawing.Size(180, 23); + CompAccsTexture.TabIndex = 37; + CompAccsTexture.SelectedIndexChanged += CompAccsTexture_SelectedIndexChanged; + // + // CompTaskTexture + // + CompTaskTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompTaskTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompTaskTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompTaskTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompTaskTexture.FormattingEnabled = true; + CompTaskTexture.Location = new System.Drawing.Point(51, 535); + CompTaskTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompTaskTexture.Name = "CompTaskTexture"; + CompTaskTexture.Size = new System.Drawing.Size(180, 23); + CompTaskTexture.TabIndex = 38; + CompTaskTexture.SelectedIndexChanged += CompTaskTexture_SelectedIndexChanged; + // + // CompDeclTexture + // + CompDeclTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompDeclTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompDeclTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompDeclTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompDeclTexture.FormattingEnabled = true; + CompDeclTexture.Location = new System.Drawing.Point(51, 591); + CompDeclTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompDeclTexture.Name = "CompDeclTexture"; + CompDeclTexture.Size = new System.Drawing.Size(180, 23); + CompDeclTexture.TabIndex = 39; + CompDeclTexture.SelectedIndexChanged += CompDeclTexture_SelectedIndexChanged; + // + // CompJbibTexture + // + CompJbibTexture.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CompJbibTexture.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + CompJbibTexture.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + CompJbibTexture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CompJbibTexture.FormattingEnabled = true; + CompJbibTexture.Location = new System.Drawing.Point(51, 647); + CompJbibTexture.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CompJbibTexture.Name = "CompJbibTexture"; + CompJbibTexture.Size = new System.Drawing.Size(180, 23); + CompJbibTexture.TabIndex = 40; + CompJbibTexture.SelectedIndexChanged += CompJbibTexture_SelectedIndexChanged; + // + // label24 + // + label24.AutoSize = true; + label24.Location = new System.Drawing.Point(4, 41); + label24.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label24.Name = "label24"; + label24.Size = new System.Drawing.Size(31, 15); + label24.TabIndex = 34; + label24.Text = "Ymt:"; + label24.Click += label24_Click; + // + // YmtNameComboBox + // + YmtNameComboBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + YmtNameComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + YmtNameComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + YmtNameComboBox.FormattingEnabled = true; + YmtNameComboBox.Location = new System.Drawing.Point(55, 38); + YmtNameComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + YmtNameComboBox.Name = "YmtNameComboBox"; + YmtNameComboBox.Size = new System.Drawing.Size(158, 23); + YmtNameComboBox.TabIndex = 33; + YmtNameComboBox.SelectionChangeCommitted += YmtNameCombaBox_SelectedIndexChanged; + // + // EnableRootMotionCheckBox + // + EnableRootMotionCheckBox.AutoSize = true; + EnableRootMotionCheckBox.Location = new System.Drawing.Point(63, 889); + EnableRootMotionCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + EnableRootMotionCheckBox.Name = "EnableRootMotionCheckBox"; + EnableRootMotionCheckBox.Size = new System.Drawing.Size(128, 19); + EnableRootMotionCheckBox.TabIndex = 32; + EnableRootMotionCheckBox.Text = "Enable root motion"; + EnableRootMotionCheckBox.UseVisualStyleBackColor = true; + EnableRootMotionCheckBox.CheckedChanged += EnableRootMotionCheckBox_CheckedChanged; + // + // label23 + // + label23.AutoSize = true; + label23.Location = new System.Drawing.Point(4, 812); + label23.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label23.Name = "label23"; + label23.Size = new System.Drawing.Size(66, 15); + label23.TabIndex = 31; + label23.Text = "Animation:"; + // + // label22 + // + label22.AutoSize = true; + label22.Location = new System.Drawing.Point(24, 863); + label22.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label22.Name = "label22"; + label22.Size = new System.Drawing.Size(31, 15); + label22.TabIndex = 30; + label22.Text = "Clip:"; + // + // ClipComboBox + // + ClipComboBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ClipComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + ClipComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + ClipComboBox.FormattingEnabled = true; + ClipComboBox.Location = new System.Drawing.Point(63, 860); + ClipComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ClipComboBox.Name = "ClipComboBox"; + ClipComboBox.Size = new System.Drawing.Size(163, 23); + ClipComboBox.TabIndex = 29; + ClipComboBox.TextChanged += ClipComboBox_TextChanged; + // + // label21 + // + label21.AutoSize = true; + label21.Location = new System.Drawing.Point(4, 833); + label21.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label21.Name = "label21"; + label21.Size = new System.Drawing.Size(55, 15); + label21.TabIndex = 28; + label21.Text = "Clip Dict:"; + // + // ClipDictComboBox + // + ClipDictComboBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ClipDictComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + ClipDictComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; + ClipDictComboBox.FormattingEnabled = true; + ClipDictComboBox.Location = new System.Drawing.Point(63, 830); + ClipDictComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ClipDictComboBox.Name = "ClipDictComboBox"; + ClipDictComboBox.Size = new System.Drawing.Size(163, 23); + ClipDictComboBox.TabIndex = 27; + ClipDictComboBox.TextChanged += ClipDictComboBox_TextChanged; // // label4 // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(3, 53); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(69, 13); - this.label4.TabIndex = 2; - this.label4.Text = "Components:"; + label4.AutoSize = true; + label4.Location = new System.Drawing.Point(4, 87); + label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label4.Name = "label4"; + label4.Size = new System.Drawing.Size(79, 15); + label4.TabIndex = 2; + label4.Text = "Components:"; // // ToolsTabControl // - this.ToolsTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ToolsTabControl.Controls.Add(this.ToolsPedTabPage); - this.ToolsTabControl.Controls.Add(this.ToolsModelsTabPage); - this.ToolsTabControl.Controls.Add(this.ToolsTexturesTabPage); - this.ToolsTabControl.Controls.Add(this.ToolsDetailsTabPage); - this.ToolsTabControl.Controls.Add(this.ToolsOptionsTabPage); - this.ToolsTabControl.Location = new System.Drawing.Point(2, 30); - this.ToolsTabControl.Name = "ToolsTabControl"; - this.ToolsTabControl.SelectedIndex = 0; - this.ToolsTabControl.Size = new System.Drawing.Size(247, 633); - this.ToolsTabControl.TabIndex = 1; + ToolsTabControl.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ToolsTabControl.Controls.Add(ToolsPedTabPage); + ToolsTabControl.Controls.Add(ToolsModelsTabPage); + ToolsTabControl.Controls.Add(ToolsTexturesTabPage); + ToolsTabControl.Controls.Add(ToolsDetailsTabPage); + ToolsTabControl.Controls.Add(ToolsOptionsTabPage); + ToolsTabControl.Location = new System.Drawing.Point(2, 35); + ToolsTabControl.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsTabControl.Name = "ToolsTabControl"; + ToolsTabControl.SelectedIndex = 0; + ToolsTabControl.Size = new System.Drawing.Size(316, 730); + ToolsTabControl.TabIndex = 1; // // ToolsPanel // - this.ToolsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.ToolsPanel.BackColor = System.Drawing.SystemColors.ControlDark; - this.ToolsPanel.Controls.Add(this.ToolsTabControl); - this.ToolsPanel.Controls.Add(this.ToolsPanelHideButton); - this.ToolsPanel.Controls.Add(this.ToolsDragPanel); - this.ToolsPanel.Location = new System.Drawing.Point(12, 12); - this.ToolsPanel.Name = "ToolsPanel"; - this.ToolsPanel.Size = new System.Drawing.Size(252, 666); - this.ToolsPanel.TabIndex = 7; - this.ToolsPanel.Visible = false; + ToolsPanel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + ToolsPanel.BackColor = System.Drawing.SystemColors.ControlDark; + ToolsPanel.Controls.Add(ToolsTabControl); + ToolsPanel.Controls.Add(ToolsPanelHideButton); + ToolsPanel.Controls.Add(ToolsDragPanel); + ToolsPanel.Location = new System.Drawing.Point(14, 14); + ToolsPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsPanel.Name = "ToolsPanel"; + ToolsPanel.Size = new System.Drawing.Size(322, 768); + ToolsPanel.TabIndex = 7; + ToolsPanel.Visible = false; // // PedsForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.MidnightBlue; - this.ClientSize = new System.Drawing.Size(984, 711); - this.Controls.Add(this.ConsolePanel); - this.Controls.Add(this.StatusStrip); - this.Controls.Add(this.ToolsPanel); - this.Controls.Add(this.ToolsPanelShowButton); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.KeyPreview = true; - this.Name = "PedsForm"; - this.Text = "Ped Viewer - CodeWalker by dexyfex"; - this.Deactivate += new System.EventHandler(this.PedsForm_Deactivate); - this.Load += new System.EventHandler(this.PedsForm_Load); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PedsForm_KeyDown); - this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.PedsForm_KeyUp); - this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PedsForm_MouseDown); - this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PedsForm_MouseMove); - this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.PedsForm_MouseUp); - this.ConsolePanel.ResumeLayout(false); - this.ConsolePanel.PerformLayout(); - this.ToolsOptionsTabPage.ResumeLayout(false); - this.ToolsOptionsTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.TimeOfDayTrackBar)).EndInit(); - this.ToolsDetailsTabPage.ResumeLayout(false); - this.ToolsTexturesTabPage.ResumeLayout(false); - this.StatusStrip.ResumeLayout(false); - this.StatusStrip.PerformLayout(); - this.ToolsModelsTabPage.ResumeLayout(false); - this.ToolsPedTabPage.ResumeLayout(false); - this.ToolsPedTabPage.PerformLayout(); - this.ToolsTabControl.ResumeLayout(false); - this.ToolsPanel.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + BackColor = System.Drawing.Color.MidnightBlue; + ClientSize = new System.Drawing.Size(1148, 820); + Controls.Add(ConsolePanel); + Controls.Add(StatusStrip); + Controls.Add(ToolsPanel); + Controls.Add(ToolsPanelShowButton); + Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon"); + KeyPreview = true; + Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + Name = "PedsForm"; + Text = "Ped Viewer - CodeWalker by dexyfex"; + Deactivate += PedsForm_Deactivate; + Load += PedsForm_Load; + KeyDown += PedsForm_KeyDown; + KeyUp += PedsForm_KeyUp; + MouseDown += PedsForm_MouseDown; + MouseMove += PedsForm_MouseMove; + MouseUp += PedsForm_MouseUp; + ConsolePanel.ResumeLayout(false); + ConsolePanel.PerformLayout(); + ToolsOptionsTabPage.ResumeLayout(false); + ToolsOptionsTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)TimeOfDayTrackBar).EndInit(); + ToolsDetailsTabPage.ResumeLayout(false); + ToolsTexturesTabPage.ResumeLayout(false); + StatusStrip.ResumeLayout(false); + StatusStrip.PerformLayout(); + ToolsModelsTabPage.ResumeLayout(false); + ToolsPedTabPage.ResumeLayout(false); + ToolsPedTabPage.PerformLayout(); + tableLayoutPanel1.ResumeLayout(false); + tableLayoutPanel1.PerformLayout(); + ToolsTabControl.ResumeLayout(false); + ToolsPanel.ResumeLayout(false); + ResumeLayout(false); + PerformLayout(); } #endregion @@ -1197,5 +1496,20 @@ private System.Windows.Forms.ComboBox ClipDictComboBox; private System.Windows.Forms.Label label23; private System.Windows.Forms.CheckBox EnableRootMotionCheckBox; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.ComboBox YmtNameComboBox; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.ComboBox CompBerdTexture; + private System.Windows.Forms.ComboBox CompHeadTexture; + private System.Windows.Forms.ComboBox CompHairTexture; + private System.Windows.Forms.ComboBox CompUpprTexture; + private System.Windows.Forms.ComboBox CompLowrTexture; + private System.Windows.Forms.ComboBox CompHandTexture; + private System.Windows.Forms.ComboBox CompFeetTexture; + private System.Windows.Forms.ComboBox CompTeefTexture; + private System.Windows.Forms.ComboBox CompAccsTexture; + private System.Windows.Forms.ComboBox CompTaskTexture; + private System.Windows.Forms.ComboBox CompDeclTexture; + private System.Windows.Forms.ComboBox CompJbibTexture; } } \ No newline at end of file diff --git a/CodeWalker/PedsForm.cs b/CodeWalker/PedsForm.cs index e90e8f2..574a793 100644 --- a/CodeWalker/PedsForm.cs +++ b/CodeWalker/PedsForm.cs @@ -10,12 +10,16 @@ using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics.Arm; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using System.Xml.Linq; using Color = SharpDX.Color; namespace CodeWalker @@ -25,7 +29,6 @@ namespace CodeWalker public Form Form { get { return this; } } //for DXForm/DXManager use public Renderer Renderer { get; set; } - public object RenderSyncRoot { get { return Renderer.RenderSyncRoot; } } public bool Pauserendering { get; set; } volatile bool formopen = false; @@ -52,7 +55,7 @@ namespace CodeWalker System.Drawing.Point MouseLastPoint; - public GameFileCache GameFileCache { get; } = GameFileCacheFactory.GetInstance(); + public GameFileCache GameFileCache => GameFileCacheFactory.Instance; InputManager Input = new InputManager(); @@ -80,42 +83,73 @@ namespace CodeWalker Ped SelectedPed = new Ped(); + public class ComponentComboBoxesContainer + { + public int Index = 0; + public required ComboBox DrawableBox; + public required ComboBox TextureBox; + + [SetsRequiredMembers] + public ComponentComboBoxesContainer(ComboBox drawableBox, ComboBox textureBox) + { + DrawableBox = drawableBox; + TextureBox = textureBox; + } + } + + ComboBox[] ComponentComboBoxesOld = null; + + ComponentComboBoxesContainer[] ComponentComboBoxes = null; - ComboBox[] ComponentComboBoxes = null; public class ComponentComboItem { public MCPVDrawblData DrawableData { get; set; } public int AlternativeIndex { get; set; } - public int TextureIndex { get; set; } - public ComponentComboItem(MCPVDrawblData drawableData, int altIndex = 0, int textureIndex = -1) + public MetaHash DlcName => DrawableData?.Owner.Owner.Data.dlcName ?? default; + public int Index { get; set; } + + public string DrawableName => DrawableData?.GetDrawableName(AlternativeIndex) ?? "error"; + + public ComponentComboItem(MCPVDrawblData drawableData, int altIndex = 0, int index = 0) { DrawableData = drawableData; AlternativeIndex = altIndex; - TextureIndex = textureIndex; + Index = index; } + public override string ToString() { - if (DrawableData == null) return TextureIndex.ToString(); + if (DrawableData == null) + return $"[{Index}] {AlternativeIndex}"; var itemname = DrawableData.GetDrawableName(AlternativeIndex); - if (DrawableData.TexData?.Length > 0) return itemname + " + " + DrawableData.GetTextureSuffix(TextureIndex); - return itemname; - } - public string DrawableName - { - get - { - return DrawableData?.GetDrawableName(AlternativeIndex) ?? "error"; - } - } - public string TextureName - { - get - { - return DrawableData?.GetTextureName(TextureIndex); - } + if (DrawableData.TexData?.Length > 0) + return $"[{Index}] {DlcName}^{itemname}"; + return $"[{Index}] {itemname}{DlcName}"; } } + public class ComponentTextureItem : ComponentComboItem + { + public int TextureIndex { get; set; } + + public string TextureName => DrawableData?.GetTextureName(TextureIndex); + + public ComponentTextureItem(MCPVDrawblData drawableData, int altIndex = 0, int textureIndex = -1) : base(drawableData, altIndex) + { + TextureIndex = textureIndex; + } + + public override string ToString() + { + if (DrawableData == null) + return TextureIndex.ToString(); + + if (DrawableData.TexData?.Length > 0) + return TextureName; + + return TextureIndex.ToString(); + } + } public PedsForm() @@ -123,6 +157,22 @@ namespace CodeWalker InitializeComponent(); ComponentComboBoxes = new[] + { + new ComponentComboBoxesContainer(CompHeadComboBox, CompHeadTexture), + new ComponentComboBoxesContainer(CompBerdComboBox, CompBerdTexture), + new ComponentComboBoxesContainer(CompHairComboBox, CompHairTexture), + new ComponentComboBoxesContainer(CompUpprComboBox, CompUpprTexture), + new ComponentComboBoxesContainer(CompLowrComboBox, CompLowrTexture), + new ComponentComboBoxesContainer(CompHandComboBox, CompHandTexture), + new ComponentComboBoxesContainer(CompFeetComboBox, CompFeetTexture), + new ComponentComboBoxesContainer(CompTeefComboBox, CompTeefTexture), + new ComponentComboBoxesContainer(CompAccsComboBox, CompAccsTexture), + new ComponentComboBoxesContainer(CompTaskComboBox, CompTaskTexture), + new ComponentComboBoxesContainer(CompDeclComboBox, CompDeclTexture), + new ComponentComboBoxesContainer(CompJbibComboBox, CompJbibTexture), + }; + + ComponentComboBoxesOld = new[] { CompHeadComboBox, CompBerdComboBox, @@ -184,7 +234,7 @@ namespace CodeWalker camera.TargetRotation.X = 1.0f * (float)Math.PI; camera.CurrentRotation.X = 1.0f * (float)Math.PI; - Renderer.shaders.deferred = false; //no point using this here yet + Renderer.Shaders.deferred = false; //no point using this here yet LoadSettings(); @@ -197,7 +247,7 @@ namespace CodeWalker frametimer.Start(); } - public void CleanupScene() + public async ValueTask CleanupScene() { formopen = false; @@ -206,7 +256,7 @@ namespace CodeWalker int count = 0; while (running && (count < 5000)) //wait for the content thread to exit gracefully { - Thread.Sleep(1); + await Task.Delay(1); count++; } } @@ -224,7 +274,7 @@ namespace CodeWalker GameFileCache.BeginFrame(); - if (!Monitor.TryEnter(Renderer.RenderSyncRoot, 50)) + if (!await Renderer.RenderSyncRoot.WaitAsync(50)) { return; } //couldn't get a lock, try again next time @@ -277,7 +327,7 @@ namespace CodeWalker } finally { - Monitor.Exit(Renderer.RenderSyncRoot); + Renderer.RenderSyncRoot.Release(); } //UpdateMarkerSelectionPanelInvoke(); @@ -337,7 +387,7 @@ namespace CodeWalker } - private void ContentThread() + private async ValueTask ContentThread() { try { @@ -366,7 +416,7 @@ namespace CodeWalker GameFileCache.LoadArchetypes = false;//to speed things up a little GameFileCache.BuildExtendedJenkIndex = false;//to speed things up a little GameFileCache.DoFullStringIndex = true;//to get all global text from DLC... - GameFileCache.Init(UpdateStatus, LogError, force: false); + await GameFileCache.InitAsync(UpdateStatus, LogError, force: false); } //UpdateDlcListComboBox(gameFileCache.DlcNameList); @@ -387,14 +437,15 @@ namespace CodeWalker //UpdateStatus("Ready"); - Task.Run(async () => { + Task.Run(async () => + { while (formopen && !IsDisposed) //renderer content loop { bool rcItemsPending = Renderer.ContentThreadProc(); if (!rcItemsPending) { - await Task.Delay(ActiveForm == null ? 50 : 1).ConfigureAwait(false); + await Task.Delay(ActiveForm == null ? 50 : 2).ConfigureAwait(false); } } }); @@ -407,14 +458,14 @@ namespace CodeWalker if (!fcItemsPending) { - await Task.Delay(ActiveForm == null ? 50 : 1).ConfigureAwait(false); + await Task.Delay(ActiveForm == null ? 50 : 2).ConfigureAwait(false); } } running = false; }); } - catch(Exception ex) + catch (Exception ex) { Console.WriteLine($"Exception occured in PedsForm::ContentThread.\n{ex}"); } @@ -476,14 +527,16 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateStatus(text); })); + BeginInvoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void LogError(string text) { @@ -491,17 +544,20 @@ namespace CodeWalker { if (InvokeRequired) { - Invoke(new Action(() => { LogError(text); })); + Invoke(LogError, text); } else { //TODO: error logging.. ConsoleTextBox.AppendText(text + "\r\n"); + Console.WriteLine(text); //StatusLabel.Text = text; //MessageBox.Show(text); } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } @@ -523,7 +579,7 @@ namespace CodeWalker { //move the camera to a default place where the given sphere is fully visible. - rad = Math.Max(0.01f, rad*0.1f); + rad = Math.Max(0.01f, rad * 0.1f); camera.FollowEntity.Position = pos; camera.TargetDistance = rad * 1.2f; @@ -545,6 +601,7 @@ namespace CodeWalker var dnode = ModelsTreeView.Nodes.Add(name); dnode.Tag = drawable; dnode.Checked = check; + UpdateDrawFlags(drawable, check); AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true, dnode, tnode); AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false, dnode, tnode); @@ -555,7 +612,8 @@ namespace CodeWalker } private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null, TreeNode parentTextureNode = null) { - if (models == null) return; + if (models is null || models.Length == 0) + return; for (int mi = 0; mi < models.Length; mi++) { @@ -566,17 +624,14 @@ namespace CodeWalker var mnode = tnc.Add(mprefix + " " + model.ToString()); mnode.Tag = model; mnode.Checked = check; + UpdateDrawFlags(model, check); var ttnc = (parentTextureNode != null) ? parentTextureNode.Nodes : TexturesTreeView.Nodes; var tmnode = ttnc.Add(mprefix + " " + model.ToString()); tmnode.Tag = model; - if (!check) - { - Renderer.SelectionModelDrawFlags[model] = false; - } - - if (model.Geometries == null) continue; + if (model.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { @@ -584,11 +639,12 @@ namespace CodeWalker var gnode = mnode.Nodes.Add(gname); gnode.Tag = geom; gnode.Checked = true;// check; + UpdateDrawFlags(geom, true); var tgnode = tmnode.Nodes.Add(gname); tgnode.Tag = geom; - if ((geom.Shader != null) && (geom.Shader.ParametersList != null) && (geom.Shader.ParametersList.Hashes != null)) + if (geom.Shader?.ParametersList?.Hashes is not null) { var pl = geom.Shader.ParametersList; var h = pl.Hashes; @@ -597,14 +653,12 @@ namespace CodeWalker { var hash = pl.Hashes[ip]; var parm = pl.Parameters[ip]; - var tex = parm.Data as TextureBase; - if (tex != null) + if (parm.Data is TextureBase tex) { - var t = tex as Texture; var tstr = tex.Name.Trim(); - if (t != null) + if (tex is Texture t) { - tstr = string.Format("{0} ({1}x{2}, embedded)", tex.Name, t.Width, t.Height); + tstr = $"{tex.Name} ({t.Width}x{t.Height}, embedded)"; } var tnode = tgnode.Nodes.Add(hash.ToString().Trim() + ": " + tstr); tnode.Tag = tex; @@ -619,67 +673,74 @@ namespace CodeWalker tmnode.Expand(); } } + + private void UpdateDrawFlags(DrawableModel model, bool rem) + { + using (Renderer.RenderSyncRoot.WaitDisposable()) + { + if (rem) + { + Renderer.SelectionModelDrawFlags.Remove(model); + } + else + { + Renderer.SelectionModelDrawFlags[model] = false; + } + } + } + + private void UpdateDrawFlags(DrawableGeometry geom, bool rem) + { + using (Renderer.RenderSyncRoot.WaitDisposable()) + { + if (rem) + { + Renderer.SelectionGeometryDrawFlags.Remove(geom); + } + else + { + Renderer.SelectionGeometryDrawFlags[geom] = false; + } + } + } + + private void UpdateDrawFlags(DrawableBase drwbl, bool rem) + { + using (Renderer.RenderSyncRoot.WaitDisposable()) + { + if (rem) + { + Renderer.SelectionDrawableDrawFlags.Remove(drwbl); + } + else + { + Renderer.SelectionDrawableDrawFlags[drwbl] = false; + } + } + } + private void UpdateSelectionDrawFlags(TreeNode node) { - //update the selection draw flags depending on tag and checked/unchecked - var drwbl = node.Tag as DrawableBase; - var model = node.Tag as DrawableModel; - var geom = node.Tag as DrawableGeometry; - bool rem = node.Checked; - lock (Renderer.RenderSyncRoot) + if (node.Tag is DrawableBase drwbl) { - if (drwbl != null) - { - if (rem) - { - if (Renderer.SelectionDrawableDrawFlags.ContainsKey(drwbl)) - { - Renderer.SelectionDrawableDrawFlags.Remove(drwbl); - } - } - else - { - Renderer.SelectionDrawableDrawFlags[drwbl] = false; - } - } - if (model != null) - { - if (rem) - { - if (Renderer.SelectionModelDrawFlags.ContainsKey(model)) - { - Renderer.SelectionModelDrawFlags.Remove(model); - } - } - else - { - Renderer.SelectionModelDrawFlags[model] = false; - } - } - if (geom != null) - { - if (rem) - { - if (Renderer.SelectionGeometryDrawFlags.ContainsKey(geom)) - { - Renderer.SelectionGeometryDrawFlags.Remove(geom); - } - } - else - { - Renderer.SelectionGeometryDrawFlags[geom] = false; - } - } - //updateArchetypeStatus = true; + UpdateDrawFlags(drwbl, node.Checked); + } + else if (node.Tag is DrawableModel model) + { + UpdateDrawFlags(model, node.Checked); + } + else if (node.Tag is DrawableGeometry geom) + { + UpdateDrawFlags(geom, node.Checked); } } - private void UpdateGlobalPedsUI() + private async void UpdateGlobalPedsUI() { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateGlobalPedsUI(); })); + BeginInvoke(UpdateGlobalPedsUI); } else { @@ -692,7 +753,7 @@ namespace CodeWalker List ycdlist = new List(); foreach (var ycde in ycds) { - ycdlist.Add(ycde.ShortName); + ycdlist.Add(ycde.ShortName.ToString()); } ClipDictComboBox.AutoCompleteCustomSource.AddRange(ycdlist.ToArray()); ClipDictComboBox.Text = ""; @@ -700,6 +761,10 @@ namespace CodeWalker PedNameComboBox.Items.Clear(); + if (GameFileCache.PedsInitDict is null) + { + await GameFileCache.InitPeds(true); + } var peds = GameFileCache.PedsInitDict.Values.ToList(); peds.Sort((a, b) => { return a.Name.CompareTo(b.Name); }); foreach (var ped in peds) @@ -708,7 +773,7 @@ namespace CodeWalker } if (peds.Count > 0) { - var ind = PedNameComboBox.FindString("A_F_Y_Beach_01"); // //A_C_Pug + var ind = PedNameComboBox.FindString("MP_M_Freemode_01"); // //A_C_Pug PedNameComboBox.SelectedIndex = Math.Max(ind, 0); //PedNameComboBox.SelectedIndex = 0; } @@ -733,7 +798,8 @@ namespace CodeWalker TexturesTreeView.Nodes.Clear(); TexturesTreeView.ShowRootLines = true; - if (SelectedPed == null) return; + if (SelectedPed is null) + return; for (int i = 0; i < 12; i++) @@ -741,9 +807,11 @@ namespace CodeWalker var drawable = SelectedPed.Drawables[i]; var drawablename = SelectedPed.DrawableNames[i]; - if (drawable != null) + if (drawable is not null) { AddDrawableTreeNode(drawable, drawablename, true); + + PopulateCompComboTextures(ComponentComboBoxes[i]); } } @@ -754,39 +822,96 @@ namespace CodeWalker public async ValueTask LoadPedAsync() { + SuspendLayout(); var pedname = PedNameComboBox.Text; - var pedhash = JenkHash.GenHash(pedname.ToLowerInvariant()); + var pedhash = JenkHash.GenHashLower(pedname); var pedchange = SelectedPed.NameHash != pedhash; for (int i = 0; i < 12; i++) { - ClearCombo(ComponentComboBoxes[i]); + ClearCombo(ComponentComboBoxesOld[i]); } DetailsPropertyGrid.SelectedObject = null; - await SelectedPed.InitAsync(pedname, GameFileCache); + Console.WriteLine($"{YmtNameComboBox.SelectedItem}: {YmtNameComboBox.SelectedItem?.GetType()}"); + MetaHash? selectedDlc = null; + if (YmtNameComboBox.SelectedItem is MetaHash metaHash) + { + selectedDlc = metaHash; + } + PedFile? pedFile = YmtNameComboBox.SelectedItem as PedFile; + + await SelectedPed.InitAsync(pedname, GameFileCache, selectedDlc); + + YmtNameComboBox.Items.Clear(); + YmtNameComboBox.Items.AddRange(SelectedPed.Dlcs.Select(p => (object)p).ToArray()); + + YmtNameComboBox.SelectedItem = SelectedPed.Ymt; LoadModel(SelectedPed.Yft, pedchange); - - var vi = SelectedPed.Ymt?.VariationInfo; - if (vi != null) + if (SelectedPed.Ymts?.Count > 0) { - for (int i = 0; i < 12; i++) + foreach (var comboBox in ComponentComboBoxes) { - PopulateCompCombo(ComponentComboBoxes[i], vi.GetComponentData(i)); + comboBox.DrawableBox.BeginUpdate(); + comboBox.TextureBox.BeginUpdate(); + comboBox.Index = 0; + } + try + { + foreach (var ymt in SelectedPed.Ymts) + { + var vi = ymt.VariationInfo; + if (vi is not null) + { + for (int i = 0; i < 12; i++) + { + PopulateCompCombo(ComponentComboBoxes[i], vi.GetComponentData(i)); + } + } + } + } + finally + { + foreach (var comboBox in ComponentComboBoxes) + { + if (comboBox.DrawableBox.Items.Count > 1) + { + comboBox.DrawableBox.SelectedIndex = 1; + } + if (comboBox.TextureBox.Items.Count > 1) + { + comboBox.TextureBox.SelectedIndex = 0; + } + } + foreach (var comboBox in ComponentComboBoxes) + { + comboBox.DrawableBox.EndUpdate(); + comboBox.TextureBox.EndUpdate(); + } } } + //var vi = SelectedPed.Ymt?.VariationInfo; + //if (vi != null) + //{ + // for (int i = 0; i < 12; i++) + // { + // PopulateCompCombo(ComponentComboBoxes[i], vi.GetComponentData(i)); + // } + //} + ClipDictComboBox.Text = SelectedPed.InitData?.ClipDictionaryName ?? ""; ClipComboBox.Text = "idle"; + UpdateModelsUI(); + ResumeLayout(true); DetailsPropertyGrid.SelectedObject = SelectedPed; - - UpdateModelsUI(); - + DetailsPropertyGrid.Invalidate(); + DetailsPropertyGrid.Update(); } public void LoadModel(YftFile yft, bool movecamera = true) @@ -813,40 +938,69 @@ namespace CodeWalker c.Items.Add(""); c.Text = string.Empty; } - private void PopulateCompCombo(ComboBox c, MCPVComponentData compData) + + private void PopulateCompComboTextures(ComponentComboBoxesContainer c) + { + if (c.DrawableBox.SelectedItem is not ComponentComboItem selectedDrawable || selectedDrawable.DrawableData is null) + return; + + if (c.TextureBox.SelectedItem is ComponentTextureItem selectedTexture) + { + if (selectedTexture.DrawableData == selectedDrawable.DrawableData) + { + return; + } + } + + c.TextureBox.BeginUpdate(); + + c.TextureBox.Items.Clear(); + + var item = selectedDrawable.DrawableData; + + if (item.TexData?.Length > 0) + { + for (int tex = 0; tex < item.TexData.Length; tex++) + { + c.TextureBox.Items.Add(new ComponentTextureItem(item, selectedDrawable.AlternativeIndex, tex)); + } + } + + c.TextureBox.SelectedIndex = 0; + + c.TextureBox.EndUpdate(); + } + + private void PopulateCompCombo(ComponentComboBoxesContainer c, MCPVComponentData compData) { if (compData?.DrawblData3 == null) return; foreach (var item in compData.DrawblData3) { for (int alt = 0; alt <= item.NumAlternatives; alt++) { - if (item.TexData?.Length > 0) - { - for (int tex = 0; tex < item.TexData.Length; tex++) - { - c.Items.Add(new ComponentComboItem(item, alt, tex)); - } - } - else - { - c.Items.Add(new ComponentComboItem(item)); - } + c.DrawableBox.Items.Add(new ComponentComboItem(item, alt, c.Index)); + //if (item.TexData?.Length > 0) + //{ + // for (int tex = 0; tex < item.TexData.Length; tex++) + // { + // c.TextureBox.Items.Add(new ComponentTextureItem(item, alt, tex)); + // } + //} } - } - if (compData.DrawblData3.Length > 0) - { - c.SelectedIndex = 1; + c.Index++; } } - private async ValueTask SetComponentDrawableAsync(int index, object comboObj) + private async ValueTask SetComponentDrawableAsync(int index) { - - var comboItem = comboObj as ComponentComboItem; + var comboBoxes = ComponentComboBoxes[index]; + var comboItem = comboBoxes.DrawableBox.SelectedItem as ComponentComboItem; + var textureItem = comboBoxes.TextureBox.SelectedItem as ComponentTextureItem; var name = comboItem?.DrawableName; - var tex = comboItem?.TextureName; + var tex = textureItem?.TextureName; + var dlc = comboItem?.DlcName ?? 0; - await SelectedPed.SetComponentDrawableAsync(index, name, tex, GameFileCache); + await SelectedPed.SetComponentDrawableAsync(index, name, tex, dlc, GameFileCache); UpdateModelsUI(); } @@ -1356,7 +1510,7 @@ namespace CodeWalker private void ModelsTreeView_AfterCheck(object sender, TreeViewEventArgs e) { - if (e.Node != null) + if (e.Node is not null) { UpdateSelectionDrawFlags(e.Node); } @@ -1378,17 +1532,33 @@ namespace CodeWalker private void HDRRenderingCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + if (Renderer.Shaders is null) + return; + + Renderer.RenderSyncRoot.Wait(); + try { - Renderer.shaders.hdr = HDRRenderingCheckBox.Checked; + Renderer.Shaders.hdr = HDRRenderingCheckBox.Checked; + } + finally + { + Renderer.RenderSyncRoot.Release(); } } private void ShadowsCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + if (Renderer.Shaders is null) + return; + + Renderer.RenderSyncRoot.Wait(); + try { - Renderer.shaders.shadows = ShadowsCheckBox.Checked; + Renderer.Shaders.shadows = ShadowsCheckBox.Checked; + } + finally + { + Renderer.RenderSyncRoot.Release(); } } @@ -1408,7 +1578,7 @@ namespace CodeWalker int v = TimeOfDayTrackBar.Value; float fh = v / 60.0f; UpdateTimeOfDayLabel(); - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { Renderer.timeofday = fh; timecycle.SetTime(Renderer.timeofday); @@ -1423,12 +1593,12 @@ namespace CodeWalker private void WireframeCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.wireframe = WireframeCheckBox.Checked; + Renderer.Shaders.wireframe = WireframeCheckBox.Checked; } private void AnisotropicFilteringCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.AnisotropicFiltering = AnisotropicFilteringCheckBox.Checked; + Renderer.Shaders.AnisotropicFiltering = AnisotropicFilteringCheckBox.Checked; } private void HDTexturesCheckBox_CheckedChanged(object sender, EventArgs e) @@ -1444,42 +1614,42 @@ namespace CodeWalker { default: case "Default": - Renderer.shaders.RenderMode = WorldRenderMode.Default; + Renderer.Shaders.RenderMode = WorldRenderMode.Default; break; case "Single texture": - Renderer.shaders.RenderMode = WorldRenderMode.SingleTexture; + Renderer.Shaders.RenderMode = WorldRenderMode.SingleTexture; TextureSamplerComboBox.Enabled = true; TextureCoordsComboBox.Enabled = true; break; case "Vertex normals": - Renderer.shaders.RenderMode = WorldRenderMode.VertexNormals; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexNormals; break; case "Vertex tangents": - Renderer.shaders.RenderMode = WorldRenderMode.VertexTangents; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexTangents; break; case "Vertex colour 1": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 1; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 1; break; case "Vertex colour 2": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 2; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 2; break; case "Vertex colour 3": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 3; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 3; break; case "Texture coord 1": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 1; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 1; break; case "Texture coord 2": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 2; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 2; break; case "Texture coord 3": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 3; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 3; break; } } @@ -1488,7 +1658,7 @@ namespace CodeWalker { if (TextureSamplerComboBox.SelectedItem is ShaderParamNames) { - Renderer.shaders.RenderTextureSampler = (ShaderParamNames)TextureSamplerComboBox.SelectedItem; + Renderer.Shaders.RenderTextureSampler = (ShaderParamNames)TextureSamplerComboBox.SelectedItem; } } @@ -1498,13 +1668,13 @@ namespace CodeWalker { default: case "Texture coord 1": - Renderer.shaders.RenderTextureSamplerCoord = 1; + Renderer.Shaders.RenderTextureSamplerCoord = 1; break; case "Texture coord 2": - Renderer.shaders.RenderTextureSamplerCoord = 2; + Renderer.Shaders.RenderTextureSamplerCoord = 2; break; case "Texture coord 3": - Renderer.shaders.RenderTextureSamplerCoord = 3; + Renderer.Shaders.RenderTextureSamplerCoord = 3; break; } } @@ -1583,69 +1753,82 @@ namespace CodeWalker private async void PedNameComboBox_SelectedIndexChanged(object sender, EventArgs e) { - if (!GameFileCache.IsInited) return; + if (!GameFileCache.IsInited) + { + return; + } + + await LoadPedAsync(); + } + + private async void YmtNameCombaBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (!GameFileCache.IsInited) + { + return; + } await LoadPedAsync(); } private async void CompHeadComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(0, CompHeadComboBox.SelectedItem); + await SetComponentDrawableAsync(0); } private async void CompBerdComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(1, CompBerdComboBox.SelectedItem); + await SetComponentDrawableAsync(1); } private async void CompHairComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(2, CompHairComboBox.SelectedItem); + await SetComponentDrawableAsync(2); } private async void CompUpprComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(3, CompUpprComboBox.SelectedItem); + await SetComponentDrawableAsync(3); } private async void CompLowrComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(4, CompLowrComboBox.SelectedItem); + await SetComponentDrawableAsync(4); } private async void CompHandComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(5, CompHandComboBox.SelectedItem); + await SetComponentDrawableAsync(5); } private async void CompFeetComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(6, CompFeetComboBox.SelectedItem); + await SetComponentDrawableAsync(6); } private async void CompTeefComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(7, CompTeefComboBox.SelectedItem); + await SetComponentDrawableAsync(7); } private async void CompAccsComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(8, CompAccsComboBox.SelectedItem); + await SetComponentDrawableAsync(8); } private async void CompTaskComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(9, CompTaskComboBox.SelectedItem); + await SetComponentDrawableAsync(9); } private async void CompDeclComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(10, CompDeclComboBox.SelectedItem); + await SetComponentDrawableAsync(10); } private async void CompJbibComboBox_SelectedIndexChanged(object sender, EventArgs e) { - await SetComponentDrawableAsync(11, CompJbibComboBox.SelectedItem); + await SetComponentDrawableAsync(11); } private void ClipDictComboBox_TextChanged(object sender, EventArgs e) @@ -1662,5 +1845,70 @@ namespace CodeWalker { SelectedPed.EnableRootMotion = EnableRootMotionCheckBox.Checked; } + + private void label24_Click(object sender, EventArgs e) + { + + } + + private async void CompHeadTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(0); + } + + private async void CompBerdTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(1); + } + + private async void CompHairTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(2); + } + + private async void CompUpprTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(3); + } + + private async void CompLowrTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(4); + } + + private async void CompHandTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(5); + } + + private async void CompFeetTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(6); + } + + private async void CompTeefTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(7); + } + + private async void CompAccsTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(8); + } + + private async void CompTaskTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(9); + } + + private async void CompDeclTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(10); + } + + private async void CompJbibTexture_SelectedIndexChanged(object sender, EventArgs e) + { + await SetComponentDrawableAsync(11); + } } } diff --git a/CodeWalker/PedsForm.resx b/CodeWalker/PedsForm.resx index 6d73dea..c38b0b7 100644 --- a/CodeWalker/PedsForm.resx +++ b/CodeWalker/PedsForm.resx @@ -1,17 +1,17 @@  - diff --git a/CodeWalker/Program.cs b/CodeWalker/Program.cs index feb85de..de2a471 100644 --- a/CodeWalker/Program.cs +++ b/CodeWalker/Program.cs @@ -5,6 +5,7 @@ using CodeWalker.Properties; using CodeWalker.Utils; using System; using System.Collections.Generic; +using System.Configuration; using System.Diagnostics; using System.Globalization; using System.IO; @@ -17,7 +18,7 @@ using System.Windows.Forms; using System.Windows.Shell; namespace CodeWalker; -static class Program +public static class Program { /// /// The main entry point for the application. @@ -25,16 +26,18 @@ static class Program [STAThread] static void Main(string[] args) { - Task.Run(() => + ConsoleWindow.Hide(); + _ = Task.Run(() => { CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; - ConsoleWindow.Hide(); + Application.ThreadException += (object sender, ThreadExceptionEventArgs e) => { Console.WriteLine($"Unhandeled exception occured: {e.Exception}"); }; }); + LoadConfig(); bool menumode = false; bool explorermode = false; bool projectmode = false; @@ -81,7 +84,7 @@ static class Program } } - Task.Run(EnsureJumpList); + EnsureJumpList(); //Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); @@ -108,7 +111,7 @@ static class Program { var form = new ExploreForm(); var namedPipe = new NamedPipe(form); - namedPipe.Init(); + namedPipe.StartServer(); Application.Run(form); } } @@ -122,7 +125,11 @@ static class Program } else if (pedsmode) { - Application.Run(new PedsForm()); + if (!NamedPipe.TrySendMessageToOtherProcess("peds-mode")) + { + var form = new PedsForm(); + Application.Run(form); + } } else if (path != null) { @@ -147,7 +154,7 @@ static class Program { var form = new WorldForm(); var namedPipe = new NamedPipe(form); - namedPipe.Init(); + namedPipe.StartServer(); Application.Run(form); } #if !DEBUG @@ -155,18 +162,59 @@ static class Program catch (Exception ex) { MessageBox.Show("An unexpected error was encountered!\n" + ex.ToString()); + Console.WriteLine(ex); //this can happen if folder wasn't chosen, or in some other catastrophic error. meh. } #endif } + public static void LoadConfig() + { + using var _ = new DisposableTimer("LoadConfig"); + string configPath = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath; + if (!File.Exists(configPath)) + { + Console.WriteLine("Upgrading config"); + //Existing user config does not exist, so load settings from previous assembly + Settings.Default.Upgrade(); + Settings.Default.Reload(); + Settings.Default.Save(); + } + //if (Settings.Default.UpgradeRequired) + //{ + //Console.WriteLine($"Upgrading config {Settings.Default.UpgradeRequired}"); + //Settings.Default.SettingsSaving += (sender, args) => + //{ + // Console.WriteLine($"Saving settings {Settings.Default.UpgradeRequired}"); + //}; + //Settings.Default.PropertyChanged += (sender, args) => + //{ + // Console.WriteLine($"Property {args.PropertyName} Changed {Settings.Default[args.PropertyName]}"); + //}; + //Settings.Default.SettingChanging += (sender, args) => + //{ + // Console.WriteLine($"Settings Changing {args.SettingName} from {Settings.Default[args.SettingName]} to {args.NewValue}"); + //}; + // Settings.Default.Upgrade(); + // Console.WriteLine(Settings.Default.UpgradeRequired); + // Settings.Default.UpgradeRequired = true; + // Settings.Default.UpgradeRequired = false; + // Settings.Default.Save(); + //} + } static void EnsureJumpList() { - if (Settings.Default.JumpListInitialised) return; + if (Settings.Default.JumpListInitialised) + { + Console.WriteLine("Jump list already initialized"); + return; + } try { + Console.WriteLine("Initializing jump list"); + Application.OleRequired(); var cwpath = Assembly.GetEntryAssembly().Location; var cwdir = Path.GetDirectoryName(cwpath); @@ -220,7 +268,7 @@ static class Program } catch (Exception ex) { - Console.WriteLine($"Initializing console failed {ex}"); + Console.WriteLine($"Initializing jump list failed {ex}"); } } } \ No newline at end of file diff --git a/CodeWalker/Project/MenyooXml.cs b/CodeWalker/Project/MenyooXml.cs index ec7830d..83d09fb 100644 --- a/CodeWalker/Project/MenyooXml.cs +++ b/CodeWalker/Project/MenyooXml.cs @@ -120,9 +120,6 @@ namespace CodeWalker.Project public void Init(XmlNode node) { - - XmlElement enode = node as XmlElement; - var hashstr = Xml.GetChildInnerText(node, "ModelHash"); if (hashstr.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) hashstr = hashstr.Substring(2); ModelHash = Convert.ToUInt32(hashstr, 16); @@ -133,7 +130,7 @@ namespace CodeWalker.Project HashName = Xml.GetChildInnerText(node, "HashName"); InitialHandle = Xml.GetChildIntInnerText(node, "InitialHandle"); - if (enode != null) + if (node is XmlElement enode) { var objprops = Xml.GetChild(enode, "ObjectProperties"); ObjectProperties = new List(); diff --git a/CodeWalker/Project/Panels/EditAudioEmitterListPanel.cs b/CodeWalker/Project/Panels/EditAudioEmitterListPanel.cs index 306913c..9f61177 100644 --- a/CodeWalker/Project/Panels/EditAudioEmitterListPanel.cs +++ b/CodeWalker/Project/Panels/EditAudioEmitterListPanel.cs @@ -1,4 +1,5 @@ using CodeWalker.GameFiles; +using Collections.Pooled; using System; using System.Collections.Generic; using System.ComponentModel; @@ -122,14 +123,13 @@ namespace CodeWalker.Project.Panels var hashstrs = HashesTextBox.Text.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); if (hashstrs?.Length > 0) { - var hashlist = new List(); + using var hashlist = new PooledList(); foreach (var hashstr in hashstrs) { - uint hash = 0; - if (!uint.TryParse(hashstr, out hash))//don't re-hash hashes + if (!uint.TryParse(hashstr, out var hash))//don't re-hash hashes { hash = JenkHash.GenHash(hashstr); - JenkIndex.Ensure(hashstr); + JenkIndex.Ensure(hashstr, hash); } hashlist.Add(hash); } diff --git a/CodeWalker/Project/Panels/EditAudioEmitterPanel.cs b/CodeWalker/Project/Panels/EditAudioEmitterPanel.cs index 4f4e9f2..9f0e53c 100644 --- a/CodeWalker/Project/Panels/EditAudioEmitterPanel.cs +++ b/CodeWalker/Project/Panels/EditAudioEmitterPanel.cs @@ -43,7 +43,7 @@ namespace CodeWalker.Project.Panels private void UpdateUI() { - if (CurrentEmitter?.AudioEmitter == null) + if (CurrentEmitter?.AudioEmitter is null) { AddToProjectButton.Enabled = false; DeleteButton.Enabled = false; @@ -144,8 +144,10 @@ namespace CodeWalker.Project.Panels private void NameTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter is null) + return; uint hash = 0; string name = NameTextBox.Text; @@ -168,8 +170,10 @@ namespace CodeWalker.Project.Panels private void PositionTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter is null) + return; var vec = FloatUtil.ParseVector3String(PositionTextBox.Text); if (CurrentEmitter.AudioEmitter.Position != vec) @@ -191,8 +195,10 @@ namespace CodeWalker.Project.Panels private void InnerRadiusTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter is null) + return; float rad = FloatUtil.Parse(InnerRadiusTextBox.Text); if (CurrentEmitter.AudioEmitter.InnerRadius != rad) @@ -205,8 +211,10 @@ namespace CodeWalker.Project.Panels private void OuterRadiusTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter is null) + return; float rad = FloatUtil.Parse(OuterRadiusTextBox.Text); if (CurrentEmitter.AudioEmitter.OuterRadius != rad) @@ -219,8 +227,10 @@ namespace CodeWalker.Project.Panels private void ChildSoundTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter is null) + return; uint hash = 0; string name = ChildSoundTextBox.Text; @@ -241,8 +251,10 @@ namespace CodeWalker.Project.Panels private void CategoryTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter is null) + return; uint hash = 0; string name = CategoryTextBox.Text; @@ -263,8 +275,10 @@ namespace CodeWalker.Project.Panels private void Unk01TextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; float unk = FloatUtil.Parse(Unk01TextBox.Text); if (CurrentEmitter.AudioEmitter.Unk01 != unk) @@ -277,8 +291,10 @@ namespace CodeWalker.Project.Panels private void StartTimeUpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; ushort unk = (ushort)StartTimeUpDown.Value; if (CurrentEmitter.AudioEmitter.StartTime != unk) @@ -291,8 +307,10 @@ namespace CodeWalker.Project.Panels private void EndTimeUpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; ushort unk = (ushort)EndTimeUpDown.Value; if (CurrentEmitter.AudioEmitter.EndTime != unk) @@ -305,8 +323,10 @@ namespace CodeWalker.Project.Panels private void FrequencyUpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; ushort unk = (ushort)FrequencyUpDown.Value; if (CurrentEmitter.AudioEmitter.Frequency.Value != unk) @@ -319,8 +339,10 @@ namespace CodeWalker.Project.Panels private void Unk07UpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; ushort unk = (ushort)Unk07UpDown.Value; if (CurrentEmitter.AudioEmitter.Unk07.Value != unk) @@ -333,8 +355,10 @@ namespace CodeWalker.Project.Panels private void Unk08UpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; byte unk = (byte)Unk08UpDown.Value; if (CurrentEmitter.AudioEmitter.Unk08.Value != unk) @@ -347,8 +371,10 @@ namespace CodeWalker.Project.Panels private void Unk09UpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; byte unk = (byte)Unk09UpDown.Value; if (CurrentEmitter.AudioEmitter.Unk09.Value != unk) @@ -361,8 +387,10 @@ namespace CodeWalker.Project.Panels private void Unk10UpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; byte unk = (byte)Unk10UpDown.Value; if (CurrentEmitter.AudioEmitter.Unk10.Value != unk) @@ -375,8 +403,10 @@ namespace CodeWalker.Project.Panels private void Unk11UpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; byte unk = (byte)Unk11UpDown.Value; if (CurrentEmitter.AudioEmitter.Unk11.Value != unk) @@ -389,8 +419,10 @@ namespace CodeWalker.Project.Panels private void Unk12UpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; byte unk = (byte)Unk12UpDown.Value; if (CurrentEmitter.AudioEmitter.Unk12.Value != unk) @@ -403,8 +435,10 @@ namespace CodeWalker.Project.Panels private void Unk13UpDown_ValueChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; byte unk = (byte)Unk13UpDown.Value; if (CurrentEmitter.AudioEmitter.Unk13.Value != unk) @@ -417,8 +451,10 @@ namespace CodeWalker.Project.Panels private void Flags0TextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; uint flags = 0; if (uint.TryParse(Flags0TextBox.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out flags)) @@ -434,8 +470,10 @@ namespace CodeWalker.Project.Panels private void Flags1TextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; uint flags = 0; if (uint.TryParse(Flags1TextBox.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out flags)) @@ -451,8 +489,10 @@ namespace CodeWalker.Project.Panels private void Flags2TextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; uint flags = 0; if (uint.TryParse(Flags2TextBox.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out flags)) @@ -468,8 +508,10 @@ namespace CodeWalker.Project.Panels private void Flags3TextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; uint flags = 0; if (uint.TryParse(Flags3TextBox.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out flags)) @@ -485,8 +527,10 @@ namespace CodeWalker.Project.Panels private void Flags4TextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; uint flags = 0; if (uint.TryParse(Flags4TextBox.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out flags)) @@ -502,8 +546,10 @@ namespace CodeWalker.Project.Panels private void Flags5TextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; uint flags = 0; if (uint.TryParse(Flags5TextBox.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out flags)) @@ -519,8 +565,10 @@ namespace CodeWalker.Project.Panels private void VariablesTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentEmitter?.AudioEmitter == null) return; + if (populatingui) + return; + if (CurrentEmitter?.AudioEmitter == null) + return; var paramstrs = VariablesTextBox.Text.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); if (paramstrs?.Length > 0) @@ -531,7 +579,6 @@ namespace CodeWalker.Project.Panels var paramvals = paramstr.Split(','); if (paramvals?.Length == 3) { - var param = new Dat151AmbientRule.Variable(); var hashstr = paramvals[0].Trim(); var valstr = paramvals[1].Trim(); var flgstr = paramvals[2].Trim(); @@ -543,9 +590,12 @@ namespace CodeWalker.Project.Panels } uint flags = 0; uint.TryParse(flgstr, out flags); - param.Name = hash; - param.Value = FloatUtil.Parse(valstr); - param.Flags = flags; + var param = new Dat151AmbientRule.Variable + { + Name = hash, + Value = FloatUtil.Parse(valstr), + Flags = flags, + }; paramlist.Add(param); } } @@ -559,15 +609,17 @@ namespace CodeWalker.Project.Panels private void GoToButton_Click(object sender, EventArgs e) { - if (CurrentEmitter == null) return; - if (ProjectForm.WorldForm == null) return; + if (CurrentEmitter == null) + return; + if (ProjectForm.WorldForm == null) + return; ProjectForm.WorldForm.GoToPosition(CurrentEmitter.Position, CurrentEmitter.AudioZone.PlaybackZoneSize); } - private void AddToProjectButton_Click(object sender, EventArgs e) + private async void AddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.SetProjectItem(CurrentEmitter); - ProjectForm.AddAudioFileToProject(CurrentEmitter.RelFile); + await ProjectForm.AddAudioFileToProject(CurrentEmitter.RelFile); } private void DeleteButton_Click(object sender, EventArgs e) diff --git a/CodeWalker/Project/Panels/EditAudioZonePanel.cs b/CodeWalker/Project/Panels/EditAudioZonePanel.cs index ac11e26..01f5585 100644 --- a/CodeWalker/Project/Panels/EditAudioZonePanel.cs +++ b/CodeWalker/Project/Panels/EditAudioZonePanel.cs @@ -568,8 +568,11 @@ namespace CodeWalker.Project.Panels private void DependentAmbiencesTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentZone?.AudioZone == null) return; + if (populatingui) + return; + if (CurrentZone?.AudioZone == null) + return; + var paramstrs = DependentAmbiencesTextBox.Text.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); if (paramstrs?.Length > 0) @@ -609,10 +612,10 @@ namespace CodeWalker.Project.Panels ProjectForm.WorldForm.GoToPosition(CurrentZone.Position, CurrentZone.AudioZone.PlaybackZoneSize); } - private void AddToProjectButton_Click(object sender, EventArgs e) + private async void AddToProjectButton_Click(object sender, EventArgs e) { ProjectForm.SetProjectItem(CurrentZone); - ProjectForm.AddAudioFileToProject(CurrentZone.RelFile); + await ProjectForm.AddAudioFileToProject(CurrentZone.RelFile); } private void DeleteButton_Click(object sender, EventArgs e) diff --git a/CodeWalker/Project/Panels/EditMultiPanel.cs b/CodeWalker/Project/Panels/EditMultiPanel.cs index cfd05e3..6c46e51 100644 --- a/CodeWalker/Project/Panels/EditMultiPanel.cs +++ b/CodeWalker/Project/Panels/EditMultiPanel.cs @@ -41,8 +41,10 @@ namespace CodeWalker.Project.Panels private void LoadItems() { - MultiItem = new MapSelection(); - MultiItem.WorldForm = ProjectForm.WorldForm; + MultiItem = new MapSelection() + { + WorldForm = ProjectForm.WorldForm + }; MultiItem.Clear(); MultiItem.SetMultipleSelectionItems(Items); diff --git a/CodeWalker/Project/Panels/EditProjectManifestPanel.cs b/CodeWalker/Project/Panels/EditProjectManifestPanel.cs index 45f009a..35cd332 100644 --- a/CodeWalker/Project/Panels/EditProjectManifestPanel.cs +++ b/CodeWalker/Project/Panels/EditProjectManifestPanel.cs @@ -71,10 +71,10 @@ namespace CodeWalker.Project.Panels sb.AppendLine(" "); - var getYtypName = new Func((ytyp) => + var getYtypName = new Func((ytyp) => { var ytypname = ytyp?.RpfFileEntry?.Name; - if (ytyp != null) + if (ytyp is not null) { if (string.IsNullOrEmpty(ytypname)) { @@ -108,7 +108,7 @@ namespace CodeWalker.Project.Panels mapdeps.Clear(); bool ismilo = false; - if (ymap.AllEntities != null) + if (ymap.AllEntities is not null) { foreach (var ent in ymap.AllEntities) { @@ -122,7 +122,7 @@ namespace CodeWalker.Project.Panels if (ent.IsMlo) { ismilo = true; - if (ent.MloInstance?.Entities != null) + if (ent.MloInstance?.Entities != null && ent.MloInstance.Entities.Length > 0) { Dictionary typdepdict; if (!typdeps.TryGetValue(ytypname, out typdepdict)) @@ -144,7 +144,7 @@ namespace CodeWalker.Project.Panels } } - if (ymap.GrassInstanceBatches != null) + if (ymap.GrassInstanceBatches != null && ymap.GrassInstanceBatches.Length > 0) { foreach (var batch in ymap.GrassInstanceBatches) { @@ -182,15 +182,14 @@ namespace CodeWalker.Project.Panels sb.AppendLine(" "); } - if ((CurrentProjectFile.YtypFiles.Count > 0) && (ProjectForm?.GameFileCache != null)) + if (CurrentProjectFile.YtypFiles.Count > 0 && ProjectForm.GameFileCache is not null) { foreach (var ytyp in CurrentProjectFile.YtypFiles) { var ytypname = getYtypName(ytyp); foreach (var archm in ytyp.AllArchetypes) { - var mloa = archm as MloArchetype; - if (mloa != null) + if (archm is MloArchetype mloa) { interiors.Add(mloa.Name); Dictionary typdepdict; @@ -207,7 +206,7 @@ namespace CodeWalker.Project.Panels var arch = ProjectForm.GameFileCache.GetArchetype(archname); var iytyp = arch?.Ytyp; var iytypname = getYtypName(iytyp); - if ((iytyp != null) && (iytypname != ytypname)) + if (iytyp is not null && iytypname != ytypname) { typdepdict[iytypname] = iytyp; } diff --git a/CodeWalker/Project/Panels/EditScenarioNodePanel.cs b/CodeWalker/Project/Panels/EditScenarioNodePanel.cs index 3b47cbd..1837c4c 100644 --- a/CodeWalker/Project/Panels/EditScenarioNodePanel.cs +++ b/CodeWalker/Project/Panels/EditScenarioNodePanel.cs @@ -131,13 +131,16 @@ namespace CodeWalker.Project.Panels { return; } var stypes = types.GetScenarioTypeRefs(); - if (stypes == null) return; + if (stypes.Length == 0) + return; var pmsets = types.GetPedModelSets(); - if (pmsets == null) return; + if (pmsets.Length == 0) + return; var vmsets = types.GetVehicleModelSets(); - if (vmsets == null) return; + if (vmsets.Length == 0) + return; ScenarioPointTypeComboBox.Items.Clear(); ScenarioPointTypeComboBox.Items.Add(""); @@ -1191,8 +1194,7 @@ namespace CodeWalker.Project.Panels private void ScenarioEntityPointsListBox_DoubleClick(object sender, EventArgs e) { - var item = ScenarioEntityPointsListBox.SelectedItem as MCExtensionDefSpawnPoint; - if (item == null) return; + if (ScenarioEntityPointsListBox.SelectedItem is not MCExtensionDefSpawnPoint item) return; var nodes = CurrentScenario?.ScenarioRegion?.Nodes; if (nodes == null) return; @@ -2035,8 +2037,7 @@ namespace CodeWalker.Project.Panels private void ScenarioClusterPointsListBox_DoubleClick(object sender, EventArgs e) { - var item = ScenarioClusterPointsListBox.SelectedItem as MCScenarioPoint; - if (item == null) return; + if (ScenarioClusterPointsListBox.SelectedItem is not MCScenarioPoint item) return; var nodes = CurrentScenario?.ScenarioRegion?.Nodes; if (nodes == null) return; diff --git a/CodeWalker/Project/Panels/EditYmapGrassPanel.cs b/CodeWalker/Project/Panels/EditYmapGrassPanel.cs index fd5a5f8..6b2105e 100644 --- a/CodeWalker/Project/Panels/EditYmapGrassPanel.cs +++ b/CodeWalker/Project/Panels/EditYmapGrassPanel.cs @@ -203,7 +203,7 @@ namespace CodeWalker.Project.Panels if (d == DialogResult.No) return; - lock (ProjectForm.WorldForm.RenderSyncRoot) + using (ProjectForm.WorldForm.RenderSyncRoot.WaitDisposable()) { var newBatches = CurrentBatch?.OptimizeInstances(CurrentBatch, (float)OptmizationThresholdNumericUpDown.Value); if (newBatches == null || newBatches.Length <= 0) return; @@ -243,7 +243,7 @@ namespace CodeWalker.Project.Panels var wf = ProjectForm.WorldForm; if (wf == null) return; - lock (wf.RenderSyncRoot) + using (wf.RenderSyncRoot.WaitDisposable()) { CurrentBatch.CreateInstancesAtMouse( CurrentBatch, @@ -269,7 +269,8 @@ namespace CodeWalker.Project.Panels private SpaceRayIntersectResult SpawnRayFunc(Vector3 spawnPos) { - var res = ProjectForm.WorldForm.Raycast(new Ray(spawnPos, -Vector3.UnitZ)); + var ray = new Ray(spawnPos, -Vector3.UnitZ); + var res = ProjectForm.WorldForm.Raycast(ref ray); return res; } diff --git a/CodeWalker/Project/Panels/EditYmapPanel.cs b/CodeWalker/Project/Panels/EditYmapPanel.cs index d82fa9a..6f4968b 100644 --- a/CodeWalker/Project/Panels/EditYmapPanel.cs +++ b/CodeWalker/Project/Panels/EditYmapPanel.cs @@ -92,32 +92,37 @@ namespace CodeWalker.Project.Panels else { populatingui = true; - var md = Ymap.CMapData; - if (md.name.Hash == 0) + try { - string name = Path.GetFileNameWithoutExtension(Ymap.Name); - JenkIndex.Ensure(name); - md.name = new MetaHash(JenkHash.GenHash(name)); + var md = Ymap.CMapData; + if (md.name.Hash == 0) + { + string name = Path.GetFileNameWithoutExtension(Ymap.Name); + JenkIndex.Ensure(name); + md.name = new MetaHash(JenkHash.GenHash(name)); + } + + var project = ProjectForm?.CurrentProjectFile; + + YmapNameTextBox.Text = md.name.ToString(); + YmapNameHashLabel.Text = "Hash: " + md.name.Hash.ToString(); + YmapParentTextBox.Text = md.parent.ToString(); + YmapParentHashLabel.Text = "Hash: " + md.parent.Hash.ToString(); + YmapEntitiesExtentsMinTextBox.Text = FloatUtil.GetVector3String(md.entitiesExtentsMin); + YmapEntitiesExtentsMaxTextBox.Text = FloatUtil.GetVector3String(md.entitiesExtentsMax); + YmapStreamingExtentsMinTextBox.Text = FloatUtil.GetVector3String(md.streamingExtentsMin); + YmapStreamingExtentsMaxTextBox.Text = FloatUtil.GetVector3String(md.streamingExtentsMax); + YmapFileLocationTextBox.Text = Ymap.RpfFileEntry?.Path ?? Ymap.FilePath; + YmapProjectPathTextBox.Text = (project != null) ? project.GetRelativePath(Ymap.FilePath) : Ymap.FilePath; + + UpdateYmapFlagsUI(true, true); + + UpdateYmapPhysicsDictionariesUI(); + } + finally + { + populatingui = false; } - - var project = ProjectForm?.CurrentProjectFile; - - YmapNameTextBox.Text = md.name.ToString(); - YmapNameHashLabel.Text = "Hash: " + md.name.Hash.ToString(); - YmapParentTextBox.Text = md.parent.ToString(); - YmapParentHashLabel.Text = "Hash: " + md.parent.Hash.ToString(); - YmapEntitiesExtentsMinTextBox.Text = FloatUtil.GetVector3String(md.entitiesExtentsMin); - YmapEntitiesExtentsMaxTextBox.Text = FloatUtil.GetVector3String(md.entitiesExtentsMax); - YmapStreamingExtentsMinTextBox.Text = FloatUtil.GetVector3String(md.streamingExtentsMin); - YmapStreamingExtentsMaxTextBox.Text = FloatUtil.GetVector3String(md.streamingExtentsMax); - YmapFileLocationTextBox.Text = Ymap.RpfFileEntry?.Path ?? Ymap.FilePath; - YmapProjectPathTextBox.Text = (project != null) ? project.GetRelativePath(Ymap.FilePath) : Ymap.FilePath; - - UpdateYmapFlagsUI(true, true); - - UpdateYmapPhysicsDictionariesUI(); - - populatingui = false; ////struct CMapData: //MetaHash name { get; set; } //8 8: Hash: 0: name @@ -147,7 +152,8 @@ namespace CodeWalker.Project.Panels private void UpdateYmapFlagsUI(bool updateCheckboxes, bool updateTextboxes) { - if (Ymap == null) return; + if (Ymap == null) + return; var md = Ymap.CMapData; var flags = md.flags; @@ -179,7 +185,7 @@ namespace CodeWalker.Project.Panels private void UpdateYmapPhysicsDictionariesUI() { - if ((Ymap == null) || (Ymap.physicsDictionaries == null)) + if (Ymap?.physicsDictionaries == null || Ymap.physicsDictionaries.Length == 0) { YmapPhysicsDictionariesTextBox.Text = string.Empty; } @@ -202,8 +208,10 @@ namespace CodeWalker.Project.Panels private void SetYmapPhysicsDictionariesFromTextbox() { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; List hashes = new List(); @@ -235,8 +243,10 @@ namespace CodeWalker.Project.Panels private void SetYmapFlagsFromCheckBoxes() { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; uint flags = 0; uint contentFlags = 0; @@ -272,14 +282,22 @@ namespace CodeWalker.Project.Panels } populatingui = true; - UpdateYmapFlagsUI(false, true); //update textbox - populatingui = false; + try + { + UpdateYmapFlagsUI(false, true); //update textbox + } + finally + { + populatingui = false; + } } private void SetYmapFlagsFromTextBoxes() { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; uint flags = 0; uint contentFlags = 0; @@ -301,14 +319,22 @@ namespace CodeWalker.Project.Panels } populatingui = true; - UpdateYmapFlagsUI(true, false); //update checkboxes - populatingui = false; + try + { + UpdateYmapFlagsUI(true, false); //update checkboxes + } + finally + { + populatingui = false; + } } private void CalcYmapFlags() { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; lock (ProjectForm.ProjectSyncRoot) { @@ -319,14 +345,21 @@ namespace CodeWalker.Project.Panels } populatingui = true; - UpdateYmapFlagsUI(true, true); //update checkboxes and textboxes - populatingui = false; + try + { + UpdateYmapFlagsUI(true, true); //update checkboxes and textboxes + } finally + { + populatingui = false; + } } private void CalcYmapExtents() { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; lock (ProjectForm.ProjectSyncRoot) { @@ -337,18 +370,24 @@ namespace CodeWalker.Project.Panels } populatingui = true; - var md = Ymap.CMapData; - YmapEntitiesExtentsMinTextBox.Text = FloatUtil.GetVector3String(md.entitiesExtentsMin); - YmapEntitiesExtentsMaxTextBox.Text = FloatUtil.GetVector3String(md.entitiesExtentsMax); - YmapStreamingExtentsMinTextBox.Text = FloatUtil.GetVector3String(md.streamingExtentsMin); - YmapStreamingExtentsMaxTextBox.Text = FloatUtil.GetVector3String(md.streamingExtentsMax); - populatingui = false; + try + { + var md = Ymap.CMapData; + YmapEntitiesExtentsMinTextBox.Text = FloatUtil.GetVector3String(md.entitiesExtentsMin); + YmapEntitiesExtentsMaxTextBox.Text = FloatUtil.GetVector3String(md.entitiesExtentsMax); + YmapStreamingExtentsMinTextBox.Text = FloatUtil.GetVector3String(md.streamingExtentsMin); + YmapStreamingExtentsMaxTextBox.Text = FloatUtil.GetVector3String(md.streamingExtentsMax); + } finally + { + populatingui = false; + } } private void YmapNameTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; + if (populatingui) + return; uint hash = 0; string name = YmapNameTextBox.Text; if (!uint.TryParse(name, out hash))//don't re-hash hashes @@ -492,8 +531,10 @@ namespace CodeWalker.Project.Panels private void YmapEntitiesExtentsMinTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; Vector3 v = FloatUtil.ParseVector3String(YmapEntitiesExtentsMinTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { @@ -507,8 +548,10 @@ namespace CodeWalker.Project.Panels private void YmapEntitiesExtentsMaxTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; Vector3 v = FloatUtil.ParseVector3String(YmapEntitiesExtentsMaxTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { @@ -522,8 +565,10 @@ namespace CodeWalker.Project.Panels private void YmapStreamingExtentsMinTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; Vector3 v = FloatUtil.ParseVector3String(YmapStreamingExtentsMinTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { @@ -537,8 +582,10 @@ namespace CodeWalker.Project.Panels private void YmapStreamingExtentsMaxTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (Ymap == null) return; + if (populatingui) + return; + if (Ymap == null) + return; Vector3 v = FloatUtil.ParseVector3String(YmapStreamingExtentsMaxTextBox.Text); lock (ProjectForm.ProjectSyncRoot) { diff --git a/CodeWalker/Project/Panels/EditYtypArchetypePanel.Designer.cs b/CodeWalker/Project/Panels/EditYtypArchetypePanel.Designer.cs index cbbbea6..c556614 100644 --- a/CodeWalker/Project/Panels/EditYtypArchetypePanel.Designer.cs +++ b/CodeWalker/Project/Panels/EditYtypArchetypePanel.Designer.cs @@ -29,590 +29,539 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditYtypArchetypePanel)); - this.BaseArchetypeTabPage = new System.Windows.Forms.TabPage(); - this.ArchetypeDeleteButton = new System.Windows.Forms.Button(); - this.label13 = new System.Windows.Forms.Label(); - this.BSRadiusTextBox = new System.Windows.Forms.TextBox(); - this.BSCenterTextBox = new System.Windows.Forms.TextBox(); - this.BBMaxTextBox = new System.Windows.Forms.TextBox(); - this.BBMinTextBox = new System.Windows.Forms.TextBox(); - this.ArchetypeNameTextBox = new System.Windows.Forms.TextBox(); - this.ArchetypeFlagsTextBox = new System.Windows.Forms.TextBox(); - this.PhysicsDictionaryTextBox = new System.Windows.Forms.TextBox(); - this.ClipDictionaryTextBox = new System.Windows.Forms.TextBox(); - this.AssetNameTextBox = new System.Windows.Forms.TextBox(); - this.TextureDictTextBox = new System.Windows.Forms.TextBox(); - this.label12 = new System.Windows.Forms.Label(); - this.label11 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.PhysicsDictHashLabel = new System.Windows.Forms.Label(); - this.TextureDictHashLabel = new System.Windows.Forms.Label(); - this.EntityFlagsCheckedListBox = new System.Windows.Forms.CheckedListBox(); - this.label14 = new System.Windows.Forms.Label(); - this.SpecialAttributeNumericUpDown = new System.Windows.Forms.NumericUpDown(); - this.label10 = new System.Windows.Forms.Label(); - this.label9 = new System.Windows.Forms.Label(); - this.AssetTypeComboBox = new System.Windows.Forms.ComboBox(); - this.label8 = new System.Windows.Forms.Label(); - this.label7 = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.HDTextureDistNumericUpDown = new System.Windows.Forms.NumericUpDown(); - this.label3 = new System.Windows.Forms.Label(); - this.LodDistNumericUpDown = new System.Windows.Forms.NumericUpDown(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.TabControl = new System.Windows.Forms.TabControl(); - this.MloArchetypeTabPage = new System.Windows.Forms.TabPage(); - this.TimeArchetypeTabPage = new System.Windows.Forms.TabPage(); - this.TimeFlagsTextBox = new System.Windows.Forms.TextBox(); - this.TimeFlagsCheckedListBox = new System.Windows.Forms.CheckedListBox(); - this.label15 = new System.Windows.Forms.Label(); - this.MloUpdatePortalCountsButton = new System.Windows.Forms.Button(); - this.BaseArchetypeTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.SpecialAttributeNumericUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.HDTextureDistNumericUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.LodDistNumericUpDown)).BeginInit(); - this.TabControl.SuspendLayout(); - this.MloArchetypeTabPage.SuspendLayout(); - this.TimeArchetypeTabPage.SuspendLayout(); - this.SuspendLayout(); + BaseArchetypeTabPage = new System.Windows.Forms.TabPage(); + ArchetypeDeleteButton = new System.Windows.Forms.Button(); + label13 = new System.Windows.Forms.Label(); + BSRadiusTextBox = new System.Windows.Forms.TextBox(); + BSCenterTextBox = new System.Windows.Forms.TextBox(); + BBMaxTextBox = new System.Windows.Forms.TextBox(); + BBMinTextBox = new System.Windows.Forms.TextBox(); + ArchetypeNameTextBox = new System.Windows.Forms.TextBox(); + ArchetypeFlagsTextBox = new System.Windows.Forms.TextBox(); + PhysicsDictionaryTextBox = new System.Windows.Forms.TextBox(); + ClipDictionaryTextBox = new System.Windows.Forms.TextBox(); + AssetNameTextBox = new System.Windows.Forms.TextBox(); + TextureDictTextBox = new System.Windows.Forms.TextBox(); + label12 = new System.Windows.Forms.Label(); + label11 = new System.Windows.Forms.Label(); + label5 = new System.Windows.Forms.Label(); + PhysicsDictHashLabel = new System.Windows.Forms.Label(); + TextureDictHashLabel = new System.Windows.Forms.Label(); + EntityFlagsCheckedListBox = new System.Windows.Forms.CheckedListBox(); + label14 = new System.Windows.Forms.Label(); + SpecialAttributeNumericUpDown = new System.Windows.Forms.NumericUpDown(); + label10 = new System.Windows.Forms.Label(); + label9 = new System.Windows.Forms.Label(); + AssetTypeComboBox = new System.Windows.Forms.ComboBox(); + label8 = new System.Windows.Forms.Label(); + label7 = new System.Windows.Forms.Label(); + label6 = new System.Windows.Forms.Label(); + label4 = new System.Windows.Forms.Label(); + HDTextureDistNumericUpDown = new System.Windows.Forms.NumericUpDown(); + label3 = new System.Windows.Forms.Label(); + LodDistNumericUpDown = new System.Windows.Forms.NumericUpDown(); + label2 = new System.Windows.Forms.Label(); + label1 = new System.Windows.Forms.Label(); + TabControl = new System.Windows.Forms.TabControl(); + MloArchetypeTabPage = new System.Windows.Forms.TabPage(); + MloUpdatePortalCountsButton = new System.Windows.Forms.Button(); + TimeArchetypeTabPage = new System.Windows.Forms.TabPage(); + TimeFlagsTextBox = new System.Windows.Forms.TextBox(); + TimeFlagsCheckedListBox = new System.Windows.Forms.CheckedListBox(); + label15 = new System.Windows.Forms.Label(); + BaseArchetypeTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)SpecialAttributeNumericUpDown).BeginInit(); + ((System.ComponentModel.ISupportInitialize)HDTextureDistNumericUpDown).BeginInit(); + ((System.ComponentModel.ISupportInitialize)LodDistNumericUpDown).BeginInit(); + TabControl.SuspendLayout(); + MloArchetypeTabPage.SuspendLayout(); + TimeArchetypeTabPage.SuspendLayout(); + SuspendLayout(); // // BaseArchetypeTabPage // - this.BaseArchetypeTabPage.Controls.Add(this.ArchetypeDeleteButton); - this.BaseArchetypeTabPage.Controls.Add(this.label13); - this.BaseArchetypeTabPage.Controls.Add(this.BSRadiusTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.BSCenterTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.BBMaxTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.BBMinTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.ArchetypeNameTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.ArchetypeFlagsTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.PhysicsDictionaryTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.ClipDictionaryTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.AssetNameTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.TextureDictTextBox); - this.BaseArchetypeTabPage.Controls.Add(this.label12); - this.BaseArchetypeTabPage.Controls.Add(this.label11); - this.BaseArchetypeTabPage.Controls.Add(this.label5); - this.BaseArchetypeTabPage.Controls.Add(this.PhysicsDictHashLabel); - this.BaseArchetypeTabPage.Controls.Add(this.TextureDictHashLabel); - this.BaseArchetypeTabPage.Controls.Add(this.EntityFlagsCheckedListBox); - this.BaseArchetypeTabPage.Controls.Add(this.label14); - this.BaseArchetypeTabPage.Controls.Add(this.SpecialAttributeNumericUpDown); - this.BaseArchetypeTabPage.Controls.Add(this.label10); - this.BaseArchetypeTabPage.Controls.Add(this.label9); - this.BaseArchetypeTabPage.Controls.Add(this.AssetTypeComboBox); - this.BaseArchetypeTabPage.Controls.Add(this.label8); - this.BaseArchetypeTabPage.Controls.Add(this.label7); - this.BaseArchetypeTabPage.Controls.Add(this.label6); - this.BaseArchetypeTabPage.Controls.Add(this.label4); - this.BaseArchetypeTabPage.Controls.Add(this.HDTextureDistNumericUpDown); - this.BaseArchetypeTabPage.Controls.Add(this.label3); - this.BaseArchetypeTabPage.Controls.Add(this.LodDistNumericUpDown); - this.BaseArchetypeTabPage.Controls.Add(this.label2); - this.BaseArchetypeTabPage.Controls.Add(this.label1); - this.BaseArchetypeTabPage.Location = new System.Drawing.Point(4, 22); - this.BaseArchetypeTabPage.Name = "BaseArchetypeTabPage"; - this.BaseArchetypeTabPage.Padding = new System.Windows.Forms.Padding(3); - this.BaseArchetypeTabPage.Size = new System.Drawing.Size(631, 479); - this.BaseArchetypeTabPage.TabIndex = 0; - this.BaseArchetypeTabPage.Text = "Base Archetype Def"; - this.BaseArchetypeTabPage.UseVisualStyleBackColor = true; + BaseArchetypeTabPage.Controls.Add(ArchetypeDeleteButton); + BaseArchetypeTabPage.Controls.Add(label13); + BaseArchetypeTabPage.Controls.Add(BSRadiusTextBox); + BaseArchetypeTabPage.Controls.Add(BSCenterTextBox); + BaseArchetypeTabPage.Controls.Add(BBMaxTextBox); + BaseArchetypeTabPage.Controls.Add(BBMinTextBox); + BaseArchetypeTabPage.Controls.Add(ArchetypeNameTextBox); + BaseArchetypeTabPage.Controls.Add(ArchetypeFlagsTextBox); + BaseArchetypeTabPage.Controls.Add(PhysicsDictionaryTextBox); + BaseArchetypeTabPage.Controls.Add(ClipDictionaryTextBox); + BaseArchetypeTabPage.Controls.Add(AssetNameTextBox); + BaseArchetypeTabPage.Controls.Add(TextureDictTextBox); + BaseArchetypeTabPage.Controls.Add(label12); + BaseArchetypeTabPage.Controls.Add(label11); + BaseArchetypeTabPage.Controls.Add(label5); + BaseArchetypeTabPage.Controls.Add(PhysicsDictHashLabel); + BaseArchetypeTabPage.Controls.Add(TextureDictHashLabel); + BaseArchetypeTabPage.Controls.Add(EntityFlagsCheckedListBox); + BaseArchetypeTabPage.Controls.Add(label14); + BaseArchetypeTabPage.Controls.Add(SpecialAttributeNumericUpDown); + BaseArchetypeTabPage.Controls.Add(label10); + BaseArchetypeTabPage.Controls.Add(label9); + BaseArchetypeTabPage.Controls.Add(AssetTypeComboBox); + BaseArchetypeTabPage.Controls.Add(label8); + BaseArchetypeTabPage.Controls.Add(label7); + BaseArchetypeTabPage.Controls.Add(label6); + BaseArchetypeTabPage.Controls.Add(label4); + BaseArchetypeTabPage.Controls.Add(HDTextureDistNumericUpDown); + BaseArchetypeTabPage.Controls.Add(label3); + BaseArchetypeTabPage.Controls.Add(LodDistNumericUpDown); + BaseArchetypeTabPage.Controls.Add(label2); + BaseArchetypeTabPage.Controls.Add(label1); + BaseArchetypeTabPage.Location = new System.Drawing.Point(4, 24); + BaseArchetypeTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + BaseArchetypeTabPage.Name = "BaseArchetypeTabPage"; + BaseArchetypeTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + BaseArchetypeTabPage.Size = new System.Drawing.Size(738, 555); + BaseArchetypeTabPage.TabIndex = 0; + BaseArchetypeTabPage.Text = "Base Archetype Def"; + BaseArchetypeTabPage.UseVisualStyleBackColor = true; // // ArchetypeDeleteButton // - this.ArchetypeDeleteButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.ArchetypeDeleteButton.Location = new System.Drawing.Point(110, 439); - this.ArchetypeDeleteButton.Name = "ArchetypeDeleteButton"; - this.ArchetypeDeleteButton.Size = new System.Drawing.Size(126, 23); - this.ArchetypeDeleteButton.TabIndex = 79; - this.ArchetypeDeleteButton.Text = "Delete Archetype"; - this.ArchetypeDeleteButton.UseVisualStyleBackColor = true; - this.ArchetypeDeleteButton.Click += new System.EventHandler(this.DeleteArchetypeButton_Click); + ArchetypeDeleteButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + ArchetypeDeleteButton.Location = new System.Drawing.Point(128, 507); + ArchetypeDeleteButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ArchetypeDeleteButton.Name = "ArchetypeDeleteButton"; + ArchetypeDeleteButton.Size = new System.Drawing.Size(147, 27); + ArchetypeDeleteButton.TabIndex = 79; + ArchetypeDeleteButton.Text = "Delete Archetype"; + ArchetypeDeleteButton.UseVisualStyleBackColor = true; + ArchetypeDeleteButton.Click += DeleteArchetypeButton_Click; // // label13 // - this.label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(8, 405); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(57, 13); - this.label13.TabIndex = 78; - this.label13.Text = "BSRadius:"; + label13.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + label13.AutoSize = true; + label13.Location = new System.Drawing.Point(9, 467); + label13.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label13.Name = "label13"; + label13.Size = new System.Drawing.Size(58, 15); + label13.TabIndex = 78; + label13.Text = "BSRadius:"; // // BSRadiusTextBox // - this.BSRadiusTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.BSRadiusTextBox.Location = new System.Drawing.Point(71, 402); - this.BSRadiusTextBox.Name = "BSRadiusTextBox"; - this.BSRadiusTextBox.Size = new System.Drawing.Size(552, 20); - this.BSRadiusTextBox.TabIndex = 77; - this.BSRadiusTextBox.TextChanged += new System.EventHandler(this.BSRadiusTextBox_TextChanged); + BSRadiusTextBox.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + BSRadiusTextBox.Location = new System.Drawing.Point(83, 464); + BSRadiusTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + BSRadiusTextBox.Name = "BSRadiusTextBox"; + BSRadiusTextBox.Size = new System.Drawing.Size(643, 23); + BSRadiusTextBox.TabIndex = 77; + BSRadiusTextBox.TextChanged += BSRadiusTextBox_TextChanged; // // BSCenterTextBox // - this.BSCenterTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.BSCenterTextBox.Location = new System.Drawing.Point(71, 376); - this.BSCenterTextBox.Name = "BSCenterTextBox"; - this.BSCenterTextBox.Size = new System.Drawing.Size(552, 20); - this.BSCenterTextBox.TabIndex = 75; - this.BSCenterTextBox.TextChanged += new System.EventHandler(this.BSCenterTextBox_TextChanged); + BSCenterTextBox.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + BSCenterTextBox.Location = new System.Drawing.Point(83, 434); + BSCenterTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + BSCenterTextBox.Name = "BSCenterTextBox"; + BSCenterTextBox.Size = new System.Drawing.Size(643, 23); + BSCenterTextBox.TabIndex = 75; + BSCenterTextBox.TextChanged += BSCenterTextBox_TextChanged; // // BBMaxTextBox // - this.BBMaxTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.BBMaxTextBox.Location = new System.Drawing.Point(71, 350); - this.BBMaxTextBox.Name = "BBMaxTextBox"; - this.BBMaxTextBox.Size = new System.Drawing.Size(552, 20); - this.BBMaxTextBox.TabIndex = 73; - this.BBMaxTextBox.TextChanged += new System.EventHandler(this.BBMaxTextBox_TextChanged); + BBMaxTextBox.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + BBMaxTextBox.Location = new System.Drawing.Point(83, 404); + BBMaxTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + BBMaxTextBox.Name = "BBMaxTextBox"; + BBMaxTextBox.Size = new System.Drawing.Size(643, 23); + BBMaxTextBox.TabIndex = 73; + BBMaxTextBox.TextChanged += BBMaxTextBox_TextChanged; // // BBMinTextBox // - this.BBMinTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.BBMinTextBox.Location = new System.Drawing.Point(71, 324); - this.BBMinTextBox.Name = "BBMinTextBox"; - this.BBMinTextBox.Size = new System.Drawing.Size(552, 20); - this.BBMinTextBox.TabIndex = 71; - this.BBMinTextBox.TextChanged += new System.EventHandler(this.BBMinTextBox_TextChanged); + BBMinTextBox.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + BBMinTextBox.Location = new System.Drawing.Point(83, 374); + BBMinTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + BBMinTextBox.Name = "BBMinTextBox"; + BBMinTextBox.Size = new System.Drawing.Size(643, 23); + BBMinTextBox.TabIndex = 71; + BBMinTextBox.TextChanged += BBMinTextBox_TextChanged; // // ArchetypeNameTextBox // - this.ArchetypeNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ArchetypeNameTextBox.Location = new System.Drawing.Point(110, 9); - this.ArchetypeNameTextBox.Name = "ArchetypeNameTextBox"; - this.ArchetypeNameTextBox.Size = new System.Drawing.Size(247, 20); - this.ArchetypeNameTextBox.TabIndex = 70; - this.ArchetypeNameTextBox.TextChanged += new System.EventHandler(this.ArchetypeNameTextBox_TextChanged); + ArchetypeNameTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ArchetypeNameTextBox.Location = new System.Drawing.Point(128, 10); + ArchetypeNameTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ArchetypeNameTextBox.Name = "ArchetypeNameTextBox"; + ArchetypeNameTextBox.Size = new System.Drawing.Size(288, 23); + ArchetypeNameTextBox.TabIndex = 70; + ArchetypeNameTextBox.TextChanged += ArchetypeNameTextBox_TextChanged; // // ArchetypeFlagsTextBox // - this.ArchetypeFlagsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ArchetypeFlagsTextBox.Location = new System.Drawing.Point(476, 12); - this.ArchetypeFlagsTextBox.Name = "ArchetypeFlagsTextBox"; - this.ArchetypeFlagsTextBox.Size = new System.Drawing.Size(147, 20); - this.ArchetypeFlagsTextBox.TabIndex = 66; - this.ArchetypeFlagsTextBox.TextChanged += new System.EventHandler(this.ArchetypeFlagsTextBox_TextChanged); + ArchetypeFlagsTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + ArchetypeFlagsTextBox.Location = new System.Drawing.Point(555, 14); + ArchetypeFlagsTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ArchetypeFlagsTextBox.Name = "ArchetypeFlagsTextBox"; + ArchetypeFlagsTextBox.Size = new System.Drawing.Size(171, 23); + ArchetypeFlagsTextBox.TabIndex = 66; + ArchetypeFlagsTextBox.TextChanged += ArchetypeFlagsTextBox_TextChanged; // // PhysicsDictionaryTextBox // - this.PhysicsDictionaryTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.PhysicsDictionaryTextBox.Location = new System.Drawing.Point(110, 191); - this.PhysicsDictionaryTextBox.Name = "PhysicsDictionaryTextBox"; - this.PhysicsDictionaryTextBox.Size = new System.Drawing.Size(206, 20); - this.PhysicsDictionaryTextBox.TabIndex = 60; - this.PhysicsDictionaryTextBox.TextChanged += new System.EventHandler(this.PhysicsDictionaryTextBox_TextChanged); + PhysicsDictionaryTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + PhysicsDictionaryTextBox.Location = new System.Drawing.Point(128, 220); + PhysicsDictionaryTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + PhysicsDictionaryTextBox.Name = "PhysicsDictionaryTextBox"; + PhysicsDictionaryTextBox.Size = new System.Drawing.Size(240, 23); + PhysicsDictionaryTextBox.TabIndex = 60; + PhysicsDictionaryTextBox.TextChanged += PhysicsDictionaryTextBox_TextChanged; // // ClipDictionaryTextBox // - this.ClipDictionaryTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ClipDictionaryTextBox.Location = new System.Drawing.Point(110, 165); - this.ClipDictionaryTextBox.Name = "ClipDictionaryTextBox"; - this.ClipDictionaryTextBox.Size = new System.Drawing.Size(247, 20); - this.ClipDictionaryTextBox.TabIndex = 58; - this.ClipDictionaryTextBox.TextChanged += new System.EventHandler(this.ClipDictionaryTextBox_TextChanged); + ClipDictionaryTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ClipDictionaryTextBox.Location = new System.Drawing.Point(128, 190); + ClipDictionaryTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ClipDictionaryTextBox.Name = "ClipDictionaryTextBox"; + ClipDictionaryTextBox.Size = new System.Drawing.Size(288, 23); + ClipDictionaryTextBox.TabIndex = 58; + ClipDictionaryTextBox.TextChanged += ClipDictionaryTextBox_TextChanged; // // AssetNameTextBox // - this.AssetNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.AssetNameTextBox.Location = new System.Drawing.Point(110, 35); - this.AssetNameTextBox.Name = "AssetNameTextBox"; - this.AssetNameTextBox.Size = new System.Drawing.Size(247, 20); - this.AssetNameTextBox.TabIndex = 56; - this.AssetNameTextBox.TextChanged += new System.EventHandler(this.AssetNameTextBox_TextChanged); + AssetNameTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + AssetNameTextBox.Location = new System.Drawing.Point(128, 40); + AssetNameTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AssetNameTextBox.Name = "AssetNameTextBox"; + AssetNameTextBox.Size = new System.Drawing.Size(288, 23); + AssetNameTextBox.TabIndex = 56; + AssetNameTextBox.TextChanged += AssetNameTextBox_TextChanged; // // TextureDictTextBox // - this.TextureDictTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TextureDictTextBox.Location = new System.Drawing.Point(110, 139); - this.TextureDictTextBox.Name = "TextureDictTextBox"; - this.TextureDictTextBox.Size = new System.Drawing.Size(206, 20); - this.TextureDictTextBox.TabIndex = 54; - this.TextureDictTextBox.TextChanged += new System.EventHandler(this.TextureDictTextBox_TextChanged); + TextureDictTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + TextureDictTextBox.Location = new System.Drawing.Point(128, 160); + TextureDictTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TextureDictTextBox.Name = "TextureDictTextBox"; + TextureDictTextBox.Size = new System.Drawing.Size(240, 23); + TextureDictTextBox.TabIndex = 54; + TextureDictTextBox.TextChanged += TextureDictTextBox_TextChanged; // // label12 // - this.label12.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(8, 379); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(55, 13); - this.label12.TabIndex = 76; - this.label12.Text = "BSCenter:"; + label12.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + label12.AutoSize = true; + label12.Location = new System.Drawing.Point(9, 437); + label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label12.Name = "label12"; + label12.Size = new System.Drawing.Size(58, 15); + label12.TabIndex = 76; + label12.Text = "BSCenter:"; // // label11 // - this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(19, 353); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(44, 13); - this.label11.TabIndex = 74; - this.label11.Text = "BBMax:"; + label11.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + label11.AutoSize = true; + label11.Location = new System.Drawing.Point(22, 407); + label11.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label11.Name = "label11"; + label11.Size = new System.Drawing.Size(47, 15); + label11.TabIndex = 74; + label11.Text = "BBMax:"; // // label5 // - this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(24, 327); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(41, 13); - this.label5.TabIndex = 72; - this.label5.Text = "BBMin:"; + label5.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + label5.AutoSize = true; + label5.Location = new System.Drawing.Point(28, 377); + label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label5.Name = "label5"; + label5.Size = new System.Drawing.Size(45, 15); + label5.TabIndex = 72; + label5.Text = "BBMin:"; // // PhysicsDictHashLabel // - this.PhysicsDictHashLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.PhysicsDictHashLabel.AutoSize = true; - this.PhysicsDictHashLabel.Location = new System.Drawing.Point(322, 194); - this.PhysicsDictHashLabel.Name = "PhysicsDictHashLabel"; - this.PhysicsDictHashLabel.Size = new System.Drawing.Size(35, 13); - this.PhysicsDictHashLabel.TabIndex = 69; - this.PhysicsDictHashLabel.Text = "Hash:"; + PhysicsDictHashLabel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + PhysicsDictHashLabel.AutoSize = true; + PhysicsDictHashLabel.Location = new System.Drawing.Point(376, 224); + PhysicsDictHashLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + PhysicsDictHashLabel.Name = "PhysicsDictHashLabel"; + PhysicsDictHashLabel.Size = new System.Drawing.Size(37, 15); + PhysicsDictHashLabel.TabIndex = 69; + PhysicsDictHashLabel.Text = "Hash:"; // // TextureDictHashLabel // - this.TextureDictHashLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.TextureDictHashLabel.AutoSize = true; - this.TextureDictHashLabel.Location = new System.Drawing.Point(322, 142); - this.TextureDictHashLabel.Name = "TextureDictHashLabel"; - this.TextureDictHashLabel.Size = new System.Drawing.Size(35, 13); - this.TextureDictHashLabel.TabIndex = 68; - this.TextureDictHashLabel.Text = "Hash:"; + TextureDictHashLabel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + TextureDictHashLabel.AutoSize = true; + TextureDictHashLabel.Location = new System.Drawing.Point(376, 164); + TextureDictHashLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + TextureDictHashLabel.Name = "TextureDictHashLabel"; + TextureDictHashLabel.Size = new System.Drawing.Size(37, 15); + TextureDictHashLabel.TabIndex = 68; + TextureDictHashLabel.Text = "Hash:"; // // EntityFlagsCheckedListBox // - this.EntityFlagsCheckedListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.EntityFlagsCheckedListBox.CheckOnClick = true; - this.EntityFlagsCheckedListBox.FormattingEnabled = true; - this.EntityFlagsCheckedListBox.Items.AddRange(new object[] { - "1 - Unk01", - "2 - Unk02", - "4 - Unk03", - "8 - Unk04", - "16 - Unk05", - "32 - Static", - "64 - Disable alpha sorting", - "128 - Instance", - "256 - Unk09", - "512 - Bone anims (YCD)", - "1024 - UV anims (YCD)", - "2048 - Unk12", - "4096 - Unk13", - "8192 - Object won\'t cast shadow", - "16384 - Unk15", - "32768 - Unk16", - "65536 - Double-sided rendering", - "131072 - Dynamic", - "262144 - Unk19", - "524288 - Dynamic anims (YCD)", - "1048576 - Unk21", - "2097152 - Unk22", - "4194304 - Unk23", - "8388608 - Unk24", - "16777216 - Unk25", - "33554432 - Unk26", - "67108864 - Enables special atribute for door archetypes", - "134217728 - Unk28", - "268435456 - Disable red vertex channel", - "536870912 - Disable green vertex channel", - "1073741824 - Disable blue vertex channel", - "2147483648 - Disable alpha vertex channel"}); - this.EntityFlagsCheckedListBox.Location = new System.Drawing.Point(441, 38); - this.EntityFlagsCheckedListBox.Name = "EntityFlagsCheckedListBox"; - this.EntityFlagsCheckedListBox.Size = new System.Drawing.Size(182, 274); - this.EntityFlagsCheckedListBox.TabIndex = 67; - this.EntityFlagsCheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.ArchetypeFlagsCheckedListBox_ItemCheck); + EntityFlagsCheckedListBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + EntityFlagsCheckedListBox.CheckOnClick = true; + EntityFlagsCheckedListBox.FormattingEnabled = true; + EntityFlagsCheckedListBox.Items.AddRange(new object[] { "1 - Unk01", "2 - Unk02", "4 - Unk03", "8 - Unk04", "16 - Unk05", "32 - Static", "64 - Disable alpha sorting", "128 - Instance", "256 - Unk09", "512 - Bone anims (YCD)", "1024 - UV anims (YCD)", "2048 - Unk12", "4096 - Unk13", "8192 - Object won't cast shadow", "16384 - Unk15", "32768 - Unk16", "65536 - Double-sided rendering", "131072 - Dynamic", "262144 - Unk19", "524288 - Dynamic anims (YCD)", "1048576 - Unk21", "2097152 - Unk22", "4194304 - Unk23", "8388608 - Unk24", "16777216 - Unk25", "33554432 - Unk26", "67108864 - Enables special atribute for door archetypes", "134217728 - Unk28", "268435456 - Disable red vertex channel", "536870912 - Disable green vertex channel", "1073741824 - Disable blue vertex channel", "2147483648 - Disable alpha vertex channel" }); + EntityFlagsCheckedListBox.Location = new System.Drawing.Point(514, 44); + EntityFlagsCheckedListBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + EntityFlagsCheckedListBox.Name = "EntityFlagsCheckedListBox"; + EntityFlagsCheckedListBox.Size = new System.Drawing.Size(212, 310); + EntityFlagsCheckedListBox.TabIndex = 67; + EntityFlagsCheckedListBox.ItemCheck += ArchetypeFlagsCheckedListBox_ItemCheck; // // label14 // - this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(419, 15); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(35, 13); - this.label14.TabIndex = 65; - this.label14.Text = "Flags:"; + label14.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + label14.AutoSize = true; + label14.Location = new System.Drawing.Point(489, 17); + label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label14.Name = "label14"; + label14.Size = new System.Drawing.Size(37, 15); + label14.TabIndex = 65; + label14.Text = "Flags:"; // // SpecialAttributeNumericUpDown // - this.SpecialAttributeNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SpecialAttributeNumericUpDown.Location = new System.Drawing.Point(110, 113); - this.SpecialAttributeNumericUpDown.Maximum = new decimal(new int[] { - 9999999, - 0, - 0, - 0}); - this.SpecialAttributeNumericUpDown.Name = "SpecialAttributeNumericUpDown"; - this.SpecialAttributeNumericUpDown.Size = new System.Drawing.Size(247, 20); - this.SpecialAttributeNumericUpDown.TabIndex = 64; - this.SpecialAttributeNumericUpDown.ValueChanged += new System.EventHandler(this.SpecialAttributeNumericUpDown_ValueChanged); + SpecialAttributeNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SpecialAttributeNumericUpDown.Location = new System.Drawing.Point(128, 130); + SpecialAttributeNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SpecialAttributeNumericUpDown.Maximum = new decimal(new int[] { 9999999, 0, 0, 0 }); + SpecialAttributeNumericUpDown.Name = "SpecialAttributeNumericUpDown"; + SpecialAttributeNumericUpDown.Size = new System.Drawing.Size(288, 23); + SpecialAttributeNumericUpDown.TabIndex = 64; + SpecialAttributeNumericUpDown.ValueChanged += SpecialAttributeNumericUpDown_ValueChanged; // // label10 // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(17, 115); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(87, 13); - this.label10.TabIndex = 63; - this.label10.Text = "Special Attribute:"; + label10.AutoSize = true; + label10.Location = new System.Drawing.Point(20, 133); + label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label10.Name = "label10"; + label10.Size = new System.Drawing.Size(97, 15); + label10.TabIndex = 63; + label10.Text = "Special Attribute:"; // // label9 // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(41, 220); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(63, 13); - this.label9.TabIndex = 62; - this.label9.Text = "Asset Type:"; + label9.AutoSize = true; + label9.Location = new System.Drawing.Point(48, 254); + label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label9.Name = "label9"; + label9.Size = new System.Drawing.Size(65, 15); + label9.TabIndex = 62; + label9.Text = "Asset Type:"; // // AssetTypeComboBox // - this.AssetTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.AssetTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.AssetTypeComboBox.FormattingEnabled = true; - this.AssetTypeComboBox.Location = new System.Drawing.Point(110, 217); - this.AssetTypeComboBox.Name = "AssetTypeComboBox"; - this.AssetTypeComboBox.Size = new System.Drawing.Size(247, 21); - this.AssetTypeComboBox.TabIndex = 61; + AssetTypeComboBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + AssetTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + AssetTypeComboBox.FormattingEnabled = true; + AssetTypeComboBox.Location = new System.Drawing.Point(128, 250); + AssetTypeComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AssetTypeComboBox.Name = "AssetTypeComboBox"; + AssetTypeComboBox.Size = new System.Drawing.Size(288, 23); + AssetTypeComboBox.TabIndex = 61; // // label8 // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(8, 194); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(96, 13); - this.label8.TabIndex = 59; - this.label8.Text = "Physics Dictionary:"; + label8.AutoSize = true; + label8.Location = new System.Drawing.Point(9, 224); + label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label8.Name = "label8"; + label8.Size = new System.Drawing.Size(106, 15); + label8.TabIndex = 59; + label8.Text = "Physics Dictionary:"; // // label7 // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(27, 168); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(77, 13); - this.label7.TabIndex = 57; - this.label7.Text = "Clip Dictionary:"; + label7.AutoSize = true; + label7.Location = new System.Drawing.Point(31, 194); + label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label7.Name = "label7"; + label7.Size = new System.Drawing.Size(88, 15); + label7.TabIndex = 57; + label7.Text = "Clip Dictionary:"; // // label6 // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(37, 38); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(67, 13); - this.label6.TabIndex = 55; - this.label6.Text = "Asset Name:"; + label6.AutoSize = true; + label6.Location = new System.Drawing.Point(43, 44); + label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label6.Name = "label6"; + label6.Size = new System.Drawing.Size(73, 15); + label6.TabIndex = 55; + label6.Text = "Asset Name:"; // // label4 // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(8, 142); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(96, 13); - this.label4.TabIndex = 53; - this.label4.Text = "Texture Dictionary:"; + label4.AutoSize = true; + label4.Location = new System.Drawing.Point(9, 164); + label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label4.Name = "label4"; + label4.Size = new System.Drawing.Size(105, 15); + label4.TabIndex = 53; + label4.Text = "Texture Dictionary:"; // // HDTextureDistNumericUpDown // - this.HDTextureDistNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.HDTextureDistNumericUpDown.DecimalPlaces = 8; - this.HDTextureDistNumericUpDown.Location = new System.Drawing.Point(110, 87); - this.HDTextureDistNumericUpDown.Maximum = new decimal(new int[] { - 9999999, - 0, - 0, - 0}); - this.HDTextureDistNumericUpDown.Name = "HDTextureDistNumericUpDown"; - this.HDTextureDistNumericUpDown.Size = new System.Drawing.Size(247, 20); - this.HDTextureDistNumericUpDown.TabIndex = 52; - this.HDTextureDistNumericUpDown.ValueChanged += new System.EventHandler(this.HDTextureDistNumericUpDown_ValueChanged); + HDTextureDistNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + HDTextureDistNumericUpDown.DecimalPlaces = 2; + HDTextureDistNumericUpDown.Location = new System.Drawing.Point(128, 100); + HDTextureDistNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + HDTextureDistNumericUpDown.Maximum = new decimal(new int[] { 9999999, 0, 0, 0 }); + HDTextureDistNumericUpDown.Name = "HDTextureDistNumericUpDown"; + HDTextureDistNumericUpDown.Size = new System.Drawing.Size(288, 23); + HDTextureDistNumericUpDown.TabIndex = 52; + HDTextureDistNumericUpDown.ValueChanged += HDTextureDistNumericUpDown_ValueChanged; // // label3 // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(18, 89); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(86, 13); - this.label3.TabIndex = 51; - this.label3.Text = "HD Texture Dist:"; + label3.AutoSize = true; + label3.Location = new System.Drawing.Point(21, 103); + label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(91, 15); + label3.TabIndex = 51; + label3.Text = "HD Texture Dist:"; // // LodDistNumericUpDown // - this.LodDistNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.LodDistNumericUpDown.DecimalPlaces = 8; - this.LodDistNumericUpDown.Location = new System.Drawing.Point(110, 61); - this.LodDistNumericUpDown.Maximum = new decimal(new int[] { - 9999999, - 0, - 0, - 0}); - this.LodDistNumericUpDown.Name = "LodDistNumericUpDown"; - this.LodDistNumericUpDown.Size = new System.Drawing.Size(247, 20); - this.LodDistNumericUpDown.TabIndex = 50; - this.LodDistNumericUpDown.ValueChanged += new System.EventHandler(this.LodDistNumericUpDown_ValueChanged); + LodDistNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + LodDistNumericUpDown.DecimalPlaces = 2; + LodDistNumericUpDown.Location = new System.Drawing.Point(128, 70); + LodDistNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + LodDistNumericUpDown.Maximum = new decimal(new int[] { 9999999, 0, 0, 0 }); + LodDistNumericUpDown.Name = "LodDistNumericUpDown"; + LodDistNumericUpDown.Size = new System.Drawing.Size(288, 23); + LodDistNumericUpDown.TabIndex = 50; + LodDistNumericUpDown.ValueChanged += LodDistNumericUpDown_ValueChanged; // // label2 // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(55, 63); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(49, 13); - this.label2.TabIndex = 49; - this.label2.Text = "Lod Dist:"; + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(64, 73); + label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(53, 15); + label2.TabIndex = 49; + label2.Text = "Lod Dist:"; // // label1 // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(66, 12); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(38, 13); - this.label1.TabIndex = 48; - this.label1.Text = "Name:"; + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(77, 14); + label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(42, 15); + label1.TabIndex = 48; + label1.Text = "Name:"; // // TabControl // - this.TabControl.Controls.Add(this.BaseArchetypeTabPage); - this.TabControl.Controls.Add(this.MloArchetypeTabPage); - this.TabControl.Controls.Add(this.TimeArchetypeTabPage); - this.TabControl.Dock = System.Windows.Forms.DockStyle.Fill; - this.TabControl.Location = new System.Drawing.Point(0, 0); - this.TabControl.Name = "TabControl"; - this.TabControl.SelectedIndex = 0; - this.TabControl.Size = new System.Drawing.Size(639, 505); - this.TabControl.TabIndex = 48; + TabControl.Controls.Add(BaseArchetypeTabPage); + TabControl.Controls.Add(MloArchetypeTabPage); + TabControl.Controls.Add(TimeArchetypeTabPage); + TabControl.Dock = System.Windows.Forms.DockStyle.Fill; + TabControl.Location = new System.Drawing.Point(0, 0); + TabControl.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TabControl.Name = "TabControl"; + TabControl.SelectedIndex = 0; + TabControl.Size = new System.Drawing.Size(746, 583); + TabControl.TabIndex = 48; // // MloArchetypeTabPage // - this.MloArchetypeTabPage.Controls.Add(this.MloUpdatePortalCountsButton); - this.MloArchetypeTabPage.Location = new System.Drawing.Point(4, 22); - this.MloArchetypeTabPage.Name = "MloArchetypeTabPage"; - this.MloArchetypeTabPage.Padding = new System.Windows.Forms.Padding(3); - this.MloArchetypeTabPage.Size = new System.Drawing.Size(631, 479); - this.MloArchetypeTabPage.TabIndex = 1; - this.MloArchetypeTabPage.Text = "Mlo Archetype Def"; - this.MloArchetypeTabPage.UseVisualStyleBackColor = true; - // - // TimeArchetypeTabPage - // - this.TimeArchetypeTabPage.Controls.Add(this.TimeFlagsTextBox); - this.TimeArchetypeTabPage.Controls.Add(this.TimeFlagsCheckedListBox); - this.TimeArchetypeTabPage.Controls.Add(this.label15); - this.TimeArchetypeTabPage.Location = new System.Drawing.Point(4, 22); - this.TimeArchetypeTabPage.Name = "TimeArchetypeTabPage"; - this.TimeArchetypeTabPage.Size = new System.Drawing.Size(631, 479); - this.TimeArchetypeTabPage.TabIndex = 2; - this.TimeArchetypeTabPage.Text = "Time Archetype Def"; - this.TimeArchetypeTabPage.UseVisualStyleBackColor = true; - // - // TimeFlagsTextBox - // - this.TimeFlagsTextBox.Location = new System.Drawing.Point(72, 6); - this.TimeFlagsTextBox.Name = "TimeFlagsTextBox"; - this.TimeFlagsTextBox.Size = new System.Drawing.Size(147, 20); - this.TimeFlagsTextBox.TabIndex = 69; - this.TimeFlagsTextBox.TextChanged += new System.EventHandler(this.TimeFlagsTextBox_TextChanged); - // - // TimeFlagsCheckedListBox - // - this.TimeFlagsCheckedListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.TimeFlagsCheckedListBox.CheckOnClick = true; - this.TimeFlagsCheckedListBox.FormattingEnabled = true; - this.TimeFlagsCheckedListBox.Items.AddRange(new object[] { - "1 - 00:00 - 01:00", - "2 - 01:00 - 02:00", - "4 - 02:00 - 03:00", - "8 - 03:00 - 04:00", - "16 - 04:00 - 05:00", - "32 - 05:00 - 06:00", - "64 - 06:00 - 07:00", - "128 - 07:00 - 08:00", - "256 - 08:00 - 09:00", - "512 - 09:00 - 10:00", - "1024 - 10:00 - 11:00", - "2048 - 11:00 - 12:00", - "4096 - 12:00 - 13:00", - "8192 - 13:00 - 14:00", - "16384 - 14:00 - 15:00", - "32768 - 15:00 - 16:00", - "65536 - 16:00 - 17:00", - "131072 - 17:00 - 18:00", - "262144 - 18:00 - 19:00", - "524288 - 19:00 - 20:00", - "1048576 - 20:00 - 21:00", - "2097152 - 21:00 - 22:00", - "4194304 - 22:00 - 23:00", - "8388608 - 23:00 - 00:00", - "16777216 - Unk25", - "33554432 - Unk26", - "67108864 - Unk27", - "134217728 - Unk28", - "268435456 - Unk29", - "536870912 - Unk30", - "1073741824 - Unk31", - "2147483648 - Unk32"}); - this.TimeFlagsCheckedListBox.Location = new System.Drawing.Point(18, 32); - this.TimeFlagsCheckedListBox.Name = "TimeFlagsCheckedListBox"; - this.TimeFlagsCheckedListBox.Size = new System.Drawing.Size(201, 424); - this.TimeFlagsCheckedListBox.TabIndex = 70; - this.TimeFlagsCheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.TimeFlagsCheckedListBox_ItemCheck); - // - // label15 - // - this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(5, 9); - this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(61, 13); - this.label15.TabIndex = 68; - this.label15.Text = "Time Flags:"; + MloArchetypeTabPage.Controls.Add(MloUpdatePortalCountsButton); + MloArchetypeTabPage.Location = new System.Drawing.Point(4, 24); + MloArchetypeTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MloArchetypeTabPage.Name = "MloArchetypeTabPage"; + MloArchetypeTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + MloArchetypeTabPage.Size = new System.Drawing.Size(738, 555); + MloArchetypeTabPage.TabIndex = 1; + MloArchetypeTabPage.Text = "Mlo Archetype Def"; + MloArchetypeTabPage.UseVisualStyleBackColor = true; // // MloUpdatePortalCountsButton // - this.MloUpdatePortalCountsButton.Location = new System.Drawing.Point(49, 35); - this.MloUpdatePortalCountsButton.Name = "MloUpdatePortalCountsButton"; - this.MloUpdatePortalCountsButton.Size = new System.Drawing.Size(153, 23); - this.MloUpdatePortalCountsButton.TabIndex = 0; - this.MloUpdatePortalCountsButton.Text = "Update Portal Counts"; - this.MloUpdatePortalCountsButton.UseVisualStyleBackColor = true; - this.MloUpdatePortalCountsButton.Click += new System.EventHandler(this.MloUpdatePortalCountsButton_Click); + MloUpdatePortalCountsButton.Location = new System.Drawing.Point(57, 40); + MloUpdatePortalCountsButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MloUpdatePortalCountsButton.Name = "MloUpdatePortalCountsButton"; + MloUpdatePortalCountsButton.Size = new System.Drawing.Size(178, 27); + MloUpdatePortalCountsButton.TabIndex = 0; + MloUpdatePortalCountsButton.Text = "Update Portal Counts"; + MloUpdatePortalCountsButton.UseVisualStyleBackColor = true; + MloUpdatePortalCountsButton.Click += MloUpdatePortalCountsButton_Click; + // + // TimeArchetypeTabPage + // + TimeArchetypeTabPage.Controls.Add(TimeFlagsTextBox); + TimeArchetypeTabPage.Controls.Add(TimeFlagsCheckedListBox); + TimeArchetypeTabPage.Controls.Add(label15); + TimeArchetypeTabPage.Location = new System.Drawing.Point(4, 24); + TimeArchetypeTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimeArchetypeTabPage.Name = "TimeArchetypeTabPage"; + TimeArchetypeTabPage.Size = new System.Drawing.Size(738, 555); + TimeArchetypeTabPage.TabIndex = 2; + TimeArchetypeTabPage.Text = "Time Archetype Def"; + TimeArchetypeTabPage.UseVisualStyleBackColor = true; + // + // TimeFlagsTextBox + // + TimeFlagsTextBox.Location = new System.Drawing.Point(84, 7); + TimeFlagsTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimeFlagsTextBox.Name = "TimeFlagsTextBox"; + TimeFlagsTextBox.Size = new System.Drawing.Size(171, 23); + TimeFlagsTextBox.TabIndex = 69; + TimeFlagsTextBox.TextChanged += TimeFlagsTextBox_TextChanged; + // + // TimeFlagsCheckedListBox + // + TimeFlagsCheckedListBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + TimeFlagsCheckedListBox.CheckOnClick = true; + TimeFlagsCheckedListBox.FormattingEnabled = true; + TimeFlagsCheckedListBox.Items.AddRange(new object[] { "1 - 00:00 - 01:00", "2 - 01:00 - 02:00", "4 - 02:00 - 03:00", "8 - 03:00 - 04:00", "16 - 04:00 - 05:00", "32 - 05:00 - 06:00", "64 - 06:00 - 07:00", "128 - 07:00 - 08:00", "256 - 08:00 - 09:00", "512 - 09:00 - 10:00", "1024 - 10:00 - 11:00", "2048 - 11:00 - 12:00", "4096 - 12:00 - 13:00", "8192 - 13:00 - 14:00", "16384 - 14:00 - 15:00", "32768 - 15:00 - 16:00", "65536 - 16:00 - 17:00", "131072 - 17:00 - 18:00", "262144 - 18:00 - 19:00", "524288 - 19:00 - 20:00", "1048576 - 20:00 - 21:00", "2097152 - 21:00 - 22:00", "4194304 - 22:00 - 23:00", "8388608 - 23:00 - 00:00", "16777216 - Unk25", "33554432 - Unk26", "67108864 - Unk27", "134217728 - Unk28", "268435456 - Unk29", "536870912 - Unk30", "1073741824 - Unk31", "2147483648 - Unk32" }); + TimeFlagsCheckedListBox.Location = new System.Drawing.Point(21, 37); + TimeFlagsCheckedListBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimeFlagsCheckedListBox.Name = "TimeFlagsCheckedListBox"; + TimeFlagsCheckedListBox.Size = new System.Drawing.Size(234, 472); + TimeFlagsCheckedListBox.TabIndex = 70; + TimeFlagsCheckedListBox.ItemCheck += TimeFlagsCheckedListBox_ItemCheck; + // + // label15 + // + label15.AutoSize = true; + label15.Location = new System.Drawing.Point(6, 10); + label15.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label15.Name = "label15"; + label15.Size = new System.Drawing.Size(66, 15); + label15.TabIndex = 68; + label15.Text = "Time Flags:"; // // EditYtypArchetypePanel // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(639, 505); - this.Controls.Add(this.TabControl); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(531, 458); - this.Name = "EditYtypArchetypePanel"; - this.Text = "Edit Archetype"; - this.Load += new System.EventHandler(this.EditYtypArchetypePanel_Load); - this.BaseArchetypeTabPage.ResumeLayout(false); - this.BaseArchetypeTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.SpecialAttributeNumericUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.HDTextureDistNumericUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.LodDistNumericUpDown)).EndInit(); - this.TabControl.ResumeLayout(false); - this.MloArchetypeTabPage.ResumeLayout(false); - this.TimeArchetypeTabPage.ResumeLayout(false); - this.TimeArchetypeTabPage.PerformLayout(); - this.ResumeLayout(false); - + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(746, 583); + Controls.Add(TabControl); + Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon"); + Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MinimumSize = new System.Drawing.Size(617, 522); + Name = "EditYtypArchetypePanel"; + Text = "Edit Archetype"; + Load += EditYtypArchetypePanel_Load; + BaseArchetypeTabPage.ResumeLayout(false); + BaseArchetypeTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)SpecialAttributeNumericUpDown).EndInit(); + ((System.ComponentModel.ISupportInitialize)HDTextureDistNumericUpDown).EndInit(); + ((System.ComponentModel.ISupportInitialize)LodDistNumericUpDown).EndInit(); + TabControl.ResumeLayout(false); + MloArchetypeTabPage.ResumeLayout(false); + TimeArchetypeTabPage.ResumeLayout(false); + TimeArchetypeTabPage.PerformLayout(); + ResumeLayout(false); } #endregion diff --git a/CodeWalker/Project/Panels/EditYtypArchetypePanel.cs b/CodeWalker/Project/Panels/EditYtypArchetypePanel.cs index 3a9c365..a4fc100 100644 --- a/CodeWalker/Project/Panels/EditYtypArchetypePanel.cs +++ b/CodeWalker/Project/Panels/EditYtypArchetypePanel.cs @@ -19,14 +19,14 @@ namespace CodeWalker.Project.Panels ProjectForm = owner; } - public Archetype CurrentArchetype { get; set; } + public Archetype? CurrentArchetype { get; set; } private void EditYtypArchetypePanel_Load(object sender, EventArgs e) { AssetTypeComboBox.Items.AddRange(Enum.GetNames(typeof(rage__fwArchetypeDef__eAssetType))); } - public void SetArchetype(Archetype archetype) + public void SetArchetype(Archetype? archetype) { CurrentArchetype = archetype; Tag = archetype; @@ -46,9 +46,34 @@ namespace CodeWalker.Project.Panels ArchetypeDeleteButton.Enabled = ProjectForm.YtypExistsInProject(CurrentArchetype.Ytyp); ArchetypeNameTextBox.Text = CurrentArchetype.Name; AssetNameTextBox.Text = CurrentArchetype.AssetName; - LodDistNumericUpDown.Value = (decimal)CurrentArchetype._BaseArchetypeDef.lodDist; - HDTextureDistNumericUpDown.Value = (decimal)CurrentArchetype._BaseArchetypeDef.hdTextureDist; - SpecialAttributeNumericUpDown.Value = CurrentArchetype._BaseArchetypeDef.specialAttribute; + if ((decimal)CurrentArchetype._BaseArchetypeDef.lodDist > LodDistNumericUpDown.Maximum) + { + MessageBox.Show($"lodDist {CurrentArchetype._BaseArchetypeDef.lodDist:0.##} is higher than maximum allowed, capping it to {LodDistNumericUpDown.Maximum:0.##}"); + LodDistNumericUpDown.Value = LodDistNumericUpDown.Maximum; + } + else + { + LodDistNumericUpDown.Value = (decimal)CurrentArchetype._BaseArchetypeDef.lodDist; + } + if ((decimal)CurrentArchetype._BaseArchetypeDef.hdTextureDist > HDTextureDistNumericUpDown.Maximum) + { + MessageBox.Show($"hdTextureDist {CurrentArchetype._BaseArchetypeDef.hdTextureDist:0.##} is higher than maximum allowed, capping it to {HDTextureDistNumericUpDown.Maximum:0.##}"); + HDTextureDistNumericUpDown.Value = HDTextureDistNumericUpDown.Maximum; + } + else + { + HDTextureDistNumericUpDown.Value = (decimal)CurrentArchetype._BaseArchetypeDef.hdTextureDist; + } + if (CurrentArchetype._BaseArchetypeDef.specialAttribute > SpecialAttributeNumericUpDown.Maximum) + { + MessageBox.Show($"specialAttribute {CurrentArchetype._BaseArchetypeDef.specialAttribute} is higher than maximum allowed, capping it to {SpecialAttributeNumericUpDown.Maximum:0.##}"); + SpecialAttributeNumericUpDown.Value = SpecialAttributeNumericUpDown.Maximum; + } + else + { + SpecialAttributeNumericUpDown.Value = CurrentArchetype._BaseArchetypeDef.specialAttribute; + } + ArchetypeFlagsTextBox.Text = CurrentArchetype._BaseArchetypeDef.flags.ToString(); TextureDictTextBox.Text = CurrentArchetype._BaseArchetypeDef.textureDictionary.ToCleanString(); ClipDictionaryTextBox.Text = CurrentArchetype._BaseArchetypeDef.clipDictionary.ToCleanString(); @@ -80,7 +105,7 @@ namespace CodeWalker.Project.Panels TabControl.TabPages.Add(TimeArchetypeTabPage); } - TimeFlagsTextBox.Text = TimeArchetype.TimeFlags.ToString(); + TimeFlagsTextBox.Text = TimeArchetype.ActiveHours.TimeFlags.ToString(); } else TabControl.TabPages.Remove(TimeArchetypeTabPage); @@ -361,16 +386,17 @@ namespace CodeWalker.Project.Panels private void MloUpdatePortalCountsButton_Click(object sender, EventArgs e) { - var mlo = CurrentArchetype as MloArchetype; - if (mlo == null) return; + if (CurrentArchetype is not MloArchetype mlo) return; mlo.UpdatePortalCounts(); } private void TimeFlagsTextBox_TextChanged(object sender, EventArgs e) { - if (populatingui) return; - if (CurrentArchetype == null) return; + if (populatingui) + return; + if (CurrentArchetype == null) + return; if (CurrentArchetype is TimeArchetype TimeArchetype) { uint flags = 0; @@ -384,7 +410,7 @@ namespace CodeWalker.Project.Panels populatingui = false; lock (ProjectForm.ProjectSyncRoot) { - if (TimeArchetype.TimeFlags != flags) + if (TimeArchetype.ActiveHours.TimeFlags != flags) { TimeArchetype.SetTimeFlags(flags); ProjectForm.SetYtypHasChanged(true); @@ -423,7 +449,7 @@ namespace CodeWalker.Project.Panels populatingui = false; lock (ProjectForm.ProjectSyncRoot) { - if (TimeArchetype.TimeFlags != flags) + if (TimeArchetype.ActiveHours.TimeFlags != flags) { TimeArchetype.SetTimeFlags(flags); ProjectForm.SetYtypHasChanged(true); diff --git a/CodeWalker/Project/Panels/EditYtypArchetypePanel.resx b/CodeWalker/Project/Panels/EditYtypArchetypePanel.resx index 2d9a79e..3a8a20a 100644 --- a/CodeWalker/Project/Panels/EditYtypArchetypePanel.resx +++ b/CodeWalker/Project/Panels/EditYtypArchetypePanel.resx @@ -1,17 +1,17 @@  - diff --git a/CodeWalker/Project/Panels/EditYtypMloEntSetPanel.cs b/CodeWalker/Project/Panels/EditYtypMloEntSetPanel.cs index dc07e5e..cf78e2e 100644 --- a/CodeWalker/Project/Panels/EditYtypMloEntSetPanel.cs +++ b/CodeWalker/Project/Panels/EditYtypMloEntSetPanel.cs @@ -131,8 +131,7 @@ namespace CodeWalker.Project.Panels if (CurrentEntitySet == null) return; - var item = LocationsListBox.SelectedItem as LocationItem; - if (item == null) return; + if (LocationsListBox.SelectedItem is not LocationItem item) return; SelectingLocation = true; SelectedLocationEntityLabel.Text = (item.Entity != null) ? item.Entity.Name : "-"; @@ -146,8 +145,7 @@ namespace CodeWalker.Project.Panels if (SelectingLocation) return; if (CurrentEntitySet?.Locations == null) return; - var item = LocationsListBox.SelectedItem as LocationItem; - if (item == null) return; + if (LocationsListBox.SelectedItem is not LocationItem item) return; item.Location = (SelectedLocationRoomCombo.SelectedIndex >= 0) ? (uint)SelectedLocationRoomCombo.SelectedIndex : 0; diff --git a/CodeWalker/Project/Panels/GenerateLODLightsPanel.cs b/CodeWalker/Project/Panels/GenerateLODLightsPanel.cs index 8d3d947..3c59d71 100644 --- a/CodeWalker/Project/Panels/GenerateLODLightsPanel.cs +++ b/CodeWalker/Project/Panels/GenerateLODLightsPanel.cs @@ -45,14 +45,16 @@ namespace CodeWalker.Project.Panels { if (InvokeRequired) { - Invoke(new Action(() => { GenerateComplete(); })); + Invoke(GenerateComplete); } else { GenerateButton.Enabled = true; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } @@ -62,14 +64,16 @@ namespace CodeWalker.Project.Panels { if (InvokeRequired) { - Invoke(new Action(() => { UpdateStatus(text); })); + Invoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } @@ -90,17 +94,19 @@ namespace CodeWalker.Project.Panels var pname = NameTextBox.Text; - Task.Run(() => + _ = Task.Run(async () => { var lights = new List(); foreach (var ymap in projectYmaps) { - if (ymap?.AllEntities == null) continue; + if (ymap.AllEntities.Length == 0) + continue; foreach (var ent in ymap.AllEntities) { - if (ent.Archetype == null) continue; + if (ent.Archetype is null) + continue; bool waiting = false; var dwbl = gameFileCache.TryGetDrawable(ent.Archetype, out waiting); @@ -275,10 +281,10 @@ namespace CodeWalker.Project.Panels UpdateStatus("Adding new ymap files to project..."); - ProjectForm.Invoke((MethodInvoker)delegate + await ProjectForm.Invoke(async () => { - ProjectForm.AddYmapToProject(lodymap); - ProjectForm.AddYmapToProject(distymap); + await ProjectForm.AddYmapToProjectAsync(lodymap); + await ProjectForm.AddYmapToProjectAsync(distymap); }); var stats = ""; diff --git a/CodeWalker/Project/Panels/GenerateNavMeshPanel.cs b/CodeWalker/Project/Panels/GenerateNavMeshPanel.cs index dc3f258..2a8fe4f 100644 --- a/CodeWalker/Project/Panels/GenerateNavMeshPanel.cs +++ b/CodeWalker/Project/Panels/GenerateNavMeshPanel.cs @@ -133,14 +133,14 @@ namespace CodeWalker.Project.Panels { continue; } //ybn not found? if (!ybn.Loaded) //ybn not loaded yet... { - UpdateStatus("Loading ybn: " + boundsitem.Name.ToString() + " ..."); + UpdateStatus($"Loading ybn: {boundsitem.Name} ..."); int waitCount = 0; while (!ybn.Loaded) { waitCount++; if (waitCount > 10000) { - UpdateStatus("Timeout waiting for ybn " + boundsitem.Name.ToString() + " to load!"); + UpdateStatus($"Timeout waiting for ybn {boundsitem.Name} to load!"); Thread.Sleep(1000); //just to let the message display for a second... break; } @@ -170,7 +170,7 @@ namespace CodeWalker.Project.Panels var vcoffset = new Vector3(vx, vy, 0) * density; ray.Position = bmin + vcoffset; ray.Position.Z = bmax.Z + 1.0f;//start the ray at the top of the cell - var intres = space.RayIntersect(ray, float.MaxValue, layers); + var intres = space.RayIntersect(ref ray, float.MaxValue, layers); hitTestCount++; while (intres.Hit)// && (intres.HitDist > 0)) { @@ -197,7 +197,7 @@ namespace CodeWalker.Project.Panels } //continue down until no more hits..... step by 3m ray.Position.Z = intres.Position.Z - 3.0f; - intres = space.RayIntersect(ray, float.MaxValue, layers); + intres = space.RayIntersect(ref ray, float.MaxValue, layers); } vgrid.EndCell(vx, vy); } @@ -2123,7 +2123,10 @@ namespace CodeWalker.Project.Panels GenerateButton.Enabled = true; } } - catch { } + catch (Exception ex) + { + Console.WriteLine(ex); + } } @@ -2133,14 +2136,17 @@ namespace CodeWalker.Project.Panels { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateStatus(text); })); + BeginInvoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch (Exception ex) + { + Console.WriteLine(ex); + } } diff --git a/CodeWalker/Project/Panels/ProjectExplorerPanel.cs b/CodeWalker/Project/Panels/ProjectExplorerPanel.cs index 5ec993f..2adf5d6 100644 --- a/CodeWalker/Project/Panels/ProjectExplorerPanel.cs +++ b/CodeWalker/Project/Panels/ProjectExplorerPanel.cs @@ -1,5 +1,6 @@ using CodeWalker.GameFiles; using CodeWalker.World; +using CommunityToolkit.HighPerformance; using System; using System.Collections.Generic; using System.ComponentModel; @@ -9,7 +10,9 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows.Documents; using System.Windows.Forms; +using System.Windows.Threading; using WeifenLuo.WinFormsUI.Docking; namespace CodeWalker.Project.Panels @@ -29,292 +32,315 @@ namespace CodeWalker.Project.Panels } - public void LoadProjectTree(ProjectFile projectFile) + public void LoadProjectTree(ProjectFile? projectFile) { - ProjectTreeView.Nodes.Clear(); - - CurrentProjectFile = projectFile; - if (CurrentProjectFile == null) return; - - var pcstr = CurrentProjectFile.HasChanged ? "*" : ""; - - var projnode = ProjectTreeView.Nodes.Add(pcstr + CurrentProjectFile.Name); - projnode.Tag = CurrentProjectFile; - - - if (CurrentProjectFile.YmapFiles.Count > 0) + if (InvokeRequired) { - var ymapsnode = projnode.Nodes.Add("Ymap Files"); - ymapsnode.Name = "Ymap"; - - foreach (var ymapfile in CurrentProjectFile.YmapFiles) - { - var ycstr = ymapfile.HasChanged ? "*" : ""; - string name = ymapfile.Name; - if (ymapfile.RpfFileEntry != null) - { - name = ymapfile.RpfFileEntry.Name; - } - var ymapnode = ymapsnode.Nodes.Add(ycstr + name); - ymapnode.Tag = ymapfile; - - LoadYmapTreeNodes(ymapfile, ymapnode); - - JenkIndex.EnsureBoth(name); - JenkIndex.EnsureBoth(Path.GetFileNameWithoutExtension(name)); - } - ymapsnode.Expand(); + Invoke(LoadProjectTree, projectFile); + return; } - - if (CurrentProjectFile.YtypFiles.Count > 0) + ProjectTreeView.BeginUpdate(); + ProjectTreeView.SuspendLayout(); + try { - var ytypsnode = projnode.Nodes.Add("Ytyp Files"); - ytypsnode.Name = "Ytyp"; + ProjectTreeView.Nodes.Clear(); - foreach (var ytypfile in CurrentProjectFile.YtypFiles) + CurrentProjectFile = projectFile; + if (CurrentProjectFile is null) + return; + + var pcstr = CurrentProjectFile.HasChanged ? "*" : ""; + + var projnode = ProjectTreeView.Nodes.Add(pcstr + CurrentProjectFile.Name); + projnode.Tag = CurrentProjectFile; + + + if (CurrentProjectFile.YmapFiles.Count > 0) { - var ycstr = ytypfile.HasChanged ? "*" : ""; - string name = ytypfile.Name; - if (ytypfile.RpfFileEntry != null) + var ymapsnode = projnode.Nodes.Add("Ymap Files"); + ymapsnode.Name = "Ymap"; + + foreach (var ymapfile in CurrentProjectFile.YmapFiles) { - name = ytypfile.RpfFileEntry.Name; + var ycstr = ymapfile.HasChanged ? "*" : ""; + string name = ymapfile.Name; + if (ymapfile.RpfFileEntry != null) + { + name = ymapfile.RpfFileEntry.Name; + } + var ymapnode = ymapsnode.Nodes.Add(ycstr + name); + ymapnode.Tag = ymapfile; + + LoadYmapTreeNodes(ymapfile, ymapnode); + + JenkIndex.EnsureBoth(name); + JenkIndex.EnsureBoth(Path.GetFileNameWithoutExtension(name)); } - var ytypnode = ytypsnode.Nodes.Add(ycstr + name); - ytypnode.Tag = ytypfile; - - LoadYtypTreeNodes(ytypfile, ytypnode); - - JenkIndex.EnsureBoth(name); - JenkIndex.EnsureBoth(Path.GetFileNameWithoutExtension(name)); + ymapsnode.Expand(); } - ytypsnode.Expand(); - } - if (CurrentProjectFile.YbnFiles.Count > 0) + if (CurrentProjectFile.YtypFiles.Count > 0) + { + var ytypsnode = projnode.Nodes.Add("Ytyp Files"); + ytypsnode.Name = "Ytyp"; + + foreach (var ytypfile in CurrentProjectFile.YtypFiles) + { + var ycstr = ytypfile.HasChanged ? "*" : ""; + string name = ytypfile.Name; + if (ytypfile.RpfFileEntry != null) + { + name = ytypfile.RpfFileEntry.Name; + } + var ytypnode = ytypsnode.Nodes.Add(ycstr + name); + ytypnode.Tag = ytypfile; + + LoadYtypTreeNodes(ytypfile, ytypnode); + + JenkIndex.EnsureBoth(name); + JenkIndex.EnsureBoth(Path.GetFileNameWithoutExtension(name)); + } + ytypsnode.Expand(); + } + + if (CurrentProjectFile.YbnFiles.Count > 0) + { + var ybnsnode = projnode.Nodes.Add("Ybn Files"); + ybnsnode.Name = "Ybn"; + + foreach (var ybnfile in CurrentProjectFile.YbnFiles) + { + var ycstr = ybnfile.HasChanged ? "*" : ""; + string name = ybnfile.Name; + if (ybnfile.RpfFileEntry != null) + { + name = ybnfile.RpfFileEntry.Name; + } + var yndnode = ybnsnode.Nodes.Add(ycstr + name); + yndnode.Tag = ybnfile; + + LoadYbnTreeNodes(ybnfile, yndnode); + } + ybnsnode.Expand(); + } + + if (CurrentProjectFile.YndFiles.Count > 0) + { + var yndsnode = projnode.Nodes.Add("Ynd Files"); + yndsnode.Name = "Ynd"; + + foreach (var yndfile in CurrentProjectFile.YndFiles) + { + var ycstr = yndfile.HasChanged ? "*" : ""; + string name = yndfile.Name; + if (yndfile.RpfFileEntry != null) + { + name = yndfile.RpfFileEntry.Name; + } + var yndnode = yndsnode.Nodes.Add(ycstr + name); + yndnode.Tag = yndfile; + + LoadYndTreeNodes(yndfile, yndnode); + } + yndsnode.Expand(); + } + + if (CurrentProjectFile.YnvFiles.Count > 0) + { + var ynvsnode = projnode.Nodes.Add("Ynv Files"); + ynvsnode.Name = "Ynv"; + + foreach (var ynvfile in CurrentProjectFile.YnvFiles) + { + var ycstr = ynvfile.HasChanged ? "*" : ""; + string name = ynvfile.Name; + if (ynvfile.RpfFileEntry != null) + { + name = ynvfile.RpfFileEntry.Name; + } + var ynvnode = ynvsnode.Nodes.Add(ycstr + name); + ynvnode.Tag = ynvfile; + + LoadYnvTreeNodes(ynvfile, ynvnode); + } + ynvsnode.Expand(); + } + + if (CurrentProjectFile.TrainsFiles.Count > 0) + { + var trainsnode = projnode.Nodes.Add("Trains Files"); + trainsnode.Name = "Trains"; + + foreach (var trainfile in CurrentProjectFile.TrainsFiles) + { + var tcstr = trainfile.HasChanged ? "*" : ""; + string name = trainfile.Name; + if (trainfile.RpfFileEntry != null) + { + name = trainfile.RpfFileEntry.Name; + } + var trainnode = trainsnode.Nodes.Add(tcstr + name); + trainnode.Tag = trainfile; + + LoadTrainTrackTreeNodes(trainfile, trainnode); + } + trainsnode.Expand(); + } + + if (CurrentProjectFile.ScenarioFiles.Count > 0) + { + var scenariosnode = projnode.Nodes.Add("Scenario Files"); + scenariosnode.Name = "Scenarios"; + + foreach (var scenariofile in CurrentProjectFile.ScenarioFiles) + { + var scstr = scenariofile.HasChanged ? "*" : ""; + string name = scenariofile.Name; + if (scenariofile.RpfFileEntry != null) + { + name = scenariofile.RpfFileEntry.Name; + } + var scenarionode = scenariosnode.Nodes.Add(scstr + name); + scenarionode.Tag = scenariofile; + + LoadScenarioTreeNodes(scenariofile, scenarionode); + } + scenariosnode.Expand(); + } + + if (CurrentProjectFile.AudioRelFiles.Count > 0) + { + var audiorelsnode = projnode.Nodes.Add("Audio Rel Files"); + audiorelsnode.Name = "AudioRels"; + + foreach (var audiorelfile in CurrentProjectFile.AudioRelFiles) + { + var acstr = audiorelfile.HasChanged ? "*" : ""; + string name = audiorelfile.Name; + if (audiorelfile.RpfFileEntry != null) + { + name = audiorelfile.RpfFileEntry.Name; + } + var audiorelnode = audiorelsnode.Nodes.Add(acstr + name); + audiorelnode.Tag = audiorelfile; + + LoadAudioRelTreeNodes(audiorelfile, audiorelnode); + } + audiorelsnode.Expand(); + } + + if (CurrentProjectFile.YdrFiles.Count > 0) + { + var ydrsnode = projnode.Nodes.Add("Ydr Files"); + ydrsnode.Name = "Ydr"; + + foreach (var ydrfile in CurrentProjectFile.YdrFiles) + { + var ycstr = "";// ydrfile.HasChanged ? "*" : ""; + string name = ydrfile.Name; + if (ydrfile.RpfFileEntry != null) + { + name = ydrfile.RpfFileEntry.Name; + } + var ydrnode = ydrsnode.Nodes.Add(ycstr + name); + ydrnode.Tag = ydrfile; + + //LoadYdrTreeNodes(ydrfile, ydrnode); + } + ydrsnode.Expand(); + } + + if (CurrentProjectFile.YddFiles.Count > 0) + { + var yddsnode = projnode.Nodes.Add("Ydd Files"); + yddsnode.Name = "Ydd"; + + foreach (var yddfile in CurrentProjectFile.YddFiles) + { + var ycstr = "";// yddfile.HasChanged ? "*" : ""; + string name = yddfile.Name; + if (yddfile.RpfFileEntry != null) + { + name = yddfile.RpfFileEntry.Name; + } + var yddnode = yddsnode.Nodes.Add(ycstr + name); + yddnode.Tag = yddfile; + + //LoadYddTreeNodes(yddfile, yddnode); + } + yddsnode.Expand(); + } + + if (CurrentProjectFile.YftFiles.Count > 0) + { + var yftsnode = projnode.Nodes.Add("Yft Files"); + yftsnode.Name = "Yft"; + + foreach (var yftfile in CurrentProjectFile.YftFiles) + { + var ycstr = "";// yftfile.HasChanged ? "*" : ""; + string name = yftfile.Name; + if (yftfile.RpfFileEntry != null) + { + name = yftfile.RpfFileEntry.Name; + } + var yftnode = yftsnode.Nodes.Add(ycstr + name); + yftnode.Tag = yftfile; + + //LoadYftTreeNodes(yftfile, yftnode); + } + yftsnode.Expand(); + } + + if (CurrentProjectFile.YtdFiles.Count > 0) + { + var ytdsnode = projnode.Nodes.Add("Ytd Files"); + ytdsnode.Name = "Ytd"; + + foreach (var ytdfile in CurrentProjectFile.YtdFiles) + { + var ycstr = "";// ytdfile.HasChanged ? "*" : ""; + string name = ytdfile.Name; + if (ytdfile.RpfFileEntry != null) + { + name = ytdfile.RpfFileEntry.Name; + } + var ytdnode = ytdsnode.Nodes.Add(ycstr + name); + ytdnode.Tag = ytdfile; + + //LoadYtdTreeNodes(ytdfile, ytdnode); + } + ytdsnode.Expand(); + } + + projnode.Expand(); + } + finally { - var ybnsnode = projnode.Nodes.Add("Ybn Files"); - ybnsnode.Name = "Ybn"; - - foreach (var ybnfile in CurrentProjectFile.YbnFiles) - { - var ycstr = ybnfile.HasChanged ? "*" : ""; - string name = ybnfile.Name; - if (ybnfile.RpfFileEntry != null) - { - name = ybnfile.RpfFileEntry.Name; - } - var yndnode = ybnsnode.Nodes.Add(ycstr + name); - yndnode.Tag = ybnfile; - - LoadYbnTreeNodes(ybnfile, yndnode); - } - ybnsnode.Expand(); + ProjectTreeView.EndUpdate(); + ProjectTreeView.ResumeLayout(); } - - if (CurrentProjectFile.YndFiles.Count > 0) - { - var yndsnode = projnode.Nodes.Add("Ynd Files"); - yndsnode.Name = "Ynd"; - - foreach (var yndfile in CurrentProjectFile.YndFiles) - { - var ycstr = yndfile.HasChanged ? "*" : ""; - string name = yndfile.Name; - if (yndfile.RpfFileEntry != null) - { - name = yndfile.RpfFileEntry.Name; - } - var yndnode = yndsnode.Nodes.Add(ycstr + name); - yndnode.Tag = yndfile; - - LoadYndTreeNodes(yndfile, yndnode); - } - yndsnode.Expand(); - } - - if (CurrentProjectFile.YnvFiles.Count > 0) - { - var ynvsnode = projnode.Nodes.Add("Ynv Files"); - ynvsnode.Name = "Ynv"; - - foreach (var ynvfile in CurrentProjectFile.YnvFiles) - { - var ycstr = ynvfile.HasChanged ? "*" : ""; - string name = ynvfile.Name; - if (ynvfile.RpfFileEntry != null) - { - name = ynvfile.RpfFileEntry.Name; - } - var ynvnode = ynvsnode.Nodes.Add(ycstr + name); - ynvnode.Tag = ynvfile; - - LoadYnvTreeNodes(ynvfile, ynvnode); - } - ynvsnode.Expand(); - } - - if (CurrentProjectFile.TrainsFiles.Count > 0) - { - var trainsnode = projnode.Nodes.Add("Trains Files"); - trainsnode.Name = "Trains"; - - foreach (var trainfile in CurrentProjectFile.TrainsFiles) - { - var tcstr = trainfile.HasChanged ? "*" : ""; - string name = trainfile.Name; - if (trainfile.RpfFileEntry != null) - { - name = trainfile.RpfFileEntry.Name; - } - var trainnode = trainsnode.Nodes.Add(tcstr + name); - trainnode.Tag = trainfile; - - LoadTrainTrackTreeNodes(trainfile, trainnode); - } - trainsnode.Expand(); - } - - if (CurrentProjectFile.ScenarioFiles.Count > 0) - { - var scenariosnode = projnode.Nodes.Add("Scenario Files"); - scenariosnode.Name = "Scenarios"; - - foreach (var scenariofile in CurrentProjectFile.ScenarioFiles) - { - var scstr = scenariofile.HasChanged ? "*" : ""; - string name = scenariofile.Name; - if (scenariofile.RpfFileEntry != null) - { - name = scenariofile.RpfFileEntry.Name; - } - var scenarionode = scenariosnode.Nodes.Add(scstr + name); - scenarionode.Tag = scenariofile; - - LoadScenarioTreeNodes(scenariofile, scenarionode); - } - scenariosnode.Expand(); - } - - if (CurrentProjectFile.AudioRelFiles.Count > 0) - { - var audiorelsnode = projnode.Nodes.Add("Audio Rel Files"); - audiorelsnode.Name = "AudioRels"; - - foreach (var audiorelfile in CurrentProjectFile.AudioRelFiles) - { - var acstr = audiorelfile.HasChanged ? "*" : ""; - string name = audiorelfile.Name; - if (audiorelfile.RpfFileEntry != null) - { - name = audiorelfile.RpfFileEntry.Name; - } - var audiorelnode = audiorelsnode.Nodes.Add(acstr + name); - audiorelnode.Tag = audiorelfile; - - LoadAudioRelTreeNodes(audiorelfile, audiorelnode); - } - audiorelsnode.Expand(); - } - - if (CurrentProjectFile.YdrFiles.Count > 0) - { - var ydrsnode = projnode.Nodes.Add("Ydr Files"); - ydrsnode.Name = "Ydr"; - - foreach (var ydrfile in CurrentProjectFile.YdrFiles) - { - var ycstr = "";// ydrfile.HasChanged ? "*" : ""; - string name = ydrfile.Name; - if (ydrfile.RpfFileEntry != null) - { - name = ydrfile.RpfFileEntry.Name; - } - var ydrnode = ydrsnode.Nodes.Add(ycstr + name); - ydrnode.Tag = ydrfile; - - //LoadYdrTreeNodes(ydrfile, ydrnode); - } - ydrsnode.Expand(); - } - - if (CurrentProjectFile.YddFiles.Count > 0) - { - var yddsnode = projnode.Nodes.Add("Ydd Files"); - yddsnode.Name = "Ydd"; - - foreach (var yddfile in CurrentProjectFile.YddFiles) - { - var ycstr = "";// yddfile.HasChanged ? "*" : ""; - string name = yddfile.Name; - if (yddfile.RpfFileEntry != null) - { - name = yddfile.RpfFileEntry.Name; - } - var yddnode = yddsnode.Nodes.Add(ycstr + name); - yddnode.Tag = yddfile; - - //LoadYddTreeNodes(yddfile, yddnode); - } - yddsnode.Expand(); - } - - if (CurrentProjectFile.YftFiles.Count > 0) - { - var yftsnode = projnode.Nodes.Add("Yft Files"); - yftsnode.Name = "Yft"; - - foreach (var yftfile in CurrentProjectFile.YftFiles) - { - var ycstr = "";// yftfile.HasChanged ? "*" : ""; - string name = yftfile.Name; - if (yftfile.RpfFileEntry != null) - { - name = yftfile.RpfFileEntry.Name; - } - var yftnode = yftsnode.Nodes.Add(ycstr + name); - yftnode.Tag = yftfile; - - //LoadYftTreeNodes(yftfile, yftnode); - } - yftsnode.Expand(); - } - - if (CurrentProjectFile.YtdFiles.Count > 0) - { - var ytdsnode = projnode.Nodes.Add("Ytd Files"); - ytdsnode.Name = "Ytd"; - - foreach (var ytdfile in CurrentProjectFile.YtdFiles) - { - var ycstr = "";// ytdfile.HasChanged ? "*" : ""; - string name = ytdfile.Name; - if (ytdfile.RpfFileEntry != null) - { - name = ytdfile.RpfFileEntry.Name; - } - var ytdnode = ytdsnode.Nodes.Add(ycstr + name); - ytdnode.Tag = ytdfile; - - //LoadYtdTreeNodes(ytdfile, ytdnode); - } - ytdsnode.Expand(); - } - - projnode.Expand(); - } private void LoadYmapTreeNodes(YmapFile ymap, TreeNode node) { - if (ymap == null) return; + if (ymap is null) + return; - if (!string.IsNullOrEmpty(node.Name)) return; //named nodes are eg Entities and CarGens + if (!string.IsNullOrEmpty(node.Name)) + return; //named nodes are eg Entities and CarGens + + if (InvokeRequired) + { + Invoke(LoadYmapTreeNodes, ymap, node); + return; + } node.Nodes.Clear(); - if ((ymap.AllEntities != null) && (ymap.AllEntities.Length > 0)) + if (ymap.AllEntities.Length > 0) { - var entsnode = node.Nodes.Add("Entities (" + ymap.AllEntities.Length.ToString() + ")"); + var entsnode = node.Nodes.Add($"Entities ({ymap.AllEntities.Length})"); entsnode.Name = "Entities"; entsnode.Tag = ymap; var ents = ymap.AllEntities; @@ -331,9 +357,9 @@ namespace CodeWalker.Project.Panels enode.Tag = ent; } } - if ((ymap.CarGenerators != null) && (ymap.CarGenerators.Length > 0)) + if (ymap.CarGenerators != null && ymap.CarGenerators.Length > 0) { - var cargensnode = node.Nodes.Add("Car Generators (" + ymap.CarGenerators.Length.ToString() + ")"); + var cargensnode = node.Nodes.Add($"Car Generators ({ymap.CarGenerators.Length})"); cargensnode.Name = "CarGens"; cargensnode.Tag = ymap; var cargens = ymap.CarGenerators; @@ -344,9 +370,9 @@ namespace CodeWalker.Project.Panels ccgnode.Tag = cargen; } } - if ((ymap.LODLights?.LodLights != null) && (ymap.LODLights.LodLights.Length > 0)) + if (ymap.LODLights?.LodLights != null && ymap.LODLights.LodLights.Length > 0) { - var lodlightsnode = node.Nodes.Add("LOD Lights (" + ymap.LODLights.LodLights.Length.ToString() + ")"); + var lodlightsnode = node.Nodes.Add($"LOD Lights ({ymap.LODLights.LodLights.Length})"); lodlightsnode.Name = "LodLights"; lodlightsnode.Tag = ymap; var lodlights = ymap.LODLights.LodLights; @@ -357,9 +383,9 @@ namespace CodeWalker.Project.Panels llnode.Tag = lodlight; } } - if ((ymap.BoxOccluders != null) && (ymap.BoxOccluders.Length > 0)) + if (ymap.BoxOccluders != null && ymap.BoxOccluders.Length > 0) { - var boxocclsnode = node.Nodes.Add("Box Occluders (" + ymap.BoxOccluders.Length.ToString() + ")"); + var boxocclsnode = node.Nodes.Add($"Box Occluders ({ymap.BoxOccluders.Length})"); boxocclsnode.Name = "BoxOccluders"; boxocclsnode.Tag = ymap; var boxes = ymap.BoxOccluders; @@ -370,9 +396,9 @@ namespace CodeWalker.Project.Panels boxnode.Tag = box; } } - if ((ymap.OccludeModels != null) && (ymap.OccludeModels.Length > 0)) + if (ymap.OccludeModels != null && ymap.OccludeModels.Length > 0) { - var occlmodsnode = node.Nodes.Add("Occlude Models (" + ymap.OccludeModels.Length.ToString() + ")"); + var occlmodsnode = node.Nodes.Add($"Occlude Models ({ymap.OccludeModels.Length})"); occlmodsnode.Name = "OccludeModels"; occlmodsnode.Tag = ymap; var models = ymap.OccludeModels; @@ -383,9 +409,9 @@ namespace CodeWalker.Project.Panels modnode.Tag = model; } } - if ((ymap.GrassInstanceBatches != null) && (ymap.GrassInstanceBatches.Length > 0)) + if (ymap.GrassInstanceBatches != null && ymap.GrassInstanceBatches.Length > 0) { - var grassbatchesnodes = node.Nodes.Add("Grass Batches (" + ymap.GrassInstanceBatches.Length.ToString() + ")"); + var grassbatchesnodes = node.Nodes.Add($"Grass Batches ({ymap.GrassInstanceBatches.Length})"); grassbatchesnodes.Name = "GrassBatches"; grassbatchesnodes.Tag = ymap; var grassbatches = ymap.GrassInstanceBatches; @@ -400,15 +426,23 @@ namespace CodeWalker.Project.Panels } private void LoadYtypTreeNodes(YtypFile ytyp, TreeNode node) { - if (ytyp == null) return; + if (ytyp is null) + return; - if (!string.IsNullOrEmpty(node.Name)) return; + if (!string.IsNullOrEmpty(node.Name)) + return; + + if (InvokeRequired) + { + Invoke(LoadYtypTreeNodes, ytyp, node); + return; + } node.Nodes.Clear(); - if ((ytyp.AllArchetypes != null) && (ytyp.AllArchetypes.Length > 0)) + if (ytyp.AllArchetypes.Length > 0) { - var archetypesnode = node.Nodes.Add("Archetypes (" + ytyp.AllArchetypes.Length.ToString() + ")"); + var archetypesnode = node.Nodes.Add($"Archetypes ({ytyp.AllArchetypes.Length})"); archetypesnode.Name = "Archetypes"; archetypesnode.Tag = ytyp; var archetypes = ytyp.AllArchetypes; @@ -424,14 +458,14 @@ namespace CodeWalker.Project.Panels var entities = mlo.entities; var entsets = mlo.entitySets; var portals = mlo.portals; - if ((rooms != null) && (rooms.Length > 0)) + if (rooms is not null && rooms.Length > 0) { - var roomsnode = tarch.Nodes.Add("Rooms (" + rooms.Length.ToString() + ")"); + var roomsnode = tarch.Nodes.Add($"Rooms ({rooms.Length})"); roomsnode.Name = "Rooms"; for (int j = 0; j < rooms.Length; j++) { var room = rooms[j]; - var roomnode = roomsnode.Nodes.Add(room.Index.ToString() + ": " + room.RoomName); + var roomnode = roomsnode.Nodes.Add($"{room.Index}: {room.RoomName}"); roomnode.Tag = room; var roomentities = room.AttachedObjects; if ((roomentities != null) && (entities != null)) @@ -449,9 +483,9 @@ namespace CodeWalker.Project.Panels } } } - if ((portals != null) && (portals.Length > 0)) + if (portals != null && portals.Length > 0) { - var portalsnode = tarch.Nodes.Add("Portals (" + portals.Length.ToString() + ")"); + var portalsnode = tarch.Nodes.Add($"Portals ({portals.Length})"); portalsnode.Name = "Portals"; for (int j = 0; j < portals.Length; j++) { @@ -476,7 +510,7 @@ namespace CodeWalker.Project.Panels } if ((entsets != null) && (entsets.Length > 0)) { - var setsnode = tarch.Nodes.Add("Entity Sets (" + entsets.Length.ToString() + ")"); + var setsnode = tarch.Nodes.Add($"Entity Sets ({entsets.Length})"); setsnode.Name = "EntitySets"; for (int j = 0; j < entsets.Length; j++) { @@ -505,9 +539,17 @@ namespace CodeWalker.Project.Panels } private void LoadYbnTreeNodes(YbnFile ybn, TreeNode node) { - if (ybn == null) return; + if (ybn == null) + return; - if (!string.IsNullOrEmpty(node.Name)) return; //named nodes are eg Nodes + if (!string.IsNullOrEmpty(node.Name)) + return; //named nodes are eg Nodes + + if (InvokeRequired) + { + Invoke(LoadYbnTreeNodes, ybn, node); + return; + } node.Nodes.Clear(); @@ -519,7 +561,11 @@ namespace CodeWalker.Project.Panels } private void LoadYbnBoundsTreeNode(Bounds b, TreeNode node) { - + if (InvokeRequired) + { + Invoke(LoadYbnBoundsTreeNode, b, node); + return; + } var boundsnode = node.Nodes.Add(b.Type.ToString()); boundsnode.Tag = b; @@ -553,9 +599,17 @@ namespace CodeWalker.Project.Panels } private void LoadYndTreeNodes(YndFile ynd, TreeNode node) { - if (ynd == null) return; + if (ynd == null) + return; - if (!string.IsNullOrEmpty(node.Name)) return; //named nodes are eg Nodes + if (!string.IsNullOrEmpty(node.Name)) + return; //named nodes are eg Nodes + + if (InvokeRequired) + { + Invoke(LoadYndTreeNodes, ynd, node); + return; + } node.Nodes.Clear(); @@ -579,9 +633,17 @@ namespace CodeWalker.Project.Panels } private void LoadYnvTreeNodes(YnvFile ynv, TreeNode node)//TODO! { - if (ynv == null) return; + if (ynv == null) + return; - if (!string.IsNullOrEmpty(node.Name)) return; //named nodes are eg Polygons + if (!string.IsNullOrEmpty(node.Name)) + return; //named nodes are eg Polygons + + if (InvokeRequired) + { + Invoke(LoadYnvTreeNodes, ynv, node); + return; + } node.Nodes.Clear(); @@ -603,17 +665,25 @@ namespace CodeWalker.Project.Panels } private void LoadTrainTrackTreeNodes(TrainTrack track, TreeNode node) { - if (track == null) return; + if (track == null) + return; - if (!string.IsNullOrEmpty(node.Name)) return; //named nodes are eg Nodes + if (!string.IsNullOrEmpty(node.Name)) + return; //named nodes are eg Nodes + + if (InvokeRequired) + { + Invoke(LoadTrainTrackTreeNodes, track, node); + return; + } node.Nodes.Clear(); - if ((track.Nodes != null) && (track.Nodes.Count > 0)) + if (track.Nodes != null && track.Nodes.Count > 0) { - var nodesnode = node.Nodes.Add("Nodes (" + track.Nodes.Count.ToString() + ")"); + var nodesnode = node.Nodes.Add($"Nodes ({track.Nodes.Count})"); nodesnode.Name = "Nodes"; nodesnode.Tag = track; var nodes = track.Nodes; @@ -628,16 +698,25 @@ namespace CodeWalker.Project.Panels } private void LoadScenarioTreeNodes(YmtFile ymt, TreeNode node) { - if (!string.IsNullOrEmpty(node.Name)) return; //named nodes are eg Points + if (!string.IsNullOrEmpty(node.Name)) + return; //named nodes are eg Points + + if (InvokeRequired) + { + Invoke(LoadScenarioTreeNodes, ymt, node); + return; + } node.Nodes.Clear(); var region = ymt?.ScenarioRegion; - if (region == null) return; + if (region == null) + return; var nodes = region.Nodes; - if ((nodes == null) || (nodes.Count == 0)) return; + if (nodes == null || nodes.Count == 0) + return; var pointsnode = node.Nodes.Add("Points (" + nodes.Count.ToString() + ")"); pointsnode.Name = "Points"; @@ -700,12 +779,20 @@ namespace CodeWalker.Project.Panels } private void LoadAudioRelTreeNodes(RelFile rel, TreeNode node) { - if (!string.IsNullOrEmpty(node.Name)) return; //named nodes are eg Zones, Emitters + if (!string.IsNullOrEmpty(node.Name)) + return; //named nodes are eg Zones, Emitters + + if (InvokeRequired) + { + Invoke(LoadAudioRelTreeNodes, rel, node); + return; + } node.Nodes.Clear(); - if (rel.RelDatasSorted == null) return; //nothing to see here + if (rel.RelDatas == null) + return; //nothing to see here var zones = new List(); @@ -717,29 +804,29 @@ namespace CodeWalker.Project.Panels foreach (var reldata in rel.RelDatasSorted) { - if (reldata is Dat151AmbientZone) + if (reldata is Dat151AmbientZone dat151AmbientZone) { - zones.Add(reldata as Dat151AmbientZone); + zones.Add(dat151AmbientZone); } - if (reldata is Dat151AmbientRule) + if (reldata is Dat151AmbientRule dat151AmbientRule) { - emitters.Add(reldata as Dat151AmbientRule); + emitters.Add(dat151AmbientRule); } - if (reldata is Dat151AmbientZoneList) + if (reldata is Dat151AmbientZoneList dat151AmbientZoneList) { - zonelists.Add(reldata as Dat151AmbientZoneList); + zonelists.Add(dat151AmbientZoneList); } - if (reldata is Dat151StaticEmitterList) + if (reldata is Dat151StaticEmitterList dat151StaticEmitterList) { - emitterlists.Add(reldata as Dat151StaticEmitterList); + emitterlists.Add(dat151StaticEmitterList); } - if (reldata is Dat151Interior) + if (reldata is Dat151Interior dat151Interior) { - interiors.Add(reldata as Dat151Interior); + interiors.Add(dat151Interior); } - if (reldata is Dat151InteriorRoom) + if (reldata is Dat151InteriorRoom dat151InteriorRoom) { - interiorrooms.Add(reldata as Dat151InteriorRoom); + interiorrooms.Add(dat151InteriorRoom); } } @@ -835,15 +922,23 @@ namespace CodeWalker.Project.Panels public void SetProjectHasChanged(bool changed) { - if ((ProjectTreeView.Nodes.Count > 0) && (CurrentProjectFile != null)) + if (ProjectTreeView.Nodes.Count > 0 && CurrentProjectFile != null) { - //first node is the project... - string changestr = changed ? "*" : ""; - ProjectTreeView.Nodes[0].Text = changestr + CurrentProjectFile.Name; + this.InvokeIfRequired(() => + { + //first node is the project... + string changestr = changed ? "*" : ""; + ProjectTreeView.Nodes[0].Text = changestr + CurrentProjectFile.Name; + }); } } public void SetYmapHasChanged(YmapFile ymap, bool changed) { + if (InvokeRequired) + { + Invoke(SetYmapHasChanged, ymap, changed); + return; + } if (ProjectTreeView.Nodes.Count > 0) { var pnode = ProjectTreeView.Nodes[0]; @@ -868,6 +963,11 @@ namespace CodeWalker.Project.Panels } public void SetYtypHasChanged(YtypFile ytyp, bool changed) { + if (InvokeRequired) + { + Invoke(SetYtypHasChanged, ytyp, changed); + return; + } if (ProjectTreeView.Nodes.Count > 0) { var pnode = ProjectTreeView.Nodes[0]; @@ -892,6 +992,11 @@ namespace CodeWalker.Project.Panels } public void SetYbnHasChanged(YbnFile ybn, bool changed) { + if (InvokeRequired) + { + Invoke(SetYbnHasChanged, ybn, changed); + return; + } if (ProjectTreeView.Nodes.Count > 0) { var pnode = ProjectTreeView.Nodes[0]; @@ -916,6 +1021,11 @@ namespace CodeWalker.Project.Panels } public void SetYndHasChanged(YndFile ynd, bool changed) { + if (InvokeRequired) + { + Invoke(SetYndHasChanged, ynd, changed); + return; + } if (ProjectTreeView.Nodes.Count > 0) { var pnode = ProjectTreeView.Nodes[0]; @@ -940,6 +1050,11 @@ namespace CodeWalker.Project.Panels } public void SetYnvHasChanged(YnvFile ynv, bool changed) { + if (InvokeRequired) + { + Invoke(SetYnvHasChanged, ynv, changed); + return; + } if (ProjectTreeView.Nodes.Count > 0) { var pnode = ProjectTreeView.Nodes[0]; @@ -964,6 +1079,11 @@ namespace CodeWalker.Project.Panels } public void SetTrainTrackHasChanged(TrainTrack track, bool changed) { + if (InvokeRequired) + { + Invoke(SetTrainTrackHasChanged, track, changed); + return; + } if (ProjectTreeView.Nodes.Count > 0) { var pnode = ProjectTreeView.Nodes[0]; @@ -988,6 +1108,11 @@ namespace CodeWalker.Project.Panels } public void SetScenarioHasChanged(YmtFile scenario, bool changed) { + if (InvokeRequired) + { + Invoke(SetScenarioHasChanged, scenario, changed); + return; + } if (ProjectTreeView.Nodes.Count > 0) { var pnode = ProjectTreeView.Nodes[0]; @@ -1057,47 +1182,56 @@ namespace CodeWalker.Project.Panels - private TreeNode GetChildTreeNode(TreeNode node, string name) + private TreeNode? GetChildTreeNode(TreeNode? node, string name) { - if (node == null) return null; + if (node is null) + return null; var nodes = node.Nodes.Find(name, false); - if ((nodes == null) || (nodes.Length != 1)) return null; + if (nodes is null || nodes.Length != 1) + return null; return nodes[0]; } - public TreeNode FindYmapTreeNode(YmapFile ymap) + public TreeNode? FindYmapTreeNode(YmapFile ymap) { - if (ProjectTreeView.Nodes.Count <= 0) return null; + if (ProjectTreeView.Nodes.Count <= 0) + return null; var projnode = ProjectTreeView.Nodes[0]; var ymapsnode = GetChildTreeNode(projnode, "Ymap"); - if (ymapsnode == null) return null; + if (ymapsnode is null) + return null; for (int i = 0; i < ymapsnode.Nodes.Count; i++) { var ymapnode = ymapsnode.Nodes[i]; - if (ymapnode.Tag == ymap) return ymapnode; + if (ymapnode.Tag == ymap) + return ymapnode; } return null; } - public TreeNode FindEntityTreeNode(YmapEntityDef ent) + public TreeNode? FindEntityTreeNode(YmapEntityDef ent) { - if (ent == null) return null; - TreeNode ymapnode = FindYmapTreeNode(ent.Ymap); - if (ymapnode == null) return null; + if (ent == null) + return null; + var ymapnode = FindYmapTreeNode(ent.Ymap); + if (ymapnode == null) + return null; var entsnode = GetChildTreeNode(ymapnode, "Entities"); - if (entsnode == null) return null; + if (entsnode == null) + return null; for (int i = 0; i < entsnode.Nodes.Count; i++) { TreeNode entnode = entsnode.Nodes[i]; - if (entnode.Tag == ent) return entnode; + if (entnode.Tag == ent) + return entnode; } return null; } - public TreeNode FindCarGenTreeNode(YmapCarGen cargen) + public TreeNode? FindCarGenTreeNode(YmapCarGen cargen) { - if (cargen == null) return null; - TreeNode ymapnode = FindYmapTreeNode(cargen.Ymap); - if (ymapnode == null) return null; + if (cargen is null) return null; + var ymapnode = FindYmapTreeNode(cargen.Ymap); + if (ymapnode is null) return null; var cargensnode = GetChildTreeNode(ymapnode, "CarGens"); - if (cargensnode == null) return null; + if (cargensnode is null) return null; for (int i = 0; i < cargensnode.Nodes.Count; i++) { TreeNode cargennode = cargensnode.Nodes[i]; @@ -1105,303 +1239,373 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindLodLightTreeNode(YmapLODLight lodlight) + public TreeNode? FindLodLightTreeNode(YmapLODLight lodlight) { - if (lodlight == null) return null; - TreeNode ymapnode = FindYmapTreeNode(lodlight.Ymap); - if (ymapnode == null) return null; + if (lodlight is null) + return null; + var ymapnode = FindYmapTreeNode(lodlight.Ymap); + if (ymapnode is null) + return null; var lodlightsnode = GetChildTreeNode(ymapnode, "LodLights"); - if (lodlightsnode == null) return null; + if (lodlightsnode is null) + return null; for (int i = 0; i < lodlightsnode.Nodes.Count; i++) { TreeNode lodlightnode = lodlightsnode.Nodes[i]; - if (lodlightnode.Tag == lodlight) return lodlightnode; + if (lodlightnode.Tag == lodlight) + return lodlightnode; } return null; } - public TreeNode FindBoxOccluderTreeNode(YmapBoxOccluder box) + public TreeNode? FindBoxOccluderTreeNode(YmapBoxOccluder box) { - if (box == null) return null; - TreeNode ymapnode = FindYmapTreeNode(box.Ymap); - if (ymapnode == null) return null; + if (box is null) + return null; + var ymapnode = FindYmapTreeNode(box.Ymap); + if (ymapnode is null) + return null; var boxesnode = GetChildTreeNode(ymapnode, "BoxOccluders"); - if (boxesnode == null) return null; + if (boxesnode is null) + return null; for (int i = 0; i < boxesnode.Nodes.Count; i++) { TreeNode boxnode = boxesnode.Nodes[i]; - if (boxnode.Tag == box) return boxnode; + if (boxnode.Tag == box) + return boxnode; } return null; } - public TreeNode FindOccludeModelTreeNode(YmapOccludeModel model) + public TreeNode? FindOccludeModelTreeNode(YmapOccludeModel model) { - if (model == null) return null; - TreeNode ymapnode = FindYmapTreeNode(model.Ymap); - if (ymapnode == null) return null; + if (model is null) + return null; + var ymapnode = FindYmapTreeNode(model.Ymap); + if (ymapnode is null) + return null; var modelsnode = GetChildTreeNode(ymapnode, "OccludeModels"); - if (modelsnode == null) return null; + if (modelsnode is null) + return null; for (int i = 0; i < modelsnode.Nodes.Count; i++) { TreeNode modelnode = modelsnode.Nodes[i]; - if (modelnode.Tag == model) return modelnode; + if (modelnode.Tag == model) + return modelnode; } return null; } - public TreeNode FindOccludeModelTriangleTreeNode(YmapOccludeModelTriangle tri) + public TreeNode? FindOccludeModelTriangleTreeNode(YmapOccludeModelTriangle tri) { - if (tri == null) return null; - TreeNode ymapnode = FindYmapTreeNode(tri.Ymap); - if (ymapnode == null) return null; + if (tri is null) + return null; + var ymapnode = FindYmapTreeNode(tri.Ymap); + if (ymapnode is null) + return null; var modelsnode = GetChildTreeNode(ymapnode, "OccludeModels"); - if (modelsnode == null) return null; + if (modelsnode is null) + return null; for (int i = 0; i < modelsnode.Nodes.Count; i++) { TreeNode modelnode = modelsnode.Nodes[i]; - if (modelnode.Tag == tri.Model) return modelnode; + if (modelnode.Tag == tri.Model) + return modelnode; } return null; } - public TreeNode FindGrassTreeNode(YmapGrassInstanceBatch batch) + public TreeNode? FindGrassTreeNode(YmapGrassInstanceBatch batch) { - if (batch == null) return null; - TreeNode ymapnode = FindYmapTreeNode(batch.Ymap); - if (ymapnode == null) return null; + if (batch is null) + return null; + var ymapnode = FindYmapTreeNode(batch.Ymap); + if (ymapnode is null) + return null; var batchnode = GetChildTreeNode(ymapnode, "GrassBatches"); - if (batchnode == null) return null; + if (batchnode is null) + return null; for (int i = 0; i < batchnode.Nodes.Count; i++) { TreeNode grassnode = batchnode.Nodes[i]; - if (grassnode.Tag == batch) return grassnode; + if (grassnode.Tag == batch) + return grassnode; } return null; } - public TreeNode FindYtypTreeNode(YtypFile ytyp) + public TreeNode? FindYtypTreeNode(YtypFile ytyp) { - if (ProjectTreeView.Nodes.Count <= 0) return null; + if (ProjectTreeView.Nodes.Count <= 0) + return null; + var projnode = ProjectTreeView.Nodes[0]; var ytypsnode = GetChildTreeNode(projnode, "Ytyp"); - if (ytypsnode == null) return null; + if (ytypsnode is null) + return null; + for (int i = 0; i < ytypsnode.Nodes.Count; i++) { var ytypnode = ytypsnode.Nodes[i]; - if (ytypnode.Tag == ytyp) return ytypnode; + if (ytypnode.Tag == ytyp) + return ytypnode; } return null; } - public TreeNode FindArchetypeTreeNode(Archetype archetype) + public TreeNode? FindArchetypeTreeNode(Archetype archetype) { - if (archetype == null) return null; + if (archetype is null) + return null; + var ytypnode = FindYtypTreeNode(archetype.Ytyp); - if (ytypnode == null) return null; + if (ytypnode is null) + return null; + var archetypenode = GetChildTreeNode(ytypnode, "Archetypes"); - if (archetypenode == null) return null; + if (archetypenode is null) + return null; + for (int i = 0; i < archetypenode.Nodes.Count; i++) { var archnode = archetypenode.Nodes[i]; - if (archnode.Tag == archetype) return archnode; + if (archnode.Tag == archetype) + return archnode; } return null; } - public TreeNode FindMloRoomTreeNode(MCMloRoomDef room) + public TreeNode? FindMloRoomTreeNode(MCMloRoomDef room) { - if (room == null) return null; + if (room is null) + return null; var mloarchetypenode = FindArchetypeTreeNode(room.OwnerMlo); - if (mloarchetypenode != null) + if (mloarchetypenode is not null) { var roomsnode = GetChildTreeNode(mloarchetypenode, "Rooms"); - if (roomsnode == null) return null; + if (roomsnode is null) + return null; for (int j = 0; j < roomsnode.Nodes.Count; j++) { var roomnode = roomsnode.Nodes[j]; - if (roomnode.Tag == room) return roomnode; + if (roomnode.Tag == room) + return roomnode; } } return null; } - public TreeNode FindMloPortalTreeNode(MCMloPortalDef portal) + public TreeNode? FindMloPortalTreeNode(MCMloPortalDef? portal) { - if (portal == null) return null; + if (portal is null) + return null; var mloarchetypenode = FindArchetypeTreeNode(portal.OwnerMlo); - if (mloarchetypenode != null) + if (mloarchetypenode is not null) { var portalsnode = GetChildTreeNode(mloarchetypenode, "Portals"); - if (portalsnode == null) return null; + if (portalsnode is null) + return null; for (int j = 0; j < portalsnode.Nodes.Count; j++) { var portalnode = portalsnode.Nodes[j]; - if (portalnode.Tag == portal) return portalnode; + if (portalnode.Tag == portal) + return portalnode; } } return null; } - public TreeNode FindMloEntitySetTreeNode(MCMloEntitySet entset) + public TreeNode? FindMloEntitySetTreeNode(MCMloEntitySet? entset) { - if (entset == null) return null; + if (entset is null) + return null; var mloarchetypenode = FindArchetypeTreeNode(entset.OwnerMlo); - if (mloarchetypenode != null) + if (mloarchetypenode is not null) { var entsetsnode = GetChildTreeNode(mloarchetypenode, "EntitySets"); - if (entsetsnode == null) return null; + if (entsetsnode is null) + return null; for (int j = 0; j < entsetsnode.Nodes.Count; j++) { var entsetnode = entsetsnode.Nodes[j]; - if (entsetnode.Tag == entset) return entsetnode; + if (entsetnode.Tag == entset) + return entsetnode; } } return null; } - public TreeNode FindMloEntityTreeNode(MCEntityDef ent) + public TreeNode? FindMloEntityTreeNode(MCEntityDef? ent) { - var entityroom = ent?.OwnerMlo?.GetEntityRoom(ent); - if (entityroom != null) + if (ent is null) + return null; + + var entityroom = ent.OwnerMlo?.GetEntityRoom(ent); + if (entityroom is not null) { var roomnode = FindMloRoomTreeNode(entityroom); - if (roomnode != null) + if (roomnode is not null) { for (var k = 0; k < roomnode.Nodes.Count; k++) { var entitynode = roomnode.Nodes[k]; - if (entitynode.Tag == ent) return entitynode; + if (entitynode.Tag == ent) + return entitynode; } } } - var entityportal = ent?.OwnerMlo?.GetEntityPortal(ent); - if (entityportal != null) + var entityportal = ent.OwnerMlo?.GetEntityPortal(ent); + if (entityportal is not null) { var portalnode = FindMloPortalTreeNode(entityportal); - if (portalnode != null) + if (portalnode is not null) { for (var k = 0; k < portalnode.Nodes.Count; k++) { var entitynode = portalnode.Nodes[k]; - if (entitynode.Tag == ent) return entitynode; + if (entitynode.Tag == ent) + return entitynode; } } } - var entityset = ent?.OwnerMlo?.GetEntitySet(ent); - if (entityset != null) + var entityset = ent.OwnerMlo?.GetEntitySet(ent); + if (entityset is not null) { var setnode = FindMloEntitySetTreeNode(entityset); - if (setnode != null) + if (setnode is not null) { for (var k = 0; k < setnode.Nodes.Count; k++) { var entitynode = setnode.Nodes[k]; - if (entitynode.Tag == ent) return entitynode; + if (entitynode.Tag == ent) + return entitynode; } } } return null; } - public TreeNode FindYbnTreeNode(YbnFile ybn) + public TreeNode? FindYbnTreeNode(YbnFile ybn) { - if (ProjectTreeView.Nodes.Count <= 0) return null; + if (ProjectTreeView.Nodes.Count <= 0) + return null; var projnode = ProjectTreeView.Nodes[0]; var ybnsnode = GetChildTreeNode(projnode, "Ybn"); - if (ybnsnode == null) return null; + if (ybnsnode == null) + return null; for (int i = 0; i < ybnsnode.Nodes.Count; i++) { var ybnnode = ybnsnode.Nodes[i]; - if (ybnnode.Tag == ybn) return ybnnode; + if (ybnnode.Tag == ybn) + return ybnnode; } return null; } - public TreeNode FindCollisionBoundsTreeNode(Bounds b) + public TreeNode? FindCollisionBoundsTreeNode(Bounds b) { - if (b == null) return null; + if (b == null) + return null; var bnode = (b.Parent != null) ? FindCollisionBoundsTreeNode(b.Parent) : FindYbnTreeNode(b.GetRootYbn()); - if (bnode == null) return null; + if (bnode == null) + return null; for (int i = 0; i < bnode.Nodes.Count; i++) { var nnode = bnode.Nodes[i]; - if (nnode.Tag == b) return nnode; + if (nnode.Tag == b) + return nnode; } return null; } - public TreeNode FindCollisionPolyTreeNode(BoundPolygon p) + public TreeNode? FindCollisionPolyTreeNode(BoundPolygon p) { - if (p == null) return null; + if (p == null) + return null; var ybnnode = FindCollisionBoundsTreeNode(p.Owner); var polynode = GetChildTreeNode(ybnnode, "EditPoly"); - if (polynode == null) return null; + if (polynode == null) + return null; polynode.Tag = p; return polynode; } - public TreeNode FindCollisionVertexTreeNode(BoundVertex v) + public TreeNode? FindCollisionVertexTreeNode(BoundVertex v) { - if (v == null) return null; + if (v == null) + return null; var ybnnode = FindCollisionBoundsTreeNode(v.Owner); var vertnode = GetChildTreeNode(ybnnode, "EditVertex"); - if (vertnode == null) return null; + if (vertnode == null) + return null; vertnode.Tag = v; return vertnode; } - public TreeNode FindYndTreeNode(YndFile ynd) + public TreeNode? FindYndTreeNode(YndFile ynd) { - if (ProjectTreeView.Nodes.Count <= 0) return null; + if (ProjectTreeView.Nodes.Count <= 0) + return null; var projnode = ProjectTreeView.Nodes[0]; var yndsnode = GetChildTreeNode(projnode, "Ynd"); - if (yndsnode == null) return null; + if (yndsnode == null) + return null; for (int i = 0; i < yndsnode.Nodes.Count; i++) { var yndnode = yndsnode.Nodes[i]; - if (yndnode.Tag == ynd) return yndnode; + if (yndnode.Tag == ynd) + return yndnode; } return null; } - public TreeNode FindPathNodeTreeNode(YndNode n) + public TreeNode? FindPathNodeTreeNode(YndNode n) { - if (n == null) return null; - TreeNode yndnode = FindYndTreeNode(n.Ynd); + if (n == null) + return null; + var yndnode = FindYndTreeNode(n.Ynd); var nodesnode = GetChildTreeNode(yndnode, "Nodes"); - if (nodesnode == null) return null; + if (nodesnode == null) + return null; for (int i = 0; i < nodesnode.Nodes.Count; i++) { TreeNode nnode = nodesnode.Nodes[i]; - if (nnode.Tag == n) return nnode; + if (nnode.Tag == n) + return nnode; } return null; } - public TreeNode FindYnvTreeNode(YnvFile ynv) + public TreeNode? FindYnvTreeNode(YnvFile ynv) { - if (ProjectTreeView.Nodes.Count <= 0) return null; + if (ProjectTreeView.Nodes.Count <= 0) + return null; var projnode = ProjectTreeView.Nodes[0]; var ynvsnode = GetChildTreeNode(projnode, "Ynv"); - if (ynvsnode == null) return null; + if (ynvsnode == null) + return null; for (int i = 0; i < ynvsnode.Nodes.Count; i++) { var yndnode = ynvsnode.Nodes[i]; - if (yndnode.Tag == ynv) return yndnode; + if (yndnode.Tag == ynv) + return yndnode; } return null; } - public TreeNode FindNavPolyTreeNode(YnvPoly p) + public TreeNode? FindNavPolyTreeNode(YnvPoly p) { - if (p == null) return null; - TreeNode ynvnode = FindYnvTreeNode(p.Ynv); + if (p == null) + return null; + var ynvnode = FindYnvTreeNode(p.Ynv); var polynode = GetChildTreeNode(ynvnode, "EditPoly"); - if (polynode == null) return null; + if (polynode == null) + return null; polynode.Tag = p; return polynode; } - public TreeNode FindNavPointTreeNode(YnvPoint p) + public TreeNode? FindNavPointTreeNode(YnvPoint p) { - if (p == null) return null; - TreeNode ynvnode = FindYnvTreeNode(p.Ynv); + if (p == null) + return null; + var ynvnode = FindYnvTreeNode(p.Ynv); var pointnode = GetChildTreeNode(ynvnode, "EditPoint"); - if (pointnode == null) return null; + if (pointnode == null) + return null; pointnode.Tag = p; return pointnode; //for (int i = 0; i < pointsnode.Nodes.Count; i++) @@ -1411,12 +1615,14 @@ namespace CodeWalker.Project.Panels //} //return null; } - public TreeNode FindNavPortalTreeNode(YnvPortal p) + public TreeNode? FindNavPortalTreeNode(YnvPortal p) { - if (p == null) return null; - TreeNode ynvnode = FindYnvTreeNode(p.Ynv); + if (p == null) + return null; + var ynvnode = FindYnvTreeNode(p.Ynv); var portalnode = GetChildTreeNode(ynvnode, "EditPortal"); - if (portalnode == null) return null; + if (portalnode == null) + return null; portalnode.Tag = p; return portalnode; //for (int i = 0; i < portalsnode.Nodes.Count; i++) @@ -1426,7 +1632,7 @@ namespace CodeWalker.Project.Panels //} //return null; } - public TreeNode FindTrainTrackTreeNode(TrainTrack track) + public TreeNode? FindTrainTrackTreeNode(TrainTrack track) { if (ProjectTreeView.Nodes.Count <= 0) return null; var projnode = ProjectTreeView.Nodes[0]; @@ -1439,7 +1645,7 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindTrainNodeTreeNode(TrainTrackNode n) + public TreeNode? FindTrainNodeTreeNode(TrainTrackNode n) { if (n == null) return null; TreeNode tracknode = FindTrainTrackTreeNode(n.Track); @@ -1452,7 +1658,7 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindScenarioTreeNode(YmtFile ymt) + public TreeNode? FindScenarioTreeNode(YmtFile ymt) { if (ProjectTreeView.Nodes.Count <= 0) return null; var projnode = ProjectTreeView.Nodes[0]; @@ -1465,7 +1671,7 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindScenarioNodeTreeNode(ScenarioNode p) + public TreeNode? FindScenarioNodeTreeNode(ScenarioNode p) { if (p == null) return null; TreeNode ymtnode = FindScenarioTreeNode(p.Ymt); @@ -1478,7 +1684,7 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindAudioRelTreeNode(RelFile rel) + public TreeNode? FindAudioRelTreeNode(RelFile rel) { if (ProjectTreeView.Nodes.Count <= 0) return null; var projnode = ProjectTreeView.Nodes[0]; @@ -1491,7 +1697,7 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindAudioZoneTreeNode(AudioPlacement zone) + public TreeNode? FindAudioZoneTreeNode(AudioPlacement zone) { if (zone == null) return null; TreeNode relnode = FindAudioRelTreeNode(zone.RelFile); @@ -1505,7 +1711,7 @@ namespace CodeWalker.Project.Panels } return zonenode; } - public TreeNode FindAudioEmitterTreeNode(AudioPlacement emitter) + public TreeNode? FindAudioEmitterTreeNode(AudioPlacement emitter) { if (emitter == null) return null; TreeNode relnode = FindAudioRelTreeNode(emitter.RelFile); @@ -1519,7 +1725,7 @@ namespace CodeWalker.Project.Panels } return zonenode; } - public TreeNode FindAudioZoneListTreeNode(Dat151AmbientZoneList list) + public TreeNode? FindAudioZoneListTreeNode(Dat151AmbientZoneList list) { if (list == null) return null; TreeNode relnode = FindAudioRelTreeNode(list.Rel); @@ -1532,7 +1738,7 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindAudioEmitterListTreeNode(Dat151StaticEmitterList list) + public TreeNode? FindAudioEmitterListTreeNode(Dat151StaticEmitterList list) { if (list == null) return null; TreeNode relnode = FindAudioRelTreeNode(list.Rel); @@ -1545,7 +1751,7 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindAudioInteriorTreeNode(Dat151Interior interior) + public TreeNode? FindAudioInteriorTreeNode(Dat151Interior interior) { if (interior == null) return null; TreeNode relnode = FindAudioRelTreeNode(interior.Rel); @@ -1558,7 +1764,7 @@ namespace CodeWalker.Project.Panels } return null; } - public TreeNode FindAudioInteriorRoomTreeNode(Dat151InteriorRoom room) + public TreeNode? FindAudioInteriorRoomTreeNode(Dat151InteriorRoom room) { if (room == null) return null; TreeNode relnode = FindAudioRelTreeNode(room.Rel); @@ -1582,7 +1788,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectYmapTreeNode(YmapFile ymap) { - TreeNode ymapnode = FindYmapTreeNode(ymap); + var ymapnode = FindYmapTreeNode(ymap); if (ymapnode != null) { if (ProjectTreeView.SelectedNode == ymapnode) @@ -1597,7 +1803,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectEntityTreeNode(YmapEntityDef ent) { - TreeNode entnode = FindEntityTreeNode(ent); + var entnode = FindEntityTreeNode(ent); if (entnode != null) { if (ProjectTreeView.SelectedNode == entnode) @@ -1612,7 +1818,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectCarGenTreeNode(YmapCarGen cargen) { - TreeNode cargennode = FindCarGenTreeNode(cargen); + var cargennode = FindCarGenTreeNode(cargen); if (cargennode != null) { if (ProjectTreeView.SelectedNode == cargennode) @@ -1627,7 +1833,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectLodLightTreeNode(YmapLODLight lodlight) { - TreeNode lodlightnode = FindLodLightTreeNode(lodlight); + var lodlightnode = FindLodLightTreeNode(lodlight); if (lodlightnode != null) { if (ProjectTreeView.SelectedNode == lodlightnode) @@ -1642,7 +1848,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectBoxOccluderTreeNode(YmapBoxOccluder box) { - TreeNode boxnode = FindBoxOccluderTreeNode(box); + var boxnode = FindBoxOccluderTreeNode(box); if (boxnode != null) { if (ProjectTreeView.SelectedNode == boxnode) @@ -1657,7 +1863,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectOccludeModelTreeNode(YmapOccludeModel model) { - TreeNode modelnode = FindOccludeModelTreeNode(model); + var modelnode = FindOccludeModelTreeNode(model); if (modelnode != null) { if (ProjectTreeView.SelectedNode == modelnode) @@ -1672,7 +1878,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectOccludeModelTriangleTreeNode(YmapOccludeModelTriangle tri) { - TreeNode trinode = FindOccludeModelTriangleTreeNode(tri); + var trinode = FindOccludeModelTriangleTreeNode(tri); if (trinode != null) { if (ProjectTreeView.SelectedNode == trinode) @@ -1689,7 +1895,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectGrassBatchTreeNode(YmapGrassInstanceBatch grassBatch) { - TreeNode grassNode = FindGrassTreeNode(grassBatch); + var grassNode = FindGrassTreeNode(grassBatch); if (grassNode != null) { if (ProjectTreeView.SelectedNode == grassNode) @@ -1704,7 +1910,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectMloEntityTreeNode(MCEntityDef ent) { - TreeNode entnode = FindMloEntityTreeNode(ent); + var entnode = FindMloEntityTreeNode(ent); if (entnode != null) { if (ProjectTreeView.SelectedNode == entnode) @@ -1719,7 +1925,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectMloRoomTreeNode(MCMloRoomDef room) { - TreeNode roomnode = FindMloRoomTreeNode(room); + var roomnode = FindMloRoomTreeNode(room); if (roomnode != null) { if (ProjectTreeView.SelectedNode == roomnode) @@ -1734,7 +1940,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectMloPortalTreeNode(MCMloPortalDef portal) { - TreeNode portalnode = FindMloPortalTreeNode(portal); + var portalnode = FindMloPortalTreeNode(portal); if (portalnode != null) { if (ProjectTreeView.SelectedNode == portalnode) @@ -1749,7 +1955,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectMloEntitySetTreeNode(MCMloEntitySet set) { - TreeNode setnode = FindMloEntitySetTreeNode(set); + var setnode = FindMloEntitySetTreeNode(set); if (setnode != null) { if (ProjectTreeView.SelectedNode == setnode) @@ -1764,7 +1970,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectArchetypeTreeNode(Archetype archetype) { - TreeNode archetypenode = FindArchetypeTreeNode(archetype); + var archetypenode = FindArchetypeTreeNode(archetype); if (archetypenode != null) { if (ProjectTreeView.SelectedNode == archetypenode) @@ -1779,7 +1985,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectCollisionBoundsTreeNode(Bounds bounds) { - TreeNode tnode = FindCollisionBoundsTreeNode(bounds); + var tnode = FindCollisionBoundsTreeNode(bounds); if (tnode == null) { tnode = FindYbnTreeNode(bounds?.GetRootYbn()); @@ -1798,7 +2004,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectCollisionPolyTreeNode(BoundPolygon poly) { - TreeNode tnode = FindCollisionPolyTreeNode(poly); + var tnode = FindCollisionPolyTreeNode(poly); if (tnode == null) { tnode = FindCollisionBoundsTreeNode(poly?.Owner); @@ -1821,7 +2027,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectCollisionVertexTreeNode(BoundVertex vert) { - TreeNode tnode = FindCollisionVertexTreeNode(vert); + var tnode = FindCollisionVertexTreeNode(vert); if (tnode == null) { tnode = FindCollisionBoundsTreeNode(vert?.Owner); @@ -1844,7 +2050,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectPathNodeTreeNode(YndNode node) { - TreeNode tnode = FindPathNodeTreeNode(node); + var tnode = FindPathNodeTreeNode(node); if (tnode == null) { tnode = FindYndTreeNode(node?.Ynd); @@ -1863,7 +2069,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectNavPolyTreeNode(YnvPoly poly) { - TreeNode tnode = FindNavPolyTreeNode(poly); + var tnode = FindNavPolyTreeNode(poly); if (tnode == null) { tnode = FindYnvTreeNode(poly?.Ynv); @@ -1882,7 +2088,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectNavPointTreeNode(YnvPoint point) { - TreeNode tnode = FindNavPointTreeNode(point); + var tnode = FindNavPointTreeNode(point); if (tnode == null) { tnode = FindYnvTreeNode(point?.Ynv); @@ -1901,7 +2107,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectNavPortalTreeNode(YnvPortal portal) { - TreeNode tnode = FindNavPortalTreeNode(portal); + var tnode = FindNavPortalTreeNode(portal); if (tnode == null) { tnode = FindYnvTreeNode(portal?.Ynv); @@ -1920,7 +2126,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectTrainNodeTreeNode(TrainTrackNode node) { - TreeNode tnode = FindTrainNodeTreeNode(node); + var tnode = FindTrainNodeTreeNode(node); if (tnode == null) { tnode = FindTrainTrackTreeNode(node?.Track); @@ -1939,7 +2145,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectScenarioTreeNode(YmtFile scenario) { - TreeNode tnode = FindScenarioTreeNode(scenario); + var tnode = FindScenarioTreeNode(scenario); if (tnode != null) { if (ProjectTreeView.SelectedNode == tnode) @@ -1954,7 +2160,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectScenarioNodeTreeNode(ScenarioNode node) { - TreeNode tnode = FindScenarioNodeTreeNode(node); + var tnode = FindScenarioNodeTreeNode(node); if (tnode == null) { tnode = FindScenarioTreeNode(node?.Ymt); @@ -1973,7 +2179,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectAudioRelTreeNode(RelFile rel) { - TreeNode tnode = FindAudioRelTreeNode(rel); + var tnode = FindAudioRelTreeNode(rel); if (tnode != null) { if (ProjectTreeView.SelectedNode == tnode) @@ -1988,7 +2194,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectAudioZoneTreeNode(AudioPlacement zone) { - TreeNode tnode = FindAudioZoneTreeNode(zone); + var tnode = FindAudioZoneTreeNode(zone); if (tnode == null) { tnode = FindAudioRelTreeNode(zone?.RelFile); @@ -2007,7 +2213,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectAudioEmitterTreeNode(AudioPlacement emitter) { - TreeNode tnode = FindAudioEmitterTreeNode(emitter); + var tnode = FindAudioEmitterTreeNode(emitter); if (tnode == null) { tnode = FindAudioRelTreeNode(emitter?.RelFile); @@ -2026,7 +2232,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectAudioZoneListTreeNode(Dat151AmbientZoneList list) { - TreeNode tnode = FindAudioZoneListTreeNode(list); + var tnode = FindAudioZoneListTreeNode(list); if (tnode == null) { tnode = FindAudioRelTreeNode(list?.Rel); @@ -2045,7 +2251,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectAudioEmitterListTreeNode(Dat151StaticEmitterList list) { - TreeNode tnode = FindAudioEmitterListTreeNode(list); + var tnode = FindAudioEmitterListTreeNode(list); if (tnode == null) { tnode = FindAudioRelTreeNode(list?.Rel); @@ -2064,7 +2270,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectAudioInteriorTreeNode(Dat151Interior interior) { - TreeNode tnode = FindAudioInteriorTreeNode(interior); + var tnode = FindAudioInteriorTreeNode(interior); if (tnode == null) { tnode = FindAudioRelTreeNode(interior?.Rel); @@ -2083,7 +2289,7 @@ namespace CodeWalker.Project.Panels } public void TrySelectAudioInteriorRoomTreeNode(Dat151InteriorRoom room) { - TreeNode tnode = FindAudioInteriorRoomTreeNode(room); + var tnode = FindAudioInteriorRoomTreeNode(room); if (tnode == null) { tnode = FindAudioRelTreeNode(room?.Rel); @@ -2104,11 +2310,12 @@ namespace CodeWalker.Project.Panels - public void UpdateYmapTreeNode(YmapFile ymap) + public async ValueTask UpdateYmapTreeNode(YmapFile ymap) { var tn = FindYmapTreeNode(ymap); if (tn != null) { + await this.SwitchToUi(); tn.Text = ymap.RpfFileEntry?.Name ?? ymap.Name; } } @@ -2117,7 +2324,10 @@ namespace CodeWalker.Project.Panels var tn = FindYtypTreeNode(ytyp); if (tn != null) { - tn.Text = ytyp.RpfFileEntry?.Name ?? ytyp.Name; + this.InvokeIfRequired(() => + { + tn.Text = ytyp.RpfFileEntry?.Name ?? ytyp.Name; + }); } } public void UpdateYbnTreeNode(YbnFile ybn) @@ -2125,7 +2335,10 @@ namespace CodeWalker.Project.Panels var tn = FindYbnTreeNode(ybn); if (tn != null) { - tn.Text = ybn.RpfFileEntry?.Name ?? ybn.Name; + this.InvokeIfRequired(() => + { + tn.Text = ybn.RpfFileEntry?.Name ?? ybn.Name; + }); } } public void UpdateYndTreeNode(YndFile ynd) @@ -2133,66 +2346,65 @@ namespace CodeWalker.Project.Panels var tn = FindYndTreeNode(ynd); if (tn != null) { - tn.Text = ynd.RpfFileEntry?.Name ?? ynd.Name; + this.InvokeIfRequired(() => + { + tn.Text = ynd.RpfFileEntry?.Name ?? ynd.Name; + }); } } - public void UpdateYnvTreeNode(YnvFile ynv) + public async ValueTask UpdateYnvTreeNode(YnvFile ynv) { var tn = FindYnvTreeNode(ynv); if (tn != null) { + await this.SwitchToUi(); tn.Text = ynv.RpfFileEntry?.Name ?? ynv.Name; } } - public void UpdateTrainTrackTreeNode(TrainTrack track) + public async ValueTask UpdateTrainTrackTreeNode(TrainTrack track) { var tn = FindTrainTrackTreeNode(track); if (tn != null) { + await this.SwitchToUi(); tn.Text = track.RpfFileEntry?.Name ?? track.Name; } } - public void UpdateScenarioTreeNode(YmtFile scenarios) + public async ValueTask UpdateScenarioTreeNode(YmtFile scenarios) { var tn = FindScenarioTreeNode(scenarios); if (tn != null) { + await this.SwitchToUi(); tn.Text = scenarios.RpfFileEntry?.Name ?? scenarios.Name; } } - public void UpdateAudioRelTreeNode(RelFile rel) + public async ValueTask UpdateAudioRelTreeNode(RelFile rel) { var tn = FindAudioRelTreeNode(rel); if (tn != null) { + await this.SwitchToUi(); tn.Text = rel.RpfFileEntry?.Name ?? rel.Name; } } - public void UpdateArchetypeTreeNode(Archetype archetype) + public async ValueTask UpdateArchetypeTreeNode(Archetype archetype) { var tn = FindArchetypeTreeNode(archetype); if (tn != null) { + await this.SwitchToUi(); tn.Text = archetype._BaseArchetypeDef.ToString(); } } public void UpdateEntityTreeNode(YmapEntityDef ent) { - if (ent == null) return; - var tn = FindEntityTreeNode(ent); - var name = ent.CEntityDef.archetypeName.ToString(); - if (tn != null) + if (ent == null) + return; + this.InvokeIfRequired(() => { - if (ProjectForm.displayentityindexes) - tn.Text = $"[{tn.Index}] {name}"; - else - tn.Text = name; - } - else - { - var instance = ent.MloParent?.MloInstance; - var mcent = instance?.TryGetArchetypeEntity(ent); - tn = FindMloEntityTreeNode(mcent); + var tn = FindEntityTreeNode(ent); + var name = ent.CEntityDef.archetypeName.ToString(); if (tn != null) { if (ProjectForm.displayentityindexes) @@ -2200,77 +2412,111 @@ namespace CodeWalker.Project.Panels else tn.Text = name; } - } + else + { + var instance = ent.MloParent?.MloInstance; + var mcent = instance?.TryGetArchetypeEntity(ent); + tn = FindMloEntityTreeNode(mcent); + if (tn != null) + { + if (ProjectForm.displayentityindexes) + tn.Text = $"[{tn.Index}] {name}"; + else + tn.Text = name; + } + } + }); } + + public void UpdateTreeNodeText(TreeNode node, string text) + { + if (InvokeRequired) + { + BeginInvoke(UpdateTreeNodeText, node, text); + return; + } + + node.Text = text; + } + public void UpdateCarGenTreeNode(YmapCarGen cargen) { var tn = FindCarGenTreeNode(cargen); - if (tn != null) + if (tn is not null) { - tn.Text = cargen.ToString(); + UpdateTreeNodeText(tn, cargen.ToString()); } } + public void UpdateLodLightTreeNode(YmapLODLight lodlight) { var tn = FindLodLightTreeNode(lodlight); - if (tn != null) + if (tn is not null) { - tn.Text = lodlight.ToString(); + UpdateTreeNodeText(tn, lodlight.ToString()); } } + public void UpdateBoxOccluderTreeNode(YmapBoxOccluder box) { var tn = FindBoxOccluderTreeNode(box); - if (tn != null) + if (tn is not null) { - tn.Text = box.ToString(); + UpdateTreeNodeText(tn, box.ToString()); } } + public void UpdateOccludeModelTreeNode(YmapOccludeModel model) { var tn = FindOccludeModelTreeNode(model); - if (tn != null) + if (tn is not null) { - tn.Text = model.ToString(); + UpdateTreeNodeText(tn, model.ToString()); } } + public void UpdatePathNodeTreeNode(YndNode node) { var tn = FindPathNodeTreeNode(node); - if (tn != null) + if (tn is not null) { - tn.Text = node._RawData.ToString(); + this.InvokeIfRequired(() => + { + tn.Text = node._RawData.ToString(); + }); } } + public void UpdateNavPolyTreeNode(YnvPoly poly) { var tn = FindNavPolyTreeNode(poly); - if (tn != null) + if (tn is not null) { } } + public void UpdateTrainNodeTreeNode(TrainTrackNode node) { var tn = FindTrainNodeTreeNode(node); - if (tn != null) + if (tn is not null) { - tn.Text = node.ToString(); + UpdateTreeNodeText(tn, node.ToString()); } } public void UpdateScenarioNodeTreeNode(ScenarioNode node) { var tn = FindScenarioNodeTreeNode(node); - if (tn != null) + if (tn is not null) { - tn.Text = node.MedTypeName + ": " + node.StringText; + UpdateTreeNodeText(tn, $"{node.MedTypeName}: {node.StringText}"); } } public void UpdateAudioZoneTreeNode(AudioPlacement zone) { var tn = FindAudioZoneTreeNode(zone); - if (tn != null) + if (tn is not null) { - tn.Text = zone.NameHash.ToString(); + UpdateTreeNodeText(tn, zone.NameHash.ToString()); } } public void UpdateAudioEmitterTreeNode(AudioPlacement emitter) @@ -2278,7 +2524,7 @@ namespace CodeWalker.Project.Panels var tn = FindAudioEmitterTreeNode(emitter); if (tn != null) { - tn.Text = emitter.NameHash.ToString(); + UpdateTreeNodeText(tn, emitter.NameHash.ToString()); } } public void UpdateAudioZoneListTreeNode(Dat151AmbientZoneList list) @@ -2286,7 +2532,7 @@ namespace CodeWalker.Project.Panels var tn = FindAudioZoneListTreeNode(list); if (tn != null) { - tn.Text = list.NameHash.ToString(); + UpdateTreeNodeText(tn, list.NameHash.ToString()); } } public void UpdateAudioEmitterListTreeNode(Dat151StaticEmitterList list) @@ -2294,7 +2540,7 @@ namespace CodeWalker.Project.Panels var tn = FindAudioEmitterListTreeNode(list); if (tn != null) { - tn.Text = list.NameHash.ToString(); + UpdateTreeNodeText(tn, list.NameHash.ToString()); } } public void UpdateAudioInteriorTreeNode(Dat151Interior interior) @@ -2302,7 +2548,7 @@ namespace CodeWalker.Project.Panels var tn = FindAudioInteriorTreeNode(interior); if (tn != null) { - tn.Text = interior.NameHash.ToString(); + UpdateTreeNodeText(tn, interior.NameHash.ToString()); } } public void UpdateAudioInteriorRoomTreeNode(Dat151InteriorRoom room) @@ -2310,81 +2556,91 @@ namespace CodeWalker.Project.Panels var tn = FindAudioInteriorRoomTreeNode(room); if (tn != null) { - tn.Text = room.NameHash.ToString(); + UpdateTreeNodeText(tn, room.NameHash.ToString()); } } - - public void RemoveEntityTreeNode(YmapEntityDef ent) { var tn = FindEntityTreeNode(ent); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { - tn.Parent.Text = "Entities (" + ent.Ymap.AllEntities.Length.ToString() + ")"; - tn.Parent.Nodes.Remove(tn); + this.InvokeIfRequired(() => + { + tn.Parent.Text = $"Entities ({ent.Ymap.AllEntities.Length})"; + tn.Parent.Nodes.Remove(tn); + }); } } public void RemoveCarGenTreeNode(YmapCarGen cargen) { var tn = FindCarGenTreeNode(cargen); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent != null) { - tn.Parent.Text = "Car Generators (" + cargen.Ymap.CarGenerators.Length.ToString() + ")"; - tn.Parent.Nodes.Remove(tn); + this.InvokeIfRequired(() => + { + tn.Parent.Text = $"Car Generators ({cargen.Ymap.CarGenerators.Length})"; + tn.Parent.Nodes.Remove(tn); + }); } } public void RemoveLodLightTreeNode(YmapLODLight lodlight) { var lodlights = lodlight?.LodLights?.LodLights; var tn = FindLodLightTreeNode(lodlight); - if ((tn != null) && (tn.Parent != null) && (lodlights != null)) + if (tn?.Parent != null && lodlights is not null && lodlights.Length > 0) { - var pn = tn.Parent; - var yn = pn.Parent; - yn.Nodes.Remove(pn); - pn = yn.Nodes.Add("LOD Lights (" + (lodlights?.Length.ToString() ?? "0") + ")"); - pn.Name = "LodLights"; - pn.Tag = lodlight.LodLights.Ymap; - foreach (var ll in lodlights) + this.InvokeIfRequired(() => { - var ntn = pn.Nodes.Add(ll.ToString()); - ntn.Tag = ll; - } + var pn = tn.Parent; + var yn = pn.Parent; + yn.Nodes.Remove(pn); + pn = yn.Nodes.Add($"LOD Lights ({lodlights.Length})"); + pn.Name = "LodLights"; + pn.Tag = lodlight.LodLights.Ymap; + foreach (var ll in lodlights) + { + var ntn = pn.Nodes.Add(ll.ToString()); + ntn.Tag = ll; + } + }); } } public void RemoveBoxOccluderTreeNode(YmapBoxOccluder box) { var ymap = box?.Ymap; var tn = FindBoxOccluderTreeNode(box); - if ((tn != null) && (tn.Parent != null) && (box != null)) + if (tn?.Parent != null && box != null) { - var pn = tn.Parent; - var yn = pn.Parent; - yn.Nodes.Remove(pn); - pn = yn.Nodes.Add("Box Occluders (" + (ymap?.BoxOccluders?.Length.ToString() ?? "0") + ")"); - pn.Name = "BoxOccluders"; - pn.Tag = ymap; - if (ymap.BoxOccluders != null) + this.InvokeIfRequired(() => { - foreach (var b in ymap.BoxOccluders) + var pn = tn.Parent; + var yn = pn.Parent; + yn.Nodes.Remove(pn); + pn = yn.Nodes.Add($"Box Occluders ({ymap?.BoxOccluders?.Length ?? 0})"); + pn.Name = "BoxOccluders"; + pn.Tag = ymap; + if (ymap.BoxOccluders != null) { - var ntn = pn.Nodes.Add(b.ToString()); - ntn.Tag = b; + foreach (var b in ymap.BoxOccluders) + { + var ntn = pn.Nodes.Add(b.ToString()); + ntn.Tag = b; + } } - } + }); } } public void RemoveOccludeModelTreeNode(YmapOccludeModel model) { - var ymap = model?.Ymap; + var ymap = model.Ymap; var tn = FindOccludeModelTreeNode(model); - if ((tn != null) && (tn.Parent != null) && (model != null)) + if (tn?.Parent is not null && model is not null) { var pn = tn.Parent; var yn = pn.Parent; yn.Nodes.Remove(pn); - pn = yn.Nodes.Add("Occlude Models (" + (ymap?.OccludeModels?.Length.ToString() ?? "0") + ")"); + pn = yn.Nodes.Add($"Occlude Models ({ymap?.OccludeModels?.Length ?? 0})"); pn.Name = "OccludeModels"; pn.Tag = ymap; if (ymap.OccludeModels != null) @@ -2400,27 +2656,36 @@ namespace CodeWalker.Project.Panels public void RemoveGrassBatchTreeNode(YmapGrassInstanceBatch batch) { var tn = FindGrassTreeNode(batch); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { - tn.Parent.Text = "Grass Batches (" + batch.Ymap.GrassInstanceBatches.Length.ToString() + ")"; - tn.Parent.Nodes.Remove(tn); + this.InvokeIfRequired(() => + { + tn.Parent.Text = $"Grass Batches ({batch.Ymap.GrassInstanceBatches.Length})"; + tn.Parent.Nodes.Remove(tn); + }); } } public void RemoveArchetypeTreeNode(Archetype archetype) { var tn = FindArchetypeTreeNode(archetype); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { - tn.Parent.Text = "Archetypes (" + archetype.Ytyp.AllArchetypes.Length.ToString() + ")"; - tn.Parent.Nodes.Remove(tn); + this.InvokeIfRequired(() => + { + tn.Parent.Text = $"Archetypes ({archetype.Ytyp.AllArchetypes.Length})"; + tn.Parent.Nodes.Remove(tn); + }); } } public void RemoveMloEntityTreeNode(MCEntityDef ent) { var tn = FindMloEntityTreeNode(ent); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { - tn.Parent.Nodes.Remove(tn); + this.InvokeIfRequired(() => + { + tn.Parent.Nodes.Remove(tn); + }); } } public void RemoveMloRoomTreeNode(MCMloRoomDef room) @@ -2428,7 +2693,7 @@ namespace CodeWalker.Project.Panels var tn = FindMloRoomTreeNode(room); if ((tn != null) && (tn.Parent != null)) { - tn.Parent.Text = "Rooms (" + (room.OwnerMlo?.rooms?.Length.ToString() ?? "0") + ")"; + tn.Parent.Text = $"Rooms ({room.OwnerMlo?.rooms?.Length ?? 0})"; tn.Parent.Nodes.Remove(tn); } } @@ -2437,23 +2702,23 @@ namespace CodeWalker.Project.Panels var tn = FindMloPortalTreeNode(portal); if ((tn != null) && (tn.Parent != null)) { - tn.Parent.Text = "Portals (" + (portal.OwnerMlo?.portals?.Length.ToString() ?? "0") + ")"; + tn.Parent.Text = $"Portals ({portal.OwnerMlo?.portals?.Length ?? 0})"; tn.Parent.Nodes.Remove(tn); } } public void RemoveMloEntitySetTreeNode(MCMloEntitySet set) { var tn = FindMloEntitySetTreeNode(set); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { - tn.Parent.Text = "Entity Sets (" + (set.OwnerMlo?.entitySets?.Length.ToString() ?? "0") + ")"; + tn.Parent.Text = $"Entity Sets ({set.OwnerMlo?.entitySets?.Length ?? 0})"; tn.Parent.Nodes.Remove(tn); } } public void RemoveCollisionBoundsTreeNode(Bounds bounds) { var tn = FindCollisionBoundsTreeNode(bounds); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { tn.Parent.Nodes.Remove(tn); } @@ -2461,27 +2726,27 @@ namespace CodeWalker.Project.Panels public void RemovePathNodeTreeNode(YndNode node) { var tn = FindPathNodeTreeNode(node); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { - tn.Parent.Text = "Nodes (" + node.Ynd.Nodes.Length.ToString() + ")"; + tn.Parent.Text = $"Nodes ({node.Ynd.Nodes.Length})"; tn.Parent.Nodes.Remove(tn); } } public void RemoveTrainNodeTreeNode(TrainTrackNode node) { var tn = FindTrainNodeTreeNode(node); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { - tn.Parent.Text = "Nodes (" + node.Track.Nodes.Count.ToString() + ")"; + tn.Parent.Text = $"Nodes ({node.Track?.Nodes.Count ?? 0})"; tn.Parent.Nodes.Remove(tn); } } public void RemoveScenarioNodeTreeNode(ScenarioNode node) { var tn = FindScenarioNodeTreeNode(node); - if ((tn != null) && (tn.Parent != null)) + if (tn?.Parent is not null) { - tn.Parent.Text = "Points (" + (node.Ymt?.ScenarioRegion?.Nodes?.Count ?? 0).ToString() + ")"; + tn.Parent.Text = $"Points ({node.Ymt?.ScenarioRegion?.Nodes?.Count ?? 0})"; tn.Parent.Nodes.Remove(tn); } } @@ -2499,7 +2764,7 @@ namespace CodeWalker.Project.Panels } } - tn.Parent.Text = "Ambient Zones (" + zones.Count.ToString() + ")"; + tn.Parent.Text = $"Ambient Zones ({zones.Count})"; tn.Parent.Nodes.Remove(tn); } } @@ -2517,7 +2782,7 @@ namespace CodeWalker.Project.Panels } } - tn.Parent.Text = "Ambient Emitters (" + emitters.Count.ToString() + ")"; + tn.Parent.Text = $"Ambient Emitters ({emitters.Count})"; tn.Parent.Nodes.Remove(tn); } } @@ -2535,7 +2800,7 @@ namespace CodeWalker.Project.Panels } } - tn.Parent.Text = "Ambient Zone Lists (" + zonelists.Count.ToString() + ")"; + tn.Parent.Text = $"Ambient Zone Lists ({zonelists.Count})"; tn.Parent.Nodes.Remove(tn); } } @@ -2553,7 +2818,7 @@ namespace CodeWalker.Project.Panels } } - tn.Parent.Text = "Ambient Emitter Lists (" + emitterlists.Count.ToString() + ")"; + tn.Parent.Text = $"Ambient Emitter Lists ({emitterlists.Count})"; tn.Parent.Nodes.Remove(tn); } } @@ -2571,7 +2836,7 @@ namespace CodeWalker.Project.Panels } } - tn.Parent.Text = "Interiors (" + interiors.Count.ToString() + ")"; + tn.Parent.Text = $"Interiors ({interiors.Count})"; tn.Parent.Nodes.Remove(tn); } } @@ -2589,7 +2854,7 @@ namespace CodeWalker.Project.Panels } } - tn.Parent.Text = "Interior Rooms (" + interiors.Count.ToString() + ")"; + tn.Parent.Text = $"Interior Rooms ({interiors.Count})"; tn.Parent.Nodes.Remove(tn); } } @@ -2715,10 +2980,10 @@ namespace CodeWalker.Project.Panels e.Effect = DragDropEffects.All; } - private void ProjectTreeView_DragDrop(object sender, DragEventArgs e) + private async void ProjectTreeView_DragDrop(object sender, DragEventArgs e) { string[] files = (string[]) e.Data.GetData(DataFormats.FileDrop); - ProjectForm.OpenFiles(files); + await ProjectForm.OpenFiles(files); } diff --git a/CodeWalker/Project/ProjectFile.cs b/CodeWalker/Project/ProjectFile.cs index 8f40fb7..bfda9c3 100644 --- a/CodeWalker/Project/ProjectFile.cs +++ b/CodeWalker/Project/ProjectFile.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Xml; @@ -15,36 +16,36 @@ namespace CodeWalker.Project //fields stored in file public string Name { get; set; } //friendly name for this project public int Version { get; set; } - public List YmapFilenames { get; set; } = new List(); - public List YtypFilenames { get; set; } = new List(); - public List YbnFilenames { get; set; } = new List(); - public List YndFilenames { get; set; } = new List(); - public List YnvFilenames { get; set; } = new List(); - public List TrainsFilenames { get; set; } = new List(); - public List ScenarioFilenames { get; set; } = new List(); - public List AudioRelFilenames { get; set; } = new List(); - public List YdrFilenames { get; set; } = new List(); - public List YddFilenames { get; set; } = new List(); - public List YftFilenames { get; set; } = new List(); - public List YtdFilenames { get; set; } = new List(); + public HashSet YmapFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet YtypFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet YbnFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet YndFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet YnvFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet TrainsFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet ScenarioFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet AudioRelFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet YdrFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet YddFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet YftFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + public HashSet YtdFilenames { get; set; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); //fields not stored public string Filename { get; set; } //filename without path public string Filepath { get; set; } //full path of the current file public bool HasChanged { get; set; } //flag for use by the UI - public List YmapFiles { get; set; } = new List(); - public List YtypFiles { get; set; } = new List(); - public List YbnFiles { get; set; } = new List(); - public List YndFiles { get; set; } = new List(); - public List YnvFiles { get; set; } = new List(); - public List TrainsFiles { get; set; } = new List(); - public List ScenarioFiles { get; set; } = new List(); - public List AudioRelFiles { get; set; } = new List(); - public List YdrFiles { get; set; } = new List(); - public List YddFiles { get; set; } = new List(); - public List YftFiles { get; set; } = new List(); - public List YtdFiles { get; set; } = new List(); + public List YmapFiles { get; } = new List(); + public List YtypFiles { get; } = new List(); + public List YbnFiles { get; } = new List(); + public List YndFiles { get; } = new List(); + public List YnvFiles { get; } = new List(); + public List TrainsFiles { get; } = new List(); + public List ScenarioFiles { get; } = new List(); + public List AudioRelFiles { get; } = new List(); + public List YdrFiles { get; } = new List(); + public List YddFiles { get; } = new List(); + public List YftFiles { get; } = new List(); + public List YtdFiles { get; } = new List(); @@ -149,12 +150,12 @@ namespace CodeWalker.Project YmapFilenames.Clear(); YmapFiles.Clear(); var ymapselem = Xml.GetChild(projelem, "YmapFilenames"); - if (ymapselem != null) + var ymapItems = ymapselem?.SelectNodes("Item"); + if (ymapItems is not null) { - foreach (var node in ymapselem.SelectNodes("Item")) + foreach (var node in ymapItems) { - XmlElement ymapel = node as XmlElement; - if (ymapel != null) + if (node is XmlElement ymapel) { AddYmapFile(ymapel.InnerText); } @@ -164,13 +165,13 @@ namespace CodeWalker.Project YtypFilenames.Clear(); YtypFiles.Clear(); - var ytypselem = Xml.GetChild(projelem, "YtypFilenames"); - if (ytypselem != null) + var ytypItems = Xml.GetChild(projelem, "YtypFilenames") + ?.SelectNodes("Item"); + if (ytypItems is not null) { - foreach (var node in ytypselem.SelectNodes("Item")) + foreach (var node in ytypItems) { - XmlElement ytypel = node as XmlElement; - if (ytypel != null) + if (node is XmlElement ytypel) { AddYtypFile(ytypel.InnerText); } @@ -180,13 +181,15 @@ namespace CodeWalker.Project YbnFilenames.Clear(); YbnFiles.Clear(); - var ybnselem = Xml.GetChild(projelem, "YbnFilenames"); - if (ybnselem != null) + + var ybnItems = Xml.GetChild(projelem, "YbnFilenames") + ?.SelectNodes("Item"); + + if (ybnItems is not null) { - foreach (var node in ybnselem.SelectNodes("Item")) + foreach (var node in ybnItems) { - XmlElement ybnel = node as XmlElement; - if (ybnel != null) + if (node is XmlElement ybnel) { AddYbnFile(ybnel.InnerText); } @@ -196,13 +199,14 @@ namespace CodeWalker.Project YndFilenames.Clear(); YndFiles.Clear(); - var yndselem = Xml.GetChild(projelem, "YndFilenames"); - if (yndselem != null) + var yndItems = Xml.GetChild(projelem, "YndFilenames") + ?.SelectNodes("Item"); + + if (yndItems is not null) { - foreach (var node in yndselem.SelectNodes("Item")) + foreach (var node in yndItems) { - XmlElement yndel = node as XmlElement; - if (yndel != null) + if (node is XmlElement yndel) { AddYndFile(yndel.InnerText); } @@ -213,13 +217,13 @@ namespace CodeWalker.Project YnvFilenames.Clear(); YnvFiles.Clear(); - var ynvselem = Xml.GetChild(projelem, "YnvFilenames"); - if (ynvselem != null) + var ynvItems = Xml.GetChild(projelem, "YnvFilenames") + ?.SelectNodes("Item"); + if (ynvItems is not null) { - foreach (var node in ynvselem.SelectNodes("Item")) + foreach (var node in ynvItems) { - XmlElement ynvel = node as XmlElement; - if (ynvel != null) + if (node is XmlElement ynvel) { AddYnvFile(ynvel.InnerText); } @@ -229,13 +233,13 @@ namespace CodeWalker.Project TrainsFilenames.Clear(); TrainsFiles.Clear(); - var trainsselem = Xml.GetChild(projelem, "TrainsFilenames"); - if (trainsselem != null) + var trainItems = Xml.GetChild(projelem, "TrainsFilenames") + ?.SelectNodes("Item"); + if (trainItems is not null) { - foreach (var node in trainsselem.SelectNodes("Item")) + foreach (var node in trainItems) { - XmlElement trainel = node as XmlElement; - if (trainel != null) + if (node is XmlElement trainel) { AddTrainsFile(trainel.InnerText); } @@ -246,13 +250,13 @@ namespace CodeWalker.Project ScenarioFilenames.Clear(); ScenarioFiles.Clear(); - var scenarioselem = Xml.GetChild(projelem, "ScenarioFilenames"); - if (scenarioselem != null) + var scenarioItems = Xml.GetChild(projelem, "ScenarioFilenames") + ?.SelectNodes("Item"); + if (scenarioItems is not null) { - foreach (var node in scenarioselem.SelectNodes("Item")) + foreach (var node in scenarioItems) { - XmlElement scenarioel = node as XmlElement; - if (scenarioel != null) + if (node is XmlElement scenarioel) { AddScenarioFile(scenarioel.InnerText); } @@ -263,13 +267,13 @@ namespace CodeWalker.Project AudioRelFilenames.Clear(); AudioRelFiles.Clear(); - var audiorelselem = Xml.GetChild(projelem, "AudioRelFilenames"); - if (audiorelselem != null) + var audiorelItems = Xml.GetChild(projelem, "AudioRelFilenames") + ?.SelectNodes("Item"); + if (audiorelItems is not null) { - foreach (var node in audiorelselem.SelectNodes("Item")) + foreach (var node in audiorelItems) { - XmlElement audiorelel = node as XmlElement; - if (audiorelel != null) + if (node is XmlElement audiorelel) { AddAudioRelFile(audiorelel.InnerText); } @@ -279,13 +283,13 @@ namespace CodeWalker.Project YdrFilenames.Clear(); YdrFiles.Clear(); - var ydrselem = Xml.GetChild(projelem, "YdrFilenames"); - if (ydrselem != null) + var ydrItems = Xml.GetChild(projelem, "YdrFilenames") + ?.SelectNodes("Item"); + if (ydrItems is not null) { - foreach (var node in ydrselem.SelectNodes("Item")) + foreach (var node in ydrItems) { - XmlElement ydrel = node as XmlElement; - if (ydrel != null) + if (node is XmlElement ydrel) { AddYdrFile(ydrel.InnerText); } @@ -295,13 +299,13 @@ namespace CodeWalker.Project YddFilenames.Clear(); YddFiles.Clear(); - var yddselem = Xml.GetChild(projelem, "YddFilenames"); - if (yddselem != null) + var yddItems = Xml.GetChild(projelem, "YddFilenames") + ?.SelectNodes("Item"); + if (yddItems is not null) { - foreach (var node in yddselem.SelectNodes("Item")) + foreach (var node in yddItems) { - XmlElement yddel = node as XmlElement; - if (yddel != null) + if (node is XmlElement yddel) { AddYddFile(yddel.InnerText); } @@ -311,13 +315,13 @@ namespace CodeWalker.Project YftFilenames.Clear(); YftFiles.Clear(); - var yftselem = Xml.GetChild(projelem, "YftFilenames"); - if (yftselem != null) + var yftItems = Xml.GetChild(projelem, "YftFilenames") + ?.SelectNodes("Item"); + if (yftItems is not null) { - foreach (var node in yftselem.SelectNodes("Item")) + foreach (var node in yftItems) { - XmlElement yftel = node as XmlElement; - if (yftel != null) + if (node is XmlElement yftel) { AddYftFile(yftel.InnerText); } @@ -327,84 +331,83 @@ namespace CodeWalker.Project YtdFilenames.Clear(); YtdFiles.Clear(); - var ytdselem = Xml.GetChild(projelem, "YtdFilenames"); - if (ytdselem != null) + var ytdItems = Xml.GetChild(projelem, "YtdFilenames") + ?.SelectNodes("Item"); + if (ytdItems is not null) { - foreach (var node in ytdselem.SelectNodes("Item")) + foreach (var node in ytdItems) { - XmlElement ytdel = node as XmlElement; - if (ytdel != null) + if (node is XmlElement ytdel) { AddYtdFile(ytdel.InnerText); } } } - } public void UpdateFilenames(string oldprojpath) { - for (int i = 0; i < YmapFilenames.Count; i++) - { - YmapFilenames[i] = GetUpdatedFilePath(YmapFilenames[i], oldprojpath); - } - for (int i = 0; i < YtypFilenames.Count; i++) - { - YtypFilenames[i] = GetUpdatedFilePath(YtypFilenames[i], oldprojpath); - } - for (int i = 0; i < YbnFilenames.Count; i++) - { - YbnFilenames[i] = GetUpdatedFilePath(YbnFilenames[i], oldprojpath); - } - for (int i = 0; i < YndFilenames.Count; i++) - { - YndFilenames[i] = GetUpdatedFilePath(YndFilenames[i], oldprojpath); - } - for (int i = 0; i < YnvFilenames.Count; i++) - { - YnvFilenames[i] = GetUpdatedFilePath(YnvFilenames[i], oldprojpath); - } - for (int i = 0; i < TrainsFilenames.Count; i++) - { - TrainsFilenames[i] = GetUpdatedFilePath(TrainsFilenames[i], oldprojpath); - } - for (int i = 0; i < ScenarioFilenames.Count; i++) - { - ScenarioFilenames[i] = GetUpdatedFilePath(ScenarioFilenames[i], oldprojpath); - } - for (int i = 0; i < AudioRelFilenames.Count; i++) - { - AudioRelFilenames[i] = GetUpdatedFilePath(AudioRelFilenames[i], oldprojpath); - } - for (int i = 0; i < YdrFilenames.Count; i++) - { - YdrFilenames[i] = GetUpdatedFilePath(YdrFilenames[i], oldprojpath); - } - for (int i = 0; i < YddFilenames.Count; i++) - { - YddFilenames[i] = GetUpdatedFilePath(YddFilenames[i], oldprojpath); - } - for (int i = 0; i < YftFilenames.Count; i++) - { - YftFilenames[i] = GetUpdatedFilePath(YftFilenames[i], oldprojpath); - } - for (int i = 0; i < YtdFilenames.Count; i++) - { - YtdFilenames[i] = GetUpdatedFilePath(YtdFilenames[i], oldprojpath); - } + YmapFilenames = YmapFilenames + .Select(p => GetUpdatedFilePath(p, oldprojpath)) + .ToHashSet(); + + YtypFilenames = YtypFilenames + .Select(p => GetUpdatedFilePath(p, oldprojpath)) + .ToHashSet(); + + YbnFilenames = YbnFilenames + .Select(p => GetUpdatedFilePath(p, oldprojpath)) + .ToHashSet(); + + YndFilenames = YndFilenames + .Select(P => GetUpdatedFilePath(P, oldprojpath)) + .ToHashSet(); + + YnvFilenames = YnvFilenames + .Select(P => GetUpdatedFilePath(P, oldprojpath)) + .ToHashSet(); + + TrainsFilenames = TrainsFilenames + .Select(P => GetUpdatedFilePath(P, oldprojpath)) + .ToHashSet(); + + ScenarioFilenames = ScenarioFilenames + .Select(P => GetUpdatedFilePath(P, oldprojpath)) + .ToHashSet(); + + AudioRelFilenames = AudioRelFilenames + .Select(P => GetUpdatedFilePath(P, oldprojpath)) + .ToHashSet(); + + YdrFilenames = YdrFilenames + .Select(p => GetUpdatedFilePath(p, oldprojpath)) + .ToHashSet(); + + YddFilenames = YddFilenames + .Select(p => GetUpdatedFilePath(p, oldprojpath)) + .ToHashSet(); + + YftFilenames = YftFilenames + .Select(p => GetUpdatedFilePath(p, oldprojpath)) + .ToHashSet(); + + YtdFilenames = YtdFilenames + .Select(p => GetUpdatedFilePath(p, oldprojpath)) + .ToHashSet(); } public string GetUpdatedFilePath(string oldpath, string oldprojpath) { string fullpath = GetFullFilePath(oldpath, oldprojpath); - string newpath = GetRelativePath(fullpath); - return newpath; + return GetRelativePath(fullpath); } public string GetRelativePath(string filepath) { - if (filepath == null) return string.Empty; - if (Filepath == null) return filepath; + if (filepath == null) + return string.Empty; + if (Filepath == null) + return filepath; Uri fromUri; if (!Uri.TryCreate(Filepath, UriKind.RelativeOrAbsolute, out fromUri)) @@ -438,24 +441,25 @@ namespace CodeWalker.Project } public string GetFullFilePath(string relpath) { - if (string.IsNullOrEmpty(Filepath)) return relpath; + if (string.IsNullOrEmpty(Filepath)) + return relpath; string projfldr = new FileInfo(Filepath).DirectoryName + "\\"; string cpath = Path.Combine(projfldr, relpath); - string apath = Path.GetFullPath(cpath); - return apath; + return Path.GetFullPath(cpath); } public string GetFullFilePath(string relpath, string basepath) { - if (string.IsNullOrEmpty(basepath)) return relpath; + if (string.IsNullOrEmpty(basepath)) + return relpath; + string basefldr = new FileInfo(basepath).DirectoryName + "\\"; string cpath = Path.Combine(basefldr, relpath); - string apath = Path.GetFullPath(cpath); - return apath; + return Path.GetFullPath(cpath); } - public YmapFile AddYmapFile(string filename) + public YmapFile? AddYmapFile(string filename) { YmapFile ymap = new YmapFile(); ymap.RpfFileEntry = new RpfResourceFileEntry(); @@ -465,65 +469,74 @@ namespace CodeWalker.Project JenkIndex.Ensure(ymap.Name); JenkIndex.Ensure(Path.GetFileNameWithoutExtension(ymap.Name)); JenkIndex.Ensure(filename); - if (!AddYmapFile(ymap)) return null; + if (!AddYmapFile(ymap)) + return null; return ymap; } public bool AddYmapFile(YmapFile ymap) { string relpath = GetRelativePath(ymap.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ymap.Name; - if (YmapFilenames.Contains(relpath)) return false; - YmapFilenames.Add(relpath); - YmapFiles.Add(ymap); + if (string.IsNullOrEmpty(relpath)) + relpath = ymap.Name; + lock(YmapFiles) + { + if (YmapFilenames.Contains(relpath)) + return false; + YmapFilenames.Add(relpath); + YmapFiles.Add(ymap); + } + return true; } public void RemoveYmapFile(YmapFile ymap) { - if (ymap == null) return; + if (ymap == null) + return; var relpath = GetRelativePath(ymap.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ymap.Name; - YmapFiles.Remove(ymap); - YmapFilenames.Remove(relpath); + if (string.IsNullOrEmpty(relpath)) + relpath = ymap.Name; + lock(YmapFiles) + { + YmapFiles.Remove(ymap); + YmapFilenames.Remove(relpath); + } + HasChanged = true; } + public bool ContainsYmap(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var ymapfn in YmapFilenames) + lock(YmapFiles) { - if (ymapfn == filename) - { - found = true; - break; - } + return YmapFilenames.Contains(filename); } - return found; } + public bool ContainsYmap(YmapFile ymap) { - foreach (var f in YmapFiles) + lock(YmapFiles) { - if (f == ymap) return true; + return YmapFiles.Contains(ymap); } - return false; } + public bool RenameYmap(string oldfilename, string newfilename) { - for (int i = 0; i < YmapFilenames.Count; i++) + lock(YmapFiles) { - if (YmapFilenames[i]?.Equals(oldfilename, StringComparison.OrdinalIgnoreCase) ?? false) + if (YmapFilenames.Remove(oldfilename)) { - YmapFilenames[i] = newfilename.ToLowerInvariant(); + YmapFilenames.Add(newfilename.ToLowerInvariant()); HasChanged = true; return true; } + + return false; } - return false; } - public YtypFile AddYtypFile(string filename) + public YtypFile? AddYtypFile(string filename) { YtypFile ytyp = new YtypFile(); ytyp.RpfFileEntry = new RpfResourceFileEntry(); @@ -533,193 +546,213 @@ namespace CodeWalker.Project JenkIndex.EnsureBoth(ytyp.Name); JenkIndex.EnsureBoth(Path.GetFileNameWithoutExtension(ytyp.Name)); JenkIndex.EnsureBoth(filename); - if (!AddYtypFile(ytyp)) return null; + if (!AddYtypFile(ytyp)) + return null; return ytyp; } public bool AddYtypFile(YtypFile ytyp) { string relpath = GetRelativePath(ytyp.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ytyp.Name; - if (YtypFilenames.Contains(relpath)) return false; - YtypFilenames.Add(relpath); - YtypFiles.Add(ytyp); + if (string.IsNullOrEmpty(relpath)) + relpath = ytyp.Name; + lock(YtypFiles) + { + if (YtypFilenames.Contains(relpath)) + return false; + + YtypFilenames.Add(relpath); + YtypFiles.Add(ytyp); + } + return true; } public void RemoveYtypFile(YtypFile ytyp) { if (ytyp == null) return; var relpath = GetRelativePath(ytyp.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ytyp.Name; - YtypFiles.Remove(ytyp); - YtypFilenames.Remove(relpath); + if (string.IsNullOrEmpty(relpath)) + relpath = ytyp.Name; + lock(YtypFiles) + { + YtypFiles.Remove(ytyp); + YtypFilenames.Remove(relpath); + } HasChanged = true; } + public bool ContainsYtyp(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var ytypfn in YtypFilenames) + lock(YtypFiles) { - if (ytypfn == filename) - { - found = true; - break; - } + return YtypFilenames.Contains(filename); } - return found; } + public bool ContainsYtyp(YtypFile ytyp) { - foreach (var f in YtypFiles) + lock (YtypFiles) { - if (f == ytyp) return true; + return YtypFiles.Contains(ytyp); } - return false; } + public bool RenameYtyp(string oldfilename, string newfilename) { - for (int i = 0; i < YtypFilenames.Count; i++) + lock(YtypFiles) { - if (YtypFilenames[i]?.Equals(oldfilename, StringComparison.OrdinalIgnoreCase) ?? false) + if (YtypFilenames.Remove(oldfilename)) { - YtypFilenames[i] = newfilename.ToLowerInvariant(); + YtypFilenames.Add(newfilename); HasChanged = true; return true; } + + return false; } - return false; } - public YbnFile AddYbnFile(string filename) + public YbnFile? AddYbnFile(string filename) { YbnFile ybn = new YbnFile(); ybn.RpfFileEntry = new RpfResourceFileEntry(); ybn.RpfFileEntry.Name = Path.GetFileName(filename); ybn.FilePath = GetFullFilePath(filename); ybn.Name = ybn.RpfFileEntry.Name; - if (!AddYbnFile(ybn)) return null; + if (!AddYbnFile(ybn)) + return null; return ybn; } + public bool AddYbnFile(YbnFile ybn) { string relpath = GetRelativePath(ybn.FilePath); if (string.IsNullOrEmpty(relpath)) relpath = ybn.Name; - if (YndFilenames.Contains(relpath, StringComparer.OrdinalIgnoreCase)) return false; - YbnFilenames.Add(relpath); - YbnFiles.Add(ybn); - return true; + lock(YbnFiles) + { + if (YndFilenames.Contains(relpath)) + return false; + YbnFilenames.Add(relpath); + YbnFiles.Add(ybn); + return true; + } } + public void RemoveYbnFile(YbnFile ybn) { if (ybn == null) return; var relpath = GetRelativePath(ybn.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ybn.Name; - YbnFiles.Remove(ybn); - YbnFilenames.Remove(relpath); - HasChanged = true; + if (string.IsNullOrEmpty(relpath)) + relpath = ybn.Name; + + lock(YbnFiles) + { + YbnFiles.Remove(ybn); + YbnFilenames.Remove(relpath); + HasChanged = true; + } } + public bool ContainsYbn(string filename) { - bool found = false; - foreach (var yndfn in YbnFilenames) + lock(YbnFiles) { - if (yndfn.Equals(filename, StringComparison.OrdinalIgnoreCase)) - { - found = true; - break; - } + return YbnFilenames.Contains(filename); } - return found; } + public bool ContainsYbn(YbnFile ybn) { - foreach (var f in YbnFiles) + lock(YbnFiles) { - if (f == ybn) return true; + return YbnFiles.Contains(ybn); } - return false; } + public bool RenameYbn(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < YbnFilenames.Count; i++) + lock(YbnFiles) { - if (YbnFilenames[i]?.Equals(oldfilename, StringComparison.OrdinalIgnoreCase) ?? false) + if (YbnFilenames.Remove(oldfilename)) { - YbnFilenames[i] = newfilename; + YbnFilenames.Add(newfilename.ToLowerInvariant()); HasChanged = true; return true; } + + return false; } - return false; } - public YndFile AddYndFile(string filename) + public YndFile? AddYndFile(string filename) { YndFile ynd = new YndFile(); ynd.RpfFileEntry = new RpfResourceFileEntry(); ynd.RpfFileEntry.Name = Path.GetFileName(filename); ynd.FilePath = GetFullFilePath(filename); ynd.Name = ynd.RpfFileEntry.Name; - if (!AddYndFile(ynd)) return null; + if (!AddYndFile(ynd)) + return null; return ynd; } public bool AddYndFile(YndFile ynd) { string relpath = GetRelativePath(ynd.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ynd.Name; - if (YndFilenames.Contains(relpath)) return false; - YndFilenames.Add(relpath); - YndFiles.Add(ynd); + if (string.IsNullOrEmpty(relpath)) + relpath = ynd.Name; + + lock(YndFiles) + { + if (YndFilenames.Contains(relpath)) + return false; + YndFilenames.Add(relpath); + YndFiles.Add(ynd); + } return true; } - public void RemoveYndFile(YndFile ynd) + public void RemoveYndFile(YndFile? ynd) { - if (ynd == null) return; + if (ynd is null) + return; var relpath = GetRelativePath(ynd.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ynd.Name; - YndFiles.Remove(ynd); - YndFilenames.Remove(relpath); + if (string.IsNullOrEmpty(relpath)) + relpath = ynd.Name; + + lock(YndFiles) + { + YndFiles.Remove(ynd); + YndFilenames.Remove(relpath); + } + HasChanged = true; } public bool ContainsYnd(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var yndfn in YndFilenames) + lock(YndFiles) { - if (yndfn == filename) - { - found = true; - break; - } + return YndFilenames.Contains(filename); } - return found; } public bool ContainsYnd(YndFile ynd) { - foreach (var f in YndFiles) + lock(YndFiles) { - if (f == ynd) return true; + return YndFiles.Contains(ynd); } - return false; } public bool RenameYnd(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < YndFilenames.Count; i++) + lock(YndFiles) { - if (YndFilenames[i]?.ToLowerInvariant() == oldfilename) + if (YndFilenames.Remove(oldfilename)) { - YndFilenames[i] = newfilename; + YndFilenames.Add(newfilename); HasChanged = true; return true; } } + return false; } @@ -731,134 +764,135 @@ namespace CodeWalker.Project ynv.RpfFileEntry.Name = Path.GetFileName(filename); ynv.FilePath = GetFullFilePath(filename); ynv.Name = ynv.RpfFileEntry.Name; - if (!AddYnvFile(ynv)) return null; + if (!AddYnvFile(ynv)) + return null; return ynv; } + public bool AddYnvFile(YnvFile ynv) { string relpath = GetRelativePath(ynv.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ynv.Name; - if (YnvFilenames.Contains(relpath)) return false; - YnvFilenames.Add(relpath); - YnvFiles.Add(ynv); + if (string.IsNullOrEmpty(relpath)) + relpath = ynv.Name; + + lock(YnvFiles) + { + if (YnvFilenames.Contains(relpath)) + return false; + + YnvFilenames.Add(relpath); + YnvFiles.Add(ynv); + } + return true; } + public void RemoveYnvFile(YnvFile ynv) { if (ynv == null) return; var relpath = GetRelativePath(ynv.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ynv.Name; - YnvFiles.Remove(ynv); - YnvFilenames.Remove(relpath); + if (string.IsNullOrEmpty(relpath)) + relpath = ynv.Name; + + lock(YnvFiles) + { + YnvFiles.Remove(ynv); + YnvFilenames.Remove(relpath); + } + HasChanged = true; } + public bool ContainsYnv(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var ynvfn in YnvFilenames) + lock(YnvFiles) { - if (ynvfn == filename) - { - found = true; - break; - } + return YnvFilenames.Contains(filename); } - return found; } + public bool ContainsYnv(YnvFile ynv) { - foreach (var f in YnvFiles) + lock(YnvFiles) { - if (f == ynv) return true; + return YnvFiles.Contains(ynv); } - return false; } + public bool RenameYnv(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < YnvFilenames.Count; i++) + lock(YnvFiles) { - if (YnvFilenames[i]?.ToLowerInvariant() == oldfilename) + if (YnvFilenames.Remove(oldfilename)) { - YnvFilenames[i] = newfilename; + YnvFilenames.Add(newfilename); HasChanged = true; return true; } } + + return false; } - public TrainTrack AddTrainsFile(string filename) + public TrainTrack? AddTrainsFile(string filename) { TrainTrack track = new TrainTrack(); track.RpfFileEntry = new RpfResourceFileEntry(); track.RpfFileEntry.Name = Path.GetFileName(filename); track.FilePath = GetFullFilePath(filename); track.Name = track.RpfFileEntry.Name; - if (!AddTrainsFile(track)) return null; + if (!AddTrainsFile(track)) + return null; return track; } public bool AddTrainsFile(TrainTrack track) { string relpath = GetRelativePath(track.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = track.Name; - if (TrainsFilenames.Contains(relpath)) return false; + if (string.IsNullOrEmpty(relpath)) + relpath = track.Name; + if (TrainsFilenames.Contains(relpath)) + return false; TrainsFilenames.Add(relpath); TrainsFiles.Add(track); return true; } - public void RemoveTrainsFile(TrainTrack track) + public void RemoveTrainsFile(TrainTrack? track) { - if (track == null) return; + if (track is null) + return; var relpath = GetRelativePath(track.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = track.Name; + if (string.IsNullOrEmpty(relpath)) + relpath = track.Name; TrainsFiles.Remove(track); TrainsFilenames.Remove(relpath); HasChanged = true; } public bool ContainsTrainTrack(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var trainsfn in TrainsFilenames) - { - if (trainsfn == filename) - { - found = true; - break; - } - } - return found; + return TrainsFilenames.Contains(filename); } + public bool ContainsTrainTrack(TrainTrack track) { - foreach (var f in TrainsFiles) - { - if (f == track) return true; - } - return false; + return TrainsFiles.Contains(track); } + public bool RenameTrainTrack(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < TrainsFilenames.Count; i++) + if (TrainsFilenames.Remove(oldfilename)) { - if (TrainsFilenames[i]?.ToLowerInvariant() == oldfilename) - { - TrainsFilenames[i] = newfilename; - HasChanged = true; - return true; - } + TrainsFilenames.Add(newfilename); + HasChanged = true; + return true; } + return false; } - public YmtFile AddScenarioFile(string filename) + public YmtFile? AddScenarioFile(string filename) { YmtFile scenario = new YmtFile(); scenario.RpfFileEntry = new RpfResourceFileEntry(); @@ -867,196 +901,227 @@ namespace CodeWalker.Project scenario.Name = scenario.RpfFileEntry.Name; scenario.ContentType = YmtFileContentType.ScenarioPointRegion; scenario.FileFormat = YmtFileFormat.RSC; - if (!AddScenarioFile(scenario)) return null; + if (!AddScenarioFile(scenario)) + return null; return scenario; } public bool AddScenarioFile(YmtFile ymt) { string relpath = GetRelativePath(ymt.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ymt.Name; - if (ScenarioFilenames.Contains(relpath)) return false; - ScenarioFilenames.Add(relpath); - ScenarioFiles.Add(ymt); + if (string.IsNullOrEmpty(relpath)) + relpath = ymt.Name; + + lock(ScenarioFiles) + { + if (ScenarioFilenames.Contains(relpath)) + return false; + ScenarioFilenames.Add(relpath); + ScenarioFiles.Add(ymt); + } + return true; } - public void RemoveScenarioFile(YmtFile ymt) + public void RemoveScenarioFile(YmtFile? ymt) { - if (ymt == null) return; + if (ymt is null) + return; var relpath = GetRelativePath(ymt.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ymt.Name; - ScenarioFiles.Remove(ymt); - ScenarioFilenames.Remove(relpath); + if (string.IsNullOrEmpty(relpath)) + relpath = ymt.Name; + + lock(ScenarioFiles) + { + ScenarioFiles.Remove(ymt); + ScenarioFilenames.Remove(relpath); + } + HasChanged = true; } public bool ContainsScenario(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var scenariofn in ScenarioFilenames) + lock(ScenarioFiles) { - if (scenariofn == filename) - { - found = true; - break; - } + return ScenarioFilenames.Contains(filename); } - return found; } + public bool ContainsScenario(YmtFile ymt) { - foreach (var f in ScenarioFiles) + lock(ScenarioFiles) { - if (f == ymt) return true; + return ScenarioFiles.Contains(ymt); } - return false; } + public bool RenameScenario(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < ScenarioFilenames.Count; i++) + lock(ScenarioFiles) { - if (ScenarioFilenames[i]?.ToLowerInvariant() == oldfilename) + if (ScenarioFilenames.Remove(oldfilename)) { - ScenarioFilenames[i] = newfilename; + ScenarioFilenames.Add(newfilename); HasChanged = true; return true; } } + return false; } - public RelFile AddAudioRelFile(string filename) + public RelFile? AddAudioRelFile(string filename) { RelFile relfile = new RelFile(); relfile.RpfFileEntry = new RpfResourceFileEntry(); relfile.RpfFileEntry.Name = Path.GetFileName(filename); relfile.FilePath = GetFullFilePath(filename); relfile.Name = relfile.RpfFileEntry.Name; - if (!AddAudioRelFile(relfile)) return null; + if (!AddAudioRelFile(relfile)) + return null; return relfile; } + public bool AddAudioRelFile(RelFile rel) { string relpath = GetRelativePath(rel.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = rel.Name; - if (AudioRelFilenames.Contains(relpath)) return false; - AudioRelFilenames.Add(relpath); - AudioRelFiles.Add(rel); + if (string.IsNullOrEmpty(relpath)) + relpath = rel.Name; + + lock(AudioRelFiles) + { + if (AudioRelFilenames.Contains(relpath)) + return false; + AudioRelFilenames.Add(relpath); + AudioRelFiles.Add(rel); + } + return true; } - public void RemoveAudioRelFile(RelFile rel) + + public void RemoveAudioRelFile(RelFile? rel) { - if (rel == null) return; + if (rel is null) + return; var relpath = GetRelativePath(rel.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = rel.Name; - AudioRelFiles.Remove(rel); - AudioRelFilenames.Remove(relpath); + if (string.IsNullOrEmpty(relpath)) + relpath = rel.Name; + + lock(AudioRelFiles) + { + AudioRelFiles.Remove(rel); + AudioRelFilenames.Remove(relpath); + } + HasChanged = true; } + public bool ContainsAudioRel(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var audiorelfn in AudioRelFilenames) + lock(AudioRelFiles) { - if (audiorelfn == filename) - { - found = true; - break; - } + return AudioRelFilenames.Contains(filename); } - return found; } + public bool ContainsAudioRel(RelFile rel) { - foreach (var f in AudioRelFiles) + lock(AudioRelFiles) { - if (f == rel) return true; + return AudioRelFiles.Contains(rel); } - return false; } + public bool RenameAudioRel(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < AudioRelFilenames.Count; i++) + lock(AudioRelFiles) { - if (AudioRelFilenames[i]?.ToLowerInvariant() == oldfilename) + if (AudioRelFilenames.Remove(oldfilename)) { - AudioRelFilenames[i] = newfilename; + AudioRelFilenames.Add(newfilename); HasChanged = true; return true; } + return false; } - return false; } - public YdrFile AddYdrFile(string filename) + public YdrFile? AddYdrFile(string filename) { YdrFile ydr = new YdrFile(); ydr.RpfFileEntry = new RpfResourceFileEntry(); ydr.RpfFileEntry.Name = Path.GetFileName(filename); ydr.FilePath = GetFullFilePath(filename); ydr.Name = ydr.RpfFileEntry.Name; - if (!AddYdrFile(ydr)) return null; + + if (!AddYdrFile(ydr)) + return null; + return ydr; } public bool AddYdrFile(YdrFile ydr) { string relpath = GetRelativePath(ydr.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ydr.Name; - if (YdrFilenames.Contains(relpath)) return false; - YdrFilenames.Add(relpath); - YdrFiles.Add(ydr); - return true; + + if (string.IsNullOrEmpty(relpath)) + relpath = ydr.Name; + + lock(YdrFiles) + { + if (YdrFilenames.Contains(relpath)) + return false; + + YdrFilenames.Add(relpath); + YdrFiles.Add(ydr); + return true; + } } + public void RemoveYdrFile(YdrFile ydr) { - if (ydr == null) return; + if (ydr == null) + return; var relpath = GetRelativePath(ydr.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ydr.Name; - YdrFiles.Remove(ydr); - YdrFilenames.Remove(relpath); - HasChanged = true; - } - public bool ContainsYdr(string filename) - { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var ydrfn in YdrFilenames) + if (string.IsNullOrEmpty(relpath)) + relpath = ydr.Name; + + lock(YdrFiles) { - if (ydrfn == filename) + if (YdrFiles.Remove(ydr) || YdrFilenames.Remove(relpath)) { - found = true; - break; + HasChanged = true; } } - return found; } + + public bool ContainsYdr(string filename) + { + lock(YdrFiles) + { + return YdrFilenames.Contains(filename); + } + } + public bool ContainsYdr(YdrFile ydr) { - foreach (var f in YdrFiles) + lock (YdrFiles) { - if (f == ydr) return true; + return YdrFiles.Contains(ydr); } - return false; } + public bool RenameYdr(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < YdrFilenames.Count; i++) + lock(YdrFiles) { - if (YdrFilenames[i]?.ToLowerInvariant() == oldfilename) + if (YdrFilenames.Remove(oldfilename)) { - YdrFilenames[i] = newfilename; + YdrFilenames.Add(newfilename); HasChanged = true; return true; } } + return false; } @@ -1071,194 +1136,219 @@ namespace CodeWalker.Project if (!AddYddFile(ydd)) return null; return ydd; } + public bool AddYddFile(YddFile ydd) { string relpath = GetRelativePath(ydd.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ydd.Name; - if (YddFilenames.Contains(relpath)) return false; - YddFilenames.Add(relpath); - YddFiles.Add(ydd); + if (string.IsNullOrEmpty(relpath)) + relpath = ydd.Name; + + lock(YddFiles) + { + if (YddFilenames.Contains(relpath)) + return false; + YddFilenames.Add(relpath); + YddFiles.Add(ydd); + } + return true; } - public void RemoveYddFile(YddFile ydd) + + public void RemoveYddFile(YddFile? ydd) { - if (ydd == null) return; + if (ydd is null) + return; var relpath = GetRelativePath(ydd.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ydd.Name; - YddFiles.Remove(ydd); - YddFilenames.Remove(relpath); + if (string.IsNullOrEmpty(relpath)) + relpath = ydd.Name; + lock(YddFiles) + { + YddFiles.Remove(ydd); + YddFilenames.Remove(relpath); + } HasChanged = true; } + public bool ContainsYdd(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var yddfn in YddFilenames) + lock(YddFiles) { - if (yddfn == filename) - { - found = true; - break; - } + return YddFilenames.Contains(filename); } - return found; } + public bool ContainsYdd(YddFile ydd) { - foreach (var f in YddFiles) + lock(YddFiles) { - if (f == ydd) return true; + return YddFiles.Contains(ydd); } - return false; } + public bool RenameYdd(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < YddFilenames.Count; i++) + lock(YddFiles) { - if (YddFilenames[i]?.ToLowerInvariant() == oldfilename) + if (YddFilenames.Remove(oldfilename)) { - YddFilenames[i] = newfilename; + YddFilenames.Add(newfilename); HasChanged = true; return true; } } + return false; } - public YftFile AddYftFile(string filename) + public YftFile? AddYftFile(string filename) { YftFile yft = new YftFile(); yft.RpfFileEntry = new RpfResourceFileEntry(); yft.RpfFileEntry.Name = Path.GetFileName(filename); yft.FilePath = GetFullFilePath(filename); yft.Name = yft.RpfFileEntry.Name; - if (!AddYftFile(yft)) return null; + if (!AddYftFile(yft)) + return null; return yft; } public bool AddYftFile(YftFile yft) { string relpath = GetRelativePath(yft.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = yft.Name; - if (YftFilenames.Contains(relpath)) return false; - YftFilenames.Add(relpath); - YftFiles.Add(yft); - return true; + if (string.IsNullOrEmpty(relpath)) + relpath = yft.Name; + + lock(YftFiles) + { + if (YftFilenames.Contains(relpath)) + return false; + YftFilenames.Add(relpath); + YftFiles.Add(yft); + return true; + } } public void RemoveYftFile(YftFile yft) { - if (yft == null) return; + if (yft == null) + return; var relpath = GetRelativePath(yft.FilePath); if (string.IsNullOrEmpty(relpath)) relpath = yft.Name; - YftFiles.Remove(yft); - YftFilenames.Remove(relpath); - HasChanged = true; + + lock(YftFiles) + { + YftFiles.Remove(yft); + YftFilenames.Remove(relpath); + HasChanged = true; + } } + public bool ContainsYft(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var yftfn in YftFilenames) + lock(YftFiles) { - if (yftfn == filename) - { - found = true; - break; - } + return YftFilenames.Contains(filename); } - return found; } + public bool ContainsYft(YftFile yft) { - foreach (var f in YftFiles) + lock(YftFiles) { - if (f == yft) return true; + return YftFiles.Contains(yft); } - return false; } + public bool RenameYft(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < YftFilenames.Count; i++) + lock(YftFiles) { - if (YftFilenames[i]?.ToLowerInvariant() == oldfilename) + if (YftFilenames.Remove(oldfilename)) { - YftFilenames[i] = newfilename; + YftFilenames.Add(newfilename); HasChanged = true; return true; } + return false; } - return false; } - public YtdFile AddYtdFile(string filename) + public YtdFile? AddYtdFile(string filename) { YtdFile ytd = new YtdFile(); ytd.RpfFileEntry = new RpfResourceFileEntry(); ytd.RpfFileEntry.Name = Path.GetFileName(filename); ytd.FilePath = GetFullFilePath(filename); ytd.Name = ytd.RpfFileEntry.Name; - if (!AddYtdFile(ytd)) return null; + if (!AddYtdFile(ytd)) + return null; return ytd; } + public bool AddYtdFile(YtdFile ytd) { string relpath = GetRelativePath(ytd.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ytd.Name; - if (YtdFilenames.Contains(relpath)) return false; - YtdFilenames.Add(relpath); - YtdFiles.Add(ytd); - return true; + + if (string.IsNullOrEmpty(relpath)) + relpath = ytd.Name; + + lock(YtdFiles) + { + if (YtdFilenames.Contains(relpath)) + return false; + + YtdFilenames.Add(relpath); + YtdFiles.Add(ytd); + return true; + } } + public void RemoveYtdFile(YtdFile ytd) { - if (ytd == null) return; + if (ytd == null) + return; var relpath = GetRelativePath(ytd.FilePath); - if (string.IsNullOrEmpty(relpath)) relpath = ytd.Name; - YtdFiles.Remove(ytd); - YtdFilenames.Remove(relpath); - HasChanged = true; + if (string.IsNullOrEmpty(relpath)) + relpath = ytd.Name; + + lock(YtdFiles) + { + YtdFiles.Remove(ytd); + YtdFilenames.Remove(relpath); + HasChanged = true; + } } + public bool ContainsYtd(string filename) { - bool found = false; - filename = filename.ToLowerInvariant(); - foreach (var ytdfn in YtdFilenames) + lock(YtdFiles) { - if (ytdfn == filename) - { - found = true; - break; - } + return YtdFilenames.Contains(filename); } - return found; } + public bool ContainsYtd(YtdFile ytd) { - foreach (var f in YtdFiles) + lock(YtdFiles) { - if (f == ytd) return true; + return YtdFiles.Contains(ytd); } - return false; } + public bool RenameYtd(string oldfilename, string newfilename) { - oldfilename = oldfilename.ToLowerInvariant(); - newfilename = newfilename.ToLowerInvariant(); - for (int i = 0; i < YtdFilenames.Count; i++) + lock(YtdFiles) { - if (YtdFilenames[i]?.ToLowerInvariant() == oldfilename) + if (YtdFilenames.Remove(oldfilename)) { - YtdFilenames[i] = newfilename; + YtdFilenames.Add(newfilename); HasChanged = true; return true; } + + return false; } - return false; } } diff --git a/CodeWalker/Project/ProjectForm.cs b/CodeWalker/Project/ProjectForm.cs index a27fd98..95e8a47 100644 --- a/CodeWalker/Project/ProjectForm.cs +++ b/CodeWalker/Project/ProjectForm.cs @@ -3,12 +3,14 @@ using CodeWalker.Project.Panels; using CodeWalker.Properties; using CodeWalker.Utils; using CodeWalker.World; +using CommunityToolkit.HighPerformance; using SharpDX; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.IO; using System.Linq; @@ -22,73 +24,70 @@ namespace CodeWalker.Project { public partial class ProjectForm : Form { - public WorldForm WorldForm { get; private set; } - public ThemeBase Theme { get; private set; } - public ProjectExplorerPanel ProjectExplorer { get; set; } - public ProjectPanel PreviewPanel { get; set; } - public DeleteGrassPanel DeleteGrassPanel { get; set; } + public WorldForm? WorldForm { get; private set; } + public ThemeBase? Theme { get; private set; } + public ProjectExplorerPanel? ProjectExplorer { get; set; } + public ProjectPanel? PreviewPanel { get; set; } + public DeleteGrassPanel? DeleteGrassPanel { get; set; } - public GameFileCache GameFileCache { get; private set; } + public static GameFileCache GameFileCache => GameFileCacheFactory.Instance; public RpfManager RpfMan { get; private set; } - public bool IsProjectLoaded - { - get { return CurrentProjectFile != null; } - } - public ProjectFile CurrentProjectFile; + public bool IsProjectLoaded => CurrentProjectFile != null; + public ProjectFile? CurrentProjectFile; - private MapSelection[] CurrentMulti; + private MapSelection[]? CurrentMulti; - private YmapFile CurrentYmapFile; - private YmapEntityDef CurrentEntity; - private YmapCarGen CurrentCarGen; - private YmapLODLight CurrentLodLight; - private YmapBoxOccluder CurrentBoxOccluder; - private YmapOccludeModel CurrentOccludeModel; - private YmapOccludeModelTriangle CurrentOccludeModelTri; - private YmapGrassInstanceBatch CurrentGrassBatch; + private YmapFile? CurrentYmapFile; + private YmapEntityDef? CurrentEntity; + private YmapCarGen? CurrentCarGen; + private YmapLODLight? CurrentLodLight; + private YmapBoxOccluder? CurrentBoxOccluder; + private YmapOccludeModel? CurrentOccludeModel; + private YmapOccludeModelTriangle? CurrentOccludeModelTri; + private YmapGrassInstanceBatch? CurrentGrassBatch; - private YtypFile CurrentYtypFile; - private Archetype CurrentArchetype; - private MCEntityDef CurrentMloEntity; - private MCMloRoomDef CurrentMloRoom; - private MCMloPortalDef CurrentMloPortal; - private MCMloEntitySet CurrentMloEntitySet; + private YtypFile? CurrentYtypFile; + private Archetype? CurrentArchetype; + private MCEntityDef? CurrentMloEntity; + private MCMloRoomDef? CurrentMloRoom; + private MCMloPortalDef? CurrentMloPortal; + private MCMloEntitySet? CurrentMloEntitySet; - private YndFile CurrentYndFile; - private YndNode CurrentPathNode; - private YndLink CurrentPathLink; + private YndFile? CurrentYndFile; + private YndNode? CurrentPathNode; + private YndLink? CurrentPathLink; - private YnvFile CurrentYnvFile; - private YnvPoly CurrentNavPoly; - private YnvPoint CurrentNavPoint; - private YnvPortal CurrentNavPortal; + private YnvFile? CurrentYnvFile; + private YnvPoly? CurrentNavPoly; + private YnvPoint? CurrentNavPoint; + private YnvPortal? CurrentNavPortal; - private TrainTrack CurrentTrainTrack; - private TrainTrackNode CurrentTrainNode; + private TrainTrack? CurrentTrainTrack; + private TrainTrackNode? CurrentTrainNode; - private YmtFile CurrentScenario; - private ScenarioNode CurrentScenarioNode; - private MCScenarioChainingEdge CurrentScenarioChainEdge; + private YmtFile? CurrentScenario; + private ScenarioNode? CurrentScenarioNode; + private MCScenarioChainingEdge? CurrentScenarioChainEdge; - private RelFile CurrentAudioFile; - private AudioPlacement CurrentAudioZone; - private AudioPlacement CurrentAudioEmitter; - private Dat151AmbientZoneList CurrentAudioZoneList; - private Dat151StaticEmitterList CurrentAudioEmitterList; - private Dat151Interior CurrentAudioInterior; - private Dat151InteriorRoom CurrentAudioInteriorRoom; + private RelFile? CurrentAudioFile; + private AudioPlacement? CurrentAudioZone; + private AudioPlacement? CurrentAudioEmitter; + private Dat151AmbientZoneList? CurrentAudioZoneList; + private Dat151StaticEmitterList? CurrentAudioEmitterList; + private Dat151Interior? CurrentAudioInterior; + private Dat151InteriorRoom? CurrentAudioInteriorRoom; - private YbnFile CurrentYbnFile; - private Bounds CurrentCollisionBounds; - private BoundPolygon CurrentCollisionPoly; - private BoundVertex CurrentCollisionVertex; + private YbnFile? CurrentYbnFile; + private Bounds? CurrentCollisionBounds; + private BoundPolygon? CurrentCollisionPoly; + private BoundVertex? CurrentCollisionVertex; - private YdrFile CurrentYdrFile; - private YddFile CurrentYddFile; - private YftFile CurrentYftFile; - private YtdFile CurrentYtdFile; + private YdrFile? CurrentYdrFile; + private YddFile? CurrentYddFile; + private YftFile? CurrentYftFile; + private YtdFile? CurrentYtdFile; @@ -98,14 +97,13 @@ namespace CodeWalker.Project private bool autoymapextents = true; public bool displayentityindexes = false; - private object projectsyncroot = new object(); - public object ProjectSyncRoot { get { return projectsyncroot; } } + public readonly object ProjectSyncRoot = new object(); - private Dictionary visibleybns = new Dictionary(); + private Dictionary visibleybns = new Dictionary(StringComparer.OrdinalIgnoreCase); private Dictionary visibleynds = new Dictionary(); private Dictionary visibleynvs = new Dictionary(); - private Dictionary visibletrains = new Dictionary(); - private Dictionary visiblescenarios = new Dictionary(); + private Dictionary visibletrains = new Dictionary(StringComparer.OrdinalIgnoreCase); + private Dictionary visiblescenarios = new Dictionary(StringComparer.OrdinalIgnoreCase); private Dictionary visiblemloentities = new Dictionary(); private Dictionary visibleaudiofiles = new Dictionary(); @@ -116,7 +114,7 @@ namespace CodeWalker.Project private bool ShowProjectItemInProcess = false; - public ProjectForm(WorldForm worldForm = null) + public ProjectForm(WorldForm? worldForm = null) { WorldForm = worldForm; @@ -125,14 +123,12 @@ namespace CodeWalker.Project SetTheme(Settings.Default.ProjectWindowTheme, false); ShowDefaultPanels(); - GameFileCache = GameFileCacheFactory.GetInstance(); - if (!GameFileCache.IsInited) { - Task.Run(() => + Task.Run(async () => { GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key); - GameFileCache.Init(UpdateStatus, UpdateError); + await GameFileCache.InitAsync(UpdateStatus, UpdateError); }); } @@ -145,7 +141,7 @@ namespace CodeWalker.Project { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateStatus(text); })); + BeginInvoke(UpdateStatus, text); } else { @@ -153,10 +149,14 @@ namespace CodeWalker.Project //StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void UpdateError(string text) { + Console.WriteLine(text); + return; try { if (InvokeRequired) @@ -170,11 +170,13 @@ namespace CodeWalker.Project //ErrorLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } - private void SetTheme(string themestr, bool changing = true) + private async Task SetTheme(string themestr, bool changing = true) { if (changing && (CurrentProjectFile != null)) { @@ -185,7 +187,7 @@ namespace CodeWalker.Project } - CloseProject(); + await CloseProject(); //string configFile = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.temp.config"); //MainDockPanel.SaveAsXml(configFile); @@ -247,14 +249,13 @@ namespace CodeWalker.Project } - private T FindPanel(Func findFunc) where T : ProjectPanel + private T? FindPanel(Func findFunc) where T : ProjectPanel { foreach (var pane in MainDockPanel.Panes) { foreach (var content in pane.Contents) { - var test = content as T; - if ((test != null) && findFunc(test)) + if ((content is T test) && findFunc(test)) { return test; } @@ -262,11 +263,13 @@ namespace CodeWalker.Project } return null; } + public void ShowDefaultPanels() { ShowProjectExplorer(); ShowWelcomePanel(); } + public void ShowProjectExplorer() { if ((ProjectExplorer == null) || (ProjectExplorer.IsDisposed) || (ProjectExplorer.Disposing)) @@ -284,18 +287,19 @@ namespace CodeWalker.Project } public void ShowWelcomePanel() { - ShowPreviewPanel(() => { return new WelcomePanel(); }); + ShowPreviewPanel(() => new WelcomePanel()); } - public void ShowPreviewPanel(Func createFunc, Action updateAction = null) where T : ProjectPanel + public void ShowPreviewPanel(Func createFunc, Action? updateAction = null) where T : ProjectPanel { - if ((PreviewPanel != null) && (PreviewPanel is T)) + if (PreviewPanel != null && PreviewPanel is T panel) { + PreviewPanel.Show(); PreviewPanel.BringToFront();//.Show(); - updateAction?.Invoke(PreviewPanel as T); + updateAction?.Invoke(panel); } else { - var panel = createFunc(); + panel = createFunc(); panel.HideOnClose = true; panel.SetTheme(Theme); panel.Show(MainDockPanel, DockState.Document); @@ -312,10 +316,7 @@ namespace CodeWalker.Project T found = FindPanel(findFunc); if ((found != null) && (found != PreviewPanel)) { - if (found.IsHidden) - { - found.Show(); - } + found.Show(); found.BringToFront();//.Show(); updateAction?.Invoke(found); } @@ -326,6 +327,7 @@ namespace CodeWalker.Project PromoteIfPreviewPanel(PreviewPanel); if (found != null) { + found.Show(); found.BringToFront();//.Show(); updateAction?.Invoke(found); } @@ -869,12 +871,8 @@ namespace CodeWalker.Project if (CurrentAudioZone?.AudioZone == null) CurrentAudioZone = null; if (CurrentAudioEmitter?.AudioEmitter == null) CurrentAudioEmitter = null; - - //need to create a temporary AudioPlacement wrapper for these, since AudioPlacements usually come from WorldForm - var daz = item as Dat151AmbientZone; - var dae = item as Dat151AmbientRule; - if (daz != null) CurrentAudioZone = new AudioPlacement(daz.Rel, daz); - if (dae != null) CurrentAudioEmitter = new AudioPlacement(dae.Rel, dae); + if (item is Dat151AmbientZone daz) CurrentAudioZone = new AudioPlacement(daz.Rel, daz); + if (item is Dat151AmbientRule dae) CurrentAudioEmitter = new AudioPlacement(dae.Rel, dae); @@ -1039,7 +1037,8 @@ namespace CodeWalker.Project { if (MainDockPanel.DocumentStyle == DocumentStyle.SystemMdi) { - foreach (Form form in MdiChildren) form.Close(); + foreach (Form form in MdiChildren) + form.Close(); } else { @@ -1086,9 +1085,9 @@ namespace CodeWalker.Project { if (panel == PreviewPanel) { - if (PreviewPanel != null) + if (PreviewPanel is not null) { - PreviewPanel.HideOnClose = false; + PreviewPanel.InvokeIfRequired(() => PreviewPanel.HideOnClose = false); } PreviewPanel = null; } @@ -1120,12 +1119,13 @@ namespace CodeWalker.Project return 0f; } - public void NewProject() + [MemberNotNull(nameof(CurrentProjectFile))] + public async ValueTask NewProjectAsync() { if (CurrentProjectFile != null) { ////unload current project first - CloseProject(); + await CloseProject(); } CurrentProjectFile = new ProjectFile(); @@ -1134,7 +1134,7 @@ namespace CodeWalker.Project CurrentProjectFile.HasChanged = true; LoadProjectUI(); } - public void OpenProject() + public async ValueTask OpenProject() { string file = ShowOpenDialog("CodeWalker Projects|*.cwproj", string.Empty); if (string.IsNullOrEmpty(file)) @@ -1142,7 +1142,7 @@ namespace CodeWalker.Project return; } - CloseProject(); + await CloseProject(); CurrentProjectFile = new ProjectFile(); CurrentProjectFile.Load(file); @@ -1158,11 +1158,11 @@ namespace CodeWalker.Project } if (File.Exists(filename)) { - LoadYmapFromFile(ymap, filename); + await LoadYmapFromFileAsync(ymap, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1175,11 +1175,11 @@ namespace CodeWalker.Project } if (File.Exists(filename)) { - LoadYtypFromFile(ytyp, filename); + await LoadYtypFromFileAsync(ytyp, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1192,11 +1192,11 @@ namespace CodeWalker.Project } if (File.Exists(filename)) { - LoadYbnFromFile(ybn, filename); + await LoadYbnFromFileAsync(ybn, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1209,11 +1209,11 @@ namespace CodeWalker.Project } if (File.Exists(filename)) { - LoadYndFromFile(ynd, filename); + await LoadYndFromFileAsync(ynd, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1226,11 +1226,11 @@ namespace CodeWalker.Project } if (File.Exists(filename)) { - LoadYnvFromFile(ynv, filename); + await LoadYnvFromFileAsync(ynv, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1243,11 +1243,11 @@ namespace CodeWalker.Project } if (File.Exists(filename)) { - LoadTrainTrackFromFile(track, filename); + await LoadTrainTrackFromFileAsync(track, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1264,7 +1264,7 @@ namespace CodeWalker.Project } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1281,7 +1281,7 @@ namespace CodeWalker.Project } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1290,15 +1290,15 @@ namespace CodeWalker.Project string filename = ydr.FilePath; if (!File.Exists(filename)) { - filename = cpath + "\\" + filename; + filename = $"{cpath}\\{filename}"; } if (File.Exists(filename)) { - LoadYdrFromFile(ydr, filename); + await LoadYdrFromFile(ydr, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1311,11 +1311,11 @@ namespace CodeWalker.Project } if (File.Exists(filename)) { - LoadYddFromFile(ydd, filename); + await LoadYddFromFileAsync(ydd, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1324,15 +1324,15 @@ namespace CodeWalker.Project string filename = yft.FilePath; if (!File.Exists(filename)) { - filename = cpath + "\\" + filename; + filename = $"{cpath}\\{filename}"; } if (File.Exists(filename)) { - LoadYftFromFile(yft, filename); + await LoadYftFromFileAsync(yft, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } @@ -1345,69 +1345,70 @@ namespace CodeWalker.Project } if (File.Exists(filename)) { - LoadYtdFromFile(ytd, filename); + await LoadYtdFromFileAsync(ytd, filename); } else { - MessageBox.Show("Couldn't find file: " + filename); + MessageBox.Show($"Couldn't find file: {filename}"); } } LoadProjectUI(); } - public void CloseProject() + public async ValueTask CloseProject() { - if (CurrentProjectFile == null) return; + if (CurrentProjectFile is null) + return; foreach (var ymap in CurrentProjectFile.YmapFiles) { - if ((ymap != null) && (ymap.HasChanged)) + if (ymap is not null && ymap.HasChanged) { //save the current ymap first? - if (MessageBox.Show("Would you like to save " + ymap.Name + " before closing?", "Save .ymap before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) + if (MessageBox.Show($"Would you like to save {ymap.Name} before closing?", "Save .ymap before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) { CurrentYmapFile = ymap; - SaveYmap(); + await SaveYmap(); } } } foreach (var ytyp in CurrentProjectFile.YtypFiles) { - if ((ytyp != null) && (ytyp.HasChanged)) + if (ytyp is not null && ytyp.HasChanged) { //save the current ytyp first? - if (MessageBox.Show("Would you like to save " + ytyp.Name + " before closing?", "Save .ytyp before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) + if (MessageBox.Show($"Would you like to save {ytyp.Name} before closing?", "Save .ytyp before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) { CurrentYtypFile = ytyp; - SaveYtyp(); + await SaveYtyp(); } } } foreach (var ybn in CurrentProjectFile.YbnFiles) { - if ((ybn != null) && (ybn.HasChanged)) + if (ybn is not null && ybn.HasChanged) { //save the current ybn first? - if (MessageBox.Show("Would you like to save " + ybn.Name + " before closing?", "Save .ybn before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) + if (MessageBox.Show($"Would you like to save {ybn.Name} before closing?", "Save .ybn before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) { CurrentYbnFile = ybn; - SaveYbn(); + await SaveYbn(); } } } foreach (var ynd in CurrentProjectFile.YndFiles) { - if ((ynd != null) && (ynd.HasChanged)) + if (ynd is not null && ynd.HasChanged) { //save the current ynd first? - if (MessageBox.Show("Would you like to save " + ynd.Name + " before closing?", "Save .ynd before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) + if (MessageBox.Show($"Would you like to save {ynd.Name} before closing?", "Save .ynd before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) { CurrentYndFile = ynd; - SaveYnd(); + await SaveYnd(); } } } @@ -1417,20 +1418,20 @@ namespace CodeWalker.Project if ((ynv != null) && (ynv.HasChanged)) { //save the current ynv first? - if (MessageBox.Show("Would you like to save " + ynv.Name + " before closing?", "Save .ynv before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) + if (MessageBox.Show($"Would you like to save {ynv.Name} before closing?", "Save .ynv before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) { CurrentYnvFile = ynv; - SaveYnv(); + await SaveYnv(); } } } foreach (var trains in CurrentProjectFile.TrainsFiles) { - if ((trains != null) && (trains.HasChanged)) + if (trains is not null && trains.HasChanged) { //save the current trains file first? - if (MessageBox.Show("Would you like to save " + trains.Name + " before closing?", "Save trains file before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) + if (MessageBox.Show($"Would you like to save {trains.Name} before closing?", "Save trains file before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) { CurrentTrainTrack = trains; SaveTrainTrack(); @@ -1459,7 +1460,7 @@ namespace CodeWalker.Project if (MessageBox.Show("Would you like to save " + datrel.Name + " before closing?", "Save scenario file before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) { CurrentAudioFile = datrel; - SaveAudioFile(); + await SaveAudioFile(); } } } @@ -1470,11 +1471,11 @@ namespace CodeWalker.Project //save the current project first? if (MessageBox.Show("Would you like to save the current project before closing?", "Save project before closing?", MessageBoxButtons.YesNo) == DialogResult.Yes) { - SaveProject(); + await SaveProject(); } } - lock (projectsyncroot) + lock (ProjectSyncRoot) { CloseAllProjectItems(); @@ -1497,10 +1498,7 @@ namespace CodeWalker.Project } - if (WorldForm != null) - { - WorldForm.SelectItem(null);//make sure current selected item isn't still selected... - } + WorldForm?.SelectItem(null);//make sure current selected item isn't still selected... if (GameFileCache != null) { @@ -1509,14 +1507,16 @@ namespace CodeWalker.Project } } - public void SaveProject(bool saveas = false) + public async ValueTask SaveProject(bool saveas = false) { if (CurrentProjectFile == null) return; if (string.IsNullOrEmpty(CurrentProjectFile.Filepath) || saveas) { string fileName = ShowSaveDialog("CodeWalker Projects|*.cwproj", CurrentProjectFile.Filepath); if (string.IsNullOrEmpty(fileName)) - { return; } //user cancelled + { + return; + } //user cancelled string oldpath = CurrentProjectFile.Filepath; CurrentProjectFile.Filepath = fileName; @@ -1529,15 +1529,17 @@ namespace CodeWalker.Project SetProjectHasChanged(false); } - public void OpenFolder() + public async Task OpenFolder() { - if (FolderBrowserDialog.ShowDialogNew() != DialogResult.OK) return; + if (FolderBrowserDialog.ShowDialogNew() != DialogResult.OK) + return; + var folder = FolderBrowserDialog.SelectedPath; var files = Directory.GetFiles(folder, "*", SearchOption.AllDirectories); if (files == null) return; - if (files.Length > 100) + if (files.Length > 2000) { if (MessageBox.Show("This folder contains many files, loading may take a long time!\nAre you sure you want to continue?", "Large folder warning", MessageBoxButtons.YesNo) != DialogResult.Yes) { @@ -1545,11 +1547,21 @@ namespace CodeWalker.Project } } - OpenFiles(files); + await Task.Run(async () => + { + try + { + await OpenFiles(files); + } + catch(Exception ex) + { + Console.WriteLine(ex); + } + }); } - public void OpenFiles(string[] files = null) + public async ValueTask OpenFiles(string[]? files = null) { - if (files == null) + if (files is null) { string[] filetypes = { "All supported|*.ymap;*.ytyp;*.ybn;*.ydr;*.ydd;*.yft;*.ytd;*.ynd;*.ynv;*.dat;*.ymt;*.rel", @@ -1570,60 +1582,72 @@ namespace CodeWalker.Project files = ShowOpenDialogMulti(string.Join("|", filetypes), string.Empty); } - if (files == null) return; - if (files.Length == 0) return; - if (CurrentProjectFile == null) + if (files is null) return; + if (files.Length is 0) return; + + if (CurrentProjectFile is null) { - NewProject(); + await NewProjectAsync(); } var errorFiles = new List(); - foreach (var file in files) + await Parallel.ForAsync(0, files.Length, async (i, cancellationToken) => { + var file = files[i]; try { - if (!File.Exists(file)) continue; - var fl = file.ToLowerInvariant(); - var fn = Path.GetFileName(fl); - var ext = Path.GetExtension(fl); + if (!File.Exists(file)) + return; + + var fn = Path.GetFileName(file); + var ext = Path.GetExtension(file).ToLowerInvariant(); switch (ext) { case ".ymap": var ymap = CurrentProjectFile.AddYmapFile(file); - if (ymap != null) LoadYmapFromFile(ymap, file); + if (ymap is not null) + await LoadYmapFromFileAsync(ymap, file); break; case ".ytyp": var ytyp = CurrentProjectFile.AddYtypFile(file); - if (ytyp != null) LoadYtypFromFile(ytyp, file); + if (ytyp is not null) + await LoadYtypFromFileAsync(ytyp, file); break; case ".ybn": var ybn = CurrentProjectFile.AddYbnFile(file); - if (ybn != null) LoadYbnFromFile(ybn, file); + if (ybn is not null) + await LoadYbnFromFileAsync(ybn, file); break; case ".ydr": var ydr = CurrentProjectFile.AddYdrFile(file); - if (ydr != null) LoadYdrFromFile(ydr, file); + if (ydr is not null) + await LoadYdrFromFile(ydr, file); break; case ".ydd": var ydd = CurrentProjectFile.AddYddFile(file); - if (ydd != null) LoadYddFromFile(ydd, file); + if (ydd is not null) + await LoadYddFromFileAsync(ydd, file); break; case ".yft": var yft = CurrentProjectFile.AddYftFile(file); - if (yft != null) LoadYftFromFile(yft, file); + if (yft is not null) + await LoadYftFromFileAsync(yft, file); break; case ".ytd": var ytd = CurrentProjectFile.AddYtdFile(file); - if (ytd != null) LoadYtdFromFile(ytd, file); + if (ytd is not null) + await LoadYtdFromFileAsync(ytd, file); break; case ".ynd": var ynd = CurrentProjectFile.AddYndFile(file); - if (ynd != null) LoadYndFromFile(ynd, file); + if (ynd is not null) + await LoadYndFromFileAsync(ynd, file); break; case ".ynv": var ynv = CurrentProjectFile.AddYnvFile(file); - if (ynv != null) LoadYnvFromFile(ynv, file); + if (ynv is not null) + await LoadYnvFromFileAsync(ynv, file); break; case ".ymt": var ymtdata = File.ReadAllBytes(file); @@ -1638,26 +1662,29 @@ namespace CodeWalker.Project } break; case ".dat": - if (fn.StartsWith("trains", StringComparison.OrdinalIgnoreCase)) + if (fn.StartsWith("trains", StringComparison.InvariantCultureIgnoreCase)) { var track = CurrentProjectFile.AddTrainsFile(file); - if (track != null) LoadTrainTrackFromFile(track, file); + if (track is not null) + await LoadTrainTrackFromFileAsync(track, file); } break; case ".rel": - if (fn.EndsWith(".dat151.rel", StringComparison.OrdinalIgnoreCase)) + if (fn.EndsWith(".dat151.rel", StringComparison.InvariantCultureIgnoreCase)) { var dat151 = CurrentProjectFile.AddAudioRelFile(file); - if (dat151 != null) LoadAudioRelFromFile(dat151, file); + if (dat151 != null) + LoadAudioRelFromFile(dat151, file); } break; } } - catch + catch (Exception ex) { errorFiles.Add(file); + Console.WriteLine(ex); } - } + }); SetProjectHasChanged(true); LoadProjectTree(); @@ -1669,148 +1696,133 @@ namespace CodeWalker.Project } } - public void Save(bool saveas = false) + public async ValueTask Save(bool saveas = false) { - if (CurrentYmapFile != null) + if (CurrentYmapFile is not null) { - SaveYmap(saveas); + await SaveYmap(saveas); } - else if (CurrentYtypFile != null) + else if (CurrentYtypFile is not null) { - SaveYtyp(saveas); + await SaveYtyp(saveas); } - else if (CurrentYbnFile != null) + else if (CurrentYbnFile is not null) { - SaveYbn(saveas); + await SaveYbn(saveas); } - else if (CurrentYndFile != null) + else if (CurrentYndFile is not null) { - SaveYnd(saveas); + await SaveYnd(saveas); } - else if (CurrentYnvFile != null) + else if (CurrentYnvFile is not null) { - SaveYnv(saveas); + await SaveYnv(saveas); } - else if (CurrentTrainTrack != null) + else if (CurrentTrainTrack is not null) { SaveTrainTrack(saveas); } - else if (CurrentScenario != null) + else if (CurrentScenario is not null) { SaveScenario(saveas); } - else if (CurrentAudioFile != null) + else if (CurrentAudioFile is not null) { - SaveAudioFile(saveas); + await SaveAudioFile(saveas); } - else if (CurrentProjectFile != null) + else if (CurrentProjectFile is not null) { - SaveProject(saveas); + await SaveProject(saveas); } } - public void SaveAll() + public async ValueTask SaveAll() { - if (CurrentProjectFile != null) + if (CurrentProjectFile is null) { - if (CurrentProjectFile.YmapFiles != null) - { - var cymap = CurrentYmapFile; - foreach (var ymap in CurrentProjectFile.YmapFiles) - { - CurrentYmapFile = ymap; - SaveYmap(); - } - CurrentYmapFile = cymap; - //ShowEditYmapPanel(false); - } - - if (CurrentProjectFile.YtypFiles != null) - { - var cytyp = CurrentYtypFile; - foreach (var ytyp in CurrentProjectFile.YtypFiles) - { - CurrentYtypFile = ytyp; - SaveYtyp(); - } - CurrentYtypFile = cytyp; - //ShowEditYtypPanel(false); - } - - if (CurrentProjectFile.YbnFiles != null) - { - var cybn = CurrentYbnFile; - foreach (var ybn in CurrentProjectFile.YbnFiles) - { - CurrentYbnFile = ybn; - SaveYbn(); - } - CurrentYbnFile = cybn; - //ShowEditYbnPanel(false); - } - - if (CurrentProjectFile.YndFiles != null) - { - var cynd = CurrentYndFile; - foreach (var ynd in CurrentProjectFile.YndFiles) - { - CurrentYndFile = ynd; - SaveYnd(); - } - CurrentYndFile = cynd; - //ShowEditYndPanel(false); - } - - if (CurrentProjectFile.YnvFiles != null) - { - var cynv = CurrentYnvFile; - foreach (var ynv in CurrentProjectFile.YnvFiles) - { - CurrentYnvFile = ynv; - SaveYnv(); - } - CurrentYnvFile = cynv; - //ShowEditYnvPanel(false); - } - - if (CurrentProjectFile.TrainsFiles != null) - { - var ctrack = CurrentTrainTrack; - foreach (var track in CurrentProjectFile.TrainsFiles) - { - CurrentTrainTrack = track; - SaveYnd(); - } - CurrentTrainTrack = ctrack; - //ShowEditTrainTrackPanel(false); - } - - if (CurrentProjectFile.ScenarioFiles != null) - { - var cscen = CurrentScenario; - foreach (var scen in CurrentProjectFile.ScenarioFiles) - { - CurrentScenario = scen; - SaveScenario(); - } - CurrentScenario = cscen; - //ShowEditScenarioPanel(false); - } - - if (CurrentProjectFile.AudioRelFiles != null) - { - var caudf = CurrentAudioFile; - foreach (var audf in CurrentProjectFile.AudioRelFiles) - { - CurrentAudioFile = audf; - SaveAudioFile(); - } - CurrentAudioFile = caudf; - //ShowEditAudioFilePanel(false); - } - - - SaveProject(); + return; } + + var cymap = CurrentYmapFile; + foreach (var ymap in CurrentProjectFile.YmapFiles) + { + CurrentYmapFile = ymap; + await SaveYmap(); + } + CurrentYmapFile = cymap; + //ShowEditYmapPanel(false); + + + var cytyp = CurrentYtypFile; + foreach (var ytyp in CurrentProjectFile.YtypFiles) + { + CurrentYtypFile = ytyp; + await SaveYtyp(); + } + CurrentYtypFile = cytyp; + //ShowEditYtypPanel(false); + + + var cybn = CurrentYbnFile; + foreach (var ybn in CurrentProjectFile.YbnFiles) + { + CurrentYbnFile = ybn; + await SaveYbn(); + } + CurrentYbnFile = cybn; + //ShowEditYbnPanel(false); + + + var cynd = CurrentYndFile; + foreach (var ynd in CurrentProjectFile.YndFiles) + { + CurrentYndFile = ynd; + await SaveYnd(); + } + CurrentYndFile = cynd; + //ShowEditYndPanel(false); + + + var cynv = CurrentYnvFile; + foreach (var ynv in CurrentProjectFile.YnvFiles) + { + CurrentYnvFile = ynv; + await SaveYnv(); + } + CurrentYnvFile = cynv; + //ShowEditYnvPanel(false); + + + var ctrack = CurrentTrainTrack; + foreach (var track in CurrentProjectFile.TrainsFiles) + { + CurrentTrainTrack = track; + await SaveYnd(); + } + CurrentTrainTrack = ctrack; + //ShowEditTrainTrackPanel(false); + + + var cscen = CurrentScenario; + foreach (var scen in CurrentProjectFile.ScenarioFiles) + { + CurrentScenario = scen; + SaveScenario(); + } + CurrentScenario = cscen; + //ShowEditScenarioPanel(false); + + + var caudf = CurrentAudioFile; + foreach (var audf in CurrentProjectFile.AudioRelFiles) + { + CurrentAudioFile = audf; + await SaveAudioFile(); + } + CurrentAudioFile = caudf; + //ShowEditAudioFilePanel(false); + + + await SaveProject(); } @@ -1898,11 +1910,11 @@ namespace CodeWalker.Project - public void NewYmap() + public async ValueTask NewYmap() { if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (CurrentProjectFile == null) return; @@ -1911,15 +1923,15 @@ namespace CodeWalker.Project bool filenameok = false; while (!filenameok) { - fname = "map" + testi.ToString() + ".ymap"; + fname = $"map{testi}.ymap"; filenameok = !CurrentProjectFile.ContainsYmap(fname); testi++; } - lock (projectsyncroot) + lock (ProjectSyncRoot) { YmapFile ymap = CurrentProjectFile.AddYmapFile(fname); - if (ymap != null) + if (ymap is not null) { ymap.Loaded = true; ymap.HasChanged = true; //new ymap, flag as not saved @@ -1931,7 +1943,8 @@ namespace CodeWalker.Project LoadProjectTree(); } - public void SaveYmap(bool saveas = false) + + public async ValueTask SaveYmap(bool saveas = false) { if (CurrentYmapFile == null) return; string ymapname = CurrentYmapFile.Name; @@ -1949,14 +1962,14 @@ namespace CodeWalker.Project AutoUpdateYmapFlagsExtents(); byte[] data; - lock (projectsyncroot) //need to sync writes to ymap objects... + lock (ProjectSyncRoot) //need to sync writes to ymap objects... { saveas = saveas || string.IsNullOrEmpty(filepath); if (saveas) { filepath = ShowSaveDialog("Ymap files|*.ymap", filepath); if (string.IsNullOrEmpty(filepath)) - { return; } + return; } CurrentYmapFile.SetFilePath(filepath); @@ -1967,7 +1980,7 @@ namespace CodeWalker.Project if (data != null) { - File.WriteAllBytes(filepath, data); + await File.WriteAllBytesAsync(filepath, data); } SetYmapHasChanged(false); @@ -1998,14 +2011,17 @@ namespace CodeWalker.Project CurrentYmapFile.SaveWarnings = null;//clear it out for next time.. } } - public void AddYmapToProject(YmapFile ymap) + + public async ValueTask AddYmapToProjectAsync(YmapFile ymap) { if (ymap == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } - if (YmapExistsInProject(ymap)) return; + if (YmapExistsInProject(ymap)) + return; + if (CurrentProjectFile.AddYmapFile(ymap)) { ymap.HasChanged = true; @@ -2014,27 +2030,30 @@ namespace CodeWalker.Project } CurrentYmapFile = ymap; RefreshUI(); - if (CurrentEntity != null) + if (CurrentEntity is not null) { ProjectExplorer?.TrySelectEntityTreeNode(CurrentEntity); } - else if (CurrentCarGen != null) + else if (CurrentCarGen is not null) { ProjectExplorer?.TrySelectCarGenTreeNode(CurrentCarGen); } - else if (CurrentLodLight != null) + else if (CurrentLodLight is not null) { ProjectExplorer?.TrySelectLodLightTreeNode(CurrentLodLight); } - else if (CurrentGrassBatch != null) + else if (CurrentGrassBatch is not null) { ProjectExplorer?.TrySelectGrassBatchTreeNode(CurrentGrassBatch); } } public void RemoveYmapFromProject() { - if (CurrentYmapFile == null) return; - if (CurrentProjectFile == null) return; + if (CurrentYmapFile == null) + return; + if (CurrentProjectFile == null) + return; + GameFileCache?.RemoveProjectFile(CurrentYmapFile); CurrentProjectFile.RemoveYmapFile(CurrentYmapFile); CurrentYmapFile = null; LoadProjectTree(); @@ -2114,13 +2133,13 @@ namespace CodeWalker.Project cent.position = pos; - YmapEntityDef ent = new YmapEntityDef(CurrentYmapFile, 0, ref cent); + YmapEntityDef ent = new YmapEntityDef(CurrentYmapFile, 0, cent); ent.SetArchetype(GameFileCache.GetArchetype(cent.archetypeName)); if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddEntity(ent); } @@ -2176,7 +2195,7 @@ namespace CodeWalker.Project { YmapEntityDef ent = CurrentEntity; CurrentYmapFile.HasChanged = true; - AddYmapToProject(CurrentYmapFile); + AddYmapToProjectAsync(CurrentYmapFile); CurrentEntity = ent; //bug fix for some reason the treeview selects the project node here. CurrentYmapFile = ent.Ymap; @@ -2194,9 +2213,12 @@ namespace CodeWalker.Project private bool DeleteYmapEntity() { - if (CurrentEntity.Ymap != CurrentYmapFile) return false; - if (CurrentYmapFile.AllEntities == null) return false; //nothing to delete.. - if (CurrentYmapFile.RootEntities == null) return false; //nothing to delete.. + if (CurrentEntity.Ymap != CurrentYmapFile) + return false; + if (CurrentYmapFile.AllEntities == null || CurrentYmapFile.AllEntities.Length == 0) + return false; //nothing to delete.. + if (CurrentYmapFile.RootEntities == null) + return false; //nothing to delete.. if (CurrentEntity._CEntityDef.numChildren != 0) { @@ -2223,7 +2245,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentYmapFile.RemoveEntity(CurrentEntity); //WorldForm.SelectItem(null, null, null); @@ -2265,7 +2287,7 @@ namespace CodeWalker.Project if (CurrentYmapFile == null) return null; rage__fwGrassInstanceListDef fwBatch = new rage__fwGrassInstanceListDef(); - rage__fwGrassInstanceListDef__InstanceData[] instances = new rage__fwGrassInstanceListDef__InstanceData[0]; + rage__fwGrassInstanceListDef__InstanceData[] instances = Array.Empty(); if (copy != null) { @@ -2297,7 +2319,7 @@ namespace CodeWalker.Project if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddGrassBatch(batch); } @@ -2321,7 +2343,7 @@ namespace CodeWalker.Project if (!YmapExistsInProject(ymap)) { ymap.HasChanged = true; - AddYmapToProject(ymap); + AddYmapToProjectAsync(ymap); } } public void AddGrassBatchToProject() @@ -2333,7 +2355,7 @@ namespace CodeWalker.Project { var grassBatch = CurrentGrassBatch; CurrentYmapFile.HasChanged = true; - AddYmapToProject(CurrentYmapFile); + AddYmapToProjectAsync(CurrentYmapFile); CurrentGrassBatch = grassBatch; //bug fix for some reason the treeview selects the project node here. CurrentYmapFile = grassBatch.Ymap; @@ -2355,7 +2377,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentYmapFile.RemoveGrassBatch(CurrentGrassBatch); //WorldForm.SelectItem(null, null, null); @@ -2436,16 +2458,19 @@ namespace CodeWalker.Project return false; } - public void BulkEraseGrassInstancesAtMouse(SpaceRayIntersectResult mouseRay) => BulkEraseGrassInstancesAtMouse(mouseRay, (y) => true); - public void BulkEraseGrassInstancesAtMouse(SpaceRayIntersectResult mouseRay, Predicate ymapFilter) => BulkEraseGrassInstancesAtMouse(mouseRay, ymapFilter, (b) => true); - public void BulkEraseGrassInstancesAtMouse(SpaceRayIntersectResult mouseRay, Predicate ymapFilter, Predicate batchFilter) + public void BulkEraseGrassInstancesAtMouse(in SpaceRayIntersectResult mouseRay) => BulkEraseGrassInstancesAtMouse(mouseRay, (y) => true); + public void BulkEraseGrassInstancesAtMouse(in SpaceRayIntersectResult mouseRay, Predicate ymapFilter) => BulkEraseGrassInstancesAtMouse(mouseRay, ymapFilter, (b) => true); + public void BulkEraseGrassInstancesAtMouse(in SpaceRayIntersectResult mouseRay, Predicate ymapFilter, Predicate batchFilter) { - if (!mouseRay.Hit) return; + if (!mouseRay.Hit) + return; float radius = DeleteGrassPanel?.BrushRadius ?? 5f; var mouseSphere = new BoundingSphere(mouseRay.Position, radius); - if (WorldForm == null) return; - lock (WorldForm.RenderSyncRoot) + if (WorldForm is null) + return; + + using (WorldForm.RenderSyncRoot.WaitDisposable()) { foreach (var ymap in WorldForm.Renderer.VisibleYmaps) { @@ -2457,18 +2482,18 @@ namespace CodeWalker.Project var gb = ymap.GrassInstanceBatches[i]; if (!batchFilter(gb)) continue; - BoundingBox bbox = new BoundingBox(); - MapBox mb = new MapBox(); - mb.BBMin = gb.AABBMin; - mb.BBMax = gb.AABBMax; - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + BBMin = gb.AABBMin, + BBMax = gb.AABBMax, + Orientation = Quaternion.Identity, + Scale = Vector3.One, + }; - bbox.Minimum = mb.BBMin; - bbox.Maximum = mb.BBMax; + BoundingBox bbox = new BoundingBox(mb.BBMin, mb.BBMax); // do not continue if mouse position + radius is not in this instance's bounding box - if (!bbox.Intersects(mouseSphere)) continue; + if (!bbox.Intersects(ref mouseSphere)) continue; if (gb.EraseInstancesAtMouse(gb, mouseRay, radius)) { @@ -2517,7 +2542,7 @@ namespace CodeWalker.Project if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddCarGen(cg); } @@ -2546,7 +2571,7 @@ namespace CodeWalker.Project { var cargen = CurrentCarGen; CurrentYmapFile.HasChanged = true; - AddYmapToProject(CurrentYmapFile); + AddYmapToProjectAsync(CurrentYmapFile); CurrentCarGen = cargen; //bug fix for some reason the treeview selects the project node here. CurrentYmapFile = cargen.Ymap; @@ -2568,7 +2593,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentYmapFile.RemoveCarGen(CurrentCarGen); //WorldForm.SelectItem(null, null, null); @@ -2635,7 +2660,7 @@ namespace CodeWalker.Project if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddLodLight(yll); } @@ -2667,13 +2692,13 @@ namespace CodeWalker.Project var lodlight = CurrentLodLight; if (lodlight.DistLodLights?.Ymap != null) { - AddYmapToProject(lodlight.DistLodLights.Ymap); + AddYmapToProjectAsync(lodlight.DistLodLights.Ymap); CurrentYmapFile.HasChanged = true; } CurrentYmapFile = lodlight.Ymap; CurrentYmapFile.HasChanged = true; - AddYmapToProject(CurrentYmapFile); + AddYmapToProjectAsync(CurrentYmapFile); CurrentLodLight = lodlight; //bug fix for some reason the treeview selects the project node here. CurrentYmapFile = lodlight.Ymap; @@ -2698,7 +2723,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentYmapFile.RemoveLodLight(CurrentLodLight); //WorldForm.SelectItem(null, null, null); @@ -2765,7 +2790,7 @@ namespace CodeWalker.Project if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddBoxOccluder(bo); } @@ -2798,7 +2823,7 @@ namespace CodeWalker.Project CurrentYmapFile = box.Ymap; CurrentYmapFile.HasChanged = true; - AddYmapToProject(CurrentYmapFile); + AddYmapToProjectAsync(CurrentYmapFile); CurrentBoxOccluder = box; //bug fix for some reason the treeview selects the project node here. CurrentYmapFile = box.Ymap; @@ -2821,7 +2846,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentYmapFile.RemoveBoxOccluder(CurrentBoxOccluder); //WorldForm.SelectItem(null, null, null); @@ -2883,7 +2908,7 @@ namespace CodeWalker.Project if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddOccludeModel(om); } @@ -2916,7 +2941,7 @@ namespace CodeWalker.Project CurrentYmapFile = model.Ymap; CurrentYmapFile.HasChanged = true; - AddYmapToProject(CurrentYmapFile); + AddYmapToProjectAsync(CurrentYmapFile); CurrentOccludeModel = model; //bug fix for some reason the treeview selects the project node here. CurrentYmapFile = model.Ymap; @@ -2925,9 +2950,12 @@ namespace CodeWalker.Project } public bool DeleteOccludeModel() { - if (CurrentYmapFile == null) return false; - if (CurrentOccludeModel == null) return false; - if (CurrentOccludeModel.Ymap != CurrentYmapFile) return false; + if (CurrentYmapFile == null) + return false; + if (CurrentOccludeModel is null) + return false; + if (CurrentOccludeModel.Ymap != CurrentYmapFile) + return false; //if (MessageBox.Show("Are you sure you want to delete this occlude model?\n" + CurrentOccludeModel.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) //{ @@ -2939,7 +2967,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentYmapFile.RemoveOccludeModel(CurrentOccludeModel); //WorldForm.SelectItem(null, null, null); @@ -3001,7 +3029,7 @@ namespace CodeWalker.Project if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddOccludeModelTriangle(ot); } @@ -3035,7 +3063,7 @@ namespace CodeWalker.Project CurrentYmapFile = tri.Ymap; CurrentYmapFile.HasChanged = true; - AddYmapToProject(CurrentYmapFile); + AddYmapToProjectAsync(CurrentYmapFile); CurrentOccludeModelTri = tri; //bug fix for some reason the treeview selects the project node here. CurrentOccludeModel = tri.Model; @@ -3059,7 +3087,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentYmapFile.RemoveOccludeModelTriangle(CurrentOccludeModelTri); //WorldForm.SelectItem(null, null, null); @@ -3100,7 +3128,7 @@ namespace CodeWalker.Project { if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } var xmlpath = ShowOpenDialog("XML Files|*.xml", string.Empty); @@ -3182,7 +3210,7 @@ namespace CodeWalker.Project if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddCarGen(cg); } @@ -3214,13 +3242,13 @@ namespace CodeWalker.Project cent.tintValue = tint; } - YmapEntityDef ent = new YmapEntityDef(CurrentYmapFile, 0, ref cent); + YmapEntityDef ent = new YmapEntityDef(CurrentYmapFile, 0, cent); ent.SetArchetype(GameFileCache.GetArchetype(cent.archetypeName)); if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { CurrentYmapFile.AddEntity(ent); } @@ -3261,25 +3289,26 @@ namespace CodeWalker.Project - public void NewYtyp() + public async ValueTask NewYtyp() { - if (CurrentProjectFile == null) + if (CurrentProjectFile is null) { - NewProject(); + await NewProjectAsync(); } - if (CurrentProjectFile == null) return; + if (CurrentProjectFile is null) + return; int testi = 1; string fname = string.Empty; bool filenameok = false; while (!filenameok) { - fname = "types" + testi.ToString() + ".ytyp"; + fname = $"types{testi}.ytyp"; filenameok = !CurrentProjectFile.ContainsYtyp(fname); testi++; } - lock (projectsyncroot) + lock (ProjectSyncRoot) { YtypFile ytyp = CurrentProjectFile.AddYtypFile(fname); if (ytyp != null) @@ -3293,9 +3322,10 @@ namespace CodeWalker.Project LoadProjectTree(); } - public void SaveYtyp(bool saveas = false) + public async ValueTask SaveYtyp(bool saveas = false) { - if (CurrentYtypFile == null) return; + if (CurrentYtypFile == null) + return; string ytypname = CurrentYtypFile.Name; string filepath = CurrentYtypFile.FilePath; if (string.IsNullOrEmpty(filepath)) @@ -3310,7 +3340,7 @@ namespace CodeWalker.Project byte[] data; - lock (projectsyncroot) //need to sync writes to ytyp objects... + lock (ProjectSyncRoot) //need to sync writes to ytyp objects... { saveas = saveas || string.IsNullOrEmpty(filepath); if (saveas) @@ -3332,16 +3362,16 @@ namespace CodeWalker.Project } - if (data != null) + if (data is not null) { - File.WriteAllBytes(filepath, data); + await File.WriteAllBytesAsync(filepath, data); } SetYtypHasChanged(false); if (saveas) { - if (CurrentProjectFile != null) + if (CurrentProjectFile is not null) { string origpath = CurrentProjectFile.GetRelativePath(origfile); string newpath = CurrentProjectFile.GetRelativePath(CurrentYtypFile.FilePath); @@ -3357,7 +3387,7 @@ namespace CodeWalker.Project SetCurrentSaveItem(); } - if (CurrentYtypFile.SaveWarnings != null) + if (CurrentYtypFile.SaveWarnings is not null) { string w = string.Join("\n", CurrentYtypFile.SaveWarnings); MessageBox.Show(CurrentYtypFile.SaveWarnings.Count.ToString() + " warnings were generated while saving the ytyp:\n" + w); @@ -3366,26 +3396,32 @@ namespace CodeWalker.Project } public void AddYtypToProject(YtypFile ytyp) { - if (ytyp == null) return; - if (CurrentProjectFile == null) + if (ytyp is null) + return; + if (CurrentProjectFile is null) { - NewProject(); + NewProjectAsync(); } - if (YtypExistsInProject(ytyp)) return; + if (YtypExistsInProject(ytyp)) + return; + if (CurrentProjectFile.AddYtypFile(ytyp)) { ytyp.HasChanged = true; CurrentProjectFile.HasChanged = true; LoadProjectTree(); } + CurrentYtypFile = ytyp; RefreshUI(); AddProjectArchetypes(ytyp); } public void RemoveYtypFromProject() { - if (CurrentYtypFile == null) return; - if (CurrentProjectFile == null) return; + if (CurrentYtypFile is null) + return; + if (CurrentProjectFile is null) + return; RemoveProjectArchetypes(CurrentYtypFile); CurrentProjectFile.RemoveYtypFile(CurrentYtypFile); CurrentYtypFile = null; @@ -3394,14 +3430,17 @@ namespace CodeWalker.Project } public bool YtypExistsInProject(YtypFile ytyp) { - if (ytyp == null) return false; - if (CurrentProjectFile == null) return false; + if (ytyp is null) + return false; + if (CurrentProjectFile is null) + return false; return CurrentProjectFile.ContainsYtyp(ytyp); } public Archetype NewArchetype(Archetype copy = null) { - if (CurrentYtypFile == null) return null; + if (CurrentYtypFile == null) + return null; var archetype = CurrentYtypFile.AddArchetype(); var archetypeDef = archetype._BaseArchetypeDef; if (copy == null) @@ -3411,7 +3450,7 @@ namespace CodeWalker.Project } if (copy != null) { - archetype.Init(CurrentYtypFile, ref copy._BaseArchetypeDef); + archetype.Init(CurrentYtypFile, in copy._BaseArchetypeDef); } archetype._BaseArchetypeDef = archetypeDef; @@ -3561,14 +3600,14 @@ namespace CodeWalker.Project cent.rotation = rot.ToVector4(); var createindex = mloArch.entities.Length; - var ment = new MCEntityDef(ref cent, mloArch); + var ment = new MCEntityDef(in cent, mloArch); var outEnt = mloInstance.CreateYmapEntity(mloInstance.Owner, ment, createindex); try { if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { mloArch.AddEntity(outEnt, roomIndex, portalIndex, entsetIndex); mloInstance.AddEntity(outEnt); @@ -3585,6 +3624,7 @@ namespace CodeWalker.Project catch (Exception e) { MessageBox.Show(this, e.Message, "Create MLO Entity Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + Console.WriteLine(e); return null; } @@ -3667,11 +3707,6 @@ namespace CodeWalker.Project mlo.AddPortal(portal); - var mloInstance = TryGetMloInstance(mlo); - if (mloInstance != null) - { - } - LoadProjectTree(); ProjectExplorer?.TrySelectMloPortalTreeNode(portal); CurrentMloPortal = portal; @@ -3682,7 +3717,8 @@ namespace CodeWalker.Project public MCMloEntitySet NewMloEntitySet(MCMloEntitySet copy = null) { var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype); - if (mlo == null) return null; + if (mlo == null) + return null; if (copy == null) { @@ -3711,7 +3747,7 @@ namespace CodeWalker.Project LoadProjectTree(); ProjectExplorer?.TrySelectMloEntitySetTreeNode(set); CurrentMloEntitySet = set; - CurrentYtypFile = set?.OwnerMlo?.Ytyp; + CurrentYtypFile = set.OwnerMlo?.Ytyp; return set; } @@ -3728,7 +3764,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentArchetype.Ytyp.RemoveArchetype(CurrentArchetype); //WorldForm.SelectItem(null, null, null); @@ -3797,7 +3833,7 @@ namespace CodeWalker.Project { if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { mloArchetype.RemoveEntity(delent); mloInstance.DeleteEntity(delent); @@ -3919,7 +3955,8 @@ namespace CodeWalker.Project private void AddProjectArchetypes(YtypFile ytyp) { - if (ytyp?.AllArchetypes == null) return; + if (ytyp is null) + return; foreach (var arch in ytyp.AllArchetypes) { AddProjectArchetype(arch); @@ -3927,14 +3964,15 @@ namespace CodeWalker.Project } private void AddProjectArchetype(Archetype arch) { - lock (projectsyncroot) + lock (ProjectSyncRoot) { GameFileCache.AddProjectArchetype(arch); } } private void RemoveProjectArchetypes(YtypFile ytyp) { - if (ytyp?.AllArchetypes == null) return; + if (ytyp is null) + return; foreach (var arch in ytyp.AllArchetypes) { RemoveProjectArchetype(arch); @@ -3942,7 +3980,7 @@ namespace CodeWalker.Project } private void RemoveProjectArchetype(Archetype arch) { - lock (projectsyncroot) + lock (ProjectSyncRoot) { GameFileCache.RemoveProjectArchetype(arch); } @@ -3954,11 +3992,11 @@ namespace CodeWalker.Project - public void NewYbn() + public async ValueTask NewYbn() { if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (CurrentProjectFile == null) return; @@ -3972,7 +4010,7 @@ namespace CodeWalker.Project testi++; } - lock (projectsyncroot) + lock (ProjectSyncRoot) { YbnFile ybn = CurrentProjectFile.AddYbnFile(fname); if (ybn != null) @@ -3986,10 +4024,13 @@ namespace CodeWalker.Project LoadProjectTree(); } - public void SaveYbn(bool saveas = false) + public async ValueTask SaveYbn(bool saveas = false) { - if ((CurrentYbnFile == null) && (CurrentCollisionBounds != null)) CurrentYbnFile = CurrentCollisionBounds.GetRootYbn(); - if (CurrentYbnFile == null) return; + if ((CurrentYbnFile == null) && (CurrentCollisionBounds != null)) + CurrentYbnFile = CurrentCollisionBounds.GetRootYbn(); + + if (CurrentYbnFile == null) + return; string ybnname = CurrentYbnFile.Name; @@ -4006,7 +4047,7 @@ namespace CodeWalker.Project byte[] data; - lock (projectsyncroot) //need to sync writes to ybn objects... + lock (ProjectSyncRoot) //need to sync writes to ybn objects... { saveas = saveas || string.IsNullOrEmpty(filepath); if (saveas) @@ -4029,7 +4070,7 @@ namespace CodeWalker.Project if (data != null) { - File.WriteAllBytes(filepath, data); + await File.WriteAllBytesAsync(filepath, data); } SetYbnHasChanged(false); @@ -4057,7 +4098,7 @@ namespace CodeWalker.Project if (ybn == null) return; if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (YbnExistsInProject(ybn)) return; if (CurrentProjectFile.AddYbnFile(ybn)) @@ -4246,7 +4287,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { if (parent != null) { @@ -4303,8 +4344,7 @@ namespace CodeWalker.Project public BoundPolygon NewCollisionPoly(BoundPolygonType type, BoundPolygon copy = null, bool copyPosition = false, bool selectNew = true) { - var bgeom = CurrentCollisionBounds as BoundGeometry; - if (bgeom == null) return null; + if (CurrentCollisionBounds is not BoundGeometry bgeom) return null; var poly = bgeom.AddPolygon(type); @@ -4313,11 +4353,6 @@ namespace CodeWalker.Project var pcap = poly as BoundPolygonCapsule; var pbox = poly as BoundPolygonBox; var pcyl = poly as BoundPolygonCylinder; - var ctri = copy as BoundPolygonTriangle; - var csph = copy as BoundPolygonSphere; - var ccap = copy as BoundPolygonCapsule; - var cbox = copy as BoundPolygonBox; - var ccyl = copy as BoundPolygonCylinder; if (ptri != null) { @@ -4333,7 +4368,7 @@ namespace CodeWalker.Project switch (type) { case BoundPolygonType.Triangle: - if ((ptri != null) && (ctri != null)) + if ((ptri != null) && (copy is BoundPolygonTriangle ctri)) { ptri.vertFlag1 = ctri.vertFlag1; ptri.vertFlag2 = ctri.vertFlag2; @@ -4341,24 +4376,24 @@ namespace CodeWalker.Project } break; case BoundPolygonType.Sphere: - if ((psph != null) && (csph != null)) + if ((psph != null) && (copy is BoundPolygonSphere csph)) { psph.sphereRadius = csph.sphereRadius; } break; case BoundPolygonType.Capsule: - if ((pcap != null) && (ccap != null)) + if ((pcap != null) && (copy is BoundPolygonCapsule ccap)) { pcap.capsuleRadius = ccap.capsuleRadius; } break; case BoundPolygonType.Box: - if ((pbox != null) && (cbox != null)) + if ((pbox != null) && (copy is BoundPolygonBox cbox)) { } break; case BoundPolygonType.Cylinder: - if ((pcyl != null) && (ccyl != null)) + if ((pcyl != null) && (copy is BoundPolygonCylinder ccyl)) { pcyl.cylinderRadius = ccyl.cylinderRadius; } @@ -4459,7 +4494,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentCollisionPoly.Owner.DeletePolygon(CurrentCollisionPoly); //WorldForm.SelectItem(null, null, null); @@ -4539,7 +4574,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentCollisionVertex.Owner.DeleteVertex(CurrentCollisionVertex.Index); //WorldForm.SelectItem(null, null, null); @@ -4580,11 +4615,11 @@ namespace CodeWalker.Project - public void NewYnd() + public async ValueTask NewYnd() { if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (CurrentProjectFile == null) return; @@ -4593,12 +4628,12 @@ namespace CodeWalker.Project bool filenameok = false; while (!filenameok) { - fname = "nodes" + testi.ToString() + ".ynd"; + fname = $"nodes{testi}.ynd"; filenameok = !CurrentProjectFile.ContainsYnd(fname); testi++; } - lock (projectsyncroot) + lock (ProjectSyncRoot) { YndFile ynd = CurrentProjectFile.AddYndFile(fname); if (ynd != null) @@ -4615,7 +4650,7 @@ namespace CodeWalker.Project LoadProjectTree(); } - public void SaveYnd(bool saveas = false) + public async ValueTask SaveYnd(bool saveas = false) { if ((CurrentYndFile == null) && (CurrentPathNode != null)) CurrentYndFile = CurrentPathNode.Ynd; if (CurrentYndFile == null) return; @@ -4634,7 +4669,7 @@ namespace CodeWalker.Project byte[] data; - lock (projectsyncroot) //need to sync writes to ynd objects... + lock (ProjectSyncRoot) //need to sync writes to ynd objects... { saveas = saveas || string.IsNullOrEmpty(filepath); if (saveas) @@ -4657,7 +4692,7 @@ namespace CodeWalker.Project if (data != null) { - File.WriteAllBytes(filepath, data); + await File.WriteAllBytesAsync(filepath, data); } SetYndHasChanged(false); @@ -4685,7 +4720,7 @@ namespace CodeWalker.Project if (ynd == null) return; if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (YndExistsInProject(ynd)) return; if (CurrentProjectFile.AddYndFile(ynd)) @@ -4809,10 +4844,10 @@ namespace CodeWalker.Project //} bool res = false; - YndFile[] affectedFiles = new YndFile[0]; + YndFile[] affectedFiles = Array.Empty(); if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentYndFile.RemoveYndNode(WorldForm.Space, CurrentPathNode, true, out affectedFiles); @@ -4867,25 +4902,26 @@ namespace CodeWalker.Project - public void NewYnv() + public async ValueTask NewYnv() { - if (CurrentProjectFile == null) + if (CurrentProjectFile is null) { - NewProject(); + await NewProjectAsync(); } - if (CurrentProjectFile == null) return; + if (CurrentProjectFile is null) + return; int testi = 1; string fname = string.Empty; bool filenameok = false; while (!filenameok) { - fname = "navmesh" + testi.ToString() + ".ynv"; + fname = $"navmesh{testi}.ynv"; filenameok = !CurrentProjectFile.ContainsYnv(fname); testi++; } - lock (projectsyncroot) + lock (ProjectSyncRoot) { YnvFile ynv = CurrentProjectFile.AddYnvFile(fname); if (ynv != null) @@ -4902,10 +4938,14 @@ namespace CodeWalker.Project LoadProjectTree(); } - public void SaveYnv(bool saveas = false) + public async ValueTask SaveYnv(bool saveas = false) { - if ((CurrentYnvFile == null) && (CurrentNavPoly != null)) CurrentYnvFile = CurrentNavPoly.Ynv; - if (CurrentYnvFile == null) return; + if (CurrentYnvFile is null && CurrentNavPoly is not null) + CurrentYnvFile = CurrentNavPoly.Ynv; + + if (CurrentYnvFile is null) + return; + string ynvname = CurrentYnvFile.Name; string filepath = CurrentYnvFile.FilePath; if (string.IsNullOrEmpty(filepath)) @@ -4920,7 +4960,7 @@ namespace CodeWalker.Project byte[] data; - lock (projectsyncroot) //need to sync writes to ynv objects... + lock (ProjectSyncRoot) //need to sync writes to ynv objects... { saveas = saveas || string.IsNullOrEmpty(filepath); if (saveas) @@ -4943,7 +4983,7 @@ namespace CodeWalker.Project if (data != null) { - File.WriteAllBytes(filepath, data); + await File.WriteAllBytesAsync(filepath, data); } SetYnvHasChanged(false); @@ -4970,7 +5010,7 @@ namespace CodeWalker.Project if (ynv == null) return; if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (YnvExistsInProject(ynv)) return; if (CurrentProjectFile.AddYnvFile(ynv)) @@ -5048,11 +5088,11 @@ namespace CodeWalker.Project - public void NewTrainTrack() + public async ValueTask NewTrainTrack() { if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (CurrentProjectFile == null) return; @@ -5066,7 +5106,7 @@ namespace CodeWalker.Project testi++; } - lock (projectsyncroot) + lock (ProjectSyncRoot) { TrainTrack track = CurrentProjectFile.AddTrainsFile(fname); if (track != null) @@ -5101,7 +5141,7 @@ namespace CodeWalker.Project byte[] data; - lock (projectsyncroot) //need to sync writes to objects... + lock (ProjectSyncRoot) //need to sync writes to objects... { saveas = saveas || string.IsNullOrEmpty(filepath); if (saveas) @@ -5152,7 +5192,7 @@ namespace CodeWalker.Project if (track == null) return; if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (TrainTrackExistsInProject(track)) return; if (CurrentProjectFile.AddTrainsFile(track)) @@ -5240,7 +5280,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentTrainTrack.RemoveNode(CurrentTrainNode); @@ -5285,11 +5325,11 @@ namespace CodeWalker.Project - public void NewScenario() + public async ValueTask NewScenario() { if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (CurrentProjectFile == null) return; @@ -5298,12 +5338,12 @@ namespace CodeWalker.Project bool filenameok = false; while (!filenameok) { - fname = "scenario" + testi.ToString() + ".ymt"; + fname = $"scenario{testi}.ymt"; filenameok = !CurrentProjectFile.ContainsScenario(fname); testi++; } - lock (projectsyncroot) + lock (ProjectSyncRoot) { YmtFile ymt = CurrentProjectFile.AddScenarioFile(fname); if (ymt != null) @@ -5349,7 +5389,7 @@ namespace CodeWalker.Project byte[] data; - lock (projectsyncroot) //need to sync writes to scenario... + lock (ProjectSyncRoot) //need to sync writes to scenario... { saveas = saveas || string.IsNullOrEmpty(filepath); if (saveas) @@ -5372,7 +5412,7 @@ namespace CodeWalker.Project } - if (data != null) + if (data is not null && data.Length > 0) { File.WriteAllBytes(filepath, data); } @@ -5398,10 +5438,11 @@ namespace CodeWalker.Project } public void AddScenarioToProject(YmtFile ymt) { - if (ymt == null) return; - if (CurrentProjectFile == null) + if (ymt is null) + return; + if (CurrentProjectFile is null) { - NewProject(); + NewProjectAsync(); } if (ScenarioExistsInProject(ymt)) return; if (CurrentProjectFile.AddScenarioFile(ymt)) @@ -5489,7 +5530,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentScenario.ScenarioRegion.RemoveNode(CurrentScenarioNode); } @@ -6270,11 +6311,11 @@ namespace CodeWalker.Project - public void NewAudioFile() + public async ValueTask NewAudioFile() { if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (CurrentProjectFile == null) return; @@ -6283,12 +6324,12 @@ namespace CodeWalker.Project bool filenameok = false; while (!filenameok) { - fname = "dlc" + testi.ToString() + "_game.dat151.rel"; + fname = $"dlc{testi}_game.dat151.rel"; filenameok = !CurrentProjectFile.ContainsAudioRel(fname); testi++; } - lock (projectsyncroot) + lock (ProjectSyncRoot) { RelFile rel = CurrentProjectFile.AddAudioRelFile(fname); if (rel != null) @@ -6302,9 +6343,10 @@ namespace CodeWalker.Project LoadProjectTree(); } - public void SaveAudioFile(bool saveas = false) + public async Task SaveAudioFile(bool saveas = false) { - if (CurrentAudioFile == null) return; + if (CurrentAudioFile == null) + return; string relname = CurrentAudioFile.Name; string filepath = CurrentAudioFile.FilePath; if (string.IsNullOrEmpty(filepath)) @@ -6319,7 +6361,7 @@ namespace CodeWalker.Project byte[] data; - lock (projectsyncroot) //need to sync writes to scenario... + lock (ProjectSyncRoot) //need to sync writes to scenario... { saveas = saveas || string.IsNullOrEmpty(filepath); if (saveas) @@ -6340,9 +6382,9 @@ namespace CodeWalker.Project data = CurrentAudioFile.Save(); } - if (data != null) + if (data is not null && data.Length > 0) { - File.WriteAllBytes(filepath, data); + await File.WriteAllBytesAsync(filepath, data); } SetAudioFileHasChanged(false); @@ -6364,14 +6406,16 @@ namespace CodeWalker.Project SetCurrentSaveItem(); } } - public void AddAudioFileToProject(RelFile rel) + public async ValueTask AddAudioFileToProject(RelFile rel) { - if (rel == null) return; + if (rel == null) + return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } - if (AudioFileExistsInProject(rel)) return; + if (AudioFileExistsInProject(rel)) + return; if (CurrentProjectFile.AddAudioRelFile(rel)) { rel.HasChanged = true; @@ -6391,8 +6435,10 @@ namespace CodeWalker.Project } public void RemoveAudioFileFromProject() { - if (CurrentAudioFile == null) return; - if (CurrentProjectFile == null) return; + if (CurrentAudioFile == null) + return; + if (CurrentProjectFile == null) + return; CurrentProjectFile.RemoveAudioRelFile(CurrentAudioFile); CurrentAudioFile = null; LoadProjectTree(); @@ -6400,8 +6446,10 @@ namespace CodeWalker.Project } public bool AudioFileExistsInProject(RelFile rel) { - if (rel == null) return false; - if (CurrentProjectFile == null) return false; + if (rel == null) + return false; + if (CurrentProjectFile == null) + return false; return CurrentProjectFile.ContainsAudioRel(rel); } @@ -6480,10 +6528,12 @@ namespace CodeWalker.Project } public bool DeleteAudioZone() { - if (CurrentAudioZone?.RelFile != CurrentAudioFile) return false; - if (CurrentAudioFile?.RelDatas == null) return false; //nothing to delete.. - if (CurrentAudioFile?.RelDatasSorted == null) return false; //nothing to delete.. - if (CurrentAudioZone?.AudioZone == null) return false; + if (CurrentAudioZone?.RelFile != CurrentAudioFile) + return false; + if (CurrentAudioFile?.RelDatas == null || CurrentAudioFile.RelDatas.Length == 0) + return false; //nothing to delete.. + if (CurrentAudioZone?.AudioZone == null) + return false; //if (MessageBox.Show("Are you sure you want to delete this audio zone?\n" + CurrentAudioZone.GetNameString() + "\n" + CurrentAudioZone.Position.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) @@ -6494,7 +6544,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentAudioFile.RemoveRelData(CurrentAudioZone.AudioZone); @@ -6596,10 +6646,12 @@ namespace CodeWalker.Project } public bool DeleteAudioEmitter() { - if (CurrentAudioEmitter?.RelFile != CurrentAudioFile) return false; - if (CurrentAudioFile?.RelDatas == null) return false; //nothing to delete.. - if (CurrentAudioFile?.RelDatasSorted == null) return false; //nothing to delete.. - if (CurrentAudioEmitter?.AudioEmitter == null) return false; + if (CurrentAudioEmitter?.RelFile != CurrentAudioFile) + return false; + if (CurrentAudioFile?.RelDatas == null || CurrentAudioFile.RelDatas.Length == 0) + return false; //nothing to delete.. + if (CurrentAudioEmitter?.AudioEmitter == null) + return false; //if (MessageBox.Show("Are you sure you want to delete this audio emitter?\n" + CurrentAudioEmitter.GetNameString() + "\n" + CurrentAudioEmitter.Position.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) @@ -6610,7 +6662,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentAudioFile.RemoveRelData(CurrentAudioEmitter.AudioEmitter); @@ -6670,9 +6722,10 @@ namespace CodeWalker.Project } public bool DeleteAudioZoneList() { - if (CurrentAudioZoneList?.Rel != CurrentAudioFile) return false; - if (CurrentAudioFile?.RelDatas == null) return false; //nothing to delete.. - if (CurrentAudioFile?.RelDatasSorted == null) return false; //nothing to delete.. + if (CurrentAudioZoneList?.Rel != CurrentAudioFile) + return false; + if (CurrentAudioFile?.RelDatas == null || CurrentAudioFile.RelDatas.Length == 0) + return false; //nothing to delete.. //if (MessageBox.Show("Are you sure you want to delete this audio zone list?\n" + CurrentAudioZoneList.GetNameString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) @@ -6683,7 +6736,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentAudioFile.RemoveRelData(CurrentAudioZoneList); //WorldForm.SelectItem(null, null, null); @@ -6737,9 +6790,10 @@ namespace CodeWalker.Project } public bool DeleteAudioEmitterList() { - if (CurrentAudioEmitterList?.Rel != CurrentAudioFile) return false; - if (CurrentAudioFile?.RelDatas == null) return false; //nothing to delete.. - if (CurrentAudioFile?.RelDatasSorted == null) return false; //nothing to delete.. + if (CurrentAudioEmitterList?.Rel != CurrentAudioFile) + return false; + if (CurrentAudioFile?.RelDatas == null || CurrentAudioFile.RelDatas.Length == 0) + return false; //nothing to delete.. //if (MessageBox.Show("Are you sure you want to delete this audio emitter list?\n" + CurrentAudioEmitterList.GetNameString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) @@ -6750,7 +6804,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentAudioFile.RemoveRelData(CurrentAudioEmitterList); //WorldForm.SelectItem(null, null, null); @@ -6806,9 +6860,10 @@ namespace CodeWalker.Project } public bool DeleteAudioInterior() { - if (CurrentAudioInterior?.Rel != CurrentAudioFile) return false; - if (CurrentAudioFile?.RelDatas == null) return false; //nothing to delete.. - if (CurrentAudioFile?.RelDatasSorted == null) return false; //nothing to delete.. + if (CurrentAudioInterior?.Rel != CurrentAudioFile) + return false; + if (CurrentAudioFile?.RelDatas == null || CurrentAudioFile.RelDatas.Length == 0) + return false; //nothing to delete.. if (MessageBox.Show("Are you sure you want to delete this audio interior?\n" + CurrentAudioInterior.GetNameString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) @@ -6819,7 +6874,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentAudioFile.RemoveRelData(CurrentAudioInterior); //WorldForm.SelectItem(null, null, null); @@ -6877,9 +6932,10 @@ namespace CodeWalker.Project } public bool DeleteAudioInteriorRoom() { - if (CurrentAudioInteriorRoom?.Rel != CurrentAudioFile) return false; - if (CurrentAudioFile?.RelDatas == null) return false; //nothing to delete.. - if (CurrentAudioFile?.RelDatasSorted == null) return false; //nothing to delete.. + if (CurrentAudioInteriorRoom?.Rel != CurrentAudioFile) + return false; + if (CurrentAudioFile?.RelDatas == null || CurrentAudioFile.RelDatas.Length == 0) + return false; //nothing to delete.. if (MessageBox.Show("Are you sure you want to delete this audio interior room?\n" + CurrentAudioInteriorRoom.GetNameString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) @@ -6890,7 +6946,7 @@ namespace CodeWalker.Project bool res = false; if (WorldForm != null) { - lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering... + using (WorldForm.RenderSyncRoot.WaitDisposable()) //don't try to do this while rendering... { res = CurrentAudioFile.RemoveRelData(CurrentAudioInteriorRoom); //WorldForm.SelectItem(null, null, null); @@ -6928,12 +6984,12 @@ namespace CodeWalker.Project - public void AddYdrToProject(YdrFile ydr) + public async ValueTask AddYdrToProject(YdrFile ydr) { if (ydr == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (YdrExistsInProject(ydr)) return; if (CurrentProjectFile.AddYdrFile(ydr)) @@ -6964,14 +7020,15 @@ namespace CodeWalker.Project } - public void AddYddToProject(YddFile ydd) + public async ValueTask AddYddToProject(YddFile ydd) { if (ydd == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } - if (YddExistsInProject(ydd)) return; + if (YddExistsInProject(ydd)) + return; if (CurrentProjectFile.AddYddFile(ydd)) { //ydd.HasChanged = true; @@ -6984,8 +7041,10 @@ namespace CodeWalker.Project } public void RemoveYddFromProject() { - if (CurrentYddFile == null) return; - if (CurrentProjectFile == null) return; + if (CurrentYddFile == null) + return; + if (CurrentProjectFile == null) + return; GameFileCache?.RemoveProjectFile(CurrentYddFile); CurrentProjectFile.RemoveYddFile(CurrentYddFile); CurrentYddFile = null; @@ -7000,12 +7059,12 @@ namespace CodeWalker.Project } - public void AddYftToProject(YftFile yft) + public async ValueTask AddYftToProject(YftFile yft) { if (yft == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (YftExistsInProject(yft)) return; if (CurrentProjectFile.AddYftFile(yft)) @@ -7020,8 +7079,10 @@ namespace CodeWalker.Project } public void RemoveYftFromProject() { - if (CurrentYftFile == null) return; - if (CurrentProjectFile == null) return; + if (CurrentYftFile == null) + return; + if (CurrentProjectFile == null) + return; GameFileCache?.RemoveProjectFile(CurrentYftFile); CurrentProjectFile.RemoveYftFile(CurrentYftFile); CurrentYftFile = null; @@ -7030,20 +7091,23 @@ namespace CodeWalker.Project } public bool YftExistsInProject(YftFile yft) { - if (yft == null) return false; - if (CurrentProjectFile == null) return false; + if (yft == null) + return false; + if (CurrentProjectFile == null) + return false; return CurrentProjectFile.ContainsYft(yft); } - public void AddYtdToProject(YtdFile ytd) + public async ValueTask AddYtdToProject(YtdFile ytd) { if (ytd == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } - if (YtdExistsInProject(ytd)) return; + if (YtdExistsInProject(ytd)) + return; if (CurrentProjectFile.AddYtdFile(ytd)) { //ytd.HasChanged = true; @@ -7089,55 +7153,64 @@ namespace CodeWalker.Project ymaps.Clear(); //remove all the gtav ymaps. } - lock (projectsyncroot) + if (CurrentProjectFile is null) + return; + + if (!renderitems || CurrentProjectFile is null) + return; + if (CurrentProjectFile.YmapFiles.Count == 0 && CurrentProjectFile.YtypFiles.Count == 0) { - if (CurrentProjectFile == null) return; - var hasymapytyp = ((CurrentProjectFile.YmapFiles.Count > 0) || (CurrentProjectFile.YtypFiles.Count > 0)); - if (renderitems && hasymapytyp) + return; + } + + lock (ProjectSyncRoot) + { + lock(CurrentProjectFile.YmapFiles) { - for (int i = 0; i < CurrentProjectFile.YmapFiles.Count; i++) + foreach (var ymap in CurrentProjectFile.YmapFiles.AsSpan()) { - var ymap = CurrentProjectFile.YmapFiles[i]; if (ymap.Loaded) { ymaps[ymap.RpfFileEntry.ShortNameHash] = ymap; } } + } - if (DateTime.Now - LastProjectCheck < TimeSpan.FromSeconds(1)) + //if (DateTime.Now - LastProjectCheck < TimeSpan.FromSeconds(1)) + //{ + // return; + //} + + LastProjectCheck = DateTime.Now; + + visiblemloentities.Clear(); + foreach (var ymap in ymaps.Values)//TODO: improve performance + { + foreach (var ent in ymap.AllEntities) { - return; + Archetype? arch = GameFileCache.GetArchetype(ent._CEntityDef.archetypeName); + if (arch is not null) + { + if (ent.Archetype != arch) + { + ent.SetArchetype(arch); //swap archetype to project one... + if (ent.IsMlo) + { + ent.MloInstance.InitYmapEntityArchetypes(GameFileCache); + } + } + } + else + { + //Console.WriteLine($"Couldn't find archetype {ent._CEntityDef.archetypeName} for project ymap {ymap.Name}"); + } } - LastProjectCheck = DateTime.Now; - - visiblemloentities.Clear(); - foreach (var ymap in ymaps.Values)//TODO: improve performance + foreach(var mloDef in ymap.MloEntities) { - if (ymap.AllEntities != null)//THIS IS TERRIBLE! EATING ALL FPS - { - foreach (var ent in ymap.AllEntities)//WHYYYY - maybe only do this after loading/editing ytyp! - { - Archetype arch = GameFileCache.GetArchetype(ent._CEntityDef.archetypeName); - if ((arch != null) && (ent.Archetype != arch)) - { - ent.SetArchetype(arch); //swap archetype to project one... - if (ent.IsMlo) - { - ent.MloInstance.InitYmapEntityArchetypes(GameFileCache); - } - } - - } - } - if (ymap.MloEntities != null) - { - foreach (var mloDef in ymap.MloEntities) - { - if (mloDef.Archetype == null) continue; // archetype was changed from an mlo to a regular archetype - visiblemloentities[mloDef.Archetype._BaseArchetypeDef.name] = mloDef; - } - } + if (mloDef.Archetype is null) + continue; // archetype was changed from an mlo to a regular archetype + visiblemloentities[mloDef.Archetype._BaseArchetypeDef.name] = mloDef; } } } @@ -7149,25 +7222,28 @@ namespace CodeWalker.Project ybns.Clear(); } - lock (projectsyncroot) - { - if (CurrentProjectFile == null) return; + if (CurrentProjectFile is null || CurrentProjectFile.YbnFiles.Count == 0) + return; + lock (ProjectSyncRoot) + { visibleybns.Clear(); - for (int i = 0; i < ybns.Count; i++) + + foreach(var ybn in ybns.AsSpan()) { - var ybn = ybns[i]; visibleybns[ybn.Name] = ybn; } - for (int i = 0; i < CurrentProjectFile.YbnFiles.Count; i++) + lock(CurrentProjectFile.YbnFiles) { - var ybn = CurrentProjectFile.YbnFiles[i]; - if (ybn.Loaded) + foreach (var ybn in CurrentProjectFile.YbnFiles.AsSpan()) { - if (!visiblemloentities.ContainsKey((ybn.RpfFileEntry != null) ? ybn.RpfFileEntry.ShortNameHash : 0)) + if (ybn.Loaded) { - visibleybns[ybn.Name] = ybn; + if (!visiblemloentities.ContainsKey(ybn.RpfFileEntry?.ShortNameHash ?? 0)) + { + visibleybns[ybn.Name] = ybn; + } } } } @@ -7181,34 +7257,35 @@ namespace CodeWalker.Project //messy way to gather the interior ybns! + projectybns.Clear(); - for (int i = 0; i < CurrentProjectFile.YbnFiles.Count; i++) + lock (CurrentProjectFile.YbnFiles) { - var ybn = CurrentProjectFile.YbnFiles[i]; - if (ybn.Loaded) + foreach (var ybn in CurrentProjectFile.YbnFiles.AsSpan()) { - projectybns[ybn.RpfFileEntry?.ShortNameHash ?? JenkHash.GenHash(ybn.Name)] = ybn; + if (ybn.Loaded) + { + projectybns[ybn.RpfFileEntry?.ShortNameHash ?? JenkHash.GenHash(ybn.Name)] = ybn; + } } } interiorslist.Clear(); interiorslist.AddRange(interiors.Keys); - for (int i = 0; i < interiorslist.Count; i++) + + foreach(var mlo in interiorslist.AsSpan()) { - var mlo = interiorslist[i]; var hash = mlo._CEntityDef.archetypeName; - if (projectybns.TryGetValue(hash, out YbnFile ybn)) + if (projectybns.TryGetValue(hash, out var ybn)) { - if ((ybn != null) && (ybn.Loaded)) + if (ybn is not null && ybn.Loaded) { interiors[mlo] = ybn; } } } - - } - } + public void GetVisibleYnds(Camera camera, List ynds) { if (hidegtavmap) @@ -7216,26 +7293,30 @@ namespace CodeWalker.Project ynds.Clear(); } - lock (projectsyncroot) - { - if (CurrentProjectFile == null) return; + if (CurrentProjectFile is null || CurrentProjectFile.YndFiles.Count == 0) + return; + lock (ProjectSyncRoot) + { visibleynds.Clear(); - for (int i = 0; i < ynds.Count; i++) + + foreach(var ynd in ynds.AsSpan()) { - var ynd = ynds[i]; visibleynds[ynd.AreaID] = ynd; } - for (int i = 0; i < CurrentProjectFile.YndFiles.Count; i++) + lock(CurrentProjectFile.YndFiles) { - var ynd = CurrentProjectFile.YndFiles[i]; - if (ynd.Loaded) + foreach(var ynd in CurrentProjectFile.YndFiles.AsSpan()) { - visibleynds[ynd.AreaID] = ynd; + if (ynd.Loaded) + { + visibleynds[ynd.AreaID] = ynd; + } } } + ynds.Clear(); foreach (var ynd in visibleynds.Values) { @@ -7251,10 +7332,11 @@ namespace CodeWalker.Project ynvs.Clear(); } - lock (projectsyncroot) - { - if (CurrentProjectFile == null) return; + if (CurrentProjectFile is null || CurrentProjectFile.YnvFiles.Count == 0) + return; + lock (ProjectSyncRoot) + { visibleynvs.Clear(); for (int i = 0; i < ynvs.Count; i++) { @@ -7262,15 +7344,18 @@ namespace CodeWalker.Project visibleynvs[ynv.AreaID] = ynv; } - for (int i = 0; i < CurrentProjectFile.YnvFiles.Count; i++) + lock(CurrentProjectFile.YnvFiles) { - var ynv = CurrentProjectFile.YnvFiles[i]; - if (ynv.Loaded) + foreach(var ynv in CurrentProjectFile.YnvFiles.AsSpan()) { - visibleynvs[ynv.AreaID] = ynv; + if (ynv.Loaded) + { + visibleynvs[ynv.AreaID] = ynv; + } } } + ynvs.Clear(); foreach (var ynv in visibleynvs.Values) { @@ -7286,11 +7371,11 @@ namespace CodeWalker.Project tracks.Clear(); } + if (CurrentProjectFile is null || CurrentProjectFile.TrainsFiles.Count == 0) + return; - lock (projectsyncroot) + lock (ProjectSyncRoot) { - if (CurrentProjectFile == null) return; - visibletrains.Clear(); for (int i = 0; i < tracks.Count; i++) { @@ -7298,15 +7383,18 @@ namespace CodeWalker.Project visibletrains[track.Name] = track; } - for (int i = 0; i < CurrentProjectFile.TrainsFiles.Count; i++) + lock(CurrentProjectFile.TrainsFiles) { - var track = CurrentProjectFile.TrainsFiles[i]; - if (track.Loaded) + foreach(var track in CurrentProjectFile.TrainsFiles) { - visibletrains[track.Name] = track; + if (track.Loaded) + { + visibletrains[track.Name] = track; + } } } + tracks.Clear(); foreach (var track in visibletrains.Values) { @@ -7322,24 +7410,26 @@ namespace CodeWalker.Project ymts.Clear(); } + if (CurrentProjectFile is null || CurrentProjectFile.ScenarioFiles.Count == 0) + return; - lock (projectsyncroot) + lock (ProjectSyncRoot) { - if (CurrentProjectFile == null) return; - visiblescenarios.Clear(); - for (int i = 0; i < ymts.Count; i++) + + foreach(var ymt in ymts.AsSpan()) { - var ymt = ymts[i]; visiblescenarios[ymt.Name] = ymt; } - for (int i = 0; i < CurrentProjectFile.ScenarioFiles.Count; i++) + lock(CurrentProjectFile.ScenarioFiles) { - var scenario = CurrentProjectFile.ScenarioFiles[i]; - if (scenario.Loaded) + foreach (var scenario in CurrentProjectFile.ScenarioFiles.AsSpan()) { - visiblescenarios[scenario.Name] = scenario; + if (scenario.Loaded) + { + visiblescenarios[scenario.Name] = scenario; + } } } @@ -7358,23 +7448,26 @@ namespace CodeWalker.Project rels.Clear(); } - lock (projectsyncroot) - { - if (CurrentProjectFile == null) return; + if (CurrentProjectFile is null || CurrentProjectFile.AudioRelFiles.Count == 0) + return; + lock (ProjectSyncRoot) + { visibleaudiofiles.Clear(); - for (int i = 0; i < rels.Count; i++) + + foreach(var rel in rels.AsSpan()) { - var rel = rels[i]; visibleaudiofiles[rel.RpfFileEntry.NameHash] = rel; } - for (int i = 0; i < CurrentProjectFile.AudioRelFiles.Count; i++) + lock(CurrentProjectFile.AudioRelFiles) { - var rel = CurrentProjectFile.AudioRelFiles[i]; - if (rel.Loaded) + foreach (var rel in CurrentProjectFile.AudioRelFiles.AsSpan()) { - visibleaudiofiles[rel.RpfFileEntry.NameHash] = rel; + if (rel.Loaded) + { + visibleaudiofiles[rel.RpfFileEntry.NameHash] = rel; + } } } @@ -7411,7 +7504,7 @@ namespace CodeWalker.Project } - lock (projectsyncroot) + lock (ProjectSyncRoot) { if (renderitems && (CurrentProjectFile != null)) { @@ -7468,12 +7561,22 @@ namespace CodeWalker.Project public MloInstanceData TryGetMloInstance(MloArchetype arch) { - lock (projectsyncroot) + lock (ProjectSyncRoot) { - if (arch == null) return null; + if (arch == null) + { + return null; + } MetaHash name = arch._BaseArchetypeDef.name; - if (name == 0) return null; - if (!visiblemloentities.ContainsKey(name)) return null; + if (name == 0) + { + return null; + } + if (!visiblemloentities.ContainsKey(name)) + { + MessageBox.Show($"Couldn't find MloInstance from Archetype {arch.Name} ({arch.AssetName}), is the placement ymap missing?"); + return null; + } return visiblemloentities[name]?.MloInstance; } } @@ -7485,7 +7588,7 @@ namespace CodeWalker.Project { if (InvokeRequired) { - BeginInvoke(new Action(() => { OnWorldSelectionChanged(sel); })); + BeginInvoke(OnWorldSelectionChanged, sel); } else { @@ -7683,8 +7786,11 @@ namespace CodeWalker.Project CurrentScenarioNode = scenariond; CurrentScenarioChainEdge = scenarioedge; CurrentAudioFile = audiofile; - CurrentAudioZone = (audiopl?.AudioZone != null) ? audiopl : null; - CurrentAudioEmitter = (audiopl?.AudioEmitter != null) ? audiopl : null; + if (audiopl is not null) + { + CurrentAudioZone = (audiopl.AudioZone is not null) ? audiopl : null; + CurrentAudioEmitter = (audiopl.AudioEmitter is not null) ? audiopl : null; + } CurrentAudioZoneList = null; CurrentAudioEmitterList = null; CurrentYdrFile = null; @@ -7702,13 +7808,13 @@ namespace CodeWalker.Project } catch { } } - public void OnWorldSelectionModified(MapSelection sel) + public async ValueTask OnWorldSelectionModified(MapSelection sel) { try { if (InvokeRequired) { - BeginInvoke(new Action(() => { OnWorldSelectionModified(sel); })); + BeginInvoke(OnWorldSelectionModified, sel); } else { @@ -7730,23 +7836,23 @@ namespace CodeWalker.Project } else if (sel.EntityDef != null) { - OnWorldEntityModified(sel.EntityDef); + await OnWorldEntityModifiedAsync(sel.EntityDef); } else if (sel.CarGenerator != null) { - OnWorldCarGenModified(sel.CarGenerator); + await OnWorldCarGenModifiedAsync(sel.CarGenerator); } else if (sel.LodLight != null) { - OnWorldLodLightModified(sel.LodLight); + await OnWorldLodLightModifiedAsync(sel.LodLight); } else if (sel.BoxOccluder != null) { - OnWorldBoxOccluderModified(sel.BoxOccluder); + await OnWorldBoxOccluderModifiedAsync(sel.BoxOccluder); } else if (sel.OccludeModelTri != null) { - OnWorldOccludeModelTriModified(sel.OccludeModelTri); + await OnWorldOccludeModelTriModifiedAsync(sel.OccludeModelTri); } else if (sel.PathNode != null) { @@ -7774,7 +7880,7 @@ namespace CodeWalker.Project } else if (sel.Audio != null) { - OnWorldAudioPlacementModified(sel.Audio); + await OnWorldAudioPlacementModifiedAsync(sel.Audio); } } } @@ -7789,7 +7895,7 @@ namespace CodeWalker.Project } } - private void OnWorldEntityModified(YmapEntityDef ent) + private async ValueTask OnWorldEntityModifiedAsync(YmapEntityDef ent) { if ((ent.Ymap == null) && (ent.MloParent == null)) { @@ -7798,7 +7904,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (ent.MloParent == null && ent.Ymap != null) @@ -7806,7 +7912,7 @@ namespace CodeWalker.Project if (!YmapExistsInProject(ent.Ymap)) { ent.Ymap.HasChanged = true; - AddYmapToProject(ent.Ymap); + await AddYmapToProjectAsync(ent.Ymap); ProjectExplorer?.TrySelectEntityTreeNode(ent); } @@ -7860,19 +7966,19 @@ namespace CodeWalker.Project } } } - private void OnWorldCarGenModified(YmapCarGen cargen) + private async ValueTask OnWorldCarGenModifiedAsync(YmapCarGen cargen) { if (cargen?.Ymap == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (!YmapExistsInProject(cargen.Ymap)) { cargen.Ymap.HasChanged = true; - AddYmapToProject(cargen.Ymap); + await AddYmapToProjectAsync(cargen.Ymap); ProjectExplorer?.TrySelectCarGenTreeNode(cargen); } @@ -7895,24 +8001,24 @@ namespace CodeWalker.Project } } - private void OnWorldLodLightModified(YmapLODLight lodlight) + private async ValueTask OnWorldLodLightModifiedAsync(YmapLODLight lodlight) { if (lodlight?.Ymap == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (!YmapExistsInProject(lodlight.Ymap)) { if (lodlight.DistLodLights?.Ymap != null) { - AddYmapToProject(lodlight.DistLodLights.Ymap); + await AddYmapToProjectAsync(lodlight.DistLodLights.Ymap); lodlight.DistLodLights.Ymap.HasChanged = true; } lodlight.Ymap.HasChanged = true; - AddYmapToProject(lodlight.Ymap); + await AddYmapToProjectAsync(lodlight.Ymap); ProjectExplorer?.TrySelectLodLightTreeNode(lodlight); } @@ -7935,19 +8041,19 @@ namespace CodeWalker.Project } } - private void OnWorldBoxOccluderModified(YmapBoxOccluder box) + private async ValueTask OnWorldBoxOccluderModifiedAsync(YmapBoxOccluder box) { if (box?.Ymap == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (!YmapExistsInProject(box.Ymap)) { box.Ymap.HasChanged = true; - AddYmapToProject(box.Ymap); + await AddYmapToProjectAsync(box.Ymap); ProjectExplorer?.TrySelectBoxOccluderTreeNode(box); } @@ -7970,19 +8076,19 @@ namespace CodeWalker.Project } } - private void OnWorldOccludeModelTriModified(YmapOccludeModelTriangle tri) + private async ValueTask OnWorldOccludeModelTriModifiedAsync(YmapOccludeModelTriangle tri) { if (tri?.Ymap == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (!YmapExistsInProject(tri.Ymap)) { tri.Ymap.HasChanged = true; - AddYmapToProject(tri.Ymap); + await AddYmapToProjectAsync(tri.Ymap); ProjectExplorer?.TrySelectOccludeModelTriangleTreeNode(tri); } @@ -8014,7 +8120,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!YbnExistsInProject(ybn)) @@ -8053,7 +8159,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!YbnExistsInProject(ybn)) @@ -8092,7 +8198,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!YbnExistsInProject(ybn)) @@ -8128,7 +8234,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!YndExistsInProject(node.Ynd)) @@ -8169,7 +8275,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!YnvExistsInProject(poly.Ynv)) @@ -8204,7 +8310,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!YnvExistsInProject(point.Ynv)) @@ -8239,7 +8345,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!YnvExistsInProject(portal.Ynv)) @@ -8274,7 +8380,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!TrainTrackExistsInProject(node.Track)) @@ -8306,7 +8412,7 @@ namespace CodeWalker.Project if (CurrentProjectFile == null) { - NewProject(); + NewProjectAsync(); } if (!ScenarioExistsInProject(node.Ymt)) @@ -8333,19 +8439,19 @@ namespace CodeWalker.Project } } } - private void OnWorldAudioPlacementModified(AudioPlacement audio) + private async ValueTask OnWorldAudioPlacementModifiedAsync(AudioPlacement audio) { if (audio?.RelFile == null) return; if (CurrentProjectFile == null) { - NewProject(); + await NewProjectAsync(); } if (!AudioFileExistsInProject(audio.RelFile)) { audio.RelFile.HasChanged = true; - AddAudioFileToProject(audio.RelFile); + await AddAudioFileToProject(audio.RelFile); if (audio.AudioZone != null) { ProjectExplorer?.TrySelectAudioZoneTreeNode(audio); @@ -8393,20 +8499,24 @@ namespace CodeWalker.Project public void SetProjectHasChanged(bool changed) { - if (CurrentProjectFile == null) return; + if (CurrentProjectFile is null) + return; - CurrentProjectFile.HasChanged = changed; + this.InvokeIfRequired(() => + { + CurrentProjectFile.HasChanged = changed; - ProjectExplorer?.SetProjectHasChanged(changed); + ProjectExplorer?.SetProjectHasChanged(changed); - UpdateFormTitleText(); + UpdateFormTitleText(); + }); } public void SetYmapHasChanged(bool changed) { if (CurrentYmapFile == null) return; bool changechange = changed != CurrentYmapFile.HasChanged; - if (!changechange) return; + //if (!changechange) return; CurrentYmapFile.HasChanged = changed; @@ -8561,20 +8671,20 @@ namespace CodeWalker.Project return pos; } - public RpfFileEntry FindParentYmapEntry(uint hash) + public RpfFileEntry? FindParentYmapEntry(uint hash) { if (CurrentProjectFile != null) { foreach (var ymap in CurrentProjectFile.YmapFiles) { - if ((ymap._CMapData.name.Hash == hash) || (JenkHash.GenHash(Path.GetFileNameWithoutExtension(ymap.Name)) == hash)) + if (ymap._CMapData.name.Hash == hash || JenkHash.GenHash(Path.GetFileNameWithoutExtension(ymap.Name)) == hash) { return ymap.RpfFileEntry; } } } - if ((GameFileCache != null) && (GameFileCache.IsInited)) + if (GameFileCache is not null && GameFileCache.IsInited) { return GameFileCache.GetYmapEntry(hash); } @@ -8590,45 +8700,47 @@ namespace CodeWalker.Project //######## Private methods - private void LoadYmapFromFile(YmapFile ymap, string filename) + private async Task LoadYmapFromFileAsync(YmapFile ymap, string filename) { - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename).ConfigureAwait(false); - ymap.Load(data); + await ymap.LoadAsync(data); ymap.InitYmapEntityArchetypes(GameFileCache); //this needs to be done after calling YmapFile.Load() - } - private void LoadYtypFromFile(YtypFile ytyp, string filename) - { - byte[] data = File.ReadAllBytes(filename); - ytyp.Load(data); + GameFileCache?.AddProjectFile(ymap); + } + private async Task LoadYtypFromFileAsync(YtypFile ytyp, string filename) + { + byte[] data = await File.ReadAllBytesAsync(filename).ConfigureAwait(false); + + await ytyp.LoadAsync(data); AddProjectArchetypes(ytyp); } - private void LoadYbnFromFile(YbnFile ybn, string filename) + private async Task LoadYbnFromFileAsync(YbnFile ybn, string filename) { - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename).ConfigureAwait(false); ybn.Load(data); - if (WorldForm != null) + if (WorldForm is not null) { - if (ybn?.Bounds != null) + if (ybn.Bounds is not null) { - WorldForm.UpdateCollisionBoundsGraphics(ybn?.Bounds); + WorldForm.UpdateCollisionBoundsGraphics(ybn.Bounds); } } } - private void LoadYndFromFile(YndFile ynd, string filename) + private async Task LoadYndFromFileAsync(YndFile ynd, string filename) { - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename); ynd.Load(data); - WorldForm.Space.PatchYndFile(ynd); - if (WorldForm != null) + if (WorldForm is not null) { + WorldForm.Space.PatchYndFile(ynd); // TODO: Wasteful -- be smarter about this foreach (var file in CurrentProjectFile.YndFiles) { @@ -8647,20 +8759,17 @@ namespace CodeWalker.Project //note: this is actually necessary to properly populate junctions data........ } } - private void LoadYnvFromFile(YnvFile ynv, string filename) + private async Task LoadYnvFromFileAsync(YnvFile ynv, string filename) { - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename); ynv.Load(data); - if (WorldForm != null) - { - WorldForm.UpdateNavYnvGraphics(ynv, true); //polys don't get drawn until something changes otherwise - } + WorldForm?.UpdateNavYnvGraphics(ynv, true); //polys don't get drawn until something changes otherwise } - private void LoadTrainTrackFromFile(TrainTrack track, string filename) + private async Task LoadTrainTrackFromFileAsync(TrainTrack track, string filename) { - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename); string fname = new FileInfo(filename).Name; @@ -8669,10 +8778,7 @@ namespace CodeWalker.Project track.FilePath = filename; track.RpfFileEntry.Name = fname; - if (WorldForm != null) - { - WorldForm.UpdateTrainTrackGraphics(track, true); //links don't get drawn until something changes otherwise - } + WorldForm?.UpdateTrainTrackGraphics(track, true); //links don't get drawn until something changes otherwise } private void LoadScenarioFromFile(YmtFile ymt, string filename) { @@ -8686,64 +8792,52 @@ namespace CodeWalker.Project rel.Load(data, rel?.RpfFileEntry); } - private void LoadYdrFromFile(YdrFile ydr, string filename) + private async Task LoadYdrFromFile(YdrFile ydr, string filename) { AddFilenameToJenkIndex(filename); - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename).ConfigureAwait(false); - ydr.Load(data); + await ydr.LoadAsync(data); - if (GameFileCache != null) - { - GameFileCache.AddProjectFile(ydr); - } + GameFileCache?.AddProjectFile(ydr); } - private void LoadYddFromFile(YddFile ydd, string filename) + private async Task LoadYddFromFileAsync(YddFile ydd, string filename) { AddFilenameToJenkIndex(filename); - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename).ConfigureAwait(false); - ydd.Load(data); + await ydd.LoadAsync(data); - if (GameFileCache != null) - { - GameFileCache.AddProjectFile(ydd); - } + GameFileCache?.AddProjectFile(ydd); } - private void LoadYftFromFile(YftFile yft, string filename) + private async Task LoadYftFromFileAsync(YftFile yft, string filename) { AddFilenameToJenkIndex(filename); - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename).ConfigureAwait(false); yft.Load(data); - if (GameFileCache != null) - { - GameFileCache.AddProjectFile(yft); - } + GameFileCache?.AddProjectFile(yft); } - private void LoadYtdFromFile(YtdFile ytd, string filename) + private async Task LoadYtdFromFileAsync(YtdFile ytd, string filename) { AddFilenameToJenkIndex(filename); - byte[] data = File.ReadAllBytes(filename); + byte[] data = await File.ReadAllBytesAsync(filename).ConfigureAwait(false); - ytd.Load(data); + await ytd.LoadAsync(data); - if (GameFileCache != null) - { - GameFileCache.AddProjectFile(ytd); - } + GameFileCache?.AddProjectFile(ytd); } private void AddFilenameToJenkIndex(string filename) { - var n = Path.GetFileNameWithoutExtension(filename).ToLowerInvariant(); - JenkIndex.Ensure(n); + var n = Path.GetFileNameWithoutExtension(filename); + JenkIndex.EnsureBoth(n); } @@ -8763,25 +8857,36 @@ namespace CodeWalker.Project private void UpdateFormTitleText() { - if (CurrentProjectFile == null) + this.InvokeIfRequired(() => { - Text = "Project - CodeWalker by dexyfex"; - } - else - { - Text = CurrentProjectFile.Name + " - CodeWalker by dexyfex"; - } + if (CurrentProjectFile == null) + { + Text = "Project - CodeWalker by dexyfex"; + } + else + { + Text = $"{CurrentProjectFile.Name} - CodeWalker by dexyfex"; + } + }); } private void RefreshProjectUI() { - bool enable = (CurrentProjectFile != null); - FileCloseProjectMenu.Enabled = enable; - FileSaveProjectMenu.Enabled = enable; - FileSaveProjectAsMenu.Enabled = enable; + this.InvokeIfRequired(() => + { + bool enable = (CurrentProjectFile != null); + FileCloseProjectMenu.Enabled = enable; + FileSaveProjectMenu.Enabled = enable; + FileSaveProjectAsMenu.Enabled = enable; + }); } private void RefreshUI() { + if (InvokeRequired) + { + Invoke(RefreshUI); + return; + } RefreshYmapUI(); RefreshEntityUI(); RefreshCarGenUI(); @@ -8811,6 +8916,11 @@ namespace CodeWalker.Project } private void RefreshYmapUI() { + if (InvokeRequired) + { + Invoke(RefreshYmapUI); + return; + } bool enable = (CurrentYmapFile != null); bool inproj = YmapExistsInProject(CurrentYmapFile); @@ -8864,6 +8974,11 @@ namespace CodeWalker.Project } private void RefreshYtypUI() { + if (InvokeRequired) + { + Invoke(RefreshYtypUI); + return; + } bool enable = (CurrentYtypFile != null); bool inproj = YtypExistsInProject(CurrentYtypFile); bool ismlo = ((CurrentEntity != null) && (CurrentEntity.MloParent != null)) || (CurrentMloRoom != null) || (CurrentMloPortal != null) || (CurrentMloEntitySet != null) || (CurrentArchetype is MloArchetype); @@ -8893,6 +9008,11 @@ namespace CodeWalker.Project } private void RefreshYbnUI() { + if (InvokeRequired) + { + Invoke(RefreshYbnUI); + return; + } bool enable = (CurrentYbnFile != null); bool inproj = YbnExistsInProject(CurrentYbnFile); @@ -8919,6 +9039,11 @@ namespace CodeWalker.Project } private void RefreshYndUI() { + if (InvokeRequired) + { + Invoke(RefreshYndUI); + return; + } bool enable = (CurrentYndFile != null); bool inproj = YndExistsInProject(CurrentYndFile); @@ -8944,6 +9069,11 @@ namespace CodeWalker.Project } private void RefreshYnvUI() { + if (InvokeRequired) + { + Invoke(RefreshYnvUI); + return; + } bool enable = (CurrentYnvFile != null); bool inproj = YnvExistsInProject(CurrentYnvFile); @@ -8969,6 +9099,11 @@ namespace CodeWalker.Project } private void RefreshTrainTrackUI() { + if (InvokeRequired) + { + Invoke(RefreshTrainTrackUI); + return; + } bool enable = (CurrentTrainTrack != null); bool inproj = TrainTrackExistsInProject(CurrentTrainTrack); @@ -8994,6 +9129,11 @@ namespace CodeWalker.Project } private void RefreshScenarioUI() { + if (InvokeRequired) + { + Invoke(RefreshScenarioUI); + return; + } bool enable = (CurrentScenario != null); bool inproj = ScenarioExistsInProject(CurrentScenario); @@ -9024,6 +9164,11 @@ namespace CodeWalker.Project } private void RefreshAudioUI() { + if (InvokeRequired) + { + Invoke(RefreshAudioUI); + return; + } bool enable = (CurrentAudioFile != null); bool inproj = AudioFileExistsInProject(CurrentAudioFile); @@ -9054,12 +9199,17 @@ namespace CodeWalker.Project } private void RefreshYdrUI() { + if (InvokeRequired) + { + Invoke(RefreshYdrUI); + return; + } bool enable = (CurrentYdrFile != null); bool inproj = YdrExistsInProject(CurrentYdrFile); if (CurrentYdrFile != null) { - YdrNameMenu.Text = "(" + CurrentYdrFile.Name + ")"; + YdrNameMenu.Text = $"({CurrentYdrFile.Name})"; } else { @@ -9072,12 +9222,17 @@ namespace CodeWalker.Project } private void RefreshYddUI() { + if (InvokeRequired) + { + Invoke(RefreshYddUI); + return; + } bool enable = (CurrentYddFile != null); bool inproj = YddExistsInProject(CurrentYddFile); if (CurrentYddFile != null) { - YddNameMenu.Text = "(" + CurrentYddFile.Name + ")"; + YddNameMenu.Text = $"({CurrentYddFile.Name})"; } else { @@ -9090,12 +9245,17 @@ namespace CodeWalker.Project } private void RefreshYftUI() { + if (InvokeRequired) + { + Invoke(RefreshYftUI); + return; + } bool enable = (CurrentYftFile != null); bool inproj = YftExistsInProject(CurrentYftFile); if (CurrentYftFile != null) { - YftNameMenu.Text = "(" + CurrentYftFile.Name + ")"; + YftNameMenu.Text = $"({CurrentYftFile.Name})"; } else { @@ -9108,12 +9268,17 @@ namespace CodeWalker.Project } private void RefreshYtdUI() { + if (InvokeRequired) + { + Invoke(RefreshYtdUI); + return; + } bool enable = (CurrentYtdFile != null); bool inproj = YtdExistsInProject(CurrentYtdFile); if (CurrentYtdFile != null) { - YtdNameMenu.Text = "(" + CurrentYtdFile.Name + ")"; + YtdNameMenu.Text = $"({CurrentYtdFile.Name})"; } else { @@ -9128,7 +9293,12 @@ namespace CodeWalker.Project private void SetCurrentSaveItem() { - string filename = null; + if (InvokeRequired) + { + Invoke(SetCurrentSaveItem); + return; + } + string? filename = null; if (CurrentYmapFile != null) { filename = CurrentYmapFile.RpfFileEntry?.Name; @@ -9166,9 +9336,9 @@ namespace CodeWalker.Project if (enable) { - FileSaveItemMenu.Text = "Save " + filename; - FileSaveItemAsMenu.Text = "Save " + filename + " As..."; - ToolbarSaveButton.Text = "Save " + filename; + FileSaveItemMenu.Text = $"Save {filename}"; + FileSaveItemAsMenu.Text = $"Save {filename} As..."; + ToolbarSaveButton.Text = $"Save {filename}"; } else { @@ -9186,10 +9356,7 @@ namespace CodeWalker.Project FileSaveItemAsMenu.Visible = enable; ToolbarSaveButton.Enabled = enable; - if (WorldForm != null) - { - WorldForm.SetCurrentSaveItem(filename); - } + WorldForm?.SetCurrentSaveItem(filename); } @@ -9201,6 +9368,10 @@ namespace CodeWalker.Project private string ShowSaveDialog(string filter, string filename) { + if (InvokeRequired) + { + return Invoke(() => ShowSaveDialog(filter, filename)); + } SaveFileDialog.FileName = filename; SaveFileDialog.Filter = filter; if (SaveFileDialog.ShowDialog(this) != DialogResult.OK) @@ -9211,6 +9382,10 @@ namespace CodeWalker.Project } private string ShowOpenDialog(string filter, string filename) { + if (InvokeRequired) + { + return Invoke(() => ShowOpenDialog(filter, filename)); + } OpenFileDialog.FileName = filename; OpenFileDialog.Filter = filter; OpenFileDialog.Multiselect = false; @@ -9220,8 +9395,12 @@ namespace CodeWalker.Project } return OpenFileDialog.FileName; } - private string[] ShowOpenDialogMulti(string filter, string filename) + private string[]? ShowOpenDialogMulti(string filter, string filename) { + if (InvokeRequired) + { + return Invoke(() => ShowOpenDialogMulti(filter, filename)); + } OpenFileDialog.FileName = filename; OpenFileDialog.Filter = filter; OpenFileDialog.Multiselect = true; @@ -9240,7 +9419,7 @@ namespace CodeWalker.Project //######## events - private void ProjectForm_FormClosing(object sender, FormClosingEventArgs e) + private async void ProjectForm_FormClosing(object sender, FormClosingEventArgs e) { if (CurrentProjectFile != null) { @@ -9257,7 +9436,7 @@ namespace CodeWalker.Project return; } } - CloseProject(); + await CloseProject(); } private void ProjectForm_FormClosed(object sender, FormClosedEventArgs e) { @@ -9298,90 +9477,90 @@ namespace CodeWalker.Project PromoteIfPreviewPanel(MainDockPanel.ActiveContent); } - private void FileNewProjectMenu_Click(object sender, EventArgs e) + private async void FileNewProjectMenu_Click(object sender, EventArgs e) { - NewProject(); + await NewProjectAsync(); } - private void FileNewYmapMenu_Click(object sender, EventArgs e) + private async void FileNewYmapMenu_Click(object sender, EventArgs e) { - NewYmap(); + await NewYmap(); } - private void FileNewYtypMenu_Click(object sender, EventArgs e) + private async void FileNewYtypMenu_Click(object sender, EventArgs e) { - NewYtyp(); + await NewYtyp(); } - private void FileNewYbnMenu_Click(object sender, EventArgs e) + private async void FileNewYbnMenu_Click(object sender, EventArgs e) { - NewYbn(); + await NewYbn(); } - private void FileNewYndMenu_Click(object sender, EventArgs e) + private async void FileNewYndMenu_Click(object sender, EventArgs e) { - NewYnd(); + await NewYnd(); } - private void FileNewYnvMenu_Click(object sender, EventArgs e) + private async void FileNewYnvMenu_Click(object sender, EventArgs e) { - NewYnv(); + await NewYnv(); } - private void FileNewTrainsMenu_Click(object sender, EventArgs e) + private async void FileNewTrainsMenu_Click(object sender, EventArgs e) { - NewTrainTrack(); + await NewTrainTrack(); } - private void FileNewScenarioMenu_Click(object sender, EventArgs e) + private async void FileNewScenarioMenu_Click(object sender, EventArgs e) { - NewScenario(); + await NewScenario(); } - private void FileNewAudioDatMenu_Click(object sender, EventArgs e) + private async void FileNewAudioDatMenu_Click(object sender, EventArgs e) { - NewAudioFile(); + await NewAudioFile(); } - private void FileOpenProjectMenu_Click(object sender, EventArgs e) + private async void FileOpenProjectMenu_Click(object sender, EventArgs e) { - OpenProject(); + await OpenProject(); } - private void FileOpenFilesMenu_Click(object sender, EventArgs e) + private async void FileOpenFilesMenu_Click(object sender, EventArgs e) { - OpenFiles(); + await OpenFiles(); } - private void FileOpenFolderMenu_Click(object sender, EventArgs e) + private async void FileOpenFolderMenu_Click(object sender, EventArgs e) { - OpenFolder(); + await OpenFolder(); } - private void FileCloseProjectMenu_Click(object sender, EventArgs e) + private async void FileCloseProjectMenu_Click(object sender, EventArgs e) { - CloseProject(); + await CloseProject(); } - private void FileSaveProjectMenu_Click(object sender, EventArgs e) + private async void FileSaveProjectMenu_Click(object sender, EventArgs e) { - SaveProject(); + await SaveProject(); } - private void FileSaveProjectAsMenu_Click(object sender, EventArgs e) + private async void FileSaveProjectAsMenu_Click(object sender, EventArgs e) { - SaveProject(true); + await SaveProject(true); } - private void FileSaveItemMenu_Click(object sender, EventArgs e) + private async void FileSaveItemMenu_Click(object sender, EventArgs e) { - Save(); + await Save(); } - private void FileSaveItemAsMenu_Click(object sender, EventArgs e) + private async void FileSaveItemAsMenu_Click(object sender, EventArgs e) { - Save(true); + await Save(true); } private void ViewProjectExplorerMenu_Click(object sender, EventArgs e) { ShowProjectExplorer(); } - private void ViewThemeBlueMenu_Click(object sender, EventArgs e) + private async void ViewThemeBlueMenu_Click(object sender, EventArgs e) { - SetTheme("Blue"); + await SetTheme("Blue"); } - private void ViewThemeLightMenu_Click(object sender, EventArgs e) + private async void ViewThemeLightMenu_Click(object sender, EventArgs e) { - SetTheme("Light"); + await SetTheme("Light"); } - private void ViewThemeDarkMenu_Click(object sender, EventArgs e) + private async void ViewThemeDarkMenu_Click(object sender, EventArgs e) { - SetTheme("Dark"); + await SetTheme("Dark"); } private void YmapNewEntityMenu_Click(object sender, EventArgs e) @@ -9396,9 +9575,9 @@ namespace CodeWalker.Project { NewGrassBatch(); } - private void YmapAddToProjectMenu_Click(object sender, EventArgs e) + private async void YmapAddToProjectMenu_Click(object sender, EventArgs e) { - AddYmapToProject(CurrentYmapFile); + await AddYmapToProjectAsync(CurrentYmapFile); } private void YmapRemoveFromProjectMenu_Click(object sender, EventArgs e) { @@ -9617,9 +9796,9 @@ namespace CodeWalker.Project { NewAudioInteriorRoom(); } - private void AudioAddToProjectMenu_Click(object sender, EventArgs e) + private async void AudioAddToProjectMenu_Click(object sender, EventArgs e) { - AddAudioFileToProject(CurrentAudioFile); + await AddAudioFileToProject(CurrentAudioFile); } private void AudioRemoveFromProjectMenu_Click(object sender, EventArgs e) { @@ -9689,79 +9868,79 @@ namespace CodeWalker.Project } } - private void ToolbarNewButton_ButtonClick(object sender, EventArgs e) + private async void ToolbarNewButton_ButtonClick(object sender, EventArgs e) { - if (CurrentProjectFile == null) + if (CurrentProjectFile is null) { - NewProject(); + await NewProjectAsync(); } else { - NewYmap(); + await NewYmap(); } } - private void ToolbarNewProjectMenu_Click(object sender, EventArgs e) + private async void ToolbarNewProjectMenu_Click(object sender, EventArgs e) { - NewProject(); + await NewProjectAsync(); } - private void ToolbarNewYmapMenu_Click(object sender, EventArgs e) + private async void ToolbarNewYmapMenu_Click(object sender, EventArgs e) { - NewYmap(); + await NewYmap(); } - private void ToolbarNewYtypMenu_Click(object sender, EventArgs e) + private async void ToolbarNewYtypMenu_Click(object sender, EventArgs e) { - NewYtyp(); + await NewYtyp(); } - private void ToolbarNewYbnMenu_Click(object sender, EventArgs e) + private async void ToolbarNewYbnMenu_Click(object sender, EventArgs e) { - NewYbn(); + await NewYbn(); } - private void ToolbarNewYndMenu_Click(object sender, EventArgs e) + private async void ToolbarNewYndMenu_Click(object sender, EventArgs e) { - NewYnd(); + await NewYnd(); } - private void ToolbarNewYnvMenu_Click(object sender, EventArgs e) + private async void ToolbarNewYnvMenu_Click(object sender, EventArgs e) { - NewYnv(); + await NewYnv(); } - private void ToolbarNewTrainsMenu_Click(object sender, EventArgs e) + private async void ToolbarNewTrainsMenu_Click(object sender, EventArgs e) { - NewTrainTrack(); + await NewTrainTrack(); } - private void ToolbarNewScenarioMenu_Click(object sender, EventArgs e) + private async void ToolbarNewScenarioMenu_Click(object sender, EventArgs e) { - NewScenario(); + await NewScenario(); } - private void ToolbarOpenButton_ButtonClick(object sender, EventArgs e) + private async void ToolbarOpenButton_ButtonClick(object sender, EventArgs e) { if (CurrentProjectFile == null) { - OpenProject(); + await OpenProject(); } else { - OpenFiles(); + await OpenFiles(); } } - private void ToolbarOpenProjectMenu_Click(object sender, EventArgs e) + private async void ToolbarOpenProjectMenu_Click(object sender, EventArgs e) { - OpenProject(); + await OpenProject(); } - private void ToolbarOpenFilesMenu_Click(object sender, EventArgs e) + private async void ToolbarOpenFilesMenu_Click(object sender, EventArgs e) { - OpenFiles(); + await OpenFiles(); } - private void ToolbarOpenFolderMenu_Click(object sender, EventArgs e) + private async void ToolbarOpenFolderMenu_Click(object sender, EventArgs e) { - OpenFolder(); + await OpenFolder(); } - private void ToolbarSaveButton_Click(object sender, EventArgs e) + private async void ToolbarSaveButton_Click(object sender, EventArgs e) { - Save(); + await Save(); } - private void ToolbarSaveAllButton_Click(object sender, EventArgs e) + private async void ToolbarSaveAllButton_Click(object sender, EventArgs e) { - SaveAll(); + await SaveAll(); } } } diff --git a/CodeWalker/Project/UndoStep.cs b/CodeWalker/Project/UndoStep.cs index e4f4aec..435effb 100644 --- a/CodeWalker/Project/UndoStep.cs +++ b/CodeWalker/Project/UndoStep.cs @@ -1208,12 +1208,12 @@ namespace CodeWalker.Project public class CollisionVertexPositionUndoStep : UndoStep { - public BoundVertex Vertex { get; set; } - public YmapEntityDef Entity { get; set; } + public BoundVertex? Vertex { get; set; } + public YmapEntityDef? Entity { get; set; } public Vector3 StartPosition { get; set; } public Vector3 EndPosition { get; set; } - public CollisionVertexPositionUndoStep(BoundVertex vertex, YmapEntityDef ent, Vector3 startpos, WorldForm wf) + public CollisionVertexPositionUndoStep(BoundVertex? vertex, YmapEntityDef? ent, Vector3 startpos, WorldForm wf) { Vertex = vertex; Entity = ent; @@ -1225,9 +1225,9 @@ namespace CodeWalker.Project private void Update(WorldForm wf, ref MapSelection sel, Vector3 p) { - if (Vertex != null) + if (Vertex is not null) { - if (Entity != null) + if (Entity is not null) { Vertex.Position = Quaternion.Invert(Entity.Orientation).Multiply(p - Entity.Position); } @@ -1237,7 +1237,8 @@ namespace CodeWalker.Project } } - if (Vertex != sel.CollisionVertex) wf.SelectObject(Vertex); + if (Vertex != sel.CollisionVertex) + wf.SelectObject(Vertex); wf.SetWidgetPosition(p); UpdateGraphics(wf); diff --git a/CodeWalker/Properties/PublishProfiles/ClickOnceProfile.pubxml b/CodeWalker/Properties/PublishProfiles/ClickOnceProfile.pubxml new file mode 100644 index 0000000..4e719da --- /dev/null +++ b/CodeWalker/Properties/PublishProfiles/ClickOnceProfile.pubxml @@ -0,0 +1,43 @@ + + + + + 1 + 1.0.0.* + True + Release + True + true + True + Web + https://codewalker.tedeapolis.nl/ + True + True + True + False + Any CPU + bin\Release\net8.0-windows\win-x64\app.publish\ + bin\publish\click-once\ + ClickOnce + True + True + win-x64 + False + (none) + False + false + net8.0-windows + True + Foreground + False + Publish.html + + + + True + .NET Desktop Runtime 8.0.0 (x64) + + + \ No newline at end of file diff --git a/CodeWalker/Properties/PublishProfiles/FolderProfile.pubxml b/CodeWalker/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..9e1866e --- /dev/null +++ b/CodeWalker/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,18 @@ + + + + + Release + Any CPU + ..\publish\ + FileSystem + <_TargetId>Folder + net8.0-windows + win-x64 + false + true + false + + \ No newline at end of file diff --git a/CodeWalker/Properties/Settings.Designer.cs b/CodeWalker/Properties/Settings.Designer.cs index 851f693..4796f18 100644 --- a/CodeWalker/Properties/Settings.Designer.cs +++ b/CodeWalker/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace CodeWalker.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.8.0.0")] public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -24,6 +24,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string Key { @@ -36,6 +37,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("C:\\Program Files (x86)\\Steam\\SteamApps\\common\\Grand Theft Auto V")] public string GTAFolder { @@ -48,6 +50,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string CompiledScriptFolder { @@ -60,6 +63,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string DecompiledScriptFolder { @@ -72,6 +76,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string GTAExeDumpFile { @@ -84,6 +89,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string ExtractedTexturesFolder { @@ -96,6 +102,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string ExtractedRawFilesFolder { @@ -108,6 +115,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string ExtractedShadersFolder { @@ -120,6 +128,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool FullScreen { @@ -132,6 +141,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool Wireframe { @@ -144,6 +154,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool Skydome { @@ -156,6 +167,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool ShowTimedEntities { @@ -168,6 +180,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool ShowCollisionMeshes { @@ -180,6 +193,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("4")] public int CollisionMeshRange { @@ -192,6 +206,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool DynamicLOD { @@ -204,6 +219,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("5")] public int DetailDist { @@ -216,6 +232,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Glokon Marker")] public string MarkerStyle { @@ -228,6 +245,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Glokon Debug")] public string LocatorStyle { @@ -240,6 +258,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool MarkerDepthClip { @@ -252,6 +271,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("None")] public string BoundsStyle { @@ -264,6 +284,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool BoundsDepthClip { @@ -276,6 +297,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("100")] public int BoundsRange { @@ -288,6 +310,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool ShowErrorConsole { @@ -300,6 +323,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool Shadows { @@ -312,6 +336,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("6")] public int ShadowCascades { @@ -324,6 +349,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool Grass { @@ -336,6 +362,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool ShowStatusBar { @@ -348,6 +375,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool WaitForChildren { @@ -360,6 +388,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("2147483648")] public long CacheSize { @@ -372,6 +401,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("10")] public double CacheTime { @@ -384,6 +414,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("536870912")] public long GPUGeometryCacheSize { @@ -396,6 +427,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("1073741824")] public long GPUTextureCacheSize { @@ -408,6 +440,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("134217728")] public long GPUBoundCompCacheSize { @@ -420,6 +453,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("1")] public double GPUCacheTime { @@ -432,6 +466,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0.1")] public double GPUCacheFlushTime { @@ -444,6 +479,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("10")] public float CameraSmoothing { @@ -456,6 +492,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0.005")] public float CameraSensitivity { @@ -468,6 +505,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("1")] public float CameraFieldOfView { @@ -480,6 +518,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Default")] public string RenderMode { @@ -492,6 +531,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("DiffuseSampler")] public string RenderTextureSampler { @@ -504,6 +544,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Texture coord 1")] public string RenderTextureSamplerCoord { @@ -516,6 +557,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Installers;_CommonRedist")] public string ExcludeFolders { @@ -528,6 +570,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool AnisotropicFiltering { @@ -540,6 +583,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool HDR { @@ -552,6 +596,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool WindowMaximized { @@ -564,6 +609,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool EnableMods { @@ -576,6 +622,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string DLC { @@ -588,6 +635,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool XInputLThumbInvert { @@ -600,6 +648,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool XInputRThumbInvert { @@ -612,6 +661,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("2")] public float XInputLThumbSensitivity { @@ -624,6 +674,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("2")] public float XInputRThumbSensitivity { @@ -636,6 +687,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("2")] public float XInputZoomSpeed { @@ -648,6 +700,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("15")] public float XInputMoveSpeed { @@ -660,6 +713,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool MouseInvert { @@ -672,6 +726,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool RememberGTAFolder { @@ -684,6 +739,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Blue")] public string ProjectWindowTheme { @@ -696,6 +752,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Windows")] public string ExplorerWindowTheme { @@ -708,6 +765,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool Deferred { @@ -720,6 +778,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("5")] public float SnapRotationDegrees { @@ -732,6 +791,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("10")] public float SnapGridSize { @@ -745,6 +805,7 @@ namespace CodeWalker.Properties { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool JumpListInitialised { get { @@ -756,6 +817,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string RPFExplorerSelectedFolder { @@ -768,6 +830,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string RPFExplorerExtraFolders { @@ -780,6 +843,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool RPFExplorerStartInEditMode { @@ -792,6 +856,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string RPFExplorerStartFolder { @@ -804,6 +869,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("720")] public int TimeOfDay { @@ -816,6 +882,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool LODLights { @@ -828,6 +895,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Global")] public string Region { @@ -840,6 +908,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("contrails")] public string Clouds { @@ -852,6 +921,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public string Weather { @@ -864,6 +934,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool NatrualAmbientLight { @@ -876,6 +947,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool ArtificialAmbientLight { @@ -888,6 +960,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("2")] public int AntiAliasing { @@ -900,6 +973,7 @@ namespace CodeWalker.Properties { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(CustomSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute(@" diff --git a/CodeWalker/Properties/Settings.settings b/CodeWalker/Properties/Settings.settings index 373295b..c3a8b3c 100644 --- a/CodeWalker/Properties/Settings.settings +++ b/CodeWalker/Properties/Settings.settings @@ -2,10 +2,10 @@ - + - + C:\Program Files (x86)\Steam\SteamApps\common\Grand Theft Auto V @@ -185,16 +185,16 @@ False - + - + - + False - + diff --git a/CodeWalker/Rendering/DirectX/DXForm.cs b/CodeWalker/Rendering/DirectX/DXForm.cs index 1713d06..1e9369f 100644 --- a/CodeWalker/Rendering/DirectX/DXForm.cs +++ b/CodeWalker/Rendering/DirectX/DXForm.cs @@ -22,9 +22,12 @@ namespace CodeWalker.Rendering Form Form { get; } public CancellationTokenSource CancellationTokenSource { get; } + + public CancellationToken CancellationToken => CancellationTokenSource.Token; + public bool Pauserendering { get; set; } void InitScene(Device device); - void CleanupScene(); + ValueTask CleanupScene(); ValueTask RenderScene(DeviceContext context); void BuffersResized(int w, int h); bool ConfirmQuit(); diff --git a/CodeWalker/Rendering/DirectX/DXManager.cs b/CodeWalker/Rendering/DirectX/DXManager.cs index 7b39881..b978598 100644 --- a/CodeWalker/Rendering/DirectX/DXManager.cs +++ b/CodeWalker/Rendering/DirectX/DXManager.cs @@ -16,6 +16,7 @@ using System.Runtime; using CodeWalker.Core.Utils; using CodeWalker.Properties; using CodeWalker.GameFiles; +using System.Diagnostics.CodeAnalysis; namespace CodeWalker.Rendering { @@ -31,8 +32,6 @@ namespace CodeWalker.Rendering public RenderTargetView targetview { get; private set; } public DepthStencilView depthview { get; private set; } - public CancellationToken cancellationToken; - private volatile bool Running = false; private volatile bool Rendering = false; private volatile bool Resizing = false; @@ -46,13 +45,21 @@ namespace CodeWalker.Rendering private ViewportF Viewport; private bool autoStartLoop = false; + private void ThrowInitFailedException(Exception exc) + { + var msg = "CodeWalker was unable to initialise the graphics device. Please ensure your system meets the minimum requirements and that your graphics drivers and DirectX are up to date."; + if (exc != null) + { + msg += "\n\nException info: " + exc.ToString(); + } + throw new Exception(msg); + } + public bool Init(DXForm form, bool autostart = true) { dxform = form; autoStartLoop = autostart; - cancellationToken = form.CancellationTokenSource.Token; - try { //SharpDX.Configuration.EnableObjectTracking = true; @@ -79,17 +86,32 @@ namespace CodeWalker.Rendering //#if DEBUG // flags = DeviceCreationFlags.Debug; //#endif - Device dev = null; - SwapChain sc = null; - Exception exc = null; + Device? dev = null; + SwapChain? sc = null; + Exception? exc = null; bool success = false; try { + if (device is not null) + { + dev = device; + } + else + { + dev = new Device(DriverType.Hardware, flags, levels); + device = dev; + } + + using Factory1 scFactory = new Factory1(); + sc = new SwapChain(scFactory, dev, scd); Device.CreateWithSwapChain(DriverType.Hardware, flags, levels, scd, out dev, out sc); success = true; } - catch(Exception ex) { exc = ex; } + catch(Exception ex) + { + exc = ex; + } if (!success) { @@ -101,17 +123,15 @@ namespace CodeWalker.Rendering Device.CreateWithSwapChain(DriverType.Hardware, flags, levels, scd, out dev, out sc); success = true; } - catch (Exception ex) { exc = ex; } + catch (Exception ex) + { + exc = ex; + } } if (!success) { - var msg = "CodeWalker was unable to initialise the graphics device. Please ensure your system meets the minimum requirements and that your graphics drivers and DirectX are up to date."; - if (exc != null) - { - msg += "\n\nException info: " + exc.ToString(); - } - throw new Exception(msg); + ThrowInitFailedException(exc); } device = dev; @@ -152,34 +172,40 @@ namespace CodeWalker.Rendering } - private void Cleanup() + private async ValueTask Cleanup() { try { using var _ = new DisposableTimer("DXManager Cleanup"); Running = false; int count = 0; + + if (!dxform.CancellationTokenSource.IsCancellationRequested) + { + dxform.CancellationTokenSource.Cancel(); + } + while (Rendering && (count < 1000)) { - Thread.Sleep(1); //try to gracefully exit... + await Task.Delay(1); count++; } - dxform.CleanupScene(); + await dxform.CleanupScene(); - if (context != null) context.ClearState(); + context?.ClearState(); //dipose of all objects - if (depthview != null) depthview.Dispose(); - if (depthbuffer != null) depthbuffer.Dispose(); - if (targetview != null) targetview.Dispose(); - if (backbuffer != null) backbuffer.Dispose(); - if (swapchain != null) swapchain.Dispose(); - if (context != null) context.Dispose(); + depthview?.Dispose(); + depthbuffer?.Dispose(); + targetview?.Dispose(); + backbuffer?.Dispose(); + swapchain?.Dispose(); + context?.Dispose(); //var objs = SharpDX.Diagnostics.ObjectTracker.FindActiveObjects(); - if (device != null) device.Dispose(); + device?.Dispose(); } catch (Exception ex) { @@ -187,12 +213,14 @@ namespace CodeWalker.Rendering } } + + [MemberNotNull(nameof(targetview), nameof(backbuffer), nameof(depthview), nameof(depthbuffer))] private void CreateRenderBuffers() { - if (targetview != null) targetview.Dispose(); - if (backbuffer != null) backbuffer.Dispose(); - if (depthview != null) depthview.Dispose(); - if (depthbuffer != null) depthbuffer.Dispose(); + targetview?.Dispose(); + backbuffer?.Dispose(); + depthview?.Dispose(); + depthbuffer?.Dispose(); backbuffer = Texture2D.FromSwapChain(swapchain, 0); @@ -221,11 +249,11 @@ namespace CodeWalker.Rendering Viewport.X = 0; Viewport.Y = 0; } - private void Resize() + private async void Resize() { Console.WriteLine($"Resizing {Resizing}"); if (Resizing) return; - semaphore.Wait(); + await semaphore.WaitAsync().ConfigureAwait(false); int width = dxform.Form.ClientSize.Width; int height = dxform.Form.ClientSize.Height; @@ -250,7 +278,7 @@ namespace CodeWalker.Rendering StartRenderLoop(); } } - private void Dxform_FormClosing(object sender, FormClosingEventArgs e) + private async void Dxform_FormClosing(object sender, FormClosingEventArgs e) { if (!e.Cancel) { @@ -265,7 +293,7 @@ namespace CodeWalker.Rendering { dxform.CancellationTokenSource.Cancel(); } - Cleanup(); + await Cleanup(); } } @@ -344,7 +372,14 @@ namespace CodeWalker.Rendering { while (Resizing) { - swapchain.Present(1, PresentFlags.None); //just flip buffers when resizing; don't draw + var result = swapchain.Present(1, PresentFlags.None); //just flip buffers when resizing; don't draw + if (result != Result.Ok) + { + if (result == SharpDX.DXGI.ResultCode.DeviceRemoved) + { + Console.WriteLine($"Device was removed {device.DeviceRemovedReason}"); + } + } } if (dxform.Form.WindowState == FormWindowState.Minimized) { @@ -357,30 +392,32 @@ namespace CodeWalker.Rendering GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); while (dxform.Form.WindowState == FormWindowState.Minimized) { - await Task.Delay(100, cancellationToken).ConfigureAwait(false); //don't hog CPU when minimised - if (dxform.Form.IsDisposed || cancellationToken.IsCancellationRequested) return; //if closed while minimised + await Task.Delay(100, dxform.CancellationToken); //don't hog CPU when minimised + if (dxform.Form.IsDisposed || dxform.CancellationToken.IsCancellationRequested) + return; //if closed while minimised } dxform.Pauserendering = false; Console.WriteLine("Window is maximized"); } - if (Form.ActiveForm == null) + if (Form.ActiveForm is null) { inactiveCount++; if (inactiveCount > 100) { GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(); - while (Form.ActiveForm == null) + while (Form.ActiveForm is null) { - await Task.Delay(100, cancellationToken).ConfigureAwait(false); //reduce the FPS when the app isn't active (maybe this should be configurable?) - if (context.IsDisposed || dxform.Form.IsDisposed || cancellationToken.IsCancellationRequested) return; //if form closed while sleeping (eg from rightclick on taskbar) + await Task.Delay(100, dxform.CancellationToken); //reduce the FPS when the app isn't active (maybe this should be configurable?) + if (context.IsDisposed || dxform.Form.IsDisposed || dxform.CancellationToken.IsCancellationRequested) + return; //if form closed while sleeping (eg from rightclick on taskbar) } } else { - await Task.Delay(100, cancellationToken).ConfigureAwait(false); + await Task.Delay(100, dxform.CancellationToken); } } else @@ -388,22 +425,23 @@ namespace CodeWalker.Rendering inactiveCount = 0; if (Form.ActiveForm != dxform.Form) { - await Task.Delay(25, cancellationToken).ConfigureAwait(false); + await Task.Delay(25, dxform.CancellationToken); } } - if (context.IsDisposed || dxform.Form.IsDisposed || cancellationToken.IsCancellationRequested) return; + if (context.IsDisposed || dxform.Form.IsDisposed || dxform.CancellationToken.IsCancellationRequested) + return; Rendering = true; - if (!await semaphore.WaitAsync(50, cancellationToken).ConfigureAwait(false)) + if (!await semaphore.WaitAsync(50, dxform.CancellationToken).ConfigureAwait(false)) { Console.WriteLine("Failed to get lock for syncroot"); - await Task.Delay(10, cancellationToken).ConfigureAwait(false); //don't hog CPU when not able to render... + await Task.Delay(10, dxform.CancellationToken).ConfigureAwait(false); //don't hog CPU when not able to render... continue; } - if (dxform.Form.IsDisposed || cancellationToken.IsCancellationRequested) + if (dxform.Form.IsDisposed || dxform.CancellationToken.IsCancellationRequested) { Rendering = false; return; @@ -426,7 +464,7 @@ namespace CodeWalker.Rendering if (ok) { - if (dxform.Form.IsDisposed || cancellationToken.IsCancellationRequested) + if (dxform.Form.IsDisposed || dxform.CancellationToken.IsCancellationRequested) { Rendering = false; @@ -437,7 +475,17 @@ namespace CodeWalker.Rendering try { - swapchain.Present(1, PresentFlags.None); + var result = swapchain.Present(1, PresentFlags.None); + if (result != Result.Ok) + { + if (result == SharpDX.DXGI.ResultCode.DeviceRemoved) + { + Console.WriteLine($"Device was removed {device.DeviceRemovedReason}"); + } else + { + Console.WriteLine(result.ToString()); + } + } } catch (Exception ex) { diff --git a/CodeWalker/Rendering/DirectX/DXUtility.cs b/CodeWalker/Rendering/DirectX/DXUtility.cs index 7480147..6226e76 100644 --- a/CodeWalker/Rendering/DirectX/DXUtility.cs +++ b/CodeWalker/Rendering/DirectX/DXUtility.cs @@ -11,6 +11,7 @@ using Resource = SharpDX.Direct3D11.Resource; using MapFlags = SharpDX.Direct3D11.MapFlags; using SharpDX.Mathematics.Interop; using SharpDX.Direct3D; +using CommunityToolkit.Diagnostics; namespace CodeWalker.Rendering { @@ -137,13 +138,14 @@ namespace CodeWalker.Rendering //nothing to do here break; default: - throw new Exception(); //not implemented.... + ThrowHelper.ThrowArgumentOutOfRangeException(nameof(viewDimension), viewDimension, "Given value for viewDimension is not supported"); + break; } ShaderResourceView srv = new ShaderResourceView(device, resource, srvd); return srv; } - public static UnorderedAccessView CreateUnorderedAccessView(Device device, Resource resource, Format format, UnorderedAccessViewDimension viewDimension, int firstElement, int numElements, UnorderedAccessViewBufferFlags flags, int mipSlice) + public static UnorderedAccessView? CreateUnorderedAccessView(Device device, Resource resource, Format format, UnorderedAccessViewDimension viewDimension, int firstElement, int numElements, UnorderedAccessViewBufferFlags flags, int mipSlice) { UnorderedAccessViewDescription uavd = new UnorderedAccessViewDescription(); uavd.Format = format; diff --git a/CodeWalker/Rendering/Renderable.cs b/CodeWalker/Rendering/Renderable.cs index 3897e7b..a0f9019 100644 --- a/CodeWalker/Rendering/Renderable.cs +++ b/CodeWalker/Rendering/Renderable.cs @@ -11,6 +11,8 @@ using CodeWalker.World; using SharpDX.Direct3D; using SharpDX; using System.Threading; +using System.Diagnostics; +using Collections.Pooled; namespace CodeWalker.Rendering { @@ -55,24 +57,30 @@ namespace CodeWalker.Rendering public RenderableBoundCompositeInst Inst; } - public struct RenderableInstanceBatchInst + public readonly struct RenderableInstanceBatchInst { - public RenderableInstanceBatch Batch; - public Renderable Renderable; + public readonly RenderableInstanceBatch Batch; + public readonly Renderable Renderable; + + public RenderableInstanceBatchInst(RenderableInstanceBatch batch, Renderable renderable) + { + Batch = batch; + Renderable = renderable; + } } public class Renderable : RenderableCacheItem { - public YtdFile[] SDtxds; - public YtdFile[] HDtxds; + public YtdFile[]? SDtxds; + public YtdFile[]? HDtxds; public bool AllTexturesLoaded = false; - public RenderableModel[] HDModels; - public RenderableModel[] MedModels; - public RenderableModel[] LowModels; - public RenderableModel[] VlowModels; - public RenderableModel[] AllModels; + public RenderableModel[] HDModels = Array.Empty(); + public RenderableModel[]? MedModels; + public RenderableModel[]? LowModels; + public RenderableModel[]? VlowModels; + public RenderableModel[] AllModels = Array.Empty(); public float LodDistanceHigh; public float LodDistanceMed; @@ -91,7 +99,7 @@ namespace CodeWalker.Rendering public YcdFile ClipDict; public ClipMapEntry ClipMapEntry; public Expression Expression; - public Dictionary ModelBoneLinks; + public Dictionary? ModelBoneLinks; public bool EnableRootMotion = false; //used to toggle whether or not to include root motion when playing animations @@ -116,7 +124,7 @@ namespace CodeWalker.Rendering int curmodel = hd?.Length ?? 0; AllModels = new RenderableModel[totmodels]; HDModels = new RenderableModel[hd.Length]; - if (hd != null) + if (hd is not null && hd.Length > 0) { for (int i = 0; i < hd.Length; i++) { @@ -124,7 +132,7 @@ namespace CodeWalker.Rendering AllModels[i] = HDModels[i]; } } - if (med != null) + if (med is not null && med.Length > 0) { MedModels = new RenderableModel[med.Length]; for (int i = 0; i < med.Length; i++) @@ -134,7 +142,7 @@ namespace CodeWalker.Rendering } curmodel += med.Length; } - if (low != null) + if (low is not null && low.Length > 0) { LowModels = new RenderableModel[low.Length]; for (int i = 0; i < low.Length; i++) @@ -144,7 +152,7 @@ namespace CodeWalker.Rendering } curmodel += low.Length; } - if (vlow != null) + if (vlow is not null && vlow.Length > 0) { VlowModels = new RenderableModel[vlow.Length]; for (int i = 0; i < vlow.Length; i++) @@ -177,11 +185,11 @@ namespace CodeWalker.Rendering bool hastransforms = false; bool hasbones = false; Skeleton skeleton = drawable.Skeleton; - Matrix[] modeltransforms = null; - Matrix[] fragtransforms = null; + Matrix[]? modeltransforms = null; + Matrix[]? fragtransforms = null; Vector4 fragoffset = Vector4.Zero; int fragtransformid = 0; - Bone[] bones = null; + Bone[]? bones = null; bool usepose = false; if (skeleton != null) { @@ -285,7 +293,8 @@ namespace CodeWalker.Rendering { if (bone != null) { - if (ModelBoneLinks == null) ModelBoneLinks = new Dictionary(); + if (ModelBoneLinks is null) + ModelBoneLinks = new Dictionary(); ModelBoneLinks[bone.Tag] = model; } } @@ -392,11 +401,12 @@ namespace CodeWalker.Rendering public override void Load(Device device) { - if (AllModels != null) + if (AllModels is not null) { foreach (var model in AllModels) { - if (model.Geometries == null) continue; + if (model.Geometries is null) + continue; foreach (var geom in model.Geometries) { geom.Load(device); @@ -504,11 +514,13 @@ namespace CodeWalker.Rendering foreach (var model in HDModels) { - if (model == null) continue; + if (model is null) + continue; foreach (var geom in model.Geometries) { - if (geom == null) continue; - if (geom.ClipMapEntryUV != null) + if (geom is null) + continue; + if (geom.ClipMapEntryUV is not null) { UpdateAnimUV(geom.ClipMapEntryUV, geom); //animate UVs } @@ -520,17 +532,18 @@ namespace CodeWalker.Rendering { var clipanim = cme.Clip as ClipAnimation; - if (clipanim?.Animation != null) + if (clipanim?.Animation is not null) { UpdateAnim(clipanim.Animation, clipanim.GetPlaybackTime(CurrentAnimTime)); } var clipanimlist = cme.Clip as ClipAnimationList; - if (clipanimlist?.Animations != null) + if (clipanimlist?.Animations is not null) { foreach (var canim in clipanimlist.Animations) { - if (canim?.Animation == null) continue; + if (canim?.Animation is null) + continue; UpdateAnim(canim.Animation, canim.GetPlaybackTime(CurrentAnimTime)); } } @@ -538,12 +551,18 @@ namespace CodeWalker.Rendering } private void UpdateAnim(Animation anim, float t) { - if (anim == null) - { return; } - if (anim.BoneIds?.data_items == null) - { return; } - if (anim.Sequences?.data_items == null) - { return; } + if (anim is null) + { + return; + } + if (anim.BoneIds?.data_items is null) + { + return; + } + if (anim.Sequences?.data_items is null) + { + return; + } bool interpolate = true; //how to know? eg. cs4_14_hickbar_anim shouldn't @@ -552,8 +571,10 @@ namespace CodeWalker.Rendering var dwbl = this.Key; var skel = Skeleton; var bones = skel?.BonesSorted;//.Bones?.Items;// - if (bones == null) - { return; } + if (bones is null) + { + return; + } Vector4 v; Quaternion q; @@ -580,9 +601,9 @@ namespace CodeWalker.Rendering } } - Bone bone = null; + Bone? bone = null; skel?.BonesMap?.TryGetValue(boneid, out bone); - if (bone == null) + if (bone is null) { continue; //skel.BoneTagsMap?.TryGetValue(boneiditem.BoneId, out bone); @@ -676,28 +697,27 @@ namespace CodeWalker.Rendering } } - for (int i = 0; i < bones.Length; i++) + if (ModelBoneLinks is not null) { - var bone = bones[i]; - bone.UpdateAnimTransform(); - bone.UpdateSkinTransform(); + for (int i = 0; i < bones.Length; i++) + { + var bone = bones[i]; + bone.UpdateAnimTransform(); + bone.UpdateSkinTransform(); - //update model's transform from animated bone - RenderableModel bmodel = null; - ModelBoneLinks?.TryGetValue(bone.Tag, out bmodel); + //update model's transform from animated bone + ModelBoneLinks.TryGetValue(bone.Tag, out var bmodel); - if (bmodel == null) - { continue; } - if (bmodel.IsSkinMesh) //don't transform model for skin mesh - { continue; } + if (bmodel is null || bmodel.IsSkinMesh) + continue; - bmodel.Transform = bone.AnimTransform; + bmodel.Transform = bone.AnimTransform; + } } - - } + private void UpdateAnimUV(ClipMapEntry cme, RenderableGeometry rgeom = null) { @@ -840,8 +860,8 @@ namespace CodeWalker.Rendering public class RenderableGeometry { public RenderableModel Owner; - public Buffer VertexBuffer { get; set; } - public Buffer IndexBuffer { get; set; } + public Buffer? VertexBuffer { get; set; } + public Buffer? IndexBuffer { get; set; } public VertexBufferBinding VBBinding; public DrawableGeometry DrawableGeom; public VertexType VertexType { get; set; } @@ -853,8 +873,8 @@ namespace CodeWalker.Rendering public uint TotalDataSize { get; set; } public TextureBase[] Textures; public Texture[] TexturesHD; - public RenderableTexture[] RenderableTextures; - public RenderableTexture[] RenderableTexturesHD; + public RenderableTexture?[]? RenderableTextures; + public RenderableTexture?[]? RenderableTexturesHD; public ShaderParamNames[] TextureParamHashes; public PrimitiveTopology Topology { get; set; } public bool IsFragment = false; @@ -1009,8 +1029,8 @@ namespace CodeWalker.Rendering var pl = shader.ParametersList.Parameters; var hl = shader.ParametersList.Hashes; - List texs = new List(); - List phashes = new List(); + using PooledList texs = new PooledList(); + using PooledList phashes = new PooledList(); if ((pl != null) && (hl != null)) { for (int i = 0; (i < pl.Length) && (i < hl.Length); i++) @@ -1189,34 +1209,34 @@ namespace CodeWalker.Rendering // default: // break; //} - if (VertexBuffer != null) + if (VertexBuffer is not null) { VBBinding = new VertexBufferBinding(VertexBuffer, VertexStride, 0); } - if (DrawableGeom.IndexBuffer != null) + if (DrawableGeom.IndexBuffer is not null) { IndexBuffer = Buffer.Create(device, BindFlags.IndexBuffer, DrawableGeom.IndexBuffer.Indices); } } - public void Unload() + public void Dispose() { - if (VertexBuffer != null) + if (VertexBuffer is not null) { VBBinding.Buffer = null; VertexBuffer.Dispose(); VertexBuffer = null; } - if (IndexBuffer != null) + if (IndexBuffer is not null) { IndexBuffer.Dispose(); IndexBuffer = null; } //DrawableGeom = null; - if (RenderableTextures != null) + if (RenderableTextures is not null) { for (int i = 0; i < RenderableTextures.Length; i++) { @@ -1224,7 +1244,7 @@ namespace CodeWalker.Rendering } RenderableTextures = null; } - if (RenderableTexturesHD != null) + if (RenderableTexturesHD is not null) { for (int i = 0; i < RenderableTexturesHD.Length; i++) { @@ -1232,12 +1252,17 @@ namespace CodeWalker.Rendering } RenderableTexturesHD = null; } + GC.SuppressFinalize(this); + } + public void Unload() + { + Dispose(); } public void Render(DeviceContext context) { - if ((VertexBuffer == null) || (IndexBuffer == null)) + if (VertexBuffer is null || IndexBuffer is null) { return; } @@ -1251,7 +1276,7 @@ namespace CodeWalker.Rendering public void RenderInstanced(DeviceContext context, int instCount) { - if ((VertexBuffer == null) || (IndexBuffer == null)) + if (VertexBuffer is null || IndexBuffer is null) { return; } @@ -1269,15 +1294,15 @@ namespace CodeWalker.Rendering { public uint Hash { get; private set; } public string Name { get; private set; } - public Texture2D Texture2D { get; set; } - public ShaderResourceView ShaderResourceView { get; set; } + public Texture2D? Texture2D { get; set; } + public ShaderResourceView? ShaderResourceView { get; set; } public override void Init(Texture tex) { Key = tex; - if ((Key != null) && (Key.Data != null) && (Key.Data.FullData != null)) + if (Key?.Data?.FullData is not null) { DataSize = Key.Data.FullData.Length; } @@ -1286,7 +1311,7 @@ namespace CodeWalker.Rendering public override void Load(Device device) { - if ((Key != null) && (Key.Data != null) && (Key.Data.FullData != null)) + if (Key?.Data?.FullData is not null) { using (var stream = DataStream.Create(Key.Data.FullData, true, false)) { @@ -1346,8 +1371,9 @@ namespace CodeWalker.Rendering Texture2D = new Texture2D(device, desc, boxes.ToArray()); //multiple mips ShaderResourceView = new ShaderResourceView(device, Texture2D); } - catch //(Exception ex) + catch (Exception ex) { + Console.WriteLine(ex); //string str = ex.ToString(); //todo: don't fail silently.. } } @@ -1372,12 +1398,12 @@ namespace CodeWalker.Rendering public override void Unload() { IsLoaded = false; - if (ShaderResourceView != null) + if (ShaderResourceView is not null) { ShaderResourceView.Dispose(); ShaderResourceView = null; } - if (Texture2D != null) + if (Texture2D is not null) { Texture2D.Dispose(); Texture2D = null; @@ -1385,9 +1411,9 @@ namespace CodeWalker.Rendering LoadQueued = false; } - public override string ToString() + public override string? ToString() { - return (Key != null) ? Key.ToString() : base.ToString(); + return Key?.ToString() ?? base.ToString(); } } @@ -1446,10 +1472,10 @@ namespace CodeWalker.Rendering public rage__fwGrassInstanceListDef__InstanceData[] GrassInstanceData { get; set; } public GpuSBuffer GrassInstanceBuffer { get; set; } public int InstanceCount { get; set; } - public Vector3 AABBMin { get; set; } - public Vector3 AABBMax { get; set; } - public Vector3 Position { get; set; } - public Vector3 CamRel { get; set; } + public Vector3 AABBMin; + public Vector3 AABBMax; + public Vector3 Position; + public Vector3 CamRel; public override void Init(YmapGrassInstanceBatch batch) { @@ -1513,13 +1539,13 @@ namespace CodeWalker.Rendering public float Distance; } - public LODLight[] Points; - public LODLight[] Spots; - public LODLight[] Caps; + public LODLight[] Points = Array.Empty(); + public LODLight[] Spots = Array.Empty(); + public LODLight[] Caps = Array.Empty(); - public GpuSBuffer PointsBuffer { get; set; } - public GpuSBuffer SpotsBuffer { get; set; } - public GpuSBuffer CapsBuffer { get; set; } + public GpuSBuffer? PointsBuffer { get; set; } + public GpuSBuffer? SpotsBuffer { get; set; } + public GpuSBuffer? CapsBuffer { get; set; } public override void Init(YmapFile key) @@ -1529,17 +1555,18 @@ namespace CodeWalker.Rendering var ll = key.LODLights; var dll = key.Parent?.DistantLODLights; - if (ll == null) return; - if (dll == null) return; + if (ll == null) + return; + if (dll == null) + return; - if (ll.LodLights == null) - { return; } + if (ll.LodLights == null || ll.LodLights.Length == 0) + { + return; + } var n = ll.LodLights.Length; - if (n <= 0) - { return; } - var points = new List(); var spots = new List(); @@ -1548,7 +1575,8 @@ namespace CodeWalker.Rendering for (int i = 0; i < n; i++) { var l = ll.LodLights[i]; - if (l.Enabled == false || l.Visible == false) continue; + if (l.Enabled == false || l.Visible == false) + continue; var light = new LODLight(); light.Position = l.Position; light.Colour = (uint)l.Colour.ToBgra(); @@ -1577,77 +1605,101 @@ namespace CodeWalker.Rendering } } - Points = points.ToArray(); - Spots = spots.ToArray(); - Caps = caps.ToArray(); + Points = points.Count > 0 ? points.ToArray() : Array.Empty(); + Spots = spots.Count > 0 ? spots.ToArray() : Array.Empty(); + Caps = caps.Count > 0 ? caps.ToArray() : Array.Empty(); DataSize = (points.Count + spots.Count + caps.Count) * 80; } - public (int, int, int) UpdateLods(Vector3 refPos) + private int spotsIndex = 0, pointsIndex = 0, capsIndex = 0; + public (int, int, int) UpdateLods(in Vector3 refPos, bool updateLods = true) { - for (int i = 0; i < Points.Length; i++) + if (!updateLods) { - Points[i].Distance = Vector3.DistanceSquared(refPos, Points[i].Position); - } - for (int i = 0; i < Spots.Length; i++) - { - Spots[i].Distance = Vector3.DistanceSquared(refPos, Spots[i].Position); + return (spotsIndex, pointsIndex, capsIndex); } - for (int i = 0; i < Caps.Length; i++) + if (Points.Length > 0) { - Caps[i].Distance = Vector3.DistanceSquared(refPos, Caps[i].Position); - } - - Array.Sort(Points, (a, b) => a.Distance.CompareTo(b.Distance)); - Array.Sort(Spots, (a, b) => a.Distance.CompareTo(b.Distance)); - Array.Sort(Caps, (a, b) => a.Distance.CompareTo(b.Distance)); - - var spotsIndex = 0; - var pointsIndex = 0; - var capsIndex = 0; - for (int i = 0; i < Points.Length; i++) - { - if (Points[i].Distance > 100_000) + for (int i = 0; i < Points.Length; i++) { - pointsIndex = i; - break; + Points[i].Distance = Vector3.DistanceSquared(refPos, Points[i].Position); } - } - for (int i = 0; i < Spots.Length; i++) - { - if (Spots[i].Distance > 100_000) + + Array.Sort(Points, (a, b) => b.Distance.CompareTo(a.Distance)); + + pointsIndex = -1; + + for (int i = Points.Length - 1; i > 0; i--) { - spotsIndex = i; - break; + if (Points[i].Distance > 100_000) + { + pointsIndex = i; + break; + } } } - for (int i = 0; i < Caps.Length; i++) + + if (Spots.Length > 0) { - if (Caps[i].Distance > 100_000) + for (int i = 0; i < Spots.Length; i++) { - capsIndex = i; - break; + Spots[i].Distance = Vector3.DistanceSquared(refPos, Spots[i].Position); + } + + Array.Sort(Spots, (a, b) => b.Distance.CompareTo(a.Distance)); + + spotsIndex = -1; + + for (int i = Spots.Length - 1; i > 0; i--) + { + if (Spots[i].Distance > 100_000) + { + spotsIndex = i; + break; + } } } - return (pointsIndex, spotsIndex, capsIndex); + + if (Caps.Length > 0) + { + for (int i = 0; i < Caps.Length; i++) + { + Caps[i].Distance = Vector3.DistanceSquared(refPos, Caps[i].Position); + } + + Array.Sort(Caps, (a, b) => b.Distance.CompareTo(a.Distance)); + + capsIndex = -1; + + for (int i = Caps.Length - 1; i > 0; i--) + { + if (Caps[i].Distance > 100_000) + { + capsIndex = i; + break; + } + } + } + + return (spotsIndex, pointsIndex, capsIndex); } public override void Load(Device device) { - if ((Points != null) && (Points.Length > 0)) + if (Points.Length > 0) { PointsBuffer = new GpuSBuffer(device, Points); } - if ((Spots != null) && (Spots.Length > 0)) + if (Spots.Length > 0) { SpotsBuffer = new GpuSBuffer(device, Spots); } - if ((Caps != null) && (Caps.Length > 0)) + if (Caps.Length > 0) { CapsBuffer = new GpuSBuffer(device, Caps); } @@ -1695,7 +1747,7 @@ namespace CodeWalker.Rendering public override void Init(YmapDistantLODLights key) { Key = key; - if ((key.positions == null) || (key.colours == null)) + if (key.positions.Length == 0 || key.colours.Length == 0) { return; } @@ -1735,7 +1787,6 @@ namespace CodeWalker.Rendering InstanceBuffer = null; } } - } @@ -1745,16 +1796,16 @@ namespace CodeWalker.Rendering public EditorVertex[] PathVertices; public int PathVertexCount { get; set; } - public Buffer PathVertexBuffer { get; set; } + public Buffer? PathVertexBuffer { get; set; } public VertexBufferBinding PathVBBinding; public EditorVertex[] TriangleVertices; public int TriangleVertexCount { get; set; } - public Buffer TriangleVertexBuffer { get; set; } + public Buffer? TriangleVertexBuffer { get; set; } public VertexBufferBinding TriangleVBBinding; public Vector4[] Nodes; - public GpuSBuffer NodeBuffer { get; set; } + public GpuSBuffer? NodeBuffer { get; set; } public override void Init(BasePathData key) { @@ -1762,30 +1813,20 @@ namespace CodeWalker.Rendering DataSize = 0; PathVertices = key.GetPathVertices(); - if (PathVertices != null) - { - PathVertexCount = PathVertices.Length; - DataSize = PathVertices.Length * VertexStride; - } + PathVertexCount = PathVertices.Length; + DataSize = PathVertices.Length * VertexStride; TriangleVertices = key.GetTriangleVertices(); - if (TriangleVertices != null) - { - TriangleVertexCount = TriangleVertices.Length; - DataSize += TriangleVertices.Length * VertexStride; - } + TriangleVertexCount = TriangleVertices.Length; + DataSize += TriangleVertices.Length * VertexStride; Nodes = key.GetNodePositions(); - if (Nodes != null) - { - DataSize += Nodes.Length * 16;//sizeof(Vector4) - } - + DataSize += Nodes.Length * 16;//sizeof(Vector4) } public override void Load(Device device) { - if ((PathVertices != null) && (PathVertices.Length > 0)) + if (PathVertices != null && PathVertices.Length > 0) { PathVertexBuffer = Buffer.Create(device, BindFlags.VertexBuffer, PathVertices); if (PathVertexBuffer != null) @@ -1794,7 +1835,7 @@ namespace CodeWalker.Rendering } } - if ((TriangleVertices != null) && (TriangleVertices.Length > 0)) + if (TriangleVertices != null && TriangleVertices.Length > 0) { TriangleVertexBuffer = Buffer.Create(device, BindFlags.VertexBuffer, TriangleVertices); if (TriangleVertexBuffer != null) @@ -1803,7 +1844,7 @@ namespace CodeWalker.Rendering } } - if ((Nodes != null) && (Nodes.Length > 0)) + if (Nodes != null && Nodes.Length > 0) { NodeBuffer = new GpuSBuffer(device, Nodes); } @@ -2217,8 +2258,10 @@ namespace CodeWalker.Rendering p1 = bgeom.GetVertex(bcap.capsuleIndex1); p2 = bgeom.GetVertex(bcap.capsuleIndex2); a1 = p2 - p1; - n1 = Vector3.Normalize(a1); - p3 = Vector3.Normalize(n1.GetPerpVec()); + n1 = a1; + n1.Normalize(); + p3 = n1.GetPerpVec(); + p3.Normalize(); //p4 = Vector3.Normalize(Vector3.Cross(n1, p3)); Quaternion q1 = Quaternion.Invert(Quaternion.LookAtRH(Vector3.Zero, p3, n1)); rcapsules[curcapsule].Point1 = p1; @@ -2320,10 +2363,7 @@ namespace CodeWalker.Rendering var colourf = BoundsMaterialTypes.GetMaterialColour(mat); var colour = (uint)colourf.ToRgba(); - var rsph = new RenderableSphere(); - rsph.Colour = colour; - rsph.Center = Vector3.TransformCoordinate(bsph.SphereCenter, xform); - rsph.Radius = bsph.SphereRadius; + var rsph = new RenderableSphere(Vector3.TransformCoordinate(bsph.SphereCenter, xform), bsph.SphereRadius, colour); Spheres = new[] { rsph }; @@ -2346,12 +2386,13 @@ namespace CodeWalker.Rendering var extent = (bbox.BoxMax - bbox.BoxMin).Abs(); - var rbox = new RenderableBox(); - rbox.Colour = colour; - rbox.Corner = Vector3.TransformCoordinate(bbox.BoxMin, xform); - rbox.Edge1 = Vector3.TransformNormal(new Vector3(extent.X, 0, 0), xform); - rbox.Edge2 = Vector3.TransformNormal(new Vector3(0, extent.Y, 0), xform); - rbox.Edge3 = Vector3.TransformNormal(new Vector3(0, 0, extent.Z), xform); + var rbox = new RenderableBox( + Vector3.TransformCoordinate(bbox.BoxMin, xform), + colour, + Vector3.TransformNormal(new Vector3(extent.X, 0, 0), xform), + Vector3.TransformNormal(new Vector3(0, extent.Y, 0), xform), + Vector3.TransformNormal(new Vector3(0, 0, extent.Z), xform) + ); Boxes = new[] { rbox }; @@ -2529,23 +2570,23 @@ namespace CodeWalker.Rendering } - public struct RenderableBox + public struct RenderableBox(Vector3 corner, uint colour, Vector3 edge1, Vector3 edge2, Vector3 edge3) { - public Vector3 Corner { get; set; } - public uint Colour { get; set; } - public Vector3 Edge1 { get; set; } - public float Pad1 { get; set; } - public Vector3 Edge2 { get; set; } - public float Pad2 { get; set; } - public Vector3 Edge3 { get; set; } - public float Pad3 { get; set; } + public Vector3 Corner { get; set; } = corner; + public uint Colour { get; set; } = colour; + public Vector3 Edge1 { get; set; } = edge1; + public float Pad1 { get; init; } + public Vector3 Edge2 { get; set; } = edge2; + public float Pad2 { get; init; } + public Vector3 Edge3 { get; set; } = edge3; + public float Pad3 { get; init; } } - public struct RenderableSphere + public struct RenderableSphere(Vector3 center, float radius, uint colour) { - public Vector3 Center { get; set; } - public float Radius { get; set; } + public Vector3 Center { get; set; } = center; + public float Radius { get; set; } = radius; public Vector3 Pad0 { get; set; } - public uint Colour { get; set; } + public uint Colour { get; set; } = colour; } public struct RenderableCapsule { @@ -2569,10 +2610,10 @@ namespace CodeWalker.Rendering } - public struct RenderableEntity + public struct RenderableEntity(YmapEntityDef entity, Renderable renderable) { - public YmapEntityDef Entity; - public Renderable Renderable; + public YmapEntityDef Entity = entity; + public Renderable Renderable = renderable; } diff --git a/CodeWalker/Rendering/RenderableCache.cs b/CodeWalker/Rendering/RenderableCache.cs index 0058702..b6aeb6e 100644 --- a/CodeWalker/Rendering/RenderableCache.cs +++ b/CodeWalker/Rendering/RenderableCache.cs @@ -135,7 +135,8 @@ namespace CodeWalker.Rendering public bool ContentThreadProc() { - if (currentDevice == null) return false; //can't do anything with no device + if (currentDevice == null) + return false; //can't do anything with no device Monitor.Enter(updateSyncRoot); try @@ -211,35 +212,35 @@ namespace CodeWalker.Rendering waterquads.RenderThreadSync(currentDevice); } - public Renderable GetRenderable(DrawableBase drawable) + public Renderable? GetRenderable(DrawableBase drawable) { return renderables.Get(drawable); } - public RenderableTexture GetRenderableTexture(Texture texture) + public RenderableTexture? GetRenderableTexture(Texture texture) { return textures.Get(texture); } - public RenderableBoundComposite GetRenderableBoundComp(Bounds bound) + public RenderableBoundComposite? GetRenderableBoundComp(Bounds bound) { return boundcomps.Get(bound); } - public RenderableInstanceBatch GetRenderableInstanceBatch(YmapGrassInstanceBatch batch) + public RenderableInstanceBatch? GetRenderableInstanceBatch(YmapGrassInstanceBatch batch) { return instbatches.Get(batch); } - public RenderableDistantLODLights GetRenderableDistantLODLights(YmapDistantLODLights lights) + public RenderableDistantLODLights? GetRenderableDistantLODLights(YmapDistantLODLights lights) { return distlodlights.Get(lights); } - public RenderableLODLights GetRenderableLODLights(YmapFile ymap) + public RenderableLODLights? GetRenderableLODLights(YmapFile ymap) { return lodlights.Get(ymap); } - public RenderablePathBatch GetRenderablePathBatch(BasePathData pathdata) + public RenderablePathBatch? GetRenderablePathBatch(BasePathData pathdata) { return pathbatches.Get(pathdata); } - public RenderableWaterQuad GetRenderableWaterQuad(WaterQuad quad) + public RenderableWaterQuad? GetRenderableWaterQuad(WaterQuad quad) { return waterquads.Get(quad); } @@ -278,7 +279,7 @@ namespace CodeWalker.Rendering LoadQueued = 2, } - public abstract class RenderableCacheItem + public abstract class RenderableCacheItem: IDisposable { public TKey Key; public volatile bool IsLoaded = false; @@ -290,6 +291,12 @@ namespace CodeWalker.Rendering public abstract void Init(TKey key); public abstract void Load(Device device); public abstract void Unload(); + + public void Dispose() + { + Unload(); + GC.SuppressFinalize(this); + } } public class RenderableCacheLookup where TVal: RenderableCacheItem, new() @@ -303,43 +310,23 @@ namespace CodeWalker.Rendering public long CacheUse = 0; public double CacheTime; public int LoadedCount = 0;//temporary, per loop - private long LastFrameTime = 0; public RenderableCacheLookup(long limit, double time) { CacheLimit = limit; CacheTime = time; - LastFrameTime = DateTime.UtcNow.ToBinary(); } - public int QueueLength - { - get - { - return itemsToLoad.Count; - } - } - public int CurrentLoadedCount - { - get - { - return loadeditems.Count; - } - } - public int CurrentCacheCount - { - get - { - return cacheitems.Count; - } - } + public int QueueLength => itemsToLoad.Count; + public int CurrentLoadedCount => loadeditems.Count; + public int CurrentCacheCount => cacheitems.Count; public void Clear() { itemsToLoad = new ConcurrentQueue(); foreach (TVal rnd in loadeditems) { - rnd.Unload(); + rnd.Dispose(); } loadeditems.Clear(); cacheitems.Clear(); @@ -398,7 +385,7 @@ namespace CodeWalker.Rendering //unload items that haven't been used in longer than the cache period. //var now = DateTime.UtcNow; var rnode = loadeditems.First; - while (rnode != null) + while (rnode is not null) { var lastUsed = rnode.Value.LastUseTime.Elapsed; if (lastUsed.TotalSeconds > CacheTime) @@ -418,7 +405,6 @@ namespace CodeWalker.Rendering public void RenderThreadSync(Device device) { - LastFrameTime = DateTime.UtcNow.ToBinary(); TVal item; TKey key; while (keysToInvalidate.TryDequeue(out key)) @@ -445,37 +431,44 @@ namespace CodeWalker.Rendering } - public TVal Get(TKey key) + public TVal? Get(TKey? key) { - if (key == null) return null; - TVal item = null; - if (!cacheitems.TryGetValue(key, out item)) + if (key is null) + { + return null; + } + + if (!cacheitems.TryGetValue(key, out var item)) { item = new TVal(); item.Init(key); cacheitems.Add(key, item); } + item.LastUseTime.Restart(); - if ((!item.IsLoaded) && (!item.LoadQueued))// || + if (!item.IsLoaded && !item.LoadQueued)// || { item.LoadQueued = true; itemsToLoad.Enqueue(item); } + return item; } - public void Invalidate(TKey key) + public void Invalidate(TKey? key) { - if (key == null) return; + if (key is null) + { + return; + } keysToInvalidate.Enqueue(key); } public void UpdateImmediate(TKey key, Device device) { - TVal item; - if (cacheitems.TryGetValue(key, out item)) + if (cacheitems.TryGetValue(key, out var item)) { Interlocked.Add(ref CacheUse, -item.DataSize); item.Unload(); diff --git a/CodeWalker/Rendering/Renderer.cs b/CodeWalker/Rendering/Renderer.cs index 0dd92df..9c91f6d 100644 --- a/CodeWalker/Rendering/Renderer.cs +++ b/CodeWalker/Rendering/Renderer.cs @@ -5,6 +5,7 @@ using SharpDX; using SharpDX.Direct3D11; using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using System.Threading; @@ -13,22 +14,16 @@ using static CodeWalker.Rendering.RenderableLODLights; namespace CodeWalker.Rendering { + //TODO: Figure out if Renderer can be made a singleton so multiple forms can share GPU resources public class Renderer { private DXForm Form; - private GameFileCache gameFileCache; - private RenderableCache renderableCache; - public RenderableCache RenderableCache { get { return renderableCache; } } - - private DXManager dxman = new DXManager(); - public DXManager DXMan { get { return dxman; } } - private Device currentdevice; - public Device Device { get { return currentdevice; } } - private object rendersyncroot = new object(); - public object RenderSyncRoot { get { return rendersyncroot; } } - - public ShaderManager shaders; - + private readonly GameFileCache gameFileCache; + public RenderableCache RenderableCache { get; } = new RenderableCache(); + public DXManager DXMan { get; } = new DXManager(); + public Device? Device { get; private set; } + public SemaphoreSlim RenderSyncRoot { get; } = new SemaphoreSlim(1, 1); + public ShaderManager? Shaders { get; private set; } public Camera camera; private double currentRealTime = 0; @@ -79,7 +74,7 @@ namespace CodeWalker.Rendering public float MapViewDetail = 1.0f; - private UnitQuad markerquad = null; + private UnitQuad? markerquad = null; public bool markerdepthclip = Settings.Default.MarkerDepthClip; @@ -173,8 +168,7 @@ namespace CodeWalker.Rendering public Renderer(DXForm form, GameFileCache cache) { Form = form; - gameFileCache = cache ?? GameFileCacheFactory.GetInstance(); - renderableCache = new RenderableCache(); + gameFileCache = cache ?? GameFileCacheFactory.Instance; var s = Settings.Default; camera = new Camera(s.CameraSmoothing, s.CameraSensitivity, s.CameraFieldOfView); @@ -183,22 +177,22 @@ namespace CodeWalker.Rendering public bool Init() { - return dxman.Init(Form, false); + return DXMan.Init(Form, false); } public void Start() { - dxman.Start(); + DXMan.Start(); } public void DeviceCreated(Device device, int width, int height) { - currentdevice = device; + Device = device; - shaders = new ShaderManager(device, dxman); - shaders.OnWindowResize(width, height); //init the buffers + Shaders = new ShaderManager(device, DXMan); + Shaders.OnWindowResize(width, height); //init the buffers - renderableCache.OnDeviceCreated(device); + RenderableCache.OnDeviceCreated(device); camera.OnWindowResize(width, height); //init the projection stuff @@ -209,31 +203,38 @@ namespace CodeWalker.Rendering public void DeviceDestroyed() { - renderableCache.OnDeviceDestroyed(); + RenderableCache.OnDeviceDestroyed(); - markerquad.Dispose(); + markerquad?.Dispose(); + markerquad = null; - shaders.Dispose(); + Shaders?.Dispose(); + Shaders = null; - currentdevice = null; + Device = null; } public void BuffersResized(int width, int height) { - lock (rendersyncroot) + using (RenderSyncRoot.WaitDisposable()) { camera.OnWindowResize(width, height); - shaders.OnWindowResize(width, height); + Shaders?.OnWindowResize(width, height); } } public void ReloadShaders() { - if (shaders != null) + if (Device is null) + return; + + if (Shaders is not null) { - shaders.Dispose(); + Shaders.Dispose(); + Shaders = null; } - shaders = new ShaderManager(currentdevice, dxman); + + Shaders = new ShaderManager(Device, DXMan); } @@ -243,9 +244,9 @@ namespace CodeWalker.Rendering fcelapsed += elapsed; if (fcelapsed >= 0.5f) { - fps = framecount * 2; + fps = (int)(framecount * (1.0f / fcelapsed)); framecount = 0; - fcelapsed -= 0.5f; + fcelapsed = 0.0f; } if (elapsed > 0.1f) elapsed = 0.1f; currentRealTime += elapsed; @@ -276,11 +277,11 @@ namespace CodeWalker.Rendering { context = ctx; - dxman.ClearRenderTarget(context); + DXMan.ClearRenderTarget(context); - shaders.BeginFrame(context, currentRealTime, currentElapsedTime); + Shaders.BeginFrame(context, currentRealTime, currentElapsedTime); - shaders.EnsureShaderTextures(gameFileCache, renderableCache); + Shaders.EnsureShaderTextures(gameFileCache, RenderableCache); @@ -310,29 +311,37 @@ namespace CodeWalker.Rendering RenderClouds(); - shaders.ClearDepth(context); + Shaders.ClearDepth(context); } public void RenderQueued() { - shaders.RenderQueued(context, camera, currentWindVec); + try + { + Shaders.RenderQueued(context, camera, currentWindVec); - RenderSkeletons(); + RenderSkeletons(); + } + catch(Exception ex) + { + Console.WriteLine(ex); + throw; + } } public void RenderFinalPass() { - shaders.RenderFinalPass(context); + Shaders.RenderFinalPass(context); } public void EndRender() { - renderableCache.RenderThreadSync(); + RenderableCache.RenderThreadSync(); } public bool ContentThreadProc() { - bool rcItemsPending = renderableCache.ContentThreadProc(); + bool rcItemsPending = RenderableCache.ContentThreadProc(); return rcItemsPending; } @@ -347,16 +356,25 @@ namespace CodeWalker.Rendering public void SetWeatherType(string name) { - if (!Monitor.TryEnter(rendersyncroot, 50)) - { return; } //couldn't get a lock... - weathertype = name; - weather.SetNextWeather(weathertype); - Monitor.Exit(rendersyncroot); + if (!RenderSyncRoot.Wait(50)) + { + Console.WriteLine("Failed to get lock after 50 ms on SetWeatherType"); + return; + } //couldn't get a lock... + try + { + weathertype = name; + weather.SetNextWeather(weathertype); + } + finally + { + RenderSyncRoot.Release(); + } } public void SetCameraMode(string modestr) { - lock (rendersyncroot) + using (RenderSyncRoot.WaitDisposable()) { switch (modestr) { @@ -376,69 +394,65 @@ namespace CodeWalker.Rendering } camera.IsMapView = MapViewEnabled; } + } public string GetStatusText() { - var rgc = shaders?.RenderedGeometries ?? 0; - var crc = renderableCache.LoadedRenderableCount; - var ctc = renderableCache.LoadedTextureCount; - var vr = renderableCache.TotalGraphicsMemoryUse + (shaders != null ? shaders.TotalGraphicsMemoryUse : 0); + var rgc = Shaders?.RenderedGeometries ?? 0; + var crc = RenderableCache.LoadedRenderableCount; + var rverts = Shaders?.RenderedVeritices ?? 0; + var ctc = RenderableCache.LoadedTextureCount; + var vr = RenderableCache.TotalGraphicsMemoryUse + (Shaders != null ? Shaders.TotalGraphicsMemoryUse : 0); var vram = TextUtil.GetBytesReadable(vr); var cacheUsage = TextUtil.GetBytesReadable(gameFileCache.MemoryUsage); var cacheMax = TextUtil.GetBytesReadable(gameFileCache.MaxMemoryUsage); - return $"Drawn: {rgc} geom, Loaded: {crc} dr, {ctc} tx, Vram: {vram}, Fps: {fps}, Cache: {cacheUsage}/{cacheMax}"; + return $"Drawn: {rgc} geom, {rverts} verts, Loaded: {crc} dr, {ctc} tx, Vram: {vram}, Fps: {fps}, Cache: {cacheUsage}/{cacheMax}"; } public void Invalidate(Bounds bounds) { - renderableCache.Invalidate(bounds); + RenderableCache.Invalidate(bounds); } public void Invalidate(BasePathData path) { - renderableCache.Invalidate(path); + RenderableCache.Invalidate(path); } public void Invalidate(YmapGrassInstanceBatch batch) { - renderableCache.Invalidate(batch); + RenderableCache.Invalidate(batch); } public void Invalidate(YmapLODLight lodlight) { - renderableCache.Invalidate(lodlight); + RenderableCache.Invalidate(lodlight); } public void UpdateSelectionDrawFlags(DrawableModel model, DrawableGeometry geom, bool rem) { - lock (rendersyncroot) + using (RenderSyncRoot.WaitDisposable()) { - if (model != null) + if (model is not null) { if (rem) { - if (SelectionModelDrawFlags.ContainsKey(model)) - { - SelectionModelDrawFlags.Remove(model); - } + SelectionModelDrawFlags.Remove(model); } else { SelectionModelDrawFlags[model] = false; } } - if (geom != null) + if (geom is not null) { if (rem) { - if (SelectionGeometryDrawFlags.ContainsKey(geom)) - { - SelectionGeometryDrawFlags.Remove(geom); - } + SelectionGeometryDrawFlags.Remove(geom); } else { @@ -471,7 +485,7 @@ namespace CodeWalker.Rendering Color4 lightnaturaldowncolour = new Color4(0.0f); Color4 lightartificialupcolour = new Color4(0.0f); Color4 lightartificialdowncolour = new Color4(0.0f); - bool hdr = (shaders != null) ? shaders.hdr : false; + bool hdr = (Shaders != null) ? Shaders.hdr : false; float hdrint = 1.0f; Vector3 sundir = Vector3.Up; Vector3 moondir = Vector3.Down; @@ -599,9 +613,9 @@ namespace CodeWalker.Rendering globalLights.Params.LightArtificialAmbDown = renderartificialambientlight ? lightartificialdowncolour : Color4.Black; - if (shaders != null) + if (Shaders != null) { - shaders.SetGlobalLightParams(globalLights); + Shaders.SetGlobalLightParams(globalLights); } } @@ -639,29 +653,29 @@ namespace CodeWalker.Rendering - public void RenderMarkers(List batch) { + if (Shaders is null || markerquad is null) + return; - shaders.SetRasterizerMode(context, RasterizerMode.SolidDblSided); //hmm they are backwards - shaders.SetDepthStencilMode(context, markerdepthclip ? DepthStencilMode.Enabled : DepthStencilMode.DisableAll); - shaders.SetDefaultBlendState(context); + Shaders.SetRasterizerMode(context, RasterizerMode.SolidDblSided); //hmm they are backwards + Shaders.SetDepthStencilMode(context, markerdepthclip ? DepthStencilMode.Enabled : DepthStencilMode.DisableAll); + Shaders.SetDefaultBlendState(context); - var shader = shaders.Marker; + var shader = Shaders.Marker; shader.SetShader(context); shader.SetInputLayout(context, VertexType.Default); shader.SetSceneVars(context, camera, null, globalLights); - MapIcon icon = null; foreach (var marker in batch) { - icon = marker.Icon; + var icon = marker.Icon; Vector2 texs = new Vector2(icon.TexWidth, icon.TexHeight); Vector2 size = texs * marker.Distance; Vector2 offset = (new Vector2(texs.X, -texs.Y) - new Vector2(icon.Center.X, -icon.Center.Y) * 2.0f) * marker.Distance; shader.SetMarkerVars(context, marker.CamRelPos, size, offset); shader.SetTexture(context, icon.TexView); - markerquad.Draw(context); + markerquad?.Draw(context); } shader.UnbindResources(context); @@ -672,18 +686,20 @@ namespace CodeWalker.Rendering public void RenderTransformWidget(TransformWidget widget) { + if (Shaders is null) + return; var dsmode = DepthStencilMode.Enabled; if (widget.Mode == WidgetMode.Rotation) { dsmode = DepthStencilMode.DisableAll; } - shaders.SetRasterizerMode(context, RasterizerMode.SolidDblSided); - shaders.SetDepthStencilMode(context, dsmode); - shaders.SetDefaultBlendState(context); - shaders.ClearDepth(context, false); + Shaders.SetRasterizerMode(context, RasterizerMode.SolidDblSided); + Shaders.SetDepthStencilMode(context, dsmode); + Shaders.SetDefaultBlendState(context); + Shaders.ClearDepth(context, false); - var shader = shaders.Widgets; + var shader = Shaders.Widgets; widget.Render(context, camera, shader); } @@ -716,19 +732,19 @@ namespace CodeWalker.Rendering } - public void RenderBrushRadiusOutline(Vector3 position, Vector3 dir, Vector3 up, float radius, uint col) + public void RenderBrushRadiusOutline(in Vector3 position, in Vector3 dir, in Vector3 up, float radius, uint col) { const int Reso = 36; const float MaxDeg = 360f; const float DegToRad = 0.0174533f; const float Ang = DegToRad * MaxDeg / Reso; - var axis = Vector3.Cross(dir, up); + var axis = Vectors.Cross(in dir, in up); var c = new VertexTypePC[Reso]; for (var i = 0; i < Reso; i++) { - var rDir = Quaternion.RotationAxis(dir, i * Ang).Multiply(axis); + var rDir = dir.RotationAxis(i * Ang).Multiply(axis); c[i].Position = position + (rDir * radius); c[i].Colour = col; } @@ -739,7 +755,7 @@ namespace CodeWalker.Rendering SelectionLineVerts.Add(c[(i + 1) % c.Length]); } - SelectionLineVerts.Add(new VertexTypePC{Colour = col, Position = position}); + SelectionLineVerts.Add(new VertexTypePC { Colour = col, Position = position }); SelectionLineVerts.Add(new VertexTypePC { Colour = col, Position = position + dir * 2f}); } @@ -747,26 +763,30 @@ namespace CodeWalker.Rendering { if (mode == BoundsShaderMode.Box) { - var wbox = new MapBox(); - wbox.CamRelPos = camrel; - wbox.BBMin = bbmin; - wbox.BBMax = bbmax; - wbox.Scale = scale; - wbox.Orientation = ori; + var wbox = new MapBox + { + CamRelPos = camrel, + BBMin = bbmin, + BBMax = bbmax, + Scale = scale, + Orientation = ori, + }; WhiteBoxes.Add(wbox); } else if (mode == BoundsShaderMode.Sphere) { - var wsph = new MapSphere(); - wsph.CamRelPos = camrel; - wsph.Radius = bsphrad; + var wsph = new MapSphere + { + CamRelPos = camrel, + Radius = bsphrad, + }; WhiteSpheres.Add(wsph); } } - public void RenderSelectionArrowOutline(Vector3 pos, Vector3 dir, Vector3 up, Quaternion ori, float len, float rad, uint colour) + public void RenderSelectionArrowOutline(in Vector3 pos, in Vector3 dir, in Vector3 up, in Quaternion ori, float len, float rad, uint colour) { - Vector3 ax = Vector3.Cross(dir, up); + dir.Cross(in up, out Vector3 ax); Vector3 sx = ax * rad; Vector3 sy = up * rad; Vector3 sz = dir * len; @@ -839,16 +859,18 @@ namespace CodeWalker.Rendering } - public void RenderSelectionCircle(Vector3 position, float radius, uint col) + public void RenderSelectionCircle(in Vector3 position, float radius, uint col) { const int Reso = 36; const float MaxDeg = 360f; const float DegToRad = 0.0174533f; const float Ang = DegToRad * MaxDeg / Reso; - var dir = Vector3.Normalize(position - camera.Position); - var up = Vector3.Normalize(dir.GetPerpVec()); - var axis = Vector3.Cross(dir, up); + position.Add(in camera.Position, out var dir); + dir.Normalize(); + dir.GetPerpVec(out var up); + up.Normalize(); + dir.Cross(in up, out var axis); var c = new VertexTypePC[Reso]; for (var i = 0; i < Reso; i++) @@ -865,7 +887,7 @@ namespace CodeWalker.Rendering } } - public void RenderSelectionCircle(Vector3 position, Vector3 ax, Vector3 ay, float radius, uint col) + public void RenderSelectionCircle(in Vector3 position, in Vector3 ax, in Vector3 ay, float radius, uint col) { const int Reso = 36; const float MaxDeg = 360f; @@ -890,7 +912,7 @@ namespace CodeWalker.Rendering } } - public void RenderSelectionArc(Vector3 position, Vector3 ax, Vector3 ay, float radius, float angle, uint col) + public void RenderSelectionArc(in Vector3 position, in Vector3 ax, in Vector3 ay, float radius, float angle, uint col) { int res = (int)(angle * 0.1f); const float DegToRad = 0.0174533f; @@ -914,7 +936,7 @@ namespace CodeWalker.Rendering } } - public void RenderSelectionLine(Vector3 p1, Vector3 p2, uint col) + public void RenderSelectionLine(in Vector3 p1, in Vector3 p2, uint col) { SelectionLineVerts.Add(new VertexTypePC() { Position = p1, Colour = col }); SelectionLineVerts.Add(new VertexTypePC() { Position = p2, Colour = col }); @@ -944,7 +966,7 @@ namespace CodeWalker.Rendering SelectionLineVerts.Add(new VertexTypePC() { Position = p1, Colour = col }); } - public void RenderSelectionCone(Vector3 position, Vector3 ax, Vector3 ay, Vector3 dir, float radius, float height, uint col) + public void RenderSelectionCone(in Vector3 position, in Vector3 ax, in Vector3 ay, in Vector3 dir, float radius, float height, uint col) { const int Reso = 36; const float MaxDeg = 360f; @@ -974,25 +996,27 @@ namespace CodeWalker.Rendering } } - public void RenderSelectionCapsule(Vector3 position, Vector3 ax, Vector3 ay, Vector3 dir, float radius, float height, uint col) + public void RenderSelectionCapsule(in Vector3 position, in Vector3 ax, in Vector3 ay, in Vector3 dir, float radius, float height, uint col) { var cp1 = position - (dir * height); var cp2 = position + (dir * height); var axr = ax * radius; var ayr = ay * radius; - RenderSelectionCircle(cp1, ax, ay, radius, col); - RenderSelectionCircle(cp2, ax, ay, radius, col); - RenderSelectionArc(cp1, -dir, ax, radius, 180, col); - RenderSelectionArc(cp1, -dir, ay, radius, 180, col); - RenderSelectionArc(cp2, dir, ax, radius, 180, col); - RenderSelectionArc(cp2, dir, ay, radius, 180, col); + RenderSelectionCircle(in cp1, in ax, in ay, radius, col); + RenderSelectionCircle(in cp2, in ax, in ay, radius, col); + var dirNeg = -dir; + RenderSelectionArc(in cp1, in dirNeg, in ax, radius, 180, col); + RenderSelectionArc(in cp1, in dirNeg, in ay, radius, 180, col); + RenderSelectionArc(in cp2, in dir, in ax, radius, 180, col); + RenderSelectionArc(in cp2, in dir, in ay, radius, 180, col); + RenderSelectionLine(cp1 + axr, cp2 + axr, col); RenderSelectionLine(cp1 + ayr, cp2 + ayr, col); RenderSelectionLine(cp1 - axr, cp2 - axr, col); RenderSelectionLine(cp1 - ayr, cp2 - ayr, col); } - public void RenderSelectionBox(Vector3 p1, Vector3 p2, Vector3 a2, Vector3 a3, uint col) + public void RenderSelectionBox(in Vector3 p1, in Vector3 p2, in Vector3 a2, in Vector3 a3, uint col) { VertexTypePC v = new VertexTypePC(); v.Colour = col; @@ -1046,8 +1070,8 @@ namespace CodeWalker.Rendering switch (type) { case LightType.Point: - RenderSelectionCircle(pos, Vector3.UnitX, Vector3.UnitZ, extent, colwht); - RenderSelectionCircle(pos, Vector3.UnitX, Vector3.UnitY, extent, colwht); + RenderSelectionCircle(in pos, in Vector3.UnitX, in Vector3.UnitZ, extent, colwht); + RenderSelectionCircle(in pos, in Vector3.UnitX, in Vector3.UnitY, extent, colwht); RenderSelectionCircle(pos, Vector3.UnitY, Vector3.UnitZ, extent, colwht); break; case LightType.Spot: @@ -1121,7 +1145,7 @@ namespace CodeWalker.Rendering int ind1 = ynv.Indices[tid + 1]; int ind2 = ynv.Indices[tid + 2]; if ((ind1 >= vc) || (ind2 >= vc)) - { continue; } + continue; v1.Position = ynv.Vertices[ind1]; v2.Position = ynv.Vertices[ind2]; SelectionTriVerts.Add(v0); @@ -1152,7 +1176,7 @@ namespace CodeWalker.Rendering { var ind = ynv.Indices[id]; if (ind >= vc) - { continue; } + continue; v.Position = ynv.Vertices[ind]; SelectionLineVerts.Add(v); @@ -1198,10 +1222,11 @@ namespace CodeWalker.Rendering //} } - public void RenderSelectionCollisionPolyOutline(BoundPolygon poly, uint colourval, YmapEntityDef entity) + public void RenderSelectionCollisionPolyOutline(BoundPolygon poly, uint colourval, YmapEntityDef? entity) { var bgeom = poly?.Owner; - if (bgeom == null) return; + if (bgeom is null) + return; VertexTypePC v = new VertexTypePC(); v.Colour = colourval; @@ -1209,7 +1234,7 @@ namespace CodeWalker.Rendering var ori = Quaternion.Identity; var pos = Vector3.Zero; var sca = Vector3.One; - if (entity != null) + if (entity is not null) { ori = entity.Orientation; pos = entity.Position; @@ -1286,16 +1311,16 @@ namespace CodeWalker.Rendering } - shaders.SetDepthStencilMode(context, clip ? DepthStencilMode.Enabled : DepthStencilMode.DisableAll); + Shaders.SetDepthStencilMode(context, clip ? DepthStencilMode.Enabled : DepthStencilMode.DisableAll); - var pshader = shaders.Paths; + var pshader = Shaders.Paths; if (SelectionTriVerts.Count > 0) { - pshader.RenderTriangles(context, SelectionTriVerts, camera, shaders.GlobalLights); + pshader.RenderTriangles(context, SelectionTriVerts, camera, Shaders.GlobalLights); } if (SelectionLineVerts.Count > 0) { - pshader.RenderLines(context, SelectionLineVerts, camera, shaders.GlobalLights); + pshader.RenderLines(context, SelectionLineVerts, camera, Shaders.GlobalLights); } @@ -1303,7 +1328,7 @@ namespace CodeWalker.Rendering Vector3 coloursel = new Vector3(0, 1, 0) * globalLights.HdrIntensity * 5.0f; Vector3 colourwht = new Vector3(1, 1, 1) * globalLights.HdrIntensity * 10.0f; - var shader = shaders.Bounds; + var shader = Shaders.Bounds; if ((WhiteBoxes.Count > 0) || (SelectionBoxes.Count > 0)) { @@ -1375,8 +1400,8 @@ namespace CodeWalker.Rendering Vector3 colour = new Vector3(0, 0, 1) * globalLights.HdrIntensity; Vector3 colourhi = new Vector3(0, 1, 1) * globalLights.HdrIntensity; - shaders.SetDepthStencilMode(context, clip ? DepthStencilMode.Enabled : DepthStencilMode.DisableAll); - var shader = shaders.Bounds; + Shaders.SetDepthStencilMode(context, clip ? DepthStencilMode.Enabled : DepthStencilMode.DisableAll); + var shader = Shaders.Bounds; if ((BoundingBoxes.Count > 0) || (HilightBoxes.Count > 0)) { @@ -1463,14 +1488,15 @@ namespace CodeWalker.Rendering { YmapEntityDef entity = item.Entity; DrawableBase drawable = item.Renderable.Key; - Skeleton skeleton = drawable?.Skeleton; - if (skeleton == null) continue; + Skeleton? skeleton = drawable?.Skeleton; + if (skeleton is null) continue; Vector3 campos = camera.Position - (entity?.Position ?? Vector3.Zero); var pinds = skeleton.ParentIndices; var bones = skeleton.Bones?.Items; - if ((pinds == null) || (bones == null)) continue; + if (pinds is null || bones is null) + continue; var xforms = skeleton.Transformations; int cnt = Math.Min(pinds.Length, bones.Length); @@ -1500,13 +1526,13 @@ namespace CodeWalker.Rendering for (int j = 0; j < 3; j++) starverts0[j] = bone.AnimTransform.MultiplyW(starverts0[j]); for (int j = 0; j < 3; j++) starverts1[j] = bone.AnimTransform.MultiplyW(starverts1[j]); - if (pbone != null) + if (pbone is not null) { - lbeg = pbone.AnimTransform.MultiplyW(lbeg); - lend = pbone.AnimTransform.MultiplyW(lend); + lbeg = pbone.AnimTransform.MultiplyW(in lbeg); + lend = pbone.AnimTransform.MultiplyW(in lend); } - if (entity != null) + if (entity is not null) { lbeg = entity.Position + entity.Orientation.Multiply(lbeg * entity.Scale); lend = entity.Position + entity.Orientation.Multiply(lend * entity.Scale); @@ -1523,7 +1549,7 @@ namespace CodeWalker.Rendering vb.Position = starverts1[2]; skeletonLineVerts.Add(vb); - if (pbone != null) //don't draw the origin to root bone line + if (pbone is not null) //don't draw the origin to root bone line { vg.Position = lbeg; vb.Position = lend; @@ -1551,8 +1577,8 @@ namespace CodeWalker.Rendering public void RenderLines(List linelist, DepthStencilMode dsmode = DepthStencilMode.Enabled) { - shaders.SetDepthStencilMode(context, dsmode); - shaders.Paths.RenderLines(context, linelist, camera, shaders.GlobalLights); + Shaders.SetDepthStencilMode(context, dsmode); + Shaders.Paths.RenderLines(context, linelist, camera, Shaders.GlobalLights); } @@ -1562,25 +1588,28 @@ namespace CodeWalker.Rendering private void RenderSky() { - if (MapViewEnabled) return; - if (!renderskydome) return; - if (!weather.Inited) return; + if (MapViewEnabled) + return; + if (!renderskydome) + return; + if (!weather.Inited) + return; - var shader = shaders.Skydome; + var shader = Shaders.Skydome; shader.UpdateSkyLocals(weather, globalLights); - DrawableBase skydomeydr = null; + DrawableBase? skydomeydr = null; YddFile skydomeydd = gameFileCache.GetYdd(2640562617); //skydome hash if ((skydomeydd != null) && (skydomeydd.Loaded) && (skydomeydd.Dict != null)) { skydomeydr = skydomeydd.Dict.Values.FirstOrDefault(); } - Texture starfield = null; - Texture moon = null; + Texture? starfield = null; + Texture? moon = null; YtdFile skydomeytd = gameFileCache.GetYtd(2640562617); //skydome hash if ((skydomeytd != null) && (skydomeytd.Loaded) && (skydomeytd.TextureDict != null) && (skydomeytd.TextureDict.Dict != null)) { @@ -1592,89 +1621,96 @@ namespace CodeWalker.Rendering } } - Renderable sdrnd = null; - if (skydomeydr != null) + Renderable? sdrnd = null; + if (skydomeydr is not null) { - sdrnd = renderableCache.GetRenderable(skydomeydr); + sdrnd = RenderableCache.GetRenderable(skydomeydr); } - RenderableTexture sftex = null; - if (starfield != null) + RenderableTexture? sftex = null; + if (starfield is not null) { - sftex = renderableCache.GetRenderableTexture(starfield); + sftex = RenderableCache.GetRenderableTexture(starfield); } - RenderableTexture moontex = null; - if (moon != null) + RenderableTexture? moontex = null; + if (moon is not null) { - moontex = renderableCache.GetRenderableTexture(moon); + moontex = RenderableCache.GetRenderableTexture(moon); } - if ((sdrnd != null) && (sdrnd.IsLoaded) && (sftex != null) && (sftex.IsLoaded)) + + if (sdrnd is null || !sdrnd.IsLoaded || sftex is null || !sftex.IsLoaded) { - shaders.SetDepthStencilMode(context, DepthStencilMode.DisableAll); - shaders.SetRasterizerMode(context, RasterizerMode.Solid); - - RenderableInst rinst = new RenderableInst(); - rinst.Position = Vector3.Zero; - rinst.CamRel = Vector3.Zero; - rinst.Distance = 0.0f; - rinst.BBMin = skydomeydr.BoundingBoxMin; - rinst.BBMax = skydomeydr.BoundingBoxMax; - rinst.BSCenter = Vector3.Zero; - rinst.Radius = skydomeydr.BoundingSphereRadius; - rinst.Orientation = Quaternion.Identity; - rinst.Scale = Vector3.One; - rinst.TintPaletteIndex = 0; - rinst.CastShadow = false; - rinst.Renderable = sdrnd; - shader.SetShader(context); - shader.SetInputLayout(context, VertexType.PTT); - shader.SetSceneVars(context, camera, null, globalLights); - shader.SetEntityVars(context, ref rinst); - - RenderableModel rmod = ((sdrnd.HDModels != null) && (sdrnd.HDModels.Length > 0)) ? sdrnd.HDModels[0] : null; - RenderableGeometry rgeom = ((rmod != null) && (rmod.Geometries != null) && (rmod.Geometries.Length > 0)) ? rmod.Geometries[0] : null; - - if ((rgeom != null) && (rgeom.VertexType == VertexType.PTT)) - { - shader.SetModelVars(context, rmod); - shader.SetTextures(context, sftex); - - rgeom.Render(context); - } - - //shaders.SetRasterizerMode(context, RasterizerMode.SolidDblSided); - //shaders.SetDepthStencilMode(context, DepthStencilMode.Enabled); - shader.RenderSun(context, camera, weather, globalLights); - - - if ((rendermoon) && (moontex != null) && (moontex.IsLoaded)) - { - shader.RenderMoon(context, camera, weather, globalLights, moontex); - } - - - - shader.UnbindResources(context); + return; } + Shaders.SetDepthStencilMode(context, DepthStencilMode.DisableAll); + Shaders.SetRasterizerMode(context, RasterizerMode.Solid); + + RenderableInst rinst = new RenderableInst(); + rinst.Position = Vector3.Zero; + rinst.CamRel = Vector3.Zero; + rinst.Distance = 0.0f; + rinst.BBMin = skydomeydr!.BoundingBoxMin; + rinst.BBMax = skydomeydr.BoundingBoxMax; + rinst.BSCenter = Vector3.Zero; + rinst.Radius = skydomeydr.BoundingSphereRadius; + rinst.Orientation = Quaternion.Identity; + rinst.Scale = Vector3.One; + rinst.TintPaletteIndex = 0; + rinst.CastShadow = false; + rinst.Renderable = sdrnd; + shader.SetShader(context); + shader.SetInputLayout(context, VertexType.PTT); + shader.SetSceneVars(context, camera, null, globalLights); + shader.SetEntityVars(context, ref rinst); + + RenderableModel? rmod = ((sdrnd.HDModels is not null) && (sdrnd.HDModels.Length > 0)) ? sdrnd.HDModels[0] : null; + RenderableGeometry? rgeom = ((rmod is not null) && (rmod.Geometries is not null) && (rmod.Geometries.Length > 0)) ? rmod.Geometries[0] : null; + + if (rgeom is not null && rgeom.VertexType == VertexType.PTT) + { + shader.SetModelVars(context, rmod!); + shader.SetTextures(context, sftex); + + rgeom.Render(context); + } + + //shaders.SetRasterizerMode(context, RasterizerMode.SolidDblSided); + //shaders.SetDepthStencilMode(context, DepthStencilMode.Enabled); + shader.RenderSun(context, camera, weather, globalLights); + + + if (rendermoon && moontex is not null && moontex.IsLoaded) + { + shader.RenderMoon(context, camera, weather, globalLights, moontex); + } + + + + shader.UnbindResources(context); } private void RenderClouds() { - if (MapViewEnabled) return; - if (!renderclouds) return; - if (!renderskydome) return; - if (!weather.Inited) return; - if (!clouds.Inited) return; + if (MapViewEnabled) + return; + if (!renderclouds) + return; + if (!renderskydome) + return; + if (!weather.Inited) + return; + if (!clouds.Inited) + return; - var shader = shaders.Clouds; + var shader = Shaders.Clouds; - shaders.SetDepthStencilMode(context, DepthStencilMode.DisableAll); - shaders.SetRasterizerMode(context, RasterizerMode.Solid); - shaders.SetDefaultBlendState(context); + Shaders.SetDepthStencilMode(context, DepthStencilMode.DisableAll); + Shaders.SetRasterizerMode(context, RasterizerMode.Solid); + Shaders.SetDefaultBlendState(context); //shaders.SetAlphaBlendState(context); shader.SetShader(context); @@ -1688,17 +1724,19 @@ namespace CodeWalker.Rendering //render one cloud fragment. CloudHatFrag frag = clouds.HatManager.FindFrag(individualcloudfrag); - if (frag == null) return; + if (frag is null) + return; for (int i = 0; i < frag.Layers.Length; i++) { CloudHatFragLayer layer = frag.Layers[i]; uint dhash = JenkHash.GenHashLower(layer.Filename); Archetype arch = gameFileCache.GetArchetype(dhash); - if (arch == null) - { continue; } + if (arch is null) + continue; - if (Math.Max(camera.Position.Z, 0.0f) < layer.HeightTigger) continue; + if (Math.Max(camera.Position.Z, 0.0f) < layer.HeightTigger) + continue; var drw = gameFileCache.TryGetDrawable(arch); var rnd = TryGetRenderable(arch, drw); @@ -1745,14 +1783,8 @@ namespace CodeWalker.Rendering geom.Render(context); } } - } - - } - - - } @@ -1761,11 +1793,11 @@ namespace CodeWalker.Rendering { foreach (var quad in waterquads) { - RenderableWaterQuad rquad = renderableCache.GetRenderableWaterQuad(quad); + RenderableWaterQuad rquad = RenderableCache.GetRenderableWaterQuad(quad); if ((rquad != null) && (rquad.IsLoaded)) { rquad.CamRel = -camera.Position; - shaders.Enqueue(rquad); + Shaders.Enqueue(rquad); } } } @@ -1774,10 +1806,10 @@ namespace CodeWalker.Rendering { foreach (var ynd in ynds) { - RenderablePathBatch rnd = renderableCache.GetRenderablePathBatch(ynd); + RenderablePathBatch rnd = RenderableCache.GetRenderablePathBatch(ynd); if ((rnd != null) && (rnd.IsLoaded)) { - shaders.Enqueue(rnd); + Shaders.Enqueue(rnd); } } } @@ -1786,10 +1818,10 @@ namespace CodeWalker.Rendering { foreach (var track in tracks) { - RenderablePathBatch rnd = renderableCache.GetRenderablePathBatch(track); + RenderablePathBatch rnd = RenderableCache.GetRenderablePathBatch(track); if ((rnd != null) && (rnd.IsLoaded)) { - shaders.Enqueue(rnd); + Shaders.Enqueue(rnd); } } } @@ -1798,29 +1830,29 @@ namespace CodeWalker.Rendering { foreach (var ynv in ynvs) { - RenderablePathBatch rnd = renderableCache.GetRenderablePathBatch(ynv); + RenderablePathBatch rnd = RenderableCache.GetRenderablePathBatch(ynv); if ((rnd != null) && (rnd.IsLoaded)) { - shaders.Enqueue(rnd); + Shaders.Enqueue(rnd); } } } public void RenderNavMesh(YnvFile ynv) { - RenderablePathBatch rnd = renderableCache.GetRenderablePathBatch(ynv); + RenderablePathBatch rnd = RenderableCache.GetRenderablePathBatch(ynv); if ((rnd != null) && (rnd.IsLoaded)) { - shaders.Enqueue(rnd); + Shaders.Enqueue(rnd); } } public void RenderBasePath(BasePathData basepath) { - RenderablePathBatch rnd = renderableCache.GetRenderablePathBatch(basepath); + RenderablePathBatch rnd = RenderableCache.GetRenderablePathBatch(basepath); if ((rnd != null) && (rnd.IsLoaded)) { - shaders.Enqueue(rnd); + Shaders.Enqueue(rnd); } } @@ -1828,20 +1860,20 @@ namespace CodeWalker.Rendering { foreach (var scenario in ymts) { - RenderablePathBatch rnd = renderableCache.GetRenderablePathBatch(scenario.ScenarioRegion); + RenderablePathBatch rnd = RenderableCache.GetRenderablePathBatch(scenario.ScenarioRegion); if ((rnd != null) && (rnd.IsLoaded)) { - shaders.Enqueue(rnd); + Shaders.Enqueue(rnd); } } } public void RenderPopZones(PopZones zones) { - RenderablePathBatch rnd = renderableCache.GetRenderablePathBatch(zones); + RenderablePathBatch rnd = RenderableCache.GetRenderablePathBatch(zones); if ((rnd != null) && (rnd.IsLoaded)) { - shaders.Enqueue(rnd); + Shaders.Enqueue(rnd); } } @@ -1862,7 +1894,8 @@ namespace CodeWalker.Rendering foreach (var ymap in ymapsWithinStreamingExtents.Values) { - if (!RenderWorldYmapIsVisible(ymap)) continue; + if (!RenderWorldYmapIsVisible(ymap)) + continue; VisibleYmaps.Add(ymap); } RenderWorldAdjustMapViewCamera(); @@ -1879,7 +1912,7 @@ namespace CodeWalker.Rendering foreach (var updatelodlights in LodManager.UpdateLodLights) { - renderableCache.InvalidateImmediate(updatelodlights); + RenderableCache.InvalidateImmediate(updatelodlights); } @@ -1975,15 +2008,13 @@ namespace CodeWalker.Rendering { var ent = RenderEntities[i]; - var rndbl = ent.LodManagerRenderable as Renderable; - if (rndbl != null) + if (ent.LodManagerRenderable is Renderable rndbl) { - var rent = new RenderableEntity(); - rent.Entity = ent; - rent.Renderable = rndbl; + var rent = new RenderableEntity(ent, rndbl); - if (HideEntities.ContainsKey(ent.EntityHash)) continue; //don't render hidden entities! + if (HideEntities.ContainsKey(ent.EntityHash)) + continue; //don't render hidden entities! RenderArchetype(ent.Archetype, ent, rent.Renderable, false); } @@ -2165,13 +2196,15 @@ namespace CodeWalker.Rendering } private void RenderWorldAddInteriorEntities(YmapEntityDef ent) { - if (ent?.MloInstance?.Entities != null) + if (ent?.MloInstance?.Entities != null && ent.MloInstance.Entities.Length > 0) { for (int j = 0; j < ent.MloInstance.Entities.Length; j++) { var intent = ent.MloInstance.Entities[j]; - if (intent?.Archetype == null) continue; //missing archetype... - if (!RenderIsEntityFinalRender(intent)) continue; //proxy or something.. + if (intent?.Archetype == null) + continue; //missing archetype... + if (!RenderIsEntityFinalRender(intent)) + continue; //proxy or something.. intent.IsWithinLodDist = true; @@ -2183,20 +2216,24 @@ namespace CodeWalker.Rendering renderworldentities.Add(intent); } } - if (ent?.MloInstance?.EntitySets != null) + if (ent?.MloInstance?.EntitySets != null && ent.MloInstance.EntitySets.Length > 0) { for (int e = 0; e < ent.MloInstance.EntitySets.Length; e++) { var entityset = ent.MloInstance.EntitySets[e]; - if ((entityset == null) || (!entityset.VisibleOrForced)) continue; + if ((entityset == null) || (!entityset.VisibleOrForced)) + continue; var entities = entityset.Entities; - if (entities == null) continue; + if (entities == null) + continue; for (int i = 0; i < entities.Count; i++) { var intent = entities[i]; - if (intent?.Archetype == null) continue; //missing archetype... - if (!RenderIsEntityFinalRender(intent)) continue; //proxy or something.. + if (intent?.Archetype == null) + continue; //missing archetype... + if (!RenderIsEntityFinalRender(intent)) + continue; //proxy or something.. intent.IsWithinLodDist = true; @@ -2211,6 +2248,7 @@ namespace CodeWalker.Rendering } } } + private void RenderWorldAdjustMapViewCamera() { if (MapViewEnabled) @@ -2228,11 +2266,10 @@ namespace CodeWalker.Rendering for (int y = 0; y < VisibleYmaps.Count; y++) { var ymap = VisibleYmaps[y]; - if (ymap.AllEntities != null) + if (ymap.AllEntities.Length > 0) { - for (int i = 0; i < ymap.AllEntities.Length; i++)//this is bad + foreach(var ent in ymap.AllEntities) { - var ent = ymap.AllEntities[i]; if ((ent.Position.Z < 1000.0f) && (ent.BSRadius < 500.0f)) { if ((ent.BBMax.X > cvwmin) && (ent.BBMin.X < cvwmax) && (ent.BBMax.Y > cvhmin) && (ent.BBMin.Y < cvhmax)) @@ -2246,7 +2283,8 @@ namespace CodeWalker.Rendering } //move the camera closer to the geometry, to help shadows in map view. - if (maxZ == float.MinValue) maxZ = 1000.0f; + if (maxZ == float.MinValue) + maxZ = 1000.0f; camera.Position.Z = Math.Min(maxZ, 1000.0f); camera.ViewFrustum.Position = camera.Position; } @@ -2286,7 +2324,7 @@ namespace CodeWalker.Rendering } } } - if (renderlodlights && shaders.deferred) + if (renderlodlights && (Shaders?.deferred ?? false)) { for (int y = 0; y < VisibleYmaps.Count; y++) { @@ -2305,14 +2343,16 @@ namespace CodeWalker.Rendering private bool RenderIsEntityFinalRender(YmapEntityDef ent) { var arch = ent.Archetype; - if (arch == null) return false; + if (arch == null) + return false; bool isshadowproxy = false; bool isreflproxy = false; uint archflags = arch._BaseArchetypeDef.flags; if (arch.Type == MetaName.CTimeArchetypeDef) { - if (!(rendertimedents && (rendertimedentsalways || arch.IsActive(timeofday)))) return false; + if (!(rendertimedents && (rendertimedentsalways || arch.IsActive(timeofday)))) + return false; //archflags = arch._BaseArchetypeDef.flags; } //else if (arch.Type == MetaName.CMloArchetypeDef) @@ -2389,7 +2429,8 @@ namespace CodeWalker.Rendering private Renderable GetArchetypeRenderable(Archetype arch) { - if (arch == null) return null; + if (arch == null) + return null; Renderable rndbl = null; if (!ArchetypeRenderables.TryGetValue(arch, out rndbl)) @@ -2413,28 +2454,30 @@ namespace CodeWalker.Rendering public void RenderYmap(YmapFile ymap) { - if (ymap == null) return; - if (!ymap.Loaded) return; + if (ymap is null) + return; + if (!ymap.Loaded) + return; - if ((ymap.AllEntities != null) && (ymap.RootEntities != null)) + if (ymap.AllEntities.Length > 0 && ymap.RootEntities.Length > 0) { if (usedynamiclod) { - for (int i = 0; i < ymap.RootEntities.Length; i++) + foreach(var ent in ymap.RootEntities) { - RenderYmapLOD(ymap.RootEntities[i].Ymap, ymap.RootEntities[i]); + RenderYmapLOD(ent.Ymap, ent); } } else { var ents = renderchildents ? ymap.AllEntities : ymap.RootEntities; - for (int i = 0; i < ents.Length; i++) + foreach(var ent in ents) { - var ent = ents[i]; - if (renderchildents && ent.Children != null) continue; + if (renderchildents && ent.Children is not null) + continue; //if (rootent.CEntityDef.parentIndex == -1) continue; Archetype arch = ent.Archetype; - if (arch != null) + if (arch is not null) { bool timed = (arch.Type == MetaName.CTimeArchetypeDef); if (!timed || (rendertimedents && (rendertimedentsalways || arch.IsActive(timeofday)))) @@ -2450,15 +2493,15 @@ namespace CodeWalker.Rendering } } - if (rendercars && ymap.CarGenerators != null) + if (rendercars && ymap.CarGenerators != null && ymap.CarGenerators.Length > 0) { RenderYmapCarGenerators(ymap); } - if (rendergrass && (ymap.GrassInstanceBatches != null)) + if (rendergrass && ymap.GrassInstanceBatches != null && ymap.GrassInstanceBatches.Length > 0) { RenderYmapGrass(ymap); } - if (renderdistlodlights && timecycle.IsNightTime && (ymap.DistantLODLights != null)) + if (renderdistlodlights && timecycle.IsNightTime && ymap.DistantLODLights != null) { RenderYmapDistantLODLights(ymap); } @@ -2494,7 +2537,7 @@ namespace CodeWalker.Rendering { //recurse... var children = entity.ChildrenMerged; - if ((children != null)) + if (children is not null) { usechild = true; for (int i = 0; i < children.Length; i++) @@ -2525,12 +2568,13 @@ namespace CodeWalker.Rendering { if ((entity.MloInstance != null) && (entity.MloInstance.Entities != null)) { - for (int j = 0; j < entity.MloInstance.Entities.Length; j++) + foreach(var intent in entity.MloInstance.Entities) { - var intent = entity.MloInstance.Entities[j]; var intarch = intent.Archetype; - if (intarch == null) continue; //missing archetype... - if (!RenderIsEntityFinalRender(intent)) continue; //proxy or something.. + if (intarch is null) + continue; //missing archetype... + if (!RenderIsEntityFinalRender(intent)) + continue; //proxy or something.. RenderArchetype(intarch, intent); } } @@ -2567,12 +2611,18 @@ namespace CodeWalker.Rendering float cx = camera.Position.X; float cy = camera.Position.Y; float cz = camera.Position.Z; - if (cx < (batch.AABBMin.X - lodDist)) continue; - if (cx > (batch.AABBMax.X + lodDist)) continue; - if (cy < (batch.AABBMin.Y - lodDist)) continue; - if (cy > (batch.AABBMax.Y + lodDist)) continue; - if (cz < (batch.AABBMin.Z - lodDist)) continue; - if (cz > (batch.AABBMax.Z + lodDist)) continue; + if (cx < (batch.AABBMin.X - lodDist)) + continue; + if (cx > (batch.AABBMax.X + lodDist)) + continue; + if (cy < (batch.AABBMin.Y - lodDist)) + continue; + if (cy > (batch.AABBMax.Y + lodDist)) + continue; + if (cz < (batch.AABBMin.Z - lodDist)) + continue; + if (cz > (batch.AABBMax.Z + lodDist)) + continue; var bscent = batch.CamRel; @@ -2585,18 +2635,18 @@ namespace CodeWalker.Rendering var arch = batch.Archetype; var drbl = gameFileCache.TryGetDrawable(arch); var rndbl = TryGetRenderable(arch, drbl); - var instb = renderableCache.GetRenderableInstanceBatch(batch); - if (rndbl == null) continue; //no renderable - if (!(rndbl.IsLoaded && (rndbl.AllTexturesLoaded || !waitforchildrentoload))) continue; //not loaded yet - if ((instb == null) || !instb.IsLoaded) continue; + var instb = RenderableCache.GetRenderableInstanceBatch(batch); + if (rndbl is null) + continue; //no renderable + if (!(rndbl.IsLoaded && (rndbl.AllTexturesLoaded || !waitforchildrentoload))) + continue; //not loaded yet + if (instb is null || !instb.IsLoaded) + continue; instb.CamRel = instb.Position - camera.Position;//to gracefully handle batch size changes - RenderableInstanceBatchInst binst = new RenderableInstanceBatchInst(); - binst.Batch = instb; - binst.Renderable = rndbl; - - shaders.Enqueue(ref binst); + RenderableInstanceBatchInst binst = new RenderableInstanceBatchInst(instb, rndbl); + Shaders.Enqueue(in binst); } @@ -2606,13 +2656,16 @@ namespace CodeWalker.Rendering private void RenderYmapLODLights(YmapFile ymap) { - if (ymap.LODLights == null) return; - if (ymap.Parent?.DistantLODLights == null) return; //need to get lodlights positions from parent (distlodlights) + if (ymap.LODLights?.LodLights is null || ymap.LODLights.LodLights.Length == 0) + return; + if (ymap.Parent?.DistantLODLights is null) + return; //need to get lodlights positions from parent (distlodlights) - RenderableLODLights lights = renderableCache.GetRenderableLODLights(ymap); - if (!lights.IsLoaded) return; + RenderableLODLights lights = RenderableCache.GetRenderableLODLights(ymap); + if (!lights.IsLoaded) + return; - shaders.Enqueue(lights); + Shaders.Enqueue(lights); } @@ -2620,20 +2673,12 @@ namespace CodeWalker.Rendering { //enqueue ymap DistantLODLights instance batch for rendering - if (ymap.DistantLODLights == null) return; + if (ymap.DistantLODLights == null || ymap.DistantLODLights.colours.Length == 0) + return; - switch (ymap.DistantLODLights.CDistantLODLight.category) - { - case 0: //distlodlights_small009.ymap - case 1: //distlodlights_medium000.ymap - case 2: //distlodlights_large000.ymap - break; - default: - break; - } - - RenderableDistantLODLights lights = renderableCache.GetRenderableDistantLODLights(ymap.DistantLODLights); - if (!lights.IsLoaded) return; + RenderableDistantLODLights lights = RenderableCache.GetRenderableDistantLODLights(ymap.DistantLODLights); + if (!lights.IsLoaded) + return; uint ytdhash = 3154743001; //"graphics" @@ -2645,24 +2690,27 @@ namespace CodeWalker.Rendering graphicsytd.TextureDict.Dict.TryGetValue(texhash, out lighttex); } - if (lighttex == null) return; + if (lighttex == null) + return; RenderableTexture lightrtex = null; if (lighttex != null) { - lightrtex = renderableCache.GetRenderableTexture(lighttex); + lightrtex = RenderableCache.GetRenderableTexture(lighttex); } - if (lightrtex == null) return; - if (!lightrtex.IsLoaded) return; + if (lightrtex == null) + return; + if (!lightrtex.IsLoaded) + return; lights.Texture = lightrtex; - shaders.Enqueue(lights); + Shaders.Enqueue(lights); } private void RenderYmapCarGenerators(YmapFile ymap) { - - if (ymap.CarGenerators == null) return; + if (ymap.CarGenerators == null) + return; var maxdist = 200 * renderworldDetailDistMult; var maxdist2 = maxdist * maxdist; @@ -2673,7 +2721,8 @@ namespace CodeWalker.Rendering var bscent = cg.Position - camera.Position; float bsrad = cg._CCarGen.perpendicularLength; - if (bscent.LengthSquared() > maxdist2) continue; //don't render distant cars.. + if (bscent.LengthSquared() > maxdist2) + continue; //don't render distant cars.. if (!camera.ViewFrustum.ContainsSphereNoClipNoOpt(ref bscent, bsrad)) { continue; //frustum cull cars... @@ -2942,7 +2991,8 @@ namespace CodeWalker.Rendering for (int x = 0; x < width; x++) { var v = smr.GetValue(x); - if ((v < 0) || (v > 255)) continue; + if (v < 0 || v > 255) + continue; var col = (uint)(new Color(v, v, v, 127).ToRgba()); v0 = m.MultiplyW(new Vector3(x, y, 0)); v1 = m.MultiplyW(new Vector3(x, y+1, 0)); @@ -3003,9 +3053,11 @@ namespace CodeWalker.Rendering { if ((bsrad < renderboundsmaxrad) && (dist < renderboundsmaxdist)) { - MapSphere ms = new MapSphere(); - ms.CamRelPos = bscent; - ms.Radius = bsrad; + MapSphere ms = new MapSphere + { + CamRelPos = bscent, + Radius = bsrad, + }; BoundingSpheres.Add(ms); } } @@ -3013,13 +3065,15 @@ namespace CodeWalker.Rendering { if ((dist < renderboundsmaxdist)) { - MapBox mb = new MapBox(); - mb.CamRelPos = camrel; - mb.BBMin = arche.BBMin; - mb.BBMax = arche.BBMax; - mb.Orientation = orientation; - mb.Scale = scale; - BoundingBoxes.Add(mb); + BoundingBoxes.Add( + new MapBox( + camRelPos: camrel, + bbMin: arche.BBMin, + bbMax: arche.BBMax, + orientation: orientation, + scale: scale + ) + ); } } @@ -3049,8 +3103,7 @@ namespace CodeWalker.Rendering //fragments have extra drawables! need to render those too... TODO: handle fragments properly... - FragDrawable fd = rndbl.Key as FragDrawable; - if (fd != null) + if (rndbl.Key is FragDrawable fd) { var frag = fd.OwnerFragment; if ((frag != null) && (frag.DrawableCloth != null)) //cloth... @@ -3068,15 +3121,15 @@ namespace CodeWalker.Rendering return res; } - public bool RenderDrawable(DrawableBase drawable, Archetype arche, YmapEntityDef entity, uint txdHash = 0, TextureDictionary txdExtra = null, Texture diffOverride = null, ClipMapEntry animClip = null, ClothInstance cloth = null, Expression expr = null) + public bool RenderDrawable(DrawableBase drawable, Archetype arche, YmapEntityDef entity, uint txdHash = 0, TextureDictionary? txdExtra = null, Texture? diffOverride = null, ClipMapEntry? animClip = null, ClothInstance? cloth = null, Expression? expr = null) { //enqueue a single drawable for rendering. - if (drawable == null) + if (drawable is null) return false; Renderable rndbl = TryGetRenderable(arche, drawable, txdHash, txdExtra, diffOverride); - if (rndbl == null || !rndbl.IsLoaded) + if (rndbl is null || !rndbl.IsLoaded) return false; if (animClip != null) @@ -3103,16 +3156,13 @@ namespace CodeWalker.Rendering { //enqueue a single renderable for rendering. - if (!rndbl.IsLoaded) return false; + if (!rndbl.IsLoaded) + return false; if (RenderedDrawablesListEnable) //for later hit tests { - var rd = new RenderedDrawable(); - rd.Drawable = rndbl.Key; - rd.Archetype = arche; - rd.Entity = entity; - RenderedDrawables.Add(rd); + RenderedDrawables.Add(new RenderedDrawable(rndbl.Key, arche, entity)); } bool isselected = SelectionFlagsTestAll || (rndbl.Key == SelectedDrawable); @@ -3169,18 +3219,15 @@ namespace CodeWalker.Rendering } - if ((rendercollisionmeshes || (SelectionMode == MapSelectionMode.Collision)) && rendercollisionmeshlayerdrawable) { if ((entity == null) || ((entity._CEntityDef.flags & 4) == 0)) //skip if entity embedded collisions disabled { - Drawable sdrawable = rndbl.Key as Drawable; - if ((sdrawable != null) && (sdrawable.Bound != null)) + if ((rndbl.Key is Drawable sdrawable) && (sdrawable.Bound != null)) { RenderCollisionMesh(sdrawable.Bound, entity); } - FragDrawable fdrawable = rndbl.Key as FragDrawable; - if (fdrawable != null) + if (rndbl.Key is FragDrawable fdrawable) { if (fdrawable.Bound != null) { @@ -3199,7 +3246,7 @@ namespace CodeWalker.Rendering RenderSkeleton(rndbl, entity); } - if (renderlights && shaders.deferred && (rndbl.Lights != null)) + if (renderlights && Shaders.deferred && (rndbl.Lights != null)) { entity?.EnsureLights(rndbl.Key); @@ -3207,9 +3254,8 @@ namespace CodeWalker.Rendering //reinit lights when added/removed from editor var dd = rndbl.Key as Drawable; - var fd = rndbl.Key as FragDrawable; var lights = dd?.LightAttributes?.data_items; - if ((lights == null) && (fd != null) && (fd?.OwnerFragment?.Drawable == fd)) + if ((lights == null) && (rndbl.Key is FragDrawable fd) && (fd?.OwnerFragment?.Drawable == fd)) { lights = fd.OwnerFragment.LightAttributes?.data_items; } @@ -3234,7 +3280,7 @@ namespace CodeWalker.Rendering linst.EntityPosition = position; linst.EntityRotation = orientation; linst.Light = rndlight; - shaders.Enqueue(ref linst); + Shaders.Enqueue(in linst); } } @@ -3266,11 +3312,15 @@ namespace CodeWalker.Rendering if (isselected) { if (SelectionModelDrawFlags.ContainsKey(model.DrawableModel)) - { continue; } //filter out models in selected item that aren't flagged for drawing. + { + continue; + } //filter out models in selected item that aren't flagged for drawing. } if (!RenderIsModelFinalRender(model) && !renderproxies) - { continue; } //filter out reflection proxy models... + { + continue; + } //filter out reflection proxy models... for (int gi = 0; gi < model.Geometries.Length; gi++) { @@ -3286,17 +3336,21 @@ namespace CodeWalker.Rendering if (isselected) { if (geom.disableRendering || SelectionGeometryDrawFlags.ContainsKey(dgeom)) - { continue; } //filter out geometries in selected item that aren't flagged for drawing. + { + continue; + } //filter out geometries in selected item that aren't flagged for drawing. } else { if (geom.disableRendering) - { continue; } //filter out certain geometries like certain hair parts that shouldn't render by default + { + continue; + } //filter out certain geometries like certain hair parts that shouldn't render by default } rginst.Geom = geom; - shaders.Enqueue(ref rginst); + Shaders.Enqueue(in rginst); } } } @@ -3393,7 +3447,7 @@ namespace CodeWalker.Rendering var vi = ped.Ymt?.VariationInfo; - if (vi != null) + if (vi is not null) { for (int i = 0; i < 12; i++) { @@ -3414,7 +3468,7 @@ namespace CodeWalker.Rendering var expr = ped.Expressions[i]; //if (compData == null) return; - if (drawable == null) return; + if (drawable is null) return; var td = ped.Ytd?.TextureDict; var ac = ped.AnimClip; @@ -3452,9 +3506,10 @@ namespace CodeWalker.Rendering } - bool drawFlag = true; - if (!SelectionDrawableDrawFlags.TryGetValue(drawable, out drawFlag)) - { drawFlag = true; } + if (!SelectionDrawableDrawFlags.TryGetValue(drawable, out var drawFlag)) + { + drawFlag = true; + } if (drawFlag) { @@ -3500,7 +3555,7 @@ namespace CodeWalker.Rendering orientation = Quaternion.Identity; } - RenderableBoundComposite rndbc = renderableCache.GetRenderableBoundComp(bounds); + RenderableBoundComposite rndbc = RenderableCache.GetRenderableBoundComp(bounds); if ((rndbc != null) && rndbc.IsLoaded) { RenderableBoundGeometryInst rbginst = new RenderableBoundGeometryInst(); @@ -3509,7 +3564,8 @@ namespace CodeWalker.Rendering { foreach (var geom in rndbc.Geometries) { - if (geom == null) continue; + if (geom == null) + continue; rbginst.Geom = geom; var pos = position; @@ -3527,16 +3583,13 @@ namespace CodeWalker.Rendering rbginst.Inst.Orientation = ori; rbginst.Inst.Scale = sca; rbginst.Inst.CamRel = rbginst.Inst.Position - camera.Position; - shaders.Enqueue(ref rbginst); + Shaders.Enqueue(in rbginst); } } if (RenderedBoundCompsListEnable) //for later hit tests { - var rb = new RenderedBoundComposite(); - rb.BoundComp = rndbc; - rb.Entity = entity; - RenderedBoundComps.Add(rb); + RenderedBoundComps.Add(new RenderedBoundComposite(rndbc, entity)); } } @@ -3548,16 +3601,17 @@ namespace CodeWalker.Rendering - private Renderable TryGetRenderable(Archetype arche, DrawableBase drawable, uint txdHash = 0, TextureDictionary txdExtra = null, Texture diffOverride = null) + private Renderable? TryGetRenderable(Archetype arche, DrawableBase drawable, uint txdHash = 0, TextureDictionary? txdExtra = null, Texture? diffOverride = null) { - if (drawable == null) return null; + if (drawable is null) + return null; //BUG: only last texdict used!! needs to cache textures per archetype........ //(but is it possible to have the same drawable with different archetypes?) MetaHash texDict = txdHash; //uint texDictOrig = txdHash; uint clipDict = 0; - if (arche != null) + if (arche is not null) { texDict = arche.TextureDict.Hash; clipDict = arche.ClipDict.Hash; @@ -3570,28 +3624,28 @@ namespace CodeWalker.Rendering } - Renderable rndbl = renderableCache.GetRenderable(drawable); - if (rndbl == null) return null; + var rndbl = RenderableCache.GetRenderable(drawable); + if (rndbl is null) + return null; if ((clipDict != 0) && (rndbl.ClipDict == null)) { - YcdFile ycd = gameFileCache.GetYcd(clipDict); - if ((ycd != null) && (ycd.Loaded)) + var ycd = gameFileCache.GetYcd(clipDict); + if (ycd is not null && ycd.Loaded) { rndbl.ClipDict = ycd; MetaHash ahash = arche.Hash; - if (ycd.ClipMap.TryGetValue(ahash, out rndbl.ClipMapEntry)) rndbl.HasAnims = true; + if (ycd.ClipMap.TryGetValue(ahash, out rndbl.ClipMapEntry)) + rndbl.HasAnims = true; var models = rndbl.HDModels; - for (int i = 0; i < models.Length; i++) + foreach(var model in models) { - var model = models[i]; - if (models[i] == null) + if (model is null) continue; - for (int j = 0; j < model.Geometries.Length; j++) + foreach(var geom in model.Geometries) { - var geom = model.Geometries[j]; - if (geom == null) + if (geom is null) continue; if (geom.globalAnimUVEnable) { @@ -3607,11 +3661,11 @@ namespace CodeWalker.Rendering var extraTexDict = (drawable.Owner as YptFile)?.PtfxList?.TextureDictionary; - if (extraTexDict == null) + if (extraTexDict is null) extraTexDict = txdExtra; - bool cacheSD = (rndbl.SDtxds == null); - bool cacheHD = (renderhdtextures && (rndbl.HDtxds == null)); + bool cacheSD = (rndbl.SDtxds is null); + bool cacheHD = (renderhdtextures && (rndbl.HDtxds is null)); if (cacheSD || cacheHD) { //cache the txd hierarchies for this renderable @@ -3634,7 +3688,7 @@ namespace CodeWalker.Rendering if (cacheSD) { var txdytd = gameFileCache.GetYtd(texDict); - if (txdytd != null) + if (txdytd is not null) { tryGetRenderableSDtxds.Add(txdytd); } @@ -3645,7 +3699,7 @@ namespace CodeWalker.Rendering if (hdtxd != texDict) { var txdhdytd = gameFileCache.GetYtd(hdtxd); - if (txdhdytd != null) + if (txdhdytd is not null) { tryGetRenderableHDtxds.Add(txdhdytd); } @@ -3657,7 +3711,7 @@ namespace CodeWalker.Rendering if (cacheSD) { var pytd = gameFileCache.GetYtd(ptxdname); - if (pytd != null) + if (pytd is not null) { tryGetRenderableSDtxds.Add(pytd); } @@ -3668,7 +3722,7 @@ namespace CodeWalker.Rendering if (phdtxdname != ptxdname) { var phdytd = gameFileCache.GetYtd(phdtxdname); - if (phdytd != null) + if (phdytd is not null) { tryGetRenderableHDtxds.Add(phdytd); } @@ -3677,8 +3731,10 @@ namespace CodeWalker.Rendering ptxdname = gameFileCache.TryGetParentYtdHash(ptxdname); } } - if (cacheSD) rndbl.SDtxds = tryGetRenderableSDtxds.ToArray(); - if (cacheHD) rndbl.HDtxds = tryGetRenderableHDtxds.ToArray(); + if (cacheSD) + rndbl.SDtxds = tryGetRenderableSDtxds.ToArray(); + if (cacheHD) + rndbl.HDtxds = tryGetRenderableHDtxds.ToArray(); } @@ -3687,11 +3743,8 @@ namespace CodeWalker.Rendering bool alltexsloaded = true; - - for (int mi = 0; mi < rndbl.AllModels.Length; mi++) + foreach(var model in rndbl.AllModels) { - var model = rndbl.AllModels[mi]; - if (!RenderIsModelFinalRender(model) && !renderproxies) { continue; //filter out reflection proxy models... @@ -3715,9 +3768,9 @@ namespace CodeWalker.Rendering var tex = geom.Textures[i]; var ttex = tex as Texture; - Texture dtex = null; - RenderableTexture rdtex = null; - if ((tex != null) && (ttex == null)) + Texture? dtex = null; + RenderableTexture? rdtex = null; + if (tex is not null && ttex is null) { //TextureRef means this RenderableTexture needs to be loaded from texture dict... if (extraTexDict != null) //for ypt files, first try the embedded tex dict.. @@ -3725,22 +3778,21 @@ namespace CodeWalker.Rendering dtex = extraTexDict.Lookup(tex.NameHash); } - if (dtex == null) //else //if (texDict != 0) + if (dtex is null) //else //if (texDict != 0) { bool waitingforload = false; - if (rndbl.SDtxds != null) + if (rndbl.SDtxds is not null) { //check the SD texture hierarchy - for (int j = 0; j < rndbl.SDtxds.Length; j++) + foreach(var txd in rndbl.SDtxds) { - var txd = rndbl.SDtxds[j]; if (txd.Loaded) { dtex = txd.TextureDict?.Lookup(tex.NameHash); } else { - txd = gameFileCache.GetYtd(txd.Key.Hash);//keep trying to load it - sometimes resuests can get lost (!) + gameFileCache.GetYtd(txd.Key.Hash);//keep trying to load it - sometimes resuests can get lost (!) waitingforload = true; } if (dtex != null) break; @@ -3752,15 +3804,15 @@ namespace CodeWalker.Rendering } } - if ((dtex == null) && (!waitingforload)) + if (dtex is null && !waitingforload) { //not present in dictionary... check already loaded texture dicts... (maybe resident?) var ytd2 = gameFileCache.TryGetTextureDictForTexture(tex.NameHash); - if (ytd2 != null) + if (ytd2 is not null) { if (ytd2.Loaded) { - if (ytd2.TextureDict != null) + if (ytd2.TextureDict is not null) { dtex = ytd2.TextureDict.Lookup(tex.NameHash); } @@ -3785,7 +3837,7 @@ namespace CodeWalker.Rendering } } - if (dtex != null) + if (dtex is not null) { geom.Textures[i] = dtex; //cache it for next time to avoid the lookup... ttex = dtex; @@ -3793,9 +3845,9 @@ namespace CodeWalker.Rendering } - if (ttex != null) //ensure renderable texture + if (ttex is not null) //ensure renderable texture { - rdtex = renderableCache.GetRenderableTexture(ttex); + rdtex = RenderableCache.GetRenderableTexture(ttex); } //if ((rdtex != null) && (rdtex.IsLoaded == false)) @@ -3808,14 +3860,14 @@ namespace CodeWalker.Rendering - RenderableTexture rhdtex = null; + RenderableTexture? rhdtex = null; if (renderhdtextures) { Texture hdtex = geom.TexturesHD[i]; - if (hdtex == null) + if (hdtex is null) { //look for a replacement HD texture... - if (rndbl.HDtxds != null) + if (rndbl.HDtxds is not null) { for (int j = 0; j < rndbl.HDtxds.Length; j++) { @@ -3828,17 +3880,17 @@ namespace CodeWalker.Rendering { txd = gameFileCache.GetYtd(txd.Key.Hash);//keep trying to load it - sometimes resuests can get lost (!) } - if (hdtex != null) break; + if (hdtex is not null) break; } } - if (hdtex != null) + if (hdtex is not null) { geom.TexturesHD[i] = hdtex; } } - if (hdtex != null) + if (hdtex is not null) { - rhdtex = renderableCache.GetRenderableTexture(hdtex); + rhdtex = RenderableCache.GetRenderableTexture(hdtex); } } geom.RenderableTexturesHD[i] = rhdtex; @@ -3861,16 +3913,16 @@ namespace CodeWalker.Rendering } - public struct RenderedDrawable + public readonly struct RenderedDrawable(DrawableBase drawable, Archetype archetype, YmapEntityDef entity) { - public DrawableBase Drawable; - public Archetype Archetype; - public YmapEntityDef Entity; + public readonly DrawableBase Drawable = drawable; + public readonly Archetype Archetype = archetype; + public readonly YmapEntityDef Entity = entity; } - public struct RenderedBoundComposite + public readonly struct RenderedBoundComposite(RenderableBoundComposite boundComp, YmapEntityDef entity) { - public RenderableBoundComposite BoundComp; - public YmapEntityDef Entity; + public readonly RenderableBoundComposite BoundComp = boundComp; + public readonly YmapEntityDef Entity = entity; } public struct RenderSkeletonItem @@ -3943,16 +3995,18 @@ namespace CodeWalker.Rendering Camera = camera; Position = camera.Position; - foreach (var kvp in ymaps) + foreach (var ymap in ymaps.Values) { - var ymap = kvp.Value; - if (ymap._CMapData.parent != 0) //ensure parent references on ymaps + if (ymap._CMapData.parent.Hash != 0) //ensure parent references on ymaps { - ymaps.TryGetValue(ymap._CMapData.parent, out YmapFile pymap); - if (pymap == null) //skip adding ymaps until parents are available - { continue; } + if (!ymaps.TryGetValue(ymap._CMapData.parent, out var pymap)) //skip adding ymaps until parents are available + { + Console.WriteLine($"Couldn't find parent ymap {JenkIndex.GetString(ymap._CMapData.parent)} ({ymap._CMapData.parent.Hash}) for {ymap.Name}"); + continue; + } if (ymap.Parent != pymap) { + Console.WriteLine($"Connected ymap {ymap.Name} to parent {pymap.Name}"); ymap.ConnectToParent(pymap); } } @@ -3961,9 +4015,9 @@ namespace CodeWalker.Rendering RemoveYmaps.Clear(); foreach (var kvp in CurrentYmaps) { - YmapFile ymap = null; - if (!ymaps.TryGetValue(kvp.Key, out ymap) || (ymap != kvp.Value) || (ymap.IsScripted && !ShowScriptedYmaps) || (ymap.LodManagerUpdate)) + if (!ymaps.TryGetValue(kvp.Key, out var ymap) || ymap != kvp.Value || ymap.IsScripted && !ShowScriptedYmaps || ymap.LodManagerUpdate) { + Console.WriteLine($"Removed {kvp.Key} from Ymaps"); RemoveYmaps.Add(kvp.Key); } } @@ -3977,14 +4031,17 @@ namespace CodeWalker.Rendering for (int i = 0; i < remEnts.Length; i++) { var ent = remEnts[i]; - RootEntities.Remove(ent); ent.LodManagerChildren?.Clear(); ent.LodManagerChildren = null; ent.LodManagerRenderable = null; - if ((ent.Parent != null) && (ent.Parent.Ymap != ymap)) + if (ent.Parent is not null && ent.Parent.Ymap != ymap) { ent.Parent.LodManagerRemoveChild(ent); } + else + { + RootEntities.Remove(ent); + } } } var remLodLights = ymap.LODLights?.LodLights; @@ -3998,29 +4055,27 @@ namespace CodeWalker.Rendering ymap.LodManagerUpdate = false; ymap.LodManagerOldEntities = null; } - foreach (var kvp in ymaps) + foreach (var (key, ymap) in ymaps) { - var ymap = kvp.Value; if (ymap.IsScripted && !ShowScriptedYmaps) - { continue; } - if ((ymap._CMapData.parent != 0) && (ymap.Parent == null)) //skip adding ymaps until parents are available - { continue; } - if (!CurrentYmaps.ContainsKey(kvp.Key)) { - CurrentYmaps.Add(kvp.Key, kvp.Value); - if (ymap.AllEntities != null) // add this ymap's entities to the tree... + continue; + } + if (ymap._CMapData.parent != 0 && ymap.Parent is null) //skip adding ymaps until parents are available + { + continue; + } + if (CurrentYmaps.TryAdd(key, ymap)) + { + foreach(var ent in ymap.AllEntities) { - for (int i = 0; i < ymap.AllEntities.Length; i++) + if (ent.Parent is not null) { - var ent = ymap.AllEntities[i]; - if (ent.Parent != null) - { - ent.Parent.LodManagerAddChild(ent); - } - else - { - RootEntities[ent] = ent; - } + ent.Parent.LodManagerAddChild(ent); + } + else + { + RootEntities[ent] = ent; } } var addLodLights = ymap.LODLights?.LodLights; diff --git a/CodeWalker/Rendering/ShaderManager.cs b/CodeWalker/Rendering/ShaderManager.cs index f3af61d..8716fec 100644 --- a/CodeWalker/Rendering/ShaderManager.cs +++ b/CodeWalker/Rendering/ShaderManager.cs @@ -1,17 +1,23 @@ -using CodeWalker.GameFiles; +using CodeWalker.Core.Utils; +using CodeWalker.GameFiles; using CodeWalker.Properties; using CodeWalker.World; +using Collections.Pooled; +using CommunityToolkit.Diagnostics; using SharpDX; using SharpDX.Direct3D11; using System; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CodeWalker.Rendering { - public class ShaderManager + public class ShaderManager : IDisposable { private DXManager DXMan; @@ -39,8 +45,8 @@ namespace CodeWalker.Rendering - public DeferredScene DefScene { get; set; } - public PostProcessor HDR { get; set; } + public DeferredScene? DefScene { get; set; } + public PostProcessor? HDR { get; set; } public BasicShader Basic { get; set; } public CableShader Cable { get; set; } public WaterShader Water { get; set; } @@ -56,7 +62,7 @@ namespace CodeWalker.Rendering public WidgetShader Widgets { get; set; } public bool shadows = Settings.Default.Shadows; - public Shadowmap Shadowmap { get; set; } + public Shadowmap? Shadowmap { get; set; } List shadowcasters = new List(); List shadowbatch = new List(); List shadowbatches = new List(); @@ -125,7 +131,7 @@ namespace CodeWalker.Rendering DXMan = dxman; //HDR = new PostProcessor(dxman); - Basic = new BasicShader(device); + Basic = new BasicShader(device, this); Cable = new CableShader(device); Water = new WaterShader(device); Terrain = new TerrainShader(device); @@ -223,12 +229,37 @@ namespace CodeWalker.Rendering dsDisableAll = new DepthStencilState(device, dsd); } + /// + /// Attempts to find the shaders folder in the directory tree + /// + /// + /// + public static string GetShaderFolder() + { + // Directory we're looking for. + var dirToFind = Path.Combine("Shaders"); + if (!FileUtils.TryFindFolder(dirToFind, out var folder)) + { + throw new FileNotFoundException($"Could not find '{dirToFind}' directory."); + } + else + { + return folder; + } + } + + ~ShaderManager() + { + Console.WriteLine("Finalizer called on ShaderManager, this is not supposed to happen, is a Dispose call missing?"); + Dispose(); + } + public void Dispose() { - if (disposed) return; - disposed = true; + if (disposed) + return; dsEnabled.Dispose(); dsDisableWriteRev.Dispose(); @@ -267,14 +298,16 @@ namespace CodeWalker.Rendering if (HDR != null) { HDR.Dispose(); - HDR = null; } if (Shadowmap != null) { Shadowmap.Dispose(); - Shadowmap = null; } + + disposed = true; + + GC.SuppressFinalize(this); } @@ -291,38 +324,39 @@ namespace CodeWalker.Rendering public void BeginFrame(DeviceContext context, double currentRealTime, float elapsedTime) { - if (disposed) return; + if (disposed) + return; CurrentRealTime = currentRealTime; CurrentElapsedTime = elapsedTime; shadowcasters.Clear(); - if (shadows && (Shadowmap == null)) + if (shadows && Shadowmap is null) { Shadowmap = new Shadowmap(Device); } - if (!shadows && (Shadowmap != null)) + if (!shadows && Shadowmap != null) { Shadowmap.Dispose(); Shadowmap = null; } - if (hdr && (HDR == null)) + if (hdr && HDR is null) { HDR = new PostProcessor(DXMan); HDR.OnWindowResize(DXMan); HDR.LumBlendSpeed = hdrLumBlendSpeed; } - if (!hdr && (HDR != null)) + if (!hdr && HDR is not null) { HDR.Dispose(); HDR = null; } - if (deferred && (DefScene == null)) + if (deferred && DefScene is null) { - DefScene = new DeferredScene(DXMan); + DefScene = new DeferredScene(DXMan, this); DefScene.OnWindowResize(DXMan); } - if (!deferred && (DefScene != null)) + if (!deferred && DefScene != null) { DefScene.Dispose(); DefScene = null; @@ -343,22 +377,22 @@ namespace CodeWalker.Rendering RenderWaterQuads.Clear(); - if (DefScene != null) + if (DefScene is not null) { DefScene.Clear(context); DefScene.ClearDepth(context); } - if (HDR != null) + if (HDR is not null) { HDR.Clear(context); HDR.ClearDepth(context); } - if (DefScene != null) + if (DefScene is not null) { DefScene.SetSceneColour(context); } - else if (HDR != null) + else if (HDR is not null) { HDR.SetPrimary(context); //for rendering some things before shadowmaps... (eg sky) } @@ -408,8 +442,15 @@ namespace CodeWalker.Rendering return null; } + public Stopwatch lastLodUpdate = Stopwatch.StartNew(); public void RenderQueued(DeviceContext context, Camera camera, Vector4 wind) { + bool updateLods = false; + if (lastLodUpdate.Elapsed.TotalSeconds > 1.0) + { + updateLods = true; + lastLodUpdate.Restart(); + } GeometryCount = 0; VerticesCount = 0; Camera = camera; @@ -447,11 +488,11 @@ namespace CodeWalker.Rendering } - if (DefScene != null) + if (DefScene is not null) { DefScene.SetGBuffers(context); } - else if (HDR != null) + else if (HDR is not null) { HDR.SetPrimary(context); } @@ -592,20 +633,20 @@ namespace CodeWalker.Rendering DefScene.SetSceneColour(context); - DefScene.RenderLights(context, camera, Shadowmap, GlobalLights); + DefScene.RenderLights(context, camera, Shadowmap, GlobalLights, updateLods); if (RenderLODLights.Count > 0) //LOD lights pass { context.OutputMerger.BlendState = bsAdd; //additive blend for lights... context.OutputMerger.DepthStencilState = dsDisableWriteRev;//only render parts behind or at surface - DefScene.RenderLights(context, camera, RenderLODLights); + DefScene.RenderLights(context, camera, RenderLODLights, updateLods); } if (RenderLights.Count > 0) { context.OutputMerger.BlendState = bsAdd; //additive blend for lights... context.OutputMerger.DepthStencilState = dsDisableWriteRev;//only render parts behind or at surface - DefScene.RenderLights(context, camera, RenderLights); + DefScene.RenderLights(context, camera, RenderLights, updateLods); } } @@ -677,9 +718,9 @@ namespace CodeWalker.Rendering context.OutputMerger.BlendState = bsDefault; context.OutputMerger.DepthStencilState = dsDisableAll; - if (HDR != null) + if (HDR is not null) { - if ((DefScene?.SSAASampleCount ?? 1) > 1) + if (DefScene is not null && DefScene.SSAASampleCount > 1) { HDR.SetPrimary(context); DefScene.SSAAPass(context); @@ -687,7 +728,7 @@ namespace CodeWalker.Rendering HDR.Render(DXMan, CurrentElapsedTime, DefScene); } - else if (DefScene != null) + else if (DefScene is not null) { DXMan.SetDefaultRenderTarget(context); DefScene.SSAAPass(context); @@ -771,7 +812,7 @@ namespace CodeWalker.Rendering } - private void RenderGeometryBatches(DeviceContext context, List batches, Shader shader) + private void RenderGeometryBatches(DeviceContext context, IList batches, Shader shader) { shader.SetShader(context); shader.SetSceneVars(context, Camera, Shadowmap, GlobalLights); @@ -781,7 +822,7 @@ namespace CodeWalker.Rendering } shader.UnbindResources(context); } - private void RenderGeometryBatch(DeviceContext context, List batch, Shader shader) + private void RenderGeometryBatch(DeviceContext context, IList batch, Shader shader) { GeometryCount += batch.Count; @@ -794,8 +835,11 @@ namespace CodeWalker.Rendering var geom = batch[i]; var gmodel = geom.Geom.Owner; shader.SetEntityVars(context, ref geom.Inst); - - VerticesCount += geom.Geom.VertexCount; + + if (shader != Shadow) + { + VerticesCount += geom.Geom.VertexCount; + } if (gmodel != model) { @@ -847,9 +891,7 @@ namespace CodeWalker.Rendering private void RenderInstancedBatch(DeviceContext context, RenderableInstanceBatchInst batch) { Basic.SetInstanceVars(context, batch.Batch); - - if (batch.Renderable.HDModels.Length > 1) - { } + VertexType? vertexType = null; for(int i = 0; i < batch.Renderable.HDModels.Length; i++) { @@ -860,8 +902,9 @@ namespace CodeWalker.Rendering Basic.SetModelVars(context, model); foreach (var geom in model.Geometries) { - if (Basic.SetInputLayout(context, geom.VertexType)) + if (vertexType == geom.VertexType || Basic.SetInputLayout(context, geom.VertexType)) { + vertexType = geom.VertexType; Basic.SetGeomVars(context, geom); geom.RenderInstanced(context, batch.Batch.InstanceCount); } @@ -872,20 +915,23 @@ namespace CodeWalker.Rendering - public void Enqueue(ref RenderableGeometryInst geom) + public void Enqueue(in RenderableGeometryInst geom) { var shader = geom.Geom.DrawableGeom.Shader; - var b = (shader!=null) ? shader.RenderBucket : 0; //rage render bucket? + var b = shader?.RenderBucket ?? 0; //rage render bucket? var bucket = EnsureRenderBucket(b); - ShaderBatch batch = null; - ShaderKey key = new ShaderKey(); - key.ShaderName = (shader!=null) ? shader.Name : new MetaHash(0); - key.ShaderFile = (shader!=null) ? shader.FileName : new MetaHash(0); + if (bucket is null) + { + ThrowHelper.ThrowArgumentOutOfRangeException(nameof(b), b, "Bucket doesn't exist"); + return; + } - if (!bucket.Batches.TryGetValue(key, out batch)) + ShaderKey key = new ShaderKey(shader?.Name ?? default, shader?.FileName ?? default); + + if (!bucket.Batches.TryGetValue(key, out var batch)) { batch = new ShaderBatch(key); bucket.Batches.Add(key, batch); @@ -893,15 +939,15 @@ namespace CodeWalker.Rendering batch.Geometries.Add(geom); } - public void Enqueue(ref RenderableLightInst light) + public void Enqueue(in RenderableLightInst light) { RenderLights.Add(light); } - public void Enqueue(ref RenderableBoundGeometryInst geom) + public void Enqueue(in RenderableBoundGeometryInst geom) { RenderBoundGeoms.Add(geom); } - public void Enqueue(ref RenderableInstanceBatchInst batch) + public void Enqueue(in RenderableInstanceBatchInst batch) { RenderInstBatches.Add(batch); } @@ -923,9 +969,9 @@ namespace CodeWalker.Rendering } - public ShaderRenderBucket EnsureRenderBucket(int index) + public ShaderRenderBucket? EnsureRenderBucket(int index) { - ShaderRenderBucket bucket = null; + ShaderRenderBucket? bucket = null; while (index >= RenderBuckets.Count) { RenderBuckets.Add(new ShaderRenderBucket(RenderBuckets.Count)); @@ -965,7 +1011,7 @@ namespace CodeWalker.Rendering public void ClearDepth(DeviceContext context, bool firstpass = true) { - if ((HDR != null) && firstpass) + if (HDR is not null && firstpass) { HDR.ClearDepth(context); } @@ -1025,14 +1071,8 @@ namespace CodeWalker.Rendering { Width = w; Height = h; - if (DefScene != null) - { - DefScene.OnWindowResize(DXMan); - } - if (HDR != null) - { - HDR.OnWindowResize(DXMan); - } + DefScene?.OnWindowResize(DXMan); + HDR?.OnWindowResize(DXMan); } } @@ -1052,26 +1092,52 @@ namespace CodeWalker.Rendering } - public struct ShaderKey + public readonly struct ShaderKey : IEquatable { - public MetaHash ShaderName; - public MetaHash ShaderFile; + public readonly MetaHash ShaderName; + public readonly MetaHash ShaderFile; + + public ShaderKey() + { + ShaderName = new MetaHash(); + ShaderFile = new MetaHash(); + } + + public ShaderKey(MetaHash shaderName, MetaHash shaderFile) + { + ShaderName = shaderName; + ShaderFile = shaderFile; + } public override string ToString() { return ShaderFile.ToString() + ": " + ShaderName.ToString(); } - public override int GetHashCode() + public override bool Equals(object? obj) { - return ShaderName.GetHashCode(); + return obj is ShaderKey key && Equals(key); } - public override bool Equals(object obj) + public bool Equals(ShaderKey other) { - if (obj == null) return false; - if (obj is not ShaderKey shaderKey) return false; - return shaderKey.ShaderName == ShaderName && shaderKey.ShaderFile == ShaderFile; + return ShaderName.Equals(other.ShaderName) && + ShaderFile.Equals(other.ShaderFile); + } + + public override int GetHashCode() + { + return HashCode.Combine(ShaderName, ShaderFile); + } + + public static bool operator ==(ShaderKey left, ShaderKey right) + { + return left.Equals(right); + } + + public static bool operator !=(ShaderKey left, ShaderKey right) + { + return !(left == right); } } public class ShaderRenderBucket @@ -1122,7 +1188,8 @@ namespace CodeWalker.Rendering foreach (var kvp in Batches.Where(p => p.Value.Geometries.Count > 0).OrderBy(p => p.Value.Geometries.Average(p => p.Inst.Distance))) { - if (kvp.Value.Geometries.Count == 0) continue; + if (kvp.Value.Geometries.Count == 0) + continue; List b = null; switch (kvp.Key.ShaderFile.Hash) diff --git a/CodeWalker/Rendering/Shaders/BasicShader.cs b/CodeWalker/Rendering/Shaders/BasicShader.cs index 86a570c..7453245 100644 --- a/CodeWalker/Rendering/Shaders/BasicShader.cs +++ b/CodeWalker/Rendering/Shaders/BasicShader.cs @@ -13,6 +13,7 @@ using SharpDX; using CodeWalker.GameFiles; using CodeWalker.World; using System.Diagnostics; +using CodeWalker.Rendering.Utils; namespace CodeWalker.Rendering { @@ -181,11 +182,14 @@ namespace CodeWalker.Rendering Matrix3_s[] defaultBoneMatrices; bool defaultBoneMatricesBound = false; + public ShaderManager _shaderManager; + private Dictionary layouts = new Dictionary(); - public BasicShader(Device device) + public BasicShader(Device device, ShaderManager shaderManager) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + _shaderManager = shaderManager; + string folder = ShaderManager.GetShaderFolder(); byte[] vspnctbytes = File.ReadAllBytes(Path.Combine(folder, "BasicVS_PNCT.cso")); byte[] vspncttbytes = File.ReadAllBytes(Path.Combine(folder, "BasicVS_PNCTT.cso")); byte[] vspnctttbytes = File.ReadAllBytes(Path.Combine(folder, "BasicVS_PNCTTT.cso")); @@ -215,32 +219,33 @@ namespace CodeWalker.Rendering byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "BasicPS.cso")); byte[] psdefbytes = File.ReadAllBytes(Path.Combine(folder, "BasicPS_Deferred.cso")); - basicvspnct = new VertexShader(device, vspnctbytes); - basicvspnctt = new VertexShader(device, vspncttbytes); - basicvspncttt = new VertexShader(device, vspnctttbytes); - basicvspncct = new VertexShader(device, vspncctbytes); - basicvspncctt = new VertexShader(device, vspnccttbytes); - basicvspnccttt = new VertexShader(device, vspncctttbytes); - basicvspnctx = new VertexShader(device, vspnctxbytes); - basicvspncctx = new VertexShader(device, vspncctxbytes); - basicvspncttx = new VertexShader(device, vspncttxbytes); - basicvspnccttx = new VertexShader(device, vspnccttxbytes); - basicvspnctttx = new VertexShader(device, vspnctttxbytes); - basicvspncctttx = new VertexShader(device, vspncctttxbytes); - basicvspbbnct = new VertexShader(device, vspbbnctbytes); - basicvspbbnctx = new VertexShader(device, vspbbnctxbytes); - basicvspbbnctt = new VertexShader(device, vspbbncttbytes); - basicvspbbncttt = new VertexShader(device, vspbbnctttbytes); - basicvspbbncct = new VertexShader(device, vspbbncctbytes); - basicvspbbncctx = new VertexShader(device, vspbbncctxbytes); - basicvspbbnccttx = new VertexShader(device, vspbbnccttxbytes); - basicvspbbncttx = new VertexShader(device, vspbbncttxbytes); - basicvsbox = new VertexShader(device, vsboxbytes); - basicvssphere = new VertexShader(device, vsspherebytes); - basicvscapsule = new VertexShader(device, vscapsulebytes); - basicvscylinder = new VertexShader(device, vscylinderbytes); - basicps = new PixelShader(device, psbytes); - basicpsdef = new PixelShader(device, psdefbytes); + basicvspnct = device.CreateVertexShader("BasicVS_PNCT.cso"); + basicvspnctt = device.CreateVertexShader("BasicVS_PNCTT.cso"); + basicvspncttt = device.CreateVertexShader("BasicVS_PNCTTT.cso"); + basicvspncct = device.CreateVertexShader("BasicVS_PNCCT.cso"); + basicvspncctt = device.CreateVertexShader("BasicVS_PNCCTT.cso"); + basicvspnccttt = device.CreateVertexShader("BasicVS_PNCCTTT.cso"); + basicvspnctx = device.CreateVertexShader("BasicVS_PNCTX.cso"); + basicvspncctx = device.CreateVertexShader("BasicVS_PNCCTX.cso"); + basicvspncttx = device.CreateVertexShader("BasicVS_PNCTTX.cso"); + basicvspnccttx = device.CreateVertexShader("BasicVS_PNCCTTX.cso"); + basicvspnctttx = device.CreateVertexShader("BasicVS_PNCTTTX.cso"); + basicvspncctttx = device.CreateVertexShader("BasicVS_PNCCTTTX.cso"); + basicvspbbnct = device.CreateVertexShader("BasicVS_PBBNCT.cso"); + basicvspbbnctx = device.CreateVertexShader("BasicVS_PBBNCTX.cso"); + basicvspbbnctt = device.CreateVertexShader("BasicVS_PBBNCTT.cso"); + basicvspbbncttt = device.CreateVertexShader("BasicVS_PBBNCTTT.cso"); + basicvspbbncct = device.CreateVertexShader("BasicVS_PBBNCCT.cso"); + basicvspbbncctx = device.CreateVertexShader("BasicVS_PBBNCCTX.cso"); + basicvspbbnccttx = device.CreateVertexShader("BasicVS_PBBNCCTTX.cso"); + basicvspbbncttx = device.CreateVertexShader("BasicVS_PBBNCTTX.cso"); + + basicvsbox = device.CreateVertexShader("BasicVS_Box.cso"); + basicvssphere = device.CreateVertexShader("BasicVS_Sphere.cso"); + basicvscapsule = device.CreateVertexShader("BasicVS_Capsule.cso"); + basicvscylinder = device.CreateVertexShader("BasicVS_Cylinder.cso"); + basicps = device.CreatePixelShader("BasicPS.cso"); + basicpsdef = device.CreatePixelShader("BasicPS_Deferred.cso"); VSSceneVars = new GpuVarsBuffer(device); VSEntityVars = new GpuVarsBuffer(device); @@ -361,9 +366,12 @@ namespace CodeWalker.Rendering defaultBoneMatrices = new Matrix3_s[255]; for (int i = 0; i < 255; i++) { - defaultBoneMatrices[i].Row1 = Vector4.UnitX; - defaultBoneMatrices[i].Row2 = Vector4.UnitY; - defaultBoneMatrices[i].Row3 = Vector4.UnitZ; + defaultBoneMatrices[i] = new Matrix3_s + { + Row1 = Vector4.UnitX, + Row2 = Vector4.UnitY, + Row3 = Vector4.UnitZ + }; } } @@ -491,13 +499,21 @@ namespace CodeWalker.Rendering break; } - context.VertexShader.Set(vs); + + if (context.VertexShader.Get() != vs) + { + context.VertexShader.Set(vs); + } } public override void SetShader(DeviceContext context) { - context.PixelShader.Set(Deferred ? basicpsdef : basicps); + var shader = Deferred ? basicpsdef : basicps; + if (context.PixelShader.Get() != shader) + { + context.PixelShader.Set(Deferred ? basicpsdef : basicps); + } } public override bool SetInputLayout(DeviceContext context, VertexType type) @@ -512,7 +528,7 @@ namespace CodeWalker.Rendering return false; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { uint rendermode = 0; uint rendermodeind = 1; @@ -554,10 +570,7 @@ namespace CodeWalker.Rendering PSSceneVars.Update(context); PSSceneVars.SetPSCBuffer(context, 0); - if (shadowmap != null) - { - shadowmap.SetFinalRenderResources(context); - } + shadowmap?.SetFinalRenderResources(context); if (!InstGlobalVars.Flag) //on the first frame, update the instance globals { @@ -875,11 +888,14 @@ namespace CodeWalker.Rendering InstLocalVars.Vars.vecBatchAabbMin = batch.AABBMin; InstLocalVars.Vars.vecBatchAabbDelta = batch.AABBMax - batch.AABBMin; - InstLocalVars.Vars.vecPlayerPos = new Vector4(batch.Position - batch.CamRel, 1.0f); + Vector3.Subtract(ref batch.Position, ref batch.CamRel, out var result); + InstLocalVars.Vars.vecPlayerPos = new Vector4(result, 1.0f); InstLocalVars.Vars._vecCollParams = new Vector2(2.0f, -3.0f);//range, offset InstLocalVars.Vars.fadeAlphaDistUmTimer = new Vector4(0.0f); InstLocalVars.Vars.uMovementParams = new Vector4(0.0f); - InstLocalVars.Vars._fakedGrassNormal = new Vector4(Vector3.Normalize(-batch.CamRel), 0.0f); + var camRel = -batch.CamRel; + camRel.Normalize(); + InstLocalVars.Vars._fakedGrassNormal = new Vector4(camRel, 0.0f); InstLocalVars.Vars.gScaleRange = gb.Batch.ScaleRange; InstLocalVars.Vars.gWindBendingGlobals = new Vector4(WindVector.X, WindVector.Y, 1.0f, 1.0f); InstLocalVars.Vars.gWindBendScaleVar = new Vector2(WindVector.Z, WindVector.W); diff --git a/CodeWalker/Rendering/Shaders/BoundsShader.cs b/CodeWalker/Rendering/Shaders/BoundsShader.cs index 7793b61..1ac5be1 100644 --- a/CodeWalker/Rendering/Shaders/BoundsShader.cs +++ b/CodeWalker/Rendering/Shaders/BoundsShader.cs @@ -72,7 +72,7 @@ namespace CodeWalker.Rendering public BoundsShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] spherevsbytes = File.ReadAllBytes(Path.Combine(folder, "BoundingSphereVS.cso")); byte[] boxvsbytes = File.ReadAllBytes(Path.Combine(folder, "BoundingBoxVS.cso")); byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "BoundsPS.cso")); @@ -126,7 +126,7 @@ namespace CodeWalker.Rendering return true; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { switch (mode) { diff --git a/CodeWalker/Rendering/Shaders/CableShader.cs b/CodeWalker/Rendering/Shaders/CableShader.cs index babe3c1..1dac663 100644 --- a/CodeWalker/Rendering/Shaders/CableShader.cs +++ b/CodeWalker/Rendering/Shaders/CableShader.cs @@ -89,7 +89,7 @@ namespace CodeWalker.Rendering public CableShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vsbytes = File.ReadAllBytes(Path.Combine(folder, "CableVS.cso")); byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "CablePS.cso")); byte[] psdefbytes = File.ReadAllBytes(Path.Combine(folder, "CablePS_Deferred.cso")); @@ -158,7 +158,7 @@ namespace CodeWalker.Rendering return false; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { uint rendermode = 0; uint rendermodeind = 1; @@ -197,10 +197,7 @@ namespace CodeWalker.Rendering PSSceneVars.Update(context); PSSceneVars.SetPSCBuffer(context, 0); - if (shadowmap != null) - { - shadowmap.SetFinalRenderResources(context); - } + shadowmap?.SetFinalRenderResources(context); } public override void SetEntityVars(DeviceContext context, ref RenderableInst rend) diff --git a/CodeWalker/Rendering/Shaders/CloudsShader.cs b/CodeWalker/Rendering/Shaders/CloudsShader.cs index 4b4c88c..b38e8b6 100644 --- a/CodeWalker/Rendering/Shaders/CloudsShader.cs +++ b/CodeWalker/Rendering/Shaders/CloudsShader.cs @@ -107,7 +107,7 @@ namespace CodeWalker.Rendering public CloudsShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vsbytes = File.ReadAllBytes(Path.Combine(folder, "CloudsVS.cso")); byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "CloudsPS.cso")); @@ -176,7 +176,7 @@ namespace CodeWalker.Rendering context.PixelShader.Set(ps); } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { CloudsLocalVars.Update(context); CloudsLocalVars.SetVSCBuffer(context, 0); diff --git a/CodeWalker/Rendering/Shaders/DeferredScene.cs b/CodeWalker/Rendering/Shaders/DeferredScene.cs index cdc3419..170bb93 100644 --- a/CodeWalker/Rendering/Shaders/DeferredScene.cs +++ b/CodeWalker/Rendering/Shaders/DeferredScene.cs @@ -15,6 +15,7 @@ using SharpDX.DXGI; using SharpDX.Mathematics.Interop; using System.Diagnostics; using CodeWalker.Properties; +using System.Diagnostics.CodeAnalysis; namespace CodeWalker.Rendering { @@ -69,9 +70,9 @@ namespace CodeWalker.Rendering } - public class DeferredScene + public class DeferredScene : IDisposable { - + private readonly ShaderManager _shaderManager; public GpuMultiTexture GBuffers; // diffuse, normals, specular, irradiance public GpuTexture SceneColour; //final scene colour buffer @@ -85,16 +86,19 @@ namespace CodeWalker.Rendering VertexShader DirLightVS; PixelShader DirLightPS; - PixelShader DirLightMSPS; + PixelShader? DirLightMSPS; VertexShader LodLightVS; PixelShader LodLightPS; - PixelShader LodLightMSPS; + PixelShader? LodLightMSPS; VertexShader LightVS; PixelShader LightPS; - PixelShader LightMSPS; + PixelShader? LightMSPS; LightCone LightCone; UnitSphere LightSphere; UnitCapsule LightCapsule; + LightCone LightConeLOD; + UnitSphere LightSphereLOD; + UnitCapsule LightCapsuleLOD; UnitQuad LightQuad; InputLayout LightQuadLayout; @@ -111,26 +115,16 @@ namespace CodeWalker.Rendering public int SSAASampleCount = 1; - public int MSAASampleCount = 8; + public int MSAASampleCount = Settings.Default.AntiAliasing; + public long VramUsage => WindowSizeVramUsage; - - - public long VramUsage - { - get - { - return WindowSizeVramUsage; - } - } - - - - public DeferredScene(DXManager dxman) + public DeferredScene(DXManager dxman, ShaderManager shaderManager) { + _shaderManager = shaderManager; var device = dxman.device; - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + var folder = ShaderManager.GetShaderFolder(); byte[] bDirLightVS = File.ReadAllBytes(Path.Combine(folder, "DirLightVS.cso")); byte[] bDirLightPS = File.ReadAllBytes(Path.Combine(folder, "DirLightPS.cso")); byte[] bDirLightMSPS = File.ReadAllBytes(Path.Combine(folder, "DirLightPS_MS.cso")); @@ -159,13 +153,20 @@ namespace CodeWalker.Rendering } catch { + DirLightMSPS = null; + LodLightMSPS = null; + LightMSPS = null; MSAASampleCount = 1; //can't do MSAA without at least 10.1 support } - LightCone = new LightCone(device, bLodLightVS, 2); - LightSphere = new UnitSphere(device, bLodLightVS, 3, true); - LightCapsule = new UnitCapsule(device, bLodLightVS, 4, false); + LightCone = new LightCone(device, bLightVS, 2); + LightSphere = new UnitSphere(device, bLightVS, 3, true); + LightCapsule = new UnitCapsule(device, bLightVS, 4, false); + + LightConeLOD = new LightCone(device, bLodLightVS, 2); + LightSphereLOD = new UnitSphere(device, bLodLightVS, 2, true); + LightCapsuleLOD = new UnitCapsule(device, bLodLightVS, 2, false); LightQuad = new UnitQuad(device, true); LightQuadLayout = new InputLayout(device, bDirLightVS, new[] { @@ -191,128 +192,38 @@ namespace CodeWalker.Rendering BlendState = DXUtility.CreateBlendState(device, false, BlendOperation.Add, BlendOption.One, BlendOption.Zero, BlendOperation.Add, BlendOption.One, BlendOption.Zero, ColorWriteMaskFlags.All); + OnWindowResize(dxman); } public void Dispose() { DisposeBuffers(); - if (BlendState != null) - { - BlendState.Dispose(); - BlendState = null; - } - if (SampleStateLinear != null) - { - SampleStateLinear.Dispose(); - SampleStateLinear = null; - } - if (SampleStatePoint != null) - { - SampleStatePoint.Dispose(); - SampleStatePoint = null; - } - if (LightVSVars != null) - { - LightVSVars.Dispose(); - LightVSVars = null; - } - if (LightPSVars != null) - { - LightPSVars.Dispose(); - LightPSVars = null; - } - if (LightInstVars != null) - { - LightInstVars.Dispose(); - LightInstVars = null; - } - if (LightQuadLayout != null) - { - LightQuadLayout.Dispose(); - LightQuadLayout = null; - } - if (LightQuad != null) - { - LightQuad.Dispose(); - LightQuad = null; - } - if (LightCone != null) - { - LightCone.Dispose(); - LightCone = null; - } - if (LightSphere != null) - { - LightSphere.Dispose(); - LightSphere = null; - } - if (LightCapsule != null) - { - LightCapsule.Dispose(); - LightCapsule = null; - } - if (DirLightPS != null) - { - DirLightPS.Dispose(); - DirLightPS = null; - } - if (DirLightMSPS != null) - { - DirLightMSPS.Dispose(); - DirLightMSPS = null; - } - if (DirLightVS != null) - { - DirLightVS.Dispose(); - DirLightVS = null; - } - if (LodLightPS != null) - { - LodLightPS.Dispose(); - LodLightPS = null; - } - if (LodLightMSPS != null) - { - LodLightMSPS.Dispose(); - LodLightMSPS = null; - } - if (LodLightVS != null) - { - LodLightVS.Dispose(); - LodLightVS = null; - } - if (LightPS != null) - { - LightPS.Dispose(); - LightPS = null; - } - if (LightMSPS != null) - { - LightMSPS.Dispose(); - LightMSPS = null; - } - if (LightVS != null) - { - LightVS.Dispose(); - LightVS = null; - } - if (SSAAPSVars != null) - { - SSAAPSVars.Dispose(); - SSAAPSVars = null; - } - if (SSAAPS != null) - { - SSAAPS.Dispose(); - SSAAPS = null; - } - if (FinalVS != null) - { - FinalVS.Dispose(); - FinalVS = null; - } + BlendState.Dispose(); + SampleStateLinear.Dispose(); + SampleStatePoint.Dispose(); + LightVSVars.Dispose(); + LightPSVars.Dispose(); + LightInstVars.Dispose(); + LightQuadLayout.Dispose(); + LightQuad.Dispose(); + LightConeLOD.Dispose(); + LightSphereLOD.Dispose(); + LightCapsuleLOD.Dispose(); + DirLightPS.Dispose(); + DirLightMSPS?.Dispose(); + DirLightVS.Dispose(); + LodLightPS.Dispose(); + LodLightMSPS?.Dispose(); + LodLightVS.Dispose(); + LightPS.Dispose(); + LightMSPS?.Dispose(); + LightVS.Dispose(); + SSAAPSVars.Dispose(); + SSAAPS.Dispose(); + FinalVS.Dispose(); } + [MemberNotNull(nameof(GBuffers), nameof(SceneColour))] public void OnWindowResize(DXManager dxman) { DisposeBuffers(); @@ -340,16 +251,8 @@ namespace CodeWalker.Rendering } public void DisposeBuffers() { - if (GBuffers != null) - { - GBuffers.Dispose(); - GBuffers = null; - } - if (SceneColour != null) - { - SceneColour.Dispose(); - SceneColour = null; - } + GBuffers?.Dispose(); + SceneColour?.Dispose(); WindowSizeVramUsage = 0; } @@ -374,7 +277,7 @@ namespace CodeWalker.Rendering context.Rasterizer.SetViewport(Viewport); } - public void RenderLights(DeviceContext context, Camera camera, Shadowmap globalShadows, ShaderGlobalLights globalLights) + public void RenderLights(DeviceContext context, Camera camera, Shadowmap? globalShadows, ShaderGlobalLights globalLights, bool updateLods = true) { //first full-screen directional light pass, for sun/moon @@ -398,7 +301,7 @@ namespace CodeWalker.Rendering LightPSVars.Vars.GlobalLights = globalLights.Params; LightPSVars.Vars.ViewProjInv = Matrix.Transpose(camera.ViewProjInvMatrix); LightPSVars.Vars.CameraPos = Vector4.Zero; - LightPSVars.Vars.EnableShadows = (globalShadows != null) ? 1u : 0u; + LightPSVars.Vars.EnableShadows = (globalShadows is not null) ? 1u : 0u; LightPSVars.Vars.RenderMode = 0; LightPSVars.Vars.RenderModeIndex = 1; LightPSVars.Vars.RenderSamplerCoord = 0; @@ -412,7 +315,7 @@ namespace CodeWalker.Rendering context.PixelShader.SetShaderResources(0, GBuffers.DepthSRV); context.PixelShader.SetShaderResources(2, GBuffers.SRVs); - if (globalShadows != null) + if (globalShadows is not null) { globalShadows.SetFinalRenderResources(context); } @@ -427,7 +330,7 @@ namespace CodeWalker.Rendering context.PixelShader.SetSamplers(0, null, null); } - public void RenderLights(DeviceContext context, Camera camera, List lodlights) + public void RenderLights(DeviceContext context, Camera camera, List lodlights, bool updateLods = true) { //instanced rendering of all other lights, using appropriate shapes //blend mode: additive @@ -436,6 +339,7 @@ namespace CodeWalker.Rendering context.VertexShader.Set(LodLightVS); context.PixelShader.Set(ps); + context.InputAssembler.InputLayout = LightQuadLayout; LightVSVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix); LightVSVars.Vars.CameraPos = new Vector4(camera.Position, 0.0f); @@ -458,11 +362,11 @@ namespace CodeWalker.Rendering context.PixelShader.SetShaderResources(0, GBuffers.DepthSRV); context.PixelShader.SetShaderResources(2, GBuffers.SRVs); - - foreach (var rll in lodlights) + for (int i = 0; i < Math.Min(lodlights.Count, 500); i++) { - var (pointsIndex, spotsIndex, capsIndex) = rll.UpdateLods(camera.Position); - if (rll.PointsBuffer != null && pointsIndex > 0) + var rll = lodlights[i]; + var (spotsIndex, pointsIndex, capsIndex) = rll.UpdateLods(in camera.Position, updateLods); + if (rll.PointsBuffer != null && pointsIndex >= 0) { context.VertexShader.SetShaderResources(0, rll.PointsBuffer.SRV); context.PixelShader.SetShaderResources(6, rll.PointsBuffer.SRV); @@ -473,9 +377,9 @@ namespace CodeWalker.Rendering LightPSVars.Update(context); LightPSVars.SetPSCBuffer(context, 0); - LightSphere.DrawInstanced(context, pointsIndex + 1); + LightSphereLOD.DrawInstanced(context, pointsIndex + 1); } - if (rll.SpotsBuffer != null && spotsIndex > 0) + if (rll.SpotsBuffer != null && spotsIndex >= 0) { context.VertexShader.SetShaderResources(0, rll.SpotsBuffer.SRV); context.PixelShader.SetShaderResources(6, rll.SpotsBuffer.SRV); @@ -485,9 +389,9 @@ namespace CodeWalker.Rendering LightPSVars.Vars.LightType = 2; LightPSVars.Update(context); LightPSVars.SetPSCBuffer(context, 0); - LightCone.DrawInstanced(context, spotsIndex + 1); + LightConeLOD.DrawInstanced(context, spotsIndex + 1); } - if (rll.CapsBuffer != null && capsIndex > 0) + if (rll.CapsBuffer != null && capsIndex >= 0) { context.VertexShader.SetShaderResources(0, rll.CapsBuffer.SRV); context.PixelShader.SetShaderResources(6, rll.CapsBuffer.SRV); @@ -497,7 +401,7 @@ namespace CodeWalker.Rendering LightPSVars.Vars.LightType = 4; LightPSVars.Update(context); LightPSVars.SetPSCBuffer(context, 0); - LightCapsule.DrawInstanced(context, capsIndex + 1); + LightCapsuleLOD.DrawInstanced(context, capsIndex + 1); } } @@ -509,7 +413,9 @@ namespace CodeWalker.Rendering context.PixelShader.SetSamplers(0, null, null); } - public void RenderLights(DeviceContext context, Camera camera, List lights) + + private const int lightLimit = 500; + public void RenderLights(DeviceContext context, Camera camera, List lights, bool updateLods = true) { //instanced rendering of all other lights, using appropriate shapes //blend mode: additive @@ -520,6 +426,8 @@ namespace CodeWalker.Rendering context.VertexShader.Set(LightVS); context.PixelShader.Set(ps); + context.InputAssembler.InputLayout = LightQuadLayout; + LightVSVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix); LightVSVars.Vars.CameraPos = new Vector4(camera.Position, 0.0f); LightVSVars.Vars.LightType = 0; @@ -545,8 +453,13 @@ namespace CodeWalker.Rendering context.PixelShader.SetShaderResources(0, GBuffers.DepthSRV); context.PixelShader.SetShaderResources(2, GBuffers.SRVs); + if (lights.Count > lightLimit) + { + Console.WriteLine($"Lights count larger than {lightLimit}, {lights.Count}"); + } - for (int i = 0; i < lights.Count; i++) + // Cap lights to 200, to avoid excessive GPU load due to loads of lights + for (int i = 0; i < Math.Min(lights.Count, lightLimit); i++) { var li = lights[i]; var rl = li.Light; diff --git a/CodeWalker/Rendering/Shaders/DistantLightsShader.cs b/CodeWalker/Rendering/Shaders/DistantLightsShader.cs index 002f0c4..9399357 100644 --- a/CodeWalker/Rendering/Shaders/DistantLightsShader.cs +++ b/CodeWalker/Rendering/Shaders/DistantLightsShader.cs @@ -24,7 +24,7 @@ namespace CodeWalker.Rendering public float Pad0; } - public class DistantLightsShader : Shader + public class DistantLightsShader : Shader, IDisposable { bool disposed = false; @@ -42,7 +42,7 @@ namespace CodeWalker.Rendering public DistantLightsShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vsbytes = File.ReadAllBytes(Path.Combine(folder, "DistantLightsVS.cso")); byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "DistantLightsPS.cso")); @@ -88,7 +88,7 @@ namespace CodeWalker.Rendering context.InputAssembler.InputLayout = layout; return true; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { VSSceneVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix); VSSceneVars.Vars.ViewInv = Matrix.Transpose(camera.ViewInvMatrix); diff --git a/CodeWalker/Rendering/Shaders/MarkerShader.cs b/CodeWalker/Rendering/Shaders/MarkerShader.cs index 4740e7b..16450bc 100644 --- a/CodeWalker/Rendering/Shaders/MarkerShader.cs +++ b/CodeWalker/Rendering/Shaders/MarkerShader.cs @@ -47,7 +47,7 @@ namespace CodeWalker.Rendering public MarkerShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vsbytes = File.ReadAllBytes(Path.Combine(folder, "MarkerVS.cso")); byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "MarkerPS.cso")); @@ -95,7 +95,7 @@ namespace CodeWalker.Rendering } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { VSSceneVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix); VSSceneVars.Vars.ViewInv = Matrix.Transpose(camera.ViewInvMatrix); diff --git a/CodeWalker/Rendering/Shaders/PathShader.cs b/CodeWalker/Rendering/Shaders/PathShader.cs index b51668b..3e35901 100644 --- a/CodeWalker/Rendering/Shaders/PathShader.cs +++ b/CodeWalker/Rendering/Shaders/PathShader.cs @@ -47,7 +47,7 @@ namespace CodeWalker.Rendering public PathShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] boxvsbytes = File.ReadAllBytes(Path.Combine(folder, "PathBoxVS.cso")); byte[] boxpsbytes = File.ReadAllBytes(Path.Combine(folder, "PathBoxPS.cso")); byte[] dynvsbytes = File.ReadAllBytes(Path.Combine(folder, "PathDynVS.cso")); @@ -99,7 +99,7 @@ namespace CodeWalker.Rendering return true; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { VSSceneVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix); VSSceneVars.Vars.CameraPos = new Vector4(camera.Position, 0.0f); diff --git a/CodeWalker/Rendering/Shaders/PostProcessor.cs b/CodeWalker/Rendering/Shaders/PostProcessor.cs index 5ed6b1c..57d3283 100644 --- a/CodeWalker/Rendering/Shaders/PostProcessor.cs +++ b/CodeWalker/Rendering/Shaders/PostProcessor.cs @@ -47,7 +47,7 @@ namespace CodeWalker.Rendering public Vector4 avSampleWeights13; public Vector4 avSampleWeights14; - public Vector4 Get(int i) + public readonly Vector4 Get(int i) { switch (i) { @@ -113,38 +113,38 @@ namespace CodeWalker.Rendering } - public class PostProcessor + public class PostProcessor : IDisposable { - ComputeShader ReduceTo1DCS; - ComputeShader ReduceTo0DCS; - ComputeShader LumBlendCS; - ComputeShader BloomFilterBPHCS; - ComputeShader BloomFilterVCS; - PixelShader CopyPixelsPS; - VertexShader FinalPassVS; - PixelShader FinalPassPS; - UnitQuad FinalPassQuad; - InputLayout FinalPassLayout; - GpuVarsBuffer ReduceCSVars; - GpuVarsBuffer LumBlendCSVars; - GpuVarsBuffer FilterBPHCSVars; - GpuVarsBuffer FilterVCSVars; - GpuVarsBuffer FinalPSVars; + ComputeShader? ReduceTo1DCS; + ComputeShader? ReduceTo0DCS; + ComputeShader? LumBlendCS; + ComputeShader? BloomFilterBPHCS; + ComputeShader? BloomFilterVCS; + PixelShader? CopyPixelsPS; + VertexShader? FinalPassVS; + PixelShader? FinalPassPS; + UnitQuad? FinalPassQuad; + InputLayout? FinalPassLayout; + GpuVarsBuffer? ReduceCSVars; + GpuVarsBuffer? LumBlendCSVars; + GpuVarsBuffer? FilterBPHCSVars; + GpuVarsBuffer? FilterVCSVars; + GpuVarsBuffer? FinalPSVars; - GpuTexture Primary; + GpuTexture? Primary; - GpuBuffer Reduction0; - GpuBuffer Reduction1; + GpuBuffer? Reduction0; + GpuBuffer? Reduction1; - GpuBuffer LumBlendResult; + GpuBuffer? LumBlendResult; - GpuBuffer Bloom0; - GpuBuffer Bloom1; - GpuTexture Bloom; + GpuBuffer? Bloom0; + GpuBuffer? Bloom1; + GpuTexture? Bloom; - SamplerState SampleStatePoint; - SamplerState SampleStateLinear; - BlendState BlendState; + SamplerState? SampleStatePoint; + SamplerState? SampleStateLinear; + BlendState? BlendState; long WindowSizeVramUsage = 0; int Width = 0; int Height = 0; @@ -166,7 +166,7 @@ namespace CodeWalker.Rendering RawViewportF[] vpOld = new RawViewportF[15]; - DeferredScene DefScene; + DeferredScene? DefScene; bool UsePrimary = true; ShaderResourceView SceneColourSRV @@ -187,7 +187,7 @@ namespace CodeWalker.Rendering { var device = dxman.device; - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] bReduceTo1DCS = File.ReadAllBytes(Path.Combine(folder, "PPReduceTo1DCS.cso")); byte[] bReduceTo0DCS = File.ReadAllBytes(Path.Combine(folder, "PPReduceTo0DCS.cso")); byte[] bLumBlendCS = File.ReadAllBytes(Path.Combine(folder, "PPLumBlendCS.cso")); @@ -230,100 +230,73 @@ namespace CodeWalker.Rendering GetSampleWeights(ref FilterVCSVars.Vars.avSampleWeights, 3.0f, 1.25f); //init sample weights FilterBPHCSVars.Vars.avSampleWeights = FilterVCSVars.Vars.avSampleWeights; } + private bool isDisposed = false; public void Dispose() { + if (isDisposed) + { + return; + } DisposeBuffers(); - if (BlendState != null) - { - BlendState.Dispose(); - BlendState = null; - } - if (SampleStateLinear != null) - { - SampleStateLinear.Dispose(); - SampleStateLinear = null; - } - if (SampleStatePoint != null) - { - SampleStatePoint.Dispose(); - SampleStatePoint = null; - } - if (FinalPSVars != null) - { - FinalPSVars.Dispose(); - FinalPSVars = null; - } - if (FilterVCSVars != null) - { - FilterVCSVars.Dispose(); - FilterVCSVars = null; - } - if (FilterBPHCSVars != null) - { - FilterBPHCSVars.Dispose(); - FilterBPHCSVars = null; - } - if (LumBlendCSVars != null) - { - LumBlendCSVars.Dispose(); - LumBlendCSVars = null; - } - if (ReduceCSVars != null) - { - ReduceCSVars.Dispose(); - ReduceCSVars = null; - } - if (FinalPassLayout != null) - { - FinalPassLayout.Dispose(); - FinalPassLayout = null; - } - if (FinalPassQuad != null) - { - FinalPassQuad.Dispose(); - FinalPassQuad = null; - } - if (FinalPassPS != null) - { - FinalPassPS.Dispose(); - FinalPassPS = null; - } - if (FinalPassVS != null) - { - FinalPassVS.Dispose(); - FinalPassVS = null; - } - if (CopyPixelsPS != null) - { - CopyPixelsPS.Dispose(); - CopyPixelsPS = null; - } - if (BloomFilterVCS != null) - { - BloomFilterVCS.Dispose(); - BloomFilterVCS = null; - } - if (BloomFilterBPHCS != null) - { - BloomFilterBPHCS.Dispose(); - BloomFilterBPHCS = null; - } - if (LumBlendCS != null) - { - LumBlendCS.Dispose(); - LumBlendCS = null; - } - if (ReduceTo0DCS != null) - { - ReduceTo0DCS.Dispose(); - ReduceTo0DCS = null; - } - if (ReduceTo1DCS != null) - { - ReduceTo1DCS.Dispose(); - ReduceTo1DCS = null; - } + BlendState?.Dispose(); + BlendState = null; + + SampleStateLinear?.Dispose(); + SampleStateLinear = null; + + SampleStatePoint?.Dispose(); + SampleStatePoint = null; + + + FinalPSVars?.Dispose(); + FinalPSVars = null; + + + FilterVCSVars?.Dispose(); + FilterVCSVars = null; + + FilterBPHCSVars?.Dispose(); + FilterBPHCSVars = null; + + LumBlendCSVars?.Dispose(); + LumBlendCSVars = null; + + ReduceCSVars?.Dispose(); + ReduceCSVars = null; + + FinalPassLayout?.Dispose(); + FinalPassLayout = null; + + FinalPassQuad?.Dispose(); + FinalPassQuad = null; + + FinalPassPS?.Dispose(); + FinalPassPS = null; + + FinalPassVS?.Dispose(); + FinalPassVS = null; + + CopyPixelsPS?.Dispose(); + CopyPixelsPS = null; + + BloomFilterVCS?.Dispose(); + BloomFilterVCS = null; + + BloomFilterBPHCS?.Dispose(); + BloomFilterBPHCS = null; + + LumBlendCS?.Dispose(); + LumBlendCS = null; + + ReduceTo0DCS?.Dispose(); + ReduceTo0DCS = null; + + ReduceTo1DCS?.Dispose(); + ReduceTo1DCS = null; + + isDisposed = true; + GC.SuppressFinalize(this); } public void OnWindowResize(DXManager dxman) @@ -381,41 +354,27 @@ namespace CodeWalker.Rendering } public void DisposeBuffers() { - if (Bloom != null) - { - Bloom.Dispose(); - Bloom = null; - } - if (Bloom0 != null) - { - Bloom0.Dispose(); - Bloom0 = null; - } - if (Bloom1 != null) - { - Bloom1.Dispose(); - Bloom1 = null; - } - if (LumBlendResult != null) - { - LumBlendResult.Dispose(); - LumBlendResult = null; - } - if (Reduction0 != null) - { - Reduction0.Dispose(); - Reduction0 = null; - } - if (Reduction1 != null) - { - Reduction1.Dispose(); - Reduction1 = null; - } - if (Primary != null) - { - Primary.Dispose(); - Primary = null; - } + Bloom?.Dispose(); + Bloom = null; + + Bloom0?.Dispose(); + Bloom0 = null; + + Bloom1?.Dispose(); + Bloom1 = null; + + LumBlendResult?.Dispose(); + LumBlendResult = null; + + Reduction0?.Dispose(); + Reduction0 = null; + + Reduction1?.Dispose(); + Reduction1 = null; + + Primary?.Dispose(); + Primary = null; + WindowSizeVramUsage = 0; } @@ -424,19 +383,19 @@ namespace CodeWalker.Rendering Color4 clearColour = new Color4(0.2f, 0.4f, 0.6f, 0.0f); //Color4 clearColour = new Color4(0.0f, 0.0f, 0.0f, 0.0f); - Primary.Clear(context, clearColour); + Primary?.Clear(context, clearColour); } public void ClearDepth(DeviceContext context) { - Primary.ClearDepth(context); + Primary?.ClearDepth(context); } public void SetPrimary(DeviceContext context) { - Primary.SetRenderTarget(context); + Primary?.SetRenderTarget(context); context.Rasterizer.SetViewport(Viewport); } - public void Render(DXManager dxman, float elapsed, DeferredScene defScene) + public void Render(DXManager dxman, float elapsed, DeferredScene? defScene) { ElapsedTime = elapsed; DefScene = defScene; diff --git a/CodeWalker/Rendering/Shaders/Shader.cs b/CodeWalker/Rendering/Shaders/Shader.cs index 39a71bc..4ed129e 100644 --- a/CodeWalker/Rendering/Shaders/Shader.cs +++ b/CodeWalker/Rendering/Shaders/Shader.cs @@ -20,7 +20,7 @@ namespace CodeWalker.Rendering public abstract void SetShader(DeviceContext context); public abstract bool SetInputLayout(DeviceContext context, VertexType type); - public abstract void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights); + public abstract void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights); public abstract void SetEntityVars(DeviceContext context, ref RenderableInst rend); public abstract void SetModelVars(DeviceContext context, RenderableModel model); public abstract void SetGeomVars(DeviceContext context, RenderableGeometry geom); diff --git a/CodeWalker/Rendering/Shaders/ShadowShader.cs b/CodeWalker/Rendering/Shaders/ShadowShader.cs index ed68588..c5ed379 100644 --- a/CodeWalker/Rendering/Shaders/ShadowShader.cs +++ b/CodeWalker/Rendering/Shaders/ShadowShader.cs @@ -82,7 +82,7 @@ namespace CodeWalker.Rendering public ShadowShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vsbytes = File.ReadAllBytes(Path.Combine(folder, "ShadowVS.cso")); byte[] vssbytes = File.ReadAllBytes(Path.Combine(folder, "ShadowVS_Skin.cso")); byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "ShadowPS.cso")); @@ -167,9 +167,12 @@ namespace CodeWalker.Rendering defaultBoneMatrices = new Matrix3_s[255]; for (int i = 0; i < 255; i++) { - defaultBoneMatrices[i].Row1 = Vector4.UnitX; - defaultBoneMatrices[i].Row2 = Vector4.UnitY; - defaultBoneMatrices[i].Row3 = Vector4.UnitZ; + defaultBoneMatrices[i] = new Matrix3_s + { + Row1 = Vector4.UnitX, + Row2 = Vector4.UnitY, + Row3 = Vector4.UnitZ + }; } } @@ -212,7 +215,7 @@ namespace CodeWalker.Rendering return false; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { } public void SetSceneVars(DeviceContext context, Matrix shadowviewproj) @@ -237,7 +240,7 @@ namespace CodeWalker.Rendering public override void SetModelVars(DeviceContext context, RenderableModel model) { - if ((model.Owner.Skeleton?.BoneTransforms != null) && (model.Owner.Skeleton.BoneTransforms.Length > 0)) + if ((model.Owner.Skeleton?.BoneTransforms is not null) && (model.Owner.Skeleton.BoneTransforms.Length > 0)) { SetBoneMatrices(context, model.Owner.Skeleton.BoneTransforms); defaultBoneMatricesBound = false; @@ -247,12 +250,13 @@ namespace CodeWalker.Rendering SetBoneMatrices(context, defaultBoneMatrices); defaultBoneMatricesBound = true; } - if (model.Owner.Cloth?.Vertices != null) + if (model.Owner.Cloth?.Vertices is not null) { SetClothVertices(context, model.Owner.Cloth.Vertices); } - if (!model.UseTransform) return; + if (!model.UseTransform) + return; VSModelVars.Vars.Transform = Matrix.Transpose(model.Transform); VSModelVars.Update(context); VSModelVars.SetVSCBuffer(context, 2); @@ -260,12 +264,12 @@ namespace CodeWalker.Rendering public override void SetGeomVars(DeviceContext context, RenderableGeometry geom) { - RenderableTexture texture = null; // ((geom.Textures != null) && (geom.Textures.Length > 0)) ? geom.Textures[0] : null; + RenderableTexture? texture = null; // ((geom.Textures != null) && (geom.Textures.Length > 0)) ? geom.Textures[0] : null; //RenderableTexture tintpal = null; //float tntpalind = 0.0f; - if ((geom.RenderableTextures != null) && (geom.RenderableTextures.Length > 0)) + if (geom.RenderableTextures is not null && geom.RenderableTextures.Length > 0) { for (int i = 0; i < geom.RenderableTextures.Length; i++) { @@ -281,7 +285,8 @@ namespace CodeWalker.Rendering texture = itex; break; } - if (texture != null) break; + if (texture is not null) + break; } ////try get default diffuse texture @@ -308,7 +313,7 @@ namespace CodeWalker.Rendering //fallback try get first texture... eventaully remove this! (helps with water for now) int index = 0; - while (((texture == null)) && (index < geom.RenderableTextures.Length)) + while (texture is null && index < geom.RenderableTextures.Length) { texture = geom.RenderableTextures[index]; index++; @@ -327,7 +332,7 @@ namespace CodeWalker.Rendering } - bool usediff = ((texture != null) && (texture.ShaderResourceView != null)); + bool usediff = texture is not null && texture.ShaderResourceView != null; uint windflag = 0; @@ -368,11 +373,11 @@ namespace CodeWalker.Rendering //context.PixelShader.SetSampler(1, texsamplerc); if (usediff) { - texture.SetPSResource(context, 0); + texture!.SetPSResource(context, 0); } - if (geom.BoneTransforms != null) + if (geom.BoneTransforms is not null) { SetBoneMatrices(context, geom.BoneTransforms); defaultBoneMatricesBound = false; @@ -412,16 +417,8 @@ namespace CodeWalker.Rendering { if (disposed) return; - if (texsampler != null) - { - texsampler.Dispose(); - texsampler = null; - } - if (texsamplerc != null) - { - texsamplerc.Dispose(); - texsamplerc = null; - } + texsampler?.Dispose(); + texsamplerc?.Dispose(); foreach (InputLayout layout in layouts.Values) { @@ -441,7 +438,13 @@ namespace CodeWalker.Rendering shadowvs.Dispose(); shadowvs_skin.Dispose(); + GC.SuppressFinalize(this); disposed = true; } + + ~ShadowShader() + { + Dispose(); + } } } diff --git a/CodeWalker/Rendering/Shaders/SkydomeShader.cs b/CodeWalker/Rendering/Shaders/SkydomeShader.cs index d655a2c..15ca3fd 100644 --- a/CodeWalker/Rendering/Shaders/SkydomeShader.cs +++ b/CodeWalker/Rendering/Shaders/SkydomeShader.cs @@ -132,7 +132,7 @@ namespace CodeWalker.Rendering public SkydomeShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] skyvsbytes = File.ReadAllBytes(Path.Combine(folder, "SkydomeVS.cso")); byte[] skypsbytes = File.ReadAllBytes(Path.Combine(folder, "SkydomePS.cso")); byte[] sunvsbytes = File.ReadAllBytes(Path.Combine(folder, "SkySunVS.cso")); @@ -261,7 +261,7 @@ namespace CodeWalker.Rendering SkyLocalVars.Vars.noisePhase = Vector4.Zero; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { SkyLocalVars.Update(context); SkyLocalVars.SetVSCBuffer(context, 0); @@ -288,7 +288,8 @@ namespace CodeWalker.Rendering public override void SetModelVars(DeviceContext context, RenderableModel model) { - if (!model.UseTransform) return; + if (!model.UseTransform) + return; VSModelVars.Vars.Transform = Matrix.Transpose(model.Transform); VSModelVars.Update(context); VSModelVars.SetVSCBuffer(context, 3); diff --git a/CodeWalker/Rendering/Shaders/TerrainShader.cs b/CodeWalker/Rendering/Shaders/TerrainShader.cs index 9e3ea83..2f3dbe8 100644 --- a/CodeWalker/Rendering/Shaders/TerrainShader.cs +++ b/CodeWalker/Rendering/Shaders/TerrainShader.cs @@ -102,7 +102,7 @@ namespace CodeWalker.Rendering public TerrainShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vspncct = File.ReadAllBytes(Path.Combine(folder, "TerrainVS_PNCCT.cso")); byte[] vspncctt = File.ReadAllBytes(Path.Combine(folder, "TerrainVS_PNCCTT.cso")); byte[] vspnccttx = File.ReadAllBytes(Path.Combine(folder, "TerrainVS_PNCCTTX.cso")); @@ -280,7 +280,7 @@ namespace CodeWalker.Rendering return false; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { uint rendermode = 0; uint rendermodeind = 1; @@ -334,10 +334,7 @@ namespace CodeWalker.Rendering PSSceneVars.Update(context); PSSceneVars.SetPSCBuffer(context, 0); - if (shadowmap != null) - { - shadowmap.SetFinalRenderResources(context); - } + shadowmap?.SetFinalRenderResources(context); } public override void SetEntityVars(DeviceContext context, ref RenderableInst rend) @@ -385,7 +382,7 @@ namespace CodeWalker.Rendering if (geom.HDTextureEnable) { var hdtex = geom.RenderableTexturesHD[i]; - if ((hdtex != null) && (hdtex.IsLoaded)) + if (hdtex is not null && hdtex.IsLoaded) { itex = hdtex; } diff --git a/CodeWalker/Rendering/Shaders/TreesLodShader.cs b/CodeWalker/Rendering/Shaders/TreesLodShader.cs index c8dd213..843a985 100644 --- a/CodeWalker/Rendering/Shaders/TreesLodShader.cs +++ b/CodeWalker/Rendering/Shaders/TreesLodShader.cs @@ -78,7 +78,7 @@ namespace CodeWalker.Rendering public TreesLodShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vsbytes = File.ReadAllBytes(Path.Combine(folder, "TreesLodVS.cso")); byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "TreesLodPS.cso")); byte[] psdefbytes = File.ReadAllBytes(Path.Combine(folder, "TreesLodPS_Deferred.cso")); @@ -134,7 +134,7 @@ namespace CodeWalker.Rendering return false; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { VSSceneVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix); VSSceneVars.Update(context); diff --git a/CodeWalker/Rendering/Shaders/WaterShader.cs b/CodeWalker/Rendering/Shaders/WaterShader.cs index c56f725..fd7b3b4 100644 --- a/CodeWalker/Rendering/Shaders/WaterShader.cs +++ b/CodeWalker/Rendering/Shaders/WaterShader.cs @@ -122,7 +122,7 @@ namespace CodeWalker.Rendering public WaterShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vsptbytes = File.ReadAllBytes(Path.Combine(folder, "WaterVS_PT.cso")); byte[] vspctbytes = File.ReadAllBytes(Path.Combine(folder, "WaterVS_PCT.cso")); byte[] vspnctbytes = File.ReadAllBytes(Path.Combine(folder, "WaterVS_PNCT.cso")); @@ -234,7 +234,7 @@ namespace CodeWalker.Rendering return false; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { uint rendermode = 0; uint rendermodeind = 1; @@ -287,8 +287,8 @@ namespace CodeWalker.Rendering Vector2 fogtexInv = 1.0f / (fogtexMax - fogtexMin); - bool usewaterbumps = (waterbump != null) && (waterbump.ShaderResourceView != null) && (waterbump2 != null) && (waterbump2.ShaderResourceView != null); - bool usefogtex = (waterfog != null) && (waterfog.ShaderResourceView != null); + bool usewaterbumps = (waterbump is not null) && (waterbump.ShaderResourceView is not null) && (waterbump2 is not null) && (waterbump2.ShaderResourceView is not null); + bool usefogtex = (waterfog is not null) && (waterfog.ShaderResourceView is not null); VSSceneVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix); VSSceneVars.Vars.WaterVector = Vector4.Zero; @@ -297,7 +297,7 @@ namespace CodeWalker.Rendering VSSceneVars.SetVSCBuffer(context, 0); PSSceneVars.Vars.GlobalLights = lights.Params; - PSSceneVars.Vars.EnableShadows = (shadowmap != null) ? 1u : 0u; + PSSceneVars.Vars.EnableShadows = (shadowmap is not null) ? 1u : 0u; PSSceneVars.Vars.RenderMode = rendermode; PSSceneVars.Vars.RenderModeIndex = rendermodeind; PSSceneVars.Vars.RenderSamplerCoord = (uint)RenderTextureSamplerCoord; @@ -309,18 +309,15 @@ namespace CodeWalker.Rendering PSSceneVars.Update(context); PSSceneVars.SetPSCBuffer(context, 0); - if (shadowmap != null) - { - shadowmap.SetFinalRenderResources(context); - } + shadowmap?.SetFinalRenderResources(context); if (usewaterbumps) { - context.PixelShader.SetShaderResource(4, waterbump.ShaderResourceView); - context.PixelShader.SetShaderResource(5, waterbump2.ShaderResourceView); + context.PixelShader.SetShaderResource(4, waterbump!.ShaderResourceView); + context.PixelShader.SetShaderResource(5, waterbump2!.ShaderResourceView); } if (usefogtex) { - context.PixelShader.SetShaderResource(6, waterfog.ShaderResourceView); + context.PixelShader.SetShaderResource(6, waterfog!.ShaderResourceView); } } @@ -354,7 +351,8 @@ namespace CodeWalker.Rendering { var itex = geom.RenderableTextures[i]; var ihash = geom.TextureParamHashes[i]; - if (itex == null) continue; + if (itex is null) + continue; switch (ihash) { case ShaderParamNames.DiffuseSampler: diff --git a/CodeWalker/Rendering/Shaders/WidgetShader.cs b/CodeWalker/Rendering/Shaders/WidgetShader.cs index 9ab93c8..91067bc 100644 --- a/CodeWalker/Rendering/Shaders/WidgetShader.cs +++ b/CodeWalker/Rendering/Shaders/WidgetShader.cs @@ -29,7 +29,7 @@ namespace CodeWalker.Rendering } - public class WidgetShader : Shader + public class WidgetShader : Shader, IDisposable { VertexShader vs; PixelShader ps; @@ -40,7 +40,7 @@ namespace CodeWalker.Rendering public WidgetShader(Device device) { - string folder = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "Shaders"); + string folder = ShaderManager.GetShaderFolder(); byte[] vsbytes = File.ReadAllBytes(Path.Combine(folder, "WidgetVS.cso")); byte[] psbytes = File.ReadAllBytes(Path.Combine(folder, "WidgetPS.cso")); @@ -72,7 +72,7 @@ namespace CodeWalker.Rendering context.InputAssembler.SetIndexBuffer(null, SharpDX.DXGI.Format.Unknown, 0); return true; } - public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap shadowmap, ShaderGlobalLights lights) + public override void SetSceneVars(DeviceContext context, Camera camera, Shadowmap? shadowmap, ShaderGlobalLights lights) { SceneVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix); SceneVars.Update(context); diff --git a/CodeWalker/Rendering/Utils/GpuBuffers.cs b/CodeWalker/Rendering/Utils/GpuBuffers.cs index 35fb4db..af67aca 100644 --- a/CodeWalker/Rendering/Utils/GpuBuffers.cs +++ b/CodeWalker/Rendering/Utils/GpuBuffers.cs @@ -10,10 +10,11 @@ using MapFlags = SharpDX.Direct3D11.MapFlags; using SharpDX.Direct3D11; using SharpDX; using SharpDX.Direct3D; +using System.Diagnostics.CodeAnalysis; namespace CodeWalker.Rendering { - public class GpuVarsBuffer where T:struct //shader vars buffer helper! + public class GpuVarsBuffer : IDisposable where T:struct //shader vars buffer helper! { public int Size; public Buffer Buffer; @@ -26,12 +27,16 @@ namespace CodeWalker.Rendering } public void Dispose() { - if (Buffer != null) - { - Buffer.Dispose(); - Buffer = null; - } + Buffer.Dispose(); + GC.SuppressFinalize(this); } + + ~GpuVarsBuffer() + { + Console.WriteLine("Finalizing GpuVarsBuffer"); + Dispose(); + } + public void Update(DeviceContext context) { try @@ -40,7 +45,9 @@ namespace CodeWalker.Rendering Utilities.Write(dataBox.DataPointer, ref Vars); context.UnmapSubresource(Buffer, 0); } - catch { } //not much we can do about this except ignore it.. + catch(Exception ex) { + Console.WriteLine(ex); + } //not much we can do about this except ignore it.. } public void SetVSCBuffer(DeviceContext context, int slot) { @@ -53,7 +60,7 @@ namespace CodeWalker.Rendering } - public class GpuABuffer where T : struct //Dynamic GPU buffer of items updated by CPU, for array of structs used as a constant buffer + public class GpuABuffer : IDisposable where T : struct //Dynamic GPU buffer of items updated by CPU, for array of structs used as a constant buffer { public int StructSize; public int StructCount; @@ -69,12 +76,16 @@ namespace CodeWalker.Rendering } public void Dispose() { - if (Buffer != null) - { - Buffer.Dispose(); - Buffer = null; - } + Buffer.Dispose(); + GC.SuppressFinalize(this); } + + ~GpuABuffer() + { + Console.WriteLine("Finalizing GpuABuffer"); + Dispose(); + } + public void Update(DeviceContext context, T[] data) { var dataBox = context.MapSubresource(Buffer, 0, MapMode.WriteDiscard, MapFlags.None); @@ -94,7 +105,7 @@ namespace CodeWalker.Rendering } - public class GpuSBuffer where T : struct //for static struct data as resource view + public class GpuSBuffer : IDisposable where T : struct //for static struct data as resource view { public int StructSize; public int StructCount; @@ -113,26 +124,25 @@ namespace CodeWalker.Rendering } public void Dispose() { - if (SRV != null) - { - SRV.Dispose(); - SRV = null; - } - if (Buffer != null) - { - Buffer.Dispose(); - Buffer = null; - } + SRV.Dispose(); + Buffer.Dispose(); + GC.SuppressFinalize(this); + } + + ~GpuSBuffer() + { + Console.WriteLine("Finalizing GpuSBuffer"); + Dispose(); } } - public class GpuCBuffer where T : struct //Dynamic GPU buffer of items updated by CPU + public class GpuCBuffer : IDisposable where T : struct //Dynamic GPU buffer of items updated by CPU { public int StructSize; public int StructCount; public int BufferSize; - public int CurrentCount; + public int CurrentCount => Data.Count; public Buffer Buffer; public ShaderResourceView SRV; public List Data; @@ -149,42 +159,58 @@ namespace CodeWalker.Rendering Data = new List(count); DataArray = new T[count]; } + public void Dispose() { - if (SRV != null) - { - SRV.Dispose(); - SRV = null; - } - if (Buffer != null) - { - Buffer.Dispose(); - Buffer = null; - } + SRV.Dispose(); + Buffer.Dispose(); + GC.SuppressFinalize(this); + } + + ~GpuCBuffer() + { + Console.WriteLine("Finalizing GpuCBuffer"); + Dispose(); } public void Clear() { Data.Clear(); - CurrentCount = 0; } - public bool Add(T item) + + public void EnsureElementsFit(int add) { - if (CurrentCount < StructCount) + if (CurrentCount + add > StructCount) { - Data.Add(item); - CurrentCount++; - return true; + throw new ArgumentOutOfRangeException(nameof(add), $"GpuBuffer exceeded max length of {StructCount}"); + } + } + + public bool Add(in T item) + { + EnsureElementsFit(1); + Data.Add(item); + return true; + } + + public void AddRange(ICollection items) + { + EnsureElementsFit(items.Count); + Data.AddRange(items); + } + + public void AddRange(Span items) + { + EnsureElementsFit(items.Length); + for (int i = 0; i < items.Length; i++) + { + Data.Add(items[i]); } - return false; } public void Update(DeviceContext context) { - for (int i = 0; i < CurrentCount; i++) - { - DataArray[i] = Data[i]; - } + Data.CopyTo(DataArray); var dataBox = context.MapSubresource(Buffer, 0, MapMode.WriteDiscard, MapFlags.None); Utilities.Write(dataBox.DataPointer, DataArray, 0, CurrentCount); context.UnmapSubresource(Buffer, 0); @@ -208,7 +234,7 @@ namespace CodeWalker.Rendering } - public class GpuBuffer where T : struct //Dynamic GPU buffer of items updated by compute shader + public class GpuBuffer : IDisposable where T : struct //Dynamic GPU buffer of items updated by compute shader { public int StructSize; public int StructCount; @@ -232,41 +258,38 @@ namespace CodeWalker.Rendering } public void Dispose() { - if (UAV != null) - { - UAV.Dispose(); - UAV = null; - } - if (SRV != null) - { - SRV.Dispose(); - SRV = null; - } - if (Buffer != null) - { - Buffer.Dispose(); - Buffer = null; - } + UAV.Dispose(); + SRV.Dispose(); + Buffer.Dispose(); + + GC.SuppressFinalize(this); + } + + ~GpuBuffer() + { + Console.WriteLine("Finalizing GpuBuffer"); + Dispose(); } } - public class GpuTexture //texture and render targets (depth, MS). + public class GpuTexture : IDisposable //texture and render targets (depth, MS). { public Texture2D Texture; - public Texture2D TextureMS; - public Texture2D Depth; - public Texture2D DepthMS; + public Texture2D? TextureMS; + public Texture2D? Depth; + public Texture2D? DepthMS; public RenderTargetView RTV; - public DepthStencilView DSV; - public RenderTargetView MSRTV; - public DepthStencilView MSDSV; + public DepthStencilView? DSV; + public RenderTargetView? MSRTV; + public DepthStencilView? MSDSV; public ShaderResourceView SRV; //public ShaderResourceView DepthSRV; //possibly causing crash on DX10 hardware when multisampled public int VramUsage; public bool Multisampled; public bool UseDepth; + [MemberNotNull(nameof(Texture), nameof(RTV), nameof(SRV))] public void Init(Device device, int w, int h, Format f, int sc, int sq, bool depth, Format df) { VramUsage = 0; @@ -281,7 +304,6 @@ namespace CodeWalker.Rendering BindFlags db = BindFlags.DepthStencil;// | BindFlags.ShaderResource;// D3D11_BIND_DEPTH_STENCIL; DepthStencilViewDimension dsvd = DepthStencilViewDimension.Texture2D; Format dtexf = GetDepthTexFormat(df); - Format dsrvf = GetDepthSrvFormat(df); Texture = DXUtility.CreateTexture2D(device, w, h, 1, 1, f, 1, 0, u, b, 0, 0); RTV = DXUtility.CreateRenderTargetView(device, Texture, f, rtvd, 0, 0, 0); @@ -320,52 +342,24 @@ namespace CodeWalker.Rendering } public void Dispose() { - if (SRV != null) - { - SRV.Dispose(); - SRV = null; - } - if (MSDSV != null) - { - MSDSV.Dispose(); - MSDSV = null; - } - if (MSRTV != null) - { - MSRTV.Dispose(); - MSRTV = null; - } - if (DSV != null) - { - DSV.Dispose(); - DSV = null; - } - if (RTV != null) - { - RTV.Dispose(); - RTV = null; - } - if (DepthMS != null) - { - DepthMS.Dispose(); - DepthMS = null; - } - if (Depth != null) - { - Depth.Dispose(); - Depth = null; - } - if (TextureMS != null) - { - TextureMS.Dispose(); - TextureMS = null; - } - if (Texture != null) - { - Texture.Dispose(); - Texture = null; - } + SRV.Dispose(); + MSDSV?.Dispose(); + MSRTV?.Dispose(); + DSV?.Dispose(); + RTV.Dispose(); + DepthMS?.Dispose(); + Depth?.Dispose(); + TextureMS?.Dispose(); + Texture.Dispose(); + GC.SuppressFinalize(this); } + + ~GpuTexture() + { + Console.WriteLine("Finalizer called on GpuTexture"); + Dispose(); + } + public GpuTexture(Device device, int w, int h, Format f, int sc, int sq, bool depth, Format df) { Init(device, w, h, f, sc, sq, depth, df); @@ -473,20 +467,21 @@ namespace CodeWalker.Rendering } - public class GpuMultiTexture //multiple texture and render targets (depth). + public class GpuMultiTexture : IDisposable //multiple texture and render targets (depth). { public Texture2D[] Textures; - public Texture2D Depth; + public Texture2D? Depth; public RenderTargetView[] RTVs; - public DepthStencilView DSV; + public DepthStencilView? DSV; public ShaderResourceView[] SRVs; - public ShaderResourceView DepthSRV; + public ShaderResourceView? DepthSRV; public int VramUsage; public bool UseDepth; public int Count; public bool Multisampled; public int MultisampleCount; + [MemberNotNull(nameof(Textures), nameof(RTVs), nameof(SRVs))] public void Init(Device device, int w, int h, int count, Format f, bool depth, Format df, int multisamplecount) { Count = count; @@ -539,26 +534,23 @@ namespace CodeWalker.Rendering RTVs[i].Dispose(); Textures[i].Dispose(); } - SRVs = null; - RTVs = null; - Textures = null; + SRVs = Array.Empty(); + RTVs = Array.Empty(); + Textures = Array.Empty(); + Count = 0; - if (DSV != null) - { - DSV.Dispose(); - DSV = null; - } - if (DepthSRV != null) - { - DepthSRV.Dispose(); - DepthSRV = null; - } - if (Depth != null) - { - Depth.Dispose(); - Depth = null; - } + DSV?.Dispose(); + DepthSRV?.Dispose(); + Depth?.Dispose(); + GC.SuppressFinalize(this); } + + ~GpuMultiTexture() + { + Console.WriteLine("Finalizer called on GpuBuffers"); + Dispose(); + } + public GpuMultiTexture(Device device, int w, int h, int count, Format f, bool depth, Format df, int msc = 1) { Init(device, w, h, count, f, depth, df, msc); @@ -582,7 +574,8 @@ namespace CodeWalker.Rendering public void ClearDepth(DeviceContext context) { - if (!UseDepth) return; + if (!UseDepth) + return; context.ClearDepthStencilView(DSV, DepthStencilClearFlags.Depth, 0.0f, 0); } diff --git a/CodeWalker/Rendering/Utils/ShaderExtensions.cs b/CodeWalker/Rendering/Utils/ShaderExtensions.cs new file mode 100644 index 0000000..44a91e0 --- /dev/null +++ b/CodeWalker/Rendering/Utils/ShaderExtensions.cs @@ -0,0 +1,57 @@ +using CodeWalker.Core.Utils; +using SharpDX.Direct3D11; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CodeWalker.Rendering.Utils +{ + public static class ShaderExtensions + { + /// + /// Attempts to find the shaders folder in the directory tree + /// + /// + /// + public static string GetShaderFolder() + { + // Directory we're looking for. + var dirToFind = Path.Combine("Shaders"); + + + if (!FileUtils.TryFindFolder(dirToFind, out var folder)) + { + throw new FileNotFoundException($"Could not find '{dirToFind}' directory."); + } + else + { + Console.WriteLine(folder); + return folder; + } + } + + public static PixelShader CreatePixelShader(this Device device, string filename) + { + var file = Path.Combine(GetShaderFolder(), filename); + + byte[] shaderBytes = File.ReadAllBytes(file); + + var shader = new PixelShader(device, shaderBytes); + shader.DebugName = filename; + return shader; + } + + public static VertexShader CreateVertexShader(this Device device, string filename) + { + var file = Path.Combine(GetShaderFolder(), filename); + + byte[] shaderBytes = File.ReadAllBytes(file); + var shader = new VertexShader(device, shaderBytes); + shader.DebugName = filename; + return shader; + } + } +} diff --git a/CodeWalker/Rendering/Utils/Shadowmap.cs b/CodeWalker/Rendering/Utils/Shadowmap.cs index 89d1dbc..d140f7e 100644 --- a/CodeWalker/Rendering/Utils/Shadowmap.cs +++ b/CodeWalker/Rendering/Utils/Shadowmap.cs @@ -16,7 +16,7 @@ using CodeWalker.Properties; namespace CodeWalker.Rendering { - public class Shadowmap + public class Shadowmap : IDisposable { Texture2D DepthTexture; SamplerState DepthTextureSS; @@ -880,7 +880,7 @@ namespace CodeWalker.Rendering case 15: V15 = v; break; } } - public Vector4 Get(int index) + public readonly Vector4 Get(int index) { switch (index) { @@ -943,7 +943,7 @@ namespace CodeWalker.Rendering public Vector4 pt2; public bool culled; - public Vector4 pt(int i) + public readonly Vector4 pt(int i) { switch (i) { diff --git a/CodeWalker/Rendering/Utils/UnitCylinder.cs b/CodeWalker/Rendering/Utils/UnitCylinder.cs index 4e5aa71..1f4ce87 100644 --- a/CodeWalker/Rendering/Utils/UnitCylinder.cs +++ b/CodeWalker/Rendering/Utils/UnitCylinder.cs @@ -9,6 +9,7 @@ using SharpDX.Direct3D11; using Device = SharpDX.Direct3D11.Device; using Buffer = SharpDX.Direct3D11.Buffer; using SharpDX.DXGI; +using Collections.Pooled; namespace CodeWalker.Rendering { @@ -20,17 +21,11 @@ namespace CodeWalker.Rendering private VertexBufferBinding vbbinding; private int indexcount; - private struct SphTri + private readonly struct SphTri(int i1, int i2, int i3) { - public int v1; - public int v2; - public int v3; - public SphTri(int i1, int i2, int i3) - { - v1 = i1; - v2 = i2; - v3 = i3; - } + public readonly int v1 = i1; + public readonly int v2 = i2; + public readonly int v3 = i3; } public UnitCylinder(Device device, byte[] vsbytes, int detail) @@ -44,9 +39,9 @@ namespace CodeWalker.Rendering - List verts = new List(); + using var verts = new PooledList(); Dictionary vdict = new Dictionary(); - List curtris = new List(); + using var curtris = new PooledList(); //List nxttris = new List(); verts.Add(new Vector4(0.0f, 0.0f, 0.0f, 0.0f));//top end (translated by VS!) @@ -108,8 +103,8 @@ namespace CodeWalker.Rendering - List idata = new List(); - foreach (var tri in curtris) + using var idata = new PooledList(); + foreach (ref var tri in curtris.Span) { idata.Add((uint)tri.v1); idata.Add((uint)tri.v2); diff --git a/CodeWalker/Rendering/Utils/UnitSphere.cs b/CodeWalker/Rendering/Utils/UnitSphere.cs index 9f180cc..123308f 100644 --- a/CodeWalker/Rendering/Utils/UnitSphere.cs +++ b/CodeWalker/Rendering/Utils/UnitSphere.cs @@ -9,6 +9,8 @@ using SharpDX.Direct3D11; using Device = SharpDX.Direct3D11.Device; using Buffer = SharpDX.Direct3D11.Buffer; using SharpDX.DXGI; +using System.Runtime.CompilerServices; +using Collections.Pooled; namespace CodeWalker.Rendering { @@ -20,20 +22,14 @@ namespace CodeWalker.Rendering private VertexBufferBinding vbbinding; private int indexcount; - private struct SphTri + private readonly struct SphTri(int i1, int i2, int i3) { - public int v1; - public int v2; - public int v3; - public SphTri(int i1,int i2, int i3) - { - v1 = i1; - v2 = i2; - v3 = i3; - } + public readonly int v1 = i1; + public readonly int v2 = i2; + public readonly int v3 = i3; } - public UnitSphere(Device device, byte[] vsbytes, int detail, bool invert = false) + public UnitSphere(Device device, byte[] vsbytes, int detail, bool invert = false, [CallerMemberName] string caller = "") { InputLayout = new InputLayout(device, vsbytes, new[] @@ -41,13 +37,14 @@ namespace CodeWalker.Rendering new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0), //new InputElement("NORMAL", 0, Format.R32G32B32A32_Float, 16, 0), }); + InputLayout.DebugName = caller; - List verts = new List(); + using var verts = new PooledList(); Dictionary vdict = new Dictionary(); - List curtris = new List(); - List nxttris = new List(); + var curtris = new PooledList(); + var nxttris = new PooledList(); verts.Add(new Vector3(-1.0f, 0.0f, 0.0f)); verts.Add(new Vector3(1.0f, 0.0f, 0.0f)); @@ -111,13 +108,13 @@ namespace CodeWalker.Rendering } - List vdata = new List(); + using var vdata = new PooledList(); foreach (var vert in verts) { vdata.Add(new Vector4(vert, 1.0f)); } - List idata = new List(); + using var idata = new PooledList(); foreach (var tri in curtris) { idata.Add((uint)tri.v1); @@ -125,9 +122,11 @@ namespace CodeWalker.Rendering idata.Add((uint)(invert ? tri.v2 : tri.v3)); } + curtris.Dispose(); + nxttris.Dispose(); VertexBuffer = Buffer.Create(device, BindFlags.VertexBuffer, vdata.ToArray()); - vbbinding = new VertexBufferBinding(VertexBuffer, 8, 0); + vbbinding = new VertexBufferBinding(VertexBuffer, 16, 0); IndexBuffer = Buffer.Create(device, BindFlags.IndexBuffer, idata.ToArray()); indexcount = idata.Count; diff --git a/CodeWalker/Rendering/VertexTypes.cs b/CodeWalker/Rendering/VertexTypes.cs index 8460107..2f5bcf7 100644 --- a/CodeWalker/Rendering/VertexTypes.cs +++ b/CodeWalker/Rendering/VertexTypes.cs @@ -53,7 +53,7 @@ namespace CodeWalker.Rendering public static InputElement[] GetLayout(VertexType componentsFlags, VertexDeclarationTypes componentsTypes = VertexDeclarationTypes.GTAV1) { - List inputElements = new List(); + List inputElements = new List(16); var types = (ulong)componentsTypes; var flags = (uint)componentsFlags; diff --git a/CodeWalker/Settings.cs b/CodeWalker/Settings.cs index 41aa4ed..d70b3e3 100644 --- a/CodeWalker/Settings.cs +++ b/CodeWalker/Settings.cs @@ -1,4 +1,7 @@ -namespace CodeWalker.Properties { +using System; +using System.Configuration; + +namespace CodeWalker.Properties { // This class allows you to handle specific events on the settings class: @@ -25,4 +28,10 @@ // Add code to handle the SettingsSaving event here. } } + + public partial class CustomSettingsProvider : LocalFileSettingsProvider + { + private string applicationName = "CodeWalker"; + public override string ApplicationName { get => applicationName; set { } } + } } diff --git a/CodeWalker/Tools/AudioExplorerForm.cs b/CodeWalker/Tools/AudioExplorerForm.cs index 0392b15..9b49fd1 100644 --- a/CodeWalker/Tools/AudioExplorerForm.cs +++ b/CodeWalker/Tools/AudioExplorerForm.cs @@ -29,7 +29,8 @@ namespace CodeWalker.Tools private void LoadDropDowns() { - if (!GameFileCache.IsInited) return; + if (!GameFileCache.IsInited) + return; NameComboLookup.Clear(); NameComboBox.Items.Clear(); @@ -64,14 +65,22 @@ namespace CodeWalker.Tools var str = filetype + " : " + item.ToString(); TypeComboBox.Items.Add(str); } - foreach (var e in Enum.GetValues(typeof(Dat4ConfigType))) addTypeItem("Config", e); - foreach (var e in Enum.GetValues(typeof(Dat4SpeechType))) addTypeItem("Speech", e); - foreach (var e in Enum.GetValues(typeof(Dat10RelType))) addTypeItem("Synths", e); - foreach (var e in Enum.GetValues(typeof(Dat15RelType))) addTypeItem("Mixers", e); - foreach (var e in Enum.GetValues(typeof(Dat16RelType))) addTypeItem("Curves", e); - foreach (var e in Enum.GetValues(typeof(Dat22RelType))) addTypeItem("Categories", e); - foreach (var e in Enum.GetValues(typeof(Dat54SoundType))) addTypeItem("Sounds", e); - foreach (var e in Enum.GetValues(typeof(Dat151RelType))) addTypeItem("Game", e); + foreach (var e in Enum.GetValues(typeof(Dat4ConfigType))) + addTypeItem("Config", e); + foreach (var e in Enum.GetValues(typeof(Dat4SpeechType))) + addTypeItem("Speech", e); + foreach (var e in Enum.GetValues(typeof(Dat10RelType))) + addTypeItem("Synths", e); + foreach (var e in Enum.GetValues(typeof(Dat15RelType))) + addTypeItem("Mixers", e); + foreach (var e in Enum.GetValues(typeof(Dat16RelType))) + addTypeItem("Curves", e); + foreach (var e in Enum.GetValues(typeof(Dat22RelType))) + addTypeItem("Categories", e); + foreach (var e in Enum.GetValues(typeof(Dat54SoundType))) + addTypeItem("Sounds", e); + foreach (var e in Enum.GetValues(typeof(Dat151RelType))) + addTypeItem("Game", e); TypeComboBox.SelectedIndex = 0; @@ -127,12 +136,16 @@ namespace CodeWalker.Tools private string GetRelDataTitleString(RelData item) { - if (item == null) return ""; + if (item is null) + return ""; var h = item.NameHash; var str = JenkIndex.TryGetString(h); - if (string.IsNullOrEmpty(str)) str = GlobalText.TryGetString(h);//is this necessary? - if (string.IsNullOrEmpty(str)) MetaNames.TryGetString(h, out str); - if (string.IsNullOrEmpty(str)) str = h.Hex; + if (string.IsNullOrEmpty(str)) + str = GlobalText.TryGetString(h);//is this necessary? + if (string.IsNullOrEmpty(str)) + MetaNames.TryGetString(h, out str); + if (string.IsNullOrEmpty(str)) + str = h.Hex; var typeid = item.TypeID.ToString(); var rel = item.Rel; if (rel != null) @@ -172,90 +185,104 @@ namespace CodeWalker.Tools private IEnumerable GetUniqueHashes(MetaHash[] hashes, RelData item) { - return hashes?.Distinct()?.Where(h => h != item.NameHash); //try avoid infinite loops... + return hashes?.Distinct()?.Where(h => h != item.NameHash) ?? []; //try avoid infinite loops... } - private void LoadItemHierarchy(RelData item, TreeNode parentNode = null) + private void LoadItemHierarchy(RelData? item, TreeNode? parentNode = null) { TreeNode node; if (parentNode == null) { HierarchyTreeView.Nodes.Clear(); - if (item == null) return; + if (item is null) + return; node = HierarchyTreeView.Nodes.Add(GetRelDataTitleString(item)); } else { - if (item == null) return; + if (item is null) + return; node = parentNode.Nodes.Add(GetRelDataTitleString(item)); } node.Tag = item; - if ((item is Dat22Category) && (parentNode != null) && (!(parentNode.Tag is Dat22Category))) //don't bother expanding out categories, too spammy! + if (item is Dat22Category && parentNode != null && parentNode.Tag is not Dat22Category) //don't bother expanding out categories, too spammy! { return; } - var speech = GetUniqueHashes(item.GetSpeechHashes(), item); - var synths = GetUniqueHashes(item.GetSynthHashes(), item); - var mixers = GetUniqueHashes(item.GetMixerHashes(), item); - var curves = GetUniqueHashes(item.GetCurveHashes(), item); - var categs = GetUniqueHashes(item.GetCategoryHashes(), item); - var sounds = GetUniqueHashes(item.GetSoundHashes(), item); - var games = GetUniqueHashes(item.GetGameHashes(), item); + var speech = item.GetSpeechHashes(); + if (speech.Length > 0) + { + foreach (var h in GetUniqueHashes(speech, item)) + { + if (GameFileCache.AudioSpeechDict.TryGetValue(h, out RelData child)) + LoadItemHierarchy(child, node); + } + } - if (speech != null) + var synths = item.GetSynthHashes(); + if (synths.Length > 0) { - foreach (var h in speech) + foreach (var h in GetUniqueHashes(synths, item)) { - if (GameFileCache.AudioSpeechDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + if (GameFileCache.AudioSynthsDict.TryGetValue(h, out RelData child)) + LoadItemHierarchy(child, node); } } - if (synths != null) + + var mixers = item.GetMixerHashes(); + if (mixers.Length > 0) { - foreach (var h in synths) + foreach (var h in GetUniqueHashes(mixers, item)) { - if (GameFileCache.AudioSynthsDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + if (GameFileCache.AudioMixersDict.TryGetValue(h, out RelData child)) + LoadItemHierarchy(child, node); } } - if (mixers != null) + + var curves = item.GetCurveHashes(); + if (curves.Length > 0) { - foreach (var h in mixers) + foreach (var h in GetUniqueHashes(curves, item)) { - if (GameFileCache.AudioMixersDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + if (GameFileCache.AudioCurvesDict.TryGetValue(h, out RelData child)) + LoadItemHierarchy(child, node); } } - if (curves != null) + + var categs = item.GetCategoryHashes(); + if (categs.Length > 0) { - foreach (var h in curves) + foreach (var h in GetUniqueHashes(categs, item)) { - if (GameFileCache.AudioCurvesDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + if (GameFileCache.AudioCategsDict.TryGetValue(h, out RelData child)) + LoadItemHierarchy(child, node); } } - if (categs != null) + + var sounds = item.GetSoundHashes(); + if (sounds.Length > 0) { - foreach (var h in categs) + foreach (var h in GetUniqueHashes(sounds, item)) { - if (GameFileCache.AudioCategsDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + if (GameFileCache.AudioSoundsDict.TryGetValue(h, out RelData child)) + LoadItemHierarchy(child, node); } } - if (sounds != null) + + var games = item.GetGameHashes(); + if (games.Length > 0) { - foreach (var h in sounds) + foreach (var h in GetUniqueHashes(games, item)) { - if (GameFileCache.AudioSoundsDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); - } - } - if (games != null) - { - foreach (var h in games) - { - if (GameFileCache.AudioGameDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + if (GameFileCache.AudioGameDict.TryGetValue(h, out RelData child)) + LoadItemHierarchy(child, node); } } diff --git a/CodeWalker/Tools/BinarySearchForm.cs b/CodeWalker/Tools/BinarySearchForm.cs index daaa10a..4bfe8ed 100644 --- a/CodeWalker/Tools/BinarySearchForm.cs +++ b/CodeWalker/Tools/BinarySearchForm.cs @@ -60,14 +60,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { UpdateStatus(text); })); + Invoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void RPFScanComplete() { @@ -75,15 +77,17 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { RPFScanComplete(); })); + Invoke(RPFScanComplete); } else { - StatusLabel.Text = "Ready"; + UpdateStatus("Ready"); //RpfSearchPanel.Enabled = true; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } @@ -226,14 +230,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { FileSearchAddResult(result); })); + Invoke(FileSearchAddResult, result); } else { FileSearchResultsTextBox.AppendText(result + "\r\n"); } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void FileSearchComplete() @@ -242,14 +248,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { FileSearchComplete(); })); + Invoke(FileSearchComplete); } else { FileSearchPanel.Enabled = true; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void FileSearchAbortButton_Click(object sender, EventArgs e) @@ -301,7 +309,7 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { RpfSearchAddResult(result); })); + Invoke(RpfSearchAddResult, result); } else { @@ -309,7 +317,9 @@ namespace CodeWalker.Tools RpfSearchResultsListView.VirtualListSize = RpfSearchResults.Count; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void RpfSearch() @@ -432,8 +442,7 @@ namespace CodeWalker.Tools return; } - RpfFileEntry fentry = entry as RpfFileEntry; - if (fentry == null) continue; + if (entry is not RpfFileEntry fentry) continue; curfile++; @@ -518,7 +527,7 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { RpfSearchComplete(); })); + Invoke(RpfSearchComplete); } else { @@ -533,7 +542,9 @@ namespace CodeWalker.Tools RpfSearchSaveResultsButton.Enabled = true; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void RpfSearchButton_Click(object sender, EventArgs e) @@ -640,11 +651,9 @@ namespace CodeWalker.Tools RpfSelectedOffset = offset; RpfSelectedLength = length; - RpfFileEntry rfe = entry as RpfFileEntry; - if (rfe == null) + if (entry is not RpfFileEntry rfe) { - RpfDirectoryEntry rde = entry as RpfDirectoryEntry; - if (rde != null) + if (entry is RpfDirectoryEntry rde) { FileInfoLabel.Text = rde.Path + " (Directory)"; DataTextBox.Text = "[Please select a data file]"; @@ -847,16 +856,16 @@ namespace CodeWalker.Tools int poslim = pos + charsperln; hexb.Clear(); texb.Clear(); - hexb.AppendFormat("{0:X4}: ", pos); + hexb.Append($"{pos:X4}: "); for (int c = pos; c < poslim; c++) { if (c < data.Length) { byte b = data[c]; - hexb.AppendFormat("{0:X2} ", b); + hexb.Append($"{b:X2} "); if (char.IsControl((char)b)) { - texb.Append("."); + texb.Append('.'); } else { @@ -866,13 +875,13 @@ namespace CodeWalker.Tools else { hexb.Append(" "); - texb.Append(" "); + texb.Append(' '); } } if (i == selline) selstartc = finb.Length; - finb.AppendLine(hexb.ToString() + "| " + texb.ToString()); + finb.AppendLine($"{hexb}| {texb}"); if (i == selline) selendc = finb.Length - 1; } @@ -912,8 +921,7 @@ namespace CodeWalker.Tools return; } - RpfFileEntry rfe = RpfSelectedEntry as RpfFileEntry; - if (rfe == null) + if (RpfSelectedEntry is not RpfFileEntry rfe) { MessageBox.Show("Please select a file to export."); return; @@ -933,13 +941,12 @@ namespace CodeWalker.Tools } - RpfResourceFileEntry rrfe = rfe as RpfResourceFileEntry; - if (rrfe != null) //add resource header if this is a resource file. + if (rfe is RpfResourceFileEntry rrfe) //add resource header if this is a resource file. { data = ResourceBuilder.AddResourceHeader(rrfe, data); } - if (data == null) + if (data is null) { MessageBox.Show("Error extracting file! " + rfe.File.LastError); return; diff --git a/CodeWalker/Tools/BrowseForm.cs b/CodeWalker/Tools/BrowseForm.cs index bd737db..83a2994 100644 --- a/CodeWalker/Tools/BrowseForm.cs +++ b/CodeWalker/Tools/BrowseForm.cs @@ -115,9 +115,9 @@ namespace CodeWalker.Tools MainTreeView.Nodes.Clear(); string searchpath = FolderTextBox.Text; - string replpath = searchpath + "\\"; + string replpath = $"{searchpath}\\"; - Task.Run(() => + _ = Task.Run(() => { UpdateStatus("Starting scan..."); @@ -137,16 +137,19 @@ namespace CodeWalker.Tools RpfFile rf = new RpfFile(rpfpath, rpfpath.Replace(replpath, "")); - UpdateStatus("Scanning " + rf.Name + "..."); + UpdateStatus($"Scanning {rf.Name}..."); - counts += rf.ScanStructure(UpdateStatus, UpdateStatus); + if (rf.ScanStructure(UpdateStatus, UpdateStatus, out var result)) + { + counts += result; + } AddScannedFile(rf, null, true); RootFiles.Add(rf); } - UpdateStatus(string.Format("Scan complete. {0} RPF files, {1} total files, {2} total folders, {3} resources, {4} binary files.", counts.Rpfs, counts.Files, counts.Folders, counts.Resources, counts.BinaryFiles)); + UpdateStatus($"Scan complete. {counts.Rpfs} RPF files, {counts.Files} total files, {counts.Folders} total folders, {counts.Resources} resources, {counts.BinaryFiles} binary files."); InProgress = false; TotalFileCount = (int)counts.Files; }); @@ -161,14 +164,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { UpdateStatus(text); })); + Invoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void ClearFiles() @@ -181,7 +186,7 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { AddScannedFile(file, node, addToList); })); + Invoke(AddScannedFile, file, node, addToList); } else { @@ -200,7 +205,9 @@ namespace CodeWalker.Tools } } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private TreeNode AddFileNode(RpfFile file, TreeNode n) { @@ -315,11 +322,9 @@ namespace CodeWalker.Tools SelectedOffset = offset; SelectedLength = length; - RpfFileEntry rfe = entry as RpfFileEntry; - if (rfe == null) + if (entry is not RpfFileEntry rfe) { - RpfDirectoryEntry rde = entry as RpfDirectoryEntry; - if (rde != null) + if (entry is RpfDirectoryEntry rde) { FileInfoLabel.Text = rde.Path + " (Directory)"; DataTextBox.Text = "[Please select a data file]"; @@ -528,16 +533,16 @@ namespace CodeWalker.Tools int poslim = pos + charsperln; hexb.Clear(); texb.Clear(); - hexb.AppendFormat("{0:X4}: ", pos); + hexb.Append($"{pos:X4}: "); for (int c = pos; c < poslim; c++) { if (c < data.Length) { byte b = data[c]; - hexb.AppendFormat("{0:X2} ", b); + hexb.Append($"{b:X2} "); if (char.IsControl((char)b)) { - texb.Append("."); + texb.Append('.'); } else { @@ -547,7 +552,7 @@ namespace CodeWalker.Tools else { hexb.Append(" "); - texb.Append(" "); + texb.Append(' '); } } @@ -722,7 +727,7 @@ namespace CodeWalker.Tools return; } - UpdateStatus(curfile.ToString() + "/" + totrpfs.ToString() + ": Testing " + file.FilePath + "..."); + UpdateStatus($"{curfile}/{totrpfs}: Testing {file.FilePath}..."); string errorstr = file.TestExtractAllFiles(); @@ -737,7 +742,7 @@ namespace CodeWalker.Tools } - UpdateStatus("Test complete. " + errcount.ToString() + " problems encountered"); + UpdateStatus($"Test complete. {errcount} problems encountered"); InProgress = false; }); } @@ -747,7 +752,7 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { AddTestError(error); })); + Invoke(AddTestError, error); } else { @@ -755,7 +760,9 @@ namespace CodeWalker.Tools } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } @@ -867,8 +874,7 @@ namespace CodeWalker.Tools return; } - RpfFileEntry rfe = node.Tag as RpfFileEntry; - if (rfe == null) + if (node.Tag is not RpfFileEntry rfe) { MessageBox.Show("Please select a file to export."); return; @@ -888,8 +894,7 @@ namespace CodeWalker.Tools } - RpfResourceFileEntry rrfe = rfe as RpfResourceFileEntry; - if (rrfe != null) //add resource header if this is a resource file. + if (rfe is RpfResourceFileEntry rrfe) //add resource header if this is a resource file. { data = ResourceBuilder.AddResourceHeader(rrfe, data); } @@ -948,7 +953,7 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { AddSearchResult(result); })); + Invoke(AddSearchResult, result); } else { @@ -956,7 +961,9 @@ namespace CodeWalker.Tools SearchResultsListView.VirtualListSize = SearchResults.Count; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void Search() @@ -1068,8 +1075,7 @@ namespace CodeWalker.Tools return; } - RpfFileEntry fentry = entry as RpfFileEntry; - if (fentry == null) continue; + if (entry is not RpfFileEntry fentry) continue; curfile++; @@ -1139,7 +1145,7 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { SearchComplete(); })); + Invoke(SearchComplete); } else { @@ -1154,7 +1160,9 @@ namespace CodeWalker.Tools SearchSaveResultsButton.Enabled = true; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void SearchButton_Click(object sender, EventArgs e) { diff --git a/CodeWalker/Tools/ExtractKeysForm.cs b/CodeWalker/Tools/ExtractKeysForm.cs index 15c942c..15cf42a 100644 --- a/CodeWalker/Tools/ExtractKeysForm.cs +++ b/CodeWalker/Tools/ExtractKeysForm.cs @@ -69,14 +69,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { UpdateStatus(text); })); + Invoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void BeginButton_Click(object sender, EventArgs e) diff --git a/CodeWalker/Tools/ExtractRawForm.cs b/CodeWalker/Tools/ExtractRawForm.cs index a26cb7c..229dbc2 100644 --- a/CodeWalker/Tools/ExtractRawForm.cs +++ b/CodeWalker/Tools/ExtractRawForm.cs @@ -48,14 +48,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { UpdateExtractStatus(text); })); + Invoke(UpdateExtractStatus, text); } else { ExtractStatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void OutputFolderTextBox_TextChanged(object sender, EventArgs e) @@ -164,8 +166,7 @@ namespace CodeWalker.Tools data = ResourceBuilder.Compress(data); } - RpfResourceFileEntry rrfe = fentry as RpfResourceFileEntry; - if (rrfe != null) //add resource header if this is a resource file. + if (fentry is RpfResourceFileEntry rrfe) //add resource header if this is a resource file. { data = ResourceBuilder.AddResourceHeader(rrfe, data); } diff --git a/CodeWalker/Tools/ExtractScriptsForm.cs b/CodeWalker/Tools/ExtractScriptsForm.cs index 0cbf466..7197343 100644 --- a/CodeWalker/Tools/ExtractScriptsForm.cs +++ b/CodeWalker/Tools/ExtractScriptsForm.cs @@ -196,14 +196,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { UpdateDumpStatus(text); })); + Invoke(UpdateDumpStatus, text); } else { DumpStatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void UpdateExtractStatus(string text) @@ -212,14 +214,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { UpdateExtractStatus(text); })); + Invoke(UpdateExtractStatus, text); } else { ExtractStatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } } diff --git a/CodeWalker/Tools/ExtractShadersForm.cs b/CodeWalker/Tools/ExtractShadersForm.cs index a90683f..f825146 100644 --- a/CodeWalker/Tools/ExtractShadersForm.cs +++ b/CodeWalker/Tools/ExtractShadersForm.cs @@ -133,7 +133,7 @@ namespace CodeWalker.Tools if (entry.IsExtension(".fxc")) { UpdateExtractStatus(entry.Path); - FxcFile fxc = rpfman.GetFile(entry); + FxcFile fxc = RpfManager.GetFile(entry); if (fxc == null) throw new Exception("Couldn't load file."); string basepath = outputpath + "\\" + rpf.Name.Replace(".rpf", ""); @@ -215,7 +215,10 @@ namespace CodeWalker.Tools ExtractStatusLabel.Text = text; } } - catch { } + catch (Exception ex) + { + Console.WriteLine(ex); + } } } diff --git a/CodeWalker/Tools/ExtractTexForm.cs b/CodeWalker/Tools/ExtractTexForm.cs index 78f7f2b..ea9fefa 100644 --- a/CodeWalker/Tools/ExtractTexForm.cs +++ b/CodeWalker/Tools/ExtractTexForm.cs @@ -146,11 +146,11 @@ namespace CodeWalker.Tools if (bytd && entry.IsExtension(".ytd")) { UpdateExtractStatus(entry.Path); - YtdFile ytd = rpfman.GetFile(entry); - if (ytd == null) throw new Exception("Couldn't load file."); - if (ytd.TextureDict == null) throw new Exception("Couldn't load texture dictionary."); - if (ytd.TextureDict.Textures == null) throw new Exception("Couldn't load texture dictionary texture array."); - if (ytd.TextureDict.Textures.data_items == null) throw new Exception("Texture dictionary had no entries..."); + YtdFile ytd = RpfManager.GetFile(entry); + if (ytd is null) throw new Exception("Couldn't load file."); + if (ytd.TextureDict is null) throw new Exception("Couldn't load texture dictionary."); + if (ytd.TextureDict.Textures is null) throw new Exception("Couldn't load texture dictionary texture array."); + if (ytd.TextureDict.Textures.data_items is null) throw new Exception("Texture dictionary had no entries..."); foreach (var tex in ytd.TextureDict.Textures.data_items) { SaveTexture(tex, entry, outputpath); @@ -159,10 +159,10 @@ namespace CodeWalker.Tools else if (bydr && entry.IsExtension(".ydr")) { UpdateExtractStatus(entry.Path); - YdrFile ydr = rpfman.GetFile(entry); - if (ydr == null) throw new Exception("Couldn't load file."); - if (ydr.Drawable == null) throw new Exception("Couldn't load drawable."); - if (ydr.Drawable.ShaderGroup != null) + YdrFile ydr = RpfManager.GetFile(entry); + if (ydr is null) throw new Exception("Couldn't load file."); + if (ydr.Drawable is null) throw new Exception("Couldn't load drawable."); + if (ydr.Drawable.ShaderGroup is not null) { var ydrtd = ydr.Drawable.ShaderGroup.TextureDictionary; if ((ydrtd != null) && (ydrtd.Textures != null) && (ydrtd.Textures.data_items != null)) @@ -177,7 +177,7 @@ namespace CodeWalker.Tools else if (bydd && entry.IsExtension(".ydd")) { UpdateExtractStatus(entry.Path); - YddFile ydd = rpfman.GetFile(entry); + YddFile ydd = RpfManager.GetFile(entry); if (ydd == null) throw new Exception("Couldn't load file."); //if (ydd.DrawableDict == null) throw new Exception("Couldn't load drawable dictionary."); //if (ydd.DrawableDict.Drawables == null) throw new Exception("Drawable dictionary had no items..."); @@ -201,7 +201,7 @@ namespace CodeWalker.Tools else if (byft && entry.IsExtension(".yft")) { UpdateExtractStatus(entry.Path); - YftFile yft = rpfman.GetFile(entry); + YftFile yft = RpfManager.GetFile(entry); if (yft == null) throw new Exception("Couldn't load file."); if (yft.Fragment == null) throw new Exception("Couldn't load fragment."); if (yft.Fragment.Drawable != null) diff --git a/CodeWalker/Tools/ImportFbxForm.cs b/CodeWalker/Tools/ImportFbxForm.cs index aa0bb07..6035eb0 100644 --- a/CodeWalker/Tools/ImportFbxForm.cs +++ b/CodeWalker/Tools/ImportFbxForm.cs @@ -91,7 +91,7 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - BeginInvoke(new Action(() => { ConvertComplete(); })); + BeginInvoke(ConvertComplete); } else { @@ -100,7 +100,10 @@ namespace CodeWalker.Tools Close(); } } - catch { } + catch (Exception ex) + { + Console.WriteLine(ex); + } } public void UpdateStatus(string text) @@ -109,14 +112,17 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateStatus(text); })); + BeginInvoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch (Exception ex) + { + Console.WriteLine(ex); + } } diff --git a/CodeWalker/Tools/JenkIndForm.cs b/CodeWalker/Tools/JenkIndForm.cs index 980aeed..dd92597 100644 --- a/CodeWalker/Tools/JenkIndForm.cs +++ b/CodeWalker/Tools/JenkIndForm.cs @@ -34,13 +34,13 @@ namespace CodeWalker.Tools if (!GameFileCache.IsInited) { - Task.Run(() => + Task.Run(async () => { try { GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key); GameFileCache.DoFullStringIndex = true; - GameFileCache.Init(UpdateStatus, UpdateStatus); + await GameFileCache.InitAsync(UpdateStatus, UpdateStatus); IndexBuildComplete(); } catch (Exception ex) @@ -80,14 +80,16 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { UpdateStatus(text); })); + Invoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void IndexBuildComplete() { @@ -95,7 +97,7 @@ namespace CodeWalker.Tools { if (InvokeRequired) { - Invoke(new Action(() => { IndexBuildComplete(); })); + Invoke(IndexBuildComplete); } else { @@ -104,7 +106,9 @@ namespace CodeWalker.Tools Cursor = Cursors.Default; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } @@ -149,7 +153,7 @@ namespace CodeWalker.Tools return; } } - StatusLabel.Text = Convert.ToString(hash, 16).ToUpper().PadLeft(8, '0'); + StatusLabel.Text = hash.ToString("X8"); var str = JenkIndex.TryGetString(hash); diff --git a/CodeWalker/Utils/AudioUtils.cs b/CodeWalker/Utils/AudioUtils.cs index 14b96f9..290b5ba 100644 --- a/CodeWalker/Utils/AudioUtils.cs +++ b/CodeWalker/Utils/AudioUtils.cs @@ -28,7 +28,7 @@ namespace CodeWalker.Utils public float[] outputMatrix = new[] { 1.0f, 1.0f }; //left/right channel output levels public float trackLength; } - private AudioVoice[] voices = new AudioVoice[0]; + private AudioVoice[] voices = Array.Empty(); public enum PlayerState { Stopped, Playing, Paused }; public PlayerState State { get; private set; } = PlayerState.Stopped; @@ -282,7 +282,6 @@ namespace CodeWalker.Utils var awcentries = new Dictionary(); void addRpfDatRels(RpfFile rpffile) { - if (rpffile.AllEntries == null) return; foreach (var entry in rpffile.AllEntries) { if (entry is RpfFileEntry) @@ -305,7 +304,6 @@ namespace CodeWalker.Utils } void addRpfAwcs(RpfFile rpffile) { - if (rpffile.AllEntries == null) return; foreach (var entry in rpffile.AllEntries) { if (entry is RpfFileEntry) @@ -314,17 +312,21 @@ namespace CodeWalker.Utils if (entry.IsExtension(".awc")) { var shortname = entry.ShortName; - var parentname = entry.Parent?.ShortName ?? ""; - if (string.IsNullOrEmpty(parentname) && (entry.Parent?.File != null)) + var parentname = ReadOnlySpan.Empty; + if (entry.Parent is not null) + { + parentname = entry.Parent.ShortName; + } + if (parentname.IsEmpty && (entry.Parent?.File != null)) { parentname = entry.Parent.File.Name; int ind = parentname.LastIndexOf('.'); if (ind > 0) { - parentname = parentname.Substring(0, ind); + parentname = parentname.Slice(0, ind); } } - var contname = parentname + "/" + shortname; + var contname = parentname.ToString() + "/" + shortname.ToString(); var hash = JenkHash.GenHashLower(contname); awcentries[hash] = fentry; } @@ -350,6 +352,8 @@ namespace CodeWalker.Utils } foreach (var dlcrpf in gameFileCache.DlcActiveRpfs) //load from current dlc rpfs { + if (dlcrpf.AllEntries is null || dlcrpf.AllEntries.Count == 0) + continue; addRpfDatRels(dlcrpf); addRpfAwcs(dlcrpf); } @@ -361,7 +365,7 @@ namespace CodeWalker.Utils var gamedb = new Dictionary(); foreach (var datentry in datrelentries.Values) { - var relfile = rpfman.GetFile(datentry); + var relfile = RpfManager.GetFile(datentry); if (relfile?.RelDatas != null) { foreach (var rd in relfile.RelDatas) diff --git a/CodeWalker/Utils/ConsoleWindow.cs b/CodeWalker/Utils/ConsoleWindow.cs index b24fb1b..79c5e9b 100644 --- a/CodeWalker/Utils/ConsoleWindow.cs +++ b/CodeWalker/Utils/ConsoleWindow.cs @@ -94,7 +94,7 @@ namespace CodeWalker.Utils public class ConsoleStream : TextWriter { - private readonly List _writers; + private readonly List _writers; public ConsoleStream(params TextWriter[] streams) { @@ -116,15 +116,19 @@ namespace CodeWalker.Utils public override void Write(char ch) { + var checkNull = false; for (int i = 0; i < _writers.Count; i++) { + var writer = _writers[i]; + if (writer is null) + continue; try { - _writers[i].Write(ch); + writer.Write(ch); } catch (ObjectDisposedException) { - _writers.Remove(_writers[i]); + _writers[i] = null; // handle exception here } catch (IOException) @@ -132,13 +136,18 @@ namespace CodeWalker.Utils // handle exception here } } + + if (checkNull) + { + _writers.RemoveAll(p => p is null); + } } public override void Write(string value) { foreach (var writer in _writers) { - writer.Write(value); + writer?.Write(value); } } @@ -150,16 +159,20 @@ namespace CodeWalker.Utils public override void WriteLine(string value) { + var checkNull = false; for (int i = 0; i < _writers.Count; i++) { + var writer = _writers[i]; + if (writer is null) + continue; try { - _writers[i].WriteLine(value); - _writers[i].Flush(); + writer.WriteLine(value); + writer.Flush(); } catch (ObjectDisposedException) { - _writers.Remove(_writers[i]); + _writers[i] = null; // handle exception here } catch (IOException) @@ -167,20 +180,29 @@ namespace CodeWalker.Utils // handle exception here } } + if (checkNull) + { + _writers.RemoveAll(p => p is null); + } } public override void WriteLine(object value) { + var checkNull = false; for (int i = 0; i < _writers.Count; i++) { + var writer = _writers[i]; + if (writer is null) + continue; try { - _writers[i].WriteLine(value); - _writers[i].Flush(); + writer.WriteLine(value); + writer.Flush(); } catch (ObjectDisposedException) { - _writers.Remove(_writers[i]); + checkNull = true; + _writers[i] = null; // handle exception here } catch (IOException) @@ -188,6 +210,11 @@ namespace CodeWalker.Utils // handle exception here } } + + if (checkNull) + { + _writers.RemoveAll(p => p is null); + } } public override void Close() @@ -195,7 +222,7 @@ namespace CodeWalker.Utils base.Close(); foreach(var writer in _writers) { - writer.Close(); + writer?.Close(); } _writers.Clear(); } diff --git a/CodeWalker/Utils/GTAFolder.cs b/CodeWalker/Utils/GTAFolder.cs index c01d881..cba44b2 100644 --- a/CodeWalker/Utils/GTAFolder.cs +++ b/CodeWalker/Utils/GTAFolder.cs @@ -107,13 +107,14 @@ namespace CodeWalker CurrentGTAFolder = folder; Settings.Default.GTAFolder = folder; Settings.Default.Save(); + Settings.Default.Reload(); return true; } return false; } - public static string GetCurrentGTAFolderWithTrailingSlash() =>CurrentGTAFolder.EndsWith(@"\") ? CurrentGTAFolder : CurrentGTAFolder + @"\"; + public static string GetCurrentGTAFolderWithTrailingSlash() =>CurrentGTAFolder.EndsWith('\\') ? CurrentGTAFolder : CurrentGTAFolder + '\\'; public static bool AutoDetectFolder(out Dictionary matches) { diff --git a/CodeWalker/Utils/MapUtils.cs b/CodeWalker/Utils/MapUtils.cs index 5570f12..334afda 100644 --- a/CodeWalker/Utils/MapUtils.cs +++ b/CodeWalker/Utils/MapUtils.cs @@ -146,17 +146,38 @@ namespace CodeWalker public struct MapSphere { - public Vector3 CamRelPos { get; set; } - public float Radius { get; set; } + public MapSphere() + { } + + public MapSphere(Vector3 camRelPos, float radius) + { + CamRelPos = camRelPos; + Radius = radius; + } + + public Vector3 CamRelPos; + public float Radius; } public struct MapBox { - public Vector3 CamRelPos { get; set; } - public Vector3 BBMin { get; set; } - public Vector3 BBMax { get; set; } - public Quaternion Orientation { get; set; } - public Vector3 Scale { get; set; } + public MapBox() + { } + + public MapBox(Vector3 camRelPos, Vector3 bbMin, Vector3 bbMax, Quaternion orientation, Vector3 scale) + { + CamRelPos = camRelPos; + BBMin = bbMin; + BBMax = bbMax; + Orientation = orientation; + Scale = scale; + } + + public Vector3 CamRelPos; + public Vector3 BBMin; + public Vector3 BBMax; + public Quaternion Orientation; + public Vector3 Scale; } diff --git a/CodeWalker/Utils/NamedPipe.cs b/CodeWalker/Utils/NamedPipe.cs index dd91370..5155b2e 100644 --- a/CodeWalker/Utils/NamedPipe.cs +++ b/CodeWalker/Utils/NamedPipe.cs @@ -5,6 +5,7 @@ using System.IO; using System.IO.Pipes; using System.Linq; using System.Text; +using System.Threading.Tasks; using System.Windows.Forms; namespace CodeWalker.Core.Utils @@ -18,12 +19,13 @@ namespace CodeWalker.Core.Utils this.form = form; } - public async void Init() + public void Init() { try { using var client = new NamedPipeClientStream("codewalker"); - client.Connect(100); + client.Connect(0); + client.Dispose(); return; } catch (Exception ex) @@ -41,61 +43,91 @@ namespace CodeWalker.Core.Utils public async void StartServer() { - var server = new NamedPipeServerStream("codewalker", PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances); - - var buffer = new byte[1024]; - - while (true) + try { - try + await Task.Run(async () => { - await server.WaitForConnectionAsync(); - var read = await server.ReadAsync(buffer.AsMemory()); - if (read > 0) + var server = new NamedPipeServerStream("codewalker", PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances); + + var buffer = new byte[1024]; + + while (true) { - var message = Encoding.UTF8.GetString(buffer, 0, read); - - Console.WriteLine(message); - - var args = message.Split(' '); - if (args[0] == "explorer") + try { - form.BeginInvoke(() => + await Task.Delay(50); + await server.WaitForConnectionAsync(); + var read = await server.ReadAsync(buffer.AsMemory()); + if (read > 0) { - var f = new ExploreForm(); - f.Load += (sender, args) => + var message = Encoding.UTF8.GetString(buffer, 0, read); + + Console.WriteLine(message); + + var args = message.Split(' '); + + switch (args[0]) { - f.WindowState = FormWindowState.Normal; - f.Activate(); - }; + case "explorer": + form.BeginInvoke(() => + { + var f = new ExploreForm(); + f.Load += (sender, args) => + { + f.WindowState = FormWindowState.Normal; + f.Activate(); + }; - f.Show(); - }); - } else if (args[0] == "open-file") - { - try - { - var form = OpenAnyFile.OpenFilePath(string.Join(" ", args.AsSpan(1).ToArray())); - form.Show(); - form.Activate(); - } - catch(NotImplementedException ex) - { - Console.WriteLine(ex); - MessageBox.Show("Dit type bestand is op het moment nog niet ondersteund!", ex.ToString()); + f.Show(); + }); + break; + case "peds-mode": + form.BeginInvoke(() => + { + var f = new PedsForm(); + f.Load += (sender, args) => + { + f.WindowState = FormWindowState.Normal; + f.Activate(); + }; + + f.Show(); + }); + break; + case "open-file": + try + { + var form = OpenAnyFile.OpenFilePath(string.Join(" ", args.AsSpan(1).ToArray())); + form.Show(); + form.Activate(); + } + catch (NotImplementedException ex) + { + Console.WriteLine(ex); + MessageBox.Show("This file type is not yet supported!", ex.ToString()); + } + break; + } } + + server.Disconnect(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + if (ex is not IOException) + { + throw; + } + server.Disconnect(); } - } - } - catch (Exception ex) - { - if (ex is not IOException) - { - throw; - } - server.Disconnect(); - } + } + }); + } + catch(Exception ex) + { + Console.WriteLine(ex); } } @@ -109,7 +141,7 @@ namespace CodeWalker.Core.Utils try { using var client = new NamedPipeClientStream("codewalker"); - client.Connect(100); + client.Connect(0); var _buffer = Encoding.UTF8.GetBytes(message); diff --git a/CodeWalker/Utils/OpenAnyFile.cs b/CodeWalker/Utils/OpenAnyFile.cs index 870b03c..73612d1 100644 --- a/CodeWalker/Utils/OpenAnyFile.cs +++ b/CodeWalker/Utils/OpenAnyFile.cs @@ -47,10 +47,10 @@ namespace CodeWalker.Utils else if (extension == ".ymf" || extension == ".ymap" || extension == ".ytyp" || extension == ".ymt") { GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key); - var fileCache = GameFileCacheFactory.GetInstance(); + var fileCache = GameFileCacheFactory.Instance; if (!fileCache.IsInited) { - fileCache.Init(); + fileCache.InitAsync().GetAwaiter().GetResult(); } var metaForm = new MetaForm(); diff --git a/CodeWalker/Utils/Synthesizer.cs b/CodeWalker/Utils/Synthesizer.cs index a170745..f143ceb 100644 --- a/CodeWalker/Utils/Synthesizer.cs +++ b/CodeWalker/Utils/Synthesizer.cs @@ -1,5 +1,5 @@ using CodeWalker.GameFiles; - +using CommunityToolkit.Diagnostics; using SharpDX; using SharpDX.Multimedia; using SharpDX.XAudio2; @@ -724,7 +724,7 @@ namespace CodeWalker.Utils case Dat10Synth.Opcode.READ_VARIABLE: if ((param[1].Value & 0xFF) < Synth.Variables.Length) { - SetRegister(param[0], Synth.Variables[param[1].Value & 0xFF]?.Value ?? 0); + SetRegister(param[0], Synth.Variables[param[1].Value & 0xFF].Value); } break; case Dat10Synth.Opcode.STOP: @@ -1612,7 +1612,9 @@ namespace CodeWalker.Utils releaseType = EnvelopeReleaseType.Exponential; break; - default: throw new ArgumentOutOfRangeException("Not an ENVELOPE_GEN_* opcode"); + default: + ThrowHelper.ThrowArgumentOutOfRangeException("Not an ENVELOPE_GEN_* opcode"); + return default; } EnvelopeTriggerMode triggerMode; @@ -1631,7 +1633,9 @@ namespace CodeWalker.Utils triggerMode = EnvelopeTriggerMode.Interruptible; break; - default: throw new ArgumentOutOfRangeException("Not an ENVELOPE_GEN_* opcode"); + default: + ThrowHelper.ThrowArgumentOutOfRangeException("Not an ENVELOPE_GEN_* opcode"); + return default; } return EnvelopeGen(releaseType, triggerMode, buffer, ref stateBlock, predelay, attack, decay, sustain, hold, release, trigger); @@ -1859,7 +1863,9 @@ namespace CodeWalker.Utils triggerMode = EnvelopeTriggerMode.Interruptible; break; - default: throw new ArgumentOutOfRangeException("Not an TIMED_TRIGGER_* opcode"); + default: + ThrowHelper.ThrowArgumentOutOfRangeException("Not an TIMED_TRIGGER_* opcode"); + return default; } return TimedTrigger(triggerMode, ref stateBlock, trigger, predelay, attack, decay, hold, release); diff --git a/CodeWalker/VehicleForm.cs b/CodeWalker/VehicleForm.cs index 095dae1..f86988b 100644 --- a/CodeWalker/VehicleForm.cs +++ b/CodeWalker/VehicleForm.cs @@ -22,10 +22,9 @@ namespace CodeWalker { public partial class VehicleForm : Form, DXForm { - public Form Form { get { return this; } } //for DXForm/DXManager use + public Form Form => this; //for DXForm/DXManager use public Renderer Renderer { get; set; } - public object RenderSyncRoot { get { return Renderer.RenderSyncRoot; } } volatile bool formopen = false; volatile bool running = false; @@ -33,6 +32,7 @@ namespace CodeWalker public bool Pauserendering { get; set; } = false; public CancellationTokenSource CancellationTokenSource { get; } = new CancellationTokenSource(); + private CancellationToken CancellationToken; //volatile bool initialised = false; @@ -53,7 +53,7 @@ namespace CodeWalker System.Drawing.Point MouseLastPoint; - public GameFileCache GameFileCache { get; } = GameFileCacheFactory.GetInstance(); + public GameFileCache GameFileCache => GameFileCacheFactory.Instance; InputManager Input = new InputManager(); @@ -88,6 +88,7 @@ namespace CodeWalker public VehicleForm() { + CancellationToken = CancellationTokenSource.Token; InitializeComponent(); Renderer = new Renderer(this, GameFileCache); @@ -137,7 +138,7 @@ namespace CodeWalker camera.TargetRotation.X = 0.5f * (float)Math.PI; camera.CurrentRotation.X = 0.5f * (float)Math.PI; - Renderer.shaders.deferred = false; //no point using this here yet + Renderer.Shaders.deferred = false; //no point using this here yet LoadSettings(); @@ -149,7 +150,7 @@ namespace CodeWalker frametimer.Start(); } - public void CleanupScene() + public async ValueTask CleanupScene() { formopen = false; @@ -158,7 +159,7 @@ namespace CodeWalker int count = 0; while (running && (count < 5000)) //wait for the content thread to exit gracefully { - Thread.Sleep(1); + await Task.Delay(1); count++; } } @@ -176,7 +177,7 @@ namespace CodeWalker GameFileCache.BeginFrame(); - if (!Monitor.TryEnter(Renderer.RenderSyncRoot, 50)) + if (!await Renderer.RenderSyncRoot.WaitAsync(50)) { return; } //couldn't get a lock, try again next time @@ -228,7 +229,7 @@ namespace CodeWalker } finally { - Monitor.Exit(Renderer.RenderSyncRoot); + Renderer.RenderSyncRoot.Release(); } //UpdateMarkerSelectionPanelInvoke(); } @@ -286,7 +287,7 @@ namespace CodeWalker } - private void ContentThread() + private async ValueTask ContentThread() { //main content loading thread. running = true; @@ -311,7 +312,7 @@ namespace CodeWalker GameFileCache.LoadArchetypes = false;//to speed things up a little GameFileCache.BuildExtendedJenkIndex = false;//to speed things up a little GameFileCache.DoFullStringIndex = true;//to get all global text from DLC... - GameFileCache.Init(UpdateStatus, LogError); + await GameFileCache.InitAsync(UpdateStatus, LogError); //UpdateDlcListComboBox(gameFileCache.DlcNameList); @@ -331,29 +332,39 @@ namespace CodeWalker //UpdateStatus("Ready"); - Task.Run(async () => { - while (formopen && !IsDisposed) //renderer content loop + _ = Task.Run(async () => { + try { - bool rcItemsPending = Renderer.ContentThreadProc(); - - if (!rcItemsPending) + while (formopen && !IsDisposed && !CancellationToken.IsCancellationRequested) //renderer content loop { - await Task.Delay(ActiveForm == null ? 50 : 1).ConfigureAwait(false); + bool rcItemsPending = Renderer.ContentThreadProc(); + + if (!rcItemsPending) + { + await Task.Delay(ActiveForm == null ? 50 : 2, CancellationToken).ConfigureAwait(false); + } } } + catch(TaskCanceledException) + { } }); - Task.Run(async () => + _ = Task.Run(async () => { - while (formopen && !IsDisposed) //main asset loop + try { - bool fcItemsPending = GameFileCache.ContentThreadProc(); - - if (!fcItemsPending) + while (formopen && !IsDisposed) //main asset loop { - await Task.Delay(ActiveForm == null ? 50 : 1).ConfigureAwait(false); + bool fcItemsPending = GameFileCache.ContentThreadProc(); + + if (!fcItemsPending) + { + await Task.Delay(ActiveForm == null ? 50 : 2, CancellationToken).ConfigureAwait(false); + } } } + catch (TaskCanceledException) { } + running = false; }); @@ -412,14 +423,16 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateStatus(text); })); + BeginInvoke(UpdateStatus, text); } else { StatusLabel.Text = text; } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void LogError(string text) { @@ -427,17 +440,20 @@ namespace CodeWalker { if (InvokeRequired) { - Invoke(new Action(() => { LogError(text); })); + Invoke(LogError, text); } else { //TODO: error logging.. + Console.WriteLine(text); ConsoleTextBox.AppendText(text + "\r\n"); //StatusLabel.Text = text; //MessageBox.Show(text); } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } @@ -487,7 +503,8 @@ namespace CodeWalker } private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null) { - if (models == null) return; + if (models is null) + return; for (int mi = 0; mi < models.Length; mi++) { @@ -507,7 +524,8 @@ namespace CodeWalker Renderer.SelectionModelDrawFlags[model] = false; } - if (model.Geometries == null) continue; + if (model.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { @@ -528,12 +546,10 @@ namespace CodeWalker { var hash = pl.Hashes[ip]; var parm = pl.Parameters[ip]; - var tex = parm.Data as TextureBase; - if (tex != null) + if (parm.Data is TextureBase tex) { - var t = tex as Texture; var tstr = tex.Name.Trim(); - if (t != null) + if (tex is Texture t) { tstr = string.Format("{0} ({1}x{2}, embedded)", tex.Name, t.Width, t.Height); } @@ -552,49 +568,36 @@ namespace CodeWalker } private void UpdateSelectionDrawFlags(TreeNode node) { - //update the selection draw flags depending on tag and checked/unchecked - var drwbl = node.Tag as DrawableBase; - var model = node.Tag as DrawableModel; - var geom = node.Tag as DrawableGeometry; bool rem = node.Checked; - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { - if (drwbl != null) + if (node.Tag is DrawableBase drwbl) { if (rem) { - if (DrawableDrawFlags.ContainsKey(drwbl)) - { - DrawableDrawFlags.Remove(drwbl); - } + DrawableDrawFlags.Remove(drwbl); } else { DrawableDrawFlags[drwbl] = false; } } - if (model != null) + if (node.Tag is DrawableModel model) { if (rem) { - if (Renderer.SelectionModelDrawFlags.ContainsKey(model)) - { - Renderer.SelectionModelDrawFlags.Remove(model); - } + Renderer.SelectionModelDrawFlags.Remove(model); } else { Renderer.SelectionModelDrawFlags[model] = false; } } - if (geom != null) + if (node.Tag is DrawableGeometry geom) { if (rem) { - if (Renderer.SelectionGeometryDrawFlags.ContainsKey(geom)) - { - Renderer.SelectionGeometryDrawFlags.Remove(geom); - } + Renderer.SelectionGeometryDrawFlags.Remove(geom); } else { @@ -610,7 +613,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateGlobalVehiclesUI(); })); + BeginInvoke(UpdateGlobalVehiclesUI); } else { @@ -655,8 +658,7 @@ namespace CodeWalker //AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false); - var fdrawable = drawable as FragDrawable; - if (fdrawable != null) + if (drawable is FragDrawable fdrawable) { var plod1 = fdrawable.OwnerFragment?.PhysicsLODGroup?.PhysicsLOD1; if ((plod1 != null) && (plod1.Children?.data_items != null)) @@ -1205,17 +1207,22 @@ namespace CodeWalker private void HDRRenderingCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + if (Renderer.Shaders is null) + return; + + using (Renderer.RenderSyncRoot.WaitDisposable()) { - Renderer.shaders.hdr = HDRRenderingCheckBox.Checked; + Renderer.Shaders.hdr = HDRRenderingCheckBox.Checked; } } private void ShadowsCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + if (Renderer.Shaders is null) + return; + using (Renderer.RenderSyncRoot.WaitDisposable()) { - Renderer.shaders.shadows = ShadowsCheckBox.Checked; + Renderer.Shaders.shadows = ShadowsCheckBox.Checked; } } @@ -1235,7 +1242,8 @@ namespace CodeWalker int v = TimeOfDayTrackBar.Value; float fh = v / 60.0f; UpdateTimeOfDayLabel(); - lock (Renderer.RenderSyncRoot) + + using (Renderer.RenderSyncRoot.WaitDisposable()) { Renderer.timeofday = fh; timecycle.SetTime(Renderer.timeofday); @@ -1250,12 +1258,16 @@ namespace CodeWalker private void WireframeCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.wireframe = WireframeCheckBox.Checked; + if (Renderer.Shaders is null) + return; + Renderer.Shaders.wireframe = WireframeCheckBox.Checked; } private void AnisotropicFilteringCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.AnisotropicFiltering = AnisotropicFilteringCheckBox.Checked; + if (Renderer.Shaders is null) + return; + Renderer.Shaders.AnisotropicFiltering = AnisotropicFilteringCheckBox.Checked; } private void HDTexturesCheckBox_CheckedChanged(object sender, EventArgs e) @@ -1265,75 +1277,75 @@ namespace CodeWalker private void RenderModeComboBox_SelectedIndexChanged(object sender, EventArgs e) { + if (Renderer.Shaders is null) + return; TextureSamplerComboBox.Enabled = false; TextureCoordsComboBox.Enabled = false; switch (RenderModeComboBox.Text) { default: case "Default": - Renderer.shaders.RenderMode = WorldRenderMode.Default; + Renderer.Shaders.RenderMode = WorldRenderMode.Default; break; case "Single texture": - Renderer.shaders.RenderMode = WorldRenderMode.SingleTexture; + Renderer.Shaders.RenderMode = WorldRenderMode.SingleTexture; TextureSamplerComboBox.Enabled = true; TextureCoordsComboBox.Enabled = true; break; case "Vertex normals": - Renderer.shaders.RenderMode = WorldRenderMode.VertexNormals; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexNormals; break; case "Vertex tangents": - Renderer.shaders.RenderMode = WorldRenderMode.VertexTangents; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexTangents; break; case "Vertex colour 1": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 1; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 1; break; case "Vertex colour 2": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 2; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 2; break; case "Vertex colour 3": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 3; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 3; break; case "Texture coord 1": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 1; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 1; break; case "Texture coord 2": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 2; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 2; break; case "Texture coord 3": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 3; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 3; break; } } private void TextureSamplerComboBox_SelectedIndexChanged(object sender, EventArgs e) { - if (TextureSamplerComboBox.SelectedItem is ShaderParamNames) + if (Renderer.Shaders is null) + return; + if (TextureSamplerComboBox.SelectedItem is ShaderParamNames names) { - Renderer.shaders.RenderTextureSampler = (ShaderParamNames)TextureSamplerComboBox.SelectedItem; + Renderer.Shaders.RenderTextureSampler = names; } } private void TextureCoordsComboBox_SelectedIndexChanged(object sender, EventArgs e) { - switch (TextureCoordsComboBox.Text) + if (Renderer.Shaders is null) + return; + + Renderer.Shaders.RenderTextureSamplerCoord = TextureCoordsComboBox.Text switch { - default: - case "Texture coord 1": - Renderer.shaders.RenderTextureSamplerCoord = 1; - break; - case "Texture coord 2": - Renderer.shaders.RenderTextureSamplerCoord = 2; - break; - case "Texture coord 3": - Renderer.shaders.RenderTextureSamplerCoord = 3; - break; - } + "Texture coord 2" => 2, + "Texture coord 3" => 3, + _ => 1, + }; } private void GridCheckBox_CheckedChanged(object sender, EventArgs e) diff --git a/CodeWalker/World/CutsceneForm.cs b/CodeWalker/World/CutsceneForm.cs index 7bd25c0..d28ed25 100644 --- a/CodeWalker/World/CutsceneForm.cs +++ b/CodeWalker/World/CutsceneForm.cs @@ -1,6 +1,7 @@ using CodeWalker.GameFiles; using CodeWalker.Rendering; using CodeWalker.Utils; +using Collections.Pooled; using SharpDX; using System; using System.Collections.Generic; @@ -116,8 +117,7 @@ namespace CodeWalker.World AudioDatabase.Init(GameFileCache); } - var entry = dditem?.RpfEntry as RpfFileEntry; - if (entry != null) + if (dditem?.RpfEntry is RpfFileEntry entry) { cutFile = new CutFile(entry); @@ -139,10 +139,12 @@ namespace CodeWalker.World { try { - Invoke(new Action(() => { CutsceneLoaded(cs); })); + Invoke(CutsceneLoaded, cs); + } + catch(Exception ex) + { + Console.WriteLine(ex); } - catch - { } return; } @@ -290,7 +292,8 @@ namespace CodeWalker.World private void CutsceneForm_Load(object sender, EventArgs e) { - if (!GameFileCache.IsInited) return;//what to do here? + if (!GameFileCache.IsInited) + return;//what to do here? var rpfman = GameFileCache.RpfMan; var rpflist = rpfman.AllRpfs; //loadedOnly ? gfc.ActiveMapRpfFiles.Values.ToList() : @@ -498,7 +501,7 @@ namespace CodeWalker.World public int NextCameraCut { get; set; } = 0; public int NextConcatData { get; set; } = 0; - public Gxt2File Gxt2File { get; set; } = null; + public Gxt2File? Gxt2File { get; set; } = null; public Vector3 Position { get; set; } public Quaternion Rotation { get; set; } @@ -544,13 +547,13 @@ namespace CodeWalker.World private void LoadYcds() { int cutListCount = (CameraCutList?.Length ?? 0) + 1; - var shortName = CutFile.FileEntry?.ShortName ?? ""; + var shortName = CutFile.FileEntry.ShortName; Ycds = new YcdFile[cutListCount]; - if (!string.IsNullOrEmpty(shortName)) + if (!shortName.IsEmpty) { for (int i = 0; i < cutListCount; i++) { - var ycdname = shortName + "-" + i.ToString(); + var ycdname = shortName.ToString() + "-" + i.ToString(); var ycdhash = JenkHash.GenHashLower(ycdname); var ycd = GameFileCache.GetYcd(ycdhash); while ((ycd != null) && (!ycd.Loaded)) @@ -609,33 +612,40 @@ namespace CodeWalker.World void updateObjectTransform(CutsceneObject obj, ClipMapEntry cme, ushort boneTag, byte posTrack, byte rotTrack) { - if (cme != null) + if (cme is null) + return; + + if (cme.Clip is ClipAnimation canim) { - if (cme.Clip is ClipAnimation canim) + if (canim.Animation is not null) { - if (canim.Animation != null) - { - var t = canim.GetPlaybackTime(cutOffset); - var f = canim.Animation.GetFramePosition(t); - var p = canim.Animation.FindBoneIndex(boneTag, posTrack); - var r = canim.Animation.FindBoneIndex(boneTag, rotTrack); - if (p >= 0) obj.Position = canim.Animation.EvaluateVector4(f, p, true).XYZ(); - if (r >= 0) obj.Rotation = canim.Animation.EvaluateQuaternion(f, r, true); - } + var playbackTime = canim.GetPlaybackTime(cutOffset); + var framePosition = canim.Animation.GetFramePosition(playbackTime); + var p = canim.Animation.FindBoneIndex(boneTag, posTrack); + var r = canim.Animation.FindBoneIndex(boneTag, rotTrack); + if (p >= 0) + obj.Position = canim.Animation.EvaluateVector4(in framePosition, p, true).XYZ(); + if (r >= 0) + obj.Rotation = canim.Animation.EvaluateQuaternion(in framePosition, r, true); } - else if (cme.Clip is ClipAnimationList alist) + } + else if (cme.Clip is ClipAnimationList alist) + { + if (alist.Animations?.Data is not null) { - if (alist.Animations?.Data != null) + foreach (var anim in alist.Animations.Data) { - foreach (var anim in alist.Animations.Data) - { - var t = anim.GetPlaybackTime(cutOffset); - var f = anim.Animation.GetFramePosition(t); - var p = anim.Animation.FindBoneIndex(boneTag, posTrack); - var r = anim.Animation.FindBoneIndex(boneTag, rotTrack); - if (p >= 0) obj.Position = anim.Animation.EvaluateVector4(f, p, true).XYZ(); - if (r >= 0) obj.Rotation = anim.Animation.EvaluateQuaternion(f, r, true); - } + if (anim.Animation is null) + continue; + + var t = anim.GetPlaybackTime(cutOffset); + var f = anim.Animation.GetFramePosition(t); + var p = anim.Animation.FindBoneIndex(boneTag, posTrack); + var r = anim.Animation.FindBoneIndex(boneTag, rotTrack); + if (p >= 0) + obj.Position = anim.Animation.EvaluateVector4(in f, p, true).XYZ(); + if (r >= 0) + obj.Rotation = anim.Animation.EvaluateQuaternion(in f, r, true); } } } @@ -647,7 +657,7 @@ namespace CodeWalker.World var ycd = (cutIndex < (Ycds?.Length ?? 0)) ? Ycds[cutIndex] : null; if (ycd?.CutsceneMap != null) { - ClipMapEntry cme = null; + ClipMapEntry? cme = null; if (CameraObject != null) { @@ -672,15 +682,16 @@ namespace CodeWalker.World { foreach (var obj in SceneObjects.Values) { - if (obj.Enabled == false) continue; + if (obj.Enabled == false) + continue; var pos = Position; var rot = Rotation; - var animate = (obj.Ped != null) || (obj.Prop != null) || (obj.Vehicle != null) || (obj.Weapon != null); + var animate = obj.Ped is not null || obj.Prop is not null || obj.Vehicle is not null || obj.Weapon is not null; if (animate) { ycd.CutsceneMap.TryGetValue(obj.AnimHash, out cme); - if (cme != null) + if (cme is not null) { cme.OverridePlayTime = true; cme.PlayTime = cutOffset; @@ -690,25 +701,25 @@ namespace CodeWalker.World } obj.AnimClip = cme; } - if (obj.Ped != null) + if (obj.Ped is not null) { obj.Ped.Position = pos; obj.Ped.Rotation = rot; obj.Ped.UpdateEntity(); obj.Ped.AnimClip = cme; } - if (obj.Prop != null) + if (obj.Prop is not null) { obj.Prop.Position = pos; obj.Prop.Orientation = rot; } - if (obj.Vehicle != null) + if (obj.Vehicle is not null) { obj.Vehicle.Position = pos; obj.Vehicle.Rotation = rot; obj.Vehicle.UpdateEntity(); } - if (obj.Weapon != null) + if (obj.Weapon is not null) { obj.Weapon.Position = pos; obj.Weapon.Rotation = rot; @@ -875,8 +886,7 @@ namespace CodeWalker.World private void LoadScene(CutEvent e) { - var args = e.EventArgs as CutLoadSceneEventArgs; - if (args == null) + if (e.EventArgs is not CutLoadSceneEventArgs args) { return; } @@ -886,23 +896,19 @@ namespace CodeWalker.World } private void LoadAnimation(CutEvent e) { - var args = e.EventArgs as CutNameEventArgs; - if (args == null) + if (e.EventArgs is not CutNameEventArgs args) { return; } } private void LoadAudio(CutEvent e) { - var args = e.EventArgs as CutNameEventArgs; - if (args == null) + if (e.EventArgs is not CutNameEventArgs args) { return; } - var obje = e as CutObjectIdEvent; - if (obje == null) + if (e is not CutObjectIdEvent obje) { return; } - var obj = obje.Object as CutAudioObject; - if (obj == null) + if (obje.Object is not CutAudioObject obj) { return; } if (Seeking) return; @@ -931,8 +937,7 @@ namespace CodeWalker.World } private void LoadModels(CutEvent e) { - var args = e.EventArgs as CutObjectIdListEventArgs; - if (args == null) + if (e.EventArgs is not CutObjectIdListEventArgs args) { return; } if (args.iObjectIdList == null) return; @@ -952,15 +957,13 @@ namespace CodeWalker.World } private void LoadParticles(CutEvent e) { - var args = e.EventArgs as CutObjectIdListEventArgs; - if (args == null) + if (e.EventArgs is not CutObjectIdListEventArgs args) { return; } } private void LoadOverlays(CutEvent e) { - var args = e.EventArgs as CutObjectIdListEventArgs; - if (args == null) + if (e.EventArgs is not CutObjectIdListEventArgs args) { return; } } @@ -971,8 +974,7 @@ namespace CodeWalker.World if (Gxt2File != null) { } - var args = e.EventArgs as CutFinalNameEventArgs; - if (args == null) + if (e.EventArgs is not CutFinalNameEventArgs args) { return; } var namel = args.cName?.ToLowerInvariant(); @@ -983,13 +985,12 @@ namespace CodeWalker.World if (gxt2entry != null) //probably should do this load async { - Gxt2File = GameFileCache.RpfMan.GetFile(gxt2entry); + Gxt2File = RpfManager.GetFile(gxt2entry); - if (Gxt2File != null) + if (Gxt2File is not null) { - for (int i = 0; i < Gxt2File.TextEntries.Length; i++) + foreach(var te in Gxt2File.TextEntries) { - var te = Gxt2File.TextEntries[i]; GlobalText.Ensure(te.Text, te.Hash); } } @@ -998,8 +999,7 @@ namespace CodeWalker.World } private void UnloadModels(CutEvent e) { - var args = e.EventArgs as CutObjectIdListEventArgs; - if (args == null) + if (e.EventArgs is not CutObjectIdListEventArgs args) { return; } if (args.iObjectIdList == null) return; @@ -1008,7 +1008,7 @@ namespace CodeWalker.World { CutsceneObject obj = null; SceneObjects.TryGetValue(objid, out obj); - if (obj != null) + if (obj is not null) { obj.Enabled = false; } @@ -1019,8 +1019,7 @@ namespace CodeWalker.World } private void EnableHideObject(CutEvent e) { - var oe = e as CutObjectIdEvent; - if (oe == null) return; + if (e is not CutObjectIdEvent oe) return; CutsceneObject cso = null; SceneObjects.TryGetValue(oe.iObjectId, out cso); @@ -1034,8 +1033,7 @@ namespace CodeWalker.World } private void EnableBlockBounds(CutEvent e) { - var oe = e as CutObjectIdEvent; - if (oe == null) return; + if (e is not CutObjectIdEvent oe) return; } private void EnableScreenFade(CutEvent e) @@ -1043,8 +1041,7 @@ namespace CodeWalker.World } private void EnableAnimation(CutEvent e) { - var oe = e as CutObjectIdEvent; - if (oe == null) return; + if (e is not CutObjectIdEvent oe) return; } private void EnableParticleEffect(CutEvent e) @@ -1055,15 +1052,13 @@ namespace CodeWalker.World } private void EnableAudio(CutEvent e) { - var args = e.EventArgs as CutNameEventArgs; - if (args == null) + if (e.EventArgs is not CutNameEventArgs args) { return; } } private void EnableCamera(CutEvent e) { - var oe = e as CutObjectIdEvent; - if (oe == null) return; + if (e is not CutObjectIdEvent oe) return; } private void EnableLight(CutEvent e) @@ -1071,8 +1066,7 @@ namespace CodeWalker.World } private void DisableHideObject(CutEvent e) { - var oe = e as CutObjectIdEvent; - if (oe == null) return; + if (e is not CutObjectIdEvent oe) return; CutsceneObject cso = null; SceneObjects.TryGetValue(oe.iObjectId, out cso); @@ -1083,8 +1077,7 @@ namespace CodeWalker.World } private void DisableBlockBounds(CutEvent e) { - var oe = e as CutObjectIdEvent; - if (oe == null) return; + if (e is not CutObjectIdEvent oe) return; } private void DisableScreenFade(CutEvent e) @@ -1092,8 +1085,7 @@ namespace CodeWalker.World } private void DisableAnimation(CutEvent e) { - var oe = e as CutObjectIdEvent; - if (oe == null) return; + if (e is not CutObjectIdEvent oe) return; } private void DisableParticleEffect(CutEvent e) @@ -1104,15 +1096,13 @@ namespace CodeWalker.World } private void DisableAudio(CutEvent e) { - var args = e.EventArgs as CutNameEventArgs; - if (args == null) + if (e.EventArgs is not CutNameEventArgs args) { return; } } private void DisableCamera(CutEvent e) { - var oe = e as CutObjectIdEvent; - if (oe == null) return; + if (e is not CutObjectIdEvent oe) return; } private void DisableLight(CutEvent e) @@ -1120,8 +1110,7 @@ namespace CodeWalker.World } private void Subtitle(CutEvent e) { - var args = e.EventArgs as CutSubtitleEventArgs; - if (args == null) + if (e.EventArgs is not CutSubtitleEventArgs args) { return; } if (!EnableSubtitles) return; @@ -1143,12 +1132,10 @@ namespace CodeWalker.World } private void PedVariation(CutEvent e) { - var args = e.EventArgs as CutObjectVariationEventArgs; - if (args == null) + if (e.EventArgs is not CutObjectVariationEventArgs args) { return; } - var oe = e as CutObjectIdEvent; - if (oe == null) + if (e is not CutObjectIdEvent oe) { return; } if (Seeking) return; //this gets a bit messy when seeking backwards @@ -1172,12 +1159,10 @@ namespace CodeWalker.World } private void CameraCut(CutEvent e) { - var args = e.EventArgs as CutCameraCutEventArgs; - if (args == null) + if (e.EventArgs is not CutCameraCutEventArgs args) { return; } - var oe = e as CutObjectIdEvent; - if (oe == null) + if (e is not CutObjectIdEvent oe) { return; } @@ -1404,8 +1389,8 @@ namespace CodeWalker.World //how to know the correct name/hash to use? //sound name in the format: cutscenes_name_mastered_only var name = aud.cName.ToCleanString().ToLowerInvariant().Replace(".wav", ""); - var soundname = "cutscenes_" + name + "_mastered"; - var soundname2 = "cutscenes_" + name + "_mastered_only"; + var soundname = $"cutscenes_{name}n_mastered"; + var soundname2 = $"cutscenes_{name}_mastered_only"; uint soundhash = JenkHash.GenHash(soundname); uint soundhash2 = JenkHash.GenHash(soundname2); @@ -1428,8 +1413,8 @@ namespace CodeWalker.World MetaHash awchash = 0; AwcFile awc = null; - var streaminfs = new List(); - var streamlist = new List(); + using var streaminfs = new PooledList(); + using var streamlist = new PooledList(); foreach (var chan in strsnd.ChildSounds) { @@ -1475,7 +1460,7 @@ namespace CodeWalker.World var streaminf = streaminfs[i]; var left = 1.0f; var right = 1.0f; - switch (streaminf.Header?.Pan ?? 0) + switch (streaminf.Header.Pan) { case 0://center/default left = 1.0f; diff --git a/CodeWalker/World/MapSelection.cs b/CodeWalker/World/MapSelection.cs index d80f2a1..4aa93e7 100644 --- a/CodeWalker/World/MapSelection.cs +++ b/CodeWalker/World/MapSelection.cs @@ -45,42 +45,42 @@ namespace CodeWalker [TypeConverter(typeof(ExpandableObjectConverter))] public struct MapSelection { - public WorldForm WorldForm { get; set; } - public YmapEntityDef EntityDef { get; set; } - public Archetype Archetype { get; set; } - public DrawableBase Drawable { get; set; } - public DrawableGeometry Geometry { get; set; } - public MetaWrapper EntityExtension { get; set; } - public MetaWrapper ArchetypeExtension { get; set; } - public YmapTimeCycleModifier TimeCycleModifier { get; set; } - public YmapCarGen CarGenerator { get; set; } - public YmapGrassInstanceBatch GrassBatch { get; set; } - public YmapLODLight LodLight { get; set; } - public YmapBoxOccluder BoxOccluder { get; set; } - public YmapOccludeModelTriangle OccludeModelTri { get; set; } - public YmapEntityDef MloEntityDef { get; set; } - public MCMloRoomDef MloRoomDef { get; set; } - public WaterQuad WaterQuad { get; set; } - public WaterCalmingQuad CalmingQuad { get; set; } - public WaterWaveQuad WaveQuad { get; set; } - public Bounds CollisionBounds { get; set; } - public BoundPolygon CollisionPoly { get; set; } - public BoundVertex CollisionVertex { get; set; } - public YnvPoly NavPoly { get; set; } - public YnvPoint NavPoint { get; set; } - public YnvPortal NavPortal { get; set; } - public YndNode PathNode { get; set; } - public YndLink PathLink { get; set; } - public TrainTrackNode TrainTrackNode { get; set; } - public ScenarioNode ScenarioNode { get; set; } - public MCScenarioChainingEdge ScenarioEdge { get; set; } - public AudioPlacement Audio { get; set; } + public WorldForm? WorldForm { get; set; } + public YmapEntityDef? EntityDef { get; set; } + public Archetype? Archetype { get; set; } + public DrawableBase? Drawable { get; set; } + public DrawableGeometry? Geometry { get; set; } + public MetaWrapper? EntityExtension { get; set; } + public MetaWrapper? ArchetypeExtension { get; set; } + public YmapTimeCycleModifier? TimeCycleModifier { get; set; } + public YmapCarGen? CarGenerator { get; set; } + public YmapGrassInstanceBatch? GrassBatch { get; set; } + public YmapLODLight? LodLight { get; set; } + public YmapBoxOccluder? BoxOccluder { get; set; } + public YmapOccludeModelTriangle? OccludeModelTri { get; set; } + public YmapEntityDef? MloEntityDef { get; set; } + public MCMloRoomDef? MloRoomDef { get; set; } + public WaterQuad? WaterQuad { get; set; } + public WaterCalmingQuad? CalmingQuad { get; set; } + public WaterWaveQuad? WaveQuad { get; set; } + public Bounds? CollisionBounds { get; set; } + public BoundPolygon? CollisionPoly { get; set; } + public BoundVertex? CollisionVertex { get; set; } + public YnvPoly? NavPoly { get; set; } + public YnvPoint? NavPoint { get; set; } + public YnvPortal? NavPortal { get; set; } + public YndNode? PathNode { get; set; } + public YndLink? PathLink { get; set; } + public TrainTrackNode? TrainTrackNode { get; set; } + public ScenarioNode? ScenarioNode { get; set; } + public MCScenarioChainingEdge? ScenarioEdge { get; set; } + public AudioPlacement? Audio { get; set; } - public MapSelection[] MultipleSelectionItems { get; private set; } + public MapSelection[]? MultipleSelectionItems { get; private set; } public Vector3 MultipleSelectionCenter { get; set; } public Quaternion MultipleSelectionRotation { get; set; } public Vector3 MultipleSelectionScale { get; set; } - public BoundVertex[] GatheredCollisionVerts { get; private set; } //for collision polys, need to move all the individual vertices instead + public BoundVertex[]? GatheredCollisionVerts { get; private set; } //for collision polys, need to move all the individual vertices instead public Vector3 BBOffset { get; set; } public Quaternion BBOrientation { get; set; } @@ -91,47 +91,43 @@ namespace CodeWalker public float HitDist { get; set; } - public bool HasValue + public readonly bool HasValue { get { - return (EntityDef != null) || - (Archetype != null) || - (Drawable != null) || - (Geometry != null) || - (EntityExtension != null) || - (ArchetypeExtension != null) || - (TimeCycleModifier != null) || - (CarGenerator != null) || - (GrassBatch != null) || - (WaterQuad != null) || - (CalmingQuad != null) || - (WaveQuad != null) || - (CollisionBounds != null) || - (CollisionPoly != null) || - (CollisionVertex != null) || - (NavPoly != null) || - (NavPoint != null) || - (NavPortal != null) || - (PathNode != null) || - (TrainTrackNode != null) || - (LodLight != null) || - (BoxOccluder != null) || - (OccludeModelTri != null) || - (MloEntityDef != null) || - (ScenarioNode != null) || - (Audio != null) || - (MloRoomDef != null); + return (EntityDef is not null) || + (Archetype is not null) || + (Drawable is not null) || + (Geometry is not null) || + (EntityExtension is not null) || + (ArchetypeExtension is not null) || + (TimeCycleModifier is not null) || + (CarGenerator is not null) || + (GrassBatch is not null) || + (WaterQuad is not null) || + (CalmingQuad is not null) || + (WaveQuad is not null) || + (CollisionBounds is not null) || + (CollisionPoly is not null) || + (CollisionVertex is not null) || + (NavPoly is not null) || + (NavPoint is not null) || + (NavPortal is not null) || + (PathNode is not null) || + (TrainTrackNode is not null) || + (LodLight is not null) || + (BoxOccluder is not null) || + (OccludeModelTri is not null) || + (MloEntityDef is not null) || + (ScenarioNode is not null) || + (Audio is not null) || + (MloRoomDef is not null); } } - public bool HasHit - { - get { return (HitDist != float.MaxValue); } - } + public readonly bool HasHit => HitDist != float.MaxValue; - - public bool CheckForChanges(MapSelection mhit) + public readonly bool CheckForChanges(in MapSelection mhit) { return (EntityDef != mhit.EntityDef) || (Archetype != mhit.Archetype) @@ -160,35 +156,35 @@ namespace CodeWalker || (Audio != mhit.Audio) || (MloRoomDef != mhit.MloRoomDef); } - public bool CheckForChanges() + public readonly bool CheckForChanges() { - return (EntityDef != null) - || (Archetype != null) - || (Drawable != null) - || (TimeCycleModifier != null) - || (ArchetypeExtension != null) - || (EntityExtension != null) - || (CarGenerator != null) - || (MloEntityDef != null) - || (LodLight != null) - || (GrassBatch != null) - || (BoxOccluder != null) - || (OccludeModelTri != null) - || (WaterQuad != null) - || (CalmingQuad != null) - || (WaveQuad != null) - || (CollisionBounds != null) - || (CollisionPoly != null) - || (CollisionVertex != null) - || (NavPoly != null) - || (NavPoint != null) - || (NavPortal != null) - || (PathNode != null) - || (PathLink != null) - || (TrainTrackNode != null) - || (ScenarioNode != null) - || (Audio != null) - || (MloRoomDef != null); + return (EntityDef is not null) + || (Archetype is not null) + || (Drawable is not null) + || (TimeCycleModifier is not null) + || (ArchetypeExtension is not null) + || (EntityExtension is not null) + || (CarGenerator is not null) + || (MloEntityDef is not null) + || (LodLight is not null) + || (GrassBatch is not null) + || (BoxOccluder is not null) + || (OccludeModelTri is not null) + || (WaterQuad is not null) + || (CalmingQuad is not null) + || (WaveQuad is not null) + || (CollisionBounds is not null) + || (CollisionPoly is not null) + || (CollisionVertex is not null) + || (NavPoly is not null) + || (NavPoint is not null) + || (NavPortal is not null) + || (PathNode is not null) + || (PathLink is not null) + || (TrainTrackNode is not null) + || (ScenarioNode is not null) + || (Audio is not null) + || (MloRoomDef is not null); } @@ -233,148 +229,148 @@ namespace CodeWalker HitDist = float.MaxValue; } - public string GetNameString(string defval) + public readonly string GetNameString(string defval) { string name = defval; - var ename = (EntityDef != null) ? EntityDef._CEntityDef.archetypeName.ToString() : string.Empty; - var enamec = ename + ((!string.IsNullOrEmpty(ename)) ? ": " : ""); - if (MultipleSelectionItems != null) + var ename = (EntityDef is not null) ? EntityDef._CEntityDef.archetypeName.ToString() : string.Empty; + var enamec = ename + ((!string.IsNullOrEmpty(ename)) ? ": " : string.Empty); + if (MultipleSelectionItems is not null) { name = "Multiple items"; } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { - name = enamec + "Vertex " + CollisionVertex.Index.ToString() + ((CollisionBounds != null) ? (": " + CollisionBounds.GetName()) : string.Empty); + name = $"{enamec}Vertex {CollisionVertex.Index}{((CollisionBounds is not null) ? ($": {CollisionBounds.GetName()}") : string.Empty)}"; } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { - name = enamec + "Poly " + CollisionPoly.Index.ToString() + ((CollisionBounds != null) ? (": " + CollisionBounds.GetName()) : string.Empty); + name = $"{enamec}Poly {CollisionPoly.Index}{((CollisionBounds != null) ? ($": {CollisionBounds.GetName()}") : string.Empty)}"; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { - name = enamec + CollisionBounds.GetName(); + name = $"{enamec}{CollisionBounds.GetName()}"; } - else if (EntityDef != null) + else if (EntityDef is not null) { name = ename; } - else if (Archetype != null) + else if (Archetype is not null) { name = Archetype.Hash.ToString(); } - else if (TimeCycleModifier != null) + else if (TimeCycleModifier is not null) { name = TimeCycleModifier.CTimeCycleModifier.name.ToString(); } - else if (CarGenerator != null) + else if (CarGenerator is not null) { - name = (CarGenerator.Ymap?.Name ?? "") + ": " + CarGenerator.NameString(); + name = $"{(CarGenerator.Ymap?.Name ?? string.Empty)}: {CarGenerator.NameString()}"; } - else if (GrassBatch != null) + else if (GrassBatch is not null) { - name = (GrassBatch.Ymap?.Name ?? "") + ": " + GrassBatch.Archetype?.Name ?? ""; + name = $"{(GrassBatch.Ymap?.Name ?? string.Empty)}: {GrassBatch.Archetype?.Name ?? string.Empty}"; } - else if (LodLight != null) + else if (LodLight is not null) { - name = (LodLight.Ymap?.Name ?? "") + ": " + LodLight.Index.ToString(); + name = $"{(LodLight.Ymap?.Name ?? string.Empty)}: {LodLight.Index}"; } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { - name = "BoxOccluder " + (BoxOccluder.Ymap?.Name ?? "") + ": " + BoxOccluder.Index.ToString(); + name = "BoxOccluder " + (BoxOccluder.Ymap?.Name ?? string.Empty) + ": " + BoxOccluder.Index.ToString(); } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { - name = "OccludeModel " + (OccludeModelTri.Ymap?.Name ?? "") + ": " + (OccludeModelTri.Model?.Index??0).ToString() + ":" + OccludeModelTri.Index.ToString(); + name = $"OccludeModel {OccludeModelTri.Ymap?.Name ?? string.Empty}: {OccludeModelTri.Model?.Index ?? 0}:{OccludeModelTri.Index}"; } - else if (WaterQuad != null) + else if (WaterQuad is not null) { - name = "WaterQuad " + WaterQuad.ToString(); + name = $"WaterQuad {WaterQuad}"; } - else if (CalmingQuad != null) + else if (CalmingQuad is not null) { - name = "WaterCalmingQuad " + CalmingQuad.ToString(); + name = $"WaterCalmingQuad {CalmingQuad}"; } - else if (WaveQuad != null) + else if (WaveQuad is not null) { - name = "WaterWaveQuad " + WaveQuad.ToString(); + name = $"WaterWaveQuad {WaveQuad}"; } - else if (NavPoly != null) + else if (NavPoly is not null) { - name = "NavPoly " + NavPoly.ToString(); + name = $"NavPoly {NavPoly}"; } - else if (NavPoint != null) + else if (NavPoint is not null) { - name = "NavPoint " + NavPoint.ToString(); + name = $"NavPoint {NavPoint}"; } - else if (NavPortal != null) + else if (NavPortal is not null) { - name = "NavPortal " + NavPortal.ToString(); + name = $"NavPortal {NavPortal}"; } - else if (PathNode != null) + else if (PathNode is not null) { - name = "PathNode " + PathNode.AreaID.ToString() + "." + PathNode.NodeID.ToString(); //+ FloatUtil.GetVector3String(PathNode.Position); + name = $"PathNode {PathNode.AreaID}.{PathNode.NodeID}"; //+ FloatUtil.GetVector3String(PathNode.Position); } - else if (TrainTrackNode != null) + else if (TrainTrackNode is not null) { - name = "TrainTrackNode " + FloatUtil.GetVector3String(TrainTrackNode.Position); + name = $"TrainTrackNode {FloatUtil.GetVector3String(TrainTrackNode.Position)}"; } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { name = ScenarioNode.ToString(); } - else if (Audio != null) + else if (Audio is not null) { - name = Audio.ShortTypeName + " " + Audio.GetNameString();// FloatUtil.GetVector3String(Audio.InnerPos); + name = $"{Audio.ShortTypeName} {Audio.GetNameString()}";// FloatUtil.GetVector3String(Audio.InnerPos); } - if (MloRoomDef != null) + if (MloRoomDef is not null) { - name = "MloRoomDef " + MloRoomDef.RoomName; + name = $"MloRoomDef {MloRoomDef.RoomName}"; } - if (EntityExtension != null) + if (EntityExtension is not null) { - name += ": " + EntityExtension.Name; + name += $": {EntityExtension.Name}"; } - if (ArchetypeExtension != null) + if (ArchetypeExtension is not null) { - name += ": " + ArchetypeExtension.Name; + name += $": {ArchetypeExtension.Name}"; } return name; } - public string GetFullNameString(string defval) + public readonly string GetFullNameString(string defval) { string name = GetNameString(defval); - if (Geometry != null) + if (Geometry is not null) { - name += " (" + GeometryIndex.ToString() + ")"; + name += $" ({GeometryIndex})"; } return name; } - public bool CanMarkUndo() + public readonly bool CanMarkUndo() { - if (MultipleSelectionItems != null) return true; - if (EntityDef != null) return true; - if (CarGenerator != null) return true; - if (LodLight != null) return true; - if (BoxOccluder != null) return true; - if (OccludeModelTri != null) return true; - if (CollisionBounds != null) return true; - if (CollisionPoly != null) return true; - if (CollisionVertex != null) return true; - if (PathNode != null) return true; + if (MultipleSelectionItems is not null) return true; + if (EntityDef is not null) return true; + if (CarGenerator is not null) return true; + if (LodLight is not null) return true; + if (BoxOccluder is not null) return true; + if (OccludeModelTri is not null) return true; + if (CollisionBounds is not null) return true; + if (CollisionPoly is not null) return true; + if (CollisionVertex is not null) return true; + if (PathNode is not null) return true; //if (NavPoly != null) return true; - if (NavPoint != null) return true; - if (NavPortal != null) return true; - if (TrainTrackNode != null) return true; - if (ScenarioNode != null) return true; - if (Audio != null) return true; + if (NavPoint is not null) return true; + if (NavPortal is not null) return true; + if (TrainTrackNode is not null) return true; + if (ScenarioNode is not null) return true; + if (Audio is not null) return true; return false; } - public UndoStep CreateUndoStep(WidgetMode mode, Vector3 startPos, Quaternion startRot, Vector3 startScale, WorldForm wf, bool editPivot) + public readonly UndoStep? CreateUndoStep(WidgetMode mode, Vector3 startPos, Quaternion startRot, Vector3 startScale, WorldForm wf, bool editPivot) { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { switch (mode) { @@ -383,14 +379,14 @@ namespace CodeWalker case WidgetMode.Scale: return new MultiScaleUndoStep(this, startScale, wf); } } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { switch (mode) { case WidgetMode.Position: return new CollisionVertexPositionUndoStep(CollisionVertex, EntityDef, startPos, wf); } } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { switch (mode) { @@ -399,7 +395,7 @@ namespace CodeWalker case WidgetMode.Scale: return new CollisionPolyScaleUndoStep(CollisionPoly, startScale, wf); } } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { switch (mode) { @@ -408,7 +404,7 @@ namespace CodeWalker case WidgetMode.Scale: return new CollisionScaleUndoStep(CollisionBounds, startScale, wf); } } - else if (EntityDef != null) + else if (EntityDef is not null) { if (editPivot) { @@ -428,7 +424,7 @@ namespace CodeWalker } } } - else if (CarGenerator != null) + else if (CarGenerator is not null) { switch (mode) { @@ -437,7 +433,7 @@ namespace CodeWalker case WidgetMode.Scale: return new CarGenScaleUndoStep(CarGenerator, startScale); } } - else if (LodLight != null) + else if (LodLight is not null) { switch (mode) { @@ -446,7 +442,7 @@ namespace CodeWalker case WidgetMode.Scale: return new LodLightScaleUndoStep(LodLight, startScale); } } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { switch (mode) { @@ -455,7 +451,7 @@ namespace CodeWalker case WidgetMode.Scale: return new BoxOccluderScaleUndoStep(BoxOccluder, startScale); } } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { switch (mode) { @@ -464,18 +460,18 @@ namespace CodeWalker case WidgetMode.Scale: return new OccludeModelTriScaleUndoStep(OccludeModelTri, startScale); } } - else if (PathNode != null) + else if (PathNode is not null) { switch (mode) { case WidgetMode.Position: return new PathNodePositionUndoStep(PathNode, startPos, wf); } } - else if (NavPoly != null) + else if (NavPoly is not null) { //todo... } - else if (NavPoint != null) + else if (NavPoint is not null) { switch (mode) { @@ -483,7 +479,7 @@ namespace CodeWalker case WidgetMode.Rotation: return new NavPointRotationUndoStep(NavPoint, startRot, wf); } } - else if (NavPortal != null) + else if (NavPortal is not null) { switch (mode) { @@ -491,14 +487,14 @@ namespace CodeWalker case WidgetMode.Rotation: return new NavPortalRotationUndoStep(NavPortal, startRot, wf); } } - else if (TrainTrackNode != null) + else if (TrainTrackNode is not null) { switch (mode) { case WidgetMode.Position: return new TrainTrackNodePositionUndoStep(TrainTrackNode, startPos, wf); } } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { switch (mode) { @@ -506,7 +502,7 @@ namespace CodeWalker case WidgetMode.Rotation: return new ScenarioNodeRotationUndoStep(ScenarioNode, startRot, wf); } } - else if (Audio != null) + else if (Audio is not null) { switch (mode) { @@ -517,394 +513,395 @@ namespace CodeWalker return null; } - public bool CanShowWidget + public readonly bool CanShowWidget { get { bool res = false; - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { res = true; } - else if (EntityDef != null) + else if (EntityDef is not null) { res = true; } - else if (CarGenerator != null) + else if (CarGenerator is not null) { res = true; } - else if (LodLight != null) + else if (LodLight is not null) { res = true; } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { res = true; } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { res = true; } - else if (NavPoly != null) + else if (NavPoly is not null) { res = true; } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { res = true; } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { res = true; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { res = true; } - else if (NavPoint != null) + else if (NavPoint is not null) { res = true; } - else if (NavPortal != null) + else if (NavPortal is not null) { res = true; } - else if (PathNode != null) + else if (PathNode is not null) { res = true; } - else if (TrainTrackNode != null) + else if (TrainTrackNode is not null) { res = true; } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { res = true; } - else if (Audio != null) + else if (Audio is not null) { res = true; } return res; } } - public Vector3 WidgetPosition + public readonly Vector3 WidgetPosition { get { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { return MultipleSelectionCenter; } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { - if (EntityDef != null) return EntityDef.Position + EntityDef.Orientation.Multiply(CollisionVertex.Position); + if (EntityDef is not null) + return EntityDef.Position + EntityDef.Orientation.Multiply(CollisionVertex.Position); return CollisionVertex.Position; } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { - if (EntityDef != null) return EntityDef.Position + EntityDef.Orientation.Multiply(CollisionPoly.Position); + if (EntityDef is not null) return EntityDef.Position + EntityDef.Orientation.Multiply(CollisionPoly.Position); return CollisionPoly.Position; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { - if (EntityDef != null) return EntityDef.Position + EntityDef.Orientation.Multiply(CollisionBounds.Position); + if (EntityDef is not null) return EntityDef.Position + EntityDef.Orientation.Multiply(CollisionBounds.Position); return CollisionBounds.Position; } - else if (EntityDef != null) + else if (EntityDef is not null) { return EntityDef.WidgetPosition; } - else if (CarGenerator != null) + else if (CarGenerator is not null) { return CarGenerator.Position; } - else if (LodLight != null) + else if (LodLight is not null) { return LodLight.Position; } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { return BoxOccluder.Position; } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { return OccludeModelTri.Center; } - else if (NavPoly != null) + else if (NavPoly is not null) { return NavPoly.Position; } - else if (NavPoint != null) + else if (NavPoint is not null) { return NavPoint.Position; } - else if (NavPortal != null) + else if (NavPortal is not null) { return NavPortal.Position; } - else if (PathNode != null) + else if (PathNode is not null) { return PathNode.Position; } - else if (TrainTrackNode != null) + else if (TrainTrackNode is not null) { return TrainTrackNode.Position; } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { return ScenarioNode.Position; } - else if (Audio != null) + else if (Audio is not null) { return Audio.InnerPos; } return Vector3.Zero; } } - public Quaternion WidgetRotation + public readonly Quaternion WidgetRotation { get { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { return MultipleSelectionRotation; } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { - if (EntityDef != null) return EntityDef.Orientation; + if (EntityDef is not null) return EntityDef.Orientation; return Quaternion.Identity; } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { - if (EntityDef != null) return CollisionPoly.Orientation * EntityDef.Orientation; + if (EntityDef is not null) return CollisionPoly.Orientation * EntityDef.Orientation; return CollisionPoly.Orientation; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { - if (EntityDef != null) return CollisionBounds.Orientation * EntityDef.Orientation; + if (EntityDef is not null) return CollisionBounds.Orientation * EntityDef.Orientation; return CollisionBounds.Orientation; } - else if (EntityDef != null) + else if (EntityDef is not null) { return EntityDef.WidgetOrientation; } - else if (CarGenerator != null) + else if (CarGenerator is not null) { return CarGenerator.Orientation; } - else if (LodLight != null) + else if (LodLight is not null) { return LodLight.Orientation; } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { return BoxOccluder.Orientation; } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { return OccludeModelTri.Orientation; } - else if (NavPoly != null) + else if (NavPoly is not null) { return Quaternion.Identity; } - else if (NavPoint != null) + else if (NavPoint is not null) { return NavPoint.Orientation; } - else if (NavPortal != null) + else if (NavPortal is not null) { return NavPortal.Orientation; } - else if (PathNode != null) + else if (PathNode is not null) { return Quaternion.Identity; } - else if (TrainTrackNode != null) + else if (TrainTrackNode is not null) { return Quaternion.Identity; } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { return ScenarioNode.Orientation; } - else if (Audio != null) + else if (Audio is not null) { return Audio.Orientation; } return Quaternion.Identity; } } - public WidgetAxis WidgetRotationAxes + public readonly WidgetAxis WidgetRotationAxes { get { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { return WidgetAxis.XYZ; } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { return WidgetAxis.None; } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { return WidgetAxis.XYZ; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { return WidgetAxis.XYZ; } - else if (EntityDef != null) + else if (EntityDef is not null) { return WidgetAxis.XYZ; } - else if (CarGenerator != null) + else if (CarGenerator is not null) { return WidgetAxis.Z; } - else if (LodLight != null) + else if (LodLight is not null) { return WidgetAxis.XYZ; } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { return WidgetAxis.Z; } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { return WidgetAxis.XYZ; } - else if (NavPoly != null) + else if (NavPoly is not null) { return WidgetAxis.XYZ; } - else if (NavPoint != null) + else if (NavPoint is not null) { return WidgetAxis.Z; } - else if (NavPortal != null) + else if (NavPortal is not null) { return WidgetAxis.Z; } - else if (PathNode != null) + else if (PathNode is not null) { return WidgetAxis.None; } - else if (TrainTrackNode != null) + else if (TrainTrackNode is not null) { return WidgetAxis.None; } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { return WidgetAxis.Z; } - else if (Audio != null) + else if (Audio is not null) { return WidgetAxis.Z; } return WidgetAxis.None; } } - public Vector3 WidgetScale + public readonly Vector3 WidgetScale { get { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { return MultipleSelectionScale; } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { return Vector3.One; } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { return CollisionPoly.Scale; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { return CollisionBounds.Scale; } - else if (EntityDef != null) + else if (EntityDef is not null) { return EntityDef.Scale; } - else if (CarGenerator != null) + else if (CarGenerator is not null) { return new Vector3(CarGenerator.CCarGen.perpendicularLength); } - else if (LodLight != null) + else if (LodLight is not null) { return LodLight.Scale; } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { return BoxOccluder.Size; } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { return OccludeModelTri.Scale; } - else if (NavPoly != null) + else if (NavPoly is not null) { return Vector3.One; } - else if (NavPoint != null) + else if (NavPoint is not null) { return Vector3.One; } - else if (NavPortal != null) + else if (NavPortal is not null) { return Vector3.One; } - else if (PathNode != null) + else if (PathNode is not null) { return Vector3.One; } - else if (TrainTrackNode != null) + else if (TrainTrackNode is not null) { return Vector3.One; } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { return Vector3.One; } - else if (Audio != null) + else if (Audio is not null) { return Vector3.One; } return Vector3.One; } } - public bool WidgetScaleLockXY + public readonly bool WidgetScaleLockXY { get { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { for (int i = 0; i < MultipleSelectionItems.Length; i++) { - if ((MultipleSelectionItems[i].EntityDef != null) && (MultipleSelectionItems[i].CollisionBounds == null)) return true; + if ((MultipleSelectionItems[i].EntityDef is not null) && (MultipleSelectionItems[i].CollisionBounds is null)) return true; } return false; } - if (BoxOccluder != null) + if (BoxOccluder is not null) { return false; } - if (OccludeModelTri != null) + if (OccludeModelTri is not null) { return false; } - if (CollisionBounds != null) + if (CollisionBounds is not null) { return false; } - if (CollisionPoly != null) + if (CollisionPoly is not null) { return false; } @@ -912,46 +909,49 @@ namespace CodeWalker } } - public bool CanCopyPaste + public readonly bool CanCopyPaste { get { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { for (int i = 0; i < MultipleSelectionItems.Length; i++) { - if (MultipleSelectionItems[i].CanCopyPaste) return true; + if (MultipleSelectionItems[i].CanCopyPaste) + return true; } return false; } - else if (CollisionVertex != null) return false;//can't copy just a vertex.. - else if (CollisionPoly != null) return true; - else if (CollisionBounds != null) return true; - else if (EntityDef != null) return true; - else if (CarGenerator != null) return true; - else if (LodLight != null) return true; - else if (BoxOccluder != null) return true; - else if (OccludeModelTri != null) return true; - else if (PathNode != null) return true; - else if (NavPoly != null) return true; - else if (NavPoint != null) return true; - else if (NavPortal != null) return true; - else if (TrainTrackNode != null) return true; - else if (ScenarioNode != null) return true; - else if (Audio?.AudioZone != null) return true; - else if (Audio?.AudioEmitter != null) return true; + else if (CollisionVertex is not null) return false;//can't copy just a vertex.. + else if (CollisionPoly is not null) return true; + else if (CollisionBounds is not null) return true; + else if (EntityDef is not null) return true; + else if (CarGenerator is not null) return true; + else if (LodLight is not null) return true; + else if (BoxOccluder is not null) return true; + else if (OccludeModelTri is not null) return true; + else if (PathNode is not null) return true; + else if (NavPoly is not null) return true; + else if (NavPoint is not null) return true; + else if (NavPortal is not null) return true; + else if (TrainTrackNode is not null) return true; + else if (ScenarioNode is not null) return true; + else if (Audio?.AudioZone is not null) return true; + else if (Audio?.AudioEmitter is not null) return true; return false; } } - public void SetMultipleSelectionItems(MapSelection[] items) + public void SetMultipleSelectionItems(MapSelection[]? items) { - if ((items != null) && (items.Length == 0)) items = null; + if (items is not null && items.Length == 0) + items = null; + MultipleSelectionItems = items; GatheredCollisionVerts = null; var center = Vector3.Zero; - if (items != null) + if (items is not null) { Dictionary collVerts = null; for (int i = 0; i < items.Length; i++) @@ -959,18 +959,18 @@ namespace CodeWalker center += items[i].WidgetPosition; var collVert = items[i].CollisionVertex; var collPoly = items[i].CollisionPoly; - if (collVert != null) + if (collVert is not null) { if (collVerts == null) collVerts = new Dictionary(); collVerts[collVert] = collVert.Index; } - else if (collPoly != null) + else if (collPoly is not null) { if (collVerts == null) collVerts = new Dictionary(); collPoly.GatherVertices(collVerts); } } - if (collVerts != null) + if (collVerts is not null) { GatheredCollisionVerts = collVerts.Keys.ToArray(); } @@ -985,7 +985,7 @@ namespace CodeWalker public void SetPosition(Vector3 newpos, bool editPivot) { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { if (editPivot) { @@ -1006,8 +1006,8 @@ namespace CodeWalker } ent = MultipleSelectionItems[i].EntityDef ?? ent; } - if (ent != null) dpos = Quaternion.Invert(ent.Orientation).Multiply(dpos); - if (GatheredCollisionVerts != null) + if (ent is not null) dpos = Quaternion.Invert(ent.Orientation).Multiply(dpos); + if (GatheredCollisionVerts is not null) { for (int i = 0; i < GatheredCollisionVerts.Length; i++) { @@ -1019,22 +1019,22 @@ namespace CodeWalker MultipleSelectionCenter = newpos; } } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { - if (EntityDef != null) newpos = Quaternion.Invert(EntityDef.Orientation).Multiply(newpos - EntityDef.Position); + if (EntityDef is not null) newpos = Quaternion.Invert(EntityDef.Orientation).Multiply(newpos - EntityDef.Position); CollisionVertex.Position = newpos; } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { - if (EntityDef != null) newpos = Quaternion.Invert(EntityDef.Orientation).Multiply(newpos - EntityDef.Position); + if (EntityDef is not null) newpos = Quaternion.Invert(EntityDef.Orientation).Multiply(newpos - EntityDef.Position); CollisionPoly.Position = newpos; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { - if (EntityDef != null) newpos = Quaternion.Invert(EntityDef.Orientation).Multiply(newpos - EntityDef.Position); + if (EntityDef is not null) newpos = Quaternion.Invert(EntityDef.Orientation).Multiply(newpos - EntityDef.Position); CollisionBounds.Position = newpos; } - else if (EntityDef != null) + else if (EntityDef is not null) { if (editPivot) { @@ -1045,23 +1045,23 @@ namespace CodeWalker EntityDef.SetPositionFromWidget(newpos); } } - else if (CarGenerator != null) + else if (CarGenerator is not null) { CarGenerator.SetPosition(newpos); } - else if (LodLight != null) + else if (LodLight is not null) { LodLight.SetPosition(newpos); } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { BoxOccluder.Position = newpos; } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { OccludeModelTri.Center = newpos; } - else if (PathNode != null) + else if (PathNode is not null) { PathNode.SetYndNodePosition(WorldForm.Space, newpos, out var affectedFiles); foreach (var affectedFile in affectedFiles) @@ -1069,27 +1069,27 @@ namespace CodeWalker WorldForm.UpdatePathYndGraphics(affectedFile, false); } } - else if (NavPoly != null) + else if (NavPoly is not null) { NavPoly.SetPosition(newpos); } - else if (NavPoint != null) + else if (NavPoint is not null) { NavPoint.SetPosition(newpos); } - else if (NavPortal != null) + else if (NavPortal is not null) { NavPortal.SetPosition(newpos); } - else if (TrainTrackNode != null) + else if (TrainTrackNode is not null) { TrainTrackNode.SetPosition(newpos); } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { ScenarioNode.SetPosition(newpos); } - else if (Audio != null) + else if (Audio is not null) { Audio.SetPosition(newpos); } @@ -1097,7 +1097,7 @@ namespace CodeWalker } public void SetRotation(Quaternion newrot, bool editPivot) { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { if (editPivot) { @@ -1107,7 +1107,7 @@ namespace CodeWalker var cen = MultipleSelectionCenter; var orinv = Quaternion.Invert(MultipleSelectionRotation); var trans = newrot * orinv; - YmapEntityDef ent = null;//hack to use an entity for multple selections... buggy if entities mismatch!!! + YmapEntityDef? ent = null;//hack to use an entity for multple selections... buggy if entities mismatch!!! for (int i = 0; i < MultipleSelectionItems.Length; i++) { var collVert = MultipleSelectionItems[i].CollisionVertex; @@ -1124,15 +1124,15 @@ namespace CodeWalker } ent = MultipleSelectionItems[i].EntityDef ?? ent; } - var eorinv = (ent != null) ? Quaternion.Invert(ent.Orientation) : Quaternion.Identity; - if (GatheredCollisionVerts != null) + var eorinv = (ent is not null) ? Quaternion.Invert(ent.Orientation) : Quaternion.Identity; + if (GatheredCollisionVerts is not null) { for (int i = 0; i < GatheredCollisionVerts.Length; i++) { var refpos = GatheredCollisionVerts[i].Position; var relpos = refpos - cen; var newpos = trans.Multiply(relpos) + cen; - if (ent != null) + if (ent is not null) { refpos = ent.Position + ent.Orientation.Multiply(refpos); relpos = refpos - cen; @@ -1144,21 +1144,21 @@ namespace CodeWalker MultipleSelectionRotation = newrot; } } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { //do nothing, but stop any poly from being rotated also } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { - if (EntityDef != null) newrot = Quaternion.Normalize(Quaternion.Invert(EntityDef.Orientation) * newrot); + if (EntityDef is not null) newrot = Quaternion.Normalize(Quaternion.Invert(EntityDef.Orientation) * newrot); CollisionPoly.Orientation = newrot; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { - if (EntityDef != null) newrot = Quaternion.Normalize(Quaternion.Invert(EntityDef.Orientation) * newrot); + if (EntityDef is not null) newrot = Quaternion.Normalize(Quaternion.Invert(EntityDef.Orientation) * newrot); CollisionBounds.Orientation = newrot; } - else if (EntityDef != null) + else if (EntityDef is not null) { if (editPivot) { @@ -1169,42 +1169,42 @@ namespace CodeWalker EntityDef.SetOrientationFromWidget(newrot); } } - else if (CarGenerator != null) + else if (CarGenerator is not null) { CarGenerator.SetOrientation(newrot); } - else if (LodLight != null) + else if (LodLight is not null) { LodLight.SetOrientation(newrot); } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { BoxOccluder.Orientation = newrot; } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { OccludeModelTri.Orientation = newrot; } - else if (ScenarioNode != null) + else if (ScenarioNode is not null) { ScenarioNode.SetOrientation(newrot); } - else if (NavPoint != null) + else if (NavPoint is not null) { NavPoint.SetOrientation(newrot); } - else if (NavPortal != null) + else if (NavPortal is not null) { NavPortal.SetOrientation(newrot); } - else if (Audio != null) + else if (Audio is not null) { Audio.SetOrientation(newrot); } } public void SetScale(Vector3 newscale, bool editPivot) { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { if (editPivot) {//editing pivot scale is sort of meaningless.. @@ -1215,7 +1215,7 @@ namespace CodeWalker var ori = MultipleSelectionRotation; var orinv = Quaternion.Invert(ori); var rsca = newscale / MultipleSelectionScale; - YmapEntityDef ent = null;//hack to use an entity for multple selections... buggy if entities mismatch!!! + YmapEntityDef? ent = null;//hack to use an entity for multple selections... buggy if entities mismatch!!! for (int i = 0; i < MultipleSelectionItems.Length; i++) { var collVert = MultipleSelectionItems[i].CollisionVertex; @@ -1231,14 +1231,14 @@ namespace CodeWalker ent = MultipleSelectionItems[i].EntityDef ?? ent; } var eorinv = (ent != null) ? Quaternion.Invert(ent.Orientation) : Quaternion.Identity; - if (GatheredCollisionVerts != null) + if (GatheredCollisionVerts is not null) { for (int i = 0; i < GatheredCollisionVerts.Length; i++) { var refpos = GatheredCollisionVerts[i].Position; var relpos = refpos - cen; var newpos = ori.Multiply(orinv.Multiply(relpos) * rsca) + cen; - if (ent != null) + if (ent is not null) { refpos = ent.Position + ent.Orientation.Multiply(refpos); relpos = refpos - cen; @@ -1251,36 +1251,36 @@ namespace CodeWalker MultipleSelectionScale = newscale; } } - else if (CollisionVertex != null) + else if (CollisionVertex is not null) { //do nothing, but stop any poly from being scaled also } - else if (CollisionPoly != null) + else if (CollisionPoly is not null) { CollisionPoly.Scale = newscale; } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { CollisionBounds.Scale = newscale; } - else if (EntityDef != null) + else if (EntityDef is not null) { EntityDef.SetScale(newscale); } - else if (CarGenerator != null) + else if (CarGenerator is not null) { CarGenerator.SetScale(newscale); AABB = new BoundingBox(CarGenerator.BBMin, CarGenerator.BBMax); } - else if (LodLight != null) + else if (LodLight is not null) { LodLight.SetScale(newscale); } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { BoxOccluder.SetSize(newscale); } - else if (OccludeModelTri != null) + else if (OccludeModelTri is not null) { OccludeModelTri.Scale = newscale; } @@ -1320,9 +1320,9 @@ namespace CodeWalker - public void UpdateGraphics(WorldForm wf) + public readonly void UpdateGraphics(WorldForm wf) { - if (MultipleSelectionItems != null) + if (MultipleSelectionItems is not null) { var pathYnds = new Dictionary(); var navYnvs = new Dictionary(); @@ -1335,51 +1335,51 @@ namespace CodeWalker foreach (var item in MultipleSelectionItems) { - if (item.PathNode != null) + if (item.PathNode is not null) { pathYnds[item.PathNode.Ynd] = 1; } - if (item.NavPoly != null) + if (item.NavPoly is not null) { navYnvs[item.NavPoly.Ynv] = 1; } - if (item.NavPoint != null) + if (item.NavPoint is not null) { navYnvs[item.NavPoint.Ynv] = 1; } - if (item.NavPortal != null) + if (item.NavPortal is not null) { navYnvs[item.NavPortal.Ynv] = 1; } - if (item.TrainTrackNode != null) + if (item.TrainTrackNode is not null) { trainTracks[item.TrainTrackNode.Track] = 1; } - if (item.ScenarioNode != null) + if (item.ScenarioNode is not null) { scenarioYmts[item.ScenarioNode.Ymt] = 1; } - if (item.CollisionBounds != null) + if (item.CollisionBounds is not null) { bounds[item.CollisionBounds] = 1; } - if (item.CollisionPoly?.Owner != null) + if (item.CollisionPoly?.Owner is not null) { bounds[item.CollisionPoly.Owner] = 1; } - if (item.CollisionVertex?.Owner != null) + if (item.CollisionVertex?.Owner is not null) { bounds[item.CollisionVertex.Owner] = 1; } - if (item.LodLight?.LodLights != null) + if (item.LodLight?.LodLights is not null) { lodlights[item.LodLight.LodLights] = 1; } - if (item.BoxOccluder != null) + if (item.BoxOccluder is not null) { boxoccls[item.BoxOccluder] = 1; } - if (item.OccludeModelTri?.Model != null) + if (item.OccludeModelTri?.Model is not null) { occlmods[item.OccludeModelTri.Model] = 1; } @@ -1422,51 +1422,51 @@ namespace CodeWalker } else { - if (PathNode != null) + if (PathNode is not null) { wf.UpdatePathYndGraphics(PathNode.Ynd, false); } - if (NavPoly != null) + if (NavPoly is not null) { wf.UpdateNavYnvGraphics(NavPoly.Ynv, true); } - if (NavPoint != null) + if (NavPoint is not null) { wf.UpdateNavYnvGraphics(NavPoint.Ynv, true); } - if (NavPortal != null) + if (NavPortal is not null) { wf.UpdateNavYnvGraphics(NavPortal.Ynv, true); } - if (TrainTrackNode != null) + if (TrainTrackNode is not null) { wf.UpdateTrainTrackGraphics(TrainTrackNode.Track, false); } - if (ScenarioNode != null) + if (ScenarioNode is not null) { wf.UpdateScenarioGraphics(ScenarioNode.Ymt, false); } - if (CollisionVertex?.Owner != null) + if (CollisionVertex?.Owner is not null) { wf.UpdateCollisionBoundsGraphics(CollisionVertex.Owner); } - else if (CollisionPoly?.Owner != null) + else if (CollisionPoly?.Owner is not null) { wf.UpdateCollisionBoundsGraphics(CollisionPoly.Owner); } - else if (CollisionBounds != null) + else if (CollisionBounds is not null) { wf.UpdateCollisionBoundsGraphics(CollisionBounds); } - else if (LodLight != null) + else if (LodLight is not null) { wf.UpdateLodLightGraphics(LodLight); } - else if (BoxOccluder != null) + else if (BoxOccluder is not null) { wf.UpdateBoxOccluderGraphics(BoxOccluder); } - else if (OccludeModelTri?.Model != null) + else if (OccludeModelTri?.Model is not null) { wf.UpdateOccludeModelGraphics(OccludeModelTri?.Model); } @@ -1474,29 +1474,29 @@ namespace CodeWalker } - public object GetProjectObject() + public readonly object GetProjectObject() { - if (MultipleSelectionItems != null) return MultipleSelectionItems; - else if (CollisionVertex != null) return CollisionVertex; - else if (CollisionPoly != null) return CollisionPoly; - else if (CollisionBounds != null) return CollisionBounds; - else if (EntityDef != null) return EntityDef; - else if (CarGenerator != null) return CarGenerator; - else if (LodLight != null) return LodLight; - else if (BoxOccluder != null) return BoxOccluder; - else if (OccludeModelTri != null) return OccludeModelTri; - else if (PathNode != null) return PathNode; - else if (NavPoly != null) return NavPoly; - else if (NavPoint != null) return NavPoint; - else if (NavPortal != null) return NavPortal; - else if (TrainTrackNode != null) return TrainTrackNode; - else if (ScenarioNode != null) return ScenarioNode; - else if (Audio?.AudioZone != null) return Audio; - else if (Audio?.AudioEmitter != null) return Audio; + if (MultipleSelectionItems is not null) return MultipleSelectionItems; + else if (CollisionVertex is not null) return CollisionVertex; + else if (CollisionPoly is not null) return CollisionPoly; + else if (CollisionBounds is not null) return CollisionBounds; + else if (EntityDef is not null) return EntityDef; + else if (CarGenerator is not null) return CarGenerator; + else if (LodLight is not null) return LodLight; + else if (BoxOccluder is not null) return BoxOccluder; + else if (OccludeModelTri is not null) return OccludeModelTri; + else if (PathNode is not null) return PathNode; + else if (NavPoly is not null) return NavPoly; + else if (NavPoint is not null) return NavPoint; + else if (NavPortal is not null) return NavPortal; + else if (TrainTrackNode is not null) return TrainTrackNode; + else if (ScenarioNode is not null) return ScenarioNode; + else if (Audio?.AudioZone is not null) return Audio; + else if (Audio?.AudioEmitter is not null) return Audio; return null; } - public static MapSelection FromProjectObject(WorldForm worldForm, object o, object parent = null) + public static MapSelection FromProjectObject(WorldForm worldForm, object o, object? parent = null) { const float nrad = 0.5f; var ms = new MapSelection(); @@ -1632,10 +1632,7 @@ namespace CodeWalker - public override string ToString() - { - return GetFullNameString("[Empty]"); - } + public override readonly string ToString() => GetFullNameString("[Empty]"); } diff --git a/CodeWalker/World/Widget.cs b/CodeWalker/World/Widget.cs index d52c4f5..c1b8c23 100644 --- a/CodeWalker/World/Widget.cs +++ b/CodeWalker/World/Widget.cs @@ -17,7 +17,7 @@ namespace CodeWalker.World public abstract void Render(DeviceContext context, Camera cam, WidgetShader shader); - protected bool GetAxisRayHit(Vector3 ax1, Vector3 ax2, Vector3 camrel, Ray ray, out Vector3 pos) + protected bool GetAxisRayHit(in Vector3 ax1, in Vector3 ax2, in Vector3 camrel, in Ray ray, out Vector3 pos) { //helper method for double sided ray/plane intersection Vector3 pn = Vector3.Cross(ax1, ax2); diff --git a/CodeWalker/World/WorldInfoForm.cs b/CodeWalker/World/WorldInfoForm.cs index 71c5af6..4c22a60 100644 --- a/CodeWalker/World/WorldInfoForm.cs +++ b/CodeWalker/World/WorldInfoForm.cs @@ -215,7 +215,8 @@ namespace CodeWalker.World } private void AddSelectionDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check) { - if (models == null) return; + if (models is null) + return; for (int mi = 0; mi < models.Length; mi++) { @@ -228,7 +229,8 @@ namespace CodeWalker.World var tmnode = SelDrawableTexturesTreeView.Nodes.Add(mprefix + " " + model.ToString()); tmnode.Tag = model; - if (model.Geometries == null) continue; + if (model.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { @@ -249,14 +251,12 @@ namespace CodeWalker.World { var hash = pl.Hashes[ip]; var parm = pl.Parameters[ip]; - var tex = parm.Data as TextureBase; - if (tex != null) + if (parm.Data is TextureBase tex) { - var t = tex as Texture; var tstr = tex.Name.Trim(); - if (t != null) + if (tex is Texture t) { - tstr = string.Format("{0} ({1}x{2}, embedded)", tex.Name, t.Width, t.Height); + tstr = $"{tex.Name} ({t.Width}x{t.Height}, embedded)"; } var tnode = tgnode.Nodes.Add(hash.ToString().Trim() + ": " + tstr); tnode.Tag = tex; @@ -381,12 +381,9 @@ namespace CodeWalker.World { owner = Selection.Drawable.Owner; } - YdrFile ydr = owner as YdrFile; - YddFile ydd = owner as YddFile; - YftFile yft = owner as YftFile; SelTextureNameTextBox.Text = tex.Name; - SelTextureDictionaryTextBox.Text = (ytd != null) ? ytd.Name : (ydr != null) ? ydr.Name : (ydd != null) ? ydd.Name : (yft != null) ? yft.Name : string.Empty; + SelTextureDictionaryTextBox.Text = (ytd != null) ? ytd.Name : (owner is YdrFile ydr) ? ydr.Name : (owner is YddFile ydd) ? ydd.Name : (owner is YftFile yft) ? yft.Name : string.Empty; SaveTextureButton.Enabled = true; } else diff --git a/CodeWalker/World/WorldSearchForm.cs b/CodeWalker/World/WorldSearchForm.cs index 46a7966..33e2ac0 100644 --- a/CodeWalker/World/WorldSearchForm.cs +++ b/CodeWalker/World/WorldSearchForm.cs @@ -1,12 +1,16 @@ using CodeWalker.GameFiles; +using CommunityToolkit.HighPerformance; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Data; +using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -16,7 +20,7 @@ namespace CodeWalker.World { private WorldForm WorldForm; - private volatile bool AbortOperation = false; + private CancellationTokenSource AbortOperation = new CancellationTokenSource(); private List ArchetypeResults = new List(); private List EntityResults = new List(); @@ -67,118 +71,141 @@ namespace CodeWalker.World ArchetypeSearchButton.Enabled = false; ArchetypeSearchAbortButton.Enabled = true; ArchetypeSearchExportResultsButton.Enabled = false; - AbortOperation = false; + AbortOperation.Cancel(); + AbortOperation = new CancellationTokenSource(); ArchetypeResults.Clear(); ArchetypeResultsListView.VirtualListSize = 0; s = s.ToLowerInvariant(); - Task.Run(() => + _ = Task.Run(async () => { var rpfman = gfc.RpfMan; - IEnumerable rpflist = loadedOnly ? gfc.ActiveMapRpfFiles.Values : rpfman.AllRpfs; - var results = new List(); + RpfFile[] rpflist = (loadedOnly ? (IEnumerable)gfc.ActiveMapRpfFiles.Values : rpfman.AllRpfs).ToArray(); + var results = new ConcurrentBag(); - foreach (var rpf in rpflist) + var token = AbortOperation.Token; + + var hash = JenkHash.GenHashLower(s); + + var archetype = GameFileCache.Instance?.GetArchetype(hash); + + if (archetype is not null) { - foreach (var entry in rpf.AllEntries) + ArchetypeSearchAddResult(archetype); + results.Add(archetype); + } + + try + { + await Parallel.ForAsync(0, rpflist.Length, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount / 2, CancellationToken = token }, async (i, cancellationToken) => { - try + var rpf = rpflist[i]; + foreach (var entry in rpf.AllEntries) { - if (AbortOperation) + try { - ArchetypeSearchUpdateStatus("Search aborted!"); - ArchetypeSearchComplete(); - return; - } - if (entry.Name.EndsWith(".ytyp", StringComparison.OrdinalIgnoreCase)) - { - ArchetypeSearchUpdateStatus(entry.Path); - - YtypFile ytyp = rpfman.GetFile(entry); - if (ytyp == null) continue; - if (ytyp.AllArchetypes == null) continue; - - foreach (var arch in ytyp.AllArchetypes) + if (token.IsCancellationRequested) { - if (arch.Name.ToLowerInvariant().Contains(s) - || arch.AssetName.ToLowerInvariant().Contains(s)) + return; + } + if (entry.Name.EndsWith(".ytyp", StringComparison.OrdinalIgnoreCase)) + { + ArchetypeSearchUpdateStatus(entry.Path); + + YtypFile? ytyp = await RpfManager.GetFileAsync(entry); + + if (ytyp == null) + continue; + + foreach (var arch in ytyp.AllArchetypes) { - ArchetypeSearchAddResult(arch); - results.Add(arch); + if (arch.Name.Contains(s, StringComparison.OrdinalIgnoreCase) + || arch.AssetName.Contains(s, StringComparison.OrdinalIgnoreCase)) + { + ArchetypeSearchAddResult(arch); + results.Add(arch); + } } } } + catch (Exception ex) + { + ArchetypeSearchUpdateStatus(ex.Message); + Console.WriteLine(ex); + } } - catch (Exception ex) - { - ArchetypeSearchUpdateStatus(ex.Message); - } - } - } + }); - ArchetypeSearchUpdateStatus("Search complete. " + results.Count.ToString() + " archetypes found."); - ArchetypeSearchComplete(); + ArchetypeSearchUpdateStatus($"Search complete. {results.Count} archetypes found."); + } + catch (TaskCanceledException) + { + ArchetypeSearchUpdateStatus("Search aborted!"); + } + finally + { + ArchetypeSearchComplete(); + } }); } - private void ArchetypeSearchUpdateStatus(string text) + private async void ArchetypeSearchUpdateStatus(string text, bool force = false) { + if (!force && LastUpdate.Elapsed < TimeSpan.FromSeconds(0.1)) + { + return; + } + + LastUpdate.Restart(); try { - if (InvokeRequired) - { - Invoke(new Action(() => { ArchetypeSearchUpdateStatus(text); })); - } - else - { - ArchetypeSearchStatusLabel.Text = text; - } + await this.SwitchToUi(); + ArchetypeSearchStatusLabel.Text = text; + } + catch(Exception ex) + { + Console.WriteLine(ex); } - catch { } } - private void ArchetypeSearchAddResult(Archetype arch) + private async void ArchetypeSearchAddResult(Archetype arch) { try { - if (InvokeRequired) - { - BeginInvoke(new Action(() => { ArchetypeSearchAddResult(arch); })); - } - else - { - ArchetypeResults.Add(arch); - ArchetypeResultsListView.VirtualListSize = ArchetypeResults.Count; - } + await this.SwitchToUi(); + if (ArchetypeResults.Contains(arch)) + return; + ArchetypeResults.Add(arch); + ArchetypeResultsListView.VirtualListSize = ArchetypeResults.Count; + } + catch (Exception ex) + { + Console.WriteLine(ex); } - catch { } } - private void ArchetypeSearchComplete() + private async void ArchetypeSearchComplete() { try { - if (InvokeRequired) - { - Invoke(new Action(() => { ArchetypeSearchComplete(); })); - } - else - { - ArchetypeSearchTextBox.Enabled = true; - ArchetypeSearchButton.Enabled = true; - ArchetypeSearchAbortButton.Enabled = false; - ArchetypeSearchExportResultsButton.Enabled = true; - } + await this.SwitchToUi(); + ArchetypeSearchTextBox.Enabled = true; + ArchetypeSearchButton.Enabled = true; + ArchetypeSearchAbortButton.Enabled = false; + ArchetypeSearchExportResultsButton.Enabled = true; + } + catch (Exception ex) + { + Console.WriteLine(ex); } - catch { } } private void ArchetypeSearchAbortButton_Click(object sender, EventArgs e) { - AbortOperation = true; + AbortOperation.Cancel(); } private void ArchetypeSearchExportResultsButton_Click(object sender, EventArgs e) @@ -189,7 +216,7 @@ namespace CodeWalker.World return; } - SaveFileDialog.FileName = "Archetypes_" + ArchetypeSearchTextBox.Text; + SaveFileDialog.FileName = $"Archetypes_{ArchetypeSearchTextBox.Text}"; if (SaveFileDialog.ShowDialog() != DialogResult.OK) { return; @@ -201,7 +228,7 @@ namespace CodeWalker.World sb.AppendLine("Name, AssetName, YtypFile"); foreach (var arch in ArchetypeResults) { - sb.AppendLine(string.Format("{0}, {1}, {2}", arch.Name, arch.AssetName, arch.Ytyp?.RpfFileEntry?.Path ?? "")); + sb.AppendLine($"{arch.Name}, {arch.AssetName}, {arch.Ytyp?.RpfFileEntry?.Path ?? ""}"); } File.WriteAllText(fname, sb.ToString()); @@ -308,120 +335,133 @@ namespace CodeWalker.World EntitySearchLoadedOnlyCheckBox.Enabled = false; EntitySearchExportResultsButton.Enabled = false; EntitySearchSetMarkersButton.Enabled = false; - AbortOperation = false; + AbortOperation.Cancel(); + AbortOperation = new CancellationTokenSource(); EntityResults.Clear(); EntityResultsListView.VirtualListSize = 0; s = s.ToLowerInvariant(); //var h = JenkHash.GenHash(s, JenkHashInputEncoding.UTF8); - Task.Run(() => + _ = Task.Run(async () => { var rpfman = gfc.RpfMan; - IEnumerable rpflist = loadedOnly ? gfc.ActiveMapRpfFiles.Values : rpfman.AllRpfs; - var results = new List(); + RpfFile[] rpflist = (loadedOnly ? (IEnumerable)gfc.ActiveMapRpfFiles.Values : rpfman.AllRpfs).ToArray(); + var results = new ConcurrentBag(); - foreach (var rpf in rpflist) + var token = AbortOperation.Token; + + try { - foreach (var entry in rpf.AllEntries) + await Parallel.ForAsync(0, rpflist.Length, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount / 2, CancellationToken = token }, async (i, cancellationToken) => { - try + var rpf = rpflist[i]; + foreach (var entry in rpf.AllEntries) { - if (AbortOperation) + try { - EntitySearchUpdateStatus("Search aborted!"); - EntitySearchComplete(); - return; - } - if (entry.Name.EndsWith(".ymap", StringComparison.OrdinalIgnoreCase)) - { - EntitySearchUpdateStatus(entry.Path); + if (cancellationToken.IsCancellationRequested || AbortOperation.IsCancellationRequested) + return; - YmapFile ymap = rpfman.GetFile(entry); - if (ymap == null) continue; - if (ymap.AllEntities == null) continue; - - foreach (var ent in ymap.AllEntities) + if (entry.Name.EndsWith(".ymap", StringComparison.OrdinalIgnoreCase)) { - //if (ent._CEntityDef.archetypeName.Hash == h) - if (ent.Name.ToLowerInvariant().Contains(s)) + EntitySearchUpdateStatus(entry.Path); + + var ymap = await GameFileCache.Instance.GetYmapAsync(entry.ShortNameHash); + + if (ymap is null || ymap.AllEntities.Length == 0) + continue; + + foreach (var ent in ymap.AllEntities) { - EntitySearchAddResult(ent); - results.Add(ent); + //if (ent._CEntityDef.archetypeName.Hash == h) + if (ent.Name.Contains(s, StringComparison.OrdinalIgnoreCase)) + { + EntitySearchAddResult(ent); + results.Add(ent); + } } } } + catch (Exception ex) + { + EntitySearchUpdateStatus(ex.Message); + Console.WriteLine(ex); + } } - catch (Exception ex) - { - EntitySearchUpdateStatus(ex.Message); - } - } - } + }); - EntitySearchUpdateStatus("Search complete. " + results.Count.ToString() + " entities found."); - EntitySearchComplete(); + EntitySearchUpdateStatus($"Search complete. {results.Count} entities found.", true); + } + catch(TaskCanceledException) + { + EntitySearchUpdateStatus("Search aborted!", true); + } + finally + { + EntitySearchComplete(); + } }); } - private void EntitySearchUpdateStatus(string text) + Stopwatch LastUpdate = Stopwatch.StartNew(); + private async void EntitySearchUpdateStatus(string text, bool force = false) { + if (!force && LastUpdate.Elapsed < TimeSpan.FromSeconds(0.1)) + { + return; + } + + LastUpdate.Restart(); try { - if (InvokeRequired) - { - Invoke(new Action(() => { EntitySearchUpdateStatus(text); })); - } - else - { - EntitySearchStatusLabel.Text = text; - } + await this.SwitchToUi(); + EntitySearchStatusLabel.Text = text; + } + catch (Exception ex) + { + Console.WriteLine(ex); } - catch { } } - private void EntitySearchAddResult(YmapEntityDef ent) + private async void EntitySearchAddResult(YmapEntityDef ent) { try { - if (InvokeRequired) - { - BeginInvoke(new Action(() => { EntitySearchAddResult(ent); })); - } - else - { - EntityResults.Add(ent); - EntityResultsListView.VirtualListSize = EntityResults.Count; - } + await this.SwitchToUi(); + if (EntityResults.Contains(ent)) + return; + EntityResults.Add(ent); + EntityResultsListView.VirtualListSize = EntityResults.Count; + } + catch (Exception ex) + { + Console.WriteLine(ex); } - catch { } } - private void EntitySearchComplete() + private async void EntitySearchComplete() { try { - if (InvokeRequired) - { - Invoke(new Action(() => { EntitySearchComplete(); })); - } - else - { - EntitySearchTextBox.Enabled = true; - EntitySearchButton.Enabled = true; - EntitySearchAbortButton.Enabled = false; - EntitySearchLoadedOnlyCheckBox.Enabled = true; - EntitySearchExportResultsButton.Enabled = true; - EntitySearchSetMarkersButton.Enabled = true; - } + await this.SwitchToUi(); + EntitySearchTextBox.Enabled = true; + EntitySearchButton.Enabled = true; + EntitySearchAbortButton.Enabled = false; + EntitySearchLoadedOnlyCheckBox.Enabled = true; + EntitySearchExportResultsButton.Enabled = true; + EntitySearchSetMarkersButton.Enabled = true; + } + catch (Exception ex) + { + Console.WriteLine(ex); } - catch { } } private void EntitySearchAbortButton_Click(object sender, EventArgs e) { - AbortOperation = true; + AbortOperation.Cancel(); } private void EntitySearchExportResultsButton_Click(object sender, EventArgs e) @@ -444,7 +484,7 @@ namespace CodeWalker.World sb.AppendLine("ArchetypeName, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, YmapFile"); foreach (var ent in EntityResults) { - sb.AppendLine(string.Format("{0}, {1}, {2}, {3}", ent.Name, FloatUtil.GetVector3String(ent._CEntityDef.position), FloatUtil.GetVector4String(ent._CEntityDef.rotation), ent.Ymap?.RpfFileEntry?.Path ?? "")); + sb.AppendLine($"{ent.Name}, {FloatUtil.GetVector3String(ent._CEntityDef.position)}, {FloatUtil.GetVector4String(ent._CEntityDef.rotation)}, {ent.Ymap?.RpfFileEntry?.Path ?? ""}"); } File.WriteAllText(fname, sb.ToString()); diff --git a/CodeWalker/WorldForm.Designer.cs b/CodeWalker/WorldForm.Designer.cs index 11e465d..33f4fc6 100644 --- a/CodeWalker/WorldForm.Designer.cs +++ b/CodeWalker/WorldForm.Designer.cs @@ -30,3701 +30,3609 @@ namespace CodeWalker /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WorldForm)); + components = new System.ComponentModel.Container(); System.Windows.Forms.Label label34; - this.StatusStrip = new System.Windows.Forms.StatusStrip(); - this.StatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.MousedLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.StatsLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.ModelComboBox = new System.Windows.Forms.ComboBox(); - this.ToolsPanel = new System.Windows.Forms.Panel(); - this.ToolsDragPanel = new System.Windows.Forms.Panel(); - this.AboutButton = new System.Windows.Forms.Button(); - this.ToolsButton = new System.Windows.Forms.Button(); - this.ToolsPanelExpandButton = new System.Windows.Forms.Button(); - this.ToolsTabControl = new System.Windows.Forms.TabControl(); - this.ViewTabPage = new System.Windows.Forms.TabPage(); - this.ViewTabControl = new System.Windows.Forms.TabControl(); - this.ViewWorldTabPage = new System.Windows.Forms.TabPage(); - this.EnableModsCheckBox = new System.Windows.Forms.CheckBox(); - this.label30 = new System.Windows.Forms.Label(); - this.DlcLevelComboBox = new System.Windows.Forms.ComboBox(); - this.EnableDlcCheckBox = new System.Windows.Forms.CheckBox(); - this.WorldYmapWeatherFilterCheckBox = new System.Windows.Forms.CheckBox(); - this.WorldYmapTimeFilterCheckBox = new System.Windows.Forms.CheckBox(); - this.WorldScriptedYmapsCheckBox = new System.Windows.Forms.CheckBox(); - this.WorldDetailDistLabel = new System.Windows.Forms.Label(); - this.label18 = new System.Windows.Forms.Label(); - this.WorldDetailDistTrackBar = new System.Windows.Forms.TrackBar(); - this.WorldLodDistLabel = new System.Windows.Forms.Label(); - this.label16 = new System.Windows.Forms.Label(); - this.WorldLodDistTrackBar = new System.Windows.Forms.TrackBar(); - this.label15 = new System.Windows.Forms.Label(); - this.WorldMaxLodComboBox = new System.Windows.Forms.ComboBox(); - this.ViewYmapsTabPage = new System.Windows.Forms.TabPage(); - this.ShowYmapChildrenCheckBox = new System.Windows.Forms.CheckBox(); - this.label2 = new System.Windows.Forms.Label(); - this.DetailTrackBar = new System.Windows.Forms.TrackBar(); - this.DynamicLODCheckBox = new System.Windows.Forms.CheckBox(); - this.YmapsTextBox = new CodeWalker.WinForms.TextBoxFix(); - this.ViewModelTabPage = new System.Windows.Forms.TabPage(); - this.label1 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.ViewModeComboBox = new System.Windows.Forms.ComboBox(); - this.ShowToolbarCheckBox = new System.Windows.Forms.CheckBox(); - this.MarkersTabPage = new System.Windows.Forms.TabPage(); - this.label27 = new System.Windows.Forms.Label(); - this.CameraPositionTextBox = new System.Windows.Forms.TextBox(); - this.AddSelectionMarkerButton = new System.Windows.Forms.Button(); - this.AddCurrentPositonMarkerButton = new System.Windows.Forms.Button(); - this.ResetMarkersButton = new System.Windows.Forms.Button(); - this.ClearMarkersButton = new System.Windows.Forms.Button(); - this.GoToButton = new System.Windows.Forms.Button(); - this.ShowLocatorCheckBox = new System.Windows.Forms.CheckBox(); - this.label6 = new System.Windows.Forms.Label(); - this.LocateTextBox = new System.Windows.Forms.TextBox(); - this.label7 = new System.Windows.Forms.Label(); - this.AddMarkersButton = new System.Windows.Forms.Button(); - this.MultiFindTextBox = new CodeWalker.WinForms.TextBoxFix(); - this.SelectionTabPage = new System.Windows.Forms.TabPage(); - this.label25 = new System.Windows.Forms.Label(); - this.SelectionModeComboBox = new System.Windows.Forms.ComboBox(); - this.SelectionNameTextBox = new System.Windows.Forms.TextBox(); - this.SelectionTabControl = new System.Windows.Forms.TabControl(); - this.SelectionEntityTabPage = new System.Windows.Forms.TabPage(); - this.SelEntityPropertyGrid = new CodeWalker.WinForms.ReadOnlyPropertyGrid(); - this.SelectionArchetypeTabPage = new System.Windows.Forms.TabPage(); - this.SelArchetypePropertyGrid = new CodeWalker.WinForms.ReadOnlyPropertyGrid(); - this.SelectionDrawableTabPage = new System.Windows.Forms.TabPage(); - this.tabControl3 = new System.Windows.Forms.TabControl(); - this.tabPage11 = new System.Windows.Forms.TabPage(); - this.SelDrawablePropertyGrid = new CodeWalker.WinForms.ReadOnlyPropertyGrid(); - this.tabPage12 = new System.Windows.Forms.TabPage(); - this.SelDrawableModelsTreeView = new CodeWalker.WinForms.TreeViewFix(); - this.tabPage13 = new System.Windows.Forms.TabPage(); - this.SelDrawableTexturesTreeView = new CodeWalker.WinForms.TreeViewFix(); - this.SelectionExtensionTabPage = new System.Windows.Forms.TabPage(); - this.SelExtensionPropertyGrid = new CodeWalker.WinForms.ReadOnlyPropertyGrid(); - this.MouseSelectCheckBox = new System.Windows.Forms.CheckBox(); - this.OptionsTabPage = new System.Windows.Forms.TabPage(); - this.OptionsTabControl = new System.Windows.Forms.TabControl(); - this.OptionsGeneralTabPage = new System.Windows.Forms.TabPage(); - this.CarGeneratorsCheckBox = new System.Windows.Forms.CheckBox(); - this.RenderEntitiesCheckBox = new System.Windows.Forms.CheckBox(); - this.AdvancedSettingsButton = new System.Windows.Forms.Button(); - this.ControlSettingsButton = new System.Windows.Forms.Button(); - this.MapViewDetailLabel = new System.Windows.Forms.Label(); - this.label28 = new System.Windows.Forms.Label(); - this.MapViewDetailTrackBar = new System.Windows.Forms.TrackBar(); - this.CameraModeComboBox = new System.Windows.Forms.ComboBox(); - this.label24 = new System.Windows.Forms.Label(); - this.WaterQuadsCheckBox = new System.Windows.Forms.CheckBox(); - this.FieldOfViewLabel = new System.Windows.Forms.Label(); - this.label22 = new System.Windows.Forms.Label(); - this.TimedEntitiesAlwaysOnCheckBox = new System.Windows.Forms.CheckBox(); - this.GrassCheckBox = new System.Windows.Forms.CheckBox(); - this.InteriorsCheckBox = new System.Windows.Forms.CheckBox(); - this.CollisionMeshLayerDrawableCheckBox = new System.Windows.Forms.CheckBox(); - this.CollisionMeshLayer2CheckBox = new System.Windows.Forms.CheckBox(); - this.CollisionMeshLayer1CheckBox = new System.Windows.Forms.CheckBox(); - this.label13 = new System.Windows.Forms.Label(); - this.CollisionMeshLayer0CheckBox = new System.Windows.Forms.CheckBox(); - this.label12 = new System.Windows.Forms.Label(); - this.CollisionMeshRangeTrackBar = new System.Windows.Forms.TrackBar(); - this.CollisionMeshesCheckBox = new System.Windows.Forms.CheckBox(); - this.FullScreenCheckBox = new System.Windows.Forms.CheckBox(); - this.TimedEntitiesCheckBox = new System.Windows.Forms.CheckBox(); - this.FieldOfViewTrackBar = new System.Windows.Forms.TrackBar(); - this.OptionsRenderTabPage = new System.Windows.Forms.TabPage(); - this.AntiAliasingTrackBar = new System.Windows.Forms.TrackBar(); - this.FarClipUpDown = new System.Windows.Forms.NumericUpDown(); - this.label32 = new System.Windows.Forms.Label(); - this.NearClipUpDown = new System.Windows.Forms.NumericUpDown(); - this.label31 = new System.Windows.Forms.Label(); - this.HDTexturesCheckBox = new System.Windows.Forms.CheckBox(); - this.WireframeCheckBox = new System.Windows.Forms.CheckBox(); - this.RenderModeComboBox = new System.Windows.Forms.ComboBox(); - this.label11 = new System.Windows.Forms.Label(); - this.TextureSamplerComboBox = new System.Windows.Forms.ComboBox(); - this.TextureCoordsComboBox = new System.Windows.Forms.ComboBox(); - this.label10 = new System.Windows.Forms.Label(); - this.AnisotropicFilteringCheckBox = new System.Windows.Forms.CheckBox(); - this.ProxiesCheckBox = new System.Windows.Forms.CheckBox(); - this.WaitForChildrenCheckBox = new System.Windows.Forms.CheckBox(); - this.label14 = new System.Windows.Forms.Label(); - this.OptionsHelpersTabPage = new System.Windows.Forms.TabPage(); - this.SnapAngleUpDown = new System.Windows.Forms.NumericUpDown(); - this.label33 = new System.Windows.Forms.Label(); - this.SnapGridSizeUpDown = new System.Windows.Forms.NumericUpDown(); - this.label26 = new System.Windows.Forms.Label(); - this.SkeletonsCheckBox = new System.Windows.Forms.CheckBox(); - this.AudioOuterBoundsCheckBox = new System.Windows.Forms.CheckBox(); - this.PopZonesCheckBox = new System.Windows.Forms.CheckBox(); - this.NavMeshesCheckBox = new System.Windows.Forms.CheckBox(); - this.TrainPathsCheckBox = new System.Windows.Forms.CheckBox(); - this.PathsDepthClipCheckBox = new System.Windows.Forms.CheckBox(); - this.PathBoundsCheckBox = new System.Windows.Forms.CheckBox(); - this.SelectionWidgetCheckBox = new System.Windows.Forms.CheckBox(); - this.MarkerStyleComboBox = new System.Windows.Forms.ComboBox(); - this.label4 = new System.Windows.Forms.Label(); - this.LocatorStyleComboBox = new System.Windows.Forms.ComboBox(); - this.label5 = new System.Windows.Forms.Label(); - this.MarkerDepthClipCheckBox = new System.Windows.Forms.CheckBox(); - this.label9 = new System.Windows.Forms.Label(); - this.PathsCheckBox = new System.Windows.Forms.CheckBox(); - this.SelectionBoundsCheckBox = new System.Windows.Forms.CheckBox(); - this.BoundsDepthClipCheckBox = new System.Windows.Forms.CheckBox(); - this.BoundsRangeTrackBar = new System.Windows.Forms.TrackBar(); - this.BoundsStyleComboBox = new System.Windows.Forms.ComboBox(); - this.label8 = new System.Windows.Forms.Label(); - this.OptionsLightingTabPage = new System.Windows.Forms.TabPage(); - this.HDLightsCheckBox = new System.Windows.Forms.CheckBox(); - this.DeferredShadingCheckBox = new System.Windows.Forms.CheckBox(); - this.WeatherRegionComboBox = new System.Windows.Forms.ComboBox(); - this.label29 = new System.Windows.Forms.Label(); - this.CloudParamTrackBar = new System.Windows.Forms.TrackBar(); - this.CloudParamComboBox = new System.Windows.Forms.ComboBox(); - this.label23 = new System.Windows.Forms.Label(); - this.CloudsComboBox = new System.Windows.Forms.ComboBox(); - this.label21 = new System.Windows.Forms.Label(); - this.TimeSpeedLabel = new System.Windows.Forms.Label(); - this.label20 = new System.Windows.Forms.Label(); - this.TimeSpeedTrackBar = new System.Windows.Forms.TrackBar(); - this.TimeStartStopButton = new System.Windows.Forms.Button(); - this.ArtificialAmbientLightCheckBox = new System.Windows.Forms.CheckBox(); - this.NaturalAmbientLightCheckBox = new System.Windows.Forms.CheckBox(); - this.LODLightsCheckBox = new System.Windows.Forms.CheckBox(); - this.HDRRenderingCheckBox = new System.Windows.Forms.CheckBox(); - this.ControlTimeOfDayCheckBox = new System.Windows.Forms.CheckBox(); - this.TimeOfDayLabel = new System.Windows.Forms.Label(); - this.label19 = new System.Windows.Forms.Label(); - this.TimeOfDayTrackBar = new System.Windows.Forms.TrackBar(); - this.WeatherComboBox = new System.Windows.Forms.ComboBox(); - this.label17 = new System.Windows.Forms.Label(); - this.ControlLightDirectionCheckBox = new System.Windows.Forms.CheckBox(); - this.SkydomeCheckBox = new System.Windows.Forms.CheckBox(); - this.ShadowsCheckBox = new System.Windows.Forms.CheckBox(); - this.StatusBarCheckBox = new System.Windows.Forms.CheckBox(); - this.QuitButton = new System.Windows.Forms.Button(); - this.ReloadSettingsButton = new System.Windows.Forms.Button(); - this.SaveSettingsButton = new System.Windows.Forms.Button(); - this.ReloadShadersButton = new System.Windows.Forms.Button(); - this.ErrorConsoleCheckBox = new System.Windows.Forms.CheckBox(); - this.ToolsPanelHideButton = new System.Windows.Forms.Button(); - this.ToolsPanelShowButton = new System.Windows.Forms.Button(); - this.ConsolePanel = new System.Windows.Forms.Panel(); - this.ConsoleTextBox = new CodeWalker.WinForms.TextBoxFix(); - this.StatsUpdateTimer = new System.Windows.Forms.Timer(this.components); - this.SelectedMarkerPanel = new System.Windows.Forms.Panel(); - this.SelectedMarkerPositionTextBox = new System.Windows.Forms.TextBox(); - this.SelectedMarkerNameTextBox = new System.Windows.Forms.TextBox(); - this.ToolsMenu = new System.Windows.Forms.ContextMenuStrip(this.components); - this.ToolsMenuRPFBrowser = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuRPFExplorer = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuSelectionInfo = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuProjectWindow = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuCutsceneViewer = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuAudioExplorer = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuWorldSearch = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuBinarySearch = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuJenkGen = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuJenkInd = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuExtractScripts = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuExtractTextures = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuExtractRawFiles = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuExtractShaders = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsMenuOptions = new System.Windows.Forms.ToolStripMenuItem(); - this.Toolbar = new CodeWalker.WinForms.ToolStripFix(); - this.ToolbarNewButton = new System.Windows.Forms.ToolStripSplitButton(); - this.ToolbarNewProjectButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarNewYmapButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarNewYtypButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarNewYbnButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarNewYndButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarNewTrainsButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarNewScenarioButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarOpenButton = new System.Windows.Forms.ToolStripSplitButton(); - this.ToolbarOpenProjectButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarOpenFilesButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarOpenFolderButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSaveButton = new System.Windows.Forms.ToolStripButton(); - this.ToolbarSaveAllButton = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.ToolbarSelectButton = new CodeWalker.WinForms.ToolStripSplitButtonFix(); - this.ToolbarSelectEntityButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectEntityExtensionButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectArchetypeExtensionButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectTimeCycleModifierButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectCarGeneratorButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectGrassButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectWaterQuadButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectCalmingQuadButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectWaveQuadButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectCollisionButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectNavMeshButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectPathButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectTrainTrackButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectLodLightsButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectMloInstanceButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectScenarioButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectAudioButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSelectOcclusionButton = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.ToolbarMoveButton = new System.Windows.Forms.ToolStripButton(); - this.ToolbarRotateButton = new System.Windows.Forms.ToolStripButton(); - this.ToolbarScaleButton = new System.Windows.Forms.ToolStripButton(); - this.ToolbarTransformSpaceButton = new System.Windows.Forms.ToolStripSplitButton(); - this.ToolbarObjectSpaceButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarWorldSpaceButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSnapButton = new CodeWalker.WinForms.ToolStripSplitButtonFix(); - this.ToolbarSnapToGroundButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSnapToGridButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSnapToGroundGridButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarSnapGridSizeButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnappingButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnappingOffButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnapping1Button = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnapping2Button = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnapping5Button = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnapping10Button = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnapping45Button = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnapping90Button = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRotationSnappingCustomButton = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.ToolbarUndoButton = new System.Windows.Forms.ToolStripSplitButton(); - this.ToolbarUndoListButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarRedoButton = new System.Windows.Forms.ToolStripSplitButton(); - this.ToolbarRedoListButton = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.ToolbarInfoWindowButton = new System.Windows.Forms.ToolStripButton(); - this.ToolbarProjectWindowButton = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.ToolbarAddItemButton = new System.Windows.Forms.ToolStripButton(); - this.ToolbarDeleteItemButton = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.ToolbarCopyButton = new System.Windows.Forms.ToolStripButton(); - this.ToolbarPasteButton = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.ToolbarCameraModeButton = new System.Windows.Forms.ToolStripSplitButton(); - this.ToolbarCameraPerspectiveButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarCameraMapViewButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarCameraOrthographicButton = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolbarPanel = new System.Windows.Forms.Panel(); - this.SubtitleLabel = new System.Windows.Forms.Label(); - this.SubtitleTimer = new System.Windows.Forms.Timer(this.components); - this.AntiAliasingValue = new System.Windows.Forms.Label(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WorldForm)); + StatusStrip = new System.Windows.Forms.StatusStrip(); + StatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + MousedLabel = new System.Windows.Forms.ToolStripStatusLabel(); + StatsLabel = new System.Windows.Forms.ToolStripStatusLabel(); + ModelComboBox = new System.Windows.Forms.ComboBox(); + ToolsPanel = new System.Windows.Forms.Panel(); + ToolsDragPanel = new System.Windows.Forms.Panel(); + AboutButton = new System.Windows.Forms.Button(); + ToolsButton = new System.Windows.Forms.Button(); + ToolsPanelExpandButton = new System.Windows.Forms.Button(); + ToolsTabControl = new System.Windows.Forms.TabControl(); + ViewTabPage = new System.Windows.Forms.TabPage(); + ViewTabControl = new System.Windows.Forms.TabControl(); + ViewWorldTabPage = new System.Windows.Forms.TabPage(); + EnableModsCheckBox = new System.Windows.Forms.CheckBox(); + label30 = new System.Windows.Forms.Label(); + DlcLevelComboBox = new System.Windows.Forms.ComboBox(); + EnableDlcCheckBox = new System.Windows.Forms.CheckBox(); + WorldYmapWeatherFilterCheckBox = new System.Windows.Forms.CheckBox(); + WorldYmapTimeFilterCheckBox = new System.Windows.Forms.CheckBox(); + WorldScriptedYmapsCheckBox = new System.Windows.Forms.CheckBox(); + WorldDetailDistLabel = new System.Windows.Forms.Label(); + label18 = new System.Windows.Forms.Label(); + WorldDetailDistTrackBar = new System.Windows.Forms.TrackBar(); + WorldLodDistLabel = new System.Windows.Forms.Label(); + label16 = new System.Windows.Forms.Label(); + WorldLodDistTrackBar = new System.Windows.Forms.TrackBar(); + label15 = new System.Windows.Forms.Label(); + WorldMaxLodComboBox = new System.Windows.Forms.ComboBox(); + ViewYmapsTabPage = new System.Windows.Forms.TabPage(); + ShowYmapChildrenCheckBox = new System.Windows.Forms.CheckBox(); + label2 = new System.Windows.Forms.Label(); + DetailTrackBar = new System.Windows.Forms.TrackBar(); + DynamicLODCheckBox = new System.Windows.Forms.CheckBox(); + YmapsTextBox = new TextBoxFix(); + ViewModelTabPage = new System.Windows.Forms.TabPage(); + label1 = new System.Windows.Forms.Label(); + label3 = new System.Windows.Forms.Label(); + ViewModeComboBox = new System.Windows.Forms.ComboBox(); + ShowToolbarCheckBox = new System.Windows.Forms.CheckBox(); + MarkersTabPage = new System.Windows.Forms.TabPage(); + label27 = new System.Windows.Forms.Label(); + CameraPositionTextBox = new System.Windows.Forms.TextBox(); + AddSelectionMarkerButton = new System.Windows.Forms.Button(); + AddCurrentPositonMarkerButton = new System.Windows.Forms.Button(); + ResetMarkersButton = new System.Windows.Forms.Button(); + ClearMarkersButton = new System.Windows.Forms.Button(); + GoToButton = new System.Windows.Forms.Button(); + ShowLocatorCheckBox = new System.Windows.Forms.CheckBox(); + label6 = new System.Windows.Forms.Label(); + LocateTextBox = new System.Windows.Forms.TextBox(); + label7 = new System.Windows.Forms.Label(); + AddMarkersButton = new System.Windows.Forms.Button(); + MultiFindTextBox = new TextBoxFix(); + SelectionTabPage = new System.Windows.Forms.TabPage(); + label25 = new System.Windows.Forms.Label(); + SelectionModeComboBox = new System.Windows.Forms.ComboBox(); + SelectionNameTextBox = new System.Windows.Forms.TextBox(); + SelectionTabControl = new System.Windows.Forms.TabControl(); + SelectionEntityTabPage = new System.Windows.Forms.TabPage(); + SelEntityPropertyGrid = new ReadOnlyPropertyGrid(); + SelectionArchetypeTabPage = new System.Windows.Forms.TabPage(); + SelArchetypePropertyGrid = new ReadOnlyPropertyGrid(); + SelectionDrawableTabPage = new System.Windows.Forms.TabPage(); + tabControl3 = new System.Windows.Forms.TabControl(); + tabPage11 = new System.Windows.Forms.TabPage(); + SelDrawablePropertyGrid = new ReadOnlyPropertyGrid(); + tabPage12 = new System.Windows.Forms.TabPage(); + SelDrawableModelsTreeView = new TreeViewFix(); + tabPage13 = new System.Windows.Forms.TabPage(); + SelDrawableTexturesTreeView = new TreeViewFix(); + SelectionExtensionTabPage = new System.Windows.Forms.TabPage(); + SelExtensionPropertyGrid = new ReadOnlyPropertyGrid(); + MouseSelectCheckBox = new System.Windows.Forms.CheckBox(); + OptionsTabPage = new System.Windows.Forms.TabPage(); + OptionsTabControl = new System.Windows.Forms.TabControl(); + OptionsGeneralTabPage = new System.Windows.Forms.TabPage(); + CarGeneratorsCheckBox = new System.Windows.Forms.CheckBox(); + RenderEntitiesCheckBox = new System.Windows.Forms.CheckBox(); + AdvancedSettingsButton = new System.Windows.Forms.Button(); + ControlSettingsButton = new System.Windows.Forms.Button(); + MapViewDetailLabel = new System.Windows.Forms.Label(); + label28 = new System.Windows.Forms.Label(); + MapViewDetailTrackBar = new System.Windows.Forms.TrackBar(); + CameraModeComboBox = new System.Windows.Forms.ComboBox(); + label24 = new System.Windows.Forms.Label(); + WaterQuadsCheckBox = new System.Windows.Forms.CheckBox(); + FieldOfViewLabel = new System.Windows.Forms.Label(); + label22 = new System.Windows.Forms.Label(); + TimedEntitiesAlwaysOnCheckBox = new System.Windows.Forms.CheckBox(); + GrassCheckBox = new System.Windows.Forms.CheckBox(); + InteriorsCheckBox = new System.Windows.Forms.CheckBox(); + CollisionMeshLayerDrawableCheckBox = new System.Windows.Forms.CheckBox(); + CollisionMeshLayer2CheckBox = new System.Windows.Forms.CheckBox(); + CollisionMeshLayer1CheckBox = new System.Windows.Forms.CheckBox(); + label13 = new System.Windows.Forms.Label(); + CollisionMeshLayer0CheckBox = new System.Windows.Forms.CheckBox(); + label12 = new System.Windows.Forms.Label(); + CollisionMeshRangeTrackBar = new System.Windows.Forms.TrackBar(); + CollisionMeshesCheckBox = new System.Windows.Forms.CheckBox(); + FullScreenCheckBox = new System.Windows.Forms.CheckBox(); + TimedEntitiesCheckBox = new System.Windows.Forms.CheckBox(); + FieldOfViewTrackBar = new System.Windows.Forms.TrackBar(); + OptionsRenderTabPage = new System.Windows.Forms.TabPage(); + AntiAliasingValue = new System.Windows.Forms.Label(); + AntiAliasingTrackBar = new System.Windows.Forms.TrackBar(); + FarClipUpDown = new System.Windows.Forms.NumericUpDown(); + label32 = new System.Windows.Forms.Label(); + NearClipUpDown = new System.Windows.Forms.NumericUpDown(); + label31 = new System.Windows.Forms.Label(); + HDTexturesCheckBox = new System.Windows.Forms.CheckBox(); + WireframeCheckBox = new System.Windows.Forms.CheckBox(); + RenderModeComboBox = new System.Windows.Forms.ComboBox(); + label11 = new System.Windows.Forms.Label(); + TextureSamplerComboBox = new System.Windows.Forms.ComboBox(); + TextureCoordsComboBox = new System.Windows.Forms.ComboBox(); + label10 = new System.Windows.Forms.Label(); + AnisotropicFilteringCheckBox = new System.Windows.Forms.CheckBox(); + ProxiesCheckBox = new System.Windows.Forms.CheckBox(); + WaitForChildrenCheckBox = new System.Windows.Forms.CheckBox(); + label14 = new System.Windows.Forms.Label(); + OptionsHelpersTabPage = new System.Windows.Forms.TabPage(); + SnapAngleUpDown = new System.Windows.Forms.NumericUpDown(); + label33 = new System.Windows.Forms.Label(); + SnapGridSizeUpDown = new System.Windows.Forms.NumericUpDown(); + label26 = new System.Windows.Forms.Label(); + SkeletonsCheckBox = new System.Windows.Forms.CheckBox(); + AudioOuterBoundsCheckBox = new System.Windows.Forms.CheckBox(); + PopZonesCheckBox = new System.Windows.Forms.CheckBox(); + NavMeshesCheckBox = new System.Windows.Forms.CheckBox(); + TrainPathsCheckBox = new System.Windows.Forms.CheckBox(); + PathsDepthClipCheckBox = new System.Windows.Forms.CheckBox(); + PathBoundsCheckBox = new System.Windows.Forms.CheckBox(); + SelectionWidgetCheckBox = new System.Windows.Forms.CheckBox(); + MarkerStyleComboBox = new System.Windows.Forms.ComboBox(); + label4 = new System.Windows.Forms.Label(); + LocatorStyleComboBox = new System.Windows.Forms.ComboBox(); + label5 = new System.Windows.Forms.Label(); + MarkerDepthClipCheckBox = new System.Windows.Forms.CheckBox(); + label9 = new System.Windows.Forms.Label(); + PathsCheckBox = new System.Windows.Forms.CheckBox(); + SelectionBoundsCheckBox = new System.Windows.Forms.CheckBox(); + BoundsDepthClipCheckBox = new System.Windows.Forms.CheckBox(); + BoundsRangeTrackBar = new System.Windows.Forms.TrackBar(); + BoundsStyleComboBox = new System.Windows.Forms.ComboBox(); + label8 = new System.Windows.Forms.Label(); + OptionsLightingTabPage = new System.Windows.Forms.TabPage(); + HDLightsCheckBox = new System.Windows.Forms.CheckBox(); + DeferredShadingCheckBox = new System.Windows.Forms.CheckBox(); + WeatherRegionComboBox = new System.Windows.Forms.ComboBox(); + label29 = new System.Windows.Forms.Label(); + CloudParamTrackBar = new System.Windows.Forms.TrackBar(); + CloudParamComboBox = new System.Windows.Forms.ComboBox(); + label23 = new System.Windows.Forms.Label(); + CloudsComboBox = new System.Windows.Forms.ComboBox(); + label21 = new System.Windows.Forms.Label(); + TimeSpeedLabel = new System.Windows.Forms.Label(); + label20 = new System.Windows.Forms.Label(); + TimeSpeedTrackBar = new System.Windows.Forms.TrackBar(); + TimeStartStopButton = new System.Windows.Forms.Button(); + ArtificialAmbientLightCheckBox = new System.Windows.Forms.CheckBox(); + NaturalAmbientLightCheckBox = new System.Windows.Forms.CheckBox(); + LODLightsCheckBox = new System.Windows.Forms.CheckBox(); + HDRRenderingCheckBox = new System.Windows.Forms.CheckBox(); + ControlTimeOfDayCheckBox = new System.Windows.Forms.CheckBox(); + TimeOfDayLabel = new System.Windows.Forms.Label(); + label19 = new System.Windows.Forms.Label(); + TimeOfDayTrackBar = new System.Windows.Forms.TrackBar(); + WeatherComboBox = new System.Windows.Forms.ComboBox(); + label17 = new System.Windows.Forms.Label(); + ControlLightDirectionCheckBox = new System.Windows.Forms.CheckBox(); + SkydomeCheckBox = new System.Windows.Forms.CheckBox(); + ShadowsCheckBox = new System.Windows.Forms.CheckBox(); + StatusBarCheckBox = new System.Windows.Forms.CheckBox(); + QuitButton = new System.Windows.Forms.Button(); + ReloadSettingsButton = new System.Windows.Forms.Button(); + SaveSettingsButton = new System.Windows.Forms.Button(); + ReloadShadersButton = new System.Windows.Forms.Button(); + ErrorConsoleCheckBox = new System.Windows.Forms.CheckBox(); + ToolsPanelHideButton = new System.Windows.Forms.Button(); + ToolsPanelShowButton = new System.Windows.Forms.Button(); + ConsolePanel = new System.Windows.Forms.Panel(); + ConsoleTextBox = new TextBoxFix(); + StatsUpdateTimer = new System.Windows.Forms.Timer(components); + SelectedMarkerPanel = new System.Windows.Forms.Panel(); + SelectedMarkerPositionTextBox = new System.Windows.Forms.TextBox(); + SelectedMarkerNameTextBox = new System.Windows.Forms.TextBox(); + ToolsMenu = new System.Windows.Forms.ContextMenuStrip(components); + ToolsMenuRPFBrowser = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuRPFExplorer = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuSelectionInfo = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuProjectWindow = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuCutsceneViewer = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuAudioExplorer = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuWorldSearch = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuBinarySearch = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuJenkGen = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuJenkInd = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuExtractScripts = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuExtractTextures = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuExtractRawFiles = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuExtractShaders = new System.Windows.Forms.ToolStripMenuItem(); + ToolsMenuOptions = new System.Windows.Forms.ToolStripMenuItem(); + Toolbar = new ToolStripFix(); + ToolbarNewButton = new System.Windows.Forms.ToolStripSplitButton(); + ToolbarNewProjectButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarNewYmapButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarNewYtypButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarNewYbnButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarNewYndButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarNewTrainsButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarNewScenarioButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarOpenButton = new System.Windows.Forms.ToolStripSplitButton(); + ToolbarOpenProjectButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarOpenFilesButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarOpenFolderButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSaveButton = new System.Windows.Forms.ToolStripButton(); + ToolbarSaveAllButton = new System.Windows.Forms.ToolStripButton(); + toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + ToolbarSelectButton = new ToolStripSplitButtonFix(); + ToolbarSelectEntityButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectEntityExtensionButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectArchetypeExtensionButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectTimeCycleModifierButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectCarGeneratorButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectGrassButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectWaterQuadButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectCalmingQuadButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectWaveQuadButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectCollisionButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectNavMeshButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectPathButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectTrainTrackButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectLodLightsButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectMloInstanceButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectScenarioButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectAudioButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSelectOcclusionButton = new System.Windows.Forms.ToolStripMenuItem(); + toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + ToolbarMoveButton = new System.Windows.Forms.ToolStripButton(); + ToolbarRotateButton = new System.Windows.Forms.ToolStripButton(); + ToolbarScaleButton = new System.Windows.Forms.ToolStripButton(); + ToolbarTransformSpaceButton = new System.Windows.Forms.ToolStripSplitButton(); + ToolbarObjectSpaceButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarWorldSpaceButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSnapButton = new ToolStripSplitButtonFix(); + ToolbarSnapToGroundButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSnapToGridButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSnapToGroundGridButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarSnapGridSizeButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnappingButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnappingOffButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnapping1Button = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnapping2Button = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnapping5Button = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnapping10Button = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnapping45Button = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnapping90Button = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRotationSnappingCustomButton = new System.Windows.Forms.ToolStripMenuItem(); + toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + ToolbarUndoButton = new System.Windows.Forms.ToolStripSplitButton(); + ToolbarUndoListButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarRedoButton = new System.Windows.Forms.ToolStripSplitButton(); + ToolbarRedoListButton = new System.Windows.Forms.ToolStripMenuItem(); + toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + ToolbarInfoWindowButton = new System.Windows.Forms.ToolStripButton(); + ToolbarProjectWindowButton = new System.Windows.Forms.ToolStripButton(); + toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + ToolbarAddItemButton = new System.Windows.Forms.ToolStripButton(); + ToolbarDeleteItemButton = new System.Windows.Forms.ToolStripButton(); + toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + ToolbarCopyButton = new System.Windows.Forms.ToolStripButton(); + ToolbarPasteButton = new System.Windows.Forms.ToolStripButton(); + toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + ToolbarCameraModeButton = new System.Windows.Forms.ToolStripSplitButton(); + ToolbarCameraPerspectiveButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarCameraMapViewButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarCameraOrthographicButton = new System.Windows.Forms.ToolStripMenuItem(); + ToolbarPanel = new System.Windows.Forms.Panel(); + SubtitleLabel = new System.Windows.Forms.Label(); + SubtitleTimer = new System.Windows.Forms.Timer(components); label34 = new System.Windows.Forms.Label(); - this.StatusStrip.SuspendLayout(); - this.ToolsPanel.SuspendLayout(); - this.ToolsTabControl.SuspendLayout(); - this.ViewTabPage.SuspendLayout(); - this.ViewTabControl.SuspendLayout(); - this.ViewWorldTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.WorldDetailDistTrackBar)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.WorldLodDistTrackBar)).BeginInit(); - this.ViewYmapsTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.DetailTrackBar)).BeginInit(); - this.ViewModelTabPage.SuspendLayout(); - this.MarkersTabPage.SuspendLayout(); - this.SelectionTabPage.SuspendLayout(); - this.SelectionTabControl.SuspendLayout(); - this.SelectionEntityTabPage.SuspendLayout(); - this.SelectionArchetypeTabPage.SuspendLayout(); - this.SelectionDrawableTabPage.SuspendLayout(); - this.tabControl3.SuspendLayout(); - this.tabPage11.SuspendLayout(); - this.tabPage12.SuspendLayout(); - this.tabPage13.SuspendLayout(); - this.SelectionExtensionTabPage.SuspendLayout(); - this.OptionsTabPage.SuspendLayout(); - this.OptionsTabControl.SuspendLayout(); - this.OptionsGeneralTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.MapViewDetailTrackBar)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.CollisionMeshRangeTrackBar)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.FieldOfViewTrackBar)).BeginInit(); - this.OptionsRenderTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.AntiAliasingTrackBar)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.FarClipUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.NearClipUpDown)).BeginInit(); - this.OptionsHelpersTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.SnapAngleUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.SnapGridSizeUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.BoundsRangeTrackBar)).BeginInit(); - this.OptionsLightingTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.CloudParamTrackBar)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.TimeSpeedTrackBar)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.TimeOfDayTrackBar)).BeginInit(); - this.ConsolePanel.SuspendLayout(); - this.SelectedMarkerPanel.SuspendLayout(); - this.ToolsMenu.SuspendLayout(); - this.Toolbar.SuspendLayout(); - this.ToolbarPanel.SuspendLayout(); - this.SuspendLayout(); - // - // StatusStrip - // - this.StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.StatusLabel, - this.MousedLabel, - this.StatsLabel}); - this.StatusStrip.Location = new System.Drawing.Point(0, 689); - this.StatusStrip.Name = "StatusStrip"; - this.StatusStrip.Size = new System.Drawing.Size(984, 22); - this.StatusStrip.TabIndex = 0; - this.StatusStrip.Text = "statusStrip1"; - // - // StatusLabel - // - this.StatusLabel.BackColor = System.Drawing.SystemColors.Control; - this.StatusLabel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.StatusLabel.Name = "StatusLabel"; - this.StatusLabel.Size = new System.Drawing.Size(878, 17); - this.StatusLabel.Spring = true; - this.StatusLabel.Text = "Initialising"; - this.StatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // MousedLabel - // - this.MousedLabel.BackColor = System.Drawing.SystemColors.Control; - this.MousedLabel.Name = "MousedLabel"; - this.MousedLabel.Size = new System.Drawing.Size(16, 17); - this.MousedLabel.Text = " "; - // - // StatsLabel - // - this.StatsLabel.BackColor = System.Drawing.SystemColors.Control; - this.StatsLabel.DoubleClickEnabled = true; - this.StatsLabel.Name = "StatsLabel"; - this.StatsLabel.Size = new System.Drawing.Size(75, 17); - this.StatsLabel.Text = "0 geometries"; - this.StatsLabel.DoubleClick += new System.EventHandler(this.StatsLabel_DoubleClick); - // - // ModelComboBox - // - this.ModelComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ModelComboBox.FormattingEnabled = true; - this.ModelComboBox.Items.AddRange(new object[] { - "dt1_lod_slod3", - "dt1_tc_dufo_core", - "dt1_tc_ufocore", - "ex_office_citymodel_01", - "id1_30_build3_dtl2", - "imp_prop_ship_01a", - "prop_alien_egg_01", - "prop_fruit_stand_02", - "prop_fruit_stand_03", - "dune", - "dune2", - "dune2_hi", - "adder", - "adder_hi", - "kuruma2", - "kuruma2_hi", - "infernus", - "infernus_hi", - "buzzard", - "buzzard_hi", - "rhino", - "rhino_hi", - "lazer", - "lazer_hi", - "duster", - "duster_hi", - "marquis", - "marquis_hi", - "submersible", - "submersible_hi", - "cargobob", - "cargobob_hi", - "sanchez", - "sanchez_hi"}); - this.ModelComboBox.Location = new System.Drawing.Point(44, 7); - this.ModelComboBox.Name = "ModelComboBox"; - this.ModelComboBox.Size = new System.Drawing.Size(150, 21); - this.ModelComboBox.TabIndex = 11; - this.ModelComboBox.SelectedIndexChanged += new System.EventHandler(this.ModelComboBox_SelectedIndexChanged); - this.ModelComboBox.TextUpdate += new System.EventHandler(this.ModelComboBox_TextUpdate); - // - // ToolsPanel - // - this.ToolsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.ToolsPanel.BackColor = System.Drawing.SystemColors.ControlDark; - this.ToolsPanel.Controls.Add(this.ToolsDragPanel); - this.ToolsPanel.Controls.Add(this.AboutButton); - this.ToolsPanel.Controls.Add(this.ToolsButton); - this.ToolsPanel.Controls.Add(this.ToolsPanelExpandButton); - this.ToolsPanel.Controls.Add(this.ToolsTabControl); - this.ToolsPanel.Controls.Add(this.ToolsPanelHideButton); - this.ToolsPanel.Location = new System.Drawing.Point(754, 12); - this.ToolsPanel.Name = "ToolsPanel"; - this.ToolsPanel.Size = new System.Drawing.Size(218, 665); - this.ToolsPanel.TabIndex = 2; - this.ToolsPanel.Visible = false; - // - // ToolsDragPanel - // - this.ToolsDragPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.ToolsDragPanel.Cursor = System.Windows.Forms.Cursors.VSplit; - this.ToolsDragPanel.Location = new System.Drawing.Point(0, 0); - this.ToolsDragPanel.Name = "ToolsDragPanel"; - this.ToolsDragPanel.Size = new System.Drawing.Size(4, 665); - this.ToolsDragPanel.TabIndex = 16; - this.ToolsDragPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ToolsDragPanel_MouseDown); - this.ToolsDragPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ToolsDragPanel_MouseMove); - this.ToolsDragPanel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ToolsDragPanel_MouseUp); - // - // AboutButton - // - this.AboutButton.Location = new System.Drawing.Point(64, 3); - this.AboutButton.Name = "AboutButton"; - this.AboutButton.Size = new System.Drawing.Size(55, 23); - this.AboutButton.TabIndex = 15; - this.AboutButton.Text = "About..."; - this.AboutButton.UseVisualStyleBackColor = true; - this.AboutButton.Click += new System.EventHandler(this.AboutButton_Click); - // - // ToolsButton - // - this.ToolsButton.Location = new System.Drawing.Point(3, 3); - this.ToolsButton.Name = "ToolsButton"; - this.ToolsButton.Size = new System.Drawing.Size(55, 23); - this.ToolsButton.TabIndex = 14; - this.ToolsButton.Text = "Tools..."; - this.ToolsButton.UseVisualStyleBackColor = true; - this.ToolsButton.Click += new System.EventHandler(this.ToolsButton_Click); - // - // ToolsPanelExpandButton - // - this.ToolsPanelExpandButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ToolsPanelExpandButton.Location = new System.Drawing.Point(149, 3); - this.ToolsPanelExpandButton.Name = "ToolsPanelExpandButton"; - this.ToolsPanelExpandButton.Size = new System.Drawing.Size(30, 23); - this.ToolsPanelExpandButton.TabIndex = 13; - this.ToolsPanelExpandButton.Text = "<<"; - this.ToolsPanelExpandButton.UseVisualStyleBackColor = true; - this.ToolsPanelExpandButton.Click += new System.EventHandler(this.ToolsPanelExpandButton_Click); - // - // ToolsTabControl - // - this.ToolsTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ToolsTabControl.Controls.Add(this.ViewTabPage); - this.ToolsTabControl.Controls.Add(this.MarkersTabPage); - this.ToolsTabControl.Controls.Add(this.SelectionTabPage); - this.ToolsTabControl.Controls.Add(this.OptionsTabPage); - this.ToolsTabControl.Location = new System.Drawing.Point(3, 30); - this.ToolsTabControl.Name = "ToolsTabControl"; - this.ToolsTabControl.SelectedIndex = 0; - this.ToolsTabControl.Size = new System.Drawing.Size(213, 632); - this.ToolsTabControl.TabIndex = 12; - // - // ViewTabPage - // - this.ViewTabPage.Controls.Add(this.ViewTabControl); - this.ViewTabPage.Controls.Add(this.label3); - this.ViewTabPage.Controls.Add(this.ViewModeComboBox); - this.ViewTabPage.Controls.Add(this.ShowToolbarCheckBox); - this.ViewTabPage.Location = new System.Drawing.Point(4, 22); - this.ViewTabPage.Name = "ViewTabPage"; - this.ViewTabPage.Padding = new System.Windows.Forms.Padding(3); - this.ViewTabPage.Size = new System.Drawing.Size(205, 606); - this.ViewTabPage.TabIndex = 0; - this.ViewTabPage.Text = "View"; - this.ViewTabPage.UseVisualStyleBackColor = true; - // - // ViewTabControl - // - this.ViewTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ViewTabControl.Controls.Add(this.ViewWorldTabPage); - this.ViewTabControl.Controls.Add(this.ViewYmapsTabPage); - this.ViewTabControl.Controls.Add(this.ViewModelTabPage); - this.ViewTabControl.Location = new System.Drawing.Point(0, 32); - this.ViewTabControl.Name = "ViewTabControl"; - this.ViewTabControl.SelectedIndex = 0; - this.ViewTabControl.Size = new System.Drawing.Size(202, 548); - this.ViewTabControl.TabIndex = 12; - // - // ViewWorldTabPage - // - this.ViewWorldTabPage.Controls.Add(this.EnableModsCheckBox); - this.ViewWorldTabPage.Controls.Add(this.label30); - this.ViewWorldTabPage.Controls.Add(this.DlcLevelComboBox); - this.ViewWorldTabPage.Controls.Add(this.EnableDlcCheckBox); - this.ViewWorldTabPage.Controls.Add(this.WorldYmapWeatherFilterCheckBox); - this.ViewWorldTabPage.Controls.Add(this.WorldYmapTimeFilterCheckBox); - this.ViewWorldTabPage.Controls.Add(this.WorldScriptedYmapsCheckBox); - this.ViewWorldTabPage.Controls.Add(this.WorldDetailDistLabel); - this.ViewWorldTabPage.Controls.Add(this.label18); - this.ViewWorldTabPage.Controls.Add(this.WorldDetailDistTrackBar); - this.ViewWorldTabPage.Controls.Add(this.WorldLodDistLabel); - this.ViewWorldTabPage.Controls.Add(this.label16); - this.ViewWorldTabPage.Controls.Add(this.WorldLodDistTrackBar); - this.ViewWorldTabPage.Controls.Add(this.label15); - this.ViewWorldTabPage.Controls.Add(this.WorldMaxLodComboBox); - this.ViewWorldTabPage.Location = new System.Drawing.Point(4, 22); - this.ViewWorldTabPage.Name = "ViewWorldTabPage"; - this.ViewWorldTabPage.Padding = new System.Windows.Forms.Padding(3); - this.ViewWorldTabPage.Size = new System.Drawing.Size(194, 522); - this.ViewWorldTabPage.TabIndex = 0; - this.ViewWorldTabPage.Text = "World"; - this.ViewWorldTabPage.UseVisualStyleBackColor = true; - // - // EnableModsCheckBox - // - this.EnableModsCheckBox.AutoSize = true; - this.EnableModsCheckBox.Enabled = false; - this.EnableModsCheckBox.Location = new System.Drawing.Point(6, 280); - this.EnableModsCheckBox.Name = "EnableModsCheckBox"; - this.EnableModsCheckBox.Size = new System.Drawing.Size(88, 17); - this.EnableModsCheckBox.TabIndex = 68; - this.EnableModsCheckBox.Text = "Enable Mods"; - this.EnableModsCheckBox.UseVisualStyleBackColor = true; - this.EnableModsCheckBox.CheckedChanged += new System.EventHandler(this.EnableModsCheckBox_CheckedChanged); - // - // label30 - // - this.label30.AutoSize = true; - this.label30.Location = new System.Drawing.Point(1, 337); - this.label30.Name = "label30"; - this.label30.Size = new System.Drawing.Size(60, 13); - this.label30.TabIndex = 70; - this.label30.Text = "DLC Level:"; - // - // DlcLevelComboBox - // - this.DlcLevelComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.DlcLevelComboBox.Enabled = false; - this.DlcLevelComboBox.FormattingEnabled = true; - this.DlcLevelComboBox.Items.AddRange(new object[] { - ""}); - this.DlcLevelComboBox.Location = new System.Drawing.Point(62, 334); - this.DlcLevelComboBox.Name = "DlcLevelComboBox"; - this.DlcLevelComboBox.Size = new System.Drawing.Size(126, 21); - this.DlcLevelComboBox.TabIndex = 70; - this.DlcLevelComboBox.SelectedIndexChanged += new System.EventHandler(this.DlcLevelComboBox_SelectedIndexChanged); - this.DlcLevelComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.DlcLevelComboBox_KeyPress); - // - // EnableDlcCheckBox - // - this.EnableDlcCheckBox.AutoSize = true; - this.EnableDlcCheckBox.Enabled = false; - this.EnableDlcCheckBox.Location = new System.Drawing.Point(6, 311); - this.EnableDlcCheckBox.Name = "EnableDlcCheckBox"; - this.EnableDlcCheckBox.Size = new System.Drawing.Size(83, 17); - this.EnableDlcCheckBox.TabIndex = 69; - this.EnableDlcCheckBox.Text = "Enable DLC"; - this.EnableDlcCheckBox.UseVisualStyleBackColor = true; - this.EnableDlcCheckBox.CheckedChanged += new System.EventHandler(this.EnableDlcCheckBox_CheckedChanged); - // - // WorldYmapWeatherFilterCheckBox - // - this.WorldYmapWeatherFilterCheckBox.AutoSize = true; - this.WorldYmapWeatherFilterCheckBox.Checked = true; - this.WorldYmapWeatherFilterCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.WorldYmapWeatherFilterCheckBox.Location = new System.Drawing.Point(6, 237); - this.WorldYmapWeatherFilterCheckBox.Name = "WorldYmapWeatherFilterCheckBox"; - this.WorldYmapWeatherFilterCheckBox.Size = new System.Drawing.Size(136, 17); - this.WorldYmapWeatherFilterCheckBox.TabIndex = 67; - this.WorldYmapWeatherFilterCheckBox.Text = "Filter ymaps by weather"; - this.WorldYmapWeatherFilterCheckBox.UseVisualStyleBackColor = true; - this.WorldYmapWeatherFilterCheckBox.CheckedChanged += new System.EventHandler(this.WorldYmapWeatherFilterCheckBox_CheckedChanged); - // - // WorldYmapTimeFilterCheckBox - // - this.WorldYmapTimeFilterCheckBox.AutoSize = true; - this.WorldYmapTimeFilterCheckBox.Checked = true; - this.WorldYmapTimeFilterCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.WorldYmapTimeFilterCheckBox.Location = new System.Drawing.Point(6, 214); - this.WorldYmapTimeFilterCheckBox.Name = "WorldYmapTimeFilterCheckBox"; - this.WorldYmapTimeFilterCheckBox.Size = new System.Drawing.Size(149, 17); - this.WorldYmapTimeFilterCheckBox.TabIndex = 66; - this.WorldYmapTimeFilterCheckBox.Text = "Filter ymaps by time of day"; - this.WorldYmapTimeFilterCheckBox.UseVisualStyleBackColor = true; - this.WorldYmapTimeFilterCheckBox.CheckedChanged += new System.EventHandler(this.WorldYmapTimeFilterCheckBox_CheckedChanged); - // - // WorldScriptedYmapsCheckBox - // - this.WorldScriptedYmapsCheckBox.AutoSize = true; - this.WorldScriptedYmapsCheckBox.Checked = true; - this.WorldScriptedYmapsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.WorldScriptedYmapsCheckBox.Location = new System.Drawing.Point(6, 182); - this.WorldScriptedYmapsCheckBox.Name = "WorldScriptedYmapsCheckBox"; - this.WorldScriptedYmapsCheckBox.Size = new System.Drawing.Size(126, 17); - this.WorldScriptedYmapsCheckBox.TabIndex = 65; - this.WorldScriptedYmapsCheckBox.Text = "Show scripted ymaps"; - this.WorldScriptedYmapsCheckBox.UseVisualStyleBackColor = true; - this.WorldScriptedYmapsCheckBox.CheckedChanged += new System.EventHandler(this.WorldScriptedYmapsCheckBox_CheckedChanged); - // - // WorldDetailDistLabel - // - this.WorldDetailDistLabel.AutoSize = true; - this.WorldDetailDistLabel.Location = new System.Drawing.Point(87, 94); - this.WorldDetailDistLabel.Name = "WorldDetailDistLabel"; - this.WorldDetailDistLabel.Size = new System.Drawing.Size(22, 13); - this.WorldDetailDistLabel.TabIndex = 64; - this.WorldDetailDistLabel.Text = "1.0"; - // - // label18 - // - this.label18.AutoSize = true; - this.label18.Location = new System.Drawing.Point(1, 94); - this.label18.Name = "label18"; - this.label18.Size = new System.Drawing.Size(80, 13); - this.label18.TabIndex = 63; - this.label18.Text = "Detail distance:"; - // - // WorldDetailDistTrackBar - // - this.WorldDetailDistTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.WorldDetailDistTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.WorldDetailDistTrackBar.LargeChange = 10; - this.WorldDetailDistTrackBar.Location = new System.Drawing.Point(6, 110); - this.WorldDetailDistTrackBar.Maximum = 50; - this.WorldDetailDistTrackBar.Name = "WorldDetailDistTrackBar"; - this.WorldDetailDistTrackBar.Size = new System.Drawing.Size(182, 45); - this.WorldDetailDistTrackBar.TabIndex = 62; - this.WorldDetailDistTrackBar.TickFrequency = 2; - this.WorldDetailDistTrackBar.Value = 10; - this.WorldDetailDistTrackBar.Scroll += new System.EventHandler(this.WorldDetailDistTrackBar_Scroll); - // - // WorldLodDistLabel - // - this.WorldLodDistLabel.AutoSize = true; - this.WorldLodDistLabel.Location = new System.Drawing.Point(82, 39); - this.WorldLodDistLabel.Name = "WorldLodDistLabel"; - this.WorldLodDistLabel.Size = new System.Drawing.Size(22, 13); - this.WorldLodDistLabel.TabIndex = 61; - this.WorldLodDistLabel.Text = "1.0"; - this.WorldLodDistLabel.Visible = false; - // - // label16 - // - this.label16.AutoSize = true; - this.label16.Location = new System.Drawing.Point(1, 39); - this.label16.Name = "label16"; - this.label16.Size = new System.Drawing.Size(75, 13); - this.label16.TabIndex = 60; - this.label16.Text = "LOD distance:"; - this.label16.Visible = false; - // - // WorldLodDistTrackBar - // - this.WorldLodDistTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.WorldLodDistTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.WorldLodDistTrackBar.LargeChange = 10; - this.WorldLodDistTrackBar.Location = new System.Drawing.Point(6, 55); - this.WorldLodDistTrackBar.Maximum = 30; - this.WorldLodDistTrackBar.Name = "WorldLodDistTrackBar"; - this.WorldLodDistTrackBar.Size = new System.Drawing.Size(182, 45); - this.WorldLodDistTrackBar.TabIndex = 59; - this.WorldLodDistTrackBar.TickFrequency = 2; - this.WorldLodDistTrackBar.Value = 10; - this.WorldLodDistTrackBar.Visible = false; - this.WorldLodDistTrackBar.Scroll += new System.EventHandler(this.WorldLodDistTrackBar_Scroll); - // - // label15 - // - this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(1, 9); - this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(55, 13); - this.label15.TabIndex = 58; - this.label15.Text = "Max LOD:"; - // - // WorldMaxLodComboBox - // - this.WorldMaxLodComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.WorldMaxLodComboBox.FormattingEnabled = true; - this.WorldMaxLodComboBox.Items.AddRange(new object[] { - "ORPHANHD", - "HD", - "LOD", - "SLOD1", - "SLOD2", - "SLOD3", - "SLOD4"}); - this.WorldMaxLodComboBox.Location = new System.Drawing.Point(62, 6); - this.WorldMaxLodComboBox.Name = "WorldMaxLodComboBox"; - this.WorldMaxLodComboBox.Size = new System.Drawing.Size(126, 21); - this.WorldMaxLodComboBox.TabIndex = 57; - this.WorldMaxLodComboBox.SelectedIndexChanged += new System.EventHandler(this.WorldMaxLodComboBox_SelectedIndexChanged); - this.WorldMaxLodComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.WorldMaxLodComboBox_KeyPress); - // - // ViewYmapsTabPage - // - this.ViewYmapsTabPage.Controls.Add(this.ShowYmapChildrenCheckBox); - this.ViewYmapsTabPage.Controls.Add(this.label2); - this.ViewYmapsTabPage.Controls.Add(this.DetailTrackBar); - this.ViewYmapsTabPage.Controls.Add(this.DynamicLODCheckBox); - this.ViewYmapsTabPage.Controls.Add(this.YmapsTextBox); - this.ViewYmapsTabPage.Location = new System.Drawing.Point(4, 22); - this.ViewYmapsTabPage.Name = "ViewYmapsTabPage"; - this.ViewYmapsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.ViewYmapsTabPage.Size = new System.Drawing.Size(194, 522); - this.ViewYmapsTabPage.TabIndex = 1; - this.ViewYmapsTabPage.Text = "Ymaps"; - this.ViewYmapsTabPage.UseVisualStyleBackColor = true; - // - // ShowYmapChildrenCheckBox - // - this.ShowYmapChildrenCheckBox.AutoSize = true; - this.ShowYmapChildrenCheckBox.Enabled = false; - this.ShowYmapChildrenCheckBox.Location = new System.Drawing.Point(6, 59); - this.ShowYmapChildrenCheckBox.Name = "ShowYmapChildrenCheckBox"; - this.ShowYmapChildrenCheckBox.Size = new System.Drawing.Size(93, 17); - this.ShowYmapChildrenCheckBox.TabIndex = 35; - this.ShowYmapChildrenCheckBox.Text = "Show children"; - this.ShowYmapChildrenCheckBox.UseVisualStyleBackColor = true; - this.ShowYmapChildrenCheckBox.CheckedChanged += new System.EventHandler(this.ShowYmapChildrenCheckBox_CheckedChanged); - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(3, 88); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(77, 13); - this.label2.TabIndex = 8; - this.label2.Text = "Ymaps to load:"; - // - // DetailTrackBar - // - this.DetailTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.DetailTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.DetailTrackBar.Location = new System.Drawing.Point(6, 24); - this.DetailTrackBar.Maximum = 20; - this.DetailTrackBar.Name = "DetailTrackBar"; - this.DetailTrackBar.Size = new System.Drawing.Size(182, 45); - this.DetailTrackBar.TabIndex = 34; - this.DetailTrackBar.Value = 5; - this.DetailTrackBar.Scroll += new System.EventHandler(this.DetailTrackBar_Scroll); - // - // DynamicLODCheckBox - // - this.DynamicLODCheckBox.AutoSize = true; - this.DynamicLODCheckBox.Checked = true; - this.DynamicLODCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.DynamicLODCheckBox.Location = new System.Drawing.Point(6, 6); - this.DynamicLODCheckBox.Name = "DynamicLODCheckBox"; - this.DynamicLODCheckBox.Size = new System.Drawing.Size(92, 17); - this.DynamicLODCheckBox.TabIndex = 33; - this.DynamicLODCheckBox.Text = "Dynamic LOD"; - this.DynamicLODCheckBox.UseVisualStyleBackColor = true; - this.DynamicLODCheckBox.CheckedChanged += new System.EventHandler(this.DynamicLODCheckBox_CheckedChanged); - // - // YmapsTextBox - // - this.YmapsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.YmapsTextBox.Location = new System.Drawing.Point(0, 104); - this.YmapsTextBox.Multiline = true; - this.YmapsTextBox.Name = "YmapsTextBox"; - this.YmapsTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.YmapsTextBox.Size = new System.Drawing.Size(194, 418); - this.YmapsTextBox.TabIndex = 36; - this.YmapsTextBox.Text = resources.GetString("YmapsTextBox.Text"); - this.YmapsTextBox.TextChanged += new System.EventHandler(this.YmapsTextBox_TextChanged); - // - // ViewModelTabPage - // - this.ViewModelTabPage.Controls.Add(this.label1); - this.ViewModelTabPage.Controls.Add(this.ModelComboBox); - this.ViewModelTabPage.Location = new System.Drawing.Point(4, 22); - this.ViewModelTabPage.Name = "ViewModelTabPage"; - this.ViewModelTabPage.Size = new System.Drawing.Size(194, 522); - this.ViewModelTabPage.TabIndex = 2; - this.ViewModelTabPage.Text = "Model"; - this.ViewModelTabPage.UseVisualStyleBackColor = true; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(-1, 10); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(39, 13); - this.label1.TabIndex = 5; - this.label1.Text = "Model:"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(3, 8); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(37, 13); - this.label3.TabIndex = 11; - this.label3.Text = "Mode:"; - // - // ViewModeComboBox - // - this.ViewModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.ViewModeComboBox.FormattingEnabled = true; - this.ViewModeComboBox.Items.AddRange(new object[] { - "World view", - "Ymap view", - "Model view"}); - this.ViewModeComboBox.Location = new System.Drawing.Point(48, 5); - this.ViewModeComboBox.Name = "ViewModeComboBox"; - this.ViewModeComboBox.Size = new System.Drawing.Size(111, 21); - this.ViewModeComboBox.TabIndex = 10; - this.ViewModeComboBox.SelectedIndexChanged += new System.EventHandler(this.ViewModeComboBox_SelectedIndexChanged); - this.ViewModeComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ViewModeComboBox_KeyPress); - // - // ShowToolbarCheckBox - // - this.ShowToolbarCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.ShowToolbarCheckBox.AutoSize = true; - this.ShowToolbarCheckBox.Location = new System.Drawing.Point(10, 586); - this.ShowToolbarCheckBox.Name = "ShowToolbarCheckBox"; - this.ShowToolbarCheckBox.Size = new System.Drawing.Size(108, 17); - this.ShowToolbarCheckBox.TabIndex = 47; - this.ShowToolbarCheckBox.Text = "Show Toolbar (T)"; - this.ShowToolbarCheckBox.UseVisualStyleBackColor = true; - this.ShowToolbarCheckBox.CheckedChanged += new System.EventHandler(this.ShowToolbarCheckBox_CheckedChanged); - // - // MarkersTabPage - // - this.MarkersTabPage.Controls.Add(this.label27); - this.MarkersTabPage.Controls.Add(this.CameraPositionTextBox); - this.MarkersTabPage.Controls.Add(this.AddSelectionMarkerButton); - this.MarkersTabPage.Controls.Add(this.AddCurrentPositonMarkerButton); - this.MarkersTabPage.Controls.Add(this.ResetMarkersButton); - this.MarkersTabPage.Controls.Add(this.ClearMarkersButton); - this.MarkersTabPage.Controls.Add(this.GoToButton); - this.MarkersTabPage.Controls.Add(this.ShowLocatorCheckBox); - this.MarkersTabPage.Controls.Add(this.label6); - this.MarkersTabPage.Controls.Add(this.LocateTextBox); - this.MarkersTabPage.Controls.Add(this.label7); - this.MarkersTabPage.Controls.Add(this.AddMarkersButton); - this.MarkersTabPage.Controls.Add(this.MultiFindTextBox); - this.MarkersTabPage.Location = new System.Drawing.Point(4, 22); - this.MarkersTabPage.Name = "MarkersTabPage"; - this.MarkersTabPage.Padding = new System.Windows.Forms.Padding(3); - this.MarkersTabPage.Size = new System.Drawing.Size(205, 606); - this.MarkersTabPage.TabIndex = 1; - this.MarkersTabPage.Text = "Markers"; - this.MarkersTabPage.UseVisualStyleBackColor = true; - // - // label27 - // - this.label27.AutoSize = true; - this.label27.Location = new System.Drawing.Point(-2, 50); - this.label27.Name = "label27"; - this.label27.Size = new System.Drawing.Size(121, 13); - this.label27.TabIndex = 22; - this.label27.Text = "Current camera position:"; - // - // CameraPositionTextBox - // - this.CameraPositionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CameraPositionTextBox.Location = new System.Drawing.Point(0, 67); - this.CameraPositionTextBox.Name = "CameraPositionTextBox"; - this.CameraPositionTextBox.Size = new System.Drawing.Size(205, 20); - this.CameraPositionTextBox.TabIndex = 16; - this.CameraPositionTextBox.Text = "0, 0, 0"; - // - // AddSelectionMarkerButton - // - this.AddSelectionMarkerButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.AddSelectionMarkerButton.Location = new System.Drawing.Point(0, 536); - this.AddSelectionMarkerButton.Name = "AddSelectionMarkerButton"; - this.AddSelectionMarkerButton.Size = new System.Drawing.Size(97, 23); - this.AddSelectionMarkerButton.TabIndex = 22; - this.AddSelectionMarkerButton.Text = "Add selection"; - this.AddSelectionMarkerButton.UseVisualStyleBackColor = true; - this.AddSelectionMarkerButton.Click += new System.EventHandler(this.AddSelectionMarkerButton_Click); - // - // AddCurrentPositonMarkerButton - // - this.AddCurrentPositonMarkerButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.AddCurrentPositonMarkerButton.Location = new System.Drawing.Point(0, 507); - this.AddCurrentPositonMarkerButton.Name = "AddCurrentPositonMarkerButton"; - this.AddCurrentPositonMarkerButton.Size = new System.Drawing.Size(97, 23); - this.AddCurrentPositonMarkerButton.TabIndex = 20; - this.AddCurrentPositonMarkerButton.Text = "Add current pos"; - this.AddCurrentPositonMarkerButton.UseVisualStyleBackColor = true; - this.AddCurrentPositonMarkerButton.Click += new System.EventHandler(this.AddCurrentPositonMarkerButton_Click); - // - // ResetMarkersButton - // - this.ResetMarkersButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.ResetMarkersButton.Location = new System.Drawing.Point(108, 507); - this.ResetMarkersButton.Name = "ResetMarkersButton"; - this.ResetMarkersButton.Size = new System.Drawing.Size(97, 23); - this.ResetMarkersButton.TabIndex = 21; - this.ResetMarkersButton.Text = "Default markers"; - this.ResetMarkersButton.UseVisualStyleBackColor = true; - this.ResetMarkersButton.Click += new System.EventHandler(this.ResetMarkersButton_Click); - // - // ClearMarkersButton - // - this.ClearMarkersButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.ClearMarkersButton.Location = new System.Drawing.Point(108, 478); - this.ClearMarkersButton.Name = "ClearMarkersButton"; - this.ClearMarkersButton.Size = new System.Drawing.Size(97, 23); - this.ClearMarkersButton.TabIndex = 19; - this.ClearMarkersButton.Text = "Clear markers"; - this.ClearMarkersButton.UseVisualStyleBackColor = true; - this.ClearMarkersButton.Click += new System.EventHandler(this.ClearMarkersButton_Click); - // - // GoToButton - // - this.GoToButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.GoToButton.Location = new System.Drawing.Point(162, 24); - this.GoToButton.Name = "GoToButton"; - this.GoToButton.Size = new System.Drawing.Size(43, 22); - this.GoToButton.TabIndex = 15; - this.GoToButton.Text = "Go to"; - this.GoToButton.UseVisualStyleBackColor = true; - this.GoToButton.Click += new System.EventHandler(this.GoToButton_Click); - // - // ShowLocatorCheckBox - // - this.ShowLocatorCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ShowLocatorCheckBox.AutoSize = true; - this.ShowLocatorCheckBox.Location = new System.Drawing.Point(101, 8); - this.ShowLocatorCheckBox.Name = "ShowLocatorCheckBox"; - this.ShowLocatorCheckBox.Size = new System.Drawing.Size(88, 17); - this.ShowLocatorCheckBox.TabIndex = 13; - this.ShowLocatorCheckBox.Text = "Show marker"; - this.ShowLocatorCheckBox.UseVisualStyleBackColor = true; - this.ShowLocatorCheckBox.CheckedChanged += new System.EventHandler(this.ShowLocatorCheckBox_CheckedChanged); - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(-2, 8); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(79, 13); - this.label6.TabIndex = 13; - this.label6.Text = "Locate: X, Y, Z"; - // - // LocateTextBox - // - this.LocateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.LocateTextBox.Location = new System.Drawing.Point(0, 25); - this.LocateTextBox.Name = "LocateTextBox"; - this.LocateTextBox.Size = new System.Drawing.Size(156, 20); - this.LocateTextBox.TabIndex = 14; - this.LocateTextBox.Text = "0, 0, 0"; - this.LocateTextBox.TextChanged += new System.EventHandler(this.LocateTextBox_TextChanged); - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(-2, 101); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(122, 13); - this.label7.TabIndex = 11; - this.label7.Text = "Multi-find: X, Y, Z, Name"; - // - // AddMarkersButton - // - this.AddMarkersButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.AddMarkersButton.Location = new System.Drawing.Point(0, 478); - this.AddMarkersButton.Name = "AddMarkersButton"; - this.AddMarkersButton.Size = new System.Drawing.Size(97, 23); - this.AddMarkersButton.TabIndex = 18; - this.AddMarkersButton.Text = "Add markers"; - this.AddMarkersButton.UseVisualStyleBackColor = true; - this.AddMarkersButton.Click += new System.EventHandler(this.AddMarkersButton_Click); - // - // MultiFindTextBox - // - this.MultiFindTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.MultiFindTextBox.Location = new System.Drawing.Point(0, 117); - this.MultiFindTextBox.MaxLength = 1048576; - this.MultiFindTextBox.Multiline = true; - this.MultiFindTextBox.Name = "MultiFindTextBox"; - this.MultiFindTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.MultiFindTextBox.Size = new System.Drawing.Size(205, 355); - this.MultiFindTextBox.TabIndex = 17; - // - // SelectionTabPage - // - this.SelectionTabPage.Controls.Add(this.label25); - this.SelectionTabPage.Controls.Add(this.SelectionModeComboBox); - this.SelectionTabPage.Controls.Add(this.SelectionNameTextBox); - this.SelectionTabPage.Controls.Add(this.SelectionTabControl); - this.SelectionTabPage.Controls.Add(this.MouseSelectCheckBox); - this.SelectionTabPage.Location = new System.Drawing.Point(4, 22); - this.SelectionTabPage.Name = "SelectionTabPage"; - this.SelectionTabPage.Size = new System.Drawing.Size(205, 606); - this.SelectionTabPage.TabIndex = 2; - this.SelectionTabPage.Text = "Selection"; - this.SelectionTabPage.UseVisualStyleBackColor = true; - // - // label25 - // - this.label25.AutoSize = true; - this.label25.Location = new System.Drawing.Point(6, 33); - this.label25.Name = "label25"; - this.label25.Size = new System.Drawing.Size(37, 13); - this.label25.TabIndex = 28; - this.label25.Text = "Mode:"; - // - // SelectionModeComboBox - // - this.SelectionModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.SelectionModeComboBox.FormattingEnabled = true; - this.SelectionModeComboBox.Items.AddRange(new object[] { - "Entity", - "Entity Extension", - "Archetype Extension", - "Time Cycle Modifier", - "Car Generator", - "Grass", - "Water Quad", - "Water Calming Quad", - "Water Wave Quad", - "Collision", - "Nav Mesh", - "Path", - "Train Track", - "Lod Lights", - "Mlo Instance", - "Scenario", - "Audio", - "Occlusion"}); - this.SelectionModeComboBox.Location = new System.Drawing.Point(51, 30); - this.SelectionModeComboBox.Name = "SelectionModeComboBox"; - this.SelectionModeComboBox.Size = new System.Drawing.Size(121, 21); - this.SelectionModeComboBox.TabIndex = 23; - this.SelectionModeComboBox.SelectedIndexChanged += new System.EventHandler(this.SelectionModeComboBox_SelectedIndexChanged); - this.SelectionModeComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.SelectionModeComboBox_KeyPress); - // - // SelectionNameTextBox - // - this.SelectionNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelectionNameTextBox.BackColor = System.Drawing.Color.White; - this.SelectionNameTextBox.Location = new System.Drawing.Point(3, 66); - this.SelectionNameTextBox.Name = "SelectionNameText"; - this.SelectionNameTextBox.ReadOnly = true; - this.SelectionNameTextBox.Size = new System.Drawing.Size(199, 20); - this.SelectionNameTextBox.TabIndex = 26; - this.SelectionNameTextBox.Text = "Nothing selected"; - // - // SelectionTabControl - // - this.SelectionTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelectionTabControl.Controls.Add(this.SelectionEntityTabPage); - this.SelectionTabControl.Controls.Add(this.SelectionArchetypeTabPage); - this.SelectionTabControl.Controls.Add(this.SelectionDrawableTabPage); - this.SelectionTabControl.Controls.Add(this.SelectionExtensionTabPage); - this.SelectionTabControl.Location = new System.Drawing.Point(0, 95); - this.SelectionTabControl.Margin = new System.Windows.Forms.Padding(0); - this.SelectionTabControl.Name = "SelectionTabControl"; - this.SelectionTabControl.SelectedIndex = 0; - this.SelectionTabControl.Size = new System.Drawing.Size(205, 511); - this.SelectionTabControl.TabIndex = 28; - // - // SelectionEntityTabPage - // - this.SelectionEntityTabPage.Controls.Add(this.SelEntityPropertyGrid); - this.SelectionEntityTabPage.Location = new System.Drawing.Point(4, 22); - this.SelectionEntityTabPage.Name = "SelectionEntityTabPage"; - this.SelectionEntityTabPage.Padding = new System.Windows.Forms.Padding(3); - this.SelectionEntityTabPage.Size = new System.Drawing.Size(197, 485); - this.SelectionEntityTabPage.TabIndex = 0; - this.SelectionEntityTabPage.Text = "Entity"; - this.SelectionEntityTabPage.UseVisualStyleBackColor = true; - // - // SelEntityPropertyGrid - // - this.SelEntityPropertyGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelEntityPropertyGrid.HelpVisible = false; - this.SelEntityPropertyGrid.Location = new System.Drawing.Point(0, 6); - this.SelEntityPropertyGrid.Name = "SelEntityPropertyGrid"; - this.SelEntityPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; - this.SelEntityPropertyGrid.ReadOnly = true; - this.SelEntityPropertyGrid.Size = new System.Drawing.Size(197, 476); - this.SelEntityPropertyGrid.TabIndex = 35; - this.SelEntityPropertyGrid.ToolbarVisible = false; - // - // SelectionArchetypeTabPage - // - this.SelectionArchetypeTabPage.Controls.Add(this.SelArchetypePropertyGrid); - this.SelectionArchetypeTabPage.Location = new System.Drawing.Point(4, 22); - this.SelectionArchetypeTabPage.Name = "SelectionArchetypeTabPage"; - this.SelectionArchetypeTabPage.Padding = new System.Windows.Forms.Padding(3); - this.SelectionArchetypeTabPage.Size = new System.Drawing.Size(197, 485); - this.SelectionArchetypeTabPage.TabIndex = 1; - this.SelectionArchetypeTabPage.Text = "Archetype"; - this.SelectionArchetypeTabPage.UseVisualStyleBackColor = true; - // - // SelArchetypePropertyGrid - // - this.SelArchetypePropertyGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelArchetypePropertyGrid.HelpVisible = false; - this.SelArchetypePropertyGrid.Location = new System.Drawing.Point(0, 6); - this.SelArchetypePropertyGrid.Name = "SelArchetypePropertyGrid"; - this.SelArchetypePropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; - this.SelArchetypePropertyGrid.ReadOnly = true; - this.SelArchetypePropertyGrid.Size = new System.Drawing.Size(197, 476); - this.SelArchetypePropertyGrid.TabIndex = 36; - this.SelArchetypePropertyGrid.ToolbarVisible = false; - // - // SelectionDrawableTabPage - // - this.SelectionDrawableTabPage.Controls.Add(this.tabControl3); - this.SelectionDrawableTabPage.Location = new System.Drawing.Point(4, 22); - this.SelectionDrawableTabPage.Margin = new System.Windows.Forms.Padding(0); - this.SelectionDrawableTabPage.Name = "SelectionDrawableTabPage"; - this.SelectionDrawableTabPage.Size = new System.Drawing.Size(197, 485); - this.SelectionDrawableTabPage.TabIndex = 2; - this.SelectionDrawableTabPage.Text = "Drawable"; - this.SelectionDrawableTabPage.UseVisualStyleBackColor = true; - // - // tabControl3 - // - this.tabControl3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControl3.Controls.Add(this.tabPage11); - this.tabControl3.Controls.Add(this.tabPage12); - this.tabControl3.Controls.Add(this.tabPage13); - this.tabControl3.Location = new System.Drawing.Point(-4, 7); - this.tabControl3.Name = "tabControl3"; - this.tabControl3.SelectedIndex = 0; - this.tabControl3.Size = new System.Drawing.Size(205, 478); - this.tabControl3.TabIndex = 28; - // - // tabPage11 - // - this.tabPage11.Controls.Add(this.SelDrawablePropertyGrid); - this.tabPage11.Location = new System.Drawing.Point(4, 22); - this.tabPage11.Margin = new System.Windows.Forms.Padding(0); - this.tabPage11.Name = "tabPage11"; - this.tabPage11.Size = new System.Drawing.Size(197, 452); - this.tabPage11.TabIndex = 0; - this.tabPage11.Text = "Info"; - this.tabPage11.UseVisualStyleBackColor = true; - // - // SelDrawablePropertyGrid - // - this.SelDrawablePropertyGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelDrawablePropertyGrid.HelpVisible = false; - this.SelDrawablePropertyGrid.Location = new System.Drawing.Point(0, 0); - this.SelDrawablePropertyGrid.Name = "SelDrawablePropertyGrid"; - this.SelDrawablePropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; - this.SelDrawablePropertyGrid.ReadOnly = true; - this.SelDrawablePropertyGrid.Size = new System.Drawing.Size(197, 452); - this.SelDrawablePropertyGrid.TabIndex = 37; - this.SelDrawablePropertyGrid.ToolbarVisible = false; - // - // tabPage12 - // - this.tabPage12.Controls.Add(this.SelDrawableModelsTreeView); - this.tabPage12.Location = new System.Drawing.Point(4, 22); - this.tabPage12.Name = "tabPage12"; - this.tabPage12.Padding = new System.Windows.Forms.Padding(3); - this.tabPage12.Size = new System.Drawing.Size(197, 452); - this.tabPage12.TabIndex = 1; - this.tabPage12.Text = "Models"; - this.tabPage12.UseVisualStyleBackColor = true; - // - // SelDrawableModelsTreeView - // - this.SelDrawableModelsTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelDrawableModelsTreeView.CheckBoxes = true; - this.SelDrawableModelsTreeView.Location = new System.Drawing.Point(0, 0); - this.SelDrawableModelsTreeView.Name = "SelDrawableModelsTreeView"; - this.SelDrawableModelsTreeView.ShowRootLines = false; - this.SelDrawableModelsTreeView.Size = new System.Drawing.Size(197, 452); - this.SelDrawableModelsTreeView.TabIndex = 39; - this.SelDrawableModelsTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.SelDrawableModelsTreeView_AfterCheck); - this.SelDrawableModelsTreeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.SelDrawableModelsTreeView_NodeMouseDoubleClick); - this.SelDrawableModelsTreeView.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.SelDrawableModelsTreeView_KeyPress); - // - // tabPage13 - // - this.tabPage13.Controls.Add(this.SelDrawableTexturesTreeView); - this.tabPage13.Location = new System.Drawing.Point(4, 22); - this.tabPage13.Name = "tabPage13"; - this.tabPage13.Size = new System.Drawing.Size(197, 452); - this.tabPage13.TabIndex = 2; - this.tabPage13.Text = "Textures"; - this.tabPage13.UseVisualStyleBackColor = true; - // - // SelDrawableTexturesTreeView - // - this.SelDrawableTexturesTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelDrawableTexturesTreeView.Location = new System.Drawing.Point(0, 0); - this.SelDrawableTexturesTreeView.Name = "SelDrawableTexturesTreeView"; - this.SelDrawableTexturesTreeView.ShowRootLines = false; - this.SelDrawableTexturesTreeView.Size = new System.Drawing.Size(197, 452); - this.SelDrawableTexturesTreeView.TabIndex = 40; - // - // SelectionExtensionTabPage - // - this.SelectionExtensionTabPage.Controls.Add(this.SelExtensionPropertyGrid); - this.SelectionExtensionTabPage.Location = new System.Drawing.Point(4, 22); - this.SelectionExtensionTabPage.Name = "SelectionExtensionTabPage"; - this.SelectionExtensionTabPage.Size = new System.Drawing.Size(197, 485); - this.SelectionExtensionTabPage.TabIndex = 3; - this.SelectionExtensionTabPage.Text = "Ext"; - this.SelectionExtensionTabPage.UseVisualStyleBackColor = true; - // - // SelExtensionPropertyGrid - // - this.SelExtensionPropertyGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelExtensionPropertyGrid.HelpVisible = false; - this.SelExtensionPropertyGrid.Location = new System.Drawing.Point(0, 6); - this.SelExtensionPropertyGrid.Name = "SelExtensionPropertyGrid"; - this.SelExtensionPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; - this.SelExtensionPropertyGrid.ReadOnly = true; - this.SelExtensionPropertyGrid.Size = new System.Drawing.Size(197, 476); - this.SelExtensionPropertyGrid.TabIndex = 36; - this.SelExtensionPropertyGrid.ToolbarVisible = false; - // - // MouseSelectCheckBox - // - this.MouseSelectCheckBox.AutoSize = true; - this.MouseSelectCheckBox.Location = new System.Drawing.Point(8, 7); - this.MouseSelectCheckBox.Name = "MouseSelectCheckBox"; - this.MouseSelectCheckBox.Size = new System.Drawing.Size(143, 17); - this.MouseSelectCheckBox.TabIndex = 22; - this.MouseSelectCheckBox.Text = "Mouse select (right click)"; - this.MouseSelectCheckBox.UseVisualStyleBackColor = true; - this.MouseSelectCheckBox.CheckedChanged += new System.EventHandler(this.MouseSelectCheckBox_CheckedChanged); - // - // OptionsTabPage - // - this.OptionsTabPage.Controls.Add(this.OptionsTabControl); - this.OptionsTabPage.Controls.Add(this.StatusBarCheckBox); - this.OptionsTabPage.Controls.Add(this.QuitButton); - this.OptionsTabPage.Controls.Add(this.ReloadSettingsButton); - this.OptionsTabPage.Controls.Add(this.SaveSettingsButton); - this.OptionsTabPage.Controls.Add(this.ReloadShadersButton); - this.OptionsTabPage.Controls.Add(this.ErrorConsoleCheckBox); - this.OptionsTabPage.Location = new System.Drawing.Point(4, 22); - this.OptionsTabPage.Name = "OptionsTabPage"; - this.OptionsTabPage.Size = new System.Drawing.Size(205, 606); - this.OptionsTabPage.TabIndex = 3; - this.OptionsTabPage.Text = "Options"; - this.OptionsTabPage.UseVisualStyleBackColor = true; - // - // OptionsTabControl - // - this.OptionsTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.OptionsTabControl.Controls.Add(this.OptionsGeneralTabPage); - this.OptionsTabControl.Controls.Add(this.OptionsRenderTabPage); - this.OptionsTabControl.Controls.Add(this.OptionsHelpersTabPage); - this.OptionsTabControl.Controls.Add(this.OptionsLightingTabPage); - this.OptionsTabControl.Location = new System.Drawing.Point(0, 3); - this.OptionsTabControl.Name = "OptionsTabControl"; - this.OptionsTabControl.SelectedIndex = 0; - this.OptionsTabControl.Size = new System.Drawing.Size(208, 508); - this.OptionsTabControl.TabIndex = 50; - // - // OptionsGeneralTabPage - // - this.OptionsGeneralTabPage.Controls.Add(this.CarGeneratorsCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.RenderEntitiesCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.AdvancedSettingsButton); - this.OptionsGeneralTabPage.Controls.Add(this.ControlSettingsButton); - this.OptionsGeneralTabPage.Controls.Add(this.MapViewDetailLabel); - this.OptionsGeneralTabPage.Controls.Add(this.label28); - this.OptionsGeneralTabPage.Controls.Add(this.MapViewDetailTrackBar); - this.OptionsGeneralTabPage.Controls.Add(this.CameraModeComboBox); - this.OptionsGeneralTabPage.Controls.Add(this.label24); - this.OptionsGeneralTabPage.Controls.Add(this.WaterQuadsCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.FieldOfViewLabel); - this.OptionsGeneralTabPage.Controls.Add(this.label22); - this.OptionsGeneralTabPage.Controls.Add(this.TimedEntitiesAlwaysOnCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.GrassCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.InteriorsCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.CollisionMeshLayerDrawableCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.CollisionMeshLayer2CheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.CollisionMeshLayer1CheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.label13); - this.OptionsGeneralTabPage.Controls.Add(this.CollisionMeshLayer0CheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.label12); - this.OptionsGeneralTabPage.Controls.Add(this.CollisionMeshRangeTrackBar); - this.OptionsGeneralTabPage.Controls.Add(this.CollisionMeshesCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.FullScreenCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.TimedEntitiesCheckBox); - this.OptionsGeneralTabPage.Controls.Add(this.FieldOfViewTrackBar); - this.OptionsGeneralTabPage.Location = new System.Drawing.Point(4, 22); - this.OptionsGeneralTabPage.Name = "OptionsGeneralTabPage"; - this.OptionsGeneralTabPage.Padding = new System.Windows.Forms.Padding(3); - this.OptionsGeneralTabPage.Size = new System.Drawing.Size(200, 482); - this.OptionsGeneralTabPage.TabIndex = 0; - this.OptionsGeneralTabPage.Text = "General"; - this.OptionsGeneralTabPage.UseVisualStyleBackColor = true; - // - // CarGeneratorsCheckBox - // - this.CarGeneratorsCheckBox.AutoSize = true; - this.CarGeneratorsCheckBox.Location = new System.Drawing.Point(10, 72); - this.CarGeneratorsCheckBox.Name = "CarGeneratorsCheckBox"; - this.CarGeneratorsCheckBox.Size = new System.Drawing.Size(124, 17); - this.CarGeneratorsCheckBox.TabIndex = 31; - this.CarGeneratorsCheckBox.Text = "Show car generators"; - this.CarGeneratorsCheckBox.UseVisualStyleBackColor = true; - this.CarGeneratorsCheckBox.CheckedChanged += new System.EventHandler(this.CarGeneratorsCheckBox_CheckedChanged); - // - // RenderEntitiesCheckBox - // - this.RenderEntitiesCheckBox.AutoSize = true; - this.RenderEntitiesCheckBox.Checked = true; - this.RenderEntitiesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.RenderEntitiesCheckBox.Location = new System.Drawing.Point(10, 30); - this.RenderEntitiesCheckBox.Name = "RenderEntitiesCheckBox"; - this.RenderEntitiesCheckBox.Size = new System.Drawing.Size(89, 17); - this.RenderEntitiesCheckBox.TabIndex = 29; - this.RenderEntitiesCheckBox.Text = "Show entities"; - this.RenderEntitiesCheckBox.UseVisualStyleBackColor = true; - this.RenderEntitiesCheckBox.CheckedChanged += new System.EventHandler(this.RenderEntitiesCheckBox_CheckedChanged); - // - // AdvancedSettingsButton - // - this.AdvancedSettingsButton.Location = new System.Drawing.Point(101, 456); - this.AdvancedSettingsButton.Name = "AdvancedSettingsButton"; - this.AdvancedSettingsButton.Size = new System.Drawing.Size(93, 23); - this.AdvancedSettingsButton.TabIndex = 46; - this.AdvancedSettingsButton.Text = "Advanced..."; - this.AdvancedSettingsButton.UseVisualStyleBackColor = true; - this.AdvancedSettingsButton.Click += new System.EventHandler(this.AdvancedSettingsButton_Click); - // - // ControlSettingsButton - // - this.ControlSettingsButton.Location = new System.Drawing.Point(2, 456); - this.ControlSettingsButton.Name = "ControlSettingsButton"; - this.ControlSettingsButton.Size = new System.Drawing.Size(93, 23); - this.ControlSettingsButton.TabIndex = 45; - this.ControlSettingsButton.Text = "Controls..."; - this.ControlSettingsButton.UseVisualStyleBackColor = true; - this.ControlSettingsButton.Click += new System.EventHandler(this.ControlSettingsButton_Click); - // - // MapViewDetailLabel - // - this.MapViewDetailLabel.AutoSize = true; - this.MapViewDetailLabel.Location = new System.Drawing.Point(94, 391); - this.MapViewDetailLabel.Name = "MapViewDetailLabel"; - this.MapViewDetailLabel.Size = new System.Drawing.Size(22, 13); - this.MapViewDetailLabel.TabIndex = 66; - this.MapViewDetailLabel.Text = "1.0"; - // - // label28 - // - this.label28.AutoSize = true; - this.label28.Location = new System.Drawing.Point(4, 391); - this.label28.Name = "label28"; - this.label28.Size = new System.Drawing.Size(84, 13); - this.label28.TabIndex = 65; - this.label28.Text = "Map view detail:"; - // - // MapViewDetailTrackBar - // - this.MapViewDetailTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.MapViewDetailTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.MapViewDetailTrackBar.Enabled = false; - this.MapViewDetailTrackBar.LargeChange = 1; - this.MapViewDetailTrackBar.Location = new System.Drawing.Point(6, 407); - this.MapViewDetailTrackBar.Maximum = 30; - this.MapViewDetailTrackBar.Minimum = 2; - this.MapViewDetailTrackBar.Name = "MapViewDetailTrackBar"; - this.MapViewDetailTrackBar.Size = new System.Drawing.Size(188, 45); - this.MapViewDetailTrackBar.TabIndex = 44; - this.MapViewDetailTrackBar.TickFrequency = 2; - this.MapViewDetailTrackBar.Value = 10; - this.MapViewDetailTrackBar.Scroll += new System.EventHandler(this.MapViewDetailTrackBar_Scroll); - // - // CameraModeComboBox - // - this.CameraModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CameraModeComboBox.FormattingEnabled = true; - this.CameraModeComboBox.Items.AddRange(new object[] { - "Perspective", - "Orthographic", - "2D Map"}); - this.CameraModeComboBox.Location = new System.Drawing.Point(82, 305); - this.CameraModeComboBox.Name = "CameraModeComboBox"; - this.CameraModeComboBox.Size = new System.Drawing.Size(112, 21); - this.CameraModeComboBox.TabIndex = 42; - this.CameraModeComboBox.SelectedIndexChanged += new System.EventHandler(this.CameraModeComboBox_SelectedIndexChanged); - this.CameraModeComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.CameraModeComboBox_KeyPress); - // - // label24 - // - this.label24.AutoSize = true; - this.label24.Location = new System.Drawing.Point(4, 308); - this.label24.Name = "label24"; - this.label24.Size = new System.Drawing.Size(75, 13); - this.label24.TabIndex = 63; - this.label24.Text = "Camera mode:"; - // - // WaterQuadsCheckBox - // - this.WaterQuadsCheckBox.AutoSize = true; - this.WaterQuadsCheckBox.Checked = true; - this.WaterQuadsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.WaterQuadsCheckBox.Location = new System.Drawing.Point(10, 135); - this.WaterQuadsCheckBox.Name = "WaterQuadsCheckBox"; - this.WaterQuadsCheckBox.Size = new System.Drawing.Size(114, 17); - this.WaterQuadsCheckBox.TabIndex = 35; - this.WaterQuadsCheckBox.Text = "Show water quads"; - this.WaterQuadsCheckBox.UseVisualStyleBackColor = true; - this.WaterQuadsCheckBox.CheckedChanged += new System.EventHandler(this.WaterQuadsCheckBox_CheckedChanged); - // - // FieldOfViewLabel - // - this.FieldOfViewLabel.AutoSize = true; - this.FieldOfViewLabel.Location = new System.Drawing.Point(79, 335); - this.FieldOfViewLabel.Name = "FieldOfViewLabel"; - this.FieldOfViewLabel.Size = new System.Drawing.Size(22, 13); - this.FieldOfViewLabel.TabIndex = 59; - this.FieldOfViewLabel.Text = "1.0"; - // - // label22 - // - this.label22.AutoSize = true; - this.label22.Location = new System.Drawing.Point(4, 335); - this.label22.Name = "label22"; - this.label22.Size = new System.Drawing.Size(69, 13); - this.label22.TabIndex = 58; - this.label22.Text = "Field of view:"; - // - // TimedEntitiesAlwaysOnCheckBox - // - this.TimedEntitiesAlwaysOnCheckBox.AutoSize = true; - this.TimedEntitiesAlwaysOnCheckBox.Location = new System.Drawing.Point(131, 93); - this.TimedEntitiesAlwaysOnCheckBox.Name = "TimedEntitiesAlwaysOnCheckBox"; - this.TimedEntitiesAlwaysOnCheckBox.Size = new System.Drawing.Size(58, 17); - this.TimedEntitiesAlwaysOnCheckBox.TabIndex = 33; - this.TimedEntitiesAlwaysOnCheckBox.Text = "always"; - this.TimedEntitiesAlwaysOnCheckBox.UseVisualStyleBackColor = true; - this.TimedEntitiesAlwaysOnCheckBox.CheckedChanged += new System.EventHandler(this.TimedEntitiesAlwaysOnCheckBox_CheckedChanged); - // - // GrassCheckBox - // - this.GrassCheckBox.AutoSize = true; - this.GrassCheckBox.Checked = true; - this.GrassCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.GrassCheckBox.Location = new System.Drawing.Point(10, 51); - this.GrassCheckBox.Name = "GrassCheckBox"; - this.GrassCheckBox.Size = new System.Drawing.Size(81, 17); - this.GrassCheckBox.TabIndex = 30; - this.GrassCheckBox.Text = "Show grass"; - this.GrassCheckBox.UseVisualStyleBackColor = true; - this.GrassCheckBox.CheckedChanged += new System.EventHandler(this.GrassCheckBox_CheckedChanged); - // - // InteriorsCheckBox - // - this.InteriorsCheckBox.AutoSize = true; - this.InteriorsCheckBox.Checked = true; - this.InteriorsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.InteriorsCheckBox.Location = new System.Drawing.Point(10, 114); - this.InteriorsCheckBox.Name = "InteriorsCheckBox"; - this.InteriorsCheckBox.Size = new System.Drawing.Size(92, 17); - this.InteriorsCheckBox.TabIndex = 34; - this.InteriorsCheckBox.Text = "Show interiors"; - this.InteriorsCheckBox.UseVisualStyleBackColor = true; - this.InteriorsCheckBox.CheckedChanged += new System.EventHandler(this.InteriorsCheckBox_CheckedChanged); - // - // CollisionMeshLayerDrawableCheckBox - // - this.CollisionMeshLayerDrawableCheckBox.AutoSize = true; - this.CollisionMeshLayerDrawableCheckBox.Checked = true; - this.CollisionMeshLayerDrawableCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.CollisionMeshLayerDrawableCheckBox.Location = new System.Drawing.Point(118, 262); - this.CollisionMeshLayerDrawableCheckBox.Name = "CollisionMeshLayerDrawableCheckBox"; - this.CollisionMeshLayerDrawableCheckBox.Size = new System.Drawing.Size(71, 17); - this.CollisionMeshLayerDrawableCheckBox.TabIndex = 41; - this.CollisionMeshLayerDrawableCheckBox.Text = "Drawable"; - this.CollisionMeshLayerDrawableCheckBox.UseVisualStyleBackColor = true; - this.CollisionMeshLayerDrawableCheckBox.CheckedChanged += new System.EventHandler(this.CollisionMeshLayerDrawableCheckBox_CheckedChanged); - // - // CollisionMeshLayer2CheckBox - // - this.CollisionMeshLayer2CheckBox.AutoSize = true; - this.CollisionMeshLayer2CheckBox.Checked = true; - this.CollisionMeshLayer2CheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.CollisionMeshLayer2CheckBox.Location = new System.Drawing.Point(82, 262); - this.CollisionMeshLayer2CheckBox.Name = "CollisionMeshLayer2CheckBox"; - this.CollisionMeshLayer2CheckBox.Size = new System.Drawing.Size(32, 17); - this.CollisionMeshLayer2CheckBox.TabIndex = 40; - this.CollisionMeshLayer2CheckBox.Text = "2"; - this.CollisionMeshLayer2CheckBox.UseVisualStyleBackColor = true; - this.CollisionMeshLayer2CheckBox.CheckedChanged += new System.EventHandler(this.CollisionMeshLayer2CheckBox_CheckedChanged); - // - // CollisionMeshLayer1CheckBox - // - this.CollisionMeshLayer1CheckBox.AutoSize = true; - this.CollisionMeshLayer1CheckBox.Checked = true; - this.CollisionMeshLayer1CheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.CollisionMeshLayer1CheckBox.Location = new System.Drawing.Point(46, 262); - this.CollisionMeshLayer1CheckBox.Name = "CollisionMeshLayer1CheckBox"; - this.CollisionMeshLayer1CheckBox.Size = new System.Drawing.Size(32, 17); - this.CollisionMeshLayer1CheckBox.TabIndex = 39; - this.CollisionMeshLayer1CheckBox.Text = "1"; - this.CollisionMeshLayer1CheckBox.UseVisualStyleBackColor = true; - this.CollisionMeshLayer1CheckBox.CheckedChanged += new System.EventHandler(this.CollisionMeshLayer1CheckBox_CheckedChanged); - // - // label13 - // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(4, 244); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(106, 13); - this.label13.TabIndex = 54; - this.label13.Text = "Collision mesh layers:"; - // - // CollisionMeshLayer0CheckBox - // - this.CollisionMeshLayer0CheckBox.AutoSize = true; - this.CollisionMeshLayer0CheckBox.Checked = true; - this.CollisionMeshLayer0CheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.CollisionMeshLayer0CheckBox.Location = new System.Drawing.Point(10, 262); - this.CollisionMeshLayer0CheckBox.Name = "CollisionMeshLayer0CheckBox"; - this.CollisionMeshLayer0CheckBox.Size = new System.Drawing.Size(32, 17); - this.CollisionMeshLayer0CheckBox.TabIndex = 38; - this.CollisionMeshLayer0CheckBox.Text = "0"; - this.CollisionMeshLayer0CheckBox.UseVisualStyleBackColor = true; - this.CollisionMeshLayer0CheckBox.CheckedChanged += new System.EventHandler(this.CollisionMeshLayer0CheckBox_CheckedChanged); - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(4, 193); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(129, 13); - this.label12.TabIndex = 51; - this.label12.Text = "Collision/nav mesh range:"; - // - // CollisionMeshRangeTrackBar - // - this.CollisionMeshRangeTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CollisionMeshRangeTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.CollisionMeshRangeTrackBar.LargeChange = 1; - this.CollisionMeshRangeTrackBar.Location = new System.Drawing.Point(6, 209); - this.CollisionMeshRangeTrackBar.Maximum = 15; - this.CollisionMeshRangeTrackBar.Minimum = 1; - this.CollisionMeshRangeTrackBar.Name = "CollisionMeshRangeTrackBar"; - this.CollisionMeshRangeTrackBar.Size = new System.Drawing.Size(188, 45); - this.CollisionMeshRangeTrackBar.TabIndex = 37; - this.CollisionMeshRangeTrackBar.Value = 6; - this.CollisionMeshRangeTrackBar.Scroll += new System.EventHandler(this.CollisionMeshRangeTrackBar_Scroll); - // - // CollisionMeshesCheckBox - // - this.CollisionMeshesCheckBox.AutoSize = true; - this.CollisionMeshesCheckBox.Location = new System.Drawing.Point(10, 171); - this.CollisionMeshesCheckBox.Name = "CollisionMeshesCheckBox"; - this.CollisionMeshesCheckBox.Size = new System.Drawing.Size(132, 17); - this.CollisionMeshesCheckBox.TabIndex = 36; - this.CollisionMeshesCheckBox.Text = "Show collision meshes"; - this.CollisionMeshesCheckBox.UseVisualStyleBackColor = true; - this.CollisionMeshesCheckBox.CheckedChanged += new System.EventHandler(this.CollisionMeshesCheckBox_CheckedChanged); - // - // FullScreenCheckBox - // - this.FullScreenCheckBox.AutoSize = true; - this.FullScreenCheckBox.Location = new System.Drawing.Point(10, 9); - this.FullScreenCheckBox.Name = "FullScreenCheckBox"; - this.FullScreenCheckBox.Size = new System.Drawing.Size(173, 17); - this.FullScreenCheckBox.TabIndex = 28; - this.FullScreenCheckBox.Text = "Full screen (borderless window)"; - this.FullScreenCheckBox.UseVisualStyleBackColor = true; - this.FullScreenCheckBox.CheckedChanged += new System.EventHandler(this.FullScreenCheckBox_CheckedChanged); - // - // TimedEntitiesCheckBox - // - this.TimedEntitiesCheckBox.AutoSize = true; - this.TimedEntitiesCheckBox.Checked = true; - this.TimedEntitiesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.TimedEntitiesCheckBox.Location = new System.Drawing.Point(10, 93); - this.TimedEntitiesCheckBox.Name = "TimedEntitiesCheckBox"; - this.TimedEntitiesCheckBox.Size = new System.Drawing.Size(117, 17); - this.TimedEntitiesCheckBox.TabIndex = 32; - this.TimedEntitiesCheckBox.Text = "Show timed entities"; - this.TimedEntitiesCheckBox.UseVisualStyleBackColor = true; - this.TimedEntitiesCheckBox.CheckedChanged += new System.EventHandler(this.TimedEntitiesCheckBox_CheckedChanged); - // - // FieldOfViewTrackBar - // - this.FieldOfViewTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.FieldOfViewTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.FieldOfViewTrackBar.LargeChange = 1; - this.FieldOfViewTrackBar.Location = new System.Drawing.Point(6, 351); - this.FieldOfViewTrackBar.Maximum = 200; - this.FieldOfViewTrackBar.Minimum = 10; - this.FieldOfViewTrackBar.Name = "FieldOfViewTrackBar"; - this.FieldOfViewTrackBar.Size = new System.Drawing.Size(188, 45); - this.FieldOfViewTrackBar.TabIndex = 43; - this.FieldOfViewTrackBar.TickFrequency = 10; - this.FieldOfViewTrackBar.Value = 100; - this.FieldOfViewTrackBar.Scroll += new System.EventHandler(this.FieldOfViewTrackBar_Scroll); - // - // OptionsRenderTabPage - // - this.OptionsRenderTabPage.Controls.Add(this.AntiAliasingValue); - this.OptionsRenderTabPage.Controls.Add(label34); - this.OptionsRenderTabPage.Controls.Add(this.AntiAliasingTrackBar); - this.OptionsRenderTabPage.Controls.Add(this.FarClipUpDown); - this.OptionsRenderTabPage.Controls.Add(this.label32); - this.OptionsRenderTabPage.Controls.Add(this.NearClipUpDown); - this.OptionsRenderTabPage.Controls.Add(this.label31); - this.OptionsRenderTabPage.Controls.Add(this.HDTexturesCheckBox); - this.OptionsRenderTabPage.Controls.Add(this.WireframeCheckBox); - this.OptionsRenderTabPage.Controls.Add(this.RenderModeComboBox); - this.OptionsRenderTabPage.Controls.Add(this.label11); - this.OptionsRenderTabPage.Controls.Add(this.TextureSamplerComboBox); - this.OptionsRenderTabPage.Controls.Add(this.TextureCoordsComboBox); - this.OptionsRenderTabPage.Controls.Add(this.label10); - this.OptionsRenderTabPage.Controls.Add(this.AnisotropicFilteringCheckBox); - this.OptionsRenderTabPage.Controls.Add(this.ProxiesCheckBox); - this.OptionsRenderTabPage.Controls.Add(this.WaitForChildrenCheckBox); - this.OptionsRenderTabPage.Controls.Add(this.label14); - this.OptionsRenderTabPage.Location = new System.Drawing.Point(4, 22); - this.OptionsRenderTabPage.Name = "OptionsRenderTabPage"; - this.OptionsRenderTabPage.Size = new System.Drawing.Size(200, 482); - this.OptionsRenderTabPage.TabIndex = 3; - this.OptionsRenderTabPage.Text = "Render"; - this.OptionsRenderTabPage.UseVisualStyleBackColor = true; + StatusStrip.SuspendLayout(); + ToolsPanel.SuspendLayout(); + ToolsTabControl.SuspendLayout(); + ViewTabPage.SuspendLayout(); + ViewTabControl.SuspendLayout(); + ViewWorldTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)WorldDetailDistTrackBar).BeginInit(); + ((System.ComponentModel.ISupportInitialize)WorldLodDistTrackBar).BeginInit(); + ViewYmapsTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)DetailTrackBar).BeginInit(); + ViewModelTabPage.SuspendLayout(); + MarkersTabPage.SuspendLayout(); + SelectionTabPage.SuspendLayout(); + SelectionTabControl.SuspendLayout(); + SelectionEntityTabPage.SuspendLayout(); + SelectionArchetypeTabPage.SuspendLayout(); + SelectionDrawableTabPage.SuspendLayout(); + tabControl3.SuspendLayout(); + tabPage11.SuspendLayout(); + tabPage12.SuspendLayout(); + tabPage13.SuspendLayout(); + SelectionExtensionTabPage.SuspendLayout(); + OptionsTabPage.SuspendLayout(); + OptionsTabControl.SuspendLayout(); + OptionsGeneralTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)MapViewDetailTrackBar).BeginInit(); + ((System.ComponentModel.ISupportInitialize)CollisionMeshRangeTrackBar).BeginInit(); + ((System.ComponentModel.ISupportInitialize)FieldOfViewTrackBar).BeginInit(); + OptionsRenderTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)AntiAliasingTrackBar).BeginInit(); + ((System.ComponentModel.ISupportInitialize)FarClipUpDown).BeginInit(); + ((System.ComponentModel.ISupportInitialize)NearClipUpDown).BeginInit(); + OptionsHelpersTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)SnapAngleUpDown).BeginInit(); + ((System.ComponentModel.ISupportInitialize)SnapGridSizeUpDown).BeginInit(); + ((System.ComponentModel.ISupportInitialize)BoundsRangeTrackBar).BeginInit(); + OptionsLightingTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)CloudParamTrackBar).BeginInit(); + ((System.ComponentModel.ISupportInitialize)TimeSpeedTrackBar).BeginInit(); + ((System.ComponentModel.ISupportInitialize)TimeOfDayTrackBar).BeginInit(); + ConsolePanel.SuspendLayout(); + SelectedMarkerPanel.SuspendLayout(); + ToolsMenu.SuspendLayout(); + Toolbar.SuspendLayout(); + ToolbarPanel.SuspendLayout(); + SuspendLayout(); // // label34 // label34.AutoSize = true; - label34.Location = new System.Drawing.Point(7, 253); + label34.Location = new System.Drawing.Point(8, 292); + label34.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); label34.Name = "label34"; - label34.Size = new System.Drawing.Size(64, 13); + label34.Size = new System.Drawing.Size(76, 15); label34.TabIndex = 63; label34.Text = "Anti-Aliasing"; // - // AntiAliasingTrackBar - // - this.AntiAliasingTrackBar.LargeChange = 1; - this.AntiAliasingTrackBar.Location = new System.Drawing.Point(10, 269); - this.AntiAliasingTrackBar.Maximum = 8; - this.AntiAliasingTrackBar.Minimum = 1; - this.AntiAliasingTrackBar.Name = "AntiAliasingTrackBar"; - this.AntiAliasingTrackBar.Size = new System.Drawing.Size(184, 45); - this.AntiAliasingTrackBar.TabIndex = 62; - this.AntiAliasingTrackBar.Value = 1; - this.AntiAliasingTrackBar.ValueChanged += new System.EventHandler(this.AntiAliasingTrackBar_ValueChanged); - // - // FarClipUpDown - // - this.FarClipUpDown.Increment = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.FarClipUpDown.Location = new System.Drawing.Point(80, 346); - this.FarClipUpDown.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.FarClipUpDown.Minimum = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.FarClipUpDown.Name = "FarClipUpDown"; - this.FarClipUpDown.Size = new System.Drawing.Size(114, 20); - this.FarClipUpDown.TabIndex = 61; - this.FarClipUpDown.Value = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.FarClipUpDown.ValueChanged += new System.EventHandler(this.FarClipUpDown_ValueChanged); - // - // label32 - // - this.label32.AutoSize = true; - this.label32.Location = new System.Drawing.Point(4, 348); - this.label32.Name = "label32"; - this.label32.Size = new System.Drawing.Size(45, 13); - this.label32.TabIndex = 60; - this.label32.Text = "Far Clip:"; - // - // NearClipUpDown - // - this.NearClipUpDown.DecimalPlaces = 3; - this.NearClipUpDown.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.NearClipUpDown.Location = new System.Drawing.Point(80, 320); - this.NearClipUpDown.Maximum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.NearClipUpDown.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 196608}); - this.NearClipUpDown.Name = "NearClipUpDown"; - this.NearClipUpDown.Size = new System.Drawing.Size(114, 20); - this.NearClipUpDown.TabIndex = 59; - this.NearClipUpDown.Value = new decimal(new int[] { - 1, - 0, - 0, - 131072}); - this.NearClipUpDown.ValueChanged += new System.EventHandler(this.NearClipUpDown_ValueChanged); - // - // label31 - // - this.label31.AutoSize = true; - this.label31.Location = new System.Drawing.Point(4, 322); - this.label31.Name = "label31"; - this.label31.Size = new System.Drawing.Size(53, 13); - this.label31.TabIndex = 58; - this.label31.Text = "Near Clip:"; - // - // HDTexturesCheckBox - // - this.HDTexturesCheckBox.AutoSize = true; - this.HDTexturesCheckBox.Checked = true; - this.HDTexturesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.HDTexturesCheckBox.Location = new System.Drawing.Point(10, 231); - this.HDTexturesCheckBox.Name = "HDTexturesCheckBox"; - this.HDTexturesCheckBox.Size = new System.Drawing.Size(82, 17); - this.HDTexturesCheckBox.TabIndex = 57; - this.HDTexturesCheckBox.Text = "HD textures"; - this.HDTexturesCheckBox.UseVisualStyleBackColor = true; - this.HDTexturesCheckBox.CheckedChanged += new System.EventHandler(this.HDTexturesCheckBox_CheckedChanged); - // - // WireframeCheckBox - // - this.WireframeCheckBox.AutoSize = true; - this.WireframeCheckBox.Location = new System.Drawing.Point(10, 115); - this.WireframeCheckBox.Name = "WireframeCheckBox"; - this.WireframeCheckBox.Size = new System.Drawing.Size(74, 17); - this.WireframeCheckBox.TabIndex = 49; - this.WireframeCheckBox.Text = "Wireframe"; - this.WireframeCheckBox.UseVisualStyleBackColor = true; - this.WireframeCheckBox.CheckedChanged += new System.EventHandler(this.WireframeCheckBox_CheckedChanged); - // - // RenderModeComboBox - // - this.RenderModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.RenderModeComboBox.FormattingEnabled = true; - this.RenderModeComboBox.Items.AddRange(new object[] { - "Default", - "Single texture", - "Vertex normals", - "Vertex tangents", - "Vertex colour 1", - "Vertex colour 2", - "Texture coord 1", - "Texture coord 2", - "Texture coord 3"}); - this.RenderModeComboBox.Location = new System.Drawing.Point(80, 16); - this.RenderModeComboBox.Name = "RenderModeComboBox"; - this.RenderModeComboBox.Size = new System.Drawing.Size(114, 21); - this.RenderModeComboBox.TabIndex = 46; - this.RenderModeComboBox.SelectedIndexChanged += new System.EventHandler(this.RenderModeComboBox_SelectedIndexChanged); - this.RenderModeComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.RenderModeComboBox_KeyPress); - // - // label11 - // - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(4, 46); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(67, 13); - this.label11.TabIndex = 50; - this.label11.Text = "Tex sampler:"; - // - // TextureSamplerComboBox - // - this.TextureSamplerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.TextureSamplerComboBox.Enabled = false; - this.TextureSamplerComboBox.FormattingEnabled = true; - this.TextureSamplerComboBox.Location = new System.Drawing.Point(80, 43); - this.TextureSamplerComboBox.Name = "TextureSamplerComboBox"; - this.TextureSamplerComboBox.Size = new System.Drawing.Size(114, 21); - this.TextureSamplerComboBox.TabIndex = 47; - this.TextureSamplerComboBox.SelectedIndexChanged += new System.EventHandler(this.TextureSamplerComboBox_SelectedIndexChanged); - this.TextureSamplerComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextureSamplerComboBox_KeyPress); - // - // TextureCoordsComboBox - // - this.TextureCoordsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.TextureCoordsComboBox.Enabled = false; - this.TextureCoordsComboBox.FormattingEnabled = true; - this.TextureCoordsComboBox.Items.AddRange(new object[] { - "Texture coord 1", - "Texture coord 2", - "Texture coord 3"}); - this.TextureCoordsComboBox.Location = new System.Drawing.Point(80, 70); - this.TextureCoordsComboBox.Name = "TextureCoordsComboBox"; - this.TextureCoordsComboBox.Size = new System.Drawing.Size(114, 21); - this.TextureCoordsComboBox.TabIndex = 48; - this.TextureCoordsComboBox.SelectedIndexChanged += new System.EventHandler(this.TextureCoordsComboBox_SelectedIndexChanged); - this.TextureCoordsComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextureCoordsComboBox_KeyPress); - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(4, 19); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(74, 13); - this.label10.TabIndex = 48; - this.label10.Text = "Render mode:"; - // - // AnisotropicFilteringCheckBox - // - this.AnisotropicFilteringCheckBox.AutoSize = true; - this.AnisotropicFilteringCheckBox.Checked = true; - this.AnisotropicFilteringCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.AnisotropicFilteringCheckBox.Location = new System.Drawing.Point(10, 138); - this.AnisotropicFilteringCheckBox.Name = "AnisotropicFilteringCheckBox"; - this.AnisotropicFilteringCheckBox.Size = new System.Drawing.Size(114, 17); - this.AnisotropicFilteringCheckBox.TabIndex = 50; - this.AnisotropicFilteringCheckBox.Text = "Anisotropic filtering"; - this.AnisotropicFilteringCheckBox.UseVisualStyleBackColor = true; - this.AnisotropicFilteringCheckBox.CheckedChanged += new System.EventHandler(this.AnisotropicFilteringCheckBox_CheckedChanged); - // - // ProxiesCheckBox - // - this.ProxiesCheckBox.AutoSize = true; - this.ProxiesCheckBox.Location = new System.Drawing.Point(10, 199); - this.ProxiesCheckBox.Name = "ProxiesCheckBox"; - this.ProxiesCheckBox.Size = new System.Drawing.Size(89, 17); - this.ProxiesCheckBox.TabIndex = 52; - this.ProxiesCheckBox.Text = "Show proxies"; - this.ProxiesCheckBox.UseVisualStyleBackColor = true; - this.ProxiesCheckBox.CheckedChanged += new System.EventHandler(this.ProxiesCheckBox_CheckedChanged); - // - // WaitForChildrenCheckBox - // - this.WaitForChildrenCheckBox.AutoSize = true; - this.WaitForChildrenCheckBox.Checked = true; - this.WaitForChildrenCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.WaitForChildrenCheckBox.Location = new System.Drawing.Point(10, 161); - this.WaitForChildrenCheckBox.Name = "WaitForChildrenCheckBox"; - this.WaitForChildrenCheckBox.Size = new System.Drawing.Size(138, 17); - this.WaitForChildrenCheckBox.TabIndex = 51; - this.WaitForChildrenCheckBox.Text = "Wait for children to load"; - this.WaitForChildrenCheckBox.UseVisualStyleBackColor = true; - this.WaitForChildrenCheckBox.CheckedChanged += new System.EventHandler(this.WaitForChildrenCheckBox_CheckedChanged); - // - // label14 - // - this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(4, 73); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(63, 13); - this.label14.TabIndex = 56; - this.label14.Text = "Tex coords:"; - // - // OptionsHelpersTabPage - // - this.OptionsHelpersTabPage.Controls.Add(this.SnapAngleUpDown); - this.OptionsHelpersTabPage.Controls.Add(this.label33); - this.OptionsHelpersTabPage.Controls.Add(this.SnapGridSizeUpDown); - this.OptionsHelpersTabPage.Controls.Add(this.label26); - this.OptionsHelpersTabPage.Controls.Add(this.SkeletonsCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.AudioOuterBoundsCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.PopZonesCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.NavMeshesCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.TrainPathsCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.PathsDepthClipCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.PathBoundsCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.SelectionWidgetCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.MarkerStyleComboBox); - this.OptionsHelpersTabPage.Controls.Add(this.label4); - this.OptionsHelpersTabPage.Controls.Add(this.LocatorStyleComboBox); - this.OptionsHelpersTabPage.Controls.Add(this.label5); - this.OptionsHelpersTabPage.Controls.Add(this.MarkerDepthClipCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.label9); - this.OptionsHelpersTabPage.Controls.Add(this.PathsCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.SelectionBoundsCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.BoundsDepthClipCheckBox); - this.OptionsHelpersTabPage.Controls.Add(this.BoundsRangeTrackBar); - this.OptionsHelpersTabPage.Controls.Add(this.BoundsStyleComboBox); - this.OptionsHelpersTabPage.Controls.Add(this.label8); - this.OptionsHelpersTabPage.Location = new System.Drawing.Point(4, 22); - this.OptionsHelpersTabPage.Name = "OptionsHelpersTabPage"; - this.OptionsHelpersTabPage.Padding = new System.Windows.Forms.Padding(3); - this.OptionsHelpersTabPage.Size = new System.Drawing.Size(200, 482); - this.OptionsHelpersTabPage.TabIndex = 1; - this.OptionsHelpersTabPage.Text = "Helpers"; - this.OptionsHelpersTabPage.UseVisualStyleBackColor = true; - // - // SnapAngleUpDown - // - this.SnapAngleUpDown.DecimalPlaces = 1; - this.SnapAngleUpDown.Location = new System.Drawing.Point(98, 279); - this.SnapAngleUpDown.Maximum = new decimal(new int[] { - 180, - 0, - 0, - 0}); - this.SnapAngleUpDown.Name = "SnapAngleUpDown"; - this.SnapAngleUpDown.Size = new System.Drawing.Size(96, 20); - this.SnapAngleUpDown.TabIndex = 32; - this.SnapAngleUpDown.Value = new decimal(new int[] { - 50, - 0, - 0, - 65536}); - this.SnapAngleUpDown.ValueChanged += new System.EventHandler(this.SnapAngleUpDown_ValueChanged); - // - // label33 - // - this.label33.AutoSize = true; - this.label33.Location = new System.Drawing.Point(4, 281); - this.label33.Name = "label33"; - this.label33.Size = new System.Drawing.Size(91, 13); - this.label33.TabIndex = 31; - this.label33.Text = "Snap angle (deg):"; - // - // SnapGridSizeUpDown - // - this.SnapGridSizeUpDown.DecimalPlaces = 2; - this.SnapGridSizeUpDown.Location = new System.Drawing.Point(98, 253); - this.SnapGridSizeUpDown.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.SnapGridSizeUpDown.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 131072}); - this.SnapGridSizeUpDown.Name = "SnapGridSizeUpDown"; - this.SnapGridSizeUpDown.Size = new System.Drawing.Size(96, 20); - this.SnapGridSizeUpDown.TabIndex = 30; - this.SnapGridSizeUpDown.Value = new decimal(new int[] { - 100, - 0, - 0, - 131072}); - this.SnapGridSizeUpDown.ValueChanged += new System.EventHandler(this.SnapGridSizeUpDown_ValueChanged); - // - // label26 - // - this.label26.AutoSize = true; - this.label26.Location = new System.Drawing.Point(4, 255); - this.label26.Name = "label26"; - this.label26.Size = new System.Drawing.Size(76, 13); - this.label26.TabIndex = 29; - this.label26.Text = "Snap grid size:"; - // - // SkeletonsCheckBox - // - this.SkeletonsCheckBox.AutoSize = true; - this.SkeletonsCheckBox.Location = new System.Drawing.Point(10, 411); - this.SkeletonsCheckBox.Name = "SkeletonsCheckBox"; - this.SkeletonsCheckBox.Size = new System.Drawing.Size(101, 17); - this.SkeletonsCheckBox.TabIndex = 38; - this.SkeletonsCheckBox.Text = "Show skeletons"; - this.SkeletonsCheckBox.UseVisualStyleBackColor = true; - this.SkeletonsCheckBox.CheckedChanged += new System.EventHandler(this.SkeletonsCheckBox_CheckedChanged); - // - // AudioOuterBoundsCheckBox - // - this.AudioOuterBoundsCheckBox.AutoSize = true; - this.AudioOuterBoundsCheckBox.Checked = true; - this.AudioOuterBoundsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.AudioOuterBoundsCheckBox.Location = new System.Drawing.Point(10, 457); - this.AudioOuterBoundsCheckBox.Name = "AudioOuterBoundsCheckBox"; - this.AudioOuterBoundsCheckBox.Size = new System.Drawing.Size(147, 17); - this.AudioOuterBoundsCheckBox.TabIndex = 40; - this.AudioOuterBoundsCheckBox.Text = "Show audio outer bounds"; - this.AudioOuterBoundsCheckBox.UseVisualStyleBackColor = true; - this.AudioOuterBoundsCheckBox.CheckedChanged += new System.EventHandler(this.AudioOuterBoundsCheckBox_CheckedChanged); - // - // PopZonesCheckBox - // - this.PopZonesCheckBox.AutoSize = true; - this.PopZonesCheckBox.Location = new System.Drawing.Point(10, 388); - this.PopZonesCheckBox.Name = "PopZonesCheckBox"; - this.PopZonesCheckBox.Size = new System.Drawing.Size(136, 17); - this.PopZonesCheckBox.TabIndex = 37; - this.PopZonesCheckBox.Text = "Show population zones"; - this.PopZonesCheckBox.UseVisualStyleBackColor = true; - this.PopZonesCheckBox.CheckedChanged += new System.EventHandler(this.PopZonesCheckBox_CheckedChanged); - // - // NavMeshesCheckBox - // - this.NavMeshesCheckBox.AutoSize = true; - this.NavMeshesCheckBox.Location = new System.Drawing.Point(10, 365); - this.NavMeshesCheckBox.Name = "NavMeshesCheckBox"; - this.NavMeshesCheckBox.Size = new System.Drawing.Size(113, 17); - this.NavMeshesCheckBox.TabIndex = 36; - this.NavMeshesCheckBox.Text = "Show nav meshes"; - this.NavMeshesCheckBox.UseVisualStyleBackColor = true; - this.NavMeshesCheckBox.CheckedChanged += new System.EventHandler(this.NavMeshesCheckBox_CheckedChanged); - // - // TrainPathsCheckBox - // - this.TrainPathsCheckBox.AutoSize = true; - this.TrainPathsCheckBox.Location = new System.Drawing.Point(10, 342); - this.TrainPathsCheckBox.Name = "TrainPathsCheckBox"; - this.TrainPathsCheckBox.Size = new System.Drawing.Size(105, 17); - this.TrainPathsCheckBox.TabIndex = 35; - this.TrainPathsCheckBox.Text = "Show train paths"; - this.TrainPathsCheckBox.UseVisualStyleBackColor = true; - this.TrainPathsCheckBox.CheckedChanged += new System.EventHandler(this.TrainPathsCheckBox_CheckedChanged); - // - // PathsDepthClipCheckBox - // - this.PathsDepthClipCheckBox.AutoSize = true; - this.PathsDepthClipCheckBox.Checked = true; - this.PathsDepthClipCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.PathsDepthClipCheckBox.Location = new System.Drawing.Point(10, 434); - this.PathsDepthClipCheckBox.Name = "PathsDepthClipCheckBox"; - this.PathsDepthClipCheckBox.Size = new System.Drawing.Size(102, 17); - this.PathsDepthClipCheckBox.TabIndex = 39; - this.PathsDepthClipCheckBox.Text = "Paths depth clip"; - this.PathsDepthClipCheckBox.UseVisualStyleBackColor = true; - this.PathsDepthClipCheckBox.CheckedChanged += new System.EventHandler(this.PathsDepthClipCheckBox_CheckedChanged); - // - // PathBoundsCheckBox - // - this.PathBoundsCheckBox.AutoSize = true; - this.PathBoundsCheckBox.Checked = true; - this.PathBoundsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.PathBoundsCheckBox.Location = new System.Drawing.Point(98, 319); - this.PathBoundsCheckBox.Name = "PathBoundsCheckBox"; - this.PathBoundsCheckBox.Size = new System.Drawing.Size(86, 17); - this.PathBoundsCheckBox.TabIndex = 34; - this.PathBoundsCheckBox.Text = "Path bounds"; - this.PathBoundsCheckBox.UseVisualStyleBackColor = true; - this.PathBoundsCheckBox.CheckedChanged += new System.EventHandler(this.PathBoundsCheckBox_CheckedChanged); - // - // SelectionWidgetCheckBox - // - this.SelectionWidgetCheckBox.AutoSize = true; - this.SelectionWidgetCheckBox.Checked = true; - this.SelectionWidgetCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.SelectionWidgetCheckBox.Location = new System.Drawing.Point(10, 231); - this.SelectionWidgetCheckBox.Name = "SelectionWidgetCheckBox"; - this.SelectionWidgetCheckBox.Size = new System.Drawing.Size(87, 17); - this.SelectionWidgetCheckBox.TabIndex = 28; - this.SelectionWidgetCheckBox.Text = "Show widget"; - this.SelectionWidgetCheckBox.UseVisualStyleBackColor = true; - this.SelectionWidgetCheckBox.CheckedChanged += new System.EventHandler(this.SelectionWidgetCheckBox_CheckedChanged); - // - // MarkerStyleComboBox - // - this.MarkerStyleComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.MarkerStyleComboBox.FormattingEnabled = true; - this.MarkerStyleComboBox.Location = new System.Drawing.Point(80, 6); - this.MarkerStyleComboBox.Name = "MarkerStyleComboBox"; - this.MarkerStyleComboBox.Size = new System.Drawing.Size(114, 21); - this.MarkerStyleComboBox.TabIndex = 18; - this.MarkerStyleComboBox.SelectedIndexChanged += new System.EventHandler(this.MarkerStyleComboBox_SelectedIndexChanged); - this.MarkerStyleComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.MarkerStyleComboBox_KeyPress); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(4, 9); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(67, 13); - this.label4.TabIndex = 17; - this.label4.Text = "Marker style:"; - // - // LocatorStyleComboBox - // - this.LocatorStyleComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.LocatorStyleComboBox.FormattingEnabled = true; - this.LocatorStyleComboBox.Location = new System.Drawing.Point(80, 33); - this.LocatorStyleComboBox.Name = "LocatorStyleComboBox"; - this.LocatorStyleComboBox.Size = new System.Drawing.Size(114, 21); - this.LocatorStyleComboBox.TabIndex = 20; - this.LocatorStyleComboBox.SelectedIndexChanged += new System.EventHandler(this.LocatorStyleComboBox_SelectedIndexChanged); - this.LocatorStyleComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.LocatorStyleComboBox_KeyPress); - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(4, 36); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(70, 13); - this.label5.TabIndex = 19; - this.label5.Text = "Locator style:"; - // - // MarkerDepthClipCheckBox - // - this.MarkerDepthClipCheckBox.AutoSize = true; - this.MarkerDepthClipCheckBox.Location = new System.Drawing.Point(10, 60); - this.MarkerDepthClipCheckBox.Name = "MarkerDepthClipCheckBox"; - this.MarkerDepthClipCheckBox.Size = new System.Drawing.Size(108, 17); - this.MarkerDepthClipCheckBox.TabIndex = 21; - this.MarkerDepthClipCheckBox.Text = "Marker depth clip"; - this.MarkerDepthClipCheckBox.UseVisualStyleBackColor = true; - this.MarkerDepthClipCheckBox.Visible = false; - this.MarkerDepthClipCheckBox.CheckedChanged += new System.EventHandler(this.MarkerDepthClipCheckBox_CheckedChanged); - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(4, 136); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(76, 13); - this.label9.TabIndex = 25; - this.label9.Text = "Bounds range:"; - // - // PathsCheckBox - // - this.PathsCheckBox.AutoSize = true; - this.PathsCheckBox.Location = new System.Drawing.Point(10, 319); - this.PathsCheckBox.Name = "PathsCheckBox"; - this.PathsCheckBox.Size = new System.Drawing.Size(82, 17); - this.PathsCheckBox.TabIndex = 33; - this.PathsCheckBox.Text = "Show paths"; - this.PathsCheckBox.UseVisualStyleBackColor = true; - this.PathsCheckBox.CheckedChanged += new System.EventHandler(this.PathsCheckBox_CheckedChanged); - // - // SelectionBoundsCheckBox - // - this.SelectionBoundsCheckBox.AutoSize = true; - this.SelectionBoundsCheckBox.Checked = true; - this.SelectionBoundsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.SelectionBoundsCheckBox.Location = new System.Drawing.Point(10, 194); - this.SelectionBoundsCheckBox.Name = "SelectionBoundsCheckBox"; - this.SelectionBoundsCheckBox.Size = new System.Drawing.Size(136, 17); - this.SelectionBoundsCheckBox.TabIndex = 27; - this.SelectionBoundsCheckBox.Text = "Show selection bounds"; - this.SelectionBoundsCheckBox.UseVisualStyleBackColor = true; - this.SelectionBoundsCheckBox.CheckedChanged += new System.EventHandler(this.SelectionBoundsCheckBox_CheckedChanged); - // - // BoundsDepthClipCheckBox - // - this.BoundsDepthClipCheckBox.AutoSize = true; - this.BoundsDepthClipCheckBox.Checked = true; - this.BoundsDepthClipCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.BoundsDepthClipCheckBox.Location = new System.Drawing.Point(10, 114); - this.BoundsDepthClipCheckBox.Name = "BoundsDepthClipCheckBox"; - this.BoundsDepthClipCheckBox.Size = new System.Drawing.Size(111, 17); - this.BoundsDepthClipCheckBox.TabIndex = 24; - this.BoundsDepthClipCheckBox.Text = "Bounds depth clip"; - this.BoundsDepthClipCheckBox.UseVisualStyleBackColor = true; - this.BoundsDepthClipCheckBox.CheckedChanged += new System.EventHandler(this.BoundsDepthClipCheckBox_CheckedChanged); - // - // BoundsRangeTrackBar - // - this.BoundsRangeTrackBar.AutoSize = false; - this.BoundsRangeTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.BoundsRangeTrackBar.LargeChange = 10; - this.BoundsRangeTrackBar.Location = new System.Drawing.Point(6, 152); - this.BoundsRangeTrackBar.Maximum = 100; - this.BoundsRangeTrackBar.Minimum = 1; - this.BoundsRangeTrackBar.Name = "BoundsRangeTrackBar"; - this.BoundsRangeTrackBar.Size = new System.Drawing.Size(188, 33); - this.BoundsRangeTrackBar.TabIndex = 26; - this.BoundsRangeTrackBar.TickFrequency = 10; - this.BoundsRangeTrackBar.Value = 100; - this.BoundsRangeTrackBar.Scroll += new System.EventHandler(this.BoundsRangeTrackBar_Scroll); - // - // BoundsStyleComboBox - // - this.BoundsStyleComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.BoundsStyleComboBox.FormattingEnabled = true; - this.BoundsStyleComboBox.Items.AddRange(new object[] { - "None", - "Boxes", - "Spheres"}); - this.BoundsStyleComboBox.Location = new System.Drawing.Point(80, 87); - this.BoundsStyleComboBox.Name = "BoundsStyleComboBox"; - this.BoundsStyleComboBox.Size = new System.Drawing.Size(114, 21); - this.BoundsStyleComboBox.TabIndex = 23; - this.BoundsStyleComboBox.SelectedIndexChanged += new System.EventHandler(this.BoundsStyleComboBox_SelectedIndexChanged); - this.BoundsStyleComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.BoundsStyleComboBox_KeyPress); - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(4, 90); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(70, 13); - this.label8.TabIndex = 22; - this.label8.Text = "Bounds style:"; - // - // OptionsLightingTabPage - // - this.OptionsLightingTabPage.Controls.Add(this.HDLightsCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.DeferredShadingCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.WeatherRegionComboBox); - this.OptionsLightingTabPage.Controls.Add(this.label29); - this.OptionsLightingTabPage.Controls.Add(this.CloudParamTrackBar); - this.OptionsLightingTabPage.Controls.Add(this.CloudParamComboBox); - this.OptionsLightingTabPage.Controls.Add(this.label23); - this.OptionsLightingTabPage.Controls.Add(this.CloudsComboBox); - this.OptionsLightingTabPage.Controls.Add(this.label21); - this.OptionsLightingTabPage.Controls.Add(this.TimeSpeedLabel); - this.OptionsLightingTabPage.Controls.Add(this.label20); - this.OptionsLightingTabPage.Controls.Add(this.TimeSpeedTrackBar); - this.OptionsLightingTabPage.Controls.Add(this.TimeStartStopButton); - this.OptionsLightingTabPage.Controls.Add(this.ArtificialAmbientLightCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.NaturalAmbientLightCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.LODLightsCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.HDRRenderingCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.ControlTimeOfDayCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.TimeOfDayLabel); - this.OptionsLightingTabPage.Controls.Add(this.label19); - this.OptionsLightingTabPage.Controls.Add(this.TimeOfDayTrackBar); - this.OptionsLightingTabPage.Controls.Add(this.WeatherComboBox); - this.OptionsLightingTabPage.Controls.Add(this.label17); - this.OptionsLightingTabPage.Controls.Add(this.ControlLightDirectionCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.SkydomeCheckBox); - this.OptionsLightingTabPage.Controls.Add(this.ShadowsCheckBox); - this.OptionsLightingTabPage.Location = new System.Drawing.Point(4, 22); - this.OptionsLightingTabPage.Name = "OptionsLightingTabPage"; - this.OptionsLightingTabPage.Size = new System.Drawing.Size(200, 482); - this.OptionsLightingTabPage.TabIndex = 2; - this.OptionsLightingTabPage.Text = "Lighting"; - this.OptionsLightingTabPage.UseVisualStyleBackColor = true; - // - // HDLightsCheckBox - // - this.HDLightsCheckBox.AutoSize = true; - this.HDLightsCheckBox.Checked = true; - this.HDLightsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.HDLightsCheckBox.Location = new System.Drawing.Point(10, 93); - this.HDLightsCheckBox.Name = "HDLightsCheckBox"; - this.HDLightsCheckBox.Size = new System.Drawing.Size(69, 17); - this.HDLightsCheckBox.TabIndex = 34; - this.HDLightsCheckBox.Text = "HD lights"; - this.HDLightsCheckBox.UseVisualStyleBackColor = true; - this.HDLightsCheckBox.CheckedChanged += new System.EventHandler(this.HDLightsCheckBox_CheckedChanged); - // - // DeferredShadingCheckBox - // - this.DeferredShadingCheckBox.AutoSize = true; - this.DeferredShadingCheckBox.Checked = true; - this.DeferredShadingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.DeferredShadingCheckBox.Location = new System.Drawing.Point(10, 5); - this.DeferredShadingCheckBox.Name = "DeferredShadingCheckBox"; - this.DeferredShadingCheckBox.Size = new System.Drawing.Size(107, 17); - this.DeferredShadingCheckBox.TabIndex = 30; - this.DeferredShadingCheckBox.Text = "Deferred shading"; - this.DeferredShadingCheckBox.UseVisualStyleBackColor = true; - this.DeferredShadingCheckBox.CheckedChanged += new System.EventHandler(this.DeferredShadingCheckBox_CheckedChanged); - // - // WeatherRegionComboBox - // - this.WeatherRegionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.WeatherRegionComboBox.FormattingEnabled = true; - this.WeatherRegionComboBox.Items.AddRange(new object[] { - "GLOBAL", - "URBAN"}); - this.WeatherRegionComboBox.Location = new System.Drawing.Point(61, 355); - this.WeatherRegionComboBox.Name = "WeatherRegionComboBox"; - this.WeatherRegionComboBox.Size = new System.Drawing.Size(133, 21); - this.WeatherRegionComboBox.TabIndex = 50; - this.WeatherRegionComboBox.SelectedIndexChanged += new System.EventHandler(this.WeatherRegionComboBox_SelectedIndexChanged); - this.WeatherRegionComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.WeatherRegionComboBox_KeyPress); - // - // label29 - // - this.label29.AutoSize = true; - this.label29.Location = new System.Drawing.Point(4, 358); - this.label29.Name = "label29"; - this.label29.Size = new System.Drawing.Size(44, 13); - this.label29.TabIndex = 49; - this.label29.Text = "Region:"; - // - // CloudParamTrackBar - // - this.CloudParamTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.CloudParamTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.CloudParamTrackBar.LargeChange = 10; - this.CloudParamTrackBar.Location = new System.Drawing.Point(6, 436); - this.CloudParamTrackBar.Maximum = 200; - this.CloudParamTrackBar.Name = "CloudParamTrackBar"; - this.CloudParamTrackBar.Size = new System.Drawing.Size(188, 45); - this.CloudParamTrackBar.TabIndex = 55; - this.CloudParamTrackBar.TickFrequency = 10; - this.CloudParamTrackBar.Value = 100; - this.CloudParamTrackBar.Scroll += new System.EventHandler(this.CloudParamTrackBar_Scroll); - // - // CloudParamComboBox - // - this.CloudParamComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CloudParamComboBox.FormattingEnabled = true; - this.CloudParamComboBox.Items.AddRange(new object[] { - ""}); - this.CloudParamComboBox.Location = new System.Drawing.Point(78, 409); - this.CloudParamComboBox.Name = "CloudParamComboBox"; - this.CloudParamComboBox.Size = new System.Drawing.Size(116, 21); - this.CloudParamComboBox.TabIndex = 54; - this.CloudParamComboBox.SelectedIndexChanged += new System.EventHandler(this.CloudParamComboBox_SelectedIndexChanged); - this.CloudParamComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.CloudParamComboBox_KeyPress); - // - // label23 - // - this.label23.AutoSize = true; - this.label23.Location = new System.Drawing.Point(4, 412); - this.label23.Name = "label23"; - this.label23.Size = new System.Drawing.Size(69, 13); - this.label23.TabIndex = 53; - this.label23.Text = "Cloud param:"; - // - // CloudsComboBox - // - this.CloudsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.CloudsComboBox.FormattingEnabled = true; - this.CloudsComboBox.Items.AddRange(new object[] { - ""}); - this.CloudsComboBox.Location = new System.Drawing.Point(61, 382); - this.CloudsComboBox.Name = "CloudsComboBox"; - this.CloudsComboBox.Size = new System.Drawing.Size(133, 21); - this.CloudsComboBox.TabIndex = 52; - this.CloudsComboBox.SelectedIndexChanged += new System.EventHandler(this.CloudsComboBox_SelectedIndexChanged); - this.CloudsComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.CloudsComboBox_KeyPress); - // - // label21 - // - this.label21.AutoSize = true; - this.label21.Location = new System.Drawing.Point(4, 385); - this.label21.Name = "label21"; - this.label21.Size = new System.Drawing.Size(42, 13); - this.label21.TabIndex = 51; - this.label21.Text = "Clouds:"; - // - // TimeSpeedLabel - // - this.TimeSpeedLabel.AutoSize = true; - this.TimeSpeedLabel.Location = new System.Drawing.Point(78, 263); - this.TimeSpeedLabel.Name = "TimeSpeedLabel"; - this.TimeSpeedLabel.Size = new System.Drawing.Size(63, 13); - this.TimeSpeedLabel.TabIndex = 44; - this.TimeSpeedLabel.Text = "0.5 min/sec"; - // - // label20 - // - this.label20.AutoSize = true; - this.label20.Location = new System.Drawing.Point(3, 263); - this.label20.Name = "label20"; - this.label20.Size = new System.Drawing.Size(65, 13); - this.label20.TabIndex = 43; - this.label20.Text = "Time speed:"; - // - // TimeSpeedTrackBar - // - this.TimeSpeedTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TimeSpeedTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.TimeSpeedTrackBar.Location = new System.Drawing.Point(61, 279); - this.TimeSpeedTrackBar.Maximum = 100; - this.TimeSpeedTrackBar.Minimum = 40; - this.TimeSpeedTrackBar.Name = "TimeSpeedTrackBar"; - this.TimeSpeedTrackBar.Size = new System.Drawing.Size(133, 45); - this.TimeSpeedTrackBar.TabIndex = 46; - this.TimeSpeedTrackBar.TickFrequency = 5; - this.TimeSpeedTrackBar.Value = 50; - this.TimeSpeedTrackBar.Scroll += new System.EventHandler(this.TimeSpeedTrackBar_Scroll); - // - // TimeStartStopButton - // - this.TimeStartStopButton.Location = new System.Drawing.Point(10, 279); - this.TimeStartStopButton.Name = "TimeStartStopButton"; - this.TimeStartStopButton.Size = new System.Drawing.Size(45, 23); - this.TimeStartStopButton.TabIndex = 45; - this.TimeStartStopButton.Text = "Start"; - this.TimeStartStopButton.UseVisualStyleBackColor = true; - this.TimeStartStopButton.Click += new System.EventHandler(this.TimeStartStopButton_Click); - // - // ArtificialAmbientLightCheckBox - // - this.ArtificialAmbientLightCheckBox.AutoSize = true; - this.ArtificialAmbientLightCheckBox.Checked = true; - this.ArtificialAmbientLightCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.ArtificialAmbientLightCheckBox.Location = new System.Drawing.Point(10, 137); - this.ArtificialAmbientLightCheckBox.Name = "ArtificialAmbientLightCheckBox"; - this.ArtificialAmbientLightCheckBox.Size = new System.Drawing.Size(124, 17); - this.ArtificialAmbientLightCheckBox.TabIndex = 37; - this.ArtificialAmbientLightCheckBox.Text = "Artificial ambient light"; - this.ArtificialAmbientLightCheckBox.UseVisualStyleBackColor = true; - this.ArtificialAmbientLightCheckBox.CheckedChanged += new System.EventHandler(this.ArtificialAmbientLightCheckBox_CheckedChanged); - // - // NaturalAmbientLightCheckBox - // - this.NaturalAmbientLightCheckBox.AutoSize = true; - this.NaturalAmbientLightCheckBox.Checked = true; - this.NaturalAmbientLightCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.NaturalAmbientLightCheckBox.Location = new System.Drawing.Point(10, 115); - this.NaturalAmbientLightCheckBox.Name = "NaturalAmbientLightCheckBox"; - this.NaturalAmbientLightCheckBox.Size = new System.Drawing.Size(122, 17); - this.NaturalAmbientLightCheckBox.TabIndex = 36; - this.NaturalAmbientLightCheckBox.Text = "Natural ambient light"; - this.NaturalAmbientLightCheckBox.UseVisualStyleBackColor = true; - this.NaturalAmbientLightCheckBox.CheckedChanged += new System.EventHandler(this.NaturalAmbientLightCheckBox_CheckedChanged); - // - // LODLightsCheckBox - // - this.LODLightsCheckBox.AutoSize = true; - this.LODLightsCheckBox.Checked = true; - this.LODLightsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.LODLightsCheckBox.Location = new System.Drawing.Point(89, 93); - this.LODLightsCheckBox.Name = "LODLightsCheckBox"; - this.LODLightsCheckBox.Size = new System.Drawing.Size(75, 17); - this.LODLightsCheckBox.TabIndex = 35; - this.LODLightsCheckBox.Text = "LOD lights"; - this.LODLightsCheckBox.UseVisualStyleBackColor = true; - this.LODLightsCheckBox.CheckedChanged += new System.EventHandler(this.LODLightsCheckBox_CheckedChanged); - // - // HDRRenderingCheckBox - // - this.HDRRenderingCheckBox.AutoSize = true; - this.HDRRenderingCheckBox.Checked = true; - this.HDRRenderingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.HDRRenderingCheckBox.Location = new System.Drawing.Point(10, 27); - this.HDRRenderingCheckBox.Name = "HDRRenderingCheckBox"; - this.HDRRenderingCheckBox.Size = new System.Drawing.Size(97, 17); - this.HDRRenderingCheckBox.TabIndex = 31; - this.HDRRenderingCheckBox.Text = "HDR rendering"; - this.HDRRenderingCheckBox.UseVisualStyleBackColor = true; - this.HDRRenderingCheckBox.CheckedChanged += new System.EventHandler(this.HDRRenderingCheckBox_CheckedChanged); - // - // ControlTimeOfDayCheckBox - // - this.ControlTimeOfDayCheckBox.AutoSize = true; - this.ControlTimeOfDayCheckBox.Checked = true; - this.ControlTimeOfDayCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.ControlTimeOfDayCheckBox.Location = new System.Drawing.Point(10, 181); - this.ControlTimeOfDayCheckBox.Name = "ControlTimeOfDayCheckBox"; - this.ControlTimeOfDayCheckBox.Size = new System.Drawing.Size(166, 17); - this.ControlTimeOfDayCheckBox.TabIndex = 39; - this.ControlTimeOfDayCheckBox.Text = "Control time of day (right-drag)"; - this.ControlTimeOfDayCheckBox.UseVisualStyleBackColor = true; - this.ControlTimeOfDayCheckBox.CheckedChanged += new System.EventHandler(this.ControlTimeOfDayCheckBox_CheckedChanged); - // - // TimeOfDayLabel - // - this.TimeOfDayLabel.AutoSize = true; - this.TimeOfDayLabel.Location = new System.Drawing.Point(75, 208); - this.TimeOfDayLabel.Name = "TimeOfDayLabel"; - this.TimeOfDayLabel.Size = new System.Drawing.Size(34, 13); - this.TimeOfDayLabel.TabIndex = 41; - this.TimeOfDayLabel.Text = "12:00"; - // - // label19 - // - this.label19.AutoSize = true; - this.label19.Location = new System.Drawing.Point(4, 208); - this.label19.Name = "label19"; - this.label19.Size = new System.Drawing.Size(65, 13); - this.label19.TabIndex = 40; - this.label19.Text = "Time of day:"; - // - // TimeOfDayTrackBar - // - this.TimeOfDayTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TimeOfDayTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.TimeOfDayTrackBar.LargeChange = 60; - this.TimeOfDayTrackBar.Location = new System.Drawing.Point(6, 224); - this.TimeOfDayTrackBar.Maximum = 1440; - this.TimeOfDayTrackBar.Name = "TimeOfDayTrackBar"; - this.TimeOfDayTrackBar.Size = new System.Drawing.Size(188, 45); - this.TimeOfDayTrackBar.TabIndex = 42; - this.TimeOfDayTrackBar.TickFrequency = 60; - this.TimeOfDayTrackBar.Value = 720; - this.TimeOfDayTrackBar.Scroll += new System.EventHandler(this.TimeOfDayTrackBar_Scroll); - // - // WeatherComboBox - // - this.WeatherComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.WeatherComboBox.FormattingEnabled = true; - this.WeatherComboBox.Items.AddRange(new object[] { - ""}); - this.WeatherComboBox.Location = new System.Drawing.Point(61, 328); - this.WeatherComboBox.Name = "WeatherComboBox"; - this.WeatherComboBox.Size = new System.Drawing.Size(133, 21); - this.WeatherComboBox.TabIndex = 48; - this.WeatherComboBox.SelectedIndexChanged += new System.EventHandler(this.WeatherComboBox_SelectedIndexChanged); - this.WeatherComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.WeatherComboBox_KeyPress); - // - // label17 - // - this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(4, 331); - this.label17.Name = "label17"; - this.label17.Size = new System.Drawing.Size(51, 13); - this.label17.TabIndex = 47; - this.label17.Text = "Weather:"; - // - // ControlLightDirectionCheckBox - // - this.ControlLightDirectionCheckBox.AutoSize = true; - this.ControlLightDirectionCheckBox.Location = new System.Drawing.Point(10, 159); - this.ControlLightDirectionCheckBox.Name = "ControlLightDirectionCheckBox"; - this.ControlLightDirectionCheckBox.Size = new System.Drawing.Size(177, 17); - this.ControlLightDirectionCheckBox.TabIndex = 38; - this.ControlLightDirectionCheckBox.Text = "Control light direction (right-drag)"; - this.ControlLightDirectionCheckBox.UseVisualStyleBackColor = true; - this.ControlLightDirectionCheckBox.CheckedChanged += new System.EventHandler(this.ControlLightDirectionCheckBox_CheckedChanged); - // - // SkydomeCheckBox - // - this.SkydomeCheckBox.AutoSize = true; - this.SkydomeCheckBox.Checked = true; - this.SkydomeCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.SkydomeCheckBox.Location = new System.Drawing.Point(10, 71); - this.SkydomeCheckBox.Name = "SkydomeCheckBox"; - this.SkydomeCheckBox.Size = new System.Drawing.Size(70, 17); - this.SkydomeCheckBox.TabIndex = 33; - this.SkydomeCheckBox.Text = "Skydome"; - this.SkydomeCheckBox.UseVisualStyleBackColor = true; - this.SkydomeCheckBox.CheckedChanged += new System.EventHandler(this.SkydomeCheckbox_CheckedChanged); - // - // ShadowsCheckBox - // - this.ShadowsCheckBox.AutoSize = true; - this.ShadowsCheckBox.Location = new System.Drawing.Point(10, 49); - this.ShadowsCheckBox.Name = "ShadowsCheckBox"; - this.ShadowsCheckBox.Size = new System.Drawing.Size(70, 17); - this.ShadowsCheckBox.TabIndex = 32; - this.ShadowsCheckBox.Text = "Shadows"; - this.ShadowsCheckBox.UseVisualStyleBackColor = true; - this.ShadowsCheckBox.CheckedChanged += new System.EventHandler(this.ShadowsCheckBox_CheckedChanged); - // - // StatusBarCheckBox - // - this.StatusBarCheckBox.AutoSize = true; - this.StatusBarCheckBox.Checked = true; - this.StatusBarCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.StatusBarCheckBox.Location = new System.Drawing.Point(119, 517); - this.StatusBarCheckBox.Name = "StatusBarCheckBox"; - this.StatusBarCheckBox.Size = new System.Drawing.Size(74, 17); - this.StatusBarCheckBox.TabIndex = 145; - this.StatusBarCheckBox.Text = "Status bar"; - this.StatusBarCheckBox.UseVisualStyleBackColor = true; - this.StatusBarCheckBox.CheckedChanged += new System.EventHandler(this.StatusBarCheckBox_CheckedChanged); - // - // QuitButton - // - this.QuitButton.Location = new System.Drawing.Point(105, 569); - this.QuitButton.Name = "QuitButton"; - this.QuitButton.Size = new System.Drawing.Size(93, 23); - this.QuitButton.TabIndex = 149; - this.QuitButton.Text = "Quit"; - this.QuitButton.UseVisualStyleBackColor = true; - this.QuitButton.Click += new System.EventHandler(this.QuitButton_Click); - // - // ReloadSettingsButton - // - this.ReloadSettingsButton.Enabled = false; - this.ReloadSettingsButton.Location = new System.Drawing.Point(6, 540); - this.ReloadSettingsButton.Name = "ReloadSettingsButton"; - this.ReloadSettingsButton.Size = new System.Drawing.Size(93, 23); - this.ReloadSettingsButton.TabIndex = 146; - this.ReloadSettingsButton.Text = "Reload settings"; - this.ReloadSettingsButton.UseVisualStyleBackColor = true; - this.ReloadSettingsButton.Visible = false; - this.ReloadSettingsButton.Click += new System.EventHandler(this.ReloadSettingsButton_Click); - // - // SaveSettingsButton - // - this.SaveSettingsButton.Location = new System.Drawing.Point(105, 540); - this.SaveSettingsButton.Name = "SaveSettingsButton"; - this.SaveSettingsButton.Size = new System.Drawing.Size(93, 23); - this.SaveSettingsButton.TabIndex = 147; - this.SaveSettingsButton.Text = "Save settings"; - this.SaveSettingsButton.UseVisualStyleBackColor = true; - this.SaveSettingsButton.Click += new System.EventHandler(this.SaveSettingsButton_Click); - // - // ReloadShadersButton - // - this.ReloadShadersButton.Location = new System.Drawing.Point(6, 569); - this.ReloadShadersButton.Name = "ReloadShadersButton"; - this.ReloadShadersButton.Size = new System.Drawing.Size(93, 23); - this.ReloadShadersButton.TabIndex = 148; - this.ReloadShadersButton.Text = "Reload shaders"; - this.ReloadShadersButton.UseVisualStyleBackColor = true; - this.ReloadShadersButton.Click += new System.EventHandler(this.ReloadShadersButton_Click); - // - // ErrorConsoleCheckBox - // - this.ErrorConsoleCheckBox.AutoSize = true; - this.ErrorConsoleCheckBox.Location = new System.Drawing.Point(14, 517); - this.ErrorConsoleCheckBox.Name = "ErrorConsoleCheckBox"; - this.ErrorConsoleCheckBox.Size = new System.Drawing.Size(88, 17); - this.ErrorConsoleCheckBox.TabIndex = 144; - this.ErrorConsoleCheckBox.Text = "Error console"; - this.ErrorConsoleCheckBox.UseVisualStyleBackColor = true; - this.ErrorConsoleCheckBox.CheckedChanged += new System.EventHandler(this.ErrorConsoleCheckBox_CheckedChanged); - // - // ToolsPanelHideButton - // - this.ToolsPanelHideButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ToolsPanelHideButton.Location = new System.Drawing.Point(185, 3); - this.ToolsPanelHideButton.Name = "ToolsPanelHideButton"; - this.ToolsPanelHideButton.Size = new System.Drawing.Size(30, 23); - this.ToolsPanelHideButton.TabIndex = 4; - this.ToolsPanelHideButton.Text = ">>"; - this.ToolsPanelHideButton.UseVisualStyleBackColor = true; - this.ToolsPanelHideButton.Click += new System.EventHandler(this.ToolsPanelHideButton_Click); - // - // ToolsPanelShowButton - // - this.ToolsPanelShowButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ToolsPanelShowButton.Location = new System.Drawing.Point(939, 15); - this.ToolsPanelShowButton.Name = "ToolsPanelShowButton"; - this.ToolsPanelShowButton.Size = new System.Drawing.Size(30, 23); - this.ToolsPanelShowButton.TabIndex = 0; - this.ToolsPanelShowButton.Text = "<<"; - this.ToolsPanelShowButton.UseVisualStyleBackColor = true; - this.ToolsPanelShowButton.Click += new System.EventHandler(this.ToolsPanelShowButton_Click); - // - // ConsolePanel - // - this.ConsolePanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ConsolePanel.BackColor = System.Drawing.SystemColors.Control; - this.ConsolePanel.Controls.Add(this.ConsoleTextBox); - this.ConsolePanel.Location = new System.Drawing.Point(12, 576); - this.ConsolePanel.Name = "ConsolePanel"; - this.ConsolePanel.Size = new System.Drawing.Size(736, 101); - this.ConsolePanel.TabIndex = 3; - this.ConsolePanel.Visible = false; - // - // ConsoleTextBox - // - this.ConsoleTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ConsoleTextBox.Location = new System.Drawing.Point(3, 3); - this.ConsoleTextBox.Multiline = true; - this.ConsoleTextBox.Name = "ConsoleTextBox"; - this.ConsoleTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.ConsoleTextBox.Size = new System.Drawing.Size(730, 95); - this.ConsoleTextBox.TabIndex = 0; - // - // StatsUpdateTimer - // - this.StatsUpdateTimer.Enabled = true; - this.StatsUpdateTimer.Interval = 500; - this.StatsUpdateTimer.Tick += new System.EventHandler(this.StatsUpdateTimer_Tick); - // - // SelectedMarkerPanel - // - this.SelectedMarkerPanel.BackColor = System.Drawing.Color.White; - this.SelectedMarkerPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.SelectedMarkerPanel.Controls.Add(this.SelectedMarkerPositionTextBox); - this.SelectedMarkerPanel.Controls.Add(this.SelectedMarkerNameTextBox); - this.SelectedMarkerPanel.Location = new System.Drawing.Point(12, 64); - this.SelectedMarkerPanel.Name = "SelectedMarkerPanel"; - this.SelectedMarkerPanel.Size = new System.Drawing.Size(180, 42); - this.SelectedMarkerPanel.TabIndex = 5; - this.SelectedMarkerPanel.Visible = false; - // - // SelectedMarkerPositionTextBox - // - this.SelectedMarkerPositionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelectedMarkerPositionTextBox.BackColor = System.Drawing.Color.White; - this.SelectedMarkerPositionTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.SelectedMarkerPositionTextBox.Location = new System.Drawing.Point(3, 22); - this.SelectedMarkerPositionTextBox.Name = "SelectedMarkerPositionTextBox"; - this.SelectedMarkerPositionTextBox.ReadOnly = true; - this.SelectedMarkerPositionTextBox.Size = new System.Drawing.Size(172, 13); - this.SelectedMarkerPositionTextBox.TabIndex = 1; - // - // SelectedMarkerNameTextBox - // - this.SelectedMarkerNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelectedMarkerNameTextBox.BackColor = System.Drawing.Color.White; - this.SelectedMarkerNameTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.SelectedMarkerNameTextBox.Location = new System.Drawing.Point(3, 3); - this.SelectedMarkerNameTextBox.Name = "SelectedMarkerNameTextBox"; - this.SelectedMarkerNameTextBox.ReadOnly = true; - this.SelectedMarkerNameTextBox.Size = new System.Drawing.Size(172, 13); - this.SelectedMarkerNameTextBox.TabIndex = 0; - // - // ToolsMenu - // - this.ToolsMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolsMenuRPFBrowser, - this.ToolsMenuRPFExplorer, - this.ToolsMenuSelectionInfo, - this.ToolsMenuProjectWindow, - this.ToolsMenuCutsceneViewer, - this.ToolsMenuAudioExplorer, - this.ToolsMenuWorldSearch, - this.ToolsMenuBinarySearch, - this.ToolsMenuJenkGen, - this.ToolsMenuJenkInd, - this.ToolsMenuExtractScripts, - this.ToolsMenuExtractTextures, - this.ToolsMenuExtractRawFiles, - this.ToolsMenuExtractShaders, - this.ToolsMenuOptions}); - this.ToolsMenu.Name = "ToolsMenu"; - this.ToolsMenu.Size = new System.Drawing.Size(170, 334); - // - // ToolsMenuRPFBrowser - // - this.ToolsMenuRPFBrowser.Name = "ToolsMenuRPFBrowser"; - this.ToolsMenuRPFBrowser.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuRPFBrowser.Text = "RPF Browser..."; - this.ToolsMenuRPFBrowser.Visible = false; - this.ToolsMenuRPFBrowser.Click += new System.EventHandler(this.ToolsMenuRPFBrowser_Click); - // - // ToolsMenuRPFExplorer - // - this.ToolsMenuRPFExplorer.Name = "ToolsMenuRPFExplorer"; - this.ToolsMenuRPFExplorer.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuRPFExplorer.Text = "RPF Explorer..."; - this.ToolsMenuRPFExplorer.Click += new System.EventHandler(this.ToolsMenuRPFExplorer_Click); - // - // ToolsMenuSelectionInfo - // - this.ToolsMenuSelectionInfo.Name = "ToolsMenuSelectionInfo"; - this.ToolsMenuSelectionInfo.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuSelectionInfo.Text = "Selection info..."; - this.ToolsMenuSelectionInfo.Click += new System.EventHandler(this.ToolsMenuSelectionInfo_Click); - // - // ToolsMenuProjectWindow - // - this.ToolsMenuProjectWindow.Enabled = false; - this.ToolsMenuProjectWindow.Name = "ToolsMenuProjectWindow"; - this.ToolsMenuProjectWindow.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuProjectWindow.Text = "Project window..."; - this.ToolsMenuProjectWindow.Click += new System.EventHandler(this.ToolsMenuProjectWindow_Click); - // - // ToolsMenuCutsceneViewer - // - this.ToolsMenuCutsceneViewer.Enabled = false; - this.ToolsMenuCutsceneViewer.Name = "ToolsMenuCutsceneViewer"; - this.ToolsMenuCutsceneViewer.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuCutsceneViewer.Text = "Cutscene viewer..."; - this.ToolsMenuCutsceneViewer.Click += new System.EventHandler(this.ToolsMenuCutsceneViewer_Click); - // - // ToolsMenuAudioExplorer - // - this.ToolsMenuAudioExplorer.Enabled = false; - this.ToolsMenuAudioExplorer.Name = "ToolsMenuAudioExplorer"; - this.ToolsMenuAudioExplorer.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuAudioExplorer.Text = "Audio explorer..."; - this.ToolsMenuAudioExplorer.Click += new System.EventHandler(this.ToolsMenuAudioExplorer_Click); - // - // ToolsMenuWorldSearch - // - this.ToolsMenuWorldSearch.Name = "ToolsMenuWorldSearch"; - this.ToolsMenuWorldSearch.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuWorldSearch.Text = "World search..."; - this.ToolsMenuWorldSearch.Click += new System.EventHandler(this.ToolsMenuWorldSearch_Click); - // - // ToolsMenuBinarySearch - // - this.ToolsMenuBinarySearch.Enabled = false; - this.ToolsMenuBinarySearch.Name = "ToolsMenuBinarySearch"; - this.ToolsMenuBinarySearch.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuBinarySearch.Text = "Binary search..."; - this.ToolsMenuBinarySearch.Click += new System.EventHandler(this.ToolsMenuBinarySearch_Click); - // - // ToolsMenuJenkGen - // - this.ToolsMenuJenkGen.Name = "ToolsMenuJenkGen"; - this.ToolsMenuJenkGen.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuJenkGen.Text = "JenkGen..."; - this.ToolsMenuJenkGen.Click += new System.EventHandler(this.ToolsMenuJenkGen_Click); - // - // ToolsMenuJenkInd - // - this.ToolsMenuJenkInd.Enabled = false; - this.ToolsMenuJenkInd.Name = "ToolsMenuJenkInd"; - this.ToolsMenuJenkInd.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuJenkInd.Text = "JenkInd..."; - this.ToolsMenuJenkInd.Click += new System.EventHandler(this.ToolsMenuJenkInd_Click); - // - // ToolsMenuExtractScripts - // - this.ToolsMenuExtractScripts.Name = "ToolsMenuExtractScripts"; - this.ToolsMenuExtractScripts.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuExtractScripts.Text = "Extract scripts..."; - this.ToolsMenuExtractScripts.Click += new System.EventHandler(this.ToolsMenuExtractScripts_Click); - // - // ToolsMenuExtractTextures - // - this.ToolsMenuExtractTextures.Name = "ToolsMenuExtractTextures"; - this.ToolsMenuExtractTextures.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuExtractTextures.Text = "Extract textures..."; - this.ToolsMenuExtractTextures.Click += new System.EventHandler(this.ToolsMenuExtractTextures_Click); - // - // ToolsMenuExtractRawFiles - // - this.ToolsMenuExtractRawFiles.Name = "ToolsMenuExtractRawFiles"; - this.ToolsMenuExtractRawFiles.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuExtractRawFiles.Text = "Extract raw files..."; - this.ToolsMenuExtractRawFiles.Click += new System.EventHandler(this.ToolsMenuExtractRawFiles_Click); - // - // ToolsMenuExtractShaders - // - this.ToolsMenuExtractShaders.Name = "ToolsMenuExtractShaders"; - this.ToolsMenuExtractShaders.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuExtractShaders.Text = "Extract shaders..."; - this.ToolsMenuExtractShaders.Click += new System.EventHandler(this.ToolsMenuExtractShaders_Click); - // - // ToolsMenuOptions - // - this.ToolsMenuOptions.Name = "ToolsMenuOptions"; - this.ToolsMenuOptions.Size = new System.Drawing.Size(169, 22); - this.ToolsMenuOptions.Text = "Options..."; - this.ToolsMenuOptions.Click += new System.EventHandler(this.ToolsMenuOptions_Click); - // - // Toolbar - // - this.Toolbar.Dock = System.Windows.Forms.DockStyle.None; - this.Toolbar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - this.Toolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarNewButton, - this.ToolbarOpenButton, - this.ToolbarSaveButton, - this.ToolbarSaveAllButton, - this.toolStripSeparator5, - this.ToolbarSelectButton, - this.toolStripSeparator1, - this.ToolbarMoveButton, - this.ToolbarRotateButton, - this.ToolbarScaleButton, - this.ToolbarTransformSpaceButton, - this.ToolbarSnapButton, - this.toolStripSeparator2, - this.ToolbarUndoButton, - this.ToolbarRedoButton, - this.toolStripSeparator3, - this.ToolbarInfoWindowButton, - this.ToolbarProjectWindowButton, - this.toolStripSeparator4, - this.ToolbarAddItemButton, - this.ToolbarDeleteItemButton, - this.toolStripSeparator6, - this.ToolbarCopyButton, - this.ToolbarPasteButton, - this.toolStripSeparator7, - this.ToolbarCameraModeButton}); - this.Toolbar.Location = new System.Drawing.Point(1, 0); - this.Toolbar.Name = "Toolbar"; - this.Toolbar.Size = new System.Drawing.Size(554, 25); - this.Toolbar.TabIndex = 6; - this.Toolbar.Text = "toolStrip1"; - // - // ToolbarNewButton - // - this.ToolbarNewButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarNewButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarNewProjectButton, - this.ToolbarNewYmapButton, - this.ToolbarNewYtypButton, - this.ToolbarNewYbnButton, - this.ToolbarNewYndButton, - this.ToolbarNewTrainsButton, - this.ToolbarNewScenarioButton}); - this.ToolbarNewButton.Enabled = false; - this.ToolbarNewButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarNewButton.Image"))); - this.ToolbarNewButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarNewButton.Name = "ToolbarNewButton"; - this.ToolbarNewButton.Size = new System.Drawing.Size(32, 22); - this.ToolbarNewButton.Text = "New..."; - this.ToolbarNewButton.ToolTipText = "New... (Ctrl+N)"; - this.ToolbarNewButton.ButtonClick += new System.EventHandler(this.ToolbarNewButton_ButtonClick); - // - // ToolbarNewProjectButton - // - this.ToolbarNewProjectButton.Name = "ToolbarNewProjectButton"; - this.ToolbarNewProjectButton.Size = new System.Drawing.Size(167, 22); - this.ToolbarNewProjectButton.Text = "New Project"; - this.ToolbarNewProjectButton.Click += new System.EventHandler(this.ToolbarNewProjectButton_Click); - // - // ToolbarNewYmapButton - // - this.ToolbarNewYmapButton.Name = "ToolbarNewYmapButton"; - this.ToolbarNewYmapButton.Size = new System.Drawing.Size(167, 22); - this.ToolbarNewYmapButton.Text = "New Ymap File"; - this.ToolbarNewYmapButton.Click += new System.EventHandler(this.ToolbarNewYmapButton_Click); - // - // ToolbarNewYtypButton - // - this.ToolbarNewYtypButton.Name = "ToolbarNewYtypButton"; - this.ToolbarNewYtypButton.Size = new System.Drawing.Size(167, 22); - this.ToolbarNewYtypButton.Text = "New Ytyp File"; - this.ToolbarNewYtypButton.Click += new System.EventHandler(this.ToolbarNewYtypButton_Click); - // - // ToolbarNewYbnButton - // - this.ToolbarNewYbnButton.Name = "ToolbarNewYbnButton"; - this.ToolbarNewYbnButton.Size = new System.Drawing.Size(167, 22); - this.ToolbarNewYbnButton.Text = "New Ybn File"; - this.ToolbarNewYbnButton.Click += new System.EventHandler(this.ToolbarNewYbnButton_Click); - // - // ToolbarNewYndButton - // - this.ToolbarNewYndButton.Name = "ToolbarNewYndButton"; - this.ToolbarNewYndButton.Size = new System.Drawing.Size(167, 22); - this.ToolbarNewYndButton.Text = "New Ynd File"; - this.ToolbarNewYndButton.Click += new System.EventHandler(this.ToolbarNewYndButton_Click); - // - // ToolbarNewTrainsButton - // - this.ToolbarNewTrainsButton.Name = "ToolbarNewTrainsButton"; - this.ToolbarNewTrainsButton.Size = new System.Drawing.Size(167, 22); - this.ToolbarNewTrainsButton.Text = "New Trains File"; - this.ToolbarNewTrainsButton.Click += new System.EventHandler(this.ToolbarNewTrainsButton_Click); - // - // ToolbarNewScenarioButton - // - this.ToolbarNewScenarioButton.Name = "ToolbarNewScenarioButton"; - this.ToolbarNewScenarioButton.Size = new System.Drawing.Size(167, 22); - this.ToolbarNewScenarioButton.Text = "New Scenario File"; - this.ToolbarNewScenarioButton.Click += new System.EventHandler(this.ToolbarNewScenarioButton_Click); - // - // ToolbarOpenButton - // - this.ToolbarOpenButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarOpenButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarOpenProjectButton, - this.ToolbarOpenFilesButton, - this.ToolbarOpenFolderButton}); - this.ToolbarOpenButton.Enabled = false; - this.ToolbarOpenButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarOpenButton.Image"))); - this.ToolbarOpenButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarOpenButton.Name = "ToolbarOpenButton"; - this.ToolbarOpenButton.Size = new System.Drawing.Size(32, 22); - this.ToolbarOpenButton.Text = "Open..."; - this.ToolbarOpenButton.ToolTipText = "Open... (Ctrl+O)"; - this.ToolbarOpenButton.ButtonClick += new System.EventHandler(this.ToolbarOpenButton_ButtonClick); - // - // ToolbarOpenProjectButton - // - this.ToolbarOpenProjectButton.Name = "ToolbarOpenProjectButton"; - this.ToolbarOpenProjectButton.Size = new System.Drawing.Size(152, 22); - this.ToolbarOpenProjectButton.Text = "Open Project..."; - this.ToolbarOpenProjectButton.Click += new System.EventHandler(this.ToolbarOpenProjectButton_Click); - // - // ToolbarOpenFilesButton - // - this.ToolbarOpenFilesButton.Name = "ToolbarOpenFilesButton"; - this.ToolbarOpenFilesButton.Size = new System.Drawing.Size(152, 22); - this.ToolbarOpenFilesButton.Text = "Open Files..."; - this.ToolbarOpenFilesButton.Click += new System.EventHandler(this.ToolbarOpenFilesButton_Click); - // - // ToolbarOpenFolderButton - // - this.ToolbarOpenFolderButton.Name = "ToolbarOpenFolderButton"; - this.ToolbarOpenFolderButton.Size = new System.Drawing.Size(152, 22); - this.ToolbarOpenFolderButton.Text = "Open Folder..."; - this.ToolbarOpenFolderButton.Click += new System.EventHandler(this.ToolbarOpenFolderButton_Click); - // - // ToolbarSaveButton - // - this.ToolbarSaveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarSaveButton.Enabled = false; - this.ToolbarSaveButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveButton.Image"))); - this.ToolbarSaveButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarSaveButton.Name = "ToolbarSaveButton"; - this.ToolbarSaveButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarSaveButton.Text = "Save"; - this.ToolbarSaveButton.ToolTipText = "Save (Ctrl+S)"; - this.ToolbarSaveButton.Click += new System.EventHandler(this.ToolbarSaveButton_Click); - // - // ToolbarSaveAllButton - // - this.ToolbarSaveAllButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarSaveAllButton.Enabled = false; - this.ToolbarSaveAllButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveAllButton.Image"))); - this.ToolbarSaveAllButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarSaveAllButton.Name = "ToolbarSaveAllButton"; - this.ToolbarSaveAllButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarSaveAllButton.Text = "Save All"; - this.ToolbarSaveAllButton.ToolTipText = "Save All (Ctrl+Shift+S)"; - this.ToolbarSaveAllButton.Click += new System.EventHandler(this.ToolbarSaveAllButton_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25); - // - // ToolbarSelectButton - // - this.ToolbarSelectButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarSelectButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarSelectEntityButton, - this.ToolbarSelectEntityExtensionButton, - this.ToolbarSelectArchetypeExtensionButton, - this.ToolbarSelectTimeCycleModifierButton, - this.ToolbarSelectCarGeneratorButton, - this.ToolbarSelectGrassButton, - this.ToolbarSelectWaterQuadButton, - this.ToolbarSelectCalmingQuadButton, - this.ToolbarSelectWaveQuadButton, - this.ToolbarSelectCollisionButton, - this.ToolbarSelectNavMeshButton, - this.ToolbarSelectPathButton, - this.ToolbarSelectTrainTrackButton, - this.ToolbarSelectLodLightsButton, - this.ToolbarSelectMloInstanceButton, - this.ToolbarSelectScenarioButton, - this.ToolbarSelectAudioButton, - this.ToolbarSelectOcclusionButton}); - this.ToolbarSelectButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSelectButton.Image"))); - this.ToolbarSelectButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarSelectButton.Name = "ToolbarSelectButton"; - this.ToolbarSelectButton.Size = new System.Drawing.Size(32, 22); - this.ToolbarSelectButton.Text = "Select objects / Exit edit mode"; - this.ToolbarSelectButton.ToolTipText = "Select objects / Exit edit mode (C, Q)"; - this.ToolbarSelectButton.ButtonClick += new System.EventHandler(this.ToolbarSelectButton_ButtonClick); - // - // ToolbarSelectEntityButton - // - this.ToolbarSelectEntityButton.Checked = true; - this.ToolbarSelectEntityButton.CheckState = System.Windows.Forms.CheckState.Checked; - this.ToolbarSelectEntityButton.Name = "ToolbarSelectEntityButton"; - this.ToolbarSelectEntityButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectEntityButton.Text = "Entity"; - this.ToolbarSelectEntityButton.Click += new System.EventHandler(this.ToolbarSelectEntityButton_Click); - // - // ToolbarSelectEntityExtensionButton - // - this.ToolbarSelectEntityExtensionButton.Name = "ToolbarSelectEntityExtensionButton"; - this.ToolbarSelectEntityExtensionButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectEntityExtensionButton.Text = "Entity Extension"; - this.ToolbarSelectEntityExtensionButton.Click += new System.EventHandler(this.ToolbarSelectEntityExtensionButton_Click); - // - // ToolbarSelectArchetypeExtensionButton - // - this.ToolbarSelectArchetypeExtensionButton.Name = "ToolbarSelectArchetypeExtensionButton"; - this.ToolbarSelectArchetypeExtensionButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectArchetypeExtensionButton.Text = "Archetype Extension"; - this.ToolbarSelectArchetypeExtensionButton.Click += new System.EventHandler(this.ToolbarSelectArchetypeExtensionButton_Click); - // - // ToolbarSelectTimeCycleModifierButton - // - this.ToolbarSelectTimeCycleModifierButton.Name = "ToolbarSelectTimeCycleModifierButton"; - this.ToolbarSelectTimeCycleModifierButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectTimeCycleModifierButton.Text = "Time Cycle Modifier"; - this.ToolbarSelectTimeCycleModifierButton.Click += new System.EventHandler(this.ToolbarSelectTimeCycleModifierButton_Click); - // - // ToolbarSelectCarGeneratorButton - // - this.ToolbarSelectCarGeneratorButton.Name = "ToolbarSelectCarGeneratorButton"; - this.ToolbarSelectCarGeneratorButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectCarGeneratorButton.Text = "Car Generator"; - this.ToolbarSelectCarGeneratorButton.Click += new System.EventHandler(this.ToolbarSelectCarGeneratorButton_Click); - // - // ToolbarSelectGrassButton - // - this.ToolbarSelectGrassButton.Name = "ToolbarSelectGrassButton"; - this.ToolbarSelectGrassButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectGrassButton.Text = "Grass"; - this.ToolbarSelectGrassButton.Click += new System.EventHandler(this.ToolbarSelectGrassButton_Click); - // - // ToolbarSelectWaterQuadButton - // - this.ToolbarSelectWaterQuadButton.Name = "ToolbarSelectWaterQuadButton"; - this.ToolbarSelectWaterQuadButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectWaterQuadButton.Text = "Water Quad"; - this.ToolbarSelectWaterQuadButton.Click += new System.EventHandler(this.ToolbarSelectWaterQuadButton_Click); - // - // ToolbarSelectCalmingQuadButton - // - this.ToolbarSelectCalmingQuadButton.Name = "ToolbarSelectCalmingQuadButton"; - this.ToolbarSelectCalmingQuadButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectCalmingQuadButton.Text = "Water Calming Quad"; - this.ToolbarSelectCalmingQuadButton.Click += new System.EventHandler(this.ToolbarSelectCalmingQuadButton_Click); - // - // ToolbarSelectWaveQuadButton - // - this.ToolbarSelectWaveQuadButton.Name = "ToolbarSelectWaveQuadButton"; - this.ToolbarSelectWaveQuadButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectWaveQuadButton.Text = "Water Wave Quad"; - this.ToolbarSelectWaveQuadButton.Click += new System.EventHandler(this.ToolbarSelectWaveQuadButton_Click); - // - // ToolbarSelectCollisionButton - // - this.ToolbarSelectCollisionButton.Name = "ToolbarSelectCollisionButton"; - this.ToolbarSelectCollisionButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectCollisionButton.Text = "Collision"; - this.ToolbarSelectCollisionButton.Click += new System.EventHandler(this.ToolbarSelectCollisionButton_Click); - // - // ToolbarSelectNavMeshButton - // - this.ToolbarSelectNavMeshButton.Name = "ToolbarSelectNavMeshButton"; - this.ToolbarSelectNavMeshButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectNavMeshButton.Text = "Nav Mesh"; - this.ToolbarSelectNavMeshButton.Click += new System.EventHandler(this.ToolbarSelectNavMeshButton_Click); - // - // ToolbarSelectPathButton - // - this.ToolbarSelectPathButton.Name = "ToolbarSelectPathButton"; - this.ToolbarSelectPathButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectPathButton.Text = "Traffic Path"; - this.ToolbarSelectPathButton.Click += new System.EventHandler(this.ToolbarSelectPathButton_Click); - // - // ToolbarSelectTrainTrackButton - // - this.ToolbarSelectTrainTrackButton.Name = "ToolbarSelectTrainTrackButton"; - this.ToolbarSelectTrainTrackButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectTrainTrackButton.Text = "Train Track"; - this.ToolbarSelectTrainTrackButton.Click += new System.EventHandler(this.ToolbarSelectTrainTrackButton_Click); - // - // ToolbarSelectLodLightsButton - // - this.ToolbarSelectLodLightsButton.Name = "ToolbarSelectLodLightsButton"; - this.ToolbarSelectLodLightsButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectLodLightsButton.Text = "Lod Lights"; - this.ToolbarSelectLodLightsButton.Click += new System.EventHandler(this.ToolbarSelectLodLightsButton_Click); - // - // ToolbarSelectMloInstanceButton - // - this.ToolbarSelectMloInstanceButton.Name = "ToolbarSelectMloInstanceButton"; - this.ToolbarSelectMloInstanceButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectMloInstanceButton.Text = "Interior Instance"; - this.ToolbarSelectMloInstanceButton.Click += new System.EventHandler(this.ToolbarSelectMloInstanceButton_Click); - // - // ToolbarSelectScenarioButton - // - this.ToolbarSelectScenarioButton.Name = "ToolbarSelectScenarioButton"; - this.ToolbarSelectScenarioButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectScenarioButton.Text = "Scenario"; - this.ToolbarSelectScenarioButton.Click += new System.EventHandler(this.ToolbarSelectScenarioButton_Click); - // - // ToolbarSelectAudioButton - // - this.ToolbarSelectAudioButton.Name = "ToolbarSelectAudioButton"; - this.ToolbarSelectAudioButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectAudioButton.Text = "Audio"; - this.ToolbarSelectAudioButton.Click += new System.EventHandler(this.ToolbarSelectAudioButton_Click); - // - // ToolbarSelectOcclusionButton - // - this.ToolbarSelectOcclusionButton.Name = "ToolbarSelectOcclusionButton"; - this.ToolbarSelectOcclusionButton.Size = new System.Drawing.Size(185, 22); - this.ToolbarSelectOcclusionButton.Text = "Occlusion"; - this.ToolbarSelectOcclusionButton.Click += new System.EventHandler(this.ToolbarSelectOcclusionButton_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); - // - // ToolbarMoveButton - // - this.ToolbarMoveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarMoveButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarMoveButton.Image"))); - this.ToolbarMoveButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarMoveButton.Name = "ToolbarMoveButton"; - this.ToolbarMoveButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarMoveButton.Text = "Move"; - this.ToolbarMoveButton.ToolTipText = "Move (W)"; - this.ToolbarMoveButton.Click += new System.EventHandler(this.ToolbarMoveButton_Click); - // - // ToolbarRotateButton - // - this.ToolbarRotateButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarRotateButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarRotateButton.Image"))); - this.ToolbarRotateButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarRotateButton.Name = "ToolbarRotateButton"; - this.ToolbarRotateButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarRotateButton.Text = "Rotate"; - this.ToolbarRotateButton.ToolTipText = "Rotate (E)"; - this.ToolbarRotateButton.Click += new System.EventHandler(this.ToolbarRotateButton_Click); - // - // ToolbarScaleButton - // - this.ToolbarScaleButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarScaleButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarScaleButton.Image"))); - this.ToolbarScaleButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarScaleButton.Name = "ToolbarScaleButton"; - this.ToolbarScaleButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarScaleButton.Text = "Scale"; - this.ToolbarScaleButton.ToolTipText = "Scale (R)"; - this.ToolbarScaleButton.Click += new System.EventHandler(this.ToolbarScaleButton_Click); - // - // ToolbarTransformSpaceButton - // - this.ToolbarTransformSpaceButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarTransformSpaceButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarObjectSpaceButton, - this.ToolbarWorldSpaceButton}); - this.ToolbarTransformSpaceButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarTransformSpaceButton.Image"))); - this.ToolbarTransformSpaceButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarTransformSpaceButton.Name = "ToolbarTransformSpaceButton"; - this.ToolbarTransformSpaceButton.Size = new System.Drawing.Size(32, 22); - this.ToolbarTransformSpaceButton.Text = "Toggle transform space"; - this.ToolbarTransformSpaceButton.ButtonClick += new System.EventHandler(this.ToolbarTransformSpaceButton_ButtonClick); - // - // ToolbarObjectSpaceButton - // - this.ToolbarObjectSpaceButton.Checked = true; - this.ToolbarObjectSpaceButton.CheckState = System.Windows.Forms.CheckState.Checked; - this.ToolbarObjectSpaceButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarObjectSpaceButton.Image"))); - this.ToolbarObjectSpaceButton.Name = "ToolbarObjectSpaceButton"; - this.ToolbarObjectSpaceButton.Size = new System.Drawing.Size(142, 22); - this.ToolbarObjectSpaceButton.Text = "Object space"; - this.ToolbarObjectSpaceButton.Click += new System.EventHandler(this.ToolbarObjectSpaceButton_Click); - // - // ToolbarWorldSpaceButton - // - this.ToolbarWorldSpaceButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarWorldSpaceButton.Image"))); - this.ToolbarWorldSpaceButton.Name = "ToolbarWorldSpaceButton"; - this.ToolbarWorldSpaceButton.Size = new System.Drawing.Size(142, 22); - this.ToolbarWorldSpaceButton.Text = "World space"; - this.ToolbarWorldSpaceButton.Click += new System.EventHandler(this.ToolbarWorldSpaceButton_Click); - // - // ToolbarSnapButton - // - this.ToolbarSnapButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarSnapButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarSnapToGroundButton, - this.ToolbarSnapToGridButton, - this.ToolbarSnapToGroundGridButton, - this.ToolbarSnapGridSizeButton, - this.ToolbarRotationSnappingButton}); - this.ToolbarSnapButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSnapButton.Image"))); - this.ToolbarSnapButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarSnapButton.Name = "ToolbarSnapButton"; - this.ToolbarSnapButton.Size = new System.Drawing.Size(32, 22); - this.ToolbarSnapButton.Text = "Snap to Ground"; - this.ToolbarSnapButton.ToolTipText = "Snap to Ground"; - this.ToolbarSnapButton.ButtonClick += new System.EventHandler(this.ToolbarSnapButton_ButtonClick); - // - // ToolbarSnapToGroundButton - // - this.ToolbarSnapToGroundButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSnapToGroundButton.Image"))); - this.ToolbarSnapToGroundButton.Name = "ToolbarSnapToGroundButton"; - this.ToolbarSnapToGroundButton.Size = new System.Drawing.Size(205, 22); - this.ToolbarSnapToGroundButton.Text = "Snap to Ground"; - this.ToolbarSnapToGroundButton.Click += new System.EventHandler(this.ToolbarSnapToGroundButton_Click); - // - // ToolbarSnapToGridButton - // - this.ToolbarSnapToGridButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSnapToGridButton.Image"))); - this.ToolbarSnapToGridButton.Name = "ToolbarSnapToGridButton"; - this.ToolbarSnapToGridButton.Size = new System.Drawing.Size(205, 22); - this.ToolbarSnapToGridButton.Text = "Snap to Grid"; - this.ToolbarSnapToGridButton.Click += new System.EventHandler(this.ToolbarSnapToGridButton_Click); - // - // ToolbarSnapToGroundGridButton - // - this.ToolbarSnapToGroundGridButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSnapToGroundGridButton.Image"))); - this.ToolbarSnapToGroundGridButton.Name = "ToolbarSnapToGroundGridButton"; - this.ToolbarSnapToGroundGridButton.Size = new System.Drawing.Size(205, 22); - this.ToolbarSnapToGroundGridButton.Text = "Snap to Grid and Ground"; - this.ToolbarSnapToGroundGridButton.Click += new System.EventHandler(this.ToolbarSnapToGroundGridButton_Click); - // - // ToolbarSnapGridSizeButton - // - this.ToolbarSnapGridSizeButton.Name = "ToolbarSnapGridSizeButton"; - this.ToolbarSnapGridSizeButton.Size = new System.Drawing.Size(205, 22); - this.ToolbarSnapGridSizeButton.Text = "Grid Size..."; - this.ToolbarSnapGridSizeButton.Click += new System.EventHandler(this.ToolbarSnapGridSizeButton_Click); - // - // ToolbarRotationSnappingButton - // - this.ToolbarRotationSnappingButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarRotationSnappingOffButton, - this.ToolbarRotationSnapping1Button, - this.ToolbarRotationSnapping2Button, - this.ToolbarRotationSnapping5Button, - this.ToolbarRotationSnapping10Button, - this.ToolbarRotationSnapping45Button, - this.ToolbarRotationSnapping90Button, - this.ToolbarRotationSnappingCustomButton}); - this.ToolbarRotationSnappingButton.Name = "ToolbarRotationSnappingButton"; - this.ToolbarRotationSnappingButton.Size = new System.Drawing.Size(205, 22); - this.ToolbarRotationSnappingButton.Text = "Rotation Snapping"; - // - // ToolbarRotationSnappingOffButton - // - this.ToolbarRotationSnappingOffButton.Name = "ToolbarRotationSnappingOffButton"; - this.ToolbarRotationSnappingOffButton.Size = new System.Drawing.Size(131, 22); - this.ToolbarRotationSnappingOffButton.Text = "Off"; - this.ToolbarRotationSnappingOffButton.Click += new System.EventHandler(this.ToolbarRotationSnappingOffButton_Click); - // - // ToolbarRotationSnapping1Button - // - this.ToolbarRotationSnapping1Button.Name = "ToolbarRotationSnapping1Button"; - this.ToolbarRotationSnapping1Button.Size = new System.Drawing.Size(131, 22); - this.ToolbarRotationSnapping1Button.Text = "1 Degree"; - this.ToolbarRotationSnapping1Button.Click += new System.EventHandler(this.ToolbarRotationSnapping1Button_Click); - // - // ToolbarRotationSnapping2Button - // - this.ToolbarRotationSnapping2Button.Name = "ToolbarRotationSnapping2Button"; - this.ToolbarRotationSnapping2Button.Size = new System.Drawing.Size(131, 22); - this.ToolbarRotationSnapping2Button.Text = "2 Degrees"; - this.ToolbarRotationSnapping2Button.Click += new System.EventHandler(this.ToolbarRotationSnapping2Button_Click); - // - // ToolbarRotationSnapping5Button - // - this.ToolbarRotationSnapping5Button.Checked = true; - this.ToolbarRotationSnapping5Button.CheckState = System.Windows.Forms.CheckState.Checked; - this.ToolbarRotationSnapping5Button.Name = "ToolbarRotationSnapping5Button"; - this.ToolbarRotationSnapping5Button.Size = new System.Drawing.Size(131, 22); - this.ToolbarRotationSnapping5Button.Text = "5 Degrees"; - this.ToolbarRotationSnapping5Button.Click += new System.EventHandler(this.ToolbarRotationSnapping5Button_Click); - // - // ToolbarRotationSnapping10Button - // - this.ToolbarRotationSnapping10Button.Name = "ToolbarRotationSnapping10Button"; - this.ToolbarRotationSnapping10Button.Size = new System.Drawing.Size(131, 22); - this.ToolbarRotationSnapping10Button.Text = "10 Degrees"; - this.ToolbarRotationSnapping10Button.Click += new System.EventHandler(this.ToolbarRotationSnapping10Button_Click); - // - // ToolbarRotationSnapping45Button - // - this.ToolbarRotationSnapping45Button.Name = "ToolbarRotationSnapping45Button"; - this.ToolbarRotationSnapping45Button.Size = new System.Drawing.Size(131, 22); - this.ToolbarRotationSnapping45Button.Text = "45 Degrees"; - this.ToolbarRotationSnapping45Button.Click += new System.EventHandler(this.ToolbarRotationSnapping45Button_Click); - // - // ToolbarRotationSnapping90Button - // - this.ToolbarRotationSnapping90Button.Name = "ToolbarRotationSnapping90Button"; - this.ToolbarRotationSnapping90Button.Size = new System.Drawing.Size(131, 22); - this.ToolbarRotationSnapping90Button.Text = "90 Degrees"; - this.ToolbarRotationSnapping90Button.Click += new System.EventHandler(this.ToolbarRotationSnapping90Button_Click); - // - // ToolbarRotationSnappingCustomButton - // - this.ToolbarRotationSnappingCustomButton.Name = "ToolbarRotationSnappingCustomButton"; - this.ToolbarRotationSnappingCustomButton.Size = new System.Drawing.Size(131, 22); - this.ToolbarRotationSnappingCustomButton.Text = "Custom..."; - this.ToolbarRotationSnappingCustomButton.Click += new System.EventHandler(this.ToolbarRotationSnappingCustomButton_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); - // - // ToolbarUndoButton - // - this.ToolbarUndoButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarUndoButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarUndoListButton}); - this.ToolbarUndoButton.Enabled = false; - this.ToolbarUndoButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarUndoButton.Image"))); - this.ToolbarUndoButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarUndoButton.Name = "ToolbarUndoButton"; - this.ToolbarUndoButton.Size = new System.Drawing.Size(32, 22); - this.ToolbarUndoButton.Text = "Undo"; - this.ToolbarUndoButton.ButtonClick += new System.EventHandler(this.ToolbarUndoButton_ButtonClick); - // - // ToolbarUndoListButton - // - this.ToolbarUndoListButton.Name = "ToolbarUndoListButton"; - this.ToolbarUndoListButton.Size = new System.Drawing.Size(121, 22); - this.ToolbarUndoListButton.Text = "Undo list"; - this.ToolbarUndoListButton.Click += new System.EventHandler(this.ToolbarUndoListButton_Click); - // - // ToolbarRedoButton - // - this.ToolbarRedoButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarRedoButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarRedoListButton}); - this.ToolbarRedoButton.Enabled = false; - this.ToolbarRedoButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarRedoButton.Image"))); - this.ToolbarRedoButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarRedoButton.Name = "ToolbarRedoButton"; - this.ToolbarRedoButton.Size = new System.Drawing.Size(32, 22); - this.ToolbarRedoButton.Text = "Redo"; - this.ToolbarRedoButton.ButtonClick += new System.EventHandler(this.ToolbarRedoButton_ButtonClick); - // - // ToolbarRedoListButton - // - this.ToolbarRedoListButton.Name = "ToolbarRedoListButton"; - this.ToolbarRedoListButton.Size = new System.Drawing.Size(119, 22); - this.ToolbarRedoListButton.Text = "Redo list"; - this.ToolbarRedoListButton.Click += new System.EventHandler(this.ToolbarRedoListButton_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); - // - // ToolbarInfoWindowButton - // - this.ToolbarInfoWindowButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarInfoWindowButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarInfoWindowButton.Image"))); - this.ToolbarInfoWindowButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarInfoWindowButton.Name = "ToolbarInfoWindowButton"; - this.ToolbarInfoWindowButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarInfoWindowButton.Text = "Selection info window"; - this.ToolbarInfoWindowButton.Click += new System.EventHandler(this.ToolbarInfoWindowButton_Click); - // - // ToolbarProjectWindowButton - // - this.ToolbarProjectWindowButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarProjectWindowButton.Enabled = false; - this.ToolbarProjectWindowButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarProjectWindowButton.Image"))); - this.ToolbarProjectWindowButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarProjectWindowButton.Name = "ToolbarProjectWindowButton"; - this.ToolbarProjectWindowButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarProjectWindowButton.Text = "Project window"; - this.ToolbarProjectWindowButton.Click += new System.EventHandler(this.ToolbarProjectWindowButton_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(6, 25); - // - // ToolbarAddItemButton - // - this.ToolbarAddItemButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarAddItemButton.Enabled = false; - this.ToolbarAddItemButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarAddItemButton.Image"))); - this.ToolbarAddItemButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarAddItemButton.Name = "ToolbarAddItemButton"; - this.ToolbarAddItemButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarAddItemButton.Text = "Add entity"; - this.ToolbarAddItemButton.Click += new System.EventHandler(this.ToolbarAddItemButton_Click); - // - // ToolbarDeleteItemButton - // - this.ToolbarDeleteItemButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarDeleteItemButton.Enabled = false; - this.ToolbarDeleteItemButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarDeleteItemButton.Image"))); - this.ToolbarDeleteItemButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarDeleteItemButton.Name = "ToolbarDeleteItemButton"; - this.ToolbarDeleteItemButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarDeleteItemButton.Text = "Delete entity"; - this.ToolbarDeleteItemButton.Click += new System.EventHandler(this.ToolbarDeleteItemButton_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25); - // - // ToolbarCopyButton - // - this.ToolbarCopyButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarCopyButton.Enabled = false; - this.ToolbarCopyButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarCopyButton.Image"))); - this.ToolbarCopyButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarCopyButton.Name = "ToolbarCopyButton"; - this.ToolbarCopyButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarCopyButton.Text = "Copy"; - this.ToolbarCopyButton.ToolTipText = "Copy (Ctrl+C)"; - this.ToolbarCopyButton.Click += new System.EventHandler(this.ToolbarCopyButton_Click); - // - // ToolbarPasteButton - // - this.ToolbarPasteButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarPasteButton.Enabled = false; - this.ToolbarPasteButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarPasteButton.Image"))); - this.ToolbarPasteButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarPasteButton.Name = "ToolbarPasteButton"; - this.ToolbarPasteButton.Size = new System.Drawing.Size(23, 22); - this.ToolbarPasteButton.Text = "Paste"; - this.ToolbarPasteButton.ToolTipText = "Paste (Ctrl+V)"; - this.ToolbarPasteButton.Click += new System.EventHandler(this.ToolbarPasteButton_Click); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(6, 25); - // - // ToolbarCameraModeButton - // - this.ToolbarCameraModeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ToolbarCameraModeButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolbarCameraPerspectiveButton, - this.ToolbarCameraMapViewButton, - this.ToolbarCameraOrthographicButton}); - this.ToolbarCameraModeButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarCameraModeButton.Image"))); - this.ToolbarCameraModeButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ToolbarCameraModeButton.Name = "ToolbarCameraModeButton"; - this.ToolbarCameraModeButton.Size = new System.Drawing.Size(32, 22); - this.ToolbarCameraModeButton.Text = "Camera Mode"; - this.ToolbarCameraModeButton.ButtonClick += new System.EventHandler(this.ToolbarCameraModeButton_ButtonClick); - // - // ToolbarCameraPerspectiveButton - // - this.ToolbarCameraPerspectiveButton.Checked = true; - this.ToolbarCameraPerspectiveButton.CheckState = System.Windows.Forms.CheckState.Checked; - this.ToolbarCameraPerspectiveButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarCameraPerspectiveButton.Image"))); - this.ToolbarCameraPerspectiveButton.Name = "ToolbarCameraPerspectiveButton"; - this.ToolbarCameraPerspectiveButton.Size = new System.Drawing.Size(145, 22); - this.ToolbarCameraPerspectiveButton.Text = "Perspective"; - this.ToolbarCameraPerspectiveButton.Click += new System.EventHandler(this.ToolbarCameraPerspectiveButton_Click); - // - // ToolbarCameraMapViewButton - // - this.ToolbarCameraMapViewButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarCameraMapViewButton.Image"))); - this.ToolbarCameraMapViewButton.Name = "ToolbarCameraMapViewButton"; - this.ToolbarCameraMapViewButton.Size = new System.Drawing.Size(145, 22); - this.ToolbarCameraMapViewButton.Text = "Map View"; - this.ToolbarCameraMapViewButton.Click += new System.EventHandler(this.ToolbarCameraMapViewButton_Click); - // - // ToolbarCameraOrthographicButton - // - this.ToolbarCameraOrthographicButton.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarCameraOrthographicButton.Image"))); - this.ToolbarCameraOrthographicButton.Name = "ToolbarCameraOrthographicButton"; - this.ToolbarCameraOrthographicButton.Size = new System.Drawing.Size(145, 22); - this.ToolbarCameraOrthographicButton.Text = "Orthographic"; - this.ToolbarCameraOrthographicButton.Click += new System.EventHandler(this.ToolbarCameraOrthographicButton_Click); - // - // ToolbarPanel - // - this.ToolbarPanel.BackColor = System.Drawing.SystemColors.Control; - this.ToolbarPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.ToolbarPanel.Controls.Add(this.Toolbar); - this.ToolbarPanel.Location = new System.Drawing.Point(12, 12); - this.ToolbarPanel.Name = "ToolbarPanel"; - this.ToolbarPanel.Size = new System.Drawing.Size(557, 26); - this.ToolbarPanel.TabIndex = 7; - this.ToolbarPanel.Visible = false; - // - // SubtitleLabel - // - this.SubtitleLabel.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.SubtitleLabel.AutoSize = true; - this.SubtitleLabel.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.SubtitleLabel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.SubtitleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleLabel.Location = new System.Drawing.Point(455, 555); - this.SubtitleLabel.Name = "SubtitleLabel"; - this.SubtitleLabel.Size = new System.Drawing.Size(83, 18); - this.SubtitleLabel.TabIndex = 8; - this.SubtitleLabel.Text = "Test Subtitle"; - this.SubtitleLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter; - this.SubtitleLabel.Visible = false; - this.SubtitleLabel.SizeChanged += new System.EventHandler(this.SubtitleLabel_SizeChanged); - // - // SubtitleTimer - // - this.SubtitleTimer.Tick += new System.EventHandler(this.SubtitleTimer_Tick); + // StatusStrip + // + StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { StatusLabel, MousedLabel, StatsLabel }); + StatusStrip.Location = new System.Drawing.Point(0, 798); + StatusStrip.Name = "StatusStrip"; + StatusStrip.Padding = new System.Windows.Forms.Padding(1, 0, 16, 0); + StatusStrip.Size = new System.Drawing.Size(1148, 22); + StatusStrip.TabIndex = 0; + StatusStrip.Text = "statusStrip1"; + // + // StatusLabel + // + StatusLabel.BackColor = System.Drawing.SystemColors.Control; + StatusLabel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + StatusLabel.Name = "StatusLabel"; + StatusLabel.Size = new System.Drawing.Size(1040, 17); + StatusLabel.Spring = true; + StatusLabel.Text = "Initialising"; + StatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // MousedLabel + // + MousedLabel.BackColor = System.Drawing.SystemColors.Control; + MousedLabel.Name = "MousedLabel"; + MousedLabel.Size = new System.Drawing.Size(16, 17); + MousedLabel.Text = " "; + // + // StatsLabel + // + StatsLabel.BackColor = System.Drawing.SystemColors.Control; + StatsLabel.DoubleClickEnabled = true; + StatsLabel.Name = "StatsLabel"; + StatsLabel.Size = new System.Drawing.Size(75, 17); + StatsLabel.Text = "0 geometries"; + StatsLabel.DoubleClick += StatsLabel_DoubleClick; + // + // ModelComboBox + // + ModelComboBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModelComboBox.FormattingEnabled = true; + ModelComboBox.Items.AddRange(new object[] { "dt1_lod_slod3", "dt1_tc_dufo_core", "dt1_tc_ufocore", "ex_office_citymodel_01", "id1_30_build3_dtl2", "imp_prop_ship_01a", "prop_alien_egg_01", "prop_fruit_stand_02", "prop_fruit_stand_03", "dune", "dune2", "dune2_hi", "adder", "adder_hi", "kuruma2", "kuruma2_hi", "infernus", "infernus_hi", "buzzard", "buzzard_hi", "rhino", "rhino_hi", "lazer", "lazer_hi", "duster", "duster_hi", "marquis", "marquis_hi", "submersible", "submersible_hi", "cargobob", "cargobob_hi", "sanchez", "sanchez_hi" }); + ModelComboBox.Location = new System.Drawing.Point(51, 8); + ModelComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ModelComboBox.Name = "ModelComboBox"; + ModelComboBox.Size = new System.Drawing.Size(174, 23); + ModelComboBox.TabIndex = 11; + ModelComboBox.SelectedIndexChanged += ModelComboBox_SelectedIndexChanged; + ModelComboBox.TextUpdate += ModelComboBox_TextUpdate; + // + // ToolsPanel + // + ToolsPanel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + ToolsPanel.BackColor = System.Drawing.SystemColors.ControlDark; + ToolsPanel.Controls.Add(ToolsDragPanel); + ToolsPanel.Controls.Add(AboutButton); + ToolsPanel.Controls.Add(ToolsButton); + ToolsPanel.Controls.Add(ToolsPanelExpandButton); + ToolsPanel.Controls.Add(ToolsTabControl); + ToolsPanel.Controls.Add(ToolsPanelHideButton); + ToolsPanel.Location = new System.Drawing.Point(880, 14); + ToolsPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsPanel.Name = "ToolsPanel"; + ToolsPanel.Size = new System.Drawing.Size(254, 767); + ToolsPanel.TabIndex = 2; + ToolsPanel.Visible = false; + // + // ToolsDragPanel + // + ToolsDragPanel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + ToolsDragPanel.Cursor = System.Windows.Forms.Cursors.VSplit; + ToolsDragPanel.Location = new System.Drawing.Point(0, 0); + ToolsDragPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsDragPanel.Name = "ToolsDragPanel"; + ToolsDragPanel.Size = new System.Drawing.Size(5, 767); + ToolsDragPanel.TabIndex = 16; + ToolsDragPanel.MouseDown += ToolsDragPanel_MouseDown; + ToolsDragPanel.MouseMove += ToolsDragPanel_MouseMove; + ToolsDragPanel.MouseUp += ToolsDragPanel_MouseUp; + // + // AboutButton + // + AboutButton.Location = new System.Drawing.Point(75, 3); + AboutButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AboutButton.Name = "AboutButton"; + AboutButton.Size = new System.Drawing.Size(64, 27); + AboutButton.TabIndex = 15; + AboutButton.Text = "About..."; + AboutButton.UseVisualStyleBackColor = true; + AboutButton.Click += AboutButton_Click; + // + // ToolsButton + // + ToolsButton.Location = new System.Drawing.Point(4, 3); + ToolsButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsButton.Name = "ToolsButton"; + ToolsButton.Size = new System.Drawing.Size(64, 27); + ToolsButton.TabIndex = 14; + ToolsButton.Text = "Tools..."; + ToolsButton.UseVisualStyleBackColor = true; + ToolsButton.Click += ToolsButton_Click; + // + // ToolsPanelExpandButton + // + ToolsPanelExpandButton.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + ToolsPanelExpandButton.Location = new System.Drawing.Point(174, 3); + ToolsPanelExpandButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsPanelExpandButton.Name = "ToolsPanelExpandButton"; + ToolsPanelExpandButton.Size = new System.Drawing.Size(35, 27); + ToolsPanelExpandButton.TabIndex = 13; + ToolsPanelExpandButton.Text = "<<"; + ToolsPanelExpandButton.UseVisualStyleBackColor = true; + ToolsPanelExpandButton.Click += ToolsPanelExpandButton_Click; + // + // ToolsTabControl + // + ToolsTabControl.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ToolsTabControl.Controls.Add(ViewTabPage); + ToolsTabControl.Controls.Add(MarkersTabPage); + ToolsTabControl.Controls.Add(SelectionTabPage); + ToolsTabControl.Controls.Add(OptionsTabPage); + ToolsTabControl.Location = new System.Drawing.Point(4, 35); + ToolsTabControl.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsTabControl.Name = "ToolsTabControl"; + ToolsTabControl.SelectedIndex = 0; + ToolsTabControl.Size = new System.Drawing.Size(248, 729); + ToolsTabControl.TabIndex = 12; + // + // ViewTabPage + // + ViewTabPage.Controls.Add(ViewTabControl); + ViewTabPage.Controls.Add(label3); + ViewTabPage.Controls.Add(ViewModeComboBox); + ViewTabPage.Controls.Add(ShowToolbarCheckBox); + ViewTabPage.Location = new System.Drawing.Point(4, 24); + ViewTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewTabPage.Name = "ViewTabPage"; + ViewTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewTabPage.Size = new System.Drawing.Size(240, 701); + ViewTabPage.TabIndex = 0; + ViewTabPage.Text = "View"; + ViewTabPage.UseVisualStyleBackColor = true; + // + // ViewTabControl + // + ViewTabControl.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ViewTabControl.Controls.Add(ViewWorldTabPage); + ViewTabControl.Controls.Add(ViewYmapsTabPage); + ViewTabControl.Controls.Add(ViewModelTabPage); + ViewTabControl.Location = new System.Drawing.Point(0, 37); + ViewTabControl.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewTabControl.Name = "ViewTabControl"; + ViewTabControl.SelectedIndex = 0; + ViewTabControl.Size = new System.Drawing.Size(236, 632); + ViewTabControl.TabIndex = 12; + // + // ViewWorldTabPage + // + ViewWorldTabPage.Controls.Add(EnableModsCheckBox); + ViewWorldTabPage.Controls.Add(label30); + ViewWorldTabPage.Controls.Add(DlcLevelComboBox); + ViewWorldTabPage.Controls.Add(EnableDlcCheckBox); + ViewWorldTabPage.Controls.Add(WorldYmapWeatherFilterCheckBox); + ViewWorldTabPage.Controls.Add(WorldYmapTimeFilterCheckBox); + ViewWorldTabPage.Controls.Add(WorldScriptedYmapsCheckBox); + ViewWorldTabPage.Controls.Add(WorldDetailDistLabel); + ViewWorldTabPage.Controls.Add(label18); + ViewWorldTabPage.Controls.Add(WorldDetailDistTrackBar); + ViewWorldTabPage.Controls.Add(WorldLodDistLabel); + ViewWorldTabPage.Controls.Add(label16); + ViewWorldTabPage.Controls.Add(WorldLodDistTrackBar); + ViewWorldTabPage.Controls.Add(label15); + ViewWorldTabPage.Controls.Add(WorldMaxLodComboBox); + ViewWorldTabPage.Location = new System.Drawing.Point(4, 24); + ViewWorldTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewWorldTabPage.Name = "ViewWorldTabPage"; + ViewWorldTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewWorldTabPage.Size = new System.Drawing.Size(228, 604); + ViewWorldTabPage.TabIndex = 0; + ViewWorldTabPage.Text = "World"; + ViewWorldTabPage.UseVisualStyleBackColor = true; + // + // EnableModsCheckBox + // + EnableModsCheckBox.AutoSize = true; + EnableModsCheckBox.Enabled = false; + EnableModsCheckBox.Location = new System.Drawing.Point(7, 323); + EnableModsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + EnableModsCheckBox.Name = "EnableModsCheckBox"; + EnableModsCheckBox.Size = new System.Drawing.Size(94, 19); + EnableModsCheckBox.TabIndex = 68; + EnableModsCheckBox.Text = "Enable Mods"; + EnableModsCheckBox.UseVisualStyleBackColor = true; + EnableModsCheckBox.CheckedChanged += EnableModsCheckBox_CheckedChanged; + // + // label30 + // + label30.AutoSize = true; + label30.Location = new System.Drawing.Point(1, 389); + label30.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label30.Name = "label30"; + label30.Size = new System.Drawing.Size(62, 15); + label30.TabIndex = 70; + label30.Text = "DLC Level:"; + // + // DlcLevelComboBox + // + DlcLevelComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + DlcLevelComboBox.Enabled = false; + DlcLevelComboBox.FormattingEnabled = true; + DlcLevelComboBox.Items.AddRange(new object[] { "" }); + DlcLevelComboBox.Location = new System.Drawing.Point(72, 385); + DlcLevelComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + DlcLevelComboBox.Name = "DlcLevelComboBox"; + DlcLevelComboBox.Size = new System.Drawing.Size(146, 23); + DlcLevelComboBox.TabIndex = 70; + DlcLevelComboBox.SelectedIndexChanged += DlcLevelComboBox_SelectedIndexChanged; + DlcLevelComboBox.KeyPress += DlcLevelComboBox_KeyPress; + // + // EnableDlcCheckBox + // + EnableDlcCheckBox.AutoSize = true; + EnableDlcCheckBox.Enabled = false; + EnableDlcCheckBox.Location = new System.Drawing.Point(7, 359); + EnableDlcCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + EnableDlcCheckBox.Name = "EnableDlcCheckBox"; + EnableDlcCheckBox.Size = new System.Drawing.Size(86, 19); + EnableDlcCheckBox.TabIndex = 69; + EnableDlcCheckBox.Text = "Enable DLC"; + EnableDlcCheckBox.UseVisualStyleBackColor = true; + EnableDlcCheckBox.CheckedChanged += EnableDlcCheckBox_CheckedChanged; + // + // WorldYmapWeatherFilterCheckBox + // + WorldYmapWeatherFilterCheckBox.AutoSize = true; + WorldYmapWeatherFilterCheckBox.Checked = true; + WorldYmapWeatherFilterCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + WorldYmapWeatherFilterCheckBox.Location = new System.Drawing.Point(7, 273); + WorldYmapWeatherFilterCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WorldYmapWeatherFilterCheckBox.Name = "WorldYmapWeatherFilterCheckBox"; + WorldYmapWeatherFilterCheckBox.Size = new System.Drawing.Size(151, 19); + WorldYmapWeatherFilterCheckBox.TabIndex = 67; + WorldYmapWeatherFilterCheckBox.Text = "Filter ymaps by weather"; + WorldYmapWeatherFilterCheckBox.UseVisualStyleBackColor = true; + WorldYmapWeatherFilterCheckBox.CheckedChanged += WorldYmapWeatherFilterCheckBox_CheckedChanged; + // + // WorldYmapTimeFilterCheckBox + // + WorldYmapTimeFilterCheckBox.AutoSize = true; + WorldYmapTimeFilterCheckBox.Checked = true; + WorldYmapTimeFilterCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + WorldYmapTimeFilterCheckBox.Location = new System.Drawing.Point(7, 247); + WorldYmapTimeFilterCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WorldYmapTimeFilterCheckBox.Name = "WorldYmapTimeFilterCheckBox"; + WorldYmapTimeFilterCheckBox.Size = new System.Drawing.Size(169, 19); + WorldYmapTimeFilterCheckBox.TabIndex = 66; + WorldYmapTimeFilterCheckBox.Text = "Filter ymaps by time of day"; + WorldYmapTimeFilterCheckBox.UseVisualStyleBackColor = true; + WorldYmapTimeFilterCheckBox.CheckedChanged += WorldYmapTimeFilterCheckBox_CheckedChanged; + // + // WorldScriptedYmapsCheckBox + // + WorldScriptedYmapsCheckBox.AutoSize = true; + WorldScriptedYmapsCheckBox.Checked = true; + WorldScriptedYmapsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + WorldScriptedYmapsCheckBox.Location = new System.Drawing.Point(7, 210); + WorldScriptedYmapsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WorldScriptedYmapsCheckBox.Name = "WorldScriptedYmapsCheckBox"; + WorldScriptedYmapsCheckBox.Size = new System.Drawing.Size(138, 19); + WorldScriptedYmapsCheckBox.TabIndex = 65; + WorldScriptedYmapsCheckBox.Text = "Show scripted ymaps"; + WorldScriptedYmapsCheckBox.UseVisualStyleBackColor = true; + WorldScriptedYmapsCheckBox.CheckedChanged += WorldScriptedYmapsCheckBox_CheckedChanged; + // + // WorldDetailDistLabel + // + WorldDetailDistLabel.AutoSize = true; + WorldDetailDistLabel.Location = new System.Drawing.Point(102, 108); + WorldDetailDistLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + WorldDetailDistLabel.Name = "WorldDetailDistLabel"; + WorldDetailDistLabel.Size = new System.Drawing.Size(22, 15); + WorldDetailDistLabel.TabIndex = 64; + WorldDetailDistLabel.Text = "1.0"; + // + // label18 + // + label18.AutoSize = true; + label18.Location = new System.Drawing.Point(1, 108); + label18.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label18.Name = "label18"; + label18.Size = new System.Drawing.Size(87, 15); + label18.TabIndex = 63; + label18.Text = "Detail distance:"; + // + // WorldDetailDistTrackBar + // + WorldDetailDistTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + WorldDetailDistTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + WorldDetailDistTrackBar.LargeChange = 10; + WorldDetailDistTrackBar.Location = new System.Drawing.Point(7, 127); + WorldDetailDistTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WorldDetailDistTrackBar.Maximum = 50; + WorldDetailDistTrackBar.Name = "WorldDetailDistTrackBar"; + WorldDetailDistTrackBar.Size = new System.Drawing.Size(212, 45); + WorldDetailDistTrackBar.TabIndex = 62; + WorldDetailDistTrackBar.TickFrequency = 2; + WorldDetailDistTrackBar.Value = 10; + WorldDetailDistTrackBar.Scroll += WorldDetailDistTrackBar_Scroll; + // + // WorldLodDistLabel + // + WorldLodDistLabel.AutoSize = true; + WorldLodDistLabel.Location = new System.Drawing.Point(96, 45); + WorldLodDistLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + WorldLodDistLabel.Name = "WorldLodDistLabel"; + WorldLodDistLabel.Size = new System.Drawing.Size(22, 15); + WorldLodDistLabel.TabIndex = 61; + WorldLodDistLabel.Text = "1.0"; + WorldLodDistLabel.Visible = false; + // + // label16 + // + label16.AutoSize = true; + label16.Location = new System.Drawing.Point(1, 45); + label16.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label16.Name = "label16"; + label16.Size = new System.Drawing.Size(80, 15); + label16.TabIndex = 60; + label16.Text = "LOD distance:"; + label16.Visible = false; + // + // WorldLodDistTrackBar + // + WorldLodDistTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + WorldLodDistTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + WorldLodDistTrackBar.LargeChange = 10; + WorldLodDistTrackBar.Location = new System.Drawing.Point(7, 63); + WorldLodDistTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WorldLodDistTrackBar.Maximum = 30; + WorldLodDistTrackBar.Name = "WorldLodDistTrackBar"; + WorldLodDistTrackBar.Size = new System.Drawing.Size(212, 45); + WorldLodDistTrackBar.TabIndex = 59; + WorldLodDistTrackBar.TickFrequency = 2; + WorldLodDistTrackBar.Value = 10; + WorldLodDistTrackBar.Visible = false; + WorldLodDistTrackBar.Scroll += WorldLodDistTrackBar_Scroll; + // + // label15 + // + label15.AutoSize = true; + label15.Location = new System.Drawing.Point(1, 10); + label15.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label15.Name = "label15"; + label15.Size = new System.Drawing.Size(59, 15); + label15.TabIndex = 58; + label15.Text = "Max LOD:"; + // + // WorldMaxLodComboBox + // + WorldMaxLodComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + WorldMaxLodComboBox.FormattingEnabled = true; + WorldMaxLodComboBox.Items.AddRange(new object[] { "ORPHANHD", "HD", "LOD", "SLOD1", "SLOD2", "SLOD3", "SLOD4" }); + WorldMaxLodComboBox.Location = new System.Drawing.Point(72, 7); + WorldMaxLodComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WorldMaxLodComboBox.Name = "WorldMaxLodComboBox"; + WorldMaxLodComboBox.Size = new System.Drawing.Size(146, 23); + WorldMaxLodComboBox.TabIndex = 57; + WorldMaxLodComboBox.SelectedIndexChanged += WorldMaxLodComboBox_SelectedIndexChanged; + WorldMaxLodComboBox.KeyPress += WorldMaxLodComboBox_KeyPress; + // + // ViewYmapsTabPage + // + ViewYmapsTabPage.Controls.Add(ShowYmapChildrenCheckBox); + ViewYmapsTabPage.Controls.Add(label2); + ViewYmapsTabPage.Controls.Add(DetailTrackBar); + ViewYmapsTabPage.Controls.Add(DynamicLODCheckBox); + ViewYmapsTabPage.Controls.Add(YmapsTextBox); + ViewYmapsTabPage.Location = new System.Drawing.Point(4, 24); + ViewYmapsTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewYmapsTabPage.Name = "ViewYmapsTabPage"; + ViewYmapsTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewYmapsTabPage.Size = new System.Drawing.Size(228, 604); + ViewYmapsTabPage.TabIndex = 1; + ViewYmapsTabPage.Text = "Ymaps"; + ViewYmapsTabPage.UseVisualStyleBackColor = true; + // + // ShowYmapChildrenCheckBox + // + ShowYmapChildrenCheckBox.AutoSize = true; + ShowYmapChildrenCheckBox.Enabled = false; + ShowYmapChildrenCheckBox.Location = new System.Drawing.Point(7, 68); + ShowYmapChildrenCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ShowYmapChildrenCheckBox.Name = "ShowYmapChildrenCheckBox"; + ShowYmapChildrenCheckBox.Size = new System.Drawing.Size(101, 19); + ShowYmapChildrenCheckBox.TabIndex = 35; + ShowYmapChildrenCheckBox.Text = "Show children"; + ShowYmapChildrenCheckBox.UseVisualStyleBackColor = true; + ShowYmapChildrenCheckBox.CheckedChanged += ShowYmapChildrenCheckBox_CheckedChanged; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(4, 102); + label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(85, 15); + label2.TabIndex = 8; + label2.Text = "Ymaps to load:"; + // + // DetailTrackBar + // + DetailTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + DetailTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + DetailTrackBar.Location = new System.Drawing.Point(7, 28); + DetailTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + DetailTrackBar.Maximum = 20; + DetailTrackBar.Name = "DetailTrackBar"; + DetailTrackBar.Size = new System.Drawing.Size(212, 45); + DetailTrackBar.TabIndex = 34; + DetailTrackBar.Value = 5; + DetailTrackBar.Scroll += DetailTrackBar_Scroll; + // + // DynamicLODCheckBox + // + DynamicLODCheckBox.AutoSize = true; + DynamicLODCheckBox.Checked = true; + DynamicLODCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + DynamicLODCheckBox.Location = new System.Drawing.Point(7, 7); + DynamicLODCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + DynamicLODCheckBox.Name = "DynamicLODCheckBox"; + DynamicLODCheckBox.Size = new System.Drawing.Size(99, 19); + DynamicLODCheckBox.TabIndex = 33; + DynamicLODCheckBox.Text = "Dynamic LOD"; + DynamicLODCheckBox.UseVisualStyleBackColor = true; + DynamicLODCheckBox.CheckedChanged += DynamicLODCheckBox_CheckedChanged; + // + // YmapsTextBox + // + YmapsTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + YmapsTextBox.Location = new System.Drawing.Point(0, 120); + YmapsTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + YmapsTextBox.Multiline = true; + YmapsTextBox.Name = "YmapsTextBox"; + YmapsTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + YmapsTextBox.Size = new System.Drawing.Size(226, 479); + YmapsTextBox.TabIndex = 36; + YmapsTextBox.Text = resources.GetString("YmapsTextBox.Text"); + YmapsTextBox.TextChanged += YmapsTextBox_TextChanged; + // + // ViewModelTabPage + // + ViewModelTabPage.Controls.Add(label1); + ViewModelTabPage.Controls.Add(ModelComboBox); + ViewModelTabPage.Location = new System.Drawing.Point(4, 24); + ViewModelTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewModelTabPage.Name = "ViewModelTabPage"; + ViewModelTabPage.Size = new System.Drawing.Size(228, 604); + ViewModelTabPage.TabIndex = 2; + ViewModelTabPage.Text = "Model"; + ViewModelTabPage.UseVisualStyleBackColor = true; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(-1, 12); + label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(44, 15); + label1.TabIndex = 5; + label1.Text = "Model:"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new System.Drawing.Point(4, 9); + label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(41, 15); + label3.TabIndex = 11; + label3.Text = "Mode:"; + // + // ViewModeComboBox + // + ViewModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + ViewModeComboBox.FormattingEnabled = true; + ViewModeComboBox.Items.AddRange(new object[] { "World view", "Ymap view", "Model view" }); + ViewModeComboBox.Location = new System.Drawing.Point(56, 6); + ViewModeComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ViewModeComboBox.Name = "ViewModeComboBox"; + ViewModeComboBox.Size = new System.Drawing.Size(129, 23); + ViewModeComboBox.TabIndex = 10; + ViewModeComboBox.SelectedIndexChanged += ViewModeComboBox_SelectedIndexChanged; + ViewModeComboBox.KeyPress += ViewModeComboBox_KeyPress; + // + // ShowToolbarCheckBox + // + ShowToolbarCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + ShowToolbarCheckBox.AutoSize = true; + ShowToolbarCheckBox.Location = new System.Drawing.Point(12, 677); + ShowToolbarCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ShowToolbarCheckBox.Name = "ShowToolbarCheckBox"; + ShowToolbarCheckBox.Size = new System.Drawing.Size(114, 19); + ShowToolbarCheckBox.TabIndex = 47; + ShowToolbarCheckBox.Text = "Show Toolbar (T)"; + ShowToolbarCheckBox.UseVisualStyleBackColor = true; + ShowToolbarCheckBox.CheckedChanged += ShowToolbarCheckBox_CheckedChanged; + // + // MarkersTabPage + // + MarkersTabPage.Controls.Add(label27); + MarkersTabPage.Controls.Add(CameraPositionTextBox); + MarkersTabPage.Controls.Add(AddSelectionMarkerButton); + MarkersTabPage.Controls.Add(AddCurrentPositonMarkerButton); + MarkersTabPage.Controls.Add(ResetMarkersButton); + MarkersTabPage.Controls.Add(ClearMarkersButton); + MarkersTabPage.Controls.Add(GoToButton); + MarkersTabPage.Controls.Add(ShowLocatorCheckBox); + MarkersTabPage.Controls.Add(label6); + MarkersTabPage.Controls.Add(LocateTextBox); + MarkersTabPage.Controls.Add(label7); + MarkersTabPage.Controls.Add(AddMarkersButton); + MarkersTabPage.Controls.Add(MultiFindTextBox); + MarkersTabPage.Location = new System.Drawing.Point(4, 24); + MarkersTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MarkersTabPage.Name = "MarkersTabPage"; + MarkersTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + MarkersTabPage.Size = new System.Drawing.Size(240, 701); + MarkersTabPage.TabIndex = 1; + MarkersTabPage.Text = "Markers"; + MarkersTabPage.UseVisualStyleBackColor = true; + // + // label27 + // + label27.AutoSize = true; + label27.Location = new System.Drawing.Point(-2, 58); + label27.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label27.Name = "label27"; + label27.Size = new System.Drawing.Size(138, 15); + label27.TabIndex = 22; + label27.Text = "Current camera position:"; + // + // CameraPositionTextBox + // + CameraPositionTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CameraPositionTextBox.Location = new System.Drawing.Point(0, 77); + CameraPositionTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CameraPositionTextBox.Name = "CameraPositionTextBox"; + CameraPositionTextBox.Size = new System.Drawing.Size(238, 23); + CameraPositionTextBox.TabIndex = 16; + CameraPositionTextBox.Text = "0, 0, 0"; + // + // AddSelectionMarkerButton + // + AddSelectionMarkerButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + AddSelectionMarkerButton.Location = new System.Drawing.Point(0, 618); + AddSelectionMarkerButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AddSelectionMarkerButton.Name = "AddSelectionMarkerButton"; + AddSelectionMarkerButton.Size = new System.Drawing.Size(113, 27); + AddSelectionMarkerButton.TabIndex = 22; + AddSelectionMarkerButton.Text = "Add selection"; + AddSelectionMarkerButton.UseVisualStyleBackColor = true; + AddSelectionMarkerButton.Click += AddSelectionMarkerButton_Click; + // + // AddCurrentPositonMarkerButton + // + AddCurrentPositonMarkerButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + AddCurrentPositonMarkerButton.Location = new System.Drawing.Point(0, 585); + AddCurrentPositonMarkerButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AddCurrentPositonMarkerButton.Name = "AddCurrentPositonMarkerButton"; + AddCurrentPositonMarkerButton.Size = new System.Drawing.Size(113, 27); + AddCurrentPositonMarkerButton.TabIndex = 20; + AddCurrentPositonMarkerButton.Text = "Add current pos"; + AddCurrentPositonMarkerButton.UseVisualStyleBackColor = true; + AddCurrentPositonMarkerButton.Click += AddCurrentPositonMarkerButton_Click; + // + // ResetMarkersButton + // + ResetMarkersButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + ResetMarkersButton.Location = new System.Drawing.Point(126, 585); + ResetMarkersButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ResetMarkersButton.Name = "ResetMarkersButton"; + ResetMarkersButton.Size = new System.Drawing.Size(113, 27); + ResetMarkersButton.TabIndex = 21; + ResetMarkersButton.Text = "Default markers"; + ResetMarkersButton.UseVisualStyleBackColor = true; + ResetMarkersButton.Click += ResetMarkersButton_Click; + // + // ClearMarkersButton + // + ClearMarkersButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + ClearMarkersButton.Location = new System.Drawing.Point(126, 552); + ClearMarkersButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ClearMarkersButton.Name = "ClearMarkersButton"; + ClearMarkersButton.Size = new System.Drawing.Size(113, 27); + ClearMarkersButton.TabIndex = 19; + ClearMarkersButton.Text = "Clear markers"; + ClearMarkersButton.UseVisualStyleBackColor = true; + ClearMarkersButton.Click += ClearMarkersButton_Click; + // + // GoToButton + // + GoToButton.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + GoToButton.Location = new System.Drawing.Point(189, 28); + GoToButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + GoToButton.Name = "GoToButton"; + GoToButton.Size = new System.Drawing.Size(50, 25); + GoToButton.TabIndex = 15; + GoToButton.Text = "Go to"; + GoToButton.UseVisualStyleBackColor = true; + GoToButton.Click += GoToButton_Click; + // + // ShowLocatorCheckBox + // + ShowLocatorCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + ShowLocatorCheckBox.AutoSize = true; + ShowLocatorCheckBox.Location = new System.Drawing.Point(126, 9); + ShowLocatorCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ShowLocatorCheckBox.Name = "ShowLocatorCheckBox"; + ShowLocatorCheckBox.Size = new System.Drawing.Size(95, 19); + ShowLocatorCheckBox.TabIndex = 13; + ShowLocatorCheckBox.Text = "Show marker"; + ShowLocatorCheckBox.UseVisualStyleBackColor = true; + ShowLocatorCheckBox.CheckedChanged += ShowLocatorCheckBox_CheckedChanged; + // + // label6 + // + label6.AutoSize = true; + label6.Location = new System.Drawing.Point(-2, 9); + label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label6.Name = "label6"; + label6.Size = new System.Drawing.Size(81, 15); + label6.TabIndex = 13; + label6.Text = "Locate: X, Y, Z"; + // + // LocateTextBox + // + LocateTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + LocateTextBox.Location = new System.Drawing.Point(0, 29); + LocateTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + LocateTextBox.Name = "LocateTextBox"; + LocateTextBox.Size = new System.Drawing.Size(181, 23); + LocateTextBox.TabIndex = 14; + LocateTextBox.Text = "0, 0, 0"; + LocateTextBox.TextChanged += LocateTextBox_TextChanged; + // + // label7 + // + label7.AutoSize = true; + label7.Location = new System.Drawing.Point(-2, 117); + label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label7.Name = "label7"; + label7.Size = new System.Drawing.Size(138, 15); + label7.TabIndex = 11; + label7.Text = "Multi-find: X, Y, Z, Name"; + // + // AddMarkersButton + // + AddMarkersButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + AddMarkersButton.Location = new System.Drawing.Point(0, 552); + AddMarkersButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AddMarkersButton.Name = "AddMarkersButton"; + AddMarkersButton.Size = new System.Drawing.Size(113, 27); + AddMarkersButton.TabIndex = 18; + AddMarkersButton.Text = "Add markers"; + AddMarkersButton.UseVisualStyleBackColor = true; + AddMarkersButton.Click += AddMarkersButton_Click; + // + // MultiFindTextBox + // + MultiFindTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + MultiFindTextBox.Location = new System.Drawing.Point(0, 135); + MultiFindTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MultiFindTextBox.MaxLength = 1048576; + MultiFindTextBox.Multiline = true; + MultiFindTextBox.Name = "MultiFindTextBox"; + MultiFindTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + MultiFindTextBox.Size = new System.Drawing.Size(238, 409); + MultiFindTextBox.TabIndex = 17; + // + // SelectionTabPage + // + SelectionTabPage.Controls.Add(label25); + SelectionTabPage.Controls.Add(SelectionModeComboBox); + SelectionTabPage.Controls.Add(SelectionNameTextBox); + SelectionTabPage.Controls.Add(SelectionTabControl); + SelectionTabPage.Controls.Add(MouseSelectCheckBox); + SelectionTabPage.Location = new System.Drawing.Point(4, 24); + SelectionTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionTabPage.Name = "SelectionTabPage"; + SelectionTabPage.Size = new System.Drawing.Size(240, 701); + SelectionTabPage.TabIndex = 2; + SelectionTabPage.Text = "Selection"; + SelectionTabPage.UseVisualStyleBackColor = true; + // + // label25 + // + label25.AutoSize = true; + label25.Location = new System.Drawing.Point(7, 38); + label25.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label25.Name = "label25"; + label25.Size = new System.Drawing.Size(41, 15); + label25.TabIndex = 28; + label25.Text = "Mode:"; + // + // SelectionModeComboBox + // + SelectionModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + SelectionModeComboBox.FormattingEnabled = true; + SelectionModeComboBox.Items.AddRange(new object[] { "Entity", "Entity Extension", "Archetype Extension", "Time Cycle Modifier", "Car Generator", "Grass", "Water Quad", "Water Calming Quad", "Water Wave Quad", "Collision", "Nav Mesh", "Path", "Train Track", "Lod Lights", "Mlo Instance", "Scenario", "Audio", "Occlusion" }); + SelectionModeComboBox.Location = new System.Drawing.Point(59, 35); + SelectionModeComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionModeComboBox.Name = "SelectionModeComboBox"; + SelectionModeComboBox.Size = new System.Drawing.Size(140, 23); + SelectionModeComboBox.TabIndex = 23; + SelectionModeComboBox.SelectedIndexChanged += SelectionModeComboBox_SelectedIndexChanged; + SelectionModeComboBox.KeyPress += SelectionModeComboBox_KeyPress; + // + // SelectionNameTextBox + // + SelectionNameTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelectionNameTextBox.BackColor = System.Drawing.Color.White; + SelectionNameTextBox.Location = new System.Drawing.Point(4, 76); + SelectionNameTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionNameTextBox.Name = "SelectionNameTextBox"; + SelectionNameTextBox.ReadOnly = true; + SelectionNameTextBox.Size = new System.Drawing.Size(231, 23); + SelectionNameTextBox.TabIndex = 26; + SelectionNameTextBox.Text = "Nothing selected"; + // + // SelectionTabControl + // + SelectionTabControl.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelectionTabControl.Controls.Add(SelectionEntityTabPage); + SelectionTabControl.Controls.Add(SelectionArchetypeTabPage); + SelectionTabControl.Controls.Add(SelectionDrawableTabPage); + SelectionTabControl.Controls.Add(SelectionExtensionTabPage); + SelectionTabControl.Location = new System.Drawing.Point(0, 110); + SelectionTabControl.Margin = new System.Windows.Forms.Padding(0); + SelectionTabControl.Name = "SelectionTabControl"; + SelectionTabControl.SelectedIndex = 0; + SelectionTabControl.Size = new System.Drawing.Size(239, 590); + SelectionTabControl.TabIndex = 28; + // + // SelectionEntityTabPage + // + SelectionEntityTabPage.Controls.Add(SelEntityPropertyGrid); + SelectionEntityTabPage.Location = new System.Drawing.Point(4, 24); + SelectionEntityTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionEntityTabPage.Name = "SelectionEntityTabPage"; + SelectionEntityTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionEntityTabPage.Size = new System.Drawing.Size(231, 562); + SelectionEntityTabPage.TabIndex = 0; + SelectionEntityTabPage.Text = "Entity"; + SelectionEntityTabPage.UseVisualStyleBackColor = true; + // + // SelEntityPropertyGrid + // + SelEntityPropertyGrid.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelEntityPropertyGrid.HelpVisible = false; + SelEntityPropertyGrid.Location = new System.Drawing.Point(0, 7); + SelEntityPropertyGrid.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelEntityPropertyGrid.Name = "SelEntityPropertyGrid"; + SelEntityPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; + SelEntityPropertyGrid.ReadOnly = true; + SelEntityPropertyGrid.Size = new System.Drawing.Size(230, 547); + SelEntityPropertyGrid.TabIndex = 35; + SelEntityPropertyGrid.ToolbarVisible = false; + // + // SelectionArchetypeTabPage + // + SelectionArchetypeTabPage.Controls.Add(SelArchetypePropertyGrid); + SelectionArchetypeTabPage.Location = new System.Drawing.Point(4, 24); + SelectionArchetypeTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionArchetypeTabPage.Name = "SelectionArchetypeTabPage"; + SelectionArchetypeTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionArchetypeTabPage.Size = new System.Drawing.Size(231, 562); + SelectionArchetypeTabPage.TabIndex = 1; + SelectionArchetypeTabPage.Text = "Archetype"; + SelectionArchetypeTabPage.UseVisualStyleBackColor = true; + // + // SelArchetypePropertyGrid + // + SelArchetypePropertyGrid.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelArchetypePropertyGrid.HelpVisible = false; + SelArchetypePropertyGrid.Location = new System.Drawing.Point(0, 7); + SelArchetypePropertyGrid.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelArchetypePropertyGrid.Name = "SelArchetypePropertyGrid"; + SelArchetypePropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; + SelArchetypePropertyGrid.ReadOnly = true; + SelArchetypePropertyGrid.Size = new System.Drawing.Size(230, 547); + SelArchetypePropertyGrid.TabIndex = 36; + SelArchetypePropertyGrid.ToolbarVisible = false; + // + // SelectionDrawableTabPage + // + SelectionDrawableTabPage.Controls.Add(tabControl3); + SelectionDrawableTabPage.Location = new System.Drawing.Point(4, 24); + SelectionDrawableTabPage.Margin = new System.Windows.Forms.Padding(0); + SelectionDrawableTabPage.Name = "SelectionDrawableTabPage"; + SelectionDrawableTabPage.Size = new System.Drawing.Size(231, 562); + SelectionDrawableTabPage.TabIndex = 2; + SelectionDrawableTabPage.Text = "Drawable"; + SelectionDrawableTabPage.UseVisualStyleBackColor = true; + // + // tabControl3 + // + tabControl3.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + tabControl3.Controls.Add(tabPage11); + tabControl3.Controls.Add(tabPage12); + tabControl3.Controls.Add(tabPage13); + tabControl3.Location = new System.Drawing.Point(-5, 8); + tabControl3.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + tabControl3.Name = "tabControl3"; + tabControl3.SelectedIndex = 0; + tabControl3.Size = new System.Drawing.Size(239, 549); + tabControl3.TabIndex = 28; + // + // tabPage11 + // + tabPage11.Controls.Add(SelDrawablePropertyGrid); + tabPage11.Location = new System.Drawing.Point(4, 24); + tabPage11.Margin = new System.Windows.Forms.Padding(0); + tabPage11.Name = "tabPage11"; + tabPage11.Size = new System.Drawing.Size(231, 521); + tabPage11.TabIndex = 0; + tabPage11.Text = "Info"; + tabPage11.UseVisualStyleBackColor = true; + // + // SelDrawablePropertyGrid + // + SelDrawablePropertyGrid.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelDrawablePropertyGrid.HelpVisible = false; + SelDrawablePropertyGrid.Location = new System.Drawing.Point(0, 0); + SelDrawablePropertyGrid.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelDrawablePropertyGrid.Name = "SelDrawablePropertyGrid"; + SelDrawablePropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; + SelDrawablePropertyGrid.ReadOnly = true; + SelDrawablePropertyGrid.Size = new System.Drawing.Size(230, 517); + SelDrawablePropertyGrid.TabIndex = 37; + SelDrawablePropertyGrid.ToolbarVisible = false; + // + // tabPage12 + // + tabPage12.Controls.Add(SelDrawableModelsTreeView); + tabPage12.Location = new System.Drawing.Point(4, 24); + tabPage12.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + tabPage12.Name = "tabPage12"; + tabPage12.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + tabPage12.Size = new System.Drawing.Size(231, 521); + tabPage12.TabIndex = 1; + tabPage12.Text = "Models"; + tabPage12.UseVisualStyleBackColor = true; + // + // SelDrawableModelsTreeView + // + SelDrawableModelsTreeView.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelDrawableModelsTreeView.CheckBoxes = true; + SelDrawableModelsTreeView.Location = new System.Drawing.Point(0, 0); + SelDrawableModelsTreeView.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelDrawableModelsTreeView.Name = "SelDrawableModelsTreeView"; + SelDrawableModelsTreeView.ShowRootLines = false; + SelDrawableModelsTreeView.Size = new System.Drawing.Size(229, 519); + SelDrawableModelsTreeView.TabIndex = 39; + SelDrawableModelsTreeView.AfterCheck += SelDrawableModelsTreeView_AfterCheck; + SelDrawableModelsTreeView.NodeMouseDoubleClick += SelDrawableModelsTreeView_NodeMouseDoubleClick; + SelDrawableModelsTreeView.KeyPress += SelDrawableModelsTreeView_KeyPress; + // + // tabPage13 + // + tabPage13.Controls.Add(SelDrawableTexturesTreeView); + tabPage13.Location = new System.Drawing.Point(4, 24); + tabPage13.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + tabPage13.Name = "tabPage13"; + tabPage13.Size = new System.Drawing.Size(231, 521); + tabPage13.TabIndex = 2; + tabPage13.Text = "Textures"; + tabPage13.UseVisualStyleBackColor = true; + // + // SelDrawableTexturesTreeView + // + SelDrawableTexturesTreeView.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelDrawableTexturesTreeView.Location = new System.Drawing.Point(0, 0); + SelDrawableTexturesTreeView.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelDrawableTexturesTreeView.Name = "SelDrawableTexturesTreeView"; + SelDrawableTexturesTreeView.ShowRootLines = false; + SelDrawableTexturesTreeView.Size = new System.Drawing.Size(229, 519); + SelDrawableTexturesTreeView.TabIndex = 40; + // + // SelectionExtensionTabPage + // + SelectionExtensionTabPage.Controls.Add(SelExtensionPropertyGrid); + SelectionExtensionTabPage.Location = new System.Drawing.Point(4, 24); + SelectionExtensionTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionExtensionTabPage.Name = "SelectionExtensionTabPage"; + SelectionExtensionTabPage.Size = new System.Drawing.Size(231, 562); + SelectionExtensionTabPage.TabIndex = 3; + SelectionExtensionTabPage.Text = "Ext"; + SelectionExtensionTabPage.UseVisualStyleBackColor = true; + // + // SelExtensionPropertyGrid + // + SelExtensionPropertyGrid.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelExtensionPropertyGrid.HelpVisible = false; + SelExtensionPropertyGrid.Location = new System.Drawing.Point(0, 7); + SelExtensionPropertyGrid.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelExtensionPropertyGrid.Name = "SelExtensionPropertyGrid"; + SelExtensionPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.NoSort; + SelExtensionPropertyGrid.ReadOnly = true; + SelExtensionPropertyGrid.Size = new System.Drawing.Size(230, 547); + SelExtensionPropertyGrid.TabIndex = 36; + SelExtensionPropertyGrid.ToolbarVisible = false; + // + // MouseSelectCheckBox + // + MouseSelectCheckBox.AutoSize = true; + MouseSelectCheckBox.Location = new System.Drawing.Point(9, 8); + MouseSelectCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MouseSelectCheckBox.Name = "MouseSelectCheckBox"; + MouseSelectCheckBox.Size = new System.Drawing.Size(158, 19); + MouseSelectCheckBox.TabIndex = 22; + MouseSelectCheckBox.Text = "Mouse select (right click)"; + MouseSelectCheckBox.UseVisualStyleBackColor = true; + MouseSelectCheckBox.CheckedChanged += MouseSelectCheckBox_CheckedChanged; + // + // OptionsTabPage + // + OptionsTabPage.Controls.Add(OptionsTabControl); + OptionsTabPage.Controls.Add(StatusBarCheckBox); + OptionsTabPage.Controls.Add(QuitButton); + OptionsTabPage.Controls.Add(ReloadSettingsButton); + OptionsTabPage.Controls.Add(SaveSettingsButton); + OptionsTabPage.Controls.Add(ReloadShadersButton); + OptionsTabPage.Controls.Add(ErrorConsoleCheckBox); + OptionsTabPage.Location = new System.Drawing.Point(4, 24); + OptionsTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + OptionsTabPage.Name = "OptionsTabPage"; + OptionsTabPage.Size = new System.Drawing.Size(240, 701); + OptionsTabPage.TabIndex = 3; + OptionsTabPage.Text = "Options"; + OptionsTabPage.UseVisualStyleBackColor = true; + // + // OptionsTabControl + // + OptionsTabControl.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + OptionsTabControl.Controls.Add(OptionsGeneralTabPage); + OptionsTabControl.Controls.Add(OptionsRenderTabPage); + OptionsTabControl.Controls.Add(OptionsHelpersTabPage); + OptionsTabControl.Controls.Add(OptionsLightingTabPage); + OptionsTabControl.Location = new System.Drawing.Point(0, 3); + OptionsTabControl.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + OptionsTabControl.Name = "OptionsTabControl"; + OptionsTabControl.SelectedIndex = 0; + OptionsTabControl.Size = new System.Drawing.Size(243, 586); + OptionsTabControl.TabIndex = 50; + // + // OptionsGeneralTabPage + // + OptionsGeneralTabPage.Controls.Add(CarGeneratorsCheckBox); + OptionsGeneralTabPage.Controls.Add(RenderEntitiesCheckBox); + OptionsGeneralTabPage.Controls.Add(AdvancedSettingsButton); + OptionsGeneralTabPage.Controls.Add(ControlSettingsButton); + OptionsGeneralTabPage.Controls.Add(MapViewDetailLabel); + OptionsGeneralTabPage.Controls.Add(label28); + OptionsGeneralTabPage.Controls.Add(MapViewDetailTrackBar); + OptionsGeneralTabPage.Controls.Add(CameraModeComboBox); + OptionsGeneralTabPage.Controls.Add(label24); + OptionsGeneralTabPage.Controls.Add(WaterQuadsCheckBox); + OptionsGeneralTabPage.Controls.Add(FieldOfViewLabel); + OptionsGeneralTabPage.Controls.Add(label22); + OptionsGeneralTabPage.Controls.Add(TimedEntitiesAlwaysOnCheckBox); + OptionsGeneralTabPage.Controls.Add(GrassCheckBox); + OptionsGeneralTabPage.Controls.Add(InteriorsCheckBox); + OptionsGeneralTabPage.Controls.Add(CollisionMeshLayerDrawableCheckBox); + OptionsGeneralTabPage.Controls.Add(CollisionMeshLayer2CheckBox); + OptionsGeneralTabPage.Controls.Add(CollisionMeshLayer1CheckBox); + OptionsGeneralTabPage.Controls.Add(label13); + OptionsGeneralTabPage.Controls.Add(CollisionMeshLayer0CheckBox); + OptionsGeneralTabPage.Controls.Add(label12); + OptionsGeneralTabPage.Controls.Add(CollisionMeshRangeTrackBar); + OptionsGeneralTabPage.Controls.Add(CollisionMeshesCheckBox); + OptionsGeneralTabPage.Controls.Add(FullScreenCheckBox); + OptionsGeneralTabPage.Controls.Add(TimedEntitiesCheckBox); + OptionsGeneralTabPage.Controls.Add(FieldOfViewTrackBar); + OptionsGeneralTabPage.Location = new System.Drawing.Point(4, 24); + OptionsGeneralTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + OptionsGeneralTabPage.Name = "OptionsGeneralTabPage"; + OptionsGeneralTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + OptionsGeneralTabPage.Size = new System.Drawing.Size(235, 558); + OptionsGeneralTabPage.TabIndex = 0; + OptionsGeneralTabPage.Text = "General"; + OptionsGeneralTabPage.UseVisualStyleBackColor = true; + // + // CarGeneratorsCheckBox + // + CarGeneratorsCheckBox.AutoSize = true; + CarGeneratorsCheckBox.Location = new System.Drawing.Point(12, 83); + CarGeneratorsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CarGeneratorsCheckBox.Name = "CarGeneratorsCheckBox"; + CarGeneratorsCheckBox.Size = new System.Drawing.Size(133, 19); + CarGeneratorsCheckBox.TabIndex = 31; + CarGeneratorsCheckBox.Text = "Show car generators"; + CarGeneratorsCheckBox.UseVisualStyleBackColor = true; + CarGeneratorsCheckBox.CheckedChanged += CarGeneratorsCheckBox_CheckedChanged; + // + // RenderEntitiesCheckBox + // + RenderEntitiesCheckBox.AutoSize = true; + RenderEntitiesCheckBox.Checked = true; + RenderEntitiesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + RenderEntitiesCheckBox.Location = new System.Drawing.Point(12, 35); + RenderEntitiesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + RenderEntitiesCheckBox.Name = "RenderEntitiesCheckBox"; + RenderEntitiesCheckBox.Size = new System.Drawing.Size(96, 19); + RenderEntitiesCheckBox.TabIndex = 29; + RenderEntitiesCheckBox.Text = "Show entities"; + RenderEntitiesCheckBox.UseVisualStyleBackColor = true; + RenderEntitiesCheckBox.CheckedChanged += RenderEntitiesCheckBox_CheckedChanged; + // + // AdvancedSettingsButton + // + AdvancedSettingsButton.Location = new System.Drawing.Point(118, 526); + AdvancedSettingsButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AdvancedSettingsButton.Name = "AdvancedSettingsButton"; + AdvancedSettingsButton.Size = new System.Drawing.Size(108, 27); + AdvancedSettingsButton.TabIndex = 46; + AdvancedSettingsButton.Text = "Advanced..."; + AdvancedSettingsButton.UseVisualStyleBackColor = true; + AdvancedSettingsButton.Click += AdvancedSettingsButton_Click; + // + // ControlSettingsButton + // + ControlSettingsButton.Location = new System.Drawing.Point(2, 526); + ControlSettingsButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ControlSettingsButton.Name = "ControlSettingsButton"; + ControlSettingsButton.Size = new System.Drawing.Size(108, 27); + ControlSettingsButton.TabIndex = 45; + ControlSettingsButton.Text = "Controls..."; + ControlSettingsButton.UseVisualStyleBackColor = true; + ControlSettingsButton.Click += ControlSettingsButton_Click; + // + // MapViewDetailLabel + // + MapViewDetailLabel.AutoSize = true; + MapViewDetailLabel.Location = new System.Drawing.Point(110, 451); + MapViewDetailLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + MapViewDetailLabel.Name = "MapViewDetailLabel"; + MapViewDetailLabel.Size = new System.Drawing.Size(22, 15); + MapViewDetailLabel.TabIndex = 66; + MapViewDetailLabel.Text = "1.0"; + // + // label28 + // + label28.AutoSize = true; + label28.Location = new System.Drawing.Point(5, 451); + label28.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label28.Name = "label28"; + label28.Size = new System.Drawing.Size(93, 15); + label28.TabIndex = 65; + label28.Text = "Map view detail:"; + // + // MapViewDetailTrackBar + // + MapViewDetailTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + MapViewDetailTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + MapViewDetailTrackBar.Enabled = false; + MapViewDetailTrackBar.LargeChange = 1; + MapViewDetailTrackBar.Location = new System.Drawing.Point(7, 470); + MapViewDetailTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MapViewDetailTrackBar.Maximum = 30; + MapViewDetailTrackBar.Minimum = 2; + MapViewDetailTrackBar.Name = "MapViewDetailTrackBar"; + MapViewDetailTrackBar.Size = new System.Drawing.Size(219, 45); + MapViewDetailTrackBar.TabIndex = 44; + MapViewDetailTrackBar.TickFrequency = 2; + MapViewDetailTrackBar.Value = 10; + MapViewDetailTrackBar.Scroll += MapViewDetailTrackBar_Scroll; + // + // CameraModeComboBox + // + CameraModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CameraModeComboBox.FormattingEnabled = true; + CameraModeComboBox.Items.AddRange(new object[] { "Perspective", "Orthographic", "2D Map" }); + CameraModeComboBox.Location = new System.Drawing.Point(96, 352); + CameraModeComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CameraModeComboBox.Name = "CameraModeComboBox"; + CameraModeComboBox.Size = new System.Drawing.Size(130, 23); + CameraModeComboBox.TabIndex = 42; + CameraModeComboBox.SelectedIndexChanged += CameraModeComboBox_SelectedIndexChanged; + CameraModeComboBox.KeyPress += CameraModeComboBox_KeyPress; + // + // label24 + // + label24.AutoSize = true; + label24.Location = new System.Drawing.Point(5, 355); + label24.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label24.Name = "label24"; + label24.Size = new System.Drawing.Size(85, 15); + label24.TabIndex = 63; + label24.Text = "Camera mode:"; + // + // WaterQuadsCheckBox + // + WaterQuadsCheckBox.AutoSize = true; + WaterQuadsCheckBox.Checked = true; + WaterQuadsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + WaterQuadsCheckBox.Location = new System.Drawing.Point(12, 156); + WaterQuadsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WaterQuadsCheckBox.Name = "WaterQuadsCheckBox"; + WaterQuadsCheckBox.Size = new System.Drawing.Size(122, 19); + WaterQuadsCheckBox.TabIndex = 35; + WaterQuadsCheckBox.Text = "Show water quads"; + WaterQuadsCheckBox.UseVisualStyleBackColor = true; + WaterQuadsCheckBox.CheckedChanged += WaterQuadsCheckBox_CheckedChanged; + // + // FieldOfViewLabel + // + FieldOfViewLabel.AutoSize = true; + FieldOfViewLabel.Location = new System.Drawing.Point(92, 387); + FieldOfViewLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + FieldOfViewLabel.Name = "FieldOfViewLabel"; + FieldOfViewLabel.Size = new System.Drawing.Size(22, 15); + FieldOfViewLabel.TabIndex = 59; + FieldOfViewLabel.Text = "1.0"; + // + // label22 + // + label22.AutoSize = true; + label22.Location = new System.Drawing.Point(5, 387); + label22.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label22.Name = "label22"; + label22.Size = new System.Drawing.Size(76, 15); + label22.TabIndex = 58; + label22.Text = "Field of view:"; + // + // TimedEntitiesAlwaysOnCheckBox + // + TimedEntitiesAlwaysOnCheckBox.AutoSize = true; + TimedEntitiesAlwaysOnCheckBox.Location = new System.Drawing.Point(153, 107); + TimedEntitiesAlwaysOnCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimedEntitiesAlwaysOnCheckBox.Name = "TimedEntitiesAlwaysOnCheckBox"; + TimedEntitiesAlwaysOnCheckBox.Size = new System.Drawing.Size(61, 19); + TimedEntitiesAlwaysOnCheckBox.TabIndex = 33; + TimedEntitiesAlwaysOnCheckBox.Text = "always"; + TimedEntitiesAlwaysOnCheckBox.UseVisualStyleBackColor = true; + TimedEntitiesAlwaysOnCheckBox.CheckedChanged += TimedEntitiesAlwaysOnCheckBox_CheckedChanged; + // + // GrassCheckBox + // + GrassCheckBox.AutoSize = true; + GrassCheckBox.Checked = true; + GrassCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + GrassCheckBox.Location = new System.Drawing.Point(12, 59); + GrassCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + GrassCheckBox.Name = "GrassCheckBox"; + GrassCheckBox.Size = new System.Drawing.Size(85, 19); + GrassCheckBox.TabIndex = 30; + GrassCheckBox.Text = "Show grass"; + GrassCheckBox.UseVisualStyleBackColor = true; + GrassCheckBox.CheckedChanged += GrassCheckBox_CheckedChanged; + // + // InteriorsCheckBox + // + InteriorsCheckBox.AutoSize = true; + InteriorsCheckBox.Checked = true; + InteriorsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + InteriorsCheckBox.Location = new System.Drawing.Point(12, 132); + InteriorsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + InteriorsCheckBox.Name = "InteriorsCheckBox"; + InteriorsCheckBox.Size = new System.Drawing.Size(101, 19); + InteriorsCheckBox.TabIndex = 34; + InteriorsCheckBox.Text = "Show interiors"; + InteriorsCheckBox.UseVisualStyleBackColor = true; + InteriorsCheckBox.CheckedChanged += InteriorsCheckBox_CheckedChanged; + // + // CollisionMeshLayerDrawableCheckBox + // + CollisionMeshLayerDrawableCheckBox.AutoSize = true; + CollisionMeshLayerDrawableCheckBox.Checked = true; + CollisionMeshLayerDrawableCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + CollisionMeshLayerDrawableCheckBox.Location = new System.Drawing.Point(138, 302); + CollisionMeshLayerDrawableCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CollisionMeshLayerDrawableCheckBox.Name = "CollisionMeshLayerDrawableCheckBox"; + CollisionMeshLayerDrawableCheckBox.Size = new System.Drawing.Size(75, 19); + CollisionMeshLayerDrawableCheckBox.TabIndex = 41; + CollisionMeshLayerDrawableCheckBox.Text = "Drawable"; + CollisionMeshLayerDrawableCheckBox.UseVisualStyleBackColor = true; + CollisionMeshLayerDrawableCheckBox.CheckedChanged += CollisionMeshLayerDrawableCheckBox_CheckedChanged; + // + // CollisionMeshLayer2CheckBox + // + CollisionMeshLayer2CheckBox.AutoSize = true; + CollisionMeshLayer2CheckBox.Checked = true; + CollisionMeshLayer2CheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + CollisionMeshLayer2CheckBox.Location = new System.Drawing.Point(96, 302); + CollisionMeshLayer2CheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CollisionMeshLayer2CheckBox.Name = "CollisionMeshLayer2CheckBox"; + CollisionMeshLayer2CheckBox.Size = new System.Drawing.Size(32, 19); + CollisionMeshLayer2CheckBox.TabIndex = 40; + CollisionMeshLayer2CheckBox.Text = "2"; + CollisionMeshLayer2CheckBox.UseVisualStyleBackColor = true; + CollisionMeshLayer2CheckBox.CheckedChanged += CollisionMeshLayer2CheckBox_CheckedChanged; + // + // CollisionMeshLayer1CheckBox + // + CollisionMeshLayer1CheckBox.AutoSize = true; + CollisionMeshLayer1CheckBox.Checked = true; + CollisionMeshLayer1CheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + CollisionMeshLayer1CheckBox.Location = new System.Drawing.Point(54, 302); + CollisionMeshLayer1CheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CollisionMeshLayer1CheckBox.Name = "CollisionMeshLayer1CheckBox"; + CollisionMeshLayer1CheckBox.Size = new System.Drawing.Size(32, 19); + CollisionMeshLayer1CheckBox.TabIndex = 39; + CollisionMeshLayer1CheckBox.Text = "1"; + CollisionMeshLayer1CheckBox.UseVisualStyleBackColor = true; + CollisionMeshLayer1CheckBox.CheckedChanged += CollisionMeshLayer1CheckBox_CheckedChanged; + // + // label13 + // + label13.AutoSize = true; + label13.Location = new System.Drawing.Point(5, 282); + label13.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label13.Name = "label13"; + label13.Size = new System.Drawing.Size(121, 15); + label13.TabIndex = 54; + label13.Text = "Collision mesh layers:"; + // + // CollisionMeshLayer0CheckBox + // + CollisionMeshLayer0CheckBox.AutoSize = true; + CollisionMeshLayer0CheckBox.Checked = true; + CollisionMeshLayer0CheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + CollisionMeshLayer0CheckBox.Location = new System.Drawing.Point(12, 302); + CollisionMeshLayer0CheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CollisionMeshLayer0CheckBox.Name = "CollisionMeshLayer0CheckBox"; + CollisionMeshLayer0CheckBox.Size = new System.Drawing.Size(32, 19); + CollisionMeshLayer0CheckBox.TabIndex = 38; + CollisionMeshLayer0CheckBox.Text = "0"; + CollisionMeshLayer0CheckBox.UseVisualStyleBackColor = true; + CollisionMeshLayer0CheckBox.CheckedChanged += CollisionMeshLayer0CheckBox_CheckedChanged; + // + // label12 + // + label12.AutoSize = true; + label12.Location = new System.Drawing.Point(5, 223); + label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label12.Name = "label12"; + label12.Size = new System.Drawing.Size(145, 15); + label12.TabIndex = 51; + label12.Text = "Collision/nav mesh range:"; + // + // CollisionMeshRangeTrackBar + // + CollisionMeshRangeTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CollisionMeshRangeTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + CollisionMeshRangeTrackBar.LargeChange = 1; + CollisionMeshRangeTrackBar.Location = new System.Drawing.Point(7, 241); + CollisionMeshRangeTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CollisionMeshRangeTrackBar.Maximum = 15; + CollisionMeshRangeTrackBar.Minimum = 1; + CollisionMeshRangeTrackBar.Name = "CollisionMeshRangeTrackBar"; + CollisionMeshRangeTrackBar.Size = new System.Drawing.Size(219, 45); + CollisionMeshRangeTrackBar.TabIndex = 37; + CollisionMeshRangeTrackBar.Value = 6; + CollisionMeshRangeTrackBar.Scroll += CollisionMeshRangeTrackBar_Scroll; + // + // CollisionMeshesCheckBox + // + CollisionMeshesCheckBox.AutoSize = true; + CollisionMeshesCheckBox.Location = new System.Drawing.Point(12, 197); + CollisionMeshesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CollisionMeshesCheckBox.Name = "CollisionMeshesCheckBox"; + CollisionMeshesCheckBox.Size = new System.Drawing.Size(145, 19); + CollisionMeshesCheckBox.TabIndex = 36; + CollisionMeshesCheckBox.Text = "Show collision meshes"; + CollisionMeshesCheckBox.UseVisualStyleBackColor = true; + CollisionMeshesCheckBox.CheckedChanged += CollisionMeshesCheckBox_CheckedChanged; + // + // FullScreenCheckBox + // + FullScreenCheckBox.AutoSize = true; + FullScreenCheckBox.Location = new System.Drawing.Point(12, 10); + FullScreenCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + FullScreenCheckBox.Name = "FullScreenCheckBox"; + FullScreenCheckBox.Size = new System.Drawing.Size(192, 19); + FullScreenCheckBox.TabIndex = 28; + FullScreenCheckBox.Text = "Full screen (borderless window)"; + FullScreenCheckBox.UseVisualStyleBackColor = true; + FullScreenCheckBox.CheckedChanged += FullScreenCheckBox_CheckedChanged; + // + // TimedEntitiesCheckBox + // + TimedEntitiesCheckBox.AutoSize = true; + TimedEntitiesCheckBox.Checked = true; + TimedEntitiesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + TimedEntitiesCheckBox.Location = new System.Drawing.Point(12, 107); + TimedEntitiesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimedEntitiesCheckBox.Name = "TimedEntitiesCheckBox"; + TimedEntitiesCheckBox.Size = new System.Drawing.Size(130, 19); + TimedEntitiesCheckBox.TabIndex = 32; + TimedEntitiesCheckBox.Text = "Show timed entities"; + TimedEntitiesCheckBox.UseVisualStyleBackColor = true; + TimedEntitiesCheckBox.CheckedChanged += TimedEntitiesCheckBox_CheckedChanged; + // + // FieldOfViewTrackBar + // + FieldOfViewTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + FieldOfViewTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + FieldOfViewTrackBar.LargeChange = 1; + FieldOfViewTrackBar.Location = new System.Drawing.Point(7, 405); + FieldOfViewTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + FieldOfViewTrackBar.Maximum = 200; + FieldOfViewTrackBar.Minimum = 10; + FieldOfViewTrackBar.Name = "FieldOfViewTrackBar"; + FieldOfViewTrackBar.Size = new System.Drawing.Size(219, 45); + FieldOfViewTrackBar.TabIndex = 43; + FieldOfViewTrackBar.TickFrequency = 10; + FieldOfViewTrackBar.Value = 100; + FieldOfViewTrackBar.Scroll += FieldOfViewTrackBar_Scroll; + // + // OptionsRenderTabPage + // + OptionsRenderTabPage.Controls.Add(AntiAliasingValue); + OptionsRenderTabPage.Controls.Add(label34); + OptionsRenderTabPage.Controls.Add(AntiAliasingTrackBar); + OptionsRenderTabPage.Controls.Add(FarClipUpDown); + OptionsRenderTabPage.Controls.Add(label32); + OptionsRenderTabPage.Controls.Add(NearClipUpDown); + OptionsRenderTabPage.Controls.Add(label31); + OptionsRenderTabPage.Controls.Add(HDTexturesCheckBox); + OptionsRenderTabPage.Controls.Add(WireframeCheckBox); + OptionsRenderTabPage.Controls.Add(RenderModeComboBox); + OptionsRenderTabPage.Controls.Add(label11); + OptionsRenderTabPage.Controls.Add(TextureSamplerComboBox); + OptionsRenderTabPage.Controls.Add(TextureCoordsComboBox); + OptionsRenderTabPage.Controls.Add(label10); + OptionsRenderTabPage.Controls.Add(AnisotropicFilteringCheckBox); + OptionsRenderTabPage.Controls.Add(ProxiesCheckBox); + OptionsRenderTabPage.Controls.Add(WaitForChildrenCheckBox); + OptionsRenderTabPage.Controls.Add(label14); + OptionsRenderTabPage.Location = new System.Drawing.Point(4, 24); + OptionsRenderTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + OptionsRenderTabPage.Name = "OptionsRenderTabPage"; + OptionsRenderTabPage.Size = new System.Drawing.Size(235, 558); + OptionsRenderTabPage.TabIndex = 3; + OptionsRenderTabPage.Text = "Render"; + OptionsRenderTabPage.UseVisualStyleBackColor = true; // // AntiAliasingValue // - this.AntiAliasingValue.AutoSize = true; - this.AntiAliasingValue.Location = new System.Drawing.Point(147, 253); - this.AntiAliasingValue.Name = "AntiAliasingValue"; - this.AntiAliasingValue.Size = new System.Drawing.Size(13, 13); - this.AntiAliasingValue.TabIndex = 64; - this.AntiAliasingValue.Text = "1"; + AntiAliasingValue.AutoSize = true; + AntiAliasingValue.Location = new System.Drawing.Point(172, 292); + AntiAliasingValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + AntiAliasingValue.Name = "AntiAliasingValue"; + AntiAliasingValue.Size = new System.Drawing.Size(13, 15); + AntiAliasingValue.TabIndex = 64; + AntiAliasingValue.Text = "1"; + // + // AntiAliasingTrackBar + // + AntiAliasingTrackBar.LargeChange = 1; + AntiAliasingTrackBar.Location = new System.Drawing.Point(12, 310); + AntiAliasingTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AntiAliasingTrackBar.Maximum = 8; + AntiAliasingTrackBar.Minimum = 1; + AntiAliasingTrackBar.Name = "AntiAliasingTrackBar"; + AntiAliasingTrackBar.Size = new System.Drawing.Size(215, 45); + AntiAliasingTrackBar.TabIndex = 62; + AntiAliasingTrackBar.Value = 1; + AntiAliasingTrackBar.ValueChanged += AntiAliasingTrackBar_ValueChanged; + // + // FarClipUpDown + // + FarClipUpDown.Increment = new decimal(new int[] { 100, 0, 0, 0 }); + FarClipUpDown.Location = new System.Drawing.Point(93, 399); + FarClipUpDown.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + FarClipUpDown.Maximum = new decimal(new int[] { 100000, 0, 0, 0 }); + FarClipUpDown.Minimum = new decimal(new int[] { 100, 0, 0, 0 }); + FarClipUpDown.Name = "FarClipUpDown"; + FarClipUpDown.Size = new System.Drawing.Size(133, 23); + FarClipUpDown.TabIndex = 61; + FarClipUpDown.Value = new decimal(new int[] { 100000, 0, 0, 0 }); + FarClipUpDown.ValueChanged += FarClipUpDown_ValueChanged; + // + // label32 + // + label32.AutoSize = true; + label32.Location = new System.Drawing.Point(5, 402); + label32.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label32.Name = "label32"; + label32.Size = new System.Drawing.Size(50, 15); + label32.TabIndex = 60; + label32.Text = "Far Clip:"; + // + // NearClipUpDown + // + NearClipUpDown.DecimalPlaces = 3; + NearClipUpDown.Increment = new decimal(new int[] { 1, 0, 0, 65536 }); + NearClipUpDown.Location = new System.Drawing.Point(93, 369); + NearClipUpDown.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + NearClipUpDown.Maximum = new decimal(new int[] { 10, 0, 0, 0 }); + NearClipUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 196608 }); + NearClipUpDown.Name = "NearClipUpDown"; + NearClipUpDown.Size = new System.Drawing.Size(133, 23); + NearClipUpDown.TabIndex = 59; + NearClipUpDown.Value = new decimal(new int[] { 1, 0, 0, 131072 }); + NearClipUpDown.ValueChanged += NearClipUpDown_ValueChanged; + // + // label31 + // + label31.AutoSize = true; + label31.Location = new System.Drawing.Point(5, 372); + label31.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label31.Name = "label31"; + label31.Size = new System.Drawing.Size(59, 15); + label31.TabIndex = 58; + label31.Text = "Near Clip:"; + // + // HDTexturesCheckBox + // + HDTexturesCheckBox.AutoSize = true; + HDTexturesCheckBox.Checked = true; + HDTexturesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + HDTexturesCheckBox.Location = new System.Drawing.Point(12, 267); + HDTexturesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + HDTexturesCheckBox.Name = "HDTexturesCheckBox"; + HDTexturesCheckBox.Size = new System.Drawing.Size(88, 19); + HDTexturesCheckBox.TabIndex = 57; + HDTexturesCheckBox.Text = "HD textures"; + HDTexturesCheckBox.UseVisualStyleBackColor = true; + HDTexturesCheckBox.CheckedChanged += HDTexturesCheckBox_CheckedChanged; + // + // WireframeCheckBox + // + WireframeCheckBox.AutoSize = true; + WireframeCheckBox.Location = new System.Drawing.Point(12, 133); + WireframeCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WireframeCheckBox.Name = "WireframeCheckBox"; + WireframeCheckBox.Size = new System.Drawing.Size(81, 19); + WireframeCheckBox.TabIndex = 49; + WireframeCheckBox.Text = "Wireframe"; + WireframeCheckBox.UseVisualStyleBackColor = true; + WireframeCheckBox.CheckedChanged += WireframeCheckBox_CheckedChanged; + // + // RenderModeComboBox + // + RenderModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + RenderModeComboBox.FormattingEnabled = true; + RenderModeComboBox.Items.AddRange(new object[] { "Default", "Single texture", "Vertex normals", "Vertex tangents", "Vertex colour 1", "Vertex colour 2", "Texture coord 1", "Texture coord 2", "Texture coord 3" }); + RenderModeComboBox.Location = new System.Drawing.Point(93, 18); + RenderModeComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + RenderModeComboBox.Name = "RenderModeComboBox"; + RenderModeComboBox.Size = new System.Drawing.Size(132, 23); + RenderModeComboBox.TabIndex = 46; + RenderModeComboBox.SelectedIndexChanged += RenderModeComboBox_SelectedIndexChanged; + RenderModeComboBox.KeyPress += RenderModeComboBox_KeyPress; + // + // label11 + // + label11.AutoSize = true; + label11.Location = new System.Drawing.Point(5, 53); + label11.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label11.Name = "label11"; + label11.Size = new System.Drawing.Size(72, 15); + label11.TabIndex = 50; + label11.Text = "Tex sampler:"; + // + // TextureSamplerComboBox + // + TextureSamplerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + TextureSamplerComboBox.Enabled = false; + TextureSamplerComboBox.FormattingEnabled = true; + TextureSamplerComboBox.Location = new System.Drawing.Point(93, 50); + TextureSamplerComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TextureSamplerComboBox.Name = "TextureSamplerComboBox"; + TextureSamplerComboBox.Size = new System.Drawing.Size(132, 23); + TextureSamplerComboBox.TabIndex = 47; + TextureSamplerComboBox.SelectedIndexChanged += TextureSamplerComboBox_SelectedIndexChanged; + TextureSamplerComboBox.KeyPress += TextureSamplerComboBox_KeyPress; + // + // TextureCoordsComboBox + // + TextureCoordsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + TextureCoordsComboBox.Enabled = false; + TextureCoordsComboBox.FormattingEnabled = true; + TextureCoordsComboBox.Items.AddRange(new object[] { "Texture coord 1", "Texture coord 2", "Texture coord 3" }); + TextureCoordsComboBox.Location = new System.Drawing.Point(93, 81); + TextureCoordsComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TextureCoordsComboBox.Name = "TextureCoordsComboBox"; + TextureCoordsComboBox.Size = new System.Drawing.Size(132, 23); + TextureCoordsComboBox.TabIndex = 48; + TextureCoordsComboBox.SelectedIndexChanged += TextureCoordsComboBox_SelectedIndexChanged; + TextureCoordsComboBox.KeyPress += TextureCoordsComboBox_KeyPress; + // + // label10 + // + label10.AutoSize = true; + label10.Location = new System.Drawing.Point(5, 22); + label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label10.Name = "label10"; + label10.Size = new System.Drawing.Size(81, 15); + label10.TabIndex = 48; + label10.Text = "Render mode:"; + // + // AnisotropicFilteringCheckBox + // + AnisotropicFilteringCheckBox.AutoSize = true; + AnisotropicFilteringCheckBox.Checked = true; + AnisotropicFilteringCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + AnisotropicFilteringCheckBox.Location = new System.Drawing.Point(12, 159); + AnisotropicFilteringCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AnisotropicFilteringCheckBox.Name = "AnisotropicFilteringCheckBox"; + AnisotropicFilteringCheckBox.Size = new System.Drawing.Size(131, 19); + AnisotropicFilteringCheckBox.TabIndex = 50; + AnisotropicFilteringCheckBox.Text = "Anisotropic filtering"; + AnisotropicFilteringCheckBox.UseVisualStyleBackColor = true; + AnisotropicFilteringCheckBox.CheckedChanged += AnisotropicFilteringCheckBox_CheckedChanged; + // + // ProxiesCheckBox + // + ProxiesCheckBox.AutoSize = true; + ProxiesCheckBox.Location = new System.Drawing.Point(12, 230); + ProxiesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ProxiesCheckBox.Name = "ProxiesCheckBox"; + ProxiesCheckBox.Size = new System.Drawing.Size(96, 19); + ProxiesCheckBox.TabIndex = 52; + ProxiesCheckBox.Text = "Show proxies"; + ProxiesCheckBox.UseVisualStyleBackColor = true; + ProxiesCheckBox.CheckedChanged += ProxiesCheckBox_CheckedChanged; + // + // WaitForChildrenCheckBox + // + WaitForChildrenCheckBox.AutoSize = true; + WaitForChildrenCheckBox.Checked = true; + WaitForChildrenCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + WaitForChildrenCheckBox.Location = new System.Drawing.Point(12, 186); + WaitForChildrenCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WaitForChildrenCheckBox.Name = "WaitForChildrenCheckBox"; + WaitForChildrenCheckBox.Size = new System.Drawing.Size(154, 19); + WaitForChildrenCheckBox.TabIndex = 51; + WaitForChildrenCheckBox.Text = "Wait for children to load"; + WaitForChildrenCheckBox.UseVisualStyleBackColor = true; + WaitForChildrenCheckBox.CheckedChanged += WaitForChildrenCheckBox_CheckedChanged; + // + // label14 + // + label14.AutoSize = true; + label14.Location = new System.Drawing.Point(5, 84); + label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label14.Name = "label14"; + label14.Size = new System.Drawing.Size(66, 15); + label14.TabIndex = 56; + label14.Text = "Tex coords:"; + // + // OptionsHelpersTabPage + // + OptionsHelpersTabPage.Controls.Add(SnapAngleUpDown); + OptionsHelpersTabPage.Controls.Add(label33); + OptionsHelpersTabPage.Controls.Add(SnapGridSizeUpDown); + OptionsHelpersTabPage.Controls.Add(label26); + OptionsHelpersTabPage.Controls.Add(SkeletonsCheckBox); + OptionsHelpersTabPage.Controls.Add(AudioOuterBoundsCheckBox); + OptionsHelpersTabPage.Controls.Add(PopZonesCheckBox); + OptionsHelpersTabPage.Controls.Add(NavMeshesCheckBox); + OptionsHelpersTabPage.Controls.Add(TrainPathsCheckBox); + OptionsHelpersTabPage.Controls.Add(PathsDepthClipCheckBox); + OptionsHelpersTabPage.Controls.Add(PathBoundsCheckBox); + OptionsHelpersTabPage.Controls.Add(SelectionWidgetCheckBox); + OptionsHelpersTabPage.Controls.Add(MarkerStyleComboBox); + OptionsHelpersTabPage.Controls.Add(label4); + OptionsHelpersTabPage.Controls.Add(LocatorStyleComboBox); + OptionsHelpersTabPage.Controls.Add(label5); + OptionsHelpersTabPage.Controls.Add(MarkerDepthClipCheckBox); + OptionsHelpersTabPage.Controls.Add(label9); + OptionsHelpersTabPage.Controls.Add(PathsCheckBox); + OptionsHelpersTabPage.Controls.Add(SelectionBoundsCheckBox); + OptionsHelpersTabPage.Controls.Add(BoundsDepthClipCheckBox); + OptionsHelpersTabPage.Controls.Add(BoundsRangeTrackBar); + OptionsHelpersTabPage.Controls.Add(BoundsStyleComboBox); + OptionsHelpersTabPage.Controls.Add(label8); + OptionsHelpersTabPage.Location = new System.Drawing.Point(4, 24); + OptionsHelpersTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + OptionsHelpersTabPage.Name = "OptionsHelpersTabPage"; + OptionsHelpersTabPage.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + OptionsHelpersTabPage.Size = new System.Drawing.Size(235, 558); + OptionsHelpersTabPage.TabIndex = 1; + OptionsHelpersTabPage.Text = "Helpers"; + OptionsHelpersTabPage.UseVisualStyleBackColor = true; + // + // SnapAngleUpDown + // + SnapAngleUpDown.DecimalPlaces = 1; + SnapAngleUpDown.Location = new System.Drawing.Point(114, 322); + SnapAngleUpDown.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SnapAngleUpDown.Maximum = new decimal(new int[] { 180, 0, 0, 0 }); + SnapAngleUpDown.Name = "SnapAngleUpDown"; + SnapAngleUpDown.Size = new System.Drawing.Size(112, 23); + SnapAngleUpDown.TabIndex = 32; + SnapAngleUpDown.Value = new decimal(new int[] { 50, 0, 0, 65536 }); + SnapAngleUpDown.ValueChanged += SnapAngleUpDown_ValueChanged; + // + // label33 + // + label33.AutoSize = true; + label33.Location = new System.Drawing.Point(5, 324); + label33.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label33.Name = "label33"; + label33.Size = new System.Drawing.Size(99, 15); + label33.TabIndex = 31; + label33.Text = "Snap angle (deg):"; + // + // SnapGridSizeUpDown + // + SnapGridSizeUpDown.DecimalPlaces = 2; + SnapGridSizeUpDown.Location = new System.Drawing.Point(114, 292); + SnapGridSizeUpDown.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SnapGridSizeUpDown.Maximum = new decimal(new int[] { 1000, 0, 0, 0 }); + SnapGridSizeUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 131072 }); + SnapGridSizeUpDown.Name = "SnapGridSizeUpDown"; + SnapGridSizeUpDown.Size = new System.Drawing.Size(112, 23); + SnapGridSizeUpDown.TabIndex = 30; + SnapGridSizeUpDown.Value = new decimal(new int[] { 100, 0, 0, 131072 }); + SnapGridSizeUpDown.ValueChanged += SnapGridSizeUpDown_ValueChanged; + // + // label26 + // + label26.AutoSize = true; + label26.Location = new System.Drawing.Point(5, 294); + label26.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label26.Name = "label26"; + label26.Size = new System.Drawing.Size(82, 15); + label26.TabIndex = 29; + label26.Text = "Snap grid size:"; + // + // SkeletonsCheckBox + // + SkeletonsCheckBox.AutoSize = true; + SkeletonsCheckBox.Location = new System.Drawing.Point(12, 474); + SkeletonsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SkeletonsCheckBox.Name = "SkeletonsCheckBox"; + SkeletonsCheckBox.Size = new System.Drawing.Size(107, 19); + SkeletonsCheckBox.TabIndex = 38; + SkeletonsCheckBox.Text = "Show skeletons"; + SkeletonsCheckBox.UseVisualStyleBackColor = true; + SkeletonsCheckBox.CheckedChanged += SkeletonsCheckBox_CheckedChanged; + // + // AudioOuterBoundsCheckBox + // + AudioOuterBoundsCheckBox.AutoSize = true; + AudioOuterBoundsCheckBox.Checked = true; + AudioOuterBoundsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + AudioOuterBoundsCheckBox.Location = new System.Drawing.Point(12, 527); + AudioOuterBoundsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + AudioOuterBoundsCheckBox.Name = "AudioOuterBoundsCheckBox"; + AudioOuterBoundsCheckBox.Size = new System.Drawing.Size(162, 19); + AudioOuterBoundsCheckBox.TabIndex = 40; + AudioOuterBoundsCheckBox.Text = "Show audio outer bounds"; + AudioOuterBoundsCheckBox.UseVisualStyleBackColor = true; + AudioOuterBoundsCheckBox.CheckedChanged += AudioOuterBoundsCheckBox_CheckedChanged; + // + // PopZonesCheckBox + // + PopZonesCheckBox.AutoSize = true; + PopZonesCheckBox.Location = new System.Drawing.Point(12, 448); + PopZonesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + PopZonesCheckBox.Name = "PopZonesCheckBox"; + PopZonesCheckBox.Size = new System.Drawing.Size(149, 19); + PopZonesCheckBox.TabIndex = 37; + PopZonesCheckBox.Text = "Show population zones"; + PopZonesCheckBox.UseVisualStyleBackColor = true; + PopZonesCheckBox.CheckedChanged += PopZonesCheckBox_CheckedChanged; + // + // NavMeshesCheckBox + // + NavMeshesCheckBox.AutoSize = true; + NavMeshesCheckBox.Location = new System.Drawing.Point(12, 421); + NavMeshesCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + NavMeshesCheckBox.Name = "NavMeshesCheckBox"; + NavMeshesCheckBox.Size = new System.Drawing.Size(120, 19); + NavMeshesCheckBox.TabIndex = 36; + NavMeshesCheckBox.Text = "Show nav meshes"; + NavMeshesCheckBox.UseVisualStyleBackColor = true; + NavMeshesCheckBox.CheckedChanged += NavMeshesCheckBox_CheckedChanged; + // + // TrainPathsCheckBox + // + TrainPathsCheckBox.AutoSize = true; + TrainPathsCheckBox.Location = new System.Drawing.Point(12, 395); + TrainPathsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TrainPathsCheckBox.Name = "TrainPathsCheckBox"; + TrainPathsCheckBox.Size = new System.Drawing.Size(114, 19); + TrainPathsCheckBox.TabIndex = 35; + TrainPathsCheckBox.Text = "Show train paths"; + TrainPathsCheckBox.UseVisualStyleBackColor = true; + TrainPathsCheckBox.CheckedChanged += TrainPathsCheckBox_CheckedChanged; + // + // PathsDepthClipCheckBox + // + PathsDepthClipCheckBox.AutoSize = true; + PathsDepthClipCheckBox.Checked = true; + PathsDepthClipCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + PathsDepthClipCheckBox.Location = new System.Drawing.Point(12, 501); + PathsDepthClipCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + PathsDepthClipCheckBox.Name = "PathsDepthClipCheckBox"; + PathsDepthClipCheckBox.Size = new System.Drawing.Size(111, 19); + PathsDepthClipCheckBox.TabIndex = 39; + PathsDepthClipCheckBox.Text = "Paths depth clip"; + PathsDepthClipCheckBox.UseVisualStyleBackColor = true; + PathsDepthClipCheckBox.CheckedChanged += PathsDepthClipCheckBox_CheckedChanged; + // + // PathBoundsCheckBox + // + PathBoundsCheckBox.AutoSize = true; + PathBoundsCheckBox.Checked = true; + PathBoundsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + PathBoundsCheckBox.Location = new System.Drawing.Point(114, 368); + PathBoundsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + PathBoundsCheckBox.Name = "PathBoundsCheckBox"; + PathBoundsCheckBox.Size = new System.Drawing.Size(93, 19); + PathBoundsCheckBox.TabIndex = 34; + PathBoundsCheckBox.Text = "Path bounds"; + PathBoundsCheckBox.UseVisualStyleBackColor = true; + PathBoundsCheckBox.CheckedChanged += PathBoundsCheckBox_CheckedChanged; + // + // SelectionWidgetCheckBox + // + SelectionWidgetCheckBox.AutoSize = true; + SelectionWidgetCheckBox.Checked = true; + SelectionWidgetCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + SelectionWidgetCheckBox.Location = new System.Drawing.Point(12, 267); + SelectionWidgetCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionWidgetCheckBox.Name = "SelectionWidgetCheckBox"; + SelectionWidgetCheckBox.Size = new System.Drawing.Size(94, 19); + SelectionWidgetCheckBox.TabIndex = 28; + SelectionWidgetCheckBox.Text = "Show widget"; + SelectionWidgetCheckBox.UseVisualStyleBackColor = true; + SelectionWidgetCheckBox.CheckedChanged += SelectionWidgetCheckBox_CheckedChanged; + // + // MarkerStyleComboBox + // + MarkerStyleComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + MarkerStyleComboBox.FormattingEnabled = true; + MarkerStyleComboBox.Location = new System.Drawing.Point(93, 7); + MarkerStyleComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MarkerStyleComboBox.Name = "MarkerStyleComboBox"; + MarkerStyleComboBox.Size = new System.Drawing.Size(132, 23); + MarkerStyleComboBox.TabIndex = 18; + MarkerStyleComboBox.SelectedIndexChanged += MarkerStyleComboBox_SelectedIndexChanged; + MarkerStyleComboBox.KeyPress += MarkerStyleComboBox_KeyPress; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new System.Drawing.Point(5, 10); + label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label4.Name = "label4"; + label4.Size = new System.Drawing.Size(74, 15); + label4.TabIndex = 17; + label4.Text = "Marker style:"; + // + // LocatorStyleComboBox + // + LocatorStyleComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + LocatorStyleComboBox.FormattingEnabled = true; + LocatorStyleComboBox.Location = new System.Drawing.Point(93, 38); + LocatorStyleComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + LocatorStyleComboBox.Name = "LocatorStyleComboBox"; + LocatorStyleComboBox.Size = new System.Drawing.Size(132, 23); + LocatorStyleComboBox.TabIndex = 20; + LocatorStyleComboBox.SelectedIndexChanged += LocatorStyleComboBox_SelectedIndexChanged; + LocatorStyleComboBox.KeyPress += LocatorStyleComboBox_KeyPress; + // + // label5 + // + label5.AutoSize = true; + label5.Location = new System.Drawing.Point(5, 42); + label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label5.Name = "label5"; + label5.Size = new System.Drawing.Size(77, 15); + label5.TabIndex = 19; + label5.Text = "Locator style:"; + // + // MarkerDepthClipCheckBox + // + MarkerDepthClipCheckBox.AutoSize = true; + MarkerDepthClipCheckBox.Location = new System.Drawing.Point(12, 69); + MarkerDepthClipCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + MarkerDepthClipCheckBox.Name = "MarkerDepthClipCheckBox"; + MarkerDepthClipCheckBox.Size = new System.Drawing.Size(119, 19); + MarkerDepthClipCheckBox.TabIndex = 21; + MarkerDepthClipCheckBox.Text = "Marker depth clip"; + MarkerDepthClipCheckBox.UseVisualStyleBackColor = true; + MarkerDepthClipCheckBox.Visible = false; + MarkerDepthClipCheckBox.CheckedChanged += MarkerDepthClipCheckBox_CheckedChanged; + // + // label9 + // + label9.AutoSize = true; + label9.Location = new System.Drawing.Point(5, 157); + label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label9.Name = "label9"; + label9.Size = new System.Drawing.Size(83, 15); + label9.TabIndex = 25; + label9.Text = "Bounds range:"; + // + // PathsCheckBox + // + PathsCheckBox.AutoSize = true; + PathsCheckBox.Location = new System.Drawing.Point(12, 368); + PathsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + PathsCheckBox.Name = "PathsCheckBox"; + PathsCheckBox.Size = new System.Drawing.Size(87, 19); + PathsCheckBox.TabIndex = 33; + PathsCheckBox.Text = "Show paths"; + PathsCheckBox.UseVisualStyleBackColor = true; + PathsCheckBox.CheckedChanged += PathsCheckBox_CheckedChanged; + // + // SelectionBoundsCheckBox + // + SelectionBoundsCheckBox.AutoSize = true; + SelectionBoundsCheckBox.Checked = true; + SelectionBoundsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + SelectionBoundsCheckBox.Location = new System.Drawing.Point(12, 224); + SelectionBoundsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectionBoundsCheckBox.Name = "SelectionBoundsCheckBox"; + SelectionBoundsCheckBox.Size = new System.Drawing.Size(148, 19); + SelectionBoundsCheckBox.TabIndex = 27; + SelectionBoundsCheckBox.Text = "Show selection bounds"; + SelectionBoundsCheckBox.UseVisualStyleBackColor = true; + SelectionBoundsCheckBox.CheckedChanged += SelectionBoundsCheckBox_CheckedChanged; + // + // BoundsDepthClipCheckBox + // + BoundsDepthClipCheckBox.AutoSize = true; + BoundsDepthClipCheckBox.Checked = true; + BoundsDepthClipCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + BoundsDepthClipCheckBox.Location = new System.Drawing.Point(12, 132); + BoundsDepthClipCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + BoundsDepthClipCheckBox.Name = "BoundsDepthClipCheckBox"; + BoundsDepthClipCheckBox.Size = new System.Drawing.Size(122, 19); + BoundsDepthClipCheckBox.TabIndex = 24; + BoundsDepthClipCheckBox.Text = "Bounds depth clip"; + BoundsDepthClipCheckBox.UseVisualStyleBackColor = true; + BoundsDepthClipCheckBox.CheckedChanged += BoundsDepthClipCheckBox_CheckedChanged; + // + // BoundsRangeTrackBar + // + BoundsRangeTrackBar.AutoSize = false; + BoundsRangeTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + BoundsRangeTrackBar.LargeChange = 10; + BoundsRangeTrackBar.Location = new System.Drawing.Point(7, 175); + BoundsRangeTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + BoundsRangeTrackBar.Maximum = 100; + BoundsRangeTrackBar.Minimum = 1; + BoundsRangeTrackBar.Name = "BoundsRangeTrackBar"; + BoundsRangeTrackBar.Size = new System.Drawing.Size(219, 38); + BoundsRangeTrackBar.TabIndex = 26; + BoundsRangeTrackBar.TickFrequency = 10; + BoundsRangeTrackBar.Value = 100; + BoundsRangeTrackBar.Scroll += BoundsRangeTrackBar_Scroll; + // + // BoundsStyleComboBox + // + BoundsStyleComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + BoundsStyleComboBox.FormattingEnabled = true; + BoundsStyleComboBox.Items.AddRange(new object[] { "None", "Boxes", "Spheres" }); + BoundsStyleComboBox.Location = new System.Drawing.Point(93, 100); + BoundsStyleComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + BoundsStyleComboBox.Name = "BoundsStyleComboBox"; + BoundsStyleComboBox.Size = new System.Drawing.Size(132, 23); + BoundsStyleComboBox.TabIndex = 23; + BoundsStyleComboBox.SelectedIndexChanged += BoundsStyleComboBox_SelectedIndexChanged; + BoundsStyleComboBox.KeyPress += BoundsStyleComboBox_KeyPress; + // + // label8 + // + label8.AutoSize = true; + label8.Location = new System.Drawing.Point(5, 104); + label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label8.Name = "label8"; + label8.Size = new System.Drawing.Size(77, 15); + label8.TabIndex = 22; + label8.Text = "Bounds style:"; + // + // OptionsLightingTabPage + // + OptionsLightingTabPage.Controls.Add(HDLightsCheckBox); + OptionsLightingTabPage.Controls.Add(DeferredShadingCheckBox); + OptionsLightingTabPage.Controls.Add(WeatherRegionComboBox); + OptionsLightingTabPage.Controls.Add(label29); + OptionsLightingTabPage.Controls.Add(CloudParamTrackBar); + OptionsLightingTabPage.Controls.Add(CloudParamComboBox); + OptionsLightingTabPage.Controls.Add(label23); + OptionsLightingTabPage.Controls.Add(CloudsComboBox); + OptionsLightingTabPage.Controls.Add(label21); + OptionsLightingTabPage.Controls.Add(TimeSpeedLabel); + OptionsLightingTabPage.Controls.Add(label20); + OptionsLightingTabPage.Controls.Add(TimeSpeedTrackBar); + OptionsLightingTabPage.Controls.Add(TimeStartStopButton); + OptionsLightingTabPage.Controls.Add(ArtificialAmbientLightCheckBox); + OptionsLightingTabPage.Controls.Add(NaturalAmbientLightCheckBox); + OptionsLightingTabPage.Controls.Add(LODLightsCheckBox); + OptionsLightingTabPage.Controls.Add(HDRRenderingCheckBox); + OptionsLightingTabPage.Controls.Add(ControlTimeOfDayCheckBox); + OptionsLightingTabPage.Controls.Add(TimeOfDayLabel); + OptionsLightingTabPage.Controls.Add(label19); + OptionsLightingTabPage.Controls.Add(TimeOfDayTrackBar); + OptionsLightingTabPage.Controls.Add(WeatherComboBox); + OptionsLightingTabPage.Controls.Add(label17); + OptionsLightingTabPage.Controls.Add(ControlLightDirectionCheckBox); + OptionsLightingTabPage.Controls.Add(SkydomeCheckBox); + OptionsLightingTabPage.Controls.Add(ShadowsCheckBox); + OptionsLightingTabPage.Location = new System.Drawing.Point(4, 24); + OptionsLightingTabPage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + OptionsLightingTabPage.Name = "OptionsLightingTabPage"; + OptionsLightingTabPage.Size = new System.Drawing.Size(235, 558); + OptionsLightingTabPage.TabIndex = 2; + OptionsLightingTabPage.Text = "Lighting"; + OptionsLightingTabPage.UseVisualStyleBackColor = true; + // + // HDLightsCheckBox + // + HDLightsCheckBox.AutoSize = true; + HDLightsCheckBox.Checked = true; + HDLightsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + HDLightsCheckBox.Location = new System.Drawing.Point(12, 107); + HDLightsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + HDLightsCheckBox.Name = "HDLightsCheckBox"; + HDLightsCheckBox.Size = new System.Drawing.Size(75, 19); + HDLightsCheckBox.TabIndex = 34; + HDLightsCheckBox.Text = "HD lights"; + HDLightsCheckBox.UseVisualStyleBackColor = true; + HDLightsCheckBox.CheckedChanged += HDLightsCheckBox_CheckedChanged; + // + // DeferredShadingCheckBox + // + DeferredShadingCheckBox.AutoSize = true; + DeferredShadingCheckBox.Checked = true; + DeferredShadingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + DeferredShadingCheckBox.Location = new System.Drawing.Point(12, 6); + DeferredShadingCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + DeferredShadingCheckBox.Name = "DeferredShadingCheckBox"; + DeferredShadingCheckBox.Size = new System.Drawing.Size(116, 19); + DeferredShadingCheckBox.TabIndex = 30; + DeferredShadingCheckBox.Text = "Deferred shading"; + DeferredShadingCheckBox.UseVisualStyleBackColor = true; + DeferredShadingCheckBox.CheckedChanged += DeferredShadingCheckBox_CheckedChanged; + // + // WeatherRegionComboBox + // + WeatherRegionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + WeatherRegionComboBox.FormattingEnabled = true; + WeatherRegionComboBox.Items.AddRange(new object[] { "GLOBAL", "URBAN" }); + WeatherRegionComboBox.Location = new System.Drawing.Point(71, 410); + WeatherRegionComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WeatherRegionComboBox.Name = "WeatherRegionComboBox"; + WeatherRegionComboBox.Size = new System.Drawing.Size(154, 23); + WeatherRegionComboBox.TabIndex = 50; + WeatherRegionComboBox.SelectedIndexChanged += WeatherRegionComboBox_SelectedIndexChanged; + WeatherRegionComboBox.KeyPress += WeatherRegionComboBox_KeyPress; + // + // label29 + // + label29.AutoSize = true; + label29.Location = new System.Drawing.Point(5, 413); + label29.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label29.Name = "label29"; + label29.Size = new System.Drawing.Size(47, 15); + label29.TabIndex = 49; + label29.Text = "Region:"; + // + // CloudParamTrackBar + // + CloudParamTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + CloudParamTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + CloudParamTrackBar.LargeChange = 10; + CloudParamTrackBar.Location = new System.Drawing.Point(7, 503); + CloudParamTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CloudParamTrackBar.Maximum = 200; + CloudParamTrackBar.Name = "CloudParamTrackBar"; + CloudParamTrackBar.Size = new System.Drawing.Size(219, 45); + CloudParamTrackBar.TabIndex = 55; + CloudParamTrackBar.TickFrequency = 10; + CloudParamTrackBar.Value = 100; + CloudParamTrackBar.Scroll += CloudParamTrackBar_Scroll; + // + // CloudParamComboBox + // + CloudParamComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CloudParamComboBox.FormattingEnabled = true; + CloudParamComboBox.Items.AddRange(new object[] { "" }); + CloudParamComboBox.Location = new System.Drawing.Point(91, 472); + CloudParamComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CloudParamComboBox.Name = "CloudParamComboBox"; + CloudParamComboBox.Size = new System.Drawing.Size(135, 23); + CloudParamComboBox.TabIndex = 54; + CloudParamComboBox.SelectedIndexChanged += CloudParamComboBox_SelectedIndexChanged; + CloudParamComboBox.KeyPress += CloudParamComboBox_KeyPress; + // + // label23 + // + label23.AutoSize = true; + label23.Location = new System.Drawing.Point(5, 475); + label23.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label23.Name = "label23"; + label23.Size = new System.Drawing.Size(79, 15); + label23.TabIndex = 53; + label23.Text = "Cloud param:"; + // + // CloudsComboBox + // + CloudsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + CloudsComboBox.FormattingEnabled = true; + CloudsComboBox.Items.AddRange(new object[] { "" }); + CloudsComboBox.Location = new System.Drawing.Point(71, 441); + CloudsComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + CloudsComboBox.Name = "CloudsComboBox"; + CloudsComboBox.Size = new System.Drawing.Size(154, 23); + CloudsComboBox.TabIndex = 52; + CloudsComboBox.SelectedIndexChanged += CloudsComboBox_SelectedIndexChanged; + CloudsComboBox.KeyPress += CloudsComboBox_KeyPress; + // + // label21 + // + label21.AutoSize = true; + label21.Location = new System.Drawing.Point(5, 444); + label21.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label21.Name = "label21"; + label21.Size = new System.Drawing.Size(47, 15); + label21.TabIndex = 51; + label21.Text = "Clouds:"; + // + // TimeSpeedLabel + // + TimeSpeedLabel.AutoSize = true; + TimeSpeedLabel.Location = new System.Drawing.Point(91, 303); + TimeSpeedLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + TimeSpeedLabel.Name = "TimeSpeedLabel"; + TimeSpeedLabel.Size = new System.Drawing.Size(68, 15); + TimeSpeedLabel.TabIndex = 44; + TimeSpeedLabel.Text = "0.5 min/sec"; + // + // label20 + // + label20.AutoSize = true; + label20.Location = new System.Drawing.Point(4, 303); + label20.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label20.Name = "label20"; + label20.Size = new System.Drawing.Size(70, 15); + label20.TabIndex = 43; + label20.Text = "Time speed:"; + // + // TimeSpeedTrackBar + // + TimeSpeedTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + TimeSpeedTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + TimeSpeedTrackBar.Location = new System.Drawing.Point(71, 322); + TimeSpeedTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimeSpeedTrackBar.Maximum = 100; + TimeSpeedTrackBar.Minimum = 40; + TimeSpeedTrackBar.Name = "TimeSpeedTrackBar"; + TimeSpeedTrackBar.Size = new System.Drawing.Size(155, 45); + TimeSpeedTrackBar.TabIndex = 46; + TimeSpeedTrackBar.TickFrequency = 5; + TimeSpeedTrackBar.Value = 50; + TimeSpeedTrackBar.Scroll += TimeSpeedTrackBar_Scroll; + // + // TimeStartStopButton + // + TimeStartStopButton.Location = new System.Drawing.Point(12, 322); + TimeStartStopButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimeStartStopButton.Name = "TimeStartStopButton"; + TimeStartStopButton.Size = new System.Drawing.Size(52, 27); + TimeStartStopButton.TabIndex = 45; + TimeStartStopButton.Text = "Start"; + TimeStartStopButton.UseVisualStyleBackColor = true; + TimeStartStopButton.Click += TimeStartStopButton_Click; + // + // ArtificialAmbientLightCheckBox + // + ArtificialAmbientLightCheckBox.AutoSize = true; + ArtificialAmbientLightCheckBox.Checked = true; + ArtificialAmbientLightCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + ArtificialAmbientLightCheckBox.Location = new System.Drawing.Point(12, 158); + ArtificialAmbientLightCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ArtificialAmbientLightCheckBox.Name = "ArtificialAmbientLightCheckBox"; + ArtificialAmbientLightCheckBox.Size = new System.Drawing.Size(144, 19); + ArtificialAmbientLightCheckBox.TabIndex = 37; + ArtificialAmbientLightCheckBox.Text = "Artificial ambient light"; + ArtificialAmbientLightCheckBox.UseVisualStyleBackColor = true; + ArtificialAmbientLightCheckBox.CheckedChanged += ArtificialAmbientLightCheckBox_CheckedChanged; + // + // NaturalAmbientLightCheckBox + // + NaturalAmbientLightCheckBox.AutoSize = true; + NaturalAmbientLightCheckBox.Checked = true; + NaturalAmbientLightCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + NaturalAmbientLightCheckBox.Location = new System.Drawing.Point(12, 133); + NaturalAmbientLightCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + NaturalAmbientLightCheckBox.Name = "NaturalAmbientLightCheckBox"; + NaturalAmbientLightCheckBox.Size = new System.Drawing.Size(139, 19); + NaturalAmbientLightCheckBox.TabIndex = 36; + NaturalAmbientLightCheckBox.Text = "Natural ambient light"; + NaturalAmbientLightCheckBox.UseVisualStyleBackColor = true; + NaturalAmbientLightCheckBox.CheckedChanged += NaturalAmbientLightCheckBox_CheckedChanged; + // + // LODLightsCheckBox + // + LODLightsCheckBox.AutoSize = true; + LODLightsCheckBox.Checked = true; + LODLightsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + LODLightsCheckBox.Location = new System.Drawing.Point(104, 107); + LODLightsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + LODLightsCheckBox.Name = "LODLightsCheckBox"; + LODLightsCheckBox.Size = new System.Drawing.Size(81, 19); + LODLightsCheckBox.TabIndex = 35; + LODLightsCheckBox.Text = "LOD lights"; + LODLightsCheckBox.UseVisualStyleBackColor = true; + LODLightsCheckBox.CheckedChanged += LODLightsCheckBox_CheckedChanged; + // + // HDRRenderingCheckBox + // + HDRRenderingCheckBox.AutoSize = true; + HDRRenderingCheckBox.Checked = true; + HDRRenderingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + HDRRenderingCheckBox.Location = new System.Drawing.Point(12, 31); + HDRRenderingCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + HDRRenderingCheckBox.Name = "HDRRenderingCheckBox"; + HDRRenderingCheckBox.Size = new System.Drawing.Size(104, 19); + HDRRenderingCheckBox.TabIndex = 31; + HDRRenderingCheckBox.Text = "HDR rendering"; + HDRRenderingCheckBox.UseVisualStyleBackColor = true; + HDRRenderingCheckBox.CheckedChanged += HDRRenderingCheckBox_CheckedChanged; + // + // ControlTimeOfDayCheckBox + // + ControlTimeOfDayCheckBox.AutoSize = true; + ControlTimeOfDayCheckBox.Checked = true; + ControlTimeOfDayCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + ControlTimeOfDayCheckBox.Location = new System.Drawing.Point(12, 209); + ControlTimeOfDayCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ControlTimeOfDayCheckBox.Name = "ControlTimeOfDayCheckBox"; + ControlTimeOfDayCheckBox.Size = new System.Drawing.Size(194, 19); + ControlTimeOfDayCheckBox.TabIndex = 39; + ControlTimeOfDayCheckBox.Text = "Control time of day (right-drag)"; + ControlTimeOfDayCheckBox.UseVisualStyleBackColor = true; + ControlTimeOfDayCheckBox.CheckedChanged += ControlTimeOfDayCheckBox_CheckedChanged; + // + // TimeOfDayLabel + // + TimeOfDayLabel.AutoSize = true; + TimeOfDayLabel.Location = new System.Drawing.Point(88, 240); + TimeOfDayLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + TimeOfDayLabel.Name = "TimeOfDayLabel"; + TimeOfDayLabel.Size = new System.Drawing.Size(34, 15); + TimeOfDayLabel.TabIndex = 41; + TimeOfDayLabel.Text = "12:00"; + // + // label19 + // + label19.AutoSize = true; + label19.Location = new System.Drawing.Point(5, 240); + label19.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label19.Name = "label19"; + label19.Size = new System.Drawing.Size(72, 15); + label19.TabIndex = 40; + label19.Text = "Time of day:"; + // + // TimeOfDayTrackBar + // + TimeOfDayTrackBar.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + TimeOfDayTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + TimeOfDayTrackBar.LargeChange = 60; + TimeOfDayTrackBar.Location = new System.Drawing.Point(7, 258); + TimeOfDayTrackBar.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + TimeOfDayTrackBar.Maximum = 1440; + TimeOfDayTrackBar.Name = "TimeOfDayTrackBar"; + TimeOfDayTrackBar.Size = new System.Drawing.Size(219, 45); + TimeOfDayTrackBar.TabIndex = 42; + TimeOfDayTrackBar.TickFrequency = 60; + TimeOfDayTrackBar.Value = 720; + TimeOfDayTrackBar.Scroll += TimeOfDayTrackBar_Scroll; + // + // WeatherComboBox + // + WeatherComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + WeatherComboBox.FormattingEnabled = true; + WeatherComboBox.Items.AddRange(new object[] { "" }); + WeatherComboBox.Location = new System.Drawing.Point(71, 378); + WeatherComboBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + WeatherComboBox.Name = "WeatherComboBox"; + WeatherComboBox.Size = new System.Drawing.Size(154, 23); + WeatherComboBox.TabIndex = 48; + WeatherComboBox.SelectedIndexChanged += WeatherComboBox_SelectedIndexChanged; + WeatherComboBox.KeyPress += WeatherComboBox_KeyPress; + // + // label17 + // + label17.AutoSize = true; + label17.Location = new System.Drawing.Point(5, 382); + label17.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label17.Name = "label17"; + label17.Size = new System.Drawing.Size(54, 15); + label17.TabIndex = 47; + label17.Text = "Weather:"; + // + // ControlLightDirectionCheckBox + // + ControlLightDirectionCheckBox.AutoSize = true; + ControlLightDirectionCheckBox.Location = new System.Drawing.Point(12, 183); + ControlLightDirectionCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ControlLightDirectionCheckBox.Name = "ControlLightDirectionCheckBox"; + ControlLightDirectionCheckBox.Size = new System.Drawing.Size(208, 19); + ControlLightDirectionCheckBox.TabIndex = 38; + ControlLightDirectionCheckBox.Text = "Control light direction (right-drag)"; + ControlLightDirectionCheckBox.UseVisualStyleBackColor = true; + ControlLightDirectionCheckBox.CheckedChanged += ControlLightDirectionCheckBox_CheckedChanged; + // + // SkydomeCheckBox + // + SkydomeCheckBox.AutoSize = true; + SkydomeCheckBox.Checked = true; + SkydomeCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + SkydomeCheckBox.Location = new System.Drawing.Point(12, 82); + SkydomeCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SkydomeCheckBox.Name = "SkydomeCheckBox"; + SkydomeCheckBox.Size = new System.Drawing.Size(75, 19); + SkydomeCheckBox.TabIndex = 33; + SkydomeCheckBox.Text = "Skydome"; + SkydomeCheckBox.UseVisualStyleBackColor = true; + SkydomeCheckBox.CheckedChanged += SkydomeCheckbox_CheckedChanged; + // + // ShadowsCheckBox + // + ShadowsCheckBox.AutoSize = true; + ShadowsCheckBox.Location = new System.Drawing.Point(12, 57); + ShadowsCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ShadowsCheckBox.Name = "ShadowsCheckBox"; + ShadowsCheckBox.Size = new System.Drawing.Size(73, 19); + ShadowsCheckBox.TabIndex = 32; + ShadowsCheckBox.Text = "Shadows"; + ShadowsCheckBox.UseVisualStyleBackColor = true; + ShadowsCheckBox.CheckedChanged += ShadowsCheckBox_CheckedChanged; + // + // StatusBarCheckBox + // + StatusBarCheckBox.AutoSize = true; + StatusBarCheckBox.Checked = true; + StatusBarCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + StatusBarCheckBox.Location = new System.Drawing.Point(139, 597); + StatusBarCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + StatusBarCheckBox.Name = "StatusBarCheckBox"; + StatusBarCheckBox.Size = new System.Drawing.Size(78, 19); + StatusBarCheckBox.TabIndex = 145; + StatusBarCheckBox.Text = "Status bar"; + StatusBarCheckBox.UseVisualStyleBackColor = true; + StatusBarCheckBox.CheckedChanged += StatusBarCheckBox_CheckedChanged; + // + // QuitButton + // + QuitButton.Location = new System.Drawing.Point(122, 657); + QuitButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + QuitButton.Name = "QuitButton"; + QuitButton.Size = new System.Drawing.Size(108, 27); + QuitButton.TabIndex = 149; + QuitButton.Text = "Quit"; + QuitButton.UseVisualStyleBackColor = true; + QuitButton.Click += QuitButton_Click; + // + // ReloadSettingsButton + // + ReloadSettingsButton.Enabled = false; + ReloadSettingsButton.Location = new System.Drawing.Point(7, 623); + ReloadSettingsButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ReloadSettingsButton.Name = "ReloadSettingsButton"; + ReloadSettingsButton.Size = new System.Drawing.Size(108, 27); + ReloadSettingsButton.TabIndex = 146; + ReloadSettingsButton.Text = "Reload settings"; + ReloadSettingsButton.UseVisualStyleBackColor = true; + ReloadSettingsButton.Visible = false; + ReloadSettingsButton.Click += ReloadSettingsButton_Click; + // + // SaveSettingsButton + // + SaveSettingsButton.Location = new System.Drawing.Point(122, 623); + SaveSettingsButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SaveSettingsButton.Name = "SaveSettingsButton"; + SaveSettingsButton.Size = new System.Drawing.Size(108, 27); + SaveSettingsButton.TabIndex = 147; + SaveSettingsButton.Text = "Save settings"; + SaveSettingsButton.UseVisualStyleBackColor = true; + SaveSettingsButton.Click += SaveSettingsButton_Click; + // + // ReloadShadersButton + // + ReloadShadersButton.Location = new System.Drawing.Point(7, 657); + ReloadShadersButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ReloadShadersButton.Name = "ReloadShadersButton"; + ReloadShadersButton.Size = new System.Drawing.Size(108, 27); + ReloadShadersButton.TabIndex = 148; + ReloadShadersButton.Text = "Reload shaders"; + ReloadShadersButton.UseVisualStyleBackColor = true; + ReloadShadersButton.Click += ReloadShadersButton_Click; + // + // ErrorConsoleCheckBox + // + ErrorConsoleCheckBox.AutoSize = true; + ErrorConsoleCheckBox.Location = new System.Drawing.Point(16, 597); + ErrorConsoleCheckBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ErrorConsoleCheckBox.Name = "ErrorConsoleCheckBox"; + ErrorConsoleCheckBox.Size = new System.Drawing.Size(95, 19); + ErrorConsoleCheckBox.TabIndex = 144; + ErrorConsoleCheckBox.Text = "Error console"; + ErrorConsoleCheckBox.UseVisualStyleBackColor = true; + ErrorConsoleCheckBox.CheckedChanged += ErrorConsoleCheckBox_CheckedChanged; + // + // ToolsPanelHideButton + // + ToolsPanelHideButton.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + ToolsPanelHideButton.Location = new System.Drawing.Point(216, 3); + ToolsPanelHideButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsPanelHideButton.Name = "ToolsPanelHideButton"; + ToolsPanelHideButton.Size = new System.Drawing.Size(35, 27); + ToolsPanelHideButton.TabIndex = 4; + ToolsPanelHideButton.Text = ">>"; + ToolsPanelHideButton.UseVisualStyleBackColor = true; + ToolsPanelHideButton.Click += ToolsPanelHideButton_Click; + // + // ToolsPanelShowButton + // + ToolsPanelShowButton.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + ToolsPanelShowButton.Location = new System.Drawing.Point(1096, 17); + ToolsPanelShowButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolsPanelShowButton.Name = "ToolsPanelShowButton"; + ToolsPanelShowButton.Size = new System.Drawing.Size(35, 27); + ToolsPanelShowButton.TabIndex = 0; + ToolsPanelShowButton.Text = "<<"; + ToolsPanelShowButton.UseVisualStyleBackColor = true; + ToolsPanelShowButton.Click += ToolsPanelShowButton_Click; + // + // ConsolePanel + // + ConsolePanel.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ConsolePanel.BackColor = System.Drawing.SystemColors.Control; + ConsolePanel.Controls.Add(ConsoleTextBox); + ConsolePanel.Location = new System.Drawing.Point(14, 665); + ConsolePanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ConsolePanel.Name = "ConsolePanel"; + ConsolePanel.Size = new System.Drawing.Size(859, 117); + ConsolePanel.TabIndex = 3; + ConsolePanel.Visible = false; + // + // ConsoleTextBox + // + ConsoleTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ConsoleTextBox.Location = new System.Drawing.Point(4, 3); + ConsoleTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ConsoleTextBox.Multiline = true; + ConsoleTextBox.Name = "ConsoleTextBox"; + ConsoleTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + ConsoleTextBox.Size = new System.Drawing.Size(851, 109); + ConsoleTextBox.TabIndex = 0; + // + // StatsUpdateTimer + // + StatsUpdateTimer.Enabled = true; + StatsUpdateTimer.Interval = 500; + StatsUpdateTimer.Tick += StatsUpdateTimer_Tick; + // + // SelectedMarkerPanel + // + SelectedMarkerPanel.BackColor = System.Drawing.Color.White; + SelectedMarkerPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + SelectedMarkerPanel.Controls.Add(SelectedMarkerPositionTextBox); + SelectedMarkerPanel.Controls.Add(SelectedMarkerNameTextBox); + SelectedMarkerPanel.Location = new System.Drawing.Point(14, 74); + SelectedMarkerPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectedMarkerPanel.Name = "SelectedMarkerPanel"; + SelectedMarkerPanel.Size = new System.Drawing.Size(210, 48); + SelectedMarkerPanel.TabIndex = 5; + SelectedMarkerPanel.Visible = false; + // + // SelectedMarkerPositionTextBox + // + SelectedMarkerPositionTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelectedMarkerPositionTextBox.BackColor = System.Drawing.Color.White; + SelectedMarkerPositionTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + SelectedMarkerPositionTextBox.Location = new System.Drawing.Point(4, 25); + SelectedMarkerPositionTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectedMarkerPositionTextBox.Name = "SelectedMarkerPositionTextBox"; + SelectedMarkerPositionTextBox.ReadOnly = true; + SelectedMarkerPositionTextBox.Size = new System.Drawing.Size(201, 16); + SelectedMarkerPositionTextBox.TabIndex = 1; + // + // SelectedMarkerNameTextBox + // + SelectedMarkerNameTextBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + SelectedMarkerNameTextBox.BackColor = System.Drawing.Color.White; + SelectedMarkerNameTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + SelectedMarkerNameTextBox.Location = new System.Drawing.Point(4, 3); + SelectedMarkerNameTextBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + SelectedMarkerNameTextBox.Name = "SelectedMarkerNameTextBox"; + SelectedMarkerNameTextBox.ReadOnly = true; + SelectedMarkerNameTextBox.Size = new System.Drawing.Size(201, 16); + SelectedMarkerNameTextBox.TabIndex = 0; + // + // ToolsMenu + // + ToolsMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolsMenuRPFBrowser, ToolsMenuRPFExplorer, ToolsMenuSelectionInfo, ToolsMenuProjectWindow, ToolsMenuCutsceneViewer, ToolsMenuAudioExplorer, ToolsMenuWorldSearch, ToolsMenuBinarySearch, ToolsMenuJenkGen, ToolsMenuJenkInd, ToolsMenuExtractScripts, ToolsMenuExtractTextures, ToolsMenuExtractRawFiles, ToolsMenuExtractShaders, ToolsMenuOptions }); + ToolsMenu.Name = "ToolsMenu"; + ToolsMenu.Size = new System.Drawing.Size(170, 334); + // + // ToolsMenuRPFBrowser + // + ToolsMenuRPFBrowser.Name = "ToolsMenuRPFBrowser"; + ToolsMenuRPFBrowser.Size = new System.Drawing.Size(169, 22); + ToolsMenuRPFBrowser.Text = "RPF Browser..."; + ToolsMenuRPFBrowser.Visible = false; + ToolsMenuRPFBrowser.Click += ToolsMenuRPFBrowser_Click; + // + // ToolsMenuRPFExplorer + // + ToolsMenuRPFExplorer.Name = "ToolsMenuRPFExplorer"; + ToolsMenuRPFExplorer.Size = new System.Drawing.Size(169, 22); + ToolsMenuRPFExplorer.Text = "RPF Explorer..."; + ToolsMenuRPFExplorer.Click += ToolsMenuRPFExplorer_Click; + // + // ToolsMenuSelectionInfo + // + ToolsMenuSelectionInfo.Name = "ToolsMenuSelectionInfo"; + ToolsMenuSelectionInfo.Size = new System.Drawing.Size(169, 22); + ToolsMenuSelectionInfo.Text = "Selection info..."; + ToolsMenuSelectionInfo.Click += ToolsMenuSelectionInfo_Click; + // + // ToolsMenuProjectWindow + // + ToolsMenuProjectWindow.Enabled = false; + ToolsMenuProjectWindow.Name = "ToolsMenuProjectWindow"; + ToolsMenuProjectWindow.Size = new System.Drawing.Size(169, 22); + ToolsMenuProjectWindow.Text = "Project window..."; + ToolsMenuProjectWindow.Click += ToolsMenuProjectWindow_Click; + // + // ToolsMenuCutsceneViewer + // + ToolsMenuCutsceneViewer.Enabled = false; + ToolsMenuCutsceneViewer.Name = "ToolsMenuCutsceneViewer"; + ToolsMenuCutsceneViewer.Size = new System.Drawing.Size(169, 22); + ToolsMenuCutsceneViewer.Text = "Cutscene viewer..."; + ToolsMenuCutsceneViewer.Click += ToolsMenuCutsceneViewer_Click; + // + // ToolsMenuAudioExplorer + // + ToolsMenuAudioExplorer.Enabled = false; + ToolsMenuAudioExplorer.Name = "ToolsMenuAudioExplorer"; + ToolsMenuAudioExplorer.Size = new System.Drawing.Size(169, 22); + ToolsMenuAudioExplorer.Text = "Audio explorer..."; + ToolsMenuAudioExplorer.Click += ToolsMenuAudioExplorer_Click; + // + // ToolsMenuWorldSearch + // + ToolsMenuWorldSearch.Name = "ToolsMenuWorldSearch"; + ToolsMenuWorldSearch.Size = new System.Drawing.Size(169, 22); + ToolsMenuWorldSearch.Text = "World search..."; + ToolsMenuWorldSearch.Click += ToolsMenuWorldSearch_Click; + // + // ToolsMenuBinarySearch + // + ToolsMenuBinarySearch.Enabled = false; + ToolsMenuBinarySearch.Name = "ToolsMenuBinarySearch"; + ToolsMenuBinarySearch.Size = new System.Drawing.Size(169, 22); + ToolsMenuBinarySearch.Text = "Binary search..."; + ToolsMenuBinarySearch.Click += ToolsMenuBinarySearch_Click; + // + // ToolsMenuJenkGen + // + ToolsMenuJenkGen.Name = "ToolsMenuJenkGen"; + ToolsMenuJenkGen.Size = new System.Drawing.Size(169, 22); + ToolsMenuJenkGen.Text = "JenkGen..."; + ToolsMenuJenkGen.Click += ToolsMenuJenkGen_Click; + // + // ToolsMenuJenkInd + // + ToolsMenuJenkInd.Enabled = false; + ToolsMenuJenkInd.Name = "ToolsMenuJenkInd"; + ToolsMenuJenkInd.Size = new System.Drawing.Size(169, 22); + ToolsMenuJenkInd.Text = "JenkInd..."; + ToolsMenuJenkInd.Click += ToolsMenuJenkInd_Click; + // + // ToolsMenuExtractScripts + // + ToolsMenuExtractScripts.Name = "ToolsMenuExtractScripts"; + ToolsMenuExtractScripts.Size = new System.Drawing.Size(169, 22); + ToolsMenuExtractScripts.Text = "Extract scripts..."; + ToolsMenuExtractScripts.Click += ToolsMenuExtractScripts_Click; + // + // ToolsMenuExtractTextures + // + ToolsMenuExtractTextures.Name = "ToolsMenuExtractTextures"; + ToolsMenuExtractTextures.Size = new System.Drawing.Size(169, 22); + ToolsMenuExtractTextures.Text = "Extract textures..."; + ToolsMenuExtractTextures.Click += ToolsMenuExtractTextures_Click; + // + // ToolsMenuExtractRawFiles + // + ToolsMenuExtractRawFiles.Name = "ToolsMenuExtractRawFiles"; + ToolsMenuExtractRawFiles.Size = new System.Drawing.Size(169, 22); + ToolsMenuExtractRawFiles.Text = "Extract raw files..."; + ToolsMenuExtractRawFiles.Click += ToolsMenuExtractRawFiles_Click; + // + // ToolsMenuExtractShaders + // + ToolsMenuExtractShaders.Name = "ToolsMenuExtractShaders"; + ToolsMenuExtractShaders.Size = new System.Drawing.Size(169, 22); + ToolsMenuExtractShaders.Text = "Extract shaders..."; + ToolsMenuExtractShaders.Click += ToolsMenuExtractShaders_Click; + // + // ToolsMenuOptions + // + ToolsMenuOptions.Name = "ToolsMenuOptions"; + ToolsMenuOptions.Size = new System.Drawing.Size(169, 22); + ToolsMenuOptions.Text = "Options..."; + ToolsMenuOptions.Click += ToolsMenuOptions_Click; + // + // Toolbar + // + Toolbar.Dock = System.Windows.Forms.DockStyle.None; + Toolbar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + Toolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarNewButton, ToolbarOpenButton, ToolbarSaveButton, ToolbarSaveAllButton, toolStripSeparator5, ToolbarSelectButton, toolStripSeparator1, ToolbarMoveButton, ToolbarRotateButton, ToolbarScaleButton, ToolbarTransformSpaceButton, ToolbarSnapButton, toolStripSeparator2, ToolbarUndoButton, ToolbarRedoButton, toolStripSeparator3, ToolbarInfoWindowButton, ToolbarProjectWindowButton, toolStripSeparator4, ToolbarAddItemButton, ToolbarDeleteItemButton, toolStripSeparator6, ToolbarCopyButton, ToolbarPasteButton, toolStripSeparator7, ToolbarCameraModeButton }); + Toolbar.Location = new System.Drawing.Point(1, 0); + Toolbar.Name = "Toolbar"; + Toolbar.Size = new System.Drawing.Size(554, 25); + Toolbar.TabIndex = 6; + Toolbar.Text = "toolStrip1"; + // + // ToolbarNewButton + // + ToolbarNewButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarNewButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarNewProjectButton, ToolbarNewYmapButton, ToolbarNewYtypButton, ToolbarNewYbnButton, ToolbarNewYndButton, ToolbarNewTrainsButton, ToolbarNewScenarioButton }); + ToolbarNewButton.Enabled = false; + ToolbarNewButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarNewButton.Image"); + ToolbarNewButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarNewButton.Name = "ToolbarNewButton"; + ToolbarNewButton.Size = new System.Drawing.Size(32, 22); + ToolbarNewButton.Text = "New..."; + ToolbarNewButton.ToolTipText = "New... (Ctrl+N)"; + ToolbarNewButton.ButtonClick += ToolbarNewButton_ButtonClick; + // + // ToolbarNewProjectButton + // + ToolbarNewProjectButton.Name = "ToolbarNewProjectButton"; + ToolbarNewProjectButton.Size = new System.Drawing.Size(167, 22); + ToolbarNewProjectButton.Text = "New Project"; + ToolbarNewProjectButton.Click += ToolbarNewProjectButton_Click; + // + // ToolbarNewYmapButton + // + ToolbarNewYmapButton.Name = "ToolbarNewYmapButton"; + ToolbarNewYmapButton.Size = new System.Drawing.Size(167, 22); + ToolbarNewYmapButton.Text = "New Ymap File"; + ToolbarNewYmapButton.Click += ToolbarNewYmapButton_Click; + // + // ToolbarNewYtypButton + // + ToolbarNewYtypButton.Name = "ToolbarNewYtypButton"; + ToolbarNewYtypButton.Size = new System.Drawing.Size(167, 22); + ToolbarNewYtypButton.Text = "New Ytyp File"; + ToolbarNewYtypButton.Click += ToolbarNewYtypButton_Click; + // + // ToolbarNewYbnButton + // + ToolbarNewYbnButton.Name = "ToolbarNewYbnButton"; + ToolbarNewYbnButton.Size = new System.Drawing.Size(167, 22); + ToolbarNewYbnButton.Text = "New Ybn File"; + ToolbarNewYbnButton.Click += ToolbarNewYbnButton_Click; + // + // ToolbarNewYndButton + // + ToolbarNewYndButton.Name = "ToolbarNewYndButton"; + ToolbarNewYndButton.Size = new System.Drawing.Size(167, 22); + ToolbarNewYndButton.Text = "New Ynd File"; + ToolbarNewYndButton.Click += ToolbarNewYndButton_Click; + // + // ToolbarNewTrainsButton + // + ToolbarNewTrainsButton.Name = "ToolbarNewTrainsButton"; + ToolbarNewTrainsButton.Size = new System.Drawing.Size(167, 22); + ToolbarNewTrainsButton.Text = "New Trains File"; + ToolbarNewTrainsButton.Click += ToolbarNewTrainsButton_Click; + // + // ToolbarNewScenarioButton + // + ToolbarNewScenarioButton.Name = "ToolbarNewScenarioButton"; + ToolbarNewScenarioButton.Size = new System.Drawing.Size(167, 22); + ToolbarNewScenarioButton.Text = "New Scenario File"; + ToolbarNewScenarioButton.Click += ToolbarNewScenarioButton_Click; + // + // ToolbarOpenButton + // + ToolbarOpenButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarOpenButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarOpenProjectButton, ToolbarOpenFilesButton, ToolbarOpenFolderButton }); + ToolbarOpenButton.Enabled = false; + ToolbarOpenButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarOpenButton.Image"); + ToolbarOpenButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarOpenButton.Name = "ToolbarOpenButton"; + ToolbarOpenButton.Size = new System.Drawing.Size(32, 22); + ToolbarOpenButton.Text = "Open..."; + ToolbarOpenButton.ToolTipText = "Open... (Ctrl+O)"; + ToolbarOpenButton.ButtonClick += ToolbarOpenButton_ButtonClick; + // + // ToolbarOpenProjectButton + // + ToolbarOpenProjectButton.Name = "ToolbarOpenProjectButton"; + ToolbarOpenProjectButton.Size = new System.Drawing.Size(152, 22); + ToolbarOpenProjectButton.Text = "Open Project..."; + ToolbarOpenProjectButton.Click += ToolbarOpenProjectButton_Click; + // + // ToolbarOpenFilesButton + // + ToolbarOpenFilesButton.Name = "ToolbarOpenFilesButton"; + ToolbarOpenFilesButton.Size = new System.Drawing.Size(152, 22); + ToolbarOpenFilesButton.Text = "Open Files..."; + ToolbarOpenFilesButton.Click += ToolbarOpenFilesButton_Click; + // + // ToolbarOpenFolderButton + // + ToolbarOpenFolderButton.Name = "ToolbarOpenFolderButton"; + ToolbarOpenFolderButton.Size = new System.Drawing.Size(152, 22); + ToolbarOpenFolderButton.Text = "Open Folder..."; + ToolbarOpenFolderButton.Click += ToolbarOpenFolderButton_Click; + // + // ToolbarSaveButton + // + ToolbarSaveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarSaveButton.Enabled = false; + ToolbarSaveButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarSaveButton.Image"); + ToolbarSaveButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarSaveButton.Name = "ToolbarSaveButton"; + ToolbarSaveButton.Size = new System.Drawing.Size(23, 22); + ToolbarSaveButton.Text = "Save"; + ToolbarSaveButton.ToolTipText = "Save (Ctrl+S)"; + ToolbarSaveButton.Click += ToolbarSaveButton_Click; + // + // ToolbarSaveAllButton + // + ToolbarSaveAllButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarSaveAllButton.Enabled = false; + ToolbarSaveAllButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarSaveAllButton.Image"); + ToolbarSaveAllButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarSaveAllButton.Name = "ToolbarSaveAllButton"; + ToolbarSaveAllButton.Size = new System.Drawing.Size(23, 22); + ToolbarSaveAllButton.Text = "Save All"; + ToolbarSaveAllButton.ToolTipText = "Save All (Ctrl+Shift+S)"; + ToolbarSaveAllButton.Click += ToolbarSaveAllButton_Click; + // + // toolStripSeparator5 + // + toolStripSeparator5.Name = "toolStripSeparator5"; + toolStripSeparator5.Size = new System.Drawing.Size(6, 25); + // + // ToolbarSelectButton + // + ToolbarSelectButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarSelectButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarSelectEntityButton, ToolbarSelectEntityExtensionButton, ToolbarSelectArchetypeExtensionButton, ToolbarSelectTimeCycleModifierButton, ToolbarSelectCarGeneratorButton, ToolbarSelectGrassButton, ToolbarSelectWaterQuadButton, ToolbarSelectCalmingQuadButton, ToolbarSelectWaveQuadButton, ToolbarSelectCollisionButton, ToolbarSelectNavMeshButton, ToolbarSelectPathButton, ToolbarSelectTrainTrackButton, ToolbarSelectLodLightsButton, ToolbarSelectMloInstanceButton, ToolbarSelectScenarioButton, ToolbarSelectAudioButton, ToolbarSelectOcclusionButton }); + ToolbarSelectButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarSelectButton.Image"); + ToolbarSelectButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarSelectButton.Name = "ToolbarSelectButton"; + ToolbarSelectButton.Size = new System.Drawing.Size(32, 22); + ToolbarSelectButton.Text = "Select objects / Exit edit mode"; + ToolbarSelectButton.ToolTipText = "Select objects / Exit edit mode (C, Q)"; + ToolbarSelectButton.ButtonClick += ToolbarSelectButton_ButtonClick; + // + // ToolbarSelectEntityButton + // + ToolbarSelectEntityButton.Checked = true; + ToolbarSelectEntityButton.CheckState = System.Windows.Forms.CheckState.Checked; + ToolbarSelectEntityButton.Name = "ToolbarSelectEntityButton"; + ToolbarSelectEntityButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectEntityButton.Text = "Entity"; + ToolbarSelectEntityButton.Click += ToolbarSelectEntityButton_Click; + // + // ToolbarSelectEntityExtensionButton + // + ToolbarSelectEntityExtensionButton.Name = "ToolbarSelectEntityExtensionButton"; + ToolbarSelectEntityExtensionButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectEntityExtensionButton.Text = "Entity Extension"; + ToolbarSelectEntityExtensionButton.Click += ToolbarSelectEntityExtensionButton_Click; + // + // ToolbarSelectArchetypeExtensionButton + // + ToolbarSelectArchetypeExtensionButton.Name = "ToolbarSelectArchetypeExtensionButton"; + ToolbarSelectArchetypeExtensionButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectArchetypeExtensionButton.Text = "Archetype Extension"; + ToolbarSelectArchetypeExtensionButton.Click += ToolbarSelectArchetypeExtensionButton_Click; + // + // ToolbarSelectTimeCycleModifierButton + // + ToolbarSelectTimeCycleModifierButton.Name = "ToolbarSelectTimeCycleModifierButton"; + ToolbarSelectTimeCycleModifierButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectTimeCycleModifierButton.Text = "Time Cycle Modifier"; + ToolbarSelectTimeCycleModifierButton.Click += ToolbarSelectTimeCycleModifierButton_Click; + // + // ToolbarSelectCarGeneratorButton + // + ToolbarSelectCarGeneratorButton.Name = "ToolbarSelectCarGeneratorButton"; + ToolbarSelectCarGeneratorButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectCarGeneratorButton.Text = "Car Generator"; + ToolbarSelectCarGeneratorButton.Click += ToolbarSelectCarGeneratorButton_Click; + // + // ToolbarSelectGrassButton + // + ToolbarSelectGrassButton.Name = "ToolbarSelectGrassButton"; + ToolbarSelectGrassButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectGrassButton.Text = "Grass"; + ToolbarSelectGrassButton.Click += ToolbarSelectGrassButton_Click; + // + // ToolbarSelectWaterQuadButton + // + ToolbarSelectWaterQuadButton.Name = "ToolbarSelectWaterQuadButton"; + ToolbarSelectWaterQuadButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectWaterQuadButton.Text = "Water Quad"; + ToolbarSelectWaterQuadButton.Click += ToolbarSelectWaterQuadButton_Click; + // + // ToolbarSelectCalmingQuadButton + // + ToolbarSelectCalmingQuadButton.Name = "ToolbarSelectCalmingQuadButton"; + ToolbarSelectCalmingQuadButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectCalmingQuadButton.Text = "Water Calming Quad"; + ToolbarSelectCalmingQuadButton.Click += ToolbarSelectCalmingQuadButton_Click; + // + // ToolbarSelectWaveQuadButton + // + ToolbarSelectWaveQuadButton.Name = "ToolbarSelectWaveQuadButton"; + ToolbarSelectWaveQuadButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectWaveQuadButton.Text = "Water Wave Quad"; + ToolbarSelectWaveQuadButton.Click += ToolbarSelectWaveQuadButton_Click; + // + // ToolbarSelectCollisionButton + // + ToolbarSelectCollisionButton.Name = "ToolbarSelectCollisionButton"; + ToolbarSelectCollisionButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectCollisionButton.Text = "Collision"; + ToolbarSelectCollisionButton.Click += ToolbarSelectCollisionButton_Click; + // + // ToolbarSelectNavMeshButton + // + ToolbarSelectNavMeshButton.Name = "ToolbarSelectNavMeshButton"; + ToolbarSelectNavMeshButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectNavMeshButton.Text = "Nav Mesh"; + ToolbarSelectNavMeshButton.Click += ToolbarSelectNavMeshButton_Click; + // + // ToolbarSelectPathButton + // + ToolbarSelectPathButton.Name = "ToolbarSelectPathButton"; + ToolbarSelectPathButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectPathButton.Text = "Traffic Path"; + ToolbarSelectPathButton.Click += ToolbarSelectPathButton_Click; + // + // ToolbarSelectTrainTrackButton + // + ToolbarSelectTrainTrackButton.Name = "ToolbarSelectTrainTrackButton"; + ToolbarSelectTrainTrackButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectTrainTrackButton.Text = "Train Track"; + ToolbarSelectTrainTrackButton.Click += ToolbarSelectTrainTrackButton_Click; + // + // ToolbarSelectLodLightsButton + // + ToolbarSelectLodLightsButton.Name = "ToolbarSelectLodLightsButton"; + ToolbarSelectLodLightsButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectLodLightsButton.Text = "Lod Lights"; + ToolbarSelectLodLightsButton.Click += ToolbarSelectLodLightsButton_Click; + // + // ToolbarSelectMloInstanceButton + // + ToolbarSelectMloInstanceButton.Name = "ToolbarSelectMloInstanceButton"; + ToolbarSelectMloInstanceButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectMloInstanceButton.Text = "Interior Instance"; + ToolbarSelectMloInstanceButton.Click += ToolbarSelectMloInstanceButton_Click; + // + // ToolbarSelectScenarioButton + // + ToolbarSelectScenarioButton.Name = "ToolbarSelectScenarioButton"; + ToolbarSelectScenarioButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectScenarioButton.Text = "Scenario"; + ToolbarSelectScenarioButton.Click += ToolbarSelectScenarioButton_Click; + // + // ToolbarSelectAudioButton + // + ToolbarSelectAudioButton.Name = "ToolbarSelectAudioButton"; + ToolbarSelectAudioButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectAudioButton.Text = "Audio"; + ToolbarSelectAudioButton.Click += ToolbarSelectAudioButton_Click; + // + // ToolbarSelectOcclusionButton + // + ToolbarSelectOcclusionButton.Name = "ToolbarSelectOcclusionButton"; + ToolbarSelectOcclusionButton.Size = new System.Drawing.Size(185, 22); + ToolbarSelectOcclusionButton.Text = "Occlusion"; + ToolbarSelectOcclusionButton.Click += ToolbarSelectOcclusionButton_Click; + // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // ToolbarMoveButton + // + ToolbarMoveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarMoveButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarMoveButton.Image"); + ToolbarMoveButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarMoveButton.Name = "ToolbarMoveButton"; + ToolbarMoveButton.Size = new System.Drawing.Size(23, 22); + ToolbarMoveButton.Text = "Move"; + ToolbarMoveButton.ToolTipText = "Move (W)"; + ToolbarMoveButton.Click += ToolbarMoveButton_Click; + // + // ToolbarRotateButton + // + ToolbarRotateButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarRotateButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarRotateButton.Image"); + ToolbarRotateButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarRotateButton.Name = "ToolbarRotateButton"; + ToolbarRotateButton.Size = new System.Drawing.Size(23, 22); + ToolbarRotateButton.Text = "Rotate"; + ToolbarRotateButton.ToolTipText = "Rotate (E)"; + ToolbarRotateButton.Click += ToolbarRotateButton_Click; + // + // ToolbarScaleButton + // + ToolbarScaleButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarScaleButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarScaleButton.Image"); + ToolbarScaleButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarScaleButton.Name = "ToolbarScaleButton"; + ToolbarScaleButton.Size = new System.Drawing.Size(23, 22); + ToolbarScaleButton.Text = "Scale"; + ToolbarScaleButton.ToolTipText = "Scale (R)"; + ToolbarScaleButton.Click += ToolbarScaleButton_Click; + // + // ToolbarTransformSpaceButton + // + ToolbarTransformSpaceButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarTransformSpaceButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarObjectSpaceButton, ToolbarWorldSpaceButton }); + ToolbarTransformSpaceButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarTransformSpaceButton.Image"); + ToolbarTransformSpaceButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarTransformSpaceButton.Name = "ToolbarTransformSpaceButton"; + ToolbarTransformSpaceButton.Size = new System.Drawing.Size(32, 22); + ToolbarTransformSpaceButton.Text = "Toggle transform space"; + ToolbarTransformSpaceButton.ButtonClick += ToolbarTransformSpaceButton_ButtonClick; + // + // ToolbarObjectSpaceButton + // + ToolbarObjectSpaceButton.Checked = true; + ToolbarObjectSpaceButton.CheckState = System.Windows.Forms.CheckState.Checked; + ToolbarObjectSpaceButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarObjectSpaceButton.Image"); + ToolbarObjectSpaceButton.Name = "ToolbarObjectSpaceButton"; + ToolbarObjectSpaceButton.Size = new System.Drawing.Size(142, 22); + ToolbarObjectSpaceButton.Text = "Object space"; + ToolbarObjectSpaceButton.Click += ToolbarObjectSpaceButton_Click; + // + // ToolbarWorldSpaceButton + // + ToolbarWorldSpaceButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarWorldSpaceButton.Image"); + ToolbarWorldSpaceButton.Name = "ToolbarWorldSpaceButton"; + ToolbarWorldSpaceButton.Size = new System.Drawing.Size(142, 22); + ToolbarWorldSpaceButton.Text = "World space"; + ToolbarWorldSpaceButton.Click += ToolbarWorldSpaceButton_Click; + // + // ToolbarSnapButton + // + ToolbarSnapButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarSnapButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarSnapToGroundButton, ToolbarSnapToGridButton, ToolbarSnapToGroundGridButton, ToolbarSnapGridSizeButton, ToolbarRotationSnappingButton }); + ToolbarSnapButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarSnapButton.Image"); + ToolbarSnapButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarSnapButton.Name = "ToolbarSnapButton"; + ToolbarSnapButton.Size = new System.Drawing.Size(32, 22); + ToolbarSnapButton.Text = "Snap to Ground"; + ToolbarSnapButton.ToolTipText = "Snap to Ground"; + ToolbarSnapButton.ButtonClick += ToolbarSnapButton_ButtonClick; + // + // ToolbarSnapToGroundButton + // + ToolbarSnapToGroundButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarSnapToGroundButton.Image"); + ToolbarSnapToGroundButton.Name = "ToolbarSnapToGroundButton"; + ToolbarSnapToGroundButton.Size = new System.Drawing.Size(205, 22); + ToolbarSnapToGroundButton.Text = "Snap to Ground"; + ToolbarSnapToGroundButton.Click += ToolbarSnapToGroundButton_Click; + // + // ToolbarSnapToGridButton + // + ToolbarSnapToGridButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarSnapToGridButton.Image"); + ToolbarSnapToGridButton.Name = "ToolbarSnapToGridButton"; + ToolbarSnapToGridButton.Size = new System.Drawing.Size(205, 22); + ToolbarSnapToGridButton.Text = "Snap to Grid"; + ToolbarSnapToGridButton.Click += ToolbarSnapToGridButton_Click; + // + // ToolbarSnapToGroundGridButton + // + ToolbarSnapToGroundGridButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarSnapToGroundGridButton.Image"); + ToolbarSnapToGroundGridButton.Name = "ToolbarSnapToGroundGridButton"; + ToolbarSnapToGroundGridButton.Size = new System.Drawing.Size(205, 22); + ToolbarSnapToGroundGridButton.Text = "Snap to Grid and Ground"; + ToolbarSnapToGroundGridButton.Click += ToolbarSnapToGroundGridButton_Click; + // + // ToolbarSnapGridSizeButton + // + ToolbarSnapGridSizeButton.Name = "ToolbarSnapGridSizeButton"; + ToolbarSnapGridSizeButton.Size = new System.Drawing.Size(205, 22); + ToolbarSnapGridSizeButton.Text = "Grid Size..."; + ToolbarSnapGridSizeButton.Click += ToolbarSnapGridSizeButton_Click; + // + // ToolbarRotationSnappingButton + // + ToolbarRotationSnappingButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarRotationSnappingOffButton, ToolbarRotationSnapping1Button, ToolbarRotationSnapping2Button, ToolbarRotationSnapping5Button, ToolbarRotationSnapping10Button, ToolbarRotationSnapping45Button, ToolbarRotationSnapping90Button, ToolbarRotationSnappingCustomButton }); + ToolbarRotationSnappingButton.Name = "ToolbarRotationSnappingButton"; + ToolbarRotationSnappingButton.Size = new System.Drawing.Size(205, 22); + ToolbarRotationSnappingButton.Text = "Rotation Snapping"; + // + // ToolbarRotationSnappingOffButton + // + ToolbarRotationSnappingOffButton.Name = "ToolbarRotationSnappingOffButton"; + ToolbarRotationSnappingOffButton.Size = new System.Drawing.Size(131, 22); + ToolbarRotationSnappingOffButton.Text = "Off"; + ToolbarRotationSnappingOffButton.Click += ToolbarRotationSnappingOffButton_Click; + // + // ToolbarRotationSnapping1Button + // + ToolbarRotationSnapping1Button.Name = "ToolbarRotationSnapping1Button"; + ToolbarRotationSnapping1Button.Size = new System.Drawing.Size(131, 22); + ToolbarRotationSnapping1Button.Text = "1 Degree"; + ToolbarRotationSnapping1Button.Click += ToolbarRotationSnapping1Button_Click; + // + // ToolbarRotationSnapping2Button + // + ToolbarRotationSnapping2Button.Name = "ToolbarRotationSnapping2Button"; + ToolbarRotationSnapping2Button.Size = new System.Drawing.Size(131, 22); + ToolbarRotationSnapping2Button.Text = "2 Degrees"; + ToolbarRotationSnapping2Button.Click += ToolbarRotationSnapping2Button_Click; + // + // ToolbarRotationSnapping5Button + // + ToolbarRotationSnapping5Button.Checked = true; + ToolbarRotationSnapping5Button.CheckState = System.Windows.Forms.CheckState.Checked; + ToolbarRotationSnapping5Button.Name = "ToolbarRotationSnapping5Button"; + ToolbarRotationSnapping5Button.Size = new System.Drawing.Size(131, 22); + ToolbarRotationSnapping5Button.Text = "5 Degrees"; + ToolbarRotationSnapping5Button.Click += ToolbarRotationSnapping5Button_Click; + // + // ToolbarRotationSnapping10Button + // + ToolbarRotationSnapping10Button.Name = "ToolbarRotationSnapping10Button"; + ToolbarRotationSnapping10Button.Size = new System.Drawing.Size(131, 22); + ToolbarRotationSnapping10Button.Text = "10 Degrees"; + ToolbarRotationSnapping10Button.Click += ToolbarRotationSnapping10Button_Click; + // + // ToolbarRotationSnapping45Button + // + ToolbarRotationSnapping45Button.Name = "ToolbarRotationSnapping45Button"; + ToolbarRotationSnapping45Button.Size = new System.Drawing.Size(131, 22); + ToolbarRotationSnapping45Button.Text = "45 Degrees"; + ToolbarRotationSnapping45Button.Click += ToolbarRotationSnapping45Button_Click; + // + // ToolbarRotationSnapping90Button + // + ToolbarRotationSnapping90Button.Name = "ToolbarRotationSnapping90Button"; + ToolbarRotationSnapping90Button.Size = new System.Drawing.Size(131, 22); + ToolbarRotationSnapping90Button.Text = "90 Degrees"; + ToolbarRotationSnapping90Button.Click += ToolbarRotationSnapping90Button_Click; + // + // ToolbarRotationSnappingCustomButton + // + ToolbarRotationSnappingCustomButton.Name = "ToolbarRotationSnappingCustomButton"; + ToolbarRotationSnappingCustomButton.Size = new System.Drawing.Size(131, 22); + ToolbarRotationSnappingCustomButton.Text = "Custom..."; + ToolbarRotationSnappingCustomButton.Click += ToolbarRotationSnappingCustomButton_Click; + // + // toolStripSeparator2 + // + toolStripSeparator2.Name = "toolStripSeparator2"; + toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + // + // ToolbarUndoButton + // + ToolbarUndoButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarUndoButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarUndoListButton }); + ToolbarUndoButton.Enabled = false; + ToolbarUndoButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarUndoButton.Image"); + ToolbarUndoButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarUndoButton.Name = "ToolbarUndoButton"; + ToolbarUndoButton.Size = new System.Drawing.Size(32, 22); + ToolbarUndoButton.Text = "Undo"; + ToolbarUndoButton.ButtonClick += ToolbarUndoButton_ButtonClick; + // + // ToolbarUndoListButton + // + ToolbarUndoListButton.Name = "ToolbarUndoListButton"; + ToolbarUndoListButton.Size = new System.Drawing.Size(121, 22); + ToolbarUndoListButton.Text = "Undo list"; + ToolbarUndoListButton.Click += ToolbarUndoListButton_Click; + // + // ToolbarRedoButton + // + ToolbarRedoButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarRedoButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarRedoListButton }); + ToolbarRedoButton.Enabled = false; + ToolbarRedoButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarRedoButton.Image"); + ToolbarRedoButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarRedoButton.Name = "ToolbarRedoButton"; + ToolbarRedoButton.Size = new System.Drawing.Size(32, 22); + ToolbarRedoButton.Text = "Redo"; + ToolbarRedoButton.ButtonClick += ToolbarRedoButton_ButtonClick; + // + // ToolbarRedoListButton + // + ToolbarRedoListButton.Name = "ToolbarRedoListButton"; + ToolbarRedoListButton.Size = new System.Drawing.Size(119, 22); + ToolbarRedoListButton.Text = "Redo list"; + ToolbarRedoListButton.Click += ToolbarRedoListButton_Click; + // + // toolStripSeparator3 + // + toolStripSeparator3.Name = "toolStripSeparator3"; + toolStripSeparator3.Size = new System.Drawing.Size(6, 25); + // + // ToolbarInfoWindowButton + // + ToolbarInfoWindowButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarInfoWindowButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarInfoWindowButton.Image"); + ToolbarInfoWindowButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarInfoWindowButton.Name = "ToolbarInfoWindowButton"; + ToolbarInfoWindowButton.Size = new System.Drawing.Size(23, 22); + ToolbarInfoWindowButton.Text = "Selection info window"; + ToolbarInfoWindowButton.Click += ToolbarInfoWindowButton_Click; + // + // ToolbarProjectWindowButton + // + ToolbarProjectWindowButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarProjectWindowButton.Enabled = false; + ToolbarProjectWindowButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarProjectWindowButton.Image"); + ToolbarProjectWindowButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarProjectWindowButton.Name = "ToolbarProjectWindowButton"; + ToolbarProjectWindowButton.Size = new System.Drawing.Size(23, 22); + ToolbarProjectWindowButton.Text = "Project window"; + ToolbarProjectWindowButton.Click += ToolbarProjectWindowButton_Click; + // + // toolStripSeparator4 + // + toolStripSeparator4.Name = "toolStripSeparator4"; + toolStripSeparator4.Size = new System.Drawing.Size(6, 25); + // + // ToolbarAddItemButton + // + ToolbarAddItemButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarAddItemButton.Enabled = false; + ToolbarAddItemButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarAddItemButton.Image"); + ToolbarAddItemButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarAddItemButton.Name = "ToolbarAddItemButton"; + ToolbarAddItemButton.Size = new System.Drawing.Size(23, 22); + ToolbarAddItemButton.Text = "Add entity"; + ToolbarAddItemButton.Click += ToolbarAddItemButton_Click; + // + // ToolbarDeleteItemButton + // + ToolbarDeleteItemButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarDeleteItemButton.Enabled = false; + ToolbarDeleteItemButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarDeleteItemButton.Image"); + ToolbarDeleteItemButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarDeleteItemButton.Name = "ToolbarDeleteItemButton"; + ToolbarDeleteItemButton.Size = new System.Drawing.Size(23, 22); + ToolbarDeleteItemButton.Text = "Delete entity"; + ToolbarDeleteItemButton.Click += ToolbarDeleteItemButton_Click; + // + // toolStripSeparator6 + // + toolStripSeparator6.Name = "toolStripSeparator6"; + toolStripSeparator6.Size = new System.Drawing.Size(6, 25); + // + // ToolbarCopyButton + // + ToolbarCopyButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarCopyButton.Enabled = false; + ToolbarCopyButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarCopyButton.Image"); + ToolbarCopyButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarCopyButton.Name = "ToolbarCopyButton"; + ToolbarCopyButton.Size = new System.Drawing.Size(23, 22); + ToolbarCopyButton.Text = "Copy"; + ToolbarCopyButton.ToolTipText = "Copy (Ctrl+C)"; + ToolbarCopyButton.Click += ToolbarCopyButton_Click; + // + // ToolbarPasteButton + // + ToolbarPasteButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarPasteButton.Enabled = false; + ToolbarPasteButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarPasteButton.Image"); + ToolbarPasteButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarPasteButton.Name = "ToolbarPasteButton"; + ToolbarPasteButton.Size = new System.Drawing.Size(23, 22); + ToolbarPasteButton.Text = "Paste"; + ToolbarPasteButton.ToolTipText = "Paste (Ctrl+V)"; + ToolbarPasteButton.Click += ToolbarPasteButton_Click; + // + // toolStripSeparator7 + // + toolStripSeparator7.Name = "toolStripSeparator7"; + toolStripSeparator7.Size = new System.Drawing.Size(6, 25); + // + // ToolbarCameraModeButton + // + ToolbarCameraModeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + ToolbarCameraModeButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ToolbarCameraPerspectiveButton, ToolbarCameraMapViewButton, ToolbarCameraOrthographicButton }); + ToolbarCameraModeButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarCameraModeButton.Image"); + ToolbarCameraModeButton.ImageTransparentColor = System.Drawing.Color.Magenta; + ToolbarCameraModeButton.Name = "ToolbarCameraModeButton"; + ToolbarCameraModeButton.Size = new System.Drawing.Size(32, 22); + ToolbarCameraModeButton.Text = "Camera Mode"; + ToolbarCameraModeButton.ButtonClick += ToolbarCameraModeButton_ButtonClick; + // + // ToolbarCameraPerspectiveButton + // + ToolbarCameraPerspectiveButton.Checked = true; + ToolbarCameraPerspectiveButton.CheckState = System.Windows.Forms.CheckState.Checked; + ToolbarCameraPerspectiveButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarCameraPerspectiveButton.Image"); + ToolbarCameraPerspectiveButton.Name = "ToolbarCameraPerspectiveButton"; + ToolbarCameraPerspectiveButton.Size = new System.Drawing.Size(145, 22); + ToolbarCameraPerspectiveButton.Text = "Perspective"; + ToolbarCameraPerspectiveButton.Click += ToolbarCameraPerspectiveButton_Click; + // + // ToolbarCameraMapViewButton + // + ToolbarCameraMapViewButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarCameraMapViewButton.Image"); + ToolbarCameraMapViewButton.Name = "ToolbarCameraMapViewButton"; + ToolbarCameraMapViewButton.Size = new System.Drawing.Size(145, 22); + ToolbarCameraMapViewButton.Text = "Map View"; + ToolbarCameraMapViewButton.Click += ToolbarCameraMapViewButton_Click; + // + // ToolbarCameraOrthographicButton + // + ToolbarCameraOrthographicButton.Image = (System.Drawing.Image)resources.GetObject("ToolbarCameraOrthographicButton.Image"); + ToolbarCameraOrthographicButton.Name = "ToolbarCameraOrthographicButton"; + ToolbarCameraOrthographicButton.Size = new System.Drawing.Size(145, 22); + ToolbarCameraOrthographicButton.Text = "Orthographic"; + ToolbarCameraOrthographicButton.Click += ToolbarCameraOrthographicButton_Click; + // + // ToolbarPanel + // + ToolbarPanel.BackColor = System.Drawing.SystemColors.Control; + ToolbarPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + ToolbarPanel.Controls.Add(Toolbar); + ToolbarPanel.Location = new System.Drawing.Point(14, 14); + ToolbarPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ToolbarPanel.Name = "ToolbarPanel"; + ToolbarPanel.Size = new System.Drawing.Size(650, 30); + ToolbarPanel.TabIndex = 7; + ToolbarPanel.Visible = false; + // + // SubtitleLabel + // + SubtitleLabel.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + SubtitleLabel.AutoSize = true; + SubtitleLabel.BackColor = System.Drawing.SystemColors.ControlLightLight; + SubtitleLabel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + SubtitleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + SubtitleLabel.Location = new System.Drawing.Point(531, 640); + SubtitleLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + SubtitleLabel.Name = "SubtitleLabel"; + SubtitleLabel.Size = new System.Drawing.Size(83, 18); + SubtitleLabel.TabIndex = 8; + SubtitleLabel.Text = "Test Subtitle"; + SubtitleLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter; + SubtitleLabel.Visible = false; + SubtitleLabel.SizeChanged += SubtitleLabel_SizeChanged; + // + // SubtitleTimer + // + SubtitleTimer.Tick += SubtitleTimer_Tick; // // WorldForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.MidnightBlue; - this.ClientSize = new System.Drawing.Size(984, 711); - this.Controls.Add(this.ToolbarPanel); - this.Controls.Add(this.SelectedMarkerPanel); - this.Controls.Add(this.ConsolePanel); - this.Controls.Add(this.ToolsPanel); - this.Controls.Add(this.StatusStrip); - this.Controls.Add(this.ToolsPanelShowButton); - this.Controls.Add(this.SubtitleLabel); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.KeyPreview = true; - this.Name = "WorldForm"; - this.Text = "CodeWalker"; - this.Deactivate += new System.EventHandler(this.WorldForm_Deactivate); - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.WorldForm_FormClosing); - this.Load += new System.EventHandler(this.WorldForm_Load); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.WorldForm_KeyDown); - this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.WorldForm_KeyUp); - this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.WorldForm_MouseDown); - this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.WorldForm_MouseMove); - this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.WorldForm_MouseUp); - this.StatusStrip.ResumeLayout(false); - this.StatusStrip.PerformLayout(); - this.ToolsPanel.ResumeLayout(false); - this.ToolsTabControl.ResumeLayout(false); - this.ViewTabPage.ResumeLayout(false); - this.ViewTabPage.PerformLayout(); - this.ViewTabControl.ResumeLayout(false); - this.ViewWorldTabPage.ResumeLayout(false); - this.ViewWorldTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.WorldDetailDistTrackBar)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.WorldLodDistTrackBar)).EndInit(); - this.ViewYmapsTabPage.ResumeLayout(false); - this.ViewYmapsTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.DetailTrackBar)).EndInit(); - this.ViewModelTabPage.ResumeLayout(false); - this.ViewModelTabPage.PerformLayout(); - this.MarkersTabPage.ResumeLayout(false); - this.MarkersTabPage.PerformLayout(); - this.SelectionTabPage.ResumeLayout(false); - this.SelectionTabPage.PerformLayout(); - this.SelectionTabControl.ResumeLayout(false); - this.SelectionEntityTabPage.ResumeLayout(false); - this.SelectionArchetypeTabPage.ResumeLayout(false); - this.SelectionDrawableTabPage.ResumeLayout(false); - this.tabControl3.ResumeLayout(false); - this.tabPage11.ResumeLayout(false); - this.tabPage12.ResumeLayout(false); - this.tabPage13.ResumeLayout(false); - this.SelectionExtensionTabPage.ResumeLayout(false); - this.OptionsTabPage.ResumeLayout(false); - this.OptionsTabPage.PerformLayout(); - this.OptionsTabControl.ResumeLayout(false); - this.OptionsGeneralTabPage.ResumeLayout(false); - this.OptionsGeneralTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.MapViewDetailTrackBar)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.CollisionMeshRangeTrackBar)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.FieldOfViewTrackBar)).EndInit(); - this.OptionsRenderTabPage.ResumeLayout(false); - this.OptionsRenderTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.AntiAliasingTrackBar)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.FarClipUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.NearClipUpDown)).EndInit(); - this.OptionsHelpersTabPage.ResumeLayout(false); - this.OptionsHelpersTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.SnapAngleUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.SnapGridSizeUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.BoundsRangeTrackBar)).EndInit(); - this.OptionsLightingTabPage.ResumeLayout(false); - this.OptionsLightingTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.CloudParamTrackBar)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.TimeSpeedTrackBar)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.TimeOfDayTrackBar)).EndInit(); - this.ConsolePanel.ResumeLayout(false); - this.ConsolePanel.PerformLayout(); - this.SelectedMarkerPanel.ResumeLayout(false); - this.SelectedMarkerPanel.PerformLayout(); - this.ToolsMenu.ResumeLayout(false); - this.Toolbar.ResumeLayout(false); - this.Toolbar.PerformLayout(); - this.ToolbarPanel.ResumeLayout(false); - this.ToolbarPanel.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + BackColor = System.Drawing.Color.MidnightBlue; + ClientSize = new System.Drawing.Size(1148, 820); + Controls.Add(ToolbarPanel); + Controls.Add(SelectedMarkerPanel); + Controls.Add(ConsolePanel); + Controls.Add(ToolsPanel); + Controls.Add(StatusStrip); + Controls.Add(ToolsPanelShowButton); + Controls.Add(SubtitleLabel); + Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon"); + KeyPreview = true; + Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + Name = "WorldForm"; + Text = "CodeWalker"; + Deactivate += WorldForm_Deactivate; + FormClosing += WorldForm_FormClosing; + Load += WorldForm_Load; + KeyDown += WorldForm_KeyDown; + KeyUp += WorldForm_KeyUp; + MouseDown += WorldForm_MouseDown; + MouseMove += WorldForm_MouseMove; + MouseUp += WorldForm_MouseUp; + StatusStrip.ResumeLayout(false); + StatusStrip.PerformLayout(); + ToolsPanel.ResumeLayout(false); + ToolsTabControl.ResumeLayout(false); + ViewTabPage.ResumeLayout(false); + ViewTabPage.PerformLayout(); + ViewTabControl.ResumeLayout(false); + ViewWorldTabPage.ResumeLayout(false); + ViewWorldTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)WorldDetailDistTrackBar).EndInit(); + ((System.ComponentModel.ISupportInitialize)WorldLodDistTrackBar).EndInit(); + ViewYmapsTabPage.ResumeLayout(false); + ViewYmapsTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)DetailTrackBar).EndInit(); + ViewModelTabPage.ResumeLayout(false); + ViewModelTabPage.PerformLayout(); + MarkersTabPage.ResumeLayout(false); + MarkersTabPage.PerformLayout(); + SelectionTabPage.ResumeLayout(false); + SelectionTabPage.PerformLayout(); + SelectionTabControl.ResumeLayout(false); + SelectionEntityTabPage.ResumeLayout(false); + SelectionArchetypeTabPage.ResumeLayout(false); + SelectionDrawableTabPage.ResumeLayout(false); + tabControl3.ResumeLayout(false); + tabPage11.ResumeLayout(false); + tabPage12.ResumeLayout(false); + tabPage13.ResumeLayout(false); + SelectionExtensionTabPage.ResumeLayout(false); + OptionsTabPage.ResumeLayout(false); + OptionsTabPage.PerformLayout(); + OptionsTabControl.ResumeLayout(false); + OptionsGeneralTabPage.ResumeLayout(false); + OptionsGeneralTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)MapViewDetailTrackBar).EndInit(); + ((System.ComponentModel.ISupportInitialize)CollisionMeshRangeTrackBar).EndInit(); + ((System.ComponentModel.ISupportInitialize)FieldOfViewTrackBar).EndInit(); + OptionsRenderTabPage.ResumeLayout(false); + OptionsRenderTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)AntiAliasingTrackBar).EndInit(); + ((System.ComponentModel.ISupportInitialize)FarClipUpDown).EndInit(); + ((System.ComponentModel.ISupportInitialize)NearClipUpDown).EndInit(); + OptionsHelpersTabPage.ResumeLayout(false); + OptionsHelpersTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)SnapAngleUpDown).EndInit(); + ((System.ComponentModel.ISupportInitialize)SnapGridSizeUpDown).EndInit(); + ((System.ComponentModel.ISupportInitialize)BoundsRangeTrackBar).EndInit(); + OptionsLightingTabPage.ResumeLayout(false); + OptionsLightingTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)CloudParamTrackBar).EndInit(); + ((System.ComponentModel.ISupportInitialize)TimeSpeedTrackBar).EndInit(); + ((System.ComponentModel.ISupportInitialize)TimeOfDayTrackBar).EndInit(); + ConsolePanel.ResumeLayout(false); + ConsolePanel.PerformLayout(); + SelectedMarkerPanel.ResumeLayout(false); + SelectedMarkerPanel.PerformLayout(); + ToolsMenu.ResumeLayout(false); + Toolbar.ResumeLayout(false); + Toolbar.PerformLayout(); + ToolbarPanel.ResumeLayout(false); + ToolbarPanel.PerformLayout(); + ResumeLayout(false); + PerformLayout(); } #endregion diff --git a/CodeWalker/WorldForm.cs b/CodeWalker/WorldForm.cs index f67325e..eb4e12a 100644 --- a/CodeWalker/WorldForm.cs +++ b/CodeWalker/WorldForm.cs @@ -25,16 +25,17 @@ namespace CodeWalker { public partial class WorldForm : Form, DXForm { - public Form Form { get { return this; } } //for DXForm/DXManager use + public Form Form => this; //for DXForm/DXManager use - public Renderer Renderer { + public Renderer Renderer + { get { return renderer ??= new Renderer(this, GameFileCache); } set => renderer = value; } - public object RenderSyncRoot { get { return Renderer.RenderSyncRoot; } } + public SemaphoreSlim RenderSyncRoot => Renderer.RenderSyncRoot; volatile bool formopen = false; volatile bool running = false; @@ -49,24 +50,24 @@ namespace CodeWalker Clouds clouds; private Water water; - Water Water { get => water ??= new Water(); } + Water Water => water ??= new Water(); private Trains trains; - Trains Trains { get => trains ??= new Trains(); } + Trains Trains => trains ??= new Trains(); private Scenarios scenarios; - Scenarios Scenarios { get => scenarios ??= new Scenarios(); } + Scenarios Scenarios => scenarios ??= new Scenarios(); private PopZones popZones; - PopZones PopZones { get => popZones ??= new PopZones(); } + PopZones PopZones => popZones ??= new PopZones(); private Heightmaps heightmaps; - Heightmaps Heightmaps { get => heightmaps ??= new Heightmaps(); } + Heightmaps Heightmaps => heightmaps ??= new Heightmaps(); private Watermaps watermaps; - Watermaps Watermaps { get => watermaps ??= new Watermaps(); } + Watermaps Watermaps => watermaps ??= new Watermaps(); private AudioZones audioZones; - AudioZones AudioZones { get => audioZones ??= new AudioZones(); } + AudioZones AudioZones => audioZones ??= new AudioZones(); public CancellationTokenSource CancellationTokenSource { get; } = new CancellationTokenSource(); - public CancellationToken CancellationToken; + public CancellationToken CancellationToken { get; } - public Space Space { get => space ??= new Space(); } + public Space Space => space ??= new Space(); bool MouseLButtonDown = false; bool MouseRButtonDown = false; @@ -83,10 +84,9 @@ namespace CodeWalker Vector3 prevworldpos = new Vector3(0, 0, 100); //also the start pos + private GameFileCache? _gameFileCache; + public GameFileCache GameFileCache => _gameFileCache ??= GameFileCacheFactory.Instance; - private GameFileCache gameFileCache; - public GameFileCache GameFileCache { get => gameFileCache ??= GameFileCacheFactory.GetInstance(); } - WorldControlMode ControlMode = WorldControlMode.Free; @@ -234,13 +234,16 @@ namespace CodeWalker public WorldForm() { - - Task.Run(() => { - if (!GameFileCache.IsInited) + if (!GameFileCache.IsInited) + { + Task.Run(async () => { - GameFileCache.Init(); - } - }); + if (!GameFileCache.IsInited) + { + await GameFileCache.InitAsync(); + } + }); + } CancellationToken = CancellationTokenSource.Token; InitializeComponent(); @@ -256,7 +259,7 @@ namespace CodeWalker } - private async ValueTask Init() + private ValueTask InitAsync() { //called from WorldForm_Load @@ -265,7 +268,7 @@ namespace CodeWalker if (!initedOk) { Close(); - return; + return ValueTask.CompletedTask; } @@ -274,7 +277,7 @@ namespace CodeWalker if (!GTAFolder.UpdateGTAFolder(true)) { Close(); - return; + return ValueTask.CompletedTask; } Widget.Position = new Vector3(1.0f, 10.0f, 100.0f); @@ -311,9 +314,11 @@ namespace CodeWalker } MarkerStyleComboBox.SelectedItem = MarkerIcon; //LoadSettings will handle this LocatorStyleComboBox.SelectedItem = LocatorIcon; - LocatorMarker = new MapMarker(); - LocatorMarker.Icon = LocatorIcon; - LocatorMarker.IsMovable = true; + LocatorMarker = new MapMarker + { + Icon = LocatorIcon, + IsMovable = true + }; //AddDefaultMarkers(); //some POI to start with ShaderParamNames[] texsamplers = RenderableGeometry.GetTextureSamplerList(); @@ -339,13 +344,32 @@ namespace CodeWalker Renderer.Start(); + + return ValueTask.CompletedTask; } + public static string GetIconFolder() + { + // Directory we're looking for. + var dirToFind = Path.Combine("icons"); + + + if (!FileUtils.TryFindFolder(dirToFind, out var folder)) + { + throw new FileNotFoundException($"Could not find '{dirToFind}' directory."); + } + else + { + return folder; + } + } + private MapIcon AddIcon(string name, string filename, int texw, int texh, float centerx, float centery, float scale) { - string filepath = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "icons", filename); + + string filepath = Path.Combine(GetIconFolder(), filename); try { MapIcon mi = new MapIcon(name, filepath, texw, texh, centerx, centery, scale); @@ -386,7 +410,7 @@ namespace CodeWalker } camera.FollowEntity = CamEntity; - CamEntity.Position = (startupviewmode!=2) ? prevworldpos : Vector3.Zero; + CamEntity.Position = (startupviewmode != 2) ? prevworldpos : Vector3.Zero; CamEntity.Orientation = Quaternion.LookAtLH(Vector3.Zero, Vector3.Up, Vector3.ForwardLH); Space.AddPersistentEntity(PedEntity); @@ -403,7 +427,7 @@ namespace CodeWalker frametimer.Start(); } - public void CleanupScene() + public async ValueTask CleanupScene() { using var _ = new DisposableTimer("CleanupScene"); if (!CancellationTokenSource.IsCancellationRequested) @@ -425,7 +449,7 @@ namespace CodeWalker int count = 0; while (running && (count < 5000)) //wait for the content thread to exit gracefully { - Thread.Sleep(1); + await Task.Delay(1); count++; } } @@ -451,11 +475,12 @@ namespace CodeWalker await Task.Delay((int)(0.016666 * elapsed) * 1000, CancellationToken); } - if (Pauserendering) return; + if (Pauserendering) + return; GameFileCache.BeginFrame(); - if (!Monitor.TryEnter(Renderer.RenderSyncRoot, 50)) + if (!Renderer.RenderSyncRoot.Wait(50)) { return; } //couldn't get a lock, try again next time @@ -466,10 +491,7 @@ namespace CodeWalker Space.Update(elapsed); - if (CutsceneForm != null) - { - CutsceneForm.UpdateAnimation(elapsed); - } + CutsceneForm?.UpdateAnimation(elapsed); Renderer.Update(elapsed, MouseLastPoint.X, MouseLastPoint.Y); @@ -523,7 +545,7 @@ namespace CodeWalker } finally { - Monitor.Exit(Renderer.RenderSyncRoot); + Renderer.RenderSyncRoot.Release(); } UpdateMarkerSelectionPanelInvoke(); @@ -749,15 +771,9 @@ namespace CodeWalker spaceEnts = Space.TemporaryEntities; } - if (ProjectForm != null) - { - ProjectForm.GetVisibleYmaps(camera, renderworldVisibleYmapDict); - } + ProjectForm?.GetVisibleYmaps(camera, renderworldVisibleYmapDict); - if (CutsceneForm != null) - { - CutsceneForm.GetVisibleYmaps(camera, renderworldVisibleYmapDict); - } + CutsceneForm?.GetVisibleYmaps(camera, renderworldVisibleYmapDict); Renderer.RenderWorld(renderworldVisibleYmapDict, spaceEnts); @@ -833,7 +849,7 @@ namespace CodeWalker foreach (var item in collisionitems) { YbnFile ybn = GameFileCache.GetYbn(item.Name); - if ((ybn != null) && (ybn.Loaded)) + if (ybn is not null && ybn.Loaded) { collisionybns.Add(ybn); } @@ -891,7 +907,7 @@ namespace CodeWalker ProjectForm?.GetVisibleWaterQuads(camera, renderwaterquadlist); - if(SelectionMode == requiredMode) UpdateMouseHits(renderwaterquadlist); + if (SelectionMode == requiredMode) UpdateMouseHits(renderwaterquadlist); return renderwaterquadlist; } @@ -996,7 +1012,8 @@ namespace CodeWalker private void RenderWorldWatermaps() { - if (!Watermaps.Inited) return; + if (!Watermaps.Inited) + return; //renderwatermaplist.Clear(); //renderwatermaplist.AddRange(watermaps.Watermaps); @@ -1011,7 +1028,8 @@ namespace CodeWalker private void RenderWorldAudioZones() { - if (!AudioZones.Inited) return; + if (!AudioZones.Inited) + return; renderaudfilelist.Clear(); renderaudfilelist.AddRange(GameFileCache.AudioDatRelFiles); @@ -1024,19 +1042,15 @@ namespace CodeWalker renderaudplacementslist.Clear(); AudioZones.GetPlacements(renderaudfilelist, renderaudplacementslist); - - BoundingBox bbox = new BoundingBox(); BoundingSphere bsph = new BoundingSphere(); - Ray mray = new Ray(); - mray.Position = camera.MouseRay.Position + camera.Position; - mray.Direction = camera.MouseRay.Direction; + Ray mray = new Ray(camera.MouseRay.Position + camera.Position, camera.MouseRay.Direction); float hitdist = float.MaxValue; MapBox lastHitOuterBox = new MapBox(); MapSphere lastHitOuterSphere = new MapSphere(); - MapBox mb = new MapBox(); - MapSphere ms = new MapSphere(); + //MapBox mb; + //MapSphere ms; for (int i = 0; i < renderaudplacementslist.Count; i++) { @@ -1046,29 +1060,31 @@ namespace CodeWalker case Dat151ZoneShape.Box: case Dat151ZoneShape.Line: - mb.CamRelPos = placement.InnerPos - camera.Position; - mb.BBMin = placement.InnerMin; - mb.BBMax = placement.InnerMax; - mb.Orientation = placement.InnerOri; - mb.Scale = Vector3.One; + var mb = new MapBox( + camRelPos: placement.InnerPos - camera.Position, + bbMin: placement.InnerMin, + bbMax: placement.InnerMax, + orientation: placement.InnerOri, + scale: Vector3.One + ); Renderer.HilightBoxes.Add(mb); if (renderaudioouterbounds) { - mb.CamRelPos = placement.OuterPos - camera.Position; - mb.BBMin = placement.OuterMin; - mb.BBMax = placement.OuterMax; - mb.Orientation = placement.OuterOri; - mb.Scale = Vector3.One; + mb = new MapBox( + placement.OuterPos - camera.Position, + placement.OuterMin, + placement.OuterMax, + placement.OuterOri, + Vector3.One + ); Renderer.BoundingBoxes.Add(mb); } Vector3 hbcamrel = (placement.Position - camera.Position); - Ray mraytrn = new Ray(); - mraytrn.Position = placement.OrientationInv.Multiply(camera.MouseRay.Position - hbcamrel); - mraytrn.Direction = placement.OrientationInv.Multiply(mray.Direction); - bbox.Minimum = placement.HitboxMin; - bbox.Maximum = placement.HitboxMax; + Ray mraytrn = new Ray(placement.OrientationInv.Multiply(camera.MouseRay.Position - hbcamrel), placement.OrientationInv.Multiply(in mray.Direction)); + + bbox = new BoundingBox(placement.HitboxMin, placement.HitboxMax); if (mraytrn.Intersects(ref bbox, out hitdist) && (hitdist < CurMouseHit.HitDist) && (hitdist > 0)) { CurMouseHit.Audio = placement; @@ -1082,19 +1098,16 @@ namespace CodeWalker if ((placement.InnerPos != Vector3.Zero) && (placement.OuterPos != Vector3.Zero)) { - ms.CamRelPos = placement.InnerPos - camera.Position; - ms.Radius = placement.InnerRadius; + var ms = new MapSphere(placement.InnerPos - camera.Position, placement.InnerRadius); Renderer.HilightSpheres.Add(ms); if (renderaudioouterbounds) { - ms.CamRelPos = placement.OuterPos - camera.Position; - ms.Radius = placement.OuterRadius; + ms = new MapSphere(placement.OuterPos - camera.Position, placement.OuterRadius); Renderer.BoundingSpheres.Add(ms); } - bsph.Center = placement.Position; - bsph.Radius = placement.HitSphereRad; + bsph = new BoundingSphere(placement.Position, placement.HitSphereRad); if (mray.Intersects(ref bsph, out hitdist) && (hitdist < CurMouseHit.HitDist) && (hitdist > 0)) { CurMouseHit.Audio = placement; @@ -1105,9 +1118,6 @@ namespace CodeWalker lastHitOuterSphere = ms; //highlight the outer sphere } } - else - { } - break; default: @@ -1139,8 +1149,7 @@ namespace CodeWalker { //start point for model view mode rendering - uint hash = 0;// JenkHash.GenHash(modelname); - if (!uint.TryParse(modelname, out hash)) //try use a hash directly + if (!uint.TryParse(modelname, out var hash)) //try use a hash directly { hash = JenkHash.GenHash(modelname); } @@ -1159,7 +1168,7 @@ namespace CodeWalker else { YmapFile ymap = GameFileCache.GetYmap(hash); - if (ymap != null) + if (ymap is not null) { Renderer.RenderYmap(ymap); } @@ -1167,7 +1176,7 @@ namespace CodeWalker { //not a ymap... see if it's a ydr or yft YdrFile ydr = GameFileCache.GetYdr(hash); - if (ydr != null) + if (ydr is not null) { if (ydr.Loaded) { @@ -1179,11 +1188,11 @@ namespace CodeWalker else { YftFile yft = GameFileCache.GetYft(hash); - if (yft != null) + if (yft is not null) { if (yft.Loaded) { - if (yft.Fragment != null) + if (yft.Fragment is not null) { var f = yft.Fragment; @@ -1203,7 +1212,7 @@ namespace CodeWalker } } - if ((selarch != null) && (seldrwbl == null)) + if ((selarch is not null) && (seldrwbl is null)) { seldrwbl = GameFileCache.TryGetDrawable(selarch); } @@ -1264,8 +1273,10 @@ namespace CodeWalker UpdateMousedLabel(text); } - if(!CurMouseHit.HasHit) - { return; } + if (!CurMouseHit.HasHit) + { + return; + } BoundsShaderMode mode = BoundsShaderMode.Box; @@ -1349,7 +1360,7 @@ namespace CodeWalker var vertexSize = 0.1f; Renderer.RenderSelectionCircle(vpos, vertexSize, 0xFFFFFFFF); } - if (CurMouseHit.CollisionPoly != null) + if (CurMouseHit.CollisionPoly is not null) { Renderer.RenderSelectionCollisionPolyOutline(CurMouseHit.CollisionPoly, 0xFFFFFFFF, CurMouseHit.EntityDef); } @@ -1442,7 +1453,7 @@ namespace CodeWalker bbmax = cg.BBMax; float arrowlen = cg._CCarGen.perpendicularLength; float arrowrad = arrowlen * 0.066f; - Renderer.RenderSelectionArrowOutline(cg.Position, Vector3.UnitX, Vector3.UnitY, ori, arrowlen, arrowrad, cgrn); + Renderer.RenderSelectionArrowOutline(in cg.Position, in Vector3.UnitX, in Vector3.UnitY, in ori, arrowlen, arrowrad, cgrn); if (!Renderer.rendercars)//only render selected car if not already rendering cars.. { @@ -1452,35 +1463,35 @@ namespace CodeWalker Renderer.RenderCar(cg.Position, cgori, cg._CCarGen.carModel, cg._CCarGen.popGroup); } } - if (selectionItem.WaveQuad != null) + if (selectionItem.WaveQuad is not null) { var quad = selectionItem.WaveQuad; Vector3 quadArrowPos = new Vector3(quad.minX + (quad.maxX - quad.minX) * 0.5f, quad.minY + (quad.maxY - quad.minY) * 0.5f, 5); - Quaternion waveOri = quad.WaveOrientation; + ref Quaternion waveOri = ref quad.WaveOrientation; float arrowlen = quad.Amplitude * 50; float arrowrad = arrowlen * 0.066f; - Renderer.RenderSelectionArrowOutline(quadArrowPos, Vector3.UnitX, Vector3.UnitY, waveOri, arrowlen, arrowrad, cgrn); + Renderer.RenderSelectionArrowOutline(in quadArrowPos, in Vector3.UnitX, in Vector3.UnitY, in waveOri, arrowlen, arrowrad, cgrn); } - if (selectionItem.LodLight != null) + if (selectionItem.LodLight is not null) { Renderer.RenderSelectionLodLight(selectionItem.LodLight); - if (selectionItem.LodLight.LodLights != null) + if (selectionItem.LodLight.LodLights is not null) { bbmin = selectionItem.LodLight.LodLights.BBMin; bbmax = selectionItem.LodLight.LodLights.BBMax; } } - if (selectionItem.PathNode != null) + if (selectionItem.PathNode is not null) { camrel = selectionItem.PathNode.Position - camera.Position; } - if (selectionItem.TrainTrackNode != null) + if (selectionItem.TrainTrackNode is not null) { camrel = selectionItem.TrainTrackNode.Position - camera.Position; } - if (selectionItem.ScenarioNode != null) + if (selectionItem.ScenarioNode is not null) { camrel = selectionItem.ScenarioNode.Position - camera.Position; @@ -1490,7 +1501,7 @@ namespace CodeWalker ori = sn.Orientation; float arrowlen = 2.0f; float arrowrad = 0.25f; - Renderer.RenderSelectionArrowOutline(sn.Position, Vector3.UnitY, Vector3.UnitZ, ori, arrowlen, arrowrad, cgrn); + Renderer.RenderSelectionArrowOutline(in sn.Position, in Vector3.UnitY, in Vector3.UnitZ, in ori, arrowlen, arrowrad, cgrn); MCScenarioPoint vpoint = sn.MyPoint ?? sn.ClusterMyPoint; if ((vpoint != null) && (vpoint?.Type?.IsVehicle ?? false)) @@ -1525,7 +1536,7 @@ namespace CodeWalker var se = selectionItem.ScenarioEdge; var sn1 = se.NodeFrom; var sn2 = se.NodeTo; - if ((sn1 != null) && (sn2 != null)) + if (sn1 is not null && sn2 is not null) { var dirp = sn2.Position - sn1.Position; float dl = dirp.Length(); @@ -1533,8 +1544,8 @@ namespace CodeWalker Vector3 dup = Vector3.UnitZ; var aori = Quaternion.Invert(Quaternion.RotationLookAtRH(dir, dup)); float arrowrad = 0.25f; - float arrowlen = Math.Max(dl - arrowrad*5.0f, 0); - Renderer.RenderSelectionArrowOutline(sn1.Position, -Vector3.UnitZ, Vector3.UnitY, aori, arrowlen, arrowrad, cblu); + float arrowlen = Math.Max(dl - arrowrad * 5.0f, 0); + Renderer.RenderSelectionArrowOutline(sn1.Position, -Vector3.UnitZ, in Vector3.UnitY, in aori, arrowlen, arrowrad, cblu); } } if (selectionItem.MloEntityDef != null) @@ -1543,8 +1554,7 @@ namespace CodeWalker bbmax = selectionItem.AABB.Maximum; var mlo = selectionItem.MloEntityDef; var mlop = mlo.Position; - var mloa = mlo.Archetype as MloArchetype; - if (mloa != null) + if (mlo.Archetype is MloArchetype mloa) { VertexTypePC p1 = new VertexTypePC(); VertexTypePC p2 = new VertexTypePC(); @@ -1573,16 +1583,23 @@ namespace CodeWalker } if (mloa.rooms != null) { - MapBox wbox = new MapBox(); - wbox.Scale = Vector3.One; + MapBox wbox = new MapBox + { + Scale = Vector3.One + }; for (int ir = 0; ir < mloa.rooms.Length; ir++) { var room = mloa.rooms[ir]; - wbox.CamRelPos = mlop - camera.Position; - wbox.BBMin = room._Data.bbMin;// + offset; - wbox.BBMax = room._Data.bbMax;// + offset; - wbox.Orientation = mlo.Orientation; + wbox = new MapBox + { + Scale = Vector3.One, + CamRelPos = mlop - camera.Position, + BBMin = room._Data.bbMin,// + offset; + BBMax = room._Data.bbMax,// + offset; + Orientation = mlo.Orientation, + }; + if ((ir == 0) || (room.RoomName == "limbo")) { bbmin = room._Data.bbMin; @@ -1591,8 +1608,14 @@ namespace CodeWalker } else { - wbox.BBMin = room.BBMin_CW; //hack method to use CW calculated room AABBs, - wbox.BBMax = room.BBMax_CW; //R* ones are right size, but wrong position?? + wbox = new MapBox + { + Scale = Vector3.One, + CamRelPos = mlop - camera.Position, + BBMin = room.BBMin_CW,//hack method to use CW calculated room AABBs, + BBMax = room.BBMax_CW,//R* ones are right size, but wrong position?? + Orientation = mlo.Orientation, + }; Renderer.WhiteBoxes.Add(wbox); } } @@ -1671,19 +1694,23 @@ namespace CodeWalker if (selectionItem.Audio.Shape == Dat151ZoneShape.Sphere) { mode = BoundsShaderMode.Sphere; - MapSphere wsph = new MapSphere(); - wsph.CamRelPos = au.OuterPos - camera.Position; - wsph.Radius = au.OuterRadius; + MapSphere wsph = new MapSphere + { + CamRelPos = au.OuterPos - camera.Position, + Radius = au.OuterRadius, + }; Renderer.WhiteSpheres.Add(wsph); } else { - MapBox wbox = new MapBox(); - wbox.CamRelPos = au.OuterPos - camera.Position; - wbox.BBMin = au.OuterMin; - wbox.BBMax = au.OuterMax; - wbox.Orientation = au.OuterOri; - wbox.Scale = scale; + MapBox wbox = new MapBox + { + CamRelPos = au.OuterPos - camera.Position, + BBMin = au.OuterMin, + BBMax = au.OuterMax, + Orientation = au.OuterOri, + Scale = scale, + }; Renderer.WhiteBoxes.Add(wbox); } } @@ -1706,19 +1733,23 @@ namespace CodeWalker if (mode == BoundsShaderMode.Box) { - MapBox box = new MapBox(); - box.CamRelPos = camrel; - box.BBMin = bbmin; - box.BBMax = bbmax; - box.Orientation = ori; - box.Scale = scale; + MapBox box = new MapBox + { + CamRelPos = camrel, + BBMin = bbmin, + BBMax = bbmax, + Orientation = ori, + Scale = scale + }; Renderer.SelectionBoxes.Add(box); } else if (mode == BoundsShaderMode.Sphere) { - MapSphere sph = new MapSphere(); - sph.CamRelPos = camrel; - sph.Radius = bsphrad; + MapSphere sph = new MapSphere + { + CamRelPos = camrel, + Radius = bsphrad + }; Renderer.SelectionSpheres.Add(sph); } @@ -1782,13 +1813,13 @@ namespace CodeWalker float downlimit = 20.0f; Ray ray = new Ray(p, new Vector3(0, 0, -1.0f)); ray.Position.Z += 0.1f; - SpaceRayIntersectResult hit = Space.RayIntersect(ray, downlimit); + SpaceRayIntersectResult hit = Space.RayIntersect(ref ray, downlimit); if (hit.Hit) { return hit.Position; } ray.Position.Z += uplimit; - hit = Space.RayIntersect(ray, downlimit); + hit = Space.RayIntersect(ref ray, downlimit); if (hit.Hit) { return hit.Position; @@ -1972,7 +2003,7 @@ namespace CodeWalker public void UpdateCollisionBoundsGraphics(Bounds b) { - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { if (b is BoundBVH bvh) { @@ -2129,7 +2160,7 @@ namespace CodeWalker public Vector3 GetCameraPosition() { //currently used by ProjectForm when creating entities - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { return camera.Position; } @@ -2137,7 +2168,7 @@ namespace CodeWalker public Vector3 GetCameraViewDir() { //currently used by ProjectForm when creating entities - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { return camera.ViewDirection; } @@ -2174,86 +2205,58 @@ namespace CodeWalker MapBox b = new MapBox(); Vector3 pos = Vector3.Zero; float size = 0.5f; - if (ext is MCExtensionDefLightEffect) + switch(ext) { - var le = ext as MCExtensionDefLightEffect; - pos = le.Data.offsetPosition; + case MCExtensionDefLightEffect le: + pos = le.Data.offsetPosition; + break; + case MCExtensionDefSpawnPointOverride spo: + pos = spo.Data.offsetPosition; + size = spo.Data.Radius; + break; + case MCExtensionDefDoor door: + pos = door.Data.offsetPosition; + break; + case Mrage__phVerletClothCustomBounds cb: + if (cb.CollisionData is not null && cb.CollisionData.Length > 0) + { + pos = cb.CollisionData[0].Data.Position; + } + break; + case MCExtensionDefParticleEffect pe: + pos = pe.Data.offsetPosition; + break; + case MCExtensionDefAudioCollisionSettings acs: + pos = acs.Data.offsetPosition; + break; + case MCExtensionDefAudioEmitter ae: + pos = ae.Data.offsetPosition; + break; + case MCExtensionDefSpawnPoint sp: + pos = sp.Data.offsetPosition; + break; + case MCExtensionDefExplosionEffect ee: + pos = ee.Data.offsetPosition; + break; + case MCExtensionDefLadder ld: + pos = ld.Data.offsetPosition; + break; + case MCExtensionDefBuoyancy bu: + pos = bu.Data.offsetPosition; + break; + case MCExtensionDefExpression exp: + pos = exp.Data.offsetPosition; + break; + case MCExtensionDefLightShaft ls: + pos = ls.Data.offsetPosition; + break; + case MCExtensionDefWindDisturbance wd: + pos = wd.Data.offsetPosition; + break; + case MCExtensionDefProcObject po: + pos = po.Data.offsetPosition; + break; } - else if (ext is MCExtensionDefSpawnPointOverride) - { - var spo = ext as MCExtensionDefSpawnPointOverride; - pos = spo.Data.offsetPosition; - size = spo.Data.Radius; - } - else if (ext is MCExtensionDefDoor) - { - var door = ext as MCExtensionDefDoor; - pos = door.Data.offsetPosition; - } - else if (ext is Mrage__phVerletClothCustomBounds) - { - var cb = ext as Mrage__phVerletClothCustomBounds; - if ((cb.CollisionData != null) && (cb.CollisionData.Length > 0)) - { - pos = cb.CollisionData[0].Data.Position; - } - } - else if (ext is MCExtensionDefParticleEffect) - { - var pe = ext as MCExtensionDefParticleEffect; - pos = pe.Data.offsetPosition; - } - else if (ext is MCExtensionDefAudioCollisionSettings) - { - var acs = ext as MCExtensionDefAudioCollisionSettings; - pos = acs.Data.offsetPosition; - } - else if (ext is MCExtensionDefAudioEmitter) - { - var ae = ext as MCExtensionDefAudioEmitter; - pos = ae.Data.offsetPosition; - } - else if (ext is MCExtensionDefSpawnPoint) - { - var sp = ext as MCExtensionDefSpawnPoint; - pos = sp.Data.offsetPosition; - } - else if (ext is MCExtensionDefExplosionEffect) - { - var ee = ext as MCExtensionDefExplosionEffect; - pos = ee.Data.offsetPosition; - } - else if (ext is MCExtensionDefLadder) - { - var ld = ext as MCExtensionDefLadder; - pos = ld.Data.offsetPosition; - } - else if (ext is MCExtensionDefBuoyancy) - { - var bu = ext as MCExtensionDefBuoyancy; - pos = bu.Data.offsetPosition; - } - else if (ext is MCExtensionDefExpression) - { - var exp = ext as MCExtensionDefExpression; - pos = exp.Data.offsetPosition; - } - else if (ext is MCExtensionDefLightShaft) - { - var ls = ext as MCExtensionDefLightShaft; - pos = ls.Data.offsetPosition; - } - else if (ext is MCExtensionDefWindDisturbance) - { - var wd = ext as MCExtensionDefWindDisturbance; - pos = wd.Data.offsetPosition; - } - else if (ext is MCExtensionDefProcObject) - { - var po = ext as MCExtensionDefProcObject; - pos = po.Data.offsetPosition; - } - b.BBMin = pos - size; b.BBMax = pos + size; @@ -2265,7 +2268,8 @@ namespace CodeWalker private void SpawnTestEntity(bool cameraCenter = false) { - if (!Space.Inited) return; + if (!Space.Inited) + return; Vector3 dir = (cameraCenter ? camera.ViewDirection : camera.MouseRay.Direction); Vector3 ofs = (cameraCenter ? Vector3.Zero : camera.MouseRay.Position); @@ -2277,29 +2281,33 @@ namespace CodeWalker if (arch == null) return; - CEntityDef cent = new CEntityDef(); - cent.archetypeName = hash; - cent.rotation = new Vector4(0, 0, 0, 1); - cent.scaleXY = 1.0f; - cent.scaleZ = 1.0f; - cent.flags = 1572872; - cent.parentIndex = -1; - cent.lodDist = 200.0f; - cent.lodLevel = rage__eLodType.LODTYPES_DEPTH_ORPHANHD; - cent.priorityLevel = rage__ePriorityLevel.PRI_REQUIRED; - cent.ambientOcclusionMultiplier = 255; - cent.artificialAmbientOcclusion = 255; - cent.position = pos; + CEntityDef cent = new CEntityDef + { + archetypeName = hash, + rotation = new Vector4(0, 0, 0, 1), + scaleXY = 1.0f, + scaleZ = 1.0f, + flags = 1572872, + parentIndex = -1, + lodDist = 200.0f, + lodLevel = rage__eLodType.LODTYPES_DEPTH_ORPHANHD, + priorityLevel = rage__ePriorityLevel.PRI_REQUIRED, + ambientOcclusionMultiplier = 255, + artificialAmbientOcclusion = 255, + position = pos + }; - YmapEntityDef ent = new YmapEntityDef(null, 0, ref cent); + YmapEntityDef ent = new YmapEntityDef(null, 0, cent); ent.SetArchetype(arch); - Entity e = new Entity(); - e.Position = pos; - e.Velocity = vel; - e.Mass = 10.0f; + Entity e = new Entity + { + Position = pos, + Velocity = vel, + Mass = 10.0f + }; e.Momentum = vel * e.Mass; e.EntityDef = ent; e.Radius = arch.BSRadius * 0.7f; @@ -2307,7 +2315,7 @@ namespace CodeWalker e.Enabled = true; e.Lifetime = 20.0f; - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { Space.AddTemporaryEntity(e); } @@ -2321,7 +2329,7 @@ namespace CodeWalker { try { - Invoke(new Action(() => { SetControlMode(mode); })); + Invoke(SetControlMode, mode); } catch (Exception ex) { @@ -2330,7 +2338,8 @@ namespace CodeWalker return; } - if (mode == ControlMode) return; + if (mode == ControlMode) + return; bool wasfree = (ControlMode == WorldControlMode.Free || ControlBrushEnabled); bool isfree = (mode == WorldControlMode.Free || ControlBrushEnabled); @@ -2387,7 +2396,7 @@ namespace CodeWalker //reset variables for beginning the mouse hit test CurMouseHit.Clear(); - + if (Input.CtrlPressed && ProjectForm != null && ProjectForm.CanPaintInstances()) // Get whether or not we can brush from the project form. { ControlBrushEnabled = true; @@ -2418,23 +2427,31 @@ namespace CodeWalker } - + + public void GetSpaceMouseRay(out SpaceRayIntersectResult ret) + { + ret = new SpaceRayIntersectResult(); + if (Space.Inited && Space.BoundsStore != null) + { + Ray mray = new Ray(camera.MouseRay.Position + camera.Position, camera.MouseRay.Direction); + ret = Space.RayIntersect(ref mray, float.MaxValue, collisionmeshlayers); + } + } + public SpaceRayIntersectResult GetSpaceMouseRay() { SpaceRayIntersectResult ret = new SpaceRayIntersectResult(); if (Space.Inited && Space.BoundsStore != null) { - Ray mray = new Ray(); - mray.Position = camera.MouseRay.Position + camera.Position; - mray.Direction = camera.MouseRay.Direction; - return Space.RayIntersect(mray, float.MaxValue, collisionmeshlayers); + Ray mray = new Ray(camera.MouseRay.Position + camera.Position, camera.MouseRay.Direction); + return Space.RayIntersect(ref mray, float.MaxValue, collisionmeshlayers); } return ret; } - public SpaceRayIntersectResult Raycast(Ray ray) + public SpaceRayIntersectResult Raycast(ref Ray ray) { - return Space.RayIntersect(ray, float.MaxValue, collisionmeshlayers); + return Space.RayIntersect(ref ray, float.MaxValue, collisionmeshlayers); } private void UpdateMouseHits() @@ -2478,7 +2495,7 @@ namespace CodeWalker //if ((SelectionMode == MapSelectionMode.Entity) && !MouseSelectEnabled) return; //performance improvement when not selecting entities... //test the selected entity/archetype for mouse hit. - + //first test the bounding sphere for mouse hit.. Quaternion orinv; Ray mraytrn; @@ -2520,9 +2537,11 @@ namespace CodeWalker { //transform the mouse ray into the entity space. orinv = Quaternion.Invert(orientation); - mraytrn = new Ray(); - mraytrn.Position = orinv.Multiply(camera.MouseRay.Position-camrel); - mraytrn.Direction = orinv.Multiply(camera.MouseRay.Direction); + mraytrn = new Ray + { + Position = orinv.Multiply(camera.MouseRay.Position - camrel), + Direction = orinv.Multiply(camera.MouseRay.Direction) + }; if (SelectionMode == MapSelectionMode.EntityExtension) { @@ -2555,7 +2574,7 @@ namespace CodeWalker } if (SelectionMode == MapSelectionMode.ArchetypeExtension) { - if ((arche != null) && (arche.Extensions != null)) + if (arche is not null && arche.Extensions.Length > 0) { for (int i = 0; i < arche.Extensions.Length; i++) { @@ -2589,7 +2608,9 @@ namespace CodeWalker if (!mousespherehit) - { return; } //no sphere hit, so no entity hit. + { + return; + } //no sphere hit, so no entity hit. @@ -2611,9 +2632,11 @@ namespace CodeWalker //transform the mouse ray into the entity space. orinv = Quaternion.Invert(orientation); - mraytrn = new Ray(); - mraytrn.Position = orinv.Multiply(camera.MouseRay.Position-camrel); - mraytrn.Direction = orinv.Multiply(camera.MouseRay.Direction); + mraytrn = new Ray + { + Position = orinv.Multiply(camera.MouseRay.Position - camrel), + Direction = orinv.Multiply(camera.MouseRay.Direction) + }; hitdist = 0.0f; @@ -2649,7 +2672,7 @@ namespace CodeWalker float r2 = b2.Length() * 0.5f; radsm = (r1 < (r2));// * 0.5f)); } - if ((nearer&&radsm) || radsm) usehit = true; + if ((nearer && radsm) || radsm) usehit = true; } } else if (j == 0) //no hit on model box @@ -2691,7 +2714,7 @@ namespace CodeWalker float r2 = CurMouseHit.Archetype.BSRadius; radsm = (r1 <= (r2));// * 0.5f)); //prefer selecting smaller things } - if ((nearer&&radsm) || radsm) + if ((nearer && radsm) || radsm) { outerhit = true; } @@ -2783,9 +2806,11 @@ namespace CodeWalker //find mouse hits for things like MLOs, time cycle mods, grass batches, and car generators in ymaps. BoundingBox bbox = new BoundingBox(); - Ray mray = new Ray(); - mray.Position = camera.MouseRay.Position + camera.Position; - mray.Direction = camera.MouseRay.Direction; + Ray mray = new Ray + { + Position = camera.MouseRay.Position + camera.Position, + Direction = camera.MouseRay.Direction + }; float hitdist = float.MaxValue; float dmax = Renderer.renderboundsmaxdist; @@ -2797,12 +2822,14 @@ namespace CodeWalker var tcm = ymap.TimeCycleModifiers[i]; if ((((tcm.BBMin + tcm.BBMax) * 0.5f) - camera.Position).Length() > dmax) continue; - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = tcm.BBMin; - mb.BBMax = tcm.BBMax; - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = tcm.BBMin, + BBMax = tcm.BBMax, + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; Renderer.BoundingBoxes.Add(mb); bbox.Minimum = mb.BBMin; @@ -2821,18 +2848,22 @@ namespace CodeWalker for (int i = 0; i < ymap.CarGenerators.Length; i++) { var cg = ymap.CarGenerators[i]; - MapBox mb = new MapBox(); - mb.CamRelPos = cg.Position - camera.Position; - mb.BBMin = cg.BBMin; - mb.BBMax = cg.BBMax; - mb.Orientation = cg.Orientation; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = cg.Position - camera.Position, + BBMin = cg.BBMin, + BBMax = cg.BBMax, + Orientation = cg.Orientation, + Scale = Vector3.One, + }; Renderer.BoundingBoxes.Add(mb); Quaternion orinv = Quaternion.Invert(cg.Orientation); - Ray mraytrn = new Ray(); - mraytrn.Position = orinv.Multiply(camera.MouseRay.Position - mb.CamRelPos); - mraytrn.Direction = orinv.Multiply(mray.Direction); + Ray mraytrn = new Ray + { + Position = orinv.Multiply(camera.MouseRay.Position - mb.CamRelPos), + Direction = orinv.Multiply(mray.Direction) + }; bbox.Minimum = mb.BBMin; bbox.Maximum = mb.BBMax; if (mraytrn.Intersects(ref bbox, out hitdist) && (hitdist < CurMouseHit.HitDist) && (hitdist > 0)) @@ -2848,24 +2879,24 @@ namespace CodeWalker } } - if ((SelectionMode == MapSelectionMode.MloInstance) && (ymap.MloEntities != null)) + if ((SelectionMode == MapSelectionMode.MloInstance)) { - for (int i = 0; i < ymap.MloEntities.Length; i++) + foreach(var ent in ymap.MloEntities) { - var ent = ymap.MloEntities[i]; - if (SelectedItem.MloEntityDef == ent) continue; - MapBox mb = new MapBox(); - mb.CamRelPos = ent.Position - camera.Position; - mb.BBMin = /*ent?.BBMin ??*/ new Vector3(-1.5f); - mb.BBMax = /*ent?.BBMax ??*/ new Vector3(1.5f); - mb.Orientation = ent?.Orientation ?? Quaternion.Identity; - mb.Scale = /*ent?.Scale ??*/ Vector3.One; + if (SelectedItem.MloEntityDef == ent) + continue; + MapBox mb = new MapBox + { + CamRelPos = ent.Position - camera.Position, + BBMin = /*ent?.BBMin ??*/ new Vector3(-1.5f), + BBMax = /*ent?.BBMax ??*/ new Vector3(1.5f), + Orientation = ent?.Orientation ?? Quaternion.Identity, + Scale = /*ent?.Scale ??*/ Vector3.One + }; Renderer.BoundingBoxes.Add(mb); Quaternion orinv = Quaternion.Invert(mb.Orientation); - Ray mraytrn = new Ray(); - mraytrn.Position = orinv.Multiply(camera.MouseRay.Position - mb.CamRelPos); - mraytrn.Direction = orinv.Multiply(mray.Direction); + Ray mraytrn = new Ray(orinv.Multiply(camera.MouseRay.Position - mb.CamRelPos), orinv.Multiply(mray.Direction)); bbox.Minimum = mb.BBMin; bbox.Maximum = mb.BBMax; if (mraytrn.Intersects(ref bbox, out hitdist) && (hitdist < CurMouseHit.HitDist) && (hitdist > 0)) @@ -2885,12 +2916,14 @@ namespace CodeWalker var gb = ymap.GrassInstanceBatches[i]; if ((gb.Position - camera.Position).Length() > dmax) continue; - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = gb.AABBMin; - mb.BBMax = gb.AABBMax; - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = gb.AABBMin, + BBMax = gb.AABBMax, + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; Renderer.BoundingBoxes.Add(mb); bbox.Minimum = mb.BBMin; @@ -2910,12 +2943,14 @@ namespace CodeWalker if ((((ll.BBMin + ll.BBMax) * 0.5f) - camera.Position).Length() <= dmax) { - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = ll.BBMin; - mb.BBMax = ll.BBMax; - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = ll.BBMin, + BBMax = ll.BBMax, + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; Renderer.BoundingBoxes.Add(mb); if (ll.BVH != null) @@ -2929,12 +2964,14 @@ namespace CodeWalker var dll = ymap.DistantLODLights; if ((((dll.BBMin + dll.BBMax) * 0.5f) - camera.Position).Length() <= dmax) { - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = dll.BBMin; - mb.BBMax = dll.BBMax; - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = dll.BBMin, + BBMax = dll.BBMax, + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; Renderer.BoundingBoxes.Add(mb); } } @@ -2947,18 +2984,22 @@ namespace CodeWalker Renderer.RenderBasePath(bo); - MapBox mb = new MapBox(); - mb.CamRelPos = bo.Position - camera.Position; - mb.BBMin = bo.BBMin; - mb.BBMax = bo.BBMax; - mb.Orientation = bo.Orientation; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = bo.Position - camera.Position, + BBMin = bo.BBMin, + BBMax = bo.BBMax, + Orientation = bo.Orientation, + Scale = Vector3.One + }; //Renderer.BoundingBoxes.Add(mb); Quaternion orinv = Quaternion.Invert(bo.Orientation); - Ray mraytrn = new Ray(); - mraytrn.Position = orinv.Multiply(camera.MouseRay.Position - mb.CamRelPos); - mraytrn.Direction = orinv.Multiply(mray.Direction); + Ray mraytrn = new Ray + { + Position = orinv.Multiply(camera.MouseRay.Position - mb.CamRelPos), + Direction = orinv.Multiply(mray.Direction) + }; bbox.Minimum = mb.BBMin; bbox.Maximum = mb.BBMax; if (mraytrn.Intersects(ref bbox, out float hd) && (hd < CurMouseHit.HitDist) && (hd > 0)) @@ -2997,26 +3038,30 @@ namespace CodeWalker private void UpdateMouseHits(List waterquads) where T : BaseWaterQuad { BoundingBox bbox = new BoundingBox(); - Ray mray = new Ray(); - mray.Position = camera.MouseRay.Position + camera.Position; - mray.Direction = camera.MouseRay.Direction; + Ray mray = new Ray + { + Position = camera.MouseRay.Position + camera.Position, + Direction = camera.MouseRay.Direction + }; float hitdist; foreach (T quad in waterquads) { - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = new Vector3(quad.minX, quad.minY, quad.z ?? 0); - mb.BBMax = new Vector3(quad.maxX, quad.maxY, quad.z ?? 0); - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = new Vector3(quad.minX, quad.minY, quad.z ?? 0), + BBMax = new Vector3(quad.maxX, quad.maxY, quad.z ?? 0), + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; Renderer.BoundingBoxes.Add(mb); bbox.Minimum = mb.BBMin; bbox.Maximum = mb.BBMax; - if(mray.Intersects(ref bbox, out hitdist) && hitdist > 0 && hitdist <= CurMouseHit.HitDist) + if (mray.Intersects(ref bbox, out hitdist) && hitdist > 0 && hitdist <= CurMouseHit.HitDist) { float curSize = CurMouseHit.AABB.Size.X * CurMouseHit.AABB.Size.Y; float newSize = bbox.Size.X * bbox.Size.Y; @@ -3037,9 +3082,11 @@ namespace CodeWalker { if (SelectionMode != MapSelectionMode.NavMesh) return; - Ray mray = new Ray(); - mray.Position = camera.MouseRay.Position + camera.Position; - mray.Direction = camera.MouseRay.Direction; + Ray mray = new Ray + { + Position = camera.MouseRay.Position + camera.Position, + Direction = camera.MouseRay.Direction + }; foreach (var ynv in ynvs) { @@ -3048,12 +3095,14 @@ namespace CodeWalker if (ynv.Nav == null) continue; if (ynv.Nav.SectorTree == null) continue; - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = ynv.Nav.SectorTree.AABBMin.XYZ(); - mb.BBMax = ynv.Nav.SectorTree.AABBMax.XYZ(); - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = ynv.Nav.SectorTree.AABBMin.XYZ(), + BBMax = ynv.Nav.SectorTree.AABBMax.XYZ(), + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; Renderer.BoundingBoxes.Add(mb); } @@ -3064,20 +3113,22 @@ namespace CodeWalker //if ((CurMouseHit.NavPoint != null) || (CurMouseHit.NavPortal != null)) continue; if ((ynv.Nav != null) && (ynv.Vertices != null) && (ynv.Indices != null) && (ynv.Polys != null)) { - UpdateMouseHits(ynv, ynv.Nav.SectorTree, ynv.Nav.SectorTree, ref mray); + UpdateMouseHits(ynv, ynv.Nav.SectorTree, ynv.Nav.SectorTree, in mray); } } } - private void UpdateMouseHits(YnvFile ynv, NavMeshSector navsector, NavMeshSector rootsec, ref Ray mray) + private void UpdateMouseHits(YnvFile ynv, NavMeshSector navsector, NavMeshSector rootsec, in Ray mray) { if (navsector == null) return; float hitdist = float.MaxValue; - BoundingBox bbox = new BoundingBox(); - bbox.Minimum = navsector.AABBMin.XYZ(); - bbox.Maximum = navsector.AABBMax.XYZ(); + BoundingBox bbox = new BoundingBox + { + Minimum = navsector.AABBMin.XYZ(), + Maximum = navsector.AABBMax.XYZ() + }; if (rootsec != null) //apparently the Z values are incorrect :( { @@ -3100,25 +3151,27 @@ namespace CodeWalker if (navsector.SubTree1 != null) { - UpdateMouseHits(ynv, navsector.SubTree1, rootsec, ref mray); + UpdateMouseHits(ynv, navsector.SubTree1, rootsec, in mray); } if (navsector.SubTree2 != null) { - UpdateMouseHits(ynv, navsector.SubTree2, rootsec, ref mray); + UpdateMouseHits(ynv, navsector.SubTree2, rootsec, in mray); } if (navsector.SubTree3 != null) { - UpdateMouseHits(ynv, navsector.SubTree3, rootsec, ref mray); + UpdateMouseHits(ynv, navsector.SubTree3, rootsec, in mray); } if (navsector.SubTree4 != null) { - UpdateMouseHits(ynv, navsector.SubTree4, rootsec, ref mray); + UpdateMouseHits(ynv, navsector.SubTree4, rootsec, in mray); } if ((navsector.Data != null) && (navsector.Data.PolyIDs != null)) { - BoundingBox cbox = new BoundingBox(); - cbox.Minimum = bbox.Minimum - camera.Position; - cbox.Maximum = bbox.Maximum - camera.Position; + BoundingBox cbox = new BoundingBox + { + Minimum = bbox.Minimum - camera.Position, + Maximum = bbox.Maximum - camera.Position + }; var polys = ynv.Polys; var polyids = navsector.Data.PolyIDs; @@ -3176,9 +3229,11 @@ namespace CodeWalker { if (SelectionMode != MapSelectionMode.Path) return; - Ray mray = new Ray(); - mray.Position = camera.MouseRay.Position + camera.Position; - mray.Direction = camera.MouseRay.Direction; + Ray mray = new Ray + { + Position = camera.MouseRay.Position + camera.Position, + Direction = camera.MouseRay.Direction + }; foreach (var ynd in ynds) { @@ -3186,12 +3241,14 @@ namespace CodeWalker { float minz = (ynd.BVH != null) ? ynd.BVH.Box.Minimum.Z : 0.0f; float maxz = (ynd.BVH != null) ? ynd.BVH.Box.Maximum.Z : 0.0f; - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = new Vector3(ynd.BBMin.X, ynd.BBMin.Y, minz); - mb.BBMax = new Vector3(ynd.BBMax.X, ynd.BBMax.Y, maxz); - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = new Vector3(ynd.BBMin.X, ynd.BBMin.Y, minz), + BBMax = new Vector3(ynd.BBMax.X, ynd.BBMax.Y, maxz), + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; Renderer.BoundingBoxes.Add(mb); } @@ -3258,9 +3315,11 @@ namespace CodeWalker { if (SelectionMode != MapSelectionMode.TrainTrack) return; - Ray mray = new Ray(); - mray.Position = camera.MouseRay.Position + camera.Position; - mray.Direction = camera.MouseRay.Direction; + Ray mray = new Ray + { + Position = camera.MouseRay.Position + camera.Position, + Direction = camera.MouseRay.Direction + }; foreach (var track in tracks) { @@ -3295,12 +3354,15 @@ namespace CodeWalker float dl = dv.Length(); Vector3 dir = dv * (1.0f / dl); Vector3 dup = Vector3.UnitZ; - MapBox mb = new MapBox(); - mb.CamRelPos = n.Position - camera.Position; - mb.BBMin = new Vector3(-linkrad, -linkrad, 0.0f); - mb.BBMax = new Vector3(linkrad, linkrad, dl); - mb.Orientation = Quaternion.Invert(Quaternion.RotationLookAtRH(dir, dup)); - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = n.Position - camera.Position, + BBMin = new Vector3(-linkrad, -linkrad, 0.0f), + BBMax = new Vector3(linkrad, linkrad, dl), + Orientation = Quaternion.Invert(Quaternion.RotationLookAtRH(dir, dup)), + Scale = Vector3.One, + }; + Renderer.BoundingBoxes.Add(mb); } } @@ -3311,9 +3373,11 @@ namespace CodeWalker { if (SelectionMode != MapSelectionMode.Scenario) return; - Ray mray = new Ray(); - mray.Position = camera.MouseRay.Position + camera.Position; - mray.Direction = camera.MouseRay.Direction; + Ray mray = new Ray + { + Position = camera.MouseRay.Position + camera.Position, + Direction = camera.MouseRay.Direction + }; foreach (var scenario in scenarios) { @@ -3322,12 +3386,14 @@ namespace CodeWalker if (renderscenariobounds) { - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = sr?.BVH?.Box.Minimum ?? Vector3.Zero; - mb.BBMax = sr?.BVH?.Box.Maximum ?? Vector3.Zero; - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = sr?.BVH?.Box.Minimum ?? Vector3.Zero, + BBMax = sr?.BVH?.Box.Maximum ?? Vector3.Zero, + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; Renderer.BoundingBoxes.Add(mb); } @@ -3368,12 +3434,14 @@ namespace CodeWalker var sr = SelectedItem.ScenarioNode.Ymt.ScenarioRegion; //if (renderscenariobounds) { - MapBox mb = new MapBox(); - mb.CamRelPos = -camera.Position; - mb.BBMin = sr?.BVH?.Box.Minimum ?? Vector3.Zero; - mb.BBMax = sr?.BVH?.Box.Maximum ?? Vector3.Zero; - mb.Orientation = Quaternion.Identity; - mb.Scale = Vector3.One; + MapBox mb = new MapBox + { + CamRelPos = -camera.Position, + BBMin = sr?.BVH?.Box.Minimum ?? Vector3.Zero, + BBMax = sr?.BVH?.Box.Maximum ?? Vector3.Zero, + Orientation = Quaternion.Identity, + Scale = Vector3.One + }; if (renderscenariobounds) { Renderer.HilightBoxes.Add(mb); @@ -3389,12 +3457,15 @@ namespace CodeWalker { //hilight the cluster itself - MapBox mb = new MapBox(); - mb.Scale = Vector3.One; - mb.BBMin = new Vector3(-0.5f); - mb.BBMax = new Vector3(0.5f); - mb.CamRelPos = ncl.Position - camera.Position; - mb.Orientation = Quaternion.Identity; + MapBox mb = new MapBox + { + Scale = Vector3.One, + BBMin = new Vector3(-0.5f), + BBMax = new Vector3(0.5f), + CamRelPos = ncl.Position - camera.Position, + Orientation = Quaternion.Identity, + }; + Renderer.HilightBoxes.Add(mb); @@ -3404,12 +3475,14 @@ namespace CodeWalker foreach (var clpoint in ncl.Points.MyPoints) { if (clpoint == n.ClusterMyPoint) continue; //don't highlight the selected node... - mb = new MapBox(); - mb.Scale = Vector3.One; - mb.BBMin = new Vector3(-0.5f); - mb.BBMax = new Vector3(0.5f); - mb.CamRelPos = clpoint.Position - camera.Position; - mb.Orientation = clpoint.Orientation; + mb = new MapBox + { + Scale = Vector3.One, + BBMin = new Vector3(-0.5f), + BBMax = new Vector3(0.5f), + CamRelPos = clpoint.Position - camera.Position, + Orientation = clpoint.Orientation, + }; Renderer.BoundingBoxes.Add(mb); } } @@ -3423,29 +3496,35 @@ namespace CodeWalker } - private void UpdateMouseHits(PathBVHNode pathbvhnode, ref Ray mray) + private void UpdateMouseHits(PathBVHNode pathbvhnode, in Ray mray) { float nrad = 0.5f; float hitdist = float.MaxValue; - BoundingSphere bsph = new BoundingSphere(); - bsph.Radius = nrad; + BoundingSphere bsph = new BoundingSphere + { + Radius = nrad + }; - BoundingBox bbox = new BoundingBox(); - bbox.Minimum = pathbvhnode.Box.Minimum - nrad; - bbox.Maximum = pathbvhnode.Box.Maximum + nrad; + BoundingBox bbox = new BoundingBox + { + Minimum = pathbvhnode.Box.Minimum - nrad, + Maximum = pathbvhnode.Box.Maximum + nrad + }; - BoundingBox nbox = new BoundingBox(); - nbox.Minimum = new Vector3(-nrad); - nbox.Maximum = new Vector3(nrad); + BoundingBox nbox = new BoundingBox + { + Minimum = new Vector3(-nrad), + Maximum = new Vector3(nrad) + }; float fhd; if (mray.Intersects(ref bbox, out fhd)) //ray intersects this node... check children for hits! { if ((pathbvhnode.Node1 != null) && (pathbvhnode.Node2 != null)) //node is split. recurse { - UpdateMouseHits(pathbvhnode.Node1, ref mray); - UpdateMouseHits(pathbvhnode.Node2, ref mray); + UpdateMouseHits(pathbvhnode.Node1, in mray); + UpdateMouseHits(pathbvhnode.Node2, in mray); } else if (pathbvhnode.Nodes != null) //leaf node. test contaned pathnodes { @@ -3470,9 +3549,9 @@ namespace CodeWalker } } - public void SelectObject(object obj, object parent = null, bool addSelection = false) + public void SelectObject(object? obj, object? parent = null, bool addSelection = false) { - if (obj == null) + if (obj is null) { SelectItem(null, addSelection); return; @@ -3529,7 +3608,7 @@ namespace CodeWalker bool change = false; if (mhit != null) { - change = SelectedItem.CheckForChanges(mhitv); + change = SelectedItem.CheckForChanges(mhitv); } else { @@ -3640,33 +3719,31 @@ namespace CodeWalker return; } - lock (Renderer.RenderSyncRoot) //drawflags is used when rendering.. need that lock + + if (mhit.HasValue) { - if (mhit.HasValue) + SelectedItem = mhitv; + } + else + { + SelectedItem.Clear(); + } + + if (change) + { + if (!addSelection) { - SelectedItem = mhitv; - } - else - { - SelectedItem.Clear(); + UpdateSelectionUI(true); } - if (change) + Widget.Visible = SelectedItem.CanShowWidget; + if (Widget.Visible) { - if (!addSelection) - { - UpdateSelectionUI(true); - } - - Widget.Visible = SelectedItem.CanShowWidget; - if (Widget.Visible) - { - Widget.Position = SelectedItem.WidgetPosition; - Widget.Rotation = SelectedItem.WidgetRotation; - Widget.RotationWidget.EnableAxes = SelectedItem.WidgetRotationAxes; - Widget.ScaleWidget.LockXY = SelectedItem.WidgetScaleLockXY; - Widget.Scale = SelectedItem.WidgetScale; - } + Widget.Position = SelectedItem.WidgetPosition; + Widget.Rotation = SelectedItem.WidgetRotation; + Widget.RotationWidget.EnableAxes = SelectedItem.WidgetRotationAxes; + Widget.ScaleWidget.LockXY = SelectedItem.WidgetScaleLockXY; + Widget.Scale = SelectedItem.WidgetScale; } } if (notifyProject && change && (ProjectForm != null) && (!addSelection || manualSelection)) @@ -3723,11 +3800,11 @@ namespace CodeWalker { if (wait) { - Invoke(new Action(() => { UpdateSelectionUI(wait); })); + Invoke(UpdateSelectionUI, wait); } else { - BeginInvoke(new Action(() => { UpdateSelectionUI(wait); })); + BeginInvoke(UpdateSelectionUI, wait); } } else @@ -3740,7 +3817,9 @@ namespace CodeWalker } } } - catch { } + catch(Exception ex) { + Console.WriteLine(ex); + } } private void SetSelectionUI(MapSelection item) { @@ -4006,7 +4085,8 @@ namespace CodeWalker } private void AddSelectionDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check) { - if (models == null) return; + if (models is null) + return; for (int mi = 0; mi < models.Length; mi++) { @@ -4024,7 +4104,8 @@ namespace CodeWalker Renderer.SelectionModelDrawFlags[model] = false; } - if (model.Geometries == null) continue; + if (model.Geometries is null || model.Geometries.Length == 0) + continue; foreach (var geom in model.Geometries) { @@ -4045,12 +4126,10 @@ namespace CodeWalker { var hash = pl.Hashes[ip]; var parm = pl.Parameters[ip]; - var tex = parm.Data as TextureBase; - if (tex != null) + if (parm.Data is TextureBase tex) { - var t = tex as Texture; var tstr = tex.Name.Trim(); - if (t != null) + if (tex is Texture t) { tstr = string.Format("{0} ({1}x{2}, embedded)", tex.Name, t.Width, t.Height); } @@ -4060,7 +4139,7 @@ namespace CodeWalker } tgnode.Expand(); } - + } mnode.Expand(); @@ -4154,7 +4233,7 @@ namespace CodeWalker } ToolbarProjectWindowButton.Checked = true; } - catch(Exception ex) + catch (Exception ex) { Console.WriteLine(ex); } @@ -4227,7 +4306,7 @@ namespace CodeWalker } - private void LoadWorld() + private async ValueTask LoadWorldAsync() { UpdateStatus("Loading timecycles..."); @@ -4252,7 +4331,7 @@ namespace CodeWalker Trains.Init(GameFileCache, UpdateStatus); UpdateStatus("Loading scenarios..."); - Scenarios.Init(GameFileCache, UpdateStatus, timecycle); + await Scenarios.InitAsync(GameFileCache, UpdateStatus, timecycle); UpdateStatus("Loading popzones..."); PopZones.Init(GameFileCache, UpdateStatus); @@ -4267,7 +4346,7 @@ namespace CodeWalker AudioZones.Init(GameFileCache, UpdateStatus); UpdateStatus("Loading world..."); - Space.Init(GameFileCache, UpdateStatus); + await Space.InitAsync(GameFileCache, UpdateStatus); UpdateStatus("World loaded"); @@ -4277,20 +4356,22 @@ namespace CodeWalker private void SetDlcLevel(string dlc, bool enable) { - if (!initialised) return; + if (!initialised) + return; Cursor = Cursors.WaitCursor; - Task.Run(() => + _ = Task.Run(async () => { - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { if (GameFileCache.SetDlcLevel(dlc, enable)) { - LoadWorld(); + await LoadWorldAsync(); } } - Invoke(new Action(()=> { + Invoke(() => + { Cursor = Cursors.Default; - })); + }); }); } @@ -4298,25 +4379,26 @@ namespace CodeWalker { if (!initialised) return; Cursor = Cursors.WaitCursor; - Task.Run(() => + _ = Task.Run(async () => { - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { if (GameFileCache.SetModsEnabled(enable)) { UpdateDlcListComboBox(GameFileCache.DlcNameList); - LoadWorld(); + await LoadWorldAsync(); } } - Invoke(new Action(() => { + Invoke(new Action(() => + { Cursor = Cursors.Default; })); }); } - private async void ContentThread() + private async Task ContentThread() { try { @@ -4353,7 +4435,7 @@ namespace CodeWalker } if (!GameFileCache.IsInited) { - GameFileCache.Init(); + await GameFileCache.InitAsync(); } UpdateDlcListComboBox(GameFileCache.DlcNameList); @@ -4362,7 +4444,7 @@ namespace CodeWalker - LoadWorld(); + await LoadWorldAsync(); @@ -4380,7 +4462,7 @@ namespace CodeWalker if (!rcItemsPending) { - await Task.Delay(ActiveForm == null ? 50 : 1, CancellationToken).ConfigureAwait(false); + await Task.Delay(ActiveForm == null ? 50 : 2, CancellationToken).ConfigureAwait(false); } } } @@ -4402,7 +4484,7 @@ namespace CodeWalker if (!fcItemsPending) { - await Task.Delay(ActiveForm == null ? 50 : 1, CancellationToken).ConfigureAwait(false); + await Task.Delay(ActiveForm == null ? 50 : 10, CancellationToken).ConfigureAwait(false); } } } @@ -4419,7 +4501,7 @@ namespace CodeWalker Console.WriteLine("GameFileCache ContentThread stopped"); }); } - catch(Exception ex) + catch (Exception ex) { Console.WriteLine($"Exception occured in content thread:\n{ex}"); } @@ -4436,22 +4518,23 @@ namespace CodeWalker private void UpdateStatus(string text) { + var elapsed = lastStatusUpdate.Elapsed; + if (elapsed < updateInterval) + return; + lastStatusUpdate.Restart(); try { - var elapsed = lastStatusUpdate.Elapsed; - if (elapsed < updateInterval) - return; - lastStatusUpdate.Restart(); if (InvokeRequired) { - BeginInvoke(new Action(() => { doUpdateStatus(text); })); + BeginInvoke(doUpdateStatus, text); } else { doUpdateStatus(text); } } - catch(Exception ex) { + catch (Exception ex) + { Console.WriteLine(ex); } } @@ -4461,7 +4544,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateMousedLabel(text); })); + BeginInvoke(UpdateMousedLabel, text); } else { @@ -4479,7 +4562,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateWeatherTypesComboBox(weather); })); + BeginInvoke(UpdateWeatherTypesComboBox, weather); } else { @@ -4508,7 +4591,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateCloudTypesComboBox(clouds); })); + BeginInvoke(UpdateCloudTypesComboBox, clouds); } else { @@ -4539,7 +4622,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateDlcListComboBox(dlcnames); })); + BeginInvoke(UpdateDlcListComboBox, dlcnames); } else { @@ -4568,7 +4651,7 @@ namespace CodeWalker { if (InvokeRequired) { - Invoke(new Action(() => { LogError(text); })); + Invoke(LogError, text); } else { @@ -4577,7 +4660,9 @@ namespace CodeWalker //MessageBox.Show(text); } } - catch (Exception ex) { Console.WriteLine(ex); } + catch (Exception ex) { + Console.WriteLine(ex); + } } @@ -4589,14 +4674,16 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { UpdateMarkerSelectionPanel(); })); + BeginInvoke(UpdateMarkerSelectionPanel); } else { UpdateMarkerSelectionPanel(); } } - catch (Exception ex) { Console.WriteLine(ex); } + catch (Exception ex) { + Console.WriteLine(ex); + } } private void UpdateMarkerSelectionPanel() { @@ -4820,10 +4907,10 @@ namespace CodeWalker Renderer.individualcloudfrag = s.Clouds; NaturalAmbientLightCheckBox.Checked = s.NatrualAmbientLight; ArtificialAmbientLightCheckBox.Checked = s.ArtificialAmbientLight; - + SetTimeOfDay(s.TimeOfDay); Renderer.SetWeatherType(s.Weather); - + EnableModsCheckBox.Checked = s.EnableMods; DlcLevelComboBox.Text = s.DLC; @@ -4907,7 +4994,8 @@ namespace CodeWalker private void MarkUndoStart(Widget w) { - if (!SelectedItem.CanMarkUndo()) return; + if (!SelectedItem.CanMarkUndo()) + return; if (Widget is TransformWidget) { UndoStartPosition = Widget.Position; @@ -4918,9 +5006,8 @@ namespace CodeWalker private void MarkUndoEnd(Widget w) { if (!SelectedItem.CanMarkUndo()) return; - TransformWidget tw = Widget as TransformWidget; UndoStep s = null; - if (tw != null) + if (Widget is TransformWidget tw) { s = SelectedItem.CreateUndoStep(tw.Mode, UndoStartPosition, UndoStartRotation, UndoStartScale, this, EditEntityPivot); } @@ -4995,7 +5082,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { EnableCacheDependentUI(); })); + BeginInvoke(EnableCacheDependentUI); } else { @@ -5017,7 +5104,7 @@ namespace CodeWalker { if (InvokeRequired) { - BeginInvoke(new Action(() => { EnableDLCModsUI(); })); + BeginInvoke(EnableDLCModsUI); } else { @@ -5026,7 +5113,9 @@ namespace CodeWalker DlcLevelComboBox.Enabled = true; } } - catch (Exception ex) { Console.WriteLine(ex); } + catch (Exception ex) { + Console.WriteLine(ex); + } } @@ -5119,91 +5208,91 @@ namespace CodeWalker } - private void New() + private async ValueTask New() { ShowProjectForm(); if (ProjectForm.IsProjectLoaded) { - ProjectForm.NewYmap(); + await ProjectForm.NewYmap(); } else { - ProjectForm.NewProject(); + await ProjectForm.NewProjectAsync(); } } - private void NewProject() + private async ValueTask NewProject() { ShowProjectForm(); - ProjectForm.NewProject(); + await ProjectForm.NewProjectAsync(); } - private void NewYmap() + private async ValueTask NewYmap() { ShowProjectForm(); - ProjectForm.NewYmap(); + await ProjectForm.NewYmap(); } - private void NewYtyp() + private async ValueTask NewYtyp() { ShowProjectForm(); - ProjectForm.NewYtyp(); + await ProjectForm.NewYtyp(); } - private void NewYbn() + private async ValueTask NewYbn() { ShowProjectForm(); - ProjectForm.NewYbn(); + await ProjectForm.NewYbn(); } - private void NewYnd() + private async ValueTask NewYnd() { ShowProjectForm(); - ProjectForm.NewYnd(); + await ProjectForm.NewYnd(); } - private void NewTrainTrack() + private async ValueTask NewTrainTrack() { ShowProjectForm(); - ProjectForm.NewTrainTrack(); + await ProjectForm.NewTrainTrack(); } - private void NewScenario() + private async ValueTask NewScenario() { ShowProjectForm(); - ProjectForm.NewScenario(); + await ProjectForm.NewScenario(); } - private void Open() + private async ValueTask Open() { ShowProjectForm(); if (ProjectForm.IsProjectLoaded) { - ProjectForm.OpenFiles(); + await ProjectForm.OpenFiles(); } else { - ProjectForm.OpenProject(); + await ProjectForm.OpenProject(); } } - private void OpenProject() + private async ValueTask OpenProject() { ShowProjectForm(); - ProjectForm.OpenProject(); + await ProjectForm.OpenProject(); } - private void OpenFiles() + private async ValueTask OpenFiles() { ShowProjectForm(); - ProjectForm.OpenFiles(); + await ProjectForm.OpenFiles(); } - private void OpenFolder() + private async ValueTask OpenFolder() { ShowProjectForm(); - ProjectForm.OpenFolder(); + await ProjectForm.OpenFolder(); } - private void Save() + private async ValueTask Save() { if (ProjectForm == null) return; - ProjectForm.Save(); + await ProjectForm.Save(); } - private void SaveAll() + private async ValueTask SaveAll() { if (ProjectForm == null) return; - ProjectForm.SaveAll(); + await ProjectForm.SaveAll(); } @@ -5580,7 +5669,7 @@ namespace CodeWalker ToolbarRotateButton.Checked = false; ToolbarScaleButton.Checked = false; - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { switch (mode) { @@ -5611,14 +5700,13 @@ namespace CodeWalker { foreach (var child in ToolbarTransformSpaceButton.DropDownItems) { - var childi = child as ToolStripMenuItem; - if (childi != null) + if (child is ToolStripMenuItem childi) { childi.Checked = false; } } - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { switch (space) { @@ -5679,8 +5767,7 @@ namespace CodeWalker foreach (var child in ToolbarSelectButton.DropDownItems) { - var childi = child as ToolStripMenuItem; - if (childi != null) + if (child is ToolStripMenuItem childi) { childi.Checked = false; } @@ -5784,8 +5871,7 @@ namespace CodeWalker { foreach (var child in ToolbarSnapButton.DropDownItems) { - var childi = child as ToolStripMenuItem; - if (childi != null) + if (child is ToolStripMenuItem childi) { childi.Checked = false; } @@ -5829,8 +5915,7 @@ namespace CodeWalker foreach (var child in ToolbarRotationSnappingButton.DropDownItems) { - var childi = child as ToolStripMenuItem; - if (childi != null) + if (child is ToolStripMenuItem childi) { childi.Checked = false; } @@ -5881,8 +5966,7 @@ namespace CodeWalker { foreach (var child in ToolbarCameraModeButton.DropDownItems) { - var childi = child as ToolStripMenuItem; - if (childi != null) + if (child is ToolStripMenuItem childi) { childi.Checked = false; } @@ -5943,9 +6027,11 @@ namespace CodeWalker { try { - BeginInvoke(new Action(() => { ShowSubtitle(text, duration); })); + BeginInvoke(ShowSubtitle, text, duration); + } + catch (Exception ex) { + Console.WriteLine(ex); } - catch (Exception ex) { Console.WriteLine(ex); } return; } @@ -5963,7 +6049,7 @@ namespace CodeWalker { float hour = minute / 60.0f; UpdateTimeOfDayLabel(); - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { Renderer.SetTimeOfDay(hour); } @@ -6069,7 +6155,7 @@ namespace CodeWalker private bool isRenderedLoaded = false; private async void WorldForm_Load(object sender, EventArgs e) { - await Init(); + await InitAsync(); } private void WorldForm_FormClosing(object sender, FormClosingEventArgs e) @@ -6129,7 +6215,8 @@ namespace CodeWalker MessageBox.Show("You cannot clone multiple path nodes at once", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); GrabbedWidget.IsDragging = false; GrabbedWidget = null; - } else + } + else { CloneItem(); } @@ -6614,7 +6701,7 @@ namespace CodeWalker private void WireframeCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.wireframe = WireframeCheckBox.Checked; + Renderer.Shaders.wireframe = WireframeCheckBox.Checked; } private void GrassCheckBox_CheckedChanged(object sender, EventArgs e) @@ -6691,7 +6778,7 @@ namespace CodeWalker private void PathsDepthClipCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.PathsDepthClip = PathsDepthClipCheckBox.Checked; + Renderer.Shaders.PathsDepthClip = PathsDepthClipCheckBox.Checked; } private void ErrorConsoleCheckBox_CheckedChanged(object sender, EventArgs e) @@ -6722,7 +6809,7 @@ namespace CodeWalker Cursor = Cursors.WaitCursor; Pauserendering = true; - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { try { @@ -6827,9 +6914,12 @@ namespace CodeWalker private void ShadowsCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + if (Renderer.Shaders is null) + return; + + using (Renderer.RenderSyncRoot.WaitDisposable()) { - Renderer.shaders.shadows = ShadowsCheckBox.Checked; + Renderer.Shaders.shadows = ShadowsCheckBox.Checked; } } @@ -7068,42 +7158,42 @@ namespace CodeWalker { default: case "Default": - Renderer.shaders.RenderMode = WorldRenderMode.Default; + Renderer.Shaders.RenderMode = WorldRenderMode.Default; break; case "Single texture": - Renderer.shaders.RenderMode = WorldRenderMode.SingleTexture; + Renderer.Shaders.RenderMode = WorldRenderMode.SingleTexture; TextureSamplerComboBox.Enabled = true; TextureCoordsComboBox.Enabled = true; break; case "Vertex normals": - Renderer.shaders.RenderMode = WorldRenderMode.VertexNormals; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexNormals; break; case "Vertex tangents": - Renderer.shaders.RenderMode = WorldRenderMode.VertexTangents; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexTangents; break; case "Vertex colour 1": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 1; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 1; break; case "Vertex colour 2": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 2; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 2; break; case "Vertex colour 3": - Renderer.shaders.RenderMode = WorldRenderMode.VertexColour; - Renderer.shaders.RenderVertexColourIndex = 3; + Renderer.Shaders.RenderMode = WorldRenderMode.VertexColour; + Renderer.Shaders.RenderVertexColourIndex = 3; break; case "Texture coord 1": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 1; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 1; break; case "Texture coord 2": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 2; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 2; break; case "Texture coord 3": - Renderer.shaders.RenderMode = WorldRenderMode.TextureCoord; - Renderer.shaders.RenderTextureCoordIndex = 3; + Renderer.Shaders.RenderMode = WorldRenderMode.TextureCoord; + Renderer.Shaders.RenderTextureCoordIndex = 3; break; } } @@ -7112,7 +7202,7 @@ namespace CodeWalker { if (TextureSamplerComboBox.SelectedItem is ShaderParamNames) { - Renderer.shaders.RenderTextureSampler = (ShaderParamNames)TextureSamplerComboBox.SelectedItem; + Renderer.Shaders.RenderTextureSampler = (ShaderParamNames)TextureSamplerComboBox.SelectedItem; } } @@ -7122,13 +7212,13 @@ namespace CodeWalker { default: case "Texture coord 1": - Renderer.shaders.RenderTextureSamplerCoord = 1; + Renderer.Shaders.RenderTextureSamplerCoord = 1; break; case "Texture coord 2": - Renderer.shaders.RenderTextureSamplerCoord = 2; + Renderer.Shaders.RenderTextureSamplerCoord = 2; break; case "Texture coord 3": - Renderer.shaders.RenderTextureSamplerCoord = 3; + Renderer.Shaders.RenderTextureSamplerCoord = 3; break; } @@ -7190,23 +7280,32 @@ namespace CodeWalker private void DeferredShadingCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { - Renderer.shaders.deferred = DeferredShadingCheckBox.Checked; + if (Renderer.Shaders is null) + return; + Renderer.Shaders.deferred = DeferredShadingCheckBox.Checked; } } private void HDRRenderingCheckBox_CheckedChanged(object sender, EventArgs e) { - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { - Renderer.shaders.hdr = HDRRenderingCheckBox.Checked; + if (Renderer.Shaders is null) + return; + Renderer.Shaders.hdr = HDRRenderingCheckBox.Checked; } } private void AnisotropicFilteringCheckBox_CheckedChanged(object sender, EventArgs e) { - Renderer.shaders.AnisotropicFiltering = AnisotropicFilteringCheckBox.Checked; + using (Renderer.RenderSyncRoot.WaitDisposable()) + { + if (Renderer.Shaders is null) + return; + Renderer.Shaders.AnisotropicFiltering = AnisotropicFilteringCheckBox.Checked; + } } private void WorldMaxLodComboBox_SelectedIndexChanged(object sender, EventArgs e) @@ -7275,7 +7374,7 @@ namespace CodeWalker MessageBox.Show("Please close the Project Window before enabling or disabling mods."); return; } - + SetModsEnabled(EnableModsCheckBox.Checked); } @@ -7284,7 +7383,11 @@ namespace CodeWalker if (!initialised) return; if (ProjectForm != null) { - MessageBox.Show("Please close the Project Window before enabling or disabling DLC."); + if (EnableDlcCheckBox.Checked != GameFileCache.EnableDlc) + { + EnableDlcCheckBox.Checked = GameFileCache.EnableDlc; + MessageBox.Show("Please close the Project Window before enabling or disabling DLC."); + } return; } @@ -7296,7 +7399,11 @@ namespace CodeWalker if (!initialised) return; if (ProjectForm != null) { - MessageBox.Show("Please close the Project Window before changing the DLC level."); + if (DlcLevelComboBox.SelectedIndex != DlcLevelComboBox.Items.IndexOf(GameFileCache.SelectedDlc)) + { + DlcLevelComboBox.SelectedIndex = DlcLevelComboBox.Items.IndexOf(GameFileCache.SelectedDlc); + MessageBox.Show("Please close the Project Window before changing the DLC level."); + } return; } @@ -7374,7 +7481,7 @@ namespace CodeWalker { float det = ((float)MapViewDetailTrackBar.Value) * 0.1f; MapViewDetailLabel.Text = det.ToString("0.0#"); - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { Renderer.MapViewDetail = det; } @@ -7384,7 +7491,7 @@ namespace CodeWalker { float fov = FieldOfViewTrackBar.Value * 0.01f; FieldOfViewLabel.Text = fov.ToString("0.0#"); - lock (Renderer.RenderSyncRoot) + using (Renderer.RenderSyncRoot.WaitDisposable()) { camera.FieldOfView = fov; camera.UpdateProj = true; @@ -7393,8 +7500,7 @@ namespace CodeWalker private void CloudParamComboBox_SelectedIndexChanged(object sender, EventArgs e) { - CloudAnimSetting setting = CloudParamComboBox.SelectedItem as CloudAnimSetting; - if (setting != null) + if (CloudParamComboBox.SelectedItem is CloudAnimSetting setting) { float rng = setting.MaxValue - setting.MinValue; float cval = (setting.CurrentValue - setting.MinValue) / rng; @@ -7406,8 +7512,7 @@ namespace CodeWalker private void CloudParamTrackBar_Scroll(object sender, EventArgs e) { - CloudAnimSetting setting = CloudParamComboBox.SelectedItem as CloudAnimSetting; - if (setting != null) + if (CloudParamComboBox.SelectedItem is CloudAnimSetting setting) { float rng = setting.MaxValue - setting.MinValue; float fval = CloudParamTrackBar.Value / 200.0f; @@ -7493,34 +7598,34 @@ namespace CodeWalker NewScenario(); } - private void ToolbarOpenButton_ButtonClick(object sender, EventArgs e) + private async void ToolbarOpenButton_ButtonClick(object sender, EventArgs e) { - Open(); + await Open(); } - private void ToolbarOpenProjectButton_Click(object sender, EventArgs e) + private async void ToolbarOpenProjectButton_Click(object sender, EventArgs e) { - OpenProject(); + await OpenProject(); } - private void ToolbarOpenFilesButton_Click(object sender, EventArgs e) + private async void ToolbarOpenFilesButton_Click(object sender, EventArgs e) { - OpenFiles(); + await OpenFiles(); } - private void ToolbarOpenFolderButton_Click(object sender, EventArgs e) + private async void ToolbarOpenFolderButton_Click(object sender, EventArgs e) { - OpenFolder(); + await OpenFolder(); } - private void ToolbarSaveButton_Click(object sender, EventArgs e) + private async void ToolbarSaveButton_Click(object sender, EventArgs e) { - Save(); + await Save(); } - private void ToolbarSaveAllButton_Click(object sender, EventArgs e) + private async void ToolbarSaveAllButton_Click(object sender, EventArgs e) { - SaveAll(); + await SaveAll(); } private void ToolbarSelectButton_ButtonClick(object sender, EventArgs e) @@ -7752,10 +7857,8 @@ namespace CodeWalker private void ToolbarUndoListButton_Click(object sender, EventArgs e) { - var tsi = sender as ToolStripItem; - if (tsi == null) return; - var step = tsi.Tag as UndoStep; - if (step == null) return; + if (sender is not ToolStripItem tsi) return; + if (tsi.Tag is not UndoStep step) return; if (UndoSteps.Count == 0) return; var cstep = UndoSteps.Peek(); while (cstep != null) @@ -7774,10 +7877,8 @@ namespace CodeWalker private void ToolbarRedoListButton_Click(object sender, EventArgs e) { - var tsi = sender as ToolStripItem; - if (tsi == null) return; - var step = tsi.Tag as UndoStep; - if (step == null) return; + if (sender is not ToolStripItem tsi) return; + if (tsi.Tag is not UndoStep step) return; if (RedoSteps.Count == 0) return; var cstep = RedoSteps.Peek(); while (cstep != null) diff --git a/CodeWalker/WorldForm.resx b/CodeWalker/WorldForm.resx index e1d97d2..3cab3b7 100644 --- a/CodeWalker/WorldForm.resx +++ b/CodeWalker/WorldForm.resx @@ -1,17 +1,17 @@  - @@ -117,12 +117,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 182, 17 - False + + 182, 17 + dt1_lod hw1_lod @@ -240,20 +240,12 @@ ufo YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB4SURBVDhP3ZC7DcAgDEQZKTMwHOvSIFriS7BlEB+HMic9 QJbvFThLUkpXzjkSpaeuzMPlEELx3jdsBauyCHBY6UWYPQI93KEljQD3jL6EGzN6x0bASyNYwkKU8Udm gd6TMnIikDJyIqjVNz8T7FgKrAwFX6lVinM3aJ05lWDPRRcAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB0SURBVDhP7ZNBCoAgEEXnSJ3BqxmetNpaMLhVv5DNRJS2 - CxIeuvA9XSjtg5mHEILPxB6U7JyLxphmSkDK1o5x9dst87SUfTXwRsYsA+paT0BGDGsVOJ92hdz3Bz4f - wGPC48uu7w5IGd+gBlpRMgYCnRwyESUj3CsQkYNFDwAAAABJRU5ErkJggg== iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vQAADr0BR/uQrQAAAHRJREFUOE/tk0EKgCAQRedIncGrGZ602lowuFW/kM1ElLYLEh668D1dKO2DmYcQ + vAAADrwBlbxySQAAAHRJREFUOE/tk0EKgCAQRedIncGrGZ602lowuFW/kM1ElLYLEh668D1dKO2DmYcQ gs/EHpTsnIvGmGZKQMrWjnH12y3ztJR9NfBGxiwD6lpPQEYMaxU4n3aF3PcHPh/AY8Ljy67vDkgZ36AG WlEyBgKdHDIRJSPcKxCRg0UPAAAAAElFTkSuQmCC @@ -261,7 +253,7 @@ ufo iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vgAADr4B6kKxwAAAAThJREFUOE+dk01ugzAQhTlBj+MDIJC4A1yEa7DMnlWaSiAu0ZI7BNi0XaRpF7Bg + vAAADrwBlbxySQAAAThJREFUOE+dk01ugzAQhTlBj+MDIJC4A1yEa7DMnlWaSiAu0ZI7BNi0XaRpF7Bg 4/pzbMsQ0qod6SX2zHvPP4yDdUzTJBR2CieF2YAxOWFot6GKDwrlMAyyKAqZZZkMw1AjTVOdowYHrpFd w4if67p2os/L1wI2DwfuwkRNSitu2+NdA1szJqUVC7ZGYb9/dOQtA/6bptFjcxyBwY7zkfwL0KDF4ESC 7bHCx/miCf7qYJ1jjjYYx3Fm0nfDXfJWzhjMzuBweJJvr++b5K1dOQN7hP9AH0H96EvM83zh7q+2zsH1 @@ -269,13 +261,12 @@ ufo WBXYx9R1nV75RuyHKrrnzCcGjE1u9ZyD4BugoZigQ9xrngAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACtSURBVDhPrZBBEsIgEAR5Gy/wFV55T/wHr+KgHuCKNsVY - ZI2JiU7VVIVlp7OL+1mllIr7cb8Ie++PQwQYITnnM24NWxoBgsQYm/l+gk699bMsRA4h1JTSPsg0Xert - em/mGwh3vW1Z7MvIABSWqXG3+iZHAEw1m4wD49oVANgVOL/VeSgeDAiX1mpWeKy9BIQiI+OxWQF77tG5 - 2Fc729BmeElf/3lNhORe+oecewDObEqX49RqCgAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB0SURBVDhP7ZNBCoAgEEXnSJ3BqxmetNpaMLhVv5DNRJS2 + CxIeuvA9XSjtg5mHEILPxB6U7JyLxphmSkDK1o5x9dst87SUfTXwRsYsA+paT0BGDGsVOJ92hdz3Bz4f + wGPC48uu7w5IGd+gBlpRMgYCnRwyESUj3CsQkYNFDwAAAABJRU5ErkJggg== @@ -291,7 +282,7 @@ ufo iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vQAADr0BR/uQrQAAAH5JREFUOE+9kEEKwCAMBH2bL+hPfI/9ooe2B71aVpKS5iBB0i4MyCZZjcFdrbUu + vAAADrwBlbxySQAAAH5JREFUOE+9kEEKwCAMBH2bL+hPfI/9ooe2B71aVpKS5iBB0i4MyCZZjcFdrbUu IdsuDMUYB/8H1Fo3HQCPynOhsZTSU0pPAM7wpiG4hcFAzns/j2uAMzzZo3ntDHiYkTWNXwCztAJr+ROl 0IhU+UTzMEsHkG2XS4CE7K8Uwg0o2F4o9CrlEwAAAABJRU5ErkJggg== @@ -304,6 +295,15 @@ ufo EcMw2DzPDMEke9AsYBrHs10vN4I1QqImwwDcFyMjQGaBHr5Bo8nEoYCnCQTGzVeI4oj6fIi+KHgoPBhC 4knCjTww9vxfbIUQNDEyiGIZ8t6tW/k0vC/AOpuiueNOLwVkUeylvju9FJCg8E1vM/2PlTv5UoervVTJ uQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACtSURBVDhPrZBBEsIgEAR5Gy/wFV55T/wHr+KgHuCKNsVY + ZI2JiU7VVIVlp7OL+1mllIr7cb8Ie++PQwQYITnnM24NWxoBgsQYm/l+gk699bMsRA4h1JTSPsg0Xert + em/mGwh3vW1Z7MvIABSWqXG3+iZHAEw1m4wD49oVANgVOL/VeSgeDAiX1mpWeKy9BIQiI+OxWQF77tG5 + 2Fc729BmeElf/3lNhORe+oecewDObEqX49RqCgAAAABJRU5ErkJggg== @@ -389,17 +389,6 @@ ufo 4BJN+IjGo5O8ZJndGVhKxpjWWts551aih0fre+0BLaVchRAezPB2NXSSV/gVwXGYPJiVUt6ns1ghCDjn UQG86w3FToVgDcWCWS9Fvi/Ao0RVAcwUjwpyhzmf4n8BFApS5HZRwRuONGMbrIJ1JIN8O2QAAAAASUVO RK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEvSURBVDhP3dK/K0dRGMfxKxRJopCSEkLya/guUhQRmQwG - WfwIkYySgYUSKUKJlOK/MBoMFMofYLUIsfJ+f3NuF3+A8tRree5zP/fcc070f6oHT/jAPTqQj6WvXvCM - TZQgG3H58gFGcYVLtGIN15jBNDbwiGNUIg4pQx8GsQuHhrCDW8yjHyns4Q0DcCXpykM5bFzgHGPYxw1G - UIVMtMHfWUUj4nIg/KurGIYrSAZYOXDGlbhXcZlegUO8Yxzb+BlQAwNW0G0jVAYK0AwHtnCEOyQDZvGC - ObTbKIIvLMA9WIYDizhFMsDjfsAZptCA9JcdfoVBvryOSbgCe4HPTuCz+BQMKEUvJmCy96ET1ehCuAf2 - 5ZF+uwdZKEYtmuBGFSIXhtejBe5PHX7dxL+qKPoEppRHcXOtiDsAAAAASUVORK5CYII= @@ -435,6 +424,17 @@ ufo rp3fhGJScIRLzKMLFTC9cMIu3nCDVUyjB6WkYA93mEWbAyH9cMImPuA+rWMA31YwBU82kF6BS32Er/aO M8zAh+OEghpcwQ2bg3uwBW8ewFd7xQkm0IA4oaAS7bh2KHjBIZbhV/D6GJkFphrdcIP8lFrAGPwPOjCO QdQiTqrAWNICd7gPnUj+xBKaU9dxfhTkjwV/FxU+AbsiGnc46OYIAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEvSURBVDhP3dK/K0dRGMfxKxRJopCSEkLya/guUhQRmQwG + WfwIkYySgYUSKUKJlOK/MBoMFMofYLUIsfJ+f3NuF3+A8tRree5zP/fcc070f6oHT/jAPTqQj6WvXvCM + TZQgG3H58gFGcYVLtGIN15jBNDbwiGNUIg4pQx8GsQuHhrCDW8yjHyns4Q0DcCXpykM5bFzgHGPYxw1G + UIVMtMHfWUUj4nIg/KurGIYrSAZYOXDGlbhXcZlegUO8Yxzb+BlQAwNW0G0jVAYK0AwHtnCEOyQDZvGC + ObTbKIIvLMA9WIYDizhFMsDjfsAZptCA9JcdfoVBvryOSbgCe4HPTuCz+BQMKEUvJmCy96ET1ehCuAf2 + 5ZF+uwdZKEYtmuBGFSIXhtejBe5PHX7dxL+qKPoEppRHcXOtiDsAAAAASUVORK5CYII= diff --git a/Shaders/BasicPS.cso b/Shaders/BasicPS.cso index 266b52deb5f53e40a388db7d88c3ba7cf2d97607..81a2c9da7d0b1c4da123f81164d47b7f4da409d6 100644 GIT binary patch literal 121072 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 delta 3451 zcmc(ie`u9e7{|~1Zo9v1?*7$|}11;j|dFG>3}Su6k2pZsH6r zf7~$=0!1886vZTo7|Lce?w~-WAWMsh5(Od}2@(k+VJHNNeV_L|=kEIY_E&#&;M{Z0 z=lOA-^PK0NyZtfYoa$cJzP7ck(?4?blJCcsf!z9=^D{qR(S#74^+J?jT#Q~mLx{mA zgqTFXTqne;_T?Q{JVF#fR;>#GEUM8(@xzA##-BkpGQ2;cjSe4+XcNO{BiiZV>k;kT z@PmjpMPV(X{Y1~=^A~zmi|DsBI-u3)_cTg7E9tW4rn8Wh(RJAw)DWJ^yW-k z|C@BjQAt(KrDbDW)0(;xL2o@?kW(@2a6W?&t^pxaOxm_o^&c<^maP3S%ca ze=|2=>_z8_-6!W!%#X*zzZAK$)W{1Tun9S6l6g{5-!C)w>JVO99e!SGrDNfwKI)gA9@!kd$Y69Z zz5@CeuyHxj{;A>NZ7 zBtmoTEF+@Wj0BcT@J6w=PA#jgiN+AWYmG@w&)sYMlOM%f3%AtrA9g-mHGbudR*Fw%VRU9Q a&`a@eOpp#YxhmMPYB5YI&|S1}QRE+wqFH4C diff --git a/Shaders/BasicPS_Deferred.cso b/Shaders/BasicPS_Deferred.cso index dd7ffd0938abe0624ba37afe2c73a71eb5b8f39c..eb5b8ee9be3d87950b7c34ae8c1ae1774e5a94f1 100644 GIT binary patch literal 73828 zcmeIb4Uk;dbtZOa0D=I-kwA)+Ad0dcDNyPe3}&W#1|UcR-~clK0WUy6m>~s;&;mU@ zZ-6Fxx<}nTzks|WnO<{kX|39#ZN;Un$hC}0v9&2}EN>LoX04SSM{&uqHetE68&%fc zRUB=~iGEhGowdr$_nmX@d-uKW8GsU%H6=da&Fy>cx#ymH?z!jwy!$hG;n>7q{OZ5^ zKmOTwwp4%aC!hVr+urukhkBfIvr&)R2KOL;-|pO3wmWxvhjV}Y7UwSB>)iRt<0tk2 z-iz>$BLafleR$p0mtN|D|34z~A-G!z%RQve_XPeh{%v@-;(ZAZ90}`#d#+13@fnxl z7rKNqJs*C#OE}Z<;m>plCoevHu}e5*;=@10A6*`T`F^xZxaXfi)A34su^CTIxrs)t zvDln1FSuii^9yvR7UBxs$+%sv*7z&IDY@xty?w4+i`(tkotv7f#P#^8aR-f}j>W5bih`!{cFBt>9J+k85N$BbaA*8qKTL2**ZWMjFmu%pd(b*@^eW)L$#!94>ZTre44h14uil+c~ z4_uG$;iG^T3{E@`KL+?<7x;O=Sys#gip9;s&!-J{94_-r__GFo9`0%Q^XdK?;4Irb z{GS6pZE!dVKmQZp7rMaz81Rb$+}FQ<5BO!k^L(nln8h*ep&7BCPc&eCYG+_(OtD~o zQlAGvtzh_Kt=t4cTyIs| zt7jH#ZRepU%C%Z!ZY~RJ#;tl>bIWm?{4=b&P^-pGvBPKUwN-Ddg>gytOtsQ%v>J2m zsBpeNI(d5Pbj0cyH=~ILAf9o>{Jd;J=+2V!hI0&3BLo1NH~Aa8x~kU-ZNc4%KpR zKm@{l5b?pHdjtLu9;VB@5>EQ0$%pvtD|k3*@*#XDUJoZtK7_vxFa1+bT{?Gm>eTe9 zvro7u&YnMW^t78keqrM5+4GZb;_T_O=OOE}khO1@nEq9~{vj4tumTj-~pLqFw9|I9A8rMYXDf7yp~`^}m^}|IM^e7QKx3cDHrw&h;qKp>q)1U1G_c zyBBaiGOFAYWGFM{nSq7ZQI?NSGvR{j;Ht3 zZHn`$w`$m@UZ;NIl#I?cbAQQjPnaB!1Lr#ycEY0nr<0w8K=JSZ)1mDAyclX7R zRv7k{UU%pKXgy%*SY8i>@}m4DACQ;Wn#;-yX*P|o6TJ$fOI*_Yu!VW~G5_R|G8B5- z(l~(g5&kKM0gKCg6Bp0zq{rXnpEySMx1movNs|wCSiJRLI}^71?X&!>+hvPGDeDf7bk_nO-Wz4X5$=!3`e`aoRL zqnl3yAj!Yr++rH%Hc4X(=z-QP@k%+f4ETh+CV3ub$ogYZ7ajL`V%b1%w$GR>w)H5z zZ6DI|u(oVNeo)VLdU*}3r*SA_K3=Y+NO@&?j|6zW>^vUybbAwViPt-hKe>l`;B||( ziuv&MnJ%A$k=yR&lF+v_N%t;@7<6_q9X`}OK7pNm3|{}b-f{RK$MoH}K1E$*&DdUl zSV#Y@@x5(_$@(q3qz}csd7gaUe(840qt$27e;xDBeE(9e&Jf0zI>a{gobkduhx$QY zh;skw@>`-W%!7-oexEB2g{sc`FI`|ITQN;6nEk-%Y(U-fi3d*-gc2M z+UqbLbnFe33-d&KMx5Sp{7K7*W#xLu@h1n%^TBqV{LtNu54J-gAH?^3FpPZA?H$LT zT$;V(1SR?-yhT=StWQtf9vFu_(@&Rv+Vc`*!aj>{KM6Z# zu%2-Q;PH5pZ)?jv9$_BOr%8HAn#d#l%qwvt}{Tz?uc_TcJBQisLkr~`P4*NnL$Cqb<6DdCHpvUpLN1V5#da*w7A^qcl zP4fLE_GOr7-#xa+4Mp$%i5Bu#I>JuetnCAQYXybE;c=dz4pPdoa#e+%RS zJH7rP;F&(${yzulNxEoDSidNbriIaFa4bTdC(hs9qHZ3CG(F#}d&H&v^l5vTcPC+Q ze3)+sCceEG|V!`I7I@GR~LbEy{}w%@)j z@nu8(X54%@%L~t=;6mh15A!7MhqXR2@1)KA@nQb>_`VCnQ7&SG`TO@Q+}l>dG@bRw z?!r&NrC&pM?>PSC9?Aytzx`OGvbz`bSRS4R?HhTaz71r;w2wtNaPIgA2;)QDXZ+rA z{K-8}p^ry=^vT}PjI3=&{JkW;vHjZf!=F>O=kxWe=o#uSV&*G(C^Wi)cXo&7p|7n*=zuUvG z{DU%*Ia~6+*)w%+@|fG!j^W zf9?5^kiZxCVehr)$5sMp8#2#d{@6<5$1~&XTSRy+&G`B3o>o}d3G4<}6n!}9&fuf2OT5Bl*H;;T64 zfBntB{w51@86QC1#3L7tmBxPSkxUU&Tuom>BpJ?>xb>~;J9 zt1a&JZ^Zn^ zP5IGe{TwP;T zJae^1xjhzDqQmyHFfz1%FiQUv`yW-z>KvBjB=f`4Pi-Dg=^?WEOFxH7&vk`+Hb@d8W7APhfDIvbt#BMOg>%HE(U26 zDXz8RfQdZa(Oack3g~{2WkuqAnEhlu>X6be*y6IOsX^hAvQ1-9BzXxJ`=jCE(%vYR zwT!K3wmLTlGhRw#XLr8XcEOx=9T?QX{a0xM3qvsH!2jPefTw0?k6Oh zX&)!Z0G7?=izmnE@bGe6UTD-KtYK@X*&!{-L)2bD77ESAVtuwy5k^Y;_hU-z;fEjI z-w$R+OGD7v0ciKg$U_HHJZ_Tqos0fF@7wn%oIycm)<|L4DDuG+C+AtkBT^o z1cH^wU5Y{SS}L?xpb@M6zOs3VR)(5aW}<<^pu}H+*oi@@9F9WG&S)TuBUyQvsoh34 zDh);uZ4<>?8M-2WXDHc>G8h#uX=I6xfsiDNcmX@aVqzW*CG*aAl6W~fL>Z5c_V+`1 zTNNy9+$0**Jrix@=CNQoMsGP*mcvf@-BZ}nZ2Zb*`X8ezGcU6Ea1M#7_Q%#{RB;=X3fhb*3>Zw@_=F?1#)zo6ADNmHo zOa(9lB@8Hq1&lTn+LU$BSU4&S)#-u1s=Xf2ggP>7m4C99PmqDM=aGC|Sinh7ozSGxu)(Jt4ouv@+<>5$`T zjX)u);oAQ)l7x~E4_9Op#KtMAWV}GL79%SkS?8WN(W<93IoYx)c9#1Ff`NH}V6460 zm`^QPD@arx?H-_~;`NlAY{)Pykn-4-4Eim%LI(2OlniWRLPj)Fi`jINE2SYMRz`(q znWbQZ&XJ-pPZE7BsxKk3?PKZEC}i8_gpGheiv*^?1P2zKor^96JfjJbQdFNOmHN`q z%BpF75;zt$N0`6Cs0n#CA&ll|l2>9eziL6W9%6BO&}F)w<~WO-ERzqAiIIyy(D1M> zbGM3*j4ouU5~(=?=D}z#!>G{NHS$Ai%Rv?ylMiCAEhDy48Hh%QiVt;1lSGvH?h+Rg z{bXieU_~?;{p%CE36-_wn^6&7l;ypeh3-7Bt_4}kiDQ*L9nt{GKDq-rgq1EdRbPM& z%INnjp$oLv)Cbhcv$H02cAM1f4x;;nEea8<3*=U~KUeIDsrQ0nG_aKDQ~_xYM#-*; zK`UqthqTu`#M{;YbgXI?nt0kyqzYus7t>|UNCQ&EX7z$vhjp3g*Hc`2r6y{%#%PPi zC;SuIvrJ|s1}Ybomzf?~6U7;2`;#VM*5-=r0GmP=3|rU`LBZLLMZf%dvStYH(_$4A}EQXgPr2T`#EBf zVks1d_ZP!%s*#>;vb7#8|{p12FIy8`U}Aoj-gSeWdcx ziZqc@&uOU2wMz|b_EI7tGP-_1US)eK$joDa8m67jXEhevn8C87)iX3{!c8WzqzDE{ z-DkuwwHZKynwdh9XELhAtv&31#!gDWVozDU3*rMpOld8sh=zHp*(}di%k>I6|30mJ zS9?%PiP4wIrslU9W4u>4I)GZy_W5;2el|0m|I5uj%M73mFH4h$G^0n-nI)8cGroe| zg>kdcmY!lKvUM~wsA6I}Q7IEN)EU%KW~UQ1>BnS{rJi>ptK|jdQU-f}chbR>Ne2A@ z(QT@3s*Pc^A9znqg?KHI1B;+Cvp9#ZAW^UbJVcyfAN{(P6y+W_gT2=0%FXh8D+(Yj zq)x3^(Qcx8MNYnXu1ZdvgU$pHYg;M8rUq<_U{@{`&UV?Gy_fNTr%M7j^0cVvLEj5 z4a3HA!9qzqefQ>i6(^Gfe~Yenk!#Rlj$)8 znIUYon~Rlplzh=h)Xid^YhZISwme5r%V2M7$jzvY7FaVMiFDIz7+zxXI>CT&zZ;g# zC1XfBDM~Rw@e`{#6k0G(#n1j5w`L855s$)QbCS?lB*!W!UO;Coi)8&&p(DF?Gu)1u z^)II38CJ(+%9&|WAQC^vrwx`Q-1F%tzAP)r;3?qpK*;52G*O;EAJ_Y z(@HjJ>hmS*TX`v0-5;FGrM2z>LN1%sG^#MtPxct+avHSU0TRnZxg@8)4gOE*rtLp= z#?LqE!RNnspasE^0nxdM6IiKyemdG$?AsXtk3TUP!Ql4o93D>E-J|HRtZHZBNHiHQ zw6CJ=fSA&*g3R#`4`&)vkC zfe&H6qa1*rsoq8dbav8)P5d7jdn%&}emNohTR0T`~qpVq=uy z^$Q3X1!35Yff>82)EuFQX!DD;f~PX5>P4;dXf{~LVtKlPC`0aK48bbD?}ze`a`Ys+ zWl$T==C$M`9DG(qM~&75AFCFka(xyCMaDPfXd!MwfzfHJw)I0PM#Min?v@(WSvg8X zR@O|EYitMFF}OXae4MVf@pZwM=aOmwv}}Uw5C(na((q{RJWoFo9Ter5jBD+32hx)Z zH^VrF8gRa`Og-+1ZQ5_}MAxFZl;OUefy$*|=nY2qbEZltmuY_7M(20|hHkMo8_mSg zV!hd@)#6!AHQUyCuF(!}TP z>I#;PsgQhn%RVU-Ghd;Aa2uUb$<|n1JnxV96lo%nPCh@s2Mpd_hlV{4v(fc7Q zSf9sIjv6!1U`)s_?f6{6z(6LJ>NJu;Eo~!1%2*~Lr5u$jXh#c14te2Xh}KonfqJ7& zl}j64N)sY&|@18 zMli9EQb+5^#LWo{Wf&8v((L!o1(q6i)f&_vUUP*EByChwo@Y;vl^PZU)_O+!Oi_Ee zfto0N%a)pPsn@_*zDlbs*sT4_SkDwSDixfI2o3(>alJt!D@T$Yl}wyyG|%9xUPnU< zAk+{&gE-gT2JPO&A{Hm(j7HYhme4$gw(E4GB1fEcwv&pI?O!SvX{%{+=6svl1(6wy zBZSB%gr)-ZS*+zOEfs7fCKt>Oh;Ec?lfw?RWVg1(T z2+8d8+~zq)it||Gxp6WZgrxMPt-DDoTpq||GMQy2vVfH6&6rLrAj#e&^}*;S2+0RP z)Kt`w+^|B69XVh%&V@zyOLqzOBjxC3>_o%eDD`6ys-IQFK0qnj)e3r0bu1|qRT+zx zk}*vUUxCsi@t!{T{^)Ri&FzCHx?XcL>l>mB>rg{$pC*n@O&py(ere)~Y1QJ+pc#gnNPRA;d{+IN(00Xq)alF+XlYO6I< zz7naxat0N(o7#=mnXUPzsF&2rClRtybbTbYu|OmOkWrVvahQ&oGneV03e=4nk?dHz$|DRsN(R1>GX>g>e>Vk}ze2X3spC zX{8XIt2qOImWLn!biK|6&_vu}eLlgZ-+_E2>&CT zGql1^L$*1S(gj~Zb;xpv!6ADiGK9x(4yfvJ1*>q%7;B=lhc)qO+FZuISg&$$Q^xR$ z>Ca-6!!FH+`D7Ff@Qp=C5>m9;$ax2NIi{tMHuPn&Ql7A~~@wNo20eGRk6bbpeDDzOD`{WcS_? zXm$@sQyuW;+$L^E{Iu>SRAGdTB|jUS#Io^62iHfqY9rv6iXd|&8LJI`v4$cGI^@&R z>|>q054VaUarW-@P-zZ>;eU|mCRuv93T=~AItAB3B`s3Yp&Y-@ZZSrd`C0BP zZPJG{=gTYKPp=zOP+9V2Kchvud~$*(sM@`%WQ6c&Czn3lTSosqj3oJ((gi=I>qB6ylD{DHKBp;g}M(>W3^z4{nk_!E< zEAjoBJ!6^6$rTVtOFIUe_5i!cad3ki^*>66Xp2(8E^X91*sy2ct>i+b4+PYmIEpn* zAExi+?AtF=sdi~pS=ln?7Tbc*qw6AX%pS=X!ZcT+8PVoLH}>}f4Yw#peuGH?D4j)1 z(^4HlhLQ;u88K$&C%S9+O$VVs*m(5G39qmuJNZD5DV@aMz_K6-|Lq~{?g8AKCu(T^I!EC_vqL)9MN`?Sso3aBCuz|m zS;p>jjN=%l-FQycpyQJAL;`qz(5j+TUZEOe#5S-rN%y+D;%(gL=%|RHWx1s^yELr% z%1xRb(zPMprnWXuXd^?b+0W{oXC9^ao*1oy+B_-*&7Dm7bv1TTt-KmH2enr$3bKhE z^NCQ&UkSA(J*aM{uo!@xyex%goc#0s84Z>12Bsqk>@XlnNHFfg{!g*I{T-T@u_0-R z=5s)QU~FKaajC;XApj-GrY1>D*+$cP8-GcFq2YWvrLJ@3_SF|Nxw87B70s*$hNLW0 z)HVhR`3`zX1P9)vw?w#gU4pD66$f~Ns!f1Ma5OrxSkp^-prI<&QH<8+Ft=q0x^B}v zTnlO;7!g&l(aHvSc0)$6>=aW;T!?xlxCRK=9C5|r4L3$D9CjuNsDNZZmClw6ClS8Z z1=}#VZ$McKlN<8a194@8Y*N-bp%j!jKm1Gk3@K53tb`fa{Ql4qq_fQ$X_oGG9c)e0L~-`Kz*>TMHf0S~6RiPoYhF%6^GC=Or- z#iYwcwUnrd1D$xL@qy}5l~spTDMV3gQ0Y)R`q2X; zv^L}6tE1_HRv-c5`Y#T&w0LBKNN)ED^uU&&Vp*H6G7V{@VaYvUU4qjqz@A*#G?=%3 zbwSA74AzxI2E(X)5R}q?sCpRKEY>k$bd5a%tsJc=Zddwt(l(A^bp->*Rt^@#RxYK6 z&-7f-3QN(EBT;D#of-Zp911-D}ukIVwLuSlZC!Dtws%)lCx+D|cSDqpO$?#Qvkj zSbOVS5`!;c@Xf^Nx@&_h3sGPJ7NUh(xz6v>lH9yZao1xEL@|F@o|W@B*nlr#whwD& zp24h3yIEafC{`Vz^)9z%GnK?Hu#AOc1d~}TZ>qJhx76rWu5uzFdVFE=m~8WC4NYLZ zOmk2j5su80YOOj`u9vT1FNna|(bYAogSs{11U@d+&XrqS_J_nxc$^brvs1*k848kX z6#_lfMj#M0zo=mUCk&!CR>c8no)8shd-&o{sFPxs7=;vF6<(7GzC2>z8QYm6TEk>w z1!sMgSu~uS#(X_x#8qNf)}rMmR{L;L88U8`uUH{t&~nXCwu}B$abzCr zg;>DVHR-6UG2ui<@+mYr!6+D<4V`Q!bPSga@8+G7tv(CBeQo zVw^G+mWE{~ByOdip-5Cw4`~EbYbCXHG~yPU_n^j{X>iqn?;}>R)->rON&{=u(0ghXZL;irqE9Wl=uk68-b8s0>jk}_7hF)~tJCTIE# z4_`tBug#v5@gB6}Qo;+&4=!=6&e=|<;bF;%P`g2*H<;Z6L#2bG#e@C~sRSv*>)IMK z@AFI_wazD$WgR{2?!v$tGN#HEzLlBM(?y&F1nE)oB?=e0V=x}l)^?a*6tJk>c0~;j zV@rGm%ZNRhItC6JYjtfU5jxYc;u3;PFp>TeN*OF9$c?3nl)oVvLlPYf5j!9)rBNJ$ zC}ijV#@Zs$kSaI)OU9V$N|r^B1A2IbMW!XO!bDB|03s47;*qj=`e6tV&?GOK@dQ!x zf)N*V>Ls{M44s;w!aas-J`1dSkyA~BI-QKL{TQBsvAma|8wp~;`?@r*J8!6&HFw+_NpR2hed+ZKj14zn9gW4$2CBnHP(d=)(G4ShCndwRA!Y~ zh(MnUbLo;DW`3?T03qy+XxuDWGnjMX=URgqR$w(vkh%p3UkZH(M~;KgjN0})mbGCA zW9rd}J1mos85{+X_KeT~lSj~Ewrp)X>XvE&jU$Q_>v5%;L#JA$C@OFht!;2gY^pIb zk250V^HIPO+kZ@pix#05VRkv$GRR6NC@|7SPKe=97CAWpynzc8NeOK^+TrAZWn%?l zmDGv=UOh1yd~Cxs%OCz?Qhc!3Qq!de_20J=nV$)Apwp#jM)?w^*e&XsS7X!6FZ5q) zq}d~>^=7n8bPzdY*WxC5DlE6^%M=9b79_z=6KTp>C0zTR3G`yYethgJrcBhdtkJZH zh*npFxX3KX6Ye7>?21X0_%w-#9W z=#e8!R*=|VFWjn-Xiy*&U$&vNK!#P8x@=@;iAl*OtxtTg4?6J>jY?yTp^S;wbmzQ>C zUhK(*Zpmj*l!Faq?U^tQnMyXw0R{LIvOf(k!qg-36BY%b-2(aRo5nEw`(J3rG#78Bf_O1iI|KMe`~ z7@a@;)_*(FvlSOWyyf(V&piFuzwUXtmwNEdJKhz1ZQMP;bcxHb@c9@5 zJnoBMx$Wd1zSFs5Mwel)Jt_f~-!XUS&RvvA&rZnm#*X)2@NRlLVBvg!bn^7nXA zn_#P0a)ECFLq$YA;11u}!wWx7)XG;{Ze*qC=+pC694_z}yEGz@pMC@7;NjZ?`1SyPM*zPgfb-@@PlwlBcsh3naHw?x-yOhr2k`p>coe{+0KO-H z?+M`4b)Rk_fDZ=n!2muIz()c&?uJe1j0N!V0DdrlPX_Qq0sLeD9}nQC1NdYBKNrAH z2Jqu%19&Zf zuLSUg0DdEYw*&Zk0AC5<&j#=t0sOfDz8=6o62PAg;2#U%&js-31NcV*_{RhI#{&2# z0{HU*{F4Fv;{p7I0RD*p{^c;{or3{9tUJ7m&(nzlo}&Q1CxGt> z;DrEQ2;hSOd@z9T3g8e$lJ4CB{O$n0JAm&F;P(aa`vSNN-~cD|w+8U70epJ^-yXp4 z2;g@BK7g|0okH7P1-{LnccQHHHp8tBR~(@|In?)+p383QZI|8i+rH6r-wqJRGhle+ zEyVlG)@e6>+nxlM$R3ycZidS|cwFW|aldifXM47~?Y#xJ-n+YJa_gjH8q62V-Shfg zT$|M6F3Z(P9!}mo+?NaS$%lvgav_{)4uatx^oD%7c=!tf-;G<8({zb{6&<=BH|e~d zcz$-FAJ^liTK0Q3o&m9m}kK5y-96uuhzqox*0B5?N z7x;5-Jb*J@51$O+OxMFt25{0D$3@FM?i~K5av&WKpAO)p zY?&BeSGsThcp9YL7TU8N^~A&T z^~A$Ny`#}*OVVd8=Wv@N35Fu@rr@~)!o;HoecE?%D&1v5o*s&W@Pj_wq(rsJOUhR&(r_>>$PqmT0)=r-xWBihxM*`%XOW+yeKqk z()Ooyw=6U_`{Vf*xru&{K)X}^gtovxFJwae7Y)w*{9SkE&ULs~IsS&;-|lwY))#Ht zw&mwP*0*n4@0LS-L-O}+_&eSA0RG3hqz-aAh3+3t4S)%W(Ek9=uc-xjxH zci$kfcigol+VS?jy~N(}R=juh?E~b_zWV^#E%EO|BA~M4j=tSO=LqWd>ySSB;!nu8 zU97!$IUVvaf0H6pwKX12d3ZSOjEA!vJ>1(Es~0P)z}xKcG*|{(`=}$6J=9wdXPO>P zonrYaZG4K~jBr4Mw8w?^LPwob`19zgDeZBg3EFG&W5YknpSD-e3+?r!y;A$y=9JE+ zkIy6d`>fE|)4`vIhxL;3R`|!IUZys^{j%Ep7dJ@L!zmNbBh&P7@)D$Z%XO9c{7Xsm zTt_}VJfEhAGtFN21jdWo+;{Q&GG0o5SI^{*pZ}u=_WtL`|LW(S{=$Rvzc8Tlq`P{a z`Pv^%{Od3N=2t)Qe?GYS?%#XY|Dbc1yL$fBfAcGE`<4Iq-~7VY-}kq_^;`e-|9V5` zN_X{q@OS_0tH1RZAN^l`zx`LwUVr0zuR8Y~(EkD}IG!H-`v~e5pVuSd&jHT)s_o9L zo9j-(4>P)MuDc39%*496?s@n@V%=Qn7t+uEAxX2}hk?twxzgW*Nm*zAj;3V~+?b@p0=E|6k;T+q+b<=P$#l3DWGUnWa@SE#6)?>K2?hEEO*L}_W z=DKgd|1RL0>$anRNWZymkNM5T_*lcub*JGk0N-3!Grzg+IrE$Ao`=65_~yEQ20yC9 zy1DLa@WY0#n=Ad&eeiz|aJX(a#;o+4>&DG*u8e7i5zetKT=$&1>*l)8z(0a;bKRHW zhY?&i*L?+k40G4bbsP&b++4TE{N}m>{4i+i=DL&cqup6ISH{5m;pbQwu6qvd3-Fuk zJ_r8+_|0`Mn%`XaE%?!1t()sOc77Osa~;RbkHT-RJ8gb*-DUHeD}C+9fX_ZRTp24* zz|S!=T=$~7>*l&|nBQEt6=PrGn=51Flkjt_4A<4*o`T<88T&o~KgYmu-3#ijo9jMr zeskTI&2O&zWAmFUW8f#5KE}>)-3Z*X@SE!<&2O&5Ck_cW*WG~s9PrI`pESR@?sv^^ zuKR}h&2@Lccrtx+-F@)C7k+c4?|lh=_QB!0b8s)fZ?23J%J6f%0M|VWcNTtgrT-hl z&wemm>D$i1&ps|(_bqkT&2_tBHo z_g{mb{d~CYOK|7mH&^;O^s~PM*X>bv-CXIzFr0lBhF`RBbKMQ|o9oyw0p7Z~(r2Kb zeFwPGp3~2Eoqo2p^qcGMMjw!Vb6vsw=1QM$0paZX!F4C$F2irGy8-{t!f&qoIQ-AS zZ?5B*;P1h2uJq%74u1CM;mX+H=i&b@{BYgfXiR?@esdkioxcLVx$cnp&2{7EH`iS@ zzqxJ}{(p%0=DKzG{}KG=x)a{qQX|8EF*`{4TtxNj3zf1f}* ze;lyA2zgN4x1pt=|4z6*woiwy{+>WPO_~#kKWy#+ad+bjXrJ?Ry{mkt^z_$m^tOlH zL+F#xJuL1J;!oPY9mvz`k-{GPM}H)I4I+)b;9$SJJMf!$bR)EUbo+p}53K~>Fg%1m zfL;Xu?LgcI@{fJGP55pbYz&!}~{m4UvK8yZ4jxxWM zf43obc@v ziSP#jFTx#xyBA!ty!^i_n0uRp?}y{&wSZ-Hr_?KaftNCT0Pg+B?_Rj9M}u(p!u<)9 zIG7?+v`4!21QfU&p&0%jt9=aS5Y--RE$~w;WnA;yi3m0xKr4!30(k7}FSY z+?3r|Zb8?4x|2>8b8A2VpLV*cdnAC(8mt(=+K%@ID$h*gSvSr7;Q*y+Jnxc=t%Mim z?FENBR`ez-ww(8%3+uK3?w`-Pj)QX z-)bzoand-{jD+&bWj0)0emz?J(c%re&77Lp4Vp-tS+;Y)(9CYJ23VMLL<{GjmV z$Bh4x+!^d?XqiEl0bLY#8cbbC$TPKpD7_2Qm#D>HKJ~^t07)*{=;EGp15to^+GI z8J<`nc|u**Xm%T2h6Pk8Bde7kqQ{0c6R%}2w@tuPF7<;l_miS^+njXBu{DPjB5!%g z?~dC%NhrBL+jQd;RWe?nS&NaC&nY>j6haDhT=i7t5|S!*miq>Rfq8&ntXr}%pIWjw zcNupJ3?;o7JKe>r^o9(hE-8;)$rNvm4CJ{f8Q8|;{y5P{)iTpbuDpQqq-SeqnN%+a&qyNmx3_@EfQc?=9UR`aDlDv^Q2PePIuG#Acf`# z^M_5gkY^LZXmV?7ni1w#Er`}bHZf@^^6X2IZi<}T0~{a|BNu@n>?)7jj zACg4-nOYG~fv!*NCRA{Q)J>?!K>*6rUZvWdXW81Xcpc)v7JS+3%^llv3dulDUjDMl zFbAqHpa{z7_bj0cwAa)J)VPOViLl$GW*0kPaX7^lIi3!3E8L$e_QcftWEc%BB|23= znmh$-egP*SwQx?47PN+Q)3=9s+Zuq9kp}U!ok+{pj4jipTBiZ2uCjVTt;4!Z^qi_n zP1IV+qo=sFJopn<-AraB1}Ya1RbZxv)LiD7=LP_A5wW0l^2geR1XPFo|VoC&@&5MaYhQ+v@FSP>vmi)ns9hU-pJ5cmvnjB2(m|NS(7P|^(YBV zDJTCIY?A_)Zr@59voWn88J+422#YtnvhW~Ztc|L z+?_H`jLD`mW%VwI4+t@(wO~0}I>9aG2~$~%(!^OuQc8?27Yb{BZF7H;O)FYldYB<{krRGP8EmYXvQC?vC{2SjdVVo{6&+<+ACH z%glM&({(Ky$~|sAo*wJ0hvr2A#J4kYf~j_QwX`w;>8KO)Mk9xDUp#L>#DyG(wZfp= zQabEMi@0~~a7D@z;IYGPKUTthZHLXQ3`PemCJJUSdgw5#(qMED;k^4txfhnwlw~|; z`W*y?``Qr-^-BfB;}ARK!?wia6J*+ij_eipdM?q+DJ32|TQ7`)=>p=X;wT+nj>`+Y zR-?d4HOnj}D&&|^pxb3f)<+CzX+1wvUI;U2#R1WD4Nzsx1=;*hNG3I@S*XpM8BjY# zNk23LO=np$;FFl@k{~%YJrjiNPoonP*KlbzPNEFMaL$g5di=m84AUc|ktJ)&!?2_m z(XI7X?x{t%rn}kM&&Y*0;}$NY&QP~*S4T4|g+vo_7HtAz>`;^KYiTkeh9EP2cG7Y( zrJtyq#q{4kBG`ecr!Jj4J9TRM)Y&IOZbofSoWPJK;eK{ z&xW>=O&a%n$@+F(%2jv7=W=Q7d4Q11CN+&JjP#)!N+Xxkpsfy&SSINS)k_=G1laTdvaeo4(aRL831u@dIW37i+{~3mL`w#sy1z@k0iHNgU4ok1+(vQv(T0) z_2J=6OC|>)&zBc+O_`u3q&Fd#*mi%EvNn*Lkxk8i(&^}E0XP$UJ)^-Wc4f^s zwsuJp2gh;i>5YO#C>m@z5Z2>W+$zsY@029lpzzWqODO>BeN_Rx+r5mSVqo0e7;>At zsjQl@{JFrgAB0Fg!;9Jt(0S`mCaEwVyc{(U8qH%|lZ#QiLN8>HRa1h?9H;{&oRb&f zt5~ZM)+^;KQ7us#k-R@{uHp^IAiLJS2x~2zQre+)qFhk9w0oY!MyKBE7Z5P$z$h0Z zaNoZddWbf^SSxrcgQ?beH0zsZu{>R>XTOZik}mrX^R91vc6<_jBB%`~&sydAg<33k zsm#iW@URjQZ=5ui%h5vIgaV_-gj+vkqdrc2|Ns3aa&VhoDuc;+zsdrx*wpJnJFhWM8SdK|s9Xw$-e8i&-;IWH zndZfva#v`2OJ}{=sMX?G4EA{bzJC0Rs`K+PRuN&0f?1qa+{SgEjl~)-n3vl?ISbCC z_pilG^sb^7uEfP`7A}^@!TaG|p_1ORkBNdt_jtZsui#$Qc^uil#6#KbR-LC8g^~AL zEk=DrDYPTb(x7al`Fa$-L-e8DdNkU**I$l!UE|P@W~qp2^^`c#l2TgDP+GNqIwJ(s zB);4zBdUv2&TwA39H^{z!D~fk-h+`K>Z3eBe-)w;^=~z5i|ih=Mo@5C6=tfq4gqq& zWmLG72e&AIKi;-ypXzaOs!Bh1@enIm9g=J>;y}Q-wu;Z~jRq`4<*MQ1CagLxPb$kz z3Fl(8+WQvD^*U#-?Rp#B6pKUng_Rke5skDPGtclcR(#mT*9is&GO;{OBN^1vHtMr7 zmPyDO(sBjuXu-%KFI;=jx+*%r+i9UeX`@SNLZs~~rVAmf7`M(S6$Z`nSyFkmUGRwy2W@BR-q$O=usgPC&p8(yQ zC6l?#LP1-z{uO@2O`6gR{wnq`em5FCG&rHLnxWB;Tf4h6f(fj!n0ynKPYW_N%h#RE z@GuCC^kd<{kqo^koJT}e$)`3v%+Kj)VIM0#GJ;WkN*%2unJ_0Tlwp4nQ$Mb8OfF7@ z_F04a!)vaPfeE|CGqyu&X&&VIy5tT{y}}F&Qf6_JikNYj7+!wJyY5iM1e>*gxmv45 zjS6l~!v z96z0u{$jn&5iQKm{G~bVRbuMCEf*Tes8%|Y3z#d{+{`AoY#Iq&{50&r6Gx{ej!quG zH1Wi=YH?@s=$>S*V@CP|)(yzWqn}(Ay0eAeLiZ>r2U~;?4xsIBLQ_=j;>lEt9no&R zKIs;)IW7%MJR&@j%+Y^!Fad!u9l7G%2#maU<*sF5i-|YY_%8X5oYE9?c-9FH>&yT z(nXE3&6$i4z?aq#sSa5VF*syzM27JA%>h+C#{GG%GRB(d?CI^-mbP5nUa!iS8^bH6 zKa0)_yEGf-6GZVvhqq?4D-5ZeB1u4z3uG#6dzIPjya2|t7U z`FY9syXU2BjBduJsd_6To7Q5^Z%uLLGm)IwmPB$~24$2d8ZfvUtP$SOnsg6HQyuW; z+$L^E{Io7b*gY~Y3NV)ZY;Y3G#vdJA<3`E;aCU-$fu>*$Fg)E zZWTr1?A`03(xwE%|La-^%nqLovV^-Cv;jL)UO=mf+Z(j)-B?hW^g^L+l1iuGI;dp1 zr5wM{ZZSrd$8d;x+&qT`ffzrXsn)Z!$tR@AJB+&LUGAytDiti@z!X%LeA&-vkuIN{ z;0daBuPPZKK=X+jK0e%AM*lI&De*EBo+EySK|AXFXNM|w-pdbOGUnE53q|IaR*!1 zveGMqD34UIOB?kLHtgAVE4fhV0|9j>j$%#IhiN_^W1bGJjeQ`7iPl@p*~TP;);emU zZ-TtZWhq;O7Y4&r&&Dg#YH*NC`!a*sjwWXgW_0+>F|cpHNTuVhca$zGTgKdC7Y=%K zUF40~Bl$v@=E~Z{O^0sm?*|&*r5Wv<6aZTmElo>{dh_{-?)q@kK`0P5&H|M@EXhtj z&|^wx1UIlONa8$iU81FxmiRp}y#ROg?}VFV)(ZQiL}dNlN(88B%E~B0B30WrwN)P2^`HouoyNgjc&_9LKP9vIZTOlqV9v^Mh6u zrSb~Z7$dfUrAfNi-4$<>rZnHX4K2$prP-xn?MAahx;D?ZsjbZu+Q`sq_Op8DnMWzU zC&pJpwRuzsnmbu^)YaHUa?9nQ_KHP8HnC$q5i0pBp|+$4)$J4(1CW!KrO=F%f4)DX zq4M3pbR>Zt1|$gyMq{ZN=`7s9hNLB$&jI}bA}loSp1|dtsr^ZkO+jMHHk#H8dkluH zMkjDwQ$&( zB%lJ40aZF%uITt$7wmeF>okQm-Hjj_N^eu+$_CjJtaTzxkRSe~eYRGel`zBK1_L&K z!M3s}qh-+1#mts7+>VLT$K`!;8)De$Wg@&LG>FU&xyB1th+sOZbZtJZ$hmgTco;L; ziJTH9g5`3SHEIW+j%ZvEjd)u6WBnng#8)m=P|BiBscC@CrKv{*A(MC5FCpq}6KDYs zrn!mMq9`#9qu59Vm_ae=T1`!ynmEvjXBrN6cS*+fF2ZK*V90$0 zc!A%h!Mr`M3&PRl>O!RQAH@Uq;~-q@N{>cXPMko>C?%6nLiWigPIOQ< zoW($?6a2!GH`P9UsiC6}mx}uj96V5ZXl(z;!v{w~e{qf#c@gu@#o^Na{ecygg!F^^ ziN$(FYfve|-or#!ES0rom;(xK2k%vtS*;dUQE*&|3*)cpn5l_R^-V76mc>fC0v}@K z#=Ulg`?N7UYAxb3D|??@;(;$a@Xf^NiekA1x+Su(0vf##;hya}zq3km^X#1?5N!_T z!^*SIV0uvSmoR&UH6YJmXw`03R~U*_GzcoUWiO7zF0hP+V+4~~EZ3>Eur<->RjzVi z96i3Ucx-WQ4jCAl!1|BopgJ->ka<6?RcFfe@)cb4Bye`z%FSx4Q6JPL_$TnOq;{^{ z;xaZQZo=an2hC^^pS&nYetQq}P>ot3XnrBU_CZu|HNM3GF}H{+H!*89OsJD$ml%Z< zT@_xF3BIIZ+Y;?&5%xWqD2Orr$fDt7E9RdmBd&V7vKB2jv3iA*q>yp5e8mbGgNSoe zBI{1_6Ce)CvfJ>diX-z_|H1;Uu1Uw!=OSe21fyWEIgAtw;BH_-hq=BtNZlJ|AoomN zsa?XVKl$1-w5*u8BY1e&b1zy(R=H9NRU3x^_%st5Os5N-{(%z{C?L%e?O>V`Q!bPS zga;mxF%Sm&C9b}8HBOldOT)4g61P&%P$a6ThZyzLT1jmkjksUqJ*Y8f8vKgx`#ik6 z-8vql+F+O!v8&~iPD%FOd#&g`t2Nx6?Js7AmIk+Pdkn0SB+4o;%jOO3D=S!YS(z!8 zo*sEWeXA&d#d&SZ@G-7DZwrExd$A=ZDaen?%)?I?M>}GkMHx0R;hv=+w}T^1Nf|4* z7#XQ9vzYW59=?PMUYk89;}>YhrGyulA9UHObGB{9_z`M1ns9C~y9b6!2S^|%U0Y-3eV*wfrcWr#I(m%Vg@H9uOqDBED>J31i#SNeZf7r1xX2xY@sPH*!?y3& zw%FjR^D6FPZY5;u=m=}9;2Lka+uVvv2+Ez}UiwSel?fJ-%r=%PQvQZy3`uk_MC^dH zltz(vh|9+DjkQIhfivzGmy9vh6}!M3BBm%j4(Q|@V2mh^IRh!(fauTmr$W)*#ox7G9dWmGa4c&o@PGWfF9m_RdF+NLj1 z-z_>}KN`%i0;_3)O!kfW4vw5A zpc%EjTr6wD4#tS15x46lAv4u>Iqeyt0Va>2#cbJH?L_Bj98siLUnt{95EoDLjsoA{$rX~ZBcneszc@+1YTwj6kb;!=nl^Gkd5cy4P2l|N@&Z` z4ku4i?UJg#D)yel_+U?8mtQ^P-emuyG32|YHXVM zh5m6gijJN)`SMM2w5-|ZZPylAUr4|^^F>d z5``eqBS)6J{bZwrC~D|vP#_dFa`=%Y!zxQ%HZrsiZPgAFxfo6%r{;KRKh$W=tguy+ zHV-vpT~R7)BvJ|)lH`#GJg{)w`o3lceQnuDS;Zxlat#aN3vJnQoRk$ek+ZDY_|C;3 zlhW+MD6?uAPRJ%4N;xww%W7Elg7`)NRDjX?KuRNN1X!oho7N5a1B`>R#<68MWx*a3 zIIu)M6tQqpE9@g4>p@bnMMUjUp_34h)TJ9GEk___5K5)YjxLL~VP(RJ*}1kc^yx7+({Xds#VpUyWFXN3XDL$4 zX~`54JUMb3<_O>3`k4+8xII?ZYfB?V{l=;zvf zlf>B_SiV|rRV#@sv~Mlmbi#E)Hs)vN+lB-O6JAh2A6`o`Q{k$VtZHJbK7~32W$a8O zoc-E7oD)}|)I}s|u3lc+xtX(W$!AcMgAHWunJ{(bafd+%EVUuG`is}pWFB6B9$tO^ z8(u1UUKi|9W^x-QV;j+#dx6!0HH!?Uj$u-fy zBH)k~wUrWl=_Nh5$vDdJ(~G*5!NHfB1!*(ZO{y;{pmp=TyBz#iO--m=) zZ{H;KuGd8tZquNxRxW&xg{NnWss8S^_#+mcJuFOd-eNf8hQq}o$lEDB|C9GgrhJ?Z zaCop1kkYe1!4vDb=lNU?H#kR3@H}sq4bN(Lat7GnWF=uqFYhS!u=(2M?*99Cy1TF4 zg_htn{1M(kywgG3#z7zMSg64rczQ(A{KYi4TZe#oA&hR1^j5agD{cHI;r`!vCmy+o^Jbc@i}h-J zZQsSoMrDy-%Uc&8#}bXjnTr$nYW|*b4QG`EKZkTBMC+o=q~M&d$r#Hfn%McogDYPd zntBH24@irAHkQ%Wz9Q7H*kc~M*5zH~;#ZEFUQ&Ur-F7!1Z}U@S7p8J%7U` z@cdA*=U4ara?IlV`Y+!1n+N{nqh~%;{DbG`|H;D#e-^;u)7AR5Q#e4z4cE)_amx+2 znw86(dXT!z%ZR5w3)_k7f@yiAvS`Rb1uC=R;$@l~yPwC)zB#KT+-WZ3PPUnx=zS~R`|xu9_9yVZ9dCpeB9#Jq z2i!e)AH)lBV|d5$9>seM?*!gSyvOmL!23AflXy|&?r-5;#=C-d74LPtYj|(qeeHSmOJE&Y Q_|U6A8?WWy`;@@{2kU=t_5c6? delta 65 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 literal 4548 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 delta 1513 zcmZvcO=uHg5Qb-M(ln)i(2Al~L-o)@4(Ua#6dIehwpbzBSc_FKBvBLEjU+1`L?R-1 z@M2g|!5&&@L5YXfL=X{L)I$zMO7T$e_a=yfs7L?ack?Z@bq8i=_L<#xzHh!|OK&`@ z?WcN2dqN$V$1~4IOF!P7_;lmi5T^*(9TrhMPEMw{q4+g&Hnez7NB}1wTd7fTKgqE04Lk{#c&nj zOgbgUlX`q45i`;mG4R>a_$)Qh#j;D_WE=T)a345Y@Cfl0DS;WpJ(a>b{s_F?fxiIv zJMc1i0K5*)1uf&A_7SlQQSBLhQ8fo@c5^h%Ye#dt#vdsZD(9qjgZBorgL>A8>aj#z zT>QJh*oQsJ>V8k(cw!=fGYF@Xy3qkq&fL~8Q{HV2>yO`j>TOGfqwxSwtsW{Zwi2Qr z&RuYnUC24gA;o>jhmoIzb86#?b5ho1c#oW$*DMu}7}Z6+_Pf@wSj*$pWDZMD4HWe{ zucmp;EA`#Dmg^5{-s0AVd!9p{Hgx3fYE{&Nl|R@q5l@dpjq79W>VLK3%I0n@&_5X9 c50H|y;mCoAfp{2>)mqkwYp2RxX2+JXf4t$a2mk;8 diff --git a/Shaders/BasicVS_Cylinder.cso b/Shaders/BasicVS_Cylinder.cso index b9934be9027fd7d8e687c44454bcdd48c5febd6a..db650744cace245205589d0e2aa447003f58ea93 100644 GIT binary patch literal 126436 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 delta 1514 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 delta 69 zcmX?dgJVaGnM;I|^MlH3Z3(`wd{)S@<#X+qdd$ecz+j=rz`zEgfp`Hg1H%qJ1_l)Y W28K1d3=Dg8CtArdGHi@|tP248`x3hV diff --git a/Shaders/BasicVS_PBBNCCTTX.cso b/Shaders/BasicVS_PBBNCCTTX.cso index a8281ffc30f5587920c1638a695fbd2d94e6a8d8..039ca2f8ea36b0336866880ea7f10464bbdf4906 100644 GIT binary patch literal 147224 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%0DCfd%!P>Y=f5HHS0R)ZpE&d8{#PUOn1a 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 DkU3ow delta 69 zcmbR7kE18a%q7Cfd3VT0^MXfS7uzO!bFs`)- X00TpV0RzJXgNashj0_tiw;KQezt$0C diff --git a/Shaders/BasicVS_PBBNCCTX.cso b/Shaders/BasicVS_PBBNCCTX.cso index b599dfc782fb0545c7e5bd4d864fc327e5c94701..9accd29cb919087c4e6c7533b3b6a71c0e55f57d 100644 GIT binary patch literal 145152 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 diff --git a/Shaders/BasicVS_PBBNCT.cso b/Shaders/BasicVS_PBBNCT.cso index 869717d3f90e577771f778290179fa2e1ee7e577..05c08a2bca1f2fad8a36cb2234db529a2fdc1cb5 100644 GIT binary patch literal 142372 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 delta 69 zcmZ2-gJVXFnM;I|v(OXAr7mmI^x6yEFNx{gdcnxRz#yT=z`zEiEr56dFA(!FFz^U4 VF!bm$FwD`NXeGzUurczmE&$8U5vKqE diff --git a/Shaders/BasicVS_PBBNCTT.cso b/Shaders/BasicVS_PBBNCTT.cso index a0d28f4370dd398568176386ab6232360d897c9a..eee7af63dad69aaa52d07b521f80bb5adb71daa6 100644 GIT binary patch literal 142396 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 delta 69 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

c`E<=`{2;%w#p1M7nfx2Vs}87H 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 X5ny20qszc>Mt7o>93#WV$j`a}mBkhf diff --git a/Shaders/BasicVS_PBBNCTTX.cso b/Shaders/BasicVS_PBBNCTTX.cso index bf97c16bf771777808cec42a277a1c312c48dc05..e27c64aee10d3552e4ebfdb9719dcdd1c1a2bdc2 100644 GIT binary patch literal 145144 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

  • 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 delta 2431 zcmZvd?`vCC7{{NRc1e@Yw%M}y18c$>utLS|2cwn>cTHRE3)|qbY;%*DHMcCIO+u2Y zFE*0?0hQJxI$VbpL^9JC#k4bmrDY5mxQ&Xw5qu$7eB)bxymIsVrTCFynx8a$JUHrc1sk`3iKb$xB4a@Ffh3Fz_N4<){X}!axRjS33HMIWx(3CI6E- zM#rN=XL}5FnGm*PlB&H@HfHNEPMuImaEX~4txQ;RCh3Z z0K>Nq{0s1H2Yws;t^?l&zvsZe2fuIfR~r$kNTbQwQ&UF9h-C}NUJIH^7Ll?g(#E?~ ztyWuLZ*AJewEKiubBD#QJN#TUS(r+ujA(W)Q{<^!7@B$=BqlsBcY?8d`HDz<<(V#Z z@%ISP(fIwT!gyMiIu{0WRTvyeET6qXXVRHe!k8*%^Rz2{*ysKM&dkpL0S|-YoLma% z@W%oPKu4fC0lcZ=hrxR#hidX;;C&8!0K6X@*G0pRjxkFNdI);YKXwsyZx5&Dpfxpa zUtg(OHD3o_nw0Uvc&1QHW~Pi36{SxdHf!SI`DCUroz2hUCG_&80omKn93KN`rnoAF zA#h&8ypbA}fDuqWj9Q@hB)C(CFM)?K-=6s#I48!=M>EMwGe$g((&5LsL~@42{q~W- zbu3^hqiFb)6^zC4{gKjTzMCQT6u$?qB4xWe+B`V#YM(E_`HF8G*)o3_JdCkD(p%s- zL8*}^j;Id6au1sSS7g9V{sXuUZg=!Mc+7$S4gR*|P|d<`!xfyv*gOF0RuxqMhO02x zPtXls2Dfi~1bh*k1GOF?3Vt2T?q>pg+0I`ANWriI%@MJvfZhRL#aKDwVi5zK@eZ?` zc~2H`yYu1TD(14NAp51W$monQYoHu(E1f-eaqh?os@gu04*yYo1IxFiiyhhLZGV$} zKI31q&z^Ay;w$4BXaFB?m$jbS*Zw(IN7qyQo?yh~aOJhyVBkfU<`ubM&xGeF!sDpN zpizgU>1M#E@h^Kv+7jM98$9tm&#;{TjGV*k9*duY5v`;4DCqaQy$9GLx_f&X_mIyz z4?fucVacpEJ{8;8KgVUYaU!v|PsRMvK68#s$KJ4UQ<6YJI09TSZW=^~#Am(VY3;S# m3!AR~vGIOYBD~;K{A9cc{SBJDdgu`P*U&hjUh#V0`TqdHMDg1I diff --git a/Shaders/BasicVS_PNCCTTTX.cso b/Shaders/BasicVS_PNCCTTTX.cso index b82fe3b2e2bbede8d4243910ac34b8155031c4ec..05bf0e51a7c3545a61cf1711b253dd6acf863d61 100644 GIT binary patch literal 140532 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 diff --git a/Shaders/BasicVS_PNCCTTX.cso b/Shaders/BasicVS_PNCCTTX.cso index ebf7ff0a1e792bbdad928163dcacb9b93a545017..b57c0cf31eb1039d569a71afc5598a150ab50871 100644 GIT binary patch literal 140508 zcmeFa4Rl@Cbsl&CP&7#qG9^j4jb?|}d*ISaOx)RVZeC!@Gd>b9DUmg6paQje>(#*;b|Emt#DQg!M~Jy}jCGi_6) zbvv3B$MvL5<7LnH?Y+;v=ic`o0R1>|9AEO`+_TR<`|PvNKKuOK^E2`A@e}{}@8>4p z{p2@?p1I|YfA+@XJ0IwA&i($rUbhwQ7=B;6*}3O$ac*=s{KL+D6~FTn_nmwK@NEeH zHX`hRdjvms!*{;h1OF7l&QIj?gzdpE!Y_y4KKyp#$L9&)_33NsFTjq!pTVDAxHsUp z1;6j&fg@r4aDM^e3?rY!--RFX`Oe>e%Re0+AO7EW2=`%h|6zylkp2rD!kHgW1C~TWnQZ*UWRKK3A#P`~8*rg1wT`{k8f`xkg&_ zovzQ)^V!c*es2OFUxHA+5)>rmPC0$;4bGi|>mSOK`f>z+#yt=&<%s`o2uc*fDL;^K zmojk5jrd==(YZCg*h6_iP2CU_?DHN7mwH092`C74gb&$$mcqtE82Np{{9ezz`!e9f z88^HwECf70+`Boz&jCJ;AL(_&D**4~2q#TG-O{}qcuy0-@_4#Sx=X|(j^V9!!Fz^y zWX$lM?Sl6;;z2;vRX#6w!P|wxd1e!Mw*&7po4~shc%Rz@-a+7fKEOK%KObKX-faQ? z>?ZJj8hBsa1m4dA?@OD&`#ZpUZWDOF2E6Atf%iq=y|4+qe+0Z2H-UGeydXB=T)pY$ zYxQ!gWO9QLbbVEuDNq3PM)sUmnK`~M$3EdTby&p>y5ce<6L=euDW>nOm$JE zscEnrtb%q(<9?KJI(B*09j}&~?s#pvalF!6sZO@r=4f2trp~f?g-+HzzZ?>FeM!asej75L0QGcI%cXe^@LS?p9Z@4G6BLbd{ z;(i!-#Mub%W5A1m=k3-rM&H{5@4f)|KEor=-SB=Fc)3l``**+_+63Oqz#9b~`#((g z+wk-8e0euQd&hng^RXU(sE_9>HTPhnT3KwBTh;oad!XE$e5`_w0N&?Tpk=C4Z(3KU z{ucN^#HmJku{mFFEHuOZ#Hq!(%Bq8^=ABeJRn;QtYJG*l>GFINbWg=ykvTWTP9mOh z{Ftw9?PJUc5?MtX&u1f9d>DAd@p#?ZgpUG`s!cpT-OBzc;IW)My>57a7kHb|%`X5i z0=fK{Z?Qa6tFYfEh4r2bur{Zf6BXD+r(vvUQrjN9T4^+@bCq-DMj2&$ zSvqsa7OM*nT^LRI@{sp`M*4i#V1igi+b9G)UN^ma+4nG|o9K06i}dw1M*1&p_qT6S z*hc!l^Noq@8KYZS-U>X*X(M{?0^VNW`7-ZDZxnbD@HUeDQQ)zRs7I916#RU=Y`nV) zILA-K(f%j?PT{1j4U2XCgfwzS4jpX+{@SXtPM)Lcoz*_^} zM)~;H!23AxHj>|e1l}h%k?wbZ_o+?b?FM5{1J6{ttNpzLc%KXCb*uYVE3?PTt=TKb z$}=-;#H$z_!BCF6FkqrmYn6Rao9EA{m{Zxb)nL5%V+9WD+_29jPmq+`LW8Jj114hz{5sd7Gr+Cym-0d zX%*dN+Kl6sMfOVkm@kG&1k`qSS(2NoG+X|)egerg%9ktJLR>ywpF0V*Xd*O)%MUdx zC+Z7J%dHB>pq0jh%Pn}0FVD||+Zq)H4;|)u6mtiBd_D5+zWZvDDaWLyr{`BvL*3KJ z|3qbedfHp2i82HaF+cpC>E--E*fx$<*Xvuc9R&V+i9Ss^G3J;<3Dq0t?>{~*xg+FQ zeH!Il`G-QjeI<3o(^sUgeGGFaAyjjwtR8fPXCmr|kRC zoD)tQK5X6Phd=*XAo_b{3hJow=G33uYb(+{3^Q^(HUf8W_DH+dm0;!_jshdc;5%ppGK zgh+GTn4!aT`5;+$+TipPPVXBKVKM_3IiRoz_d&!bd?#KA=Q|(5&22ku2r+~6V~gZm)jQ$FOM_+h%tE8(P1ntX`QZl#CY&|To{et9@)@*zH(e38S2 z=?#kDv!9)O;J%05ZES~n9OoI{x6Spu2iZIM^O4AkX?s6jg)i?X@05f0Gj0C7pJ5Wd zP3bXDdxCK0g?V@{qg_Hp!SnDQL|M}JhaPh7S4aYWrbXy9a2vZc+`m({d@le_JpWE! z`2J16$%lU@AO4*@TtXVR0EaSU8C-_{n~|nL+7+e=zke^_o#_z%<=~xgrb#&CGfn?~ zL-5WtJ)CL!cc$&%DR=))8S$MwuxzhDZ5Z$EZp)U#YmxB6bPqXqQ^6_UfAXpt z)xgs_Y+$aAHeeTj?-EDP5tp*>f9SXggDIaNu%Li zfVTNCq`7ts0OB!S(75*}z&m+jy5xyr;AOjy!~8Ie_#a#Nr7zKa*PB0iG{o`oLfrS2 z-t#|ig!AeC-?|s1g+Hc&_`;u0&+|uKJb!dScc(AAPw&vM-f;xP59OofN_@)Q=g0F( z*TO>iNdBqA)K7+=L0pzC>ki!;;CdR+ftW6Ji1^-}fLya_k`K@KpS;n^%i@J$TP;0L zE6gv$$V2Zq{>0B32Fu^@X^Ui+4#6&knC^JJur6Pr}&_ z-DWiSj(qMQ4@}$h!1AIW@q{>yD!g^x3DEcxugCw zzL&GtVaoIZY>3GIL(x{c#PhsUkG_C>5bkZ$$&aM-cXFHR0Q2Y5WqKjaP-Z7hr;(1> zG2zR~taqH_HvJ(yrYwMX+o-C|lkPYgTxAuVshz)OD^PFU|aYMNU+noB0)I?Oxt>w`SPaBi9`G^Tigriw-82r@<;qT0Asm*;tfilVaKzy ztW5)&)L*!gj+Ynd;1T;Hun%duPzQR)@yDSU@cXAPp1y}3JgKrI0DMdRV0`lMA^uf( zT;>e({Tseh{(R6T#WtaLoDkZ}6 z87H=rGG)1ux48b9-+8^K7E_jC(9$ywm0mZWy}ZqAKMhl`W95> z2(qOvkS_U_GQc}|B#in%I)r;$;dP2I&CA-om}(GP&pe;J$?!2|qn{7MnNFv0ro(Wr zW7+sj2W_R~hq%;jy37~peS#Bjc(Qe#IG=b@^F%yg#qE`cdpdM|e5U7ZGHr(B6EHk+ z|BY!A?p@H1>vtbonU-V%hRXJahuOS`6oYNc<(rnoa0~ri)G^JG5%JxGqfdJKN#UJ2hmA- z4EJ(mIK!9*&eVb?27I>L}_CAI^99N9snGaHcDD zuS+;(%kU3%38xGqlQUjB+5pxY+IXf#8zAn7lDf@s*6mK=gfX0TyHhy%3+r}l>rD2n z+n$Ekg;0;ZoI_pnW$tCq_;`L;cYPU{YM&oj{ww@@5$O z6m%hfk*}1o(WjkenAabn1^r>4l4V2PQAR|!o2?QJ=7oisXt7QX;6Ro zWc7!5UVq3_OanYJEYu%{Qx2i)ZHSLceA;Qo^|+os?Gj-O>tv@15BZ~=HacRb8Q;_L z^yzl8(_wh;IFOv?Pw%+;wS*PwdAnfxO4*Sv=@T}CcfvSk zAYJ5Z2j?_Nmu1AT-f_%pKDl6wdrJob4!O#6D!0KHtf6!OIBprT!9j++aQ*$gR+kdhj8Yxx7OTq{Hxc zBAqat@Sv`XEhNnMv%Eckt&qNi4tQz<3=U!23ZO^6d<yV((@gskHpqK8W_%VKBON$ zjL$qUpReVaJU4ON{Yg*o9reV>i97F%&P<++4h@fv_V2iDVv-47jORbA z^TWSC01|kP3kQDq{FRje`U~ql-}x&mn7<+!XFC$%=ReLe+f)d)nXk2tA)OyS-`^6* z_AkD_x&0w`ueSuA8qW9p%KpDuVLx}_Pv7@XO8?hCIP-;F#hJ?Qmw(Nt#W4QD=l6fI zm<5HwKYag7B7yJx(Rcoc1^L^*i9aU}U&JERM)Trgwer~hixc(PWiF6yUcA5By0ScT z@dUO%zPns|tkMWxhjra$^WyPxvpRcWa{Aoa6DOvo9v;3@Yu22bJ$!LFpg9-QysR{5 zL32fECa=RySpnO;I76COo6}2+v$L(%s?vO2*c4LL*M~i$_1gIQ$>nmZ(pba}mDh!} z_h-p<=I(#RLc!Bt?{mu^?r}f+TYc_Rzun{hXx_Ow>}|g9vU9&T*z5kyQRj|9J^uYS zdR^rwo%?&hf7?Irai9Euocon8^ttH%9`}bMz3!KPy2rh}+UJh#>v2E+JH76&VMF6% zH}$x&=bZb6f7|E&!?qrG`Z^DM!!msza-tY9de+a&R z^LKmPo&O1=RGs1hr$2l)D}f)aF3#4L=PJ=Vt@^6+y|aHu|Bhy>u{_&~P^C|uJ@?R5 z|BlD|cSLw}KV*bu;8kv@ilW1jUlV(GfKiNe9X+EQj&!|p7+#35)o!+q4OpWH_Y0Xv zJEPu_fWQei{jU06+di?jL+;3fYeq z%GJf37e-WF#Nzy+Xc@bUqH1*x?4{OR55&?+2-Iakf5?0>sxQ@>(a}gYmdAU#azcFA z3wU_-+Vvq#aM&{24$2#-IyVreP>N1T+klRr!J8sdkJp263q%)i!CV+X1Mn-0(z@rvoVG~AFosTNA z(`zo1M2-7tn@i={3i28XC1UeZUzy`(S1`c_Ot$<_@)Q8s0-K|FhN2V&pLH$9VcDar zQ9&bxX=xdv;;@vp;^czVhoaFT{7a-`anAX=byUhPO;GnV0tF<=XFAj>-BB&hbXZd1 zjz+q9<)I7Qnk&z638r|1iPu2XLkdmYo$=6|% z7c~fJLaEY`ecg^_KSPD}y5;qAC6nLdRbtU5#PPV>q?xnWQc(t?L7zEA9$rCddPoMe`+qaw*yQ;t zCHT}WJ2*r(`i7CX=Qm8W7)^55eTWk5?gcoNyZAVfROX7=%t3B3XIT>d6p|E$QbIv; zkZgnvd5xGcZi-EFEBj+ZP_k7vj9rRYYUzEm>G0Gh+U`M=UrH+6n`S%fQn@;i$#Usm$7}Cx?8f3K?1)D_!GQtm(GEtJ^Xekj_M83K3 zQm&4~Ao}cHT2Be=rHCB}b)k^qOf2QPn{e5ki7R{YU@Ds_+j6|VSUF=xCuLg>4S*rp znL7iNh1P03N@&zqrWeZZt2eZhScJ{LEM!`%j}#6Z5X+V%o>-cEp-{rd+Q5LGsMT9n zE>s#Vn!Hr%V@!RiGB-<%IAyb?0`$?4q#Dy8$t1s}(Sw>~I7HMzQkH7mj|C$bAN|D* z6O+Ma0j&7JX2vl2o;t^?9wk#7!(M-aR7zJ_->)T|S2ZGKZ&n_QpW)N`t-wfFIFM!` z>B1%`2Sb#ib(uJfNKg&|MMu8q;q&0M!o(3(kb9)NVErJ(i2Hdh>GMvO7nZQ;8mIWQ zDje7Ap=%*t(?&TQr1784E^L0EI+Pd2cjj8Ff|1!zRIVK^94d_#4~-QM9*8ziWn`py z*Vuv4Qt8kkDDmTJ!=>&+61ojOFdte9VZBGyOUKDAG8h3%_* z&cdrp97UVw>g;Ino=@gZ+B#eu)N-f^2btkNW>)nuTCwvND@+0F=z!ZOw06wui5nc>=I0FhO-9p*Fe4+1^kNmmGC=&-$DFXvq+A` ziS7$fmnj0EF0)>0AR33!;Z)|jZEjkt35zmf*idx!0RPrO9 zLM)@JC-E?zi5j6vIgG9{<#{|7nFW-QolnwALStJ=Kwj5@F0r~w6!|2As3|YezXhb)Criu*ske!ruY(4_XJ?iZM2m^s5q+ys%Yk6YDqB{DpYzq@3 zu|Nf>y-A62RyRC0jA*GW1xlI|eTY?kz?;z+H!uc< z8ygL+9c?j0B_*W+iE*tf^^wOV5887ejH+O-w6vO~1p_Q#vP zMlof>!HjZ^RFp=2WQnM1JTP56rqD-sD* z3HEg*n+SOVSQ8Or0;a?jZ8$VmD&~uaiqZZEMxT*kOUh{eC~M8mH5DdxhuE09O}$a0 z6vj6gf?95W+&_E2aK znw_H(vZaOWfl70uBw}qwu}OsM*Tt$p2l#WvKwHgv)1%ktp5k=G1SJle? zCcGy2_zDuvHg=1f#<3iuCre@BvudoG5Dvab!`?Qeo7*^OjlUNX{D=Ysi=vdI-^?7u zwM{J_ zf+s6=AD`b{%Qeg#tEG^Sr7UKp8z%r!Q!4GMnMn*dc)BGkwhC`?JcNaMm*G|==0{uyG#;W$ zE<19oRoV(iQZ;VbY0wZ)m{y6YTBn<>f z87{=#t)J4a(Z14nE0hzS{Rq%(Pdw=J4Uvcsa+6V?w-TydDJ~2@F&aKO6tRv()5!sR zeI*%V(nMHBC99I0L`5obauP{09b_+MmVByO9GHSa&vGz2I9wPj=En}i=3u#I1#%U3 zibC`lK0fTAaNX(K75Ye-&r!qIkr%YsNL400*!2_&m;mc=7AeqafI1Li$!cz`5_mqO z(G*W?NRy`1l3HA@)ev8N>4sjbKBW=4b@(TIGkb|A-=E+$5E2Bx$%$|g)`MnIZvHknK%$YxB_q-62|uYzcFtp56;Ts&}5 z8|P<*Sn)B~qrxPE7gaSsLJ}27?3ABoGn0`r$Si3v%tkGlF4F{M$_&9?qS_n-E1uv{ zD;Io)gre^cze;MyA=QZuu~CacuP-9a46Ug*f+1Gi7eO&m$CX1Mdp=Xhmf3bruOrtX zrs$ECybucmA??s>jH0~QG31ot9nm3QuWiaxTOqL%hpa*yzBq$X(X3jPa<*zC6KTki zMB|zamIMWXWZ2ZF7ax$&qv+%z<3Ne~{nq?zCQjMP1g?~Mgp^?-Mj0uNw&J_Fn#}%G zMl(XXt__m!tLx|%>8B&5g~b{P((PI&qYLZ2hISw+(Nvs;@~ZT|r7vcUQF+yuzi2_y zVf3OiRieXc>1~gdv#Jh&sye9nvw9eEGz&8pHMy)tj3?&$?)4KcAaV_sR+qtf1=R|z zwnLQ?I4~X%I1GW3SCPX4(5fRXB~Nv!%T*gu4h@_fq^=N<2OhgXSZVUjw*$!luI9s12Br&EwnS(&I$=EAfAh1T=? zh{gtEeli$(98cXdE=Sj##t-5vTTD(LNzWWJ^f6Cl$y(b4U6semPiHo40dNCxp_|!OPis#dj7p6aB$0(Rj`(cW z?TrP*g%05|;nW8LNk1yr<#R)^bCYZ7Yes>?a`Oq2czI!l7m7snS*)IKauNL1a&5U1 zr(<#y{vjHc8@ln~OmsZwEQM~L#5A{pjNEoa_th^ZEiWSn4;&~SKt&7VV67UHjeDS8 zn&QUNSQ+{Tp)<946TT zPoyGhO2s!79Q{#4*r&pDp8qTe6HiVg z)WzCV)H1jxIdrECnMW|WEawhc3 zav3a6B`~`1BNbyBr~-m?5HOTkMLX=Xg)pmy()0y(Yq^$+&t@lUs!%#&_oUrqe_pl3 z+7QuO$PhEAU;?3d;@qU8iZG-~XsYR`2u-3=QG!&j&hi_l%y4K8L+*WFTe7anUqv;O zZZ8!L3^A?Q`XZKN&)}MqXi08)!EAo5R%Ihf{Zv-7-*8n?{pu3^EE_9tTKm9HNXNe6 z>iz)H>^uFY8C$_a?5lMQ9J$^yUTCj@{=I$ zA{ks-_% z_$Z)z5ME+`rFEs+jPSp8rGoD*mlw-58VIanj#BGB(Tk={wzT;wMgW`0u8t!46z(IM z$ckUkkizD6ole-R9kIDxs1x?JHf(;zAufkyl!YoTs(|USJKl@d#Jj1X*cF;=~?=Jwt(`V*1q(q-N{s(lF*3)Ej>7 zDiPbIct}u0h}iB#-4tqdeDA%iG!5*=BS}8i<8R!h#8kdY zEL|oT`^t9098h7b4|$zNO(mU5ty$5xtcG&E^b9p4UNo)R*{*MbN%hQNcF;A_q-tg` zueWO@F^lb(o$5x5T+WO>GWuv-@|*&g$%hbjD`yHJgvNHJ7(!M81+ZG$V!l8--$pxt z80`RJv;#;d+LQ!n7uskC5ThMHjCKHNqsROdWAZi=*N zcW2TJY$u(9#-s)6NuzS$zY@)EBsOTOk=n#MT(%*>zBL=F1eMNO)voJ*H9<)UT?N~^ ztHrc&U5;A1a4VO(aFfe(@getKuKTmbIo5!oWP{v*nCioR@v!PnY=W9fSrQmb?bVA_ z4EvxJ3F%yYe~vMRqF^hb7ds=Q7Z9767!ZhxUZcp(dhbTteWuQR^EpB>%IC6ZLNCaT zulk~gT^rK0`Vi;^wyI>df16^kz9gLu0hT!Fm{c-i$cH#BJwvfgjPD-ooVV(8^~2~DHX4vfG{^fo zqwD);aDlIYb|hHAE+aFxeL--& zeQd2l=9S<{v9JD{9#MXBI-v=yThBf zrSh)f!d=669ViSJ^ZC4|B9wIN4s6?ebx{^)HxHwOZprv9@={IwXAp_@c#MNel-^ZX zLQm`RyX%b_HkbG(y-z9FLW=!<$wpVP)?KO5`YXj0wPeR&6um-fyat_3L9+iaUkEng z9>jjCt}KxoT;z^(tSUM&5)ip7*a4bhNhm_WGXj=ESFJjxhvR{z7CQ6 zdfCZ`s=6ML^|F&PLF*A&FFW~gd;B^?3hQR);N}EdST{R|HYeD^y4eXW>N?peu9uy{ zXkd-jBeGt0un|5uSfRVd7T3!THq&<}(rM|QS6oz&_-KH(b1TBSlUcgv(0WTI#F?&o!LgY1^Q;`tyXG`Gf^*DVIZkvRQ zVNFaORMAfDwVYIuPlmD<6S5eUx-351U`M<}@RVoSyV(m{_YhP)jNPaWx=Q_!2b(x^1A)N6AY z$)%~KjCRMIqD)WlxU!R2YCM6%xVU00W-Vo84u+@Ww3n&K4b<#>6&&u+Xpvw-EKMzJ z?l+`%9`l_6TW!_zV0h}zhSbj0S1OHwFOo~iE$l^XNNuWGtLQ;qiNb}{4uyyKv{Tc% zaH^^2iJZfzF~eD!w?kp)q>F|mrsD*^pVn(B@uhf68Q3=Ml`_TWiV5!foy4lb*(=$a znxYn-2$VYeXcOJ@Y0kCCDK{V)j+=~$^rAmGzblq^$V519DvrsxNjjv-(BOQfi8DZP z=odfxV2WqH9?jz{9j&3W6&*^q4d3)^1?$@if0n#~=##P}ol|qu%lU)Tam|_*1({wR zOPN|Z9>hcwMIVUv-B*)kq-_e|GukbmHa^^3KF^mi;?;`&TC)o4xY<)sz`8ynBSg$@ zRJY)C7X7f7ffBKO^SZ@LRbV*}C7oihqus|aH-pl=_IFu?c5*WOjH*X^MTWorz291a9ry0VoT`mU-yZUQ2**( zhJ^2lSLmkIsGU{JCF2dHpRt%uxCaRmf zDbRvqjJ6j82pNCWSep!}miU;9O$hp^nx1{|?0xV{!vq%ysVnux@1J z6tEaKc*$~8kg!)whN*{{Dt06jS*HBiW&t1is@x=C)!R01xKIQol{)Y`iNw|#+ysCF zct3S^a_ZCsfnxL(fn@wIdQgtX{{Gi2o@3{aXAUxH*>2M;o{bK)K(nwM57OJ95E2FL zrdb=1$*M#*&Dwwrqiw8N$o2Y}q6%PHRs5{0Ss*otHF?eH(licR!+C|%Ist#OR=(WC zXYcv)Y^&ZtLwl@NL%)A6dcsZsME`9Db{<*Px}VcklOL8e zqMev-Vl#SO7P?_E?2=U*C7~FRZt{TokU0+%UNSH)Ij5S1cnL$T%ED5UXXf?q$Q%(Oi06u5Nr>6OBoVuu6!sT!s*@A-=t60e@fBi{me)FaU^zXnod#=_E5aUfE z2+W*SW`3?C!m8fn5Hi0Z0LQ@h@94mi>?{p-1xbFwZApxlJu}QW(*@_6bKO?T4Wr=X zH5}QM5w9o`3YUu{V+kwJXU8wkmYnn4Bh4iXSr!ZHsR*_+N^;6&n+Sr_?d+nq(}@%S zni|i`B-pFuWlLtI&}`SPkEz874T}#~5mKHz7VYbQRM2{d0Ih$#PusygsV%r7>#oP~ z1gN_4(zbhZp}!o+LoG>m^rmovqjT0j5GNKRczJDS)cCBjzxmiJ^MwH7W)KdkT@Pw6P{<63Wd$V6Nc(8UDz=Ixu-EXgo@jd{5CAU#a2Pq zMKKhX3zn06_3{FM!k>mAjRDr_wpTEO6Ru;8^r zfg}u^aEH?+M3(EH8DS`!I0-^9jSJhg3}N~69n$T97)ohleIrUeQ2mNUM!z&}Nh2EA zzHpm9${_T5?UMMkT}nHRz-R6byP|F*`4)IATYZP zRyTE)KvJ$MC9}}$od+Q0qawj}3omXcHw6Al&ih0Rzv~FxzJ?wCDTVnS?bQ$K7$o(I zcHD>Aq?D!6Nl%{x%#8%?d*)4Pq&iUje1|RULZapAyt7^F3Zh6vsVhkr*@Hz7b(gx< zp;I`6Db_Fb>D$6C53vXxM2Q({Uy z?$4N=^+>*9jQwi3I`4iK#S+Z;1HOFMfQ67@jRd7ml{A^CCgE>;Ja5h@FyYqJwS9$v zbQz>gV@phuh=Y#8I{SNN6qVV%YxqnIbpwM$Aq1C$Ri&jyh9HFbUX)objR2u)n+om2 z3qR2@e6#y%g%%@Lh?hXj)C9>PhfqKXCL!b?D@28LbdG}({PpAdG_>T>3ZR!825)*$608iI#^Z= zR#a4erP~=%G-VP83yQh%Qlmn2h~RUFAnFct#}iV*G(i<;x~t1IWnQqfQxWoYUJR;PBT!Z}=r`U`Kh)S7RKn7cgX){k+j&xG z*Bn$?5RU(1{smj0)hjxyby`$g{rGD<#KKhz5zD8e(t*`P>DWZXLW4~XHyTR``vS;j z0Wz=gnA(Ea!?;7OEtcn6Nkb5cW>Rt)ojcEbT*gIHB3eu)pmQkA(NOdRVNW2J(!a;M zDUpo_eFH~BAy!K9#5dHopjh&0#z`#;jZ?6X`fBA$br#1X#T%)4M@7hdd$r07^Ik}1 z9i`@n)hh4R*%UTi0rIc3S|P&5)rwTJ)hgzrBg3)UyxM97VT3k8>V(#hpk@Gx{ghW% ztq{3ewPMg;@@j=FynfY+#J;E1$}h2h71atGG}fsPHv?0Z_R{5Gst zQLT!sR@Rk92Nan`f76bklwE*+*EYUvvxk~!dyH+9RB3EI5R&AiW7{E`cIS1gVVsDb zUXVm%C$=fu(vwp}gkyX+t)nMy6WrQCW>t#6BU`$hd*EiqIEA8SgM@imd;GmQK9-M@ z2l(C$9xz~liko<>-_0XpWRTZ!VvRBaPgubaAJVCtx4WIq8P3`91Q_|)(~&d<8fP~t z2TbTu28e5g)@k}yrOFYQA4}K-gMvVTFZ^Dxf(%<2$2W4$4Lkn+6f+Ccv4F)ZkOd!4 zKJcpSNmB|RVfKN{((^*COH@h620e;T@yTWBSiXTJgjkCqqofG%Z?#_}vrT8Nss@v_O| zj<7gky?=ksmv4U`B}<3qvl`}NBnTBHiDK1c&O1;Okd~pqIE@YDmutv zrFZ|1?*noDz_E~A@qVJduuxwN?sxyuIqp2KMCVSNoSZs#ehOC);7a%ec;DHHNP2D~ zBX)v7Vd7Y$QNE@(hTfy6ax9dWa2!E$Td16RFfx+5FI0~20OI6ih}sm?nDjd2j2LpT zRBlw8^+oJd!SQnIkxed{kFU1pN3k&dnS4g;an440LGHT8`akYYM-$V$Ql6`?;CO0m z`^Wr?TC2F8aKpWi!&WM+EDV#|WZME1JW)*@k3d2=rFyQS8?u_RA1bJOakxz1cMle! zXt3o#Sg%~e!EiX0!_L>@c_EgbtT{Kv1Mr1vb2+{`o^Yti>3V%hHVFmj2EK1`F3dd6 z+H2q(k#lI)(GKuZ^&l&mz_LHJO-v6~!ecvm3cI%4I9_S3R4R+caymTB2hIgZ#f5fN zYP_?(GxXsUST*HLc{SNoH8N7bj9-MUCe6BDy{ZOPS&daoltv`)ZR>1#;e4eAJqnHk zEJZb*Hq@qdqFg}rhhvm-aco#juU|mW{sI;N`13G?9-_gl=RB36MC&}7o#&Cp@^q=5 z131#zjIic!WF%Rf{d&I1B2p{`r#A6~!lqm+EXNkk@j!uy=0v`M>j@s^XsLp2KTy9~ zwWVh;50l30$x}kh&WVhR^+dUb!|7pa!0kEZ<8-x!6K#CEc~w!NWhZDFhE#2Rcr<^W zXG@9>igL);#5SadmNvpTjv8>jzCt~2i*4F(aICMimB{l6!~Ht~l}o_T8+?A9w<^FD z%REG~hB^*Iw_L+{f0bx?5nIt}72F5PLTTC7ka$I{ou=OmBA^e(LvDBwUtK_N@9F}|-LSFYlZ-rSb^-MfrO?76 z^rLa}bvJxR=tH}8cXa2StH?AHdR!g8rl}CZO=LoehbAMgG=z6Y*HVZ=?k88A+7p1d|^{_Y!ePMa_iog3{7Ex;zOmu_Nxk{_j z*uPX>Tx5Se*Ocb287)@I4Pj-bjLM3%>of0@!@8=?^3oCm1DP;o7AKNHEo~t~b-iRE zOh_q5~A$q|v1`A<|a0TtlC~S*guia|{(5$mBXz1UPIg zXhjmiq>%3Hf`m<2T97P>R&e~~612BwWs@qX24y+ls4s}bV8JrH;jr7F)*;;qnmXcz zr!;xstm7$Y?VAyUTSY>0fZWITUw^Q4cfgE%Q#mM2cfaHHihPK z^Wl2+5?T*i&mun82ON|-`q6G9NO0;#h3gQbG4L}F$KwBki` zwpD+s{vd3i9fVehc%$n)hRRlZGFjwo?D`1tZTIu*=Nu_6;3m%Q$#e-x=u2C-K`J~& zmdT_t%S@yJ3DJ$1PAVYDZjd@AG}fnA@b&~X721{=R%o#!2du`KFu6J%mg8Q`NqHl* z5j!~3z5^wm7)k469d7JdYE@^^gTj1P+^>wsG_`u8c_zLH{gJUpqoe7mni3W00IsWH zU(Wxf#&|0&+6OER4{^I=DeeKG+X*YAvJqB@+nE;mW=QzA8~4QOo+3`qMtITWaflvC z(huDN%fnV4XVi-wsj{ckjL-U`-C^&tYNa6iwdBBG-@C?%U+F&H0JOrohB)8UcN(IH zb;>|&#H`vSZ;H(}Wawaabns|uWX=&S%+JE~yrzg#Tv~D%iHvHcBOd2~;5vG$=oLHdIhJ4JMWT;)2mg_gc^6qEx5#ebre zk!DG&oyI6x7f+^IY<|)}(u}j?fWnFGJ&vxg*RX+3ZM9~~G`_PvL+z$^qxP{DuZudZ zRz8l9j-nGJ=nuuxLR|%QC27^Itx_W0fJ_v2BjR*o#=_usW>R!y5ZRLc-@D~T1LiZ# zWHK0CAFGW}lJLglQn<>WRHUF=1imoN;!F~zjL__vCpE1UqN6%g1Am%_AOLi|&IQm| z++lq_iGI>tARh@ki+)8|-x1DZb2SrC^(i#*K&&*b;(n%bY_dlaDPgF)1DM`s1KYGQ-x)O4%6QOz}{?gE|n~ z>nCeJn|BgH2aH}Y^B$!Z15ekO?L87m# zpi=3DLR%-5cEPn#Ns5$oD92aXEyl<)JIkG>P5O`~FVpN?&g>U=3BhprNQQjb&uEb@ zpN!xMs&=j_DIwh5&ZQ6cmeC&=PLg~~>4H~4lne!!i4J{eerF_t@CDWctub$fsvBN6P?ZoPx6ab3&w>^qfQsPut=Iul2+Ch5a8pRZt^4y}!SWQU2?$!v^EwV7Z$ zw1`&EH$mRyQoPpSg~2e@JnF@o0BLAuFihex4e?Y1#=yS)B9&@~MwOKvaKuZ^fHn1 zOw+!HN}kyv*LcAS5llxF9$QE%a;BX#9#WH9F%yz^rD$1W_V~0#;|v$#*%aA8$SLu) z6jV@3(5BQhz~<7_qj_Pzhb*2=pandb=Eho!qQo>zoC+|5Vk%-?QDs&W=i6XAo@sob zdQ@fAVO0uI)EZPe)DEsAG}=f~xcPxwpZC4akR9SV2}9PQ?#GkXW=VW?G+oeYD8L8i zaQZT?$Pw!y6GV&6Y6~lMsegiJtKCqUdEo1EW^tRRd~9K+Yw%ey7B!$ev=nk+l#}3z z`bug+nIRm*%=mnD7Rv>?kw{?}l@EwItHtG4PfnaH%LP{K5oqOTMwQkqPMpGQR4IyY zx02ghvFtULqUpJy<*xD`sX_^z8NTEX+RGSRf4P)uwMj1~%S*Gw3I~)8N3Mj@_kkEc zchxs-K7FxhI7}gb;NaN7!lBZE(YwY*Lw|mr24ETU^!X8->kza$LR=Rp$bD<#FGRQ` zJDbbvD=?oF+jbnzpcl|KvFe25@RfSwF&$$zZ~+zW>9HA5J(&+;#U5CU*sowdu-a@c zS8Rnnx8n2eT?{ADb;t4)8K7dV39QQ!FB4wmcWFs(feWiJdc~w7<`2tr@56Me;9tdT zAJ)vg53??~g?N>rSapP;a%*_l$Ih{gW!@6OWERVtYR!5~Z}ti&5~BN;mi4sd=I{xu zmuU>CqcfYFC)HYYro33bTxqD#*wNKBszZ8}+DUv|s_}?$2oS7W5phn4%}yTQW++I^ zZ)m?(^^lb+#$`CasNham7({KX@`KVmA?Vsbd|mBEF>(odm`w2H5oZIjoyns;j3-tq zn6Bk&C0^i+!8&EmRbrQ~M=K4i_Ti*5WQ$rZu;GC0;3C&rd~)aTielni z?vWACJ;#K?Dp!`FYR^@y4<689IvwZ?44yn;Hi^g~22;)z289PqW(*95fqqG_?~NFz zOogRk*$Ii8hNLJGRq9&MJ7f_`?JVL>vednk2JLbwD6YIl<-#E+aVM@0`82BN7)XCm zE4nWW?)AsU4&CR$jbSJYd4Q(ni&dpWk^M)!9(i>YJ4|rGFt4|z?-~kVc|qHL?QwRB zNeV(@cIK`}^4#c?j+wqN(^HTQct{gAwZJnW7#XR?XaBPBr%}OcbGWhM8rCD%o6|8b zFhA(xR_Afxc90XH_Cy2D6U^?x;lfxkKXxFUT_ncsR-RXE-w~hYnLZ}$6H2p=9(HG8 zaN{{r<&L0P+zpJQODO|NUQ*+h9t7hdZEc77MFET2u}EJt;LqnWGK&~EXe`;|W0}+q z?!vziw37=|`gX*UC#c63$i^NJf~yQkX@enR2c&H~Bt*gU2*7zaZLy6{wxbD@0l*Wd zN)|m1c5~s;)OD|uge1tzHQTC0Bp#o@(>9=gkK6?TBAY3yk`+bNyby6r5q%oz7?PUC z&|O-Lk#FB3r_xPtWAkw(itWL(lG1%~SPjm-YcY$ueN7HP;}H@RiH2E~p63P7=qp29 zysq3TGJL$yJY9_mG=n9Pqb2IQMd!*qv+!tEQ8B=X@7pO}lNICMAaTTRpj?hd92N=A zz@V=jVLHWVo@;Y=cW|WVFO)7I+ypy9xnIZ2vJWj^wxr za#bn{yHmn*6N7ag-~tpFX(K1ZkV7bm@CGhWBn3{qlZ-v2Ce_aD0n|roFp2RQiu~~> z;hPV|VoOa|QG;UsjztLV@R9~~x0MJ2s4FGb5sDNagIry%rz#RUjTfXHb zE)F^xCm}4yQ=m}2{WJ4kn~irSu8|Tp($SJACM3?A4dyhhJB51?7#P%PX=4als~f0H z9s}`mQ%hI-l*NrxWTeYJ$yv^9rqx*c)*_l_JVAXz=CsoDlW`yv z(1+LJ%*=8XPg*rGnYM7X!@<@#rrYqu{?9}1g1OQU9MqMUhpbkLNK>;kyBaq6)bnq z4dQP0@I_QK1T0o7kL|xWSD#(xq)GGQWu?Z+lNF_wybg2fpONT>)J`0}h)tg{wTYP8 zrg+1gTD)`pH8M6El1lc*ivhSW8ElTXd2?I=f9mYHhp<}u@u0(0iZGENi?AcC<@Yxc zg$An_os}L8Tm8e4UNRJh7r32DzRPeglD{e@wO}_v$p9>Ky(ajm|)oYT@F0AP##0vx~z8--KCa+d$=p#wQ9k)jr2@$&?}Q|h-+Irs#{=)c8CCkz|@-}(omJ)=F&z5U4Voq6Qm zf6;^2SM=NfY#z+Pc<=Aks2_tThgZ`6wV(ctv!BEJIABw785Ta@g2&_j&TR`{zUgu2 zJ_8tW85TYd!Q*lN_TQQLi7FB&IpQ)be1^b_$NlP8Zg}9I-QnE-Z9Fh6eEydJ_vsIP z_UJ#_?c8<1NS9$h$j=sJ?zlU0^DYXqX9wi@#P&xY_U@S~k7KFNx1!wnfk-YQ)NdNH z2^N>6Ht;QAIFG0Y-O-zSuGE?}xueOAuI3$mQ{~3xO3UFYrvuZY0=W;jmtJ$U7b4a{ zx9euUycCJoo!*nU+jlwlEcohiPYeFAyXWRDfNghD9~5z&zi)QuZtii^&@DzsseAaA z08Tl0__hGPEr9O~;5!5Ot^f}9VmiA6I8-Wz?+M_{u1|Mw0FMHA6u|cd@O=S%G=S#< zcqxDn1@Q3zJ{rI$0(dEaKM=sj0{H0wek6dO3*h4coOR0QcOrm49Kat4;1>h<=>UEy zfS(KCa{+uRfL{sV4+roX;DgYsWw<>KRut}fkMhpSlIYYDe1}0}8w&p;?g(|&FXF+- zYq@gIdIS+hn!V7|X9Aj^58$5(;Lir|&js)=2Joi>_|pOWlL7ph0RE`}{+R&&bO5If z_k2DXz&{?qKN7&73g90N;GYcO9}nQ43gB}AoU--lUJ2l>0A35=s{wo|fIktyL%p~Z zz(c+8dc<jCM6dhP20;h|ppdO&zsFUJG=VZEFP z;9p>4v-V>D2%KnpfB%`STl+q^gs|;|ztH~OYdEx2J#L#<}go{ii|bE&cEATl+}=I}v+d|FF>B-G4ew z8x*1xb+LUt;CY*Cq0nhx_s%oO1VYiiq}B)8uhS z>m(S^W|~u)CZnd(^zdw&9-dBfX47ekz96w|K1E*)9;PY!VsO#BEoW|?c!P6GZw3v( zMK5mHx~p$j|Br7i^ey$jdF$F*-%$UatF!uKE-P(u0w~{ZsGbZ`i*MEn+m+&`-->8I*_TMW|QW`>Ddi(bD zD__KpB(jS>*$W)xka7U7%3`lnE{0H2nqSt` zBmMjFS0x>Zq%@2bjd|I&bKgEx(i?g{`25xn{upZMq5e}W-R(QU0?QXw{4FeD0NzYl zN*Ujd*t-$3kEM(d(mbL(<1G@|sU~PSvs6T$+i#Lm+>JPt+Nk7eue?VHyIo3~ayt!~ zfJ3BlJM-Cphj74jOg0GF10N}oy3wFqpe-!<-Q-p@M|Ei*=(Fth_80M2${um4S)&NK zM?y$(2vBOu9u;sydx`b(iv5$BmUb(6KFX1 z^^5*N2bkU)`wvkUfbmw*h5^wAHLyF8f96?rjQY7p_}M2Vy${^c;Ia%Tr&uS9+r8WO z^dBZ1{<|e-q!w+zMdh-6C$x^5klTK%l*>NQks4&uRbBBZ>=SJ{3;TB?>;d|U_g7l? zH?a82pX_?h&l}m~=%)LR-p??~iX6XfMAloUMOFU(e?NU z(jz)A9lGLXs2%v!XD@&KkkOro^QEU-!pD+5SRH_L(Y2K zrQRtwivC$bm$p9)n?jh+KhyMK4+n74`&T!T-jf_q#Q3D;;i0@p$HOVFKrS4Dulsmj zSVosHVbkM2mug4Ji-%|1G!K_HEs)jch0Z0Bk*7}{cS)YuD@^i4_>jTLsK;lzLn!1P zcO=CRW#Hi>aBUBLvrP&UtrZq!h^X&zOV9(H2^ocKecFGqGn z0bKHA@O=TCd3r+NFK^EUaOP$aXy2IO7gPxfSG@PL%-Cna4^hx9$1dJyo)EBq;uLy+G?h`#O<(s)Vo^n6d4CiA*Q>drGg0-rdqH2c-kzdkBB|^ zmdqu4IB9=gXn#@aYe4%I*&3z&3`S8&8BtcBlQbvdx@~-Kr~@H?LsExJY&PTaCv6Yk z4LJFJqsWBkjsURE6VkpU{Jr>wENu@bZI90~R`_YjPp>LL=*~;~gq67BMK6b7SpqqENe*zuAlYOV*KfQA_ zLVBEkvpyA8%3Q@t9bMnBnGTfamF4>U8(II-<66qi!?Stw@IByxd7H7ky#zp?&)eNw z2m5}07e*ml`o?AK67}DVKI0I3$vgM$L6&ds|FNErJ-_uvWcn~N{3i5Jx4^ww`nS>c z9sRomA3aOpv)tHNZgcamsNMf4;`Bh1DX%ckoKx>XZ**S(XSpf-^C{h@EIb|Jb54F7 zE=IXr|0!?l{n2#U-Pz*yNxC1G{zH(bS5$}235_|-i6wa=?;bt|ILn2Y7B@rpC|M>Euym#FqI@#7g z^6*e6DOV4tPO^M7UHO8!exeBV>5|TiZ|YnZJUmR7GWT$%%R0Unavp{3GIjjp7p;!} z!mhuVI=&|P+S_IuJv^H)4`;r-E}b;p_{iHby73EpR5z}yJ&9~WC3^mw7oi)Sw1R!Q zqBO?@*jh4Jqh`z^=t1he9H9esdIsTvE|s?-g3NN?M6-VvbQZS9-hsM zhcho;r@ml1_4T(qx7FJlPQpC31+&9vF=w(1Q%hUWZg9?IZO!JDb7&qo&9DbZqX_2g zVsGDs%^(k*mKo$<{NmQPVs7eg%r=9}_P1ez352$f_1_Pvyt)4YOg?e4%jTWodYZQa z&N=Me{Ub1LZv+E0Yciv~bLe!?N5!HAB6z|0u#=O@D`JeM`#rIm}Ba4Yj9OZVLZ;PpIpcI0ua0?>HiO zIP=*O__&)0;7rrQ9{`+uGoEv;WpUQ|qqMbs-G=^Ek2~i^flnRtHtTZ{+CHyeoVNYN z7j=e?bFw?5wWm;jZtoxK`I~Duo-P$T^ zNmfCFlG)YsuKzOf_a1-j&z}9ozrE)-7C-mlU)MD!yLy_R_z#!={)_K?|K*o{^%ISs zd&kc@S+|0<5nmtJ{!{coKFwAxJ}=G9= z&UFrO*35O!o8MfSKVvxO(MYC*J~;j6N*|m4OA4293;i5p5T9cT`puPj4*H+7aLxtL zZ?4Rd(a*UuxH8W{Kj%B>=R6tx=DI89H&^C47|!_);y-QS=DO$2Z?5~g`OTI25XR@c z2;=Wncg6c%9x(?IJPIf=PcY@_f_+o>%L)rbKOpuEyg$39WlST zGB3dJIfc7VTDZCHS@WCgUNFD8?j`e^>$YHifb`6Dk@?M)`38n_-T|)6Gths@{7)FZ zxia6t@TV>OOBQafd&&Ify4@I`5#LV6!CLTp6DepW}4$^A!s>*L}F9^Kr!g zsD+y=^KlI4yd1+h4@bYbGH*>k=dT&Q6OAeT=E__z{haezqyX{pA0wG zea8Iex);oEu6xP+<~oP(B#dva+iQMv-MIP9mG39S=l2r0?uvz*>po(BbKR%RZ?5~i z`OS4-F~7O)8|F9H?ZUTirf05vKc}DH(V0HKZPRbAYnk6%_mug~b)PrCx$djxH`i^! zya(x->vHBd*F9iqgCQt~+Oba~;RP#5dP{%KYZK&zs*|84IG@yvDH~T=%lNYv#J0 zAjWWW-H`dsm9Z+rIc8=2B?~v#ecb%!y3d*4T=y08o9n(|eskSk5G8$c-4XMf>o`7R zxVi2l<~P@U%KYZacmrMAHI6&rx);=4GgrnC4Ch#a;k(f9r{7$6+Wh7^ju#kiu8arh z=eU6JKV{+Oy3d>6T=%T`&2`V4-(2^S`OS44E0DgqE;7HlZp!@Tx`)kgu3I&~x$X(` zo9ou#N0)caTOfPb>A|-xo$Tm6ByrIS2Dl3ZVLW)AlzJc#r)>F zC(LiI`;__3bzg!%hxq2YubJOm=PC+K^86+cWvp%dfen=bc{VVX$h^e(~eG5BS?^WpsbC|pc2$iwfVm+&?&K8%eG z|F{spc4zo+nf7Qe6J$N9Mk!kEDC3Vt8O?^*o5hTpgG%VD1D zG=4Swp2F`-`29Y9-^TAR#9_Q$PEJ&G?{j^(kT=4e!&1tJ-!r|OKPdbvE@1B^ zXqp=~89L_vqvny}+uRB4o@|`I|M;}r#lc`tZ>Kv}pT>2?MT-N=ax2rm3B34cm%}M{ zmFemEmDHNf)411dqB1`{?H74Ylv`z{dlT{vm5}^W?v#t>vDfW_KPwmFr17@6TL8mu zy<4DmLWeRVj+gVTcz+9gyWuAE)qe}(QSHXbLVM4x4EOYI6MD*@PnUI* z>C*LhZxg&8x7Wf*6Fm0bj*%DXQFdB(co}!PA9uARbRwfen(wf9d?$aT&-Wh<;FK9@ z6Hfm4ev5natxWTshy%y1^|(J~_`3pJ@<`m9+*?FueZ7}fFjFshgA%4`-5KJ6){X#g ze}Fd};Bj5eZM|Osw$d97@bZR-z`yY4#^28OjFAiQRK#xr^UycB?|zqM^WE>NQF;;Y z{9(#eY#;y8}m_i?n01 z&ELg!mTeaGachs-oY$Lw=4mL-Qz6b%$>~W9&4B+2Cx?+}KmecWkpH<%{y+44eeNIR zdfn=KdoTyo%wpd-T!x!S< zOjbRd2m9$U4KbuMeIBL8lc8|HavDF4&aMbdS4`FXosg2G70I9BVe(?<4rH)CBOTc~ zc?dGu&#;5%&z7)I9)YH3Qy8_l8<@o783E0l#TLo(E@#V}_8ECMRu7GiE=-DsUch;$IB%p;xr|;{rIDNA zDTj}Tr)#X1B3^`Y4u?Qn&NTbcyRqrz0xssQ^Ta5eNR&{t2no5ef(pW+x8cWfzY!}js zF^{9Dj@58d?F1~vLkm;Yg$k}P&?lr^I1pw#SiRw0UM2$QHSF@>}~6pMkxQ)L-lmJ*w)G+RMj&0dB^ zDac?{>Le{stbT$gBV**QM$@RJGL=%Uj>I7P)AhNN&?#DjYyqT*9SC)ykl{?s-(?(z zW;bH7$*VLTl+&^FvH^A+;>un;n963#wj8f7R?e8wNi~Uw22lNEs$vEx3oRV2Y8I_g zUzuJgzpviVVlTqxUlua0)kkm-gjlvD@x;>P3x(2XD)AGwdh5yse_=z|AdfNirOMna zG2)a>%>?M9AxSl+L6S*+OQQ!h$^IS5VQhLFS(a+tW7Lz#{^AZ~OU`U7fE9nNTgEW? zKCzs+cHhG%9(?fpM5ZCU6EoJvNarPVgjq=#pa2Y;*|1snL|! zN;->4ZV!fB7Ol&K5(+YM2q=2S9Qx8Y*t1fYIHC%2k8~HTAA}fjKd&XdOFJhUmqoWK zk;R>y4Dp(&do*Iz+5E&Elo!T#<{B=9ABujWa_w;8P-(PyXsmef0PYvv?DXHrNb#<* z1EZzVp+it&t9?@UAqkzfY%_3Sy+_qk^X%hfrZs)!bevKUhuV>v>hw|4O|v(@l1?%O z8Y6eGmJ!<%7T;v6u{_J-n^VhmWb^X5CrVABrus%LIq{uG=7~=5dW+7R=>1v0T`syn z&u2EDoKo1<;o|U-!!J0<4F55+W~fp-Eysp#KY4h>5jy4=F`KuNGM3v_Uk13P+E67NSsEXxbg87w6;uneCMz&#WQ zknlm?XAs|U#9aA%NfJg3gTp%ImG@s9WvZzMQE?9g!&D3b_O#_dFhp4B4=t zL)i)cxShmGLSx%SUO4KU$L33{t`bE)i6FUEnR|&6Ea&d$*6ra$?_d>(?zK)xZdvod zTSW$7%eB^18*ueA{>!rS*8$qe76BHWo8)XUgg;Db!X zN+>?5U7DjimE8W+*qU*G?d7>#z#RlQWS(^uIUnq+iicm>1z~IHXO_-*WL~x zScv#rAb%Hr6CT6(pq%HV zNe2bq>jWpb#3YtYeBBCB;^dVCXy`R21%Eq6ih1yLeGqqLjOND<74C}UYNA7>!a=!! z1m;=qrO^zCQpdO=F+>#Xq{(A`$i^TkBUhutg?u5O_i7QBlVnD-L`)IC$L&T9m(mX( zI5Y}I|Nr*R1kUm+tLrc07-qr*W`<$c;mtUNs!DfP*V0QelL?*f^h`9}>FMrd29mLP zRsAacCa>yM>b>eM0ivJ+vZ)}hD2R%ps4OZdI*PaeiW@2lh>D6EFf1;gj}X7VbI!g0 z`~SbCddo)!^14sG|GUe%=bn4cxy%3Fb2Fc6Bs$K(mXao9uDQW#(qt6Dr;6RC#QPIf zNha!e?A92PjImqTDwaFrN-0)b8SaI!bCN6dwD2B$GB=LGSZ@JpdkE$uE{%&LxyMB` zMDBXhYIsw$j0u|ezR?DWcZt?2J?|UJ)kYW6@x1jkA!LkXDOGn#WzmE=J?{J%GH^Ca zayUBwR4~8ELW0QRm~7mv8f0yA%V#dWVR&%~jq%KF6tPkNoL>Skb_or!!$}v=c!P*< zhO~BdOmHAtNY(ReW4!pRn~*^ME%Qjv%CTDtb4#vfZWI8k#g%cb9K?YbAcJjd9P#Q@bXf1(OXZG`J0r_!8N=5^9j(!Q#& z>ruyL^?Ile22_z=Xw)$mcKvEodB#dR_av+@eHhVh4* zsdbY9rjjwqR1geT_**HCF;#ewSH&cDQeclcl48h`OC$xKT8WZ%*ituk^*$vVOYh?n zo84Fnc}?ckm{}A>FbSGuyC`7)iF2D)vuK{fOl;(agj{Lq3c=UZd*liir5>_Qj0BWQ zipZC#B_DB#QANH~o^veCxDL5ZB+@UJG7H?GHY~W;(n<|#HE8j=UgvglSX~s$yq>!| zN#GeuF|Ro6mVs*UkkoZQiX*UF<}#;AV2JpJ-P6V?;}YF0YtCp+Ge9r7n)IcP$m&7a zgUjn-pS<#=d9#iPg{gHtsW_V0XQK7u2Ds}S#g%NEY31nrHkrKEY+Js z7Yyl&y?i~QgdoYRHHhCD?7$q{izgx?|m==z1B}#xQX0)`XW|(R)uo zqLziON_7(*)@j<0Y%i*=Gm6^sTSo0yy`y*47dMK5PEGaU17(j7Cy%6M2wfi8B-nK; z1e26bJS$wMYA@>!Bn>+PQ&AGpp?j2@$<)(jWHM*Er_p+&v6O^{wkHNfi_vAOl%kp$ zXK=|A%1~Ltz!UnLrgC}W;_{MKg`~ku_Qa@a^5UYFW=Q<1R6k9sOw`n{HG`}G*q|X? zx)R*81`~2F(=Shz7kJ#t6>lLC^!?>qNgp^wBb&wBU#5lu<MJit7?bkt5QB{Z>ppQ=M7TND_@pU4=@>s%fP}azY;62I^4= zs|=6`up3X6+VWHb#>6^;B})3DDtza@6sCJ71v&ySaw8OX?{wSin6dVdeHvXeo~-q8 z`)#fQ7r25|OEkHcHpLF2e92q)ZN>%4j^0^LLRodna`Y0Hf$ipK&(Xoz{(^@S`Pr~Q zqne`DnkGj~K<&Qb5GGsZPDX}IHbbjtqrMUX&&Ku9P-44Qy3DC|M%}A(z48_@SG! zCzouwi?*0pvR$-oqZ>*FkvDp=#V76TdE49GmPBILh?God@meI_=kHwRe1V>Eg)P)q zYhm7jBK3Md;<+I#Ee0dUdFftxH4@e`ev#kFQgL3YE&eSXHVO2ef+$02Jw<*cQ{~Y6 z1HD!;e~Z?PoaSXZwlRbRDkJM~FmHyK3?{AB~t zUgc1$)!O=7o*`7peT1Dx=B&_XnnY6cwpDT$o=EO18`>2~rXAg;Eq$u@dT#vFeX5?w zcoE5XZ8q&m4Wx|@<%L|e7X(&*yECxY4J#(R^}^ktVw8CGpo)^F*5iVl+fcQ)usv8` z@9z%TGubwGm${taBaEhU)Y2}5T_{(g^P00Ydb|=NwUx&=wVjwesb5BI4~vHn9a_=N zr)3`Ys;PW?<)%5krSx`=seJeH*i$Q?^T(IF=^Nv8QN*78-{`l^h|YKs^-hc}##MXYiymlM zF_w_?+vK#3s)#O&oRH2KU}BVJDyd&7s!=aG53W?7agF*K?D-rdDAa68U_C zN}q;(Ai`xz4}rl4!kVw9Wm&{LvKt0lnzezi6rfgaeFrOj6sujNDXJmbU2mFcYl!j% z#f?-Nk}JE>V~TNsq!t8sh}hTIMVn{7#EJd-QrDNREFafo4WpZ;%DWUbg371vE+x^2 znA{S{3Mxbp%O}^So|WQfWF@xBDnW6ItyK2!Frq+86&^VJWl*hnZj$$5uhKz~ntXl0 zJ%qhAjqJDkool?kUuTzbPo1db(@AZplRPBhGv!C-Ej4>i;e#VCM;Y$x3T1oHLwW-O{(?IVgepQ2^ z(WTz7&HvG*F7I2O-RksZAlSv+uI>9|6fM1svh`?2V70w|S?6JDX`l8&uA~hOwbVKo zGb#1eiK%rkXHx2GW2sk=I3;E>cb$%GKTilEU6T`@X&~KEOQ+WkQhcT3X+pYH(p4{D zG_4h86zixm=*@w`WD+fmhrIEjEbb6!=GL`B#d>WB%>lCCuTV4UIrLhD8rB?|-}+>% z)KykuE@8U@Em#8`@!{&vqAEL9xKb}*&uDNIGwp^Dw%AWs4^y4NzLWN@D&aU6k6038 zA_t2ko5pVDV0wPIJ=*DP4L3l={*G?X zlq=&YC+WsWRIVL-`rrq1%WDZ>ZK({=sB>+(43V*2TPZ`X6ao-hI#RvBy)=fq2npOp zNZ>9)CgBz*z`Z<%y9f!~MM&T-LdI~bMI?zXC0AGHMy&jgcmd$sP1W%FL>;$N%GEjF zUCPUlO435o9o3u$9-HutZ9jko~&n#A3eOZ?+ z$W?RB(B-x+M5LMLIH{NWV*=O;qrHiYbE0$360om2AUAKO`oXk$SVid*jL@}*V73Al zYG?I|M7pPtM3i&+`8nm-*Dj6{rg|tteFJf@Nf8CB^fNH(u-^OWyH5>9jCSS}D*nJE zg+65`ApQ9XhVwhUi(Nn6R2CVgP*^7oZGV-QZl8m z7jdp+ktD8fS5sJgI@g&frGGFHvcrVla-M&2F<8U?cs>jV$Z6`%v3XN1xo?TA%YEM&zC}Sfo%wDm6Kc9(RhX z?Smbz-+AyAp>{vOYYq3F5;IzZK;FLk>^tJWF#m&m9%Uh!^ z=>RpA39U~DN_3vnHKRRZ`N&G*Nn6ZyphP-Yui9!X!lkjqo@&3ic$R}`9NAjycWYZ) zZLUdmYJs)=uHJCI==bCnhu5E5y?XS?(&7(kx^3-Dds(kzQu zSQND;1NgL0Gt?#%*dFadUL0Srw8=h>t|D?YdkCCzI2}qA2Y3$nd7a0*m%IJBd|W4F zW_fP3i$x{1P6yK`*~uN@2}(n&!0Jln^Q|n8%k@+IR{iDn?&XH`Ew^{-Iwyuq}L#p?S-5MC90n)TxF#7?E42h zeGZqTPyL)yafFofe$_!&v({6w$@)9S8n)`hV7q;j*vv-&T|ssJaA~`Nrn*tZ!p*z-KCE12V^CG*9L=rd+n+2CG1!KpdTeFcq<;4 z#aG8R6_e^vL$Y)ONE!!EjS)2@%Qt|e;O1mXR`y1+RB$sRacf7nz0EPyPJg%i2pxAN zZ(}^Eooz1ts7^wW_{+Paqn7xl=l0ml4Rl)BT{x|Z_GEY|vp<)-6`63Oj*uBfox zhURM_r>s|v$rlbM-kEob|xs7Qk6 z+Q@XAJyv^oQdv1%C~5m>b8zS+o!;F%-tTSmDsijZ==AI2y;2&VnwOA@HiW7|_Vm(W zoM03m(q)ZXIa=wyw68I6jjsGzUIH;TKNDvir(!!?GXkZbkb?R691-I>TO*qT*Z@6a zENMGjdL5ZwQ}CU?w9_448uTwVI9JD3GujhtN}C>+V=(zdk&7Me7|W#9jLhNE$c(qC z@eOR@U*+7WvojLH3RxXn+1>Ant?8+yX#fwGUU&Ayc4ly;av~H`QsY}Wir5p|d8TGH zpEO`Bu^lO$_>5z7U3hHh{zT3&Yb-eC#MQ8sgOe!|Qkjn9dVf0T*VtFXR`UZiCcW0C zyskK*bHC@=R`yg}GqvU(B*)$?qJ8Lun)?N$}*c%xoW zAl*O4BQiD*sz-FaifP)bNXs~Wcs=sfRIV+5DD@JH6YVKSeAi0!8C_()ofh$tX}v}4 zSC+m?{t_qkZ$D(>_bKXw@DQ(OP2txM9TM z=pzu)+sRhsfy$?Ay9m7gk4`E3$+E8jPf$ivVcqW+jXW=_gJ<%5UqK_$Gmi?dd1Zo;vn; zBrU%JO%8H~O+$11iN~Kfo6{B#O=^}c?xxYG^s-Vb6VbGzQpx>UL5Dv&HC3?7?HD!M zC_+n}dn!BDf9yn+Nxc}<6aj~Le(dzQ^Pb9#z9$fx1nnox)!wgs$)eh63Q^RN$7WmV zHyZCz}7KV#iqIM{e- z^R>0zjSanld1UG7CGG#{ZL)c($15ANRkA`8Q?IhE=7tk5Ej_)wa^uO5$ayV0RIY7x zHhb$eI+zmL$hLF@rVTO-qeSM!XdMw|0Zj4c3);>;X;W?yVlTyNA+~j`7Q%MydM52j zE>c_=K6^R*k@aHud7&5lV@o6b#DyV;(FgXTj?J*!G4pm5o}%rCJP;odm%@yeMwqso zOU%l26+xr!=Jrry#Cz{)xOJj*c3H4L+)e@TIx~AsOUF2UQ@6$2;hZ=&=)wF=p3;(M zu86qz9^Tn&6K|0)PLk+YCMU?W|27KGzqOBuUA>hPvUDH-hwJy=Gl3*KS!yKFX143v zYm$#5DO=NLSWxC0&OLo~VAKz9$LrIX%Sg738MdojYZLaXH`r@}MB{3cWah93rs|~a z*;aG;J@Q%#VH8k!HnN&(+olyc)pwECxbRNo0mg4gMNB=wkMNimfy7%8YmFACc2iDo zMkFkIz%UZrXM>+-yz{PtE^hN4oD&5_QO0SVov6-XPIB)v=D5emPNRM)&f0(B4 z7c1IyfhMDHKGAmaCR2;W=GbxdtU4t}bkxvdU9xl#D;>kqQ??4WFG{gkt_qRruOlxO zcGJ#MjEeI88bHHH4`e#)K-)l-+WS zIRvTU5%V}96q4>Ikla)`(S~Q1tBzV@yLpraEWCpij}sb{lJ|C_QS=n*AUubdEdvRm zE`J1Ezhd?`m($EBk+F(R@Nr?Bw6m}50lH-m6-mDW(N^96MA5<%yh|7_XZwtZBsbs* z!cqnmacUW6CI1ffe!vW+^|9U$c-!+AUT2m$<6Kkm&7khRuzlsReA=M=nWW3H7SdHF zs_X_rTt+}!`4eO@G;tNM_LfJ3nSKjQN3G=gdMkCB?13Px6tvusFM+CEol6)g@otts zfEr^%jx};q_|5qHR52WEwNq@2@u*NkEo5Vv%CnL<`-Fc@U|ylK`lXJEWIi-+T5xMP zg@`ei$*{zusHV7VNoXNJe~P{rVS6pA|>M<&zH=Z80IKkT*r3^*pLB~ zjT69DXM}*vrrO?7bNW}9C!F4m^h$X9p>M z@;2>sJ7t3AMB-S`gg9|c0x=;&svS|OcCy!HnP8>NdRU@kBEi9iMX)@e9v230)+qmSQ<`k0uvOvHQ zX#eSEg69zJY&NU~jPK4|iIcYjOlU?nB~mq07vUMqQDjZ%DmIR_>sj%tKd1BTCjPQ# zHUxJMD2ZxE4b_!o%CaX_IBl_5zc7>cXp!DN11tzbrJ6D-x3T9HWOlv`6PGEY-0MSYa3 z6;-%%Y9(Z^s9L2h_P3x`9MG7pR?9~GL@6!QYI&wwE#ItKkzsGO64s_#WjZDjeA{XT zGxk<165YC5k$IY0De9wKt*FACQ!62RMb#=DI=Kb4;>g8pwOY9$wOW~}Rx3BFR%F;) zt%S9yR+)}hMy+7R-fBgnTURSGPg5&JeUz&eRk(9%C1kItTBT!Hx1d%lX-Q3k(KIm) zHY|)@1WoK<$WA)_@b)y{oaLIGJiyq?o{4LAVrZ^z#n5;`D-So*eTO<%H3LhmiUkG_ z0<9kOzCf!d5vTc$`MJ^TtF}^NYkb5-zGZuee1wwRWT|?HnVrY+H!*c!S*@Iy^ms#T$ei1@*QWP4g|KhLz0 z?ZVp35^*|<{k(Yf&LX%iHww?=W2@$iz`T-hzWVa~!tMf7#triZG+Y?s@kS??iQ1i) zkDtr9e3|nbzCHQSlY@?p&-dO_+}+J-;?3gTZf@?rs8hq;_L<`+&z(PZ_B?LmYk`lR zKGC*bcX2UJe=nanwzJc@=C?h*+dV39`8-F-tD7F}#QNf5?XE|2y`Wp_>z6%R(u{fr zx>Ul}(+ESy5@R88jw0p|gyCo+Rn1>-ZybiA5 zT9_l-%$;4*a--_7bjo7~oQsxKoZSRE7U97sdbOkNLd5%ri(NmkGPJWSCAt)EORv+T zjVT@-H89e<*Kq2EM}_c>B)J4}E9p4H^OdcN$w(WpNkvxJQt>65O zpR^r(KyaP4_B!iA?4l}-$WHROWqQJ`q#OmVrS9+UJklLqp%Vy_>+xkhIMZFri*$AS zx^H`O=m%=SE-9xvSE~ati;K&=JZN)FU^wt=GhO?g)GS&iG{$-Nt+CQxx4Y(%qr#Qj zYP&B_F=J9^!bQ^L*kE-o=SIDge33xL!`}KQ{}G0dZ1hlb3Cq4p>Qb`s#ZXU`@Jc-A zamO1L!|S)WSZ%DmlTWq*kZrt@CV7_|b~d+Jl#J?z_Udw=QP7dq|jE=M*H zzkYAz{&Noq$DO39!WBOLabXse#%vPRHZD5#C6Wk-zLok+S154f|YdQ+#{l zto#C+44QD*o1n2oPj2s(;t@39?BI&zcr15Fe}uC)E_RV_R0Q99Pa$$uFml7IvyD&z z?KYJIz&<*Tq1)}_tF7DK-QpNgzsp^YYLroI>(9F(!xQ?j$Uy%o2PJCJ=ej#vUEH!m zHs0QLaLwMk+Pz5o$$qBtuB4)9X!(dU*X6xUdg{x%x;;{JSWkp}Fzf>QNGpukK>Sed zzTU~Ncj*`X);rtx-+z@#tDqPBOOJId3ef=|!z8b+e}BMn z3=>_sqVG^i?y9Iuh3S?Orw>&>rguiyV2z3YaM0hiF$fw_se+stwc!JPbT)@@+H^+# z8Qm#kXDhfLEGn=+$=Rlz(e9QFblA&?8|%&8^-IZb{W@9uT^1?9bf!D%?(E<0Y;9?* zH8-^GZrI-Hc6N-EwGPTk*@LwYnWLrNu(Q3b$bu&-Sv4(owI|XS_D-_BWzCM#SbDwXQV*j-rZQq+(1h(fv~r zncEc=t(F)St_!!3-hP;=T0`xKmm52SP0NA>YtV+H(n9Mf*NlPEl^%9d;JI_5%ZcvU znU8O7n}?py?d}Zbrs5DT>$8^UDs@N&=({Pi+VwFv=e^lHE-Dw=W~5|-J}}=PFyU$9 zkf*(h3Ppk0wDjQ`HA4|sE`HjL-R~_mr*IiM8+(+qhTuy#T zsj(PX>op%UwMSP53`cBiIdn6QV6VxZU%4c!Y^kOFS9)Bcfwy{2>>$Cf9M$GX*KH(9 zkSp+rs6J+u;F#N~&h~gmOCVyXBSnq=w&?ec@8S~A_MYfLM=*{OllxDjX9USl~PW<5a&^x2CX{E<(36 zdMZzQ$nZ`|RbtsIRhf1&F43)+^6xb2m1=s4Y*-4;(UPsfj)JAUlMqZf{! zKJQXIUOdB-xh#G3CzQVsxob%0Mb+G7vgqk2XQ3Tnl>V7inxnhH6<0gYu^K}>TWX2L zvnwX{y3 zDN->kf-dG+T1jHbh;A=_)RvXXPyVU2CjFT=F{IR&xj4Mig zCtfa3y%LD}dAfKKc6To0X|~bNGcjJjwAFilS4)I83v@5~He>j#Vaypi&+@(j8?V8_ z#?CJ5+MC3!`^b#`@v_}-Ff0cR_3q4C7rJ~ZW$I9;kjbG&BQ}NSSre+QE*B9DJIpm1 z?C}z%DqF7pcei?Ez`5)-EB_*c7mW+2)>By+;RK0rEM3D-&fLZb2T5r)IOmG_#~9V`mgDP!UI~J& zY}Bl_NqxOzW2vK7{rm3A@u4WPBrK@Z5Eaw^qR>0as9Jd?(`J-1&bTowRg(&j_;`!M zVrG`jRqi@&;fI^L2yt>dYg{}fhUxOV8t6M|MN4?~X)sA4$y|0Z!oKw6^k_hQyDGv6rWf4lZY1YmDqCwOlFm z1%oCdr&+7=G0kVYtkcok#0yePv@d2eFZFIheZdyJUh0C9$yLilhgU{ps^z95x&Z5F z)|e*gh<#paU=E!6FJb9T=v1X_nFm_0*x#1#{|WqN^~l~3R<-g$+YVDP!dd^eM-p7mK>*p5mU9CIK{G1M0)p74)+Ki8{Zi< z)%%4!iki?OB&|wzLe|fozKH%){%+f;WB4F{X&6Wx1g;Cv>b$&qu{3AT#V(Dnvql zC&X6x5Z!TRDT12Zlt3#_^K)xP!}&YKbmYh}1CnEkc~`pTVt!2WYBr>5(PjoCufV8+ zo}9OJOjSE9*0Z=~8=9Q7vbY0QDm!7cv%#)RbDby))Qf-XpW%|QO9^ZAO_{L8^?>DU z89e6e=0Mbpt43*kZidwX(SzlnSA}%ehVees>Z}2|=PP!IupG7g+-9Z7jeag@s4Z$` zBCPI?F{-BO=`)s1D_rD@C9?UFQl~k-CV3J@VyszG;#3aY{6q|*c-8HQ2exXv3m>Ql=I2m#%8UA`Pk;# z)acVD{C$!oE4>@NbzXl@Ls3f+SU%sH$1RB7;%OmZ*Dljh z59f_NY*>jk=80}`s<}T|_o8?tHXFV((j)$Xsr)zDzm4bU2 ztuF8}t5RT&G&{Dy zoG~w~s3G?k?soT+{a$W!y==3V*RNm>#J1OSP~0!W9I}f-^U5oOo#%Ycw8LdM+!+!p zdhR6*wsIbi8R#X}w|c|jZZ~%O>R7Pu0cCo`P?YT!HsNCL1lqE#i%qxmp4E!m)J7p@ zV=R)f9@e?|A(jU%{bg3K*aPw*RuQ-n^{QgoMMG3)bl^bBJ*PIdbvU9$EZcSZ!$HQk zen}JK_ItK>-Sg}4z;X6}?CkR|U#Zi&pKH~r&Q|AHoS#{^25!FRa-U!8bdr}PeYq=! zfsh_eq%{ti(IwtBh>^_KeVpcUD5c726|Xl0+)s&uyYXFGFmp@PwfTH?=3Y7Gs^n!c z#hWzzl*n!_VcqjW0hgwAwEMyMUVAM{ z^v6LC<|UbuFIYOb$^IAZoatS+fu|c2JB68E?X^!T3zN-7N}Pkbh2uWWO`}1{9-E&< z4wp*yvll@wFt?QW2wq%F)N77oq-v)Ws(rB=W6A=D%9(&?e&OWtut`c>rclXq%L_&W zlk@q7GBRycPQ7bTs#4S%QJoTbNJtH%lA5j+qa8J&Y3B;}Bh~J}i_j?-6mtD8%7w#) zJSZ8!A6<-x;4;2(MNe&^bH{8l_dVx2q(WQRhh*Nqw%cDPLUjUw4eD2~vgZ)I+GOc7b;43qwWCUfpG{ZlaZw1V*{nS-(_p zDyU96BgV>h#)sEG5?kUBMqIe+ATWLC8Kr|oW_I_9^?F3nCLy%H)79ypNqgk**XQQEfnzUFp z6Di2>a}&ax@WdexV+DogbL=Y1a+QUK_z^_8I?$(dgq`a0T&I3hD+0~JDD7sg0a;QfxU8dTPW*^nU5a~stb6jgp>c>yNeUtUET z26Ll){TN{~fe=?%&0yqddyB`LFP|bTx3@OaQ51$ITqC#Dy^bPA>SB(#($+n(IcAL; zm)&4`yY7faaH(3cS6gah!fE$dOQA=mk;v2#N3e5`P+T0?$VSFnY;98)^J=J2kfi>f zWnPNYfvl?%c~C}zA(KycsHHAE&>1pnh>#dOxPz*Xwan844J4gDQl65EsKlh{eTp1THO1ASac1yyE!jiBIt!EWfW>Y zi;HFwEx$}6XbO{9V90bTQIHlGlE**tzNlCnU??Ue({87hMAD)#k`cLyg*Bvmhmx(3 z&~e5Ki;&y4nB)mDox z7o_BpOGCgPQVgG0Bf4beZi8^@PN_s)Ur;=4&1<$pMb5&31&K^nz|xmXl$GQXMddI} z5{pJFh9@Ji7~`_h?)lw$i&w^3qj9H7a_7FPe$=#bA7iimOd;z}7L=6KeH7IbRAG@c z6&dX@TA64@AL$Hx>o&E|Yi%6b(cH}E&3TB~*<7oIw70baQd!O@W-g~YpqpLqFL5bk z!Lub=LhhLD_ZZL{9TOJ(OeB*rUv2Mh*C<&QT^=ws^V3O8>7UsOH`;B@K%rE#dYY>Fg z`hlR}$9&#C8RZsBLAmJ~%cMoG7b~OA2Q53@%o=HfkDT>_MVTwAO@k*JO0ZtCw#|k^ z)da!7Mj>Blh%NmX>*Cn^lU0}T`P5UG4`>wNz*VdxE{APt@?Uf zjzj=cd_PxaUAt21qREs?OqGckFQi)DdUAVqycVv&G=U{mt!}RD+Pc`};%iBqf+@UC zM1%yYA&UW+uRPq$-`1zKTCFerqE_px?rOEJzYcg!tMz@rXY*U1yT7H?`ewd=!G8Il z!(UwdnDBU>us8m?R!b;;oIm@(_oTumq`~6FI9Tl-O0SHoSp91)NTI;S)()Sz4bBbl5>K6OfNA4@)-qRhuXNR@ClZiWRL!m0}lcJnY zCC;smZWV8RB494;n<8(9kk6j-%7k&|0kb1w$ZjdmeV%0C)%O3@*Zwc_`Lx$Be&m1CzAs_X9|dIL4*~lAVgBel!FR^*?~1Umjo-WR zeJ#R2HGY3>^ccSs--janRQ&#&NdHSw?vJJPk?w5~{)>_Bdm{c5KWkF8#AJI6=#pd z?<(dFJiP%Np909<9R%J5ycf{u=ktI*a25Ds;H!Z@0(>*@9l(cy9|Zmt@RPvL0{<6y z9gKVn&<6GaM}ZT-8Q>Y<67c`)^XArPzDZ@j1l-krCrqAzpqt z`EsEDZoQrOw@3UN86}kQ+94)eXGWTX zk;b;y6DRyB|GOgYu{^@LSkxWk6Y_bZL1w}ZtS@0kbIvq{%3E2-rBZW3%PE0XB#u=+L44Wm3b!c?VjQV zl3t7lLfM5x|90Yo84bH8xzNkIvA0fB_FK=IlFu=QmM+o$)y;H<52iwt%G*aBKgQBH z=Vd3(boyPk8Cd)x@plIfrHI4r=gtL>mUI5sSgP7&O%3hf#d{me8eV3J_(wN%=e+>9( z;9V4O{K02%5VbRWW~P_ zErTnpNZx6Z*GnbTI>5&PYX5Ke4F2$WJD~7;0FBo4ktKZzcs-yAqwMe!nLd{9e+ek< zm+|`zeCzY0?^_YdS3kePIY5`(Y6H*EhrUQ7e+%DQpU~&zhgk#RxkvcNz0hj?Il_ME zzE2CR5 z;LCxp0KO9VD&VVu-vj(!;P(Mv1AHy;`+=_m{s5r0zCQ%~VLR=c&)X|e*s9}w8r!!z`q9m4e+DDj{!dp{9E8BfPV-4d*D9+KMDLt z;6DNX8TcvSIpB4`>jCNS#{zEv?geBMJ|19tVEX=MzCQtY3-F16#(|#I6@0hyCF@HXJ>z;6QH0emKKAMjbg954?o0QUouq5Z%CU=cV7ECI{F3a|%c{z3v2+-0+)b3 zunBAd17I6?9@qhfzzEm{E(2G9tH3qjI`9JUBJlaZ7XV)fyafC<;I{)`1bi{@JAmH_ zd<^hqz<&k)8}Q$Op9cO1@H4>A0 F{|_kv>!JVv delta 2455 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Ν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 Ln*z5f01EtnSS-ql delta 2440 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 XJ_d$6Y77i-)FxWVF*0n76jlcS`-2jT diff --git a/Shaders/BasicVS_PNCTT.cso b/Shaders/BasicVS_PNCTT.cso index ae935064f457d1eb74a576c2e85940f21273ba75..695bdd00c6b44061a2614c82ee3092e2af07dcac 100644 GIT binary patch literal 136588 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 VV_^8A#=yWb(Ndm~VPmAWIskzB5F!8o diff --git a/Shaders/BasicVS_PNCTTT.cso b/Shaders/BasicVS_PNCTTT.cso index 3f029178c3b0d56e7b82468aa5cb0150fae02027..92bf64a87deb75416d015e034cb42353a93a5a56 100644 GIT binary patch literal 136612 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 IY77qiKPLV?)&Kwi delta 68 zcmZ3onq!8)sY`^D^Lg8%f6_St>t>0aSj(F#wU?2BfnkO^0|Oh7wgBQ4JPZsIco`V} V@G&s(0L5h{TFNsrY>aeP2LQ)X5efhR diff --git a/Shaders/BasicVS_PNCTTTX.cso b/Shaders/BasicVS_PNCTTTX.cso index dfa7e88b8ea12e5a62f773af78e978d3175573ba..c871a052facc18fdbcb41f0f5a0a6bc5ec2b08cc 100644 GIT binary patch literal 140500 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 delta 2446 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Ν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 Ay#N3J diff --git a/Shaders/BasicVS_PNCTX.cso b/Shaders/BasicVS_PNCTX.cso index 887657e0106deabaf779c604f529eac5ea97c73b..840943728cd33ea2a54dc2e51f54cdc6c8a8935b 100644 GIT binary patch literal 140452 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 delta 2441 zcmZveO>A355XWbo)Ulo5eAG1%QEVC?T3Uhop(<2Gdd(Njp{dmv(?X@<#EzOOu_N0B z4n=l^xS&LeSwxGPiX5uS)Hy^rv^hWBc*fVl8=Dd9hUyN-E!qikmP zH@ma5v-38&de1d8e5UVYPw(}||M~r^-LbWicYi)w7R90sp@LGp-an`{#!EL09(Q49Ykvl=qQ;62cm~t zh$0$7Uk2ysLO6y|$4lV&q0>$O=gWXVRIu>d=KMSr;H|(bl{`Sd1N{~7B@Ll7<^uYl z8L3j7<4rW017;lXlo}VHnHh@DDZT(5sqs9KHe82c4hCMtq8(Mh7Z|7@?`w>KxoS0l_kfpd_;K(>8~!TzQXQYbnB@ZWvJIaF z&#%}R-iP6H8-5LZ)rQ{yzhlE!!SCAeZ@}-H{H1DyI?~?w*H#>(1cQz47d5Jdx~8pHJm@Di?;(*Fkcq>4jD>cCW68 zXLTCoYr zesE@*>ryxj&P$kAQ==2m2g--h3p76tZkOQ^@F3<}Gd~5+iLvtjRD5J2868LI@UK&` z_yo!O&3(R0Sin+1(eNot7|R1Kq5N5Xr6JZ7zXh%%WxGDwG&t{SoiD-pv9BJvZvH%Y z5MyhkpMc{8`D&gxq7?v^yU_d>Mg?5s-+>$8R!2X9M{M|C;IAtVRV#cKp5Q5r%>$rr zby4|XxB!Fo1lz$2;MR@zg3p0-p!Emn1-}Gl^)m!MZ{^PeBw$#8=7?ByKyQFAVyqo; zvB>V$sMjoK-jhY%X#MukBIdH_Aj8U8sDC0knM66@RXTa<%=x_ssciW~yzTpp&#-(| zxmZ(u-u6e;=QIAP`s^8RAigr5fd+7~^F7g3x!Hcq;ce;UdlK{x9*1*BD;>UV4&jzz zf7ejcK7_|n4?v?1Nf>6pFXON5m&z7%Z`z*VIk5Gp`JHMGuiKCx`9s26x#fS<;dFPv z(jf2c>Z-m&9v&(G8_?{3hhp_MJ{8;8KhLkXaU!v|hht{jhg(eTFt9hq+_c1y5RL%3 yaMB@kNFICkmT0c{cK_xG4-AHNiSUBq=#gj+`fD`x^i=XFYp_u7BA$nr7( diff --git a/Shaders/BasicVS_Sphere.cso b/Shaders/BasicVS_Sphere.cso index c02ae1bf4b93eecf6d88913fd81c81f9c8d5bb08..fe94eee8920331233359fd049e001ae8332876e0 100644 GIT binary patch literal 123560 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 Qixjv>fr}J)%2MEe0k`MMG5`Po delta 1443 zcmZvcUr1AN6vxl6-K(2yX>MRFwWU4?4e}{0q~@mLDrn@gLG&=TYff^D?M4p~gAl5> z#*OsB2M2pl)`K)3dI%A+u<${8=qaj)pa=tr9;5o6>+jaEd*IyjyPxy>eb4V7zr`1g zU%IXgCBl&<@7UW@JOFIL_WwgEUAmEk*4QUm` zeemnhj9CzI6^<{NO%d)BkcmD-E*O#n zEPfLF0T>IJCi_Pa7Z`ALSX}Znb7qq3lFu;bf+jB#J(P(GC*Zt^Y%7wlBXVvpe*?B? z!#{vMw&7pFmh1RWw6T67HGMd#6 zBcuilT@7?HNT#(&?nYK;4ZbmA_na_sNrriQ(wwK?P*BmAI2yu&~Kn1Y}|8h=$`4jM7 z8~z+TXu~(a`@r3Bp3oNl**+o;ApX-w));km^VWFlx8{*E7_U}$&q=NZwLzMU2(lDl6eq+wne#(RHK5GbK5YE#bkev5y z5baSoze>CUVLl!TB^qk}rte~Z3*M3tsDk=aqcy+VC4{RM^qg0P%b02HKHJ!Zz31a@ zl2L?qAE1kP5yLh)uFAPP|K(~gTThFFBhfy7zj(cDWAVYbj@WN_d~FWw>TLP7I8xeC NW;>tZ!nRhe1 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 delta 524 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 delta 457 zcmaEHgYg7cq)UX8^U*6x6$Y)U7sISJ>$}Y?Pk3L!mwfD9;AO zD}ZU~it@7b{DL=rf#>>cIkGvnb{SH zkkmw@zSIXvNK8nK@vXk8G4V-#Fv^oAXpAvFm>8Z67L1Qwzi(zPE`>HFz}mu`_SEe?zJF7`8?A5ugZ)CGj4P-NB!77Xv^^W*9 zy{|vfuP4USBZjF*3X@aW9E5Nv5SBxUgNN%~6XegKyaSy6vaAD&YF(ijJaKF&c_4nU zCkcNNeLaIw=wd)CaJ*i$7ewlMXLOVtTZTyO72P@e-544rt2S)6A59a<1Ie?H84pGD zrIHqwE9-71-)j4t*`O{Fi*`$(GPaRmWczk~AknKo9SDW|zV>K>4dFcf-v~?tr1cK- ze(!+@e90Trqx&`jd&Ii}?%Tn~iLb#NrUTp?kQfVc?l)NH(Y+l3wGXopHs)MZsET3*CV?Ys#J52uc8Pt8RZGPWtexD9<(lto8FnP1r?>po7`F*Z(GM&wLY{QY)(kRysGmT=&%wKod zGF3ER_b83I9?h~MG7Ov^Xc4# zVOEF%Cl_a>x(lWJh!sl&#&cFqB-5EHRTvw&W^BwcmVvPojVw~oPNokuGt0=$sBWnXKHJ%B!p;pv8#2Nhp#=3QjBJkzT2#_!Fg$1Dk* z3=2!iv^i!JWy%_QYA9rDdh$i{lyK3ogYbm3FwHJ~?!~jk){2nVU@yY!NRtoj_MNi7 zRfFzr*~c=LDtmc(HJvLN$hR*^8zk0RV`nt#T$@f$N?(Ut+UaYHeRC^)eTAOy5R|^D zLeF<7HOQF!4bJx~Je3yhuiqlk=YGGen^`OCCYmu5^yAcYUkHl$)JTK$yA4jGp5n>J z-*X-;Alnai`9dDwRLRaS0&`2-su3n;XoY@LVxRTy(}dEI^Z7&VVD4mEOXbUKKb5m| zgq=FnR3WowMblF6|4za4V1G70aVS4pkYGMNX;>1p%uI0H;OBS4xk6^bQHAiIQr81y+Dv9-5}!Clz|{t-AO=Va05J@dKp7x0CLpeX@}2W@ p@=J>tRx>g%1I=QAh)xz|EaY{ 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 C=%j@J literal 7116 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 delta 143 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 JaE&P_N;5hDIh!YP9OeT67Eu(| diff --git a/Shaders/LightPS_MS.cso b/Shaders/LightPS_MS.cso index 2cfa88c33d6cc6060cda5ca0ec053d7abab3e9c6..58b58e7fea07bb77405559c37f0c6821ab92d550 100644 GIT binary patch literal 143700 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 Jz^&=`U^v3bz`zQmO@KIrg@IuW5VHUU dJSLjTb20!`ykllyh?!i-DL!!m$Hp2TP5`B!6es`y diff --git a/Shaders/LodLightsPS.cso b/Shaders/LodLightsPS.cso index 220072dd52fbc7ebbf552b9dc7cfffd59c6eae33..30ba6b664344266ce252c950e68e52b8e937b1ca 100644 GIT binary patch literal 79212 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 NItQ+E;2Lw_{|Bu+Z;k)} delta 69 zcmaF!isgZxnM;I|^C|5c^Sc=ozJ8p$Uw8M_ZWBfZ28IN21_m}DZ2`nGK*kIpJ_E#8 T#26T!h)uMTV`SJE$t?~5J>3&m diff --git a/Shaders/LodLightsPS_MS.cso b/Shaders/LodLightsPS_MS.cso index ae20c041a87ffcb26b7fe418d85cfe5df0411da5..5d9a8b8b1035001467252b4c9bb931ca5b880000 100644 GIT binary patch literal 148844 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 Z|M#<*z*^jE5?GVKngrG)@M9@~{|`am`04-v delta 70 zcmaFU#rdF*$;>6f$=TGaR{zxd+t;?Va;!La&C7w2fq@~Roq>T3NLv8043IGch|d7= Ul{N;3Cv6k0 diff --git a/Shaders/LodLightsVS.cso b/Shaders/LodLightsVS.cso index 16c134179d3a5c184407c29895f02368a246d2d0..f89061e315e3eedbe01f459c242e2724a5afeef4 100644 GIT binary patch literal 32820 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 delta 69 zcmdnez_dcd%q7CfnZq<);N5BWb%N%5Uf*D??qFnKV9?-VU|<8%7C>CX%)oF3hyz#{ V80K&?Fs$L6XeGzUurcy7CjghN5WoNc diff --git a/Shaders/MarkerPS.cso b/Shaders/MarkerPS.cso index 0c8f8564658e208c4bba64735d4df6800a1e2734..c2415e772d7c98c45f97cee62adb47c53d10f037 100644 GIT binary patch literal 14496 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 H<`(!r=X#9p delta 426 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 delta 65 zcmeC!!1zbl$R)zbd6kfMOY^>EWzg2J_qTqxf8fzXBPU$F{%A z5kM7COJ}Cax~0!krBHI7p=;MPdJ6jBfHmM9@CUg-fYLqY#aHUyJzO;Ajgmw8qNzi> zMh)xg9)_Odg{)=TX5JCq6FuVCSb9vPXZ4(6iG(>{E))@n$0BhWO&>jxf(=}^CLp&X z1DnG2XV{8B(hbUA=BxDdsj1X>dNeaSeu6T?rxWAj6G>G6+Bo#~dUC8+02M6j1q1mr zM<$LAXOJmxbmmCr6|hx5X9;c>Mg?AdRP=pxt@K(Q@5^)# zjC3kFM4zbbSBYq1-#&3XJtCfs#A2afS2E3dP!N~36L^W^fE_OJf9t>lKjX>ChbPtp zSRelP#8%#~c$N2I0?7L{26hQkUb8sOhx+z_+Pl?vE&bZ9<$+fsaqUXqHw@lqe!b`I zk6umfI(qdxzuNz|U%d4Nm50+-?nB=^`SePb68Gt2Se2|(v5ef1JcC^Q7%jnU(c@a_o^+R0Mx!EQimYDDR*Je~2xrz%9x?NI+i-eC!4U;plyo>xFAB#L z72B1wvzB3$gk9FNhRB+xl`BBXuzTGqL$xe9!XAPKR=rjhVdiCexp2-XifN-znh^_D z!EvD9)n*weza(w@<>!ei7c_cxPXm4AEsZ|@-vAxitP_n66ttc*!q0AXvkFglQ7HYt-{PKZqc$m;`W_d!nDe!r8@<)6cI;?MInW3Ok=iT zoi%b1&V4V{zJD2iHm#%C)Ucix-OCeo@&v9FeUUUB!TwFiPP9Bjtw6AG?1 zP9GNky&Lb{;Emj~e6^hznEVVnyggYe7;}A-Ni$pFdun^~Xu+ASOiw1vobg$`IA>Tj z!H9bgZBM3BJiJo8>e#8Y9Oy*Zfk}+lWtF*Ql{2o&EL1MIDsKlPw!GT5C(Gq5RLX_S zF59lkhc^(P#2IVn+c9ksO@HbiV<(>f)StBb-PE%@-w!iYc{2!i16lX$mmB_a30nqE zA1`MK|UTS{fw4%3H$n{^H2u}&0Y}I&eA1UfHHpR}xiDMbv znlT(I+f)0eVv;jla;)>jTWjeAyt}k=pvimCcujJNm~O;AGX<*Ax21f94z)Ib*GzJX z^(5CO+bGql$y=;OPmilz@f-2<J`7GhR<)AiXX1w!@OmFdkw!G z`~ld%0Rk`6AlC=G3%LzHs~0Nx-fsWx-fsWx-frbT>`lA`!@{e1aemh zYf~3rzkaxK{kP%J?>c_Jc;z{wo8YVV(ICZddkpN0SAp!yE}}(`(m5~gQTcwv>6ctS z{m@JIC|&pB9+md6Jlh2dt3OTq=%A!~>6oPL9&MrLWL!~}{SWe}7hCoA+zwt0=!5Hl z&A*Oo2RIle3IW;ILEHkf->OyjcJLX58F?(Id*W@hv*R%0EEiS}+5ft^r1(6Xn_PZB zfxn9y+Cm-b?1)n=-CW|hhBCv1!vW&EXhR3*3xKDflkT`MfNfeE_fMV&g4Ef;c5`3c zLQP>FTiX$C1l>a0Wm;F@%mRAu63cG#WI5a}F3^*;G%o zw*A?c44YT9zsvQ1>(K)b;KZ^CepzdK_g$o^DYzcp_t@7d`E)Xki<9NGe6zP36uO#tAI*Km zhx+h98+}ZkzZX#*%{!KN(aF|k>;*S@UxV-*;eB(9bJ)q&7Noi3ol~k+^{s4uc;v~d zg}3EjwbI04$Tc~|*D`tW*)J_0G~+)ORrTJ$E;S@zvM{qDsA!t!FTgl9X1`+gExT3=THa}tB*%}j2Y>h6&1 z!l_L8PQWegp*(AldN+~wDx+25Y(TZzA`NlFobpJ*df)$i1r|rg3Z=QxQr@I!NuM`t zirQ8-I&1J>52lM|cFtww@zQHYAN*qvpB>fb^B?vc$mRah@A^p5Vc}9k>O^^TSr4 wY82ML8OROQ3~T|0fZTxGkZr)HfPBv2yICJTSP%Gn`486Lerdi39wiU_A4GW~HUIzs delta 312 zcmeAu`N9_K65-@Ltzy_o(fH(yxum^}g0PzbZ z28JI%9OUBarUK*xnG6{~45DR#n1SX0e+HoVA0RVkVy!%5^5luk(i3+G)F%T)fD#Nd zfLH*CVIT&`0EwRfVwgD4a)u2+3<4lAkm)->93V)KFGws(%mwNZ24WV7Adq|jWx>?H zf$~*cb5e6t^Mp$nRKuUB28gpfCYLcCWaOOez^p3b=4rqI S6a(1}0>L4UAtjSDnacrD<}vgD diff --git a/Shaders/PPFinalPassPS.cso b/Shaders/PPFinalPassPS.cso index 1fe266d58d08f6e9b9b8aefc5c46c3caa1575ef1..37c1120db28a65e63bcad8cbc13a95ed6b417d76 100644 GIT binary patch literal 15444 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 delta 126 zcmaEoFoh-5CBn%$F*oEtM_m^W8&ln)p7a~Fj0_A6B1{YntU%fXh#P=-3lQ@FC1wC| zkc+FE3y_ZtWI!C2fBzYP@-h=Eck;OewE#sNfP6(DJ=uk^fwct4V4lp#C_MQNV*&tf CL>FQJ diff --git a/Shaders/PPLumBlendCS.cso b/Shaders/PPLumBlendCS.cso index c0918ad1211562bf1b44064869a32a2c6afede45..bf001d02319f06d3faf2e07146b20ecca2bba410 100644 GIT binary patch literal 14812 zcmeHNUu;`f8UL=6rj8r8O_u&yGG&LUNKV_tHmyb}T}fj%Yo&A~amG68s&lSy5);Rc zu5H%ADn)_;Qne1DNt-k_P+vAJlRyZh3dF=4F#5nl9{>#r@xT+)+G+5F7Jk2T&rLiJ z2g0hZY46v5{?7USopZi(bM86cx#`oxsrcf6EdBZ)>e}m%4qg2AJu{Ywy!|uzRm5?Rcpqugs;C7%7>`^-L&Uu@uq$plcB z{<=+lkJ0O(5D+u`;i6N@kL2uX*#)-+K8*mig6>0A> zGhz)v0Pty>u|FuX+1H6Q==%2B-;g$6wKx5t{R761_Vv232-nFLk9jVn$LN1XB;vR2 z^CFANXhCT7UgJ1SfBpXZ)YmzRp=BnIO;*_`kn!+=G4g@^TMO##*3xT~WyaFO@}S7- zbCHUt_U%)rG9&7KncEsdK;F z>4x6(O(|>KhrT_2ppoUP2Xq5PAblX6Igy?ap6Qx_5_zJTEZ}eK2uwd4l6#+Mk+Eki z`Nh{PdHk)A{5jkrn|^1>?sr1++c!nN_qP_g@H3nO>ysrLd)PtmO$0Jkw`Nysu9F|G zO;0=Sk?CSNS3Rn{yqP+zTxX_GsXA^0G){S;$rG*-346GOhX>nyspbV0u30jr2_7?EVCYx6;0{je;50 zhcs4sP_orN6^m8XfU^75-um&-;f34!S^MDK58ma{-^L_Q>TveaisM$YrGhgzkWH8E z8uN^m?8AlXY;7u=D(9WYa>Y5vtt$?CdBjR~Y;3ePuO~B=8JsOviX!&mY^}~=e#PO8 z=g@}3Cq0L&#lebBOjfcB3&q;}6qBZQ#dFx~$qSy=|MzL_{cFNn#MI~I%a5G-!k?@) zwgJ%kC{Uk|4ykWDfpQE;-{1QFi_h8+P{w>QWdYni5n!%)SdMgV*Ap1QJU!ih_Owq| zv%_oO8VFL!4|Q7nqaP{eW-5|6pA^>2^^09Ocko<7bB>p)?o+}wTL)pUY}Xe9ubGGE zx(N+w3-%k6pqBhl>+hALo!o=83zvDL*o5qqu}-Bk7_G*~b@?%J8$Q1kR}!A@>+;h& zez=Z*1$?$Sq}yPoer=#{?@4c!Yf!aB!JEjc4|{C~kkmCj6WT4{W^CBJgg>-_s*xauqlU+$yqYsGK)-Lxt@{AvaX6 zn7W~QOxqy820p0n59{xn`hA!~)(w>*)Y0~$p_mON_uvMQber4{dOzyDnr@Rm&;g8( z@&W0R{hDq9Ow8{wD;-M|EJl$8M19f2)xC9OlWLO{0wUqms2lrZDGyzFI% z_M=SXJ=H-Vp-Xyq)Ih1xA$s!#JF5#*u6;#h_YTT9Z(Ak2Jp|voSOeWEyLJpg*25Qv zymy1Tt>9Caw>ZunpYu#O1S&%b}Z+tM)q>u?vSZm1Z`?{54(^6!_JG<1idrwj%8*q}bPhg;x4uT8h0o%J@+*e|tS2RBE*18#N$ z_uL$JftODx0$uWHz5iZB`8{Vgz_0_O>$7$|8GcgvU$#9CB(QJnmv=@bCxG=wV6FRq-dw~-3#GY}rRlQ7OSyTc zBJqlA$7gX7yZhZv!J`W&>KoEf-0zm|V2m}$hyCU#!2S4zi delta 63 zcmcape1YB2CBn)1`}&luXh+|!<^6}wzPm$X0zZJ5gNcD5 OWTL4&Bg4kfdS(Fjc@s|n diff --git a/Shaders/PPReduceTo0DCS.cso b/Shaders/PPReduceTo0DCS.cso index f26d3b508702e16dbd890945a476c1280191cd44..88ac3ad182da3a60b7f24142d9c366670c6eeacd 100644 GIT binary patch literal 18108 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 delta 65 zcmaDdhw+AhkxPV=vxQY+(ElRdyyDg)X{SoA-(zH8V2I#gU|>L27s}Uvu diff --git a/Shaders/PPSSAAPS.cso b/Shaders/PPSSAAPS.cso index 96e450adf7f87a82e9f760a9b7ef4e77c3798452..2888fc62d04e4a682e162765fdb739af355183d3 100644 GIT binary patch literal 17304 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 U4EP!FGvH^y&w!tShb#mC1ayXdga7~l delta 64 zcmbQy&e+3k=n~=N{J_V<^UTSrnBc=a|Ek^g$T2c7F!Zo8FaQyQ2@szE3Meo!FoXcH Oz(iAdMuv@{)~o<#dJi=K diff --git a/Shaders/PathBoxPS.cso b/Shaders/PathBoxPS.cso index 9d729ea5e2a8c99f57814843cd054b680b1524c5..98d0e549e2df6d68f9e14ffd0e00419104434575 100644 GIT binary patch literal 12360 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 delta 387 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 literal 1420 zcmaJ>O=}Zj5S}EpZGzYsd+^|4DIOGxq!$qco91JiKx|?*E)@bcwA*G&k}aDp>P6BZ zcu@4Fm!3pWi1<6adGX|5P!M_$PuAzzcejM4b;9htGtYdzGcPHw=L=sK_2iH5bNZL( zzqVgI{kR_!k(cL0rXg>E=i?$}@F7@WPlFr9lKu^jGO?cm=2H z?7LD9YJ|BD!S zhJ#@~%TQw72~GKTMlME~#xb2t}i42X8(v?Eu&W>lJ$+L{z<)mj7hH_D~; z782&*^%g$6Wr;n&3)5d|&{RL~pvxYosrI!2J(E^C``v+lq$!=X@OBc^dG4TH_HYxU z8u{BsKRFm=xcosRc?28%Qb9h2!T*WM2Po+Vac^dnuRhX-D@+06>$r$KMq*j_Vm;rTnKCrA(4>U^%-Nhh z_nv$1IrpABKj)r1vHl~`iFeZf6x#ND`L%lO(8Vf)%8Lu-obHf=% z;UVgcwRa3L&k3!lRF%sL%b?sFi$p*-F$%^;#_fzXjDX{rbTO~zhYiu#+a!*4CAvgn zR2|ZaBAOpBWU^d{go6?4OdRd*VtF=8)r=SufXz^aED^0|8nenE;G=y#HzZCB#CsB* z$0Yl7UXaXoFKH_e~z|J=&h+K8a)P{c#oo)-#@}CS@={71M!$ zw574xX%UcW_6w?d)hf4G?fcm~MT^%_XZC61VJ4D?lV`b?Z5IkKS0`XD3xV1F7t+@$ zn~2AbP|&$n(NJ{PE^$23As!2c!+zi9SOOi`AZ%`AJcByJ29vn|E5HL^m0eiP9ymag zt9kmXe(qKL3=@p<9nTaFVIpG$w7IadJ>ZN@R`yKY+1<_qXM+*t!`<&{h(oWx_x+FO zKKn2F!RN-QzBdY=+VW_d9jE^K)SlTaTim6~$OExGvBa@huiX30HEcn2a;`R)zq~#0 z-7`eBe^*fZ2+_80Jal-wLh5ULYn$8Mc$rQZp4Z+j3eQG^K*3da2G^)QnOwXN|5g9W0IvHVa*4rfO(hSDTt(+cbU0`LA|? z8&_^z!HfJf{-Q0ZK3yy7sa!@I+ntK#)1`4OXXvS;8Dq3Gn2P3yw5QeVm{xQYgJy0| zPsLSZG@b~KX7wylx+PU|s2ZA4HDantv#JSG)y-m1muW&hRbW*G-Bh*Guh0jqOYlj@ zrFf3Z$c$o9DjodAFK+oGtW2`nhuijbKl{XG1r`?qkVk$H)b5LsBPR^qumAS^`QNQJ z%n)rZEFBNv>N-NLwE?++K3>C@z0dXA^lmfxMEmJrt%6&>Bdd<+6n-H>s3q0nh-Oeh zAJ{h#mYnvSQGAi`E|5;xNr74v4p@opX36C<38qyXgKTH2(ECz8NNu$q=6OlJJ1oh$ z$p(toDugUXrKQKzZu2W0eE7lUS3CGPL$LWZ4t|Y;A8_yyHrev^4nEEmZ2l$(A7>~w zf2)JPmH90^-%3{aCbeSz!g}+aRf44#ZSG zD^TyU>K@v`=Mazb^Jd2_c#Ye!egK=AHTVBc9$0%RqR4YMzRuP#zQrAUoCSm*%Vje= zgf#{_&(k*0mWD&jgIs{j2#@}qp4v$jb^ZqK$GZ4L&59jq%H{>gjO8G^jj9^tyFTqr0p7+tF2I$0fw2rC+xGy$xxx&#`DscZ63SHr4 zjBpT_r?Qtv_r<-kB5J(pl?X6$FQ0pET-WLGSTm;n%H z6gRhgVDUc9ORd)49^b-2_QK9T(Ii1`>~r~?#A6)poGBV+*frz-BTwCRt# z{>SrQF#gQ=E#m-tT;>C~{0WyQnIeDt3*TdcDWH*2a2?MEr}3x;ocVYiM^1|LjaxIZ3fxIboHt4qWK{{!oIDUJXD delta 118 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 m$TedexBlA8fdxSP1&CvS z;z2I1ZX!T75HWZFF^HA{Vg{Cf|3RELK&H)PK^F1J7o=Dw&Jd`#0SW;1F(g1SkOG4h zP}%`VGXe1yDE|nMb^u}lAO?wF0Adh$0K@@6j4mFQnOYuDl%K`0di82%piL}52m{WE wx#Fosi2?b=Kv_nhBqLmM@-oIdd@ex=Kqor@g(HAkHcw%SVPq_s{E@jF0PP5{gzUH4R#&Ph|pZrZJ+{~IT5q%=umr-TvII?hXK>e!K= zO$$_Vx3)ohaz=<1grw?2g>qt*$3w9z=2paO5O&b1q=bV0apVF zmw`+-A83>KEg-TKWGBd0$^Z~0s{y^n$O2%}C+zcuV&0C&r6ZTg74s9xN$HOtvvU)t zl6gn2GCl3S1+4SfDbN6bGUorhj+^`q{Wkd2xs%>?=mp+~-cO-N-_Rc6cKLQ@lOq{h z*G@*Ka`{ncKL)?(f~wSW|2_|qPM6LWq}z$vsbog_lcQ~NBAv?ToZMK!3Jo+_$9v*E zR{U&o)XrNSxrxbi27zcK9F^|)vEF`|rB7HNJ{tt)YT9uP!Z9*6kgwzj#7~{>?~8XQ zy8C)1(K*!7*EbN8t5>h~!ETGzqg@MVz-t%j6GsM)btaG~e!O$&O&Df*3cybW#P>0{ zuImL$C1sw^uvll@mL1vvw@$j@!9kIcI;q-KSEtHmL+_^L%Fd#CObaW4wfdKJSklcr1Ce(Hj2*ObE&Sv8{5o%$kT8vKXd0DWuVX_0DU zZ=+7b{E^imllS8yE4O-NKmXS&2aOE%n30+E&04nx9)8;l+c{i6@REUV?UvIp!(46ze$u_bp@PKV~bT8DXQ!zt^4E+FL=}Mnv$5^6%Xq!gTKVaLh%be z8Q)tao#P_g-}TFpZ9aK&ph`;r@yQ>W{nGeXkzbwkOLv1$UjA{F{C-81eCHR)NN)$+ zWtJ87CFB9!k#@!QyWQ>JY+pm?&D-N?r(owpg$N%=xAW!Wg=E3DX1btP&ry0c!PH1` zYz%vCvs;v2t&s?N`$f0+71=fC3k{gM|JS0t_x5{l^9}Q5E(AK-hX)-y?+jwr%sGesNcMT-J$`fpPg@)xQL`3u#B{P}fhM%g%@4@hd! za!|;!@Fbfyt|9J|H&q%xb`AfD&<4fB^1#>l`o)`x%g+S<_Lg&PQ{b~#L~cS>(rwH$ zUY>grwg7on&Gx|gQb|)euj87^vxws?s-&sPA7^?cmIG9705>D9sTz1FM^;L{*`*~- zWv`BFDlx=SmXfA2s^glfvQy4Fu*{dWTvK@k@h2eHRCum#A+D*sq2rpui<|H~Z&cI` zACd++2wscS!V^vU$G9cUieDo;BrJOrRwGP3QVY7IHPG8ByA>{nW&Zr~7dtNGEJTjygD(A zuXL%;XLM#Uhw}N>qL{*WK~Od{(k91}S_#x~d|i+5GSFICuVhvJGgBCOrm4G9>oOcr zVeu#F3nj2b&Md^Q@E&{*@Vs|pb?bBlRoRU3kK-!wf~L4$rsBBsr05<^U)B`l1A}#Y z3oOcg0_%?X+@f&{mkk~w*mPqalTN2rSE~Y@?o|9E}^JCy)54% zC+n**w^^xggK&(Py>-lW&&m4Lkgrg3-WMsCXHElPXDj5jkaNE1-Y6-T=j`xu9zZkQ7RFl}g>{w1(v&jkDkya<4YCUW7lZuf{E_KdjjN!`)r}bVQ`EX-_AMMb`?LY$GRJ;-q z1X4!eCB>~k_ho|(z{$A1g>J0SNwPXpC{5aO?4yQT!n^BW885kr^|0uF=6 zvEfx9cZqmejNdtMe4tI!M5_>H(^LaFN94CowLmr_n{zGjF(B6$+<&aV{q+Fn>=meZ LpyGi?(*yql_*5jE delta 424 zcmdl|*1{R-65-^$`Ev64C_9OeLt5TZZl_9DFfuSOw6HKRumWilAl?8J;9z24umNHY zpm>mrt6K?B45V%j5Hka@3=lK0{QnOU^a0|U$%ee*lP|Eau!2;zO`I#wIAQWdMzGMt z8!Gh^K+1u53lIwcF${=+lmh`s4rm>N3Y2dGq(Nfn;`Tss4lLsCKyeS4 zl#?1Fo?1~-T9nGLdNl)sFwo6VTNoz4V!XiT5_AN}cL3@t1mekOn5vyPKS5pTCLjP- z>{bVLbpnJ|U|`@jf~uL;3gkfnlLN#b43j4^i_3CBRWJfY85kPut)P5a1_pMg$w!%$ UIkli7Qj&6Je8#!05qvNQ2+n{ diff --git a/Shaders/ShadowVS.cso b/Shaders/ShadowVS.cso index f15cfe486cfbadc74a26972b6f1f4102fce4cb9c..e6a4352a72359389aacf29a2b0135e6d5db7195a 100644 GIT binary patch literal 35292 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 delta 754 zcmZvaze_?<6vxl=X<6A1Fo;M&s3F3^er*PivStynq83RrgOpx|Eg^zIZP{yZa0qM= z-jE+ zTFg(`xMHK2cNSkAN|U|g&y~R}kQd1yTt*cGJ9G=KNeFL1T;~OwG`Nf=2K=UNaF2xW zU0#gPAf)I(%+KIpIT{m*f=EP?@oZ2}AChUBDye9T8~csTWGWVk?`6_DnF?~spIn%$ zBYNxYfHUjm32+b2@0Q4j0tNUCHt?~GB)`FAR&ZFCSHQjh@G7_u+yQZ&8b1)va6kN~ zt$qyn0OL}f9yN)a=t*1z8E>jLXNpGgF+~KUu?4=I4^dA8=b^mWupUjF?5Fi3EQ*P3 z@(N`yy7+H;`8ha$^)6o&hg=}Rjc|gIEOZUtd%Ja?EuxGBLRBo*(9Ikgs+aoitxCpN H8OnYGKq6N> diff --git a/Shaders/ShadowVS_Skin.cso b/Shaders/ShadowVS_Skin.cso index 2e765396f4a90974bfc30d9f0264840ce8f55877..b20892a4dfc8fb72a894cc96f456f5f66ef922e1 100644 GIT binary patch literal 42632 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 BaA^Pl delta 79 zcmeA;%k)RV&?Umjd6|=a=6i$nw%Mz6lyBKbDl;-LFw_VzFt7q?6CegL?f|g~8<0KG ZRGyOosA3KaP;j!LfcV4-92;v`1OPn_5&!@I diff --git a/Shaders/SkyMoonPS.cso b/Shaders/SkyMoonPS.cso index 2d0e2c857a2a20c060dbda538272913496876f64..87b918a9fb6e05a4866d2ecacc6b620996ba03c5 100644 GIT binary patch literal 14736 zcmeHNU2Ggz6+W{YC+m&ZU8i>9CQ>w1DP5<@{x|`QNkfudJ4uzq8_zlzSd^^SV|(%b zSUbB-0tA_YL@K1fL!|Q12PCRKG`xV?3Q!~p5B&3lgb+eP;ti=%vc$9q$2$mcHN=K`ufq57>o=K(1>j&z<7;qo33rKhw z$a>3xI*G3W(VTPuw*XrJ5W6e_`Xgpm098L{UTHMzreVn0TCHjnDhp+^E?I-Q3x&ER zw{G2{4$A)-81?ER6F?qqh`M=YgQDqLxz?=9Ou1HQ9EL&-J<@DzS^Ixs8}ytl73(#t zHq+2!;{*DsGsYR+m@7=1bv<3HER+ha&)$aH~x zyBrDQ!o}>EaXNQ;?40CACeveM;~DmO40;c^a@4B>6?pZce(w1A$&nl?8K*`jZ$pUo zB!FKGiS}6x%jgXqIj7Cf(X3037bpASgas!(F(EP)mEd4BYTIT)?vC!1&7pg=cSPh{ zzYtkWPxQ$hcO*t#`O&XBvPw7n5URWNM*~jT=nFc{u;JsFGB3F0!>+EQFww{z&)tLs z=Mvi_(6=hhyf@9f7gj1;iRZ0zziA_zIUz9o-rPth($74jpEXAHPsEeSNO*U~pfVUt zoA&^(GY{D15dVJ@c;GDt79Sp24b9STg`s~#H3jYu2m3V=| z*C;RBTt{%GoCA&lxd~UmjZt~ttmlihY4dV{$+%_jOs%{%f3<>r^MVzhD_iCE9!ja9 z3O{x!M}BbnOKhT>U)N-IC@3SdA|L%%K#uRz?Kagm>Y zBq+y!f*ql|MgHI|`!yd14@APnspiZKj)3l+Q|ZHa%x6nh!>q@qk^__u%_=oYwJPd*4xZ2i!<22yAR8#wYV~Qzr~|1a4F~e)cBoP)Rb%aT^ip-9*%)xt zI_FXEZ+g%UiHMuFU|hA~ZTYbNp~ls9oH%#ix%&>o^LZZfq=)kpmRYy*)si`XFrTRv zn-#O#u<|EMjk)GjK8-N_89PjSl5yuO(aIb1SNSH%8cxKP;&8s{(Kg-IHtT4+7xeEV z{`>P3bLvBwr+faM)D|)HZ)@K^_xVr%Mf-mjb(H7SQ4~r0H6H_|Zu7>^#$HDu%f0Vz z%K7l%J-{W{2|3bZ-#2JsjMG;-zc8ujz0={fZw>@U$xE9Gg6;w!(BPg@k9ehuLC>0Qu%TQ~2*ZkL}Q2=_@|>+CP3j_?+O* zM&t^Rpy9{6A_Dc6fgD%(e9@)0{+-CP9Z-42p^Gk+AG>*%!m2}X#~|o{JT6b#lxcxJBUOm}+apgZi5 z+wPI;a^+~#W&rQ_J7XiVecAYLhJN~eSlI)aLmA^#X1pCgSCZ02F0I7(c^lsYyzklF znOM@%m0kqh6ewe>!t-vr&!r&u2UM^M=&SG_diI7jd_6q-{sHAWtsl5=JyiQT9+(Gq z$W!+IYY`S`?zU{VobTC&bq?2i>hl2iyEEB~vM|cFxi`g(AD;UIyF7yOt#&!@l3T6z zF`uo^|9hA`fT3Cy)VpC-0l#3wdw^qnxie*-`$eSpMz{3NKZZzf20hb(2Y`8?0`8rk zP#Kr1Hv{+J`m(iR0H-zI10ZE%1249(?(Bn|YOQL5fAFXArL}bh+$%-RjXq+p zTSKmX_62I}GVTYR*4F!2TST3i+qNo$Rl_u*)#`G?AJZ&(Xko4U|1ZJn#FczyI$DZzz`B8*K#mMYh$FQf*ahV1@f&is%hAM@vg`o*@L)W^c65-@5T^@4&j>Yz+Yt5`I43g9985tNDc$gU&Sb?+&5c>cHmH_b$AfCX) zz!2o(>LvhW0};alAO)yEXXWA*@2m5;tdUt zNkA!(wjDq$0K_nG0m=Z00c~Ko0p&aA=j4|bF|1|;TEfV{0u^Oon7mF>WAYrvK0cSA d4M0H$Al3om$u>;>jGU9FFvT#IO#aAJ4gg>SDP;fv diff --git a/Shaders/SkyMoonVS.cso b/Shaders/SkyMoonVS.cso index 4d5bb70b97991699f14be77d9de180d9bc8561a4..bb99aad6bb1f4dca33b96edde1cf999e0b156397 100644 GIT binary patch literal 27496 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 IpK=ZSFWTt!8UO$Q delta 360 zcmaEHjqwLZq)UX8v#OU|9JAoMm!~C{r9b{@u!50+fuVwhfq@lBn*i|)puia*R$*db z_`}S=5aiiNgTz@twgQ0&ke&dfIe-`>E&~ diff --git a/Shaders/SkySunPS.cso b/Shaders/SkySunPS.cso index bc40e674137ce860e32781d95e27b9d04ba58cce..fb6d43168eccfe8df76f780c4cf2bddb595bb8e1 100644 GIT binary patch literal 12408 zcmeHNU2GIp6h5;p+HSkB;vy zq%RUMh9?pepGbTm;lafCK=eg4@xeC}^}+CD@Qp|SL!u9?-#0&XDYPj8Yg^{D-=1^N zy>sW@b7t<(xsx2&m-sOM<^7{a{s^4^!Z>@kCH$fyBBx>^&w=j%l2D|9bHGo)SU{vd z+1b?y8UHc@knaR!Nv)L!3N;L&AQpbpKFt8TgmqUiBNxm2#2k}s9BmDf<8A`Pgo(JlQj`y8siLe4B(<$OhL z@86{M^lH7THj+J|n`)vwI#wt_h{qyv*{^jUXmYC{KZx`eaJH9e74WFR6_$Z(hX>Pp z`@1{SXph#@Igo@d1+)S0HHq?$NMqLp6)C4KU8LcT>hyj)+~dh!8J63PqFQ=y`XXf7 z!y~q(o~EYj^ByHXZuv*mL7kRL?vqHpZ4=SN=FMuK)}_7?iN!*}bxDl{(Rj9h4KM+a zRyoZ7T?7{RhA*a1&#VP@i2npUv(87ymtYK20j>{7v;{fW9L)1+aa+J!2QBVi`n{XZ z0v983<+H7y=v-H>I9vYi#xK_np8xn}>aW1^o8C3do4W42erVfNl~>&73&;Y=ZAq;s z*)QDlOh>B7yVK?Q`h{(Q?~jV?-Kfa7sRsG+cgzO$oBD;_HNW+;5>2%$_y zdDITo)Q1aJMK{}rVw*z2)1jaWa$+`!xiEtBW+?bUD9AroJ(?{T?VE7zWHiOTu-Vir zRnw@uY8H+1i_Dn??%%q9ixYW>KZ%aa+m>!x8Ka;Vw`P*%Ty<18DpsbuP#LKXWfJ8R z`jKp@sGD_S#EHdO8Lc>uIAKbQjFhaBNUkGOt*h+BWM#unWjR!K(y8oUF=E+)Ju71s z$E~U{W;vDp4^Qdyt_%9=T=6O70|0F`eaN!zg8475|1G9Wpqc5fKRR&itzQ{3ek@{n z#s|s0YiXi(fOX$E7`tJ*c{C;Se40NN;A6Z`cD99W2L|E8GtI{bJU-jVyU2Fg)u!;p z?#QcsAHt5%K`mB7BY% zxn!5`klk$xbmwFz)0m~~spb7_sj4I1J|nG`R9nD~Xf(QYI(PE)jd-D*du^~^ZBO4+ zr{@`hr*Ey(^Bg6Bh{>PeJY!*3!piYo!+#&XbZo~ z<1f5_P-Md8vd2xk9QRoE0PZ2*8-|)7lU6!x*1s)3#1)<`aoyJl?130W6o~cKYEE{V;u`!4=H3DidY^Ng zPm9k2%jFe&{WXEEDekgtog8Xwz<}VaDL6vZYVLO%i_ZYhc#k;lPe=4S=Z5L>ef`3> z0DXM2Id1R!L$dP1QdwDChLNBbT~mQAzyRRUY6vfQ372~_MG|Rs%2`1`nx)q*a0dAl zuWnYIjRj1lsr|fW(=K55UU+Cns!{?J{7KA1n9=leEUHiQ~Tt{0y7|24QbI z9sqe4xt^1$+z4kp=z%62jz; delta 208 zcmey7@P|3lCBn&B;=b9u_2wt6%62c0__6zCBqIX@!yh2Q3ZzYd_zMuT0QnX`+yKNu zF0O7nfMP%6tu-(T24I$Y7ehQB8RA2gU>d*>)pE diff --git a/Shaders/SkySunVS.cso b/Shaders/SkySunVS.cso index 09fb78679c04daa3a2444021d701a20719457f05..c00765bcc7dbb7c53e04a942ca92a06f3f8b7f2e 100644 GIT binary patch literal 27456 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 z delta 360 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 delta 1370 zcmZvcJ!n%=6vxj^YLk*!^ZdZCShFd$NQVqM2*Jh(5~XxXkxDy=793ItR1i#+3>iA~ z@pNk-NO5@>Dp^EIsZg*(hoF-#=_qI+V=0C9fAa2qrjK*sVfM^jG2cO8^%ca3W(6(WHuq2H7 z4i5>7W6+izb?Lm_iK>rw?W$@x->mLz-F|b~-bdU2N8tP5{2I7X9;VUj{W$-GAl!kF68J;#QGri^X9PY6J}&SI z__W7)|NlFB4}l-Oc_ZcuK7g0NgIDkwd_l+eUfCviMTq|azI2Rx^{EYEStsI#OyOPd zI(YEt_P|$7|_87jAsnn!PHp0~l7neXMFjyr%qt2xIR zuJC7cLE!!1{HJ9u-Nff-pFJ;SXPvRwY2F3V8SKJu?RBi62D1|{u_}YbLlByO;_Z+c PXtqwhQ>x@VwdRii6nBVt diff --git a/Shaders/SkydomeVS.cso b/Shaders/SkydomeVS.cso index eac8abe13108f7e369d07cb30e00e01d1220432a..64780f19550480ca2aae1afabbf193d284329b16 100644 GIT binary patch literal 83592 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�B7HN_9xofRIn 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 D1kh1q delta 1296 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 h1($)FhOX;QG*1d>Rh7WXFJ zOjyt!6ngMbSPx2iP*CZ?Lk>L@4<1AmJPCS;R477GzqgsGYuHDIH}iXMzL_^OoA$4G z@7VRywR6P>r?>nMub+=T{P}HsbMC~HAfgLdq9ptT+RZ&gW{PNeglHo}G+8R2&x3K? zMl!lIibjdwe+Xj@V23()azg7oJ|Z$+=l-EiKP7VLWIKIbnB4KwLKlUgmq)K0^lUNh z<{*L9sRzFqXWfBiFvgE`tZPZe&IH8nC_lstGQXnzpI-(~ApahCngyh_2Wz)vSnu){z(L{fv-mJ+u&TBoIcRO`g9lMStzh9Ggjf(BKS-27ZLmoIG>iBPDewl|iIpS8r4o$oKs?;)#E8 z&r6>2J|+z>tr@wZ)0}ZC)nfftt;M+jvIF(&2}o|T(~u|cPI8P#`c#cP5g~n*!M;3qPwnl RHLE6x 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 delta 1287 zcmZvcO=uHA6vyA>V@++;(9$BP$$~uyMhQ~EfYQYzg5qJRA|f7KniLe9KoTvexCe`P z@X#<94+=eaD69uD1uKducqkI2c<|&02!e+m0v;;Zs{fbF)HUoQ!++=ZK4#v|Y+CE# znZ4)oXOHHN-yOSkwfO7A@N@6&w|9rO2qKypB8oysF)nW+D#nPG`-o!Tf=u z1mlr*Vo>DwAHv)KSfj?xq%ax}QlSAMUq^=;{xNanYIhzR`fimYh;0}anKOB3Yy$NIB=>VPw&w$4< zxX?+=+0H``L;ZE+LTop8KIrc})R%TWulu@jCdzE5c!2x8p~_j{{&#Y^>Xd7fmFg6N zzN;8tFP$nsz?o^Tk9iH8KmCoZ?N9{-{&KjF4F`C0bn}zY*8F&;pUA?#Ti8YOXZ&eQ Q^fwoW>LF2=`?gR21v9yfh5!Hn diff --git a/Shaders/TerrainVS_PNCCTTX.cso b/Shaders/TerrainVS_PNCCTTX.cso index 77641ede1c2df473db4c09f45f590bb9321dbfe5..af75cfff4804605b533ac613d26e659b1ce3e767 100644 GIT binary patch literal 65204 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 aVfab-4Ez!JJKziOP1lq_Qvx4M3H*P1Gz|*? delta 1290 zcmZvcO=uHA6vyA>V@++)&=@VK$$~wIgc7740*Z@CJoT_t5epu=G$|-Hfu>UYfc0YW z*f1VM6nf~PxE_?`P(l0v4?P4F51#zOlZOfc552VN|0OeZ4g1LOW`6I@f9B21rnMd3 zI5t_lc&1<_AOCFMnX11VezkIaba7G;(bW`D6n>2RyNJePL~8>?oqa?T#nRav7{_fS zqf3X-DDwLcVQc_w$!F$)MkgkW#-mJVNXR$Q{X9%JK4(O>v7Hfld01pbNuCmQH;q|I z2&}`u53^LyhA_sD;#kU3j9nHG8=_nv&#U~h@qc~^Jc9hY;0YE`w$xk8?ZOb?L$&x5 zcuus?n7>fG4Q~hVkKjw-T3qXV1z!g5Rsq*hI=q`@u8bSGn8@3MnH=C1y8%?FxWyck z)sSq}nSx&l;8pO|0Dcpki&N8kI#{0;L7w^o_f^I!d@F!I2VV=|FTwe=)O6B19{^ql z@bBR6+kn6Z0_y>M6P&LBu4{UMf-`$=x>Bv!wK@(jjHWY)bnL?A$^v~;YuXo(I6J@qjKF;;tQgRl!|4h!$Io0}1ZEhAx zKU9vdmafV#aAun8Yu*CqPk(1?2bF-pzYf>2698|H?S2s2Q=G^R5?R=H8@p(Ji+eFK P*u0mz9TM|0HN5Z_74VM8 diff --git a/Shaders/TerrainVS_PNCCTX.cso b/Shaders/TerrainVS_PNCCTX.cso index 9639d3b1b43b075257aaa42f11bfece952964118..dcfb0ea5db88f32dc133cd356fd5fa9c9ba81ebe 100644 GIT binary patch literal 65180 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 Q2AUU#ZwJJz?Ch9Z2b=hflmGw# diff --git a/Shaders/TerrainVS_PNCTTTX.cso b/Shaders/TerrainVS_PNCTTTX.cso index 293ade2b8f1cc6fd5d9b98597822908a0ac201f0..ceea02cf0094673ccf682ca23f8e9523edf29bca 100644 GIT binary patch literal 65204 zcmeHw4Uk>Mm0rIYNk~EiBOyS>GF)SU-;74{FChyABh6?K_DC8uBO#D%>CJn0q=(+T z_jo@uBO%xU%MQD-y;P$0-;!EYASo(PS>h0{?e$iuUCMD>t}>gjj_q|-D2KS%6j=kI zYdI{4Sm{`8OT``pMU{`}$l z|Hlj8T(Uo=lzRG2r53^82sgJ>sY4el_5Ec^wXRa?Nx0oZ+lB`KUx@fT5?loTCOEb5 z&9`C*UxB#YLp?o&0bO};akw>bAfunvz-yLw*8^D5U5|fF@R`Q~xVP}Y({U~Edx=!z zvFUHF5pUz@kJN}~eirA>8u2WzjrVKBvz#`5+@CF#3;x)c8c%0Sqlt`PD*0;f*jUof z`g;?Fq8dArNabdx5_uikJGL!bN|%mFU`HKR2acS*Od8$4l^^bC^e7Fy94e zhynQaVI3DEu(1Npx)FcPk|;jw#5(K)ywwtc{{n${2qTYPm#}RU>#ss%5obW~y4iSm zY`pcy0Urf?0FLzP;e85t4yk7wC`)7eSn3&Stbu?F0 zlbKwi)UTe1L2Jc=7B~EK|Gx}ju<7=u{TWF(i=ZmK>TnP!$s84uf!Y3k{<-vb_T&V={Rf#(6w>Y>v@ z-|8RhKMVL8!DGJl@ctX{;%7nce*v%KEbv|eUN`VK_A}o%5awgcW&PC{cQ|J_Q$5hX zcKaE%tC04yr9>&6%c|{(;@D9igDl=tGmsi1BbUu9BVR%}kZ`<^$QCDag{h)DR^OIQ z`Lhb5*Q0bNGNRW-++@j%?{4$9 zkBp6Yoa*=mZ!kBNPiOGb)7{yFdfqm6>&_n`KXxIO?3yt?#KrM_c<@Cnxr{|L7lgD}>!S>Q~|hj0$}g#Um5c?gF}(ey`mjomhW+pe8z z=dRs5wv4F3T_d}8tMP6726ye+J*39B?7Vf`&T;j`F4QlD3^`wA{RSj+dZfn(#f{8G z31|F8NH8Y&2x@#?KfDueqliyOI)uCRVEqVp=d#4r^+QA3c_2VRy_W%jaF-72-7NT4 zHb{rYR@OLj(u{+Vk!(Z?;ub8(D<5jo44YRJSmkl#-IvZvj`F$6`hp3G)M_z>_dGo$! zk5UH_S7)ZTn6hT72^DFpBk>XK0d^&pZ&e?~Ef|!ud|R z_MLS3-V69bdH+l2op9!1@!1~soo!&>$v6AXcH(;hY1uYMASMgpdl2sx%9Qh}IZu~~ z<%$g$zHNZW6%fyI53ewIggq!Q;wd$E%W}}!3K-K4Un2NuKh}#6_r*)?0wMGiRA!9mx1|x@uY$4_lpcJ)7!c-4_#+T z&v!f*+4$imi5DLfmONM^&9IZc7b@D~Y?=%6kG!kaxh=?u`2l~4&F`0&n*64vUN(PQ zX7cEZQjhC@Kco#B7Y96X%JOdochM4)AJf<3-!K0#LTgz-OUltSfQ055fTta3>hdG3 z`RSI;@&j?o$`RvZ1B4hkTH%@Ypd2xddcZzfPU^&yXIc*H#FG}|AFLDKjCjh(R{SR| z%DeW#H^%W{Jmt7nJYkH#woW|ruP4V$OF6bQY#tX{PR~WASm*PRDW<>BG6nu#6!1o5 z*p_h!ddbEul{P^B7gfrv?c0@YO`S^ltk>3Vylp49t=)Lr)&(ht)mgUResQJI;Z~lI zbwnpwJlnrnrho>@Nct=T9<7rY&or)Y+nO+|KdzU)X>l!mjyX2ZO8sH$5Rt_N(g&K1 z{$P4bi{-MkD)on@W#gL$fGm1L{GcATt%+dqt#8|!acpZoY->wD;FaiSPx>wKmd<&4 z&cOHBfZ^jcY5}I?h7R@83cQnV?K1uYwuo&_7{^K0m(O;kKL3|cT!VWqSFd@k8a^y| z!}l9{cHY6f_^d#dptsoKHw_RvcZ=&TH^tKWlXQ9|k z=20B)t^TYPPx-a_vsOIk8CHMRiYJWm)ZfId%%5ekZN&GVLl*g1nS{J9W&1Jiiy~jn zc&Eq3fClp5oQ8ZM?3dS={=~K;Up23;HooOG@tOwkPbu))y184JrWa|*pJAEf5oYIH zi_llu-lX$0;IVE^1Nc|*Fb&5R&bu~&4*5w~L10#PEgs7s8^Aw27LRRf^_hinzGmB> zFqT#88sxz;-wZNi<6Fj0;e8yAFg`2cz;De9h8>;3VAW&g%0@s=HE(VB?fPS*LtE9) zm9x4W>>6CV*4r^Q?A_4W-QBYEs-ZCwM*&&JqP)|)hyNPS?*s>);bu|edEat?x+r{p z^S0Owzg=l#opQ=L7rN7sExAHTTunQx?W zU--$bUq3Z+*$-QO{ix*%=b)AI(4XGkR|&G{4gWpFfj58g<}cWg&wm2{1~(npQ}heP z1KG5HblriWT(Ufcp9G5sZcUetlqU`h;uOstiOf;I;JkL4U!#f##{EJekH5E`jY^Wwdb;eK)UptHXH?HD=lA$_XJebcWOQq7Rp?ZOe zs)?m9R1t;R`IRj=$8$dK|46fXhR`prK@I<~`JX-t$HMNIIL$lvBQUZP0yVHZUM`<2dYe6c3^6#G5Z5F+Ef+gyj~#Dwll6N^ zlWZ(m!0DPW9jQey`@D%PSdAPE$3s+;g@INk!J(VOb(087Y@wWH?e|Jx)n;iu9$S!# zNON{hwB6`+btQG2EDKd1M6xR+C(4tP zIDh0E!-kG6_=jIh-dXp#H)E)HAxEBm@)uaAcc#_D?_B;oE zJ2B`9Ck7GLgI8=_{cQ5|#K9^ZUButw#KDdloZ;9Rie;{_%N>D2ByyY;5G1Q52?~)m zM3F+J=pxYi5enyCPQ7nsh8NmB$f7oFp#! zoR680FkHN%jEhEiG||4wiH<CrP z?PuaaALuZBw>Mszg+z*;g>VKF5C{m#Nd?RV1h9A4bR!(&ahiB4GQNK#D5Q(ItWj6d$=ZQ?rMkDdjNfc21 z0ZJs^tp`3viNry=%!etpq5C3WBPq@YE0lrW?(S|cSMZ8CJHoO{XjNWw$tr_GQh##+ zIqKj_#7+Y;9Ehr)w%v%EZGSG?k85%6UaS{qRahd@rT<0jN$A*_73)2`}##AiyOo z?MvQtB2)G|N#h+U+`5*f)46miY}UaD;SRJ-= znRstAvfKf z-ILM<&@SUg(nT+W@5-R)%9)fm;d|w5A(zScsSe#JB{M(t(o<7@D$N;V&U|F&Bq;hR z?gg<$@jF7+&v-=?+nezVzBiek^;2j+4x2W=8JiUvnjaPMLosBKFXX2A+k{~6HwF2m z=w9?kv_i?7MIG$$bt6JIF@$mJMsMv}&J~!^y~g8flnNop(NH=Tp>!-l>6lPr0*9JT z&(9o<=qB~(>IizQ`Y;e=n-L8n1CYmzz2LgG*twr zb)P{C0SUjiph1ND!Xk(Io-FEBDreC`nPVMDkb{Ou9ua&miKH1nks_s0A1nEF`9wC$ zO+48YD|%T!QP4%1NFXcZotwDZ$4+r7T}%%%lv*5V5w3T5IiLn_%5$kDo4z zWQUB2Ag!%~q(8f2)@+HA{niax<{`ZqQB#qIDv+0xh1`@*0u5GCwyrLxGkVBZD+A)W z6Hf~q8%1Rv~_jWA%YpU+e~%{vw2t_JQdAXyFOiAdaB-8@NSOK!;%x@ zC#Hc=eK$gAD|74W;>r{w>@7W;h!9ej>ArYwqjX_)tC`z2>1b+5pA4w)+;D{o1Y?w! znBqsp?9|X07(yq^N4s8WCWoG==axmI#v#}f9AsyXP%CR}_Wqf4CgbIjNo*fLg5SAP z*BNBDvea92C5Cf_9f^GPKnozmkb4vr>5Etwl|9E9yFuOD3pdtH()$ z68*s0lp-88h0lp{24f!eg65fFB8L!y(4PU|@CQu=UCGTX z+{C-M^|1`@dQG<$mP_SKST1gDS}ZqX-2e4TPptYm;`cGc_X$64U_fVSmu`;c;bua) zWb{ayGo|pmcIq9@F4NKq`nLl9q7`VFe%o82jkG3egH*`Wu&XPWGZk#&K}c~ct!s0k~%`Pjirj$E*54BwUeM7z^KXvw9&REMZZk( z^j3>(!3juD3pjCzwuJc|+UROW-v&)oq3O`ODcv$Rl+ICG^&K=?K1dLyZZ=5J2m!ay zS3%v7lKlRDa0jBU&r`3oi3tV7u`uibU4$ki*lKzlB8@JtdTi4OQl{yMaSc)XK80`;I$@-(J z)Hn0@w0jLdNST75_edgI8|Cf3F*>ket0PkV>#q;urK9LHYu82yIm>@1(|M|N?u?4$ z=Q3@cT&fvYMI~er>5z|ab6Sj*W#uk+ls4&un^TF|w=?TTyF|$+?2Z=c@~L1vLFw9E zCBg(qK2hDr##_y3e^0YGB6JMOD?CGn46H~FdGSu1sM9ezkKeqRKfI8ZQ-R<-nKOX) za5~$kr*M2*Z|CkzD!;m6cE?S6PRy`Lh0U77{)Y{1DJRx|epO~>CN=L2um&GH>eL9Q z;qZ_jCL@NX>&*`8&g^TooGbJWgK85;vxfOYHShMZPlwS)&R9Z4o6T&FF6Suv-mNiM$=ZNF`lkP-SO}=$myO+PPNk zv3sO{Aq;D!r&b;|S+G%1aV43VLqffAzVAr5BymTk>P>+#S(ulR5mYGHVA0t|_9tqq z{xdE@fl$8+6mqvEtIL5IQ@Dv=N3$Rc``d#%-2=F4ey2+l{=N{-+|7DL+Dg_y&bF5+ zD4Us2&G9JYrqk0cc4W3tqfMaxs(<)%h8@zmS4%1dIVr0vvq_5?$qYU|z&eg`W*W~O zFHBs*GLZnD^X)2z$_45%LadIa38vSz1+V^`qpBmin&qtWtTC`wc5c$F;;#IdHm|O& zBven)n(9a8&K4f6c!!Ts!RR~+1l671@~f%ryiDSlU+6HiVl5!^=rNlKh5SN@E$KmY ztC__J)a0B5nrSMZx2H4=f9t4@AhJq<1ToHP%pMwQtCBpB54Bg=qLnpZ*g=Gb#woRY z+yMpIhUBy=t2Z{dvj;af@LOwR&2_U^F2DL>Cs+SyRrDr~If^8qx2R8r2K|dhF`+hRd0ZK1c!yHJc=TSglQBZ%Yu0c|REh%tbWijPw`Ot^2}2KCNeTS2csPXMw1PfuYEJSSDFVz4qJ|lI*(spNW{uf_VFe93 zeyzh&HG$1~Y_7#qxl-H|&CSjn-^WQ9{TV{ov)v5&!@nNZ!6i~>CybP@&VmiU5a|tT zr`Vul4!ujwI%m0w)s9UXKJKKKnItBP?neS`n2?)v&Iu80NA(_^3OjPeI45O@@F^&S zb8u9u#_I8@O2*G|h1Zz=+R|wN)Axf-YiUU>k`)Kj%yFXasR9>Trg`)RQ5N5Z9dqPBPP-wsIkzeD zq$!7STc#%JM(@{@IOjtt+QP#V2yE(c;tI%{P0!{g}+~rDub@ zY=qzDUGH_z4i6it77hhu_v{?5qAWONM+pS@@o77>+5ELe>-$)5&-x7;H}u}nzrOop z8@t_b&m|U(Yt^}oI2q;92W{7 zHEYZQ&eRsLHK?_YXFewZTRZSt@{V9XFkLK`v0KX7I*-KQmoS7Td`#VOJVh^1an=Od zCGX`ki7bDY*4a(zE$*z3g(&t96REqgovQJtvD=3;Gk0UxrBq1IG8U(f5S1u(cG}c& zwy`cTqFGoRZ^{&NSPdI`$s^oI@NUhQx9SgIik*WvFH`6+p4r*tKB?(dI}+K%VSFW{ z;hgB2GpZfCF%$6%!}xJ2Gny#!*dK~6O~gGR4m&;gZHA1*{)QR-j2xOlKyVq)UsP}j zFchL0ta{q@@Pw#iZEd#s1L}2B#6xs98|RltZxYW6?D_rg?2@;gTN&aZv7|D!IR>dkW`;c+x0+Tu;=EGT}x? z@KdNa%p_RTcOl0(O4mMUwgv3$nX=c#NFJC!oH>Y7lKR)N&KZNLe<8D_*HXr!@?;sh zHa?5Bc?L9?PYpV4?ZbnjlbE54!JOm0?Ya!u%xG(OBkhr3I~$RbG8eXnRL3PQtsbFB zRNdE{*&&-y_s%|#Ul84a9Xf9QNhBvew!f#ZD&;OIW0V3ey7vmmQ|FA6ZcL0^XGq^XU0ny!!855*z21X# z91O|=_2Z8nNl%s{HPO^gkmw0kcSC3I#=f47>!a1}HPy9cJ${^(w{>QSb2yt(wCI>& z*JcLJkTF-D@J&wi?(gZ9v+=3^D@XzrXqfbBN8a$(QUE+V_+blL0wG614L67G#U<7XhfSw zG=(mQA&rJLqP@R|qHS_S=WsG13vx~pgTzdFdQ1{&Dg8;2mq%-1?>Z=AZraO{AXwWE zk1R29(u*hg-7dN^*mWF3f^=jy8A8!+OrR(%o!HA$-X%Ft=81;Ku!@Zk6vWQ$3|^5P z;}$1#q%VMjn>{XzG)`N)?Hq1CecmL`0NJ9kFH{wcz_o^8IH`;ZvnB$0j!%Y1cJ#;4 zz3pJaTK9`EQJ9nN&$R-R@5UUhDU95yfAz%AZbn)5dfBOIyUv{`^Sf^>4Idn~H2E@s{%=Q#$ZLS?h*hsQValZoRkyBEOcb)5(N#7* z()3}|>qTh^>%elTe`YZ`ChG5jA}Vf z)xrdLanho)AWyhW7!+5lL_`>s2+tWn9ST7?NkodKX+Vll1u4P_#-4DP2VtbVQ6kZz zU?gVbsFF0~tY}2TBq|gz#kQ@>Es$ZCr7Q~>>W7k%4q>?#VqJNoj;Gf{jO?f)ouSkR zD(owU%5f6ubql1kM;)|^p6=5WG))v$w7+y*Qc36!2upp=^tKyAyJ@Queivkva4D7V zBa=ibYK;?&MOwC1myruXgn*HR;yodaU=V>p~Xm zl4RoRh^M=UX*4X8$f8o8rV|j*xm&>&9?77mhmv4mG&$)J0=bkd1KIO*Ht2b^-&lsA zlb#i-EwHplsSi57T8(Z^6w}G*-ekYIgu|?xgMGrp)Io%}i*q*^4wFOA*rmGhC3^rP#~VA{kjHah~C9p12X zqEon`Nx?jh_4Rrb4*#PgUpddiL7RgtbdiHCP>9~TiAgKXQg&u;5{1QxCJU1YlUTL( zxXEj+EhRhYLd2B~>1YnK^KdTz-}c^TBOz=lVFAHE>Gl|9a29l(qR%vtYRK}8}t-aiiN#Z2;?c>GvqRhDvRc_qeD{m({&yw9!aoLdy??@Q8 zS6n*RAT{pDYuu4%F79(yUj6TtJMupGv+h_ouHHQU2Yo$IB(ydzxO%z*!2 zX($5EKf=Y~Nc*b3(Kkvk&haF|dnFED@Gy{ooUu{|ZJrUKF~F`(1u$LuISF zX?ZJ|6I%)%omle8ebzr)+mp1FvUz!o_x%oM5{HYbd$vb0G@d9N_Dc%4_pU$Kts&d8 zrNS}At28xR+f^&f)8G!+OLb6vmxfyK(5ESy63P`*r!{`3x_LQF(7=|9KBZw0=lOqy z8eJaKmRA-C9Yfv1X*<}^|Lzj%nFELU#sHs|Xe=FGVQcBEbl|l6V&OD( zXz^D$@YN37bKtaWWbxNH@HGycvTo_e9e9TW?{MJV4!qle_dD=@2R`7yH#+bk2Y!|Bd4t%=%S;F};Pi_s7dshcP__COU@!DSzIdFFk{ z!zRegV-C%ykixMu@FyMkHyrpW2Y%Xtf7yXQ=D;6u;Ey}-(+-?E(w66>1Ao|o zKjgqqIq=Up@Gm>?haLDM4!q>R=N$N~13&4&PdM<09Qd3A|C|F)IqtAVwqrJcA-mbI)l*lHMh znd z<7y|+rmU}S(;bTzEqfq8_cGeBrRDP2gNK?`%av%_)o8MKOLz0?CD%5uLF27&?q0H~ zWeCkV+&qHt$g*w^G&x2{Tk1WJb7?|bFUs(9y8WWOWcyjTTQ9bsg|l8wYA42;oy*%r zW}ia+U^>s#@47_`md%}d@C532S<9N(r(Z!x(hLj!w_${?+2ZepuztF=Wg}$ufg^J# zk!)?tZLyOlFYbnn-`;#^$<-|zDAfqvux#Xk)u6@sl*kXa9RZpDvGr#C7VG)+_wg3C zGwWyJZoSDT3unEgU8T2n^P_nZ|*M%B8DK>Jtm+cyRu*@Nz__gtG8*tdf657G92#f3}>IsRKZyOra|UaMH1G zxBRS^g|qzR|1*%MW#E5>OnqifWa_i8|Mq06Ro7*8Rb4E+vMv_Rx>$YmanUcoL7lkX z()xDQq6N*LeQC*(mXG751B2>9XqxyTRB=hmm9d8oUaTn5 zZ8!Tbt+CI)cIsEZ-v3v-?!W5?*Dw5cul%0bKWUBq_|Lxjp|AeK|NO%j@A}j$-}>6$ zVgk+mkJi|I&%XSlZ~f}?|NVQVU!T19vOABMy&3EkywtYj{zo@|^Y6ZU|KEIV^XflV z>NVv1292=diQ(@i^a(zX!@UeR*RPn|%!#i~NmzXKxP--5-ZcMGU;ReH;;Yq| zUy#1|YCyu`t3whNU(HEae05sF;;U~+zfEIgZ0uapTX4ueM8Ae3g>0`061Ei?1G+u=whE35%~@m$3MHOl1BX z1DXGT@#n->;}RBMkNePdbJY3p)x*Z06JI?gVe!>-5*A;NT};ohis@HEh8Y%L^-EZM zH7a58RY}6)t5XsdUp*sX@zo0w7GF^>Ge7ZFhlIsf0}>Wr>$WR^PaOweoiP5K`061E zi?1G$u=wg}35%~@lCby+^K8=Pd|T6B2A##Q_^K7*53sz(*E)(}>MHnZNaDp;DG7_O zPD)sO^_YakSIgSbX)2gvD3SOIUpMl7z)qzmc%`sulW?Tf;dzW-h5$5F12 zqFiV4dmzuBm_x2tQw z&z*+Du&no8IG@}k;Y0K>x1tYqsvoX%iL*t*T*orJ9gZ{((XU8zHaMKGlFlwTKAh8a z!@o|4jO}&4Qm6OB?Sq?z`!d|qaL>cN0k;x`=!YAJE5V(D`(1qW2h8fVS6eQ}L<77! zsl*hC13RSx%Oi?-Y?sFr?g!uPXGXCJbhTP|c?+1c2ypv6r2>O!YN=Xv`9+B1yzmmW zxRrbJSK^&*gI}6fkhP>qJo*-o`!mE_3jY$|VG5@4SWeP0@lC1)VWuVAro9yJHm%KL z0O^^|#x0k0gxhqN>2x7Y;-Y*_SF6>R6A#lO?EuCkMCp?PlUY=B7h4m{q^ZxDV+#lm2QK4|JD0c%FmzVZmcD=X);x zUQcWz5rF>@xW^#|m%s`%>-pAO2;ljgI1K&j6ajdyP#+BV(JE|E|L?U|Eu1Nr8F-%y zXB#dy@Ls~dpqf`$*;5MAq`%HmS{^A2t!k$}>PuXUw_2IgbloDO)FmAXS1sxfnY*=& z64oEUdIH!@0jyWUSnnZ6<|)gVis^kdc={QqENcUZ3hiO!m3n4T?EK5l{5zyRJx-rP zIq@;6;REY35|lfv-*^BE>vtf4h4o7*eu$WxDLV8^N*`bxd+^82>d;(FUHR)~b^Cv5 zQm>(rUz;_$z}COv|L$@Cw}LioB+_1IXP`fDhB0dT(B6}YFR@%iep(SlwD&GlAoAmh zD55o2W)UlG9ljfFB!;Kpj5fj5SHUT`Fs||}o;D*J8rx}D3eZ*bSH-9rsafelN69f56C`-MfrQlMF%xu&W$k2)?n3GZ5ue8>~MS-4@I&&XH9JYT~+ zpBM;&ZZRW?xiHty=-ZuY8}M`Qy)@s5gsJ8F+-kE!;jNVo^L$tx@M)Omn=Jagj=N!= z&*#U}HEsAc%=5v}C@!REnCEMl=X)ot;MTQ)t1n45_sR}8%=3u_Lf-j;dp+i{-*@(w z?i%L#vf*7{TH5N_c&K3*pkba56DZjYi5LW|Z!FIk=4+VeGqy~u0g0rs$0gUhi=hQ; z=8qS#2Bw)B=J{laWHw=Ne`x6l?n7^w=cD}@{&7v?E+Sn^EcnUL{_H3ywd}Q2W7V;~ zP>ooNoH3aoxOSxqJD1J^7LnnWk=HQKC+eVKp08n^FEBgJwW;juG|cn)+A>t7J)znL zifS;wTzS17CLjqXE-8LtZG}(!`Rm_ z&(|=|hg(4FuRi(HyPexnl7h2RftkRDc|P(*Klk#AV{MkhuC5y9`4UMVS0T#uK}-Ty z8A+=gPRY&M+D)eP)iaWsG^2wnsT%pE)e@MGAIxEI8TLv_esLVOR7KY|%=3{^_BmI9 zw&`5|?J14G;9dQt9aLAH1)^4JHLQGAH?Cus&g5uM8@V;$yMu_4vtgdE-aX0<^L$=S zgU@E)!`VE76q#exrhgP0=K1(lhq;>E?Swd1%>Jh@Rp!gP$UI-e+??#e>#uLB?#$+y zaG5}wX=KCP91iw1%*{2-%{9!;Ma77vEX8s_E-S#6c6VQ!9g>q4V`G;>T# zf(>(XT(xt#u9xn+^&sz+De_j)bj zS4n&;<_d27-n5Tf4RJ;VNB`z62w^<24Gl((7IJqJa#c_U>VY5++&F7!oANc` z`b-nIt3VU)iBdY3)#bZNm#+!(Wa76c!Xs-%q5na_=@uM)+75AH*?5boNgvKgOuV6Q zZb>D^wrpY|-cLBf02$eIWXmDBIB1zzK*{Z@rxua zG4O>Mzb_aYBY_L}Ae*`mOU|*OEa~)OCP?o0Qde#kOZ0clKjUR@+CfW5?2uHtdJQvGUfpuXlePj2Nxhb^=?ol`j@=eI#{H#p}HlPoV?i?H+AK#~M z!MspJ&6S$xNiA3qT@Y&S&12_Tu*%y(m3s3RZ~lU9uG`%=Dg`eE|^;094{jlZNkLtamk#zRxZQ043>dGdj{G#eA7Lr{@ z{6xwxOk{G&qXsaU&iKWykgy>#1MbyQA3rE}s;h^5tA0U1id_F(Dz0d8@ z2H5!juHwK-l*WTQgfa95jLLrs|3^~7QA`488=kh)X~&56)@d94NyK+x5J=_Mk8{js= teGG0B+>LNtKW~Pky=(T6pymxpUS4GuIo@c!h${|9-667K*2 delta 1290 zcmZvcPiPZC6vp3dl5J{(hSsQ{CJW{u5+q1H1QZvOc_aDMo2iTHNjQ!1ST7LJ?7tT70z z!M}~LRNqE1#*Y$M%2bS94iFon`~WYg{EGg6ei=N9{5#-D7Erd-U(4-54RBd4{s^8E zO*H1u6kmt8Lil^|C2(Kd*ZB;-0^X|vuB&u-H!EBjH*ztNw+Aygz$^9ws8Df}IVP(i zS*kMy|1gBtz*j@~O>izwP4DYqeYy?uI1sp}GFIW+A^a(LCxkx-=hITt$=7)Y@FIkN z19xAA1U3*@3*npKd<}3t^A{-EbLXe4wW?KjaCi|kKZD4RU7W2hkmq?3#H0V>QpQfo z4>3a~bt7H0ooTyLE!MBs<~f%ifbg$_!4qgK zG=VYO75G!|K^@tSAK}W!f|YB-IoI?0$BjEtX4#b!T<@ZiGr@yra-m_@oSAxK4oN>$ zPN0^a$}ezcKKHMA3!Fdwovj^I0s{X!T*poTyfwb-zP7tGnI9oCvF~;4qV*-=#l=YL NZt9jM=4I-@!e1Kjk7ED; diff --git a/Shaders/TerrainVS_PNCTTX.cso b/Shaders/TerrainVS_PNCTTX.cso index ae6007628af92d9b9ffd6c9242489d1373573d2f..66436820d0c58917e6806f906c7219f1721415fb 100644 GIT binary patch literal 65180 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 delta 1287 zcmZvcJ!n%=6vxla$1}A-Lu++VlYkvWq6Dc!K=EM`Cx=HYBI4kqNkOqmNh+l(K5!5R zhlaa|w3wkoAr3-1D2P~a$Ph$|h~O9K;@}YI&?Qm-C%LzMhIh#2|L*U6+* z-22|bNncbbxg%r5`fqZB?ov)#pjLxAD=>^jE%*Clfv0#-dczJ#d9YLghm#!D)sa~)9;ScQir3{{u zUxINNG2+p*U751;g>>mwagJm80tkH^BySt3yz{kqRg`MC%NCds+3)6|9b~ diff --git a/Shaders/TreesLodPS.cso b/Shaders/TreesLodPS.cso index 7ec8c6e0b5bdc839c86f904062530125486915f8..e5893517d3c494b47ad3f23df62cc42d7f20ce0e 100644 GIT binary patch literal 32596 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 delta 597 zcmccek8y@Tq)UX8^Il$yEs~+Tq@FQpU3{^FIi8V$fkA?Ufq@lBn*gx`GXujFAm(6U zV3@c#@(GXdq!05MRQK?aB!SpNTK0BXJsl$bL)P*8m02M)$%6X(h^ZkQ~{ z3FhsY*eE^mhe`bgplXmce}K3Eh+$w4kO4Bz2WW%T*!n+=fm0Ae1Xk_aH30mL8&S3ubcKz0|DZ2)A?fwCQd z>HswC YF%VByVO`9~x%mR?6DG!z$y+(f0sl2#+W-In diff --git a/Shaders/TreesLodPS_Deferred.cso b/Shaders/TreesLodPS_Deferred.cso index 679f296d03f01d2fb7aab6e6a031a2259c8fd2d0..d730e78a4adbae8253a2271265e956d7a7132d66 100644 GIT binary patch literal 29512 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 delta 65 zcmX@{jByW_kxPV=v*_KqPA3Hz>% diff --git a/Shaders/TreesLodVS.cso b/Shaders/TreesLodVS.cso index d3b15fa852170309d6f6638563d2b38629be7fa8..bb3cc758075de9ac454139ed43a814dba001d661 100644 GIT binary patch literal 37748 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 delta 748 zcmZ9Kze@sP7{{OUM+sR75fU{xL^L!+IRrTzYT*zh7NJAKffty+Ko1-m4qF1N;jqy$ zLb!&&Y!@6F8jNW7PjHCF>ig9DO5Fp`J@4~*zVCDQJoIXCNbToDq3M@C~UpF(k zX#VA5YeFHS{uGfHF$^EMiH05`10VsOif`{cfC14E&T$b=p3g7Bw94Qr33IJqO>%NVJaLY z%8L9jr`M8|vUx(bZM(^h&*uStEzC+-0M5sV$afK$Ie8j91TH&dh2B715}c9bXGm6l zxQQoB7S2&vMeb~L3BCsIXEE%WyTNV{BZy9YOe?1J0@(@%Q^r-Iy-H3m8JdwRmnflC z_w#dlK{t>P%|a-4L(NBb$h5_6{EWhqT6Ue+)faD9!TBh6dQj0y)#Gxd2vI^@<5jWA z6{f)D3jgvW@DRXQzad^yK!Hc+0wdYz6kK)ij>r3<%*0dA_$R2Criy_&{>dk=Vl?0U FwQoB=Sr-5R diff --git a/Shaders/WaterPS.cso b/Shaders/WaterPS.cso index 3257588dd944a5eebec691858f836d8386873048..9373af9aa227e94138f8dea7288da2672b811db0 100644 GIT binary patch literal 138292 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 dJ^cMhxp$w?lSllHhSVAzIc4<(!W3c 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 delta 64 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

    {xwAdXpxj7-U<1xwuoKQC-V;5FvdXXu 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%0Di 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 diff --git a/Shaders/WaterVS_PNCTX.cso b/Shaders/WaterVS_PNCTX.cso index e088fef2235215fcde05710ac185bc36a2379669..702327e15c5cb83a08ece7d7cf30afb6e1c0e082 100644 GIT binary patch literal 91440 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 diff --git a/Shaders/WaterVS_PT.cso b/Shaders/WaterVS_PT.cso index 8c14e8cce07ccc6d01c7cac54c43e89c3782bdd3..316c1dbfc96d3fcb3d8aebe212960103b716fb88 100644 GIT binary patch literal 88468 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 delta 788 zcmZvaJuE{}6vxkPOWOo#fM8f7{>O%B`R6>;JYe1A<&ExSzpAf0kXpkV!AQ1_h zq#H{|qd~-EG8l{ogTWy9AH5H0oaEng@9%uwchcuQaTu72PJ|;v-chagI2>y1YMsfa zI*$YqRr!cY;e$}jO_YINpdByK5i}g_>Gk36LVN{cUk8!rI4i z0@Vog|5H#89tY>g;z%w00}I0QV~Yoez-Pb%5U0je{scU)rqCz*+h`hr3PXIs>F7&3e5jDP2W@jcOl?#nbPJG zh9pg<2IuF~(xOOWX;>QQBG8=WSY*vG!il*>ikODEw)!0te};!P^mIFo>&cX~;)!Gj z0oVagVD=DS!qx!s@lM^FdJMTFmo18$Y2DJz<)5LyUvz@pbCu64=QFRo1QLY5D>~*~ y_O0i>VjoZK27Cfsh+STkl)Hrg^4i-hgx`Mi4OR8_wG|4G0MkZ7BbGhjU;hH^U}?|*

    8%hKNOwZUkIYcpLp`zdB^ zZ8-`_y4(Rtdrm8+=+n*eX4icoE{05NHb;xe9aj5IOz4G5Ya>r=QvN5Q;-_4Pc6!{2!18+Livc% zad)Bc3g7^K-}eoL!Z-a$q3~Tu@;Ro%=PUqGg;x+a?sF!H_&FqgFYxj6uzua{-#7nE z`L4r;=RV*fNnc!e?X`RG{n~4&13rntefTZ{_<2v^u6OeLLF74$eTnoM^}?%<260a} z22bX3%~ZN!~1rG#k&LrANNkgWv;UK^t=mk z=VUDQw=x&rY2~~daVqw_*1GWO`z-v+h)-Sw;WR*M>B;K-KmR#VJ+bu6iN(Sb?;2m# zq)_-cpzucfkLS_rHRd&Z-gAHH)n7pcHqoX0A9OAFUzi8*`{(U9p9!zn?;o?@pSIsa z``)tfciZo?=tA&Vc*VZwE&Pk@_eU)~yGN$`w1t1c!iVEtJozy6QU_(fV3jX>X0D12C-$NY8p#zb!) zoa829C{3LGW)d0GDM_>apLX8@-j_K1=+P9B5bY0Mrx zJqR3M3itrv0N@G0Gk^<#j{{nOO~5w-J_Yz5zz+ldGTk5^$XztTYM(RjKJejbK*ogU{Ojz+4T z#)HPi1{y4-|87i=H163RS6uSeM(BS;=)W87uJO;*QuClbFcSa!EzJQ-Bj>vjNBl1T z6Bc*c&u~_Px}!6)_;fZB=D)|spOmYMWL_fqze38s2O6gIG3KMs*C>ub`S%naw0O-= z4iyTIdfwdQ>(7{YU%w!HKrv%KESY1&*aUAxyzV*hL6I|zSSCl2Ybu0N*HsVh^=U%i z=V#GjP~Kb`r*B~z@rq%%RHyGPBvu~M`8QoiBISKZXu22uvC2N(8e`s$m(o1WR47b) z`M%fp4SDxfIDD?m^M)^T`?~0pqrdC;Aj&TH>jwICFZxNP$vZs9K9X)t^d+66{ZrX= zf)5^wKot9rY1Hvel14dC{XSo7HSm5~;%5+lui;<{vx;6?G9Df9`R|rg(ISf-*bYCe z&Bp!ZyV%peweXH_dt2ch*WQkP{|tU7fc=2)VWfSy=zF*OVc#yAYluXLO`qcK!b64M zc(4BaMT|6*w4eT#&-i#5aoU}B10gd%KKtrqTz7+K{M==n!+4D{@8b}F59{K-?~;;O zTA}b&fbRtSGGGn`EIjriJk<31FSeVFYcnsN=+uXNzutfGX}oS9F2A^d_3R6^7QCAT zk8-4pnHFj|P5S)O?A2DkwM$g8jbo^qyTtVz&cebS3ysoA*>2JK_3)lx!yyyznygUx z&Cmbl=h@EE)~>vur~a01S^qkgDQ|hHQ25hG z_nAivg`Y&G3ng9q77<41VyVNq!e{Z#RnPwfd>-)4fNunR6X3rC{s-Vc0Vrop02h0| z6Y#qLzZ>wafZqf7y?}26{64^^0N)Py{eV9J_zu9Q0e=v{as9gh+z0wYfIkf28vT0# z-v{_3fbR$V0N@7!KLq%rfIkNKg`0Ieb0r;B$u(0qGfWHm+JAj`A{9V9L0sbD~?*o1s z@DBh#1Neu4p9TCQz|R3b1Ng^)e**ZYfPV(~=K$_&{R_aq1aSZ1UjhC#;NJj#0q}1D z{|@l)0lx_NCBT0G{71m&0M`Kb0qzGp0C+RtLBK^0W*ME zKnZXFPzF>0Rlpoz9&iwF2yhs11n?N(aljLRCjn0ZjsiXmI0iTlSOA;=oCKT#JPmjT za2oKHfUg3a0h|S#13U{j4|oo+2v`DK09*t-4|oCa5x_?QUk$hfcoFb1!0!ND27DY) z11tmTfE7RkunM>WxC&?i)&Oll2hasv2lN1azyL4=tOGUxn}99A4Zur)n}AOOz6S8M tfR_PZ2l#rxHvrxQ_!ht~1O7AMR{;MN@LvG`4e+agR{?K){{Q5_{{>JDb~^w7 delta 2430 zcmZvdUrgIo6vxl6utE#+XE2;bq#2zfafyu01(%t06i^<7#vyJKGrP8AEYOnDsfjZ! zZ+l?@ubGQuvB?(GSssYs!o&U$vxh~QnQ`&S2NQ`ezWCsun5gsn?eAWwzx+3!}e&_i=0>^?jEmBIlnG@j`c_6>6a$6S-C= z^7n3$TG(Fg?dv}cUJd&XSm1|#3Qa2ieIyu%U>mhW9r5o_4OX=^Hh-nfO3&YF^UPSP z(c4mjv-AJ7S(jC-)n*mci}+npZ{qikdLO^{)fMZL>@0jW!R>-aKF`%Up-3!KxSP!RTIJk*LqB z#T^Fvv||Fp@|*bw*wvPsT?Qu}ms08`_6+?l0hEPW~r&037FJ zDWJoT1=0*1gk}P`so}f8J2Z#d8mWWG6`wYQWp19$3G&wz%N>AbvI{0Wnw)V5f`@zW! zH>GeGoJ+_{sWA!Y1?6GP0>g*E-7DV^`=4EMLIKjzRZBqYT9g+3~)Hf3ja{+lX(=wv%&U>(TR{)N{D*k$S!*Xw@yBXt~wk^=+p` z?cUQ~dWQVv^WcO2cWG8`0 u)b%~Lt(xVjj#*D<|3Igy5H2`6d}KHSy@IA+9%)4XJv2BFpK5*fjsE~DXz{)P diff --git a/Shaders/CloudsPS.cso b/Shaders/CloudsPS.cso index 66e1549ca965f0492edd96c4145bbc9ee1faa8f2..188f531151102097f267ddf395c78f2f7ab73062 100644 GIT binary patch literal 48268 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 L24W3FH1Pic!Cv6% delta 1570 zcmZvcPe{{I9KgTRnSUB$mM9c7%7erX3p{!l&5XckSV?76Bi+ho6E!Uorgf>=!7&h_ zLlPFoIt=t6B;=vMLy$oSgNOnT1%o^YMMU-aZogH$-gkWW-TQq1zV~<=d+g3No@zaL zAow+SZgb*d?sM1MM#*|E)VV|?Rx475ZAQOUh|E=rtW}9@Y!m5dJ=nGcE5$d9s@;W( z`{yqqIfZXD9j>ZRWh-3C)cDRatvHn$-=11+PK@%~hvv{#bvTm5mZ0y-MaCSaW(w5~ zeyaKvIO5Uq5KqBKgR^eJDswyB@9+S&MkMiH!f_lrzM0Sk_rlEv5xCD1-v`$L&G;Me zmOt?cf&eNvu>q`^a2MVVHwQ|?Lzeja@H3Y9NAUAzJpE+>N6eD&6y9$puwH@dwV4CG zf{(#D*1W815^mwrDUGzuMh-sb?fK5bu>t3EA#{0;9ojU(Y}| z6d#o6iO!>u$Y9UV{z7{S>b0t*zgIo*dGvyi0IH4#XWfKVrmCVm{b{SWUArE>GA!4e vK)rZPEM9y9uFT{UaIeAVr#<^hs#`m1IJy9nJ?8-C-&A|bT|?=QbtAt4vL%!K diff --git a/Shaders/DirLightPS.cso b/Shaders/DirLightPS.cso index 9accb646f81f88296d5687723cf4d5b294f5c330..e80087618e91ccc1b49bd75a2fa61daddbac441c 100644 GIT binary patch literal 87508 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%0AB=d31JB*tM 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 gA-m81XtTVQ+cgec_e+Z?IlqJ(>Dysp*-W zE8i8vpJV8t|0^&57Ju@J51$6N{mKJVHaSTDK3vAHG5v$mFZaB>Y?o{K9CY$+d44$$ zjkiXI4GWEcdR?CFC<*9mbI5N|d{O;Ivz|02SOkJGSlnDg-51Ifv>Oxh9psmy4)@_iha77?2{i7b@uIIe5^AP9y|W3kJ6 zJ>DWljhbRK1~Q+PMApp=nq=r8BXuMoqu4QIY;vfda_U*dsIB7jQ-8UgL|g0^@e+&L zD{5ldfS&em!eVvKrne6k>J>}YmRM#?xnYA7G?fh(V1;LST90LRVphI5Qm!|g1^KcI zi8AtKffD5;i>K8vBcqND_OMT4J0zDU;{s#mWup3)my_jcYmRM5$1qss&CpTOjyl^a z`Mi2E;J*b7qar_6TP1BFvO@AlwPop(lTxkP**6Bfmtl+YaqG|5E_|XH(3HcsAY~2x z18yI-ed2ClX{NrDg&7%}tl89#6y249kjZhagBkRmv)k%{V_BTIpatIRnT>sJVy!S$v9wK0P-VB4L%RDMQmO`vUEt1*C^9 z*zKdhx=v1DqqdHx=^b!(duZxp?-?_$zI?g)M!FM~cXhIW_CH2yTC!E~a}EV^`os_? z_M26*T4jE=Yn+90T3$`o)~UpkQVR!!8?0kzAcm$M6$MPkGlTO{n4vtHYE4s!V5drijfX!oS?K|MAV^O<_OR3-0LurwIz@A=deq`@$-+pU% znn}diR|{zazJ^a;er+cB*!YKO4(^8HU4AS`pn|MdE9+@ K+H1&@mj54&`muNb diff --git a/Shaders/DirLightPS_MS.cso b/Shaders/DirLightPS_MS.cso index 40884c6211f51d28e4d3dac2184ecd3d1c2d31c8..5652e112e09607d530a8d90c375f423b2ed95858 100644 GIT binary patch literal 176680 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 Ap8x;= literal 40892 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 Luuf_X9GU(XLEJ~! diff --git a/Shaders/DirLightVS.cso b/Shaders/DirLightVS.cso index 90659d2fc7dbb50c3399be34258070e8cb24a58d..d9d2f8c72295ba894ad5fd854db5be227ede472b 100644 GIT binary patch literal 27120 zcmeHPTWlT2d7dN5wnU2-C0mYStM1fkoI{E{cPf-@+OkMfQmYFiN{Uk{m6wNm$hG$D zp6u@7&2nMn0<=JD_@O|b+6L{T(;#U3Py}sZph3|DC=jCoS`>XMil7AoL{ft`Knk

  • 6A!*O~QXs>qeJ$q4?Y^7Y9z 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%0D-Kbs#6puFFAt}0VF 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 delta 2431 zcmZvdUufG^6vxjmO_L^_ZL`KY#hTaz)Ts#}uTQ%qdNrR`7SH2%L!89#b#Vc|cf@7w!~7CrbtCMmjp%L*Z(ztGI1v5RN)%BL z`Vu(j6h!iR6EB0~kEWat@(n;BDwz0n!#__2L@V%0DR(g5jd2ZpT|wxKv4GxhC+d=% z^G(=|2{TT3LCy=%%yh|@B`-lo8a$86OT$&@Wf*u7iwaZ)FENlw-jM!3FlQ$Dw&cGt z=S(EGqk=46=n^uPZWLsW{b>+`kIV+}VeqmAp9EjC;IDzNH}N^lS8y0*E{FVj(2K=_cU#MrOG7ZP)k4-02$w)ej>b2le#UfI+*lhAG zs#Gd1u-hAUG2=KW)*XJa?eISlj%TOiiDWo^E|p_fZVXMm4iXd2L!Dq8UcMp{pEzgo zUHm;lbUgh2RAW3UTb&z&xoQl~B$7#=rB`QDiCA(vm(I|(jA8cu6`Yxw{|W8~$2qwb zFyM~`;)M=Ea{+i$#rwefC5LM81K=SGJ_J4hj_aZxN5`Bc0(}^ICq8x&HCKR3)7@Me zhdY$7RE*bwmnLOAJD$qs;;HFmf^ssZ4qJ2KqM3LqJCn}L<0bU-r2*O5&zK(oXQsGn zg~Q;ygn7L*ssJOPd>FMr@kwy23ZDk|!{1!_1#m8mnUAL8r{|Kde&iejBdf1w`?nr@{13jWuADQz*=jt!C6&p9mpACo@3?!MUU32GhHAA39=hif-m z#NT@Z_1nnZ?1vZ}zfZDe8=s189G~-QwsASJw_D}>L95|o)3G;f{3wZ`Ae;fN83#R! y0f`I!H?{Wa(S2Xr_Kb}Ws7B!h$D&7~Iq1(sZ|IR$7e-F;M#v{3nq5qV2LA`A;`Md_ diff --git a/Shaders/BasicVS_PNCCTTT.cso b/Shaders/BasicVS_PNCCTTT.cso index 16342c8310a2e5a911dc5b3e1f1562c8674b9d49..cb01a3a6a20cb8951410a29771484506d0ca8996 100644 GIT binary patch literal 137936 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