├── stdafx.cpp ├── resource.h ├── .gitattributes ├── includes ├── ini.h ├── stdafx.h ├── injector │ ├── utility.hpp │ └── calling.hpp └── CPatch.h ├── NFSU2Unlimiter.rc ├── UnlimiterData ├── CameraInfo │ ├── Static │ │ ├── _SUVs.ini │ │ └── _Sedans.ini │ ├── Part │ │ ├── _SUVs_EXHAUST.ini │ │ ├── _SUVs_HOOD.ini │ │ ├── _SUVs_NEON.ini │ │ ├── _SUVs_ROOF.ini │ │ ├── _SUVs_SKIRT.ini │ │ ├── _Sedans_HOOD.ini │ │ ├── _Sedans_NEON.ini │ │ ├── _Sedans_ROOF.ini │ │ ├── HUMMER_ENGINE.ini │ │ ├── _SUVs_ENGINE.ini │ │ ├── _SUVs_SPOILER.ini │ │ ├── _SUVs_TRUNK_AUDIO.ini │ │ ├── _SUVs_WIDE_BODY.ini │ │ ├── _Sedans_ENGINE.ini │ │ ├── _Sedans_EXHAUST.ini │ │ ├── _Sedans_SKIRT.ini │ │ ├── _Sedans_SPOILER.ini │ │ ├── _Sedans_TRUNK_AUDIO.ini │ │ ├── _SUVs_BASE_PAINT.ini │ │ ├── _SUVs_BRAKELIGHT.ini │ │ ├── _SUVs_DECAL_HOOD.ini │ │ ├── _SUVs_DOOR_STYLE.ini │ │ ├── _SUVs_FRONT_BRAKE.ini │ │ ├── _SUVs_FRONT_WHEEL.ini │ │ ├── _SUVs_HEADLIGHT.ini │ │ ├── _SUVs_HYDRAULICS.ini │ │ ├── _SUVs_NEON_CABIN.ini │ │ ├── _SUVs_NEON_TRUNK.ini │ │ ├── _SUVs_NOS_PURGE.ini │ │ ├── _SUVs_PAINT_BRAKE.ini │ │ ├── _SUVs_PAINT_RIM.ini │ │ ├── _SUVs_REAR_BUMPER.ini │ │ ├── _SUVs_VINYL_LAYER0.ini │ │ ├── _SUVs_WINDOW_TINT.ini │ │ ├── _Sedans_BASE_PAINT.ini │ │ ├── _Sedans_BRAKELIGHT.ini │ │ ├── _Sedans_DOOR_STYLE.ini │ │ ├── _Sedans_HEADLIGHT.ini │ │ ├── _Sedans_HYDRAULICS.ini │ │ ├── _Sedans_NEON_CABIN.ini │ │ ├── _Sedans_NOS_PURGE.ini │ │ ├── _Sedans_PAINT_RIM.ini │ │ ├── _Sedans_WIDE_BODY.ini │ │ ├── _SUVs_ANIM6.ini │ │ ├── _SUVs_DOOR_CARBON.ini │ │ ├── _SUVs_FRONT_BUMPER.ini │ │ ├── _SUVs_KIT_CARBON.ini │ │ ├── _SUVs_NEON_ENGINE.ini │ │ ├── _SUVs_PAINT_ENGINE.ini │ │ ├── _SUVs_PAINT_EXHAUST.ini │ │ ├── _SUVs_PAINT_SPOILER.ini │ │ ├── _SUVs_WING_MIRROR.ini │ │ ├── _Sedans_DECAL_HOOD.ini │ │ ├── _Sedans_FRONT_BRAKE.ini │ │ ├── _Sedans_FRONT_BUMPER.ini │ │ ├── _Sedans_FRONT_WHEEL.ini │ │ ├── _Sedans_NEON_ENGINE.ini │ │ ├── _Sedans_NEON_TRUNK.ini │ │ ├── _Sedans_PAINT_BRAKE.ini │ │ ├── _Sedans_PAINT_ENGINE.ini │ │ ├── _Sedans_PAINT_EXHAUST.ini │ │ ├── _Sedans_PAINT_SPOILER.ini │ │ ├── _Sedans_REAR_BUMPER.ini │ │ ├── _Sedans_VINYL_LAYER0.ini │ │ ├── _Sedans_WINDOW_TINT.ini │ │ ├── _Sedans_WING_MIRROR.ini │ │ ├── _SUVs_ANIM0.ini │ │ ├── _SUVs_ANIM1.ini │ │ ├── _SUVs_ANIM2.ini │ │ ├── _SUVs_ANIM3.ini │ │ ├── _SUVs_ANIM4.ini │ │ ├── _SUVs_ANIM5.ini │ │ ├── _SUVs_DECAL_LEFT_DOOR.ini │ │ ├── _SUVs_DECAL_RIGHT_DOOR.ini │ │ ├── _SUVs_HEADLIGHT_BULB.ini │ │ ├── _SUVs_HOOD_CARBON.ini │ │ ├── _SUVs_TRUNK_CARBON.ini │ │ ├── _Sedans_ANIM0.ini │ │ ├── _Sedans_ANIM1.ini │ │ ├── _Sedans_ANIM2.ini │ │ ├── _Sedans_ANIM3.ini │ │ ├── _Sedans_ANIM4.ini │ │ ├── _Sedans_ANIM5.ini │ │ ├── _Sedans_ANIM6.ini │ │ ├── _Sedans_DOOR_CARBON.ini │ │ ├── _Sedans_HEADLIGHT_BULB.ini │ │ ├── _Sedans_HOOD_CARBON.ini │ │ ├── _Sedans_KIT_CARBON.ini │ │ ├── _Sedans_TRUNK_CARBON.ini │ │ ├── _SUVs_DECAL_FRONT_WINDOW.ini │ │ ├── _SUVs_DECAL_LEFT_QUARTER.ini │ │ ├── _SUVs_DECAL_REAR_WINDOW.ini │ │ ├── _Sedans_DECAL_FRONT_WINDOW.ini │ │ ├── _Sedans_DECAL_LEFT_DOOR.ini │ │ ├── _Sedans_DECAL_LEFT_QUARTER.ini │ │ ├── _Sedans_DECAL_REAR_WINDOW.ini │ │ ├── _Sedans_DECAL_RIGHT_DOOR.ini │ │ ├── _SUVs_DECAL_RIGHT_QUARTER.ini │ │ └── _Sedans_DECAL_RIGHT_QUARTER.ini │ └── Vinyl │ │ ├── _SUVs_VINYL_LAYER0_20.ini │ │ ├── _SUVs_VINYL_LAYER0_23.ini │ │ ├── _SUVs_VINYL_LAYER0_24.ini │ │ ├── _SUVs_VINYL_LAYER0_25.ini │ │ ├── _SUVs_VINYL_LAYER0_26.ini │ │ ├── _SUVs_VINYL_LAYER0_27.ini │ │ ├── _Sedans_VINYL_LAYER0_20.ini │ │ ├── _Sedans_VINYL_LAYER0_23.ini │ │ ├── _Sedans_VINYL_LAYER0_24.ini │ │ ├── _Sedans_VINYL_LAYER0_25.ini │ │ ├── _Sedans_VINYL_LAYER0_27.ini │ │ ├── _SUVs_VINYL_LAYER0_22.ini │ │ ├── _Sedans_VINYL_LAYER0_22.ini │ │ └── _Sedans_VINYL_LAYER0_26.ini ├── _StarGazer.ini ├── _FNGFixes.ini ├── _PaintGroups.ini ├── _PaintGroups_Vanilla.ini ├── _VinylGroups.ini ├── _RimBrands_Vanilla.ini └── _RimBrands.ini ├── targetver.h ├── NeonPartsBrowser.h ├── bReleasePrintf.h ├── ePositionMarker.h ├── LoadedSkinLayer.h ├── ChooseVinylLayerScreen.h ├── InGameTypes.h ├── IceCategoryTrunkThing.h ├── IcePartsBrowser.h ├── ChooseDecalScreen.h ├── Color.h ├── eLightFlare.h ├── GarageMainScreen.h ├── dllmain.cpp ├── bMatrix.h ├── NFSU2Unlimiter.sln ├── stdafx.h ├── feDialogConfig.h ├── DialogInterface.h ├── ChooseSpinnerBrand.h ├── PartInfoWidget.h ├── BuyPerfPartWidget.h ├── StreamingTrafficCarManager.h ├── CustomHUD_Browser.h ├── PlayerCareerState.h ├── LoadedSkin.h ├── PerfPart.h ├── ReplacementTextureEntry.h ├── RandomCharacterNames.h ├── bVector.h ├── CarPartID.h ├── SelectCarCameraMover.h ├── UsedCarTextureInfo.h ├── StarGazerGuide.h ├── NFSU2UnlimiterSettings.ini ├── UserCalls.h ├── BuyPerformanceParts.h ├── RimsBrowser.h ├── CarPart.h ├── CarTypeInfo.h ├── FEPackage.h ├── README.md ├── ChooseCustomizeCategory.h ├── ChoosePerfCategory.h ├── .gitignore ├── HUD_Customizer.h ├── ChooseRimBrand.h ├── CareerEventData.h ├── CustomizationScreenManager.h ├── ChoosePaintShopCategory.h └── UnlockablesMap.h /stdafx.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | -------------------------------------------------------------------------------- /resource.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nlgxzef/NFSU2Unlimiter/HEAD/resource.h -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /includes/ini.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nlgxzef/NFSU2Unlimiter/HEAD/includes/ini.h -------------------------------------------------------------------------------- /NFSU2Unlimiter.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nlgxzef/NFSU2Unlimiter/HEAD/NFSU2Unlimiter.rc -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Static/_SUVs.ini: -------------------------------------------------------------------------------- 1 | [StaticCameraInfo] 2 | Name = suvs 3 | TurntableRot = 305.772888 4 | FrontWheelRot = 26.000000 5 | FoV = 37.000000 6 | XEye = 0.000000 7 | XLook = 4.000000 8 | YEye = 1.499600 9 | XRot = 0.000000 10 | Zoom = -4.000000 11 | YRot = 1.399700 12 | AnimTime = 0.000000 13 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Static/_Sedans.ini: -------------------------------------------------------------------------------- 1 | [StaticCameraInfo] 2 | Name = sedans 3 | TurntableRot = 305.772888 4 | FrontWheelRot = 30.000000 5 | FoV = 32.000000 6 | XEye = 0.000000 7 | XLook = 4.000000 8 | YEye = 1.300000 9 | XRot = 0.000000 10 | Zoom = -4.000000 11 | YRot = 1.399700 12 | AnimTime = 0.000000 13 | Focus = 0.000000 -------------------------------------------------------------------------------- /targetver.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // Including SDKDDKVer.h defines the highest available Windows platform. 4 | 5 | // If you wish to build your application for a previous Windows platform, include WinSDKVer.h and 6 | // set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_EXHAUST.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Exhaust 3 | IsAnim = 0 4 | CarSlotID = 16 5 | TurntableRot = 97.254097 6 | FrontWheelRot = 16.000000 7 | FoV = 34.000000 8 | XEye = 0.000000 9 | XLook = 4.607200 10 | YEye = 1.449700 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.299200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_HOOD.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Hood 3 | IsAnim = 0 4 | CarSlotID = 9 5 | TurntableRot = 244.553696 6 | FrontWheelRot = 21.672300 7 | FoV = 38.000000 8 | XEye = -0.334200 9 | XLook = 4.607200 10 | YEye = 1.419700 11 | XRot = -0.134400 12 | Zoom = -4.000000 13 | YRot = 2.805400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_NEON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Neon 3 | IsAnim = 0 4 | CarSlotID = 154 5 | TurntableRot = 295.151093 6 | FrontWheelRot = 25.000000 7 | FoV = 35.000000 8 | XEye = 0.075000 9 | XLook = 4.491000 10 | YEye = 1.258840 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ROOF.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Roof 3 | IsAnim = 0 4 | CarSlotID = 7 5 | TurntableRot = 299.969604 6 | FrontWheelRot = 21.672300 7 | FoV = 23.000000 8 | XEye = -0.134300 9 | XLook = 4.073500 10 | YEye = 2.029200 11 | XRot = -0.100000 12 | Zoom = -4.000000 13 | YRot = 3.624100 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_SKIRT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Skirt 3 | IsAnim = 0 4 | CarSlotID = 11 5 | TurntableRot = 315.000000 6 | FrontWheelRot = 23.622101 7 | FoV = 27.000000 8 | XEye = -0.250000 9 | XLook = 4.806000 10 | YEye = 1.050000 11 | XRot = -0.134400 12 | Zoom = -4.000000 13 | YRot = 1.669500 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_HOOD.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Hood 3 | IsAnim = 0 4 | CarSlotID = 9 5 | TurntableRot = 244.553696 6 | FrontWheelRot = 21.672300 7 | FoV = 34.000000 8 | XEye = -0.334200 9 | XLook = 4.607200 10 | YEye = 1.119800 11 | XRot = -0.134400 12 | Zoom = -4.000000 13 | YRot = 2.805400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_NEON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Neon 3 | IsAnim = 0 4 | CarSlotID = 154 5 | TurntableRot = 295.151093 6 | FrontWheelRot = 16.000000 7 | FoV = 30.000000 8 | XEye = 0.075000 9 | XLook = 4.491000 10 | YEye = 1.058900 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ROOF.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Roof 3 | IsAnim = 0 4 | CarSlotID = 7 5 | TurntableRot = 299.969604 6 | FrontWheelRot = 21.672300 7 | FoV = 20.000000 8 | XEye = -0.134300 9 | XLook = 4.073500 10 | YEye = 1.629500 11 | XRot = -0.100000 12 | Zoom = -4.000000 13 | YRot = 3.624100 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/HUMMER_ENGINE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Engine 3 | IsAnim = 0 4 | CarSlotID = 13 5 | TurntableRot = 199.572098 6 | FrontWheelRot = -22.000000 7 | FoV = 15.000000 8 | XEye = -1.334800 9 | XLook = 4.607200 10 | YEye = 1.550000 11 | XRot = -0.134400 12 | Zoom = -4.000000 13 | YRot = 5.000000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ENGINE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Engine 3 | IsAnim = 0 4 | CarSlotID = 13 5 | TurntableRot = 254.810699 6 | FrontWheelRot = -22.000000 7 | FoV = 25.000000 8 | XEye = -0.296200 9 | XLook = 4.161000 10 | YEye = 1.221700 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.699200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_SPOILER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Spoiler 3 | IsAnim = 0 4 | CarSlotID = 12 5 | TurntableRot = 121.674400 6 | FrontWheelRot = 24.672300 7 | FoV = 38.000000 8 | XEye = 0.399100 9 | XLook = 4.481600 10 | YEye = 1.599600 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.605200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_TRUNK_AUDIO.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Audio 3 | IsAnim = 0 4 | CarSlotID = 34 5 | TurntableRot = 90.000000 6 | FrontWheelRot = 1.000000 7 | FoV = 25.000000 8 | XEye = 0.000000 9 | XLook = 4.481600 10 | YEye = 1.198300 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.027400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_WIDE_BODY.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Wide Body 3 | IsAnim = 0 4 | CarSlotID = 6 5 | TurntableRot = 296.565186 6 | FrontWheelRot = 21.672300 7 | FoV = 37.000000 8 | XEye = 0.100000 9 | XLook = 4.607200 10 | YEye = 1.379600 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ENGINE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Engine 3 | IsAnim = 0 4 | CarSlotID = 13 5 | TurntableRot = 254.810699 6 | FrontWheelRot = 22.000000 7 | FoV = 21.000000 8 | XEye = -0.196200 9 | XLook = 4.161000 10 | YEye = 1.221700 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.099500 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_EXHAUST.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Exhaust 3 | IsAnim = 0 4 | CarSlotID = 16 5 | TurntableRot = 97.254097 6 | FrontWheelRot = 16.000000 7 | FoV = 26.000000 8 | XEye = 0.000000 9 | XLook = 4.607200 10 | YEye = 1.049800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.299200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_SKIRT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Skirt 3 | IsAnim = 0 4 | CarSlotID = 11 5 | TurntableRot = 315.000000 6 | FrontWheelRot = 23.622101 7 | FoV = 23.622101 8 | XEye = -0.250000 9 | XLook = 4.806000 10 | YEye = 0.999300 11 | XRot = -0.134400 12 | Zoom = -4.000000 13 | YRot = 1.669500 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_SPOILER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Spoiler 3 | IsAnim = 0 4 | CarSlotID = 12 5 | TurntableRot = 121.674400 6 | FrontWheelRot = 21.672300 7 | FoV = 30.000000 8 | XEye = 0.199500 9 | XLook = 4.481600 10 | YEye = 1.199900 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.605200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_TRUNK_AUDIO.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Audio 3 | IsAnim = 0 4 | CarSlotID = 34 5 | TurntableRot = 90.000000 6 | FrontWheelRot = 1.000000 7 | FoV = 20.000000 8 | XEye = 0.000000 9 | XLook = 4.481600 10 | YEye = 0.898600 11 | XRot = -0.060200 12 | Zoom = -2.000000 13 | YRot = 3.999300 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_BASE_PAINT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Base Paint 3 | IsAnim = 0 4 | CarSlotID = 63 5 | TurntableRot = 310.812103 6 | FrontWheelRot = 24.000000 7 | FoV = 39.000000 8 | XEye = 0.200000 9 | XLook = 4.481600 10 | YEye = 1.349800 11 | XRot = 0.200000 12 | Zoom = -4.000000 13 | YRot = 3.002600 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_BRAKELIGHT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Brakelight 3 | IsAnim = 0 4 | CarSlotID = 15 5 | TurntableRot = 104.000000 6 | FrontWheelRot = 24.672300 7 | FoV = 34.000000 8 | XEye = 0.250000 9 | XLook = 4.450000 10 | YEye = 1.459400 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.299800 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DECAL_HOOD.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Hood Decal 3 | IsAnim = 0 4 | CarSlotID = 52 5 | TurntableRot = 259.852386 6 | FrontWheelRot = -20.000000 7 | FoV = 22.000000 8 | XEye = -0.100000 9 | XLook = 4.184000 10 | YEye = 1.099600 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 5.398500 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DOOR_STYLE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Door Style 3 | IsAnim = 0 4 | CarSlotID = 160 5 | TurntableRot = 247.978104 6 | FrontWheelRot = -20.000000 7 | FoV = 34.000000 8 | XEye = 0.029900 9 | XLook = 4.000000 10 | YEye = 1.299800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_FRONT_BRAKE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Front Brake 3 | IsAnim = 0 4 | CarSlotID = 27 5 | TurntableRot = 322.760406 6 | FrontWheelRot = 26.000000 7 | FoV = 15.000000 8 | XEye = 0.599700 9 | XLook = 4.481600 10 | YEye = 0.599400 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 1.299000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_FRONT_WHEEL.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Front Wheel 3 | IsAnim = 0 4 | CarSlotID = 29 5 | TurntableRot = 31.217501 6 | FrontWheelRot = -24.000000 7 | FoV = 33.000000 8 | XEye = -0.034700 9 | XLook = 4.607200 10 | YEye = 1.339800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.099200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_HEADLIGHT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Headlight 3 | IsAnim = 0 4 | CarSlotID = 14 5 | TurntableRot = 262.946289 6 | FrontWheelRot = 24.000000 7 | FoV = 31.000000 8 | XEye = -0.096000 9 | XLook = 4.161000 10 | YEye = 1.349800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_HYDRAULICS.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Hydraulics 3 | IsAnim = 0 4 | CarSlotID = 161 5 | TurntableRot = 305.772888 6 | FrontWheelRot = 0.000000 7 | FoV = 37.000000 8 | XEye = 0.029900 9 | XLook = 4.000000 10 | YEye = 1.499600 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.399700 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_NEON_CABIN.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Neon Cabin 3 | IsAnim = 0 4 | CarSlotID = 156 5 | TurntableRot = 295.151093 6 | FrontWheelRot = 16.000000 7 | FoV = 30.000000 8 | XEye = 0.000000 9 | XLook = 4.491000 10 | YEye = 0.959000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_NEON_TRUNK.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Neon Trunk 3 | IsAnim = 0 4 | CarSlotID = 157 5 | TurntableRot = 74.791496 6 | FrontWheelRot = -16.000000 7 | FoV = 26.000000 8 | XEye = -0.400300 9 | XLook = 4.491000 10 | YEye = 1.258300 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 2.298400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_NOS_PURGE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Nos Purge 3 | IsAnim = 0 4 | CarSlotID = 162 5 | TurntableRot = 295.427185 6 | FrontWheelRot = 20.000000 7 | FoV = 33.000000 8 | XEye = 0.099760 9 | XLook = 4.000000 10 | YEye = 1.299920 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_PAINT_BRAKE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Brake Paint 3 | IsAnim = 0 4 | CarSlotID = 70 5 | TurntableRot = 322.760406 6 | FrontWheelRot = 26.000000 7 | FoV = 15.000000 8 | XEye = 0.599700 9 | XLook = 4.481600 10 | YEye = 0.599400 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 1.299000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_PAINT_RIM.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Rim Paint 3 | IsAnim = 0 4 | CarSlotID = 73 5 | TurntableRot = 31.217501 6 | FrontWheelRot = -24.000000 7 | FoV = 33.000000 8 | XEye = -0.034700 9 | XLook = 4.607200 10 | YEye = 1.339800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.099200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_REAR_BUMPER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Rear Bumper 3 | IsAnim = 0 4 | CarSlotID = 2 5 | TurntableRot = 73.932602 6 | FrontWheelRot = 21.672300 7 | FoV = 34.000000 8 | XEye = -0.367100 9 | XLook = 4.481600 10 | YEye = 1.398500 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 1.230000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_VINYL_LAYER0.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Vinyl Layer0 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 0.000000 6 | FrontWheelRot = 25.000000 7 | FoV = 40.000000 8 | XEye = -0.170100 9 | XLook = 4.000000 10 | YEye = 1.200000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_WINDOW_TINT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Window Tint 3 | IsAnim = 0 4 | CarSlotID = 153 5 | TurntableRot = 55.415901 6 | FrontWheelRot = 16.000000 7 | FoV = 38.000000 8 | XEye = -0.210000 9 | XLook = 4.277000 10 | YEye = 1.445000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 2.399700 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_BASE_PAINT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Base Paint 3 | IsAnim = 0 4 | CarSlotID = 63 5 | TurntableRot = 310.812103 6 | FrontWheelRot = 16.000000 7 | FoV = 32.000000 8 | XEye = 0.200000 9 | XLook = 4.481600 10 | YEye = 1.049900 11 | XRot = 0.200000 12 | Zoom = -4.000000 13 | YRot = 3.002600 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_BRAKELIGHT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Brakelight 3 | IsAnim = 0 4 | CarSlotID = 15 5 | TurntableRot = 104.000000 6 | FrontWheelRot = 21.672300 7 | FoV = 26.500000 8 | XEye = 0.250000 9 | XLook = 4.450000 10 | YEye = 1.059600 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.299800 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DOOR_STYLE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Door Style 3 | IsAnim = 0 4 | CarSlotID = 160 5 | TurntableRot = 247.978104 6 | FrontWheelRot = 20.000000 7 | FoV = 32.000000 8 | XEye = 0.029900 9 | XLook = 4.000000 10 | YEye = 1.299800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_HEADLIGHT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Headlight 3 | IsAnim = 0 4 | CarSlotID = 14 5 | TurntableRot = 262.946289 6 | FrontWheelRot = -15.000000 7 | FoV = 25.000000 8 | XEye = -0.096000 9 | XLook = 4.161000 10 | YEye = 0.949900 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_HYDRAULICS.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Hydraulics 3 | IsAnim = 0 4 | CarSlotID = 161 5 | TurntableRot = 305.772888 6 | FrontWheelRot = 0.000000 7 | FoV = 32.000000 8 | XEye = 0.029900 9 | XLook = 4.000000 10 | YEye = 1.199720 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.399700 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_NEON_CABIN.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Neon Cabin 3 | IsAnim = 0 4 | CarSlotID = 156 5 | TurntableRot = 295.151093 6 | FrontWheelRot = 16.000000 7 | FoV = 30.000000 8 | XEye = 0.000000 9 | XLook = 4.491000 10 | YEye = 0.959000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_NOS_PURGE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Nos Purge 3 | IsAnim = 0 4 | CarSlotID = 162 5 | TurntableRot = 295.427185 6 | FrontWheelRot = 20.000000 7 | FoV = 30.000000 8 | XEye = 0.099760 9 | XLook = 4.000000 10 | YEye = 1.199920 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_PAINT_RIM.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Rim Paint 3 | IsAnim = 0 4 | CarSlotID = 73 5 | TurntableRot = 31.217501 6 | FrontWheelRot = -24.000000 7 | FoV = 26.000000 8 | XEye = 0.165400 9 | XLook = 4.607200 10 | YEye = 1.039900 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.299200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_WIDE_BODY.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Wide Body 3 | IsAnim = 0 4 | CarSlotID = 6 5 | TurntableRot = 296.565186 6 | FrontWheelRot = 21.672300 7 | FoV = 32.000000 8 | XEye = 0.100000 9 | XLook = 4.607200 10 | YEye = 1.079800 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ANIM6.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera7 3 | IsAnim = 1 4 | CarSlotID = 1076895766 5 | TurntableRot = 307.000000 6 | FrontWheelRot = 20.000000 7 | FoV = 36.000000 8 | XEye = 0.099960 9 | XLook = 4.000000 10 | YEye = 1.599900 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.270000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DOOR_CARBON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Door Carbon Fibre 3 | IsAnim = 0 4 | CarSlotID = 95 5 | TurntableRot = 0.000000 6 | FrontWheelRot = 16.000000 7 | FoV = 37.000000 8 | XEye = -0.100100 9 | XLook = 4.000000 10 | YEye = 1.000000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_FRONT_BUMPER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Front Bumper 3 | IsAnim = 0 4 | CarSlotID = 1 5 | TurntableRot = 249.738998 6 | FrontWheelRot = 21.672300 7 | FoV = 30.000000 8 | XEye = -0.336200 9 | XLook = 4.481600 10 | YEye = 1.269800 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 1.203300 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_KIT_CARBON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Kit Carbon Fibre 3 | IsAnim = 0 4 | CarSlotID = 93 5 | TurntableRot = 239.333496 6 | FrontWheelRot = -24.000000 7 | FoV = 35.000000 8 | XEye = -0.100100 9 | XLook = 4.000000 10 | YEye = 1.100000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.399920 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_NEON_ENGINE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Neon Engine 3 | IsAnim = 0 4 | CarSlotID = 155 5 | TurntableRot = 254.810699 6 | FrontWheelRot = -22.000000 7 | FoV = 25.000000 8 | XEye = -0.296200 9 | XLook = 4.161000 10 | YEye = 1.221700 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.699200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_PAINT_ENGINE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Engine Paint 3 | IsAnim = 0 4 | CarSlotID = 68 5 | TurntableRot = 254.810699 6 | FrontWheelRot = -22.000000 7 | FoV = 25.000000 8 | XEye = -0.296200 9 | XLook = 4.161000 10 | YEye = 1.221700 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.699200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_PAINT_EXHAUST.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Exhaust Paint 3 | IsAnim = 0 4 | CarSlotID = 71 5 | TurntableRot = 97.254097 6 | FrontWheelRot = 16.000000 7 | FoV = 35.000000 8 | XEye = 0.000000 9 | XLook = 4.607200 10 | YEye = 1.400000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.299200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_PAINT_SPOILER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Spoiler Paint 3 | IsAnim = 0 4 | CarSlotID = 69 5 | TurntableRot = 121.674400 6 | FrontWheelRot = 24.672300 7 | FoV = 38.000000 8 | XEye = 0.399100 9 | XLook = 4.481600 10 | YEye = 1.499520 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.605200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_WING_MIRROR.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Side Mirror 3 | IsAnim = 0 4 | CarSlotID = 32 5 | TurntableRot = 254.626099 6 | FrontWheelRot = -25.000000 7 | FoV = 25.000000 8 | XEye = -0.300800 9 | XLook = 4.000000 10 | YEye = 1.260000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 2.099800 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DECAL_HOOD.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Hood Decal 3 | IsAnim = 0 4 | CarSlotID = 52 5 | TurntableRot = 259.852386 6 | FrontWheelRot = -20.000000 7 | FoV = 20.000000 8 | XEye = -0.100000 9 | XLook = 4.184000 10 | YEye = 1.099600 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 4.698700 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_FRONT_BRAKE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Front Brake 3 | IsAnim = 0 4 | CarSlotID = 27 5 | TurntableRot = 322.760406 6 | FrontWheelRot = 26.000000 7 | FoV = 15.000000 8 | XEye = 0.599700 9 | XLook = 4.481600 10 | YEye = 0.599400 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 1.299000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_FRONT_BUMPER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Front Bumper 3 | IsAnim = 0 4 | CarSlotID = 1 5 | TurntableRot = 249.738998 6 | FrontWheelRot = 21.672300 7 | FoV = 24.000000 8 | XEye = -0.336200 9 | XLook = 4.481600 10 | YEye = 0.970000 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 1.203300 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_FRONT_WHEEL.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Front Wheel 3 | IsAnim = 0 4 | CarSlotID = 29 5 | TurntableRot = 31.217501 6 | FrontWheelRot = -24.000000 7 | FoV = 26.000000 8 | XEye = 0.165400 9 | XLook = 4.607200 10 | YEye = 1.140000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.099200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_NEON_ENGINE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Neon Engine 3 | IsAnim = 0 4 | CarSlotID = 155 5 | TurntableRot = 254.810699 6 | FrontWheelRot = 22.000000 7 | FoV = 21.000000 8 | XEye = -0.196200 9 | XLook = 4.161000 10 | YEye = 1.221700 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.099500 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_NEON_TRUNK.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Neon Trunk 3 | IsAnim = 0 4 | CarSlotID = 157 5 | TurntableRot = 74.791496 6 | FrontWheelRot = -16.000000 7 | FoV = 20.000000 8 | XEye = -0.400000 9 | XLook = 4.491000 10 | YEye = 0.958500 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 4.199100 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_PAINT_BRAKE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Brake Paint 3 | IsAnim = 0 4 | CarSlotID = 70 5 | TurntableRot = 322.760406 6 | FrontWheelRot = 26.000000 7 | FoV = 15.000000 8 | XEye = 0.599700 9 | XLook = 4.481600 10 | YEye = 0.599400 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 1.299000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_PAINT_ENGINE.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Engine Paint 3 | IsAnim = 0 4 | CarSlotID = 68 5 | TurntableRot = 254.810699 6 | FrontWheelRot = 22.000000 7 | FoV = 21.000000 8 | XEye = -0.196200 9 | XLook = 4.161000 10 | YEye = 1.022000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.099500 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_PAINT_EXHAUST.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Exhaust Paint 3 | IsAnim = 0 4 | CarSlotID = 71 5 | TurntableRot = 97.254097 6 | FrontWheelRot = 24.000000 7 | FoV = 26.000000 8 | XEye = 0.199900 9 | XLook = 4.607200 10 | YEye = 0.949900 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.299200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_PAINT_SPOILER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Spoiler Paint 3 | IsAnim = 0 4 | CarSlotID = 69 5 | TurntableRot = 121.674400 6 | FrontWheelRot = 21.672300 7 | FoV = 30.000000 8 | XEye = 0.199500 9 | XLook = 4.481600 10 | YEye = 1.199900 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.605200 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_REAR_BUMPER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Rear Bumper 3 | IsAnim = 0 4 | CarSlotID = 2 5 | TurntableRot = 73.932602 6 | FrontWheelRot = 21.672300 7 | FoV = 25.000000 8 | XEye = -0.367100 9 | XLook = 4.481600 10 | YEye = 1.098600 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 1.230000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_VINYL_LAYER0.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Vinyl Layer0 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 0.000000 6 | FrontWheelRot = 16.000000 7 | FoV = 35.000000 8 | XEye = -0.070000 9 | XLook = 4.000000 10 | YEye = 1.200000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_WINDOW_TINT.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Window Tint 3 | IsAnim = 0 4 | CarSlotID = 153 5 | TurntableRot = 55.415901 6 | FrontWheelRot = 16.000000 7 | FoV = 32.000000 8 | XEye = -0.210000 9 | XLook = 4.277000 10 | YEye = 1.145100 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 2.399700 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_WING_MIRROR.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Side Mirror 3 | IsAnim = 0 4 | CarSlotID = 32 5 | TurntableRot = 254.626099 6 | FrontWheelRot = -25.000000 7 | FoV = 20.000000 8 | XEye = -0.200800 9 | XLook = 4.000000 10 | YEye = 1.260000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 2.099800 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_SUVs_VINYL_LAYER0_20.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl hoods 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 254.810699 6 | FrontWheelRot = 22.000000 7 | FoV = 28.000000 8 | XEye = -0.296200 9 | XLook = 4.161000 10 | YEye = 1.421600 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 4.698900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_SUVs_VINYL_LAYER0_23.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl body 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 222.511093 6 | FrontWheelRot = 28.000000 7 | FoV = 38.000000 8 | XEye = -0.167100 9 | XLook = 4.460700 10 | YEye = 1.479700 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ANIM0.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera1 3 | IsAnim = 1 4 | CarSlotID = 1076895760 5 | TurntableRot = 125.288498 6 | FrontWheelRot = 26.000000 7 | FoV = 35.000000 8 | XEye = 0.199760 9 | XLook = 4.000000 10 | YEye = 1.659500 11 | XRot = -0.300100 12 | Zoom = -4.000000 13 | YRot = 1.270000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ANIM1.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera2 3 | IsAnim = 1 4 | CarSlotID = 1076895761 5 | TurntableRot = 66.524139 6 | FrontWheelRot = -33.000000 7 | FoV = 25.000000 8 | XEye = -0.301160 9 | XLook = 4.000000 10 | YEye = 1.458200 11 | XRot = -0.201000 12 | Zoom = -4.000000 13 | YRot = 1.319920 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ANIM2.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera3 3 | IsAnim = 1 4 | CarSlotID = 1076895762 5 | TurntableRot = 63.848801 6 | FrontWheelRot = -30.000000 7 | FoV = 35.000000 8 | XEye = -0.000400 9 | XLook = 4.000000 10 | YEye = 1.699400 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.168800 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ANIM3.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera4 3 | IsAnim = 1 4 | CarSlotID = 1076895763 5 | TurntableRot = 248.891495 6 | FrontWheelRot = -30.000000 7 | FoV = 23.000000 8 | XEye = -0.300400 9 | XLook = 4.000000 10 | YEye = 1.298840 11 | XRot = -0.400700 12 | Zoom = -4.000000 13 | YRot = 1.270000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ANIM4.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera5 3 | IsAnim = 1 4 | CarSlotID = 1076895764 5 | TurntableRot = 359.000000 6 | FrontWheelRot = 33.000000 7 | FoV = 35.000000 8 | XEye = -0.100100 9 | XLook = 4.000000 10 | YEye = 1.838360 11 | XRot = -0.200300 12 | Zoom = -4.000000 13 | YRot = 3.598100 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_ANIM5.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera6 3 | IsAnim = 1 4 | CarSlotID = 1076895765 5 | TurntableRot = 233.100906 6 | FrontWheelRot = -35.000000 7 | FoV = 25.000000 8 | XEye = -0.100400 9 | XLook = 4.000000 10 | YEye = 1.398840 11 | XRot = 0.199320 12 | Zoom = -4.000000 13 | YRot = 1.297280 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DECAL_LEFT_DOOR.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Left Door Decal 3 | IsAnim = 0 4 | CarSlotID = 55 5 | TurntableRot = 149.382401 6 | FrontWheelRot = -24.000000 7 | FoV = 17.000000 8 | XEye = -0.669300 9 | XLook = 4.092000 10 | YEye = 1.089960 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DECAL_RIGHT_DOOR.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Right Door Decal 3 | IsAnim = 0 4 | CarSlotID = 56 5 | TurntableRot = 325.343811 6 | FrontWheelRot = 24.000000 7 | FoV = 16.000000 8 | XEye = 0.030040 9 | XLook = 4.092000 10 | YEye = 1.089880 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_HEADLIGHT_BULB.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Headlight Bulb 3 | IsAnim = 0 4 | CarSlotID = 159 5 | TurntableRot = 262.946289 6 | FrontWheelRot = 24.000000 7 | FoV = 31.000000 8 | XEye = -0.096000 9 | XLook = 4.161000 10 | YEye = 1.349800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_HOOD_CARBON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Hood Carbon Fibre 3 | IsAnim = 0 4 | CarSlotID = 94 5 | TurntableRot = 244.553696 6 | FrontWheelRot = 21.672300 7 | FoV = 38.000000 8 | XEye = -0.334200 9 | XLook = 4.607200 10 | YEye = 1.419700 11 | XRot = -0.134400 12 | Zoom = -4.000000 13 | YRot = 2.805400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_TRUNK_CARBON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Trunk Carbon Fibre 3 | IsAnim = 0 4 | CarSlotID = 96 5 | TurntableRot = 74.791496 6 | FrontWheelRot = -16.000000 7 | FoV = 26.000000 8 | XEye = -0.400300 9 | XLook = 4.491000 10 | YEye = 1.258300 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 2.298400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ANIM0.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera1 3 | IsAnim = 1 4 | CarSlotID = 1076895760 5 | TurntableRot = 125.288498 6 | FrontWheelRot = 24.000000 7 | FoV = 30.000000 8 | XEye = 0.199760 9 | XLook = 4.000000 10 | YEye = 1.359600 11 | XRot = -0.300100 12 | Zoom = -4.000000 13 | YRot = 1.230000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ANIM1.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera2 3 | IsAnim = 1 4 | CarSlotID = 1076895761 5 | TurntableRot = 115.843597 6 | FrontWheelRot = 33.000000 7 | FoV = 20.000000 8 | XEye = 0.099040 9 | XLook = 4.000000 10 | YEye = 1.158500 11 | XRot = -0.201000 12 | Zoom = -4.000000 13 | YRot = 1.321600 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ANIM2.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera3 3 | IsAnim = 1 4 | CarSlotID = 1076895762 5 | TurntableRot = 63.848801 6 | FrontWheelRot = -20.000000 7 | FoV = 30.000000 8 | XEye = -0.000400 9 | XLook = 4.000000 10 | YEye = 1.399600 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.168800 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ANIM3.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera4 3 | IsAnim = 1 4 | CarSlotID = 1076895763 5 | TurntableRot = 248.891495 6 | FrontWheelRot = -28.000000 7 | FoV = 17.000000 8 | XEye = -0.300400 9 | XLook = 4.000000 10 | YEye = 0.998880 11 | XRot = -0.400700 12 | Zoom = -4.000000 13 | YRot = 1.270000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ANIM4.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera5 3 | IsAnim = 1 4 | CarSlotID = 1076895764 5 | TurntableRot = 359.000000 6 | FrontWheelRot = 25.000000 7 | FoV = 33.000000 8 | XEye = -0.100100 9 | XLook = 4.000000 10 | YEye = 1.838360 11 | XRot = -0.200300 12 | Zoom = -4.000000 13 | YRot = 3.598100 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ANIM5.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera6 3 | IsAnim = 1 4 | CarSlotID = 1076895765 5 | TurntableRot = 233.100906 6 | FrontWheelRot = -35.000000 7 | FoV = 20.000000 8 | XEye = -0.100400 9 | XLook = 4.000000 10 | YEye = 0.998880 11 | XRot = 0.199320 12 | Zoom = -4.000000 13 | YRot = 1.270000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_ANIM6.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Animate Camera7 3 | IsAnim = 1 4 | CarSlotID = 1076895766 5 | TurntableRot = 307.000000 6 | FrontWheelRot = 20.000000 7 | FoV = 30.000000 8 | XEye = 0.099960 9 | XLook = 4.000000 10 | YEye = 1.200000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.270000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DOOR_CARBON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Door Carbon Fibre 3 | IsAnim = 0 4 | CarSlotID = 95 5 | TurntableRot = 0.000000 6 | FrontWheelRot = 16.000000 7 | FoV = 37.000000 8 | XEye = -0.100100 9 | XLook = 4.000000 10 | YEye = 1.000000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_HEADLIGHT_BULB.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Headlight Bulb 3 | IsAnim = 0 4 | CarSlotID = 159 5 | TurntableRot = 262.946289 6 | FrontWheelRot = -15.000000 7 | FoV = 25.000000 8 | XEye = -0.096000 9 | XLook = 4.161000 10 | YEye = 0.949900 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_HOOD_CARBON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Hood Carbon Fibre 3 | IsAnim = 0 4 | CarSlotID = 94 5 | TurntableRot = 244.553696 6 | FrontWheelRot = 21.672300 7 | FoV = 34.000000 8 | XEye = -0.334200 9 | XLook = 4.607200 10 | YEye = 1.119800 11 | XRot = -0.134400 12 | Zoom = -4.000000 13 | YRot = 2.805400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_KIT_CARBON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Kit Carbon Fibre 3 | IsAnim = 0 4 | CarSlotID = 93 5 | TurntableRot = 239.333496 6 | FrontWheelRot = -24.000000 7 | FoV = 35.000000 8 | XEye = -0.100100 9 | XLook = 4.000000 10 | YEye = 1.100000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.399920 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_TRUNK_CARBON.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Trunk Carbon Fibre 3 | IsAnim = 0 4 | CarSlotID = 96 5 | TurntableRot = 90.000000 6 | FrontWheelRot = 1.000000 7 | FoV = 20.000000 8 | XEye = 0.000000 9 | XLook = 4.481600 10 | YEye = 0.898600 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 6.028600 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_SUVs_VINYL_LAYER0_24.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl unique 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 317.709290 6 | FrontWheelRot = 28.000000 7 | FoV = 36.000000 8 | XEye = 0.099900 9 | XLook = 4.460700 10 | YEye = 1.379700 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_SUVs_VINYL_LAYER0_25.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl toplayer 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 0.000000 6 | FrontWheelRot = 25.000000 7 | FoV = 40.000000 8 | XEye = -0.170100 9 | XLook = 4.000000 10 | YEye = 1.200000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_SUVs_VINYL_LAYER0_26.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl artfactory 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 317.709290 6 | FrontWheelRot = 28.000000 7 | FoV = 36.000000 8 | XEye = 0.099900 9 | XLook = 4.460700 10 | YEye = 1.379700 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_SUVs_VINYL_LAYER0_27.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl contest 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 317.709290 6 | FrontWheelRot = 28.000000 7 | FoV = 36.000000 8 | XEye = 0.099900 9 | XLook = 4.460700 10 | YEye = 1.379700 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_Sedans_VINYL_LAYER0_20.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl hoods 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 254.810699 6 | FrontWheelRot = 22.000000 7 | FoV = 21.000000 8 | XEye = -0.196200 9 | XLook = 4.161000 10 | YEye = 1.099200 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 5.497300 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_Sedans_VINYL_LAYER0_23.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl body 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 222.511093 6 | FrontWheelRot = 24.000000 7 | FoV = 32.000000 8 | XEye = -0.167100 9 | XLook = 4.460700 10 | YEye = 1.179800 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_Sedans_VINYL_LAYER0_24.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl unique 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 317.709290 6 | FrontWheelRot = 24.000000 7 | FoV = 32.000000 8 | XEye = 0.000000 9 | XLook = 4.460700 10 | YEye = 1.179800 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_Sedans_VINYL_LAYER0_25.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl toplayer 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 0.000000 6 | FrontWheelRot = 16.000000 7 | FoV = 35.000000 8 | XEye = -0.070000 9 | XLook = 4.000000 10 | YEye = 1.200000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_Sedans_VINYL_LAYER0_27.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl contest 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 317.709290 6 | FrontWheelRot = 24.000000 7 | FoV = 32.000000 8 | XEye = 0.000000 9 | XLook = 4.460700 10 | YEye = 1.179800 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DECAL_FRONT_WINDOW.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Front Window Decal 3 | IsAnim = 0 4 | CarSlotID = 53 5 | TurntableRot = 264.263885 6 | FrontWheelRot = 16.000000 7 | FoV = 19.000000 8 | XEye = -0.100000 9 | XLook = 4.000000 10 | YEye = 1.694400 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 2.799000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DECAL_LEFT_QUARTER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Left Quarter Decal 3 | IsAnim = 0 4 | CarSlotID = 57 5 | TurntableRot = 209.617599 6 | FrontWheelRot = 10.000000 7 | FoV = 15.000000 8 | XEye = 1.330300 9 | XLook = 4.646000 10 | YEye = 1.100000 11 | XRot = 0.099960 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DECAL_REAR_WINDOW.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Rear Window Decal 3 | IsAnim = 0 4 | CarSlotID = 54 5 | TurntableRot = 83.517403 6 | FrontWheelRot = -16.000000 7 | FoV = 20.000000 8 | XEye = -0.230000 9 | XLook = 4.731000 10 | YEye = 1.399800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.199400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DECAL_FRONT_WINDOW.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Front Window Decal 3 | IsAnim = 0 4 | CarSlotID = 53 5 | TurntableRot = 264.263885 6 | FrontWheelRot = 16.000000 7 | FoV = 14.000000 8 | XEye = 0.000000 9 | XLook = 4.000000 10 | YEye = 1.494500 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 2.799000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DECAL_LEFT_DOOR.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Left Door Decal 3 | IsAnim = 0 4 | CarSlotID = 55 5 | TurntableRot = 149.382401 6 | FrontWheelRot = -16.000000 7 | FoV = 16.000000 8 | XEye = -0.669300 9 | XLook = 4.092000 10 | YEye = 0.890000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DECAL_LEFT_QUARTER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Left Quarter Decal 3 | IsAnim = 0 4 | CarSlotID = 57 5 | TurntableRot = 209.617599 6 | FrontWheelRot = 10.000000 7 | FoV = 15.000000 8 | XEye = 1.330300 9 | XLook = 4.646000 10 | YEye = 1.100000 11 | XRot = 0.099960 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DECAL_REAR_WINDOW.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Rear Window Decal 3 | IsAnim = 0 4 | CarSlotID = 54 5 | TurntableRot = 83.517403 6 | FrontWheelRot = -16.000000 7 | FoV = 14.000000 8 | XEye = -0.030000 9 | XLook = 4.731000 10 | YEye = 1.299800 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 3.199400 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DECAL_RIGHT_DOOR.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Right Door Decal 3 | IsAnim = 0 4 | CarSlotID = 56 5 | TurntableRot = 325.343811 6 | FrontWheelRot = 16.000000 7 | FoV = 16.000000 8 | XEye = -0.469800 9 | XLook = 4.092000 10 | YEye = 0.890000 11 | XRot = 0.000000 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_SUVs_VINYL_LAYER0_22.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl manufacturer 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 317.709290 6 | FrontWheelRot = 28.000000 7 | FoV = 36.000000 8 | XEye = 0.099900 9 | XLook = 4.460700 10 | YEye = 1.379700 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_Sedans_VINYL_LAYER0_22.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl manufacturer 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 317.709290 6 | FrontWheelRot = 24.000000 7 | FoV = 32.000000 8 | XEye = 0.000000 9 | XLook = 4.460700 10 | YEye = 1.179800 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Vinyl/_Sedans_VINYL_LAYER0_26.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = vinyl artfactory 3 | IsAnim = 0 4 | CarSlotID = 64 5 | TurntableRot = 317.709290 6 | FrontWheelRot = 24.000000 7 | FoV = 32.000000 8 | XEye = 0.000000 9 | XLook = 4.460700 10 | YEye = 1.179800 11 | XRot = -0.060200 12 | Zoom = -4.000000 13 | YRot = 2.405900 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_SUVs_DECAL_RIGHT_QUARTER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Right Quarter Decal 3 | IsAnim = 0 4 | CarSlotID = 58 5 | TurntableRot = 321.627686 6 | FrontWheelRot = 10.000000 7 | FoV = 15.000000 8 | XEye = -1.200280 9 | XLook = 4.646000 10 | YEye = 1.100000 11 | XRot = 0.099960 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /UnlimiterData/CameraInfo/Part/_Sedans_DECAL_RIGHT_QUARTER.ini: -------------------------------------------------------------------------------- 1 | [CameraInfo] 2 | Name = Right Quarter Decal 3 | IsAnim = 0 4 | CarSlotID = 58 5 | TurntableRot = 321.627686 6 | FrontWheelRot = 10.000000 7 | FoV = 15.000000 8 | XEye = -1.100200 9 | XLook = 4.646000 10 | YEye = 1.100000 11 | XRot = 0.099960 12 | Zoom = -4.000000 13 | YRot = 1.200000 14 | AnimTime = 0.000000 15 | Focus = 0.000000 -------------------------------------------------------------------------------- /NeonPartsBrowser.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall NeonPartsBrowser_RefreshHeader(DWORD* NeonPartsBrowser, void* EDX_Unused) 7 | { 8 | NeonPartsBrowser_RefreshHeader_Game(NeonPartsBrowser); 9 | 10 | RefreshDetailsPane((char const*)NeonPartsBrowser[1], NeonPartsBrowser + 21, NeonPartsBrowser + 20, (DWORD*)NeonPartsBrowser[23]); 11 | } -------------------------------------------------------------------------------- /bReleasePrintf.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | bool EnableReleasePrintf = 0; 7 | 8 | #ifdef DEBUG 9 | EnableReleasePrintf = 1; 10 | #endif // DEBUG 11 | 12 | int bReleasePrintf(const char* fmt, ...) 13 | { 14 | int result = -1; 15 | 16 | va_list args; 17 | va_start(args, fmt); 18 | if (EnableReleasePrintf) result = vprintf(fmt, args); 19 | va_end(args); 20 | return result; 21 | } -------------------------------------------------------------------------------- /ePositionMarker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | #include "bMatrix.h" 7 | 8 | typedef struct ePositionMarker 9 | { 10 | /* 0x0000 */ DWORD NameHash; 11 | /* 0x0004 */ int iParam0; 12 | /* 0x0008 */ float fParam0; 13 | /* 0x000c */ float fParam1; 14 | /* 0x0010 */ bMatrix4 Matrix; 15 | 16 | inline operator void* () noexcept { return reinterpret_cast(this); } 17 | } ePositionMarker; -------------------------------------------------------------------------------- /includes/stdafx.h: -------------------------------------------------------------------------------- 1 | // stdafx.h : include file for standard system include files, 2 | // or project specific include files that are used frequently, but 3 | // are changed infrequently 4 | // 5 | 6 | #pragma once 7 | 8 | #include "targetver.h" 9 | 10 | #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 11 | // Windows Header Files: 12 | #include 13 | 14 | 15 | 16 | // TODO: reference additional headers your program requires here 17 | -------------------------------------------------------------------------------- /LoadedSkinLayer.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | struct LoadedSkinLayer /* : public bTNode*/ { 7 | // total size: 0x10 8 | LoadedSkinLayer* next; // offset 0x0, size 0x4 9 | LoadedSkinLayer* prev; // offset 0x4, size 0x4 10 | unsigned int NameHash; // offset 0x8, size 0x4 11 | short NumInstances; // offset 0xC, size 0x2 12 | char LoadState; // offset 0xE, size 0x1 13 | char pad0; // offset 0xF, size 0x1 14 | }; -------------------------------------------------------------------------------- /UnlimiterData/_StarGazer.ini: -------------------------------------------------------------------------------- 1 | # This ini file is used to define visual rating star levels and required rep points for them. 2 | 3 | [StarGazer] 4 | ForceRep = -1 // Allows you to force a specific rep point and skip all the calculation. (-1 = Disabled (Default)) 5 | 6 | # Here you can define which level will require how many rep points. (Level = Point) 7 | # You can have up to 100 levels. 8 | 1 = 500 9 | 2 = 1000 10 | 3 = 1500 11 | 4 = 2000 12 | 5 = 2500 13 | 6 = 3000 14 | 7 = 3500 15 | 8 = 4000 16 | 9 = 4500 17 | 10 = 5000 -------------------------------------------------------------------------------- /ChooseVinylLayerScreen.h: -------------------------------------------------------------------------------- 1 | #include "stdio.h" 2 | #include "InGameFunctions.h" 3 | 4 | int __cdecl GetIconHashForVinylGroup(unsigned int group) 5 | { 6 | int result = 0; // eax 7 | int NumVinylGroups = VinylGroups.size(); 8 | 9 | if (group > NumVinylGroups) return 0; 10 | 11 | for (int i = 0; i < NumVinylGroups; i++) 12 | { 13 | if (VinylGroups[i].Index == group) 14 | { 15 | result = VinylGroups[i].TextureHash; 16 | break; 17 | } 18 | } 19 | 20 | return result; 21 | } -------------------------------------------------------------------------------- /InGameTypes.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | //#include "D3dx9math.h" 7 | //#pragma comment(lib, "D3dx9.lib") 8 | 9 | // Enums 10 | #include "CarSlotID.h" 11 | //#include "CarPartID.h" 12 | //#include "MenuID.h" 13 | 14 | // Helpers 15 | #include "bReleasePrintf.h" 16 | 17 | // Structures 18 | #include "bVector.h" 19 | #include "bMatrix.h" 20 | #include "ePositionMarker.h" 21 | #include "eLightFlare.h" 22 | #include "UsedCarTextureInfo.h" 23 | #include "LoadedSkinLayer.h" 24 | #include "LoadedSkin.h" 25 | #include "ReplacementTextureEntry.h" 26 | #include "feDialogConfig.h" 27 | //#include "DialogInterface.h" -------------------------------------------------------------------------------- /IceCategoryTrunkThing.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | #define IceCategoryTrunkThing_vTable 0x79BE54 7 | 8 | void __fastcall IceCategoryTrunkThing_Create(DWORD* IceCategoryTrunkThing, void *EDX_Unused, DWORD TextureHash, DWORD StringHash) 9 | { 10 | IceSelectionThing_Create( 11 | IceCategoryTrunkThing, 12 | CAR_SLOT_ID::TRUNK_AUDIO, 13 | TextureHash, 14 | StringHash, 15 | 0, 16 | 0, 17 | 0); 18 | 19 | IceCategoryTrunkThing[0] = IceCategoryTrunkThing_vTable; 20 | IceCategoryTrunkThing[23] = -1; 21 | ((BYTE*)IceCategoryTrunkThing)[34] = IceCategoryIsLocked(CAR_SLOT_ID::TRUNK_AUDIO); 22 | ((BYTE*)IceCategoryTrunkThing)[35] = 1; 23 | } -------------------------------------------------------------------------------- /IcePartsBrowser.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall IcePartsBrowser_RefreshHeader(DWORD* IcePartsBrowser, void* EDX_Unused) 7 | { 8 | IcePartsBrowser_RefreshHeader_Game(IcePartsBrowser); 9 | 10 | RefreshDetailsPane((char const*)IcePartsBrowser[1], IcePartsBrowser + 21, IcePartsBrowser + 20, (DWORD*)IcePartsBrowser[23]); 11 | } 12 | 13 | void __fastcall IcePartsBrowser_DoTheAnimation(DWORD* IcePartsBrowser, void* EDX_Unused, int location, bool on) 14 | { 15 | // Do custom animations 16 | DWORD* CategoryNode = (DWORD*)IcePartsBrowser[68]; 17 | if (CategoryNode) 18 | { 19 | GetAndDoFEPartAnim(CategoryNode[18], on, 1.0f); 20 | } 21 | } -------------------------------------------------------------------------------- /ChooseDecalScreen.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | // 0x56BE1D 7 | void __declspec(naked) DoubleMessageFixCodeCave_ChooseDecalScreen_ToggleColors() 8 | { 9 | _asm 10 | { 11 | cmp eax, edi 12 | jnz loc_56BE22 // 2nd message has different eax and edi values 13 | 14 | call ChooseDecalScreen_ToggleColors 15 | 16 | loc_56BE22: 17 | push 0x56BE22 18 | retn 19 | } 20 | } 21 | 22 | void __fastcall ChooseDecalScreen_RefreshHeader(DWORD* ChooseDecalScreen, void* EDX_Unused) 23 | { 24 | ChooseDecalScreen_RefreshHeader_Game(ChooseDecalScreen); 25 | 26 | RefreshDetailsPane((char const*)ChooseDecalScreen[1], ChooseDecalScreen + 21, ChooseDecalScreen + 20, (DWORD*)ChooseDecalScreen[23]); 27 | } -------------------------------------------------------------------------------- /Color.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | typedef struct Color 7 | { 8 | union 9 | { 10 | DWORD rgba; 11 | struct 12 | { 13 | BYTE r; 14 | BYTE g; 15 | BYTE b; 16 | BYTE a; 17 | }; 18 | }; 19 | 20 | //inline bool operator!() noexcept { return rgba == 0; } 21 | inline operator DWORD () noexcept { return rgba; } 22 | inline operator bool() { return rgba != 0; } 23 | inline Color& operator=(const Color& c) noexcept 24 | { 25 | rgba = c.rgba; 26 | return *this; 27 | } 28 | 29 | Color(BYTE _r, BYTE _g, BYTE _b, BYTE _a) 30 | { 31 | r = _r; 32 | g = _g; 33 | b = _b; 34 | a = _a; 35 | } 36 | 37 | Color(DWORD _rgba) 38 | { 39 | rgba = _rgba; 40 | } 41 | Color() : Color(0) {} 42 | } Color; -------------------------------------------------------------------------------- /eLightFlare.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | #include "Color.h" 7 | 8 | typedef struct eLightFlare 9 | { 10 | /* 0x0000 */ eLightFlare* Next; 11 | /* 0x0004 */ eLightFlare* Prev; 12 | /* 0x0008 */ DWORD NameHash; 13 | /* 0x000c */ Color ColourTint; 14 | /* 0x0010 */ float PositionX; 15 | /* 0x0014 */ float PositionY; 16 | /* 0x0018 */ float PositionZ; 17 | /* 0x001c */ float ReflectPosZ; 18 | /* 0x0020 */ float DirectionX; 19 | /* 0x0024 */ float DirectionY; 20 | /* 0x0028 */ float DirectionZ; 21 | /* 0x002c */ char Type; 22 | /* 0x002d */ char Flags; 23 | /* 0x002e */ short ScenerySectionNumber; 24 | 25 | inline operator void* () noexcept { return reinterpret_cast(this); } 26 | } eLightFlare; /* size: 0x0030 */ -------------------------------------------------------------------------------- /GarageMainScreen.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | // 0x4D855B 7 | void __declspec(naked) StaticCameraInfoCodeCave_GarageMainScreen_HandleTick() 8 | { 9 | _asm 10 | { 11 | mov edx, dword ptr ds : [edi + 0x840] // Car Type ID 12 | //mov ecx, dword ptr ds : [esi + 0x118] // SelectCarCameraMover 13 | call SelectCarCameraMover_GetAndMoveToNewDefaultOrientation 14 | 15 | push 0x4D8560 16 | retn 17 | } 18 | } 19 | 20 | // 0x4EAF13 21 | void __declspec(naked) StaticCameraInfoCodeCave_GarageMainScreen_ctor() 22 | { 23 | _asm 24 | { 25 | mov edx, dword ptr ds : [ebp + 0x10] // Car Type ID 26 | mov edx, dword ptr ds : [edx] 27 | //mov ecx, dword ptr ds : [esi + 0x118] // SelectCarCameraMover 28 | call SelectCarCameraMover_GetAndSetDefaultOrientation 29 | test eax, eax 30 | jz loc_4EAF18 31 | mov edi, eax 32 | 33 | loc_4EAF18: 34 | push 0x4EAF18 35 | retn 36 | } 37 | } -------------------------------------------------------------------------------- /dllmain.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "stdio.h" 3 | #include 4 | #include 5 | #include "includes\injector\injector.hpp" 6 | #include "includes\injector\utility.hpp" 7 | #include "UnlimiterStuff.h" 8 | 9 | BOOL APIENTRY DllMain(HMODULE /*hModule*/, DWORD reason, LPVOID /*lpReserved*/) 10 | { 11 | if (reason == DLL_PROCESS_ATTACH) 12 | { 13 | uintptr_t base = (uintptr_t)GetModuleHandleA(NULL); 14 | IMAGE_DOS_HEADER* dos = (IMAGE_DOS_HEADER*)(base); 15 | IMAGE_NT_HEADERS* nt = (IMAGE_NT_HEADERS*)(base + dos->e_lfanew); 16 | 17 | if ((base + nt->OptionalHeader.AddressOfEntryPoint + (0x400000 - base)) == 0x75BCC7) // Check if .exe file is compatible - Thanks to thelink2012 and MWisBest 18 | Init(); 19 | 20 | else 21 | { 22 | MessageBoxA(NULL, "This .exe is not supported.\nPlease use v1.2 NTSC speed2.exe (4,57 MB (4.800.512 bytes)).", "NFSU2 Unlimiter", MB_ICONERROR); 23 | return FALSE; 24 | } 25 | } 26 | return TRUE; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bMatrix.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | #include "bVector.h" 7 | 8 | typedef struct bMatrix4 9 | { 10 | bVector4 v0; 11 | bVector4 v1; 12 | bVector4 v2; 13 | bVector4 v3; 14 | 15 | inline bMatrix4& operator=(const bMatrix4& r) noexcept 16 | { 17 | v0 = r.v0; 18 | v1 = r.v1; 19 | v2 = r.v2; 20 | v3 = r.v3; 21 | 22 | return *this; 23 | } 24 | 25 | inline operator float* () noexcept { return reinterpret_cast(this); } 26 | inline bVector4& operator[](std::size_t index) noexcept { return (reinterpret_cast(this))[index]; } 27 | 28 | bMatrix4(float* _mp) 29 | { 30 | v0 = _mp; 31 | v1 = _mp + 4; 32 | v2 = _mp + 8; 33 | v3 = _mp + 12; 34 | } 35 | bMatrix4(void* _vp) : bMatrix4((float*)_vp) {} 36 | bMatrix4(bVector4 _v0, bVector4 _v1, bVector4 _v2, bVector4 _v3) 37 | { 38 | v0 = _v0; 39 | v1 = _v1; 40 | v2 = _v2; 41 | v3 = _v3; 42 | } 43 | bMatrix4() : bMatrix4(bVector4(), bVector4(), bVector4(), bVector4()) {} 44 | } bMatrix4; -------------------------------------------------------------------------------- /NFSU2Unlimiter.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.31101.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NFSU2Unlimiter", "NFSU2Unlimiter.vcxproj", "{3C558AD9-5F9C-4A14-8F07-800F46C132C7}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Release|Win32 = Release|Win32 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {3C558AD9-5F9C-4A14-8F07-800F46C132C7}.Debug|Win32.ActiveCfg = Debug|Win32 15 | {3C558AD9-5F9C-4A14-8F07-800F46C132C7}.Debug|Win32.Build.0 = Debug|Win32 16 | {3C558AD9-5F9C-4A14-8F07-800F46C132C7}.Release|Win32.ActiveCfg = Release|Win32 17 | {3C558AD9-5F9C-4A14-8F07-800F46C132C7}.Release|Win32.Build.0 = Release|Win32 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /stdafx.h: -------------------------------------------------------------------------------- 1 | // stdafx.h : include file for standard system include files, 2 | // or project specific include files that are used frequently, but 3 | // are changed infrequently 4 | // 5 | 6 | #pragma once 7 | 8 | #include "targetver.h" 9 | 10 | #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 11 | // Windows Header Files: 12 | #include 13 | 14 | // Compile time hashing (Thanks to Xanvier) 15 | template 16 | static constexpr unsigned int compiler_stringhash_template = V; 17 | static constexpr unsigned int compiler_stringhash(char const* str) { 18 | if (str == NULL) return 0; 19 | 20 | char* _str = ((char*)str); 21 | unsigned int result = -1; 22 | 23 | while (*_str != 0) { 24 | result = result * 0x21 + (unsigned int)(*_str); 25 | _str = _str + 1; 26 | } 27 | 28 | return result; 29 | } 30 | 31 | #define CT_bStringHash(s) compiler_stringhash_template 32 | 33 | // TODO: reference additional headers your program requires here 34 | -------------------------------------------------------------------------------- /feDialogConfig.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | struct feDialogConfig { 7 | // total size: 0x338 8 | char BlurbString[768]; // offset 0x0, size 0x300 9 | unsigned int Button1TextHash; // offset 0x300, size 0x4 10 | unsigned int Button1PressedMessage; // offset 0x304, size 0x4 11 | unsigned int Button2TextHash; // offset 0x308, size 0x4 12 | unsigned int Button2PressedMessage; // offset 0x30C, size 0x4 13 | unsigned int Button3TextHash; // offset 0x310, size 0x4 14 | unsigned int Button3PressedMessage; // offset 0x314, size 0x4 15 | unsigned int DialogCancelledMessage; // offset 0x318, size 0x4 16 | unsigned int FirstButton; // offset 0x31C, size 0x4 17 | const char* ParentPackage; // offset 0x320, size 0x4 18 | const char* DialogPackage; // offset 0x324, size 0x4 19 | int NumButtons; // offset 0x328, size 0x4 20 | bool bIsDismissable; // offset 0x32C, size 0x1 21 | bool bDetectController; // offset 0x32D, size 0x1 22 | bool bBlurbIsUTF8; // offset 0x32E, size 0x1 23 | bool DismissedByOtherDialogMsg; // offset 0x32F, size 0x1 24 | int pad1; 25 | int pad2; 26 | }; -------------------------------------------------------------------------------- /UnlimiterData/_FNGFixes.ini: -------------------------------------------------------------------------------- 1 | # This ini file is used to clone objects in FNGs (FrontEnd Packages) to allow more options to show properly / fix issues. 2 | # 3 | # First section 4 | # NumberOfFNGFixes = Defines the number of fixes to get read from this file. 5 | # 6 | # FNG Fix sections (FNGX) 7 | # Required 8 | # FNGName = The name of FNG (FrontEnd Package). It usually ends with ".fng". 9 | # ObjectPrefix = Prefix (the name before any numbers) of the numbered object in the package to clone. Multiple entries can be added for the same package to clone different objects. 10 | # NumberOfObjects = Defines how many objects to end up with after cloning. 11 | # Optional 12 | # HasNumberSuffix = If the object needs to get cloned has numbers suffixed. (e.g. OPTION_DATA_70) 13 | # ChildX = If the cloned object is a group and requires its children to have numbered names, this is the option to add their prefix. 14 | 15 | 16 | [FNGFixes] 17 | NumberOfFNGFixes = 2 18 | 19 | [FNG1] 20 | FNGName = "UI_GenericParts_Browser.fng" 21 | ObjectPrefix = "CATEGORY_ICON" 22 | NumberOfObjects = 70 23 | HasNumberSuffix = 0 24 | 25 | [FNG2] 26 | FNGName = "UI_GenericParts_Browser.fng" 27 | ObjectPrefix = "PARTS_ICON" 28 | NumberOfObjects = 70 29 | HasNumberSuffix = 0 30 | 31 | -------------------------------------------------------------------------------- /DialogInterface.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | int(*DialogInterface_ShowDialog)(feDialogConfig* conf) = (int(*)(feDialogConfig*))0x558020; 7 | 8 | int DialogInterface_ShowThreeButtons(char const* from_pkg, char const* dlg_pkg, unsigned int button1_text_hash, unsigned int button2_text_hash, unsigned int button3_text_hash, unsigned int button1_pressed_message, unsigned int button2_pressed_message, unsigned int button3_pressed_message, unsigned int cancel_message, bool dismissable, unsigned int first_button, unsigned int blurb_fmt) 9 | { 10 | feDialogConfig conf; 11 | 12 | conf.ParentPackage = from_pkg; 13 | conf.DialogPackage = dlg_pkg; 14 | conf.Button3TextHash = button1_text_hash; // reversed for some reason 15 | conf.Button3PressedMessage = button1_pressed_message; 16 | conf.Button2TextHash = button2_text_hash; 17 | conf.Button2PressedMessage = button2_pressed_message; 18 | conf.Button1TextHash = button3_text_hash; 19 | conf.Button1PressedMessage = button3_pressed_message; 20 | conf.DialogCancelledMessage = cancel_message; 21 | conf.FirstButton = first_button; 22 | conf.NumButtons = 3; 23 | conf.bIsDismissable = dismissable; 24 | 25 | bSPrintf(conf.BlurbString, GetLocalizedString(blurb_fmt)); 26 | 27 | return DialogInterface_ShowDialog(&conf); 28 | } -------------------------------------------------------------------------------- /ChooseSpinnerBrand.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall ChooseSpinnerBrand_NotificationMessage(DWORD* ChooseSpinnerBrand, void* EDX_Unused, DWORD MessageHash, DWORD* fe_obj, DWORD param1, DWORD param2) 7 | { 8 | ChooseSpinnerBrand_NotificationMessage_Game(ChooseSpinnerBrand, MessageHash, fe_obj, param1, param2); 9 | if (MessageHash == CT_bStringHash("PAD_LEFT") || MessageHash == CT_bStringHash("PAD_RIGHT")) 10 | SetDetailsPaneVisibility((char const*)ChooseSpinnerBrand[1], 0); 11 | } 12 | 13 | void __fastcall ChooseSpinnerBrand_RefreshHeader(DWORD* ChooseSpinnerBrand, void* EDX_Unused) 14 | { 15 | ChooseSpinnerBrand_RefreshHeader_Game(ChooseSpinnerBrand); 16 | 17 | RefreshDetailsPane((char const*)ChooseSpinnerBrand[1], ChooseSpinnerBrand + 85, ChooseSpinnerBrand + 84, (DWORD*)ChooseSpinnerBrand[87]); 18 | } 19 | 20 | void __fastcall ChooseSpinnerBrand_StartBrowsingRims(DWORD* ChooseSpinnerBrand, void* EDX_Unused) 21 | { 22 | ChooseSpinnerBrand_StartBrowsingRims_Game(ChooseSpinnerBrand); 23 | 24 | SetDetailsPaneVisibility((char const*)ChooseSpinnerBrand[1], 1); 25 | } 26 | 27 | void __fastcall ChooseSpinnerBrand_StopBrowsingRims(DWORD* ChooseSpinnerBrand, void* EDX_Unused, bool ass) 28 | { 29 | ChooseSpinnerBrand_StopBrowsingRims_Game(ChooseSpinnerBrand, ass); 30 | 31 | SetDetailsPaneVisibility((char const*)ChooseSpinnerBrand[1], 0); 32 | } -------------------------------------------------------------------------------- /PartInfoWidget.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall PartInfoWidget_Draw(DWORD* PartInfoWidget, DWORD* EDX_Unused) 7 | { 8 | PerfPart *ThePart = (PerfPart*)PartInfoWidget[19]; 9 | 10 | // Part name 11 | FEngSetLanguageHash_obj((DWORD*)PartInfoWidget[11], GetPerfPartNameHash(ThePart)); 12 | //FEngSetLanguageHash_obj(PartInfoWidget[11], *(DWORD *)(PartInfoWidget[19] + 4)); 13 | 14 | if (PhysicsUpgradeSpecification_IsPerfPartInstalled((BYTE*)0x8395B0, *(DWORD*)PartInfoWidget[19])) 15 | { 16 | FEngSetLanguageHash_obj((DWORD*)PartInfoWidget[12], CT_bStringHash("INSTALLED")); 17 | FEngSetScript_Obj((DWORD*)PartInfoWidget[12], "Purchased", 1); 18 | return; 19 | } 20 | if (*(int*)_FEDatabase == 1) 21 | { 22 | if (CarCustomizeManager_IsPerfPartPurchased((DWORD*)gCarCustomizeManager, PartInfoWidget[19])) 23 | { 24 | FEngSetLanguageHash_obj((DWORD*)PartInfoWidget[12], CT_bStringHash("OWNED")); 25 | FEngSetScript_Obj((DWORD*)PartInfoWidget[12], "Purchased", 1); 26 | return; 27 | } 28 | FEngSetScript_Obj((DWORD*)PartInfoWidget[12], "Init", 1); 29 | FEngPrintf((DWORD*)PartInfoWidget[12], "%$d", *(DWORD*)(PartInfoWidget[19] + 8)); // Cost 30 | } 31 | else 32 | { 33 | FEngSetLanguageHash_obj((DWORD*)PartInfoWidget[12], CT_bStringHash("NOT_INSTALLED")); 34 | FEngSetScript_Obj((DWORD*)PartInfoWidget[12], "Init", 1); 35 | } 36 | } -------------------------------------------------------------------------------- /BuyPerfPartWidget.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall BuyPerfPartWidget_Draw(DWORD* BuyPerfPartWidget, DWORD* EDX_Unused) 7 | { 8 | PerfPart* ThePart = (PerfPart*)BuyPerfPartWidget[19]; 9 | 10 | // Part name 11 | FEngSetLanguageHash_obj((DWORD*)BuyPerfPartWidget[11], GetPerfPartNameHash(ThePart)); 12 | //FEngSetLanguageHash_obj((DWORD*)BuyPerfPartWidget[11], *(DWORD*)(BuyPerfPartWidget[19] + 4)); 13 | 14 | if (PhysicsUpgradeSpecification_IsPerfPartInstalled((BYTE*)0x8395B0, *(DWORD*)BuyPerfPartWidget[19])) 15 | { 16 | FEngSetLanguageHash_obj((DWORD*)BuyPerfPartWidget[12], CT_bStringHash("INSTALLED")); 17 | FEngSetScript_Obj((DWORD*)BuyPerfPartWidget[12], "Purchased", 1); 18 | return; 19 | } 20 | if (*(int*)_FEDatabase == 1) 21 | { 22 | if (CarCustomizeManager_IsPerfPartPurchased((DWORD*)gCarCustomizeManager, BuyPerfPartWidget[19])) 23 | { 24 | FEngSetLanguageHash_obj((DWORD*)BuyPerfPartWidget[12], CT_bStringHash("OWNED")); 25 | FEngSetScript_Obj((DWORD*)BuyPerfPartWidget[12], "Purchased", 1); 26 | return; 27 | } 28 | FEngSetScript_Obj((DWORD*)BuyPerfPartWidget[12], "Unhighlight", 1); 29 | FEngPrintf((DWORD*)BuyPerfPartWidget[12], "%$d", *(DWORD*)(BuyPerfPartWidget[19] + 8)); // Cost 30 | } 31 | else 32 | { 33 | FEngSetLanguageHash_obj((DWORD*)BuyPerfPartWidget[12], CT_bStringHash("NOT_INSTALLED")); 34 | FEngSetScript_Obj((DWORD*)BuyPerfPartWidget[12], "Unhighlight", 1); 35 | } 36 | } -------------------------------------------------------------------------------- /StreamingTrafficCarManager.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | BYTE TheStreamingTrafficCarManager[0x1230 + 0x920 * 64]; // 0x1230 = (0x10, DummyRideInfo = 0x8F0, other stuff = 0x330) + 0x920 * traffic car count) 7 | 8 | void __fastcall StreamingTrafficCarManager_ApplyRandomSkins(DWORD* StreamingTrafficCarManager, void* EDX_Unused) 9 | { 10 | DWORD* StreamingTrafficCarHead = StreamingTrafficCarManager + 576; 11 | char SkinNameBuf[64]; 12 | 13 | for (DWORD* StreamingTrafficCar = (DWORD*)StreamingTrafficCarManager[576]; 14 | StreamingTrafficCar != StreamingTrafficCarHead; 15 | StreamingTrafficCar = (DWORD*)StreamingTrafficCar[0]) 16 | { 17 | // Get skin number and ride info 18 | BYTE skin = ((BYTE*)StreamingTrafficCar)[23]; 19 | DWORD* ride = StreamingTrafficCar + 4; 20 | sprintf(SkinNameBuf, "%s_SKIN%d", GetCarTypeName(ride[0]), skin); 21 | 22 | bReleasePrintf("StreamingTrafficCarManager_ApplyRandomSkins: %p = %s\n", StreamingTrafficCar, SkinNameBuf); 23 | 24 | // Update 25 | ride[353] = bStringHash(SkinNameBuf); // mCompositeSkinHash 26 | } 27 | } 28 | 29 | void __fastcall StreamingTrafficCarManager_Update(DWORD *StreamingTrafficCarManager, void *EDX_Unused) 30 | { 31 | StreamingTrafficCarManager_Update_Game(StreamingTrafficCarManager); 32 | StreamingTrafficCarManager_ApplyRandomSkins(StreamingTrafficCarManager, EDX_Unused); 33 | } 34 | 35 | void __fastcall StreamingTrafficCarManager_ResetStats(DWORD* StreamingTrafficCarManager, void* EDX_Unused) 36 | { 37 | StreamingTrafficCarManager_ResetStats_Game(StreamingTrafficCarManager); 38 | StreamingTrafficCarManager_ApplyRandomSkins(StreamingTrafficCarManager, EDX_Unused); 39 | } -------------------------------------------------------------------------------- /CustomHUD_Browser.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall CustomHUD_Browser_RefreshHeader(DWORD* CustomHUD_Browser, void* EDX_Unused) 7 | { 8 | char const* PackageName = (char const*)CustomHUD_Browser[1]; 9 | 10 | if ((DWORD*)CustomHUD_Browser[21] != CustomHUD_Browser + 21) 11 | { 12 | DWORD* CurrSelPart = (DWORD*)CustomHUD_Browser[23]; 13 | if (CurrSelPart) 14 | { 15 | DWORD* part = (DWORD*)CurrSelPart[11]; 16 | 17 | if (CarPart_HasAppliedAttribute(part, CT_bStringHash("LANGUAGEHASH"))) 18 | { 19 | FEngSetLanguageHash(PackageName, CT_bStringHash("PART_NAME"), CarPart_GetAppliedAttributeUParam(part, CT_bStringHash("LANGUAGEHASH"), 0)); 20 | } 21 | else 22 | { 23 | FEPrintf(PackageName, CT_bStringHash("PART_NAME"), CarPart_GetName(part)); 24 | } 25 | 26 | g_displayHUDattributes[0] = CarPart_GetAppliedAttributeUParam(part, CT_bStringHash("HUDINDEX"), 0); 27 | g_displayHUDprefix = bStringHash2("_", CarPart_GetAppliedAttributeUParam(part, CT_bStringHash("TEXTURE_NAME"), CT_bStringHash("3RDPERSON"))); 28 | 29 | int CurrNodeIndex = ThumbnailScroller_GetCurrenNodeIndex(CustomHUD_Browser + 20); 30 | FEScrollBar_Update(CustomHUD_Browser + 45, 1, CustomHUD_Browser[67], CurrNodeIndex); 31 | 32 | CarPart_Print(part); 33 | 34 | if (*(int*)_FEDatabase != 1 || *(int*)0x83898C == 1) 35 | { 36 | FEngSetInvisible_Pkg(PackageName, CT_bStringHash("PRICE")); 37 | } 38 | else 39 | { 40 | int CarPartCost = PlayerCareerState_GetCarPartCost_Game((DWORD*)ThePlayerCareer, *(DWORD*)(CustomHUD_Browser[68] + 72), part); 41 | FEPrintf_ObjName(PackageName, "Cash", "%$d", CarPartCost); 42 | } 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /includes/injector/utility.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Injectors - Utility / Helpers 3 | * 4 | * Copyright (C) 2014 LINK/2012 5 | * 6 | * This software is provided 'as-is', without any express or implied 7 | * warranty. In no event will the authors be held liable for any damages 8 | * arising from the use of this software. 9 | * 10 | * Permission is granted to anyone to use this software for any purpose, 11 | * including commercial applications, and to alter it and redistribute it 12 | * freely, subject to the following restrictions: 13 | * 14 | * 1. The origin of this software must not be misrepresented; you must not 15 | * claim that you wrote the original software. If you use this software 16 | * in a product, an acknowledgment in the product documentation would be 17 | * appreciated but is not required. 18 | * 19 | * 2. Altered source versions must be plainly marked as such, and must not be 20 | * misrepresented as being the original software. 21 | * 22 | * 3. This notice may not be removed or altered from any source 23 | * distribution. 24 | * 25 | */ 26 | #pragma once 27 | 28 | namespace injector 29 | { 30 | template 31 | T return_value() 32 | { 33 | return value; 34 | } 35 | 36 | template 37 | void* force_ptr(const T& fun) 38 | { 39 | auto ptr = fun; 40 | return *(void**)&ptr; 41 | } 42 | 43 | 44 | // Helper structure to help calling back what was there before a hook 45 | // e.g. hb.fun = MakeCALL(0x0, raw_ptr(my_hook)); 46 | template 47 | struct hook_back 48 | { 49 | typedef FuncType func_type; 50 | 51 | func_type fun; 52 | 53 | hook_back() : fun(nullptr) 54 | {} 55 | }; 56 | }; 57 | -------------------------------------------------------------------------------- /PlayerCareerState.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | #define UnlockablePartsDataList *(int*)0x83845C 7 | 8 | int __fastcall PlayerCareerState_GetCarPartCost(DWORD *PlayerCareerState, void *EDX_Unused, int slot, DWORD* part) 9 | { 10 | int unlockable; // eax 11 | char UpgradeLevel; // cl 12 | int v5; // edx 13 | int v6; // eax 14 | int result = 0; // eax 15 | 16 | unlockable = MapCarPartToUnlockable(slot, part); 17 | UpgradeLevel = *((BYTE*)part + 5) >> 5; 18 | 19 | v5 = UpgradeLevel; 20 | if (UpgradeLevel == 4) 21 | goto ZeroCost; 22 | if (UpgradeLevel) 23 | { 24 | if (unlockable <= 0 || unlockable >= 87) 25 | goto ZeroCost; 26 | } 27 | else 28 | { 29 | if (unlockable != 76) 30 | goto ZeroCost; 31 | v5 = 1; 32 | } 33 | v6 = 5 * unlockable; 34 | if (UnlockablePartsDataList + 8 * v6 == 40) 35 | goto ZeroCost; 36 | result = *((__int16*)UnlockablePartData_GetLevel((BYTE*)(UnlockablePartsDataList + 8 * v6 - 40), v5) + 1); 37 | if (result == -1) 38 | goto ZeroCost; 39 | goto GetCost; 40 | 41 | ZeroCost: 42 | result = 0; 43 | 44 | GetCost: 45 | return CarPart_GetAppliedAttributeUParam(part, CT_bStringHash("COST"), result); 46 | } 47 | 48 | int __fastcall PlayerCareerState_GetCarPartRep(DWORD* PlayerCareerState, void* EDX_Unused, int type, int slot, DWORD* part) 49 | { 50 | int unlockable; // eax 51 | int result; // eax 52 | 53 | unlockable = MapCarPartToUnlockable(slot, part); 54 | result = GetUnlockablePartRep(unlockable, *((BYTE*)part + 5) >> 5); 55 | if (slot == CAR_SLOT_ID::BASE_PAINT && *(DWORD*)part == *(DWORD*)(0x890 * type + *(DWORD*)_CarTypeInfoArray + 0x84C) || result == -1) 56 | return 0; // stock paint 57 | return CarPart_GetAppliedAttributeUParam(part, CT_bStringHash("REP"), result); 58 | } -------------------------------------------------------------------------------- /LoadedSkin.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | struct LoadedSkin /* : public bTNode*/ { 7 | // total size: 0x2E0 8 | LoadedSkin* next; // offset 0x0, size 0x4 9 | LoadedSkin* prev; // offset 0x4, size 0x4 10 | UsedCarTextureInfo SkinLayers; // offset 0x8, size 0x2FC 11 | DWORD*/*RideInfo**/ pRideInfo; // offset 0x304, size 0x4 12 | BYTE LoadStatePerm; // offset 0x308, size 0x1 13 | BYTE LoadStateTemp; // offset 0x30C, size 0x1 14 | BYTE DoneComposite; // offset 0x310, size 0x1 15 | BYTE IsPlayerSkin; // offset 0x314, size 0x4 16 | int InFrontEnd; // offset 0x318, size 0x4 17 | DWORD* /*LoadedTexturePack**/ pLoadedTexturesPack; // offset 0x31C, size 0x4 18 | DWORD* /*LoadedTexturePack**/ pLoadedVinylsPack; // offset 0x320, size 0x4 19 | int NumLoadedSkinLayersPerm; // offset 0x318, size 0x4 20 | LoadedSkinLayer* LoadedSkinLayersPerm[MaxPermTex]; // offset 0x31C, size 0x114 21 | int NumLoadedSkinLayersTemp; // offset 0x430, size 0x4 22 | LoadedSkinLayer* LoadedSkinLayersTemp[MaxTempTex]; // offset 0x434, size 0x114 23 | }; 24 | 25 | LoadedSkin *__fastcall LoadedSkin_Create(LoadedSkin *_this, void* EDX_Unused, DWORD* ride_info, int in_front_end, int is_player_skin) 26 | { 27 | _this->InFrontEnd = is_player_skin; 28 | _this->pRideInfo = ride_info; 29 | _this->LoadStatePerm = 0; 30 | _this->LoadStateTemp = 0; 31 | _this->DoneComposite = 0; 32 | GetUsedCarTextureInfo(&_this->SkinLayers, ride_info, in_front_end, is_player_skin); 33 | _this->pLoadedTexturesPack = 0; 34 | _this->pLoadedVinylsPack = 0; 35 | _this->NumLoadedSkinLayersPerm = 0; 36 | memset(_this->LoadedSkinLayersPerm, 0, sizeof(_this->LoadedSkinLayersPerm)); 37 | _this->NumLoadedSkinLayersTemp = 0; 38 | memset(_this->LoadedSkinLayersTemp, 0, sizeof(_this->LoadedSkinLayersTemp)); 39 | return _this; 40 | } -------------------------------------------------------------------------------- /PerfPart.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | #include "Helpers.h" 6 | 7 | #pragma pack(push, 1) 8 | 9 | typedef struct 10 | { 11 | int Index; 12 | DWORD NameHash; 13 | int Cost; 14 | int NumBrands; 15 | DWORD Brand1; 16 | DWORD Brand2; 17 | DWORD Brand3; 18 | DWORD Brand4; 19 | DWORD Brand5; 20 | DWORD Brand6; 21 | DWORD Brand7; 22 | DWORD Brand8; 23 | float AmplifierFraction; 24 | float RangeX; 25 | float RangeY; 26 | float RangeZ; 27 | int ReplacedByIndex1; 28 | int ReplacedByIndex2; 29 | BYTE pad[20]; 30 | } PerfPart; 31 | 32 | #pragma pack(pop) 33 | 34 | PerfPart SuperchargerParts[3]; 35 | 36 | DWORD GetPerfPartNameHash(PerfPart *part) 37 | { 38 | // Read Part Options for the car 39 | DWORD FECarConfig = *(DWORD*)_FECarConfigRef; 40 | int CarTypeID = (*(int(__thiscall**)(int))(*(DWORD*)FECarConfig + 4))(FECarConfig); 41 | 42 | DWORD result = part->NameHash; 43 | 44 | // Replace turbo with supercharger if needed 45 | if (UsesSupercharger(CarTypeID)) 46 | { 47 | switch (part->NameHash) 48 | { 49 | case CT_bStringHash("TU_STAGE_1_TURBO_KIT"): 50 | result = DefaultPerformancePartHashes[DefaultPerformancePartCount - 3]; // Supercharger Stage 1 51 | break; 52 | case CT_bStringHash("TU_STAGE_2_TURBO_KIT"): 53 | result = DefaultPerformancePartHashes[DefaultPerformancePartCount - 2]; // Supercharger Stage 1 54 | break; 55 | case CT_bStringHash("TU_STAGE_3_TURBO_KIT"): 56 | result = DefaultPerformancePartHashes[DefaultPerformancePartCount - 1]; // Supercharger Stage 1 57 | break; 58 | } 59 | } 60 | 61 | // Get replaced part name hash 62 | for (int p = 0; p < DefaultPerformancePartCount; p++) 63 | { 64 | if (result == DefaultPerformancePartHashes[p]) 65 | { 66 | result = CarConfigs[CarTypeID].PerformanceParts.ReplacementHashes[p]; 67 | break; 68 | } 69 | } 70 | 71 | return result; 72 | } 73 | 74 | void ChangeToSupercharger(PerfPart *part) 75 | { 76 | 77 | } -------------------------------------------------------------------------------- /ReplacementTextureEntry.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | #pragma pack(push, 1) 7 | 8 | typedef struct 9 | { 10 | /* 0x0000 */ DWORD hOldNameHash; 11 | /* 0x0004 */ DWORD hNewNameHash; 12 | /* 0x0008 */ DWORD* pTextureInfo; 13 | /* 0x000C */ DWORD unk; 14 | } ReplacementTextureEntry; 15 | 16 | #pragma pack(pop) 17 | 18 | int ReplacementTextureTable_Find(ReplacementTextureEntry* table, DWORD src, int size) 19 | { 20 | int result = -1; 21 | 22 | for (int i = 0; i < size; i++) 23 | { 24 | if (table[i].hOldNameHash == src) 25 | { 26 | result = i; 27 | break; 28 | } 29 | } 30 | 31 | return result; 32 | } 33 | 34 | int ReplacementTextureTable_FindFirstEmpty(ReplacementTextureEntry* table, int size) 35 | { 36 | int result = -1; 37 | 38 | for (int i = 0; i < size; i++) 39 | { 40 | if (!table[i].hOldNameHash && !table[i].hNewNameHash) 41 | { 42 | result = i; 43 | break; 44 | } 45 | } 46 | 47 | return result; 48 | } 49 | 50 | void ReplacementTextureTable_UpdateEntry(ReplacementTextureEntry* table, int index, DWORD dest, int size) 51 | { 52 | if (index > size) return; 53 | 54 | if (index != -1 && table[index].hNewNameHash != dest) 55 | { 56 | table[index].hNewNameHash = dest; 57 | table[index].pTextureInfo = (DWORD*)-1; 58 | table[index].unk = 0; 59 | } 60 | } 61 | 62 | void ReplacementTextureTable_WriteEntry(ReplacementTextureEntry* table, int index, DWORD src, DWORD dest, int size) 63 | { 64 | if (index > size) return; 65 | 66 | if (index != -1 && table[index].hNewNameHash != dest) 67 | { 68 | table[index].hOldNameHash = src; 69 | table[index].hNewNameHash = dest; 70 | table[index].pTextureInfo = (DWORD*)-1; 71 | table[index].unk = 0; 72 | } 73 | } 74 | 75 | void ReplacementTextureTable_AddEntry(ReplacementTextureEntry* table, DWORD src, DWORD dest, int size) 76 | { 77 | int index = ReplacementTextureTable_Find(table, src, size); // Find the entry with src to replace dest 78 | if (index == -1) index = ReplacementTextureTable_FindFirstEmpty(table, size); // Find first empty entry 79 | 80 | ReplacementTextureTable_WriteEntry(table, index, src, dest, size); // Write entry 81 | } -------------------------------------------------------------------------------- /RandomCharacterNames.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "stdio.h" 3 | #include "InGameFunctions.h" 4 | #include "UserCalls.h" 5 | 6 | using namespace std; 7 | 8 | int NumberOfNames; 9 | char const** QuickRaceCharacterNames; 10 | bool STRFirstTime = 1; 11 | 12 | // Read the names from RACERNAME_%03d strings (like NFSMW+) 13 | int CountRandomNameStrings() 14 | { 15 | if (!STRFirstTime) 16 | { 17 | return NumberOfNames; 18 | } 19 | 20 | int i; 21 | char OppNameBuffer[15]; 22 | 23 | for (i = 0; i <= 999; i++) 24 | { 25 | sprintf(OppNameBuffer, "RACERNAME_%03d", i); 26 | if (!MakeUserCall(SearchForString, 1, edx, bStringHash(OppNameBuffer))) break; 27 | } 28 | 29 | if (i > 0) NumberOfNames = i; 30 | else NumberOfNames = -1; 31 | 32 | STRFirstTime = 0; 33 | return i; 34 | } 35 | 36 | void GetRandomCharacterNames(const char** Names, int NumberOfOpponents) 37 | { 38 | int* NameUsed; // esi 39 | int i; // ebx 40 | int v4; // edi 41 | int ID; // eax 42 | char RandomNameBuffer[16]; 43 | int RandomNameHash; 44 | bool IsUsingStringImplementation = 0; 45 | 46 | NumberOfNames = CountRandomNameStrings(); 47 | 48 | // Fall back to game's implementation if the conditions are not met 49 | if ((!RandomNameHook || !NumberOfNames) && (NumberOfNames < NumberOfOpponents)) return GetRandomCharacterNames_Game(Names, NumberOfOpponents); 50 | 51 | // String Implementation 52 | NameUsed = (int*)j__malloc(NumberOfNames * sizeof(int)); 53 | memset(NameUsed, 0, NumberOfNames * sizeof(int)); 54 | for (i = 0; i < NumberOfOpponents; ++i) 55 | { 56 | v4 = 0; 57 | while (1) 58 | { 59 | ID = bRandom(NumberOfNames); 60 | if (!NameUsed[ID]) 61 | break; 62 | if (++v4 >= 100) 63 | goto LABEL_7; 64 | } 65 | 66 | sprintf(RandomNameBuffer, "RACERNAME_%03d", ID); 67 | RandomNameHash = bStringHash(RandomNameBuffer); 68 | Names[i] = GetLocalizedString(RandomNameHash); 69 | NameUsed[ID] = 1; 70 | 71 | LABEL_7: 72 | ; 73 | } 74 | j__free(NameUsed); 75 | } -------------------------------------------------------------------------------- /bVector.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | // bVector2 7 | typedef struct bVector2 8 | { 9 | 10 | float x; 11 | float y; 12 | 13 | 14 | inline bVector2& operator=(const bVector2& r) noexcept 15 | { 16 | x = r.x; 17 | y = r.y; 18 | 19 | return *this; 20 | } 21 | 22 | inline operator float* () noexcept { return reinterpret_cast(this); } 23 | 24 | bVector2(float* _fp) 25 | { 26 | x = _fp[0]; 27 | y = _fp[1]; 28 | } 29 | bVector2(void* _vp) : bVector2((float*)_vp) {} 30 | bVector2(float _x, float _y) 31 | { 32 | x = _x; 33 | y = _y; 34 | } 35 | bVector2() : bVector2(0.0f, 0.0f) {} 36 | } bVector2; 37 | 38 | // bVector3 39 | typedef struct bVector3 40 | { 41 | float x; 42 | float y; 43 | float z; 44 | BYTE pad[4]; 45 | 46 | inline bVector3& operator=(const bVector3& r) noexcept 47 | { 48 | x = r.x; 49 | y = r.y; 50 | z = r.z; 51 | 52 | return *this; 53 | } 54 | 55 | inline operator float* () noexcept { return reinterpret_cast(this); } 56 | 57 | bVector3(float* _fp) 58 | { 59 | x = _fp[0]; 60 | y = _fp[1]; 61 | z = _fp[2]; 62 | } 63 | bVector3(void* _vp) : bVector3((float*)_vp) {} 64 | bVector3(float _x, float _y, float _z) 65 | { 66 | x = _x; 67 | y = _y; 68 | z = _z; 69 | } 70 | bVector3() : bVector3(0.0f, 0.0f, 0.0f) {} 71 | } bVector3; 72 | 73 | // bVector4 74 | typedef struct bVector4 75 | { 76 | float x; 77 | float y; 78 | float z; 79 | float w; 80 | 81 | inline bVector4& operator=(const bVector4& r) noexcept 82 | { 83 | x = r.x; 84 | y = r.y; 85 | z = r.z; 86 | w = r.w; 87 | 88 | return *this; 89 | } 90 | 91 | inline operator float* () noexcept { return reinterpret_cast(this); } 92 | 93 | bVector4(float* _fp) 94 | { 95 | x = _fp[0]; 96 | y = _fp[1]; 97 | z = _fp[2]; 98 | w = _fp[3]; 99 | } 100 | bVector4(void* _vp) : bVector4((float*)_vp) {} 101 | bVector4(float _x, float _y, float _z, float _w) 102 | { 103 | x = _x; 104 | y = _y; 105 | z = _z; 106 | w = _w; 107 | } 108 | bVector4() : bVector4(0.0f, 0.0f, 0.0f, 0.0f) {} 109 | } bVector4; 110 | 111 | typedef bVector4 bQuaternion; -------------------------------------------------------------------------------- /CarPartID.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | enum CAR_PART_ID : int 7 | { 8 | p___INVALID = -1, 9 | p_BASE, 10 | p_FRONT_BUMPER, 11 | p_REAR_BUMPER, 12 | p_LEFT_SIDE_MIRROR, 13 | p_RIGHT_SIDE_MIRROR, 14 | p_BODY, 15 | p_WIDE_BODY, 16 | p_ROOF, 17 | p_TOP, 18 | p_HOOD, 19 | p_TRUNK, 20 | p_SKIRT, 21 | p_SPOILER, 22 | p_ENGINE, 23 | p_HEADLIGHT, 24 | p_BRAKELIGHT, 25 | p_DOOR_LEFT, 26 | p_DOOR_RIGHT, 27 | p_DOOR_PANEL_LEFT, 28 | p_DOOR_PANEL_RIGHT, 29 | p_DOOR_SILL_LEFT, 30 | p_DOOR_SILL_RIGHT, 31 | p_FENDER, 32 | p_QUARTER, 33 | p_HOOD_UNDER, 34 | p_TRUNK_UNDER, 35 | p_EXHAUST, 36 | p_BRAKE, 37 | p_WHEEL, 38 | p_SPINNER, 39 | p_WING_MIRROR, 40 | p_LICENSE_PLATE, 41 | p_DAMAGE_FRONT, 42 | p_DAMAGE_REAR, 43 | p_DAMAGE_LEFT, 44 | p_DAMAGE_RIGHT, 45 | p_DAMAGE_TOP, 46 | p_DECAL_HOOD, 47 | p_DECAL_FRONT_WINDOW, 48 | p_DECAL_REAR_WINDOW, 49 | p_DECAL_LEFT_DOOR, 50 | p_DECAL_RIGHT_DOOR, 51 | p_DECAL_LEFT_QUARTER, 52 | p_DECAL_RIGHT_QUARTER, 53 | p_WIDEBODY_DECAL_LEFT_DOOR, 54 | p_WIDEBODY_DECAL_RIGHT_DOOR, 55 | p_WIDEBODY_DECAL_LEFT_QUARTER, 56 | p_WIDEBODY_DECAL_RIGHT_QUARTER, 57 | p_PAINT, 58 | p_VINYL_PAINT, 59 | p_VINYL, 60 | p_CARBON_FIBRE, 61 | p_DECAL_TEXTURE, 62 | p_WINDOW_TINT, 63 | p_NEON, 64 | p_CABIN_NEON_FRAME, 65 | p_HEADLIGHT_BULB, 66 | p_DOOR_STYLE, 67 | p_HYDRAULICS, 68 | p_NOS_PURGE, 69 | p_TRUNK_AUDIO, 70 | p_TRUNK_AUDIO_COMP_SMALL, 71 | p_TRUNK_AUDIO_COMP_MEDIUM, 72 | p_TRUNK_AUDIO_COMP_LARGE, 73 | p_CUSTOM_HUD, 74 | p_CUSTOM_HUD_PAINT, 75 | p_CV, 76 | p_WHEEL_MANUFACTURER, 77 | p_MISC, 78 | p___NUM = 69, 79 | }; 80 | 81 | struct CarPartIDName 82 | { 83 | CAR_PART_ID CarPartID; 84 | char const* Name; 85 | }; 86 | 87 | CarPartIDName* CarPartIDNames = (CarPartIDName*)0x803338; 88 | 89 | char const* GetCarPartIDName(int CarPartID) 90 | { 91 | if (CarPartID < 0 || CarPartID >= CAR_PART_ID::p___NUM) 92 | return "NONE"; 93 | return CarPartIDNames[CarPartID].Name; 94 | } 95 | 96 | int GetCarPartIDFromName(char const* Name) 97 | { 98 | for (int i = 0; i < CAR_PART_ID::p___NUM; ++i) 99 | { 100 | if (strcmp(CarPartIDNames[i].Name, Name) == 0) 101 | return CarPartIDNames[i].CarPartID; 102 | } 103 | return CAR_PART_ID::p___INVALID; 104 | } -------------------------------------------------------------------------------- /SelectCarCameraMover.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall SelectCarCameraMover_GetAndMoveToNewDefaultOrientation(DWORD* SelectCarCameraMover, int CarTypeID, float FoV, float XEye, float XLook, float YEye, float XRot, float Zoom, float YRot, float AnimTime, float Focus) 7 | { 8 | StaticCameraInfo* StCam = GetStaticCameraInfo(CarTypeID); 9 | 10 | if (SelectCarCameraMover) 11 | { 12 | if (StCam) 13 | { 14 | SelectCarCameraMover_MoveToNewDefaultOrientation( 15 | SelectCarCameraMover, 16 | StCam->FoV, 17 | StCam->XEye, 18 | StCam->XLook, 19 | StCam->YEye, 20 | StCam->XRot, 21 | StCam->Zoom, 22 | StCam->YRot, 23 | StCam->AnimTime, 24 | StCam->Focus); 25 | } 26 | else 27 | { 28 | SelectCarCameraMover_MoveToNewDefaultOrientation( 29 | SelectCarCameraMover, 30 | FoV, 31 | XEye, 32 | XLook, 33 | YEye, 34 | XRot, 35 | Zoom, 36 | YRot, 37 | AnimTime, 38 | Focus); 39 | } 40 | } 41 | } 42 | 43 | StaticCameraInfo* __fastcall SelectCarCameraMover_GetAndSetDefaultOrientation(DWORD* SelectCarCameraMover, int CarTypeID, float FoV, float XEye, float XLook, float YEye, float XRot, float Zoom, float YRot, float AnimTime, float Focus) 44 | { 45 | StaticCameraInfo* StCam = GetStaticCameraInfo(CarTypeID); 46 | 47 | if (SelectCarCameraMover) 48 | { 49 | if (StCam) 50 | { 51 | SelectCarCameraMover_SetDefaultOrientation( 52 | SelectCarCameraMover, 53 | StCam->FoV, 54 | StCam->XEye, 55 | StCam->XLook, 56 | StCam->YEye, 57 | StCam->XRot, 58 | StCam->Zoom, 59 | StCam->YRot, 60 | StCam->AnimTime, 61 | StCam->Focus); 62 | } 63 | else 64 | { 65 | SelectCarCameraMover_SetDefaultOrientation( 66 | SelectCarCameraMover, 67 | FoV, 68 | XEye, 69 | XLook, 70 | YEye, 71 | XRot, 72 | Zoom, 73 | YRot, 74 | AnimTime, 75 | Focus); 76 | } 77 | 78 | } 79 | 80 | return StCam; 81 | } -------------------------------------------------------------------------------- /UsedCarTextureInfo.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdafx.h" 4 | #include "stdio.h" 5 | 6 | #define MaxPermTex 109 // original value: 69 7 | #define MaxTempTex 29 // original value: 69 8 | 9 | #pragma pack(push, 1) 10 | 11 | typedef struct // total size: 0x2FC 12 | { 13 | DWORD TexturesToLoadPerm[MaxPermTex]; // offset 0x0, size 0x114 14 | DWORD TexturesToLoadTemp[MaxTempTex]; // offset 0x114, size 0x114 15 | int NumTexturesToLoadPerm; // offset 0x228, size 0x4 16 | int NumTexturesToLoadTemp; // offset 0x22C, size 0x4 17 | DWORD MappedSkinHash; // offset 0x230, size 0x4 18 | DWORD MappedSkinBHash; // offset 0x234, size 0x4 19 | DWORD MappedGlobalHash; // offset 0x238, size 0x4 20 | DWORD MappedWheelHash; // offset 0x23C, size 0x4 21 | DWORD MappedSpinnerHash; // offset 0x240, size 0x4 22 | DWORD MappedBadging; // offset 0x244, size 0x4 23 | DWORD MappedSpoilerHash; // offset 0x248, size 0x4 24 | DWORD MappedRoofScoopHash; // offset 0x24C, size 0x4 25 | DWORD MappedDashSkinHash; // offset 0x250, size 0x4 26 | DWORD MappedLightHash[11]; // offset 0x254, size 0x2C 27 | DWORD MappedTireHash; // offset 0x280, size 0x4 28 | DWORD MappedRimHash; // offset 0x284, size 0x4 29 | DWORD MappedRimBlurHash; // offset 0x288, size 0x4 30 | DWORD MappedLicensePlateHash; // offset 0x28C, size 0x4 31 | DWORD ReplaceSkinHash; // offset 0x290, size 0x4 32 | DWORD ReplaceSkinBHash; // offset 0x294, size 0x4 33 | DWORD ReplaceGlobalHash; // offset 0x298, size 0x4 34 | DWORD ReplaceWheelHash; // offset 0x29C, size 0x4 35 | DWORD ReplaceSpinnerHash; // offset 0x2A0, size 0x4 36 | DWORD ReplaceSpoilerHash; // offset 0x2A4, size 0x4 37 | DWORD ReplaceRoofScoopHash; // offset 0x2A8, size 0x4 38 | DWORD ReplaceDashSkinHash; // offset 0x2AC, size 0x4 39 | DWORD ReplaceHeadlightHash[3]; // offset 0x2B0, size 0xC 40 | DWORD ReplaceHeadlightGlassHash[3]; // offset 0x2BC, size 0xC 41 | DWORD ReplaceBrakelightHash[3]; // offset 0x2C8, size 0xC 42 | DWORD ReplaceBrakelightGlassHash[3]; // offset 0x2D4, size 0xC 43 | DWORD ReplaceCentreBrakelightHash[3]; // offset 0x2E0, size 0xC 44 | DWORD ReplaceReverselightHash[3]; // offset 0x2EC, size 0xC 45 | DWORD ShadowHash; // offset 0x2F8, size 0x4 46 | } UsedCarTextureInfo; 47 | 48 | #pragma pack(pop) 49 | 50 | void GetUsedCarTextureInfo(UsedCarTextureInfo* info, DWORD* ride_info, int front_end_only, int engine); // Prototype so the compiler doesn't complain about the function being used before its definition 51 | 52 | int UsedCarTextureReplace(DWORD* UsedCarTextureTable, int NumberOfTextures, int SourceTextureHash, int DestinationTextureHash) 53 | { 54 | if (UsedCarTextureTable) 55 | { 56 | for (int i = 0; i < NumberOfTextures; i++) 57 | { 58 | if (UsedCarTextureTable[i] == SourceTextureHash) UsedCarTextureTable[i] = DestinationTextureHash; 59 | } 60 | } 61 | 62 | return DestinationTextureHash; 63 | } -------------------------------------------------------------------------------- /StarGazerGuide.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | #define ForceCarStars *(float*)0x7FA290 7 | 8 | int GetRepFromNumStars(float NumStars) 9 | { 10 | if (NumStars < 0.0f) NumStars = 0.0f; 11 | if (NumStars > (float)TheStarGazer.MaxStars) NumStars = (float)TheStarGazer.MaxStars; 12 | 13 | float BeforeDot; 14 | float AfterDot = modff(NumStars, &BeforeDot); 15 | int iNumStars = floorf(BeforeDot); 16 | int iNextNumStars = iNumStars + 1; 17 | 18 | // Max failsafe 19 | if (NumStars > TheStarGazer.MaxStars) iNextNumStars = iNumStars; 20 | 21 | return TheStarGazer.Rep[iNumStars] 22 | + AfterDot * (TheStarGazer.Rep[iNextNumStars] - TheStarGazer.Rep[iNumStars]); 23 | } 24 | 25 | float GetNumStarsFromRep(int Rep) 26 | { 27 | if (Rep < 0) Rep = 0; 28 | 29 | int i; 30 | 31 | for (i = 0; i < TheStarGazer.MaxStars; i++) 32 | { 33 | if (Rep >= TheStarGazer.Rep[i]) 34 | { 35 | if (Rep < TheStarGazer.Rep[i + 1]) break; 36 | 37 | if (TheStarGazer.Rep[i + 1] <= TheStarGazer.Rep[i]) return (float)i; 38 | } 39 | } 40 | 41 | if (i == TheStarGazer.MaxStars) return (float)TheStarGazer.MaxStars; 42 | 43 | // Calculate level 44 | int RepForThisLevel = TheStarGazer.Rep[i + 1] - TheStarGazer.Rep[i]; 45 | int Remainder = Rep - TheStarGazer.Rep[i]; 46 | 47 | if (RepForThisLevel <= 0) return (float)i; 48 | 49 | return (float)i + (float)Remainder / (float)RepForThisLevel; 50 | } 51 | 52 | float __fastcall StarGazerGuide_GetNumberOfStars(DWORD* StarGazerGuide, void* EDX_Unused, DWORD* ride) 53 | { 54 | int Rep = CarConfigs[ride[0]].StarGazer.StartingRep; 55 | 56 | if (TheStarGazer.ForceRep != -1) 57 | { 58 | ForceCarStars = GetNumStarsFromRep(TheStarGazer.ForceRep); 59 | } 60 | 61 | if (ForceCarStars != -1.0f) return ForceCarStars; 62 | 63 | DWORD* WideBodyPart = (DWORD*)ride[356 + CAR_SLOT_ID::WIDE_BODY]; 64 | DWORD* Part; 65 | bool HasWidebody = 1; 66 | 67 | if (!WideBodyPart || ((*(BYTE*)WideBodyPart + 5) & 0xE0) == 0) HasWidebody = 0; 68 | 69 | for (int i = 0; i < CAR_SLOT_ID::__NUM; i++) 70 | { 71 | if ((i >= CAR_SLOT_ID::VINYL_COLOUR0_0 && i <= VINYL_COLOUR3_3) || (i == CAR_SLOT_ID::REAR_WHEEL)) continue; // Vinyl Colors & Rear Wheel 72 | 73 | Part = (DWORD*)ride[356 + i]; 74 | 75 | if (i == CAR_SLOT_ID::FRONT_WHEEL) // Compare front and rear wheels, use the greater one 76 | { 77 | int FWRep = PlayerCareerState_GetCarPartRep((DWORD*)ThePlayerCareer, EDX_Unused, ride[0], i, Part); 78 | Part = (DWORD*)ride[356 + i + 1]; 79 | int RWRep = PlayerCareerState_GetCarPartRep((DWORD*)ThePlayerCareer, EDX_Unused, ride[0], i, Part); 80 | 81 | Rep += (FWRep > RWRep) ? FWRep : RWRep; 82 | continue; 83 | } 84 | 85 | if (Part) 86 | { 87 | if (HasWidebody && !IsCustomWidebody(WideBodyPart, i)) continue; 88 | Rep += PlayerCareerState_GetCarPartRep((DWORD*)ThePlayerCareer, EDX_Unused, ride[0], i, Part); 89 | } 90 | } 91 | 92 | return GetNumStarsFromRep(Rep); 93 | } -------------------------------------------------------------------------------- /NFSU2UnlimiterSettings.ini: -------------------------------------------------------------------------------- 1 | [Main] 2 | ReplacementCar = 1 // CarTypeID used for replacement if the model cannot be found or is invalid. (Default = 1 = FOCUS) 3 | AllNewCarsInitiallyUnlocked = 0 // Unlocks all add-on cars set as racers from the beginning. If true, it will override the options in UnlimiterData folder. (0 = False (Default), 1 = True) 4 | AllNewCarsCanBeDrivenByAI = 0 // Makes all add-on cars set as racers available for AI opponents. If true, it will override the options in UnlimiterData folder. (0 = False (Default), 1 = True) 5 | RandomNameHook = 1 // Uses RACERNAME_XXX strings to un-hardcode the AI opponents names for Quick Race events. (0 = False, 1 = True (Default)) 6 | 7 | [Fixes] 8 | DisappearingWheelsFix = 1 // Fixes disappearing wheels when lost focus. Useful for open-wheel cars. (0 = False, 1 = True (Default)) 9 | WorldCrashFixes = 1 // Increases various game world trigger limits from 64 to 127 to fix crashes. (0 = False, 1 = True (Default)) 10 | CabinNeonFix = 1 // Fixes the game code which prevents cabin neons from appearing on the car. (0 = False, 1 = True (Default)) 11 | RaceEngageDialogFix = 1 // Allows using event-specific engage messages if they exist, regardless from the stage. (0 = False, 1 = True (Default)) 12 | FNGFix = 0 // Fixes missing objects for options and stuff in FNGs by cloning them. Configurable via UnlimiterData\_FNGFixes.ini file. (0 = False (Default), 1 = True) 13 | StreamingTrafficCarManagerFix = 1 // Fixes random car skin assignment for traffic cars and relocates the Streaming Traffic Car Manager to allow add-on traffic cars. (0 = False, 1 = True (Default)) 14 | 15 | [Misc] 16 | ExpandMemoryPools = 1 // Expands memory area of the game and fixes flickering problem. (0 = False, 1 = True (Default)) 17 | ForceStockPartsOnAddOnOpponents = 0 // Forces Stock Parts for Add-On Cars to fix Missing Parts on Opponents' Cars. (0 = False (Default), 1 = True) 18 | ExtendFeCarLimits = 0 // Doubles the amount of stock and tuned cars a player can have in a profile by utilizing unused car records of Player 2. Only valid with new profiles. (0 = False (Default), 1 = True) 19 | 20 | [Debug] 21 | DisableTextureReplacement = 0 // Disables any texture replacement done by Unlimiter. (0 = False (Default), 1 = True) 22 | DisableLightFlareColors = 1 // Disables custom light flare colors feature. (0 = False, 1 = True (Default)) 23 | ForceLightFlaresOn = 0 // Only works when DisableLightFlareColors set to 0. (7 = Headlights, 56 = Taillights, 28672 = Cop Lights, etc. [Check to source code for flare flags.]) 24 | ExportCameraInfo = 0 // Exports camera info as ini files into UnlimiterData\CameraInfo. Overwrites existing files. (0 = False (Default), 1 = True) 25 | EnableReleasePrintf = 0 // Prints debug info into the game's console. Note: The console should get allocated and attached via 3rd party tools. (0 = False (Default), 1 = True) -------------------------------------------------------------------------------- /UserCalls.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include 5 | 6 | enum reg : int 7 | { 8 | eax, 9 | ebx, 10 | ecx, 11 | edx, 12 | edi, 13 | esi, 14 | esp 15 | }; 16 | 17 | typedef struct 18 | { 19 | reg reg; 20 | void* val; 21 | } FuncArg; 22 | 23 | typedef struct 24 | { 25 | void* _eax; 26 | void* _ebx; 27 | void* _ecx; 28 | void* _edx; 29 | void* _edi; 30 | void* _esi; 31 | } Regs; 32 | 33 | /* A wrapper to call the functions which doesn't fit any calling convention. 34 | * This is usually caused by the "Link-Time Code Generation". 35 | * 36 | * Usage: After number of arguments, you need to push the register name (eax, ebx, etc.) and the argument itself. 37 | * If argument is pushed regularly, use "esp" as the register name. 38 | * Stack difference will get calculated by the function automatically. 39 | * 40 | * For example: MakeUserCall(FEngPrintf, 3, eax, FEPkg, edx, buf, esp, str); 41 | * // It's int by default. Don't use "" in here as it will give you a compile-time error. 42 | * FEngPrintf // The name of the function we want to call. 43 | * 3 // Number of arguments taken by the function. 44 | * eax, FEPkg // "FEPkg" will get passed through "eax" register. (ASM: mov eax, FEPkg) 45 | * edx, buf // "buf" will get passed through "edx" register. (ASM: mov edx, buf) 46 | * esp, str // "str" will get passed through a regular "push" instruction. (ASM: push str) 47 | */ 48 | template 49 | R MakeUserCall(R _func, int _numArgs, ...) 50 | { 51 | R _retval = 0; 52 | std::vector _args; 53 | std::vector _pushArgs; 54 | FuncArg _anArg; 55 | Regs _regs, _regs_backup; 56 | va_list ap; 57 | 58 | // Get current registers 59 | _asm 60 | { 61 | mov _regs._eax, eax 62 | mov _regs._ebx, ebx 63 | mov _regs._ecx, ecx 64 | mov _regs._edx, edx 65 | mov _regs._edi, edi 66 | mov _regs._esi, esi 67 | } 68 | 69 | // backup regs 70 | _regs_backup = _regs; 71 | 72 | va_start(ap, _numArgs); 73 | 74 | for (int i = 0; i < _numArgs; i++) 75 | { 76 | _anArg.reg = va_arg(ap, reg); 77 | _anArg.val = va_arg(ap, void*); 78 | 79 | switch (_anArg.reg) 80 | { 81 | case esp: 82 | _pushArgs.push_back(_anArg); 83 | break; 84 | default: 85 | _args.push_back(_anArg); 86 | break; 87 | } 88 | } 89 | 90 | va_end(ap); 91 | 92 | // move args to the register struct 93 | for (FuncArg i : _args) 94 | { 95 | switch (i.reg) 96 | { 97 | case eax: 98 | _regs._eax = i.val; 99 | break; 100 | case ebx: 101 | _regs._ebx = i.val; 102 | break; 103 | case ecx: 104 | _regs._ecx = i.val; 105 | break; 106 | case edx: 107 | _regs._edx = i.val; 108 | break; 109 | case edi: 110 | _regs._edi = i.val; 111 | break; 112 | case esi: 113 | _regs._esi = i.val; 114 | break; 115 | } 116 | } 117 | 118 | // push args in reverse order 119 | reverse(_pushArgs.begin(), _pushArgs.end()); 120 | 121 | DWORD esp_target; 122 | _asm mov[esp_target], esp 123 | 124 | for (FuncArg s : _pushArgs) 125 | { 126 | _asm push s.val; 127 | } 128 | 129 | // Set registers before call 130 | _asm 131 | { 132 | mov eax, _regs._eax 133 | mov ebx, _regs._ebx 134 | mov ecx, _regs._ecx 135 | mov edx, _regs._edx 136 | mov edi, _regs._edi 137 | mov esi, _regs._esi 138 | 139 | // invoke the call 140 | call _func; 141 | mov esp, [esp_target] 142 | mov _retval, eax; 143 | } 144 | 145 | // Restore regs 146 | _asm 147 | { 148 | //mov eax, _regs_backup._eax 149 | mov ebx, _regs_backup._ebx 150 | mov ecx, _regs_backup._ecx 151 | mov edx, _regs_backup._edx 152 | mov edi, _regs_backup._edi 153 | mov esi, _regs_backup._esi 154 | } 155 | 156 | return _retval; 157 | } -------------------------------------------------------------------------------- /BuyPerformanceParts.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | #define _BuyPerfPartWidget_vtbl 0x79B620 7 | #define _NoPerfPartsWidgy_vtbl 0x79B660 8 | 9 | void __fastcall BuyPerformanceParts_Setup(DWORD* BuyPerformanceParts, void* EDX_Unused) 10 | { 11 | 12 | int v4; // eax 13 | DWORD* v5; // ecx 14 | DWORD* v6; // eax 15 | int v7; // esi 16 | DWORD* v8; // ebx 17 | int PartUnlockFilter; // eax 18 | DWORD* AStatWidget; // esi MAPDST 19 | DWORD v12; // [esp-8h] [ebp-20h] 20 | int v13; // [esp-4h] [ebp-1Ch] 21 | int v14; // [esp+Ch] [ebp-Ch] 22 | signed int v16; // [esp+14h] [ebp-4h] 23 | 24 | for (int i = 1; i < GetEndPerfPackageEnum(); i++) 25 | { 26 | v4 = 0; 27 | if (*(int*)_NumPerfPackages <= 0) 28 | { 29 | LABEL_12: 30 | v6 = 0; 31 | } 32 | else 33 | { 34 | v5 = (DWORD*)*(DWORD*)_PerformancePackageList; 35 | while (*v5 != *(int*)0x838994 || v5[1] != i) 36 | { 37 | ++v4; 38 | v5 += 95; 39 | if (v4 >= *(int*)_NumPerfPackages) 40 | goto LABEL_12; 41 | } 42 | v6 = (DWORD*)(*(DWORD*)_PerformancePackageList + 380 * v4); 43 | } 44 | v7 = 0; 45 | v16 = v6[2]; 46 | v14 = 0; 47 | v8 = v6 + 3; 48 | do 49 | { 50 | if (v7 >= v16) 51 | break; 52 | v13 = *(int*)0x8389B0; 53 | v12 = *v8; 54 | PartUnlockFilter = CarCustomizeManager_GetPartUnlockFilter(); 55 | if (UnlockSystem_IsPerfPartUnlocked(PartUnlockFilter, v12, v13)) 56 | { 57 | AStatWidget = (DWORD*)j__malloc(0x50u); 58 | if (AStatWidget) 59 | { 60 | FEStatWidget_FEStatWidget( 61 | AStatWidget, 62 | (float*)BuyPerformanceParts + 63, 63 | (float*)BuyPerformanceParts + 67, 64 | (float*)BuyPerformanceParts + 69, 65 | (float*)BuyPerformanceParts + 71, 66 | 1); 67 | *AStatWidget = (DWORD)_BuyPerfPartWidget_vtbl; 68 | AStatWidget[19] = (DWORD)v8; 69 | AStatWidget[7] = 0xC3878000; 70 | AStatWidget[8] = 0xC1200000; 71 | } 72 | else 73 | { 74 | AStatWidget = 0; 75 | } 76 | UIWidgetMenu_AddStatOption(BuyPerformanceParts, AStatWidget); 77 | v7 = v14; 78 | } 79 | ++v7; 80 | v8 += 23; 81 | v14 = v7; 82 | } while (v7 < 4); 83 | } 84 | if ((DWORD*)BuyPerformanceParts[19] == BuyPerformanceParts + 19) 85 | { 86 | *((BYTE*)BuyPerformanceParts + 485) = 1; 87 | AStatWidget = (DWORD*)j__malloc(0x4Cu); 88 | if (AStatWidget) 89 | { 90 | FEStatWidget_FEStatWidget( 91 | AStatWidget, 92 | (float*)BuyPerformanceParts + 63, 93 | (float*)BuyPerformanceParts + 67, 94 | (float*)BuyPerformanceParts + 69, 95 | (float*)BuyPerformanceParts + 71, 96 | 1); 97 | *AStatWidget = (DWORD)_NoPerfPartsWidgy_vtbl; 98 | AStatWidget[7] = 0xC3878000; 99 | AStatWidget[8] = 0xC1200000; 100 | } 101 | else 102 | { 103 | AStatWidget = 0; 104 | } 105 | UIWidgetMenu_AddStatOption(BuyPerformanceParts, AStatWidget); 106 | } 107 | UIWidgetMenu_SetInitialOption(BuyPerformanceParts, 0); 108 | BuyPerformanceParts_RefreshHeader(BuyPerformanceParts); 109 | } -------------------------------------------------------------------------------- /RimsBrowser.h: -------------------------------------------------------------------------------- 1 | #include "stdio.h" 2 | #include "InGameFunctions.h" 3 | #include "ChooseRimBrand.h" 4 | 5 | #define _BrandNameHash 0x839BBC 6 | 7 | void __fastcall RimsBrowser_NotificationMessage(DWORD* RimsBrowser, void* EDX_Unused, DWORD MessageHash, DWORD* fe_obj, DWORD param1, DWORD param2) 8 | { 9 | RimsBrowser_NotificationMessage_Game(RimsBrowser, MessageHash, fe_obj, param1, param2); 10 | if (MessageHash == CT_bStringHash("PAD_LEFT") || MessageHash == CT_bStringHash("PAD_RIGHT")) 11 | SetDetailsPaneVisibility((char const*)RimsBrowser[1], 0); 12 | } 13 | 14 | void __fastcall RimsBrowser_RefreshHeader(DWORD* RimsBrowser, void* EDX_Unused) 15 | { 16 | int CurrentNodeIndex; // eax 17 | DWORD* TheCarPart; // edi MAPDST 18 | const char* PartName; // ebx MAPDST 19 | unsigned int PartNameLanguageHash; // eax 20 | const char* PartNameFromHash; // eax 21 | const char* BrandName; // eax 22 | BOOL HasLanguageHash; // eax 23 | const char* RimsBrowserPackage; // ebx MAPDST 24 | int Cost; // eax 25 | int InnerRadius; // [esp-4h] [ebp-10h] 26 | 27 | CurrentNodeIndex = ThumbnailScroller_GetCurrenNodeIndex(RimsBrowser + 84); 28 | FEScrollBar_Update((DWORD*)RimsBrowser + 109, 1, RimsBrowser[132], CurrentNodeIndex); 29 | TheCarPart = *(DWORD**)(*(DWORD*)(RimsBrowser[22] + 76) + 8); 30 | PartName = (const char*)CarPart_GetName(TheCarPart); 31 | 32 | if (CarPart_HasAppliedAttribute(TheCarPart, 0x4732DA07)) // LANGUAGEHASH 33 | { 34 | PartNameLanguageHash = CarPart_GetAppliedAttributeUParam(TheCarPart, 0x4732DA07, 0); // LANGUAGEHASH 35 | PartNameFromHash = GetLocalizedString(PartNameLanguageHash); 36 | PartName = PartNameFromHash; 37 | } 38 | 39 | DWORD BrandNameHash = *(DWORD*)_BrandNameHash; 40 | if (IsNoBrandName(BrandNameHash)) 41 | { 42 | FEngPrintf((DWORD*)RimsBrowser[77], "%s", PartName); 43 | } 44 | else 45 | { 46 | BrandName = CarCustomizeManager_GetBrandNameFromHash((DWORD*)gCarCustomizeManager, BrandNameHash); 47 | FEngPrintf((DWORD*)RimsBrowser[77], "%s %s", BrandName, PartName); 48 | } 49 | 50 | if ((DWORD*)RimsBrowser[85] != RimsBrowser + 85) 51 | { 52 | TheCarPart = *(DWORD**)(RimsBrowser[87] + 44); 53 | HasLanguageHash = CarPart_HasAppliedAttribute(TheCarPart, 0x4732DA07);// LANGUAGEHASH 54 | RimsBrowserPackage = (const char*)RimsBrowser[1]; 55 | 56 | if (HasLanguageHash) 57 | { 58 | InnerRadius = (char)CarPart_GetAppliedAttributeUParam(TheCarPart, 0xEB0101E2, 0);// INNER_RADIUS 59 | PartName = (const char*)CarPart_GetAppliedAttributeUParam(TheCarPart, 0x4732DA07, 0);// LANGUAGEHASH 60 | } 61 | else 62 | { 63 | InnerRadius = (char)CarPart_GetAppliedAttributeUParam(TheCarPart, 0xEB0101E2, 0);// INNER_RADIUS 64 | PartName = (const char*)CarPart_GetName(TheCarPart); 65 | } 66 | 67 | FEPrintf(RimsBrowserPackage, 0xD28B9316, "%s %d\"", PartName, InnerRadius); 68 | 69 | if (*(int*)_FEDatabase == 1) 70 | { 71 | Cost = PlayerCareerState_GetCarPartCost_Game((DWORD*)ThePlayerCareer, CAR_SLOT_ID::FRONT_WHEEL, TheCarPart); 72 | FEPrintf(RimsBrowserPackage, 0x380B632, "%d", Cost); 73 | } 74 | else 75 | { 76 | FEngSetInvisible_Pkg(RimsBrowserPackage, 0x380B632); 77 | } 78 | } 79 | 80 | RefreshDetailsPane((char const*)RimsBrowser[1], RimsBrowser + 85, RimsBrowser + 84, (DWORD*)RimsBrowser[87]); 81 | } 82 | 83 | void __fastcall RimsBrowser_StartBrowsingRims(DWORD* RimsBrowser, void* EDX_Unused) 84 | { 85 | RimsBrowser_StartBrowsingRims_Game(RimsBrowser); 86 | 87 | SetDetailsPaneVisibility((char const*)RimsBrowser[1], 1); 88 | } 89 | 90 | void __fastcall RimsBrowser_StopBrowsingRims(DWORD* RimsBrowser, void* EDX_Unused, bool ass) 91 | { 92 | RimsBrowser_StopBrowsingRims_Game(RimsBrowser, ass); 93 | 94 | SetDetailsPaneVisibility((char const*)RimsBrowser[1], 0); 95 | } -------------------------------------------------------------------------------- /CarPart.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | float __fastcall CarPart_GetAppliedAttributeFParam(DWORD* _CarPart, void* EDX_Unused, DWORD namehash, float default_value) 7 | { 8 | if (_CarPart) 9 | { 10 | float* Attribute = (float*)CarPart_GetNextAppliedAttribute(_CarPart, namehash, 0); 11 | if (Attribute) return Attribute[1]; 12 | } 13 | return default_value; 14 | } 15 | 16 | int __fastcall CarPart_TrunkAudioSlotAvailable(DWORD* _CarPart, void* EDX_Unused, int CarSlotID) 17 | { 18 | int result = 0; 19 | 20 | if (!_CarPart) return result; 21 | 22 | // Unlimiter NUMSLOTS attribute 23 | result = CarPart_GetAppliedAttributeUParam(_CarPart, CT_bStringHash("NUMSLOTS"), -1); 24 | if (result != -1) return CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO + result; 25 | 26 | // Vanilla implementation 27 | BYTE UpgradeLevel = *((BYTE*)_CarPart + 5) >> 5; 28 | if (!UpgradeLevel) return 0; 29 | 30 | DWORD CarTypeNameHash = CarPart_GetCarTypeNameHash(_CarPart); 31 | 32 | switch (UpgradeLevel) 33 | { 34 | case 3: 35 | switch (CarTypeNameHash) 36 | { 37 | case CT_bStringHash("CIVIC"): 38 | case CT_bStringHash("CELICA"): 39 | case CT_bStringHash("SUPRA"): 40 | case CT_bStringHash("RSX"): 41 | case CT_bStringHash("350Z"): 42 | case CT_bStringHash("GTO"): 43 | case CT_bStringHash("MUSTANGGT"): 44 | case CT_bStringHash("LANCEREVO8"): 45 | case CT_bStringHash("IMPREZAWRX"): 46 | result = CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO_COMP_5; // 6 slots 47 | break; 48 | case CT_bStringHash("HUMMER"): 49 | case CT_bStringHash("NAVIGATOR"): 50 | case CT_bStringHash("ESCALADE"): 51 | result = CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO_COMP_11; // 12 slots 52 | break; 53 | default: 54 | result = CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO_COMP_4; // 5 slots 55 | break; 56 | } 57 | break; 58 | case 2: 59 | switch (CarTypeNameHash) 60 | { 61 | case CT_bStringHash("HUMMER"): 62 | case CT_bStringHash("NAVIGATOR"): 63 | case CT_bStringHash("ESCALADE"): 64 | result = CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO_COMP_5; // 6 slots 65 | break; 66 | default: 67 | result = CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO_COMP_3; // 4 slots 68 | break; 69 | } 70 | break; 71 | case 1: 72 | switch (CarTypeNameHash) 73 | { 74 | case CT_bStringHash("HUMMER"): 75 | case CT_bStringHash("NAVIGATOR"): 76 | case CT_bStringHash("ESCALADE"): 77 | result = CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO_COMP_3; // 4 slots 78 | break; 79 | default: 80 | result = CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO_COMP_1; // 2 slots 81 | break; 82 | } 83 | break; 84 | default: 85 | result = CarSlotID <= CAR_SLOT_ID::TRUNK_AUDIO_COMP_0; // 1 slot 86 | break; 87 | } 88 | 89 | return result; 90 | } 91 | 92 | bool __fastcall CarPart_HasExcludeDecal(DWORD* _CarPart, void* EDX_Unused, int CarSlotID) 93 | { 94 | DWORD SlotNameHash = CarPart_GetAppliedAttributeUParam(_CarPart, CT_bStringHash("EXCLUDEDECAL"), 0); 95 | if (!SlotNameHash) return false; 96 | 97 | return SlotNameHash == bStringHash(GetCarSlotIDName(CarSlotID)); 98 | } 99 | 100 | int __fastcall CarPart_GetExcludeDecal(DWORD* _CarPart, void* EDX_Unused) 101 | { 102 | int slot = -1; 103 | DWORD SlotNameHash = CarPart_GetAppliedAttributeUParam(_CarPart, CT_bStringHash("EXCLUDEDECAL"), 0); 104 | if (!SlotNameHash) return slot; 105 | 106 | for (int i = CAR_SLOT_ID::__MODEL_FIRST; i < CAR_SLOT_ID::__NUM; i++) 107 | { 108 | if (SlotNameHash == bStringHash(GetCarSlotIDName(i))) 109 | { 110 | slot = i; 111 | break; 112 | } 113 | } 114 | 115 | return slot; 116 | } 117 | -------------------------------------------------------------------------------- /CarTypeInfo.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | #include "Helpers.h" 6 | 7 | DWORD GetCarTypeLogoHash(int type, bool manu) 8 | { 9 | DWORD result = 0; 10 | int BuildRegion = GetBuildRegion(); 11 | char const *CarTypeName = (char const*)CarConfigs[type].CarTypeInfo; 12 | DWORD CarTypeNameHash = bStringHash(CarTypeName); 13 | 14 | if (manu) 15 | { 16 | char const* CarManuName = CarTypeInfo_GetManufacturerName(CarConfigs[type].CarTypeInfo); 17 | result = FEngHashString("CARSELECT_MANUFACTURER_%s", CarManuName); 18 | if (IsTraffic(type)) return FEngHashString("CARSELECT_MANUFACTURER_TRAFFIC_%s", CarManuName); 19 | 20 | if (IsBuildRegionEurope()) // EU 21 | { 22 | switch (CarTypeNameHash) 23 | { 24 | case CT_bStringHash("CORSA"): 25 | return GetCurrentLanguage() ? CT_bStringHash("CARSELECT_MANUFACTURER_OPEL") : result; 26 | break; 27 | } 28 | } 29 | else 30 | { 31 | if (BuildRegion == 3) 32 | { 33 | switch (CarTypeNameHash) 34 | { 35 | case CT_bStringHash("G35"): 36 | return CT_bStringHash("CARSELECT_MANUFACTURER_NISSAN"); 37 | break; 38 | case CT_bStringHash("IS300"): 39 | return CT_bStringHash("CARSELECT_MANUFACTURER_TOYOTA"); 40 | break; 41 | } 42 | } 43 | 44 | //if (CarTypeNameHash == CT_bStringHash("CORSA")) return CT_bStringHash("CARSELECT_MANUFACTURER_OPEL"); 45 | } 46 | } 47 | else 48 | { 49 | result = FEngHashString("SECONDARY_LOGO_%s", CarTypeName); 50 | if (IsTraffic(type)) return FEngHashString("SECONDARY_LOGO_TRAFFIC_%s", CarTypeName); 51 | 52 | if (!BuildRegion) 53 | { 54 | switch (CarTypeNameHash) 55 | { 56 | case CT_bStringHash("MIATA"): 57 | return result; 58 | break; 59 | case CT_bStringHash("TIBURON"): 60 | return result; 61 | break; 62 | } 63 | } 64 | 65 | if (IsBuildRegionEurope()) // EU 66 | { 67 | switch (CarTypeNameHash) 68 | { 69 | case CT_bStringHash("MIATA"): 70 | return CT_bStringHash("SECONDARY_LOGO_MX5"); 71 | break; 72 | case CT_bStringHash("TIBURON"): 73 | return CT_bStringHash("SECONDARY_LOGO_COUPE"); 74 | break; 75 | case CT_bStringHash("CORSA"): 76 | return GetCurrentLanguage() ? CT_bStringHash("SECONDARY_LOGO_OPEL_CORSA") : result; 77 | break; 78 | } 79 | } 80 | 81 | if (BuildRegion == 2) 82 | { 83 | switch (CarTypeNameHash) 84 | { 85 | case CT_bStringHash("MIATA"): 86 | return CT_bStringHash("SECONDARY_LOGO_MX5"); 87 | break; 88 | case CT_bStringHash("TIBURON"): 89 | return CT_bStringHash("SECONDARY_LOGO_TUSCANI"); 90 | break; 91 | } 92 | } 93 | else 94 | { 95 | if (BuildRegion == 3) 96 | { 97 | switch (CarTypeNameHash) 98 | { 99 | case CT_bStringHash("MIATA"): 100 | return CT_bStringHash("SECONDARY_LOGO_MIATA_ROADSTER"); 101 | break; 102 | case CT_bStringHash("COROLLA"): 103 | return CT_bStringHash("SECONDARY_LOGO_TRUENO"); 104 | break; 105 | case CT_bStringHash("IS300"): 106 | return CT_bStringHash("SECONDARY_LOGO_ALTEZZA"); 107 | break; 108 | case CT_bStringHash("G35"): 109 | return CT_bStringHash("SECONDARY_LOGO_SKYLINE_JAPAN"); 110 | break; 111 | case CT_bStringHash("350Z"): 112 | return CT_bStringHash("SECONDARY_LOGO_FAIRLADYZ"); 113 | break; 114 | case CT_bStringHash("CORSA"): 115 | return CT_bStringHash("SECONDARY_LOGO_OPEL_CORSA"); 116 | break; 117 | case CT_bStringHash("TIBURON"): 118 | return CT_bStringHash("SECONDARY_LOGO_COUPE"); 119 | break; 120 | } 121 | } 122 | else 123 | { 124 | switch (CarTypeNameHash) 125 | { 126 | case CT_bStringHash("MIATA"): 127 | return CT_bStringHash("SECONDARY_LOGO_MX5"); 128 | break; 129 | case CT_bStringHash("TIBURON"): 130 | return CT_bStringHash("SECONDARY_LOGO_COUPE"); 131 | break; 132 | } 133 | } 134 | } 135 | 136 | //if (CarTypeNameHash == CT_bStringHash("CORSA")) return CT_bStringHash("SECONDARY_LOGO_OPEL_CORSA"); 137 | 138 | } 139 | 140 | return result; 141 | } -------------------------------------------------------------------------------- /UnlimiterData/_PaintGroups.ini: -------------------------------------------------------------------------------- 1 | # This ini file is used to define which paint groups will appear in the customization shop. 2 | # 3 | # First section 4 | # NumberOfPaintGroups = Defines the number of Paint Groups (without including 0) to get read from this file. 5 | # UnifyPaints = Makes all paint slot types (BASE_PAINT, PAINT_BRAKE, PAINT_RIM, VINYL_COLOUR0_0, HUD_BACKING_COLOUR) usable in any paint selection screen. Disabled by default as it has side effects with rim paints on various DiffuseMaxAlpha values of light materials. 6 | # 7 | # Paint Groups sections (GroupX) 8 | # Required 9 | # BrandName = Defines the BRAND_NAME attribute value. If a paint car part has the attribute with the same value, it will appear under this group. 10 | # String = Defines which string will be used in the menu. Only accepts labels. 11 | # Optional 12 | # AvailableForBody = Makes group available for Body, Spoiler, Roof Scoop and Mirror Paint. Ignored when UnifyPaints option is enabled. 13 | # AvailableForRims = Makes group available for Rim and Spinner Paint. Ignored when UnifyPaints option is enabled. 14 | # AvailableForBrakes = Makes group available for Brake Paint. Ignored when UnifyPaints option is enabled. 15 | # AvailableForHoses = Makes group available for Engine Accent Paint. Ignored when UnifyPaints option is enabled. 16 | # AvailableForTrunk = Makes group available for Trunk Audio Paint. Ignored when UnifyPaints option is enabled. 17 | # AvailableForMuffler = Makes group available for Muffler Tip Paint. Ignored when UnifyPaints option is enabled. 18 | # AvailableForVinyl = Makes group available for Vinyl Paint. Ignored when UnifyPaints option is enabled. 19 | 20 | [PaintGroups] 21 | NumberOfPaintGroups = 8 22 | UnifyPaints = 0 23 | 24 | # TOUCH THIS ONE IF AND ONLY IF YOU KNOW WHAT ARE YOU DOING 25 | 26 | # Custom (Car-Specific, OEM) Paints Category 27 | [Group0] 28 | BrandName = "" 29 | String = "CUSTOM_PAINT" 30 | AvailableForBody = 1 31 | AvailableForRims = 0 32 | AvailableForBrakes = 0 33 | AvailableForHoses = 1 34 | AvailableForTrunk = 1 35 | AvailableForMuffler = 1 36 | AvailableForVinyl = 0 37 | 38 | # You are free to modify the ones below. 39 | 40 | [Group1] 41 | BrandName = "GLOSS" 42 | String = "GLOSS_PAINT" 43 | AvailableForBody = 1 44 | AvailableForRims = 0 45 | AvailableForBrakes = 0 46 | AvailableForHoses = 1 47 | AvailableForTrunk = 1 48 | AvailableForMuffler = 1 49 | AvailableForVinyl = 0 50 | 51 | [Group2] 52 | BrandName = "METAL" 53 | String = "METAL_PAINT" 54 | AvailableForBody = 1 55 | AvailableForRims = 0 56 | AvailableForBrakes = 0 57 | AvailableForHoses = 1 58 | AvailableForTrunk = 1 59 | AvailableForMuffler = 1 60 | AvailableForVinyl = 0 61 | 62 | [Group3] 63 | BrandName = "PEARL" 64 | String = "PEARL_PAINT" 65 | AvailableForBody = 1 66 | AvailableForRims = 0 67 | AvailableForBrakes = 0 68 | AvailableForHoses = 1 69 | AvailableForTrunk = 1 70 | AvailableForMuffler = 1 71 | AvailableForVinyl = 0 72 | 73 | [Group4] 74 | BrandName = "HOSE" 75 | String = "HOSE_PAINT" 76 | AvailableForBody = 1 77 | AvailableForRims = 0 78 | AvailableForBrakes = 0 79 | AvailableForHoses = 1 80 | AvailableForTrunk = 1 81 | AvailableForMuffler = 1 82 | AvailableForVinyl = 0 83 | 84 | [Group5] 85 | BrandName = "CALIPER" 86 | String = "CALIPER_PAINT" 87 | AvailableForBody = 0 88 | AvailableForRims = 0 89 | AvailableForBrakes = 1 90 | AvailableForHoses = 0 91 | AvailableForTrunk = 0 92 | AvailableForMuffler = 0 93 | AvailableForVinyl = 0 94 | 95 | [Group6] 96 | BrandName = "MUFFLER" 97 | String = "MUFFLER_PAINT" 98 | AvailableForBody = 1 99 | AvailableForRims = 0 100 | AvailableForBrakes = 0 101 | AvailableForHoses = 1 102 | AvailableForTrunk = 1 103 | AvailableForMuffler = 1 104 | AvailableForVinyl = 0 105 | 106 | [Group7] 107 | BrandName = "RIM" 108 | String = "RIM_PAINT" 109 | AvailableForBody = 0 110 | AvailableForRims = 1 111 | AvailableForBrakes = 0 112 | AvailableForHoses = 0 113 | AvailableForTrunk = 0 114 | AvailableForMuffler = 0 115 | AvailableForVinyl = 0 116 | 117 | [Group8] 118 | BrandName = "VINYL" 119 | String = "VINYL_PAINT" 120 | AvailableForBody = 0 121 | AvailableForRims = 0 122 | AvailableForBrakes = 0 123 | AvailableForHoses = 0 124 | AvailableForTrunk = 0 125 | AvailableForMuffler = 0 126 | AvailableForVinyl = 1 127 | -------------------------------------------------------------------------------- /UnlimiterData/_PaintGroups_Vanilla.ini: -------------------------------------------------------------------------------- 1 | # This ini file is used to define which paint groups will appear in the customization shop. 2 | # 3 | # First section 4 | # NumberOfPaintGroups = Defines the number of Paint Groups (without including 0) to get read from this file. 5 | # UnifyPaints = Makes all paint slot types (BASE_PAINT, PAINT_BRAKE, PAINT_RIM, VINYL_COLOUR0_0, HUD_BACKING_COLOUR) usable in any paint selection screen. Disabled by default as it has side effects with rim paints on various DiffuseMaxAlpha values of light materials. 6 | # 7 | # Paint Groups sections (GroupX) 8 | # Required 9 | # BrandName = Defines the BRAND_NAME attribute value. If a paint car part has the attribute with the same value, it will appear under this group. 10 | # String = Defines which string will be used in the menu. Only accepts labels. 11 | # Optional 12 | # AvailableForBody = Makes group available for Body, Spoiler, Roof Scoop and Mirror Paint. Ignored when UnifyPaints option is enabled. 13 | # AvailableForRims = Makes group available for Rim and Spinner Paint. Ignored when UnifyPaints option is enabled. 14 | # AvailableForBrakes = Makes group available for Brake Paint. Ignored when UnifyPaints option is enabled. 15 | # AvailableForHoses = Makes group available for Engine Accent Paint. Ignored when UnifyPaints option is enabled. 16 | # AvailableForTrunk = Makes group available for Trunk Audio Paint. Ignored when UnifyPaints option is enabled. 17 | # AvailableForMuffler = Makes group available for Muffler Tip Paint. Ignored when UnifyPaints option is enabled. 18 | # AvailableForVinyl = Makes group available for Vinyl Paint. Ignored when UnifyPaints option is enabled. 19 | 20 | [PaintGroups] 21 | NumberOfPaintGroups = 8 22 | UnifyPaints = 0 23 | 24 | # TOUCH THIS ONE IF AND ONLY IF YOU KNOW WHAT ARE YOU DOING 25 | 26 | # Custom (Car-Specific, OEM) Paints Category 27 | [Group0] 28 | BrandName = "" 29 | String = "CUSTOM_PAINT" 30 | AvailableForBody = 1 31 | AvailableForRims = 0 32 | AvailableForBrakes = 0 33 | AvailableForHoses = 0 34 | AvailableForTrunk = 1 35 | AvailableForMuffler = 0 36 | AvailableForVinyl = 0 37 | 38 | # You are free to modify the ones below. 39 | 40 | [Group1] 41 | BrandName = "GLOSS" 42 | String = "GLOSS_PAINT" 43 | AvailableForBody = 1 44 | AvailableForRims = 0 45 | AvailableForBrakes = 0 46 | AvailableForHoses = 0 47 | AvailableForTrunk = 1 48 | AvailableForMuffler = 0 49 | AvailableForVinyl = 0 50 | 51 | [Group2] 52 | BrandName = "METAL" 53 | String = "METAL_PAINT" 54 | AvailableForBody = 1 55 | AvailableForRims = 0 56 | AvailableForBrakes = 0 57 | AvailableForHoses = 0 58 | AvailableForTrunk = 1 59 | AvailableForMuffler = 0 60 | AvailableForVinyl = 0 61 | 62 | [Group3] 63 | BrandName = "PEARL" 64 | String = "PEARL_PAINT" 65 | AvailableForBody = 1 66 | AvailableForRims = 0 67 | AvailableForBrakes = 0 68 | AvailableForHoses = 0 69 | AvailableForTrunk = 1 70 | AvailableForMuffler = 0 71 | AvailableForVinyl = 0 72 | 73 | [Group4] 74 | BrandName = "HOSE" 75 | String = "HOSE_PAINT" 76 | AvailableForBody = 0 77 | AvailableForRims = 0 78 | AvailableForBrakes = 0 79 | AvailableForHoses = 1 80 | AvailableForTrunk = 0 81 | AvailableForMuffler = 0 82 | AvailableForVinyl = 0 83 | 84 | [Group5] 85 | BrandName = "CALIPER" 86 | String = "CALIPER_PAINT" 87 | AvailableForBody = 0 88 | AvailableForRims = 0 89 | AvailableForBrakes = 1 90 | AvailableForHoses = 0 91 | AvailableForTrunk = 0 92 | AvailableForMuffler = 0 93 | AvailableForVinyl = 0 94 | 95 | [Group6] 96 | BrandName = "MUFFLER" 97 | String = "MUFFLER_PAINT" 98 | AvailableForBody = 0 99 | AvailableForRims = 0 100 | AvailableForBrakes = 0 101 | AvailableForHoses = 0 102 | AvailableForTrunk = 0 103 | AvailableForMuffler = 1 104 | AvailableForVinyl = 0 105 | 106 | [Group7] 107 | BrandName = "RIM" 108 | String = "RIM_PAINT" 109 | AvailableForBody = 0 110 | AvailableForRims = 1 111 | AvailableForBrakes = 0 112 | AvailableForHoses = 0 113 | AvailableForTrunk = 0 114 | AvailableForMuffler = 0 115 | AvailableForVinyl = 0 116 | 117 | [Group8] 118 | BrandName = "VINYL" 119 | String = "VINYL_PAINT" 120 | AvailableForBody = 0 121 | AvailableForRims = 0 122 | AvailableForBrakes = 0 123 | AvailableForHoses = 0 124 | AvailableForTrunk = 0 125 | AvailableForMuffler = 0 126 | AvailableForVinyl = 1 -------------------------------------------------------------------------------- /includes/injector/calling.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Injectors - Function Calls Using Variadic Templates 3 | * 4 | * Copyright (C) 2014 LINK/2012 5 | * 6 | * This software is provided 'as-is', without any express or implied 7 | * warranty. In no event will the authors be held liable for any damages 8 | * arising from the use of this software. 9 | * 10 | * Permission is granted to anyone to use this software for any purpose, 11 | * including commercial applications, and to alter it and redistribute it 12 | * freely, subject to the following restrictions: 13 | * 14 | * 1. The origin of this software must not be misrepresented; you must not 15 | * claim that you wrote the original software. If you use this software 16 | * in a product, an acknowledgment in the product documentation would be 17 | * appreciated but is not required. 18 | * 19 | * 2. Altered source versions must be plainly marked as such, and must not be 20 | * misrepresented as being the original software. 21 | * 22 | * 3. This notice may not be removed or altered from any source 23 | * distribution. 24 | * 25 | */ 26 | #pragma once 27 | #include "injector.hpp" 28 | #include 29 | #include 30 | 31 | #if __cplusplus >= 201103L || _MSC_VER >= 1800 // MSVC 2013 32 | #else 33 | #error "This feature is not supported on this compiler" 34 | #endif 35 | 36 | namespace injector 37 | { 38 | template 39 | struct cstd; 40 | 41 | template 42 | struct cstd 43 | { 44 | // Call function at @p returning @Ret with args @Args 45 | static Ret call(memory_pointer_tr p, Args... a) 46 | { 47 | auto fn = (Ret(*)(Args...)) p.get(); 48 | return fn(std::forward(a)...); 49 | } 50 | 51 | template // Uses lazy pointer 52 | static Ret call(Args... a) 53 | { 54 | return call(lazy_pointer::get(), std::forward(a)...); 55 | } 56 | }; 57 | 58 | template 59 | struct stdcall; 60 | 61 | template 62 | struct stdcall 63 | { 64 | // Call function at @p returning @Ret with args @Args 65 | static Ret call(memory_pointer_tr p, Args... a) 66 | { 67 | auto fn = (Ret(__stdcall *)(Args...)) p.get(); 68 | return fn(std::forward(a)...); 69 | } 70 | 71 | template // Uses lazy pointer 72 | static Ret call(Args... a) 73 | { 74 | return call(lazy_pointer::get(), std::forward(a)...); 75 | } 76 | }; 77 | 78 | template 79 | struct fastcall; 80 | 81 | template 82 | struct fastcall 83 | { 84 | // Call function at @p returning @Ret with args @Args 85 | static Ret call(memory_pointer_tr p, Args... a) 86 | { 87 | auto fn = (Ret(__fastcall *)(Args...)) p.get();; 88 | return fn(std::forward(a)...); 89 | } 90 | 91 | template // Uses lazy pointer 92 | static Ret call(Args... a) 93 | { 94 | return call(lazy_pointer::get(), std::forward(a)...); 95 | } 96 | }; 97 | 98 | template 99 | struct thiscall; 100 | 101 | template 102 | struct thiscall 103 | { 104 | // Call function at @p returning @Ret with args @Args 105 | static Ret call(memory_pointer_tr p, Args... a) 106 | { 107 | auto fn = (Ret(__thiscall *)(Args...)) p.get(); 108 | return fn(std::forward(a)...); 109 | } 110 | 111 | // Call function at the index @i from the vtable of the object @a[0] 112 | template 113 | static Ret vtbl(Args... a) 114 | { 115 | auto obj = raw_ptr(std::get<0>(std::forward_as_tuple(a...))); 116 | auto p = raw_ptr( (*obj.template get()) [i] ); 117 | return call(p, std::forward(a)...); 118 | } 119 | 120 | template // Uses lazy pointer 121 | static Ret call(Args... a) 122 | { 123 | return call(lazy_pointer::get(), std::forward(a)...); 124 | } 125 | }; 126 | } 127 | 128 | -------------------------------------------------------------------------------- /FEPackage.h: -------------------------------------------------------------------------------- 1 | #include "stdio.h" 2 | #include "InGameFunctions.h" 3 | #include "Helpers.h" 4 | #include "includes\ini.h" 5 | 6 | char ObjectName[64], ObjectPrefix[64]; 7 | char CloneName[64], ClonePrefix[64]; 8 | char FNGFixName[8], FNGChildName[8]; 9 | 10 | // 0x5557D4 11 | bool __fastcall CloneObjectstoShowMoreItemsInMenu(DWORD* FEPackage, void* edx_unused, DWORD* FEGameInterface) 12 | { 13 | bool result = FEPackage_Startup(FEPackage, FEGameInterface); 14 | int i; 15 | DWORD* CloneTarget, * CloneDest, * CloneTargetChild, * CloneChild, * CloneChildLast; 16 | 17 | auto FNGFixesPath = CurrentWorkingDirectory / "UnlimiterData" / "_FNGFixes.ini"; 18 | mINI::INIFile FNGFixesINIFile(FNGFixesPath.string()); 19 | mINI::INIStructure FNGFixesINI; 20 | FNGFixesINIFile.read(FNGFixesINI); 21 | 22 | int FNGFixesCount = mINI_ReadInteger(FNGFixesINI, "FNGFixes", "NumberOfFNGFixes", -1); 23 | if (FNGFixesCount == -1) return result; 24 | 25 | 26 | for (int FNGFixID = 1; FNGFixID <= FNGFixesCount; FNGFixID++) 27 | { 28 | sprintf(FNGFixName, "FNG%d", FNGFixID); 29 | if (stricmp((char*)FEPackage[3], mINI_ReadString(FNGFixesINI, FNGFixName, "FNGName", "")) == 0) 30 | { 31 | int NewNumberOfObjects = mINI_ReadInteger(FNGFixesINI, FNGFixName, "NumberOfObjects", -1); 32 | bool HasNumberSuffix = mINI_ReadInteger(FNGFixesINI, FNGFixName, "HasNumberSuffix", 1) != 0; 33 | 34 | sprintf(ObjectPrefix, mINI_ReadString(FNGFixesINI, FNGFixName, "ObjectPrefix", "")); 35 | 36 | if (HasNumberSuffix) 37 | { 38 | strcat(ObjectPrefix, "%d"); 39 | 40 | // Get Last available object 41 | for (i = 1; i <= NewNumberOfObjects; i++) 42 | { 43 | sprintf(ObjectName, ObjectPrefix, i); 44 | CloneTarget = FEPackage_FindObjectByHash(FEPackage, bStringHash(ObjectName)); 45 | if (!CloneTarget) 46 | { 47 | i--; 48 | sprintf(ObjectName, ObjectPrefix, i); 49 | CloneTarget = FEPackage_FindObjectByHash(FEPackage, bStringHash(ObjectName)); 50 | break; 51 | } 52 | } 53 | } 54 | else 55 | { 56 | sprintf(ObjectName, ObjectPrefix); 57 | CloneTarget = FEPackage_FindObjectByHash(FEPackage, bStringHash(ObjectName)); 58 | } 59 | 60 | // Make enough clones of that object 61 | if (CloneTarget) 62 | { 63 | for (int j = 1; (i + j) <= NewNumberOfObjects; j++) 64 | { 65 | CloneDest = (*(DWORD * (__thiscall**)(DWORD*, bool))(*(DWORD*)CloneTarget + 4))(CloneTarget, false); // FE...::Clone 66 | 67 | if (HasNumberSuffix) sprintf(ObjectName, ObjectPrefix, i + j); 68 | 69 | CloneDest[4] = bStringHash(ObjectName); // FEObject -> NameHash 70 | CloneDest[22] = 0; // FEObject -> Cached (Fix crash at FERenderObject::Clear) 71 | //FEMinList_AddNode(&(FEPackage[17]), (DWORD*)(FEPackage[20]), CloneDest); // &FEPackage -> Objects, FEPackage -> Objects.Tail 72 | 73 | CloneDest[2] = (DWORD)CloneTarget; // FEobject -> Prev 74 | CloneDest[1] = CloneTarget[1]; // FEObject -> Next 75 | CloneTarget[1] = (DWORD)CloneDest; // FEObject -> Next 76 | 77 | // FEObject -> objects.NumElements 78 | FEPackage[18]++; 79 | 80 | // Check for children if it's a group 81 | if (CloneDest[0] == _FEGroup_vtbl) 82 | { 83 | int ChildrenCount = CloneDest[24]; // FEGroup -> children.NumElements 84 | CloneChild = (DWORD*)CloneDest[25]; // FEGroup -> children.Head 85 | CloneTargetChild = (DWORD*)CloneTarget[25]; // FEGroup -> children.Head 86 | CloneChildLast = (DWORD*)CloneDest[26]; // FEGroup -> children.Tail 87 | 88 | for (int c = 1; c <= ChildrenCount; c++) 89 | { 90 | if (CloneChild) 91 | { 92 | sprintf(FNGChildName, "Child%d", c); 93 | 94 | sprintf(ClonePrefix, mINI_ReadString(FNGFixesINI, FNGFixName, FNGChildName, "")); 95 | if (strcmp(ClonePrefix, "")) 96 | { 97 | strcat(ClonePrefix, "%d"); 98 | sprintf(CloneName, ClonePrefix, i + j); 99 | CloneChild[4] = bStringHash(CloneName); // FEObject -> NameHash 100 | } 101 | 102 | if (CloneChild == CloneChildLast) break; 103 | 104 | CloneChild = (DWORD*)CloneChild[1]; // FEObject -> Next 105 | CloneTargetChild = (DWORD*)CloneTargetChild[1]; // FEObject -> Next 106 | } 107 | } 108 | } 109 | 110 | // Clone the new object for the next one 111 | CloneTarget = CloneDest; 112 | } 113 | } 114 | 115 | FEPackage_ConnectObjectResources(FEPackage); 116 | //FEPackage_BuildMouseObjectStateList(FEPackage); 117 | } 118 | } 119 | 120 | return result; 121 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NFSU2 Unlimiter 2 | NFSU2 Unlimiter is a script mod which fixes some issues and makes some improvements for added cars and events. 3 | 4 | Features: 5 | + Fixes visibility and crash issues for added cars. 6 | + Fixes disappearing wheels issue. 7 | + Expands memory pools. 8 | + Fixes a crash issue related with world map markers. 9 | + Adds options to change car render information. (See UnlimiterData\_General.ini file.) 10 | - LinkLicensePlateToTrunk: Attaches license plate to trunk for part animations. 11 | - ShowTrunkUnderInFE: Shows inside of the trunk while in menus. 12 | - RemoveCentreBrakeWithCustomSpoiler: Removes centre brakelight position marker when a custom spoiler is installed. 13 | - HasSunroof: Swaps KIT00_ROOF with KIT00_FULLROOF when a roof scoop is installed. 14 | + Fixes missing objects for options and stuff in FNGs by cloning them. 15 | + Allows the events to have specific engage messages in any stage. (The game did it only for Stage 0 by default.) 16 | + Adds new customization items to the menu. (Fully configurable via car-specific or general ini files.) (Parts should get added by modders.) 17 | + Restores cut customization options from the game: Trunk Audio Paint, Cabin Neon, Hood Decals, etc. 18 | + Lets modders add custom rim brands. (Fully configurable via ini file.) 19 | - [RimBrands] RemoveRimSizeRestrictions: Removes the outer radius restriction to make any rim available for all cars. 20 | - [BrandX] NoRimSize: Disables rim size checks for a specific brand. 21 | - [BrandX] HideBrandName: Hides brand name on rim selection screen for a specific brand. 22 | + Adds custom attributes to allow even more customization options: (Extra Customization needs to be enabled to make custom attributes work.) 23 | - SHOWENGINE (Boolean) : Allows the player to see engine and neon through the hood. 24 | - SHOWTRUNK (Boolean) : Allows the player to see trunk audio components and neon through the trunk. 25 | - TRUNKUNDER (Key) : Sets the under part of the trunk. Works like the HOODUNDER attribute, which is available for hoods. 26 | - NUMSLOTS (Integer) : Declares the number of component slots a Trunk Audio Layout has. If not present, the "default" hardcoded values from the game will be used. 27 | - FRONT_TIRE_OFFSET (Floating) : Adds offset (spacers) to the front wheels. This attribute can be added to Fender and Wide Body parts. 28 | - REAR_TIRE_OFFSET (Floating) : Adds offset (spacers) to the rear wheels. This attribute can be added to Quarter Panel and Wide Body parts. 29 | + Implements use of strings for AI Opponent names like later games and adds 150+ names from credits. 30 | 31 | Also check out: 32 | - [NFS Mods with Unlimiter (v3+) & Extended Customization Support](https://docs.google.com/spreadsheets/d/1BYqui01raMMtRGrJ63-2B-Agh9ag6RdPB-bd07pDIKI/edit#gid=0) 33 | 34 | 35 | # Technical Information 36 | If you want everything to work properly: 37 | 38 | 1) You will need to add these textures in your FrontEnd\\FrontB.lzc, FrontEndTextures.tpk: 39 | ``` 40 | 63694594 - PAINT_MOD_PART_TRUNK_AUDIO 41 | F9BB4F22 - VISUAL_PART_ATTACHMENT1 42 | F9BB4F23 - VISUAL_PART_ATTACHMENT2 43 | F9BB4F24 - VISUAL_PART_ATTACHMENT3 44 | F9BB4F25 - VISUAL_PART_ATTACHMENT4 45 | F9BB4F26 - VISUAL_PART_ATTACHMENT5 46 | 541B24A5 - VISUAL_PART_CABIN 47 | 7BCFBDE4 - VISUAL_PART_FRONT_FENDER 48 | A882A4B3 - VISUAL_PART_LICENSE_PLATES 49 | 0294EC5E - VISUAL_PART_ROOF 50 | 5558691C - VISUAL_PART_TRUNK 51 | 0DEB2F1C - VISUAL_RIMS_BRAND_ADVAN 52 | 0EE6D551 - VISUAL_RIMS_BRAND_OASIS 53 | ``` 54 | 55 | 2) You will need to add these strings into your LANGUAGES\\(LanguageName).bin: 56 | ``` 57 | 7BCFBDE4 - VISUAL_PART_FRONT_FENDER 58 | AEBD0675 - VISUAL_PART_REAR_QUARTER 59 | 0294EC5E - VISUAL_PART_ROOF 60 | 5558691C - VISUAL_PART_TRUNK 61 | 541B24A5 - VISUAL_PART_CABIN 62 | DABD392C - PAINT_AUDIO 63 | 740E3098 - CUSTOMIZE_CANT_PAINT_STOCK_TRUNK 64 | 7D2BCFD7 - UI_ICE_LICENSE_PLATES 65 | 5BB4E255 - UI_ICE_NEON_CABIN_LAYOUT 66 | 282FF99B - STYLE00_CABIN_NEON 67 | 592356FC - STYLE01_CABIN_NEON 68 | 8A16B45D - STYLE02_CABIN_NEON 69 | BB0A11BE - STYLE03_CABIN_NEON 70 | F9BB4F22 - VISUAL_PART_ATTACHMENT1 71 | F9BB4F23 - VISUAL_PART_ATTACHMENT2 72 | F9BB4F24 - VISUAL_PART_ATTACHMENT3 73 | F9BB4F25 - VISUAL_PART_ATTACHMENT4 74 | F9BB4F26 - VISUAL_PART_ATTACHMENT5 75 | 2D4C819A - RIMS_BRAND_CUSTOM 76 | 2FBD9289 - RIMS_BRAND_ADVAN 77 | XXXXXXXX - RACERNAME_001-XXX (To make random AI Opponent names in Quick Race mode work) 78 | ``` 79 | 80 | Note: Binary scripts which will do these automatically for you are available in the release pack. 81 | 82 | # Download 83 | You can [download Unlimiter](https://github.com/nlgxzef/NFSU2Unlimiter/releases) from Releases page, or from [NFSMods.xyz](https://www.nfsmods.xyz). 84 | If you want to compile it yourself, you can download the source code from the green Clone or Download button up there. 85 | -------------------------------------------------------------------------------- /UnlimiterData/_VinylGroups.ini: -------------------------------------------------------------------------------- 1 | # This ini file is used to define which vinyl groups will appear in the customization shop. 2 | # It also allows you to have some other options. 3 | # 4 | # First section 5 | # NumberOfVinylGroups = Defines the number of Vinyl Groups (without including 0) to get read from this file. 6 | # 7 | # Vinyl Groups sections (GroupX) 8 | # Required 9 | # Index = Defines internal numeric ID of the vinyl group. Only accepts integers 0 through 31. 10 | # String = Defines which string will be used in the menu. Only accepts labels. 11 | # Texture = Defines which icon will be used in the menu. Only accepts texture names. 12 | # Optional 13 | # CameraInfo = Defines which camera info configuration will be used for this group. Doesn't include _Sedans/_SUVs or CARNAME prefixes. If not specified, original one will get used. 14 | 15 | [VinylGroups] 16 | NumberOfVinylGroups = 29 17 | 18 | # TOUCH THIS ONE IF AND ONLY IF YOU KNOW WHAT ARE YOU DOING 19 | 20 | # Custom (Car-Specific, OEM) Vinyls Category 21 | [Group0] 22 | Index = 31 23 | String = "VINYL_CATEGORY_CUSTOM" 24 | Texture = "VINYL_GROUP_CUSTOM" 25 | 26 | # You are free to modify the ones below. 27 | 28 | [Group1] 29 | Index = 1 30 | String = "VINYL_CATEGORY_TEARSET" 31 | Texture = "VINYL_GROUP_TEAR_SET" 32 | 33 | [Group2] 34 | Index = 0 35 | String = "VINYL_CATEGORY_TEAR" 36 | Texture = "VINYL_GROUP_TEAR" 37 | 38 | [Group3] 39 | Index = 3 40 | String = "VINYL_CATEGORY_STRIPESET" 41 | Texture = "VINYL_GROUP_STRIPES_SET" 42 | 43 | [Group4] 44 | Index = 2 45 | String = "VINYL_CATEGORY_STRIPE" 46 | Texture = "VINYL_GROUP_STRIPES" 47 | 48 | [Group5] 49 | Index = 5 50 | String = "VINYL_CATEGORY_SPLASHSET" 51 | Texture = "VINYL_GROUP_SPLASH_SET" 52 | 53 | [Group6] 54 | Index = 4 55 | String = "VINYL_CATEGORY_SPLASH" 56 | Texture = "VINYL_GROUP_SPLASH" 57 | 58 | [Group7] 59 | Index = 7 60 | String = "VINYL_CATEGORY_MODERNSET" 61 | Texture = "VINYL_GROUP_MODERN_SET" 62 | 63 | [Group8] 64 | Index = 6 65 | String = "VINYL_CATEGORY_MODERN" 66 | Texture = "VINYL_GROUP_MODERN" 67 | 68 | [Group9] 69 | Index = 9 70 | String = "VINYL_CATEGORY_FLAMESET" 71 | Texture = "VINYL_GROUP_FLAMES_SET" 72 | 73 | [Group10] 74 | Index = 8 75 | String = "VINYL_CATEGORY_FLAMES" 76 | Texture = "VINYL_GROUP_FLAMES" 77 | 78 | [Group11] 79 | Index = 11 80 | String = "VINYL_CATEGORY_LIGHTNINGSET" 81 | Texture = "VINYL_GROUP_LIGHTNING_SET" 82 | 83 | [Group12] 84 | Index = 10 85 | String = "VINYL_CATEGORY_LIGHTNING" 86 | Texture = "VINYL_GROUP_LIGHTNING" 87 | 88 | [Group13] 89 | Index = 13 90 | String = "VINYL_CATEGORY_RACINGSET" 91 | Texture = "VINYL_GROUP_RACING_SET" 92 | 93 | [Group14] 94 | Index = 12 95 | String = "VINYL_CATEGORY_RACING" 96 | Texture = "VINYL_GROUP_RACING" 97 | 98 | [Group15] 99 | Index = 15 100 | String = "VINYL_CATEGORY_FLAGSET" 101 | Texture = "VINYL_GROUP_FLAG_SET" 102 | 103 | [Group16] 104 | Index = 14 105 | String = "VINYL_CATEGORY_FLAG" 106 | Texture = "VINYL_GROUP_FLAG" 107 | 108 | [Group17] 109 | Index = 17 110 | String = "VINYL_CATEGORY_TRIBALSET" 111 | Texture = "VINYL_GROUP_TRIBAL_SET" 112 | 113 | [Group18] 114 | Index = 16 115 | String = "VINYL_CATEGORY_TRIBAL" 116 | Texture = "VINYL_GROUP_TRIBAL" 117 | 118 | [Group19] 119 | Index = 19 120 | String = "VINYL_CATEGORY_WILDSET" 121 | Texture = "VINYL_GROUP_WILD_SET" 122 | 123 | [Group20] 124 | Index = 18 125 | String = "VINYL_CATEGORY_WILD" 126 | Texture = "VINYL_GROUP_WILD" 127 | 128 | [Group21] 129 | Index = 20 130 | String = "VINYL_CATEGORY_HOODS" 131 | Texture = "VINYL_GROUP_HOOD" 132 | CameraInfo = "VINYL_LAYER0_20" 133 | 134 | [Group22] 135 | Index = 21 136 | String = "VINYL_CATEGORY_AFTERMARKET" 137 | Texture = "VINYL_GROUP_AFTER_MARKET" 138 | 139 | [Group23] 140 | Index = 23 141 | String = "VINYL_CATEGORY_BODY" 142 | Texture = "VINYL_GROUP_BODY" 143 | CameraInfo = "VINYL_LAYER0_23" 144 | 145 | [Group24] 146 | Index = 24 147 | String = "VINYL_CATEGORY_UNIQUE" 148 | Texture = "VINYL_GROUP_UNIQUE" 149 | CameraInfo = "VINYL_LAYER0_24" 150 | 151 | [Group25] 152 | Index = 25 153 | String = "VINYL_CATEGORY_TOP_LAYER" 154 | Texture = "VINYL_GROUP_TOP_LAYER" 155 | CameraInfo = "VINYL_LAYER0_25" 156 | 157 | [Group26] 158 | Index = 26 159 | String = "VINYL_CATEGORY_ARTFACTORY" 160 | Texture = "VINYL_GROUP_ART_FACTORY" 161 | CameraInfo = "VINYL_LAYER0_26" 162 | 163 | [Group27] 164 | Index = 27 165 | String = "VINYL_CATEGORY_CONTEST" 166 | Texture = "VINYL_GROUP_CONTEST" 167 | CameraInfo = "VINYL_LAYER0_27" 168 | 169 | [Group28] 170 | Index = 22 171 | String = "VINYL_CATEGORY_MANUFACTURER" 172 | Texture = "VINYL_GROUP_MANUFACTURER" 173 | CameraInfo = "VINYL_LAYER0_22" 174 | 175 | [Group29] 176 | Index = 28 177 | String = "VINYL_CATEGORY_SPECIAL" 178 | Texture = "VINYL_GROUP_SPECIAL" 179 | -------------------------------------------------------------------------------- /ChooseCustomizeCategory.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall ChooseCustomizeCategory_Setup(DWORD* ChooseCustomizeCategory, void* EDX_Unused) 7 | { 8 | DWORD* CCT; 9 | 10 | // Read Part Options for the car 11 | DWORD FECarConfig = *(DWORD*)_FECarConfigRef; 12 | int CarTypeID = (*(int(__thiscall**)(int))(*(DWORD*)FECarConfig + 4))(FECarConfig); 13 | 14 | if (*(int*)_FEDatabase == 256 && *(int*)0x836338) // Online Car Lot 15 | { 16 | CCT = (DWORD*)j__malloc(0x4Cu); 17 | if (CCT) 18 | CustomizeCategoryThing_IconOption(CCT, 19 | 5, 20 | 0x8244F164, // SHOP_ICON_CAR_LOT 21 | 0x7EDC9715, // CAREER_CAR_LOT_TITLE 22 | 0); 23 | else 24 | CCT = 0; 25 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChooseCustomizeCategory + 24))(ChooseCustomizeCategory, CCT); 26 | } 27 | 28 | if (CarConfigs[CarTypeID].Category.BodyShop && !IsMenuEmpty_BodyShop(CarTypeID)) 29 | { 30 | CCT = (DWORD*)j__malloc(0x4Cu); 31 | if (CCT) 32 | CustomizeCategoryThing_IconOption( 33 | CCT, 34 | 0, 35 | CarConfigs[CarTypeID].Icons.BodyShop, 36 | CarConfigs[CarTypeID].Names.BodyShop, 37 | 0); 38 | else 39 | CCT = 0; 40 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChooseCustomizeCategory + 24))(ChooseCustomizeCategory, CCT); 41 | } 42 | 43 | if (CarConfigs[CarTypeID].Category.Performance && !IsMenuEmpty_Performance(CarTypeID)) 44 | { 45 | CCT = (DWORD*)j__malloc(0x4Cu); 46 | if (CCT) 47 | CustomizeCategoryThing_IconOption( 48 | CCT, 49 | 1, 50 | CarConfigs[CarTypeID].Icons.Performance, 51 | CarConfigs[CarTypeID].Names.Performance, 52 | 0); 53 | else 54 | CCT = 0; 55 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChooseCustomizeCategory + 24))(ChooseCustomizeCategory, CCT); 56 | } 57 | 58 | if ((CarConfigs[CarTypeID].Category.Paint) && (*(int*)0x83898C != 1) && !IsMenuEmpty_Paint(CarTypeID)) 59 | { 60 | CCT = (DWORD*)j__malloc(0x4Cu); 61 | if (CCT) 62 | CustomizeCategoryThing_IconOption( 63 | CCT, 64 | 2, 65 | CarConfigs[CarTypeID].Icons.Paint, 66 | CarConfigs[CarTypeID].Names.Paint, 67 | 0); 68 | else 69 | CCT = 0; 70 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChooseCustomizeCategory + 24))(ChooseCustomizeCategory, CCT); 71 | } 72 | 73 | if (CarConfigs[CarTypeID].Category.Specialties) 74 | { 75 | CCT = (DWORD*)j__malloc(0x4Cu); 76 | if (CCT) 77 | CustomizeCategoryThing_IconOption( 78 | CCT, 79 | 3, 80 | CarConfigs[CarTypeID].Icons.Specialties, 81 | CarConfigs[CarTypeID].Names.Specialties, 82 | 0); 83 | else 84 | CCT = 0; 85 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChooseCustomizeCategory + 24))(ChooseCustomizeCategory, CCT); 86 | } 87 | 88 | if (((*(int*)0x83898C == 3 || *(int*)0x83898C == 2 || *(int*)0x83898C == 4) && *(int*)_FEDatabase != 512) 89 | && CarConfigs[CarTypeID].Performance.TestDyno) 90 | { 91 | DWORD* PMST = (DWORD*)j__malloc(0x48u); 92 | if (PMST) 93 | PerfMenuStartTuning_IconOption( 94 | PMST, 95 | CarConfigs[CarTypeID].Icons.PerformanceTestDyno, 96 | CarConfigs[CarTypeID].Names.PerformanceTestDyno, 97 | 0); 98 | else 99 | PMST = 0; 100 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChooseCustomizeCategory + 24))(ChooseCustomizeCategory, PMST); 101 | } 102 | 103 | // Debug Car Customize 104 | CCT = (DWORD*)j__malloc(0x4Cu); 105 | if (CCT) 106 | CustomizeCategoryThing_IconOption( 107 | CCT, 108 | 4, 109 | 0x74CE8C0B, // UI_ICON_DEBUG 110 | 0xE79A53F8, // OPT_DEBUG 111 | 0); 112 | else 113 | CCT = 0; 114 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChooseCustomizeCategory + 24))(ChooseCustomizeCategory, CCT); 115 | 116 | unsigned int LastButton = FEngGetLastButton((char const*)ChooseCustomizeCategory[1]); 117 | 118 | (*(void(__thiscall**)(DWORD*, int))(ChooseCustomizeCategory[19] + 32))(ChooseCustomizeCategory + 19, LastButton); // IconScroller::SetInitialPos 119 | (*(int(__thiscall**)(DWORD*))(*ChooseCustomizeCategory + 16))(ChooseCustomizeCategory); // IconScrollerMenu::RefreshHeader 120 | } -------------------------------------------------------------------------------- /ChoosePerfCategory.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall ChoosePerfCategory_Setup(DWORD* ChoosePerfCategory, void* EDX_Unused) 7 | { 8 | // Read Part Options for the car 9 | DWORD FECarConfig = *(DWORD*)_FECarConfigRef; 10 | int CarTypeID = (*(int(__thiscall**)(int))(*(DWORD*)FECarConfig + 4))(FECarConfig); 11 | 12 | if (CarConfigs[CarTypeID].Performance.Engine) 13 | ChoosePerfCategory_AddCategory( 14 | ChoosePerfCategory, 15 | 3, 16 | CarConfigs[CarTypeID].Icons.PerformanceEngine, // PERFORMANCE_ENGINE 17 | CarConfigs[CarTypeID].Names.PerformanceEngine);// PERF_CATEGORY_ENGINE 18 | 19 | if (CarConfigs[CarTypeID].Performance.ECU) 20 | ChoosePerfCategory_AddCategory( 21 | ChoosePerfCategory, 22 | 7, 23 | CarConfigs[CarTypeID].Icons.PerformanceECU, // PERFORMANCE_ECU 24 | CarConfigs[CarTypeID].Names.PerformanceECU);// PERF_CATEGORY_ECU 25 | 26 | if (CarConfigs[CarTypeID].Performance.Transmission) 27 | ChoosePerfCategory_AddCategory( 28 | ChoosePerfCategory, 29 | 1, 30 | CarConfigs[CarTypeID].Icons.PerformanceTransmission, // PERFORMANCE_TRANSMISSION 31 | CarConfigs[CarTypeID].Names.PerformanceTransmission);// PERF_CATEGORY_TRANSMISSION 32 | 33 | if (CarConfigs[CarTypeID].Performance.Chassis) 34 | ChoosePerfCategory_AddCategory( 35 | ChoosePerfCategory, 36 | 5, 37 | CarConfigs[CarTypeID].Icons.PerformanceChassis,// PERFORMANCE_SUSPENSION 38 | CarConfigs[CarTypeID].Names.PerformanceChassis);// PERF_CATEGORY_SUSPENSION 39 | 40 | if (CarConfigs[CarTypeID].Performance.Nitrous) 41 | ChoosePerfCategory_AddCategory( 42 | ChoosePerfCategory, 43 | 2, 44 | CarConfigs[CarTypeID].Icons.PerformanceNitrous, // PERFORMANCE_NITROUS 45 | CarConfigs[CarTypeID].Names.PerformanceNitrous);// PERF_CATEGORY_NOS 46 | 47 | if (CarConfigs[CarTypeID].Performance.Tires) 48 | ChoosePerfCategory_AddCategory( 49 | ChoosePerfCategory, 50 | 8, 51 | CarConfigs[CarTypeID].Icons.PerformanceTires, // PERFORMANCE_TIRES 52 | CarConfigs[CarTypeID].Names.PerformanceTires);// PERF_CATEGORY_TIRES 53 | 54 | if (CarConfigs[CarTypeID].Performance.Brakes) 55 | ChoosePerfCategory_AddCategory( 56 | ChoosePerfCategory, 57 | 6, 58 | CarConfigs[CarTypeID].Icons.PerformanceBrakes, // PERFORMANCE_BRAKES 59 | CarConfigs[CarTypeID].Names.PerformanceBrakes);// PERF_CATEGORY_BRAKE 60 | 61 | if (CarConfigs[CarTypeID].Performance.WeightReduction) 62 | ChoosePerfCategory_AddCategory( 63 | ChoosePerfCategory, 64 | 0, 65 | CarConfigs[CarTypeID].Icons.PerformanceWeightReduction, // PERFORMANCE_WEIGHT_REDUCTION 66 | CarConfigs[CarTypeID].Names.PerformanceWeightReduction);// PERF_CATEGORY_WEIGHT_REDUCTION 67 | 68 | if (CarConfigs[CarTypeID].Performance.Induction) 69 | ChoosePerfCategory_AddCategory( 70 | ChoosePerfCategory, 71 | 4, 72 | UsesSupercharger(CarTypeID) ? CarConfigs[CarTypeID].Icons.PerformanceSupercharger : CarConfigs[CarTypeID].Icons.PerformanceTurbo, // PERFORMANCE_SUPERCHARGER / PERFORMANCE_TURBO 73 | UsesSupercharger(CarTypeID) ? CarConfigs[CarTypeID].Names.PerformanceSupercharger : CarConfigs[CarTypeID].Names.PerformanceTurbo); // PERF_CATEGORY_SUPERCHARGER / PERF_CATEGORY_TURBO 74 | 75 | if (CarConfigs[CarTypeID].Performance.Aerodynamics) // Aerodynamics 76 | ChoosePerfCategory_AddCategory( 77 | ChoosePerfCategory, 78 | 9, 79 | CarConfigs[CarTypeID].Icons.PerformanceAerodynamics, // PERFORMANCE_AERODYNAMICS 80 | CarConfigs[CarTypeID].Names.PerformanceAerodynamics);// PERF_CATEGORY_AERODYNAMICS 81 | 82 | if ((*(int*)_FEDatabase == 1 && !*(int*)0x83898C) && CarConfigs[CarTypeID].Performance.TestDyno) 83 | { 84 | DWORD* PMST = (DWORD*)j__malloc(0x48u); 85 | if (PMST) 86 | PerfMenuStartTuning_IconOption( 87 | PMST, 88 | CarConfigs[CarTypeID].Icons.PerformanceTestDyno, // CRIB_ICON_TEST_TRACK 89 | CarConfigs[CarTypeID].Names.PerformanceTestDyno, // UI_CAREER_LOAD_TEST_TRACK 90 | 0); 91 | else 92 | PMST = 0; 93 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChoosePerfCategory + 24))(ChoosePerfCategory, PMST); // IconScrollerMenu::AddOption 94 | } 95 | 96 | unsigned int LastButton = FEngGetLastButton((char const*)ChoosePerfCategory[1]); 97 | 98 | (*(void(__thiscall**)(DWORD*, DWORD))(ChoosePerfCategory[19] + 32))(ChoosePerfCategory + 19, LastButton); // IconScroller::SetInitialPos 99 | (*(int(__thiscall**)(DWORD*))(*ChoosePerfCategory + 16))(ChoosePerfCategory); // IconScrollerMenu::RefreshHeader 100 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | *.VC.db 13 | 14 | # Build results 15 | [Dd]ebug/ 16 | [Dd]ebugPublic/ 17 | [Rr]elease/ 18 | [Rr]eleases/ 19 | x64/ 20 | x86/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | 84 | # Visual Studio profiler 85 | *.psess 86 | *.vsp 87 | *.vspx 88 | *.sap 89 | 90 | # TFS 2012 Local Workspace 91 | $tf/ 92 | 93 | # Guidance Automation Toolkit 94 | *.gpState 95 | 96 | # ReSharper is a .NET coding add-in 97 | _ReSharper*/ 98 | *.[Rr]e[Ss]harper 99 | *.DotSettings.user 100 | 101 | # JustCode is a .NET coding add-in 102 | .JustCode 103 | 104 | # TeamCity is a build add-in 105 | _TeamCity* 106 | 107 | # DotCover is a Code Coverage Tool 108 | *.dotCover 109 | 110 | # NCrunch 111 | _NCrunch_* 112 | .*crunch*.local.xml 113 | nCrunchTemp_* 114 | 115 | # MightyMoose 116 | *.mm.* 117 | AutoTest.Net/ 118 | 119 | # Web workbench (sass) 120 | .sass-cache/ 121 | 122 | # Installshield output folder 123 | [Ee]xpress/ 124 | 125 | # DocProject is a documentation generator add-in 126 | DocProject/buildhelp/ 127 | DocProject/Help/*.HxT 128 | DocProject/Help/*.HxC 129 | DocProject/Help/*.hhc 130 | DocProject/Help/*.hhk 131 | DocProject/Help/*.hhp 132 | DocProject/Help/Html2 133 | DocProject/Help/html 134 | 135 | # Click-Once directory 136 | publish/ 137 | 138 | # Publish Web Output 139 | *.[Pp]ublish.xml 140 | *.azurePubxml 141 | # TODO: Comment the next line if you want to checkin your web deploy settings 142 | # but database connection strings (with potential passwords) will be unencrypted 143 | *.pubxml 144 | *.publishproj 145 | 146 | # NuGet Packages 147 | *.nupkg 148 | # The packages folder can be ignored because of Package Restore 149 | **/packages/* 150 | # except build/, which is used as an MSBuild target. 151 | !**/packages/build/ 152 | # Uncomment if necessary however generally it will be regenerated when needed 153 | #!**/packages/repositories.config 154 | # NuGet v3's project.json files produces more ignoreable files 155 | *.nuget.props 156 | *.nuget.targets 157 | 158 | # Microsoft Azure Build Output 159 | csx/ 160 | *.build.csdef 161 | 162 | # Microsoft Azure Emulator 163 | ecf/ 164 | rcf/ 165 | 166 | # Microsoft Azure ApplicationInsights config file 167 | ApplicationInsights.config 168 | 169 | # Windows Store app package directory 170 | AppPackages/ 171 | BundleArtifacts/ 172 | 173 | # Visual Studio cache files 174 | # files ending in .cache can be ignored 175 | *.[Cc]ache 176 | # but keep track of directories ending in .cache 177 | !*.[Cc]ache/ 178 | 179 | # Others 180 | ClientBin/ 181 | ~$* 182 | *~ 183 | *.dbmdl 184 | *.dbproj.schemaview 185 | *.pfx 186 | *.publishsettings 187 | node_modules/ 188 | orleans.codegen.cs 189 | 190 | # RIA/Silverlight projects 191 | Generated_Code/ 192 | 193 | # Backup & report files from converting an old project file 194 | # to a newer Visual Studio version. Backup files are not needed, 195 | # because we have git ;-) 196 | _UpgradeReport_Files/ 197 | Backup*/ 198 | UpgradeLog*.XML 199 | UpgradeLog*.htm 200 | 201 | # SQL Server files 202 | *.mdf 203 | *.ldf 204 | 205 | # Business Intelligence projects 206 | *.rdl.data 207 | *.bim.layout 208 | *.bim_*.settings 209 | 210 | # Microsoft Fakes 211 | FakesAssemblies/ 212 | 213 | # GhostDoc plugin setting file 214 | *.GhostDoc.xml 215 | 216 | # Node.js Tools for Visual Studio 217 | .ntvs_analysis.dat 218 | 219 | # Visual Studio 6 build log 220 | *.plg 221 | 222 | # Visual Studio 6 workspace options file 223 | *.opt 224 | 225 | # Visual Studio LightSwitch build output 226 | **/*.HTMLClient/GeneratedArtifacts 227 | **/*.DesktopClient/GeneratedArtifacts 228 | **/*.DesktopClient/ModelManifest.xml 229 | **/*.Server/GeneratedArtifacts 230 | **/*.Server/ModelManifest.xml 231 | _Pvt_Extensions 232 | 233 | # Paket dependency manager 234 | .paket/paket.exe 235 | 236 | # FAKE - F# Make 237 | .fake/ 238 | -------------------------------------------------------------------------------- /HUD_Customizer.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | void __fastcall HUD_Customizer_DisplayCurrentHUD(DWORD *HUD_Customizer, void *EDX_Unused, int hud_index) 7 | { 8 | char const* PackageName = (char const*)HUD_Customizer[1]; 9 | DWORD prefix_hash = g_displayHUDprefix; 10 | DWORD texture_hash, tach_fill_hash, lines_hash, redline_hash; 11 | char StringToHash[29]; 12 | int TachStyle = 6; 13 | 14 | memset(StringToHash, 0, sizeof(StringToHash)); 15 | 16 | bSPrintf(StringToHash, "TACH_FILL_CUSTOM_%02d", hud_index); 17 | tach_fill_hash = bStringHash(StringToHash); 18 | 19 | DWORD* ride = CarViewer_GetRideInfo(0); 20 | if (ride) 21 | { 22 | // fix tach_fill as it doesn't have prefix by default 23 | if (prefix_hash != CT_bStringHash("3RDPERSON_")) 24 | { 25 | bSPrintf(StringToHash, "TACH_FILL_CUSTOM_%02d", hud_index); 26 | tach_fill_hash = bStringHash2(StringToHash, prefix_hash); 27 | } 28 | 29 | FEngSetVisible_Pkg(PackageName, CT_bStringHash("NON_INTERACTIVE_GROUP")); 30 | 31 | bSPrintf(StringToHash, "TURBOFILL_CUSTOM_%02d", hud_index); 32 | texture_hash = bStringHash2(StringToHash, prefix_hash); 33 | FEngSetTextureHash_Pkg(PackageName, CT_bStringHash("3RDPERSON_TURBOFILL"), texture_hash); 34 | 35 | bSPrintf(StringToHash, "TURBODIAL_CUSTOM_%02d", hud_index); 36 | texture_hash = bStringHash2(StringToHash, prefix_hash); 37 | FEngSetTextureHash_Pkg(PackageName, CT_bStringHash("3RDPERSON_TURBODIAL"), texture_hash); 38 | 39 | bSPrintf(StringToHash, "TURBOLINES_CUSTOM_%02d", hud_index); 40 | texture_hash = bStringHash2(StringToHash, prefix_hash); 41 | FEngSetTextureHash_Pkg(PackageName, CT_bStringHash("3RDPERSON_TURBOLINES"), texture_hash); 42 | 43 | FEngSetTextureHash_Pkg(PackageName, CT_bStringHash("TACH_FILL"), tach_fill_hash); 44 | 45 | bSPrintf(StringToHash, "RPMDIAL_CUSTOM_%02d", hud_index); 46 | texture_hash = bStringHash2(StringToHash, prefix_hash); 47 | FEngSetTextureHash_Pkg(PackageName, CT_bStringHash("3RDPERSONNEEDLE"), texture_hash); 48 | 49 | DWORD* phys = RidePhysicsInfo_GetCarPhysicsInfo((ride + 4), 1); 50 | if (phys) 51 | { 52 | DWORD *engine_info = phys + 496; 53 | TachStyle = GetTachStyle(engine_info); 54 | } 55 | 56 | switch (TachStyle) 57 | { 58 | case 0: 59 | bSPrintf(StringToHash, "10500LINES_CUSTOM_%02d", hud_index); 60 | lines_hash = bStringHash2(StringToHash, prefix_hash); 61 | redline_hash = bStringHash2("REDLINE_9000", prefix_hash); 62 | break; 63 | case 1: 64 | bSPrintf(StringToHash, "10500LINES_CUSTOM_%02d", hud_index); 65 | lines_hash = bStringHash2(StringToHash, prefix_hash); 66 | redline_hash = bStringHash2("REDLINE_8500", prefix_hash); 67 | break; 68 | case 2: 69 | bSPrintf(StringToHash, "9500LINES_CUSTOM_%02d", hud_index); 70 | lines_hash = bStringHash2(StringToHash, prefix_hash); 71 | redline_hash = bStringHash2("REDLINE_8000", prefix_hash); 72 | break; 73 | case 3: 74 | bSPrintf(StringToHash, "9500LINES_CUSTOM_%02d", hud_index); 75 | lines_hash = bStringHash2(StringToHash, prefix_hash); 76 | redline_hash = bStringHash2("REDLINE_7500", prefix_hash); 77 | break; 78 | case 4: 79 | bSPrintf(StringToHash, "8500LINES_CUSTOM_%02d", hud_index); 80 | lines_hash = bStringHash2(StringToHash, prefix_hash); 81 | redline_hash = bStringHash2("REDLINE_7000", prefix_hash); 82 | break; 83 | case 5: 84 | bSPrintf(StringToHash, "8500LINES_CUSTOM_%02d", hud_index); 85 | lines_hash = bStringHash2(StringToHash, prefix_hash); 86 | redline_hash = bStringHash2("REDLINE_6500", prefix_hash); 87 | break; 88 | case 6: 89 | default: 90 | bSPrintf(StringToHash, "7500LINES_CUSTOM_%02d", hud_index); 91 | lines_hash = bStringHash2(StringToHash, prefix_hash); 92 | redline_hash = bStringHash2("REDLINE_6000", prefix_hash); 93 | break; 94 | case 7: 95 | bSPrintf(StringToHash, "7500LINES_CUSTOM_%02d", hud_index); 96 | lines_hash = bStringHash2(StringToHash, prefix_hash); 97 | redline_hash = bStringHash2("REDLINE_5500", prefix_hash); 98 | break; 99 | } 100 | 101 | FEngSetTextureHash_Pkg(PackageName, CT_bStringHash("3RDPERSONTACHRPMNUMBERS"), lines_hash); 102 | FEngSetTextureHash_Pkg(PackageName, CT_bStringHash("REDLINE"), redline_hash); 103 | 104 | FEngSetLanguageHash(PackageName, CT_bStringHash("3RDPERSONSPEEDUNITS"), Player_IsHudKPH() ? CT_bStringHash("HUD_KMH") : CT_bStringHash("HUD_MPH")); 105 | } 106 | } -------------------------------------------------------------------------------- /ChooseRimBrand.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "stdio.h" 3 | #include "InGameFunctions.h" 4 | #include "Helpers.h" 5 | 6 | char RimBrandName[64]; 7 | 8 | void __fastcall ChooseRimBrand_Setup(DWORD* ChooseRimBrand, void* EDX_Unused) 9 | { 10 | // Read Part Options for the car 11 | DWORD FECarConfig = *(DWORD*)_FECarConfigRef; 12 | int CarTypeID = (*(int(__thiscall**)(int))(*(DWORD*)FECarConfig + 4))(FECarConfig); 13 | 14 | char const* ChooseRimBrandPackage = (char const*)ChooseRimBrand[1]; 15 | 16 | // Add stock 17 | ChooseRimBrand_AddRimCategory(ChooseRimBrand, CT_bStringHash("STOCK"), CT_bStringHash("VISUAL_RIMS_BRAND_STOCK"), CT_bStringHash("RIMS_BRAND_STOCK"));// STOCK 18 | 19 | // Read brand from ini 20 | bool HasNoCustomRims = CarConfigs[CarTypeID].BodyShop.RimsCustom == 0; 21 | 22 | int RimBrandsCount = RimBrands.size(); 23 | DWORD RimBrandIconHash = -1; 24 | DWORD RimBrandNameHash = -1; 25 | 26 | for (int i = 0; i < RimBrandsCount; i++) 27 | { 28 | if (i == 0) 29 | { 30 | if (HasNoCustomRims) continue; 31 | 32 | RimBrandIconHash = CarConfigs[CarTypeID].Icons.BodyShopRimsCustom; 33 | RimBrandNameHash = CarConfigs[CarTypeID].Names.BodyShopRimsCustom; 34 | 35 | if (RimBrandIconHash == -1) RimBrandIconHash = RimBrands[i].TextureHash; 36 | if (RimBrandNameHash == -1) RimBrandNameHash = RimBrands[i].StringHash; 37 | } 38 | else 39 | { 40 | RimBrandIconHash = RimBrands[i].TextureHash; 41 | RimBrandNameHash = RimBrands[i].StringHash; 42 | } 43 | 44 | if (RemoveRimSizeRestrictions || (IsSUV(CarTypeID) && RimBrands[i].AvailableForSUVs) || (!IsSUV(CarTypeID) && RimBrands[i].AvailableForRegularCars)) 45 | ChooseRimBrand_AddRimCategory(ChooseRimBrand, RimBrands[i].BrandNameHash, RimBrandIconHash, RimBrandNameHash); 46 | } 47 | 48 | // Check installed part 49 | int LastButton = FEngGetLastButton(ChooseRimBrandPackage); // returns hash 50 | 51 | DWORD* CarPart = RideInfo_GetPart((DWORD*)gTheRideInfo, RimsToCustomize == -1 ? CAR_SLOT_ID::REAR_WHEEL : CAR_SLOT_ID::FRONT_WHEEL); 52 | if (CarPart) 53 | { 54 | unsigned int BrandNameHash = LastButton ? LastButton : CarPart_GetAppliedAttributeUParam(CarPart, CT_bStringHash("BRAND_NAME"), 0); 55 | 56 | if (BrandNameHash) 57 | { 58 | DWORD* TS = (DWORD*)ChooseRimBrand[20]; 59 | DWORD* TSLast = (DWORD*)ChooseRimBrand + 20; 60 | for (int i = 1; i < RimBrandsCount && TS != TSLast; i++, TS = (DWORD*)TS[0]) 61 | { 62 | if (TS[17] == BrandNameHash) 63 | { 64 | LastButton = i; // get number 65 | break; 66 | } 67 | } 68 | } 69 | } 70 | 71 | (*(void(__thiscall**)(DWORD*, int))(ChooseRimBrand[19] + 32))(ChooseRimBrand + 19, LastButton); // IconScroller::SetInitialPos 72 | 73 | (*(void(__thiscall**)(DWORD*))(*(DWORD*)ChooseRimBrand + 16))(ChooseRimBrand); 74 | } 75 | 76 | int GetRimBrandIDFromHash(DWORD BrandNameHash) 77 | { 78 | int RimBrandsCount = RimBrands.size(); 79 | if (RimBrandsCount == -1) return 0; 80 | 81 | for (int i = 0; i <= RimBrandsCount; i++) 82 | { 83 | if (BrandNameHash == RimBrands[i].BrandNameHash) 84 | { 85 | return i; 86 | } 87 | } 88 | 89 | return 0; 90 | } 91 | 92 | bool IsNoRimSize(DWORD BrandNameHash) 93 | { 94 | if (BrandNameHash == CT_bStringHash("SPINNER")) return 0; 95 | 96 | return RimBrands[GetRimBrandIDFromHash(BrandNameHash)].NoRimSize != 0; 97 | } 98 | 99 | bool IsNoBrandName(DWORD BrandNameHash) 100 | { 101 | return RimBrands[GetRimBrandIDFromHash(BrandNameHash)].HideBrandName != 0; 102 | } 103 | 104 | bool IsRimAvailable(int CarTypeID, DWORD* CarPart, DWORD BrandNameHash) 105 | { 106 | bool IsAvailable = 1; // al MAPDST 107 | bool IsStock = 1; // al MAPDST 108 | DWORD* CarTypeInfo; // esi 109 | int RimOuterRadius; // esi 110 | int UnlockFilter; // eax 111 | 112 | if (!CarPart) 113 | return 0; 114 | 115 | CarTypeInfo = GetCarTypeInfo(CarTypeID); 116 | 117 | if ((*((BYTE*)CarPart + 5) & 0xE0) != 0 || (BrandNameHash != CT_bStringHash("STOCK"))) 118 | IsStock = 0; 119 | 120 | if (CarPart_GetAppliedAttributeUParam(CarPart, CT_bStringHash("BRAND_NAME"), 0) == BrandNameHash) // "BRAND_NAME" 121 | { 122 | RimOuterRadius = *(BYTE*)((BYTE*)CarTypeInfo + 0xDC); 123 | if ((CarPart_GetAppliedAttributeUParam(CarPart, CT_bStringHash("OUTER_RADIUS"), 0) == RimOuterRadius) || (IsNoRimSize(BrandNameHash)) || RemoveRimSizeRestrictions) 124 | { 125 | UnlockFilter = CarCustomizeManager_GetPartUnlockFilter(); 126 | if (UnlockSystem_IsCarPartUnlocked(UnlockFilter, 29, CarPart, *(int*)0x8389B0)) 127 | return IsStock | 1; 128 | } 129 | } 130 | return 0; 131 | } -------------------------------------------------------------------------------- /CareerEventData.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "stdio.h" 3 | #include "InGameFunctions.h" 4 | 5 | #define MAX_RANDOM_STRINGS 99 6 | 7 | int SUVRandomCnt = 0; 8 | 9 | void CountRandomEngageStrings() 10 | { 11 | unsigned int StringHashToLookup; 12 | 13 | for (int i = 1; i < MAX_RANDOM_STRINGS; i++) 14 | { 15 | StringHashToLookup = FEngHashString("ENGAGE_SUV_RANDOM_%d", i); 16 | char const* StringData = (char const* )MakeUserCall(SearchForString, 1, edx, StringHashToLookup); 17 | if (!StringData) break; 18 | SUVRandomCnt++; 19 | } 20 | } 21 | 22 | unsigned int __fastcall CareerEventData_GetEngageDialogBody(BYTE* CareerEventData, void* EDX_Unused) 23 | { 24 | unsigned int result; // eax 25 | const char* RandomRaceString; // esi 26 | int DriftRandomCnt; // eax 27 | int SUVRandom; // eax 28 | BYTE EventIcon; // dl 29 | int SponsoredCircuitRandom; // eax 30 | int OpenWorldRandom; // eax 31 | int SponsoredStreetXRandom; // eax 32 | int SponsoredDragRandom; // eax 33 | int SponsoredDriftRandom; // eax 34 | int URLRandom; // eax 35 | int CircuitRandom; // eax 36 | int SprintRandom; // eax 37 | int StreetXRandom; // eax 38 | int DragRandom; // eax 39 | int DriftRandom; // eax 40 | 41 | DWORD CareerStringTable = *(DWORD*)_CareerStringTable; 42 | 43 | // If the event has a specific engage string, return its hash. 44 | // Example: "ENGAGE_STAGE_0_SPRINT_0" 45 | result = FEngHashString("ENGAGE_%s", (const char*)(CareerStringTable + *(unsigned __int16*)CareerEventData)); 46 | char const* StringData = (char const*)MakeUserCall(SearchForString, 1, edx, result); 47 | if (StringData) return result; 48 | 49 | // Else, return a random one. 50 | RandomRaceString = 0; 51 | DriftRandomCnt = 0; 52 | if (CareerEventData[13] == 1) // IsSUVRace 53 | { 54 | SUVRandom = bRandom(9); 55 | result = FEngHashString("ENGAGE_SUV_RANDOM_%d", SUVRandom + 1); 56 | } 57 | else 58 | { 59 | EventIcon = CareerEventData[52]; // EventIcon 60 | if (EventIcon == 1) // Sponsor 61 | { 62 | switch (CareerEventData[15]) 63 | { 64 | case 0u: 65 | SponsoredCircuitRandom = bRandom(11); 66 | result = FEngHashString("ENGAGE_SPON_CIRCUIT_RANDOM_%d", SponsoredCircuitRandom + 1); 67 | break; 68 | case 1u: 69 | RandomRaceString = "ENGAGE_SPON_SPRINT_RANDOM_%d"; 70 | goto LABEL_9; 71 | case 2u: 72 | SponsoredStreetXRandom = bRandom(10); 73 | result = FEngHashString("ENGAGE_SPON_STREET_RANDOM_%d", SponsoredStreetXRandom + 1); 74 | break; 75 | case 4u: 76 | SponsoredDragRandom = bRandom(8); 77 | result = FEngHashString("ENGAGE_SPON_DRAG_RANDOM_%d", SponsoredDragRandom + 1); 78 | break; 79 | case 5u: 80 | SponsoredDriftRandom = bRandom(11); 81 | result = FEngHashString("ENGAGE_SPON_DRIFT_RANDOM_%d", SponsoredDriftRandom + 1); 82 | break; 83 | default: 84 | goto LABEL_21; 85 | } 86 | } 87 | else if (EventIcon == 2) // URL 88 | { 89 | URLRandom = bRandom(12); 90 | result = FEngHashString("ENGAGE_URL_RANDOM_%d", URLRandom + 1); 91 | } 92 | else 93 | { 94 | switch (CareerEventData[15]) // Regular 95 | { 96 | case 0u: 97 | CircuitRandom = bRandom(18); 98 | result = FEngHashString("ENGAGE_CIRCUIT_RANDOM_%d", CircuitRandom + 1); 99 | break; 100 | case 1u: 101 | SprintRandom = bRandom(15); 102 | result = FEngHashString("ENGAGE_SPRINT_RANDOM_%d", SprintRandom + 1); 103 | break; 104 | case 2u: 105 | StreetXRandom = bRandom(14); 106 | result = FEngHashString("ENGAGE_STREET_RANDOM_%d", StreetXRandom + 1); 107 | break; 108 | case 3u: 109 | LABEL_9: 110 | OpenWorldRandom = bRandom(10); 111 | result = FEngHashString(RandomRaceString, OpenWorldRandom + 1); 112 | break; 113 | case 4u: 114 | DragRandom = bRandom(12); 115 | result = FEngHashString("ENGAGE_DRAG_RANDOM_%d", DragRandom + 1); 116 | break; 117 | case 5u: 118 | RandomRaceString = "ENGAGE_DRIFT_RANDOM_%d"; 119 | DriftRandomCnt = 13; 120 | //goto LABEL_21; 121 | default: 122 | LABEL_21: 123 | DriftRandom = bRandom(DriftRandomCnt); 124 | result = FEngHashString(RandomRaceString, DriftRandom + 1); 125 | break; 126 | } 127 | } 128 | } 129 | return result; 130 | } -------------------------------------------------------------------------------- /CustomizationScreenManager.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | #define dword_83898C *(DWORD*)0x83898C 7 | #define dword_838990 *(DWORD*)0x838990 8 | #define dword_838998 *(DWORD*)0x838998 9 | #define dword_8389A0 *(DWORD*)0x8389A0 10 | 11 | char const* __fastcall CustomizationScreenManager_CalcPrevScreen(DWORD* CustomizationScreenManager) 12 | { 13 | char const* result; // eax 14 | 15 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_CHOOSE_CUSTOMIZE_CATEGORY)) 16 | { 17 | switch (dword_83898C) 18 | { 19 | case 1: 20 | result = "UI_CareerCrib.fng"; 21 | break; 22 | case 2: 23 | case 3: 24 | result = "UI_QRCarSelect.fng"; 25 | break; 26 | case 4: 27 | result = "UI_OLCarSelect.fng"; 28 | break; 29 | default: 30 | return ""; 31 | } 32 | return result; 33 | } 34 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_CHOOSE_PERF_CATEGORY)) 35 | return *(char const**)_gCC_CHOOSE_CUSTOMIZE_CATEGORY; 36 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_CHOOSE_PERF_PACKAGE)) 37 | return *(char const**)_gCC_CHOOSE_PERF_CATEGORY; 38 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_BUY_PERF_PARTS)) 39 | return *(char const**)_gCC_CHOOSE_PERF_PACKAGE; 40 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_GENERIC_PARTS_BROWSER)) 41 | { 42 | if (dword_838990 != 2) 43 | return dword_83898C != 0 ? *(char const**)_gCC_CHOOSE_CUSTOMIZE_CATEGORY : 0; 44 | if (dword_8389A0 == 1) 45 | return *(char const**)_gCC_CHOOSE_VINYL_LAYER; 46 | return *(char const**)_gCC_CHOOSE_PAINT_CATEGORY; 47 | } 48 | if (bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_CHOOSE_PAINT_CATEGORY)) 49 | { 50 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_CHOOSE_ICE_CATEGORY)) 51 | { 52 | LABEL_34: 53 | switch (dword_838998) 54 | { 55 | case 1: 56 | case 2: 57 | case 3: 58 | case 5: 59 | case 6: 60 | case 7: 61 | case 8: 62 | dword_838998 = 0; 63 | result = *(char const**)_gCC_CHOOSE_ICE_CATEGORY; 64 | break; 65 | case 4: 66 | dword_838998 = 3; 67 | result = *(char const**)_gCC_CHOOSE_ICE_CATEGORY; 68 | break; 69 | case 9: 70 | dword_838998 = 7; 71 | result = *(char const**)_gCC_NEON_MAIN; 72 | break; 73 | default: 74 | result = *(char const**)_gCC_CHOOSE_CUSTOMIZE_CATEGORY; 75 | break; 76 | } 77 | return result; 78 | } 79 | if (bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_PAINT_BROWSER)) 80 | { 81 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_CHOOSE_VINYL_LAYER) 82 | || !bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_DECALS_MAIN)) 83 | { 84 | return *(char const**)_gCC_CHOOSE_PAINT_CATEGORY; 85 | } 86 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_ONLINE_CAR_LOT)) 87 | return *(char const**)_gCC_CHOOSE_CUSTOMIZE_CATEGORY; 88 | if (bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_NEON_MAIN)) 89 | { 90 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_CHOOSE_RIM_BRAND)) 91 | return *(char const**)_gCC_GENERIC_PARTS_BROWSER; 92 | if (!bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_RIMS_BROWSER)) 93 | return *(char const**)_gCC_CHOOSE_RIM_BRAND; 94 | if (bStrICmp(*(const char**)(CustomizationScreenManager[3] + 8), *(char const**)_gCC_CHOOSE_SPINNERS)) 95 | return ""; 96 | dword_838998 = 0; 97 | return *(char const**)_gCC_CHOOSE_ICE_CATEGORY; 98 | } 99 | goto LABEL_34; 100 | } 101 | if (dword_8389A0) 102 | { 103 | if (dword_8389A0 == 1) 104 | return *(char const**)_gCC_CHOOSE_VINYL_LAYER; 105 | if (dword_8389A0 == 2) 106 | return ""; 107 | } 108 | return *(char const**)_gCC_CHOOSE_PAINT_CATEGORY; 109 | } 110 | else 111 | { 112 | result = *(char const**)_gCC_CHOOSE_CUSTOMIZE_CATEGORY; 113 | if (!dword_83898C) 114 | return ""; 115 | } 116 | return result; 117 | } -------------------------------------------------------------------------------- /includes/CPatch.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | class CPatch 5 | { 6 | public: 7 | inline static void Patch(void* address, void* data, int size) 8 | { 9 | unsigned long protect[2]; 10 | VirtualProtect(address, size, PAGE_EXECUTE_READWRITE, &protect[0]); 11 | memcpy(address, data, size); 12 | VirtualProtect(address, size, protect[0], &protect[1]); 13 | } 14 | 15 | inline static void Patch2(int address, void* data, int size) 16 | { 17 | unsigned long protect[2]; 18 | VirtualProtect((void *)address, size, PAGE_EXECUTE_READWRITE, &protect[0]); 19 | memcpy((void *)address, data, size); 20 | VirtualProtect((void *)address, size, protect[0], &protect[1]); 21 | } 22 | 23 | inline static void Unprotect(int address, int size) 24 | { 25 | unsigned long protect[2]; 26 | VirtualProtect((void *)address, size, PAGE_EXECUTE_READWRITE, &protect[0]); 27 | } 28 | inline static void Nop(int address, int size) 29 | { 30 | unsigned long protect[2]; 31 | VirtualProtect((void *)address, size, PAGE_EXECUTE_READWRITE, &protect[0]); 32 | memset((void *)address, 0x90, size); 33 | VirtualProtect((void *)address, size, protect[0], &protect[1]); 34 | } 35 | inline static void FillWithZeroes(int address, int size) 36 | { 37 | unsigned long protect[2]; 38 | VirtualProtect((void *)address, size, PAGE_EXECUTE_READWRITE, &protect[0]); 39 | memset((void *)address, 0x00, size); 40 | VirtualProtect((void *)address, size, protect[0], &protect[1]); 41 | } 42 | inline static void RedirectCall(int address, void *func) 43 | { 44 | int temp = 0xE8; 45 | Patch((void *)address, &temp, 1); 46 | temp = (int)func - ((int)address + 5); 47 | Patch((void *)((int)address + 1), &temp, 4); 48 | } 49 | inline static void RedirectJump(int address, void *func) 50 | { 51 | int temp = 0xE9; 52 | Patch((void *)address, &temp, 1); 53 | temp = (int)func - ((int)address + 5); 54 | Patch((void *)((int)address + 1), &temp, 4); 55 | } 56 | inline static void SetChar(int address, char value) 57 | { 58 | Patch((void *)address, &value, 1); 59 | } 60 | inline static void SetUChar(int address, unsigned char value) 61 | { 62 | Patch((void *)address, &value, 1); 63 | } 64 | inline static void SetShort(int address, short value) 65 | { 66 | Patch((void *)address, &value, 2); 67 | } 68 | inline static void SetUShort(int address, unsigned short value) 69 | { 70 | Patch((void *)address, &value, 2); 71 | } 72 | inline static void SetInt(int address, int value) 73 | { 74 | Patch((void *)address, &value, 4); 75 | } 76 | inline static void SetUInt(int address, unsigned int value) 77 | { 78 | Patch((void *)address, &value, 4); 79 | } 80 | inline static void SetUIntWithCheck(int address, unsigned int value, unsigned int expectedValue) 81 | { 82 | if (*(unsigned int *)address == expectedValue) 83 | Patch((void *)address, &value, 4); 84 | } 85 | inline static void SetFloat(int address, float value) 86 | { 87 | Patch((void *)address, &value, 4); 88 | } 89 | inline static void SetDouble(int address, double value) 90 | { 91 | Patch((void *)address, &value, 8); 92 | } 93 | inline static void SetPointer(int address, void *value) 94 | { 95 | Patch((void *)address, &value, 4); 96 | } 97 | 98 | inline static void AdjustPointer(int address, void *value, DWORD offset, DWORD end) 99 | { 100 | int result; 101 | if((DWORD)*(DWORD*)address >= offset && (DWORD)*(DWORD*)address <= end) { 102 | result = (DWORD)value + (DWORD)*(DWORD*)address - (DWORD)offset; 103 | Patch((void *)address, &result, 4); 104 | } else { 105 | address = address + 1; 106 | if((DWORD)*(DWORD*)address >= offset && (DWORD)*(DWORD*)address <= end) { 107 | result = (DWORD)value + (DWORD)*(DWORD*)address - (DWORD)offset; 108 | Patch((void *)address, &result, 4); 109 | } else { 110 | address = address + 1; 111 | if((DWORD)*(DWORD*)address >= offset && (DWORD)*(DWORD*)address <= end) { 112 | result = (DWORD)value + (DWORD)*(DWORD*)address - (DWORD)offset; 113 | Patch((void *)address, &result, 4); 114 | } else { 115 | address = address + 1; 116 | if((DWORD)*(DWORD*)address >= offset && (DWORD)*(DWORD*)address <= end) { 117 | result = (DWORD)value + (DWORD)*(DWORD*)address - (DWORD)offset; 118 | Patch((void *)address, &result, 4); 119 | } else { 120 | address = address + 1; 121 | if((DWORD)*(DWORD*)address >= offset && (DWORD)*(DWORD*)address <= end) { 122 | result = (DWORD)value + (DWORD)*(DWORD*)address - (DWORD)offset; 123 | Patch((void *)address, &result, 4); 124 | } else { 125 | address = address + 1; 126 | if((DWORD)*(DWORD*)address >= offset && (DWORD)*(DWORD*)address <= end) { 127 | result = (DWORD)value + (DWORD)*(DWORD*)address - (DWORD)offset; 128 | Patch((void *)address, &result, 4); 129 | } 130 | } 131 | } 132 | } 133 | } 134 | } 135 | } 136 | 137 | inline static bool FileExists(const TCHAR *fileName) 138 | { 139 | DWORD fileAttr; 140 | fileAttr = GetFileAttributes(fileName); 141 | if (0xFFFFFFFF == fileAttr && GetLastError()==ERROR_FILE_NOT_FOUND) 142 | return false; 143 | return true; 144 | } 145 | }; -------------------------------------------------------------------------------- /UnlimiterData/_RimBrands_Vanilla.ini: -------------------------------------------------------------------------------- 1 | # This ini file is used to define which rim brands will appear in the customization shop. 2 | # It also allows you to have some other options. 3 | # 4 | # First section 5 | # NumberOfRimBrands = Defines the number of rim brands (without including 0) to get read from this file. 6 | # RemoveRimSizeRestrictions = Removes the outer radius restriction to make any rim available for all cars. 7 | # 8 | # Rim Brands sections (BrandX) 9 | # Required 10 | # BrandName = Defines the BRAND_NAME attribute value. If a rim car part has the attribute with the same value, it will appear under this brand. 11 | # String = Defines which string will be used in the menu. Only accepts labels. 12 | # Texture = Defines which icon will be used in the menu. Only accepts texture names. 13 | # Optional 14 | # NoRimSize = Removes size selection and lists all rims seperately. 15 | # HideBrandName = Hides rim brand name before the model name. 16 | # AvailableForRegularCars = Shows the rim brand for regular (Non-SUV) cars. 17 | # AvailableForSUVs = Shows the rim brand for SUV cars. 18 | 19 | [RimBrands] 20 | NumberOfRimBrands = 21 21 | RemoveRimSizeRestrictions = 0 22 | 23 | # TOUCH THIS ONE IF AND ONLY IF YOU KNOW WHAT ARE YOU DOING 24 | 25 | # Custom (Car-Specific, OEM) Rims Brand 26 | 27 | [Brand0] 28 | BrandName = "" 29 | String = "RIMS_BRAND_CUSTOM" 30 | Texture = "VISUAL_RIMS_BRAND_CUSTOM" 31 | NoRimSize = 1 32 | HideBrandName = 1 33 | 34 | # You are free to modify the ones below. 35 | 36 | [Brand1] 37 | BrandName = "5ZIGEN" 38 | String = "RIMS_BRAND_5ZIGEN" 39 | Texture = "DECAL_ICON_5ZIGEN" 40 | AvailableForRegularCars = 1 41 | AvailableForSUVs = 0 42 | 43 | [Brand2] 44 | BrandName = "AVUS" 45 | String = "RIMS_BRAND_AVUS" 46 | Texture = "DECAL_ICON_AVUS" 47 | AvailableForRegularCars = 1 48 | AvailableForSUVs = 0 49 | 50 | [Brand3] 51 | BrandName = "BBS" 52 | String = "RIMS_BRAND_BBS" 53 | Texture = "VISUAL_RIMS_BRAND_BBS" 54 | AvailableForRegularCars = 1 55 | AvailableForSUVs = 0 56 | 57 | [Brand4] 58 | BrandName = "DONZ" 59 | String = "RIMS_BRAND_DONZ" 60 | Texture = "DECAL_ICON_DONZ" 61 | AvailableForRegularCars = 0 62 | AvailableForSUVs = 1 63 | 64 | [Brand5] 65 | BrandName = "ENKEI" 66 | String = "RIMS_BRAND_ENKEI" 67 | Texture = "VISUAL_RIMS_BRAND_ENKEI" 68 | AvailableForRegularCars = 1 69 | AvailableForSUVs = 0 70 | 71 | [Brand6] 72 | BrandName = "FOXX" 73 | String = "RIMS_BRAND_FOXX" 74 | Texture = "DECAL_ICON_FOXX" 75 | AvailableForRegularCars = 0 76 | AvailableForSUVs = 1 77 | 78 | [Brand7] 79 | BrandName = "GIANELLE" 80 | String = "RIMS_BRAND_GIANELLE" 81 | Texture = "VISUAL_RIMS_BRAND_GIANELLE" 82 | AvailableForRegularCars = 1 83 | AvailableForSUVs = 1 84 | 85 | [Brand8] 86 | BrandName = "GIOVANNA" 87 | String = "RIMS_BRAND_GIOVANNA" 88 | Texture = "DECAL_ICON_GIOVANNA" 89 | AvailableForRegularCars = 0 90 | AvailableForSUVs = 1 91 | 92 | [Brand9] 93 | BrandName = "KAIZER" 94 | String = "RIMS_BRAND_KAIZER" 95 | Texture = "DECAL_ICON_KAIZER" 96 | AvailableForRegularCars = 0 97 | AvailableForSUVs = 1 98 | 99 | [Brand10] 100 | BrandName = "KONIG" 101 | String = "RIMS_BRAND_KONIG" 102 | Texture = "VISUAL_RIMS_BRAND_KONIG" 103 | AvailableForRegularCars = 1 104 | AvailableForSUVs = 0 105 | 106 | [Brand11] 107 | BrandName = "LEXANI" 108 | String = "RIMS_BRAND_LEXANI" 109 | Texture = "VISUAL_RIMS_BRAND_LEXANI" 110 | AvailableForRegularCars = 1 111 | AvailableForSUVs = 0 112 | 113 | [Brand12] 114 | BrandName = "LOWENHART" 115 | String = "RIMS_BRAND_LOWENHART" 116 | Texture = "DECAL_ICON_LOWENHART" 117 | AvailableForRegularCars = 1 118 | AvailableForSUVs = 0 119 | 120 | [Brand13] 121 | BrandName = "MOMO" 122 | String = "RIMS_BRAND_MOMO" 123 | Texture = "VISUAL_RIMS_BRAND_MOMO" 124 | AvailableForRegularCars = 1 125 | AvailableForSUVs = 0 126 | 127 | [Brand14] 128 | BrandName = "NFSU" 129 | String = "RIMS_BRAND_NFSU" 130 | Texture = "DECAL_ICON_NFSU2" 131 | AvailableForRegularCars = 1 132 | AvailableForSUVs = 1 133 | 134 | [Brand15] 135 | BrandName = "OZ" 136 | String = "RIMS_BRAND_OZ" 137 | Texture = "VISUAL_RIMS_BRAND_OZ" 138 | AvailableForRegularCars = 1 139 | AvailableForSUVs = 1 140 | 141 | [Brand16] 142 | BrandName = "RACINGHART" 143 | String = "RIMS_BRAND_RACINGHART" 144 | Texture = "VISUAL_RIMS_BRAND_RACINGHART" 145 | AvailableForRegularCars = 1 146 | AvailableForSUVs = 0 147 | 148 | [Brand17] 149 | BrandName = "ROTA" 150 | String = "RIMS_BRAND_ROTA" 151 | Texture = "DECAL_ICON_ROTA" 152 | AvailableForRegularCars = 1 153 | AvailableForSUVs = 0 154 | 155 | [Brand18] 156 | BrandName = "DAVIN" 157 | String = "RIMS_BRAND_STREETSPIN" 158 | Texture = "DECAL_ICON_STREETSPIN" 159 | AvailableForRegularCars = 0 160 | AvailableForSUVs = 1 161 | 162 | [Brand19] 163 | BrandName = "VOLK" 164 | String = "RIMS_BRAND_VOLK" 165 | Texture = "DECAL_ICON_VOLK" 166 | AvailableForRegularCars = 1 167 | AvailableForSUVs = 0 168 | 169 | [Brand20] 170 | BrandName = "WELDWHEEL" 171 | String = "RIMS_BRAND_WELD_RACING" 172 | Texture = "DECAL_ICON_WELD_RACING" 173 | AvailableForRegularCars = 0 174 | AvailableForSUVs = 1 175 | 176 | [Brand21] 177 | BrandName = "WORK" 178 | String = "RIMS_BRAND_WORK" 179 | Texture = "DECAL_ICON_WORK" 180 | AvailableForRegularCars = 1 181 | AvailableForSUVs = 0 182 | -------------------------------------------------------------------------------- /ChoosePaintShopCategory.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "stdio.h" 4 | #include "InGameFunctions.h" 5 | 6 | #define _PaintShopCategoryOption_vtbl 0x79B6E4 7 | #define _PSPurchaseSetup_vtbl 0x79B6EC 8 | 9 | void __fastcall ChoosePaintShopCategory_AddPaintShopCategoryOption(DWORD* ChoosePaintShopCategory, void* EDX_Unused, DWORD icon, DWORD text, DWORD field_0x48, DWORD field_0x4C, BYTE locked) 10 | { 11 | DWORD* PSCP = (DWORD*)j__malloc(0x50); 12 | 13 | if (PSCP) 14 | { 15 | PSCP[3] = icon; 16 | PSCP[4] = 0; 17 | PSCP[5] = 0; 18 | PSCP[6] = 0; 19 | *((BYTE*)PSCP + 32) = 0; 20 | *((BYTE*)PSCP + 33) = 1; 21 | *((BYTE*)PSCP + 34) = locked; 22 | *((BYTE*)PSCP + 35) = 0; 23 | PSCP[11] = text; 24 | PSCP[12] = 0; 25 | PSCP[13] = 1065353216; 26 | PSCP[14] = 1065353216; 27 | PSCP[15] = 1065353216; 28 | PSCP[16] = 1065353216; 29 | *((BYTE*)PSCP + 68) = 1; 30 | PSCP[18] = field_0x48; 31 | PSCP[19] = field_0x4C; 32 | *PSCP = (DWORD)_PaintShopCategoryOption_vtbl; 33 | *((BYTE*)PSCP + 69) = 0; 34 | } 35 | else 36 | { 37 | PSCP = 0; 38 | } 39 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChoosePaintShopCategory + 24))(ChoosePaintShopCategory, PSCP); 40 | } 41 | 42 | void __fastcall ChoosePaintShopCategory_AddPSPurchaseSetupOption(DWORD* ChoosePaintShopCategory, void* EDX_Unused, DWORD icon, DWORD text, DWORD field_0x40) 43 | { 44 | DWORD* PSCP = (DWORD*)j__malloc(0x48); 45 | 46 | if (PSCP) 47 | { 48 | PSCP[3] = icon; 49 | PSCP[4] = 0; 50 | PSCP[5] = 0; 51 | PSCP[6] = 0; 52 | *((BYTE*)PSCP + 32) = 0; 53 | *((BYTE*)PSCP + 33) = 1; 54 | *((BYTE*)PSCP + 34) = 0; 55 | *((BYTE*)PSCP + 35) = 0; 56 | PSCP[11] = text; 57 | PSCP[12] = field_0x40; 58 | PSCP[13] = 1065353216; 59 | PSCP[14] = 1065353216; 60 | PSCP[15] = 1065353216; 61 | PSCP[16] = 1065353216; 62 | *((BYTE*)PSCP + 68) = 1; 63 | *PSCP = (DWORD)_PSPurchaseSetup_vtbl; 64 | *((BYTE*)PSCP + 69) = 1; 65 | } 66 | else 67 | { 68 | PSCP = 0; 69 | } 70 | (*(void(__thiscall**)(DWORD*, DWORD*))(*ChoosePaintShopCategory + 24))(ChoosePaintShopCategory, PSCP); 71 | } 72 | 73 | void __fastcall ChoosePaintShopCategory_Setup(DWORD* ChoosePaintShopCategory, void* EDX_Unused) 74 | { 75 | // Read Part Options for the car 76 | DWORD FECarConfig = *(DWORD*)_FECarConfigRef; 77 | int CarTypeID = (*(int(__thiscall**)(int))(*(DWORD*)FECarConfig + 4))(FECarConfig); 78 | 79 | if (CarConfigs[CarTypeID].Paint.Paint) 80 | ChoosePaintShopCategory_AddPaintShopCategoryOption( 81 | ChoosePaintShopCategory, 82 | EDX_Unused, 83 | CarConfigs[CarTypeID].Icons.PaintPaint, // VISUAL_PART_PAINT 84 | CarConfigs[CarTypeID].Names.PaintPaint, // PAINT_CATEGORY_PAINTS 85 | 2, 86 | 0, 87 | 0); 88 | 89 | if (CarConfigs[CarTypeID].Paint.Vinyls) 90 | ChoosePaintShopCategory_AddPaintShopCategoryOption( 91 | ChoosePaintShopCategory, 92 | EDX_Unused, 93 | CarConfigs[CarTypeID].Icons.PaintVinyls, // VISUAL_PART_VINYL 94 | CarConfigs[CarTypeID].Names.PaintVinyls, // PAINT_CATEGORY_VINYLS 95 | 0, 96 | 1, 97 | 0); 98 | 99 | bool IsDecalsLocked = *(int*)_FEDatabase == 1 100 | ? !(*(bool*)_UnlockAllThings || UnlockSystem_AreAnyDecalsUnlocked(2)) 101 | : 0; 102 | 103 | if (CarConfigs[CarTypeID].Paint.Decals) 104 | ChoosePaintShopCategory_AddPaintShopCategoryOption( 105 | ChoosePaintShopCategory, 106 | EDX_Unused, 107 | CarConfigs[CarTypeID].Icons.PaintDecals, // VISUAL_PART_DECALS 108 | CarConfigs[CarTypeID].Names.PaintDecals, // PAINT_CATEGORY_DECALS 109 | 1, 110 | 2, 111 | IsDecalsLocked); 112 | 113 | ChoosePaintShopCategory_AddPSPurchaseSetupOption( 114 | ChoosePaintShopCategory, 115 | EDX_Unused, 116 | *(int*)_FEDatabase == 1 ? CarConfigs[CarTypeID].Icons.PaintPurchaseSetup : CarConfigs[CarTypeID].Icons.PaintInstallSetup, // GENERIC_ICON_PURCHASE 117 | *(int*)_FEDatabase == 1 ? CarConfigs[CarTypeID].Names.PaintPurchaseSetup : CarConfigs[CarTypeID].Names.PaintInstallSetup, // PAINT_CATEGORY_PURCHASE_SETUP / PAINT_CATEGORY_INSTALL_SETUP 118 | 0); 119 | 120 | unsigned int LastButton = FEngGetLastButton((char const*)ChoosePaintShopCategory[1]); 121 | 122 | (*(void(__thiscall**)(DWORD*, DWORD))(ChoosePaintShopCategory[19] + 32))(ChoosePaintShopCategory + 19, LastButton); // IconScroller::SetInitialPos 123 | (*(int(__thiscall**)(DWORD*))(*ChoosePaintShopCategory + 16))(ChoosePaintShopCategory); // IconScrollerMenu::RefreshHeader 124 | 125 | if (*(int*)_FEDatabase == 1) 126 | { 127 | ChooseDecalCategory_ShowTotalPaintCost(ChoosePaintShopCategory); 128 | int PaintSetupPrice = CarCustomizeManager_GetPaintSetupPrice((DWORD*)gCarCustomizeManager); 129 | FEPrintf((char const*)ChoosePaintShopCategory[1], CT_bStringHash("TRADE_IN_CASH"), "%$d", PaintSetupPrice); 130 | } 131 | else 132 | { 133 | ChooseDecalCategory_HideTotalPaintCost(ChoosePaintShopCategory); 134 | } 135 | } -------------------------------------------------------------------------------- /UnlockablesMap.h: -------------------------------------------------------------------------------- 1 | #include "stdio.h" 2 | #include "InGameFunctions.h" 3 | 4 | int MapCarSlotToUnlockable[] 5 | { 6 | 22, /* BASE */ 7 | 18, /* FRONT_BUMPER */ 8 | 17, /* REAR_BUMPER */ 9 | 19, /* LEFT_SIDE_MIRROR */ 10 | 19, /* RIGHT_SIDE_MIRROR */ 11 | 0, /* BODY */ 12 | 22, /* WIDE_BODY */ 13 | 20, /* ROOF */ 14 | 22, /* TOP */ 15 | 11, /* HOOD */ 16 | 11, /* TRUNK */ 17 | 16, /* SKIRT */ 18 | 12, /* SPOILER */ 19 | 0, /* ENGINE */ 20 | 15, /* HEADLIGHT */ 21 | 14, /* BRAKELIGHT */ 22 | 21, /* EXHAUST */ 23 | 0, /* DOOR_LEFT */ 24 | 0, /* DOOR_RIGHT */ 25 | 0, /* DOOR_PANEL_LEFT */ 26 | 0, /* DOOR_PANEL_RIGHT */ 27 | 0, /* DOOR_SILL_LEFT */ 28 | 0, /* DOOR_SILL_RIGHT */ 29 | 18, /* FENDER */ 30 | 17, /* QUARTER */ 31 | 0, /* HOOD_UNDER */ 32 | 0, /* TRUNK_UNDER */ 33 | 0, /* FRONT_BRAKE */ 34 | 0, /* REAR_BRAKE */ 35 | 13, /* FRONT_WHEEL */ 36 | 13, /* REAR_WHEEL */ 37 | 33, /* SPINNER */ 38 | 19, /* WING_MIRROR */ 39 | 0, /* LICENSE_PLATE */ 40 | 30, /* TRUNK_AUDIO */ 41 | 31, /* TRUNK_AUDIO_COMP_0 */ 42 | 31, /* TRUNK_AUDIO_COMP_1 */ 43 | 31, /* TRUNK_AUDIO_COMP_2 */ 44 | 31, /* TRUNK_AUDIO_COMP_3 */ 45 | 31, /* TRUNK_AUDIO_COMP_4 */ 46 | 31, /* TRUNK_AUDIO_COMP_5 */ 47 | 31, /* TRUNK_AUDIO_COMP_6 */ 48 | 31, /* TRUNK_AUDIO_COMP_7 */ 49 | 31, /* TRUNK_AUDIO_COMP_8 */ 50 | 31, /* TRUNK_AUDIO_COMP_9 */ 51 | 31, /* TRUNK_AUDIO_COMP_10 */ 52 | 31, /* TRUNK_AUDIO_COMP_11 */ 53 | 0, /* DAMAGE_FRONT */ 54 | 0, /* DAMAGE_REAR */ 55 | 0, /* DAMAGE_LEFT */ 56 | 0, /* DAMAGE_RIGHT */ 57 | 0, /* DAMAGE_TOP */ 58 | 76, /* DECAL_HOOD */ 59 | 76, /* DECAL_FRONT_WINDOW */ 60 | 76, /* DECAL_REAR_WINDOW */ 61 | 76, /* DECAL_LEFT_DOOR */ 62 | 76, /* DECAL_RIGHT_DOOR */ 63 | 76, /* DECAL_LEFT_QUARTER */ 64 | 76, /* DECAL_RIGHT_QUARTER */ 65 | 0, /* WIDEBODY_DECAL_LEFT_DOOR */ 66 | 0, /* WIDEBODY_DECAL_RIGHT_DOOR */ 67 | 0, /* WIDEBODY_DECAL_LEFT_QUARTER */ 68 | 0, /* WIDEBODY_DECAL_RIGHT_QUARTER */ 69 | 0, /* BASE_PAINT */ 70 | 0, /* VINYL_LAYER0 */ 71 | 0, /* VINYL_LAYER1 */ 72 | 0, /* VINYL_LAYER2 */ 73 | 0, /* VINYL_LAYER3 */ 74 | 40, /* PAINT_ENGINE */ 75 | 80, /* PAINT_SPOILER */ 76 | 79, /* PAINT_BRAKE */ 77 | 78, /* PAINT_EXHAUST */ 78 | 82, /* PAINT_AUDIO */ 79 | 77, /* PAINT_RIM */ 80 | 81, /* PAINT_SPINNER */ 81 | 83, /* PAINT_ROOF */ 82 | 84, /* PAINT_MIRROR */ 83 | 0, /* VINYL_COLOUR0_0 */ 84 | 0, /* VINYL_COLOUR0_1 */ 85 | 0, /* VINYL_COLOUR0_2 */ 86 | 0, /* VINYL_COLOUR0_3 */ 87 | 0, /* VINYL_COLOUR1_0 */ 88 | 0, /* VINYL_COLOUR1_1 */ 89 | 0, /* VINYL_COLOUR1_2 */ 90 | 0, /* VINYL_COLOUR1_3 */ 91 | 0, /* VINYL_COLOUR2_0 */ 92 | 0, /* VINYL_COLOUR2_1 */ 93 | 0, /* VINYL_COLOUR2_2 */ 94 | 0, /* VINYL_COLOUR2_3 */ 95 | 0, /* VINYL_COLOUR3_0 */ 96 | 0, /* VINYL_COLOUR3_1 */ 97 | 0, /* VINYL_COLOUR3_2 */ 98 | 0, /* VINYL_COLOUR3_3 */ 99 | 85, /* KIT_CARBON */ 100 | 0, /* HOOD_CARBON */ 101 | 0, /* DOOR_CARBON */ 102 | 86, /* TRUNK_CARBON */ 103 | 76, /* DECAL_HOOD_TEX0 */ 104 | 76, /* DECAL_HOOD_TEX1 */ 105 | 76, /* DECAL_HOOD_TEX2 */ 106 | 76, /* DECAL_HOOD_TEX3 */ 107 | 76, /* DECAL_HOOD_TEX4 */ 108 | 76, /* DECAL_HOOD_TEX5 */ 109 | 76, /* DECAL_HOOD_TEX6 */ 110 | 76, /* DECAL_HOOD_TEX7 */ 111 | 76, /* DECAL_FRONT_WINDOW_TEX0 */ 112 | 76, /* DECAL_FRONT_WINDOW_TEX1 */ 113 | 76, /* DECAL_FRONT_WINDOW_TEX2 */ 114 | 76, /* DECAL_FRONT_WINDOW_TEX3 */ 115 | 76, /* DECAL_FRONT_WINDOW_TEX4 */ 116 | 76, /* DECAL_FRONT_WINDOW_TEX5 */ 117 | 76, /* DECAL_FRONT_WINDOW_TEX6 */ 118 | 76, /* DECAL_FRONT_WINDOW_TEX7 */ 119 | 76, /* DECAL_REAR_WINDOW_TEX0 */ 120 | 76, /* DECAL_REAR_WINDOW_TEX1 */ 121 | 76, /* DECAL_REAR_WINDOW_TEX2 */ 122 | 76, /* DECAL_REAR_WINDOW_TEX3 */ 123 | 76, /* DECAL_REAR_WINDOW_TEX4 */ 124 | 76, /* DECAL_REAR_WINDOW_TEX5 */ 125 | 76, /* DECAL_REAR_WINDOW_TEX6 */ 126 | 76, /* DECAL_REAR_WINDOW_TEX7 */ 127 | 76, /* DECAL_LEFT_DOOR_TEX0 */ 128 | 76, /* DECAL_LEFT_DOOR_TEX1 */ 129 | 76, /* DECAL_LEFT_DOOR_TEX2 */ 130 | 76, /* DECAL_LEFT_DOOR_TEX3 */ 131 | 76, /* DECAL_LEFT_DOOR_TEX4 */ 132 | 76, /* DECAL_LEFT_DOOR_TEX5 */ 133 | 76, /* DECAL_LEFT_DOOR_TEX6 */ 134 | 76, /* DECAL_LEFT_DOOR_TEX7 */ 135 | 76, /* DECAL_RIGHT_DOOR_TEX0 */ 136 | 76, /* DECAL_RIGHT_DOOR_TEX1 */ 137 | 76, /* DECAL_RIGHT_DOOR_TEX2 */ 138 | 76, /* DECAL_RIGHT_DOOR_TEX3 */ 139 | 76, /* DECAL_RIGHT_DOOR_TEX4 */ 140 | 76, /* DECAL_RIGHT_DOOR_TEX5 */ 141 | 76, /* DECAL_RIGHT_DOOR_TEX6 */ 142 | 76, /* DECAL_RIGHT_DOOR_TEX7 */ 143 | 76, /* DECAL_LEFT_QUARTER_TEX0 */ 144 | 76, /* DECAL_LEFT_QUARTER_TEX1 */ 145 | 76, /* DECAL_LEFT_QUARTER_TEX2 */ 146 | 76, /* DECAL_LEFT_QUARTER_TEX3 */ 147 | 76, /* DECAL_LEFT_QUARTER_TEX4 */ 148 | 76, /* DECAL_LEFT_QUARTER_TEX5 */ 149 | 76, /* DECAL_LEFT_QUARTER_TEX6 */ 150 | 76, /* DECAL_LEFT_QUARTER_TEX7 */ 151 | 76, /* DECAL_RIGHT_QUARTER_TEX0 */ 152 | 76, /* DECAL_RIGHT_QUARTER_TEX1 */ 153 | 76, /* DECAL_RIGHT_QUARTER_TEX2 */ 154 | 76, /* DECAL_RIGHT_QUARTER_TEX3 */ 155 | 76, /* DECAL_RIGHT_QUARTER_TEX4 */ 156 | 76, /* DECAL_RIGHT_QUARTER_TEX5 */ 157 | 76, /* DECAL_RIGHT_QUARTER_TEX6 */ 158 | 76, /* DECAL_RIGHT_QUARTER_TEX7 */ 159 | 32, /* WINDOW_TINT */ 160 | 25, /* NEON */ 161 | 26, /* NEON_ENGINE */ 162 | 27, /* NEON_CABIN */ 163 | 28, /* NEON_TRUNK */ 164 | 27, /* CABIN_NEON_FRAME */ 165 | 24, /* HEADLIGHT_BULB */ 166 | 35, /* DOOR_STYLE */ 167 | 36, /* HYDRAULICS */ 168 | 29, /* NOS_PURGE */ 169 | 23, /* CUSTOM_HUD */ 170 | 23, /* HUD_BACKING_COLOUR */ 171 | 23, /* HUD_NEEDLE_COLOUR */ 172 | 23, /* HUD_CHARACTER_COLOUR */ 173 | 0, /* CV */ 174 | 0, /* WHEEL_MANUFACTURER */ 175 | 0 /* MISC */ 176 | }; 177 | -------------------------------------------------------------------------------- /UnlimiterData/_RimBrands.ini: -------------------------------------------------------------------------------- 1 | # This ini file is used to define which rim brands will appear in the customization shop. 2 | # It also allows you to have some other options. 3 | # 4 | # First section 5 | # NumberOfRimBrands = Defines the number of rim brands (without including 0) to get read from this file. 6 | # RemoveRimSizeRestrictions = Removes the outer radius restriction to make any rim available for all cars. 7 | # 8 | # Rim Brands sections (BrandX) 9 | # Required 10 | # BrandName = Defines the BRAND_NAME attribute value. If a rim car part has the attribute with the same value, it will appear under this brand. 11 | # String = Defines which string will be used in the menu. Only accepts labels. 12 | # Texture = Defines which icon will be used in the menu. Only accepts texture names. 13 | # Optional 14 | # NoRimSize = Removes size selection and lists all rims seperately. 15 | # HideBrandName = Hides rim brand name before the model name. 16 | # AvailableForRegularCars = Shows the rim brand for regular (Non-SUV) cars. 17 | # AvailableForSUVs = Shows the rim brand for SUV cars. 18 | 19 | [RimBrands] 20 | NumberOfRimBrands = 23 21 | RemoveRimSizeRestrictions = 0 22 | 23 | # TOUCH THIS ONE IF AND ONLY IF YOU KNOW WHAT ARE YOU DOING 24 | 25 | # Custom (Car-Specific, OEM) Rims Brand 26 | 27 | [Brand0] 28 | BrandName = "" 29 | String = "RIMS_BRAND_CUSTOM" 30 | Texture = "VISUAL_RIMS_BRAND_CUSTOM" 31 | NoRimSize = 1 32 | HideBrandName = 1 33 | 34 | # You are free to modify the ones below. 35 | 36 | [Brand1] 37 | BrandName = "5ZIGEN" 38 | String = "RIMS_BRAND_5ZIGEN" 39 | Texture = "DECAL_ICON_5ZIGEN" 40 | AvailableForRegularCars = 1 41 | AvailableForSUVs = 0 42 | 43 | [Brand2] 44 | BrandName = "ADVAN" 45 | String = "RIMS_BRAND_ADVAN" 46 | Texture = "VISUAL_RIMS_BRAND_ADVAN" 47 | AvailableForRegularCars = 1 48 | AvailableForSUVs = 0 49 | 50 | [Brand3] 51 | BrandName = "AVUS" 52 | String = "RIMS_BRAND_AVUS" 53 | Texture = "DECAL_ICON_AVUS" 54 | AvailableForRegularCars = 1 55 | AvailableForSUVs = 0 56 | 57 | [Brand4] 58 | BrandName = "BBS" 59 | String = "RIMS_BRAND_BBS" 60 | Texture = "VISUAL_RIMS_BRAND_BBS" 61 | AvailableForRegularCars = 1 62 | AvailableForSUVs = 0 63 | 64 | [Brand5] 65 | BrandName = "DONZ" 66 | String = "RIMS_BRAND_DONZ" 67 | Texture = "DECAL_ICON_DONZ" 68 | AvailableForRegularCars = 0 69 | AvailableForSUVs = 1 70 | 71 | [Brand6] 72 | BrandName = "ENKEI" 73 | String = "RIMS_BRAND_ENKEI" 74 | Texture = "VISUAL_RIMS_BRAND_ENKEI" 75 | AvailableForRegularCars = 1 76 | AvailableForSUVs = 0 77 | 78 | [Brand7] 79 | BrandName = "FOXX" 80 | String = "RIMS_BRAND_FOXX" 81 | Texture = "DECAL_ICON_FOXX" 82 | AvailableForRegularCars = 0 83 | AvailableForSUVs = 1 84 | 85 | [Brand8] 86 | BrandName = "GIANELLE" 87 | String = "RIMS_BRAND_GIANELLE" 88 | Texture = "VISUAL_RIMS_BRAND_GIANELLE" 89 | AvailableForRegularCars = 1 90 | AvailableForSUVs = 1 91 | 92 | [Brand9] 93 | BrandName = "GIOVANNA" 94 | String = "RIMS_BRAND_GIOVANNA" 95 | Texture = "DECAL_ICON_GIOVANNA" 96 | AvailableForRegularCars = 0 97 | AvailableForSUVs = 1 98 | 99 | [Brand10] 100 | BrandName = "KAIZER" 101 | String = "RIMS_BRAND_KAIZER" 102 | Texture = "DECAL_ICON_KAIZER" 103 | AvailableForRegularCars = 0 104 | AvailableForSUVs = 1 105 | 106 | [Brand11] 107 | BrandName = "KONIG" 108 | String = "RIMS_BRAND_KONIG" 109 | Texture = "VISUAL_RIMS_BRAND_KONIG" 110 | AvailableForRegularCars = 1 111 | AvailableForSUVs = 0 112 | 113 | [Brand12] 114 | BrandName = "LEXANI" 115 | String = "RIMS_BRAND_LEXANI" 116 | Texture = "VISUAL_RIMS_BRAND_LEXANI" 117 | AvailableForRegularCars = 1 118 | AvailableForSUVs = 0 119 | 120 | [Brand13] 121 | BrandName = "LOWENHART" 122 | String = "RIMS_BRAND_LOWENHART" 123 | Texture = "DECAL_ICON_LOWENHART" 124 | AvailableForRegularCars = 1 125 | AvailableForSUVs = 0 126 | 127 | [Brand14] 128 | BrandName = "MOMO" 129 | String = "RIMS_BRAND_MOMO" 130 | Texture = "VISUAL_RIMS_BRAND_MOMO" 131 | AvailableForRegularCars = 1 132 | AvailableForSUVs = 0 133 | 134 | [Brand15] 135 | BrandName = "NFSU" 136 | String = "RIMS_BRAND_NFSU" 137 | Texture = "DECAL_ICON_NFSU2" 138 | AvailableForRegularCars = 1 139 | AvailableForSUVs = 1 140 | 141 | [Brand16] 142 | BrandName = "OASIS" 143 | String = "RIMS_BRAND_OASIS" 144 | Texture = "VISUAL_RIMS_BRAND_OASIS" 145 | AvailableForRegularCars = 1 146 | AvailableForSUVs = 0 147 | 148 | [Brand17] 149 | BrandName = "OZ" 150 | String = "RIMS_BRAND_OZ" 151 | Texture = "VISUAL_RIMS_BRAND_OZ" 152 | AvailableForRegularCars = 1 153 | AvailableForSUVs = 1 154 | 155 | [Brand18] 156 | BrandName = "RACINGHART" 157 | String = "RIMS_BRAND_RACINGHART" 158 | Texture = "VISUAL_RIMS_BRAND_RACINGHART" 159 | AvailableForRegularCars = 1 160 | AvailableForSUVs = 0 161 | 162 | [Brand19] 163 | BrandName = "ROTA" 164 | String = "RIMS_BRAND_ROTA" 165 | Texture = "DECAL_ICON_ROTA" 166 | AvailableForRegularCars = 1 167 | AvailableForSUVs = 0 168 | 169 | [Brand20] 170 | BrandName = "DAVIN" 171 | String = "RIMS_BRAND_STREETSPIN" 172 | Texture = "DECAL_ICON_STREETSPIN" 173 | AvailableForRegularCars = 0 174 | AvailableForSUVs = 1 175 | 176 | [Brand21] 177 | BrandName = "VOLK" 178 | String = "RIMS_BRAND_VOLK" 179 | Texture = "DECAL_ICON_VOLK" 180 | AvailableForRegularCars = 1 181 | AvailableForSUVs = 0 182 | 183 | [Brand22] 184 | BrandName = "WELDWHEEL" 185 | String = "RIMS_BRAND_WELD_RACING" 186 | Texture = "DECAL_ICON_WELD_RACING" 187 | AvailableForRegularCars = 0 188 | AvailableForSUVs = 1 189 | 190 | [Brand23] 191 | BrandName = "WORK" 192 | String = "RIMS_BRAND_WORK" 193 | Texture = "DECAL_ICON_WORK" 194 | AvailableForRegularCars = 1 195 | AvailableForSUVs = 0 196 | --------------------------------------------------------------------------------