diff --git a/resources/CarWipe/config.lua b/resources/CarWipe/config.lua
index 3238cc314..309985736 100644
--- a/resources/CarWipe/config.lua
+++ b/resources/CarWipe/config.lua
@@ -8,5 +8,5 @@ Config = {
use10msdelay = true, -- use 10ms delay by deleting a vehicle
DoneNotify = true, -- Send a notify when the carwipe is done
OnlyWipeBroken = false, -- Only Delete Broken cars in the map
- looptime = 720, -- Repeating in minutes
+ looptime = 733333420, -- Repeating in minutes
}
\ No newline at end of file
diff --git a/resources/MAXINGspeedlimiter/config.lua b/resources/MAXINGspeedlimiter/config.lua
index 22490f180..46d573007 100644
--- a/resources/MAXINGspeedlimiter/config.lua
+++ b/resources/MAXINGspeedlimiter/config.lua
@@ -9,33 +9,33 @@ Config.maxSpeed = 190
Config.Categories = {
-- COMPACTS
- {category = 0, maxSpeed = 130},
+ {category = 0, maxSpeed = 195},
-- SEDANS
- {category = 1, maxSpeed = 130},
+ {category = 1, maxSpeed = 195},
-- SUV'S
- {category = 2, maxSpeed = 130},
+ {category = 2, maxSpeed = 195},
-- COUPES
- {category = 3, maxSpeed = 160},
+ {category = 3, maxSpeed = 195},
-- MUSCLE
- {category = 4, maxSpeed = 160},
+ {category = 4, maxSpeed = 195},
-- SPORT CLASSIC
- {category = 5, maxSpeed = 100},
+ {category = 5, maxSpeed = 130},
-- SPORT
- {category = 6, maxSpeed = 160},
+ {category = 6, maxSpeed = 195},
-- SUPER
- {category = 7, maxSpeed = 160},
+ {category = 7, maxSpeed = 195},
-- MOTORCYCLES
- {category = 8, maxSpeed = 130},
+ {category = 8, maxSpeed = 136},
-- OFFROAD
- {category = 9, maxSpeed = 130},
+ {category = 9, maxSpeed = 186},
-- INDUSTRIAL
- {category = 10, maxSpeed = 110},
+ {category = 10, maxSpeed = 187},
-- UTILITY
- {category = 11, maxSpeed = 106},
+ {category = 11, maxSpeed = 176},
-- VANS
- {category = 12, maxSpeed = 130},
+ {category = 12, maxSpeed = 189},
-- BICYCLES
- {category = 13, maxSpeed = 66},
+ {category = 13, maxSpeed = 110},
-- BOATS
{category = 14, maxSpeed = 84},
@@ -46,11 +46,11 @@ Config.Categories = {
--#endregion
-- SERVICE
- {category = 17, maxSpeed = 100},
+ {category = 17, maxSpeed = 180},
-- EMERGENCY
- {category = 18, maxSpeed = 230},
+ {category = 18, maxSpeed = 580},
-- MILITARY
- {category = 19, maxSpeed = 69}
+ {category = 19, maxSpeed = 369}
}
-- DO NOT MODIFY
diff --git a/resources/Maxlasd18charger/vehicles.meta b/resources/Maxlasd18charger/vehicles.meta
index 91841e939..4797c80f3 100644
--- a/resources/Maxlasd18charger/vehicles.meta
+++ b/resources/Maxlasd18charger/vehicles.meta
@@ -15,7 +15,249 @@
null
null
- str392m
+ npolchar
+ LAYOUT_STANDARD
+ BUFFALO_COVER_OFFSET_INFO
+ EXPLOSION_INFO_DEFAULT
+
+ DEFAULT_FOLLOW_VEHICLE_CAMERA
+ BOX_VEHICLE_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_STANDARD
+ DEFAULT_POV_CAMERA_LOOKAROUND
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_CAR_GENERIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 15.000000
+ 30.000000
+ 70.000000
+ 140.000000
+ 500.000000
+ 500.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_1
+
+ FLAG_USE_INTERIOR_RED_LIGHT FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_NO_RESPRAY FLAG_DONT_SPAWN_IN_CARGEN FLAG_REPORT_CRIME_IF_STANDING_ON FLAG_HAS_LIVERY
+ VEHICLE_TYPE_CAR
+ VPT_FRONT_AND_BACK_PLATES
+ VDT_RACE
+ VC_EMERGENCY
+ VWT_SPORT
+
+
+
+
+
+
+
+
+
+
+
+ - WHEEL_FRONT_RIGHT_CAMERA
+ - WHEEL_FRONT_LEFT_CAMERA
+ - WHEEL_REAR_RIGHT_CAMERA
+ - WHEEL_REAR_LEFT_CAMERA
+
+
+
+
+
+
+ - STD_POLICE3_FRONT_LEFT
+ - STD_POLICE3_FRONT_RIGHT
+ - STD_POLICE2_REAR_LEFT
+ - STD_POLICE2_REAR_RIGHT
+
+
+ -
+ chp18chargnp
+ chp18chargnp
+ 18CHARGER
+ chp18chargnp
+ chp18chargnp
+ null
+ null
+ null
+ null
+
+ null
+ buffalo2
+ LAYOUT_STANDARD
+ BUFFALO_COVER_OFFSET_INFO
+ EXPLOSION_INFO_DEFAULT
+
+ DEFAULT_FOLLOW_VEHICLE_CAMERA
+ BOX_VEHICLE_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_STANDARD
+ DEFAULT_POV_CAMERA_LOOKAROUND
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+ -
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_CAR_GENERIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 15.000000
+ 30.000000
+ 70.000000
+ 140.000000
+ 500.000000
+ 500.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_1
+
+ FLAG_USE_INTERIOR_RED_LIGHT FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_NO_RESPRAY FLAG_DONT_SPAWN_IN_CARGEN FLAG_REPORT_CRIME_IF_STANDING_ON FLAG_HAS_LIVERY
+ VEHICLE_TYPE_CAR
+ VPT_FRONT_AND_BACK_PLATES
+ VDT_RACE
+ VC_EMERGENCY
+ VWT_SPORT
+
+
+
+
+
+
+
+
+
+
+
+ - WHEEL_FRONT_RIGHT_CAMERA
+ - WHEEL_FRONT_LEFT_CAMERA
+ - WHEEL_REAR_RIGHT_CAMERA
+ - WHEEL_REAR_LEFT_CAMERA
+
+
+
+
+
+
+ - STD_POLICE3_FRONT_LEFT
+ - STD_POLICE3_FRONT_RIGHT
+ - STD_POLICE2_REAR_LEFT
+ - STD_POLICE2_REAR_RIGHT
+
+
+ -
+ chp19charg
+ chp19charg
+ 18CHARGER
+ chp19charg
+ chp19charg
+ null
+ null
+ null
+ null
+
+ null
+ buffalo2
LAYOUT_STANDARD
BUFFALO_COVER_OFFSET_INFO
EXPLOSION_INFO_DEFAULT
@@ -132,7 +374,15 @@
-
vehicles_race_generic
- Maxlasd18charger
+ chp18charg
+
+ -
+ chp18charg
+ chp19charg
+
+ -
+ chp18charg
+ chp18chargnp
\ No newline at end of file
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_lsfd_old/oiss_ssa_vehaud_siren_david.wav b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_lsfd_old/oiss_ssa_vehaud_siren_david.wav
index 949f0b2a7..fb5c6c7f9 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_lsfd_old/oiss_ssa_vehaud_siren_david.wav and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_lsfd_old/oiss_ssa_vehaud_siren_david.wav differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_lsfd_old/oiss_ssa_vehaud_siren_edward.wav b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_lsfd_old/oiss_ssa_vehaud_siren_edward.wav
index 00e2a90ba..a22ac896b 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_lsfd_old/oiss_ssa_vehaud_siren_edward.wav and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_lsfd_old/oiss_ssa_vehaud_siren_edward.wav differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_horn.wav b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_horn.wav
index 235aaf4fc..7d395f693 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_horn.wav and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_horn.wav differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_adam.wav b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_adam.wav
index 228f5d7a0..14f1274ed 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_adam.wav and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_adam.wav differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_boy.wav b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_boy.wav
index b5a9845f9..0e616d0a1 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_boy.wav and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_boy.wav differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_charles.wav b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_charles.wav
index b83536bba..02bd1e948 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_charles.wav and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_charles.wav differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_david.wav b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_david.wav
index 949f0b2a7..23221b8ed 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_david.wav and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_david.wav differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_edward.wav b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_edward.wav
index 00e2a90ba..f04fa61b6 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_edward.wav and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oac/oiss_ssa_vehaud_noose_new/oiss_ssa_vehaud_siren_edward.wav differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oiss_ssa_vehaud_lsfd_old.awc b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oiss_ssa_vehaud_lsfd_old.awc
index 98786af4e..c88cedb35 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oiss_ssa_vehaud_lsfd_old.awc and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oiss_ssa_vehaud_lsfd_old.awc differ
diff --git a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oiss_ssa_vehaud_noose_new.awc b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oiss_ssa_vehaud_noose_new.awc
index 7c060663c..f6152d726 100644
Binary files a/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oiss_ssa_vehaud_noose_new.awc and b/resources/ServerSidedSoundsSirens/dlc_serversideaudio/oiss_ssa_vehaud_noose_new.awc differ
diff --git a/resources/[EGRP-CarPacks]/224sodur_ht/handling.meta b/resources/[EGRP-CarPacks]/224sodur_ht/handling.meta
index 274b6aac9..f783240e6 100644
--- a/resources/[EGRP-CarPacks]/224sodur_ht/handling.meta
+++ b/resources/[EGRP-CarPacks]/224sodur_ht/handling.meta
@@ -3,7 +3,7 @@
-
- 24DURANGO
+ 21DURANGO
diff --git a/resources/[EGRP-CarPacks]/224sodur_ht/vehicles.meta b/resources/[EGRP-CarPacks]/224sodur_ht/vehicles.meta
index 3d035b5b7..451788f3c 100644
--- a/resources/[EGRP-CarPacks]/224sodur_ht/vehicles.meta
+++ b/resources/[EGRP-CarPacks]/224sodur_ht/vehicles.meta
@@ -6,9 +6,9 @@
-
24sodur_ht
24sodur_ht
- 24DURANGO
+ 21DURANGO
24sodur_ht
- 21DODGE
+ 24sodur_ht
null
null
null
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/__resource.lua b/resources/[EGRP-CarPacks]/2565egacyrango1/__resource.lua
new file mode 100644
index 000000000..e85b41837
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/__resource.lua
@@ -0,0 +1,20 @@
+resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
+
+files {
+ 'vehicles.meta',
+ 'carvariations.meta',
+ 'carcols.meta',
+ 'handling.meta',
+ 'vehiclelayouts.meta', -- Not Required
+}
+
+data_file 'HANDLING_FILE' 'handling.meta'
+data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
+data_file 'CARCOLS_FILE' 'carcols.meta'
+data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
+data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta' -- Not Required
+
+
+client_script {
+ 'vehicle_names.lua' -- Not Required
+}
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/carcols.meta b/resources/[EGRP-CarPacks]/2565egacyrango1/carcols.meta
new file mode 100644
index 000000000..e8f60ed20
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/carcols.meta
@@ -0,0 +1,1331 @@
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VehicleLight_car_LED1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 21durango
+
+
+
+ -
+
+ 23tahoeppv
+
+
+
+
+
+
+ VehicleLight_sirenlight
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/carvariations.meta b/resources/[EGRP-CarPacks]/2565egacyrango1/carvariations.meta
new file mode 100644
index 000000000..f32169d9f
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/carvariations.meta
@@ -0,0 +1,77 @@
+
+
+
+
+ -
+ 25legacyrango1
+
+
-
+
+ 0
+ 0
+ 0
+ 0
+ 5
+ 0
+
+
+
+
+
+ -
+
+ 0
+ 0
+ 0
+ 0
+ 5
+ 0
+
+
+
+
+
+ -
+
+ 0
+ 0
+ 0
+ 0
+ 5
+ 0
+
+
+
+
+
+ -
+
+ 0
+ 0
+ 0
+ 0
+ 5
+ 0
+
+
+
+
+
+
+
+ - 0_default_modkit
+
+
+
+
+ -
+ Police guv plate
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/handling.meta b/resources/[EGRP-CarPacks]/2565egacyrango1/handling.meta
new file mode 100644
index 000000000..484ff70f1
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/handling.meta
@@ -0,0 +1,67 @@
+
+
+
+
+ -
+ 25legacyrango1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 440010
+ 0
+ 0
+ AVERAGE
+
+
-
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1+hi.ytd b/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1+hi.ytd
new file mode 100644
index 000000000..53af46c19
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1+hi.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cdd6345f6fb93b27757261c6b80614855e596e6a5da36169e712389f554c2f2b
+size 1809765
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1.yft b/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1.yft
new file mode 100644
index 000000000..a2fdca4b2
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9578607f7e360f60664953dd11916568103481d55b4e36925489652a5fd811fc
+size 7797009
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1.ytd b/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1.ytd
new file mode 100644
index 000000000..bb1f06a61
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c12e4d48fd9801780230284b30c818f4eb06adfe3a8adaec4c30cdb6fb1da712
+size 12277723
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1_hi.yft b/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1_hi.yft
new file mode 100644
index 000000000..a2fdca4b2
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/stream/25legacyrango1_hi.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9578607f7e360f60664953dd11916568103481d55b4e36925489652a5fd811fc
+size 7797009
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/ulc.lua b/resources/[EGRP-CarPacks]/2565egacyrango1/ulc.lua
new file mode 100644
index 000000000..18632dbb3
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/ulc.lua
@@ -0,0 +1,61 @@
+
+--[[
+ Ultimate Lighting Controller Config
+ the ULC resource is required to use this configuration
+ get the resource here: https://github.com/Flohhhhh/ultimate-lighting-controller/releases/latest
+ To learn how to setup and use ULC visit here: https://docs.dwnstr.com/ulc/overview
+]]
+
+return {names = {"25legacyrango1"},
+ steadyBurnConfig = {
+ forceOn = false, useTime = false,
+ disableWithLights = true,
+ sbExtras = {5,6}
+ },
+ parkConfig = {
+ usePark = false,
+ useSync = false,
+ syncWith = {},
+ pExtras = {},
+ dExtras = {}
+ },
+ hornConfig = {
+ useHorn = false,
+ hornExtras = {},
+ disableExtras = {}
+ },
+ brakeConfig = {
+ useBrakes = false,
+ speedThreshold = 3,
+ brakeExtras = {},
+ disableExtras = {}
+ },
+ reverseConfig = {
+ useReverse = false,
+ reverseExtras = {},
+ disableExtras = {}
+ },
+ doorConfig = {
+ useDoors = false,
+ driverSide = {enable = {}, disable = {}},
+ passSide = {enable = {}, disable = {}},
+ trunk = {enable ={}, disable = {}}
+ },
+ buttons = {
+ {label = "Stage 1", key = 1, color = "green", extra = 2, linkedExtras = {3}, oppositeExtras = {}, offExtras = {1,4,5,6,10}, repair = false},
+ {label = "Stage 2", key = 2, color = "green", extra = 1, linkedExtras = {2,3,10}, oppositeExtras = {}, offExtras = {4,5,6}, repair = false},
+ {label = "Stage 3", key = 3, color = "green", extra = 4, linkedExtras = {1,2,3,10}, oppositeExtras = {}, offExtras = {5,6}, repair = false},
+ {label = "Cruise", key = 4, color = "green", extra = 5, linkedExtras = {6}, oppositeExtras = {}, offExtras = {1,2,3,4,10}, repair = false},
+ {label = "TKDN", key = 5, color = "green", extra = 11, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = false},
+ {label = "BLACK OUT", key = 6, color = "red", extra = 7, linkedExtras = {}, oppositeExtras = {9,8}, offExtras = {}, repair = true}
+ },
+ stages = {
+ useStages = true,
+ stageKeys = {1,2,3},
+ },
+ defaultStages = {
+ useDefaults = true,
+ enableKeys = {1,2,3},
+ disableKeys = {}
+ }
+}
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/2565egacyrango1/vehicles.meta b/resources/[EGRP-CarPacks]/2565egacyrango1/vehicles.meta
new file mode 100644
index 000000000..bd6223544
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/2565egacyrango1/vehicles.meta
@@ -0,0 +1,134 @@
+
+
+ vehshare
+
+
+ -
+ 25legacyrango1
+ 25legacyrango1
+ 25legacyrango1
+ 25legacyrango1
+ 21DODGE
+ null
+ null
+ null
+ null
+
+ null
+ str392m
+ LAYOUT_STD_HIGHWINDOW
+ GRESLEY_COVER_OFFSET_INFO
+ EXPLOSION_INFO_DEFAULT
+
+ DEFAULT_FOLLOW_VEHICLE_CAMERA
+ DEFAULT_THIRD_PERSON_VEHICLE_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_MID_NEAR
+ DEFAULT_POV_CAMERA_LOOKAROUND
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+ -
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_CAR_GENERIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2000.000000
+ 6000.000000
+ 10000.000000
+ 12500.000000
+ 50000.000000
+ 50000.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_1
+
+ FLAG_USE_INTERIOR_RED_LIGHT FLAG_HAS_LIVERY FLAG_HAS_INTERIOR_EXTRAS FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_ALLOW_HATS_NO_ROOF
+ VEHICLE_TYPE_CAR
+ VPT_FRONT_AND_BACK_PLATES
+ VDT_SPEEDO
+ VC_EMERGENCY
+ VWT_SPORT
+
+
+
+
+
+
+
+
+
+
+
+ - WHEEL_FRONT_RIGHT_CAMERA
+ - WHEEL_FRONT_LEFT_CAMERA
+ - WHEEL_REAR_RIGHT_CAMERA
+ - WHEEL_REAR_LEFT_CAMERA
+
+
+
+
+
+
+ - RANGER_CAVALCADE_FRONT_LEFT
+ - RANGER_FRONT_RIGHT
+ - RANGER_PRANGER_REAR_LEFT
+ - RANGER_PRANGER_REAR_RIGHT
+
+
+
+
+ -
+ vehicles_speedo_interior
+ 21durango
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/KenworthK100/__resource.lua b/resources/[EGRP-CarPacks]/KenworthK100/__resource.lua
new file mode 100644
index 000000000..e85b41837
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/KenworthK100/__resource.lua
@@ -0,0 +1,20 @@
+resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
+
+files {
+ 'vehicles.meta',
+ 'carvariations.meta',
+ 'carcols.meta',
+ 'handling.meta',
+ 'vehiclelayouts.meta', -- Not Required
+}
+
+data_file 'HANDLING_FILE' 'handling.meta'
+data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
+data_file 'CARCOLS_FILE' 'carcols.meta'
+data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
+data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta' -- Not Required
+
+
+client_script {
+ 'vehicle_names.lua' -- Not Required
+}
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/KenworthK100/carvariations.meta b/resources/[EGRP-CarPacks]/KenworthK100/carvariations.meta
new file mode 100644
index 000000000..ce0e75a19
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/KenworthK100/carvariations.meta
@@ -0,0 +1,61 @@
+
+
+
+ -
+ KenworthK100
+
+
-
+
+ 132
+ 0
+ 132
+ 156
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 0_default_modkit
+
+
+
+
+ -
+ Standard White
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/KenworthK100/dlctext.meta b/resources/[EGRP-CarPacks]/KenworthK100/dlctext.meta
new file mode 100644
index 000000000..22bb4c390
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/KenworthK100/dlctext.meta
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/KenworthK100/handling.meta b/resources/[EGRP-CarPacks]/KenworthK100/handling.meta
new file mode 100644
index 000000000..1001963a9
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/KenworthK100/handling.meta
@@ -0,0 +1,62 @@
+
+
+
+ -
+ KenworthK100
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 20220048
+ 0
+ 20
+ TRUCK
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100.yft b/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100.yft
new file mode 100644
index 000000000..2e1e11d9b
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:be2519afd4f9afb0866af4ecd4b2475a8df83a4d18a346532d320c6a7b4d3a64
+size 2049726
diff --git a/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100.ytd b/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100.ytd
new file mode 100644
index 000000000..0f73644b6
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:449ff01923cd76b91dedf9cbd65f4e00d87400463daf0f3e5f93e2985e2c673e
+size 2247591
diff --git a/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100_hi.yft b/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100_hi.yft
new file mode 100644
index 000000000..d967340a3
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/KenworthK100/stream/KenworthK100_hi.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:615d3739b502885493f5555a9431771a691b4804328c79a4c36b7115214acd61
+size 2056608
diff --git a/resources/[EGRP-CarPacks]/KenworthK100/vehicles.meta b/resources/[EGRP-CarPacks]/KenworthK100/vehicles.meta
new file mode 100644
index 000000000..081ea0e16
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/KenworthK100/vehicles.meta
@@ -0,0 +1,142 @@
+
+
+ vehshare
+
+
+ -
+ KenworthK100
+ KenworthK100
+ KenworthK100
+ KenworthK100
+ KenworthK100
+ null
+ null
+ null
+ null
+
+ null
+ kc80cumminsn14jake
+ LAYOUT_TRUCK
+ HAULER_COVER_OFFSET_INFO
+ EXPLOSION_INFO_TRUCK
+
+ FOLLOW_ARTIC_CAMERA
+ ARTIC_AIM_CAMERA
+ DEFAULT_VEHICLE_BONNET_CAMERA
+ DEFAULT_POV_CAMERA_NO_REVERSE_LOOKAROUND_MID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_TRUCK_RIG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 20.000000
+ 90.000000
+ 130.000000
+ 260.000000
+ 750.000000
+ 750.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_1
+
+ FLAG_BIG FLAG_CAN_HONK_WHEN_FLEEING FLAG_AVOID_TURNS FLAG_EXTRAS_STRONG FLAG_USE_FAT_INTERIOR_LIGHT FLAG_IS_BULKY FLAG_BLOCK_FROM_ATTRACTOR_SCENARIO FLAG_ATTACH_TRAILER_ON_HIGHWAY FLAG_USE_STRICTER_EXIT_COLLISION_TESTS
+ VEHICLE_TYPE_CAR
+ VPT_FRONT_AND_BACK_PLATES
+ VDT_DUKES
+ VC_COMMERCIAL
+ VWT_SPORT
+
+
- docktrailer
+ - trailers
+ - trailers2
+ - trailers3
+ - tanker
+ - trailerlogs
+ - tr2
+ - trflat
+
+
+ - armytanker
+ - armytrailer
+ - tr4
+ - tvtrailer
+ - trailerlarge
+ - trailers4
+
+
+ -
+ S_M_M_Trucker_01
+
+
+
+
+
+
+
+
+
+
+
+ - WHEEL_WIDE_REAR_RIGHT_CAMERA
+ - WHEEL_WIDE_REAR_LEFT_CAMERA
+
+ Truck
+
+
+
+
+ - TRUCK_PHANTOM_FRONT_LEFT
+ - TRUCK_PACKER_FRONT_RIGHT
+
+
+
+
+
+ -
+ vehshare_truck
+ KenworthK100
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/__resource.lua b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/__resource.lua
new file mode 100644
index 000000000..fdc8dfb3a
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/__resource.lua
@@ -0,0 +1,17 @@
+resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
+
+-- Leaked By: Leaking Hub | Joshua Y. | https://discord.gg/aXWXXst
+
+files {
+ 'vehicles.meta',
+ 'carvariations.meta',
+ 'carcols.meta',
+ 'handling.meta',
+ 'vehiclelayouts.meta',
+}
+
+data_file 'HANDLING_FILE' 'handling.meta'
+data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
+data_file 'CARCOLS_FILE' 'carcols.meta'
+data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
+data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta'
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/carcols.meta b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/carcols.meta
new file mode 100644
index 000000000..737c1ec88
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/carcols.meta
@@ -0,0 +1,1331 @@
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VehicleLight_car_standardmodern
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2020interceptorutility
+
+
+
+ -
+
+ 20fpiuk
+
+
+
+
+
+
+ VehicleLight_sirenlight
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/carvariations.meta b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/carvariations.meta
new file mode 100644
index 000000000..2c7b0821d
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/carvariations.meta
@@ -0,0 +1,62 @@
+
+
+
+ -
+ 20legacyfpiu3
+
+
-
+
+ 0
+ 134
+ 0
+ 64
+ 64
+ 64
+ 64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 0_default_modkit
+
+
+
+
+ -
+ Police guv plate
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/handling.meta b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/handling.meta
new file mode 100644
index 000000000..4e1a215f4
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/handling.meta
@@ -0,0 +1,67 @@
+
+
+
+
+ -
+ 20fpiu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 440010
+ 1
+ 0
+ SPORTS_CAR
+
+
-
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3+hi.ytd b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3+hi.ytd
new file mode 100644
index 000000000..0964801bd
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3+hi.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f685a12f7f4e0d1408f7d182efea43a03a060cec13d3fbdfffe1ee4459f68867
+size 1736136
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3.yft b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3.yft
new file mode 100644
index 000000000..fa6949417
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d475114f04c9842b44d8c1e3a06c7684927529ed85dbbbdcf0dced6f48502ce8
+size 6880654
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3.ytd b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3.ytd
new file mode 100644
index 000000000..5e781b830
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4546dada1104783c7b4b4a7e271de3adcb2d24861ece22897715517c239237e4
+size 15381836
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3_hi.yft b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3_hi.yft
new file mode 100644
index 000000000..fa6949417
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/stream/20legacyfpiu3_hi.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d475114f04c9842b44d8c1e3a06c7684927529ed85dbbbdcf0dced6f48502ce8
+size 6880654
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/ulc.lua b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/ulc.lua
new file mode 100644
index 000000000..c992f304e
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/ulc.lua
@@ -0,0 +1,54 @@
+
+--[[
+ Ultimate Lighting Controller Config
+ the ULC resource is required to use this configuration
+ get the resource here: https://github.com/Flohhhhh/ultimate-lighting-controller/releases/latest
+ To learn how to setup and use ULC visit here: https://docs.dwnstr.com/ulc/overview
+]]
+
+return {names = {"20legacyfpiu3"},
+ steadyBurnConfig = {
+ forceOn = false, useTime = false,
+ disableWithLights = true,
+ sbExtras = {11}
+ },
+ parkConfig = {
+ usePark = true,
+ useSync = false,
+ syncWith = {},
+ pExtras = {5,6,7,8,9},
+ dExtras = {1,2,3,4}
+ },
+ hornConfig = {
+ useHorn = false,
+ hornExtras = {},
+ },
+ brakeConfig = {
+ useBrakes = true,
+ speedThreshold = 4,
+ brakeExtras = {12},
+ disableExtras = {}
+ },
+ reverseConfig = {
+ useReverse = false,
+ reverseExtras = {}
+ },
+ doorConfig = {
+ useDoors = false,
+ driverSide = {enable = {}, disable = {}},
+ passSide = {enable = {}, disable = {}},
+ trunk = {enable ={}, disable = {}}
+ },
+ buttons = {
+ {label = "PARK FRONT", key = 2, color = "green", extra = 5, linkedExtras = {6,7}, oppositeExtras = {}, offExtras = {}, repair = false},
+ {label = "PARK REAR", key = 3, color = "green", extra = 8, linkedExtras = {9}, oppositeExtras = {}, offExtras = {}, repair = false},
+ {label = "DRIVE", key = 4, color = "green", extra = 1, linkedExtras = {2,3,4}, oppositeExtras = {}, offExtras = {}, repair = false},
+ {label = "TAKEDOWN", key = 1, color = "green", extra = 10, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = false},
+ {label = "STEADY", key = 5, color = "green", extra = 11, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = false},
+ },
+ defaultStages = {
+ useDefaults = false,
+ enableKeys = {3},
+ disableKeys = {1,2,4,11}
+ }
+}
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/vehicles.meta b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/vehicles.meta
new file mode 100644
index 000000000..5929edecd
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/20legacyfpiu3/vehicles.meta
@@ -0,0 +1,143 @@
+
+
+ vehshare
+
+
+ -
+ 20legacyfpiu3
+ 20legacyfpiu3
+ 20Fpiu
+ 20legacyfpiu3
+
+ null
+ null
+ null
+ null
+
+ null
+ ecoboostv6
+ LAYOUT_STD_EXITFIXUP
+ POLICE3_COVER_OFFSET_INFO
+ EXPLOSION_INFO_DEFAULT
+
+ DEFAULT_FOLLOW_VEHICLE_CAMERA
+ MID_BOX_VEHICLE_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_MID_NEAR
+ DEFAULT_POV_CAMERA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+ -
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_CAR_GENERIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1500.000000
+ 3000.000000
+ 7000.000000
+ 14000.000000
+ 50000.000000
+ 50000.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_0
+
+ FLAG_EXTRAS_STRONG FLAG_HAS_LIVERY FLAG_EXTRAS_ALL FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_NO_RESPRAY FLAG_DONT_SPAWN_IN_CARGEN FLAG_HAS_INTERIOR_EXTRAS FLAG_REPORT_CRIME_IF_STANDING_ON
+ VEHICLE_TYPE_CAR
+ VPT_BACK_PLATES
+ VDT_FEROCI
+ VC_EMERGENCY
+ VWT_SPORT
+
+
+
+ -
+ S_M_Y_Cop_01
+
+
+
+
+
+
+
+
+
+
+ - REWARD_WEAPON_PUMPSHOTGUN
+ - REWARD_AMMO_PUMPSHOTGUN_ENTER_VEHICLE
+ - REWARD_STAT_WEAPON
+
+
+ - WHEEL_FRONT_RIGHT_CAMERA
+ - WHEEL_FRONT_LEFT_CAMERA
+ - WHEEL_REAR_RIGHT_CAMERA
+ - WHEEL_REAR_LEFT_CAMERA
+
+
+
+
+
+
+ - STD_POLICE3_FRONT_LEFT
+ - STD_POLICE3_FRONT_RIGHT
+ - STD_POLICE2_REAR_LEFT
+ - STD_POLICE2_REAR_RIGHT
+
+
+
+
+ -
+ vehicles_feroci_interior
+ FPIUK
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/[lasd-packs]/lasd25fpiu/vehicles.meta b/resources/[EGRP-CarPacks]/[lasd-packs]/lasd25fpiu/vehicles.meta
index 449e73bdb..643e19e0f 100644
--- a/resources/[EGRP-CarPacks]/[lasd-packs]/lasd25fpiu/vehicles.meta
+++ b/resources/[EGRP-CarPacks]/[lasd-packs]/lasd25fpiu/vehicles.meta
@@ -2,12 +2,12 @@
vehshare
-
+
-
lasd25fpiu
lasd25fpiu
- 20fpiu
- nrgy
+ 20Fpiu
+ lasd25fpiu
null
null
@@ -16,38 +16,38 @@
null
ecoboostv6
- LAYOUT_STANDARD
- SHERIFF_COVER_OFFSET_INFO
+ LAYOUT_STD_EXITFIXUP
+ POLICE3_COVER_OFFSET_INFO
EXPLOSION_INFO_DEFAULT
DEFAULT_FOLLOW_VEHICLE_CAMERA
- DEFAULT_THIRD_PERSON_VEHICLE_AIM_CAMERA
- VEHICLE_BONNET_CAMERA_MID_HIGH
+ MID_BOX_VEHICLE_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_MID_NEAR
DEFAULT_POV_CAMERA
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
-
-
+
-
+
@@ -58,11 +58,11 @@
-
-
-
+
+
+
-
+
@@ -73,10 +73,10 @@
- 500.000000
- 500.000000
- 500.000000
- 500.000000
+ 35.000000
+ 55.000000
+ 70.000000
+ 140.000000
500.000000
500.000000
@@ -91,17 +91,17 @@
SWANKNESS_1
- FLAG_HAS_LIVERY FLAG_EXTRAS_REQUIRE FLAG_EXTRAS_STRONG FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_NO_RESPRAY FLAG_DONT_SPAWN_IN_CARGEN FLAG_REPORT_CRIME_IF_STANDING_ON FLAG_HAS_INTERIOR_EXTRAS
+ FLAG_EXTRAS_STRONG FLAG_HAS_LIVERY FLAG_EXTRAS_ALL FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_NO_RESPRAY FLAG_DONT_SPAWN_IN_CARGEN FLAG_HAS_INTERIOR_EXTRAS FLAG_REPORT_CRIME_IF_STANDING_ON
VEHICLE_TYPE_CAR
- VPT_FRONT_AND_BACK_PLATES
- VDT_GENTAXI
+ VPT_BACK_PLATES
+ VDT_FEROCI
VC_EMERGENCY
- VWT_MUSCLE
+ VWT_SPORT
-
- S_M_Y_Sheriff_01
+ S_M_Y_Cop_01
@@ -127,14 +127,17 @@
- - STD_POLICE_FRONT_LEFT
- - STD_POLICE_FRONT_RIGHT
- - STD_POLICE_REAR_LEFT
- - STD_POLICE_REAR_RIGHT
+ - STD_POLICE3_FRONT_LEFT
+ - STD_POLICE3_FRONT_RIGHT
+ - STD_POLICE2_REAR_LEFT
+ - STD_POLICE2_REAR_RIGHT
-
+ -
+ vehicles_feroci_interior
+ lasd25fpiu
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/cascadia/__resource.lua b/resources/[EGRP-CarPacks]/cascadia/__resource.lua
new file mode 100644
index 000000000..e85b41837
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/__resource.lua
@@ -0,0 +1,20 @@
+resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
+
+files {
+ 'vehicles.meta',
+ 'carvariations.meta',
+ 'carcols.meta',
+ 'handling.meta',
+ 'vehiclelayouts.meta', -- Not Required
+}
+
+data_file 'HANDLING_FILE' 'handling.meta'
+data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
+data_file 'CARCOLS_FILE' 'carcols.meta'
+data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
+data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta' -- Not Required
+
+
+client_script {
+ 'vehicle_names.lua' -- Not Required
+}
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/cascadia/carcols.meta b/resources/[EGRP-CarPacks]/cascadia/carcols.meta
new file mode 100644
index 000000000..23139983f
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/carcols.meta
@@ -0,0 +1,633 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ 135_cascadia_modkit
+
+ MKT_SPECIAL
+
+
+
+
+
-
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+ HORN_TRUCK
+
+
+
+ VMT_HORN
+
+ -
+ HORN_COP
+
+
+
+ VMT_HORN
+
+ -
+ HORN_CLOWN
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_1
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_2
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_3
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_4
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_5
+
+
+
+ VMT_HORN
+
+ -
+ HORN_SAD_TROMBONE
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_1
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_2
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_3
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_4
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_5
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_6
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_7
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_C0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_D0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_E0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_F0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_G0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_A0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_B0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_C1
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_4
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_4
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_3
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXORY_HORN_1
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXURY_HORN_2
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXURY_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+ ORGAN_HORN_LOOP_01
+
+
+
+ VMT_HORN
+
+
+ -
+ ORGAN_HORN_LOOP_01_PREVIEW
+
+
+
+ VMT_HORN
+
+ -
+ ORGAN_HORN_LOOP_02
+
+
+
+ VMT_HORN
+
+
+ -
+ ORGAN_HORN_LOOP_02_PREVIEW
+
+
+
+ VMT_HORN
+
+ -
+ LOWRIDER_HORN_1
+
+
+
+ VMT_HORN
+
+
+ -
+ LOWRIDER_HORN_1_PREVIEW
+
+
+
+ VMT_HORN
+
+ -
+ LOWRIDER_HORN_2
+
+
+
+ VMT_HORN
+
+
+ -
+ LOWRIDER_HORN_2_PREVIEW
+
+
+
+ VMT_HORN
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VehicleLight_car_oldsquare
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cascadia
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/cascadia/carvariations.meta b/resources/[EGRP-CarPacks]/cascadia/carvariations.meta
new file mode 100644
index 000000000..63663d112
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/carvariations.meta
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ cascadia
+
+
-
+
+ 29
+ 0
+ 29
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 0_default_modkit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/cascadia/dlctext.meta b/resources/[EGRP-CarPacks]/cascadia/dlctext.meta
new file mode 100644
index 000000000..22bb4c390
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/dlctext.meta
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/cascadia/handling.meta b/resources/[EGRP-CarPacks]/cascadia/handling.meta
new file mode 100644
index 000000000..17731bb7f
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/handling.meta
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ cascadia
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 20220048
+ 0
+ 0
+ AVERAGE
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/cascadia/stream/cascadia.yft b/resources/[EGRP-CarPacks]/cascadia/stream/cascadia.yft
new file mode 100644
index 000000000..7996b207c
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/stream/cascadia.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:25d2ba2b7c19f9050c5487b83fd7d7b672610542db1571b9065caef9c130ab2f
+size 11020534
diff --git a/resources/[EGRP-CarPacks]/cascadia/stream/cascadia.ytd b/resources/[EGRP-CarPacks]/cascadia/stream/cascadia.ytd
new file mode 100644
index 000000000..1b3cf510a
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/stream/cascadia.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e952921ab4eb195adda5dbaa0dfe1d64ab79831186b7f9518773e8cd1a08a9db
+size 9037770
diff --git a/resources/[EGRP-CarPacks]/cascadia/stream/cascadia_hi.yft b/resources/[EGRP-CarPacks]/cascadia/stream/cascadia_hi.yft
new file mode 100644
index 000000000..eafb7f9d4
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/stream/cascadia_hi.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ded791a7594b95cb07af56e2251175bd58efa77604e228b6134cf6388f993fb
+size 11020530
diff --git a/resources/[EGRP-CarPacks]/cascadia/vehicles.meta b/resources/[EGRP-CarPacks]/cascadia/vehicles.meta
new file mode 100644
index 000000000..a55b71762
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/cascadia/vehicles.meta
@@ -0,0 +1,161 @@
+
+
+ vehshare
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ cascadia
+ cascadia
+ cascadia
+ Cascadia
+ Freightliner
+ null
+ null
+ null
+ null
+
+ null
+ phantom
+ LAYOUT_TRUCK
+ PHANTOM_COVER_OFFSET_INFO
+ EXPLOSION_INFO_TRUCK
+
+ FOLLOW_ARTIC_CAMERA
+ ARTIC_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_STANDARD_LONG
+ DEFAULT_POV_CAMERA_NO_REVERSE
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_TRUCK_RIG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25.000000
+ 50.000000
+ 100.000000
+ 200.000000
+ 750.000000
+ 750.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_1
+
+ FLAG_RECESSED_HEADLIGHT_CORONAS FLAG_HAS_LIVERY FLAG_SPAWN_ON_TRAILER FLAG_AVERAGE_CAR FLAG_HAS_INTERIOR_EXTRAS FLAG_PARKING_SENSORS FLAG_EXTRAS_ALL FLAG_EXTRAS_STRONG
+ VEHICLE_TYPE_CAR
+ VPT_FRONT_AND_BACK_PLATES
+ VDT_TAILGATER
+ VC_COMMERCIAL
+ VWT_SPORT
+
+
- docktrailer
+ - trailers
+ - trailers2
+ - trailers3
+ - tanker
+ - trailerlogs
+ - tr2
+ - trflat
+
+
+ - armytanker
+ - armytrailer
+ - tr4
+ - tvtrailer
+
+
+ -
+ S_M_M_Trucker_01
+
+
+
+
+
+ - VEH_EXT_BONNET
+
+
+
+
+
+
+
+ - WHEEL_WIDE_REAR_RIGHT_CAMERA
+ - WHEEL_WIDE_REAR_LEFT_CAMERA
+
+ Truck
+
+
+
+
+ - TRUCK_PACKER_FRONT_LEFT
+ - TRUCK_PACKER_FRONT_RIGHT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ vehicles_dom_interior
+ cascadia
+
+
+
+
+
+
+
diff --git a/resources/[EGRP-CarPacks]/ebu_trailer/config.lua b/resources/[EGRP-CarPacks]/ebu_trailer/config.lua
index 12978cef1..e2a29dfe0 100644
--- a/resources/[EGRP-CarPacks]/ebu_trailer/config.lua
+++ b/resources/[EGRP-CarPacks]/ebu_trailer/config.lua
@@ -188,6 +188,19 @@ Config.Trailers = {
rampPos = {vector3(-1.8, -5.5, -0.5), vector3(1.8, -5.5, -0.5)},
rampDoorNum = {0,5},
},
+ [GetHashKey('dotgooseneck')] = {
+ hasRamp = true,
+
+ rampPos = {vector3(-1.8, -5.5, -0.5), vector3(1.8, -5.5, -0.5)},
+ rampDoorNum = {0,5},
+ },
+ [GetHashKey('lacofdtrlr')] = {
+ hasRamp = true,
+
+ rampPos = {vector3(-1.8, -5.5, -0.5), vector3(1.8, -5.5, -0.5)},
+ rampDoorNum = {0,5},
+ },
+
[GetHashKey('godzbenson')] = {
hasRamp = true,
diff --git a/resources/[EGRP-CarPacks]/montereyparkpd25dura_180/vehicles.meta b/resources/[EGRP-CarPacks]/montereyparkpd25dura_180/vehicles.meta
index ec8654ed1..97c9b4802 100644
--- a/resources/[EGRP-CarPacks]/montereyparkpd25dura_180/vehicles.meta
+++ b/resources/[EGRP-CarPacks]/montereyparkpd25dura_180/vehicles.meta
@@ -8,7 +8,7 @@
montereyparkpd25dura_180
21DURANGO
montereyparkpd25dura_180
- 21DODGE
+ montereyparkpd25dura_180
null
null
null
diff --git a/resources/[EGRP-CarPacks]/offbaseq50/__resource.lua b/resources/[EGRP-CarPacks]/offbaseq50/__resource.lua
new file mode 100644
index 000000000..e85b41837
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/offbaseq50/__resource.lua
@@ -0,0 +1,20 @@
+resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
+
+files {
+ 'vehicles.meta',
+ 'carvariations.meta',
+ 'carcols.meta',
+ 'handling.meta',
+ 'vehiclelayouts.meta', -- Not Required
+}
+
+data_file 'HANDLING_FILE' 'handling.meta'
+data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
+data_file 'CARCOLS_FILE' 'carcols.meta'
+data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
+data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta' -- Not Required
+
+
+client_script {
+ 'vehicle_names.lua' -- Not Required
+}
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/offbaseq50/carvariations.meta b/resources/[EGRP-CarPacks]/offbaseq50/carvariations.meta
new file mode 100644
index 000000000..a937ceeb6
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/offbaseq50/carvariations.meta
@@ -0,0 +1,80 @@
+
+
+
+
+ -
+ offbaseq50
+
+
-
+
+ 32
+ 28
+ 0
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 0_default_modkit
+
+
+
+
+ -
+ Standard White
+
+
+
+
+
+
+
+ -
+ offbaseq50
+
+
-
+
+ 32
+ 28
+ 0
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 0_default_modkit
+
+
+
+
+ -
+ Standard White
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/offbaseq50/dlctext.meta b/resources/[EGRP-CarPacks]/offbaseq50/dlctext.meta
new file mode 100644
index 000000000..22bb4c390
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/offbaseq50/dlctext.meta
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/offbaseq50/handling.meta b/resources/[EGRP-CarPacks]/offbaseq50/handling.meta
new file mode 100644
index 000000000..87cb269ba
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/offbaseq50/handling.meta
@@ -0,0 +1,67 @@
+
+
+
+
+ -
+ offbaseq50
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 440010
+ 0
+ 0
+ AVERAGE
+
+
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50.yft b/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50.yft
new file mode 100644
index 000000000..5d26aa650
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a92a5ff94e648678b30d0a71ece48f4444c632e45cb9adac0b1940fc1fb5f212
+size 6402702
diff --git a/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50.ytd b/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50.ytd
new file mode 100644
index 000000000..acf6b962a
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2e015dce4d065df14dabf385d482dea3292bbc1dc97b34a6dcf7eb826ca8b690
+size 5266816
diff --git a/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50_hi.yft b/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50_hi.yft
new file mode 100644
index 000000000..7518a65f0
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/offbaseq50/stream/offbaseq50_hi.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea083a37bfa92e1c3225b1b93fdb525f3455e520da175fc77ccde388d90df4d6
+size 6402641
diff --git a/resources/[EGRP-CarPacks]/offbaseq50/vehicles.meta b/resources/[EGRP-CarPacks]/offbaseq50/vehicles.meta
new file mode 100644
index 000000000..d55de5857
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/offbaseq50/vehicles.meta
@@ -0,0 +1,134 @@
+
+
+ vehshare
+
+
+ -
+ offbaseq50
+ offbaseq50
+ offbaseq50
+ offbaseq50
+ OFFLORDBUILT
+ null
+ null
+ null
+ null
+
+ null
+ KURUMA
+ LAYOUT_STANDARD
+ BUFFALO2_COVER_OFFSET_INFO
+ EXPLOSION_INFO_DEFAULT
+
+ DEFAULT_FOLLOW_VEHICLE_CAMERA
+ DEFAULT_THIRD_PERSON_VEHICLE_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_STANDARD
+ DEFAULT_POV_CAMERA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+ -
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_CAR_GENERIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 500.000000
+ 500.000000
+ 500.000000
+ 500.000000
+ 500.000000
+ 500.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_3
+
+ FLAG_HAS_LIVERY FLAG_AVERAGE_CAR FLAG_RECESSED_HEADLIGHT_CORONAS FLAG_HAS_INTERIOR_EXTRAS FLAG_HAS_BULLET_RESISTANT_GLASS FLAG_HAS_INCREASED_RAMMING_FORCE FLAG_HAS_CAPPED_EXPLOSION_DAMAGE
+ VEHICLE_TYPE_CAR
+ VPT_BACK_PLATES
+ VDT_RACE
+ VC_SPORT
+ VWT_SPORT
+
+
+
+
+
+
+
+
+
+
+
+ - WHEEL_FRONT_RIGHT_CAMERA
+ - WHEEL_FRONT_LEFT_CAMERA
+ - WHEEL_REAR_RIGHT_CAMERA
+ - WHEEL_REAR_LEFT_CAMERA
+
+
+
+
+
+
+ - STD_BUFFALO2_FRONT_LEFT
+ - STD_BUFFALO2_FRONT_RIGHT
+ - STD_BUFFALO_REAR_LEFT
+ - STD_BUFFALO_REAR_RIGHT
+
+
+
+
+ -
+ vehicles_race_generic
+ offbaseq50
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q50s2023/__resource.lua b/resources/[EGRP-CarPacks]/q50s2023/__resource.lua
new file mode 100644
index 000000000..e85b41837
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/__resource.lua
@@ -0,0 +1,20 @@
+resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
+
+files {
+ 'vehicles.meta',
+ 'carvariations.meta',
+ 'carcols.meta',
+ 'handling.meta',
+ 'vehiclelayouts.meta', -- Not Required
+}
+
+data_file 'HANDLING_FILE' 'handling.meta'
+data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
+data_file 'CARCOLS_FILE' 'carcols.meta'
+data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
+data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta' -- Not Required
+
+
+client_script {
+ 'vehicle_names.lua' -- Not Required
+}
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q50s2023/carcols.meta b/resources/[EGRP-CarPacks]/q50s2023/carcols.meta
new file mode 100644
index 000000000..daba40fac
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/carcols.meta
@@ -0,0 +1,558 @@
+
+
+
+ -
+ 939_q50s2023_modkit
+
+ MKT_SPECIAL
+
+
+
+
+
-
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+ HORN_TRUCK
+
+
+
+ VMT_HORN
+
+ -
+ HORN_COP
+
+
+
+ VMT_HORN
+
+ -
+ HORN_CLOWN
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_1
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_2
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_3
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_4
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_5
+
+
+
+ VMT_HORN
+
+ -
+ HORN_SAD_TROMBONE
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_1
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_2
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_3
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_4
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_5
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_6
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_7
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_C0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_D0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_E0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_F0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_G0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_A0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_B0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_C1
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_4
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_4
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_3
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXORY_HORN_1
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXURY_HORN_2
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXURY_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+
+
+ -
+ VMT_CHASSIS
+ TOP_CAGE
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VehicleLight_car_standardmodern
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ q50s2023
+
+
+
+
diff --git a/resources/[EGRP-CarPacks]/q50s2023/carvariations.meta b/resources/[EGRP-CarPacks]/q50s2023/carvariations.meta
new file mode 100644
index 000000000..137cf1477
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/carvariations.meta
@@ -0,0 +1,304 @@
+
+
+
+
+ -
+ q50s2023
+
+
-
+
+ 62
+ 0
+ 81
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 29
+ 0
+ 29
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 111
+ 0
+ 107
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 0
+ 0
+ 15
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 2
+ 0
+ 5
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 7
+ 0
+ 1
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 62
+ 107
+ 81
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 29
+ 107
+ 29
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 111
+ 107
+ 107
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 0
+ 107
+ 15
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 2
+ 107
+ 5
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 49
+ 0
+ 66
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 7
+ 107
+ 1
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 0
+ 31
+ 15
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ 49
+ 107
+ 66
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 939_q50s2023_modkit
+
+
+
+
+ -
+ Standard White
+
+
+ -
+ White Plate 2
+
+
+ -
+ Yellow Plate
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q50s2023/dlctext.meta b/resources/[EGRP-CarPacks]/q50s2023/dlctext.meta
new file mode 100644
index 000000000..22bb4c390
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/dlctext.meta
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q50s2023/handling.meta b/resources/[EGRP-CarPacks]/q50s2023/handling.meta
new file mode 100644
index 000000000..6a56a5cae
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/handling.meta
@@ -0,0 +1,68 @@
+
+
+
+
+ -
+ Q50S2023
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 440010
+ 0
+ 0
+ TRUCK
+
+
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023.yft b/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023.yft
new file mode 100644
index 000000000..81c9b6c4f
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9d2c92b4c3dbd8cf8f302f565a9fde9bf775d0badfad88e03fcd0fdaf246acb8
+size 12796822
diff --git a/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023.ytd b/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023.ytd
new file mode 100644
index 000000000..a1de21fe4
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b1fded8b491d90966f0bc0f601641bb3739c3df6a37168452028b224a68e1d63
+size 11189525
diff --git a/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023_hi.yft b/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023_hi.yft
new file mode 100644
index 000000000..81c9b6c4f
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/stream/q50s2023_hi.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9d2c92b4c3dbd8cf8f302f565a9fde9bf775d0badfad88e03fcd0fdaf246acb8
+size 12796822
diff --git a/resources/[EGRP-CarPacks]/q50s2023/vehiclelayouts.meta b/resources/[EGRP-CarPacks]/q50s2023/vehiclelayouts.meta
new file mode 100644
index 000000000..5d36803b6
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/vehiclelayouts.meta
@@ -0,0 +1,99 @@
+
+
+
+
+ -
+ DOMINATOR_COVER_OFFSET_INFO
+
+
+
+
+
+
+
+
+
+ -
+ STD_DOMINATOR_FRONT_LEFT
+
+
+
+
+
-
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+ STD_DOMINATOR_FRONT_RIGHT
+
+
+
+
+
-
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/[EGRP-CarPacks]/q50s2023/vehicles.meta b/resources/[EGRP-CarPacks]/q50s2023/vehicles.meta
new file mode 100644
index 000000000..bbb5d199d
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q50s2023/vehicles.meta
@@ -0,0 +1,134 @@
+
+
+ vehshare
+
+
+ -
+ q50s2023
+ q50s2023
+ Q50S2023
+ Q50S2023
+ Infiniti Q50S2023 2016
+ null
+ null
+ null
+ null
+
+ null
+ sultan
+ LAYOUT_STD_HIGHWINDOW
+ Q50S2023_COVER_OFFSET_INFO
+ EXPLOSION_INFO_DEFAULT
+
+ DEFAULT_FOLLOW_VEHICLE_CAMERA
+ DEFAULT_THIRD_PERSON_VEHICLE_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_MID_HIGH
+ DEFAULT_POV_CAMERA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+ -
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_CAR_GENERIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 450.000000
+ 460.000000
+ 470.000000
+ 480.000000
+ 500.000000
+ 500.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_2
+
+ FLAG_PARKING_SENSORS FLAG_AVERAGE_CAR FLAG_IS_OFFROAD_VEHICLE FLAG_USE_FAT_INTERIOR_LIGHT FLAG_RECESSED_TAILLIGHT_CORONAS
+ VEHICLE_TYPE_CAR
+ VDT_SCHAFTER
+ VPT_FRONT_AND_BACK_PLATES
+ VC_SEDAN
+ VWT_SPORT
+
+
+
+
+
+
+
+
+
+
+
+ - WHEEL_FRONT_RIGHT_CAMERA
+ - WHEEL_FRONT_LEFT_CAMERA
+ - WHEEL_REAR_RIGHT_CAMERA
+ - WHEEL_REAR_LEFT_CAMERA
+
+
+
+
+
+
+ - STD_Q50S2023_FRONT_LEFT
+ - STD_Q50S2023_FRONT_RIGHT
+ - STD_Q50S2023_REAR_LEFT
+ - STD_Q50S2023_REAR_RIGHT
+
+
+
+
+ -
+ vehicles_feroci_interior
+ q50s2023
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q60pbs/__resource.lua b/resources/[EGRP-CarPacks]/q60pbs/__resource.lua
new file mode 100644
index 000000000..e85b41837
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/__resource.lua
@@ -0,0 +1,20 @@
+resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
+
+files {
+ 'vehicles.meta',
+ 'carvariations.meta',
+ 'carcols.meta',
+ 'handling.meta',
+ 'vehiclelayouts.meta', -- Not Required
+}
+
+data_file 'HANDLING_FILE' 'handling.meta'
+data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
+data_file 'CARCOLS_FILE' 'carcols.meta'
+data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
+data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta' -- Not Required
+
+
+client_script {
+ 'vehicle_names.lua' -- Not Required
+}
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q60pbs/carcols.meta b/resources/[EGRP-CarPacks]/q60pbs/carcols.meta
new file mode 100644
index 000000000..5f5b48e04
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/carcols.meta
@@ -0,0 +1,421 @@
+
+
+
+
+ -
+ 5043_monkeyaddon_modkit
+
+ MKT_SPECIAL
+
+
+
+
-
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_ENGINE
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_BRAKES
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_GEARBOX
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+
+
+
+
+ VMT_ARMOUR
+
+ -
+ HORN_TRUCK
+
+
+
+ VMT_HORN
+
+ -
+ HORN_COP
+
+
+
+ VMT_HORN
+
+ -
+ HORN_CLOWN
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_1
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_2
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_3
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_4
+
+
+
+ VMT_HORN
+
+ -
+ HORN_MUSICAL_5
+
+
+
+ VMT_HORN
+
+ -
+ HORN_SAD_TROMBONE
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_1
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_2
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_3
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_4
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_5
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_6
+
+
+
+ VMT_HORN
+
+ -
+ MUSICAL_HORN_BUSINESS_7
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_C0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_D0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_E0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_F0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_G0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_A0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_B0
+
+
+
+ VMT_HORN
+
+ -
+ DLC_BUSI2_C_MAJOR_NOTES_C1
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+ HIPSTER_HORN_4
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+ INDEP_HORN_4
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_1
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_2
+
+
+
+ VMT_HORN
+
+ -
+ LUXE_HORN_3
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXORY_HORN_1
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXURY_HORN_2
+
+
+
+ VMT_HORN
+
+
+ -
+ LUXURY_HORN_3
+
+
+
+ VMT_HORN
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+ -
+
+
+
+
+ VMT_SUSPENSION
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q60pbs/carvariations.meta b/resources/[EGRP-CarPacks]/q60pbs/carvariations.meta
new file mode 100644
index 000000000..6b9af8cac
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/carvariations.meta
@@ -0,0 +1,56 @@
+
+
+
+
+ -
+ q60pbs
+
+
-
+
+ 0
+ 0
+ 0
+ 156
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 5043_monkeyaddon_modkit
+
+
+
+
+ -
+ Standard White
+
+
+ -
+ White Plate 2
+
+
+ -
+ Blue Plate
+
+
+ -
+ Yellow Plate
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q60pbs/dlctext.meta b/resources/[EGRP-CarPacks]/q60pbs/dlctext.meta
new file mode 100644
index 000000000..b24c4f58a
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/dlctext.meta
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/resources/[EGRP-CarPacks]/q60pbs/handling.meta b/resources/[EGRP-CarPacks]/q60pbs/handling.meta
new file mode 100644
index 000000000..91f542cdf
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/handling.meta
@@ -0,0 +1,66 @@
+
+
+
+ -
+ q60pbs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 400010
+ 0
+ 20
+ AVERAGE
+
+
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs.yft b/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs.yft
new file mode 100644
index 000000000..48dc276f7
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f2004b207b0b6f55acbc8b7ddb23a2b3fd1125df6231ee30ff8b5ac5456b629a
+size 6019078
diff --git a/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs.ytd b/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs.ytd
new file mode 100644
index 000000000..cce84a008
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:47da55c71c90ef0b10eba612c9d12484e4d7f8a647d57173fdf41d673e981f67
+size 8943124
diff --git a/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs_hi.yft b/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs_hi.yft
new file mode 100644
index 000000000..908705998
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/stream/q60pbs_hi.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:22682f33c676f4cf472ec11edf7a468c9903b6d430bbdd130c9f72528eb2f839
+size 6023923
diff --git a/resources/[EGRP-CarPacks]/q60pbs/vehicles.meta b/resources/[EGRP-CarPacks]/q60pbs/vehicles.meta
new file mode 100644
index 000000000..a7c30b105
--- /dev/null
+++ b/resources/[EGRP-CarPacks]/q60pbs/vehicles.meta
@@ -0,0 +1,122 @@
+
+
+ vehshare
+
+
+ -
+ q60pbs
+ q60pbs
+ q60pbs
+ Q60PBS
+ Q60PBS
+ null
+ null
+ null
+ null
+
+ null
+ ZION
+ LAYOUT_LOW
+ ZION_COVER_OFFSET_INFO
+ EXPLOSION_INFO_DEFAULT
+
+ DEFAULT_FOLLOW_VEHICLE_CAMERA
+ MID_BOX_VEHICLE_AIM_CAMERA
+ VEHICLE_BONNET_CAMERA_NEAR_HIGH
+ DEFAULT_POV_CAMERA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VFXVEHICLEINFO_CAR_GENERIC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 15.000000
+ 30.000000
+ 60.000000
+ 120.000000
+ 500.000000
+ 500.000000
+
+
+
+
+
+
+
+
+
+
+ SWANKNESS_3
+
+ FLAG_PARKING_SENSORS FLAG_RICH_CAR FLAG_AVERAGE_CAR FLAG_HAS_INTERIOR_EXTRAS
+ VEHICLE_TYPE_CAR
+ VPT_FRONT_AND_BACK_PLATES
+ VDT_SULTAN
+ VC_COUPE
+ VWT_SPORT
+
+
+
+
+
+
+
+
+
+
+
+
- WHEEL_FRONT_RIGHT_CAMERA
+ - WHEEL_FRONT_LEFT_CAMERA
+ - WHEEL_REAR_RIGHT_CAMERA
+ - WHEEL_REAR_LEFT_CAMERA
+
+
+
+
+
+
+ - LOW_ZION_FRONT_LEFT
+ - LOW_ZION_FRONT_RIGHT
+
+
+
+
+ -
+ vehicles_sultan_interior
+ q60pbs
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-Discord-Integration]/Discord-VehRestriction/config.lua b/resources/[EGRP-Discord-Integration]/Discord-VehRestriction/config.lua
index f38eba2ff..ff213fde1 100644
--- a/resources/[EGRP-Discord-Integration]/Discord-VehRestriction/config.lua
+++ b/resources/[EGRP-Discord-Integration]/Discord-VehRestriction/config.lua
@@ -22,6 +22,8 @@ Config.VehicleRestrictions = {
"23ramrb",
"23ssjam",
"23tahoeppvrb",
+ "25legacyrango1",
+ "KenworthK100",
"23tahoessvrb",
"903um",
"2019GMCSlick",
@@ -292,6 +294,8 @@ Config.VehicleRestrictions = {
"nxsmods21yukon",
"nxsmods22jeep",
"orsilvrr",
+ "25legacyrango1",
+ "KenworthK100",
"Polmrambb23",
"ram3500h",
"ram3500hrr",
@@ -430,6 +434,8 @@ Config.VehicleRestrictions = {
"AUSTINHP16",
"AUSTINHP17",
"AUSTINHP18",
+ "25legacyrango1",
+ "KenworthK100",
"AUSTINHP19",
"AUSTINHP20",
"AUSTINHP21",
@@ -614,6 +620,8 @@ Config.VehicleRestrictions = {
"AUSTINHP1",
"AUSTINHP2",
"AUSTINHP3",
+ "25legacyrango1",
+ "KenworthK100",
"AUSTINHP4",
"AUSTINHP5",
"AUSTINHP6",
@@ -646,6 +654,8 @@ Config.VehicleRestrictions = {
"CadesFord6.7",
"ccso1",
"ccso4",
+ "25legacyrango1",
+ "KenworthK100",
"Chevy18",
"chp15tahoeum",
"chp19tahoeum",
@@ -950,6 +960,8 @@ Config.VehicleRestrictions = {
"7728",
"202346gmc",
"a321cfm",
+ "25legacyrango1",
+ "KenworthK100",
"am_srt15",
"amrheli",
"as332",
@@ -1544,6 +1556,8 @@ Config.VehicleRestrictions = {
"PD23Suburban",
"sdgcvpi",
"seb2",
+ "25legacyrango1",
+ "KenworthK100",
"slick23tahoe",
"SMPDF150",
"swat1",
@@ -2137,6 +2151,8 @@ Config.VehicleRestrictions = {
"mxxraprb",
"chargfire",
"fedrange",
+ "25legacyrango1",
+ "KenworthK100",
"dhsgt350",
"Polmrambb23",
"c322prdurangok9",
@@ -2340,6 +2356,7 @@ Config.VehicleRestrictions = {
"as332",
"gripene",
"kamov",
+ "20legacyfpiu3",
"marineone",
"maverick2-newsmav",
"mh60t",
@@ -3202,6 +3219,8 @@ Config.VehicleRestrictions = {
"trailerlarge",
"dump",
"cutter",
+ "25legacyrango1",
+ "KenworthK100",
"bulldozer",
"zhaba",
"verus",
@@ -3570,6 +3589,7 @@ Config.VehicleRestrictions = {
"ctt55vv",
"dick",
"dill23tundra",
+ "20legacyfpiu3",
"domboss",
"Dylanm5",
"f350k9",
@@ -3927,6 +3947,8 @@ Config.VehicleRestrictions = {
"nxsmods21sierra",
"MAX2019zrr19",
"maxamg",
+ "25legacyrango1",
+ "KenworthK100",
"maxhurpd",
"maxm8",
"MAXMGTSPED",
@@ -4326,6 +4348,7 @@ Config.VehicleRestrictions = {
"GSD2024GenericTruckslicktop",
"1E32",
"1T87",
+ "20legacyfpiu3",
"lasd14tseb",
"lasd14tseb2",
"L101",
@@ -4368,6 +4391,7 @@ Config.VehicleRestrictions = {
['EG | Owner'] = {
"formula",
"formula2",
+ "20legacyfpiu3",
"openwheel1",
"openwheel2",
"tankercar",
@@ -4644,6 +4668,8 @@ Config.VehicleRestrictions = {
"AUSTINHP7",
"AUSTINHP8",
"AUSTINHP9",
+ "25legacyrango1",
+ "KenworthK100",
"AUSTINHP10",
"AUSTINHP11",
"AUSTINHP12",
diff --git a/resources/cd_holsteranimation/client.lua b/resources/cd_holsteranimation/client.lua
new file mode 100644
index 000000000..5e7a93a68
--- /dev/null
+++ b/resources/cd_holsteranimation/client.lua
@@ -0,0 +1,117 @@
+-- **DO NOT EDIT THIS**
+local holstered = true
+local blocked = false
+local lastWeapon = nil
+
+-- This is the only thing you should edit, this is where you edit the holsters to your servers EUP numbers.
+
+-- Guide:
+-- component = 7, Scarf/Chain slot in vMenu - **LEAVE IT AS 7, THERE IS NO NEED TO CHANGE THIS**
+-- holstered = 32, Gun Holstered
+-- unholstered = 31, Gun Removed
+-- holsterTex = 0 Texture 1 in vMenu
+-- unholsterTex = 1 Texture 2 in vMenu
+
+local holsters = {
+ hip1 = { component = 7, holstered = 17, holsterTex = 0, unholstered = 18, unholsterTex = 0 },
+ hip2 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+ hip3 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+-- hip4 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+-- hip5 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+-- hip6 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+
+ dropleg1 = { component = 7, holstered = 123, holsterTex = 0, unholstered = 123, unholsterTex = 0 },
+ dropleg2 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+ dropleg3 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+-- dropleg4 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+-- dropleg5 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+-- dropleg6 = { component = 7, holstered = 0, holsterTex = 0, unholstered = 0, unholsterTex = 0 },
+}
+
+local function GetWornHolster()
+ local ped = PlayerPedId()
+ local drawable = GetPedDrawableVariation(ped, 7)
+ local texture = GetPedTextureVariation(ped, 7)
+
+ for _, data in pairs(holsters) do
+ if (drawable == data.holstered and texture == data.holsterTex)
+ or (drawable == data.unholstered and texture == data.unholsterTex) then
+ return data
+ end
+ end
+end
+
+local function SetHolsterState(state)
+ local ped = PlayerPedId()
+ local holster = GetWornHolster()
+ if not holster then return end
+
+ if state then
+ SetPedComponentVariation(ped, holster.component, holster.holstered, holster.holsterTex, 2)
+ else
+ SetPedComponentVariation(ped, holster.component, holster.unholstered, holster.unholsterTex, 2)
+ end
+end
+
+local function IsHolsterWeapon(weapon)
+ for i = 1, #Config.Weapons do
+ if weapon == GetHashKey(Config.Weapons[i]) then
+ return true
+ end
+ end
+end
+
+local function playAnim(dict, anim)
+ RequestAnimDict(dict)
+ while not HasAnimDictLoaded(dict) do
+ Wait(0)
+ end
+ TaskPlayAnim(PlayerPedId(), dict, anim, 8.0, -8.0, 600, 48, 0, false, false, false)
+end
+
+Citizen.CreateThread(function()
+ while true do
+ Wait(100)
+
+ local ped = PlayerPedId()
+ local currentWeapon = GetSelectedPedWeapon(ped)
+
+ if blocked
+ and not IsEntityPlayingAnim(ped, "reaction@intimidation@cop@unarmed", "intro", 3)
+ and not IsEntityPlayingAnim(ped, "reaction@intimidation@cop@unarmed", "outro", 3) then
+ blocked = false
+ end
+
+ if currentWeapon ~= lastWeapon then
+ lastWeapon = currentWeapon
+
+ if IsHolsterWeapon(currentWeapon) and holstered then
+ blocked = true
+ holstered = false
+ playAnim("reaction@intimidation@cop@unarmed", "intro")
+ Wait(120)
+ SetHolsterState(false)
+ end
+
+ if not IsHolsterWeapon(currentWeapon) and not holstered then
+ blocked = true
+ holstered = true
+ playAnim("reaction@intimidation@cop@unarmed", "outro")
+ Wait(450)
+ SetHolsterState(true)
+ end
+ end
+ end
+end)
+
+Citizen.CreateThread(function()
+ while true do
+ Wait(0)
+ if blocked then
+ DisableControlAction(0, 24, true)
+ DisableControlAction(0, 25, true)
+ DisableControlAction(0, 37, true)
+ DisablePlayerFiring(PlayerPedId(), true)
+ end
+ end
+end)
\ No newline at end of file
diff --git a/resources/cd_holsteranimation/config.lua b/resources/cd_holsteranimation/config.lua
new file mode 100644
index 000000000..6dff12dc4
--- /dev/null
+++ b/resources/cd_holsteranimation/config.lua
@@ -0,0 +1,9 @@
+Config = {}
+Config.cooldown = 0
+
+-- Add/remove weapon hashes here to be added for holster checks.
+-- Make sure the same weapon configs are listed in the cd_holsteranimationsounds client.lua
+Config.Weapons = {
+ "WEAPON_COMBATPISTOL",
+ "WEAPON_PISTOL",
+}
\ No newline at end of file
diff --git a/resources/cd_holsteranimation/fxmanifest.lua b/resources/cd_holsteranimation/fxmanifest.lua
new file mode 100644
index 000000000..565596f2a
--- /dev/null
+++ b/resources/cd_holsteranimation/fxmanifest.lua
@@ -0,0 +1,13 @@
+fx_version 'cerulean'
+game 'gta5'
+
+author 'ChapterDonut'
+description 'EUP Gun Holster Animation Script with Sounds made by ChapterDonut'
+version '1.0.0'
+
+client_scripts {
+ 'config.lua',
+ 'client.lua'
+}
+
+-- Made by ChapterDonut - https://www.chapterdonut.com/ → https://discord.gg/YE77ZCMJHj
\ No newline at end of file
diff --git a/resources/cd_holsteranimationsounds/__resource.lua b/resources/cd_holsteranimationsounds/__resource.lua
new file mode 100644
index 000000000..7e15c7580
--- /dev/null
+++ b/resources/cd_holsteranimationsounds/__resource.lua
@@ -0,0 +1,18 @@
+resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937'
+
+shared_script 'config.lua'
+
+client_scripts {
+ 'client.lua'
+}
+
+ui_page 'html/ui.html'
+
+files {
+ 'html/app.js',
+ 'html/ui.html',
+ 'html/sounds/holster.ogg',
+ 'html/sounds/unholster.ogg'
+}
+
+-- Made by ChapterDonut - https://www.chapterdonut.com/ → https://discord.gg/YE77ZCMJHj
\ No newline at end of file
diff --git a/resources/cd_holsteranimationsounds/client.lua b/resources/cd_holsteranimationsounds/client.lua
new file mode 100644
index 000000000..161e2d190
--- /dev/null
+++ b/resources/cd_holsteranimationsounds/client.lua
@@ -0,0 +1,41 @@
+local holstered = true
+
+local function IsConfiguredWeapon(weapon)
+ for i = 1, #Config.Weapons do
+ if weapon == GetHashKey(Config.Weapons[i]) then
+ return true
+ end
+ end
+ return false
+end
+
+Citizen.CreateThread(function()
+ local lastWeapon = nil
+
+ while true do
+ Citizen.Wait(100)
+ local ped = PlayerPedId()
+ if DoesEntityExist(ped) and not IsEntityDead(ped) and not IsPedInAnyVehicle(ped, true) then
+ local currentWeapon = GetSelectedPedWeapon(ped)
+ if currentWeapon ~= lastWeapon then
+ if IsConfiguredWeapon(currentWeapon) and holstered then
+ TriggerEvent("holster:sounds", "unholster", 0.2)
+ holstered = false
+ end
+ if IsConfiguredWeapon(lastWeapon) and not IsConfiguredWeapon(currentWeapon) then
+ TriggerEvent("holster:sounds", "holster", 0.2)
+ holstered = true
+ end
+ lastWeapon = currentWeapon
+ end
+ end
+ end
+end)
+
+AddEventHandler('holster:sounds', function(soundFile, soundVolume)
+ SendNUIMessage({
+ transactionType = 'playSound',
+ transactionFile = soundFile,
+ transactionVolume = soundVolume
+ })
+end)
\ No newline at end of file
diff --git a/resources/cd_holsteranimationsounds/config.lua b/resources/cd_holsteranimationsounds/config.lua
new file mode 100644
index 000000000..e6840406b
--- /dev/null
+++ b/resources/cd_holsteranimationsounds/config.lua
@@ -0,0 +1,9 @@
+Config = {}
+Config.cooldown = 0
+
+-- Add/remove weapon hashes here to be added for holster checks.
+-- Make sure the same weapon configs are listed in the cd_holsteranimation client.lua
+Config.Weapons = {
+ "WEAPON_COMBATPISTOL",
+ "WEAPON_PISTOL",
+}
\ No newline at end of file
diff --git a/resources/cd_holsteranimationsounds/html/app.js b/resources/cd_holsteranimationsounds/html/app.js
new file mode 100644
index 000000000..dc74cfd41
--- /dev/null
+++ b/resources/cd_holsteranimationsounds/html/app.js
@@ -0,0 +1,17 @@
+window.addEventListener('message', function(e) {
+ $("#container").stop(false, true);
+ if (e.data.displayWindow == 'true') {
+ $("#container").css('display', 'flex');
+ $("#container").animate({
+ bottom: "25%",
+ opacity: "1.0"
+ }, 700);
+ } else {
+ $("#container").animate({
+ bottom: "-50%",
+ opacity: "0.0"
+ }, 700, function() {
+ $("#container").css('display', 'none');
+ });
+ }
+});
\ No newline at end of file
diff --git a/resources/cd_holsteranimationsounds/html/sounds/holster.ogg b/resources/cd_holsteranimationsounds/html/sounds/holster.ogg
new file mode 100644
index 000000000..6c65042b3
Binary files /dev/null and b/resources/cd_holsteranimationsounds/html/sounds/holster.ogg differ
diff --git a/resources/cd_holsteranimationsounds/html/sounds/unholster.ogg b/resources/cd_holsteranimationsounds/html/sounds/unholster.ogg
new file mode 100644
index 000000000..e9f7b69eb
Binary files /dev/null and b/resources/cd_holsteranimationsounds/html/sounds/unholster.ogg differ
diff --git a/resources/cd_holsteranimationsounds/html/ui.html b/resources/cd_holsteranimationsounds/html/ui.html
new file mode 100644
index 000000000..4da963676
--- /dev/null
+++ b/resources/cd_holsteranimationsounds/html/ui.html
@@ -0,0 +1,26 @@
+
+
+
+
+ Holster
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/f550ambow/TEMPLATES AND EXTRAS/README!!!!!!.txt b/resources/f550ambow/TEMPLATES AND EXTRAS/README!!!!!!.txt
deleted file mode 100644
index 125d01bf4..000000000
--- a/resources/f550ambow/TEMPLATES AND EXTRAS/README!!!!!!.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Thank you for your purchase of one or more of our ambulances.
-
-These come with low power park pattern and dvi, which requires you once you change the light template, to export a seperate one at 25% opacity and replace the "_25" named one in the ytd with it for the proper color on cruise mode.
\ No newline at end of file
diff --git a/resources/f550ambow/TEMPLATES AND EXTRAS/braun_sign_1.png b/resources/f550ambow/TEMPLATES AND EXTRAS/braun_sign_1.png
deleted file mode 100644
index 12fea0724..000000000
Binary files a/resources/f550ambow/TEMPLATES AND EXTRAS/braun_sign_1.png and /dev/null differ
diff --git a/resources/f550ambow/TEMPLATES AND EXTRAS/f550ambofs_lighttemp.png b/resources/f550ambow/TEMPLATES AND EXTRAS/f550ambofs_lighttemp.png
deleted file mode 100644
index 7404645b7..000000000
Binary files a/resources/f550ambow/TEMPLATES AND EXTRAS/f550ambofs_lighttemp.png and /dev/null differ
diff --git a/resources/f550ambow/stream/f550ambow+hi.ytd b/resources/f550ambow/stream/f550ambow+hi.ytd
index 995793ffb..17d6f1be7 100644
--- a/resources/f550ambow/stream/f550ambow+hi.ytd
+++ b/resources/f550ambow/stream/f550ambow+hi.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e5715361b4e9692ae56b313d2c725b2611a8640d97e3b0dd7eb72e473176b0e6
-size 5177158
+oid sha256:c25e91cc1e6bc25aad2ee19c6a0f348f90c2b648916afa429c3f61c9a852ff5f
+size 5332230
diff --git a/resources/f550ambow/stream/f550ambow.ytd b/resources/f550ambow/stream/f550ambow.ytd
index 7f8a99a93..10fa2081e 100644
--- a/resources/f550ambow/stream/f550ambow.ytd
+++ b/resources/f550ambow/stream/f550ambow.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:796eb6a291975589c316895a10a8c7e44cdfd80f11018a8a5cd443a9c760bdf3
-size 5529848
+oid sha256:e5f9cbe543a16a36367f83c586df9941142651053fdeaa354c8b218b94075e65
+size 5678165
diff --git a/resources/f550ambows/TEMPLATES AND EXTRAS/README!!!!!!.txt b/resources/f550ambows/TEMPLATES AND EXTRAS/README!!!!!!.txt
deleted file mode 100644
index 125d01bf4..000000000
--- a/resources/f550ambows/TEMPLATES AND EXTRAS/README!!!!!!.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Thank you for your purchase of one or more of our ambulances.
-
-These come with low power park pattern and dvi, which requires you once you change the light template, to export a seperate one at 25% opacity and replace the "_25" named one in the ytd with it for the proper color on cruise mode.
\ No newline at end of file
diff --git a/resources/f550ambows/TEMPLATES AND EXTRAS/braun_sign_1.png b/resources/f550ambows/TEMPLATES AND EXTRAS/braun_sign_1.png
deleted file mode 100644
index 12fea0724..000000000
Binary files a/resources/f550ambows/TEMPLATES AND EXTRAS/braun_sign_1.png and /dev/null differ
diff --git a/resources/f550ambows/TEMPLATES AND EXTRAS/f550ambofs_lighttemp.png b/resources/f550ambows/TEMPLATES AND EXTRAS/f550ambofs_lighttemp.png
deleted file mode 100644
index 7404645b7..000000000
Binary files a/resources/f550ambows/TEMPLATES AND EXTRAS/f550ambofs_lighttemp.png and /dev/null differ
diff --git a/resources/f550ambows/stream/f550ambows+hi.ytd b/resources/f550ambows/stream/f550ambows+hi.ytd
index 1a1b5e6eb..1d77fb519 100644
--- a/resources/f550ambows/stream/f550ambows+hi.ytd
+++ b/resources/f550ambows/stream/f550ambows+hi.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d03599bc53ce27d85c548dd99a6189448675733a17f299a0641b932ae32ac240
-size 5588826
+oid sha256:aa1a1d49a5669afe00ca1c4b7f917510943e165860eb6452595c8f1ffa7a3d64
+size 5343279
diff --git a/resources/f550ambows/stream/f550ambows.ytd b/resources/f550ambows/stream/f550ambows.ytd
index 1aae747e8..aa4f3b696 100644
--- a/resources/f550ambows/stream/f550ambows.ytd
+++ b/resources/f550ambows/stream/f550ambows.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3735a58d4417f38a9ef3317d80ab5eda2da8d8380b4960abcbb09dd227e32d66
-size 5634518
+oid sha256:8ab36d72680479028d24f15c5e99494719b04d6982c97120f6768078bf2d68ac
+size 5691091
diff --git a/resources/holster/__resource.lua b/resources/holster/__resource.lua
deleted file mode 100644
index dbf7a9455..000000000
--- a/resources/holster/__resource.lua
+++ /dev/null
@@ -1 +0,0 @@
-client_script "client.lua"
diff --git a/resources/holster/client.lua b/resources/holster/client.lua
deleted file mode 100644
index 8b82c69b9..000000000
--- a/resources/holster/client.lua
+++ /dev/null
@@ -1,95 +0,0 @@
--- Created by Deziel0495 and IllusiveTea --
-
--- NOTICE
--- This script is licensed under "No License". https://choosealicense.com/no-license/
--- You are allowed to: Download, Use and Edit the Script.
--- You are not allowed to: Copy, re-release, re-distribute it without our written permission.
-
---- DO NOT EDIT THIS
-local holstered = true
-
--- RESTRICTED PEDS --
--- I've only listed peds that have a remote speaker mic, but any ped listed here will do the animations.
-local skins = {
- "mp_f_freemode_01",
- "mp_m_freemode_01",
- "copx2",
- "markocop",
-}
-
--- Add/remove weapon hashes here to be added for holster checks.
-local weapons = {
- "WEAPON_COMBATPISTOL",
- "WEAPON_PISTOL",
- "WEAPON_PISTOL_MK2",
- "WEAPON_SIG",
- "WEAPON_G17",
- "WEAPON_GLOCK19X",
- "WEAPON_GLOCK19X2",
- "WEAPON_M1911A",
-}
-
--- HOLSTER/UNHOLSTER PISTOL --
-
- Citizen.CreateThread(function()
- while true do
- Citizen.Wait(0)
- local ped = PlayerPedId()
- if DoesEntityExist( ped ) and not IsEntityDead( ped ) and not IsPedInAnyVehicle(PlayerPedId(), true) and CheckSkin(ped) then
- loadAnimDict( "rcmjosh4" )
- loadAnimDict( "weapons@pistol@" )
- if CheckWeapon(ped) then
- if holstered then
- TaskPlayAnim(ped, "rcmjosh4", "josh_leadout_cop2", 8.0, 2.0, -1, 48, 10, 0, 0, 0 )
- Citizen.Wait(130)
- ClearPedTasks(ped)
- holstered = false
- end
- --SetPedComponentVariation(ped, 9, 0, 0, 0)
- elseif not CheckWeapon(ped) then
- if not holstered then
- TaskPlayAnim(ped, "weapons@pistol@", "aim_2_holster", 8.0, 2.0, -1, 48, 10, 0, 0, 0 )
- Citizen.Wait(500)
- ClearPedTasks(ped)
- holstered = true
- end
- --SetPedComponentVariation(ped, 9, 1, 0, 0)
- end
- end
- end
-end)
-
--- DO NOT REMOVE THESE! --
-
-function CheckSkin(ped)
- for i = 1, #skins do
- if GetHashKey(skins[i]) == GetEntityModel(ped) then
- return true
- end
- end
- return false
-end
-
-function CheckWeapon(ped)
- for i = 1, #weapons do
- if GetHashKey(weapons[i]) == GetSelectedPedWeapon(ped) then
- return true
- end
- end
- return false
-end
-
-function DisableActions(ped)
- DisableControlAction(1, 140, true)
- DisableControlAction(1, 141, true)
- DisableControlAction(1, 142, true)
- DisableControlAction(1, 37, true) -- Disables INPUT_SELECT_WEAPON (TAB)
- DisablePlayerFiring(ped, true) -- Disable weapon firing
-end
-
-function loadAnimDict( dict )
- while ( not HasAnimDictLoaded( dict ) ) do
- RequestAnimDict( dict )
- Citizen.Wait( 0 )
- end
-end
diff --git a/resources/holstersounds/__resource.lua b/resources/holstersounds/__resource.lua
deleted file mode 100644
index 83011c0fa..000000000
--- a/resources/holstersounds/__resource.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937'
-
-client_scripts {
- 'config.lua',
- 'client.lua'
-
-}
-
-ui_page 'html/ui.html'
-
-files {
- 'html/app.js',
- 'html/ui.html',
- 'html/sounds/*.ogg'
-}
\ No newline at end of file
diff --git a/resources/holstersounds/client.lua b/resources/holstersounds/client.lua
deleted file mode 100644
index de11a9c1b..000000000
--- a/resources/holstersounds/client.lua
+++ /dev/null
@@ -1,141 +0,0 @@
-local default_weapon = GetHashKey(data.weapon)
-local active = false
-local ped = nil -- Cache the ped
-local currentPedData = nil
-local holstered = true
-local skins = {
- "mp_m_freemode_01",
- "mp_f_freemode_01",
-}
-local weapons = {
- "WEAPON_COMBATPISTOL",
- "WEAPON_HEAVYPISTOL",
-}
-
--- anims
-
-Citizen.CreateThread(function()
- while true do
- Citizen.Wait(0)
- local ped = PlayerPedId()
- if DoesEntityExist( ped ) and not IsEntityDead( ped ) and not IsPedInAnyVehicle(PlayerPedId(), true) and CheckSkin(ped) then
- loadAnimDict( "rcmjosh4" )
- loadAnimDict( "weapons@pistol@" )
- if CheckWeapon(ped) then
- if holstered then
- TriggerEvent("holster:sounds", "unholster", 0.2)
- TaskPlayAnim(ped, "rcmjosh4", "josh_leadout_cop2", 0.0, 2.0, 1, 16, 32, 0, 0, 0 )
- Citizen.Wait(600)
- ClearPedTasks(ped)
- holstered = false
- end
- elseif not CheckWeapon(ped) then
- if not holstered then
- TriggerEvent("holster:sounds", "holster", 0.2)
- TaskPlayAnim(ped, "weapons@pistol@", "aim_2_holster", 2.0, 2.0, -1, 48, 10, 0, 0, 0 )
- Citizen.Wait(500)
- ClearPedTasks(ped)
- holstered = true
- end
- end
- end
- end
-end)
-
--- functions
-
-function table_invert(t)
- local s={}
- for k,v in pairs(t) do
- s[v]=k
- end
- return s
-end
-
-function CheckSkin(ped)
- for i = 1, #skins do
- if GetHashKey(skins[i]) == GetEntityModel(ped) then
- return true
- end
- end
- return false
-end
-
-function CheckWeapon(ped)
- for i = 1, #weapons do
- if GetHashKey(weapons[i]) == GetSelectedPedWeapon(ped) then
- return true
- end
- end
- return false
-end
-
-function DisableActions(ped)
- DisableControlAction(1, 37, true)
- DisablePlayerFiring(ped, true)
-end
-
-function loadAnimDict( dict )
- while ( not HasAnimDictLoaded( dict ) ) do
- RequestAnimDict( dict )
- Citizen.Wait( 0 )
- end
-end
-
-Citizen.CreateThread(function()
- while true do
- ped = GetPlayerPed(-1)
- local ped_hash = GetEntityModel(ped)
- local enable = false
- for ped, data in pairs(data.peds) do
- if GetHashKey(ped) == ped_hash then
- enable = true
- if data.enabled ~= nil then
- enable = data.enabled
- end
- currentPedData = data
- break
- end
- end
- active = enable
- Citizen.Wait(5000)
- end
-end)
-
-local last_weapon = nil
-Citizen.CreateThread(function()
- while true do
- if active then
- current_weapon = GetSelectedPedWeapon(ped)
- if current_weapon ~= last_weapon then
-
- for component, holsters in pairs(currentPedData.components) do
- local holsterDrawable = GetPedDrawableVariation(ped, component)
- local holsterTexture = GetPedTextureVariation(ped, component)
-
- local emptyHolster = holsters[holsterDrawable]
- if emptyHolster and current_weapon == default_weapon then
- SetPedComponentVariation(ped, component, emptyHolster, holsterTexture, 0)
- break
- end
-
- local filledHolster = table_invert(holsters)[holsterDrawable]
- if filledHolster and current_weapon ~= default_weapon and last_weapon == default_weapon then
- SetPedComponentVariation(ped, component, filledHolster, holsterTexture, 0)
- break
- end
- end
- end
- last_weapon = current_weapon
- end
- Citizen.Wait(200)
- end
-end)
-
-AddEventHandler('holster:sounds', function(soundFile, soundVolume)
- SendNUIMessage({
- transactionType = 'playSound',
- transactionFile = soundFile,
- transactionVolume = soundVolume
- })
-end)
\ No newline at end of file
diff --git a/resources/holstersounds/config.lua b/resources/holstersounds/config.lua
deleted file mode 100644
index 0cad5afbb..000000000
--- a/resources/holstersounds/config.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-data = {
- ["weapon"] = "WEAPON_COMBATPISTOL", "WEAPON_PISTOL", -- The weapon you must have to trigger the animation
- ["peds"] = {
- ["mp_m_freemode_01"] = {
- ["components"] = {
- [7] = {
- [1] = 3,
- [6] = 5,
- [8] = 2,
- [42] = 43,
- [110] = 111,
- [119] = 120
- },
- [8] = {
- [16] = 18
- }
- }
- },
- ["mp_f_freemode_01"] = {
- ["components"] = {
- [7] = {
- [1] = 3,
- [6] = 5,
- [8] = 2,
- [29] = 30,
- [81] = 82
- },
- [8] = {
- [9] = 10
- }
- }
- },
- }
-}
\ No newline at end of file
diff --git a/resources/holstersounds/html/Vist-LauncherLeaks.com.txt b/resources/holstersounds/html/Vist-LauncherLeaks.com.txt
deleted file mode 100644
index e69de29bb..000000000
diff --git a/resources/holstersounds/html/app.js b/resources/holstersounds/html/app.js
deleted file mode 100644
index 1702342bc..000000000
--- a/resources/holstersounds/html/app.js
+++ /dev/null
@@ -1,26 +0,0 @@
-
-window.addEventListener('message', function(e) {
- $("#container").stop(false, true);
- if (e.data.displayWindow == 'true') {
- $("#container").css('display', 'flex');
-
- $("#container").animate({
- bottom: "25%",
- opacity: "1.0"
- },
- 700, function() {
-
- });
-
- } else {
- $("#container").animate({
- bottom: "-50%",
- opacity: "0.0"
- },
- 700, function() {
- $("#container").css('display', 'none');
-
- });
- }
-});
-
diff --git a/resources/holstersounds/html/sounds/holster.ogg b/resources/holstersounds/html/sounds/holster.ogg
deleted file mode 100644
index 83d5dc147..000000000
Binary files a/resources/holstersounds/html/sounds/holster.ogg and /dev/null differ
diff --git a/resources/holstersounds/html/sounds/unholster.ogg b/resources/holstersounds/html/sounds/unholster.ogg
deleted file mode 100644
index 444984f60..000000000
Binary files a/resources/holstersounds/html/sounds/unholster.ogg and /dev/null differ
diff --git a/resources/holstersounds/html/ui.html b/resources/holstersounds/html/ui.html
deleted file mode 100644
index 6f450231e..000000000
--- a/resources/holstersounds/html/ui.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
- Holster
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/resources/lvc/SIRENS.lua b/resources/lvc/SIRENS.lua
index e5fcb63cd..63abaf1ab 100644
--- a/resources/lvc/SIRENS.lua
+++ b/resources/lvc/SIRENS.lua
@@ -46,6 +46,7 @@ RequestScriptAudioBank('DLC_SERVERSIDEAUDIO\\OISS_SSA_VEHAUD_LSSD_OLD', false)
RequestScriptAudioBank('DLC_SERVERSIDEAUDIO\\OISS_SSA_VEHAUD_SAHP_OLD', false)
RequestScriptAudioBank('DLC_SERVERSIDEAUDIO\\OISS_SSA_VEHAUD_LSFD_OLD', false)
RequestScriptAudioBank('DLC_SERVERSIDEAUDIO\\OISS_SSA_VEHAUD_RHPD_OLD', false)
+RequestScriptAudioBank('DLC_SERVERSIDEAUDIO\\OISS_SSA_VEHAUD_NOOSE_NEW', false)
-- CHANGE SIREN NAMES, AUDIONAME, AUDIOREF
@@ -133,7 +134,12 @@ SIRENS = {
--[[75]] { Name = 'Q Yelp', String = 'LAFD2_CHARLIE', Ref = 'LAFD2_SOUNDSET' },
--[[76]] { Name = 'WAIL', String = 'LAFD2_DELTA', Ref = 'LAFD2_SOUNDSET' },
-
+--[[78]] { Name = 'funny-horn', String = 'OISS_SSA_VEHAUD_NOOSE_NEW_HORN', Ref = 'OISS_SSA_VEHAUD_NOOSE_NEW_SOUNDSET'},
+--[[79]] { Name = 'funny-adam', String = 'OISS_SSA_VEHAUD_NOOSE_NEW_SIREN_ADAM', Ref = 'OISS_SSA_VEHAUD_NOOSE_NEW_SOUNDSET'},
+--[[80]] { Name = 'funny-boy', String = 'OISS_SSA_VEHAUD_NOOSE_NEW_SIREN_BOY', Ref = 'OISS_SSA_VEHAUD_NOOSE_NEW_SOUNDSET'},
+--[[81]] { Name = 'funny-charles', String = 'OISS_SSA_VEHAUD_NOOSE_NEW_SIREN_CHARLES', Ref = 'OISS_SSA_VEHAUD_NOOSE_NEW_SOUNDSET'},
+--[[82]] { Name = 'funny-david', String = 'OISS_SSA_VEHAUD_NOOSE_NEW_SIREN_DAVID', Ref = 'OISS_SSA_VEHAUD_NOOSE_NEW_SOUNDSET'},
+--[[83]] { Name = 'funny-edward', String = 'OISS_SSA_VEHAUD_NOOSE_NEW_SIREN_EDWARD', Ref = 'OISS_SSA_VEHAUD_NOOSE_NEW_SOUNDSET'},
@@ -314,11 +320,11 @@ SIREN_ASSIGNMENTS = {
['SH8172'] = { 18, 19, 20},
['lasd1997'] = { 18, 19, 20},
['lasd1997amber'] = { 18, 19, 20},
- ['Maxlasd18charger'] = { 18, 19, 20, 36, 34, 37 },
+ ['Maxlasd18charger'] = { 18, 19, 20, 64, 65, 80 },
['senorapd18fpiu_817'] = { 18, 19, 20},
['transportram'] = { 18, 19, 20},
- [' '] = { 18, 19, 20},
+ ['20legacyfpiu3'] = { 78, 79, 80, 81, 82, 83 },
[' '] = { 18, 19, 20},
@@ -337,7 +343,7 @@ SIREN_ASSIGNMENTS = {
['lasd2003'] = { 18, 19, 20},
['lasdchrg14'] = { 18, 19, 20},
['lasd18chrg'] = { 18, 19, 20},
- ['lasd25fpiu'] = { 18, 19, 20},
+ ['lasd25fpiu'] = { 78, 64, 65, 79, 80 },
['lasd16asap'] = { 18, 19, 20},
['lasd16asapb'] = { 18, 19, 20},
['lasd16asapc'] = { 18, 19, 20},
@@ -505,7 +511,7 @@ SIREN_ASSIGNMENTS = {
['lasdtahoe3'] = { 18, 19, 20},
['lasdtahoe4'] = { 18, 19, 20},
['lasdtaurus'] = { 18, 19, 20},
- ['sebtahoe'] = { 18, 19, 20},
+ ['sebtahoe'] = { 18, 64, 65},
['24tactrd'] = { 18, 19, 20},
['22silv2visor'] = { 18, 19, 20},
['22silv2'] = { 18, 19, 20},
diff --git a/resources/ox_target-main/.github/actions/bump-manifest-version.js b/resources/ox_target-main/.github/actions/bump-manifest-version.js
new file mode 100644
index 000000000..5fe3462c5
--- /dev/null
+++ b/resources/ox_target-main/.github/actions/bump-manifest-version.js
@@ -0,0 +1,10 @@
+const fs = require('fs');
+
+const version = process.env.TGT_RELEASE_VERSION;
+const newVersion = version.replace('v', '');
+
+const manifestFile = fs.readFileSync('fxmanifest.lua', { encoding: 'utf8' });
+
+const newFileContent = manifestFile.replace(/\bversion\s+(.*)$/gm, `version '${newVersion}'`);
+
+fs.writeFileSync('fxmanifest.lua', newFileContent);
diff --git a/resources/ox_target-main/.github/workflows/create-release.yml b/resources/ox_target-main/.github/workflows/create-release.yml
new file mode 100644
index 000000000..43c9a88e3
--- /dev/null
+++ b/resources/ox_target-main/.github/workflows/create-release.yml
@@ -0,0 +1,60 @@
+name: Create release
+
+on:
+ push:
+ tags:
+ - 'v*.*.*'
+
+jobs:
+ create-release:
+ name: Package and Create Tagged Release
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Install archive tools
+ run: sudo apt install zip
+
+ - name: Checkout source code
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+ ref: ${{ github.event.repository.default_branch }}
+
+ - name: Bump manifest version
+ run: node .github/actions/bump-manifest-version.js
+ env:
+ TGT_RELEASE_VERSION: ${{ github.ref_name }}
+
+ - name: Push manifest change
+ uses: EndBug/add-and-commit@v8
+ with:
+ add: fxmanifest.lua
+ push: true
+ author_name: Manifest Bumper
+ author_email: 41898282+github-actions[bot]@users.noreply.github.com
+ message: 'chore: bump manifest version to ${{ github.ref_name }}'
+
+ - name: Update tag ref
+ uses: EndBug/latest-tag@latest
+ with:
+ tag-name: ${{ github.ref_name }}
+
+ - name: Bundle files
+ run: |
+ mkdir -p ./temp/ox_target
+ cp ./{LICENSE,README.md,fxmanifest.lua} ./temp/ox_target
+ cp -r ./{client,server,web,locales} ./temp/ox_target
+ cd ./temp && zip -r ../ox_target.zip ./ox_target
+
+ - name: Create Release
+ uses: 'marvinpinto/action-automatic-releases@v1.2.1'
+ id: auto_release
+ with:
+ repo_token: '${{ secrets.GITHUB_TOKEN }}'
+ title: '${{ env.RELEASE_VERSION }}'
+ prerelease: false
+ files: ox_target.zip
+
+ env:
+ CI: false
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/resources/ox_target-main/LICENSE b/resources/ox_target-main/LICENSE
new file mode 100644
index 000000000..de00fd245
--- /dev/null
+++ b/resources/ox_target-main/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Overextended
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/resources/ox_target-main/README.md b/resources/ox_target-main/README.md
new file mode 100644
index 000000000..f5019b9e7
--- /dev/null
+++ b/resources/ox_target-main/README.md
@@ -0,0 +1,30 @@
+# ox_target
+
+
+
+
+
+
+
+A performant and flexible standalone "third-eye" targeting resource, with additional functionality for supported frameworks.
+
+ox_target is the successor to qtarget, which was a mostly-compatible fork of bt-target.
+To improve many design flaws, ox_target has been written from scratch and drops support for bt-target/qtarget standards, though partial compatibility is being implemented where possible.
+
+
+## 📚 Documentation
+
+https://overextended.dev/ox_target
+
+## 💾 Download
+
+https://github.com/overextended/ox_target/releases/latest/download/ox_target.zip
+
+## ✨ Features
+
+- Improved entity and world collision than its predecessor.
+- Improved error handling when running external code.
+- Menus for nested target options.
+- Partial compatibility for qtarget (the thing qb-target is based on, I made the original idiots).
+- Registering options no longer overrides existing options.
+- Groups and items checking for supported frameworks.
diff --git a/resources/ox_target-main/client/api.lua b/resources/ox_target-main/client/api.lua
new file mode 100644
index 000000000..ab8eeb00b
--- /dev/null
+++ b/resources/ox_target-main/client/api.lua
@@ -0,0 +1,528 @@
+---@class OxTargetOption
+---@field resource? string
+
+local utils = require 'client.utils'
+
+local api = setmetatable({}, {
+ __newindex = function(self, index, value)
+ rawset(self, index, value)
+ exports(index, value)
+ end
+})
+
+---Throws a formatted type error
+---@param variable string
+---@param expected string
+---@param received string
+local function typeError(variable, expected, received)
+ error(("expected %s to have type '%s' (received %s)"):format(variable, expected, received))
+end
+
+---Checks options and throws an error on type mismatch
+---@param options OxTargetOption | OxTargetOption[]
+---@return OxTargetOption[]
+local function checkOptions(options)
+ local optionsType = type(options)
+
+ if optionsType ~= 'table' then
+ typeError('options', 'table', optionsType)
+ end
+
+ local tableType = table.type(options)
+
+ if tableType == 'hash' and options.label then
+ options = { options }
+ elseif tableType ~= 'array' then
+ typeError('options', 'array', ('%s table'):format(tableType))
+ end
+
+ return options
+end
+
+---@param data OxTargetPolyZone | table
+---@return number
+function api.addPolyZone(data)
+ if data.debug then utils.warn('Creating new PolyZone with debug enabled.') end
+
+ data.resource = GetInvokingResource()
+ data.options = checkOptions(data.options)
+ return lib.zones.poly(data).id
+end
+
+---@param data OxTargetBoxZone | table
+---@return number
+function api.addBoxZone(data)
+ if data.debug then utils.warn('Creating new BoxZone with debug enabled.') end
+
+ data.resource = GetInvokingResource()
+ data.options = checkOptions(data.options)
+ return lib.zones.box(data).id
+end
+
+---@param data OxTargetSphereZone | table
+---@return number
+function api.addSphereZone(data)
+ if data.debug then utils.warn('Creating new SphereZone with debug enabled.') end
+
+ data.resource = GetInvokingResource()
+ data.options = checkOptions(data.options)
+ return lib.zones.sphere(data).id
+end
+
+---@param id number | string The ID of the zone to check. It can be either a number or a string representing the zone's index or name, respectively.
+---@return boolean returns true if the zone with the specified ID exists, otherwise false.
+function api.zoneExists(id)
+ if not Zones or (type(id) ~= 'number' and type(id) ~= 'string') then return false end
+
+ if type(id) == 'number' and Zones[id] then return true end
+
+ for _, zone in pairs(lib.zones.getAllZones()) do
+ if type(id) == 'string' and zone.name == id then return true end
+ end
+
+ return false
+end
+
+---@param id number | string
+---@param suppressWarning boolean?
+function api.removeZone(id, suppressWarning)
+ if Zones then
+ if type(id) == 'string' then
+ local foundZone
+
+ for _, v in pairs(lib.zones.getAllZones()) do
+ if v.name == id then
+ foundZone = true
+ v:remove()
+ end
+ end
+
+ if foundZone then return end
+ elseif Zones[id] then
+ return Zones[id]:remove()
+ end
+ end
+
+ if suppressWarning then return end
+
+ warn(('attempted to remove a zone that does not exist (id: %s)'):format(id))
+end
+
+---@param target table
+---@param remove string | string[]
+---@param resource string
+---@param showWarning? boolean
+local function removeTarget(target, remove, resource, showWarning)
+ if type(remove) ~= 'table' then remove = { remove } end
+
+ for i = #target, 1, -1 do
+ local option = target[i]
+
+ if option.resource == resource then
+ for j = #remove, 1, -1 do
+ if option.name == remove[j] then
+ table.remove(target, i)
+
+ if showWarning then
+ utils.warn(("Replacing existing target option '%s'."):format(option.name))
+ end
+ end
+ end
+ end
+ end
+end
+
+---@param target table
+---@param options OxTargetOption | OxTargetOption[]
+---@param resource string
+local function addTarget(target, options, resource)
+ options = checkOptions(options)
+
+ local checkNames = {}
+
+ resource = resource or 'ox_target'
+
+ for i = 1, #options do
+ local option = options[i]
+ option.resource = resource
+
+ if option.name then
+ checkNames[#checkNames + 1] = option.name
+ end
+ end
+
+ if checkNames[1] then
+ removeTarget(target, checkNames, resource, true)
+ end
+
+ local num = #target
+
+ for i = 1, #options do
+ local option = options[i]
+
+ if resource == 'ox_target' then
+ if option.canInteract then
+ option.canInteract = msgpack.unpack(msgpack.pack(option.canInteract))
+ end
+
+ if option.onSelect then
+ option.onSelect = msgpack.unpack(msgpack.pack(option.onSelect))
+ end
+ end
+
+ num += 1
+ target[num] = options[i]
+ end
+end
+
+---@type table
+local peds = {}
+
+---@param options OxTargetOption | OxTargetOption[]
+function api.addGlobalPed(options)
+ addTarget(peds, options, GetInvokingResource())
+end
+
+---@param options string | string[]
+function api.removeGlobalPed(options)
+ removeTarget(peds, options, GetInvokingResource())
+end
+
+---@type table
+local vehicles = {}
+
+---@param options OxTargetOption | OxTargetOption[]
+function api.addGlobalVehicle(options)
+ addTarget(vehicles, options, GetInvokingResource())
+end
+
+---@param options string | string[]
+function api.removeGlobalVehicle(options)
+ removeTarget(vehicles, options, GetInvokingResource())
+end
+
+---@type table
+local objects = {}
+
+---@param options OxTargetOption | OxTargetOption[]
+function api.addGlobalObject(options)
+ addTarget(objects, options, GetInvokingResource())
+end
+
+---@param options string | string[]
+function api.removeGlobalObject(options)
+ removeTarget(objects, options, GetInvokingResource())
+end
+
+---@type table
+local players = {}
+
+---@param options OxTargetOption | OxTargetOption[]
+function api.addGlobalPlayer(options)
+ addTarget(players, options, GetInvokingResource())
+end
+
+---@param options string | string[]
+function api.removeGlobalPlayer(options)
+ removeTarget(players, options, GetInvokingResource())
+end
+
+---@type table
+local models = {}
+
+---@param arr (number | string) | (number | string)[]
+---@param options OxTargetOption | OxTargetOption[]
+function api.addModel(arr, options)
+ if type(arr) ~= 'table' then arr = { arr } end
+ local resource = GetInvokingResource()
+
+ for i = 1, #arr do
+ local model = arr[i]
+ model = tonumber(model) or joaat(model)
+
+ if not models[model] then
+ models[model] = {}
+ end
+
+ addTarget(models[model], options, resource)
+ end
+end
+
+---@param arr (number | string) | (number | string)[]
+---@param options? string | string[]
+function api.removeModel(arr, options)
+ if type(arr) ~= 'table' then arr = { arr } end
+ local resource = GetInvokingResource()
+
+ for i = 1, #arr do
+ local model = arr[i]
+ model = tonumber(model) or joaat(model)
+
+ if models[model] then
+ if options then
+ removeTarget(models[model], options, resource)
+ end
+
+ if not options or #models[model] == 0 then
+ models[model] = nil
+ end
+ end
+ end
+end
+
+---@type table
+local entities = {}
+
+---@param arr number | number[]
+---@param options OxTargetOption | OxTargetOption[]
+function api.addEntity(arr, options)
+ if type(arr) ~= 'table' then arr = { arr } end
+ local resource = GetInvokingResource()
+
+ for i = 1, #arr do
+ local netId = arr[i]
+
+ if NetworkDoesNetworkIdExist(netId) then
+ if not entities[netId] then
+ entities[netId] = {}
+
+ if not Entity(NetworkGetEntityFromNetworkId(netId)).state.hasTargetOptions then
+ TriggerServerEvent('ox_target:setEntityHasOptions', netId)
+ end
+ end
+
+ addTarget(entities[netId], options, resource)
+ end
+ end
+end
+
+---@param arr number | number[]
+---@param options? string | string[]
+function api.removeEntity(arr, options)
+ if type(arr) ~= 'table' then arr = { arr } end
+ local resource = GetInvokingResource()
+
+ for i = 1, #arr do
+ local netId = arr[i]
+
+ if entities[netId] then
+ if options then
+ removeTarget(entities[netId], options, resource)
+ end
+
+ if not options or #entities[netId] == 0 then
+ entities[netId] = nil
+ end
+ end
+ end
+end
+
+RegisterNetEvent('ox_target:removeEntity', api.removeEntity)
+
+---@type table
+local localEntities = {}
+
+---@param arr number | number[]
+---@param options OxTargetOption | OxTargetOption[]
+function api.addLocalEntity(arr, options)
+ if type(arr) ~= 'table' then arr = { arr } end
+ local resource = GetInvokingResource()
+
+ for i = 1, #arr do
+ local entityId = arr[i]
+
+ if DoesEntityExist(entityId) then
+ if not localEntities[entityId] then
+ localEntities[entityId] = {}
+ end
+
+ addTarget(localEntities[entityId], options, resource)
+ else
+ lib.print.warn(("No entity with id '%s' exists in %s."):format(entityId, resource))
+ end
+ end
+end
+
+---@param arr number | number[]
+---@param options? table
+function api.removeLocalEntity(arr, options)
+ if type(arr) ~= 'table' then arr = { arr } end
+ local resource = GetInvokingResource()
+
+ for i = 1, #arr do
+ local entity = arr[i]
+
+ if localEntities[entity] then
+ if options then
+ removeTarget(localEntities[entity], options, resource)
+ end
+
+ if not options or #localEntities[entity] == 0 then
+ localEntities[entity] = nil
+ end
+ end
+ end
+end
+
+CreateThread(function()
+ while true do
+ Wait(60000)
+
+ for entityId in pairs(localEntities) do
+ if not DoesEntityExist(entityId) then
+ localEntities[entityId] = nil
+ end
+ end
+ end
+end)
+
+---@param resource string
+---@param target table
+local function removeResourceGlobals(resource, target)
+ for i = 1, #target do
+ local options = target[i]
+
+ for j = #options, 1, -1 do
+ if options[j].resource == resource then
+ table.remove(options, j)
+ end
+ end
+ end
+end
+
+---@param resource string
+---@param target table
+local function removeResourceTargets(resource, target)
+ for i = 1, #target do
+ local tbl = target[i]
+
+ for key, options in pairs(tbl) do
+ for j = #options, 1, -1 do
+ if options[j].resource == resource then
+ table.remove(options, j)
+ end
+ end
+
+ if #options == 0 then
+ tbl[key] = nil
+ end
+ end
+ end
+end
+
+---@param resource string
+AddEventHandler('onClientResourceStop', function(resource)
+ removeResourceGlobals(resource, { peds, vehicles, objects, players })
+ removeResourceTargets(resource, { models, entities, localEntities })
+
+ if Zones then
+ for _, v in pairs(Zones) do
+ if v.resource == resource then
+ v:remove()
+ end
+ end
+ end
+end)
+
+local NetworkGetEntityIsNetworked = NetworkGetEntityIsNetworked
+local NetworkGetNetworkIdFromEntity = NetworkGetNetworkIdFromEntity
+
+---@class OxTargetOptions
+local options_mt = {}
+options_mt.__index = options_mt
+options_mt.size = 1
+
+function options_mt:wipe()
+ options_mt.size = 1
+ self.globalTarget = nil
+ self.model = nil
+ self.entity = nil
+ self.localEntity = nil
+
+ if self.__global[1]?.name == 'builtin:goback' then
+ table.remove(self.__global, 1)
+ end
+end
+
+---@param entity? number
+---@param _type? number
+---@param model? number
+function options_mt:set(entity, _type, model)
+ if not entity then return end
+
+ if _type == 1 and IsPedAPlayer(entity) then
+ self:wipe()
+ self.globalTarget = players
+ options_mt.size += 1
+
+ return
+ end
+
+ local netId = NetworkGetEntityIsNetworked(entity) and NetworkGetNetworkIdFromEntity(entity)
+
+ self.globalTarget = _type == 1 and peds or _type == 2 and vehicles or objects
+ self.model = models[model]
+ self.entity = netId and entities[netId] or nil
+ self.localEntity = localEntities[entity]
+ options_mt.size += 1
+
+ if self.model then options_mt.size += 1 end
+ if self.entity then options_mt.size += 1 end
+ if self.localEntity then options_mt.size += 1 end
+end
+
+---@type OxTargetOption[]
+local global = {}
+
+---@param options OxTargetOption | OxTargetOption[]
+function api.addGlobalOption(options)
+ addTarget(global, options, GetInvokingResource())
+end
+
+---@param options string | string[]
+function api.removeGlobalOption(options)
+ removeTarget(global, options, GetInvokingResource())
+end
+
+---@class OxTargetOptions
+local options = setmetatable({
+ __global = global
+}, options_mt)
+
+---@param entity? number
+---@param _type? number
+---@param model? number
+function api.getTargetOptions(entity, _type, model)
+ if not entity then return options end
+
+ if IsPedAPlayer(entity) then
+ return {
+ global = players,
+ }
+ end
+
+ local netId = NetworkGetEntityIsNetworked(entity) and NetworkGetNetworkIdFromEntity(entity)
+
+ return {
+ global = _type == 1 and peds or _type == 2 and vehicles or objects,
+ model = models[model],
+ entity = netId and entities[netId] or nil,
+ localEntity = localEntities[entity],
+ }
+end
+
+local state = require 'client.state'
+
+function api.disableTargeting(value)
+ if value then
+ state.setActive(false)
+ end
+
+ state.setDisabled(value)
+end
+
+function api.isActive()
+ return state.isActive()
+end
+
+return api
diff --git a/resources/ox_target-main/client/compat/qtarget.lua b/resources/ox_target-main/client/compat/qtarget.lua
new file mode 100644
index 000000000..a00801019
--- /dev/null
+++ b/resources/ox_target-main/client/compat/qtarget.lua
@@ -0,0 +1,193 @@
+local function exportHandler(exportName, func)
+ AddEventHandler(('__cfx_export_qtarget_%s'):format(exportName), function(setCB)
+ setCB(func)
+ end)
+end
+
+---@param options table
+---@return table
+local function convert(options)
+ local distance = options.distance
+ options = options.options
+
+ -- People may pass options as a hashmap (or mixed, even)
+ for k, v in pairs(options) do
+ if type(k) ~= 'number' then
+ table.insert(options, v)
+ end
+ end
+
+ for id, v in pairs(options) do
+ if type(id) ~= 'number' then
+ options[id] = nil
+ goto continue
+ end
+
+ v.onSelect = v.action
+ v.distance = v.distance or distance
+ v.name = v.name or v.label
+ v.groups = v.job
+ v.items = v.item or v.required_item
+
+ if v.event and v.type and v.type ~= 'client' then
+ if v.type == 'server' then
+ v.serverEvent = v.event
+ elseif v.type == 'command' then
+ v.command = v.event
+ end
+
+ v.event = nil
+ v.type = nil
+ end
+
+ v.action = nil
+ v.job = nil
+ v.item = nil
+ v.required_item = nil
+ v.qtarget = true
+
+ ::continue::
+ end
+
+ return options
+end
+
+local api = require 'client.api'
+
+exportHandler('AddBoxZone', function(name, center, length, width, options, targetoptions)
+ local z = center.z
+
+ if not options.minZ then
+ options.minZ = -100
+ end
+
+ if not options.maxZ then
+ options.maxZ = 800
+ end
+
+ if not options.useZ then
+ z = z + math.abs(options.maxZ - options.minZ) / 2
+ center = vec3(center.x, center.y, z)
+ end
+
+ return api.addBoxZone({
+ name = name,
+ coords = center,
+ size = vec3(width, length, (options.useZ or not options.maxZ) and center.z or math.abs(options.maxZ - options.minZ)),
+ debug = options.debugPoly,
+ rotation = options.heading,
+ options = convert(targetoptions),
+ })
+end)
+
+exportHandler('AddPolyZone', function(name, points, options, targetoptions)
+ local newPoints = table.create(#points, 0)
+ local thickness = math.abs(options.maxZ - options.minZ)
+
+ for i = 1, #points do
+ local point = points[i]
+ newPoints[i] = vec3(point.x, point.y, options.maxZ - (thickness / 2))
+ end
+
+ return api.addPolyZone({
+ name = name,
+ points = newPoints,
+ thickness = thickness,
+ debug = options.debugPoly,
+ options = convert(targetoptions),
+ })
+end)
+
+exportHandler('AddCircleZone', function(name, center, radius, options, targetoptions)
+ return api.addSphereZone({
+ name = name,
+ coords = center,
+ radius = radius,
+ debug = options.debugPoly,
+ options = convert(targetoptions),
+ })
+end)
+
+exportHandler('RemoveZone', function(id)
+ api.removeZone(id, true)
+end)
+
+exportHandler('AddTargetBone', function(bones, options)
+ if type(bones) ~= 'table' then bones = { bones } end
+ options = convert(options)
+
+ for _, v in pairs(options) do
+ v.bones = bones
+ end
+
+ exports.ox_target:addGlobalVehicle(options)
+end)
+
+exportHandler('AddTargetEntity', function(entities, options)
+ if type(entities) ~= 'table' then entities = { entities } end
+ options = convert(options)
+
+ for i = 1, #entities do
+ local entity = entities[i]
+
+ if NetworkGetEntityIsNetworked(entity) then
+ api.addEntity(NetworkGetNetworkIdFromEntity(entity), options)
+ else
+ api.addLocalEntity(entity, options)
+ end
+ end
+end)
+
+exportHandler('RemoveTargetEntity', function(entities, labels)
+ if type(entities) ~= 'table' then entities = { entities } end
+
+ for i = 1, #entities do
+ local entity = entities[i]
+
+ if NetworkGetEntityIsNetworked(entity) then
+ api.removeEntity(NetworkGetNetworkIdFromEntity(entity), labels)
+ else
+ api.removeLocalEntity(entity, labels)
+ end
+ end
+end)
+
+exportHandler('AddTargetModel', function(models, options)
+ api.addModel(models, convert(options))
+end)
+
+exportHandler('RemoveTargetModel', function(models, labels)
+ api.removeModel(models, labels)
+end)
+
+exportHandler('Ped', function(options)
+ api.addGlobalPed(convert(options))
+end)
+
+exportHandler('RemovePed', function(labels)
+ api.removeGlobalPed(labels)
+end)
+
+exportHandler('Vehicle', function(options)
+ api.addGlobalVehicle(convert(options))
+end)
+
+exportHandler('RemoveVehicle', function(labels)
+ api.removeGlobalVehicle(labels)
+end)
+
+exportHandler('Object', function(options)
+ api.addGlobalObject(convert(options))
+end)
+
+exportHandler('RemoveObject', function(labels)
+ api.removeGlobalObject(labels)
+end)
+
+exportHandler('Player', function(options)
+ api.addGlobalPlayer(convert(options))
+end)
+
+exportHandler('RemovePlayer', function(labels)
+ api.removeGlobalPlayer(labels)
+end)
\ No newline at end of file
diff --git a/resources/ox_target-main/client/debug.lua b/resources/ox_target-main/client/debug.lua
new file mode 100644
index 000000000..6f10922d6
--- /dev/null
+++ b/resources/ox_target-main/client/debug.lua
@@ -0,0 +1,99 @@
+AddEventHandler('ox_target:debug', function(data)
+ if data.entity and GetEntityType(data.entity) > 0 then
+ data.archetype = GetEntityArchetypeName(data.entity)
+ data.model = GetEntityModel(data.entity)
+ end
+
+ print(json.encode(data, {indent=true}))
+end)
+
+if GetConvarInt('ox_target:debug', 0) ~= 1 then return end
+
+local ox_target = exports.ox_target
+local drawZones = true
+
+ox_target:addBoxZone({
+ coords = vec3(442.5363, -1017.666, 28.85637),
+ size = vec3(3, 3, 3),
+ rotation = 45,
+ debug = drawZones,
+ drawSprite = true,
+ options = {
+ {
+ name = 'debug_box',
+ event = 'ox_target:debug',
+ icon = 'fa-solid fa-cube',
+ label = locale('debug_box'),
+ }
+ }
+})
+
+ox_target:addSphereZone({
+ coords = vec3(440.5363, -1015.666, 28.85637),
+ radius = 3,
+ debug = drawZones,
+ drawSprite = true,
+ options = {
+ {
+ name = 'debug_sphere',
+ event = 'ox_target:debug',
+ icon = 'fa-solid fa-circle',
+ label = locale('debug_sphere'),
+ }
+ }
+})
+
+ox_target:addModel(`police`, {
+ {
+ name = 'debug_model',
+ event = 'ox_target:debug',
+ icon = 'fa-solid fa-handcuffs',
+ label = locale('debug_police_car'),
+ }
+})
+
+ox_target:addGlobalPed({
+ {
+ name = 'debug_ped',
+ event = 'ox_target:debug',
+ icon = 'fa-solid fa-male',
+ label = locale('debug_ped'),
+ }
+})
+
+ox_target:addGlobalVehicle({
+ {
+ name = 'debug_vehicle',
+ event = 'ox_target:debug',
+ icon = 'fa-solid fa-car',
+ label = locale('debug_vehicle'),
+ }
+})
+
+ox_target:addGlobalObject({
+ {
+ name = 'debug_object',
+ event = 'ox_target:debug',
+ icon = 'fa-solid fa-bong',
+ label = locale('debug_object'),
+ }
+})
+
+ox_target:addGlobalOption({
+ {
+ name = 'debug_global',
+ icon = 'fa-solid fa-globe',
+ label = locale('debug_global'),
+ openMenu = 'debug_global'
+ }
+})
+
+ox_target:addGlobalOption({
+ {
+ name = 'debug_global2',
+ event = 'ox_target:debug',
+ icon = 'fa-solid fa-globe',
+ label = locale('debug_global') .. ' 2',
+ menuName = 'debug_global'
+ }
+})
\ No newline at end of file
diff --git a/resources/ox_target-main/client/defaults.lua b/resources/ox_target-main/client/defaults.lua
new file mode 100644
index 000000000..38b92b772
--- /dev/null
+++ b/resources/ox_target-main/client/defaults.lua
@@ -0,0 +1,143 @@
+if GetConvarInt('ox_target:defaults', 1) ~= 1 then return end
+
+local api = require 'client.api'
+local GetEntityBoneIndexByName = GetEntityBoneIndexByName
+local GetEntityBonePosition_2 = GetEntityBonePosition_2
+local GetVehicleDoorLockStatus = GetVehicleDoorLockStatus
+
+local bones = {
+ [0] = 'dside_f',
+ [1] = 'pside_f',
+ [2] = 'dside_r',
+ [3] = 'pside_r'
+}
+
+---@param vehicle number
+---@param door number
+local function toggleDoor(vehicle, door)
+ if GetVehicleDoorLockStatus(vehicle) ~= 2 then
+ if GetVehicleDoorAngleRatio(vehicle, door) > 0.0 then
+ SetVehicleDoorShut(vehicle, door, false)
+ else
+ SetVehicleDoorOpen(vehicle, door, false, false)
+ end
+ end
+end
+
+---@param entity number
+---@param coords vector3
+---@param door number
+---@param useOffset boolean?
+---@return boolean?
+local function canInteractWithDoor(entity, coords, door, useOffset)
+ if not GetIsDoorValid(entity, door) or GetVehicleDoorLockStatus(entity) > 1 or IsVehicleDoorDamaged(entity, door) or cache.vehicle then return end
+
+ if useOffset then return true end
+
+ local boneName = bones[door]
+
+ if not boneName then return false end
+
+ local boneId = GetEntityBoneIndexByName(entity, 'door_' .. boneName)
+
+ if boneId ~= -1 then
+ return #(coords - GetEntityBonePosition_2(entity, boneId)) < 0.5 or
+ #(coords - GetEntityBonePosition_2(entity, GetEntityBoneIndexByName(entity, 'seat_' .. boneName))) < 0.72
+ end
+end
+
+local function onSelectDoor(data, door)
+ local entity = data.entity
+
+ if NetworkGetEntityOwner(entity) == cache.playerId then
+ return toggleDoor(entity, door)
+ end
+
+ TriggerServerEvent('ox_target:toggleEntityDoor', VehToNet(entity), door)
+end
+
+RegisterNetEvent('ox_target:toggleEntityDoor', function(netId, door)
+ local entity = NetToVeh(netId)
+ toggleDoor(entity, door)
+end)
+
+api.addGlobalVehicle({
+ {
+ name = 'ox_target:driverF',
+ icon = 'fa-solid fa-car-side',
+ label = locale('toggle_front_driver_door'),
+ bones = { 'door_dside_f', 'seat_dside_f' },
+ distance = 2,
+ canInteract = function(entity, distance, coords, name)
+ return canInteractWithDoor(entity, coords, 0)
+ end,
+ onSelect = function(data)
+ onSelectDoor(data, 0)
+ end
+ },
+ {
+ name = 'ox_target:passengerF',
+ icon = 'fa-solid fa-car-side',
+ label = locale('toggle_front_passenger_door'),
+ bones = { 'door_pside_f', 'seat_pside_f' },
+ distance = 2,
+ canInteract = function(entity, distance, coords, name)
+ return canInteractWithDoor(entity, coords, 1)
+ end,
+ onSelect = function(data)
+ onSelectDoor(data, 1)
+ end
+ },
+ {
+ name = 'ox_target:driverR',
+ icon = 'fa-solid fa-car-side',
+ label = locale('toggle_rear_driver_door'),
+ bones = { 'door_dside_r', 'seat_dside_r' },
+ distance = 2,
+ canInteract = function(entity, distance, coords)
+ return canInteractWithDoor(entity, coords, 2)
+ end,
+ onSelect = function(data)
+ onSelectDoor(data, 2)
+ end
+ },
+ {
+ name = 'ox_target:passengerR',
+ icon = 'fa-solid fa-car-side',
+ label = locale('toggle_rear_passenger_door'),
+ bones = { 'door_pside_r', 'seat_pside_r' },
+ distance = 2,
+ canInteract = function(entity, distance, coords)
+ return canInteractWithDoor(entity, coords, 3)
+ end,
+ onSelect = function(data)
+ onSelectDoor(data, 3)
+ end
+ },
+ {
+ name = 'ox_target:bonnet',
+ icon = 'fa-solid fa-car',
+ label = locale('toggle_hood'),
+ offset = vec3(0.5, 1, 0.5),
+ distance = 2,
+ canInteract = function(entity, distance, coords)
+ return canInteractWithDoor(entity, coords, 4, true)
+ end,
+ onSelect = function(data)
+ onSelectDoor(data, 4)
+ end
+ },
+ {
+ name = 'ox_target:trunk',
+ icon = 'fa-solid fa-car-rear',
+ label = locale('toggle_trunk'),
+ offset = vec3(0.5, 0, 0.5),
+ distance = 2,
+ canInteract = function(entity, distance, coords, name)
+ return canInteractWithDoor(entity, coords, 5, true)
+ end,
+ onSelect = function(data)
+ onSelectDoor(data, 5)
+ end
+ }
+})
diff --git a/resources/ox_target-main/client/framework/esx.lua b/resources/ox_target-main/client/framework/esx.lua
new file mode 100644
index 000000000..828f783f9
--- /dev/null
+++ b/resources/ox_target-main/client/framework/esx.lua
@@ -0,0 +1,92 @@
+local ESX = exports.es_extended:getSharedObject()
+local utils = require 'client.utils'
+local groups = { 'job', 'job2' }
+local playerGroups = {}
+local playerItems = utils.getItems()
+local usingOxInventory = utils.hasExport('ox_inventory.Items')
+
+local function setPlayerData(playerData)
+ table.wipe(playerGroups)
+ table.wipe(playerItems)
+
+ for i = 1, #groups do
+ local group = groups[i]
+ local data = playerData[group]
+
+ if data then
+ playerGroups[group] = data
+ end
+ end
+
+ if usingOxInventory or not playerData.inventory then return end
+
+ for _, v in pairs(playerData.inventory) do
+ if v.count > 0 then
+ playerItems[v.name] = v.count
+ end
+ end
+end
+
+if ESX.PlayerLoaded then
+ setPlayerData(ESX.PlayerData)
+end
+
+RegisterNetEvent('esx:playerLoaded', function(data)
+ if source == '' then return end
+ setPlayerData(data)
+end)
+
+RegisterNetEvent('esx:setJob', function(job)
+ if source == '' then return end
+ playerGroups.job = job
+end)
+
+RegisterNetEvent('esx:setJob2', function(job)
+ if source == '' then return end
+ playerGroups.job2 = job
+end)
+
+RegisterNetEvent('esx:addInventoryItem', function(name, count)
+ playerItems[name] = count
+end)
+
+RegisterNetEvent('esx:removeInventoryItem', function(name, count)
+ playerItems[name] = count
+end)
+
+---@diagnostic disable-next-line: duplicate-set-field
+function utils.hasPlayerGotGroup(filter)
+ local _type = type(filter)
+ for i = 1, #groups do
+ local group = groups[i]
+
+ if _type == 'string' then
+ local data = playerGroups[group]
+
+ if filter == data?.name then
+ return true
+ end
+ elseif _type == 'table' then
+ local tabletype = table.type(filter)
+
+ if tabletype == 'hash' then
+ for name, grade in pairs(filter) do
+ local data = playerGroups[group]
+
+ if data?.name == name and grade <= data.grade then
+ return true
+ end
+ end
+ elseif tabletype == 'array' then
+ for j = 1, #filter do
+ local name = filter[j]
+ local data = playerGroups[group]
+
+ if data?.name == name then
+ return true
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/resources/ox_target-main/client/framework/nd.lua b/resources/ox_target-main/client/framework/nd.lua
new file mode 100644
index 000000000..c40d0c345
--- /dev/null
+++ b/resources/ox_target-main/client/framework/nd.lua
@@ -0,0 +1,48 @@
+local NDCore = exports["ND_Core"]
+
+local playerGroups = NDCore:getPlayer()?.groups or {}
+
+RegisterNetEvent("ND:characterLoaded", function(data)
+ playerGroups = data.groups
+end)
+
+RegisterNetEvent("ND:updateCharacter", function(data)
+ if source == '' then return end
+ playerGroups = data.groups or {}
+end)
+
+local utils = require 'client.utils'
+
+---@diagnostic disable-next-line: duplicate-set-field
+function utils.hasPlayerGotGroup(filter)
+ local _type = type(filter)
+
+ if _type == 'string' then
+ local group = playerGroups[filter]
+
+ if group then
+ return true
+ end
+ elseif _type == 'table' then
+ local tabletype = table.type(filter)
+
+ if tabletype == 'hash' then
+ for name, grade in pairs(filter) do
+ local playerGrade = playerGroups[name]?.rank
+
+ if playerGrade and grade <= playerGrade then
+ return true
+ end
+ end
+ elseif tabletype == 'array' then
+ for i = 1, #filter do
+ local name = filter[i]
+ local group = playerGroups[name]
+
+ if group then
+ return true
+ end
+ end
+ end
+ end
+end
diff --git a/resources/ox_target-main/client/framework/ox.lua b/resources/ox_target-main/client/framework/ox.lua
new file mode 100644
index 000000000..66cf50da0
--- /dev/null
+++ b/resources/ox_target-main/client/framework/ox.lua
@@ -0,0 +1,10 @@
+if not lib.checkDependency('ox_core', '0.21.3', true) then return end
+
+local Ox = require '@ox_core.lib.init' --[[@as OxClient]]
+local utils = require 'client.utils'
+local player = Ox.GetPlayer()
+
+---@diagnostic disable-next-line: duplicate-set-field
+function utils.hasPlayerGotGroup(filter)
+ return player.getGroup(filter)
+end
diff --git a/resources/ox_target-main/client/framework/qbx.lua b/resources/ox_target-main/client/framework/qbx.lua
new file mode 100644
index 000000000..85a93103a
--- /dev/null
+++ b/resources/ox_target-main/client/framework/qbx.lua
@@ -0,0 +1,9 @@
+if not lib.checkDependency('qbx_core', '1.18.0', true) then return end
+
+local QBX = exports.qbx_core
+local utils = require 'client.utils'
+
+---@diagnostic disable-next-line: duplicate-set-field
+function utils.hasPlayerGotGroup(filter)
+ return QBX:HasGroup(filter)
+end
diff --git a/resources/ox_target-main/client/main.lua b/resources/ox_target-main/client/main.lua
new file mode 100644
index 000000000..5ab090e22
--- /dev/null
+++ b/resources/ox_target-main/client/main.lua
@@ -0,0 +1,456 @@
+if not lib.checkDependency('ox_lib', '3.30.0', true) then return end
+
+lib.locale()
+
+local utils = require 'client.utils'
+local state = require 'client.state'
+local options = require 'client.api'.getTargetOptions()
+
+require 'client.debug'
+require 'client.defaults'
+require 'client.compat.qtarget'
+
+local SendNuiMessage = SendNuiMessage
+local GetEntityCoords = GetEntityCoords
+local GetEntityType = GetEntityType
+local HasEntityClearLosToEntity = HasEntityClearLosToEntity
+local GetEntityBoneIndexByName = GetEntityBoneIndexByName
+local GetEntityBonePosition_2 = GetEntityBonePosition_2
+local GetEntityModel = GetEntityModel
+local IsDisabledControlJustPressed = IsDisabledControlJustPressed
+local DisableControlAction = DisableControlAction
+local DisablePlayerFiring = DisablePlayerFiring
+local GetModelDimensions = GetModelDimensions
+local GetOffsetFromEntityInWorldCoords = GetOffsetFromEntityInWorldCoords
+local currentTarget = {}
+local currentMenu
+local menuChanged
+local menuHistory = {}
+local nearbyZones
+
+-- Toggle ox_target, instead of holding the hotkey
+local toggleHotkey = GetConvarInt('ox_target:toggleHotkey', 0) == 1
+local mouseButton = GetConvarInt('ox_target:leftClick', 1) == 1 and 24 or 25
+local debug = GetConvarInt('ox_target:debug', 0) == 1
+local vec0 = vec3(0, 0, 0)
+
+---@param option OxTargetOption
+---@param distance number
+---@param endCoords vector3
+---@param entityHit? number
+---@param entityType? number
+---@param entityModel? number | false
+local function shouldHide(option, distance, endCoords, entityHit, entityType, entityModel)
+ if option.menuName ~= currentMenu then
+ return true
+ end
+
+ if distance > (option.distance or 7) then
+ return true
+ end
+
+ if option.groups and not utils.hasPlayerGotGroup(option.groups) then
+ return true
+ end
+
+ if option.items and not utils.hasPlayerGotItems(option.items, option.anyItem) then
+ return true
+ end
+
+ local bone = entityModel and option.bones or nil
+
+ if bone then
+ ---@cast entityHit number
+ ---@cast entityType number
+ ---@cast entityModel number
+
+ local _type = type(bone)
+
+ if _type == 'string' then
+ local boneId = GetEntityBoneIndexByName(entityHit, bone)
+
+ if boneId ~= -1 and #(endCoords - GetEntityBonePosition_2(entityHit, boneId)) <= 2 then
+ bone = boneId
+ else
+ return true
+ end
+ elseif _type == 'table' then
+ local closestBone, boneDistance
+
+ for j = 1, #bone do
+ local boneId = GetEntityBoneIndexByName(entityHit, bone[j])
+
+ if boneId ~= -1 then
+ local dist = #(endCoords - GetEntityBonePosition_2(entityHit, boneId))
+
+ if dist <= (boneDistance or 1) then
+ closestBone = boneId
+ boneDistance = dist
+ end
+ end
+ end
+
+ if closestBone then
+ bone = closestBone
+ else
+ return true
+ end
+ end
+ end
+
+ local offset = entityModel and option.offset or nil
+
+ if offset then
+ ---@cast entityHit number
+ ---@cast entityType number
+ ---@cast entityModel number
+
+ if not option.absoluteOffset then
+ local min, max = GetModelDimensions(entityModel)
+ offset = (max - min) * offset + min
+ end
+
+ offset = GetOffsetFromEntityInWorldCoords(entityHit, offset.x, offset.y, offset.z)
+
+ if #(endCoords - offset) > (option.offsetSize or 1) then
+ return true
+ end
+ end
+
+ if option.canInteract then
+ local success, resp = pcall(option.canInteract, entityHit, distance, endCoords, option.name, bone)
+ return not success or not resp
+ end
+end
+
+local function startTargeting()
+ if state.isDisabled() or state.isActive() or IsNuiFocused() or IsPauseMenuActive() then return end
+
+ state.setActive(true)
+
+ local flag = 511
+ local hit, entityHit, endCoords, distance, lastEntity, entityType, entityModel, hasTarget, zonesChanged
+ local zones = {}
+
+ CreateThread(function()
+ local dict, texture = utils.getTexture()
+ local lastCoords
+
+ while state.isActive() do
+ lastCoords = endCoords == vec0 and lastCoords or endCoords or vec0
+
+ if debug then
+ DrawMarker(28, lastCoords.x, lastCoords.y, lastCoords.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2,
+ 0.2,
+ ---@diagnostic disable-next-line: param-type-mismatch
+ 255, 42, 24, 100, false, false, 0, true, false, false, false)
+ end
+
+ utils.drawZoneSprites(dict, texture)
+ DisablePlayerFiring(cache.playerId, true)
+ DisableControlAction(0, 25, true)
+ DisableControlAction(0, 140, true)
+ DisableControlAction(0, 141, true)
+ DisableControlAction(0, 142, true)
+
+ if state.isNuiFocused() then
+ DisableControlAction(0, 1, true)
+ DisableControlAction(0, 2, true)
+
+ if not hasTarget or options and IsDisabledControlJustPressed(0, 25) then
+ state.setNuiFocus(false, false)
+ end
+ elseif hasTarget and IsDisabledControlJustPressed(0, mouseButton) then
+ state.setNuiFocus(true, true)
+ end
+
+ Wait(0)
+ end
+
+ SetStreamedTextureDictAsNoLongerNeeded(dict)
+ end)
+
+ while state.isActive() do
+ if not state.isNuiFocused() and lib.progressActive() then
+ state.setActive(false)
+ break
+ end
+
+ local playerCoords = GetEntityCoords(cache.ped)
+ hit, entityHit, endCoords = lib.raycast.fromCamera(flag, 4, 20)
+ distance = #(playerCoords - endCoords)
+
+ if entityHit ~= 0 and entityHit ~= lastEntity then
+ local success, result = pcall(GetEntityType, entityHit)
+ entityType = success and result or 0
+ end
+
+ if entityType == 0 then
+ local _flag = flag == 511 and 26 or 511
+ local _hit, _entityHit, _endCoords = lib.raycast.fromCamera(_flag, 4, 20)
+ local _distance = #(playerCoords - _endCoords)
+
+ if _distance < distance then
+ flag, hit, entityHit, endCoords, distance = _flag, _hit, _entityHit, _endCoords, _distance
+
+ if entityHit ~= 0 then
+ local success, result = pcall(GetEntityType, entityHit)
+ entityType = success and result or 0
+ end
+ end
+ end
+
+ nearbyZones, zonesChanged = utils.getNearbyZones(endCoords)
+
+ local entityChanged = entityHit ~= lastEntity
+ local newOptions = (zonesChanged or entityChanged or menuChanged) and true
+
+ if entityHit > 0 and entityChanged then
+ currentMenu = nil
+
+ if flag ~= 511 then
+ entityHit = HasEntityClearLosToEntity(entityHit, cache.ped, 7) and entityHit or 0
+ end
+
+ if lastEntity ~= entityHit and debug then
+ if lastEntity then
+ SetEntityDrawOutline(lastEntity, false)
+ end
+
+ if entityType ~= 1 then
+ SetEntityDrawOutline(entityHit, true)
+ end
+ end
+
+ if entityHit > 0 then
+ local success, result = pcall(GetEntityModel, entityHit)
+ entityModel = success and result
+ end
+ end
+
+ if hasTarget and (zonesChanged or entityChanged and hasTarget > 1) then
+ SendNuiMessage('{"event": "leftTarget"}')
+
+ if entityChanged then options:wipe() end
+
+ if debug and lastEntity > 0 then SetEntityDrawOutline(lastEntity, false) end
+
+ hasTarget = false
+ end
+
+ if newOptions and entityModel and entityHit > 0 then
+ options:set(entityHit, entityType, entityModel)
+ end
+
+ lastEntity = entityHit
+ currentTarget.entity = entityHit
+ currentTarget.coords = endCoords
+ currentTarget.distance = distance
+ local hidden = 0
+ local totalOptions = 0
+
+ for k, v in pairs(options) do
+ local optionCount = #v
+ local dist = k == '__global' and 0 or distance
+ totalOptions += optionCount
+
+ for i = 1, optionCount do
+ local option = v[i]
+ local hide = shouldHide(option, dist, endCoords, entityHit, entityType, entityModel)
+
+ if option.hide ~= hide then
+ option.hide = hide
+ newOptions = true
+ end
+
+ if hide then hidden += 1 end
+ end
+ end
+
+ if zonesChanged then table.wipe(zones) end
+
+ for i = 1, #nearbyZones do
+ local zoneOptions = nearbyZones[i].options
+ local optionCount = #zoneOptions
+ totalOptions += optionCount
+ zones[i] = zoneOptions
+
+ for j = 1, optionCount do
+ local option = zoneOptions[j]
+ local hide = shouldHide(option, distance, endCoords, entityHit)
+
+ if option.hide ~= hide then
+ option.hide = hide
+ newOptions = true
+ end
+
+ if hide then hidden += 1 end
+ end
+ end
+
+ if newOptions then
+ if hasTarget == 1 and (totalOptions - hidden) > 1 then
+ hasTarget = true
+ end
+
+ if hasTarget and hidden == totalOptions then
+ if hasTarget and hasTarget ~= 1 then
+ hasTarget = false
+ SendNuiMessage('{"event": "leftTarget"}')
+ end
+ elseif menuChanged or hasTarget ~= 1 and hidden ~= totalOptions then
+ hasTarget = options.size
+
+ if currentMenu and options.__global[1]?.name ~= 'builtin:goback' then
+ table.insert(options.__global, 1,
+ {
+ icon = 'fa-solid fa-circle-chevron-left',
+ label = locale('go_back'),
+ name = 'builtin:goback',
+ menuName = currentMenu,
+ openMenu = 'home'
+ })
+ end
+
+ SendNuiMessage(json.encode({
+ event = 'setTarget',
+ options = options,
+ zones = zones,
+ }, { sort_keys = true }))
+ end
+
+ menuChanged = false
+ end
+
+ if toggleHotkey and IsPauseMenuActive() then
+ state.setActive(false)
+ end
+
+ if not hasTarget or hasTarget == 1 then
+ flag = flag == 511 and 26 or 511
+ end
+
+ Wait(hit and 50 or 100)
+ end
+
+ if lastEntity and debug then
+ SetEntityDrawOutline(lastEntity, false)
+ end
+
+ state.setNuiFocus(false)
+ SendNuiMessage('{"event": "visible", "state": false}')
+ table.wipe(currentTarget)
+ options:wipe()
+
+ if nearbyZones then table.wipe(nearbyZones) end
+end
+
+do
+ ---@type KeybindProps
+ local keybind = {
+ name = 'ox_target',
+ defaultKey = GetConvar('ox_target:defaultHotkey', 'LMENU'),
+ defaultMapper = 'keyboard',
+ description = locale('toggle_targeting'),
+ }
+
+ if toggleHotkey then
+ function keybind:onPressed()
+ if state.isActive() then
+ return state.setActive(false)
+ end
+
+ return startTargeting()
+ end
+ else
+ keybind.onPressed = startTargeting
+
+ function keybind:onReleased()
+ state.setActive(false)
+ end
+ end
+
+ lib.addKeybind(keybind)
+end
+
+---@generic T
+---@param option T
+---@param server? boolean
+---@return T
+local function getResponse(option, server)
+ local response = table.clone(option)
+ response.entity = currentTarget.entity
+ response.zone = currentTarget.zone
+ response.coords = currentTarget.coords
+ response.distance = currentTarget.distance
+
+ if server then
+ response.entity = response.entity ~= 0 and NetworkGetEntityIsNetworked(response.entity) and
+ NetworkGetNetworkIdFromEntity(response.entity) or 0
+ end
+
+ response.icon = nil
+ response.groups = nil
+ response.items = nil
+ response.canInteract = nil
+ response.onSelect = nil
+ response.export = nil
+ response.event = nil
+ response.serverEvent = nil
+ response.command = nil
+
+ return response
+end
+
+RegisterNUICallback('select', function(data, cb)
+ cb(1)
+
+ local zone = data[3] and nearbyZones[data[3]]
+
+ ---@type OxTargetOption?
+ local option = zone and zone.options[data[2]] or options[data[1]][data[2]]
+
+ if option then
+ if option.openMenu then
+ local menuDepth = #menuHistory
+
+ if option.name == 'builtin:goback' then
+ option.menuName = option.openMenu
+ option.openMenu = menuHistory[menuDepth]
+
+ if menuDepth > 0 then
+ menuHistory[menuDepth] = nil
+ end
+ else
+ menuHistory[menuDepth + 1] = currentMenu
+ end
+
+ menuChanged = true
+ currentMenu = option.openMenu ~= 'home' and option.openMenu or nil
+
+ options:wipe()
+ else
+ state.setNuiFocus(false)
+ end
+
+ currentTarget.zone = zone?.id
+
+ if option.onSelect then
+ option.onSelect(option.qtarget and currentTarget.entity or getResponse(option))
+ elseif option.export then
+ exports[option.resource or zone.resource][option.export](nil, getResponse(option))
+ elseif option.event then
+ TriggerEvent(option.event, getResponse(option))
+ elseif option.serverEvent then
+ TriggerServerEvent(option.serverEvent, getResponse(option, true))
+ elseif option.command then
+ ExecuteCommand(option.command)
+ end
+
+ if option.menuName == 'home' then return end
+ end
+
+ if not option?.openMenu and IsNuiFocused() then
+ state.setActive(false)
+ end
+end)
diff --git a/resources/ox_target-main/client/state.lua b/resources/ox_target-main/client/state.lua
new file mode 100644
index 000000000..2a76824c9
--- /dev/null
+++ b/resources/ox_target-main/client/state.lua
@@ -0,0 +1,47 @@
+local state = {}
+
+local isActive = false
+
+---@return boolean
+function state.isActive()
+ return isActive
+end
+
+---@param value boolean
+function state.setActive(value)
+ isActive = value
+
+ if value then
+ SendNuiMessage('{"event": "visible", "state": true}')
+ end
+end
+
+local nuiFocus = false
+
+---@return boolean
+function state.isNuiFocused()
+ return nuiFocus
+end
+
+---@param value boolean
+function state.setNuiFocus(value, cursor)
+ if value then SetCursorLocation(0.5, 0.5) end
+
+ nuiFocus = value
+ SetNuiFocus(value, cursor or false)
+ SetNuiFocusKeepInput(value)
+end
+
+local isDisabled = false
+
+---@return boolean
+function state.isDisabled()
+ return isDisabled
+end
+
+---@param value boolean
+function state.setDisabled(value)
+ isDisabled = value
+end
+
+return state
diff --git a/resources/ox_target-main/client/utils.lua b/resources/ox_target-main/client/utils.lua
new file mode 100644
index 000000000..43445844c
--- /dev/null
+++ b/resources/ox_target-main/client/utils.lua
@@ -0,0 +1,215 @@
+local utils = {}
+
+local GetWorldCoordFromScreenCoord = GetWorldCoordFromScreenCoord
+local StartShapeTestLosProbe = StartShapeTestLosProbe
+local GetShapeTestResultIncludingMaterial = GetShapeTestResultIncludingMaterial
+
+---@param flag number
+---@return boolean hit
+---@return number entityHit
+---@return vector3 endCoords
+---@return vector3 surfaceNormal
+---@return number materialHash
+function utils.raycastFromCamera(flag)
+ local coords, normal = GetWorldCoordFromScreenCoord(0.5, 0.5)
+ local destination = coords + normal * 10
+ local handle = StartShapeTestLosProbe(coords.x, coords.y, coords.z, destination.x, destination.y, destination.z,
+ flag, cache.ped, 4)
+
+ while true do
+ Wait(0)
+ local retval, hit, endCoords, surfaceNormal, materialHash, entityHit = GetShapeTestResultIncludingMaterial(
+ handle)
+
+ if retval ~= 1 then
+ ---@diagnostic disable-next-line: return-type-mismatch
+ return hit, entityHit, endCoords, surfaceNormal, materialHash
+ end
+ end
+end
+
+function utils.getTexture()
+ return lib.requestStreamedTextureDict('shared'), 'emptydot_32'
+end
+
+-- SetDrawOrigin is limited to 32 calls per frame. Set as 0 to disable.
+local drawZoneSprites = GetConvarInt('ox_target:drawSprite', 24)
+local SetDrawOrigin = SetDrawOrigin
+local DrawSprite = DrawSprite
+local ClearDrawOrigin = ClearDrawOrigin
+local colour = vector(155, 155, 155, 175)
+local hover = vector(98, 135, 236, 255)
+local currentZones = {}
+local previousZones = {}
+local drawZones = {}
+local drawN = 0
+local width = 0.02
+local height = width * GetAspectRatio(false)
+
+if drawZoneSprites == 0 then drawZoneSprites = -1 end
+
+---@param coords vector3
+---@return CZone[], boolean
+function utils.getNearbyZones(coords)
+ if not Zones then return currentZones, false end
+
+ local n = 0
+ local nearbyZones = lib.zones.getNearbyZones()
+ drawN = 0
+ previousZones, currentZones = currentZones, table.wipe(previousZones)
+
+ for i = 1, #nearbyZones do
+ local zone = nearbyZones[i]
+ local contains = zone:contains(coords)
+
+ if contains then
+ n += 1
+ currentZones[n] = zone
+ end
+
+ if drawN <= drawZoneSprites and zone.drawSprite ~= false and (contains or (zone.distance or 7) < 7) then
+ drawN += 1
+ drawZones[drawN] = zone
+ zone.colour = contains and hover or nil
+ end
+ end
+
+ local previousN = #previousZones
+
+ if n ~= previousN then
+ return currentZones, true
+ end
+
+ if n > 0 then
+ for i = 1, n do
+ local zoneA = currentZones[i]
+ local found = false
+
+ for j = 1, previousN do
+ local zoneB = previousZones[j]
+
+ if zoneA == zoneB then
+ found = true
+ break
+ end
+ end
+
+ if not found then
+ return currentZones, true
+ end
+ end
+ end
+
+ return currentZones, false
+end
+
+function utils.drawZoneSprites(dict, texture)
+ if drawN == 0 then return end
+
+ for i = 1, drawN do
+ local zone = drawZones[i]
+ local spriteColour = zone.colour or colour
+
+ if zone.drawSprite ~= false then
+ SetDrawOrigin(zone.coords.x, zone.coords.y, zone.coords.z)
+ DrawSprite(dict, texture, 0, 0, width, height, 0, spriteColour.r, spriteColour.g, spriteColour.b,
+ spriteColour.a)
+ end
+ end
+
+ ClearDrawOrigin()
+end
+
+function utils.hasExport(export)
+ local resource, exportName = string.strsplit('.', export)
+
+ return pcall(function()
+ return exports[resource][exportName]
+ end)
+end
+
+local playerItems = {}
+
+function utils.getItems()
+ return playerItems
+end
+
+---@param filter string | string[] | table
+---@param hasAny boolean?
+---@return boolean
+function utils.hasPlayerGotItems(filter, hasAny)
+ if not playerItems then return true end
+
+ local _type = type(filter)
+
+ if _type == 'string' then
+ return (playerItems[filter] or 0) > 0
+ elseif _type == 'table' then
+ local tabletype = table.type(filter)
+
+ if tabletype == 'hash' then
+ for name, amount in pairs(filter) do
+ local hasItem = (playerItems[name] or 0) >= amount
+
+ if hasAny then
+ if hasItem then return true end
+ elseif not hasItem then
+ return false
+ end
+ end
+ elseif tabletype == 'array' then
+ for i = 1, #filter do
+ local hasItem = (playerItems[filter[i]] or 0) > 0
+
+ if hasAny then
+ if hasItem then return true end
+ elseif not hasItem then
+ return false
+ end
+ end
+ end
+ end
+
+ return not hasAny
+end
+
+---stub
+---@param filter string | string[] | table
+---@return boolean
+function utils.hasPlayerGotGroup(filter)
+ return true
+end
+
+SetTimeout(0, function()
+ if utils.hasExport('ox_inventory.Items') then
+ setmetatable(playerItems, {
+ __index = function(self, index)
+ self[index] = exports.ox_inventory:Search('count', index) or 0
+ return self[index]
+ end
+ })
+
+ AddEventHandler('ox_inventory:itemCount', function(name, count)
+ playerItems[name] = count
+ end)
+ end
+
+ if utils.hasExport('ox_core.GetPlayer') then
+ require 'client.framework.ox'
+ elseif utils.hasExport('es_extended.getSharedObject') then
+ require 'client.framework.esx'
+ elseif utils.hasExport('qbx_core.HasGroup') then
+ require 'client.framework.qbx'
+ elseif utils.hasExport('ND_Core.getPlayer') then
+ require 'client.framework.nd'
+ end
+end)
+
+function utils.warn(msg)
+ local trace = Citizen.InvokeNative(`FORMAT_STACK_TRACE` & 0xFFFFFFFF, nil, 0, Citizen.ResultAsString())
+ local _, _, src = string.strsplit('\n', trace, 4)
+
+ warn(('%s ^0%s\n'):format(msg, src:gsub(".-%(", '(')))
+end
+
+return utils
diff --git a/resources/ox_target-main/fxmanifest.lua b/resources/ox_target-main/fxmanifest.lua
new file mode 100644
index 000000000..d32b920fa
--- /dev/null
+++ b/resources/ox_target-main/fxmanifest.lua
@@ -0,0 +1,46 @@
+-- FX Information
+fx_version 'cerulean'
+use_experimental_fxv2_oal 'yes'
+lua54 'yes'
+game 'gta5'
+
+-- Resource Information
+name 'ox_target'
+author 'Overextended'
+version '1.17.2'
+repository 'https://github.com/overextended/ox_target'
+description ''
+
+-- Manifest
+ui_page 'web/index.html'
+
+shared_scripts {
+ '@ox_lib/init.lua',
+}
+
+client_scripts {
+ 'client/main.lua',
+}
+
+server_scripts {
+ 'server/main.lua'
+}
+
+files {
+ 'web/**',
+ 'locales/*.json',
+ 'client/api.lua',
+ 'client/utils.lua',
+ 'client/state.lua',
+ 'client/debug.lua',
+ 'client/defaults.lua',
+ 'client/framework/nd.lua',
+ 'client/framework/ox.lua',
+ 'client/framework/esx.lua',
+ 'client/framework/qbx.lua',
+ 'client/compat/qtarget.lua',
+}
+
+provide 'qtarget'
+
+dependency 'ox_lib'
diff --git a/resources/ox_target-main/locales/cs.json b/resources/ox_target-main/locales/cs.json
new file mode 100644
index 000000000..f926b7ae6
--- /dev/null
+++ b/resources/ox_target-main/locales/cs.json
@@ -0,0 +1,16 @@
+{
+ "toggle_front_driver_door": "Přední dveře řidiče",
+ "toggle_front_passenger_door": "Přední dveře spolujezdce",
+ "toggle_rear_driver_door": "Zadní dveře řidiče",
+ "toggle_rear_passenger_door": "Zadní dveře spolujezdce",
+ "toggle_hood": "Kapota",
+ "toggle_trunk": "Kufr",
+ "debug_box": "(Debug) Box",
+ "debug_sphere": "(Debug) Koule",
+ "debug_police_car": "Policejní auto",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Vozidlo",
+ "debug_object": "(Debug) Objekt",
+ "toggle_targeting": "Výběr zaměření",
+ "go_back": "Zpět"
+}
diff --git a/resources/ox_target-main/locales/da.json b/resources/ox_target-main/locales/da.json
new file mode 100644
index 000000000..9cd7c2e2b
--- /dev/null
+++ b/resources/ox_target-main/locales/da.json
@@ -0,0 +1,17 @@
+{
+ "toggle_front_driver_door": "Skift forreste førerdør",
+ "toggle_front_passenger_door": "Skift forreste passagerdør",
+ "toggle_rear_driver_door": "Skift bageste førerdør",
+ "toggle_rear_passenger_door": "Skift bageste passagerdør",
+ "toggle_hood": "Skift motorhjelm",
+ "toggle_trunk": "Skift bagagerum",
+ "debug_box": "(Debug) Boks",
+ "debug_sphere": "(Debug) Kugle",
+ "debug_police_car": "Politibil",
+ "debug_ped": "(Debug) Person",
+ "debug_vehicle": "(Debug) Køretøj",
+ "debug_object": "(Debug) Objekt",
+ "debug_global": "(Debug) Global",
+ "toggle_targeting": "Skift målretning",
+ "go_back": "Gå tilbage"
+}
diff --git a/resources/ox_target-main/locales/de.json b/resources/ox_target-main/locales/de.json
new file mode 100644
index 000000000..f5953e448
--- /dev/null
+++ b/resources/ox_target-main/locales/de.json
@@ -0,0 +1,15 @@
+{
+ "toggle_front_driver_door": "Vordere Fahrertür umschalten",
+ "toggle_front_passenger_door": "Vordere Beifahrertür umschalten",
+ "toggle_rear_driver_door": "Hintere Fahrertür umschalten",
+ "toggle_rear_passenger_door": "Hintere Beifahrertür umschalten",
+ "toggle_hood": "Motorhaube umschalten",
+ "toggle_trunk": "Kofferraum umschalten",
+ "debug_box": "(Debug) Box",
+ "debug_sphere": "(Debug) Sphäre",
+ "debug_police_car": "Polizeiauto",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Fahrzeug",
+ "debug_object": "(Debug) Objekt",
+ "toggle_targeting": "Zielen umschalten"
+}
diff --git a/resources/ox_target-main/locales/en.json b/resources/ox_target-main/locales/en.json
new file mode 100644
index 000000000..1e606bee1
--- /dev/null
+++ b/resources/ox_target-main/locales/en.json
@@ -0,0 +1,17 @@
+{
+ "toggle_front_driver_door": "Toggle front driver door",
+ "toggle_front_passenger_door": "Toggle front passenger door",
+ "toggle_rear_driver_door": "Toggle rear driver door",
+ "toggle_rear_passenger_door": "Toggle rear passenger door",
+ "toggle_hood": "Toggle hood",
+ "toggle_trunk": "Toggle trunk",
+ "debug_box": "(Debug) Box",
+ "debug_sphere": "(Debug) Sphere",
+ "debug_police_car": "Police car",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Vehicle",
+ "debug_object": "(Debug) Object",
+ "debug_global": "(Debug) Global",
+ "toggle_targeting": "Toggle targeting",
+ "go_back": "Go back"
+}
diff --git a/resources/ox_target-main/locales/es.json b/resources/ox_target-main/locales/es.json
new file mode 100644
index 000000000..2bd5f257b
--- /dev/null
+++ b/resources/ox_target-main/locales/es.json
@@ -0,0 +1,15 @@
+{
+ "toggle_front_driver_door": "Abrir/Cerrar puerta delantera del conductor",
+ "toggle_front_passenger_door": "Abrir/Cerrar puerta delantera del pasajero",
+ "toggle_rear_driver_door": "Abrir/Cerrar puerta trasera del conductor",
+ "toggle_rear_passenger_door": "Abrir/Cerrar puerta trasera del pasajero",
+ "toggle_hood": "Abrir/Cerrar capó",
+ "toggle_trunk": "Abrir/Cerrar maletero",
+ "debug_box": "(Debug) Caja",
+ "debug_sphere": "(Debug) Esfera",
+ "debug_police_car": "Coche de policía",
+ "debug_ped": "(Debug) Peatón",
+ "debug_vehicle": "(Debug) Vehículo",
+ "debug_object": "(Debug) Objeto",
+ "toggle_targeting": "Activar/Desactivar apuntado"
+}
diff --git a/resources/ox_target-main/locales/et.json b/resources/ox_target-main/locales/et.json
new file mode 100644
index 000000000..f2176b553
--- /dev/null
+++ b/resources/ox_target-main/locales/et.json
@@ -0,0 +1,16 @@
+{
+ "toggle_front_driver_door": "Ava/sulge eesuks",
+ "toggle_front_passenger_door": "Ava/sulge eesuks",
+ "toggle_rear_driver_door": "Ava/sulge tagauks",
+ "toggle_rear_passenger_door": "Ava/sulge tagauks",
+ "toggle_hood": "Ava/sulge kapott",
+ "toggle_trunk": "Ava/sulge pagasiruum",
+ "debug_box": "(Debug) Kast",
+ "debug_sphere": "(Debug) Kera",
+ "debug_police_car": "Politseiauto",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Sõiduk",
+ "debug_object": "(Debug) Objekt",
+ "toggle_targeting": "Näita kolmandat silma",
+ "go_back": "Mine tagasi"
+}
\ No newline at end of file
diff --git a/resources/ox_target-main/locales/fi.json b/resources/ox_target-main/locales/fi.json
new file mode 100644
index 000000000..738bf28d0
--- /dev/null
+++ b/resources/ox_target-main/locales/fi.json
@@ -0,0 +1,15 @@
+{
+ "toggle_front_driver_door": "Avaa/Sulje kuljettajan etuovi",
+ "toggle_front_passenger_door": "Avaa/Sulje repsikan etuovi",
+ "toggle_rear_driver_door": "Avaa/Sulje kuljettajan takaovi",
+ "toggle_rear_passenger_door": "Avaa/Sulje repsikan takaovi",
+ "toggle_hood": "Avaa/Sulje konepelti",
+ "toggle_trunk": "Avaa/Sulje takakontti",
+ "debug_box": "(Debug) Laatikko",
+ "debug_sphere": "(Debug) Ympyrä",
+ "debug_police_car": "Poliisiauto",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Ajoneuvo",
+ "debug_object": "(Debug) Objekti",
+ "toggle_targeting": "Päällä/Pois tähtäys"
+}
diff --git a/resources/ox_target-main/locales/fr.json b/resources/ox_target-main/locales/fr.json
new file mode 100644
index 000000000..d3a007799
--- /dev/null
+++ b/resources/ox_target-main/locales/fr.json
@@ -0,0 +1,16 @@
+{
+ "toggle_front_driver_door": "Porte conducteur avant",
+ "toggle_front_passenger_door": "Porte passager avant",
+ "toggle_rear_driver_door": "Porte conducteur arrière",
+ "toggle_rear_passenger_door": "Porte passager arrière",
+ "toggle_hood": "Capot",
+ "toggle_trunk": "Coffre",
+ "debug_box": "(Debug) Box",
+ "debug_sphere": "(Debug) Sphère",
+ "debug_police_car": "Véhicule de police",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Véhicule",
+ "debug_object": "(Debug) Objet",
+ "toggle_targeting": "Afficher le système d'interaction",
+ "go_back": "Retour"
+}
diff --git a/resources/ox_target-main/locales/hr.json b/resources/ox_target-main/locales/hr.json
new file mode 100644
index 000000000..70819e9d2
--- /dev/null
+++ b/resources/ox_target-main/locales/hr.json
@@ -0,0 +1,15 @@
+{
+ "toggle_front_driver_door": "Prednja lijeva vrata",
+ "toggle_front_passenger_door": "Prednja desna vrata",
+ "toggle_rear_driver_door": "Zadnja lijeva vrata",
+ "toggle_rear_passenger_door": "Zadnja desna vrata",
+ "toggle_hood": "Hauba",
+ "toggle_trunk": "Gepek",
+ "debug_box": "(Debug) Kocka (Box)",
+ "debug_sphere": "(Debug) Sfera (Sphere)",
+ "debug_police_car": "Policijski auto",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Auto",
+ "debug_object": "(Debug) Objekt",
+ "toggle_targeting": "Upali/Ugasi Target sistem"
+}
diff --git a/resources/ox_target-main/locales/hu.json b/resources/ox_target-main/locales/hu.json
new file mode 100644
index 000000000..a1543898b
--- /dev/null
+++ b/resources/ox_target-main/locales/hu.json
@@ -0,0 +1,16 @@
+{
+"toggle_front_driver_door": "Sofőroldali ajtó nyitása/zárása",
+"toggle_front_passenger_door": "Anyósülés oldali ajtó nyitása/zárása",
+"toggle_rear_driver_door": "Sofőroldali hátsó ajtó nyitása/zárása",
+"toggle_rear_passenger_door": "Anyósülés oldali hátsó ajtó nyitása/zárása",
+"toggle_hood": "Motorháztető nyitása/zárása",
+"toggle_trunk": "Csomagtartó nyitása/zárása",
+"debug_box": "(Hibakeresés) Doboz",
+"debug_sphere": "(Hibakeresés) Gömb",
+"debug_police_car": "(Hibakeresés) Rendőrautó",
+"debug_ped": "(Hibakeresés) Entitás",
+"debug_vehicle": "(Hibakeresés) Jármű",
+"debug_object": "(Hibakeresés) Objekt",
+"toggle_targeting": "Célzó be- és kikapcsolása",
+"go_back": "Vissza"
+}
diff --git a/resources/ox_target-main/locales/id.json b/resources/ox_target-main/locales/id.json
new file mode 100644
index 000000000..771c65e45
--- /dev/null
+++ b/resources/ox_target-main/locales/id.json
@@ -0,0 +1,15 @@
+{
+ "toggle_front_driver_door": "Tombol pintu pengemudi depan",
+ "toggle_front_passenger_door": "Tombol pintu penumpang depan",
+ "toggle_rear_driver_door": "Tombol pintu pengemudi belakang",
+ "toggle_rear_passenger_door": "Tombol pintu penumpang belakang",
+ "toggle_hood": "Tombol kap",
+ "toggle_trunk": "Tombol bagasi",
+ "debug_box": "(Debug) Kotak",
+ "debug_sphere": "(Debug) Bola",
+ "debug_police_car": "Mobil polisi",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Kendaraan",
+ "debug_object": "(Debug) Objek",
+ "toggle_targeting": "Tombol penargetan"
+}
diff --git a/resources/ox_target-main/locales/it.json b/resources/ox_target-main/locales/it.json
new file mode 100644
index 000000000..71915d453
--- /dev/null
+++ b/resources/ox_target-main/locales/it.json
@@ -0,0 +1,16 @@
+{
+ "toggle_front_driver_door": "Apri/Chiudi portiera anteriore sinistra",
+ "toggle_front_passenger_door": "Apri/Chiudi portiera anteriore destra",
+ "toggle_rear_driver_door": "Apri/Chiudi portiera posteriore sinistra",
+ "toggle_rear_passenger_door": "Apri/Chiudi portiera posteriore destra",
+ "toggle_hood": "Apri/Chiudi Cofano",
+ "toggle_trunk": "Apri/Chiudi Bagagliaio",
+ "debug_box": "(Debug) Box",
+ "debug_sphere": "(Debug) Sphere",
+ "debug_police_car": "Auto Polizia",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Vehicle",
+ "debug_object": "(Debug) Object",
+ "toggle_targeting": "Apri/Chiudi targeting",
+ "go_back": "Indietro"
+}
diff --git a/resources/ox_target-main/locales/nl.json b/resources/ox_target-main/locales/nl.json
new file mode 100644
index 000000000..8c6ef12cf
--- /dev/null
+++ b/resources/ox_target-main/locales/nl.json
@@ -0,0 +1,15 @@
+{
+ "toggle_front_driver_door": "Toggle bestuurdersdeur",
+ "toggle_front_passenger_door": "Toggle bijrijdersdeur",
+ "toggle_rear_driver_door": "Toggle achterdeur links",
+ "toggle_rear_passenger_door": "Toggle achterdeur rechts",
+ "toggle_hood": "Toggle motorkap",
+ "toggle_trunk": "Toggle kofferbak",
+ "debug_box": "(Debug) Doos",
+ "debug_sphere": "(Debug) Bol",
+ "debug_police_car": "Politie voertuig",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Voertuig",
+ "debug_object": "(Debug) Object",
+ "toggle_targeting": "Toggle richten"
+}
diff --git a/resources/ox_target-main/locales/pl.json b/resources/ox_target-main/locales/pl.json
new file mode 100644
index 000000000..c4f282706
--- /dev/null
+++ b/resources/ox_target-main/locales/pl.json
@@ -0,0 +1,16 @@
+{
+ "toggle_front_driver_door": "Przednie drzwi kierowcy",
+ "toggle_front_passenger_door": "Przednie drzwi pasażera",
+ "toggle_rear_driver_door": "Tylne drzwi kierowcy",
+ "toggle_rear_passenger_door": "Tylne drzwi pasażera",
+ "toggle_hood": "Maska",
+ "toggle_trunk": "Bagażnik",
+ "debug_box": "(Debug) Blok",
+ "debug_sphere": "(Debug) Kula",
+ "debug_police_car": "Radiowóz",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Pojazd",
+ "debug_object": "(Debug) Obiekt",
+ "toggle_targeting": "Przełącz celowanie",
+ "go_back": "Wróć"
+}
diff --git a/resources/ox_target-main/locales/pt-br.json b/resources/ox_target-main/locales/pt-br.json
new file mode 100644
index 000000000..5aef6e6ee
--- /dev/null
+++ b/resources/ox_target-main/locales/pt-br.json
@@ -0,0 +1,16 @@
+{
+ "toggle_front_driver_door": "Abrir a porta do motorista dianteira",
+ "toggle_front_passenger_door": "Abrir a porta dianteira do passageiro",
+ "toggle_rear_driver_door": "Abrir a porta traseira do motorista",
+ "toggle_rear_passenger_door": "Abrir a porta traseira do passageiro",
+ "toggle_hood": "Abrir o capô",
+ "toggle_trunk": "Abrir o porta-malas",
+ "debug_box": "(Debug) Caixa",
+ "debug_sphere": "(Debug) Esfera",
+ "debug_police_car": "Carro de polícia",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Veículo",
+ "debug_object": "(Debug) Objeto",
+ "toggle_targeting": "Alternar mira",
+ "go_back": "Voltar"
+}
diff --git a/resources/ox_target-main/locales/pt.json b/resources/ox_target-main/locales/pt.json
new file mode 100644
index 000000000..5aef6e6ee
--- /dev/null
+++ b/resources/ox_target-main/locales/pt.json
@@ -0,0 +1,16 @@
+{
+ "toggle_front_driver_door": "Abrir a porta do motorista dianteira",
+ "toggle_front_passenger_door": "Abrir a porta dianteira do passageiro",
+ "toggle_rear_driver_door": "Abrir a porta traseira do motorista",
+ "toggle_rear_passenger_door": "Abrir a porta traseira do passageiro",
+ "toggle_hood": "Abrir o capô",
+ "toggle_trunk": "Abrir o porta-malas",
+ "debug_box": "(Debug) Caixa",
+ "debug_sphere": "(Debug) Esfera",
+ "debug_police_car": "Carro de polícia",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Veículo",
+ "debug_object": "(Debug) Objeto",
+ "toggle_targeting": "Alternar mira",
+ "go_back": "Voltar"
+}
diff --git a/resources/ox_target-main/locales/ro.json b/resources/ox_target-main/locales/ro.json
new file mode 100644
index 000000000..89133186c
--- /dev/null
+++ b/resources/ox_target-main/locales/ro.json
@@ -0,0 +1,17 @@
+{
+ "toggle_front_driver_door": "Comută ușa șoferului",
+ "toggle_front_passenger_door": "Comută ușa pasagerului",
+ "toggle_rear_driver_door": "Comută ușa din spatele șoferului",
+ "toggle_rear_passenger_door": "Comută ușa pasagerului din spate",
+ "toggle_hood": "Comută capota",
+ "toggle_trunk": "Comută portbagajul",
+ "debug_box": "(Debug) Cutie",
+ "debug_sphere": "(Debug) Sferă",
+ "debug_police_car": "Mașină de poliție",
+ "debug_ped": "(Debug) Pedestrian",
+ "debug_vehicle": "(Debug) Vehicul",
+ "debug_object": "(Debug) Obiect",
+ "debug_global": "(Debug) Global",
+ "toggle_targeting": "Foloseste ochiul",
+ "go_back": "Întoarce-te"
+}
diff --git a/resources/ox_target-main/locales/sl.json b/resources/ox_target-main/locales/sl.json
new file mode 100644
index 000000000..effae26f4
--- /dev/null
+++ b/resources/ox_target-main/locales/sl.json
@@ -0,0 +1,15 @@
+{
+ "toggle_front_driver_door": "Odpri/Zapri leva sprednja vrata",
+ "toggle_front_passenger_door": "Odpri/Zapri desna sprednja vrata",
+ "toggle_rear_driver_door": "Odpri/Zapri leva zadnja vrata",
+ "toggle_rear_passenger_door": "Odpri/Zapri desna zadnja vrata",
+ "toggle_hood": "Odpri/Zapri pokrov motorja",
+ "toggle_trunk": "Odpri/Zapri prtljažnik",
+ "debug_box": "(Debug) Kvadrat",
+ "debug_sphere": "(Debug) Krog",
+ "debug_police_car": "Policijsko vozilo",
+ "debug_ped": "(Debug) Pešec",
+ "debug_vehicle": "(Debug) Vozilo",
+ "debug_object": "(Debug) Predmet",
+ "toggle_targeting": "Vklopi/Izklopi tretje oko"
+ }
diff --git a/resources/ox_target-main/locales/tr.json b/resources/ox_target-main/locales/tr.json
new file mode 100644
index 000000000..e6f98949f
--- /dev/null
+++ b/resources/ox_target-main/locales/tr.json
@@ -0,0 +1,17 @@
+{
+ "toggle_front_driver_door": "Ön sürücü tarafı kapısını aç/kapa",
+ "toggle_front_passenger_door": "Ön yolcu tarafı kapısını aç/kapa",
+ "toggle_rear_driver_door": "Arka sürücü tarafı kapısını aç/kapa",
+ "toggle_rear_passenger_door": "Arka yolcu tarafı kapısını aç/kapa",
+ "toggle_hood": "Kaputu aç/kapa",
+ "toggle_trunk": "Bagajı aç/kapa",
+ "debug_box": "(Debug) Kutu",
+ "debug_sphere": "(Debug) Küre",
+ "debug_police_car": "Polis arabası",
+ "debug_ped": "(Debug) Ped",
+ "debug_vehicle": "(Debug) Araç",
+ "debug_object": "(Debug) Nesne",
+ "debug_global": "(Debug) Genel",
+ "toggle_targeting": "Hedeflemeyi aç/kapa",
+ "go_back": "Geri dön"
+}
diff --git a/resources/ox_target-main/locales/zh-cn.json b/resources/ox_target-main/locales/zh-cn.json
new file mode 100644
index 000000000..4fb07f545
--- /dev/null
+++ b/resources/ox_target-main/locales/zh-cn.json
@@ -0,0 +1,17 @@
+{
+ "toggle_front_driver_door": "开关左前车门",
+ "toggle_front_passenger_door": "开关左后车门",
+ "toggle_rear_driver_door": "开关右前车门",
+ "toggle_rear_passenger_door": "开关右后车门",
+ "toggle_hood": "打开引擎盖",
+ "toggle_trunk": "打开后备箱",
+ "debug_box": "(Debug) 矩形区域",
+ "debug_sphere": "(Debug) 球形区域",
+ "debug_police_car": "警车",
+ "debug_ped": "(Debug) 角色实体",
+ "debug_vehicle": "(Debug) 车辆",
+ "debug_object": "(Debug) 物体",
+ "debug_global": "(Debug) 全局对象",
+ "toggle_targeting": "交互菜单",
+ "go_back": "返回"
+}
diff --git a/resources/ox_target-main/locales/zh-tw.json b/resources/ox_target-main/locales/zh-tw.json
new file mode 100644
index 000000000..1a826ca21
--- /dev/null
+++ b/resources/ox_target-main/locales/zh-tw.json
@@ -0,0 +1,17 @@
+{
+ "toggle_front_driver_door": "開關左前車門",
+ "toggle_front_passenger_door": "開關左後車門",
+ "toggle_rear_driver_door": "開關右前車門",
+ "toggle_rear_passenger_door": "開關右後車門",
+ "toggle_hood": "打開引擎蓋",
+ "toggle_trunk": "打開後備箱",
+ "debug_box": "(Debug) 矩形區域",
+ "debug_sphere": "(Debug) 球形區域",
+ "debug_police_car": "警車",
+ "debug_ped": "(Debug) 角色實體",
+ "debug_vehicle": "(Debug) 車輛",
+ "debug_object": "(Debug) 物體",
+ "debug_global": "(Debug) 全局對象",
+ "toggle_targeting": "交互菜單",
+ "go_back": "返回"
+}
diff --git a/resources/ox_target-main/server/main.lua b/resources/ox_target-main/server/main.lua
new file mode 100644
index 000000000..7bab54b30
--- /dev/null
+++ b/resources/ox_target-main/server/main.lua
@@ -0,0 +1,48 @@
+lib.versionCheck('overextended/ox_target')
+
+if not lib.checkDependency('ox_lib', '3.30.0', true) then return end
+
+---@type table
+local entityStates = {}
+
+---@param netId number
+RegisterNetEvent('ox_target:setEntityHasOptions', function(netId)
+ local entity = Entity(NetworkGetEntityFromNetworkId(netId))
+ entity.state.hasTargetOptions = true
+ entityStates[netId] = entity
+end)
+
+---@param netId number
+---@param door number
+RegisterNetEvent('ox_target:toggleEntityDoor', function(netId, door)
+ local entity = NetworkGetEntityFromNetworkId(netId)
+ if not DoesEntityExist(entity) then return end
+
+ local owner = NetworkGetEntityOwner(entity)
+ TriggerClientEvent('ox_target:toggleEntityDoor', owner, netId, door)
+end)
+
+CreateThread(function()
+ local arr = {}
+ local num = 0
+
+ while true do
+ Wait(10000)
+
+ for netId, entity in pairs(entityStates) do
+ if not DoesEntityExist(entity.__data) or not entity.state.hasTargetOptions then
+ entityStates[netId] = nil
+ num += 1
+
+ arr[num] = netId
+ end
+ end
+
+ if num > 0 then
+ TriggerClientEvent('ox_target:removeEntity', -1, arr)
+ table.wipe(arr)
+
+ num = 0
+ end
+ end
+end)
diff --git a/resources/ox_target-main/web/index.html b/resources/ox_target-main/web/index.html
new file mode 100644
index 000000000..f33c5f8e2
--- /dev/null
+++ b/resources/ox_target-main/web/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/ox_target-main/web/js/createOptions.js b/resources/ox_target-main/web/js/createOptions.js
new file mode 100644
index 000000000..193f25a84
--- /dev/null
+++ b/resources/ox_target-main/web/js/createOptions.js
@@ -0,0 +1,30 @@
+import { fetchNui } from "./fetchNui.js";
+
+const optionsWrapper = document.getElementById("options-wrapper");
+
+function onClick() {
+ // when nuifocus is disabled after a click, the hover event is never released
+ this.style.pointerEvents = "none";
+
+ fetchNui("select", [this.targetType, this.targetId, this.zoneId]);
+ // is there a better way to handle this? probably
+ setTimeout(() => (this.style.pointerEvents = "auto"), 100);
+}
+
+export function createOptions(type, data, id, zoneId) {
+ if (data.hide) return;
+
+ const option = document.createElement("div");
+ const iconElement = ``;
+
+ option.innerHTML = `${iconElement}${data.label}
`;
+ option.className = "option-container";
+ option.targetType = type;
+ option.targetId = id;
+ option.zoneId = zoneId;
+
+ option.addEventListener("click", onClick);
+ optionsWrapper.appendChild(option);
+}
diff --git a/resources/ox_target-main/web/js/fetchNui.js b/resources/ox_target-main/web/js/fetchNui.js
new file mode 100644
index 000000000..2382f35ba
--- /dev/null
+++ b/resources/ox_target-main/web/js/fetchNui.js
@@ -0,0 +1,13 @@
+const resource = GetParentResourceName();
+
+export async function fetchNui(eventName, data) {
+ const resp = await fetch(`https://${resource}/${eventName}`, {
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/json; charset=UTF-8',
+ },
+ body: JSON.stringify(data),
+ });
+
+ return await resp.json();
+}
diff --git a/resources/ox_target-main/web/js/main.js b/resources/ox_target-main/web/js/main.js
new file mode 100644
index 000000000..31a9d4dfd
--- /dev/null
+++ b/resources/ox_target-main/web/js/main.js
@@ -0,0 +1,40 @@
+import { createOptions } from "./createOptions.js";
+
+const optionsWrapper = document.getElementById("options-wrapper");
+const body = document.body;
+const eye = document.getElementById("eyeSvg");
+
+window.addEventListener("message", (event) => {
+ optionsWrapper.innerHTML = "";
+
+ switch (event.data.event) {
+ case "visible": {
+ body.style.visibility = event.data.state ? "visible" : "hidden";
+ return eye.classList.remove("eye-hover");
+ }
+
+ case "leftTarget": {
+ return eye.classList.remove("eye-hover");
+ }
+
+ case "setTarget": {
+ eye.classList.add("eye-hover");
+
+ if (event.data.options) {
+ for (const type in event.data.options) {
+ event.data.options[type].forEach((data, id) => {
+ createOptions(type, data, id + 1);
+ });
+ }
+ }
+
+ if (event.data.zones) {
+ for (let i = 0; i < event.data.zones.length; i++) {
+ event.data.zones[i].forEach((data, id) => {
+ createOptions("zones", data, id + 1, i + 1);
+ });
+ }
+ }
+ }
+ }
+});
diff --git a/resources/ox_target-main/web/style.css b/resources/ox_target-main/web/style.css
new file mode 100644
index 000000000..d992dba68
--- /dev/null
+++ b/resources/ox_target-main/web/style.css
@@ -0,0 +1,91 @@
+@import url("https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;500;600;700&display=swap");
+
+:root {
+ --color-default: #cfd2da;
+ --color-hover: white;
+}
+
+body {
+ visibility: hidden;
+ user-select: none;
+ white-space: nowrap;
+ margin: 0;
+ user-select: none;
+ overflow: hidden;
+}
+
+p {
+ margin: 0;
+}
+
+.material-symbols-outlined {
+ font-variation-settings: "FILL" 0, "wght" 300, "GRAD" 0, "opsz" 40;
+}
+
+#eye {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ font-size: 22pt;
+ fill: black;
+}
+
+.eye-hover {
+ fill: var(--color-default);
+}
+
+#options-wrapper {
+ position: absolute;
+ top: calc(48.4%);
+ left: calc(50% + 18pt);
+}
+
+.option-container {
+ color: var(--color-default);
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ font-family: "Nunito";
+ background: linear-gradient(
+ 90deg,
+ rgba(20, 20, 20, 0.7) 0%,
+ rgba(20, 20, 20, 0.6) 66%,
+ rgba(47, 48, 53, 0) 100%
+ );
+ font-size: 11pt;
+ line-height: 22pt;
+ vertical-align: middle;
+ margin: 2pt;
+ transition: 300ms;
+ transform-origin: left top;
+ scale: 1;
+ height: 22pt;
+ width: 150pt;
+ top: 0;
+}
+
+.option-container:hover {
+ background: linear-gradient(
+ 90deg,
+ rgba(30, 30, 30, 0.7) 0%,
+ rgba(30, 30, 30, 0.6) 66%,
+ rgba(57, 58, 63, 0) 100%
+ );
+ transform-origin: left top;
+ color: var(--color-hover);
+ margin-left: 4pt;
+}
+
+.option-icon {
+ font-size: 12pt;
+ line-height: 22pt;
+ width: 14pt;
+ margin: 5pt;
+ color: var(--color-default);
+}
+
+.option-label {
+ font-weight: 500;
+}
diff --git a/resources/vMenu/config/addons.json b/resources/vMenu/config/addons.json
index b956aad33..37ed84558 100644
--- a/resources/vMenu/config/addons.json
+++ b/resources/vMenu/config/addons.json
@@ -919,7 +919,11 @@
"rx7fd3s",
"col20fpiu",
"ls20fpiu",
- " ",
+ "q50s2023",
+ "q60pbs",
+ "offbaseq50",
+ "cascadia",
+ " ",
" "
],
"peds": [
diff --git a/server.cfg b/server.cfg
index 9ac8962d0..5733e5363 100644
--- a/server.cfg
+++ b/server.cfg
@@ -131,6 +131,7 @@ ensure TakeHostage
ensure PlayerRagdoll
//exec resources/sil-permissions.cfg
//ensure Sil-Nuke
+ensure CarWipe
ensure VapeScript
ensure PauseMenu-Title
ensure Player-Tracer
@@ -214,14 +215,14 @@ ensure ebu_connect
ensure ebu_trailer
ensure ebu_flatbeds
ensure Maxlasd18charger
-ensure
-
+ensure ox_target-main
+ensure cd_holsteranimation
+ensure cd_holsteranimationsounds
ensure reverse-hud
ensure helicam
ensure tommys-pov
-ensure holstersounds
-ensure unholster
+
ensure wk_wars2x
ensure Better-Torch
ensure KiloImmersiveTackle
@@ -272,11 +273,11 @@ ensure BigDaddy-EAS
ensure BigDaddy-Fishing
ensure BigDaddy-Hunting
ensure BigDaddy-Jobs-BusDriver
-ensure BigDaddy-LEO
+ensure
ensure BigDaddy-Money
ensure BigDaddy-RadioAnimation
-ensure BigDaddy-Tazed
-ensure BigDaddy-VendingMachines
+ensure
+ensure
ensure
ensure
ensure
@@ -1214,11 +1215,15 @@ ensure db12cp
ensure dc_bentayga
ensure oyctbs
ensure col20fpiu
+ensure 20legacyfpiu3
+ensure 2565egacyrango1
+ensure cascadia
+ensure KenworthK100
+ensure q50s2023
+ensure q60pbs
+ensure offbaseq50
ensure
ensure
-ensure
-
-
#[Skins]