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 + +![](https://img.shields.io/github/downloads/overextended/ox_target/total?logo=github) +![](https://img.shields.io/github/downloads/overextended/ox_target/latest/total?logo=github) +![](https://img.shields.io/github/contributors/overextended/ox_target?logo=github) +![](https://img.shields.io/github/v/release/overextended/ox_target?logo=github) + + +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]