diff --git a/resources/22f150rb/__resource.lua b/resources/22f150rb/__resource.lua
new file mode 100644
index 000000000..e85b41837
--- /dev/null
+++ b/resources/22f150rb/__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/22f150rb/carcols.meta b/resources/22f150rb/carcols.meta
new file mode 100644
index 000000000..c5a99991d
--- /dev/null
+++ b/resources/22f150rb/carcols.meta
@@ -0,0 +1,1641 @@
+
+
+
+ -
+ 240914_20fpiu_modkit
+
+ MKT_STANDARD
+
+
-
+ ftplate_20fpiu
+ mis_ftplate
+
+
+
- fplate
+
+ VMT_GRILL
+ chassis
+ chassis
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ rtplate_20fpiu
+ mis_rtplate
+
+
+
- rplate
+
+ VMT_TRUNK
+ boot
+ chassis
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ ac_unit
+ ac_unit
+
+
+ VMT_CHASSIS2
+ chassis
+ chassis
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ fog_covers_plastic
+ fog_covers_plastic
+
+
+
- fog_real
+
+ VMT_BUMPER_F
+ bumper_f
+ chassis
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ westin_2020_mid
+ westin
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_8
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ westin_2020_pit
+ westin
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_9
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ westin_2020_full
+ westin
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_9
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ PB-4_20fpiu
+ pb4
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_10
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ PB-6_20fpiu
+ pb6
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_4
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ PB-8_20fpiu
+ pb8
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_5
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ PB-9_20fpiu
+ pb9
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_6
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ PB-10_20fpiu
+ pb10
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_7
+ VMCP_DEFAULT
+
+
+
+
+
+
+ -
+ PB-5_20fpiu
+ pb5
+
+
+
+ VMT_CHASSIS
+ chassis
+ mod_col_3
+ VMCP_DEFAULT
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ VMT_CHASSIS
+ Pushbar Options
+
+ -
+ VMT_ROOF
+ ALPR's
+
+ -
+ VMT_GRILL
+ Front Plate
+
+ -
+ VMT_BOOT
+ Rear Plate
+
+ -
+ VMT_BUMPER_F
+ Fog Lights
+
+ -
+ VMT_CHASSIS3
+ Reflective Trunk Decals
+
+ -
+ VMT_CHASSIS2
+ AC Unit
+
+
+
+
+
+
+ -
+
+ 22f150rb
+
+
+
+
+
+
+
+ VehicleLight_sirenlight
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VehicleLight_car_standardmodern
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2020interceptorutility
+
+
+
\ No newline at end of file
diff --git a/resources/22f150rb/carvariations.meta b/resources/22f150rb/carvariations.meta
new file mode 100644
index 000000000..45e1cbe6d
--- /dev/null
+++ b/resources/22f150rb/carvariations.meta
@@ -0,0 +1,62 @@
+
+
+
+ -
+ 22f150rb
+
+
-
+
+ 0
+ 134
+ 0
+ 64
+ 64
+ 64
+ 64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - 240914_20fpiu_modkit
+
+
+
+
+ -
+ Police guv plate
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/22f150rb/handling.meta b/resources/22f150rb/handling.meta
new file mode 100644
index 000000000..4997229ad
--- /dev/null
+++ b/resources/22f150rb/handling.meta
@@ -0,0 +1,110 @@
+
+
+
+
+ -
+ 22f150rb
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 440010
+ 0
+ 0
+ AVERAGE
+
+
-
+
+
- VEHICLE_WEAPON_RADAR
+
+
+
+
+ 0
+ 0
+ 0
+
+
+ 3.000000
+ 0.000000
+
+
+ -0.400000
+ 0.000000
+
+
+ 0.707000
+ 0.000000
+
+
+ -0.500000
+ 0.000000
+
+
+ 0.000000
+ 0.000000
+
+
+ 25.000000
+ 0.000000
+
+
+ -0.080000
+ 0.000000
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/22f150rb/stream/22f150rb.yft b/resources/22f150rb/stream/22f150rb.yft
new file mode 100644
index 000000000..2f496bc8c
--- /dev/null
+++ b/resources/22f150rb/stream/22f150rb.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf7f3c2b2cf2b61722b59479013158550954f1cefb8b8a674c513f90839af0df
+size 10620088
diff --git a/resources/22f150rb/stream/22f150rb.ytd b/resources/22f150rb/stream/22f150rb.ytd
new file mode 100644
index 000000000..86403651a
--- /dev/null
+++ b/resources/22f150rb/stream/22f150rb.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cafe8f6e29997c8ebe1c0e4b0a3bdb0e5a01b69d5dd60b4599318943bee329ee
+size 12049728
diff --git a/resources/22f150rb/stream/22f150rb_hi.yft b/resources/22f150rb/stream/22f150rb_hi.yft
new file mode 100644
index 000000000..76e2f6e42
--- /dev/null
+++ b/resources/22f150rb/stream/22f150rb_hi.yft
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4b845539a29d67153856a88e7ab8bcdd6527a8ea49699fa08e82d0c8296f06eb
+size 10619782
diff --git a/resources/22f150rb/ulc.lua b/resources/22f150rb/ulc.lua
new file mode 100644
index 000000000..e77108e24
--- /dev/null
+++ b/resources/22f150rb/ulc.lua
@@ -0,0 +1,50 @@
+
+--[[
+ 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 = {"22f150rb"},
+ steadyBurnConfig = {
+ forceOn = false, useTime = false,
+ disableWithLights = false,
+ sbExtras = {4}
+ },
+ parkConfig = {
+ usePark = true,
+ useSync = true,
+ syncWith = {"22f150","22f150rb"},
+ pExtras = {1},
+ dExtras = {2}
+ },
+ hornConfig = {
+ useHorn = false,
+ hornExtras = {},
+ },
+ brakeConfig = {
+ useBrakes = false,
+ speedThreshold = 3,
+ brakeExtras = {},
+ disableExtras = {}
+ },
+ reverseConfig = {
+ useReverse = false,
+ reverseExtras = {}
+ },
+ doorConfig = {
+ useDoors = false,
+ driverSide = {enable = {}, disable = {}},
+ passSide = {enable = {}, disable = {}},
+ trunk = {enable ={}, disable = {}}
+ },
+ buttons = {
+ {label = "PARK MODE", key = 1, color = "green", extra = 1, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = true},{label = "PURSUIT MODE", key = 2, color = "green", extra = 2, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = true},{label = "LOW CRUISE", key = 3, color = "green", extra = 5, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = false},{label = "CRUISE", key = 4, color = "green", extra = 4, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = false}
+ },
+ defaultStages = {
+ useDefaults = false,
+ enableKeys = {},
+ disableKeys = {}
+ }
+}
\ No newline at end of file
diff --git a/resources/22f150rb/vehicles.meta b/resources/22f150rb/vehicles.meta
new file mode 100644
index 000000000..286bf25a3
--- /dev/null
+++ b/resources/22f150rb/vehicles.meta
@@ -0,0 +1,150 @@
+
+
+ vehshare
+
+
+ -
+ 22f150rb
+ 22f150rb
+ 22f150rb
+ 22f150rb
+
+ null
+ null
+ null
+ null
+
+ null
+ police
+ 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 500.000000
+ 500.000000
+ 500.000000
+ 500.000000
+ 500.000000
+ 500.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
+
+ - boattrailer
+ - ftrailer
+ - ktrailer
+
+
+ - trailersmall2
+ - boattrailer
+
+
+ -
+ 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
+ 20sfpiufire
+
+
+
\ No newline at end of file
diff --git a/resources/[EGRP-Map-Addons]/gcom_highway/stream/[Exterior]/gc_hp_exterior_txt.ytd b/resources/[EGRP-Map-Addons]/gcom_highway/stream/[Exterior]/gc_hp_exterior_txt.ytd
index e1c9921be..984288f7f 100644
--- a/resources/[EGRP-Map-Addons]/gcom_highway/stream/[Exterior]/gc_hp_exterior_txt.ytd
+++ b/resources/[EGRP-Map-Addons]/gcom_highway/stream/[Exterior]/gc_hp_exterior_txt.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:05e71b1728ca56dca81e6769e21f1f80322df5d2f861b155ce17143b4ef8e5dc
-size 6954755
+oid sha256:cb8a55759367ad80632720cf134f7788da9c819b6acb4dc651d8d2043f57b613
+size 6960532
diff --git a/resources/[EGRP-Map-Addons]/gcom_highway/stream/[Interior]/gc_hp_int_txd.ytd b/resources/[EGRP-Map-Addons]/gcom_highway/stream/[Interior]/gc_hp_int_txd.ytd
index 12b8d2241..3e268055e 100644
--- a/resources/[EGRP-Map-Addons]/gcom_highway/stream/[Interior]/gc_hp_int_txd.ytd
+++ b/resources/[EGRP-Map-Addons]/gcom_highway/stream/[Interior]/gc_hp_int_txd.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:aca84811519363eeb0f1880ef841dd56469ad52040787fa7514e43d20d0f666c
-size 15533764
+oid sha256:72d7d2bbed0f0d4df0514ff1cda0e5b44f667a27196973943910101c37f826a8
+size 15516081
diff --git a/resources/[EGRP-Map-Addons]/int_sheriff_v2_dev/stream/int_sheriff1_props_txd.ytd b/resources/[EGRP-Map-Addons]/int_sheriff_v2_dev/stream/int_sheriff1_props_txd.ytd
index f8bced98e..d2cfd8647 100644
--- a/resources/[EGRP-Map-Addons]/int_sheriff_v2_dev/stream/int_sheriff1_props_txd.ytd
+++ b/resources/[EGRP-Map-Addons]/int_sheriff_v2_dev/stream/int_sheriff1_props_txd.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ebb8b842ae01eb74a489a9c32aace7616263bb19f03e5dcd2ea1d5cc002594ab
-size 5999375
+oid sha256:53a95f2c03c8e2e5c5362409163248a2f2a0df77fbee1e205a0f429d83067dbb
+size 5991462
diff --git a/resources/[EGRP-Map-Addons]/int_sheriff_v2_dev/stream/int_sheriff2_props_txd.ytd b/resources/[EGRP-Map-Addons]/int_sheriff_v2_dev/stream/int_sheriff2_props_txd.ytd
index bc037c93d..bfa371489 100644
--- a/resources/[EGRP-Map-Addons]/int_sheriff_v2_dev/stream/int_sheriff2_props_txd.ytd
+++ b/resources/[EGRP-Map-Addons]/int_sheriff_v2_dev/stream/int_sheriff2_props_txd.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9815a5b45c43f795e2059b3695a9da7c87c72289f31ffba28263a30bdf14e950
-size 9184294
+oid sha256:4f4c4287c487d8f0408e1486c3a8fa83cb985600f864a911de0854bcaf9d1a54
+size 9257020
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/.fxap b/resources/[EGRP-Map-Addons]/lasdmlo/.fxap
new file mode 100644
index 000000000..058d7dc4c
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/.fxap differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/README_gas_station_interior_fix.txt b/resources/[EGRP-Map-Addons]/lasdmlo/README_gas_station_interior_fix.txt
new file mode 100644
index 000000000..1d0167ad5
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/README_gas_station_interior_fix.txt
@@ -0,0 +1,13 @@
+Hi, thank you for purchasing this asset.
+
+This model requires a script to disable an 24/7 interior in the location, here's a simple script that does the job, but, you can use your own if you want, script link: https://github.com/RenanSeal/Disable-interior-fivem
+
+The model is set by default as a LSSD model, but in customizable optionals you'll find 2 props named logointerior.ydr and logoexterior.ydr, you just have to drop them on the [models]/props folder, delete shieldlogo.ydr, academydet.ydr and replace the textures on bcsolibtex.ytd, and the model will be ready to be set to any agency of your choice.
+
+2 other optional logos are available on the customizable_optionals folder, to use them, rename to shieldlogo and replace the one on [models]/props folder.
+
+In customizable optionals folder you'll also find a optional to the repair bay named "hangar.ydr" this one have no logos or lettering on the gas station covering, which will be useful in case of a customized station.
+
+All props and 3d have ytd files, where you can replace the textures using codewalker.
+
+Any questions or bug report you can contact me com my discord server: https://discord.com/invite/BeENBkyfyU
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/audio/bcsodoor_game.dat151.rel b/resources/[EGRP-Map-Addons]/lasdmlo/audio/bcsodoor_game.dat151.rel
new file mode 100644
index 000000000..1ce0fd2ec
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/audio/bcsodoor_game.dat151.rel differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/audio/bcsooccl_game.dat151.rel b/resources/[EGRP-Map-Addons]/lasdmlo/audio/bcsooccl_game.dat151.rel
new file mode 100644
index 000000000..30dbefb7a
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/audio/bcsooccl_game.dat151.rel differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/audio/lssdgate_game.dat151.rel b/resources/[EGRP-Map-Addons]/lasdmlo/audio/lssdgate_game.dat151.rel
new file mode 100644
index 000000000..2a1dcf685
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/audio/lssdgate_game.dat151.rel differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/3d logos/shieldlogobcso.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/3d logos/shieldlogobcso.ydr
new file mode 100644
index 000000000..4422c30ed
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/3d logos/shieldlogobcso.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:910689c3c1e1b6a3ec6ae734113f3a843ec39618d40575fb5872cbbc7d532546
+size 78992
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/3d logos/shieldlogosahp.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/3d logos/shieldlogosahp.ydr
new file mode 100644
index 000000000..ce065fc31
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/3d logos/shieldlogosahp.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bd087369b9ea2a57baf7f23560f4c54e76424a70eb9cf45bc46f0f83fc119172
+size 75962
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/hangar.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/hangar.ydr
new file mode 100644
index 000000000..1ae25107a
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/hangar.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fcc57bb42984081b1a1f01c471cb2ca8f44e9308977c0d1784da833da1aa1f4f
+size 306047
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/logoexterior.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/logoexterior.ydr
new file mode 100644
index 000000000..a6b7b0f73
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/logoexterior.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf138d6692ec5fc1ea2b667fa0da16b8ef5fcf1d1c83c9200d691a031bcde20e
+size 1888
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/logointerior.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/logointerior.ydr
new file mode 100644
index 000000000..0e99da467
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/customizable_optionals/logointerior.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a5ee7a26fc5467f4b664b99621e9c923be00867dc57d7c980e46858b4a1df4f5
+size 1951
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/fxmanifest.lua b/resources/[EGRP-Map-Addons]/lasdmlo/fxmanifest.lua
new file mode 100644
index 000000000..426faee27
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/fxmanifest.lua
@@ -0,0 +1,13 @@
+fx_version 'cerulean'
+games { 'gta5' }
+this_is_a_map 'yes'
+
+files {
+ "audio/bcsodoor_game.dat151.rel",
+ "audio/bcsooccl_game.dat151.rel",
+ "audio/lssdgate_game.dat151.rel"
+}
+data_file 'AUDIO_GAMEDATA' 'audio/bcsodoor_game.dat'
+data_file 'AUDIO_GAMEDATA' 'audio/bcsooccl_game.dat'
+data_file 'AUDIO_GAMEDATA' 'audio/lssdgate_game.dat'
+dependency '/assetpacks'
\ No newline at end of file
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/4030944142.ymt b/resources/[EGRP-Map-Addons]/lasdmlo/stream/4030944142.ymt
new file mode 100644
index 000000000..6b8faabc0
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/4030944142.ymt differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bcso_ground.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bcso_ground.ymap
new file mode 100644
index 000000000..afca1c8e1
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bcso_ground.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:db63a47b1f4cdb92042076d772261c4ce3b9f4159948342e7a087d4fb7d1147d
+size 4504
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bcsoshell.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bcsoshell.ymap
new file mode 100644
index 000000000..a8bac94c3
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bcsoshell.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06d50ee9feb29241c902b8d4b7e50b1c2083d1d7744e0f05bf9ceb6b4a82f991
+size 1330
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bollard.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bollard.ymap
new file mode 100644
index 000000000..9e61bfce7
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/bollard.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5af1c68f92616e4dde34d61779a66977eabe83b13cfc4bec39c7c549d7930fc6
+size 1152
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs4_02_grass_1.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs4_02_grass_1.ymap
new file mode 100644
index 000000000..cc20d096f
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs4_02_grass_1.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1f723e729d5f47d2f96227e85bcfa442f98fdd7c1df37472a3332a9ec772876f
+size 1115032
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs4_occl_04.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs4_occl_04.ymap
new file mode 100644
index 000000000..6318441c5
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs4_occl_04.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:946174ae1fb626234ae956628f170bb254e276e07bd6db5bee323a5947491ff7
+size 12542
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs5_roads_long_0.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs5_roads_long_0.ymap
new file mode 100644
index 000000000..4b73c06b7
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs5_roads_long_0.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3c0dd180f85ebcfb22e5a3ddaa0e355c62aa2f38cd383ff4e42573fbffcfdcd9
+size 12805
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs5_roads_strm_0.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs5_roads_strm_0.ymap
new file mode 100644
index 000000000..80508fa27
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/cs5_roads_strm_0.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:31a6a336423da66102854a6ce1414eec378d3c60eb3fe1b7be2cf083f48db8e9
+size 14006
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/env_misc.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/env_misc.ymap
new file mode 100644
index 000000000..72f0a236c
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/env_misc.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c4f6d425406a9d5a17cbaf7737eface3943eb4e66dd9631a39248a075830c10b
+size 2669
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/hangargarage.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/hangargarage.ymap
new file mode 100644
index 000000000..696294a08
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/hangargarage.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:49f2a4f6341e4484fee78e2dd903b9c32481030e895dd3f097a85c8e6fd91271
+size 3423
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_critical_9.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_critical_9.ymap
new file mode 100644
index 000000000..5146d20fa
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_critical_9.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:541f2be73782b69480a13b49ed2484b4a8ee4fd76e639ad130648c545ddeb94b
+size 18150
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_long_4.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_long_4.ymap
new file mode 100644
index 000000000..56bff0804
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_long_4.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:03a903d5c47d694201144001b9174c9417ed9c7496753c4bc6fb100e53aad6ec
+size 15450
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_strm_13.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_strm_13.ymap
new file mode 100644
index 000000000..ffc751f28
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_strm_13.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7b27008555f4704d95a859b8e2bb02f51fd191efff033d5aab47f9ca61dd271f
+size 17927
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_strm_6.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_strm_6.ymap
new file mode 100644
index 000000000..0073d3306
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_02_strm_6.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c58b5d4354a5edb847cfa02ef55a4a526abc952fd34afeaabbcfe8fe4966b04
+size 21600
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_lod.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_lod.ymap
new file mode 100644
index 000000000..a3c06a037
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[basemaps]/lr_cs4_lod.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9665cfbb01db749c1c0ffe9ca160b5821d03d57fe1cc1d06117016b2bd64e440
+size 1858
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/hi@lr_cs4_02_10.ybn b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/hi@lr_cs4_02_10.ybn
new file mode 100644
index 000000000..80a155855
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/hi@lr_cs4_02_10.ybn differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_24.ybn b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_24.ybn
new file mode 100644
index 000000000..9680ead6b
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_24.ybn differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_25.ybn b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_25.ybn
new file mode 100644
index 000000000..e67dbef86
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_25.ybn differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_30.ybn b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_30.ybn
new file mode 100644
index 000000000..10fa46ba1
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[col]/lr_cs4_02_30.ybn differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/bcso_wall.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/bcso_wall.ydr
new file mode 100644
index 000000000..489f0f3e7
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/bcso_wall.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1cb1dfd0b6b73f2abdddf31c774c5913ba847f5ada81ab5cde27360b554adf2
+size 3076167
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/bcsowall.ytyp b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/bcsowall.ytyp
new file mode 100644
index 000000000..e3eb4b607
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/bcsowall.ytyp differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_02_land14.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_02_land14.ydr
new file mode 100644
index 000000000..a1da98cb5
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_02_land14.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d397fd3a2301df3381cd7122f6dfc261bf3c68339405931d5e8377b56ab8cc10
+size 1479499
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod2_children.ydd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod2_children.ydd
new file mode 100644
index 000000000..d1abaa161
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod2_children.ydd differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod3.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod3.ydr
new file mode 100644
index 000000000..7124d6c5c
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod3.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:258fc25502d94ebcdfc646431aaebd151f056c79fd6af6a74d9069d4be79e3f7
+size 583872
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod3_children.ydd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod3_children.ydd
new file mode 100644
index 000000000..4ddc606ca
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/cs4_lod_02_slod3_children.ydd differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/lr_cs4_02.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/lr_cs4_02.ymap
new file mode 100644
index 000000000..e7581026a
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[ground]/lr_cs4_02.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6a2a7fc850ba8748d3b5bc052bd4d49062273266270fda27d38020e5ee6c6243
+size 28277
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_distlodlights_medium004.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_distlodlights_medium004.ymap
new file mode 100644
index 000000000..b04d604d0
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_distlodlights_medium004.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c337fc3a7fd618a35aaaa3edea78a2f3c974c964de593c1bd7d9247d09e53ae3
+size 8898
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_distlodlights_small005.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_distlodlights_small005.ymap
new file mode 100644
index 000000000..cec96a93f
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_distlodlights_small005.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f83c14e21e9db49bf1cf5c496d0f9f33573450a0c20478fe65491604e91f42aa
+size 5065
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_lodlights_medium004.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_lodlights_medium004.ymap
new file mode 100644
index 000000000..b3ff74f27
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_lodlights_medium004.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da6010db995d502301d9c71a88498e9b4af6dd0e63c80295d4fbb1e0b3f795dd
+size 10563
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_lodlights_small005.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_lodlights_small005.ymap
new file mode 100644
index 000000000..456222931
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[lodlights]/vw_lodlights_small005.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e077cfd849759bf044f8ede96b62e1919e829e985a24b0cacdf9a660f0ce6c05
+size 5848
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/base.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/base.ydr
new file mode 100644
index 000000000..b20c308e1
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/base.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:925080b7d4bff662e4083ea50dbf9a6b39323077d523c2b9cf8fc931fc675c1d
+size 50869
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcso_mlo.ybn b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcso_mlo.ybn
new file mode 100644
index 000000000..e27d936f8
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcso_mlo.ybn differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcso_shell.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcso_shell.ydr
new file mode 100644
index 000000000..e53fc76a9
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcso_shell.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6e859d1223a9987800c88359f10dde501772e19626566ce74e9b16f67c607736
+size 579653
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsodecals.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsodecals.ydr
new file mode 100644
index 000000000..6cf938299
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsodecals.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d216ffb117595d0154503a13f421c54776f597704387ed4f70320c0b80befc6
+size 5596
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsoshelf.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsoshelf.ydr
new file mode 100644
index 000000000..cba07a19c
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsoshelf.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5d7b227f18edab638de35246f059170ca3afe848c9383b1b8fffadfe910d5716
+size 4083
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsotexlib.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsotexlib.ytd
new file mode 100644
index 000000000..e654bfe20
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsotexlib.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6ee43b1d7d877f09d4d3d3578508d2d91243dc13df42f5aa8dc43f36392f1350
+size 13117431
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsoytp.ytyp b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsoytp.ytyp
new file mode 100644
index 000000000..cc73b9be1
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/bcsoytp.ytyp differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_lg.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_lg.ydr
new file mode 100644
index 000000000..deb576254
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_lg.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4b8e7831488d49d375f73963ded6436baeb573e0c088550504e5b21abe5de3f3
+size 294567
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_med.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_med.ydr
new file mode 100644
index 000000000..bd8dd551f
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_med.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:beb13b077c32d9187418a0b1ffcb8b5d358d4df45d0de84432a99d278035f310
+size 268970
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_sm.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_sm.ydr
new file mode 100644
index 000000000..e474b17b2
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blinds_sm.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5f0f5cc37d3488f998cddbb44a35a4a40247e2312db27b4e7a8d3d9f8966abe1
+size 267948
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blindsytp.ytyp b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blindsytp.ytyp
new file mode 100644
index 000000000..05c8b174d
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/blinds/blindsytp.ytyp differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/ceillight_blue.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/ceillight_blue.ydr
new file mode 100644
index 000000000..b32c570cf
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/ceillight_blue.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:369cd28a2b2928ef10ed53fe47452f6a34d66f9024fdcfa17cfc2cd994ecea47
+size 39981
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/ceillight_white.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/ceillight_white.ydr
new file mode 100644
index 000000000..65f499cca
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/ceillight_white.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2779dd7a3908709a2071fe2807f00025514ac5d2dd8f08e4496e0b19e7764edc
+size 39674
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/lampceillssd.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/lampceillssd.ydr
new file mode 100644
index 000000000..4a457eb5f
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/lampceillssd.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cd6e91dc25724289fc4936c804d84b8e36bfd76ba3e75d3807ba8e7e57b6aed6
+size 227745
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/lampceillssd.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/lampceillssd.ytd
new file mode 100644
index 000000000..1ced5e962
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/ceillight/lampceillssd.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b11ff0ed603e6464333fbcd85570241c887eb66a8131087ee0645bf4cc5a9a6
+size 21941
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/exteriorshell.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/exteriorshell.ydr
new file mode 100644
index 000000000..ff632b410
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/exteriorshell.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:546df778936543a2ca978647b9a81b42cfe312a7f192d1211a93e0995332bd01
+size 797952
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/exteriorshell_col.ybn b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/exteriorshell_col.ybn
new file mode 100644
index 000000000..6207b7819
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/exteriorshell_col.ybn differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/gatedoor/lssdgatedoor.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/gatedoor/lssdgatedoor.ydr
new file mode 100644
index 000000000..abcc522e9
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/gatedoor/lssdgatedoor.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a9ceb3e4930f05c70de89f69c4d6d0311205cb88bc8a2ce15a497ca8f7cf284c
+size 371864
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/carbine.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/carbine.ydr
new file mode 100644
index 000000000..f8a4503cc
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/carbine.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:176466fab934c081890caffb7aaa61d1f56ff9c29e98b83a9262192e389c4a41
+size 116976
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/gunslib.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/gunslib.ytd
new file mode 100644
index 000000000..1f0f30e82
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/gunslib.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:10e261e25a3b8da5d021d58a8ce91472a93c5b20d0a1131d7ec50b40c3d1d9b7
+size 5775530
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/precrifle.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/precrifle.ydr
new file mode 100644
index 000000000..9f2fb7f86
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/precrifle.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aac950c5e0b48c1f0820e3f3da0916f1cad4cabd374ea4df607b3b11f36158bb
+size 446170
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/sniperrifle.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/sniperrifle.ydr
new file mode 100644
index 000000000..281a57733
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/guns/sniperrifle.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:89e18a9582d3ec1b3b68d8bbbb93491c86a49f8672e1e227f4da97c743e88e13
+size 118026
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/hangar.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/hangar.ydr
new file mode 100644
index 000000000..d799f639a
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/hangar.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d1121449778e9525be48aafe38d8c0231c42d1b7e6f589a542dfa645ea9008e
+size 378660
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/helipad/helipadtype.ytyp b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/helipad/helipadtype.ytyp
new file mode 100644
index 000000000..4a4aa910a
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/helipad/helipadtype.ytyp differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/helipad/hpad.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/helipad/hpad.ydr
new file mode 100644
index 000000000..eb905a0ab
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/helipad/hpad.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9ccd822b5d32f1abd4a3761ccd9fbf44e43336a545cce73f61d1dbfca1eb323d
+size 209349
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/lightpanel/lightpanellssd.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/lightpanel/lightpanellssd.ydr
new file mode 100644
index 000000000..c8c2abb2c
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/lightpanel/lightpanellssd.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0e2338d6a967737f41cd7d49a5ffcc084ba4e144d5154df82cf2109eae5c3bf4
+size 29324
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/lightpanel/lightpanellssd.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/lightpanel/lightpanellssd.ytd
new file mode 100644
index 000000000..3185b0a90
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/lightpanel/lightpanellssd.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4276f20449cfdf7976bd15715b8c0402fb0c50ffa419b21b4e08205c2f3e3d2
+size 20230
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/academydet.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/academydet.ydr
new file mode 100644
index 000000000..48f4a6681
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/academydet.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2abf220b5c0c5641a7ac1e46a3b032a54de3e954ef380111fce68cf99347689e
+size 539709
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/aircon.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/aircon.ydr
new file mode 100644
index 000000000..9a376e6b5
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/aircon.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a5df456c2f95553b3fb78a1c68a38e5c09ea04b27ed835b4ee7bd6b982903aed
+size 98259
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/autoshplght.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/autoshplght.ydr
new file mode 100644
index 000000000..46f9f9b9e
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/autoshplght.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ff33bd9b0d4e4eb92b85450236476eb1b23e28c751c38c1dee02625725de9391
+size 786361
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/autoshplht.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/autoshplht.ytd
new file mode 100644
index 000000000..af8a7a2d7
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/autoshplht.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dde3be1ede03e463b068b2b2381d9be065d443ee28609318b32f2900caf5da22
+size 18492
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_door.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_door.ydr
new file mode 100644
index 000000000..f2dbe7a23
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_door.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5021cc54c1bc059959a69cbaa2cc0c102d5372bd00048e99576e1d21b1cef437
+size 11545
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_door.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_door.ytd
new file mode 100644
index 000000000..09435c525
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_door.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2e39753fd9c0ea3e4afa4c8082490a3c846cc5ff4f54306df49b976917c8888f
+size 78734
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_mirror1.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_mirror1.ydr
new file mode 100644
index 000000000..695ead9a7
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_mirror1.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2a2268f0f85b2fa7e0b131ed015528d10dfd1e23a7718b32623a1bb3cfec321e
+size 1317
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_mirror2.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_mirror2.ydr
new file mode 100644
index 000000000..7e54c2267
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_mirror2.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b72bc494cd4a3bf8cdb073fbbe51b840464b6d8967b166340e15b6d629882afe
+size 1319
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_sink.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_sink.ydr
new file mode 100644
index 000000000..a4bc9d2d3
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcso_sink.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:02ed50e1b04076ba3b81e3928d4fb4cf9a342fbb0680afbdb0b13c5ef3dfc57f
+size 1872754
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcsobath_mirror.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcsobath_mirror.ydr
new file mode 100644
index 000000000..4ecae2940
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcsobath_mirror.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:22576c3e7994aaad2218a6f278619c540aba053d2598db38d67c7e3b57ba25b5
+size 56490
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcstatue.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcstatue.ydr
new file mode 100644
index 000000000..8c7a43b48
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcstatue.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fc596c0d0a91865c1fe12f61612e111494a7988ecc0a22724e0678b244690ce8
+size 244552
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcstatue.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcstatue.ytd
new file mode 100644
index 000000000..fd667bfb7
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bcstatue.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a4e7b812f3ae360e7eee42c16736eb213be5ec665503743723c6f3e814428152
+size 96359
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/blinds.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/blinds.ydr
new file mode 100644
index 000000000..b0eb350ed
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/blinds.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:96ad6f2a10c3a079e5b1b97928f53c51df7b00328c306b6b9023634a7a94f324
+size 558095
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bluelineflag.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bluelineflag.ydr
new file mode 100644
index 000000000..123b6c570
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/bluelineflag.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ce9d5dceb8eb184afb8cedc87801051f03cb6af4499638560ea706bb07653d0
+size 819471
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfan.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfan.ydr
new file mode 100644
index 000000000..5a517089b
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfan.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:480d10c4b0bc65d58af0ef3efbcc168d945e14b901916f42b26294866b10edf1
+size 455054
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfan.ytyp b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfan.ytyp
new file mode 100644
index 000000000..e305a5eaa
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfan.ytyp differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfantex.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfantex.ytd
new file mode 100644
index 000000000..76de6dbbf
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/ceilfantex.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:67bbafc31d60c79fcc28c9d2057636cbaed0cde39aad7383217b44db11eb1d7d
+size 27487
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/cells.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/cells.ydr
new file mode 100644
index 000000000..f781635b8
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/cells.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6afb2906b2ff1c35921e1c481efce57f0d7bc6009408fa59c0b00d626fb2b2e7
+size 559568
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/clip@ceilfan_blades.ycd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/clip@ceilfan_blades.ycd
new file mode 100644
index 000000000..5704d9112
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/clip@ceilfan_blades.ycd differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/file_tort.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/file_tort.ydr
new file mode 100644
index 000000000..3f0a971ec
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/file_tort.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:74976f1568a62a5868be359842ea66b2953ace3265b394e11c9c64c510f13fa2
+size 580300
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/hei_heist_toilet02.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/hei_heist_toilet02.ydr
new file mode 100644
index 000000000..233404d51
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/hei_heist_toilet02.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a364c6e17c6c614b1e751cbbf4e24afcf4572465e6a4d4ed20b0ff4222f80521
+size 22542
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/kitch_cabinet.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/kitch_cabinet.ydr
new file mode 100644
index 000000000..8a4c4811a
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/kitch_cabinet.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0205646827979d2eb0c53d0109f527486667135f724892eec0afd7e23ffe20f2
+size 727565
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/lobbyshelves.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/lobbyshelves.ydr
new file mode 100644
index 000000000..ff55fecaa
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/lobbyshelves.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4d0ae7e3957846cf9ae1ada626c3f74b80ad88f1e2d157b1194a8dcee7abcd4
+size 386918
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/mugshottable2.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/mugshottable2.ydr
new file mode 100644
index 000000000..ed1f73cd7
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/mugshottable2.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f07c79782775770d45fc4962371a8c37e0b68570cfdadd73929a59cfc54bcb57
+size 2200924
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/painting1.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/painting1.ydr
new file mode 100644
index 000000000..8b05724fc
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/painting1.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f95477c0a82b1b030943a657859add972f06d9a41b8fa799ca613d46c130f876
+size 4940
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/partitiondraw.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/partitiondraw.ydr
new file mode 100644
index 000000000..05b792592
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/partitiondraw.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:db4dfc9620eaf209ada6e0e6d6a1e44518f51311f71773a747399e4ffeb9db7b
+size 1775100
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/pipes.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/pipes.ydr
new file mode 100644
index 000000000..e0b9237a4
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/pipes.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4dfb2ecf515fa7f6081a2d2187789e5793f8ab768b3821f1a3b6ef171171af84
+size 700722
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/podium.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/podium.ydr
new file mode 100644
index 000000000..151db8bb0
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/podium.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d07532f13e8b51d819ca6e05f99c87fff11d064ffab131950724b16d8161c502
+size 20033
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/prisbed.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/prisbed.ydr
new file mode 100644
index 000000000..224e961da
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/prisbed.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:99316428eeb6cd13b78773c9899b4d849b26cfeaf0a780b6bdbcef344becb15d
+size 215990
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/roundlight.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/roundlight.ydr
new file mode 100644
index 000000000..07017362d
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/roundlight.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d531d93f28e0da440bf4732f1229b497c33932f3a70e8cc59b70d7565504dcc1
+size 241451
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/shieldlogo.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/shieldlogo.ydr
new file mode 100644
index 000000000..c827b7ee6
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/shieldlogo.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bebacf464b61c1460335edfe5d8a6525eea118dff6bed9447aff1ea4f352d18d
+size 103775
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/shieldsytd.ytd b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/shieldsytd.ytd
new file mode 100644
index 000000000..77336ad8c
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/shieldsytd.ytd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:168e575c2c3737be9608d988129e0ca4a63132456378ba75ca3ae49d8a46c27c
+size 323980
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/text.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/text.ydr
new file mode 100644
index 000000000..45762cc45
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/text.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5d1fc8715aca74ff458b0d701c86d0791435e827f69ffaec790e4ec69e12abbb
+size 67627
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/urinaldraw.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/urinaldraw.ydr
new file mode 100644
index 000000000..13cbb8a33
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/urinaldraw.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:07d4026b2bb5ab9b5c27af21f792e2672797ba266e87b4bb558764f956435b91
+size 679798
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/whitedesk.ydr b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/whitedesk.ydr
new file mode 100644
index 000000000..6c5171664
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[models]/props/whitedesk.ydr
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a67b62dc8b4d14af1c9f2aba924e3f1bbefe46fe0b7241c2ac3ee351c7223760
+size 653221
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/[occl]/cs4_occl_04.ymap b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[occl]/cs4_occl_04.ymap
new file mode 100644
index 000000000..1c9181207
--- /dev/null
+++ b/resources/[EGRP-Map-Addons]/lasdmlo/stream/[occl]/cs4_occl_04.ymap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a566b1daa623daebc9fca848b9c13a6694353508c522b4a699c75ea57eaa45b
+size 12541
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest.ymf b/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest.ymf
new file mode 100644
index 000000000..cec1ad101
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest.ymf differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest2.ymf b/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest2.ymf
new file mode 100644
index 000000000..dd7a91988
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest2.ymf differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest3.ymf b/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest3.ymf
new file mode 100644
index 000000000..8fdb3c1c5
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest3.ymf differ
diff --git a/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest4.ymf b/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest4.ymf
new file mode 100644
index 000000000..3431e15ee
Binary files /dev/null and b/resources/[EGRP-Map-Addons]/lasdmlo/stream/_manifest4.ymf differ
diff --git a/resources/[EGRP-Map-Addons]/western_sandy_sheriff/stream/western_sheriff_props.ytd b/resources/[EGRP-Map-Addons]/western_sandy_sheriff/stream/western_sheriff_props.ytd
index 820d63d6a..668515d0a 100644
--- a/resources/[EGRP-Map-Addons]/western_sandy_sheriff/stream/western_sheriff_props.ytd
+++ b/resources/[EGRP-Map-Addons]/western_sandy_sheriff/stream/western_sheriff_props.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d7131671d2f8af02569d8e4b6e8d7c0d20ac36c0fab2e841ab076ec3902fd40f
-size 1705640
+oid sha256:8ce116e2c3421e2b101d04cb4a315927fb27f752cce7535a2892393226731547
+size 1851888
diff --git a/resources/[EGRP-Map-Addons]/western_sandy_sheriff/stream/western_sheriff_textures.ytd b/resources/[EGRP-Map-Addons]/western_sandy_sheriff/stream/western_sheriff_textures.ytd
index 84b026435..b6f4b0abb 100644
--- a/resources/[EGRP-Map-Addons]/western_sandy_sheriff/stream/western_sheriff_textures.ytd
+++ b/resources/[EGRP-Map-Addons]/western_sandy_sheriff/stream/western_sheriff_textures.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:04f9b81800ddac5a1491207ab71171c590c7ffc2036bf6563220bebb279f3e65
-size 7974328
+oid sha256:0fe4bd95c5d2a4dbf3b66c8af74a6e2f2734345664a232ea4efe34e59e0e0d9f
+size 7986120
diff --git a/resources/dashcam/nui/script.js b/resources/dashcam/nui/script.js
index 1532dc44d..0cab05c03 100644
--- a/resources/dashcam/nui/script.js
+++ b/resources/dashcam/nui/script.js
@@ -12,7 +12,7 @@ const Dashcam = new Vue({
unitSpeedType: "MPH",
dashMessageOne: "This vehicle is licensed to the",
- dashLabel: "State of Georgia",
+ dashLabel: "State of California Law",
dashMessageTwo: "Any unauthorized use is subject to criminal charges."
},
diff --git a/resources/disable_interior/client.lua b/resources/disable_interior/client.lua
new file mode 100644
index 000000000..42a2c7840
--- /dev/null
+++ b/resources/disable_interior/client.lua
@@ -0,0 +1,5 @@
+CreateThread(function()
+ local oldinterior = GetInteriorAtCoordsWithType(2678.0,3286.0,55.2, 'v_shop_247')
+ DisableInterior(oldinterior, true)
+ UnpinInterior(oldinterior)
+end)
\ No newline at end of file
diff --git a/resources/disable_interior/fxmanifest.lua b/resources/disable_interior/fxmanifest.lua
new file mode 100644
index 000000000..10517804e
--- /dev/null
+++ b/resources/disable_interior/fxmanifest.lua
@@ -0,0 +1,6 @@
+fx_version 'cerulean'
+games { 'gta5' }
+
+client_scripts {
+ 'client.lua',
+}
\ No newline at end of file
diff --git a/resources/gcom_chhp_standalone/stream/gc_chhp_exterior.ytd b/resources/gcom_chhp_standalone/stream/gc_chhp_exterior.ytd
index bb28da307..0cbb0bfcb 100644
--- a/resources/gcom_chhp_standalone/stream/gc_chhp_exterior.ytd
+++ b/resources/gcom_chhp_standalone/stream/gc_chhp_exterior.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5bdd66cdd948e17e95203aa94b81d9434b8f6703c15239ab7cda8029cb73eef2
-size 7599986
+oid sha256:925806edcce08d68aef39ac818af867679c10382a75939ea0bf5fe55d9c5759c
+size 7604337
diff --git a/resources/gcom_chhp_standalone/stream/gc_hp_int_txd.ytd b/resources/gcom_chhp_standalone/stream/gc_hp_int_txd.ytd
index 12b8d2241..28abbfabb 100644
--- a/resources/gcom_chhp_standalone/stream/gc_hp_int_txd.ytd
+++ b/resources/gcom_chhp_standalone/stream/gc_hp_int_txd.ytd
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:aca84811519363eeb0f1880ef841dd56469ad52040787fa7514e43d20d0f666c
-size 15533764
+oid sha256:272e246deff441b9926fc749fa958b89fee90129a67031d52f6b15bc25db982b
+size 15514070
diff --git a/resources/night_ers_k9/.fxap b/resources/night_ers_k9/.fxap
new file mode 100644
index 000000000..7262b1378
Binary files /dev/null and b/resources/night_ers_k9/.fxap differ
diff --git a/resources/night_ers_k9/NUI/main.js b/resources/night_ers_k9/NUI/main.js
new file mode 100644
index 000000000..c42f70058
--- /dev/null
+++ b/resources/night_ers_k9/NUI/main.js
@@ -0,0 +1,77 @@
+let crosshairElement=null,translations=null,hotkeys=null;function togglePedControlsVisibility(s){let t=document.getElementById("ped-controls");if(t)(isPedControlsVisible=void 0===s?!isPedControlsVisible:s)?(t.classList.remove("animate-fade-out"),t.classList.add("animate-fade-in"),t.style.display="block"):(t.classList.remove("animate-fade-in"),t.classList.add("animate-fade-out"),setTimeout(()=>{t.style.display="none"},250));else{let e=document.createElement("div");e.id="ped-controls",e.classList.add("fixed","bottom-16","right-16","z-10","inline-block","text-white","bg-gray-900","bg-opacity-50","border","border-gray-700","rounded-lg","shadow-lg","w-[600px]","transition-all","duration-300","opacity-100"),e.innerHTML=`
+
+
+
+
+
+
+
+
+
${translations.K9ControlsTitlePed}
+
${translations.AvailableHotkeysAndControls}
+
+
+
+
+
+
${translations.K9ControlsSubtitle}
+
+
+
+ ${hotkeys.K9Attack.inputKeyLabel}
+ ${translations.K9Attack}
+
+
+
+ ${hotkeys.K9Search.inputKeyLabel}
+ ${translations.K9Search}
+
+
+
+ ${hotkeys.K9Taunt.inputKeyLabel}
+ ${translations.K9Taunt}
+
+
+
+ ${hotkeys.Cancel.inputKeyLabel}
+ ${translations.Cancel}
+
+
+
+
+
+
+ `,document.body.appendChild(e),togglePedControlsVisibility(s)}}function toggleVehicleControlsVisibility(s){let t=document.getElementById("vehicle-controls");if(t)(isVehicleControlsVisible=void 0===s?!isVehicleControlsVisible:s)?(t.classList.remove("animate-fade-out"),t.classList.add("animate-fade-in"),t.style.display="block"):(t.classList.remove("animate-fade-in"),t.classList.add("animate-fade-out"),setTimeout(()=>{t.style.display="none"},250));else{let e=document.createElement("div");e.id="vehicle-controls",e.classList.add("fixed","bottom-16","right-16","z-10","inline-block","text-white","bg-gray-900","bg-opacity-50","border","border-gray-700","rounded-lg","shadow-lg","w-[600px]","transition-all","duration-300","opacity-100"),e.innerHTML=`
+
+
+
+
+
+
+
+
+
${translations.K9ControlsTitleVehicle}
+
${translations.AvailableHotkeysAndControls}
+
+
+
+
+
+
${translations.K9ControlsSubtitle}
+
+
+
+ ${hotkeys.K9Search.inputKeyLabel}
+ ${translations.K9Search}
+
+
+
+ ${hotkeys.Cancel.inputKeyLabel}
+ ${translations.Cancel}
+
+
+
+
+
+
+ `,document.body.appendChild(e),toggleVehicleControlsVisibility(s)}}window.addEventListener("message",s=>{let t=s.data;if("setTranslations"==t.action&&(translations=t.translations),"setHotkeys"==t.action&&(hotkeys=t.hotkeys),"drawCrosshair"==t.action){let e=t.display;if(!crosshairElement&&!(crosshairElement=document.getElementById("crosshair"))){console.log("Crosshair element not found!");return}crosshairElement.style.display=e?"block":"none"}"ped-controls"==t.action&&togglePedControlsVisibility(t.display),"vehicle-controls"==t.action&&toggleVehicleControlsVisibility(t.display)});
\ No newline at end of file
diff --git a/resources/night_ers_k9/NUI/sounds/notification_error.ogg b/resources/night_ers_k9/NUI/sounds/notification_error.ogg
new file mode 100644
index 000000000..632e5d339
Binary files /dev/null and b/resources/night_ers_k9/NUI/sounds/notification_error.ogg differ
diff --git a/resources/night_ers_k9/NUI/sounds/notification_success.ogg b/resources/night_ers_k9/NUI/sounds/notification_success.ogg
new file mode 100644
index 000000000..853a65192
Binary files /dev/null and b/resources/night_ers_k9/NUI/sounds/notification_success.ogg differ
diff --git a/resources/night_ers_k9/NUI/sounds/notification_warning.ogg b/resources/night_ers_k9/NUI/sounds/notification_warning.ogg
new file mode 100644
index 000000000..0b64a8a75
Binary files /dev/null and b/resources/night_ers_k9/NUI/sounds/notification_warning.ogg differ
diff --git a/resources/night_ers_k9/NUI/styles.css b/resources/night_ers_k9/NUI/styles.css
new file mode 100644
index 000000000..37439ca87
--- /dev/null
+++ b/resources/night_ers_k9/NUI/styles.css
@@ -0,0 +1,90 @@
+.crosshair {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ pointer-events: none;
+ color: rgba(255, 0, 0, 0.75);
+ font-size: 24px;
+ text-shadow: 0 0 2px rgba(0, 0, 0, 0.3);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.crosshair::before,
+.crosshair::after,
+.crosshair .center {
+ display: none;
+}
+
+@keyframes float {
+ 0% {
+ transform: rotate(0deg);
+ text-shadow: 0 0 5px rgba(255, 0, 0, 0.2);
+ opacity: 0.75;
+ }
+ 50% {
+ text-shadow: 0 0 20px rgba(255, 0, 0, 0.8);
+ opacity: 1;
+ }
+ 100% {
+ transform: rotate(360deg);
+ text-shadow: 0 0 5px rgba(255, 0, 0, 0.2);
+ opacity: 0.75;
+ }
+}
+
+.crosshair i {
+ animation: float 5s infinite linear;
+ display: block;
+ position: relative;
+ transform-origin: center center;
+ width: 24px; /* Match the font-size (line 8)!! */
+ height: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.k9-title {
+ color: rgba(255, 0, 0, 0.85);
+ font-size: 18px;
+ font-weight: bold;
+ text-transform: uppercase;
+ text-shadow: 0 0 5px rgba(255, 0, 0, 0.4);
+ animation: titlePulse 3s infinite linear;
+ white-space: nowrap;
+}
+
+/* Action Mode Controls Animations */
+
+@keyframes fadeInScale {
+ from {
+ opacity: 0;
+ transform: translateY(10px) scale(0.95);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ }
+}
+
+@keyframes fadeOutScale {
+ from {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ }
+ to {
+ opacity: 0;
+ transform: translateY(10px) scale(0.95);
+ }
+}
+
+.animate-fade-in {
+ animation: fadeInScale 0.25s ease-out forwards;
+}
+
+.animate-fade-out {
+ animation: fadeOutScale 0.25s ease-out forwards;
+}
\ No newline at end of file
diff --git a/resources/night_ers_k9/README.md b/resources/night_ers_k9/README.md
new file mode 100644
index 000000000..45c0a7f34
--- /dev/null
+++ b/resources/night_ers_k9/README.md
@@ -0,0 +1,2 @@
+# night_ers_k9
+K9 Script with ERS compatibility
diff --git a/resources/night_ers_k9/client/c_functions.lua b/resources/night_ers_k9/client/c_functions.lua
new file mode 100644
index 000000000..f0fcdade9
--- /dev/null
+++ b/resources/night_ers_k9/client/c_functions.lua
@@ -0,0 +1,62 @@
+QBCore = nil
+ESX = nil
+
+Citizen.CreateThread(function()
+ if Config.Enable_QBCore_Permissions.Check_By_Job or Config.Enable_QBCore_Permissions.Check_By_Permissions then
+ QBCore = exports["qb-core"]:GetCoreObject()
+ end
+
+ if Config.Enable_ESX_Permissions.Check_By_Job or Config.Enable_ESX_Permissions.Check_By_Permissions then
+ ESX = exports["es_extended"]:getSharedObject()
+ end
+end)
+
+function message(lineOne, lineTwo, lineThree, duration)
+ BeginTextCommandDisplayHelp("THREESTRINGS")
+ AddTextComponentSubstringPlayerName(lineOne)
+ AddTextComponentSubstringPlayerName(lineTwo or "")
+ AddTextComponentSubstringPlayerName(lineThree or "")
+ EndTextCommandDisplayHelp(0, false, true, duration or 5000)
+end
+
+RegisterNetEvent(Config.EventPrefix..":notify")
+AddEventHandler(Config.EventPrefix..":notify", function(notificationText)
+ notify(notificationText)
+end)
+
+function notify(notificationText)
+ SetNotificationTextEntry("STRING")
+ AddTextComponentString(notificationText)
+ DrawNotification(true, true)
+end
+
+function Draw3DText(x,y,z,text,scl)
+ local onScreen,_x,_y=World3dToScreen2d(x,y,z)
+ local px,py,pz=table.unpack(GetGameplayCamCoords())
+ local dist = GetDistanceBetweenCoords(px,py,pz, x,y,z, 1)
+ local scale = (1/dist)*scl
+ local fov = (1/GetGameplayCamFov())*100
+ local scale = scale*fov
+ if onScreen then
+ SetTextScale(0.0*scale, 1.1*scale)
+ SetTextFont(0)
+ SetTextProportional(1)
+ SetTextColour(255, 255, 255, 255)
+ SetTextDropshadow(0, 0, 0, 0, 255)
+ SetTextEdge(2, 0, 0, 0, 150)
+ SetTextDropShadow()
+ --SetTextOutline()
+ SetTextEntry("STRING")
+ SetTextCentre(1)
+ AddTextComponentString("~h~"..text)
+ DrawText(_x,_y)
+ end
+end
+
+function firstToUpper(str)
+ return (str:gsub("^%l", string.upper))
+end
+
+function allToUpper(str)
+ return (string.upper(str))
+end
\ No newline at end of file
diff --git a/resources/night_ers_k9/client/client.lua b/resources/night_ers_k9/client/client.lua
new file mode 100644
index 000000000..f3c11ffbf
Binary files /dev/null and b/resources/night_ers_k9/client/client.lua differ
diff --git a/resources/night_ers_k9/client/client_k9handler.lua b/resources/night_ers_k9/client/client_k9handler.lua
new file mode 100644
index 000000000..6044f7c0d
Binary files /dev/null and b/resources/night_ers_k9/client/client_k9handler.lua differ
diff --git a/resources/night_ers_k9/config/config.lua b/resources/night_ers_k9/config/config.lua
new file mode 100644
index 000000000..248ff955a
--- /dev/null
+++ b/resources/night_ers_k9/config/config.lua
@@ -0,0 +1,253 @@
+Config = {
+
+ ConfigVersion = "1.0.0",
+
+ --====================== DEVELOPER SETTINGS ======================--
+
+ Debug = false, -- Enable or disable debug.
+ EventPrefix = "night_ers_k9", -- Leave this be.
+
+ --====================== PERMISSIONS FOR SHIFT ACCESS (on/off shift) ======================--
+
+ EveryoneHasPermission = true,
+
+ Enable_Night_DiscordApi_Permissions = false, -- server/s_functions.lua
+ Enable_Ace_Permissions = false, -- server/s_functions.lua
+ Enable_ESX_Permissions = {
+ Check_By_Job = false, -- server/s_functions.lua
+ Check_By_Permissions = false, -- server/s_functions.lua
+ },
+ Enable_QBCore_Permissions = {
+ Check_By_Job = false, -- server/s_functions.lua
+ Check_By_Permissions = false, -- server/s_functions.lua
+ },
+
+ -- The role or group that has permission to work with a K9 dog.
+ K9HandlerPermissionRoles = {
+ "Manager",
+ "Administrator",
+ "police",
+ },
+
+ --====================== GENERAL SETTINGS ======================--
+
+ AddChatSuggestions = true, -- Adds chat suggestions to the script commands.
+ DistanceToKeepFromPlayer = 1.0, -- The distance the K9 dog will keep from their handler.
+ ChanceToSurrenderToDogs = 50, -- Applies a 50% chance to make the NPC target surrender when being attacked by a K9 dog.
+ AllowRevivingInjuredK9 = true, -- Allows the dog handler to revive their own injured K9 dog.
+ AllowK9InFrontSeat = false, -- Allows the K9 dog to be in the front passenger seat of a vehicle.
+ AllowCarryK9 = true, -- Allows the dog handler to carry the dog.
+ AllowK9ToKillNPCs = false, -- Allows the K9 dog to kill NPCs, setting it false will replicate the attack, but not damage the NPC. They will still be able to kill players.
+ AllowK9ToAttackPlayers = true, -- Allows the K9 dog to attack players, if set to false the dog will decline attacks on players.
+
+ --====================== K9 DOG HANDLER VEHICLES ======================--
+
+ K9Vehicles = {
+ -- Base game vehicle example
+ {hash = `policet`, spawnOffset = vector3(0.0 --[[Right/-Left]], -4.0 --[[Front/-Rear]], 0.5 --[[Up/-Down]]), dogModelName = "a_c_shepherd"},
+
+ -- Custom vehicle example
+ {hash = `forddsumo7`, spawnOffset = vector3(0.0, -4.0, 0.5), dogModelName = "a_c_shepherd"},
+
+ -- More examples
+ -- {hash = `police`, spawnOffset = vector3(0.0, -3.0, 0.5), dogModelName = "a_c_husky"},
+ -- {hash = `police2`, spawnOffset = vector3(0.0, -3.0, 0.5), dogModelName = "a_c_husky"},
+ -- {hash = `police3`, spawnOffset = vector3(0.0, -3.0, 0.5), dogModelName = "a_c_husky"},
+ },
+
+ --====================== CONTROLS, COMMANDS, KEYMAPPING ======================--
+ -- https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/
+
+ Controls = {
+ -- Hint: These can be changed by individual players. So each client has control over which keys these use for what commands.
+ SpawnOrDeleteK9 = {
+ input = "keyboard",
+ command = "k9spawnordelete",
+ label = "Spawn or Delete K9 Dog",
+ chatsuggestion = "Spawns or deletes a K9 Dog when near a suitable dog handler vehicle.",
+ keymapping = "NUMPAD0", -- NUMPAD0
+ },
+ K9Follow = {
+ input = "keyboard",
+ command = "k9follow",
+ label = "K9 Follow",
+ chatsuggestion = "Orders your own K9 Dog to follow you.",
+ keymapping = "NUMPAD1", -- NUMPAD1
+ },
+ K9Idle = {
+ input = "keyboard",
+ command = "k9idle",
+ label = "K9 Idle",
+ chatsuggestion = "Orders your own K9 Dog to idle at it's current position.",
+ keymapping = "NUMPAD2", -- NUMPAD1
+ },
+ K9Alert = {
+ input = "keyboard",
+ command = "k9alert",
+ label = "K9 Alert",
+ chatsuggestion = "Orders your own K9 Dog to alert by barking.",
+ keymapping = "NUMPAD3", -- NUMPAD3
+ },
+ K9Pet = {
+ input = "keyboard",
+ command = "k9pet",
+ label = "K9 Pet",
+ chatsuggestion = "Attempt to pet your own nearby K9 Dog.",
+ keymapping = "NUMPAD4", -- NUMPAD4
+ },
+ K9Carry = {
+ input = "keyboard",
+ command = "k9carry",
+ label = "K9 Carry",
+ chatsuggestion = "Carry your own K9 Dog.",
+ keymapping = "NUMPAD5", -- NUMPAD5
+ },
+ K9ReleaseLastTarget = { -- This releases the last target manually (assigned via K9 attack/search/taunt), so they get cleaned up by the GTA engine when it finds it suitable.
+ input = "keyboard",
+ command = "k9release",
+ label = "K9 Release",
+ chatsuggestion = "Release the last target the K9 Dog was interacting with.",
+ keymapping = "NUMPAD6", -- NUMPAD6
+ },
+
+ -- Actions: Attack, Search (ped/veh), Taunt.
+ K9SelectActionMode = {
+ input = "keyboard",
+ command = "k9selectactionmode",
+ label = "K9 Select Action Mode",
+ chatsuggestion = "Selects the action mode for the K9 Dog on the highlighted target (Attack, Search, Taunt).",
+ keymapping = "LMENU", -- Left ALT
+ }
+ },
+
+ --====================== HOTKEYS ======================--
+ -- https://docs.fivem.net/docs/game-references/controls/
+
+ -- Hint: These can not be changed by individual players, only via this config file.
+ HotKeys = {
+ K9Revive = {
+ inputKeyId = 38, -- E
+ inputKeyName = "~INPUT_CONTEXT~",
+ inputKeyLabel = "E"
+ },
+ K9Attack = {
+ inputKeyId = 38, -- E
+ inputKeyName = "~INPUT_CONTEXT~",
+ inputKeyLabel = "E"
+ },
+ K9Search = {
+ inputKeyId = 74, -- H
+ inputKeyName = "~INPUT_VEH_HEADLIGHT~",
+ inputKeyLabel = "H"
+ },
+ K9Taunt = {
+ inputKeyId = 182, -- L
+ inputKeyName = "~INPUT_CELLPHONE_CAMERA_FOCUS_LOCK~",
+ inputKeyLabel = "L"
+ },
+ Cancel = {
+ inputKeyId = 202, -- ESC/BACKSPACE
+ inputKeyName = "~INPUT_FRONTEND_RRIGHT~",
+ inputKeyLabel = "BACKSPACE"
+ },
+ },
+
+ --====================== K9 Dog Settings ======================--
+
+ K9BlipData = {
+ Enabled = true,
+ BlipName = "Canine (K9)",
+ BlipSpriteID = 898,
+ BlipDisplay = 2,
+ BlipCone = true,
+ BlipScale = 0.5,
+ BlipColourID = 10,
+ },
+
+ --====================== K9 Dog Target Marker Settings ======================--
+
+ MarkerHeight = 2.0,
+ TargetMarkerData = {
+ MarkerId = 21,
+ dirX = 0, dirY = 0, dirZ = 0,
+ rotX = 0, rotY = 180.0, rotZ = 0,
+ scaleX = 1.0, scaleY = 1.0, scaleZ = 1.0,
+ red = 255, green = 0, blue = 0, alpha = 125,
+ bobUpAndDown = false, faceCamera = true,
+ p19 = 0, rotate = false,
+ textureDict = 0, textureName = 0,
+ drawOnEnts = 0
+ },
+
+ --====================== LOCALES / LANGUAGE ======================--
+
+ Messages = {
+ Usage = "Usage",
+ Spawn = "Spawn",
+ K9Dog = "K9 Dog",
+
+ SpawnK9Dog = "Take out K9 dog from the vehicle",
+ DeleteK9Dog = "Put K9 dog in the vehicle",
+ K9Spawned = "Successfully summoned K9 dog.",
+ K9Deleted = "Successfully dismissed K9 dog.",
+ K9Injured = "Your K9 dog is injured. You have 10 seconds to revive them.",
+ K9PassedAway = "Your K9 dog has passed away. Please summon a new one.",
+ AlreadyHaveK9 = "You already have a K9 dog assigned to you...",
+ AssignedK9 = "Successfully assigned K9 dog to you.",
+ K9TooFarAway = "Your K9 dog is too far away from you. They have been tasked to return to you.",
+
+ ToSendTheDogToAttack = "K9 Attack",
+ ToSearchTarget = "K9 Search",
+ ToSendDogToTaunt = "K9 Taunt",
+ ToCancel = "Cancel",
+ ToReviveK9 = "Revive K9",
+ K9Revived = "Successfully revived your K9 dog.",
+
+ OrderedToIdle = "You've ordered the K9 dog to idle.",
+ AlreadyIdling = "Your K9 dog is already idling...",
+ OrderedToFollow = "You've ordered the K9 dog to follow you.",
+ AlreadyFollowing = "Your K9 dog is already following you...",
+ EnteredAttackMode = "You've entered attack mode. Press E to attack a highlighted target.",
+ OrderToAttackTarget = "You've ordered the K9 dog to attack a target.",
+ OrderedToSearch = "You've ordered the K9 dog to search the target.",
+ OrderedToTaunt = "You've ordered the K9 dog to taunt the target.",
+ OrderedToAlert = "You've ordered the K9 dog to alert by barking.",
+ YouArePettingTheDog = "You are petting the K9 dog.",
+ YouPickedUpTheK9 = "You picked up the K9 dog.",
+ YouReleasedTheK9 = "You released the K9 dog.",
+
+ DogIsTooFarAway = "The K9 dog is too far away for this action...",
+ SuspectIsFleeing = "The suspect is fleeing from the K9 dog...",
+ ReleasedTarget = "The last target the K9 dog was interacting with has been released...",
+ NoValidTargetToRelease = "There is no valid target to release...",
+ CouldNotReleaseTarget = "Could not release the last target, they seem to have other tasks...",
+ DogHasFoundNothing = "The K9 dog has not been triggered during the search, it is now returning to you...",
+ DogIsAlertingAfterSearching = "The K9 dog is triggered by something...",
+ VehicleDataTimeout = "A timeout occured on retrieving vehicle data in night_ers. Please try again.",
+ PedDataTimeout = "A timeout occured on retrieving ped data in night_ers. Please try again.",
+ EnteredSelectActionMode = "You've entered select K9 action mode.",
+ CannotSpawnK9WhilstNotOnShift = "You cannot spawn a K9 dog whilst not on shift for ERS...",
+ VehicleIsNotEmpty = "The vehicle is not empty... The dog can not search it.",
+ VehicleNotAllowedToBeSearched = "This vehicle can not be searched by the K9 dog...",
+ CanceledK9ActionMode = "Canceled K9 Action mode.",
+ DismissedK9DogTooFarAway = "Dismissed your K9 dog. They went too far away from you...",
+ CannotSpawnOrDeleteK9WhilstInVehicle = "You cannot spawn or delete a K9 dog whilst in a vehicle...",
+ YouHaveNoK9 = "You have no K9 dog...",
+ K9NotFound = "K9 dog not found...",
+ NoVehicleFound = "No suitable vehicle found to spawn a K9 dog...",
+ NoPermission = "You do not have the required permission to spawn a K9 dog...",
+ InvalidLocationIndex = "Invalid location index. Please provide a number...",
+ PickupCooldownActive = "K9 dog summon cooldown active. Please wait before summoning a K9 dog again.",
+
+ --========= NUI TRANSLATIONS =========--
+
+ K9ControlsTitlePed = "K9 Dog Controls (NPC)",
+ K9ControlsTitleVehicle = "K9 Dog Controls (Vehicle)",
+ AvailableHotkeysAndControls = "Available hotkeys and controls",
+ K9ControlsSubtitle = "Aim at the target and press the hotkey to perform the action.",
+ K9Attack = "Attack",
+ K9Search = "Search",
+ K9Taunt = "Taunt",
+ Cancel = "Cancel",
+ },
+}
\ No newline at end of file
diff --git a/resources/night_ers_k9/fxmanifest.lua b/resources/night_ers_k9/fxmanifest.lua
new file mode 100644
index 000000000..78e1d847f
--- /dev/null
+++ b/resources/night_ers_k9/fxmanifest.lua
@@ -0,0 +1,39 @@
+-- Resource Metadata
+fx_version 'cerulean'
+games { 'gta5' }
+
+author 'Night'
+description 'Nights Software - K9 Dog Handlers FiveM'
+version '1.1.3'
+lua54 'yes'
+
+shared_scripts {
+ 'config/*.lua',
+}
+
+server_scripts {
+ 'server/*.lua',
+}
+
+client_scripts {
+ 'client/*.lua',
+}
+
+ui_page "index.html"
+files{
+ "index.html",
+ 'NUI/sounds/*.ogg',
+ 'NUI/*.js',
+ 'NUI/*.css',
+}
+
+escrow_ignore {
+ 'config/*.lua',
+ 'client/c_functions.lua',
+ 'server/s_functions.lua'
+}
+
+dependencies {
+ 'night_ers',
+}
+dependency '/assetpacks'
\ No newline at end of file
diff --git a/resources/night_ers_k9/index.html b/resources/night_ers_k9/index.html
new file mode 100644
index 000000000..eb93bea03
--- /dev/null
+++ b/resources/night_ers_k9/index.html
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/night_ers_k9/server/s_functions.lua b/resources/night_ers_k9/server/s_functions.lua
new file mode 100644
index 000000000..c4a89852f
--- /dev/null
+++ b/resources/night_ers_k9/server/s_functions.lua
@@ -0,0 +1,113 @@
+QBCore = nil
+ESX = nil
+
+Citizen.CreateThread(function()
+ if Config.Enable_QBCore_Permissions.Check_By_Job or Config.Enable_QBCore_Permissions.Check_By_Permissions then
+ QBCore = exports["qb-core"]:GetCoreObject()
+ end
+
+ if Config.Enable_ESX_Permissions.Check_By_Job or Config.Enable_ESX_Permissions.Check_By_Permissions then
+ ESX = exports["es_extended"]:getSharedObject()
+ end
+end)
+
+function CheckPermission(source, rolesOrGroups)
+ local permission = false
+
+ -- If this is enabled, everyone can play any service at any time.
+ if Config.EveryoneHasPermission then
+ return true
+ end
+
+ -- Discord API Permissions
+ if Config.Enable_Night_DiscordApi_Permissions then
+ local isPermitted = exports.night_discordapi:IsMemberPartOfAnyOfTheseRoles(source, rolesOrGroups)
+ if isPermitted then
+ permission = true
+ end
+ end
+
+ -- Ace Permissions
+ if Config.Enable_Ace_Permissions then
+ for _, roleOrGroup in pairs(rolesOrGroups) do
+ if IsPlayerAceAllowed(source, roleOrGroup) then
+ permission = true
+ break
+ end
+ end
+ end
+
+ -- ESX Job Permissions
+ if Config.Enable_ESX_Permissions.Check_By_Job then
+ if ESX == nil then return print("You've enabled ESX job permissions, but the ESX framework has not been found...") end
+ local xPlayer = ESX.GetPlayerFromId(source)
+ if xPlayer then
+ for _, job in pairs(rolesOrGroups) do
+ if xPlayer.job.name == job then
+ permission = true
+ break
+ end
+ end
+ end
+ end
+
+ -- ESX Permission Based
+ if Config.Enable_ESX_Permissions.Check_By_Permissions then
+ if ESX == nil then return print("You've enabled ESX group permissions, but the ESX framework has not been found...") end
+ local xPlayer = ESX.GetPlayerFromId(source)
+ if xPlayer then
+ for _, group in pairs(rolesOrGroups) do
+ if xPlayer.getGroup() == group then
+ permission = true
+ break
+ end
+ end
+ end
+ end
+
+ -- QBCore Job Based
+ if Config.Enable_QBCore_Permissions.Check_By_Job then
+ if QBCore == nil then return print("You've enabled QBCore job permissions, but the QBCore framework has not been found...") end
+ local Player = QBCore.Functions.GetPlayer(source)
+ if Player then
+ for _, job in pairs(rolesOrGroups) do
+ if Player.PlayerData.job.name == job then
+ permission = true
+ break
+ end
+ end
+ end
+ end
+
+ -- QBCore Permission based
+ if Config.Enable_QBCore_Permissions.Check_By_Permissions then
+ if QBCore == nil then return print("You've enabled QBCore group permissions, but the QBCore framework has not been found...") end
+ local Player = QBCore.Functions.GetPlayer(source)
+ if Player then
+ for _, perm in pairs(rolesOrGroups) do
+ if QBCore.Functions.HasPermission(source, perm) then
+ permission = true
+ end
+ end
+ end
+ end
+ return permission
+end
+
+function firstToUpper(str)
+ return (str:gsub("^%l", string.upper))
+end
+
+function allToUpper(str)
+ return (string.upper(str))
+end
+
+--============ Debug ============--
+
+function DebugPrint(msg)
+ if Config.Debug then
+ if msg ~= nil then
+ print("["..GetCurrentResourceName().."] "..msg)
+ end
+ end
+end
\ No newline at end of file
diff --git a/resources/night_ers_k9/server/server.lua b/resources/night_ers_k9/server/server.lua
new file mode 100644
index 000000000..c7aadbca8
Binary files /dev/null and b/resources/night_ers_k9/server/server.lua differ
diff --git a/resources/night_prop_system/.fxap b/resources/night_prop_system/.fxap
new file mode 100644
index 000000000..56d2dcd66
Binary files /dev/null and b/resources/night_prop_system/.fxap differ
diff --git a/resources/night_prop_system/client/c_functions.lua b/resources/night_prop_system/client/c_functions.lua
new file mode 100644
index 000000000..c383fe776
--- /dev/null
+++ b/resources/night_prop_system/client/c_functions.lua
@@ -0,0 +1,94 @@
+QBCore = nil
+ESX = nil
+
+Citizen.CreateThread(function()
+ if Config.Enable_QBCore_Permissions.Check_By_Job or Config.Enable_QBCore_Permissions.Check_By_Permissions then
+ QBCore = exports["qb-core"]:GetCoreObject()
+ end
+
+ if Config.Enable_ESX_Permissions then
+ ESX = exports["es_extended"]:getSharedObject()
+ end
+end)
+
+function PermissionCheck()
+ local permission = false
+
+ if Config.EveryoneHasPermission then
+ return true
+ end
+
+ -- Role amount check
+ if #Config.PermissionRoles < 1 then return print("You've not set up any roles for permissions in the config.lua") end
+
+ -- ESX Job Permissions
+ if Config.Enable_ESX_Permissions then
+ if ESX == nil then return print("You've enabled ESX permissions, but the ESX framework has not been found...") end
+ local IsLoaded = ESX.IsPlayerLoaded()
+ if IsLoaded then
+ local xPlayer = ESX.GetPlayerData()
+ if xPlayer then
+ for k, v in pairs(Config.PermissionRoles) do
+ if xPlayer.job.name == v then
+ permission = true
+ break
+ end
+ end
+ end
+ else
+ print("Could not check your permission because your player has not loaded in...")
+ end
+ end
+
+ -- QBCore Job Based
+ if Config.Enable_QBCore_Permissions.Check_By_Job then
+ if QBCore == nil then return print("You've enabled QBCore job permissions, but the QBCore framework has not been found...") end
+ local Player = QBCore.Functions.GetPlayerData()
+ local jobName = Player.job.name
+ -- local player = QBCore.Functions.GetPlayer(source)
+ if Player then
+ for k, v in pairs(Config.PermissionRoles) do
+ if jobName == v then
+ permission = true
+ break
+ end
+ end
+ end
+ end
+
+ return permission
+end
+
+function message(lineOne, lineTwo, lineThree, duration)
+ BeginTextCommandDisplayHelp("THREESTRINGS")
+ AddTextComponentSubstringPlayerName(lineOne)
+ AddTextComponentSubstringPlayerName(lineTwo or "")
+ AddTextComponentSubstringPlayerName(lineThree or "")
+ EndTextCommandDisplayHelp(0, false, false, duration or 5000)
+end
+
+function notify(notificationText, notificationDuration, notificationPosition, notificationType)
+ if Config.Enable_custom_messages then
+ exports.bulletin:Send({
+ message = notificationText,
+ timeout = notificationDuration,
+ position = notificationPosition,
+ progress = true,
+ theme = notificationType,
+ flash = false
+ })
+ else
+ SetNotificationTextEntry("STRING")
+ AddTextComponentString(notificationText)
+ DrawNotification(true, true)
+ end
+end
+
+function firstToUpper(str)
+ return (str:gsub("^%l", string.upper))
+end
+
+function allToUpper(str)
+ return (string.upper(str))
+end
+
diff --git a/resources/night_prop_system/client/client.lua b/resources/night_prop_system/client/client.lua
new file mode 100644
index 000000000..ec4f4e2c2
Binary files /dev/null and b/resources/night_prop_system/client/client.lua differ
diff --git a/resources/night_prop_system/client/warmenu.lua b/resources/night_prop_system/client/warmenu.lua
new file mode 100644
index 000000000..81a78126a
--- /dev/null
+++ b/resources/night_prop_system/client/warmenu.lua
@@ -0,0 +1,657 @@
+WarMenu = { }
+WarMenu.__index = WarMenu
+
+-- Deprecated
+WarMenu.debug = false
+function WarMenu.SetDebugEnabled(enabled)
+end
+function WarMenu.IsDebugEnabled()
+ return false
+end
+---
+
+local menus = { }
+local keys = { down = 187, up = 188, left = 189, right = 190, select = 191, back = 194 }
+local optionCount = 0
+
+local currentKey = nil
+local currentMenu = nil
+
+local toolTipWidth = 0.153
+
+local spriteWidth = 0.027
+local spriteHeight = spriteWidth * GetAspectRatio()
+
+local titleHeight = 0.101
+local titleYOffset = 0.021
+local titleFont = 1
+local titleScale = 1.0
+
+local buttonHeight = 0.038
+local buttonFont = 0
+local buttonScale = 0.365
+local buttonTextXOffset = 0.005
+local buttonTextYOffset = 0.005
+local buttonSpriteXOffset = 0.002
+local buttonSpriteYOffset = 0.005
+
+local defaultStyle = {
+ x = 0.0175,
+ y = 0.025,
+ width = 0.23,
+ maxOptionCountOnScreen = 10,
+ titleColor = { 0, 0, 0, 255 },
+ titleBackgroundColor = { 0, 212, 166, 255 },
+ titleBackgroundSprite = nil,
+ subTitleColor = { 0, 212, 166, 255 },
+ textColor = { 255, 255, 255, 255 },
+ subTextColor = { 189, 189, 189, 255 },
+ focusTextColor = { 0, 0, 0, 255 },
+ focusColor = { 245, 245, 245, 255 },
+ backgroundColor = { 0, 0, 0, 160 },
+ subTitleBackgroundColor = { 0, 0, 0, 255 },
+ buttonPressedSound = { name = 'SELECT', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' }, --https://pastebin.com/0neZdsZ5
+}
+
+local function setMenuProperty(id, property, value)
+ if not id then
+ return
+ end
+
+ local menu = menus[id]
+ if menu then
+ menu[property] = value
+ end
+end
+
+local function setStyleProperty(id, property, value)
+ if not id then
+ return
+ end
+
+ local menu = menus[id]
+
+ if menu then
+ if not menu.overrideStyle then
+ menu.overrideStyle = { }
+ end
+
+ menu.overrideStyle[property] = value
+ end
+end
+
+local function getStyleProperty(property, menu)
+ menu = menu or currentMenu
+
+ if menu.overrideStyle then
+ local value = menu.overrideStyle[property]
+ if value then
+ return value
+ end
+ end
+
+ return menu.style and menu.style[property] or defaultStyle[property]
+end
+
+local function copyTable(t)
+ if type(t) ~= 'table' then
+ return t
+ end
+
+ local result = { }
+ for k, v in pairs(t) do
+ result[k] = copyTable(v)
+ end
+
+ return result
+end
+
+local function setMenuVisible(id, visible, holdCurrentOption)
+ if currentMenu then
+ if visible then
+ if currentMenu.id == id then
+ return
+ end
+ else
+ if currentMenu.id ~= id then
+ return
+ end
+ end
+ end
+
+ if visible then
+ local menu = menus[id]
+
+ if not currentMenu then
+ menu.currentOption = 1
+ else
+ if not holdCurrentOption then
+ menus[currentMenu.id].currentOption = 1
+ end
+ end
+
+ currentMenu = menu
+ else
+ currentMenu = nil
+ end
+end
+
+local function setTextParams(font, color, scale, center, shadow, alignRight, wrapFrom, wrapTo)
+ SetTextFont(font)
+ SetTextColour(color[1], color[2], color[3], color[4] or 255)
+ SetTextScale(scale, scale)
+
+ if shadow then
+ SetTextDropShadow()
+ end
+
+ if center then
+ SetTextCentre(true)
+ elseif alignRight then
+ SetTextRightJustify(true)
+ end
+
+ if not wrapFrom or not wrapTo then
+ wrapFrom = wrapFrom or getStyleProperty('x')
+ wrapTo = wrapTo or getStyleProperty('x') + getStyleProperty('width') - buttonTextXOffset
+ end
+
+ SetTextWrap(wrapFrom, wrapTo)
+end
+
+local function getLinesCount(text, x, y)
+ BeginTextCommandLineCount('TWOSTRINGS')
+ AddTextComponentString(tostring(text))
+ return EndTextCommandGetLineCount(x, y)
+end
+
+local function drawText(text, x, y)
+ BeginTextCommandDisplayText('TWOSTRINGS')
+ AddTextComponentString(tostring(text))
+ EndTextCommandDisplayText(x, y)
+end
+
+local function drawRect(x, y, width, height, color)
+ DrawRect(x, y, width, height, color[1], color[2], color[3], color[4] or 255)
+end
+
+local function getCurrentIndex()
+ if currentMenu.currentOption <= getStyleProperty('maxOptionCountOnScreen') and optionCount <= getStyleProperty('maxOptionCountOnScreen') then
+ return optionCount
+ elseif optionCount > currentMenu.currentOption - getStyleProperty('maxOptionCountOnScreen') and optionCount <= currentMenu.currentOption then
+ return optionCount - (currentMenu.currentOption - getStyleProperty('maxOptionCountOnScreen'))
+ end
+
+ return nil
+end
+
+local function drawTitle()
+ local x = getStyleProperty('x') + getStyleProperty('width') / 2
+ local y = getStyleProperty('y') + titleHeight / 2
+
+ if getStyleProperty('titleBackgroundSprite') then
+ DrawSprite(getStyleProperty('titleBackgroundSprite').dict, getStyleProperty('titleBackgroundSprite').name, x, y, getStyleProperty('width'), titleHeight, 0., 255, 255, 255, 255)
+ else
+ drawRect(x, y, getStyleProperty('width'), titleHeight, getStyleProperty('titleBackgroundColor'))
+ end
+
+ if currentMenu.title then
+ setTextParams(titleFont, getStyleProperty('titleColor'), titleScale, true)
+ drawText(currentMenu.title, x, y - titleHeight / 2 + titleYOffset)
+ end
+end
+
+local function drawSubTitle()
+ local x = getStyleProperty('x') + getStyleProperty('width') / 2
+ local y = getStyleProperty('y') + titleHeight + buttonHeight / 2
+
+ drawRect(x, y, getStyleProperty('width'), buttonHeight, getStyleProperty('subTitleBackgroundColor'))
+
+ setTextParams(buttonFont, getStyleProperty('subTitleColor'), buttonScale, false)
+ drawText(currentMenu.subTitle, getStyleProperty('x') + buttonTextXOffset, y - buttonHeight / 2 + buttonTextYOffset)
+
+ if optionCount > getStyleProperty('maxOptionCountOnScreen') then
+ setTextParams(buttonFont, getStyleProperty('subTitleColor'), buttonScale, false, false, true)
+ drawText(tostring(currentMenu.currentOption)..' / '..tostring(optionCount), getStyleProperty('x') + getStyleProperty('width'), y - buttonHeight / 2 + buttonTextYOffset)
+ end
+end
+
+local function drawButton(text, subText)
+ local currentIndex = getCurrentIndex()
+ if not currentIndex then
+ return
+ end
+
+ local backgroundColor = nil
+ local textColor = nil
+ local subTextColor = nil
+ local shadow = false
+
+ if currentMenu.currentOption == optionCount then
+ backgroundColor = getStyleProperty('focusColor')
+ textColor = getStyleProperty('focusTextColor')
+ subTextColor = getStyleProperty('focusTextColor')
+ else
+ backgroundColor = getStyleProperty('backgroundColor')
+ textColor = getStyleProperty('textColor')
+ subTextColor = getStyleProperty('subTextColor')
+ shadow = true
+ end
+
+ local x = getStyleProperty('x') + getStyleProperty('width') / 2
+ local y = getStyleProperty('y') + titleHeight + buttonHeight + (buttonHeight * currentIndex) - buttonHeight / 2
+
+ drawRect(x, y, getStyleProperty('width'), buttonHeight, backgroundColor)
+
+ setTextParams(buttonFont, textColor, buttonScale, false, shadow)
+ drawText(text, getStyleProperty('x') + buttonTextXOffset, y - (buttonHeight / 2) + buttonTextYOffset)
+
+ if subText then
+ setTextParams(buttonFont, subTextColor, buttonScale, false, shadow, true)
+ drawText(subText, getStyleProperty('x') + buttonTextXOffset, y - buttonHeight / 2 + buttonTextYOffset)
+ end
+end
+
+function WarMenu.CreateMenu(id, title, subTitle, style)
+ -- Default settings
+ local menu = { }
+
+ -- Members
+ menu.id = id
+ menu.previousMenu = nil
+ menu.aboutToBeClosed = false
+ menu.currentOption = 1
+ menu.title = title
+ menu.subTitle = subTitle and string.upper(subTitle) or 'INTERACTION MENU'
+
+ -- Style
+ if style then
+ menu.style = style
+ end
+
+ menus[id] = menu
+end
+
+function WarMenu.CreateSubMenu(id, parent, subTitle, style)
+ local parentMenu = menus[parent]
+ if not parentMenu then
+ return
+ end
+
+ WarMenu.CreateMenu(id, parentMenu.title, subTitle and string.upper(subTitle) or parentMenu.subTitle)
+
+ local menu = menus[id]
+
+ menu.previousMenu = parent
+
+ if parentMenu.overrideStyle then
+ menu.overrideStyle = copyTable(parentMenu.overrideStyle)
+ end
+
+ if style then
+ menu.style = style
+ elseif parentMenu.style then
+ menu.style = copyTable(parentMenu.style)
+ end
+end
+
+function WarMenu.CurrentMenu()
+ return currentMenu and currentMenu.id or nil
+end
+
+function WarMenu.OpenMenu(id)
+ if id and menus[id] then
+ PlaySoundFrontend(-1, 'SELECT', 'HUD_FRONTEND_DEFAULT_SOUNDSET', true)
+ setMenuVisible(id, true)
+ end
+end
+
+function WarMenu.IsMenuOpened(id)
+ return currentMenu and currentMenu.id == id
+end
+WarMenu.Begin = WarMenu.IsMenuOpened
+
+function WarMenu.IsAnyMenuOpened()
+ return currentMenu ~= nil
+end
+
+function WarMenu.IsMenuAboutToBeClosed()
+ return currentMenu and currentMenu.aboutToBeClosed
+end
+
+function WarMenu.CloseMenu()
+ if not currentMenu then
+ return
+ end
+
+ if currentMenu.aboutToBeClosed then
+ currentMenu.aboutToBeClosed = false
+ setMenuVisible(currentMenu.id, false)
+ optionCount = 0
+ currentKey = nil
+ PlaySoundFrontend(-1, 'QUIT', 'HUD_FRONTEND_DEFAULT_SOUNDSET', true)
+ else
+ currentMenu.aboutToBeClosed = true
+ end
+end
+
+function WarMenu.ToolTip(text, width, flipHorizontal)
+ if not currentMenu then
+ return
+ end
+
+ local currentIndex = getCurrentIndex()
+ if not currentIndex then
+ return
+ end
+
+ width = width or toolTipWidth
+
+ local x = nil
+ if not flipHorizontal then
+ x = getStyleProperty('x') + getStyleProperty('width') + width / 2 + buttonTextXOffset
+ else
+ x = getStyleProperty('x') - width / 2 - buttonTextXOffset
+ end
+
+ local textX = x - (width / 2) + buttonTextXOffset
+ setTextParams(buttonFont, getStyleProperty('textColor'), buttonScale, false, true, false, textX, textX + width - (buttonTextYOffset * 2))
+ local linesCount = getLinesCount(text, textX, getStyleProperty('y'))
+
+ local height = GetTextScaleHeight(buttonScale, buttonFont) * (linesCount + 1) + buttonTextYOffset
+ local y = getStyleProperty('y') + titleHeight + (buttonHeight * currentIndex) + height / 2
+
+ drawRect(x, y, width, height, getStyleProperty('backgroundColor'))
+
+ y = y - (height / 2) + buttonTextYOffset
+ drawText(text, textX, y)
+end
+
+function WarMenu.Button(text, subText)
+ if not currentMenu then
+ return
+ end
+
+ optionCount = optionCount + 1
+
+ drawButton(text, subText)
+
+ local pressed = false
+
+ if currentMenu.currentOption == optionCount then
+ if currentKey == keys.select then
+ pressed = true
+ PlaySoundFrontend(-1, getStyleProperty('buttonPressedSound').name, getStyleProperty('buttonPressedSound').set, true)
+ elseif currentKey == keys.left or currentKey == keys.right then
+ PlaySoundFrontend(-1, 'NAV_UP_DOWN', 'HUD_FRONTEND_DEFAULT_SOUNDSET', true)
+ end
+ end
+
+ return pressed
+end
+
+function WarMenu.SpriteButton(text, dict, name, r, g, b, a)
+ if not currentMenu then
+ return
+ end
+
+ local pressed = WarMenu.Button(text)
+
+ local currentIndex = getCurrentIndex()
+ if not currentIndex then
+ return
+ end
+
+ if not HasStreamedTextureDictLoaded(dict) then
+ RequestStreamedTextureDict(dict)
+ end
+ DrawSprite(dict, name, getStyleProperty('x') + getStyleProperty('width') - spriteWidth / 2 - buttonSpriteXOffset, getStyleProperty('y') + titleHeight + buttonHeight + (buttonHeight * currentIndex) - spriteHeight / 2 + buttonSpriteYOffset, spriteWidth, spriteHeight, 0., r or 255, g or 255, b or 255, a or 255)
+
+ return pressed
+end
+
+function WarMenu.InputButton(text, windowTitleEntry, defaultText, maxLength, subText)
+ if not currentMenu then
+ return
+ end
+
+ local pressed = WarMenu.Button(text, subText)
+ local inputText = nil
+
+ if pressed then
+ DisplayOnscreenKeyboard(1, windowTitleEntry or 'FMMC_MPM_NA', '', defaultText or '', '', '', '', maxLength or 255)
+
+ while true do
+ DisableAllControlActions(0)
+
+ local status = UpdateOnscreenKeyboard()
+ if status == 2 then
+ break
+ elseif status == 1 then
+ inputText = GetOnscreenKeyboardResult()
+ break
+ end
+
+ Citizen.Wait(0)
+ end
+ end
+
+ return pressed, inputText
+end
+
+function WarMenu.MenuButton(text, id, subText)
+ if not currentMenu then
+ return
+ end
+
+ local pressed = WarMenu.Button(text, subText)
+
+ if pressed then
+ currentMenu.currentOption = optionCount
+ setMenuVisible(currentMenu.id, false)
+ setMenuVisible(id, true, true)
+ end
+
+ return pressed
+end
+
+function WarMenu.CheckBox(text, checked, callback)
+ if not currentMenu then
+ return
+ end
+
+ local name = nil
+ if currentMenu.currentOption == optionCount + 1 then
+ name = checked and 'shop_box_tickb' or 'shop_box_blankb'
+ else
+ name = checked and 'shop_box_tick' or 'shop_box_blank'
+ end
+
+ local pressed = WarMenu.SpriteButton(text, 'commonmenu', name)
+
+ if pressed then
+ checked = not checked
+ if callback then callback(checked) end
+ end
+
+ return pressed
+end
+
+function WarMenu.ComboBox(text, items, currentIndex, selectedIndex, callback)
+ if not currentMenu then
+ return
+ end
+
+ local itemsCount = #items
+ local selectedItem = items[currentIndex]
+ local isCurrent = currentMenu.currentOption == optionCount + 1
+ selectedIndex = selectedIndex or currentIndex
+
+ if itemsCount > 1 and isCurrent then
+ selectedItem = '← '..tostring(selectedItem)..' →'
+ end
+
+ local pressed = WarMenu.Button(text, selectedItem)
+
+ if pressed then
+ selectedIndex = currentIndex
+ elseif isCurrent then
+ if currentKey == keys.left then
+ if currentIndex > 1 then currentIndex = currentIndex - 1 else currentIndex = itemsCount end
+ elseif currentKey == keys.right then
+ if currentIndex < itemsCount then currentIndex = currentIndex + 1 else currentIndex = 1 end
+ end
+ end
+
+ if callback then callback(currentIndex, selectedIndex) end
+ return pressed, currentIndex
+end
+
+function WarMenu.Display()
+ if currentMenu then
+ DisableControlAction(0, keys.left, true)
+ DisableControlAction(0, keys.up, true)
+ DisableControlAction(0, keys.down, true)
+ DisableControlAction(0, keys.right, true)
+ DisableControlAction(0, keys.back, true)
+
+ if currentMenu.aboutToBeClosed then
+ WarMenu.CloseMenu()
+ else
+ ClearAllHelpMessages()
+
+ drawTitle()
+ drawSubTitle()
+
+ currentKey = nil
+
+ if IsDisabledControlJustReleased(0, keys.down) then
+ PlaySoundFrontend(-1, 'NAV_UP_DOWN', 'HUD_FRONTEND_DEFAULT_SOUNDSET', true)
+
+ if currentMenu.currentOption < optionCount then
+ currentMenu.currentOption = currentMenu.currentOption + 1
+ else
+ currentMenu.currentOption = 1
+ end
+ elseif IsDisabledControlJustReleased(0, keys.up) then
+ PlaySoundFrontend(-1, 'NAV_UP_DOWN', 'HUD_FRONTEND_DEFAULT_SOUNDSET', true)
+
+ if currentMenu.currentOption > 1 then
+ currentMenu.currentOption = currentMenu.currentOption - 1
+ else
+ currentMenu.currentOption = optionCount
+ end
+ elseif IsDisabledControlJustReleased(0, keys.left) then
+ currentKey = keys.left
+ elseif IsDisabledControlJustReleased(0, keys.right) then
+ currentKey = keys.right
+ elseif IsControlJustReleased(0, keys.select) then
+ currentKey = keys.select
+ elseif IsDisabledControlJustReleased(0, keys.back) then
+ if menus[currentMenu.previousMenu] then
+ setMenuVisible(currentMenu.previousMenu, true)
+ PlaySoundFrontend(-1, 'BACK', 'HUD_FRONTEND_DEFAULT_SOUNDSET', true)
+ else
+ WarMenu.CloseMenu()
+ end
+ end
+
+ optionCount = 0
+ end
+ end
+end
+WarMenu.End = WarMenu.Display
+
+function WarMenu.CurrentOption()
+ if currentMenu and optionCount ~= 0 then
+ return currentMenu.currentOption
+ end
+
+ return nil
+end
+
+function WarMenu.IsItemHovered()
+ if not currentMenu or optionCount == 0 then
+ return false
+ end
+
+ return currentMenu.currentOption == optionCount
+end
+
+function WarMenu.IsItemSelected()
+ return currentKey == keys.select and WarMenu.IsItemHovered()
+end
+
+function WarMenu.SetTitle(id, title)
+ setMenuProperty(id, 'title', title)
+end
+WarMenu.SetMenuTitle = WarMenu.SetTitle
+
+function WarMenu.SetSubTitle(id, text)
+ setMenuProperty(id, 'subTitle', string.upper(text))
+end
+WarMenu.SetMenuSubTitle = WarMenu.SetSubTitle
+
+function WarMenu.SetMenuStyle(id, style)
+ setMenuProperty(id, 'style', style)
+end
+
+function WarMenu.SetMenuX(id, x)
+ setStyleProperty(id, 'x', x)
+end
+
+function WarMenu.SetMenuY(id, y)
+ setStyleProperty(id, 'y', y)
+end
+
+function WarMenu.SetMenuWidth(id, width)
+ setStyleProperty(id, 'width', width)
+end
+
+function WarMenu.SetMenuMaxOptionCountOnScreen(id, count)
+ setStyleProperty(id, 'maxOptionCountOnScreen', count)
+end
+
+function WarMenu.SetTitleColor(id, r, g, b, a)
+ setStyleProperty(id, 'titleColor', { r, g, b, a })
+end
+WarMenu.SetMenuTitleColor = WarMenu.SetTitleColor
+
+function WarMenu.SetMenuSubTitleColor(id, r, g, b, a)
+ setStyleProperty(id, 'subTitleColor', { r, g, b, a })
+end
+
+function WarMenu.SetTitleBackgroundColor(id, r, g, b, a)
+ setStyleProperty(id, 'titleBackgroundColor', { r, g, b, a })
+end
+WarMenu.SetMenuTitleBackgroundColor = WarMenu.SetTitleBackgroundColor
+
+function WarMenu.SetTitleBackgroundSprite(id, dict, name)
+ RequestStreamedTextureDict(dict)
+ setStyleProperty(id, 'titleBackgroundSprite', { dict = dict, name = name })
+end
+WarMenu.SetMenuTitleBackgroundSprite = WarMenu.SetTitleBackgroundSprite
+
+function WarMenu.SetMenuBackgroundColor(id, r, g, b, a)
+ setStyleProperty(id, 'backgroundColor', { r, g, b, a })
+end
+
+function WarMenu.SetMenuTextColor(id, r, g, b, a)
+ setStyleProperty(id, 'textColor', { r, g, b, a })
+end
+
+function WarMenu.SetMenuSubTextColor(id, r, g, b, a)
+ setStyleProperty(id, 'subTextColor', { r, g, b, a })
+end
+
+function WarMenu.SetMenuFocusColor(id, r, g, b, a)
+ setStyleProperty(id, 'focusColor', { r, g, b, a })
+end
+
+function WarMenu.SetMenuFocusTextColor(id, r, g, b, a)
+ setStyleProperty(id, 'focusTextColor', { r, g, b, a })
+end
+
+function WarMenu.SetMenuButtonPressedSound(id, name, set)
+ setStyleProperty(id, 'buttonPressedSound', { name = name, set = set })
+end
diff --git a/resources/night_prop_system/config/config.lua b/resources/night_prop_system/config/config.lua
new file mode 100644
index 000000000..fcc621fe9
--- /dev/null
+++ b/resources/night_prop_system/config/config.lua
@@ -0,0 +1,283 @@
+Config = {
+
+ ConfigVersion = "3.3.0",
+
+ Debug = false,
+ EventPrefix = "night_prop_system", -- Leave this be.
+
+ --====================== BULLETIN UI ======================--
+
+ Enable_custom_messages = false, -- true = bulletin ui: https://github.com/Mobius1/bulletin | false = native installed notify and chatMessage function (c_functions.lua & s_functions.lua), feel free to edit it.
+
+ --====================== PERMISSIONS ======================--
+
+ EveryoneHasPermission = true,
+
+ Enable_Night_DiscordApi_Permissions = false, -- server/s_functions.lua
+ Enable_Ace_Permissions = false, -- server/s_functions.lua
+ Enable_ESX_Permissions = false, -- client/c_functions.lua & server/s_functions.lua
+ Enable_QBCore_Permissions = {
+ Check_By_Job = false, -- client/c_functions.lua & server/s_functions.lua
+ Check_By_Permissions = false, -- server/s_functions.lua
+ },
+
+ PermissionRoles = { -- Fill in: Discord API Role Names / ESX Jobs / Ace group names / QB Jobs and/or Groups
+ -- Discord API Examples
+ "Manager",
+ "Development_Team",
+ "Senior_Admin",
+ "Admin",
+ "Essex_Police_Force",
+ "British_Transport_Police",
+ "Ambulance_Service",
+ "Fire_Service",
+ -- ESX or QB Job examples
+ "police",
+ "ambulance",
+ "fire",
+ -- Ace Permissions examples
+ "Administrator",
+ "Supporter",
+ "Tester",
+ },
+
+ --====================== Commands, Hotkeys and buttons ======================--
+
+ Commands = {
+ RoadNodeTool = "roadnodes", -- Opens the road node tool.
+ PlaceObjectsTool = "placeobjects", -- Enables the placing/removing object mode.
+ SpeedzoneTool = "speedzones", -- Opens a menu to place speedzones.
+ DeleteNearbyObjects = "deleteobjects", -- Deletes (desynchronized) objects in range of player.
+ },
+
+ Animations = {
+ PickupAnimationDict = "random@domestic",
+ PickupAnimation = "pickup_low",
+ PlacedownAnimationDict = "random@domestic",
+ PlacedownAnimation = "pickup_low",
+ },
+
+ HotKeys = { -- MATCH THESE TO THE BUTTONS (https://docs.fivem.net/docs/game-references/controls/)
+ RoadNodeTool = "F5", -- https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ (Set to 999 to disable)
+ PlaceObjectsTool = "F6", -- https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ (Set to 999 to disable)
+ SpeedzoneTool = "F7", -- https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ (Set to 999 to disable)
+
+ BrowseLeft = 307, -- Arrow Right
+ BrowseRight = 308, -- Arrow Left
+ PlaceObject = 38, -- E
+ ToggleRoadNode = 38, -- E
+ DeleteObject = 19, -- LEFT ALT
+ DeleteObjectsInRange = 73, -- X
+ StopBrowsing = 177, -- BACKSPACE / ESC / RIGHT MOUSE BUTTON
+ },
+
+ Buttons = { -- MATCH THESE TO THE HOTKEYS (https://docs.fivem.net/docs/game-references/controls/)
+ BrowseLeft = "~INPUT_REPLAY_BACK~",
+ BrowseRight = "~INPUT_REPLAY_ADVANCE~",
+ PlaceObject = "~INPUT_PICKUP~",
+ ToggleRoadNode = "~INPUT_PICKUP~",
+ DeleteObject = "~INPUT_CHARACTER_WHEEL~",
+ StopBrowsing = "~INPUT_CELLPHONE_CANCEL~",
+ DeleteObjectsInRange = "~INPUT_VEH_DUCK~",
+
+ -- Menu button text
+ CreateSpeedzoneButton = '» Create a speedzone',
+ BuildTheSpeedzoneButton = '~g~»»»»» ~s~Create speedzone ~g~«««««',
+ DeleteSpeedzoneButton = '» Delete a speedzone',
+ NoPermissionButton = '» No permission to access this menu.',
+ RemoveTheSpeedzoneButton = "Delete speedzone at",
+ SelectASpeedButton = '» Select a speed:',
+ SelectASizeButton = '» Select a size:',
+ YesButton = '» Yes',
+ NoButton = '» No',
+ BackButton = '~r~««« ~s~BACK',
+ ExitMenuButton = '««« ~r~EXIT',
+ },
+
+ --====================== Objects (Props) ======================--
+
+ FreezeObjectsOnSpawn = false,
+ DeleteObjectsRadius = 15.0, -- Set radius in meters to delete objects on pressing the multiple object deletion button.
+ ObjectAndPropList = {
+ -- Default Props
+ { Name = "Small Road Cone", Prop = "prop_roadcone02c"},
+ { Name = "Large Road Cone", Prop = "prop_roadcone01a"},
+ { Name = "Scene Light", Prop = "prop_worklight_04d"},
+ { Name = "Striped Barrier", Prop = "prop_mp_barrier_02b"},
+ { Name = "Striped Large Cone", Prop = "prop_mp_cone_01"},
+ { Name = "Striped Small Cone", Prop = "prop_mp_cone_02"},
+ { Name = "No Stripe Small Cone", Prop = "prop_mp_cone_03"},
+ { Name = "Stand-up Striped Pole", Prop = "prop_mp_cone_04"},
+ { Name = "Gazebo", Prop = "prop_gazebo_02"},
+
+ -- ERS Props [Included with the Emergency Response Simulator Ultimate: https://store.nights-software.com/category/ersgamemode]
+ -- { Name = "Cone", Prop = "neko_night_cone_00" },
+ -- { Name = "Barrier", Prop = "neko_night_water_barrier_00" },
+ -- { Name = "Warning triangle", Prop = "neko_night_warning_tri_00" },
+ -- { Name = "Rubber barrier", Prop = "neko_night_rubber_barrier_00" },
+ -- { Name = "Barrier", Prop = "neko_night_barrier_00" },
+ -- { Name = "Barrier 1", Prop = "neko_night_barrier_01" },
+ -- { Name = "Barrier 2", Prop = "neko_night_barrier_02" },
+ -- { Name = "Arrow board cross", Prop = "neko_night_arrow_board_00" },
+ -- { Name = "Arrow board left", Prop = "neko_night_arrow_board_00_l" },
+ -- { Name = "Arrow board right", Prop = "neko_night_arrow_board_00_r" },
+
+ --Custom Props (Add yours here.)
+ -- { Name = "Blue Beacon", Prop = "blue_beacon"},
+ -- { Name = "Cone", Prop = "pro_cone"},
+ -- { Name = "Amber Cone", Prop = "pro_cone_amber"},
+ -- { Name = "Blue Cone", Prop = "pro_cone_blue"},
+ -- { Name = "Barrier 'Road Closed'", Prop = "prop_barrier_work05"},
+ -- { Name = "Barrier 'Accident'", Prop = "prop_barrier_accident"},
+ -- { Name = "Barrier 'Highway Left'", Prop = "prop_barrier_highwaysleft"},
+ -- { Name = "Barrier 'Highway Right'", Prop = "prop_barrier_highwaysright"},
+ -- { Name = "Barrier 'Drone'", Prop = "prop_barrier_policedrone"},
+ -- { Name = "Barrier 'Left'", Prop = "prop_barrier_policeleft"},
+ -- { Name = "Barrier 'Right'", Prop = "prop_barrier_policeright"},
+ -- { Name = "Barrier 'Slow'", Prop = "prop_barrier_Slow"},
+ },
+
+ --====================== Road Closures ======================--
+
+ RoadClosureAnimationDictionary = "taxi_hail",
+ RoadClosureAnimation = "hail_taxi",
+
+ --====================== Speedzones ======================--
+
+ MenuStructure = {
+ speedzonemenu = {
+ name = "speedzonemenu",
+ title = "Speedzones",
+ subtitle = "Speedzones",
+ bgcolor = {2, 219, 154, 150},
+ fgcolor = {232, 215, 187, 255},
+ submenus = {
+ activespeedzones = {
+ name = "activespeedzones",
+ title = "Active Speedzones",
+ subtitle = "DELETE AN ACTIVE ZONE",
+ bgcolor = {2, 219, 154, 150},
+ fgcolor = {232, 215, 187, 255},
+ submenus = {
+ }
+ },
+ createspeedzones = {
+ name = "createspeedzones",
+ title = "Create a Speedzone",
+ subtitle = "CREATE A SPEEDZONE",
+ bgcolor = {2, 219, 154, 150},
+ fgcolor = {232, 215, 187, 255},
+ submenus = {
+ }
+ },
+ closemenu = {
+ name = "closemenu",
+ title = "Exit Menu",
+ subtitle = "EXIT MENU?",
+ bgcolor = {2, 219, 154, 150},
+ fgcolor = {232, 215, 187, 255},
+ submenus = {
+ }
+ }
+ }
+ }
+ },
+
+ SpeedZoneSpeeds = {
+ {DisplayName = "0 MPH", Speed = 0.0},
+ {DisplayName = "5 MPH", Speed = 5.0},
+ {DisplayName = "10 MPH", Speed = 10.0},
+ {DisplayName = "15 MPH", Speed = 15.0},
+ {DisplayName = "20 MPH", Speed = 20.0},
+ {DisplayName = "25 MPH", Speed = 25.0},
+ {DisplayName = "30 MPH", Speed = 30.0},
+ {DisplayName = "35 MPH", Speed = 35.0},
+ {DisplayName = "40 MPH", Speed = 40.0},
+ {DisplayName = "45 MPH", Speed = 45.0},
+ {DisplayName = "50 MPH", Speed = 50.0},
+ {DisplayName = "55 MPH", Speed = 55.0},
+ {DisplayName = "60 MPH", Speed = 60.0},
+ {DisplayName = "65 MPH", Speed = 65.0},
+ {DisplayName = "70 MPH", Speed = 70.0},
+ },
+
+ SpeedZoneSizes = {
+ {DisplayName = "10 Radius", Radius = 10.0},
+ {DisplayName = "20 Radius", Radius = 20.0},
+ {DisplayName = "30 Radius", Radius = 30.0},
+ {DisplayName = "40 Radius", Radius = 40.0},
+ {DisplayName = "50 Radius", Radius = 50.0},
+ {DisplayName = "60 Radius", Radius = 60.0},
+ {DisplayName = "70 Radius", Radius = 70.0},
+ {DisplayName = "80 Radius", Radius = 80.0},
+ {DisplayName = "90 Radius", Radius = 90.0},
+ {DisplayName = "100 Radius", Radius = 100.0},
+ },
+
+ SpeedZoneBlipData = { -- https://docs.fivem.net/docs/game-references/blips/
+ blipName = "Speedzone",
+ blipSprite = 9,
+ blipColour = 40,
+ blipDisplay = 4,
+ blipAlpha = 100,
+ },
+
+ --====================== Messages ======================--
+
+ Messages = {
+ -- Error Fetching
+ InvalidObjectModel = "Invalid object model: ",
+ NoPermission = "You do not have the permission to do this.",
+ InVehicle = "You must outside of a vehicle.",
+ InObjectPlacingMode = "You are already in object placing mode.",
+ InObjectPlacingModeWhilstSpeedzone = "You are in object placing mode. Close it first before opening the speed zone menu.",
+ InRoadNodeToolWhilstSpeedzone = "You are in the road node tool. Close it first before opening the speedzone menu.",
+ InRoadNodeToolWhilstObjectPlacingMode = "You are in the road node tool. Close it first before opening the object placing mode.",
+ InObjectPlacingModeWhilstRoadNodeTool = "You are in object placing mode. Close it first before opening the road node tool.",
+ InSpeedzoneMenuWhilstRoadNodeTool = "You are in the road node tool. Close it first before opening the speedzone menu.",
+ FailedToSpawnObjectLimitReached = "Failed to add an object, likely due to a limit of spawned objects in this area...",
+
+ -- HotKey Help
+ HotKeySyntax = "Use ",
+ HotKeySyntax2 = "use ",
+ HotKeyAndSyntax = " and ",
+ HotKeyOrSyntax = "~w~ or ",
+ HotKeyEndSyntax = " Browse objects.",
+ HotKeyPlaceObjSyntax = " to place the object.",
+ HotKeyPlaceObjSyntax2 = " Place ~y~",
+ DeleteObject = " Delete closest object.",
+ StopBrowsing = " ~r~Exit~w~.",
+
+ -- Regular
+ ProcessingSpeedzoneRemoval = "Removing speedzone...",
+ LoadingObjectModel = "Loading object model",
+ PlacedObject = "You've place an object: ~y~",
+ DeletedObject = "Deleted object: ~y~",
+ HowToExitPlaceObjectMode = "Use BACKSPACE / ESC / RIGHT MOUSE BUTTON to exit placing objects mode.",
+ DeleteMultipleObjects = " to delete multiple objects in range.",
+ DeleteNearbyObjects = " Delete objects in range.",
+ NoObjectFoundNearby = "Could not find any nearby objects.",
+
+ -- Speedzone Menu
+ YouSelectedSyntax = "You selected",
+ YouCreatedASpeedzone = "You've created a speedzone.",
+ Street = "~w~Street: ~y~",
+ Size = "~w~Size: ~y~",
+ Speed = "~w~Speed: ~y~",
+ Nearby = "~w~nearby",
+
+ -- Road Nodes
+ OpenOrCloseNearestRoad = "Open or close the nearest road.",
+ OpenedOrClosedTheRoad = "You have opened or closed the road.",
+ StillInRoadNodeTool = "You are still in the road node tool.",
+
+ -- Chat Suggestions
+ PlaceObjectsToolChatSuggestion = "Command used to place objects.",
+ SpeedzoneToolChatSuggestion = "Command used to open the speedzone menu.",
+ RoadNodeToolChatSuggestion = "Command used to toggle the road node tool.",
+ DeleteNearbyObjectsCommandSuggestion = "Command used to delete objects close to a player.",
+ },
+}
+
+
+
diff --git a/resources/night_prop_system/fxmanifest.lua b/resources/night_prop_system/fxmanifest.lua
new file mode 100644
index 000000000..1d7b8651d
--- /dev/null
+++ b/resources/night_prop_system/fxmanifest.lua
@@ -0,0 +1,40 @@
+fx_version 'cerulean'
+games { 'gta5' }
+
+author 'Night'
+description 'Prop & Speedzone management system'
+version '3.3.1'
+lua54 'yes'
+
+client_scripts {
+ 'client/*.lua',
+}
+
+server_scripts {
+ 'server/*.lua',
+}
+
+shared_scripts {
+ 'config/*.lua',
+ -- '@es_extended/imports.lua' -- ESX
+}
+
+-- Usage example exports client side
+
+-- exports['night_prop_system']:TogglePlaceObjectsTool()
+-- exports['night_prop_system']:ToggleSpeedzoneTool()
+-- exports['night_prop_system']:ToggleRoadNodeTool()
+
+-- Usage Example exports server side (we kept the old naming server side for easy compatibility for previous users)
+
+-- exports['night_prop_system']:OpenPropMenu(src)
+-- exports['night_prop_system']:OpenSpeedZoneMenu(src)
+-- exports['night_prop_system']:ToggleRoadNodeTool(src)
+
+escrow_ignore {
+ 'config/*.lua',
+ 'client/c_functions.lua',
+ 'client/warmenu.lua',
+ 'server/s_functions.lua'
+}
+dependency '/assetpacks'
\ No newline at end of file
diff --git a/resources/night_prop_system/server/s_functions.lua b/resources/night_prop_system/server/s_functions.lua
new file mode 100644
index 000000000..cba15aef6
--- /dev/null
+++ b/resources/night_prop_system/server/s_functions.lua
@@ -0,0 +1,91 @@
+QBCore = nil
+ESX = nil
+
+Citizen.CreateThread(function()
+ if Config.Enable_QBCore_Permissions.Check_By_Job or Config.Enable_QBCore_Permissions.Check_By_Permissions then
+ QBCore = exports["qb-core"]:GetCoreObject()
+ end
+
+ if Config.Enable_ESX_Permissions then
+ ESX = exports["es_extended"]:getSharedObject()
+ end
+end)
+
+function CheckPermission(source)
+ local permission = false
+
+ if Config.EveryoneHasPermission then
+ return true
+ end
+
+ -- Role amount check
+ if #Config.PermissionRoles < 1 then return print("You've not set up any roles for permissions in the config.lua") end
+
+ -- Discord API Permissions
+ if Config.Enable_Night_DiscordApi_Permissions then
+ local isPermitted = exports.night_discordapi:IsMemberPartOfAnyOfTheseRoles(source, Config.PermissionRoles, false)
+ if isPermitted then
+ permission = true
+ end
+ end
+
+ -- Ace Permissions
+ if Config.Enable_Ace_Permissions then
+ for k, v in ipairs(Config.PermissionRoles) do
+ if IsPlayerAceAllowed(source, v) then
+ permission = true
+ break
+ end
+ end
+ end
+
+ -- ESX Job Permissions
+ if Config.Enable_ESX_Permissions then
+ if ESX == nil then return print("You've enabled ESX permissions, but the ESX framework has not been found...") end
+ local xPlayer = ESX.GetPlayerFromId(source)
+ if xPlayer then
+ for k, v in pairs(Config.PermissionRoles) do
+ if xPlayer.job.name == v then
+ permission = true
+ end
+ end
+ end
+ end
+
+ -- QBCore Job Based
+ if Config.Enable_QBCore_Permissions.Check_By_Job then
+ if QBCore == nil then return print("You've enabled QBCore job permissions, but the QBCore framework has not been found...") end
+ local player = QBCore.Functions.GetPlayer(source)
+ if player then
+ for k, v in pairs(Config.PermissionRoles) do
+ if player.PlayerData.job.name == v then
+ permission = true
+ end
+ end
+ end
+ end
+
+ -- QBCore Permission based
+ if Config.Enable_QBCore_Permissions.Check_By_Permissions then
+ if QBCore == nil then return print("You've enabled QBCore group permissions, but the QBCore framework has not been found...") end
+ local player = QBCore.Functions.GetPlayer(source)
+ if player then
+ for k, v in pairs(Config.PermissionRoles) do
+ if QBCore.Functions.HasPermission(source, v) then
+ permission = true
+ end
+ end
+ end
+ end
+ return permission
+end
+
+--============ Debug ============--
+
+function DebugPrint(msg)
+ if Config.Debug then
+ if msg ~= nil then
+ print("["..GetCurrentResourceName().."] "..msg)
+ end
+ end
+end
\ No newline at end of file
diff --git a/resources/night_prop_system/server/server.lua b/resources/night_prop_system/server/server.lua
new file mode 100644
index 000000000..f6f7fb5df
Binary files /dev/null and b/resources/night_prop_system/server/server.lua differ
diff --git a/server.cfg b/server.cfg
index 96b269226..17e7a7185 100644
--- a/server.cfg
+++ b/server.cfg
@@ -74,6 +74,9 @@ ensure SmartFiresLite
ensure SmartFiresLite
ensure ebu_flatbeds_ers
ensure delped
+ensure night_ers_k9
+ensure night_prop_system
+ensure disable_interior
ensure Cruise-Control
ensure guidehud
ensure EGRP-LoadingScreen
@@ -226,7 +229,6 @@ ensure Highway_cameras_style_2
ensure Supply-Line
ensure scully_lawenforcement
ensure VehicleTrustSystem-master
-ensure LSRPC-K9
ensure 5500wrecker
ensure seatbelt
ensure jraxion_handlingeditor
@@ -417,6 +419,7 @@ ensure 16expmet
ensure beverlyhillspack
ensure LASD
ensure LAPD
+ensure 22f150rb
ensure 23f150pr
ensure 23f150prbb
ensure bearcat
@@ -715,7 +718,7 @@ ensure hane_hpub
ensure hane_hpub_meta
ensure hane_hpub_meta2
ensure hn_hpub_anim_paints
-ensure
+ensure lasdmlo
ensure
ensure
ensure