From d33b765d798302444277ab479f94f3fd26d43ef9 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:10:17 +0100
Subject: [PATCH 01/18] Remove old & unsued locale files
---
locales/cs.lua | 170 -----------------------------
locales/de.lua | 170 -----------------------------
locales/es.lua | 171 ------------------------------
locales/fi.lua | 171 ------------------------------
locales/fr.lua | 170 -----------------------------
locales/hu.lua | 171 ------------------------------
locales/it.lua | 170 -----------------------------
locales/nl.lua | 171 ------------------------------
locales/pl.lua | 170 -----------------------------
locales/sr.lua | 162 ----------------------------
localization/de_esx_policejob.sql | 88 ---------------
localization/en_esx_policejob.sql | 88 ---------------
localization/es_esx_policejob.sql | 88 ---------------
localization/fi_esx_policejob.sql | 88 ---------------
localization/fr_esx_policejob.sql | 88 ---------------
localization/it_esx_policejob.sql | 88 ---------------
localization/nl_esx_policejob.sql | 62 -----------
localization/pl_esx_policejob.sql | 88 ---------------
localization/sr_esx_policejob.sql | 88 ---------------
19 files changed, 2462 deletions(-)
delete mode 100644 locales/cs.lua
delete mode 100644 locales/de.lua
delete mode 100644 locales/es.lua
delete mode 100644 locales/fi.lua
delete mode 100644 locales/fr.lua
delete mode 100644 locales/hu.lua
delete mode 100644 locales/it.lua
delete mode 100644 locales/nl.lua
delete mode 100644 locales/pl.lua
delete mode 100644 locales/sr.lua
delete mode 100644 localization/de_esx_policejob.sql
delete mode 100644 localization/en_esx_policejob.sql
delete mode 100644 localization/es_esx_policejob.sql
delete mode 100644 localization/fi_esx_policejob.sql
delete mode 100644 localization/fr_esx_policejob.sql
delete mode 100644 localization/it_esx_policejob.sql
delete mode 100644 localization/nl_esx_policejob.sql
delete mode 100644 localization/pl_esx_policejob.sql
delete mode 100644 localization/sr_esx_policejob.sql
diff --git a/locales/cs.lua b/locales/cs.lua
deleted file mode 100644
index 71c46ec..0000000
--- a/locales/cs.lua
+++ /dev/null
@@ -1,170 +0,0 @@
-Locales['cs'] = {
- -- Cloakroom
- ['cloakroom'] = 'satna',
- ['citizen_wear'] = 'civilní oblek',
- ['police_wear'] = 'policejní oblek',
- ['gilet_wear'] = 'oranžová reflexní vesta',
- ['bullet_wear'] = 'neprůstřelná vesta',
- ['no_outfit'] = 'není zde žádná uniforma, která by ti sedla!',
- ['open_cloackroom'] = 'stiskni [E] pro změnu oblečení.',
- -- Armory
- ['remove_object'] = 'vzít objekt',
- ['deposit_object'] = 'odevzdat objekt',
- ['get_weapon'] = 'vzít zbraň ze zbrojnice',
- ['put_weapon'] = 'uchovat zbraň ve zbrojnici',
- ['buy_weapons'] = 'koupit zbraně',
- ['armory'] = 'zbrojnice',
- ['open_armory'] = 'stiskni [E] pro přístup do zbrojnice.',
- ['armory_owned'] = 'vlastněno',
- ['armory_free'] = 'zdarma',
- ['armory_item'] = '$%s',
- ['armory_weapontitle'] = 'zbrojnice',
- ['armory_componenttitle'] = 'zbrojnice - Příslušenství ke zbraním',
- ['armory_bought'] = 'zakoupil jsi %s za $%s',
- ['armory_money'] = 'nemáš dostatek peněz na tuto zbraň',
- ['armory_hascomponent'] = 'toto příslušenství máš již nainstalováno!',
- ['get_weapon_menu'] = 'zbrojnice - Vzít zbraň',
- ['put_weapon_menu'] = 'zbrojnice - Uchovat zbraň',
- ['confirm'] = 'Confirm', --not translated
- -- Vehicles
- ['vehicle_menu'] = 'vozidlo',
- ['vehicle_blocked'] = 'vsechny dostupne spawn pointy jsou blokovany!',
- ['garage_prompt'] = 'stiskni [E] pro otevreni akce vozidel.',
- ['garage_title'] = 'akce vozidel',
- ['garage_stored'] = 'uloženo',
- ['garage_notstored'] = 'není v garáži',
- ['garage_storing'] = 'pokousime se o odstraneni vozidla, ujisti se, ze kolem nej nejsou hraci.',
- ['garage_has_stored'] = 'vozidlo bylo ulozeno do garaze',
- ['garage_has_notstored'] = 'zadne nejblizsi vlastnene vozidlo nenalezeno',
- ['garage_notavailable'] = 'tvoje vozidlo neni ulozeno v garazi.',
- ['garage_blocked'] = 'nejsou zde zadne spawn pointy!',
- ['garage_empty'] = 'zadne vozidlo nemas v garazi.',
- ['garage_released'] = 'tvoje vozidlo bylo vyjmuto z garaze.',
- ['garage_store_nearby'] = 'nejsou poblíž zádná vozidla.',
- ['garage_storeditem'] = 'otevřít garáž',
- ['garage_storeitem'] = 'uchovat vozidlo v garáži',
- ['garage_buyitem'] = 'prodej vozidel',
- ['garage_notauthorized'] = 'nemas opravneni ke koupi tohoto vozidla.',
- ['helicopter_prompt'] = 'stiskni [E] pro pristup k akcim Helikopter.',
- ['shop_item'] = '$%s',
- ['vehicleshop_title'] = 'prodejce vozidel',
- ['vehicleshop_confirm'] = 'opravdu chces koupit toto vozidlo?',
- ['vehicleshop_bought'] = 'koupil jsi %s za ~r~$%s',
- ['vehicleshop_money'] = 'toto vozidlo si nemuzete dovolit',
- ['vehicleshop_awaiting_model'] = 'vozidlo se prave stahuje a nacita prosim pockej',
- ['confirm_no'] = 'ne',
- ['confirm_yes'] = 'ano',
- ['view'] = 'View', --not translated
- ['buy_car'] = 'Buy', --not translated
- ['stop_view'] = 'Stop Viewing', --not translated
- -- Service
- ['service_max'] = 'nemuzete vstoupit do sluzby, max dustojníci v provozu: %s/%s',
- ['service_not'] = 'nezadali jste sluzbu! Nejprve se musíte zmenit.',
- ['service_anonunce'] = 'informace o sluzbe',
- ['service_in'] = 'vstoupil jsi do sluzby, vitej!',
- ['service_in_announce'] = 'operator %s se pripojil do sluzby!',
- ['service_out'] = 'opustil jsi sluzbu.',
- ['service_out_announce'] = 'operator %s opustil jejich sluzbu.',
- -- Action Menu
- ['menu_title'] = 'Police', --not translated
- ['citizen_interaction'] = 'Interakce s občanem',
- ['vehicle_interaction'] = 'Interakce vozidla',
- ['object_spawner'] = 'Objekty',
-
- ['id_card'] = 'Občanský průkaz',
- ['search'] = 'prohledat',
- ['handcuff'] = 'poutat / odpoutat',
- ['drag'] = 'prenést',
- ['put_in_vehicle'] = 'vlozit do vozidla',
- ['out_the_vehicle'] = 'vytahnout z vozidla',
- ['fine'] = 'pokuta',
- ['unpaid_bills'] = 'spravovat nezaplacené pokuty',
- ['license_check'] = 'spravovat průkazy',
- ['license_revoke'] = 'zneplatnit průkaz',
- ['license_revoked'] = 'vase %s bylo zruseno!',
- ['licence_you_revoked'] = 'zrusil jsi %s ktery patril %s',
- ['no_players_nearby'] = 'zadny hrac pobliz!',
- ['being_searched'] = 'prave jsi prohledavan policii',
- ['fine_enter_amount'] = 'Enter the amount of the fine', --not translated
- ['fine_enter_text'] = 'Enter the reason for the fine', --not translated
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Vehicle interaction
- ['vehicle_info'] = 'informace o vozidle',
- ['pick_lock'] = 'vypáčit vozidlo',
- ['vehicle_unlocked'] = 'vozidlo je Odemčeno',
- ['no_vehicles_nearby'] = 'there is no vehicles nearby',
- ['impound'] = 'odtahnout vozidlo',
- ['impound_prompt'] = 'zmackni [E] pro zruseni odtahnuti',
- ['impound_canceled'] = 'zrusil jsi odtah',
- ['impound_canceled_moved'] = 'odtah byl zrusen,protoze se vozidlo pohlo!',
- ['impound_successful'] = 'uspesne jsi odtahl vozidlo',
- ['search_database'] = 'informace o vozidle',
- ['search_database_title'] = 'informace o vozidle - pomocí registracnich cisel',
- ['search_database_error_invalid'] = 'tohle ~r~neni spravne registracni cislo',
- ['search_plate'] = 'Enter Plate', --not translated
- ['lookup_plate'] = 'Lookup Plate', --not translated
- -- Traffic interaction
- ['traffic_interaction'] = 'interakce provozu',
- ['cone'] = 'kuzel',
- ['barrier'] = 'bariera',
- ['spikestrips'] = 'ostnaty pas',
- ['box'] = 'box',
- ['cash'] = 'box penez',
- -- ID Card Menu
- ['name'] = 'jméno: %s',
- ['job'] = 'práce: %s',
- ['sex'] = 'pohlaví: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'výška: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'neznámé',
- ['male'] = 'muž',
- ['female'] = 'žena',
- -- Body Search Menu
- ['guns_label'] = '--- Zbraně ---',
- ['inventory_label'] = '--- Inventář ---',
- ['license_label'] = ' --- Průkazy ---',
- ['confiscate'] = 'zabavit %s',
- ['confiscate_weapon'] = 'zabavit %s s %s naboji',
- ['confiscate_inv'] = 'zabavit %sx %s',
- ['confiscate_dirty'] = 'zabavit spinave penize: $%s',
- ['you_confiscated'] = 'zabavil jsi %sx %s od %s',
- ['got_confiscated'] = '%sx %s byly zabaveny od %s',
- ['you_confiscated_account'] = 'zabavil jsi $%s (%s) od %s',
- ['got_confiscated_account'] = '$%s (%s) byly zabaveny %s',
- ['you_confiscated_weapon'] = 'zabavil jsi %s od %s s ~o~%s naboji ',
- ['got_confiscated_weapon'] = 'tvoje %s s ~o~%s bylo zabaveno od %s',
- ['traffic_offense'] = 'dopravní přestupek',
- ['minor_offense'] = 'malý přestupek',
- ['average_offense'] = 'přestupek',
- ['major_offense'] = 'trestný čin',
- ['fine_total'] = 'pokuta: %s',
- -- Vehicle Info Menu
- ['plate'] = 'SPZ: %s',
- ['owner_unknown'] = 'vlastník: Neznámý',
- ['owner'] = 'vlastník: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'stiskni [E] pro otevření menu',
- ['quantity_invalid'] = 'neplatné množství',
- ['have_withdrawn'] = 'vybral jsi %sx %s',
- ['have_deposited'] = 'vložil jsi %sx %s',
- ['quantity'] = 'množství',
- ['quantity_placeholder'] = 'Amount to withdraw..', --not translated
- ['inventory'] = 'inventář',
- ['police_stock'] = 'policejní sklad',
- -- Misc
- ['remove_prop'] = 'stiskni [E] pro odstranění předmětu',
- ['map_blip'] = 'policejní stanice',
- ['unrestrained_timer'] = 'cítíš, že tvé pouta pomalu ztrácejí přilnavost a padají.',
- -- Notifications
- ['alert_police'] = 'policejní poplach',
- ['phone_police'] = 'policie',
- -- Keybind
- ['interaction'] = 'Interact', --not translated
- ['quick_actions'] = 'Quick Actions', --not translated
- -- Other
- ['society_police'] = 'Police', --not translated
- ['s_m_y_sheriff_01'] = 'Sheriff Ped', --not translated
- ['s_m_y_cop_01'] = 'Police Ped', -- not translated
- ['s_m_y_swat_01'] = 'SWAT Ped', --not translated
-}
diff --git a/locales/de.lua b/locales/de.lua
deleted file mode 100644
index 68c0992..0000000
--- a/locales/de.lua
+++ /dev/null
@@ -1,170 +0,0 @@
-Locales['de'] = {
- -- Cloackroom
- ['cloakroom'] = 'Garderobe',
- ['citizen_wear'] = 'Zivilkleidung',
- ['police_wear'] = 'Arbeitskleidung',
- ['gilet_wear'] = 'Orangene Sicherheits Weste',
- ['bullet_wear'] = 'Schusssichere Weste',
- ['no_outfit'] = 'Es gibt keine Klamotten die dir passen.',
- ['open_cloackroom'] = 'Drücke [E] um dich umzuziehen',
- -- Armory
- ['remove_object'] = 'Objekt nehmen',
- ['deposit_object'] = 'Objekt verstauen',
- ['get_weapon'] = 'Waffen holen',
- ['put_weapon'] = 'Waffen bringen',
- ['buy_weapons'] = 'Waffen kaufen',
- ['armory'] = 'Waffenkammer',
- ['open_armory'] = 'Drücke [E] um die Waffenkammer zu öffnen.',
- ['armory_owned'] = 'gekauft',
- ['armory_free'] = 'gratis',
- ['armory_item'] = '%s€',
- ['armory_weapontitle'] = 'Waffenkammer - Waffe Kaufen',
- ['armory_componenttitle'] = 'Waffenkammer - Waffenzubehör',
- ['armory_bought'] = 'Du kaufst eine ~y~%s~s~ für ~r~%s€~s~',
- ['armory_money'] = 'Du kannst dir diese Waffe nicht leisten!',
- ['armory_hascomponent'] = 'Du hast dieses Zubehör an deiner Waffe!',
- ['get_weapon_menu'] = 'Waffenkammer - Waffe nehmen',
- ['put_weapon_menu'] = 'Waffenkammer - Waffe verstauen',
- ['confirm'] = 'Bestätigen',
- -- Vehicles
- ['vehicle_menu'] = 'Fahrzeug',
- ['vehicle_blocked'] = 'Alle verfügbaren Spawnpunkte sind derzeit belegt!',
- ['garage_prompt'] = 'Drücke [E] um auf die ~y~Fahrzeug Aktionen~s~ zuzugreifen.',
- ['garage_title'] = 'Fahrzeug Aktionen',
- ['garage_stored'] = 'Eingeparkt',
- ['garage_notstored'] = 'Nicht in der Garage',
- ['garage_storing'] = 'Wir sind dabei dein Fahrzeug einzuparken! Bitte beachte das keine Personen drumrum sind!',
- ['garage_has_stored'] = 'Das Fahrzeug wurde in deiner Garage verstaut!',
- ['garage_has_notstored'] = 'Es wurden keine Fahrzeuge in der Nähe gefunden!',
- ['garage_notavailable'] = 'Dein Fahrzeug ist nicht in der Garage.',
- ['garage_blocked'] = 'Es existieren keine Spawnpunkte für die Fahrzeuge',
- ['garage_empty'] = 'Du hast keine Fahrzeuge in der Garage.',
- ['garage_released'] = 'Dein Auto wurde von der Garage befreit.',
- ['garage_store_nearby'] = 'Es gibt keine Fahrzeuge in deiner Nähe',
- ['garage_storeditem'] = 'Garage öffnen',
- ['garage_storeitem'] = 'Parke dein Fahrzeug in der Garage ein',
- ['garage_buyitem'] = 'Fahrzeug Händler',
- ['garage_notauthorized'] = 'Du hast keinen zugriff auf die Garage!',
- ['helicopter_prompt'] = 'Drücke [E] um auf die ~y~Helikopter Aktionen~s~ zuzugreifen.',
- ['shop_item'] = '%s€',
- ['vehicleshop_title'] = 'Fahrzeughändler',
- ['vehicleshop_confirm'] = 'Möchtest du dieses Fahrzeug wirklich kaufen?',
- ['vehicleshop_bought'] = 'Du kaufst ~y~%s~s~ für ~r~%s€~s~',
- ['vehicleshop_money'] = 'Du kannst dir das Fahrzeug nicht leisten!',
- ['vehicleshop_awaiting_model'] = 'Das Fahrzeug ist derzeit am ~g~Herunterladen & Laden~s~ warte bitte...',
- ['confirm_no'] = 'Nein',
- ['confirm_yes'] = 'Ja',
- ['view'] = 'Ansehen',
- ['buy_car'] = 'Kaufen',
- ['stop_view'] = 'Ansehen beenden',
- -- Service
- ['service_max'] = 'Du kannst nicht On-Duty gehen. Es sind zuviele Officer im Dienst: %s/%s',
- ['service_not'] = 'Du bist nun On-Duty! Du musst dich zuerst umziehen!',
- ['service_anonunce'] = 'Service Informationen',
- ['service_in'] = 'Du bist nun im Dienst! Willkommen!',
- ['service_in_announce'] = 'Officer ~y~%s~s~ ist nun im Dienst!',
- ['service_out'] = 'Du bist nun Off-Duty',
- ['service_out_announce'] = 'Officer ~y~%s~s~ ist nun nicht mehr im Dienst!',
- -- Action Menu
- ['menu_title'] = 'Polizei',
- ['citizen_interaction'] = 'Zivilisten Interaktion',
- ['vehicle_interaction'] = 'Fahrzeug Interaktion',
- ['object_spawner'] = 'Objekt Spawner',
-
- ['id_card'] = 'Ausweis',
- ['search'] = 'Durchsuchen',
- ['handcuff'] = 'Festnehmen / Freilassen',
- ['drag'] = 'Ziehen',
- ['put_in_vehicle'] = 'Ins Fahrzeug Packen',
- ['out_the_vehicle'] = 'Aus dem Fahrzeug nehmen',
- ['fine'] = 'Rechnung',
- ['unpaid_bills'] = 'Unbezahlte Rechnungen verwalten',
- ['license_check'] = 'Lizenzen Verwalten',
- ['license_revoke'] = 'Lizenz entziehen',
- ['license_revoked'] = 'Deine Lizenz ~b~%s~s~ wurde ~y~entzogen~s~!',
- ['licence_you_revoked'] = 'Du entziehst eine ~b~%s~s~ welche zu ~y~%s~s~ gehörte.',
- ['no_players_nearby'] = 'Es sind keine Personen in der Nähe!',
- ['being_searched'] = 'Du wirst von der Polizei durchsucht!',
- ['fine_enter_amount'] = 'Gebe den Betrag der Geldstrafe ein',
- ['fine_enter_text'] = 'Gebe den Grund der Geldstrafe ein',
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Vehicle interaction
- ['vehicle_info'] = 'Fahrzeug Info',
- ['pick_lock'] = 'Fahrzeug Aufbrechen',
- ['vehicle_unlocked'] = 'Fahrzeug ~g~Aufgeschlossen~s~',
- ['no_vehicles_nearby'] = 'Es gibt keine Fahrzeuge in der Nähe',
- ['impound'] = 'Fahrzeug Abschleppen',
- ['impound_prompt'] = 'Drücke [E] um das Abschleppen abzubrechen',
- ['impound_canceled'] = 'Du hast das abschleppen abgebrochen',
- ['impound_canceled_moved'] = 'Das abschleppen wurde abgebrochen, da das Fahrzeug sich bewegt hat!',
- ['impound_successful'] = 'Du hast das Fahrzeug abgeschleppt',
- ['search_database'] = 'Fahrzeug Informationen',
- ['search_database_title'] = 'Fahrzeug Informationen - Suche mit dem Kennzeichen',
- ['search_database_error_invalid'] = 'Das ist kein gültiges Kennzeichen!',
- -- Traffic interaction
- ['search_plate'] = 'Kennzeichen Eingeben',
- ['lookup_plate'] = 'Kennzeichen Suchen',
- ['traffic_interaction'] = 'Vehrkehrs Interaktionen',
- ['cone'] = 'Hütchen',
- ['barrier'] = 'Barriere',
- ['spikestrips'] = 'Nagelband',
- ['box'] = 'Box',
- ['cash'] = 'Box mit Geld',
- -- ID Card Menu
- ['name'] = 'Name: %s',
- ['job'] = 'Job: %s',
- ['sex'] = 'Geschlect: %s',
- ['dob'] = 'Geburtsdatum: %s',
- ['height'] = 'Größe: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'Unbekannt',
- ['male'] = 'Männlich',
- ['female'] = 'Weiblich',
- -- Body Search Menu
- ['guns_label'] = '--- Waffen ---',
- ['inventory_label'] = '--- Inventar ---',
- ['license_label'] = ' --- Lizenzen ---',
- ['confiscate'] = 'Konfiszieren %s',
- ['confiscate_weapon'] = 'Du konfiszierst %s mit %s Munition',
- ['confiscate_inv'] = 'Konfiziere %sx %s',
- ['confiscate_dirty'] = 'Konfisziere Schwarzgeld: %s€',
- ['you_confiscated'] = 'Du konfiszierst ~y~%sx~s~ ~b~%s~s~ von ~b~%s~s~',
- ['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ wurden konfisziert von ~y~%s~s~',
- ['you_confiscated_account'] = 'Du konfiszierst ~g~%s€~s~ (%s) von ~b~%s~s~',
- ['got_confiscated_account'] = '~g~%s€~s~ (%s) wurde konfisziert von ~y~%s~s~',
- ['you_confiscated_weapon'] = 'Du konfiszierst ~b~%s~s~ von ~b~%s~s~ mit ~o~%s~s~ Munition',
- ['got_confiscated_weapon'] = 'Dein ~b~%s~s~ mit ~o~%s~s~ wurde konfisziert von ~y~%s~s~',
- ['traffic_offense'] = 'Vehrkersvergehen',
- ['minor_offense'] = 'Unerhebliches vergehen',
- ['average_offense'] = 'Durchschnittliches Vergehen',
- ['major_offense'] = 'Wesentliches Vehrgehen',
- ['fine_total'] = 'Rechnung: %s',
- -- Vehicle Info Menu
- ['plate'] = 'Kennzeichen: %s',
- ['owner_unknown'] = 'Besitzer: Unbekannt',
- ['owner'] = 'Besitzer: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'Drücke [E] um das Menü zu öffnen',
- ['quantity_invalid'] = 'Ungültige Anzahl',
- ['have_withdrawn'] = 'Du zahlst ~y~%sx~s~ ~b~%s~s~ aus',
- ['have_deposited'] = 'Du zahlst ~y~%sx~s~ ~b~%s~s~ ein',
- ['quantity'] = 'Anzahl',
- ['quantity_placeholder'] = 'Anzahl zum Einzahlen..',
- ['inventory'] = 'Inventar',
- ['police_stock'] = 'Polizeilager',
- -- Misc
- ['remove_prop'] = 'Drücke [E] um das Objekt zu entfernen',
- ['map_blip'] = 'Polizeiwache',
- ['unrestrained_timer'] = 'Du fühlst wie du aus deinen Handschellen langsam rausgleitest! Renn!',
- -- Notifications
- ['alert_police'] = 'Polizei Alarmieren',
- ['phone_police'] = 'Polizei',
- -- Keybind
- ['interaction'] = 'Interagieren',
- ['quick_actions'] = 'Schnelle Aktionen',
- -- Other
- ['society_police'] = 'Polizei',
- ['s_m_y_sheriff_01'] = 'Sheriff Charakter',
- ['s_m_y_cop_01'] = 'Polizei Charakter',
- ['s_m_y_swat_01'] = 'SWAT Charakter',
-}
diff --git a/locales/es.lua b/locales/es.lua
deleted file mode 100644
index 7baaf11..0000000
--- a/locales/es.lua
+++ /dev/null
@@ -1,171 +0,0 @@
-Locales['es'] = {
- -- Cloakroom
- ['cloakroom'] = 'Taquilla',
- ['citizen_wear'] = 'Ropa de civil',
- ['police_wear'] = 'Uniforme',
- ['gilet_wear'] = 'Chaqueta reflectante naranja',
- ['bullet_wear'] = 'Chaleco antibalas',
- ['no_outfit'] = '¡No hay ningún uniforme disponible para ti!',
- ['open_cloackroom'] = 'Presionar [E] para abrir su taquilla',
- -- Armory
- ['remove_object'] = 'Coger objeto',
- ['deposit_object'] = 'Depositar objeto',
- ['get_weapon'] = 'Coger arma',
- ['put_weapon'] = 'Depositar arma',
- ['buy_weapons'] = 'Comprar armas',
- ['armory'] = 'Armeria',
- ['open_armory'] = 'Presionar [E] para acceder a la armeria',
- ['armory_owned'] = 'Comprada',
- ['armory_free'] = 'Gratis',
- ['armory_item'] = '$%s',
- ['armory_weapontitle'] = 'Armeria - Comprar arma',
- ['armory_componenttitle'] = 'Armeria - Complementos del arma',
- ['armory_bought'] = 'compraste una %s por $%s',
- ['armory_money'] = 'No dispones de suficiente dinero para comprar esta arma',
- ['armory_hascomponent'] = '¡Ya dispones de ese complemento!',
- ['get_weapon_menu'] = 'Armeria - Retirar arma',
- ['put_weapon_menu'] = 'Armeria - Guardar arma',
- ['confirm'] = 'Confirm', --not translated
- -- Vehicles
- ['vehicle_menu'] = 'Vehículos',
- ['vehicle_blocked'] = '¡Todos los puntos de aparición de vehículos están ocupados!',
- ['garage_prompt'] = 'Presione [E] para acceder a Acciones del Vehículo.',
- ['garage_title'] = 'Acciones del vehículo',
- ['garage_stored'] = 'Guardado',
- ['garage_notstored'] = 'No se encuentra en el garaje',
- ['garage_storing'] = 'Estamos intentando borrar el vehículo, asegurate de que no haya jugadores cerca.',
- ['garage_has_stored'] = 'El vehículo ha sido guardado en su garaje',
- ['garage_has_notstored'] = 'no nearby owned vehicles were found',
- ['garage_notavailable'] = 'Su vehículo no está guardado en el garaje.',
- ['garage_blocked'] = '¡No hay ningún punto de spawn disponible!',
- ['garage_empty'] = 'No dispones de ningún vehículo en su garaje.',
- ['garage_released'] = 'your vehicle has been released from the garage.',
- ['garage_store_nearby'] = 'No hay vehículos cercanos.',
- ['garage_storeditem'] = 'Abrir garaje',
- ['garage_storeitem'] = 'Guardar vehículo en el garaje',
- ['garage_buyitem'] = 'Tienda de vehículos',
- ['garage_notauthorized'] = 'No estás autorizado a comprar este tipo de vehículos.',
- ['helicopter_prompt'] = 'press [E] to access the Helicopter Actions.',
- ['shop_item'] = '$%s',
- ['vehicleshop_title'] = 'Tienda de vehículos',
- ['vehicleshop_confirm'] = '¿Quieres comprar este vehículo?',
- ['vehicleshop_bought'] = 'Has comprado un %s por ~r~$%s',
- ['vehicleshop_money'] = 'No tienes suficiente dinero para comprar este vehículo',
- ['vehicleshop_awaiting_model'] = 'El vehículo se está DESCARGANDO Y CARGANDO porfavor espere',
- ['confirm_no'] = 'no',
- ['confirm_yes'] = 'si',
- ['view'] = 'View', --not translated
- ['buy_car'] = 'Buy', --not translated
- ['stop_view'] = 'Stop Viewing', --not translated
- -- Service
- ['service_max'] = 'No puedes entrar de servicio porque se ha alcanzado el número máximo: %s/%s',
- ['service_not'] = '¡No has entrado de servicio! Debes hacerlo primeramente.',
- ['service_anonunce'] = 'Información de servicio',
- ['service_in'] = 'Has entrado de servicio. ¡Bienvenido!',
- ['service_in_announce'] = '¡El agente %s ha entrado de servicio!',
- ['service_out'] = 'Has salido de servicio.',
- ['service_out_announce'] = 'El agente %s se ha salido de servicio.',
- -- Action Menu
- ['menu_title'] = 'Police', --not translated
- ['citizen_interaction'] = 'Interacción ciudadana',
- ['vehicle_interaction'] = 'Interacción vehículo',
- ['object_spawner'] = 'Colocar objetos',
-
- ['id_card'] = 'Documento de identidad',
- ['search'] = 'Buscar',
- ['handcuff'] = 'Poner/quitar Esposas',
- ['drag'] = 'escoltar',
- ['put_in_vehicle'] = 'Meter en el vehículo',
- ['out_the_vehicle'] = 'Sacar del vehículo',
- ['fine'] = 'Multa',
- ['unpaid_bills'] = 'manage unpaid bills',
- ['license_check'] = 'Gestionar licencia',
- ['license_revoke'] = 'Revocar licencia',
- ['license_revoked'] = 'Su %s ha sido revocar!',
- ['licence_you_revoked'] = 'you revoked a %s which belonged to %s',
- ['no_players_nearby'] = 'no hay jugadores cerca',
- ['being_searched'] = 'you are being searched by the Police',
- ['fine_enter_amount'] = 'Enter the amount of the fine', --not translated
- ['fine_enter_text'] = 'Enter the reason for the fine', --not translated
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Vehicle interaction
- ['vehicle_info'] = 'Información del vehículo',
- ['pick_lock'] = 'Forzar coche',
- ['vehicle_unlocked'] = 'Vehículo desbloqueado',
- ['no_vehicles_nearby'] = 'No hay vehículos cerca',
- ['impound'] = 'Confiscar vehículo',
- ['impound_prompt'] = 'Presione [E] para cancelar impound',
- ['impound_canceled'] = 'you canceled the impound',
- ['impound_canceled_moved'] = 'the impound has been canceled because the vehicle moved',
- ['impound_successful'] = 'you have impounded the vehicle',
- ['search_database'] = 'vehicle information',
- ['search_database_title'] = 'vehicle information - search with registration number',
- ['search_database_error_invalid'] = 'that is ~r~not a valid registration number',
- ['search_plate'] = 'Enter Plate', --not translated
- ['lookup_plate'] = 'Lookup Plate', --not translated
- -- Traffic interaction
- ['traffic_interaction'] = 'Rutas de interacción',
- ['cone'] = 'Cono',
- ['barrier'] = 'Barrera',
- ['spikestrips'] = 'Grada',
- ['box'] = 'Caja',
- ['cash'] = 'Dinero',
- -- ID Card Menu
- ['name'] = 'Nombre: %s',
- ['job'] = 'Trabajo: %s',
- ['sex'] = 'Sexo: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'Altura: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'Desconocido',
- ['male'] = 'Hombre',
- ['female'] = 'Mujer',
- -- Body Search Menu
- ['guns_label'] = '--- Armas ---',
- ['inventory_label'] = '--- Inventario ---',
- ['license_label'] = ' --- Licenses ---',
- ['confiscate'] = 'confiscar %s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_inv'] = 'confiscar %sx %s',
- ['confiscate_dirty'] = 'confiscar dinero negro: €%s',
- ['you_confiscated'] = 'you confiscated %sx %s from %s',
- ['got_confiscated'] = '%sx %s were confiscated by %s',
- ['you_confiscated_account'] = 'Has confiscado €%s (%s) de %s',
- ['got_confiscated_account'] = '€%s (%s) ha sido confiscado por %s',
- ['you_confiscated_weapon'] = 'you confiscated %s from %s with ~o~%s bullets',
- ['got_confiscated_weapon'] = 'your %s with ~o~%s bullets was confiscated by %s',
- ['traffic_offense'] = 'Delito de tráfico',
- ['minor_offense'] = 'Delito menor',
- ['average_offense'] = 'Delito medio',
- ['major_offense'] = 'Delito grave',
- ['fine_total'] = 'Multa total: %s',
- -- Vehicle Info Menu
- ['plate'] = 'n°: %s',
- ['owner_unknown'] = 'propietario: Desconocido',
- ['owner'] = 'propietario: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'presionar [E] para abrir el menú',
- ['quantity_invalid'] = 'cantidad invalida',
- ['have_withdrawn'] = 'you have withdrawn %sx %s',
- ['have_deposited'] = 'you have deposited %sx %s',
- ['quantity'] = 'cantidad',
- ['quantity_placeholder'] = 'Amount to withdraw..', --not translated
- ['inventory'] = 'inventario',
- ['police_stock'] = 'almacen Policial',
- -- Misc
- ['remove_prop'] = 'presionar [E] para eliminar el objeto',
- ['map_blip'] = 'comisaría de policía',
- ['unrestrained_timer'] = 'you feel your handcuffs slowly losing grip and fading away.',
- -- Notifications
- ['alert_police'] = 'alerta policia',
- ['phone_police'] = 'policia',
- -- Keybind
- ['interaction'] = 'Interact', --not translated
- ['quick_actions'] = 'Quick Actions', --not translated
- -- Other
- ['society_police'] = 'Police', --not translated
- ['s_m_y_sheriff_01'] = 'Sheriff Ped', --not translated
- ['s_m_y_cop_01'] = 'Police Ped', -- not translated
- ['s_m_y_swat_01'] = 'SWAT Ped', --not translated
-
-}
diff --git a/locales/fi.lua b/locales/fi.lua
deleted file mode 100644
index 219c7d5..0000000
--- a/locales/fi.lua
+++ /dev/null
@@ -1,171 +0,0 @@
-Locales['fi'] = {
- -- Cloakroom
- ['cloakroom'] = 'vaatelokero',
- ['citizen_wear'] = 'siviiliasu',
- ['police_wear'] = 'poliisiasu',
- ['gilet_wear'] = 'huomioliivi',
- ['bullet_wear'] = 'luotiliivi',
- ['no_outfit'] = 'täällä ei ole sinulle sopivaa asua',
- ['open_cloackroom'] = 'paina [E] vaihtaaksesi vaatteita.',
- -- Armory
- ['remove_object'] = 'ota esine',
- ['deposit_object'] = 'talleta esine',
- ['get_weapon'] = 'ota ase',
- ['put_weapon'] = 'laita ase pois',
- ['buy_weapons'] = 'osta aseita',
- ['armory'] = 'asevarasto',
- ['open_armory'] = 'paina [E] avataksesi asevarasto',
- ['armory_owned'] = 'sinulla on jo tämä',
- ['armory_free'] = 'ilmainen',
- ['armory_item'] = '$%s',
- ['armory_weapontitle'] = 'Asevarasto - osta ase',
- ['armory_componenttitle'] = 'Asevarasto - osta aseenosia',
- ['armory_bought'] = 'ostit %s hintaan $%s',
- ['armory_money'] = 'sinulla ei ole varaa tähän',
- ['armory_hascomponent'] = 'sinulla on jo tämä aseenosa!',
- ['get_weapon_menu'] = 'asevarasto - ota ase',
- ['put_weapon_menu'] = 'asevarasto - talleta ase',
- ['confirm'] = 'varmista',
- -- Vehicles
- ['vehicle_menu'] = 'ajoneuvo',
- ['vehicle_blocked'] = 'kaikki saatavilla olevat parkkipaikat on varattuja!',
- ['garage_prompt'] = 'Paina [E] avataksesi ajoneuvovalinnat.',
- ['garage_title'] = 'ajoneuvovalinnat',
- ['garage_stored'] = 'talletettu',
- ['garage_notstored'] = 'ei tallissa',
- ['garage_storing'] = 'yritämme poistaa ajoneuvoa..',
- ['garage_has_stored'] = 'ajoneuvo on talletettu',
- ['garage_has_notstored'] = 'ei ajoneuvoja lähettyvillä',
- ['garage_notavailable'] = 'ajoneuvoa ei ole talletettu talliin.',
- ['garage_blocked'] = 'ei vapaita parkkipaikkoja!',
- ['garage_empty'] = 'sinulla ei ole ajoneuvoja tallissa.',
- ['garage_released'] = 'ajoneuvosi on otettu ulos tallista.',
- ['garage_store_nearby'] = 'ei ajoneuvoja lähettyvillä.',
- ['garage_storeditem'] = 'avaa talli',
- ['garage_storeitem'] = 'talleta ajoneuvo talliin',
- ['garage_buyitem'] = 'ajoneuvokauppa',
- ['garage_notauthorized'] = 'sinulla ei ole valtuuksia ostaa tätä.',
- ['helicopter_prompt'] = 'paina [E] avataksesi helikopterivalinnat.',
- ['shop_item'] = '$%s',
- ['vehicleshop_title'] = 'Ajoneuvokauppa',
- ['vehicleshop_confirm'] = 'Haluatko varmasti ostaa tämän ajoneuvon?',
- ['vehicleshop_bought'] = 'Ostit %s hintaan ~r~$%s',
- ['vehicleshop_money'] = 'Sinulla ei ole rahaa tähän autoon',
- ['vehicleshop_awaiting_model'] = 'Ajoneuvo lataa ole killti ja odota',
- ['confirm_no'] = 'no',
- ['confirm_yes'] = 'yes',
- ['view'] = 'Katso',
- ['buy_car'] = 'Osta',
- ['stop_view'] = 'Lopeta katsominen',
- -- Service
- ['service_max'] = 'et voi astua vuoroon, maksimi poliiseja jo kentällä: %s/%s',
- ['service_not'] = 'et voi astua vuoroon, sinulla ei ole työvaatteita päällä.',
- ['service_anonunce'] = 'vuoro informaatio',
- ['service_in'] = 'astuit vuoroon, tervetuloa!',
- ['service_in_announce'] = 'henkilö %s astui vuoroon!',
- ['service_out'] = 'poistuit vuorosta.',
- ['service_out_announce'] = 'henkilö %s poistui vuorosta.',
- -- Action Menu
- ['menu_title'] = 'Poliisi',
- ['citizen_interaction'] = 'siviilin vuorovaikutus',
- ['vehicle_interaction'] = 'ajoneuvon vuorovaikutus',
- ['object_spawner'] = 'objekti spawneri',
-
- ['id_card'] = 'henkilöllisyystodistus',
- ['search'] = 'tutki',
- ['handcuff'] = 'raudat On/Off',
- ['drag'] = 'raahaa',
- ['put_in_vehicle'] = 'laita ajoneuvoon',
- ['out_the_vehicle'] = 'ota ulos ajoneuvosta',
- ['fine'] = 'sakko',
- ['unpaid_bills'] = 'hallinoi maksamattomia laskuja',
- ['license_check'] = 'hallitse lisenssejä',
- ['license_revoke'] = 'kumoa lisenssi',
- ['license_revoked'] = 'sinun %s kumottiin!',
- ['licence_you_revoked'] = 'sinä kumosit %s mikä kuului henkilölle %s',
- ['no_players_nearby'] = 'ei pelaajia lähettyvillä',
- ['being_searched'] = 'you are being searched by the Police',
- ['fine_enter_amount'] = 'Enter the amount of the fine', --not translated
- ['fine_enter_text'] = 'Enter the reason for the fine', --not translated
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Vehicle interaction
- ['vehicle_info'] = 'ajoneuvon tiedot',
- ['pick_lock'] = 'tiirikoi ovet',
- ['vehicle_unlocked'] = 'ajoneuvo Avattu',
- ['no_vehicles_nearby'] = 'ei ajoneuvoja lähettyvillä',
- ['impound'] = 'takavarikoi ajoneuvo',
- ['impound_prompt'] = 'paina [E] peruaksesi takavarikointi',
- ['impound_canceled'] = 'sinä peruit takavarikoinnin',
- ['impound_canceled_moved'] = 'takavarikointi peruuntui koska ajoneuvo liikku',
- ['impound_successful'] = 'takavarikoit ajoneuvon',
- ['search_database'] = 'ajoneuvon tiedot',
- ['search_database_title'] = 'ajoneuvon tiedot - etsi rekisterinumerolla',
- ['search_database_error_invalid'] = 'tämä ~r~ei ole voimassa oleva rekisterinumero',
- ['search_plate'] = 'Kirjoita rekisteritunnus',
- ['lookup_plate'] = 'Tarkista rekisteritunnus',
- -- Traffic interaction
- ['traffic_interaction'] = 'liikenteen vuorovaikutus',
- ['cone'] = 'kartio',
- ['barrier'] = 'este',
- ['spikestrips'] = 'piikkimatto',
- ['box'] = 'laatikko',
- ['cash'] = 'rahalaatikko',
- -- ID Card Menu
- ['name'] = 'nimi: %s',
- ['job'] = 'työ: %s',
- ['sex'] = 'sukupuoli: %s',
- ['dob'] = 'syntymäaika: %s',
- ['height'] = 'pituus: %s',
- ['bac'] = 'alkometri: %s',
- ['unknown'] = 'tuntematon',
- ['male'] = 'mies',
- ['female'] = 'nainen',
- -- Body Search Menu
- ['guns_label'] = '--- Aseet ---',
- ['inventory_label'] = '--- Reppu ---',
- ['license_label'] = ' --- Lisenssit ---',
- ['confiscate'] = 'takavarikoi %s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_inv'] = 'takavarikoi %sx %s',
- ['confiscate_dirty'] = 'takavarikoi likainen raha: $%s',
- ['you_confiscated'] = 'sinä takavarioit %sx %s pelaajalta %s',
- ['got_confiscated'] = '%sx %s takavarikoitiin sinulta pelaajan %s toimesta',
- ['you_confiscated_account'] = 'sinä takavarikoit $%s (%s) pelaajalta %s',
- ['got_confiscated_account'] = '$%s (%s) takavarikoitiin sinulta pelaajan %s toimesta',
- ['you_confiscated_weapon'] = 'sinä takavarikoit %s pelaajalta %s jossa oli ~o~%s panosta',
- ['got_confiscated_weapon'] = 'sinun %s jossa oli ~o~%s panosta takavarikoitiin sinulta%s',
- ['traffic_offense'] = 'liikenne rikokset',
- ['minor_offense'] = 'lievät rikokset',
- ['average_offense'] = 'keskisuuret rikokset',
- ['major_offense'] = 'vakavat rikokset',
- ['fine_total'] = 'sakko: %s',
- --Vehicle Info Menu
- ['plate'] = 'kilpi: %s',
- ['owner_unknown'] = 'omistaja: Tuntematon',
- ['owner'] = 'omistaja: %s',
- --Boss Menu
- ['open_bossmenu'] = 'paina [E] avataksesi valikon',
- ['quantity_invalid'] = 'invalid quantity',
- ['have_withdrawn'] = 'sinä otit varastosta %sx %s',
- ['have_deposited'] = 'sinä talletit varastoon %sx %s',
- ['quantity'] = 'määrä',
- ['quantity_placeholder'] = 'Määrä mitä otat..',
- ['inventory'] = 'varasto',
- ['police_stock'] = 'poliisin Varasto',
- -- Misc
- ['remove_prop'] = 'paina [E] poistaaksesi objektin',
- ['map_blip'] = 'poliisilaitos',
- ['unrestrained_timer'] = 'tunnet kuinka hitaasti käsiraudat alkavat löystyä ja irtoavat',
- -- Notifications
- ['alert_police'] = 'hälyytys Poliisi',
- ['phone_police'] = 'poliisi',
- -- Keybind
- ['interaction'] = 'Vuorovaikuta',
- ['quick_actions'] = 'Pikavalinnat',
- -- Other
- ['society_police'] = 'Poliisi',
- ['s_m_y_sheriff_01'] = 'Sheriffi npc',
- ['s_m_y_cop_01'] = 'Poliisi npc',
- ['s_m_y_swat_01'] = 'SWAT npc',
-
-}
diff --git a/locales/fr.lua b/locales/fr.lua
deleted file mode 100644
index ebb91d7..0000000
--- a/locales/fr.lua
+++ /dev/null
@@ -1,170 +0,0 @@
-Locales['fr'] = {
- -- Vestiaire
- ['cloakroom'] = 'vestiaire',
- ['citizen_wear'] = 'tenue Civil',
- ['police_wear'] = 'tenue Policier',
- ['gilet_wear'] = 'gilet orange',
- ['bullet_wear'] = 'gilet pare-balles',
- ['no_outfit'] = 'il n\'y a pas d\'uniforme à votre taille...',
- ['open_cloackroom'] = 'appuyez sur [E] pour vous changer',
- -- Armurerie
- ['remove_object'] = 'prendre Objet',
- ['deposit_object'] = 'déposer objet',
- ['get_weapon'] = 'prendre Arme',
- ['put_weapon'] = 'déposer Arme',
- ['buy_weapons'] = 'acheter Armes',
- ['armory'] = 'armurerie',
- ['open_armory'] = 'appuyez sur [E] pour accéder à l\'armurerie',
- ['armory_owned'] = 'possédé',
- ['armory_free'] = 'gratuit',
- ['armory_item'] = '$%s',
- ['armory_weapontitle'] = 'armurerie - Acheter une arme',
- ['armory_componenttitle'] = 'armurerie - Accessoires d\'armes',
- ['armory_bought'] = 'vous achetez un %s pour $%s',
- ['armory_money'] = 'vous ne pouvez pas acheter cette arme',
- ['armory_hascomponent'] = 'vous avez cet accessoire équipé!',
- ['get_weapon_menu'] = 'armurerie - Retirer arme',
- ['put_weapon_menu'] = 'armurerie - Stocker arme',
- ['confirm'] = 'Confirmer',
- -- Véhicules
- ['vehicle_menu'] = 'véhicule',
- ['vehicle_blocked'] = 'tous les points de spawn sont bloqués!',
- ['garage_prompt'] = 'appuyez sur [E] pour accéder aux Actions Véhicule.',
- ['garage_title'] = 'actions Véhicules',
- ['garage_stored'] = 'rangé',
- ['garage_notstored'] = 'sorti(e)',
- ['garage_storing'] = 'tentative de suppression du véhicule, assurez-vous que personne ne soit autour.',
- ['garage_has_stored'] = 'le véhicule a bien été rangé dans le garage',
- ['garage_has_notstored'] = 'aucun véhicule dans le garage',
- ['garage_notavailable'] = 'votre véhicule n\'est pas rangé dans le garage.',
- ['garage_blocked'] = 'la sortie du garage est obstruée!',
- ['garage_empty'] = 'vous n\'avez aucun véhicule dans le garage.',
- ['garage_released'] = 'votre véhicule a été sorti.',
- ['garage_store_nearby'] = 'aucun véhicule a proximité.',
- ['garage_storeditem'] = 'ouvrir le garage',
- ['garage_storeitem'] = 'ranger le véhicule',
- ['garage_buyitem'] = 'magasin véhicule',
- ['garage_notauthorized'] = 'vous n\'êtes pas autorisé à acheter ce type de véhicules.',
- ['helicopter_prompt'] = 'appuyez sur [E] pour accéder aux Actions de l\'hélicoptère.',
- ['shop_item'] = '$%s',
- ['vehicleshop_title'] = 'magasin véhicule',
- ['vehicleshop_confirm'] = 'voulez-vous acheter ce véhicule?',
- ['vehicleshop_bought'] = 'vous avez acheté %s pour ~r~$%s',
- ['vehicleshop_money'] = 'vous ne pouvez pas acheter ce véhicule',
- ['vehicleshop_awaiting_model'] = 'le véhicule est actuellement en PRÉPARATION veuillez patienter',
- ['confirm_no'] = 'non',
- ['confirm_yes'] = 'oui',
- ['view'] = 'Voir',
- ['buy_car'] = 'Acheter',
- ['stop_view'] = 'Arrêter de voir',
- -- Service
- ['service_max'] = 'vous ne pouvez pas entrer en service, officiers en service: %s/%s',
- ['service_not'] = 'vous n\'êtes pas en service! Vous devez d\'abord enfiler votre tenue.',
- ['service_anonunce'] = 'prise de service',
- ['service_in'] = 'vous êtes en service, bon courage!',
- ['service_in_announce'] = 'l\'officier %s est entré en service!',
- ['service_out'] = 'vous avez terminé votre service.',
- ['service_out_announce'] = 'l\'officier %s a quitté son service.',
- -- Menu d'intéraction
- ['menu_title'] = 'Police',
- ['citizen_interaction'] = 'interaction citoyen',
- ['vehicle_interaction'] = 'interaction véhicule',
- ['object_spawner'] = 'placer objets',
-
- ['id_card'] = 'carte d\'identité',
- ['search'] = 'fouiller',
- ['handcuff'] = 'menotter / Démenotter',
- ['drag'] = 'escorter',
- ['put_in_vehicle'] = 'mettre dans véhicule',
- ['out_the_vehicle'] = 'sortir du véhicule',
- ['fine'] = 'Amende',
- ['unpaid_bills'] = 'gérer les amendes impayées',
- ['license_check'] = 'gérer les licences',
- ['license_revoke'] = 'révoquer la licence',
- ['license_revoked'] = 'votre %s a été révoqué!',
- ['licence_you_revoked'] = 'vous avez révoqué un %s qui appartenait à %s',
- ['no_players_nearby'] = 'aucun joueur à proximité',
- ['being_searched'] = 'vous êtes recherché(e) par la Police',
- ['fine_enter_amount'] = 'Enter the amount of the fine', --not translated
- ['fine_enter_text'] = 'Enter the reason for the fine', --not translated
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Intéraction véhicule
- ['vehicle_info'] = 'infos véhicule',
- ['pick_lock'] = 'crocheter véhicule',
- ['vehicle_unlocked'] = 'véhicule déverouillé',
- ['no_vehicles_nearby'] = 'aucun véhicule à proximité',
- ['impound'] = 'véhicule en fourrière',
- ['impound_prompt'] = 'appuyez sur [E] pour annuler la saisie du véhicule',
- ['impound_canceled'] = 'vous avez annulé la saisie',
- ['impound_canceled_moved'] = 'la saisie a été annulée parce que le véhicule a déménagé',
- ['impound_successful'] = 'vous avez saisi le véhicule',
- ['search_database'] = 'information sur le véhicule',
- ['search_database_title'] = 'informations sur le véhicule - recherche avec numéro d\'enregistrement',
- ['search_database_error_invalid'] = 'Ce n\'est ~r~pas un numéro d\'enregistrement valide',
- ['search_plate'] = 'Entrer la plaque',
- ['lookup_plate'] = 'Vérifier la plaque',
- -- Interaction routière
- ['traffic_interaction'] = 'interaction routière',
- ['cone'] = 'plot',
- ['barrier'] = 'barrière',
- ['spikestrips'] = 'herse',
- ['box'] = 'caisse',
- ['cash'] = 'caisse',
- -- Menu de carte ID
- ['name'] = 'nom: %s',
- ['job'] = 'métier: %s',
- ['sex'] = 'sexe: %s',
- ['dob'] = 'DDN: %s',
- ['height'] = 'taille: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'inconnu',
- ['male'] = 'homme',
- ['female'] = 'femme',
- -- Menu de fouille de corps
- ['guns_label'] = '--- Armes ---',
- ['inventory_label'] = '--- Inventaire ---',
- ['license_label'] = ' --- Licenses ---',
- ['confiscate'] = 'confisquer %s',
- ['confiscate_weapon'] = 'confisqué %s avec %s balles',
- ['confiscate_inv'] = 'confisquer %sx %s',
- ['confiscate_dirty'] = 'confisquer argent sale: €%s',
- ['you_confiscated'] = 'vous avez confisqué %sx %s à %s',
- ['got_confiscated'] = '%sx %s ont été confisqués par %s',
- ['you_confiscated_account'] = 'vous avez confisqué $%s (%s) à %s',
- ['got_confiscated_account'] = '$%s (%s) ont été confisqués par %s',
- ['you_confiscated_weapon'] = 'vous avez confisqué %s à %s avec ~o~%s balles',
- ['got_confiscated_weapon'] = 'votre %s avec ~o~%s balles a été confisqué par %s',
- ['traffic_offense'] = 'code de la route',
- ['minor_offense'] = 'délit mineur',
- ['average_offense'] = 'délit moyen',
- ['major_offense'] = 'délit grave',
- ['fine_total'] = 'amende: %s',
- -- Menu Info véhicule
- ['plate'] = 'n°: %s',
- ['owner_unknown'] = 'propriétaire: Inconnu',
- ['owner'] = 'propriétaire: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'appuyez sur [E] pour ouvrir le menu',
- ['quantity_invalid'] = 'quantité invalide',
- ['have_withdrawn'] = 'vous avez retiré %sx %s',
- ['have_deposited'] = 'vous avez déposé %sx %s',
- ['quantity'] = 'quantité',
- ['quantity_placeholder'] = 'Montant à retirer..',
- ['inventory'] = 'inventaire',
- ['police_stock'] = 'coffre de la police',
- -- Misc
- ['remove_prop'] = 'appuyez sur [E] pour enlever l\'objet',
- ['map_blip'] = 'Commissariat',
- ['unrestrained_timer'] = 'vous sentez que vos menottes deviennent fragiles.',
- -- Notifications
- ['alert_police'] = 'alerte police',
- ['phone_police'] = 'police',
- -- Keybind
- ['interaction'] = 'Interagir',
- ['quick_actions'] = 'Actions rapides',
- -- Other
- ['society_police'] = 'Police',
- ['s_m_y_sheriff_01'] = 'Ped de Shérif',
- ['s_m_y_cop_01'] = 'Ped de Police',
- ['s_m_y_swat_01'] = 'Ped de SWAT',
-}
diff --git a/locales/hu.lua b/locales/hu.lua
deleted file mode 100644
index 48e19a3..0000000
--- a/locales/hu.lua
+++ /dev/null
@@ -1,171 +0,0 @@
-Locales['hu'] = {
- -- Cloakroom
- ['cloakroom'] = 'Öltöző',
- ['citizen_wear'] = 'Civil öltözet',
- ['police_wear'] = 'Egyenruha',
- ['gilet_wear'] = 'Láthatósági mellény',
- ['bullet_wear'] = 'Golyóálló mellény',
- ['no_outfit'] = 'Nincs hozzád illő egyenruha!',
- ['open_cloackroom'] = 'Nyomj [E] hogy hozzáférj: Öltöző.',
- -- Armory
- ['remove_object'] = 'Tárgy kivétele',
- ['deposit_object'] = 'Tárgy berakás',
- ['get_weapon'] = 'Fegyver kivétele',
- ['put_weapon'] = 'Fegyver berakás',
- ['buy_weapons'] = 'Fegyver vásárlás',
- ['armory'] = 'Fegyvertár',
- ['open_armory'] = 'Nyomj [E] betüt, hogy hozzáférj: Fegyvertár.',
- ['armory_owned'] = 'saját',
- ['armory_free'] = 'ingyenes',
- ['armory_item'] = '%s Ft',
- ['armory_weapontitle'] = 'fegyvertár - vásárlás',
- ['armory_componenttitle'] = 'fegyvertár - kiegészitöks',
- ['armory_bought'] = 'vásároltál: %s ennyiért: ~r~%s Ft',
- ['armory_money'] = 'Ez számodra nem engedélyezett',
- ['armory_hascomponent'] = 'kiegészitö felvéve!',
- ['get_weapon_menu'] = 'Fegyvertár - fegyver kivétele',
- ['put_weapon_menu'] = 'Fegyvertár - fegyver berakása',
- ['confirm'] = 'Confirm', --not translated
- -- Vehicles
- ['vehicle_menu'] = 'jármü',
- ['vehicle_blocked'] = 'Lerakási hely blokkolva!',
- ['garage_prompt'] = 'Nyomj [E] hogy hozzáférj: Garázs.',
- ['garage_title'] = 'Jármü opciók',
- ['garage_stored'] = 'tárolva',
- ['garage_notstored'] = 'nincs a garázsban',
- ['garage_storing'] = 'megpróbáljuk eltávolítani a járművet, ügyeljen arra, hogy senki ne tartózkodjon körülütte.',
- ['garage_has_stored'] = 'jármü tárolva',
- ['garage_has_notstored'] = 'nincs a közeledben jármü',
- ['garage_notavailable'] = 'a jármü nem tárolható a garázsban.',
- ['garage_blocked'] = 'nem elérhetö lerakási pont!',
- ['garage_empty'] = 'nincs jármüved garázsban.',
- ['garage_released'] = 'jármü kiengedve.',
- ['garage_store_nearby'] = 'nincs jármü a közeledben.',
- ['garage_storeditem'] = 'garázs megnyitása',
- ['garage_storeitem'] = 'jármü tárolása a garázsban',
- ['garage_buyitem'] = 'Autó shop',
- ['helicopter_prompt'] = 'Nyomj [E] betüt, hogy hozzáférj: Helikopter Garázs.',
- ['helicopter_notauthorized'] = 'Nem használhatsz helikoptert.',
- ['shop_item'] = '%s Ft',
- ['vehicleshop_title'] = 'Autó shop',
- ['vehicleshop_confirm'] = 'Meg szeretnéd venni?',
- ['vehicleshop_bought'] = 'vásároltál %s ezért: ~r~%s Ft',
- ['vehicleshop_money'] = 'Ezt nem engedheted meg.',
- ['vehicleshop_awaiting_model'] = 'A jármű LETÖLT & BETÖLT kérlek várj',
- ['confirm_no'] = 'nem',
- ['confirm_yes'] = 'igen',
- ['view'] = 'View', --not translated
- ['buy_car'] = 'Buy', --not translated
- ['stop_view'] = 'Stop Viewing', --not translated
- -- Service
- ['service_max'] = 'Nem léphet szolgálatba. Maximális létszám: %s/%s',
- ['service_not'] = 'Elöször vedd fel a szolgálatot...',
- ['service_anonunce'] = 'információk',
- ['service_in'] = 'Szolgálatba léptél, üdvözlünk!',
- ['service_in_announce'] = 'operátor %s szolgálatba lépett!',
- ['service_out'] = 'elhagytad a szolgálatot.',
- ['service_out_announce'] = 'operátor %s leadta a szolgálatot.',
- -- Action Menu
- ['menu_title'] = 'Police', --not translated
- ['citizen_interaction'] = 'Ember interakciók',
- ['vehicle_interaction'] = 'Jármű interakciók',
- ['object_spawner'] = 'Objektum lerakása',
-
- ['id_card'] = 'Személyi igazolvány',
- ['search'] = 'Keresés',
- ['handcuff'] = 'Kötözés / Elengedés',
- ['drag'] = 'Kisérés',
- ['put_in_vehicle'] = 'Berakás jármübe',
- ['out_the_vehicle'] = 'Kivétel jármüböl',
- ['fine'] = 'Birság',
- ['unpaid_bills'] = 'fizetetlen számlák kezelése',
- ['license_check'] = 'engedélyek kezelése',
- ['license_revoke'] = 'engedélyek visszavonása',
- ['license_revoked'] = '%s visszavonva!',
- ['licence_you_revoked'] = 'visszavonta %s %s engedélyét',
- ['no_players_nearby'] = 'nincs a közeledben játékos!',
- ['being_searched'] = 'Téged éppen megmotoztak!',
- ['fine_enter_amount'] = 'Írja be a bírság összegét',
- ['fine_enter_text'] = 'Adja meg a bírság okát',
- ['invalid_amount'] = 'Hiba: Az összeg nem szám vagy érvénytelen',
- -- Vehicle interaction
- ['vehicle_info'] = 'Jármü infó',
- ['pick_lock'] = 'Jármü feltörése',
- ['vehicle_unlocked'] = 'Jármü feltörve',
- ['no_vehicles_nearby'] = 'nincs jármü a közelben',
- ['impound'] = 'jármü lefoglalása',
- ['impound_prompt'] = 'Nyomj [E] hogy megszakítsd',
- ['impound_canceled'] = 'lefoglalás megszakitva',
- ['impound_canceled_moved'] = 'lefoglalás nem sikerült, mert a jármü mozgásban volt',
- ['impound_successful'] = 'sikeres lefoglalás',
- ['search_database'] = 'Keresés rendszám alapján',
- ['search_database_title'] = 'jármü információk - keresés rendszám alapján',
- ['search_database_error_invalid'] = 'ez ~r~ nem egy érvényes rendszám',
- ['search_plate'] = 'Enter Plate', --not translated
- ['lookup_plate'] = 'Lookup Plate', --not translated
- -- Traffic interaction
- ['traffic_interaction'] = 'Útzárak',
- ['cone'] = 'bólya',
- ['barrier'] = 'útakadály',
- ['spikestrips'] = 'szögesdrót',
- ['box'] = 'doboz',
- ['cash'] = 'pénzesdoboz',
- -- ID Card Menu
- ['name'] = 'név: %s',
- ['job'] = 'munka: %s',
- ['sex'] = 'neme: %s',
- ['dob'] = 'születés: %s',
- ['height'] = 'magasság: %s',
- ['id'] = 'ID: %s',
- ['bac'] = 'alkoholszint: %s',
- ['unknown'] = 'ismeretlen',
- ['male'] = 'férfi',
- ['female'] = 'nö',
- -- Body Search Menu
- ['guns_label'] = '--- FEGYVEREK ---',
- ['inventory_label'] = '--- LELTÁR ---',
- ['license_label'] = ' --- ENGEDÉLYEK ---',
- ['confiscate'] = 'elkobzás %s',
- ['confiscate_weapon'] = 'elkobzás %s %s töltényekkel együtt',
- ['confiscate_inv'] = 'elkobzás %sx %s',
- ['confiscate_dirty'] = 'fekete pénz elkobzása: %s Ft',
- ['you_confiscated'] = 'elkoboztad %sx %s töle: %s',
- ['got_confiscated'] = '%sx %s elkobozta: %s',
- ['you_confiscated_account'] = 'elkoboztad %s Ft (%s) töle %s',
- ['got_confiscated_account'] = '%s Ft (%s) elkobozta: %s',
- ['you_confiscated_weapon'] = '%s elkobozta: %s ~o~%s töltényekkel együtt',
- ['got_confiscated_weapon'] = '%s ~o~%s elkobozta: %s',
- ['traffic_offense'] = 'forgalmi vétségek',
- ['minor_offense'] = 'kisebb büncselekmények',
- ['average_offense'] = 'közepes büncselekmények',
- ['major_offense'] = 'súlyos büncselekmények',
- ['fine_total'] = 'birság: %s',
- -- Vehicle Info Menu
- ['plate'] = 'rendszám: %s',
- ['owner_unknown'] = 'tulajdonos: ismeretlen',
- ['owner'] = 'tulajdonos: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'Nyomj [E] betüt, hogy hozzáférj: Parancsnoki Menü',
- ['quantity_invalid'] = 'érvénytelen mennyiség',
- ['have_withdrawn'] = 'Kivetted %sx %s',
- ['have_deposited'] = 'Beraktad %sx %s',
- ['quantity'] = 'mennyiség',
- ['quantity_placeholder'] = 'Amount to withdraw..', --not translated
- ['inventory'] = 'leltár',
- ['police_stock'] = 'Állomány',
- -- Misc
- ['remove_prop'] = 'Nyomj [E] gombot az objektum törléséhez',
- ['map_blip'] = 'Rendőrség',
- ['unrestrained_timer'] = '...',
- -- Notifications
- ['alert_police'] = 'riasztás',
- ['phone_police'] = 'rendörség',
- -- Keybind
- ['interaction'] = 'Interakció', --not translated
- ['quick_actions'] = 'Gyorsmenü', --not translated
- -- Other
- ['society_police'] = 'Rendőrség', --not translated
- ['s_m_y_sheriff_01'] = 'Sheriff Ped', --not translated
- ['s_m_y_cop_01'] = 'Rendőr Ped', -- not translated
- ['s_m_y_swat_01'] = 'SWAT Ped', --not translated
-}
diff --git a/locales/it.lua b/locales/it.lua
deleted file mode 100644
index 08b0297..0000000
--- a/locales/it.lua
+++ /dev/null
@@ -1,170 +0,0 @@
-Locales['it'] = {
- -- Armadietto
- ['cloakroom'] = 'spogliatoio',
- ['citizen_wear'] = 'Vestito civile',
- ['police_wear'] = 'Divisa di polizia',
- ['gilet_wear'] = 'Giubbotto riflettente arancione',
- ['bullet_wear'] = 'Giubbotto antiproiettile',
- ['no_outfit'] = 'Non c\'è una divisa adatta a te!',
- ['open_cloackroom'] = 'Premi [E] per cambiarti.',
- -- Armeria
- ['remove_object'] = 'Prendi oggetto',
- ['deposit_object'] = 'Deposita oggetto',
- ['get_weapon'] = 'Prendi arma dall\'armeria',
- ['put_weapon'] = 'Deposita arma nell\'armeria',
- ['buy_weapons'] = 'Acquista armi',
- ['armory'] = 'armeria',
- ['open_armory'] = 'Premi [E] per accedere all\'Armeria.',
- ['armory_owned'] = 'posseduto',
- ['armory_free'] = 'gratuito',
- ['armory_item'] = '$%s',
- ['armory_weapontitle'] = 'armeria - Acquista arma',
- ['armory_componenttitle'] = 'armeria - Accessori arma',
- ['armory_bought'] = 'Hai comprato un %s per $%s',
- ['armory_money'] = 'Non puoi permetterti quell\'arma',
- ['armory_hascomponent'] = 'Hai già quel accessorio equipaggiato!',
- ['get_weapon_menu'] = 'armeria - Prendi arma',
- ['put_weapon_menu'] = 'armeria - Deposita arma',
- ['confirm'] = 'Conferma',
- -- Veicoli
- ['vehicle_menu'] = 'veicolo',
- ['vehicle_blocked'] = 'tutti i punti di spawn disponibili sono attualmente bloccati!',
- ['garage_prompt'] = 'Premi [E] per accedere alle Azioni sul Veicolo.',
- ['garage_title'] = 'Azioni sul Veicolo',
- ['garage_stored'] = 'nella rimessa',
- ['garage_notstored'] = 'non in rimessa',
- ['garage_storing'] = 'Stiamo cercando di rimuovere il veicolo, assicurati che nessun giocatore sia intorno ad esso.',
- ['garage_has_stored'] = 'il veicolo è stato riposto in rimessa',
- ['garage_has_notstored'] = 'nessun veicolo di proprietà è stato trovato nelle vicinanze',
- ['garage_notavailable'] = 'il tuo veicolo non è riposto in rimessa.',
- ['garage_blocked'] = 'non ci sono punti di spawn disponibili!',
- ['garage_empty'] = 'non hai veicoli in rimessa.',
- ['garage_released'] = 'il tuo veicolo è stato rilasciato dalla rimessa.',
- ['garage_store_nearby'] = 'non ci sono veicoli nelle vicinanze.',
- ['garage_storeditem'] = 'apri rimessa',
- ['garage_storeitem'] = 'riponi veicolo in rimessa',
- ['garage_buyitem'] = 'concessionario veicoli',
- ['garage_notauthorized'] = 'non sei autorizzato ad acquistare questo tipo di veicoli.',
- ['helicopter_prompt'] = 'Premi [E] per accedere alle Azioni sull\'Elicottero.',
- ['shop_item'] = '$%s',
- ['vehicleshop_title'] = 'concessionario veicoli',
- ['vehicleshop_confirm'] = 'vuoi comprare questo veicolo?',
- ['vehicleshop_bought'] = 'hai comprato %s per ~r~$%s',
- ['vehicleshop_money'] = 'non puoi permetterti quel veicolo',
- ['vehicleshop_awaiting_model'] = 'il veicolo è attualmente in DOWNLOAD & LOADING, per favore attendi',
- ['confirm_no'] = 'no',
- ['confirm_yes'] = 'sì',
- ['view'] = 'Visualizza',
- ['buy_car'] = 'Compra',
- ['stop_view'] = 'Interrompi la visualizzazione',
- -- Servizio
- ['service_max'] = 'non puoi entrare in servizio, numero massimo di agenti in servizio: %s/%s',
- ['service_not'] = 'non sei in servizio! Devi cambiarti prima.',
- ['service_anonunce'] = 'informazioni servizio',
- ['service_in'] = 'sei entrato in servizio, benvenuto!',
- ['service_in_announce'] = 'l\'operatore %s è entrato in servizio!',
- ['service_out'] = 'hai lasciato il servizio.',
- ['service_out_announce'] = 'l\'operatore %s ha lasciato il servizio.',
- -- Menu Azioni
- ['menu_title'] = 'Polizia',
- ['citizen_interaction'] = 'Interazione con cittadino',
- ['vehicle_interaction'] = 'Interazione con veicolo',
- ['object_spawner'] = 'Spawn oggetto',
-
- ['id_card'] = 'Carta d\'identità',
- ['search'] = 'perquisisci',
- ['handcuff'] = 'manetta / Sgancia',
- ['drag'] = 'scorta',
- ['put_in_vehicle'] = 'metti in veicolo',
- ['out_the_vehicle'] = 'trascina fuori dal veicolo',
- ['fine'] = 'multa',
- ['unpaid_bills'] = 'gestisci multe non pagate',
- ['license_check'] = 'gestisci licenze',
- ['license_revoke'] = 'revoca licenza',
- ['license_revoked'] = 'la tua %s è stata revocata!',
- ['licence_you_revoked'] = 'hai revocato una %s che apparteneva a %s',
- ['no_players_nearby'] = 'non ci sono giocatori nelle vicinanze!',
- ['being_searched'] = 'stai venendo perquisito dalla Polizia',
- ['fine_enter_amount'] = 'Enter the amount of the fine', --not translated
- ['fine_enter_text'] = 'Enter the reason for the fine', --not translated
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Interazione veicolo
- ['vehicle_info'] = 'informazioni sul veicolo',
- ['pick_lock'] = 'forza la serratura del veicolo',
- ['vehicle_unlocked'] = 'veicolo sbloccato',
- ['no_vehicles_nearby'] = 'non ci sono veicoli nelle vicinanze',
- ['impound'] = 'recupera veicolo',
- ['impound_prompt'] = 'Premi [E] per annullare il recupero',
- ['impound_canceled'] = 'hai annullato il recupero',
- ['impound_canceled_moved'] = 'il recupero è stato annullato perché il veicolo si è mosso',
- ['impound_successful'] = 'hai confiscato il veicolo',
- ['search_database'] = 'informazioni sul veicolo',
- ['search_database_title'] = 'informazioni sul veicolo - cerca con numero di targa',
- ['search_database_error_invalid'] = 'quello non è un numero di targa valido',
- ['search_plate'] = 'Inserisci targa',
- ['lookup_plate'] = 'Cerca targa',
- -- Interazione Traffico
- ['traffic_interaction'] = 'Interazione Traffico',
- ['cone'] = 'cono',
- ['barrier'] = 'barriera',
- ['spikestrips'] = 'strisce chiodate',
- ['box'] = 'scatola',
- ['cash'] = 'scatola di contanti',
- -- Menu Carta d'identità
- ['name'] = 'nome: %s',
- ['job'] = 'lavoro: %s',
- ['sex'] = 'sesso: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'altezza: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'sconosciuto',
- ['male'] = 'maschio',
- ['female'] = 'femmina',
- -- Menu Perquisizione corpo
- ['guns_label'] = '--- Armi ---',
- ['inventory_label'] = '--- Inventario ---',
- ['license_label'] = ' --- Licenze ---',
- ['confiscate'] = 'confisca %s',
- ['confiscate_weapon'] = 'confisca %s con %s proiettili',
- ['confiscate_inv'] = 'confisca %sx %s',
- ['confiscate_dirty'] = 'confisca denaro sporco: $%s',
- ['you_confiscated'] = 'hai confiscato %sx %s da %s',
- ['got_confiscated'] = '%sx %s sono stati confiscati da %s',
- ['you_confiscated_account'] = 'hai confiscato $%s (%s) da %s',
- ['got_confiscated_account'] = '$%s (%s) sono stati confiscati da %s',
- ['you_confiscated_weapon'] = 'hai confiscato %s da %s con ~o~%s proiettili',
- ['got_confiscated_weapon'] = 'la tua %s con ~o~%s proiettili è stata confiscata da %s',
- ['traffic_offense'] = 'infrazione del traffico',
- ['minor_offense'] = 'infrazione minore',
- ['average_offense'] = 'infrazione media',
- ['major_offense'] = 'infrazione grave',
- ['fine_total'] = 'multa: %s',
- -- Menu Informazioni Veicolo
- ['plate'] = 'targa: %s',
- ['owner_unknown'] = 'proprietario: sconosciuto',
- ['owner'] = 'proprietario: %s',
- -- Menu Boss
- ['open_bossmenu'] = 'premi [E] per aprire il menu',
- ['quantity_invalid'] = 'quantità non valida',
- ['have_withdrawn'] = 'hai prelevato %sx %s',
- ['have_deposited'] = 'hai depositato %sx %s',
- ['quantity'] = 'quantità',
- ['quantity_placeholder'] = 'Importo da prelevare..',
- ['inventory'] = 'inventario',
- ['police_stock'] = 'stock di polizia',
- -- Varie
- ['remove_prop'] = 'premi [E] per eliminare l\'oggetto',
- ['map_blip'] = 'Stazione di Polizia',
- ['unrestrained_timer'] = 'senti le manette che si allentano lentamente e svaniscono.',
- -- Notifiche
- ['alert_police'] = 'allerta polizia',
- ['phone_police'] = 'polizia',
- -- Pulsante
- ['interaction'] = 'Interagisci',
- ['quick_actions'] = 'Azioni rapide',
- -- Altro
- ['society_police'] = 'Polizia',
- ['s_m_y_sheriff_01'] = 'Ped Sceriffo',
- ['s_m_y_cop_01'] = 'Ped Polizia',
- ['s_m_y_swat_01'] = 'Ped SWAT',
-}
diff --git a/locales/nl.lua b/locales/nl.lua
deleted file mode 100644
index bbf24bc..0000000
--- a/locales/nl.lua
+++ /dev/null
@@ -1,171 +0,0 @@
-Locales['nl'] = {
- -- Cloackroom
- ['cloakroom'] = 'Kleedkamer',
- ['citizen_wear'] = 'Burgerkleding',
- ['police_wear'] = 'Politiekleding',
- ['gilet_wear'] = 'Oranje reflecterend vest',
- ['bullet_wear'] = 'Kogelwerend vest',
- ['no_outfit'] = 'Er zijn geen passende uniformen voor jou!',
- ['open_cloackroom'] = 'Druk op [E] om je kleding aan te passen.',
- -- Wapenkamer
- ['remove_object'] = 'Haal item uit kluis',
- ['deposit_object'] = 'Leg item in kluis',
- ['get_weapon'] = 'Haal wapen uit wapenkamer',
- ['put_weapon'] = 'Leg wapen in wapenkamer',
- ['buy_weapons'] = 'Koop wapens',
- ['armory'] = 'Wapenkamer',
- ['open_armory'] = 'Druk op [E] om de Wapenkamer te openen.',
- ['armory_owned'] = 'In Bezit',
- ['armory_free'] = 'Gratis',
- ['armory_item'] = '€%s',
- ['armory_weapontitle'] = 'Wapenkamer - Koop wapen',
- ['armory_componenttitle'] = 'Wapenkamer - wapenbevestigingen',
- ['armory_bought'] = 'Je hebt een %s gekocht voor €%s.',
- ['armory_money'] = 'Je kan dit wapen niet betalen.',
- ['armory_hascomponent'] = 'je hebt deze wapenbevestiging al!',
- ['get_weapon_menu'] = 'Wapenkamer - Pak wapen',
- ['put_weapon_menu'] = 'Wapenkamer - Leg wapen weg',
- ['confirm'] = 'Confirm', --not translated
- -- Vehicles
- ['vehicle_menu'] = 'Voertuig',
- ['vehicle_blocked'] = 'Alle spawnpunten zijn geblokkeerd!',
- ['garage_prompt'] = 'Druk op [E] om de Garage te openen.',
- ['garage_title'] = 'Garage',
- ['garage_stored'] = 'Beschikbaar',
- ['garage_notstored'] = 'Niet in garage',
- ['garage_storing'] = 'We proberen je voertuig weg te halen, zorg dat er niemand langs staat.',
- ['garage_has_stored'] = 'Het voertuig is opgeslagen in de garage.',
- ['garage_has_notstored'] = 'Er zijn geen voertuigen in de buurt gevonden.',
- ['garage_notavailable'] = 'Je voertuig is niet opgeslagen in de garage.',
- ['garage_blocked'] = 'Er zijn geen beschikbare spawnpunten!',
- ['garage_empty'] = 'Je hebt geen voertuigen in je garage.',
- ['garage_released'] = 'Je voertuig is uit de garage gehaald.',
- ['garage_store_nearby'] = 'Er zijn geen voertuigen in de buurt gevonden.',
- ['garage_storeditem'] = 'Open garage',
- ['garage_storeitem'] = 'Zet voertuig in garage',
- ['garage_buyitem'] = 'Voertuigwinkel',
- ['garage_notauthorized'] = 'Je bent niet bevoegd dit type voertuigen te halen.',
- ['helicopter_prompt'] = 'Druk op [E] om de Helikopter Garage te openen.',
- ['shop_item'] = '€%s',
- ['vehicleshop_title'] = 'Voertuigwinkel',
- ['vehicleshop_confirm'] = 'Wil je dit voertuig kopen?',
- ['vehicleshop_bought'] = 'Je hebt een %s gekocht voor ~r~€%s.',
- ['vehicleshop_money'] = 'Je kan dit voertuig niet betalen.',
- ['vehicleshop_awaiting_model'] = 'Dit voertuig is momenteel aan het DOWNLOADEN & LADEN, even geduld asjeblieft',
- ['confirm_no'] = 'Nee',
- ['confirm_yes'] = 'Ja',
- ['view'] = 'View', --not translated
- ['buy_car'] = 'Buy', --not translated
- ['stop_view'] = 'Stop Viewing', --not translated
- -- Service
- ['service_max'] = 'Je kan niet in dienst gaan, maximale aantal agenten in dienst: %s/%s',
- ['service_not'] = 'Je bent niet in dienst! Kleed je eerst om.',
- ['service_anonunce'] = 'Dienst Informatie',
- ['service_in'] = 'Je bent nu in dienst, welkom!',
- ['service_in_announce'] = 'Agent %s is nu in dienst!',
- ['service_out'] = 'Je bent nu uit dienst, fijne dag.',
- ['service_out_announce'] = 'Agent %s is nu niet meer in dienst.',
- -- Action Menu
- ['menu_title'] = 'Police', --not translated
- ['citizen_interaction'] = 'Burger Interacties',
- ['vehicle_interaction'] = 'Voertuig Interacties',
- ['object_spawner'] = 'Object Interacties',
-
- ['id_card'] = 'Identiteitsbewijs',
- ['search'] = 'Fouilleren',
- ['handcuff'] = 'Boeien / Ontboeien',
- ['drag'] = 'Meenemen',
- ['put_in_vehicle'] = 'Zet in voertuig',
- ['out_the_vehicle'] = 'Haal uit voertuig',
- ['fine'] = 'Boete opleggen',
- ['unpaid_bills'] = 'Openstaande boetes bekijken',
- ['license_check'] = 'Rijbewijzen beheren',
- ['license_revoke'] = 'Rijbewijs invorderen',
- ['license_revoked'] = 'Je %s is ingevorderd!',
- ['licence_you_revoked'] = 'Je hebt een %s van %s ingevorderd.',
- ['no_players_nearby'] = 'Geen spelers in de buurt!',
- ['being_searched'] = 'Je wordt gefouilleerd door de Politie',
- ['fine_enter_amount'] = 'Enter the amount of the fine', --not translated
- ['fine_enter_text'] = 'Enter the reason for the fine', --not translated
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Voertuig Interactie
- ['vehicle_info'] = 'Voertuig Informatie',
- ['pick_lock'] = 'Breek voertuig open',
- ['vehicle_unlocked'] = 'Voertuig ontgrendeld.',
- ['no_vehicles_nearby'] = 'Er zijn geen voertuigen in de buurt gevonden.',
- ['impound'] = 'Neem voertuig in beslag',
- ['impound_prompt'] = 'Druk op [E] om de inbeslagname te annuleren.',
- ['impound_canceled'] = 'Je hebt de inbeslagname geannuleerd.',
- ['impound_canceled_moved'] = 'De inbeslagname is geannuleerd omdat het voertuig is bewogen.',
- ['impound_successful'] = 'Het voertuig is in beslag genomen.',
- ['search_database'] = 'Kenteken natrekken',
- ['search_database_title'] = 'Voertuig informatie - zoek op kenteken',
- ['search_database_error_invalid'] = 'Het ingevoerde kenteken is ~r~ongeldig.',
- ['search_plate'] = 'Enter Plate', --not translated
- ['lookup_plate'] = 'Lookup Plate', --not translated
- -- Objecten
- ['traffic_interaction'] = 'Verkeers Interacties',
- ['cone'] = 'Pion',
- ['barrier'] = 'Barriere',
- ['box'] = 'Box',
- ['fence'] = 'PD Hek',
- ['cash'] = 'Pallet met geld',
- ['spikestrips'] = 'Spijkermatten',
- -- ID Menu
- ['name'] = 'Naam: %s',
- ['job'] = 'Werk: %s',
- ['sex'] = 'Geslacht: %s',
- ['dob'] = 'Geboortedatum: %s',
- ['height'] = 'Lengte: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'onbekend',
- ['male'] = 'man',
- ['female'] = 'vrouw',
- -- Fouilleren
- ['guns_label'] = '--- Wapens ---',
- ['inventory_label'] = '--- Inventaris ---',
- ['license_label'] = ' --- Papieren ---',
- ['confiscate'] = 'Neem %s in beslag',
- ['confiscate_weapon'] = 'Neem een %s met %s kogels in beslag',
- ['confiscate_inv'] = 'Neem %sx %s in beslag',
- ['confiscate_dirty'] = 'Neem zwartgeld in beslag: €%s',
- ['you_confiscated'] = 'Je hebt %sx %s van %s in beslag genomen.',
- ['got_confiscated'] = '%sx %s is in beslag genomen door %s.',
- ['you_confiscated_account'] = 'Je hebt €%s (%s) van %s in beslag genomen.',
- ['got_confiscated_account'] = '€%s (%s) is in beslag genomen door %s.',
- ['you_confiscated_weapon'] = 'Je hebt een %s van %s met ~o~%s kogels in beslag genomen.',
- ['got_confiscated_weapon'] = 'Je %s met ~o~%s kogels is in beslag genomen door %s.',
- ['traffic_offense'] = 'Verkeersovertreding',
- ['minor_offense'] = 'Kleine overtreding',
- ['average_offense'] = 'Gemiddelde overtreding',
- ['major_offense'] = 'Grote overtreding',
- ['fine_total'] = 'Boete: %s',
- -- Voertuig Informatie
- ['plate'] = 'Kenteken: %s',
- ['owner_unknown'] = 'Eigenaar: Onbekend',
- ['owner'] = 'Eigenaar: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'Druk op [E] om het menu te openen.',
- ['quantity_invalid'] = 'Ongeldig aantal',
- ['have_withdrawn'] = 'Je hebt %sx %s gepakt.',
- ['have_deposited'] = 'Je hebt %sx %s weg gelegt.',
- ['quantity'] = 'Aantal',
- ['quantity_placeholder'] = 'Amount to withdraw..', --not translated
- ['inventory'] = 'Inventaris',
- ['police_stock'] = 'Politie Voorraad',
- -- Misc
- ['remove_prop'] = 'Druk op [E] om dit object te verwijderen.',
- ['map_blip'] = 'Politiebureau',
- ['unrestrained_timer'] = 'Je voelt je handboeien langzaam wegglijden.',
- -- Notifications
- ['alert_police'] = 'politie alert',
- ['phone_police'] = 'politie',
- -- Keybind
- ['interaction'] = 'Interactie',
- ['quick_actions'] = 'Snelle Acties',
- -- Other
- ['society_police'] = 'Politie',
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Politie Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- }
diff --git a/locales/pl.lua b/locales/pl.lua
deleted file mode 100644
index f3b2331..0000000
--- a/locales/pl.lua
+++ /dev/null
@@ -1,170 +0,0 @@
-Locales['pl'] = {
- -- Cloakroom
- ['cloakroom'] = 'szatnia',
- ['citizen_wear'] = 'ubranie Cywilne',
- ['police_wear'] = 'mundur',
- ['gilet_wear'] = 'kamizelka odblaskowa',
- ['bullet_wear'] = 'kamizelka kuloodporna',
- ['no_outfit'] = 'brak ubrania',
- ['open_cloackroom'] = 'naciśnij [E] aby zmienić ubranie.',
- -- Armory
- ['remove_object'] = 'weź przedmiot',
- ['deposit_object'] = 'zdeponuj przedmiot',
- ['get_weapon'] = 'weź broń',
- ['put_weapon'] = 'odłóż broń',
- ['buy_weapons'] = 'kup Broń',
- ['armory'] = 'zbrojownia',
- ['open_armory'] = 'naciśnij [E] żeby uzyskać dostęp do zbrojowni',
- ['armory_owned'] = 'owned',
- ['armory_free'] = 'free',
- ['armory_item'] = '$%s',
- ['armory_weapontitle'] = 'armory - Buy weapon',
- ['armory_componenttitle'] = 'armory - Weapon attatchments',
- ['armory_bought'] = 'you bought an %s for $%s',
- ['armory_money'] = 'you cannot afford that weapon',
- ['armory_hascomponent'] = 'you have that attatchment equiped!',
- ['get_weapon_menu'] = 'armory - Withdraw Weapon',
- ['put_weapon_menu'] = 'armory - Store Weapon',
- ['confirm'] = 'Confirm', --not translated
- -- Vehicles
- ['vehicle_menu'] = 'vehicle',
- ['vehicle_blocked'] = 'all available spawn points are currently blocked!',
- ['garage_prompt'] = 'press [E] to access the Vehicle Actions.',
- ['garage_title'] = 'vehicle Actions',
- ['garage_stored'] = 'stored',
- ['garage_notstored'] = 'not in garage',
- ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.',
- ['garage_has_stored'] = 'the vehicle has been stored in your garage',
- ['garage_has_notstored'] = 'no nearby owned vehicles were found',
- ['garage_notavailable'] = 'your vehicle is not stored in the garage.',
- ['garage_blocked'] = 'there\'s no available spawn points!',
- ['garage_empty'] = 'you don\'t have any vehicles in your garage.',
- ['garage_released'] = 'your vehicle has been released from the garage.',
- ['garage_store_nearby'] = 'there is no nearby vehicles.',
- ['garage_storeditem'] = 'open garage',
- ['garage_storeitem'] = 'store vehicle in garage',
- ['garage_buyitem'] = 'vehicle shop',
- ['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
- ['helicopter_prompt'] = 'press [E] to access the Helicopter Actions.',
- ['shop_item'] = '$%s',
- ['vehicleshop_title'] = 'vehicle Shop',
- ['vehicleshop_confirm'] = 'do you want to buy this vehicle?',
- ['vehicleshop_bought'] = 'you have bought %s for ~r~$%s',
- ['vehicleshop_money'] = 'you cannot afford that vehicle',
- ['vehicleshop_awaiting_model'] = 'the vehicle is currently DOWNLOADING & LOADING please wait',
- ['confirm_no'] = 'no',
- ['confirm_yes'] = 'yes',
- ['view'] = 'View', --not translated
- ['buy_car'] = 'Buy', --not translated
- ['stop_view'] = 'Stop Viewing', --not translated
- -- Service
- ['service_max'] = 'nie możesz wejść do służby, maksymalna liczba oficerów w służbie: %s/%s',
- ['service_not'] = 'nie rozpoczynasz służby! Najpierw musisz się przebrać.',
- ['service_anonunce'] = 'informacje o służbie',
- ['service_in'] = 'rozpoczynasz służbe, Witaj!',
- ['service_in_announce'] = 'operator %s rozpoczyna służbę!',
- ['service_out'] = 'opuszczasz służbę.',
- ['service_out_announce'] = 'operator %s opuszcza służbe.',
- -- Action Menu
- ['menu_title'] = 'Police', --not translated
- ['citizen_interaction'] = 'interakcja z cywilami',
- ['vehicle_interaction'] = 'interakcja z pojazdami',
- ['object_spawner'] = 'przedmioty do postawienia',
-
- ['id_card'] = 'dowód osobisty',
- ['search'] = 'przeszukaj',
- ['handcuff'] = 'zakuj/Rozkuj Kajdanki ',
- ['drag'] = 'przemieść podejrzanego',
- ['put_in_vehicle'] = 'wsadź do pojazdu',
- ['out_the_vehicle'] = 'wyciągnij z pojazdu',
- ['fine'] = 'mandaty',
- ['unpaid_bills'] = 'zarządzaj niezapłaconymi rachunkami',
- ['license_check'] = 'zarządzaj licencjami',
- ['license_revoke'] = 'unieważnij licencje',
- ['license_revoked'] = 'twoja licencja %s została unieważniona!',
- ['licence_you_revoked'] = 'unieważniasz %s które należały do %s',
- ['no_players_nearby'] = 'brak graczy w pobliżu',
- ['being_searched'] = 'you are being searched by the Police',
- ['fine_enter_amount'] = 'Enter the amount of the fine', --not translated
- ['fine_enter_text'] = 'Enter the reason for the fine', --not translated
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Vehicle interaction
- ['vehicle_info'] = 'informacje o pojeździe',
- ['pick_lock'] = 'odblokuj pojazd',
- ['vehicle_unlocked'] = 'pojazd Odblokowany',
- ['no_vehicles_nearby'] = 'brak pojazdu w pobliżu',
- ['impound'] = 'zajmij pojazd',
- ['impound_prompt'] = 'naciśnij [E] żeby unieważnić zajęcie',
- ['impound_canceled'] = 'unieważniasz zajęcie',
- ['impound_canceled_moved'] = 'zajęcie zostało anulowane, ponieważ pojazd przemieścił się',
- ['impound_successful'] = 'zajmujesz pojazd',
- ['search_database'] = 'informacje o pojeździe',
- ['search_database_title'] = 'informacjeo pojeździe - przeszukaj używając numeru rejestracyjnego',
- ['search_database_error_invalid'] = 'to ~r~nie jest poprawny rnumer rejestracyjny',
- ['search_plate'] = 'Enter Plate', --not translated
- ['lookup_plate'] = 'Lookup Plate', --not translated
- -- Traffic interaction
- ['traffic_interaction'] = 'interakcje dla ruchu drogowego',
- ['cone'] = 'pachołek',
- ['barrier'] = 'barierka',
- ['spikestrips'] = 'kolczatka',
- ['box'] = 'pudła',
- ['cash'] = 'paleta z pieniędzmi',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'praca: %s',
- ['sex'] = 'płeć: %s',
- ['dob'] = 'data urodzenia: %s',
- ['height'] = 'wzrost: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'nieznany',
- ['male'] = 'mężczyzna',
- ['female'] = 'kobieta',
- -- Body Search Menu
- ['guns_label'] = '--- Bronie ---',
- ['inventory_label'] = '--- Ekwipunek ---',
- ['license_label'] = ' --- Licenses ---',
- ['confiscate'] = 'skonfiskuj %s',
- ['confiscate_weapon'] = 'skonfiskuj %s z %s kulami',
- ['confiscate_inv'] = 'skonfiskuj %s x %s',
- ['confiscate_dirty'] = 'skonfiskuj brudne pieniądze: $%s',
- ['you_confiscated'] = 'skonfiskowałeś %sx %s od %s',
- ['got_confiscated'] = '%sx %s zostały skonfiskowane przez %s',
- ['you_confiscated_account'] = 'skonfiskowałeś %s$ (%s) od %s',
- ['got_confiscated_account'] = '%s$ (%s) zostały skonfiskowane przez %s',
- ['you_confiscated_weapon'] = 'skonfiskowałeś %s od %s z ~o~%s pociskami',
- ['got_confiscated_weapon'] = 'twój %s z ~o~%s kulami został skonfiskowany przez %s',
- ['traffic_offense'] = 'wykroczenia drogowe',
- ['minor_offense'] = 'niewielkie wykroczenia',
- ['average_offense'] = 'średnie wykroczenia',
- ['major_offense'] = 'duże wykroczenia',
- ['fine_total'] = 'mandat: %s',
- -- Vehicle Info Menu
- ['plate'] = 'tablica rejestracyjna: %s',
- ['owner_unknown'] = 'właściciel: Nieznany',
- ['owner'] = 'właściciel: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'naciśnij [E] aby otworzyć menu',
- ['quantity_invalid'] = 'nieprawidłowa ilość',
- ['have_withdrawn'] = 'wyjmujesz z depozytu %sx %s',
- ['have_deposited'] = 'zdeponowano %sx %s',
- ['quantity'] = 'ilość',
- ['quantity_placeholder'] = 'Amount to withdraw..', --not translated
- ['inventory'] = 'ekwipunek',
- ['police_stock'] = 'zapasy policji',
- -- Misc
- ['remove_prop'] = 'naciśnij [E] aby usunąć ten obiekt',
- ['map_blip'] = 'komisariat Policji',
- ['unrestrained_timer'] = 'czujesz, że twoje kajdanki powoli tracą przyczepność i znikają.',
- -- Notifications
- ['alert_police'] = 'ostrzeż policję',
- ['phone_police'] = 'police',
- -- Keybind
- ['interaction'] = 'Interact', --not translated
- ['quick_actions'] = 'Quick Actions', --not translated
- -- Other
- ['society_police'] = 'Police', --not translated
- ['s_m_y_sheriff_01'] = 'Sheriff Ped', --not translated
- ['s_m_y_cop_01'] = 'Police Ped', -- not translated
- ['s_m_y_swat_01'] = 'SWAT Ped', --not translated
-}
diff --git a/locales/sr.lua b/locales/sr.lua
deleted file mode 100644
index 964ebc8..0000000
--- a/locales/sr.lua
+++ /dev/null
@@ -1,162 +0,0 @@
-Locales['sr'] = {
- -- Cloakroom
- ['cloakroom'] = 'Svlačionica',
- ['citizen_wear'] = 'Civilna odeća',
- ['police_wear'] = 'Policijska odeća',
- ['gilet_wear'] = 'Narandžasti prsluk',
- ['bullet_wear'] = 'Pancir',
- ['no_outfit'] = 'Nema uniforme koja Vam odgovara!',
- ['open_cloackroom'] = 'Pritisni [E] da promeniš odeću.',
- -- Armory
- ['remove_object'] = 'Ukloni objekat',
- ['deposit_object'] = 'Postavi objekat',
- ['get_weapon'] = 'Uzmi oružje iz oružarnice',
- ['put_weapon'] = 'Ostavi oružje u oružarnicu',
- ['buy_weapons'] = 'Kupi oružje',
- ['armory'] = 'Oružarnica',
- ['open_armory'] = 'Pritisni [E] da pristupiš oružarnici.',
- ['armory_owned'] = 'Kupljeno',
- ['armory_free'] = 'Besplatno',
- ['armory_item'] = '$%s',
- ['armory_weapontitle'] = 'Oružarnica - Kupovina oružja',
- ['armory_componenttitle'] = 'Oružarnica - Dodaci za oružje',
- ['armory_bought'] = 'Kupili ste %s za $%s',
- ['armory_money'] = 'Ne možete priuštiti to oružje',
- ['armory_hascomponent'] = 'Već imate taj dodatak!',
- ['get_weapon_menu'] = 'Oruzarnica - Podizanje oružja',
- ['put_weapon_menu'] = 'Oruzarnica - Ostavljanje oružja',
- -- Vehicles
- ['vehicle_menu'] = 'Vozilo',
- ['vehicle_blocked'] = 'Parking je trenutno blokiran!',
- ['garage_prompt'] = 'Pritisni [E] da pristupiš garaži.',
- ['garage_title'] = 'Interakcije vozilima',
- ['garage_stored'] = 'Parkirano',
- ['garage_notstored'] = 'Van garaze',
- ['garage_storing'] = 'Pokušavamo da uklonimo vozilo, uverite se da nema igrača u blizini',
- ['garage_has_stored'] = 'Vozilo je parkirano u vašu garazu',
- ['garage_has_notstored'] = 'Nijedno vozilo nije pronađeno',
- ['garage_notavailable'] = 'Vaše vozilo nije u garaži.',
- ['garage_blocked'] = 'Parking je trenutno blokiran!',
- ['garage_empty'] = 'Vi nemate vozila u garaži.',
- ['garage_released'] = 'Vaše vozilo je isparkirano iz garaže.',
- ['garage_store_nearby'] = 'Nema vozila u blizini.',
- ['garage_storeditem'] = 'Otvori garažu',
- ['garage_storeitem'] = 'Parkiraj vozilo',
- ['garage_buyitem'] = 'Prodavac vozila',
- ['garage_notauthorized'] = 'Niste autorizovani da kupite ovo vozilo.',
- ['helicopter_prompt'] = 'Pritisni [E] da pristupiš opcijama Helikoptera.',
- ['shop_item'] = '$%s',
- ['vehicleshop_title'] = 'Prodavac vozila',
- ['vehicleshop_confirm'] = 'Da li želite da kupite ovo vozilo?',
- ['vehicleshop_bought'] = 'Kupili ste %s za ~r~$%s',
- ['vehicleshop_money'] = 'Ne možete priuštiti to vozilo',
- ['vehicleshop_awaiting_model'] = 'Vozilo se trenutno SKIDA & UČITAVA, sačekajte..',
- ['confirm_no'] = 'Ne',
- ['confirm_yes'] = 'Da',
- -- Service
- ['service_max'] = 'Ne možete pristupiti službi, najviše pripadnika u službi: %s/%s',
- ['service_not'] = 'Niste pristupili službi! Prvo se morate presvući.',
- ['service_anonunce'] = 'Informacije službe',
- ['service_in'] = 'Pristupili ste službi, dobrodošli!',
- ['service_in_announce'] = 'Operator %s je pristupio službi!',
- ['service_out'] = 'Napustili ste službu.',
- ['service_out_announce'] = 'Operator %s je napustio službu.',
- -- Action Menu
- ['citizen_interaction'] = 'Interakcija sa ljudima',
- ['vehicle_interaction'] = 'Interakcija sa vozilom',
- ['object_spawner'] = 'Objekti',
-
- ['id_card'] = 'Lična Karta',
- ['search'] = 'Pretraži',
- ['handcuff'] = 'Zaveži / Odveži',
- ['drag'] = 'Vuci',
- ['put_in_vehicle'] = 'Stavi u vozilo',
- ['out_the_vehicle'] = 'Izvadi iz vozila',
- ['fine'] = 'Naplati',
- ['unpaid_bills'] = 'Upravljaj računima',
- ['license_check'] = 'Upravljaj dozvolama',
- ['license_revoke'] = 'Oduzmi dozvolu',
- ['license_revoked'] = 'Vaša %s je oduzeta!',
- ['licence_you_revoked'] = 'Oduzeli ste %s koja pripada %s',
- ['no_players_nearby'] = 'Nema nikoga u blizini!',
- ['being_searched'] = 'Pretraženi ste od Policije',
- -- Vehicle interaction
- ['vehicle_info'] = 'Informacije vozila',
- ['pick_lock'] = 'Obij vozilo',
- ['vehicle_unlocked'] = 'Vozilo otključano',
- ['no_vehicles_nearby'] = 'Nema vozila u blizini',
- ['impound'] = 'Zapleni vozilo',
- ['impound_prompt'] = 'Pritisni [E] da prekineš zaplenu',
- ['impound_canceled'] = 'Prekinuli ste zaplenu',
- ['impound_canceled_moved'] = 'Zaplena je prekinuta jer se vozilo pomerilo',
- ['impound_successful'] = 'Zaplenili ste vozilo',
- ['search_database'] = 'Informacije vozila',
- ['search_database_title'] = 'Informacije vozila - pretražite pomoću tablica',
- ['search_database_error_invalid'] = 'To ~r~nije validan registarski broj',
- -- Traffic interaction
- ['traffic_interaction'] = 'Interakcije saobraćajem',
- ['cone'] = 'Čunj',
- ['barrier'] = 'Barijera',
- ['spikestrips'] = 'Spajkovi',
- ['box'] = 'Kutija',
- ['cash'] = 'Kutija sa novcem',
- -- ID Card Menu
- ['name'] = 'Ime: %s',
- ['job'] = 'Posao: %s',
- ['sex'] = 'Pol: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'Visina: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'nepoznato',
- ['male'] = 'Muško',
- ['female'] = 'Žensko',
- -- Body Search Menu
- ['guns_label'] = '--- Oružja ---',
- ['inventory_label'] = '--- Inventar ---',
- ['license_label'] = ' --- Dozvole ---',
- ['confiscate'] = 'Konfiskovano %s',
- ['confiscate_weapon'] = 'Konfiskovano %s sa %s metaka',
- ['confiscate_inv'] = 'Konfiskovano %sx %s',
- ['confiscate_dirty'] = 'Konfiskovan prljav novac: $%s',
- ['you_confiscated'] = 'Konfiskovali ste %sx %s od %s',
- ['got_confiscated'] = '%sx %s je konfiskovano od %s',
- ['you_confiscated_account'] = 'Konfiskovali ste $%s (%s) od %s',
- ['got_confiscated_account'] = '$%s (%s) je konfiskovano od %s',
- ['you_confiscated_weapon'] = 'Konfiskovali ste %s od %s sa ~o~%s metaka',
- ['got_confiscated_weapon'] = 'Vaš %s sa ~o~%s metaka je konfiskovan od strane %s',
- ['traffic_offense'] = 'Saobraćajni prekršaj',
- ['minor_offense'] = 'Manji prekršaj',
- ['average_offense'] = 'Prosečan prekršaj',
- ['major_offense'] = 'Veliki prekršaj',
- ['fine_total'] = 'kazna: %s',
- ['fine_enter_amount'] = 'Enter the amount of the fine', --not translated
- ['fine_enter_text'] = 'Enter the reason for the fine', --not translated
- ['invalid_amount'] = 'Error: Amount was not a number or invalid', --not translated
- -- Vehicle Info Menu
- ['plate'] = 'Tablice: %s',
- ['owner_unknown'] = 'Vlasnik: Nepoznat',
- ['owner'] = 'Vlasnik: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'Pritisni [E] da otvoriš meni',
- ['quantity_invalid'] = 'Nevažeća količina',
- ['have_withdrawn'] = 'Podigli ste %sx %s',
- ['have_deposited'] = 'Ostavili ste %sx %s',
- ['quantity'] = 'Količina',
- ['inventory'] = 'Inventar',
- ['police_stock'] = 'Policijske zalihe',
- -- Misc
- ['remove_prop'] = 'Pritisni [E] da ukloniš objekat',
- ['map_blip'] = 'Policijska Stanica',
- ['unrestrained_timer'] = 'Osećaš kako se lisice opuštaju.',
- -- Notifications
- ['alert_police'] = 'Policijsko obaveštenje',
- ['phone_police'] = 'Policija',
- -- Keybind
- ['interaction'] = 'Interakcija',
- ['quick_actions'] = 'Brze Akcije',
- -- Other
- ['society_police'] = 'Policija',
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Policija Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped'
-}
diff --git a/localization/de_esx_policejob.sql b/localization/de_esx_policejob.sql
deleted file mode 100644
index b89e6c8..0000000
--- a/localization/de_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Polizei', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Polizei', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Polizei', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Polizei')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Rekrut',20,'{}','{}'),
- ('police',1,'officer','Polizist',40,'{}','{}'),
- ('police',2,'sergeant','Feldwebel',60,'{}','{}'),
- ('police',3,'lieutenant','Leutnant',85,'{}','{}'),
- ('police',4,'boss','Chef',100,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Falsche nutzung der Hupe', 30, 0),
- ('Unerlaubtes Überschreiten einer durchgezogenen Linie', 40, 0),
- ('Auf der Falschen Straßenseite fahren', 250, 0),
- ('Illegaler U-Turn', 250, 0),
- ('Illegal Off-Road fahren', 170, 0),
- ('Anweisung eines Gesetzeshüter missachtet', 30, 0),
- ('Illegales Fahrzeuganhalten', 150, 0),
- ('Illegales Parken', 70, 0),
- ('Missachtung des Rechtsabbiegegebot', 70, 0),
- ('Nichteinhaltung der Fahrzeuginformationen', 90, 0),
- ('Nicht am Stopschild gehalten', 105, 0),
- ('Rote Ampel überfahren', 130, 0),
- ('Illegales Überfahren', 100, 0),
- ('Fahren eines illegalen Fahrzeuges', 100, 0),
- ('Fahren ohne Führerschein', 1500, 0),
- ('Fahrerflucht', 800, 0),
- ('Geschwindigkeitsüberschreitung über < 5 mph', 90, 0),
- ('Geschwindigkeitsüberschreitung über 5-15 mph', 120, 0),
- ('Geschwindigkeitsüberschreitung über 15-30 mph', 180, 0),
- ('Geschwindigkeitsüberschreitung über > 30 mph', 300, 0),
- ('Beeinträchtigung des Straßenvehrkehrs', 110, 1),
- ('Betrunkenes Fahren', 90, 1),
- ('Ordnungswidriges Verhalten', 90, 1),
- ('Behinderung der Justiz', 130, 1),
- ('Beleidigungen gegenüber Zivilisten', 75, 1),
- ('Respektloses Verhalten gegenüber eines Polizisten', 110, 1),
- ('Verbale Drohung gegenüber einer Zivilperson', 90, 1),
- ('Verbale Drohung gegenüber eines Polizisten', 150, 1),
- ('Verbreiten von Falschinformationen', 250, 1),
- ('Versuchte Kurroption', 1500, 1),
- ('Führen einer Waffe innerhalb der Stadt', 120, 2),
- ('Einsatz einer tödlichen Waffe im Stadtgebiet', 300, 2),
- ('Kein Waffenschein', 80000, 2),
- ('Besitz einer illegalen Waffe', 700, 2),
- ('Besitz von Einbruchswerkzeug', 300, 2),
- ('Auto Diebstahl', 1800, 2),
- ('Absicht zum Verkauf/Distribution einer illegalen Substanz', 1500, 2),
- ('Betrug einer illegalen Substanz', 1500, 2),
- ('Besitz einer illegalen Substanz ', 6520, 2),
- ('Entführung eines Zivilisten', 15000, 2),
- ('Entführung eines Polizisten', 20000, 2),
- ('Diebstahl', 650, 2),
- ('Bewaffneter Raubüberfall auf einen Laden', 650, 2),
- ('Bewaffneter Raubüberfall auf eine Bank', 1500, 2),
- ('Angriff auf einen Zivilisten', 2000, 3),
- ('Angriff auf einen Polizisten', 2500, 3),
- ('Versuchter Mord eines Zivilisten', 3000, 3),
- ('Versuchter Mord eines Polizisten', 5000, 3),
- ('Mörder eines Zivilisten', 100000, 3),
- ('Mörder eines Polizisten', 300000, 3),
- ('Unfreiwillige Tötung', 1800, 3),
- ('Betrug', 2000, 2);
-;
diff --git a/localization/en_esx_policejob.sql b/localization/en_esx_policejob.sql
deleted file mode 100644
index 9f4267f..0000000
--- a/localization/en_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Police')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Recruit',20,'{}','{}'),
- ('police',1,'officer','Officer',40,'{}','{}'),
- ('police',2,'sergeant','Sergeant',60,'{}','{}'),
- ('police',3,'lieutenant','Lieutenant',85,'{}','{}'),
- ('police',4,'boss','Chief',100,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Misuse of a horn', 30, 0),
- ('Illegally Crossing a continuous Line', 40, 0),
- ('Driving on the wrong side of the road', 250, 0),
- ('Illegal U-Turn', 250, 0),
- ('Illegally Driving Off-road', 170, 0),
- ('Refusing a Lawful Command', 30, 0),
- ('Illegally Stopping a Vehicle', 150, 0),
- ('Illegal Parking', 70, 0),
- ('Failing to Yield to the right', 70, 0),
- ('Failure to comply with Vehicle Information', 90, 0),
- ('Failing to stop at a Stop Sign ', 105, 0),
- ('Failing to stop at a Red Light', 130, 0),
- ('Illegal Passing', 100, 0),
- ('Driving an illegal Vehicle', 100, 0),
- ('Driving without a License', 1500, 0),
- ('Hit and Run', 800, 0),
- ('Exceeding Speeds Over < 5 mph', 90, 0),
- ('Exceeding Speeds Over 5-15 mph', 120, 0),
- ('Exceeding Speeds Over 15-30 mph', 180, 0),
- ('Exceeding Speeds Over > 30 mph', 300, 0),
- ('Impeding traffic flow', 110, 1),
- ('Public Intoxication', 90, 1),
- ('Disorderly conduct', 90, 1),
- ('Obstruction of Justice', 130, 1),
- ('Insults towards Civilans', 75, 1),
- ('Disrespecting of an LEO', 110, 1),
- ('Verbal Threat towards a Civilan', 90, 1),
- ('Verbal Threat towards an LEO', 150, 1),
- ('Providing False Information', 250, 1),
- ('Attempt of Corruption', 1500, 1),
- ('Brandishing a weapon in city Limits', 120, 2),
- ('Brandishing a Lethal Weapon in city Limits', 300, 2),
- ('No Firearms License', 600, 2),
- ('Possession of an Illegal Weapon', 700, 2),
- ('Possession of Burglary Tools', 300, 2),
- ('Grand Theft Auto', 1800, 2),
- ('Intent to Sell/Distrube of an illegal Substance', 1500, 2),
- ('Frabrication of an Illegal Substance', 1500, 2),
- ('Possession of an Illegal Substance ', 650, 2),
- ('Kidnapping of a Civilan', 1500, 2),
- ('Kidnapping of an LEO', 2000, 2),
- ('Robbery', 650, 2),
- ('Armed Robbery of a Store', 650, 2),
- ('Armed Robbery of a Bank', 1500, 2),
- ('Assault on a Civilian', 2000, 3),
- ('Assault of an LEO', 2500, 3),
- ('Attempt of Murder of a Civilian', 3000, 3),
- ('Attempt of Murder of an LEO', 5000, 3),
- ('Murder of a Civilian', 10000, 3),
- ('Murder of an LEO', 30000, 3),
- ('Involuntary manslaughter', 1800, 3),
- ('Fraud', 2000, 2);
-;
diff --git a/localization/es_esx_policejob.sql b/localization/es_esx_policejob.sql
deleted file mode 100644
index c8192a5..0000000
--- a/localization/es_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Policía', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Policía', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Policía', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Policía')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Recluta',20,'{}','{}'),
- ('police',1,'officer','Oficial',40,'{}','{}'),
- ('police',2,'sergeant','Sargento',60,'{}','{}'),
- ('police',3,'lieutenant','Teniente',85,'{}','{}'),
- ('police',4,'boss','Jefe',100,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Mal uso del claxon', 30, 0),
- ('Cruzar indebidamente la línea continua', 40, 0),
- ('Conducir por el lado incorrecto de la carretera', 250, 0),
- ('Giro indebido', 250, 0),
- ('Conducir indebidamente fuera de la carretera', 170, 0),
- ('No hacer caso a una orden de un agente', 30, 0),
- ('Detener el vehículo de forma incorrecta', 150, 0),
- ('Aparcar en un lugar no habilitado', 70, 0),
- ('No ceder al girar a la derecha', 70, 0),
- ('No cumplir con los datos de tu vehículo', 90, 0),
- ('No pararse en una señal de STOP', 105, 0),
- ('No pararse en un semáforo cuando está en rojo', 130, 0),
- ('Cruzar indebidamente', 100, 0),
- ('Conducir un coche no permitido', 100, 0),
- ('Conducir sin carnet de conducción', 1500, 0),
- ('Chocar y darse a la fuga', 800, 0),
- ('Exceder la velocidad permitida en 5 km/h', 90, 0),
- ('Exceder la velocidad permitida entre 5 y 15 km/h', 120, 0),
- ('Exceder la velocidad permitida entre 15 y 30 km/h', 180, 0),
- ('Exceder la velocidad permitida más de 30 km/h', 300, 0),
- ('Generar atasco en una carretera', 110, 1),
- ('Intoxicación pública', 90, 1),
- ('Conducta alocada', 90, 1),
- ('Obstrucción a la justicia', 130, 1),
- ('Insultos hacia civiles', 75, 1),
- ('Insultos hacia un agente', 110, 1),
- ('Amenaza verbar a un civil', 90, 1),
- ('Amenaza verbal a un agente', 150, 1),
- ('Dar información falsa', 250, 1),
- ('Intento de corrupción', 1500, 1),
- ('Tendencia de armas en los limites de la ciudad', 120, 2),
- ('Tendencia de armas letales en los limites de la ciudad', 300, 2),
- ('No tener licencia de armas', 600, 2),
- ('Posesión de un arma ilegal', 700, 2),
- ('Posesión de herramientas para robos', 300, 2),
- ('Desorden público', 1800, 2),
- ('Intento de venta o distribución de sustancias ilegales', 1500, 2),
- ('Fabricación de sustancias ilegales', 1500, 2),
- ('Posesión de sustancias ilegales', 650, 2),
- ('Secuestro de un civil', 1500, 2),
- ('Secuestro de un agente', 2000, 2),
- ('Robo', 650, 2),
- ('Robo armado a una tienda', 650, 2),
- ('Robo armado a un banco', 1500, 2),
- ('Asalto a un civil', 2000, 3),
- ('Asalto a un agente', 2500, 3),
- ('Intento de asesinato a un civil', 3000, 3),
- ('Intento de asesinato a un agente', 5000, 3),
- ('Asesinato de un civil', 10000, 3),
- ('Asesinato de un policia', 30000, 3),
- ('Homicidio involuntario', 1800, 3),
- ('Fraude', 2000, 2);
-;
diff --git a/localization/fi_esx_policejob.sql b/localization/fi_esx_policejob.sql
deleted file mode 100644
index 816276b..0000000
--- a/localization/fi_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Poliisi', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Poliisi', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Poliisi', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Poliisi')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Tulokas',20,'{}','{}'),
- ('police',1,'officer','Konstaapeli',40,'{}','{}'),
- ('police',2,'sergeant','Ylikonstaapeli',60,'{}','{}'),
- ('police',3,'lieutenant','Kersantti',85,'{}','{}'),
- ('police',4,'boss','Komentaja',100,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Äänimerkin väärinkäyttö', 30, 0),
- ('Laiton jatkuvan linjan ylitys', 40, 0),
- ('Ajaminen tien väärällä puolella', 250, 0),
- ('Laiton U-käännös', 250, 0),
- ('Laiton maastossa ajaminen', 170, 0),
- ('Virkavallan käskyn laiminlyönti', 30, 0),
- ('Laiton pysähtyminen', 150, 0),
- ('Laiton parkkeeraus', 70, 0),
- ('Väistöolovelvollisuuden laiminlyönti', 70, 0),
- ('Väärän ajoneuvontiedon antaminen', 90, 0),
- ('Stop merkin laiminlyönti', 105, 0),
- ('Punaisten valojen laiminlyönti', 130, 0),
- ('Laiton ohitus', 100, 0),
- ('Laittomalla ajoneuvolla ajaminen', 100, 0),
- ('Ajokortitta ajo', 1500, 0),
- ('Yliajo', 800, 0),
- ('Ylinopeus < 5 kmh', 90, 0),
- ('Ylinopeus 5-15 kmh', 120, 0),
- ('Ylinopeus 15-30 kmh', 180, 0),
- ('Ylinopeus > 30 kmh', 300, 0),
- ('Liikenteen pysäytys tahallisesti', 110, 1),
- ('Julkinen päihtyminen', 90, 1),
- ('Sopimaton käytös', 90, 1),
- ('Oikeusjärjestelmän estäminen', 130, 1),
- ('Siviilin loukkaaminen', 75, 1),
- ('Virkavallan halventaminen', 110, 1),
- ('Sanallainen uhkaus siviiliä kohtaan', 90, 1),
- ('Sanallinen uhkaus virkavaltaa kohtaan', 150, 1),
- ('Virheellisen tiedon antaminen', 250, 1),
- ('Korruptioyritys', 1500, 1),
- ('Aseella heiluminen kaupungin sisällä', 120, 2),
- ('Tappavalla aseella heiluminen kaupungin sisällä', 300, 2),
- ('Ei aselupaa', 600, 2),
- ('Laittoman aseen hallusapito', 700, 2),
- ('Murtotyökalujen hallussapito', 300, 2),
- ('Autovarkaus', 1800, 2),
- ('Tarkoitus myydä/levittää laitonta ainetta', 1500, 2),
- ('Laittoman aineen valmistus', 1500, 2),
- ('Laittoman aineen hallusapito ', 650, 2),
- ('Siviilin kidnappaus', 1500, 2),
- ('Virkavallan kidnappaus', 2000, 2),
- ('Ryöstö', 650, 2),
- ('Aseellinen kaupparyöstö', 650, 2),
- ('Aseellinen pankkiryöstö', 1500, 2),
- ('Siviiliä kohtaan kohdistunut hyökkäys', 2000, 3),
- ('Virkavaltaa kohtaan kohdistunut hyökkäys', 2500, 3),
- ('Siviilin murhanyritys', 3000, 3),
- ('Virkavallan murhanyirtys', 5000, 3),
- ('Siviilin murha', 10000, 3),
- ('Virkavallan murha', 30000, 3),
- ('Väkivaltainan tappo', 1800, 3),
- ('Petos', 2000, 2);
-;
diff --git a/localization/fr_esx_policejob.sql b/localization/fr_esx_policejob.sql
deleted file mode 100644
index 4fa25a2..0000000
--- a/localization/fr_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Police')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Recrue',20,'{}','{}'),
- ('police',1,'officer','Officier',40,'{}','{}'),
- ('police',2,'sergeant','Sergent',60,'{}','{}'),
- ('police',3,'lieutenant','Lieutenant',85,'{}','{}'),
- ('police',4,'boss','Chef',100,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ("Utilisation abusive d'un klaxon", 30, 0),
- ("Traversée illégale d'une ligne continue", 40, 0),
- ("Conduite sur la mauvaise voie de circulation", 250, 0),
- ("Demi-tour illégal", 250, 0),
- ("Conduite illégale hors piste", 170, 0),
- ("Refus d'obéir à un ordre légal", 30, 0),
- ("Arrêt illégal d'un véhicule", 150, 0),
- ("Stationnement illégal", 70, 0),
- ("Ne pas céder le passage à droite", 70, 0),
- ("Non-respect des informations du véhicule", 90, 0),
- ("Ne pas s'arrêter à un panneau d'arrêt", 105, 0),
- ("Ne pas s'arrêter à un feu rouge", 130, 0),
- ("Dépassement illégal", 100, 0),
- ("Conduite d'un véhicule illégal", 100, 0),
- ("Conduite sans permis", 1500, 0),
- ("Délit de fuite", 800, 0),
- ("Excès de vitesse de moins de 5 mph", 90, 0),
- ("Excès de vitesse de 5 à 15 mph", 120, 0),
- ("Excès de vitesse de 15 à 30 mph", 180, 0),
- ("Excès de vitesse de plus de 30 mph", 300, 0),
- ("Obstruction de la circulation", 110, 1),
- ("Ivresse publique", 90, 1),
- ("Comportement désordonné", 90, 1),
- ("Obstruction de la justice", 130, 1),
- ("Insultes envers les civils", 75, 1),
- ("Irrespect envers un agent de police", 110, 1),
- ("Menace verbale envers un civil", 90, 1),
- ("Menace verbale envers un agent de police", 150, 1),
- ("Fourniture de fausses informations", 250, 1),
- ("Tentative de corruption", 1500, 1),
- ("Exhibition d'une arme en zone urbaine", 120, 2),
- ("Exhibition d'une arme mortelle en zone urbaine", 300, 2),
- ("Pas de licence pour les armes à feu", 600, 2),
- ("Possession d'une arme illégale", 700, 2),
- ("Possession d'outils de cambriolage", 300, 2),
- ("Vol de voiture", 1800, 2),
- ("Intention de vendre/distribuer une substance illégale", 1500, 2),
- ("Fabrication d'une substance illégale", 1500, 2),
- ("Possession d'une substance illégale", 650, 2),
- ("Enlèvement d'un civil", 1500, 2),
- ("Enlèvement d'un agent de police", 2000, 2),
- ("Vol à main armée", 650, 2),
- ("Vol à main armée d'un magasin", 650, 2),
- ("Vol à main armée d'une banque", 1500, 2),
- ("Agression sur un civil", 2000, 3),
- ("Agression sur un agent de police", 2500, 3),
- ("Tentative de meurtre sur un civil", 3000, 3),
- ("Tentative de meurtre sur un agent de police", 5000, 3),
- ("Meurtre d'un civil", 10000, 3),
- ("Meurtre d'un agent de police", 30000, 3),
- ("Homicide involontaire", 1800, 3),
- ("Fraude", 2000, 2);
-;
diff --git a/localization/it_esx_policejob.sql b/localization/it_esx_policejob.sql
deleted file mode 100644
index e09b887..0000000
--- a/localization/it_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Polizia', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Polizia', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Polizia', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Polizia')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Recluta',20,'{}','{}'),
- ('police',1,'officer','Agente',40,'{}','{}'),
- ('police',2,'sergeant','Sergente',60,'{}','{}'),
- ('police',3,'lieutenant','Tenente',85,'{}','{}'),
- ('police',4,'boss','Capo',100,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Utilizzo improprio del clacson', 30, 0),
- ('Attraversamento illegale di una linea continua', 40, 0),
- ('Guida contromano', 250, 0),
- ('Inversione di marcia illegale', 250, 0),
- ('Guida illegale fuoristrada', 170, 0),
- ('Rifiuto di un ordine di un LEO (Law Enforcement Officer)', 30, 0),
- ('Arresto illegale di un veicolo', 150, 0),
- ('Parcheggio illegale', 70, 0),
- ('Mancata precedenza a destra', 70, 0),
- ('Mancato rispetto delle informazioni sul veicolo', 90, 0),
- ('Mancato arresto ad un segnale di stop', 105, 0),
- ('Mancato arresto a un semaforo rosso', 130, 0),
- ('Sorpasso illegale', 100, 0),
- ('Guida di un veicolo illegale', 100, 0),
- ('Guida senza patente', 1500, 0),
- ('Investire e fuggire', 800, 0),
- ('Eccesso di velocità oltre < 5 mph', 90, 0),
- ('Eccesso di velocità oltre 5-15 mph', 120, 0),
- ('Eccesso di velocità oltre 15-30 mph', 180, 0),
- ('Eccesso di velocità oltre > 30 mph', 300, 0),
- ('Ostacolo al flusso del traffico', 110, 1),
- ('Ubriachezza molesta', 90, 1),
- ('Comportamento disordinato', 90, 1),
- ('Intralcio alla giustizia', 130, 1),
- ('Insulti verso i civili', 75, 1),
- ('Mancato rispetto nei confronti di un LEO (Law Enforcement Officer)', 110, 1),
- ('Minaccia verbale verso un civile', 90, 1),
- ('Minaccia verbale verso un LEO (Law Enforcement Officer)', 150, 1),
- ('Fornito informazioni false', 250, 1),
- ('Tentativo di corruzione', 1500, 1),
- ('Sfoggiato un arma in città', 120, 2),
- ('Sfoggiato un arma letale in città', 300, 2),
- ('Assenza di licenza per porto d armi', 600, 2),
- ('Possesso di un arma illegale', 700, 2),
- ('Possesso di attrezzi per scasso', 300, 2),
- ('Furto di un auto', 1800, 2),
- ('Tentativo di vendita/distribuzione di una sostanza illegale', 1500, 2),
- ('Falsificazione di una sostanza illegale', 1500, 2),
- ('Possesso di una sostanza illegale', 650, 2),
- ('Sequestro di un civile', 1500, 2),
- ('Sequestro di un LEO (Law Enforcement Officer)', 2000, 2),
- ('Rapina', 650, 2),
- ('Rapina armata di un negozio', 650, 2),
- ('Rapina armata di una banca', 1500, 2),
- ('Aggressione a un civile', 2000, 3),
- ('Aggressione a un LEO (Law Enforcement Officer)', 2500, 3),
- ('Tentativo di omicidio di un civile', 3000, 3),
- ('Tentativo di omicidio di un LEO (Law Enforcement Officer)', 5000, 3),
- ('Omicidio di un civile', 10000, 3),
- ('Omicidio di un LEO (Law Enforcement Officer)', 30000, 3),
- ('Omicidio colposo', 1800, 3),
- ('Frode', 2000, 2);
-;
diff --git a/localization/nl_esx_policejob.sql b/localization/nl_esx_policejob.sql
deleted file mode 100644
index 75a9baf..0000000
--- a/localization/nl_esx_policejob.sql
+++ /dev/null
@@ -1,62 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Politie', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Politie', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Politie', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Politie')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'aspirant','Aspirant',0,'{}','{}'),
- ('police',1,'surveillant','Surveillant',0,'{}','{}'),
- ('police',2,'agent','Agent',0,'{}','{}'),
- ('police',3,'hoofdagent','Hoofdagent',0,'{}','{}'),
- ('police',4,'brigadier','Brigadier',0,'{}','{}'),
- ('police',5,'inspecteur','Inspecteur',0,'{}','{}'),
- ('police',6,'hoofdinspecteur','Hoofdinspecteur',0,'{}','{}'),
- ('police',7,'commissaris','Commissaris',0,'{}','{}'),
- ('police',8,'hoofdcommissaris','Hoofdcommissaris',0,'{}','{}'),
- ('police',9,'boss','Eerste Hoofdcommissaris',0,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-);
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Onnodig claxoneren', 90, 0),
- ('Rijden over een doorgetrokken streep', 240, 0),
- ('Tegen het verkeer in rijden', 140, 0),
- ('Negeren keerverbod (u-turn)', 140, 0),
- ('Niet opvolgen aanwijzing van bevoegd ambtenaar', 110, 0),
- ('Fout parkeren', 95, 0),
- ('Verkeerd voorsorteren', 240, 0),
- ('Rijden met een WOK status ', 300, 0),
- ('Door rood rijden', 240, 0),
- ('Rijden zonder rijbewijs', 340, 0),
- ('Snelheid overtreding < 10km', 112, 0),
- ('Snelheid overtreding 10 - 20km', 202, 0),
- ('Snelheid overtreding 20 - 50km', 670, 0),
- ('Snelheid overtreding > 50km', 1000, 0),
- ('Openbare dronkenschap', 415, 1),
- ('Wanordelijk gedrag', 500, 1),
- ('Hulpdiensten hinderen', 700, 1),
- ('Belediging ambtenaar in functie', 200, 1),
- ('Bedreiging', 980, 1),
- ('Illegaal wapen bezit', 2300, 2),
- ('Illegaal drugs bezit', 400, 2),
- ('Drugshandel', 3000, 3)
-;
diff --git a/localization/pl_esx_policejob.sql b/localization/pl_esx_policejob.sql
deleted file mode 100644
index 754b0ec..0000000
--- a/localization/pl_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Police')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Posterunkowy',20,'{}','{}'),
- ('police',1,'officer','Sierżant',40,'{}','{}'),
- ('police',2,'sergeant','Aspirant',60,'{}','{}'),
- ('police',3,'lieutenant','Komisarz',85,'{}','{}'),
- ('police',4,'boss','Generalny Inspektor',100,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Nadużywanie klaksonu', 30, 0),
- ('Przekroczenie lini ciągłej', 40, 0),
- ('Jechanie po złej stronie drogi', 250, 0),
- ('Nieprawidłowe zawracanie', 250, 0),
- ('Nielegalna jazda Off-road', 170, 0),
- ('Niedostosowanie się do poleceń Policji', 30, 0),
- ('Nieprawidłowe zatrzymanie pojazdu', 150, 0),
- ('Nieprawidłowe parkownie', 70, 0),
- ('Niezastosowanie się do ruchu prawostronnego (jazda lewym pasem)', 70, 0),
- ('Brak informacji o pojeździe', 90, 0),
- ('Niezastosowanie się do znaku SOTP', 105, 0),
- ('Niezatrzymanie się na czerwonym świetle', 130, 0),
- ('Przechodzenie w niedozwolonym miejscu', 100, 0),
- ('Jazda nielegalnym pojazdem', 100, 0),
- ('Brak prawa jazdy', 1500, 0),
- ('Ucieczka z miejsca zdarzenia', 800, 0),
- ('Przekroczenie prędkości < 5 mph', 90, 0),
- ('Przekroczenie prędkości 5-15 mph', 120, 0),
- ('Przekroczenie prędkości 15-30 mph', 180, 0),
- ('Przekroczenie prędkości > 30 mph', 300, 0),
- ('Utrudnianie przemieszczania się', 110, 1),
- ('Publiczne zgorszenie', 90, 1),
- ('Niepoprawne zachowanie', 90, 1),
- ('Utrudnianie postępowania', 130, 1),
- ('Obraza cywilów', 75, 1),
- ('Obraza graczy', 110, 1),
- ('Groźby werbalne', 90, 1),
- ('Przeklinanie na graczy', 150, 1),
- ('Dostarczanie fałszywych informacji', 250, 1),
- ('Próba korupcji', 1500, 1),
- ('Wymachiwanie bronią w mieście', 120, 2),
- ('Wymachiwanie niebezpieczną bronią w mieście', 300, 2),
- ('Brak pozwolenia na broń', 600, 2),
- ('Posiadanie nielegalnej broni', 700, 2),
- ('Posiadanie narzędzi do włamań', 300, 2),
- ('Złodziej - recydywista', 1800, 2),
- ('Rozprowadzanie nielegalnych substancji', 1500, 2),
- ('Wytwarzanie nielegalnych substancji', 1500, 2),
- ('Posiadanie zakazanych substancji', 650, 2),
- ('Porwanie cywila', 1500, 2),
- ('Porwanie gracza', 2000, 2),
- ('Rabunek', 650, 2),
- ('Kradzież z bronią w ręku', 650, 2),
- ('Napad na Bank', 1500, 2),
- ('Atak na cywila', 2000, 3),
- ('Atak na gracza', 2500, 3),
- ('Próba morderstwa cywila', 3000, 3),
- ('Próba morderstwa gracza', 5000, 3),
- ('Zabójstwo cywila z premedytacją', 10000, 3),
- ('Zabójstwo gracza z premedytacją', 30000, 3),
- ('Nieumyślne spowodowanie śmierci', 1800, 3),
- ('Oszustwo', 2000, 2);
-;
diff --git a/localization/sr_esx_policejob.sql b/localization/sr_esx_policejob.sql
deleted file mode 100644
index eace42e..0000000
--- a/localization/sr_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Policija', 1)
-;
-
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Policija', 1)
-;
-
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Policija', 1)
-;
-
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Policija')
-;
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Regrut',20,'{}','{}'),
- ('police',1,'officer','Oficir',40,'{}','{}'),
- ('police',2,'sergeant','Narednik',60,'{}','{}'),
- ('police',3,'lieutenant','Poručnik',85,'{}','{}'),
- ('police',4,'boss','Načelnik',100,'{}','{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Zloupotreba sirene', 30, 0),
- ('Prelazak preko pune linije', 40, 0),
- ('Vožnja u pogrešnom smeru', 250, 0),
- ('Skretanje u U', 250, 0),
- ('Vožnja van puta', 170, 0),
- ('Odbijanje naredbe', 30, 0),
- ('Ilegalno zaustavljanje vozila', 150, 0),
- ('Ilegalno parkiranje', 70, 0),
- ('Ne propuštanje udesno', 70, 0),
- ('Netačne informacije o vozilu', 90, 0),
- ('Ne zaustavljanje na STOP znak ', 105, 0),
- ('Prolazak kroz crveno svetlo', 130, 0),
- ('Ilegalni prolazak', 100, 0),
- ('Vožnja ilegalnog vozila', 100, 0),
- ('Vožnja bez vozačke dozvole', 1500, 0),
- ('Bežanje sa mesta nesreće', 800, 0),
- ('Prekoračenje brzine < 5 kmh', 90, 0),
- ('Prekoračenje brzine 5-15 kmh', 120, 0),
- ('Prekoračenje brzine 15-30 kmh', 180, 0),
- ('Prekoračenje brzine > 30 kmh', 300, 0),
- ('Ometanje saobraćaja', 110, 1),
- ('Javna intoksikacija', 90, 1),
- ('Napastvovanje', 90, 1),
- ('Nepoštovanje suda', 130, 1),
- ('Uvrede prema civilima', 75, 1),
- ('Uvrede prema službenom licu', 110, 1),
- ('Napad na civila', 90, 1),
- ('Napad na službeno lice', 150, 1),
- ('Davanje lažne izjave', 250, 1),
- ('Pokušaj korupcije', 1500, 1),
- ('Mahanje oružjem u gradu', 120, 2),
- ('Mahanje smrtonosnim oružjem u gradu', 300, 2),
- ('Posedovanje oružja bez dozvole', 600, 2),
- ('Posedovanje ilegalnog oružja', 700, 2),
- ('Posedovanje alata za provalu', 300, 2),
- ('Luda vožnja', 1800, 2),
- ('Pokušaj prodaje ilegalnih supstanci', 1500, 2),
- ('Prodaja ilegalnih supstanci', 1500, 2),
- ('Posedovanje ilegalnih supstanci ', 650, 2),
- ('Kidnapovanje civila', 1500, 2),
- ('Kidnapovanje službenog lica', 2000, 2),
- ('Pljačka', 650, 2),
- ('Oružana pljačka prodavnice', 650, 2),
- ('Oružana pljačka banke', 1500, 2),
- ('Oružani napad na civila', 2000, 3),
- ('Oružani napad na službeno lice', 2500, 3),
- ('Pokusaj ubistva civila', 3000, 3),
- ('Pokusaj ubistva službenog lica', 5000, 3),
- ('Ubistvo civila', 10000, 3),
- ('Ubistvo službenog lica', 30000, 3),
- ('Ubistvo bez predomišljaja', 1800, 3),
- ('Prevara', 2000, 2);
-;
From 99a71d654197a3291569abdb4d5a5f3af31bc35d Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:10:34 +0100
Subject: [PATCH 02/18] Update en.lua
Updated locales and removed the unused ones + lazy load
---
locales/en.lua | 263 +++++++++++++++++++++----------------------------
1 file changed, 111 insertions(+), 152 deletions(-)
diff --git a/locales/en.lua b/locales/en.lua
index 505a1d4..73e0e4d 100644
--- a/locales/en.lua
+++ b/locales/en.lua
@@ -1,170 +1,129 @@
-Locales['en'] = {
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
-- Cloakroom
- ['cloakroom'] = 'locker room',
- ['citizen_wear'] = 'civilian Outfit',
- ['police_wear'] = 'police Outfit',
- ['gilet_wear'] = 'orange reflective jacket',
- ['bullet_wear'] = 'bulletproof vest',
- ['no_outfit'] = 'there\'s no uniform that fits you!',
- ['open_cloackroom'] = 'press [E] to change clothes.',
- -- Armory
- ['remove_object'] = 'withdraw object',
- ['deposit_object'] = 'deposit object',
- ['get_weapon'] = 'withdraw weapon from armory',
- ['put_weapon'] = 'store weapon in armory',
- ['buy_weapons'] = 'buy weapons',
- ['armory'] = 'armory',
- ['open_armory'] = 'press [E] to access the Armory.',
- ['armory_owned'] = 'owned',
- ['armory_free'] = 'free',
- ['armory_item'] = '$%s',
- ['armory_weapontitle'] = 'armory - Buy weapon',
- ['armory_componenttitle'] = 'armory - Weapon attatchments',
- ['armory_bought'] = 'you bought an %s for $%s',
- ['armory_money'] = 'you cannot afford that weapon',
- ['armory_hascomponent'] = 'you have that attatchment equiped!',
- ['get_weapon_menu'] = 'armory - Withdraw Weapon',
- ['put_weapon_menu'] = 'armory - Store Weapon',
- ['confirm'] = 'Confirm',
- -- Vehicles
- ['vehicle_menu'] = 'vehicle',
- ['vehicle_blocked'] = 'all available spawn points are currently blocked!',
- ['garage_prompt'] = 'press [E] to access the Vehicle Actions.',
- ['garage_title'] = 'vehicle Actions',
- ['garage_stored'] = 'stored',
- ['garage_notstored'] = 'not in garage',
- ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.',
- ['garage_has_stored'] = 'the vehicle has been stored in your garage',
- ['garage_has_notstored'] = 'no nearby owned vehicles were found',
- ['garage_notavailable'] = 'your vehicle is not stored in the garage.',
- ['garage_blocked'] = 'there\'s no available spawn points!',
- ['garage_empty'] = 'you don\'t have any vehicles in your garage.',
- ['garage_released'] = 'your vehicle has been released from the garage.',
- ['garage_store_nearby'] = 'there is no nearby vehicles.',
- ['garage_storeditem'] = 'open garage',
- ['garage_storeitem'] = 'store vehicle in garage',
- ['garage_buyitem'] = 'vehicle shop',
- ['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
- ['helicopter_prompt'] = 'press [E] to access the Helicopter Actions.',
- ['shop_item'] = '$%s',
- ['vehicleshop_title'] = 'vehicle Shop',
- ['vehicleshop_confirm'] = 'do you want to buy this vehicle?',
- ['vehicleshop_bought'] = 'you have bought %s for ~r~$%s',
- ['vehicleshop_money'] = 'you cannot afford that vehicle',
- ['vehicleshop_awaiting_model'] = 'the vehicle is currently DOWNLOADING & LOADING please wait',
- ['confirm_no'] = 'no',
- ['confirm_yes'] = 'yes',
- ['view'] = 'View',
- ['buy_car'] = 'Buy',
- ['stop_view'] = 'Stop Viewing',
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
-- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- ['service_not'] = 'you have not entered service! You\'ll have to get changed first.',
- ['service_anonunce'] = 'service information',
- ['service_in'] = 'you\'ve entered service, welcome!',
- ['service_in_announce'] = 'operator %s has entered service!',
- ['service_out'] = 'you have left service.',
- ['service_out_announce'] = 'operator %s has left their service.',
-- Action Menu
- ['menu_title'] = 'Police',
- ['citizen_interaction'] = 'citizen Interaction',
- ['vehicle_interaction'] = 'vehicle Interaction',
- ['object_spawner'] = 'object Spawner',
-
- ['id_card'] = 'ID Card',
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
['search'] = 'search',
['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'escort',
- ['put_in_vehicle'] = 'put in Vehicle',
- ['out_the_vehicle'] = 'drag out from vehicle',
- ['fine'] = 'fine',
- ['unpaid_bills'] = 'manage unpaid bills',
- ['license_check'] = 'manage license',
- ['license_revoke'] = 'revoke license',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
['license_revoked'] = 'your %s has been revoked!',
- ['licence_you_revoked'] = 'you revoked a %s which belonged to %s',
- ['no_players_nearby'] = 'there is no player(s) nearby!',
- ['being_searched'] = 'you are being searched by the Police',
-- Vehicle interaction
- ['vehicle_info'] = 'vehicle Info',
- ['pick_lock'] = 'lockpick Vehicle',
- ['vehicle_unlocked'] = 'vehicle Unlocked',
- ['no_vehicles_nearby'] = 'there is no vehicles nearby',
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
['impound'] = 'impound vehicle',
- ['impound_prompt'] = 'press [E] to cancel the impound',
- ['impound_canceled'] = 'you canceled the impound',
- ['impound_canceled_moved'] = 'the impound has been canceled because the vehicle moved',
- ['impound_successful'] = 'you have impounded the vehicle',
- ['search_database'] = 'vehicle information',
- ['search_database_title'] = 'vehicle information - search with registration number',
- ['search_database_error_invalid'] = 'that is ~r~not a valid registration number',
- ['search_plate'] = 'Enter Plate',
- ['lookup_plate'] = 'Lookup Plate',
- -- Traffic interaction
- ['traffic_interaction'] = 'interaction Traffic',
- ['cone'] = 'cone',
- ['barrier'] = 'barrier',
- ['spikestrips'] = 'spikestrips',
- ['box'] = 'box',
- ['cash'] = 'box of cash',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
-- ID Card Menu
['name'] = 'name: %s',
['job'] = 'job: %s',
- ['sex'] = 'sex: %s',
+ ['sex'] = 'Gender: %s',
['dob'] = 'DOB: %s',
['height'] = 'height: %s',
- ['bac'] = 'BAC: %s',
- ['unknown'] = 'unknown',
- ['male'] = 'male',
- ['female'] = 'female',
- -- Body Search Menu
- ['guns_label'] = '--- Guns ---',
- ['inventory_label'] = '--- Inventory ---',
- ['license_label'] = ' --- Licenses ---',
- ['confiscate'] = 'confiscate %s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_inv'] = 'confiscate %sx %s',
- ['confiscate_dirty'] = 'confiscate dirty money: $%s',
- ['you_confiscated'] = 'you confiscated %sx %s from %s',
- ['got_confiscated'] = '%sx %s were confiscated by %s',
- ['you_confiscated_account'] = 'you confiscated $%s (%s) from %s',
- ['got_confiscated_account'] = '$%s (%s) was confiscated by %s',
- ['you_confiscated_weapon'] = 'you confiscated %s from %s with ~o~%s bullets',
- ['got_confiscated_weapon'] = 'your %s with ~o~%s bullets was confiscated by %s',
- ['traffic_offense'] = 'traffic Offense',
- ['minor_offense'] = 'minor Offense',
- ['average_offense'] = 'average Offense',
- ['major_offense'] = 'major Offense',
- ['fine_total'] = 'fine: %s',
- ['fine_enter_amount'] = 'Enter the amount of the fine',
- ['fine_enter_text'] = 'Enter the reason for the fine',
- ['invalid_amount'] = 'Error: Amount was not a number or invalid',
- -- Vehicle Info Menu
- ['plate'] = 'plate: %s',
- ['owner_unknown'] = 'owner: Unknown',
- ['owner'] = 'owner: %s',
- -- Boss Menu
- ['open_bossmenu'] = 'press [E] to open the menu',
- ['quantity_invalid'] = 'invalid quantity',
- ['have_withdrawn'] = 'you have withdrawn %sx %s',
- ['have_deposited'] = 'you have deposited %sx %s',
- ['quantity'] = 'quantity',
- ['quantity_placeholder'] = 'Amount to withdraw..',
- ['inventory'] = 'inventory',
- ['police_stock'] = 'police Stock',
- -- Misc
- ['remove_prop'] = 'press [E] to delete the object',
- ['map_blip'] = 'police Station',
- ['unrestrained_timer'] = 'you feel your handcuffs slowly losing grip and fading away.',
- -- Notifications
- ['alert_police'] = 'police alert',
- ['phone_police'] = 'police',
- -- Keybind
- ['interaction'] = 'Interact',
- ['quick_actions'] = 'Quick Actions',
- -- Other
- ['society_police'] = 'Police',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
['s_m_y_sheriff_01'] = 'Sheriff Ped',
['s_m_y_cop_01'] = 'Police Ped',
['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
}
From 3829c1cb293c8860e8af18aa6f3b2291512653c0 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:10:50 +0100
Subject: [PATCH 03/18] Modified initialization files
---
config.lua | 608 ++++++++++++++++++++++++++++++----------------
esx_policejob.sql | 38 +--
fxmanifest.lua | 37 +--
3 files changed, 435 insertions(+), 248 deletions(-)
diff --git a/config.lua b/config.lua
index f16269b..0a848c7 100644
--- a/config.lua
+++ b/config.lua
@@ -1,176 +1,359 @@
-Config = {}
+Config = {}
-Config.DrawDistance = 10.0 -- How close do you need to be for the markers to be drawn (in GTA units).
-Config.MarkerType = {Cloakrooms = 20, Armories = 21, BossActions = 22, Vehicles = 36, Helicopters = 34}
-Config.MarkerSize = {x = 1.5, y = 1.5, z = 0.5}
-Config.MarkerColor = {r = 50, g = 50, b = 204}
+Config.Locale = GetConvar('esx:locale', 'en')
-Config.EnablePlayerManagement = true -- Enable if you want society managing.
-Config.EnableArmoryManagement = false
-Config.EnableESXIdentity = true -- Enable if you're using esx_identity.
-Config.EnableESXOptionalneeds = false -- Enable if you're using esx_optionalneeds
-Config.EnableLicenses = false -- Enable if you're using esx_license.
+Config.OxInventory = ESX.GetConfig().OxInventory
-Config.EnableHandcuffTimer = true -- Enable handcuff timer? will unrestrain player after the time ends.
-Config.HandcuffTimer = 10 * 60000 -- 10 minutes.
+Config.Keybinds = {
+ policeMenu = 'F6',
+ -- spiketrip: 'DELETE' (idea for spawning objects faster)
+}
-Config.EnableCustomPeds = false -- Enable custom peds in cloak room? See Config.CustomPeds below to customize peds.
+Config.EnabledModules = {
+ playerManagement = true, -- Enable if you want esx_society management
+ esxIdentity = true, -- Enable if you're using esx_identity
+ esxOptionalNeeds = true, -- Enable if you're using esx_optionalneeds
+ esxLicense = true, -- Enable if you're using esx_license
+ esxService = true, -- Enable if you're using esx_service
+ esxBilling = true, -- Enable if you're using esx_billing and want police officers to issue fines
+ esxProgressBar = true, -- Enable if you're using ESX.Progressbar function (if not, all vehicle actions will be immediate)
+}
-Config.EnableESXService = false -- Enable esx service?
-Config.MaxInService = -1 -- How many people can be in service at once? Set as -1 to have no limit
+-- List of additional options you can add to police man's F6 menu.
+Config.AllowedVehicleInteractions = {
+ fix = true, -- Allow police officers to fix cars through the F6 menu?
+ wash = true -- Allow police officers to wash cars through the F6 menu?
+}
-Config.EnableFinePresets = false -- Set to false to use a custom input fields for fines
+-- The allowed distance the police man can do handcuff actions on other players
+-- Prevents cheaters from handcuffing players that are far away
+Config.MaxInteractionDistance = 2.0
-Config.Locale = GetConvar('esx:locale', 'en')
+-- How many people can be in service at once? Set as -1 to have no limit
+Config.MaxInService = -1
-Config.OxInventory = ESX.GetConfig().OxInventory
+-- List of licenses police officer can add when esxService module is enabled. (need to be added in SQL Database too)
+Config.Licenses = {
+ ['weapon'] = 'Weapon License'
+}
-Config.PoliceStations = {
+-- List of actions that a police man can do through the F6 Menu (Used for progressbar's)
+Config.PoliceActions = {
+ vehicleInteractions = {
+ hijackVehicle = {
+ duration = 5000,
+ animation = {
+ type = 'anim',
+ dict =
+ 'anim@amb@casino@brawl@reacts@hr_blackjack@bg_blackjack_breakout_t02bg_blackjack_breakout_t02_s01_s03',
+ lib = 'gawk_loop_female_02'
+ }
+ },
+ impoundVehicle = {
+ duration = 5000,
+ animation = {
+ type = 'anim',
+ dict = 'ah_2_ext_alt-7',
+ lib = 'player_one_dual-7'
+ }
+ },
+ fixVehicle = {
+ duration = 5000,
+ animation = {
+ type = 'anim',
+ dict = 'missmechanic',
+ lib = 'work2_in'
+ }
+ },
+ washVehicle = {
+ duration = 5000,
+ animation = {
+ type = 'anim',
+ dict = 'timetable@maid@cleaning_window@idle_b',
+ lib = 'idle_d'
+ }
+ }
+ }
+}
- LSPD = {
+-- Enable handcuff timer? will unrestrain player after the time ends.
+Config.EnableHandcuffTimer = true
+Config.HandcuffTimer = 5 -- Time in minutes.
- Blip = {
- Coords = vector3(425.1, -979.5, 30.7),
- Sprite = 60,
- Display = 4,
- Scale = 1.2,
- Colour = 29
- },
+-- Bone attach options while dragging a player
+Config.DragBoneOptions = {
+ boneIndex = 11861,
+ offset = vec3(0.54, 0.54, 0.0),
+ rot = vec3(0.0, 0.0, 0.0)
+}
- Cloakrooms = {
- vector3(452.6, -992.8, 30.6)
- },
+-- List of items that can not be taken while searching players inventory. weapons, accounts and items included.
+Config.TakeItemBlacklist = {
+ 'bank', -- If this stays here, police man won't be able to take money from player's bank accounts
+}
- Armories = {
- vector3(451.7, -980.1, 30.6)
- },
+Config.HandcuffsAnimations = {
+ handcuff = {
+ dict = 'mp_arrest_paired',
+ name = 'cop_p2_back_right',
+ duration = 4500
+ },
+ cuffed = {
+ dict = 'mp_arrest_paired',
+ name = 'crook_p2_back_right',
+ duration = 4500
+ },
+ cuffed_idle = {
+ dict = 'mp_arresting',
+ name = 'idle',
+ },
+ uncuff = {
+ dict = 'mp_arresting',
+ name = 'a_uncuff',
+ duration = 3000
+ },
+ uncuffed = {
+ dict = 'mp_arresting',
+ name = 'b_uncuff',
+ duration = 6500 -- lower durations may cause the animation to be less immersive
+ },
+ searching = {
+ dict = 'anim@gangops@facility@servers@bodysearch@',
+ name = 'player_search',
+ duration = 1500
+ }
+}
+
+-- Pairs of disabled keys for players that are handcuffed
+Config.DisabledControlsWhileCuffed = {
+ { 0, 69 },
+ { 0, 92 },
+ { 0, 114 },
+ { 0, 140 },
+ { 0, 141 },
+ { 0, 142 },
+ { 0, 257 },
+ { 0, 263 },
+ { 0, 264 },
+ { 0, 24 },
+ { 0, 25 },
+ { 2, 246 },
+ { 2, 59 },
+ { 0, 75 },
+ { 0, 21 },
+ { 2, 22 },
+ { 2, 21 },
+ { 2, 0 }
+}
+
+-- Call buttons
+Config.CallButtonCooldown = 5 -- In minutes
- Vehicles = {
+Config.PoliceStations = {
+ ['Mission Row'] = {
+ blip = {
+ coords = vector3(425.1, -979.5, 30.7),
+ sprite = 60,
+ display = 4,
+ scale = 1.2,
+ color = 29,
+ shortRange = true,
+ label = 'Police Station'
+ },
+ callButtons = {
+ {
+ coords = vector3(441.243, -981.2703, 30.6783),
+ marker = {
+ color = { 50, 50, 204, 200 },
+ scale = { 1.0, 1.0, 1.0 },
+ type = 24,
+ rotate = true,
+ bobbing = false,
+ faceCamera = true,
+ }
+ }
+ },
+ cloakrooms = {
{
- Spawner = vector3(454.6, -1017.4, 28.4),
- InsideShop = vector3(228.5, -993.5, -99.5),
- SpawnPoints = {
- {coords = vector3(438.4, -1018.3, 27.7), heading = 90.0, radius = 6.0},
- {coords = vector3(441.0, -1024.2, 28.3), heading = 90.0, radius = 6.0},
- {coords = vector3(453.5, -1022.2, 28.0), heading = 90.0, radius = 6.0},
- {coords = vector3(450.9, -1016.5, 28.1), heading = 90.0, radius = 6.0}
+ coords = vector3(452.6, -992.8, 30.6),
+ marker = {
+ color = { 50, 50, 204, 200 },
+ scale = { 1.0, 1.0, 1.0 },
+ type = 20,
+ rotate = true,
+ bobbing = false,
+ faceCamera = true,
}
},
-
+ },
+ armories = {
{
- Spawner = vector3(473.3, -1018.8, 28.0),
- InsideShop = vector3(228.5, -993.5, -99.0),
- SpawnPoints = {
- {coords = vector3(475.9, -1021.6, 28.0), heading = 276.1, radius = 6.0},
- {coords = vector3(484.1, -1023.1, 27.5), heading = 302.5, radius = 6.0}
+ coords = vector3(451.450, -981.151, 30.678),
+ marker = {
+ color = { 50, 50, 204, 200 },
+ scale = { 1.0, 1.0, 1.0 },
+ type = 20,
+ rotate = true,
+ bobbing = false,
+ faceCamera = true,
}
- }
+ },
},
+ garages = {
+ {
+ coords = vector3(454.6, -1017.4, 28.4),
+ previewPosition = vector3(228.5, -993.5, -99.5),
+ spawnPoints = {
+ { coords = vector4(438.4, -1018.3, 27.7, 90.0), radius = 6.0 },
+ { coords = vector4(441.0, -1024.2, 28.3, 90.0), radius = 6.0 },
+ { coords = vector4(453.5, -1022.2, 28.0, 90.0), radius = 6.0 },
+ { coords = vector4(450.9, -1016.5, 28.1, 90.0), radius = 6.0 }
+ },
+ marker = {
+ color = { 50, 50, 204, 200 },
+ scale = { 1.0, 1.0, 1.0 },
+ type = 36, -- Car marker type
+ rotate = true,
+ bobbing = false,
+ faceCamera = true,
+ },
+ vehicleType = 'vehicle'
+ },
- Helicopters = {
{
- Spawner = vector3(461.1, -981.5, 43.6),
- InsideShop = vector3(477.0, -1106.4, 43.0),
- SpawnPoints = {
- {coords = vector3(449.5, -981.2, 43.6), heading = 92.6, radius = 10.0}
- }
+ coords = vector3(473.3, -1018.8, 28.0),
+ previewPosition = vector3(228.5, -993.5, -99.0),
+ spawnPoints = {
+ { coords = vector4(475.9, -1021.6, 28.0, 276.1), radius = 6.0 },
+ { coords = vector4(484.1, -1023.1, 27.5, 302.5), radius = 6.0 }
+ },
+ marker = {
+ color = { 50, 50, 204, 200 },
+ scale = { 1.0, 1.0, 1.0 },
+ type = 36, -- Car marker type
+ rotate = true,
+ bobbing = false,
+ faceCamera = true,
+ },
+ vehicleType = 'vehicle'
+ },
+ {
+ coords = vector3(461.1, -981.5, 43.6),
+ previewPosition = vector3(477.0, -1106.4, 43.0),
+ spawnPoints = {
+ { coords = vector4(449.5, -981.2, 43.6, 92.6), radius = 10.0 }
+ },
+ marker = {
+ color = { 50, 50, 204, 200 },
+ scale = { 1.0, 1.0, 1.0 },
+ type = 34, -- Helicopter marker type
+ rotate = true,
+ bobbing = false,
+ faceCamera = true,
+ },
+ vehicleType = 'helicopter'
}
},
-
- BossActions = {
- vector3(448.4, -973.2, 30.6)
+ bossActions = {
+ {
+ coords = vector3(448.4, -973.2, 30.6),
+ marker = {
+ color = { 50, 50, 204, 200 },
+ scale = { 1.0, 1.0, 1.0 },
+ type = 20,
+ rotate = true,
+ bobbing = false,
+ faceCamera = true,
+ },
+ allowedGrades = {
+ ['boss'] = true
+ }
+ }
}
-
}
}
+-- Components that have to be removed when purchasing a specific one
+Config.ExclusiveWeaponComponents = {
+ clip_default = { 'clip_extended' },
+ clip_extended = { 'clip_default' }
+}
+
+--- Component prices that can be bought when police man bought weapon in armory
+Config.WeaponComponents = {
+ ['WEAPON_APPISTOL'] = {
+ { name = 'clip_default', price = 0 },
+ { name = 'clip_extended', price = 0 },
+ { name = 'flashlight', price = 1000 },
+ { name = 'suppressor', price = 4000 },
+ { name = 'luxary_finish', price = 0 }
+ },
+ ['WEAPON_ADVANCEDRIFLE'] = {
+ { name = 'clip_default', price = 0 },
+ { name = 'clip_extended', price = 6000 },
+ { name = 'flashlight', price = 1000 },
+ { name = 'scope', price = 4000 },
+ { name = 'suppressor', price = 8000 },
+ { name = 'luxary_finish', price = 0 }
+ },
+ ['WEAPON_PUMPSHOTGUN'] = {
+ { name = 'flashlight', price = 2000 },
+ { name = 'suppressor', price = 6000 },
+ { name = 'luxary_finish', price = 0 }
+ }
+}
+
Config.AuthorizedWeapons = {
recruit = {
- {weapon = 'WEAPON_APPISTOL', components = {0, 0, 1000, 4000, nil}, price = 10000},
- {weapon = 'WEAPON_NIGHTSTICK', price = 0},
- {weapon = 'WEAPON_STUNGUN', price = 1500},
- {weapon = 'WEAPON_FLASHLIGHT', price = 80}
+ { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
+ { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
+ { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 1500 },
+ { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 80 }
},
officer = {
- {weapon = 'WEAPON_APPISTOL', components = {0, 0, 1000, 4000, nil}, price = 10000},
- {weapon = 'WEAPON_ADVANCEDRIFLE', components = {0, 6000, 1000, 4000, 8000, nil}, price = 50000},
- {weapon = 'WEAPON_NIGHTSTICK', price = 0},
- {weapon = 'WEAPON_STUNGUN', price = 500},
- {weapon = 'WEAPON_FLASHLIGHT', price = 0}
+ { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
+ { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
+ { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
+ { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 500 },
+ { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 0 }
},
sergeant = {
- {weapon = 'WEAPON_APPISTOL', components = {0, 0, 1000, 4000, nil}, price = 10000},
- {weapon = 'WEAPON_ADVANCEDRIFLE', components = {0, 6000, 1000, 4000, 8000, nil}, price = 50000},
- {weapon = 'WEAPON_PUMPSHOTGUN', components = {2000, 6000, nil}, price = 70000},
- {weapon = 'WEAPON_NIGHTSTICK', price = 0},
- {weapon = 'WEAPON_STUNGUN', price = 500},
- {weapon = 'WEAPON_FLASHLIGHT', price = 0}
+ { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
+ { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
+ { weapon = 'WEAPON_PUMPSHOTGUN', defaultAmmo = 100, price = 70000 },
+ { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
+ { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 500 },
+ { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 0 }
},
lieutenant = {
- {weapon = 'WEAPON_APPISTOL', components = {0, 0, 1000, 4000, nil}, price = 10000},
- {weapon = 'WEAPON_ADVANCEDRIFLE', components = {0, 6000, 1000, 4000, 8000, nil}, price = 50000},
- {weapon = 'WEAPON_PUMPSHOTGUN', components = {2000, 6000, nil}, price = 70000},
- {weapon = 'WEAPON_NIGHTSTICK', price = 0},
- {weapon = 'WEAPON_STUNGUN', price = 500},
- {weapon = 'WEAPON_FLASHLIGHT', price = 0}
+ { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
+ { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
+ { weapon = 'WEAPON_PUMPSHOTGUN', defaultAmmo = 100, price = 70000 },
+ { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
+ { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 500 },
+ { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 0 }
},
boss = {
- {weapon = 'WEAPON_APPISTOL', components = {0, 0, 1000, 4000, nil}, price = 10000},
- {weapon = 'WEAPON_ADVANCEDRIFLE', components = {0, 6000, 1000, 4000, 8000, nil}, price = 50000},
- {weapon = 'WEAPON_PUMPSHOTGUN', components = {2000, 6000, nil}, price = 70000},
- {weapon = 'WEAPON_NIGHTSTICK', price = 0},
- {weapon = 'WEAPON_STUNGUN', price = 500},
- {weapon = 'WEAPON_FLASHLIGHT', price = 0}
- }
-}
-
-Config.AuthorizedVehicles = {
- car = {
- recruit = {},
-
- officer = {
- {model = 'police3', price = 20000}
- },
-
- sergeant = {
- {model = 'policet', price = 18500},
- {model = 'policeb', price = 30500}
- },
-
- lieutenant = {
- {model = 'riot', price = 70000},
- {model = 'fbi2', price = 60000}
- },
-
- boss = {}
- },
-
- helicopter = {
- recruit = {},
-
- officer = {},
-
- sergeant = {},
-
- lieutenant = {
- {model = 'polmav', props = {modLivery = 0}, price = 200000}
- },
-
- boss = {
- {model = 'polmav', props = {modLivery = 0}, price = 100000}
- }
+ { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
+ { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
+ { weapon = 'WEAPON_PUMPSHOTGUN', defaultAmmo = 100, price = 70000 },
+ { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
+ { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 500 },
+ { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 0 }
}
}
+-- Enable custom peds in cloakroom? See Config.CustomPeds below to customize peds.
+Config.EnableCustomPeds = true
Config.CustomPeds = {
shared = {
- {label = TranslateCap('s_m_y_sheriff_01'), maleModel = 's_m_y_sheriff_01', femaleModel = 's_f_y_sheriff_01'},
- {label = TranslateCap('s_m_y_cop_01'), maleModel = 's_m_y_cop_01', femaleModel = 's_f_y_cop_01'}
+ { label = TranslateCap('s_m_y_sheriff_01'), maleModel = 's_m_y_sheriff_01', femaleModel = 's_f_y_sheriff_01' },
+ { label = TranslateCap('s_m_y_cop_01'), maleModel = 's_m_y_cop_01', femaleModel = 's_f_y_cop_01' }
},
recruit = {},
@@ -182,152 +365,149 @@ Config.CustomPeds = {
lieutenant = {},
boss = {
- {label = TranslateCap('s_m_y_swat_01'), maleModel = 's_m_y_swat_01', femaleModel = 's_m_y_swat_01'}
+ { label = TranslateCap('s_m_y_swat_01'), maleModel = 's_m_y_swat_01', femaleModel = 's_m_y_swat_01' }
}
}
--- CHECK SKINCHANGER CLIENT MAIN.LUA for matching elements
-Config.Uniforms = {
+Config.PoliceOutfits = {
recruit = {
male = {
- tshirt_1 = 59, tshirt_2 = 1,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 0, decals_2 = 0,
+ tshirt_1 = 59, tshirt_2 = 1,
+ torso_1 = 55, torso_2 = 0,
+ decals_1 = 0, decals_2 = 0,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = 46, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25, pants_2 = 0,
+ shoes_1 = 25, shoes_2 = 0,
+ helmet_1 = 46, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
},
female = {
- tshirt_1 = 36, tshirt_2 = 1,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 0, decals_2 = 0,
+ tshirt_1 = 36, tshirt_2 = 1,
+ torso_1 = 48, torso_2 = 0,
+ decals_1 = 0, decals_2 = 0,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = 45, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34, pants_2 = 0,
+ shoes_1 = 27, shoes_2 = 0,
+ helmet_1 = 45, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
}
},
officer = {
male = {
- tshirt_1 = 58, tshirt_2 = 0,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 0, decals_2 = 0,
+ tshirt_1 = 58, tshirt_2 = 0,
+ torso_1 = 55, torso_2 = 0,
+ decals_1 = 0, decals_2 = 0,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25, pants_2 = 0,
+ shoes_1 = 25, shoes_2 = 0,
+ helmet_1 = -1, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
},
female = {
- tshirt_1 = 35, tshirt_2 = 0,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 0, decals_2 = 0,
+ tshirt_1 = 35, tshirt_2 = 0,
+ torso_1 = 48, torso_2 = 0,
+ decals_1 = 0, decals_2 = 0,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34, pants_2 = 0,
+ shoes_1 = 27, shoes_2 = 0,
+ helmet_1 = -1, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
}
},
sergeant = {
male = {
- tshirt_1 = 58, tshirt_2 = 0,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 8, decals_2 = 1,
+ tshirt_1 = 58, tshirt_2 = 0,
+ torso_1 = 55, torso_2 = 0,
+ decals_1 = 8, decals_2 = 1,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25, pants_2 = 0,
+ shoes_1 = 25, shoes_2 = 0,
+ helmet_1 = -1, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
},
female = {
- tshirt_1 = 35, tshirt_2 = 0,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 7, decals_2 = 1,
+ tshirt_1 = 35, tshirt_2 = 0,
+ torso_1 = 48, torso_2 = 0,
+ decals_1 = 7, decals_2 = 1,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34, pants_2 = 0,
+ shoes_1 = 27, shoes_2 = 0,
+ helmet_1 = -1, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
}
},
lieutenant = {
male = {
- tshirt_1 = 58, tshirt_2 = 0,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 8, decals_2 = 2,
+ tshirt_1 = 58, tshirt_2 = 0,
+ torso_1 = 55, torso_2 = 0,
+ decals_1 = 8, decals_2 = 2,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25, pants_2 = 0,
+ shoes_1 = 25, shoes_2 = 0,
+ helmet_1 = -1, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
},
female = {
- tshirt_1 = 35, tshirt_2 = 0,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 7, decals_2 = 2,
+ tshirt_1 = 35, tshirt_2 = 0,
+ torso_1 = 48, torso_2 = 0,
+ decals_1 = 7, decals_2 = 2,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34, pants_2 = 0,
+ shoes_1 = 27, shoes_2 = 0,
+ helmet_1 = -1, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
}
},
boss = {
male = {
- tshirt_1 = 58, tshirt_2 = 0,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 8, decals_2 = 3,
+ tshirt_1 = 58, tshirt_2 = 0,
+ torso_1 = 55, torso_2 = 0,
+ decals_1 = 8, decals_2 = 3,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25, pants_2 = 0,
+ shoes_1 = 25, shoes_2 = 0,
+ helmet_1 = -1, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
},
female = {
- tshirt_1 = 35, tshirt_2 = 0,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 7, decals_2 = 3,
+ tshirt_1 = 35, tshirt_2 = 0,
+ torso_1 = 48, torso_2 = 0,
+ decals_1 = 7, decals_2 = 3,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34, pants_2 = 0,
+ shoes_1 = 27, shoes_2 = 0,
+ helmet_1 = -1, helmet_2 = 0,
+ chain_1 = 0, chain_2 = 0,
+ ears_1 = 2, ears_2 = 0
}
},
-
bullet_wear = {
male = {
- bproof_1 = 11, bproof_2 = 1
+ bproof_1 = 11, bproof_2 = 1
},
female = {
- bproof_1 = 13, bproof_2 = 1
+ bproof_1 = 13, bproof_2 = 1
}
},
-
gilet_wear = {
male = {
- tshirt_1 = 59, tshirt_2 = 1
+ tshirt_1 = 59, tshirt_2 = 1
},
female = {
- tshirt_1 = 36, tshirt_2 = 1
+ tshirt_1 = 36, tshirt_2 = 1
}
}
}
diff --git a/esx_policejob.sql b/esx_policejob.sql
index 9f4267f..7792cb0 100644
--- a/esx_policejob.sql
+++ b/esx_policejob.sql
@@ -1,25 +1,22 @@
-INSERT INTO `addon_account` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
+INSERT INTO `addon_account` (name, label, shared)
+VALUES ('society_police', 'Police', 1);
-INSERT INTO `datastore` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
+INSERT INTO `addon_inventory` (name, label, shared)
+VALUES ('society_police', 'Police', 1);
-INSERT INTO `addon_inventory` (name, label, shared) VALUES
- ('society_police', 'Police', 1)
-;
+INSERT INTO `datastore` (name, label, shared)
+VALUES ('society_police', 'Police', 1);
-INSERT INTO `jobs` (name, label) VALUES
- ('police', 'Police')
-;
+INSERT INTO `jobs` (name, label)
+VALUES ('police', 'Police');
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
- ('police',0,'recruit','Recruit',20,'{}','{}'),
- ('police',1,'officer','Officer',40,'{}','{}'),
- ('police',2,'sergeant','Sergeant',60,'{}','{}'),
- ('police',3,'lieutenant','Lieutenant',85,'{}','{}'),
- ('police',4,'boss','Chief',100,'{}','{}')
+INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female)
+VALUES
+ ('police', 0, 'recruit', 'Recruit', 10, '{}', '{}'),
+ ('police', 1, 'officer', 'Officer', 20, '{}', '{}'),
+ ('police', 2, 'sergeant', 'Sergeant', 30, '{}', '{}'),
+ ('police', 3, 'lieutenant', 'Lieutenant', 40, '{}', '{}'),
+ ('police', 4, 'boss', 'Chief', 0, '{}', '{}')
;
CREATE TABLE `fine_types` (
@@ -27,7 +24,7 @@ CREATE TABLE `fine_types` (
`label` varchar(255) DEFAULT NULL,
`amount` int DEFAULT NULL,
`category` int DEFAULT NULL,
-
+
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -86,3 +83,6 @@ INSERT INTO `fine_types` (label, amount, category) VALUES
('Involuntary manslaughter', 1800, 3),
('Fraud', 2000, 2);
;
+
+INSERT INTO `licenses` (`type`, `label`) VALUES
+ ('weapon', 'Weapon license');
\ No newline at end of file
diff --git a/fxmanifest.lua b/fxmanifest.lua
index b635c4c..7e51fe9 100644
--- a/fxmanifest.lua
+++ b/fxmanifest.lua
@@ -1,31 +1,38 @@
-fx_version 'adamant'
+fx_version 'cerulean'
game 'gta5'
-
-description 'Allows Players to RP as Police Officers (cars, outfits, handcuffing etc)'
+author 'zykem '
+description 'Allows Players to RP as Police Officers'
lua54 'yes'
-version '1.0.2'
-legacyversion '1.9.1'
-
-shared_script '@es_extended/imports.lua'
+use_experimental_fxv2_oal 'yes'
+version '2.0'
-server_scripts {
- '@oxmysql/lib/MySQL.lua',
+shared_scripts {
+ '@es_extended/imports.lua',
'@es_extended/locale.lua',
'locales/*.lua',
+ '@ox_lib/init.lua',
'config.lua',
+ 'shared/utils.lua',
+}
+
+server_scripts {
+ '@oxmysql/lib/MySQL.lua',
'server/*.lua'
}
client_scripts {
- '@es_extended/locale.lua',
- 'locales/*.lua',
- 'config.lua',
'client/*.lua'
}
+files {
+ 'locales/*.lua',
+ 'client/modules/*.lua',
+}
+
dependencies {
'es_extended',
- 'esx_billing',
- 'esx_vehicleshop'
-}
+ 'ox_lib',
+ 'esx_service', -- Hate the fact that this has to be a dependency since i made it "optional" with Config.EnabledModules.esxService...
+ 'esx_society'
+}
\ No newline at end of file
From 4ded6022c84cd2b157b100ac6613cebb44e11a11 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:10:54 +0100
Subject: [PATCH 04/18] Delete vehicle.lua
---
client/vehicle.lua | 320 ---------------------------------------------
1 file changed, 320 deletions(-)
delete mode 100644 client/vehicle.lua
diff --git a/client/vehicle.lua b/client/vehicle.lua
deleted file mode 100644
index 9ac134a..0000000
--- a/client/vehicle.lua
+++ /dev/null
@@ -1,320 +0,0 @@
-
-local spawnedVehicles = {}
-
-function OpenVehicleSpawnerMenu(type, station, part, partNum)
- local playerCoords = GetEntityCoords(PlayerPedId())
- local elements = {
- {unselectable = true, icon = "fas fa-car", title = TranslateCap('garage_title')},
- {icon = "fas fa-car", title = TranslateCap('garage_storeditem'), action = 'garage'},
- {icon = "fas fa-car", title = TranslateCap('garage_storeitem'), action = 'store_garage'},
- {icon = "fas fa-car", title = TranslateCap('garage_buyitem'), action = 'buy_vehicle'}
- }
-
- ESX.OpenContext("right", elements, function(menu,element)
- if element.action == "buy_vehicle" then
- local shopElements = {}
- local shopCoords = Config.PoliceStations[station][part][partNum].InsideShop
- local authorizedVehicles = Config.AuthorizedVehicles[type][ESX.PlayerData.job.grade_name]
-
- if authorizedVehicles then
- if #authorizedVehicles > 0 then
- for k,vehicle in ipairs(authorizedVehicles) do
- if IsModelInCdimage(vehicle.model) then
- local vehicleLabel = GetLabelText(GetDisplayNameFromVehicleModel(vehicle.model))
-
- shopElements[#shopElements+1] = {
- icon = 'fas fa-car',
- title = ('%s - %s'):format(vehicleLabel, TranslateCap('shop_item', ESX.Math.GroupDigits(vehicle.price))),
- name = vehicleLabel,
- model = vehicle.model,
- price = vehicle.price,
- props = vehicle.props,
- type = type
- }
- end
- end
-
- if #shopElements > 0 then
- OpenShopMenu(shopElements, playerCoords, shopCoords)
- else
- ESX.ShowNotification(TranslateCap('garage_notauthorized'))
- end
- else
- ESX.ShowNotification(TranslateCap('garage_notauthorized'))
- end
- else
- ESX.ShowNotification(TranslateCap('garage_notauthorized'))
- end
- elseif element.action == "garage" then
- local garage = {
- {unselectable = true, icon = "fas fa-car", title = "Garage"}
- }
-
- ESX.TriggerServerCallback('esx_vehicleshop:retrieveJobVehicles', function(jobVehicles)
- if #jobVehicles > 0 then
- local allVehicleProps = {}
-
- for k,v in ipairs(jobVehicles) do
- local props = json.decode(v.vehicle)
-
- if IsModelInCdimage(props.model) then
- local vehicleName = GetLabelText(GetDisplayNameFromVehicleModel(props.model))
- local label = ('%s - %s: '):format(vehicleName, props.plate)
-
- if v.stored == 1 or v.stored == true then
- label = label .. ('%s'):format(TranslateCap('garage_stored'))
- elseif v.stored == 0 or v.stored == false then
- label = label .. ('%s'):format(TranslateCap('garage_notstored'))
- end
-
- garage[#garage+1] = {
- icon = 'fas fa-car',
- title = label,
- stored = v.stored,
- model = props.model,
- plate = props.plate
- }
-
- allVehicleProps[props.plate] = props
- end
- end
-
- if #garage > 0 then
- ESX.OpenContext("right", garage, function(menuG,elementG)
- if elementG.stored == 1 or elementG.stored == true then
- local foundSpawn, spawnPoint = GetAvailableVehicleSpawnPoint(station, part, partNum)
-
- if foundSpawn then
- ESX.CloseContext()
-
- ESX.Game.SpawnVehicle(elementG.model, spawnPoint.coords, spawnPoint.heading, function(vehicle)
- local vehicleProps = allVehicleProps[elementG.plate]
- ESX.Game.SetVehicleProperties(vehicle, vehicleProps)
-
- TriggerServerEvent('esx_vehicleshop:setJobVehicleState', elementG.plate, false)
- ESX.ShowNotification(TranslateCap('garage_released'))
- end)
- end
- else
- ESX.ShowNotification(TranslateCap('garage_notavailable'))
- end
- end)
- else
- ESX.ShowNotification(TranslateCap('garage_empty'))
- end
- else
- ESX.ShowNotification(TranslateCap('garage_empty'))
- end
- end, type)
- elseif element.action == "store_garage" then
- StoreNearbyVehicle(playerCoords)
- end
- end)
-end
-
-function StoreNearbyVehicle(playerCoords)
- local vehicles, plates, index = ESX.Game.GetVehiclesInArea(playerCoords, 30.0), {}, {}
-
- if next(vehicles) then
- for i = 1, #vehicles do
- local vehicle = vehicles[i]
-
- -- Make sure the vehicle we're saving is empty, or else it won't be deleted
- if GetVehicleNumberOfPassengers(vehicle) == 0 and IsVehicleSeatFree(vehicle, -1) then
- local plate = ESX.Math.Trim(GetVehicleNumberPlateText(vehicle))
- plates[#plates + 1] = plate
- index[plate] = vehicle
- end
- end
- else
- ESX.ShowNotification(TranslateCap('garage_store_nearby'))
- return
- end
-
- ESX.TriggerServerCallback('esx_policejob:storeNearbyVehicle', function(plate)
- if plate then
- local vehicleId = index[plate]
- local attempts = 0
- ESX.Game.DeleteVehicle(vehicleId)
- local isBusy = true
-
- CreateThread(function()
- BeginTextCommandBusyspinnerOn('STRING')
- AddTextComponentSubstringPlayerName(TranslateCap('garage_storing'))
- EndTextCommandBusyspinnerOn(4)
-
- while isBusy do
- Wait(100)
- end
-
- BusyspinnerOff()
- end)
-
- -- Workaround for vehicle not deleting when other players are near it.
- while DoesEntityExist(vehicleId) do
- Wait(500)
- attempts = attempts + 1
-
- -- Give up
- if attempts > 30 then
- break
- end
-
- vehicles = ESX.Game.GetVehiclesInArea(playerCoords, 30.0)
- if #vehicles > 0 then
- for i = 1, #vehicles do
- local vehicle = vehicles[i]
- if ESX.Math.Trim(GetVehicleNumberPlateText(vehicle)) == plate then
- ESX.Game.DeleteVehicle(vehicle)
- break
- end
- end
- end
- end
-
- isBusy = false
- ESX.ShowNotification(TranslateCap('garage_has_stored'))
- else
- ESX.ShowNotification(TranslateCap('garage_has_notstored'))
- end
- end, plates)
-end
-
-function GetAvailableVehicleSpawnPoint(station, part, partNum)
- local spawnPoints = Config.PoliceStations[station][part][partNum].SpawnPoints
- local found, foundSpawnPoint = false, nil
-
- for i=1, #spawnPoints, 1 do
- if ESX.Game.IsSpawnPointClear(spawnPoints[i].coords, spawnPoints[i].radius) then
- found, foundSpawnPoint = true, spawnPoints[i]
- break
- end
- end
-
- if found then
- return true, foundSpawnPoint
- else
- ESX.ShowNotification(TranslateCap('vehicle_blocked'))
- return false
- end
-end
-
-function OpenShopMenu(elements, restoreCoords, shopCoords)
- local playerPed = PlayerPedId()
- isInShopMenu = true
- ESX.OpenContext("right", elements, function(menu,element)
- local elements2 = {
- {unselectable = true, icon = "fas fa-car", title = element.title},
- {icon = "fas fa-eye", title = TranslateCap('view'), value = "view"}
- }
-
- ESX.OpenContext("right", elements2, function(menu2,element2)
- if element2.value == "view" then
- DeleteSpawnedVehicles()
- WaitForVehicleToLoad(element.model)
-
- ESX.Game.SpawnLocalVehicle(element.model, shopCoords, 0.0, function(vehicle)
- table.insert(spawnedVehicles, vehicle)
- TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
- FreezeEntityPosition(vehicle, true)
- SetModelAsNoLongerNeeded(element.model)
-
- if element.props then
- ESX.Game.SetVehicleProperties(vehicle, element.props)
- end
- end)
-
- local elements3 = {
- {unselectable = true, icon = "fas fa-car", title = element.title},
- {icon = "fas fa-check-double", title = TranslateCap('buy_car'), value = "buy"},
- {icon = "fas fa-eye", title = TranslateCap('stop_view'), value = "stop"}
- }
-
- ESX.OpenContext("right", elements3, function(menu3,element3)
- if element3.value == 'stop' then
- isInShopMenu = false
- ESX.CloseContext()
-
- DeleteSpawnedVehicles()
- FreezeEntityPosition(playerPed, false)
- SetEntityVisible(playerPed, true)
-
- ESX.Game.Teleport(playerPed, restoreCoords)
- elseif element3.value == "buy" then
- local newPlate = exports['esx_vehicleshop']:GeneratePlate()
- local vehicle = GetVehiclePedIsIn(playerPed, false)
- local props = ESX.Game.GetVehicleProperties(vehicle)
- props.plate = newPlate
-
- ESX.TriggerServerCallback('esx_policejob:buyJobVehicle', function (bought)
- if bought then
- ESX.ShowNotification(TranslateCap('vehicleshop_bought', element.name, ESX.Math.GroupDigits(element.price)))
-
- isInShopMenu = false
- ESX.CloseContext()
- DeleteSpawnedVehicles()
- FreezeEntityPosition(playerPed, false)
- SetEntityVisible(playerPed, true)
-
- ESX.Game.Teleport(playerPed, restoreCoords)
- else
- ESX.ShowNotification(TranslateCap('vehicleshop_money'))
- ESX.CloseContext()
- end
- end, props, element.type)
- end
- end, function()
- isInShopMenu = false
- ESX.CloseContext()
-
- DeleteSpawnedVehicles()
- FreezeEntityPosition(playerPed, false)
- SetEntityVisible(playerPed, true)
-
- ESX.Game.Teleport(playerPed, restoreCoords)
- end)
- end
- end)
- end)
-end
-
-
-CreateThread(function()
- while true do
- Wait(0)
-
- if isInShopMenu then
- DisableControlAction(0, 75, true) -- Disable exit vehicle
- DisableControlAction(27, 75, true) -- Disable exit vehicle
- else
- Wait(500)
- end
- end
-end)
-
-function DeleteSpawnedVehicles()
- while #spawnedVehicles > 0 do
- local vehicle = spawnedVehicles[1]
- ESX.Game.DeleteVehicle(vehicle)
- table.remove(spawnedVehicles, 1)
- end
-end
-
-function WaitForVehicleToLoad(modelHash)
- modelHash = (type(modelHash) == 'number' and modelHash or joaat(modelHash))
-
- if not HasModelLoaded(modelHash) then
- RequestModel(modelHash)
-
- BeginTextCommandBusyspinnerOn('STRING')
- AddTextComponentSubstringPlayerName(TranslateCap('vehicleshop_awaiting_model'))
- EndTextCommandBusyspinnerOn(4)
-
- while not HasModelLoaded(modelHash) do
- Wait(0)
- DisableAllControlActions(0)
- end
-
- BusyspinnerOff()
- end
-end
From 93d8c4bdd6a380c75d736951efb76ddbb9d86434 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:11:18 +0100
Subject: [PATCH 05/18] Init
---
client/armories.lua | 269 +++++
client/bossActions.lua | 35 +
client/callButtons.lua | 32 +
client/cloakrooms.lua | 162 +++
client/fines.lua | 106 ++
client/garages.lua | 28 +
client/main.lua | 1580 +----------------------------
client/modules/citizenActions.lua | 143 +++
client/modules/handcuffs.lua | 371 +++++++
client/modules/vehicleActions.lua | 163 +++
client/modules/zoneUtils.lua | 65 ++
server/armories.lua | 252 +++++
server/callButtons.lua | 32 +
server/handcuffs.lua | 186 ++++
server/main.lua | 500 ++-------
server/vehicleActions.lua | 47 +
shared/utils.lua | 34 +
17 files changed, 2080 insertions(+), 1925 deletions(-)
create mode 100644 client/armories.lua
create mode 100644 client/bossActions.lua
create mode 100644 client/callButtons.lua
create mode 100644 client/cloakrooms.lua
create mode 100644 client/fines.lua
create mode 100644 client/garages.lua
create mode 100644 client/modules/citizenActions.lua
create mode 100644 client/modules/handcuffs.lua
create mode 100644 client/modules/vehicleActions.lua
create mode 100644 client/modules/zoneUtils.lua
create mode 100644 server/armories.lua
create mode 100644 server/callButtons.lua
create mode 100644 server/handcuffs.lua
create mode 100644 server/vehicleActions.lua
create mode 100644 shared/utils.lua
diff --git a/client/armories.lua b/client/armories.lua
new file mode 100644
index 0000000..afcdee9
--- /dev/null
+++ b/client/armories.lua
@@ -0,0 +1,269 @@
+local zoneModule = require('client.modules.zoneUtils')
+local armoryPoints, currentStation = {}, nil
+
+--- Gets the list of authorized weapons for the player's grade
+--- @return table: List of available weapons based on player's grade
+local function getWeaponList()
+ local ped = ESX.PlayerData.ped
+ local playerGrade = ESX.PlayerData.job.grade_name
+ local weaponList = {}
+
+ for _, weaponData in ipairs(Config.AuthorizedWeapons[playerGrade]) do
+ local weaponHash = joaat(weaponData.weapon)
+ local _, weaponConfig = ESX.GetWeapon(weaponData.weapon)
+ local hasWeapon = HasPedGotWeapon(ped, weaponHash, false)
+ local weaponLabel = hasWeapon and ("%s: %s"):format(weaponConfig.label, TranslateCap('armory_owned')) or
+ (weaponData.price > 0 and ("%s: $%s"):format(weaponConfig.label, ESX.Math.GroupDigits(weaponData.price)) or
+ ("%s: %s"):format(weaponConfig.label, TranslateCap('armory_free')))
+
+ weaponList[#weaponList + 1] = {
+ label = weaponLabel,
+ value = weaponConfig.name,
+ hasWeapon = hasWeapon,
+ weaponData = weaponData,
+ price = weaponData.price
+ }
+ end
+
+ return weaponList
+end
+
+--- Retrieves available components for a given weapon
+--- @param playerPed number Player's ped handle
+--- @param weaponData table Weapon data
+--- @return table: List of weapon components
+local function getWeaponComponentList(playerPed, weaponData)
+ local componentList = {}
+ local weaponComponents = Config.WeaponComponents[weaponData.weapon]
+ if not weaponComponents then return componentList end
+
+ local weaponHash = joaat(weaponData.weapon)
+
+ for index, component in ipairs(weaponComponents) do
+ local componentConfig = ESX.GetWeaponComponent(weaponData.weapon, component.name)
+ if componentConfig then
+ local isOwned = HasPedGotWeaponComponent(playerPed, weaponHash, componentConfig.hash)
+ local componentLabel = isOwned and ("%s: Owned"):format(componentConfig.label) or
+ (component.price and component.price > 0 and ("%s: $%s"):format(componentConfig.label, ESX.Math.GroupDigits(component.price)) or
+ ("%s: Free"):format(componentConfig.label))
+
+ componentList[#componentList + 1] = {
+ label = componentLabel,
+ hasComponent = isOwned,
+ weaponName = weaponData.weapon,
+ componentName = component.name,
+ componentIndex = index,
+ price = component.price
+ }
+ end
+ end
+
+ return componentList
+end
+
+--- Opens the weapon component purchase menu
+--- @param componentList table List of components available for purchase
+local function openComponentPurchaseMenu(componentList)
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'compoenntlist', {
+ title = 'Components',
+ align = 'right',
+ elements = componentList
+ }, function(data, menu)
+ if data.current.hasComponent then
+ ESX.ShowNotification(TranslateCap('already_owned_component'))
+ else
+ local purchased, purchaseResponse = ESX.AwaitServerCallback('esx_policejob:buyWeaponOrComponent',
+ data.current.weaponName, 'component', data.current.componentIndex)
+
+ if not purchased and purchaseResponse then
+ ESX.ShowNotification(TranslateCap(purchaseResponse))
+ elseif purchased then
+ ESX.ShowNotification(TranslateCap('bought_component', data.current.label, data.current.weaponName,
+ data.current.price))
+ end
+
+ menu.close()
+ end
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+local function openWeaponPurchaseMenu()
+ local playerPed = ESX.PlayerData.ped
+ local elements = getWeaponList()
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'weaponPurchaseMenu', {
+ title = TranslateCap('buy_weapons'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ if data.current.hasWeapon then
+ local componentList = getWeaponComponentList(playerPed, data.current.weaponData)
+ if next(componentList) then
+ openComponentPurchaseMenu(componentList)
+ end
+ else
+ local purchased, purchaseResponse = ESX.AwaitServerCallback('esx_policejob:buyWeaponOrComponent',
+ data.current.value, 'weapon', 1)
+
+ if not purchased and purchaseResponse then
+ ESX.ShowNotification(TranslateCap(purchaseResponse))
+ else
+ ESX.ShowNotification(TranslateCap("bought_weapon", data.current.label, data.current.price))
+ Wait(1000)
+ openWeaponPurchaseMenu()
+ end
+ end
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+---@param armoryType 'items' | 'weapons'
+local function openPutStockMenu(armoryType)
+ local playerInventory = ESX.AwaitServerCallback('esx_policejob:getPlayerInventory', armoryType)
+ local elements = {}
+
+ if playerInventory then
+ for itemName, itemData in pairs(playerInventory) do
+ elements[#elements + 1] = {
+ label = armoryType == 'weapons' and ("%s"):format(ESX.GetWeaponLabel(itemName)) or
+ ("x%s %s"):format(itemData.count, itemData.label),
+ value = itemName,
+ count = itemData.count
+ }
+ end
+ end
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'putStockMenu', {
+ title = TranslateCap('deposit_item'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ local itemCount = 1
+
+ if armoryType == 'items' and data.current.count > 1 then
+ itemCount = openAmountDialog()
+
+ if not itemCount or itemCount <= 0 then
+ return ESX.ShowNotification(TranslateCap('invalid_amount'))
+ end
+ end
+
+ local deposited, itemCountIssue = ESX.AwaitServerCallback('esx_policejob:putArmoryItem', armoryType,
+ data.current.value, itemCount)
+
+ if not deposited and itemCountIssue then
+ ESX.ShowNotification(TranslateCap('not_enough_items_player'))
+ end
+
+ openPutStockMenu(armoryType)
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+---@param armoryType 'items' | 'weapons'
+local function openGetStockMenu(armoryType)
+ local armoryItems = ESX.AwaitServerCallback('esx_policejob:getArmory', armoryType)
+ local elements = {}
+
+ for _, item in ipairs(armoryItems) do
+ if item.count > 0 then
+ elements[#elements + 1] = {
+ label = ("x%s %s"):format(item.count, item.label),
+ value = item.name,
+ count = item.count
+ }
+ end
+ end
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'getStockMenu', {
+ title = TranslateCap('withdraw_item'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ local itemCount = 1
+
+ if armoryType == 'items' and data.current.count > 1 then
+ itemCount = openAmountDialog()
+
+ if not itemCount or itemCount <= 0 then
+ return ESX.ShowNotification(TranslateCap('invalid_amount'))
+ end
+ end
+
+ local withdrawn, withdrawErrorText = ESX.AwaitServerCallback('esx_policejob:getArmoryItem', armoryType,
+ data.current.value, itemCount)
+
+ if not withdrawn then
+ ESX.ShowNotification(TranslateCap(withdrawErrorText))
+ end
+
+ openGetStockMenu(armoryType)
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+local function openArmoryMenu()
+ if not isInService() then
+ return ESX.ShowNotification(TranslateCap("not_in_service"))
+ end
+
+ local elements = {}
+
+ if Config.OxInventory then -- If ox_inventory is present, we just keep one item in the elements list and make it open the shared stash
+ elements[#elements + 1] = { label = TranslateCap('withdraw_item'), value = 'open_ox_stash' }
+ else
+ elements[#elements + 1] = { label = TranslateCap('buy_weapons'), value = 'buy_weapons' }
+ elements[#elements + 1] = { label = TranslateCap('withdraw_item'), value = 'get_stock', armoryType = 'items' }
+ elements[#elements + 1] = { label = TranslateCap('deposit_item'), value = 'put_stock', armoryType = 'items' }
+ elements[#elements + 1] = { label = TranslateCap('withdraw_weapon'), value = 'get_weapon', armoryType = 'weapons' }
+ elements[#elements + 1] = { label = TranslateCap('deposit_weapon'), value = 'put_weapon', armoryType = 'weapons' }
+ end
+
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'armoryMenu', {
+ title = TranslateCap('armory'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ if data.current.value == 'buy_weapons' then
+ openWeaponPurchaseMenu()
+ elseif data.current.value == 'put_stock' or data.current.value == 'put_weapon' then
+ openPutStockMenu(data.current.armoryType)
+ elseif data.current.value == 'get_stock' or data.current.value == 'get_weapon' then
+ openGetStockMenu(data.current.armoryType)
+ elseif data.current.value == 'open_ox_stash' then
+ exports.ox_inventory:openInventory('stash', { id = 'society_police', owner = currentStation })
+ end
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+CreateThread(function()
+ for stationName, stationData in pairs(Config.PoliceStations) do
+ local armories = stationData.armories
+
+ for _, armoryZone in ipairs(armories) do
+ armoryPoints[#armoryPoints + 1] = zoneModule.createZonePoint({
+ zoneId = 'armory',
+ coords = armoryZone.coords,
+ distance = 2.0,
+ textUILocale = 'press_to_open_armory',
+ marker = armoryZone.marker,
+ enterSound = { 'SELECT', 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
+ onEnter = function()
+ currentStation = stationName
+ end
+ })
+ end
+ end
+
+ ESX.RegisterInteraction('armoryPoliceInteraction', openArmoryMenu, function()
+ return zoneModule.isInZone('armory')
+ end)
+end)
diff --git a/client/bossActions.lua b/client/bossActions.lua
new file mode 100644
index 0000000..08f7e9c
--- /dev/null
+++ b/client/bossActions.lua
@@ -0,0 +1,35 @@
+local zoneModule = require('client.modules.zoneUtils')
+local bossActionsPoints = {}
+
+local function openBossActions()
+ if not isInService() then
+ return ESX.ShowNotification(TranslateCap("not_in_service"))
+ end
+
+ TriggerEvent('esx_society:openBossMenu', 'police')
+end
+
+CreateThread(function()
+ for stationName, stationData in pairs(Config.PoliceStations) do
+ local bossActions = stationData.bossActions
+
+ for _, bossActionsZone in ipairs(bossActions) do
+ local markerSettings = bossActionsZone.marker
+ bossActionsPoints[#bossActionsPoints + 1] = zoneModule.createZonePoint({
+ zoneId = 'bossActions',
+ coords = bossActionsZone.coords,
+ distance = 2.0,
+ textUILocale = 'press_to_open_bossactions',
+ canEnter = function()
+ return bossActionsZone.allowedGrades and bossActionsZone.allowedGrades[ESX.PlayerData.job.grade_name]
+ end,
+ marker = markerSettings,
+ enterSound = { 'SELECT', 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
+ })
+ end
+ end
+
+ ESX.RegisterInteraction('bossActionsPoliceInteraction', openBossActions, function()
+ return zoneModule.isInZone('bossActions')
+ end)
+end)
\ No newline at end of file
diff --git a/client/callButtons.lua b/client/callButtons.lua
new file mode 100644
index 0000000..c0241b8
--- /dev/null
+++ b/client/callButtons.lua
@@ -0,0 +1,32 @@
+local zoneModule = require('client.modules.zoneUtils')
+
+local currentStation = nil
+
+local function callForHelp()
+ TriggerServerEvent('esx_policejob:callForHelp', currentStation or "")
+end
+
+CreateThread(function()
+ for stationName, stationData in pairs(Config.PoliceStations) do
+ local callButtons = stationData.callButtons
+
+ for _, callButtonZone in ipairs(callButtons) do
+ zoneModule.createZonePoint({
+ zoneId = 'callButton',
+ coords = callButtonZone.coords,
+ distance = 2.0,
+ textUILocale = 'press_to_request_officer',
+ marker = callButtonZone.marker,
+ enterSound = { 'SELECT', 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
+ onEnter = function()
+ currentStation = stationName
+ end
+ })
+
+ end
+ end
+
+ ESX.RegisterInteraction('callButtonPoliceInteraction', callForHelp, function()
+ return zoneModule.isInZone('callButton')
+ end)
+end)
diff --git a/client/cloakrooms.lua b/client/cloakrooms.lua
new file mode 100644
index 0000000..7daf618
--- /dev/null
+++ b/client/cloakrooms.lua
@@ -0,0 +1,162 @@
+local zoneModule = require('client.modules.zoneUtils')
+local cloakroomPoints, inCloakroomZone = {}, false
+
+---@param toggle boolean Whether or not player should neter service
+local function toggleService(toggle)
+ local inServiceServer = isInService()
+
+ if toggle then
+ if not inServiceServer then
+ local canTakeService, maxInService, inServiceCount = ESX.AwaitServerCallback('esx_service:enableService', 'police')
+ if not canTakeService then
+ ESX.ShowNotification(TranslateCap('service_max', inServiceCount, maxInService))
+ return false
+ end
+ TriggerServerEvent('esx_policejob:toggledService', true)
+ ESX.ShowNotification(TranslateCap('service_enterred'))
+ end
+
+ return true
+ elseif not toggle and inServiceServer then
+ TriggerServerEvent('esx_policejob:toggledService', false)
+ ESX.ShowNotification(TranslateCap('service_left'))
+ end
+end
+
+local function loadCitizenWear()
+ local playerSkin = ESX.AwaitServerCallback('esx_skin:getPlayerSkin')
+
+ if Config.EnableCustomPeds then
+ -- loadDefaultModel changes player's ped handle through SetPlayerModel, which is why we can use ESX.Await to make sure we use LoadSkin once the loadDefaultModel "finished" it's work
+ local oldPed = ESX.PlayerData.ped
+ TriggerEvent('skinchanger:loadDefaultModel', playerSkin.sex == 0)
+
+ ESX.Await(function()
+ return oldPed ~= ESX.PlayerData.ped
+ end)
+ end
+
+ exports.skinchanger:LoadSkin(playerSkin)
+
+ if Config.EnabledModules.esxService then
+ toggleService(false)
+ end
+end
+
+local function loadPoliceWear(uniform)
+ local playerSkin = exports.skinchanger:GetSkin()
+ local uniformObject = Config.PoliceOutfits[uniform][(playerSkin.sex == 0) and 'male' or 'female']
+
+ if not uniformObject then
+ ESX.ShowNotification(TranslateCap('no_outfit_for_grade'))
+ return
+ end
+
+ if Config.EnabledModules.esxService then
+ local enterred = toggleService(true)
+
+ if not enterred then
+ print('Something went wrong when enterring service, can not set police clothes.')
+ return
+ end
+ end
+
+ exports.skinchanger:LoadClothes(playerSkin, uniformObject)
+
+ if uniform == 'bullet_wear' then
+ SetPedArmour(ESX.PlayerData.ped, 100)
+ end
+end
+
+---@param modelHash number The model has to set the player.
+local function loadCustomPed(modelHash)
+ if Config.EnabledModules.esxService then
+ local enterred = toggleService(true)
+
+ if not enterred then
+ print('Something went wrong when enterring service, can not set police clothes.')
+ return
+ end
+ end
+
+ ESX.Streaming.RequestModel(modelHash)
+
+ SetPlayerModel(ESX.playerId, modelHash)
+ SetModelAsNoLongerNeeded(modelHash)
+ Wait(0)
+ SetPedDefaultComponentVariation(ESX.PlayerData.ped)
+end
+
+local function openCloakroomMenu()
+ local grade = ESX.PlayerData.job.grade_name
+ local elements = {
+ { label = TranslateCap('civilian_clothes'), value = 'citizen_wear' },
+ { label = TranslateCap('police_unfirom'), value = 'police_wear', uniform = grade },
+ { label = TranslateCap('bulletproof_vest'), value = 'police_wear', uniform = 'bullet_wear' },
+ { label = TranslateCap('reflective_jacket'), value = 'police_wear', uniform = 'gilet_wear' }
+ }
+
+ if Config.EnableCustomPeds then
+ local customPeds = Config.CustomPeds
+
+ for _, customPed in ipairs(customPeds.shared) do
+ elements[#elements + 1] = {
+ label = customPed.label,
+ value = 'customPed',
+ maleModel = customPed.maleModel,
+ femaleModel = customPed.femaleModel
+ }
+ end
+
+ if customPeds[grade] then
+ for _, customGradePed in ipairs(customPeds[grade]) do
+ elements[#elements + 1] = {
+ label = customGradePed.label,
+ value = 'customPed',
+ maleModel = customGradePed.maleModel,
+ femaleModel = customGradePed.femaleModel
+ }
+ end
+ end
+ end
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'cloakroom_menu',
+ {
+ title = TranslateCap('cloakroom'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ if data.current.value == 'citizen_wear' then
+ loadCitizenWear()
+ elseif data.current.value == 'police_wear' then
+ loadPoliceWear(data.current.uniform)
+ elseif data.current.value == 'customPed' then
+ local playerSkin = ESX.AwaitServerCallback('esx_skin:getPlayerSkin')
+ loadCustomPed(joaat((playerSkin.sex == 0) and data.current.maleModel or data.current.femaleModel))
+ end
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+CreateThread(function()
+ for stationName, stationData in pairs(Config.PoliceStations) do
+ local cloakrooms = stationData.cloakrooms
+
+ for _, cloakroomZone in ipairs(cloakrooms) do
+ cloakroomPoints[#cloakroomPoints+1] = zoneModule.createZonePoint({
+ zoneId = 'cloakroom',
+ coords = cloakroomZone.coords,
+ distance = 2.0,
+ textUILocale = 'press_to_open_cloakroom',
+ marker = cloakroomZone.marker,
+ enterSound = { 'SELECT', 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
+ })
+
+ end
+ end
+
+ ESX.RegisterInteraction('cloakroomPoliceInteraction', openCloakroomMenu, function()
+ return zoneModule.isInZone('cloakroom')
+ end)
+end)
diff --git a/client/fines.lua b/client/fines.lua
new file mode 100644
index 0000000..f69d5fa
--- /dev/null
+++ b/client/fines.lua
@@ -0,0 +1,106 @@
+---@class FineCategory
+---@field label string
+---@field value integer
+
+---@class Fine
+---@field id integer
+---@field amount number
+---@field label string
+
+---@type FineCategory[]
+local fineCategories = {
+ { label = TranslateCap('traffic_offense'), value = 0 },
+ { label = TranslateCap('minor_offense'), value = 1 },
+ { label = TranslateCap('average_offense'), value = 2 },
+ { label = TranslateCap('major_offense'), value = 3 },
+ { label = TranslateCap('custom_offense'), value = -1 }
+}
+
+---@type table Cache of fines by category
+local cachedFines = {}
+
+--- Asks the user to enter a fine amount and reason.
+--- @return string|nil fineReason The fine reason, or nil if the input was invalid
+--- @return number|nil fineAmount The fine amount, or nil if the input was invalid
+local function getFineDetails()
+ local fineAmount = openAmountDialog(TranslateCap('fine_enter_amount'))
+ local fineReason = promise:new()
+
+ ESX.UI.Menu.Open('dialog', ESX.currentResourceName, 'police_fineReason', {
+ title = TranslateCap('fine_enter_text')
+ }, function(data, menu)
+ fineReason:resolve(data.value)
+ menu.close()
+ end, function(_, menu)
+ menu.close()
+ end)
+
+ return Citizen.Await(fineReason), fineAmount
+end
+
+--- Opens the fines menu for a specific category and sends the fine to the target player
+--- @param category number The category of fines to display
+--- @param targetPlayer number The player's server ID to apply the fine to
+local function openFinesByCategory(category, targetPlayer)
+ if not cachedFines[category] then
+ cachedFines[category] = ESX.AwaitServerCallback('esx_policejob:getFinesFromCategory', category)
+ end
+
+ local elements = {}
+
+ for _, fine in ipairs(cachedFines[category]) do
+ elements[#elements + 1] = {
+ label = ("%s - $%s"):format(fine.label, ESX.Math.GroupDigits(fine.amount)),
+ value = fine.id,
+ fineAmount = fine.amount,
+ fineLabel = fine.label,
+ }
+ end
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'finesCategoryMenu', {
+ title = TranslateCap('fine'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ TriggerServerEvent('esx_billing:sendBill', targetPlayer, 'society_police', data.current.fineLabel or 'Fine', data.current.fineAmount)
+ ESX.ShowNotification(TranslateCap('issued_fine', data. current.fineLabel or 'Fine', data.current.fineAmount))
+ end, function(_, menu)
+ menu.close()
+ end)
+end
+
+--- Opens the custom fine input menu, allowing the police man to input a reason and amount.
+--- @param targetPlayer number The player's server ID to apply the custom fine to
+local function openCustomFineMenu(targetPlayer)
+ local fineReason, fineAmount = getFineDetails()
+
+ if not fineReason or fineReason == '' then
+ return ESX.ShowNotification(TranslateCap('invalid_reason'))
+ end
+
+ if not fineAmount or fineAmount < 1 then
+ return ESX.ShowNotification(TranslateCap('invalid_amount'))
+ end
+
+ TriggerServerEvent('esx_billing:sendBill', targetPlayer, 'society_police', fineReason, fineAmount)
+ ESX.ShowNotification(TranslateCap('issued_fine', fineReason, fineAmount))
+end
+
+--- Main function to open the fine menu for a specific target player.
+--- @param targetPlayer number The player's server ID to apply the fine to
+function openFineMenu(targetPlayer)
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'finesCategoryMenu', {
+ title = TranslateCap('fine'),
+ align = 'right',
+ elements = fineCategories
+ }, function(data, menu)
+ if data.current.value == -1 then
+ openCustomFineMenu(targetPlayer)
+ else
+ menu.close()
+ openFinesByCategory(data.current.value, targetPlayer)
+ end
+ end, function(_, menu)
+ menu.close()
+ end)
+end
\ No newline at end of file
diff --git a/client/garages.lua b/client/garages.lua
new file mode 100644
index 0000000..ccdfb3e
--- /dev/null
+++ b/client/garages.lua
@@ -0,0 +1,28 @@
+local zoneModule = require('client.modules.zoneUtils')
+local garagePoints, currentVehicleType = {}, nil
+
+CreateThread(function()
+ for stationName, stationData in pairs(Config.PoliceStations) do
+ local garages = stationData.garages
+
+ for _, garageZone in ipairs(garages) do
+ garagePoints[#garagePoints + 1] = zoneModule.createZonePoint({
+ zoneId = 'garage',
+ coords = garageZone.coords,
+ distance = 2.0,
+ textUILocale = 'press_to_open_garage',
+ marker = garageZone.marker,
+ enterSound = { 'SELECT', 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
+ onEnter = function()
+ -- maybe useful for esx_garage implementation?
+ currentVehicleType = garageZone.vehicleType
+ end
+ })
+ end
+ end
+
+ --- Will be handled by esx_garage
+ --ESX.RegisterInteraction('cloakroomPoliceInteraction', openGarageMenu, function()
+ -- return zoneModule.isInZone('garage')
+ --end)
+end)
\ No newline at end of file
diff --git a/client/main.lua b/client/main.lua
index 7266fc9..b439cda 100644
--- a/client/main.lua
+++ b/client/main.lua
@@ -1,1548 +1,56 @@
-local CurrentActionData, handcuffTimer, dragStatus, blipsCops, currentTask = {}, {}, {}, {}, {}
-local HasAlreadyEnteredMarker, isDead, isHandcuffed, hasAlreadyJoined, playerInService = false, false, false, false, false
-local LastStation, LastPart, LastPartNum, LastEntity, CurrentAction, CurrentActionMsg
-dragStatus.isDragged, isInShopMenu = false, false
-
-function cleanPlayer(playerPed)
- SetPedArmour(playerPed, 0)
- ClearPedBloodDamage(playerPed)
- ResetPedVisibleDamage(playerPed)
- ClearPedLastWeaponDamage(playerPed)
- ResetPedMovementClipset(playerPed, 0)
-end
-
-function setUniform(uniform, playerPed)
- TriggerEvent('skinchanger:getSkin', function(skin)
- local uniformObject
-
- sex = (skin.sex == 0) and "male" or "female"
-
- uniformObject = Config.Uniforms[uniform][sex]
-
- if uniformObject then
- TriggerEvent('skinchanger:loadClothes', skin, uniformObject)
-
- if uniform == 'bullet_wear' then
- SetPedArmour(playerPed, 100)
- end
- else
- ESX.ShowNotification(TranslateCap('no_outfit'))
- end
- end)
-end
-
-function OpenCloakroomMenu()
- local playerPed = PlayerPedId()
- local grade = ESX.PlayerData.job.grade_name
-
- local elements = {
- {unselectable = true, icon = "fas fa-shirt", title = TranslateCap("cloakroom")},
- {icon = "fas fa-shirt", title = TranslateCap('citizen_wear'), value = 'citizen_wear'},
- {icon = "fas fa-shirt", title = TranslateCap('bullet_wear'), uniform = 'bullet_wear'},
- {icon = "fas fa-shirt", title = TranslateCap('gilet_wear'), uniform = 'gilet_wear'},
- {icon = "fas fa-shirt", title = TranslateCap('police_wear'), uniform = grade}
- }
-
- if Config.EnableCustomPeds then
- for k,v in ipairs(Config.CustomPeds.shared) do
- elements[#elements+1] = {
- icon = "fas fa-shirt",
- title = v.label,
- value = 'freemode_ped',
- maleModel = v.maleModel,
- femaleModel = v.femaleModel
- }
- end
-
- for k,v in ipairs(Config.CustomPeds[grade]) do
- elements[#elements+1] = {
- icon = "fas fa-shirt",
- title = v.label,
- value = 'freemode_ped',
- maleModel = v.maleModel,
- femaleModel = v.femaleModel
- }
- end
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- cleanPlayer(playerPed)
- local data = {current = element}
-
- if data.current.value == 'citizen_wear' then
- if Config.EnableCustomPeds then
- ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)
- local isMale = skin.sex == 0
-
- TriggerEvent('skinchanger:loadDefaultModel', isMale, function()
- ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin)
- TriggerEvent('skinchanger:loadSkin', skin)
- TriggerEvent('esx:restoreLoadout')
- end)
- end)
-
- end)
- else
- ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin)
- TriggerEvent('skinchanger:loadSkin', skin)
- end)
- end
-
- if Config.EnableESXService then
- ESX.TriggerServerCallback('esx_service:isInService', function(isInService)
- if isInService then
- playerInService = false
-
- local notification = {
- title = TranslateCap('service_anonunce'),
- subject = '',
- msg = TranslateCap('service_out_announce', GetPlayerName(PlayerId())),
- iconType = 1
- }
-
- TriggerServerEvent('esx_service:notifyAllInService', notification, 'police')
-
- TriggerServerEvent('esx_service:disableService', 'police')
- ESX.ShowNotification(TranslateCap('service_out'))
- end
- end, 'police')
- end
- end
-
- if Config.EnableESXService and data.current.value ~= 'citizen_wear' then
- local awaitService
-
- ESX.TriggerServerCallback('esx_service:isInService', function(isInService)
- if not isInService then
-
- if Config.MaxInService ~= -1 then
- ESX.TriggerServerCallback('esx_service:enableService', function(canTakeService, maxInService, inServiceCount)
- if not canTakeService then
- ESX.ShowNotification(TranslateCap('service_max', inServiceCount, maxInService))
- else
- awaitService = true
- playerInService = true
-
- local notification = {
- title = TranslateCap('service_anonunce'),
- subject = '',
- msg = TranslateCap('service_in_announce', GetPlayerName(PlayerId())),
- iconType = 1
- }
-
- TriggerServerEvent('esx_service:notifyAllInService', notification, 'police')
- ESX.ShowNotification(TranslateCap('service_in'))
- end
- end, 'police')
- else
- awaitService = true
- playerInService = true
-
- local notification = {
- title = TranslateCap('service_anonunce'),
- subject = '',
- msg = TranslateCap('service_in_announce', GetPlayerName(PlayerId())),
- iconType = 1
- }
-
- TriggerServerEvent('esx_service:notifyAllInService', notification, 'police')
- ESX.ShowNotification(TranslateCap('service_in'))
- end
-
- else
- awaitService = true
- end
- end, 'police')
-
- while awaitService == nil do
- Wait(0)
- end
-
- -- if we couldn't enter service don't let the player get changed
- if not awaitService then
- return
- end
- end
-
- if data.current.uniform then
- setUniform(data.current.uniform, playerPed)
- elseif data.current.value == 'freemode_ped' then
- local modelHash
-
- ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)
- if skin.sex == 0 then
- modelHash = joaat(data.current.maleModel)
- else
- modelHash = joaat(data.current.femaleModel)
- end
-
- ESX.Streaming.RequestModel(modelHash, function()
- SetPlayerModel(PlayerId(), modelHash)
- SetModelAsNoLongerNeeded(modelHash)
- SetPedDefaultComponentVariation(PlayerPedId())
-
- TriggerEvent('esx:restoreLoadout')
- end)
- end)
- end
- end, function(menu)
- CurrentAction = 'menu_cloakroom'
- CurrentActionMsg = TranslateCap('open_cloackroom')
- CurrentActionData = {}
- end)
-end
-
-function OpenArmoryMenu(station)
- local elements
- if Config.OxInventory then
- exports.ox_inventory:openInventory('stash', {id = 'society_police', owner = station})
- return ESX.CloseContext()
- else
- elements = {
- {unselectable = true, icon = "fas fa-gun", title = TranslateCap('armory')},
- {icon = "fas fa-gun", title = TranslateCap('buy_weapons'), value = 'buy_weapons'}
-
- }
-
- if Config.EnableArmoryManagement then
- table.insert(elements, {icon = "fas fa-gun", title = TranslateCap('get_weapon'), value = 'get_weapon'})
- table.insert(elements, {icon = "fas fa-gun", title = TranslateCap('put_weapon'), value = 'put_weapon'})
- table.insert(elements, {icon = "fas fa-box", title = TranslateCap('remove_object'), value = 'get_stock'})
- table.insert(elements, {icon = "fas fa-box", title = TranslateCap('deposit_object'), value = 'put_stock'})
- end
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- if data.current.value == 'get_weapon' then
- OpenGetWeaponMenu()
- elseif data.current.value == 'put_weapon' then
- OpenPutWeaponMenu()
- elseif data.current.value == 'buy_weapons' then
- OpenBuyWeaponsMenu()
- elseif data.current.value == 'put_stock' then
- OpenPutStocksMenu()
- elseif data.current.value == 'get_stock' then
- OpenGetStocksMenu()
- end
- end, function(menu)
- CurrentAction = 'menu_armory'
- CurrentActionMsg = TranslateCap('open_armory')
- CurrentActionData = {station = station}
- end)
-end
-
-function OpenPoliceActionsMenu()
- local elements = {
- {unselectable = true, icon = "fas fa-police", title = TranslateCap('menu_title')},
- {icon = "fas fa-user", title = TranslateCap('citizen_interaction'), value = 'citizen_interaction'},
- {icon = "fas fa-car", title = TranslateCap('vehicle_interaction'), value = 'vehicle_interaction'},
- {icon = "fas fa-object", title = TranslateCap('object_spawner'), value = 'object_spawner'}
- }
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
-
- if data.current.value == 'citizen_interaction' then
- local elements2 = {
- {unselectable = true, icon = "fas fa-user", title = element.title},
- {icon = "fas fa-idkyet", title = TranslateCap('id_card'), value = 'identity_card'},
- {icon = "fas fa-idkyet", title = TranslateCap('search'), value = 'search'},
- {icon = "fas fa-idkyet", title = TranslateCap('handcuff'), value = 'handcuff'},
- {icon = "fas fa-idkyet", title = TranslateCap('drag'), value = 'drag'},
- {icon = "fas fa-idkyet", title = TranslateCap('put_in_vehicle'), value = 'put_in_vehicle'},
- {icon = "fas fa-idkyet", title = TranslateCap('out_the_vehicle'), value = 'out_the_vehicle'},
- {icon = "fas fa-idkyet", title = TranslateCap('fine'), value = 'fine'},
- {icon = "fas fa-idkyet", title = TranslateCap('unpaid_bills'), value = 'unpaid_bills'}
- }
-
- if Config.EnableLicenses then
- elements2[#elements2+1] = {
- icon = "fas fa-scroll",
- title = TranslateCap('license_check'),
- value = 'license'
- }
- end
-
- ESX.OpenContext("right", elements2, function(menu2,element2)
- local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
- if closestPlayer ~= -1 and closestDistance <= 3.0 then
- local data2 = {current = element2}
- local action = data2.current.value
-
- if action == 'identity_card' then
- OpenIdentityCardMenu(closestPlayer)
- elseif action == 'search' then
- OpenBodySearchMenu(closestPlayer)
- elseif action == 'handcuff' then
- TriggerServerEvent('esx_policejob:handcuff', GetPlayerServerId(closestPlayer))
- elseif action == 'drag' then
- TriggerServerEvent('esx_policejob:drag', GetPlayerServerId(closestPlayer))
- elseif action == 'put_in_vehicle' then
- TriggerServerEvent('esx_policejob:putInVehicle', GetPlayerServerId(closestPlayer))
- elseif action == 'out_the_vehicle' then
- TriggerServerEvent('esx_policejob:OutVehicle', GetPlayerServerId(closestPlayer))
- elseif action == 'fine' then
- OpenFineMenu(closestPlayer)
- elseif action == 'license' then
- ShowPlayerLicense(closestPlayer)
- elseif action == 'unpaid_bills' then
- OpenUnpaidBillsMenu(closestPlayer)
- end
- else
- ESX.ShowNotification(TranslateCap('no_players_nearby'))
- end
- end, function(menu)
- OpenPoliceActionsMenu()
- end)
- elseif data.current.value == 'vehicle_interaction' then
- local elements3 = {
- {unselectable = true, icon = "fas fa-car", title = element.title}
- }
- local playerPed = PlayerPedId()
- local vehicle = ESX.Game.GetVehicleInDirection()
-
- if DoesEntityExist(vehicle) then
- elements3[#elements3+1] = {icon = "fas fa-car", title = TranslateCap('vehicle_info'), value = 'vehicle_infos'}
- elements3[#elements3+1] = {icon = "fas fa-car", title = TranslateCap('pick_lock'), value = 'hijack_vehicle'}
- elements3[#elements3+1] = {icon = "fas fa-car", title = TranslateCap('impound'), value = 'impound'}
- end
-
- elements3[#elements3+1] = {
- icon = "fas fa-scroll",
- title = TranslateCap('search_database'),
- value = 'search_database'
- }
-
- ESX.OpenContext("right", elements3, function(menu3,element3)
- local data2 = {current = element3}
- local coords = GetEntityCoords(playerPed)
- vehicle = ESX.Game.GetVehicleInDirection()
- action = data2.current.value
-
- if action == 'search_database' then
- LookupVehicle(element3)
- elseif DoesEntityExist(vehicle) then
- if action == 'vehicle_infos' then
- local vehicleData = ESX.Game.GetVehicleProperties(vehicle)
- OpenVehicleInfosMenu(vehicleData)
- elseif action == 'hijack_vehicle' then
- if IsAnyVehicleNearPoint(coords.x, coords.y, coords.z, 3.0) then
- TaskStartScenarioInPlace(playerPed, 'WORLD_HUMAN_WELDING', 0, true)
- Wait(20000)
- ClearPedTasksImmediately(playerPed)
-
- SetVehicleDoorsLocked(vehicle, 1)
- SetVehicleDoorsLockedForAllPlayers(vehicle, false)
- ESX.ShowNotification(TranslateCap('vehicle_unlocked'))
- end
- elseif action == 'impound' then
- if currentTask.busy then
- return
- end
-
- ESX.ShowHelpNotification(TranslateCap('impound_prompt'))
- TaskStartScenarioInPlace(playerPed, 'CODE_HUMAN_MEDIC_TEND_TO_DEAD', 0, true)
-
- currentTask.busy = true
- currentTask.task = ESX.SetTimeout(10000, function()
- ClearPedTasks(playerPed)
- ImpoundVehicle(vehicle)
- Wait(100)
- end)
-
- CreateThread(function()
- while currentTask.busy do
- Wait(1000)
-
- vehicle = GetClosestVehicle(coords.x, coords.y, coords.z, 3.0, 0, 71)
- if not DoesEntityExist(vehicle) and currentTask.busy then
- ESX.ShowNotification(TranslateCap('impound_canceled_moved'))
- ESX.ClearTimeout(currentTask.task)
- ClearPedTasks(playerPed)
- currentTask.busy = false
- break
- end
- end
- end)
- end
- else
- ESX.ShowNotification(TranslateCap('no_vehicles_nearby'))
- end
- end, function(menu)
- OpenPoliceActionsMenu()
- end)
- elseif data.current.value == "object_spawner" then
- local elements4 = {
- {unselectable = true, icon = "fas fa-object", title = element.title},
- {icon = "fas fa-cone", title = TranslateCap('cone'), model = 'prop_roadcone02a'},
- {icon = "fas fa-cone", title = TranslateCap('barrier'), model = 'prop_barrier_work05'},
- {icon = "fas fa-cone", title = TranslateCap('spikestrips'), model = 'p_ld_stinger_s'},
- {icon = "fas fa-cone", title = TranslateCap('box'), model = 'prop_boxpile_07d'},
- {icon = "fas fa-cone", title = TranslateCap('cash'), model = 'hei_prop_cash_crate_half_full'}
- }
-
- ESX.OpenContext("right", elements4, function(menu4,element4)
- local data2 = {current = element4}
- local playerPed = PlayerPedId()
- local coords, forward = GetEntityCoords(playerPed), GetEntityForwardVector(playerPed)
- local objectCoords = (coords + forward * 1.0)
-
- ESX.Game.SpawnObject(data2.current.model, objectCoords, function(obj)
- Wait(100)
- SetEntityHeading(obj, GetEntityHeading(playerPed))
- PlaceObjectOnGroundProperly(obj)
- end)
- end, function(menu)
- OpenPoliceActionsMenu()
- end)
- end
- end)
-end
-
-function OpenIdentityCardMenu(player)
- ESX.TriggerServerCallback('esx_policejob:getOtherPlayerData', function(data)
- local elements = {
- {icon = "fas fa-user", title = TranslateCap('name', data.name)},
- {icon = "fas fa-user", title = TranslateCap('job', ('%s - %s'):format(data.job, data.grade))}
- }
-
- if Config.EnableESXIdentity then
- elements[#elements+1] = {icon = "fas fa-user", title = TranslateCap('sex', TranslateCap(data.sex))}
- elements[#elements+1] = {icon = "fas fa-user", title = TranslateCap('sex', TranslateCap(data.sex))}
- elements[#elements+1] = {icon = "fas fa-user", title = TranslateCap('height', data.height)}
- end
-
- if Config.EnableESXOptionalneeds and data.drunk then
- elements[#elements+1] = {title = TranslateCap('bac', data.drunk)}
- end
-
- if data.licenses then
- elements[#elements+1] = {title = TranslateCap('license_label')}
-
- for i=1, #data.licenses, 1 do
- elements[#elements+1] = {title = data.licenses[i].label}
- end
- end
-
- ESX.OpenContext("right", elements, nil, function(menu)
- OpenPoliceActionsMenu()
- end)
- end, GetPlayerServerId(player))
-end
-
-function OpenBodySearchMenu(player)
- if Config.OxInventory then
- ESX.CloseContext()
- exports.ox_inventory:openInventory('player', GetPlayerServerId(player))
- return
- end
-
- ESX.TriggerServerCallback('esx_policejob:getOtherPlayerData', function(data)
- local elements = {
- {unselectable = true, icon = "fas fa-user", title = TranslateCap('search')}
- }
-
- for i=1, #data.accounts, 1 do
- if data.accounts[i].name == 'black_money' and data.accounts[i].money > 0 then
- elements[#elements+1] = {
- icon = "fas fa-money",
- title = TranslateCap('confiscate_dirty', ESX.Math.Round(data.accounts[i].money)),
- value = 'black_money',
- itemType = 'item_account',
- amount = data.accounts[i].money
- }
- break
- end
- end
-
- table.insert(elements, {label = TranslateCap('guns_label')})
-
- for i=1, #data.weapons, 1 do
- elements[#elements+1] = {
- icon = "fas fa-gun",
- title = TranslateCap('confiscate_weapon', ESX.GetWeaponLabel(data.weapons[i].name), data.weapons[i].ammo),
- value = data.weapons[i].name,
- itemType = 'item_weapon',
- amount = data.weapons[i].ammo
- }
- end
-
- elements[#elements+1] = {title = TranslateCap('inventory_label')}
-
- for i=1, #data.inventory, 1 do
- if data.inventory[i].count > 0 then
- elements[#elements+1] = {
- icon = "fas fa-box",
- title = TranslateCap('confiscate_inv', data.inventory[i].count, data.inventory[i].label),
- value = data.inventory[i].name,
- itemType = 'item_standard',
- amount = data.inventory[i].count
- }
- end
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- if data.current.value then
- TriggerServerEvent('esx_policejob:confiscatePlayerItem', GetPlayerServerId(player), data.current.itemType, data.current.value, data.current.amount)
- OpenBodySearchMenu(player)
- end
- end)
- end, GetPlayerServerId(player))
-end
-
-function OpenFineMenu(player)
- if Config.EnableFinePresets then
- local elements = {
- {unselectable = true, icon = "fas fa-scroll", title = TranslateCap('fine')},
- {icon = "fas fa-scroll", title = TranslateCap('traffic_offense'), value = 0},
- {icon = "fas fa-scroll", title = TranslateCap('minor_offense'), value = 1},
- {icon = "fas fa-scroll", title = TranslateCap('average_offense'), value = 2},
- {icon = "fas fa-scroll", title = TranslateCap('major_offense'), value = 3}
- }
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- OpenFineCategoryMenu(player, data.current.value)
- end)
- else
- ESX.CloseContext()
- ESX.CloseContext()
- OpenFineTextInput(player)
+local CitizenModule = require('client.modules.citizenActions')
+local VehicleModule = require('client.modules.vehicleActions')
+
+local menuElements = {
+ { label = TranslateCap('citizen_interaction'), value = 'citizenInteraction' },
+ { label = TranslateCap('vehicle_interaction'), value = 'vehicle_interaction' },
+ { label = TranslateCap('place_object'), value = 'object_spawner' }
+}
+
+local function openPoliceMenu()
+ if not ESX.PlayerData.job or ESX.PlayerData.job.name ~= 'police' then
+ return
end
-end
-
-local fineList = {}
-function OpenFineCategoryMenu(player, category)
- if not fineList[category] then
- local p = promise.new()
-
- ESX.TriggerServerCallback('esx_policejob:getFineList', function(fines)
- p:resolve(fines)
- end, category)
- fineList[category] = Citizen.Await(p)
+ if Config.EnabledModules.esxService and not isInService() then
+ return ESX.ShowNotification(TranslateCap('not_in_service'))
end
- local elements = {
- {unselectable = true, icon = "fas fa-scroll", title = TranslateCap('fine')}
- }
-
- for k,fine in ipairs(fineList[category]) do
- elements[#elements+1] = {
- icon = "fas fa-scroll",
- title = ('%s %s'):format(fine.label, TranslateCap('armory_item', ESX.Math.GroupDigits(fine.amount))),
- value = fine.id,
- amount = fine.amount,
- fineLabel = fine.label
- }
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- if Config.EnablePlayerManagement then
- TriggerServerEvent('esx_billing:sendBill', GetPlayerServerId(player), 'society_police', TranslateCap('fine_total', data.current.fineLabel), data.current.amount)
- else
- TriggerServerEvent('esx_billing:sendBill', GetPlayerServerId(player), '', TranslateCap('fine_total', data.current.fineLabel), data.current.amount)
- end
-
- ESX.SetTimeout(300, function()
- OpenFineCategoryMenu(player, category)
- end)
- end)
-end
-
-function OpenFineTextInput(player)
- Citizen.CreateThread(function()
- local amount = 0
- local reason = ''
- AddTextEntry('FMMC_KEY_TIP1', TranslateCap('fine_enter_amount'))
- Citizen.Wait(0)
- DisplayOnscreenKeyboard(1, 'FMMC_KEY_TIP1', '', '', '', '', '', 30)
- while UpdateOnscreenKeyboard() ~= 1 and UpdateOnscreenKeyboard() ~= 2 do
- Citizen.Wait(0)
- end
- if UpdateOnscreenKeyboard() ~= 2 then
- amount = tonumber(GetOnscreenKeyboardResult())
- if amount == nil or amount <= 0 then
- ESX.ShowNotification(TranslateCap('invalid_amount'))
- return
- end
- end
- AddTextEntry('FMMC_KEY_TIP1', TranslateCap('fine_enter_text'))
- Citizen.Wait(0)
- DisplayOnscreenKeyboard(1, 'FMMC_KEY_TIP1', '', '', '', '', '', 120)
- while UpdateOnscreenKeyboard() ~= 1 and UpdateOnscreenKeyboard() ~= 2 do
- Citizen.Wait(0)
- end
- if UpdateOnscreenKeyboard() ~= 2 then
- reason = GetOnscreenKeyboardResult()
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'policeMenu', {
+ title = TranslateCap('action_menu_title'),
+ align = 'right',
+ elements = menuElements
+ }, function(data, menu)
+ if data.current.value == 'citizenInteraction' then
+ CitizenModule.openCitizenInteractionMenu()
+ elseif data.current.value == 'vehicle_interaction' then
+ VehicleModule.openVehicleInteractionMenu()
end
- Citizen.Wait(500)
- TriggerServerEvent('esx_billing:sendBill', GetPlayerServerId(player), 'society_police', reason, amount)
- OpenPoliceActionsMenu()
+ --elseif data.current.value == 'object_spawner' then
+
+ --end
+ end, function(data, menu)
+ menu.close()
end)
end
-
-function LookupVehicle(elementF)
- local elements = {
- {unselectable = true, icon = "fas fa-car", title = elementF.title},
- {title = TranslateCap('search_plate'), input = true, inputType = "text", inputPlaceholder = "ABC 123"},
- {icon = "fas fa-check-double", title = TranslateCap('lookup_plate'), value = "lookup"}
- }
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {value = menu.eles[2].inputValue}
- local length = string.len(data.value)
- if not data.value or length < 2 or length > 8 then
- ESX.ShowNotification(TranslateCap('search_database_error_invalid'))
- else
- ESX.TriggerServerCallback('esx_policejob:getVehicleInfos', function(retrivedInfo)
- local elements = {
- {unselectable = true, icon = "fas fa-car", title = element.title},
- {unselectable = true, icon = "fas fa-car", title = TranslateCap('plate', retrivedInfo.plate)}
- }
-
- if not retrivedInfo.owner then
- elements[#elements+1] = {unselectable = true, icon = "fas fa-user", title = TranslateCap('owner_unknown')}
- else
- elements[#elements+1] = {unselectable = true, icon = "fas fa-user", title = TranslateCap('owner', retrivedInfo.owner)}
- end
-
- ESX.OpenContext("right", elements, nil, function(menu)
- OpenPoliceActionsMenu()
- end)
- end, data.value)
- end
- end)
-end
-
-function ShowPlayerLicense(player)
- local elements = {
- {unselectable = true, icon = "fas fa-scroll", title = TranslateCap('license_revoke')}
- }
-
- ESX.TriggerServerCallback('esx_policejob:getOtherPlayerData', function(playerData)
- if playerData.licenses then
- for i=1, #playerData.licenses, 1 do
- if playerData.licenses[i].label and playerData.licenses[i].type then
- elements[#elements+1] = {
- icon = "fas fa-scroll",
- title = playerData.licenses[i].label,
- type = playerData.licenses[i].type
- }
- end
- end
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- ESX.ShowNotification(TranslateCap('licence_you_revoked', data.current.label, playerData.name))
- TriggerServerEvent('esx_policejob:message', GetPlayerServerId(player), TranslateCap('license_revoked', data.current.label))
-
- TriggerServerEvent('esx_license:removeLicense', GetPlayerServerId(player), data.current.type)
-
- ESX.SetTimeout(300, function()
- ShowPlayerLicense(player)
- end)
- end)
- end, GetPlayerServerId(player))
-end
-
-function OpenUnpaidBillsMenu(player)
- local elements = {
- {unselectable = true, icon = "fas fa-scroll", title = TranslateCap('unpaid_bills')}
- }
-
- ESX.TriggerServerCallback('esx_billing:getTargetBills', function(bills)
- for k,bill in ipairs(bills) do
- elements[#elements+1] = {
- unselectable = true,
- icon = "fas fa-scroll",
- title = ('%s - %s'):format(bill.label, TranslateCap('armory_item', ESX.Math.GroupDigits(bill.amount))),
- billId = bill.id
- }
- end
-
- ESX.OpenContext("right", elements, nil, nil)
-
- end, GetPlayerServerId(player))
-end
-
-function OpenVehicleInfosMenu(vehicleData)
- ESX.TriggerServerCallback('esx_policejob:getVehicleInfos', function(retrivedInfo)
- local elements = {
- {unselectable = true, icon = "fas fa-car", title = TranslateCap('vehicle_info')},
- {icon = "fas fa-car", title = TranslateCap('plate', retrivedInfo.plate)}
-
- }
-
- if not retrivedInfo.owner then
- elements[#elements+1] = {unselectable = true, icon = "fas fa-user", title = TranslateCap('owner_unknown')}
- else
- elements[#elements+1] = {unselectable = true, icon = "fas fa-user", title = TranslateCap('owner', retrivedInfo.owner)}
- end
-
- ESX.OpenContext("right", elements, nil, nil)
- end, vehicleData.plate)
-end
-
-function OpenGetWeaponMenu()
- ESX.TriggerServerCallback('esx_policejob:getArmoryWeapons', function(weapons)
- local elements = {
- {unselectable = true, icon = "fas fa-gun", title = TranslateCap('get_weapon_menu')}
- }
-
- for i=1, #weapons, 1 do
- if weapons[i].count > 0 then
- elements[#elements+1] = {
- icon = "fas fa-gun",
- title = 'x' .. weapons[i].count .. ' ' .. ESX.GetWeaponLabel(weapons[i].name),
- value = weapons[i].name
- }
- end
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- ESX.TriggerServerCallback('esx_policejob:removeArmoryWeapon', function()
- ESX.CloseContext()
- OpenGetWeaponMenu()
- end, data.current.value)
- end)
- end)
-end
-
-function OpenPutWeaponMenu()
- local elements = {
- {unselectable = true, icon = "fas fa-gun", title = TranslateCap('put_weapon_menu')}
- }
- local playerPed = PlayerPedId()
- local weaponList = ESX.GetWeaponList()
-
- for i=1, #weaponList, 1 do
- local weaponHash = joaat(weaponList[i].name)
-
- if HasPedGotWeapon(playerPed, weaponHash, false) and weaponList[i].name ~= 'WEAPON_UNARMED' then
- elements[#elements+1] = {
- icon = "fas fa-gun",
- title = weaponList[i].label,
- value = weaponList[i].name
- }
- end
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- ESX.TriggerServerCallback('esx_policejob:addArmoryWeapon', function()
- ESX.CloseContext()
- OpenPutWeaponMenu()
- end, data.current.value, true)
- end)
-end
-
-function OpenBuyWeaponsMenu()
- local elements = {
- {unselectable = true, icon = "fas fa-gun", title = TranslateCap('armory_weapontitle')}
- }
- local playerPed = PlayerPedId()
-
- for k,v in ipairs(Config.AuthorizedWeapons[ESX.PlayerData.job.grade_name]) do
- local weaponNum, weapon = ESX.GetWeapon(v.weapon)
- local components, label = {}
- local hasWeapon = HasPedGotWeapon(playerPed, joaat(v.weapon), false)
-
- if v.components then
- for i=1, #v.components do
- if v.components[i] then
- local component = weapon.components[i]
- local hasComponent = HasPedGotWeaponComponent(playerPed, joaat(v.weapon), component.hash)
-
- if hasComponent then
- label = ('%s: %s'):format(component.label, TranslateCap('armory_owned'))
- else
- if v.components[i] > 0 then
- label = ('%s: %s'):format(component.label, TranslateCap('armory_item', ESX.Math.GroupDigits(v.components[i])))
- else
- label = ('%s: %s'):format(component.label, TranslateCap('armory_free'))
- end
- end
-
- components[#components+1] = {
- icon = "fas fa-gun",
- title = label,
- componentLabel = component.label,
- hash = component.hash,
- name = component.name,
- price = v.components[i],
- hasComponent = hasComponent,
- componentNum = i
- }
- end
- end
- end
-
- if hasWeapon and v.components then
- label = ('%s: >'):format(weapon.label)
- elseif hasWeapon and not v.components then
- label = ('%s: %s'):format(weapon.label, TranslateCap('armory_owned'))
- else
- if v.price > 0 then
- label = ('%s: %s'):format(weapon.label, TranslateCap('armory_item', ESX.Math.GroupDigits(v.price)))
- else
- label = ('%s: %s'):format(weapon.label, TranslateCap('armory_free'))
- end
- end
-
- elements[#elements+1] = {
- icon = "fas fa-gun",
- title = label,
- weaponLabel = weapon.label,
- name = weapon.name,
- components = components,
- price = v.price,
- hasWeapon = hasWeapon
- }
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- if data.current.hasWeapon then
- if #data.current.components > 0 then
- OpenWeaponComponentShop(data.current.components, data.current.name, menu)
- end
- else
- ESX.TriggerServerCallback('esx_policejob:buyWeapon', function(bought)
- if bought then
- if data.current.price > 0 then
- ESX.ShowNotification(TranslateCap('armory_bought', data.current.weaponLabel, ESX.Math.GroupDigits(data.current.price)))
- end
-
- ESX.CloseContext()
- OpenBuyWeaponsMenu()
- else
- ESX.ShowNotification(TranslateCap('armory_money'))
- end
- end, data.current.name, 1)
- end
- end)
-end
-
-function OpenWeaponComponentShop(components, weaponName, parentShop)
-
- ESX.OpenContext("right", components, function(menu,element)
- local data = {current = element}
- if data.current.hasComponent then
- ESX.ShowNotification(TranslateCap('armory_hascomponent'))
- else
- ESX.TriggerServerCallback('esx_policejob:buyWeapon', function(bought)
- if bought then
- if data.current.price > 0 then
- ESX.ShowNotification(TranslateCap('armory_bought', data.current.componentLabel, ESX.Math.GroupDigits(data.current.price)))
- end
-
- ESX.CloseContext()
- parentShop.close()
- OpenBuyWeaponsMenu()
- else
- ESX.ShowNotification(TranslateCap('armory_money'))
- end
- end, weaponName, 2, data.current.componentNum)
- end
- end)
-end
-
-function OpenGetStocksMenu()
- ESX.TriggerServerCallback('esx_policejob:getStockItems', function(items)
- local elements = {
- {unselectable = true, icon = "fas fa-box", title = TranslateCap('police_stock')}
- }
-
- for i=1, #items, 1 do
- elements[#elements+1] = {
- icon = "fas fa-box",
- title = 'x' .. items[i].count .. ' ' .. items[i].label,
- value = items[i].name
- }
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- local itemName = data.current.value
-
- local elements2 = {
- {unselectable = true, icon = "fas fa-box", title = element.title},
- {title = TranslateCap('quantity'), input = true, inputType = "number", inputMin = 1, inputMax = 150, inputPlaceholder = TranslateCap('quantity_placeholder')},
- {icon = "fas fa-check-double", title = TranslateCap('confirm'), value = "confirm"}
- }
-
- ESX.OpenContext("right", elements2, function(menu2,element2)
- local data2 = {value = menu2.eles[2].inputValue}
- local count = tonumber(data2.value)
-
- if not count then
- ESX.ShowNotification(TranslateCap('quantity_invalid'))
- else
- ESX.CloseContext()
- TriggerServerEvent('esx_policejob:getStockItem', itemName, count)
-
- Wait(300)
- OpenGetStocksMenu()
- end
- end)
- end)
- end)
-end
-
-function OpenPutStocksMenu()
- ESX.TriggerServerCallback('esx_policejob:getPlayerInventory', function(inventory)
- local elements = {
- {unselectable = true, icon = "fas fa-box", title = TranslateCap('inventory')}
- }
-
- for i=1, #inventory.items, 1 do
- local item = inventory.items[i]
-
- if item.count > 0 then
- elements[#elements+1] = {
- icon = "fas fa-box",
- title = item.label .. ' x' .. item.count,
- type = 'item_standard',
- value = item.name
- }
- end
- end
-
- ESX.OpenContext("right", elements, function(menu,element)
- local data = {current = element}
- local itemName = data.current.value
-
- local elements2 = {
- {unselectable = true, icon = "fas fa-box", title = element.title},
- {title = TranslateCap('quantity'), input = true, inputType = "number", inputMin = 1, inputMax = 150, inputPlaceholder = TranslateCap('quantity_placeholder')},
- {icon = "fas fa-check-double", title = TranslateCap('confirm'), value = "confirm"}
- }
-
- ESX.OpenContext("right", elements2, function(menu2,element2)
- local data2 = {value = menu2.eles[2].inputValue}
- local count = tonumber(data2.value)
-
- if not count then
- ESX.ShowNotification(TranslateCap('quantity_invalid'))
- else
- ESX.CloseContext()
- TriggerServerEvent('esx_policejob:putStockItems', itemName, count)
-
- Wait(300)
- OpenPutStocksMenu()
- end
- end)
- end)
- end)
-end
-
-RegisterNetEvent('esx_phone:loaded')
-AddEventHandler('esx_phone:loaded', function(phoneNumber, contacts)
- local specialContact = {
- name = TranslateCap('phone_police'),
- number = 'police',
- base64Icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDFGQTJDRkI0QUJCMTFFN0JBNkQ5OENBMUI4QUEzM0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDFGQTJDRkM0QUJCMTFFN0JBNkQ5OENBMUI4QUEzM0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MUZBMkNGOTRBQkIxMUU3QkE2RDk4Q0ExQjhBQTMzRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MUZBMkNGQTRBQkIxMUU3QkE2RDk4Q0ExQjhBQTMzRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoW66EYAAAjGSURBVHjapJcLcFTVGcd/u3cfSXaTLEk2j80TCI8ECI9ABCyoiBqhBVQqVG2ppVKBQqUVgUl5OU7HKqNOHUHU0oHamZZWoGkVS6cWAR2JPJuAQBPy2ISEvLN57+v2u2E33e4k6Ngz85+9d++95/zP9/h/39GpqsqiRYsIGz8QZAq28/8PRfC+4HT4fMXFxeiH+GC54NeCbYLLATLpYe/ECx4VnBTsF0wWhM6lXY8VbBE0Ch4IzLcpfDFD2P1TgrdC7nMCZLRxQ9AkiAkQCn77DcH3BC2COoFRkCSIG2JzLwqiQi0RSmCD4JXbmNKh0+kc/X19tLtc9Ll9sk9ZS1yoU71YIk3xsbEx8QaDEc2ttxmaJSKC1ggSKBK8MKwTFQVXRzs3WzpJGjmZgvxcMpMtWIwqsjztvSrlzjYul56jp+46qSmJmMwR+P3+4aZ8TtCprRkk0DvUW7JjmV6lsqoKW/pU1q9YQOE4Nxkx4ladE7zd8ivuVmJQfXZKW5dx5EwPRw4fxNx2g5SUVLw+33AkzoRaQDP9SkFu6OKqz0uF8yaz7vsOL6ycQVLkcSg/BlWNsjuFoKE1knqDSl5aNnmPLmThrE0UvXqQqvJPyMrMGorEHwQfEha57/3P7mXS684GFjy8kreLppPUuBXfyd/ibeoS2kb0mWPANhJdYjb61AxUvx5PdT3+4y+Tb3mTd19ZSebE+VTXVGNQlHAC7w4VhH8TbA36vKq6ilnzlvPSunHw6Trc7XpZ14AyfgYeyz18crGN1Alz6e3qwNNQSv4dZox1h/BW9+O7eIaEsVv41Y4XeHJDG83Nl4mLTwzGhJYtx0PzNTjOB9KMTlc7Nkcem39YAGU7cbeBKVLMPGMVf296nMd2VbBq1wmizHoqqm/wrS1/Zf0+N19YN2PIu1fcIda4Vk66Zx/rVi+jo9eIX9wZGGcFXUMR6BHUa76/2ezioYcXMtpyAl91DSaTfDxlJbtLprHm2ecpObqPuTPzSNV9yKz4a4zJSuLo71/j8Q17ON69EmXiPIlNMe6FoyzOqWPW/MU03Lw5EFcyKghTrNDh7+/vw545mcJcWbTiGKpRdGPMXbx90sGmDaux6sXk+kimjU+BjnMkx3kYP34cXrFuZ+3nrHi6iDMt92JITcPjk3R3naRwZhpuNSqoD93DKaFVU7j2dhcF8+YzNlpErbIBTVh8toVccbaysPB+4pMcuPw25kwSsau7BIlmHpy3guaOPtISYyi/UkaJM5Lpc5agq5Xkcl6gIHkmqaMn0dtylcjIyPThCNyhaXyfR2W0I1our0v6qBii07ih5rDtGSOxNVdk1y4R2SR8jR/g7hQD9l1jUeY/WLJB5m39AlZN4GZyIQ1fFJNsEgt0duBIc5GRkcZF53mNwIzhXPDgQPoZIkiMkbTxtstDMVnmFA4cOsbz2/aKjSQjev4Mp9ZAg+hIpFhB3EH5Yal16+X+Kq3dGfxkzRY+KauBjBzREvGN0kNCTARu94AejBLMHorAQ7cEQMGs2cXvkWshYLDi6e9l728O8P1XW6hKeB2yv42q18tjj+iFTGoSi+X9jJM9RTxS9E+OHT0krhNiZqlbqraoT7RAU5bBGrEknEBhgJks7KXbLS8qERI0ErVqF/Y4K6NHZfLZB+/wzJvncacvFd91oXO3o/O40MfZKJOKu/rne+mRQByXM4lYreb1tUnkizVVA/0SpfpbWaCNBeEE5gb/UH19NLqEgDF+oNDQWcn41Cj0EXFEWqzkOIyYekslFkThsvMxpIyE2hIc6lXGZ6cPyK7Nnk5OipixRdxgUESAYmhq68VsGgy5CYKCUAJTg0+izApXne3CJFmUTwg4L3FProFxU+6krqmXu3MskkhSD2av41jLdzlnfFrSdCZxyqfMnppN6ZUa7pwt0h3fiK9DCt4IO9e7YqisvI7VYgmNv7mhBKKD/9psNi5dOMv5ZjukjsLdr0ffWsyTi6eSlfcA+dmiVyOXs+/sHNZu3M6PdxzgVO9GmDSHsSNqmTz/R6y6Xxqma4fwaS5Mn85n1ZE0Vl3CHBER3lUNEhiURpPJRFdTOcVnpUJnPIhR7cZXfoH5UYc5+E4RzRH3sfSnl9m2dSMjE+Tz9msse+o5dr7UwcQ5T3HwlWUkNuzG3dKFSTbsNs7m/Y8vExOlC29UWkMJlAxKoRQMR3IC7x85zOn6fHS50+U/2Untx2R1voinu5no+DQmz7yPXmMKZnsu0wrm0Oe3YhOVHdm8A09dBQYhTv4T7C+xUPrZh8Qn2MMr4qcDSRfoirWgKAvtgOpv1JI8Zi77X15G7L+fxeOUOiUFxZiULD5fSlNzNM62W+k1yq5gjajGX/ZHvOIyxd+Fkj+P092rWP/si0Qr7VisMaEWuCiYonXFwbAUTWWPYLV245NITnGkUXnpI9butLJn2y6iba+hlp7C09qBcvoN7FYL9mhxo1/y/LoEXK8Pv6qIC8WbBY/xr9YlPLf9dZT+OqKTUwfmDBm/GOw7ws4FWpuUP2gJEZvKqmocuXPZuWYJMzKuSsH+SNwh3bo0p6hao6HeEqwYEZ2M6aKWd3PwTCy7du/D0F1DsmzE6/WGLr5LsDF4LggnYBacCOboQLHQ3FFfR58SR+HCR1iQH8ukhA5s5o5AYZMwUqOp74nl8xvRHDlRTsnxYpJsUjtsceHt2C8Fm0MPJrphTkZvBc4It9RKLOFx91Pf0Igu0k7W2MmkOewS2QYJUJVWVz9VNbXUVVwkyuAmKTFJayrDo/4Jwe/CT0aGYTrWVYEeUfsgXssMRcpyenraQJa0VX9O3ZU+Ma1fax4xGxUsUVFkOUbcama1hf+7+LmA9juHWshwmwOE1iMmCFYEzg1jtIm1BaxW6wCGGoFdewPfvyE4ertTiv4rHC73B855dwp2a23bbd4tC1hvhOCbX7b4VyUQKhxrtSOaYKngasizvwi0RmOS4O1QZf2yYfiaR+73AvhTQEVf+rpn9/8IMAChKDrDzfsdIQAAAABJRU5ErkJggg=='
- }
-
- TriggerEvent('esx_phone:addSpecialContact', specialContact.name, specialContact.number, specialContact.base64Icon)
-end)
-
--- don't show dispatches if the player isn't in service
-AddEventHandler('esx_phone:cancelMessage', function(dispatchNumber)
- if ESX.PlayerData.job and ESX.PlayerData.job.name == 'police' and ESX.PlayerData.job.name == dispatchNumber then
- -- if esx_service is enabled
- if Config.EnableESXService and not playerInService then
- CancelEvent()
- end
- end
-end)
-
-AddEventHandler('esx_policejob:hasEnteredMarker', function(station, part, partNum)
- if part == 'Cloakroom' then
- CurrentAction = 'menu_cloakroom'
- CurrentActionMsg = TranslateCap('open_cloackroom')
- CurrentActionData = {}
- elseif part == 'Armory' then
- CurrentAction = 'menu_armory'
- CurrentActionMsg = TranslateCap('open_armory')
- CurrentActionData = {station = station}
- elseif part == 'Vehicles' then
- CurrentAction = 'menu_vehicle_spawner'
- CurrentActionMsg = TranslateCap('garage_prompt')
- CurrentActionData = {station = station, part = part, partNum = partNum}
- elseif part == 'Helicopters' then
- CurrentAction = 'Helicopters'
- CurrentActionMsg = TranslateCap('helicopter_prompt')
- CurrentActionData = {station = station, part = part, partNum = partNum}
- elseif part == 'BossActions' then
- CurrentAction = 'menu_boss_actions'
- CurrentActionMsg = TranslateCap('open_bossmenu')
- CurrentActionData = {}
- end
-end)
-
-AddEventHandler('esx_policejob:hasExitedMarker', function(station, part, partNum)
- if not isInShopMenu then
- ESX.CloseContext()
- end
-
- CurrentAction = nil
-end)
-
-AddEventHandler('esx_policejob:hasEnteredEntityZone', function(entity)
- local playerPed = PlayerPedId()
-
- if ESX.PlayerData.job and ESX.PlayerData.job.name == 'police' and IsPedOnFoot(playerPed) then
- CurrentAction = 'remove_entity'
- CurrentActionMsg = TranslateCap('remove_prop')
- CurrentActionData = {entity = entity}
- end
-
- if GetEntityModel(entity) == `p_ld_stinger_s` then
- local playerPed = PlayerPedId()
- local coords = GetEntityCoords(playerPed)
-
- if IsPedInAnyVehicle(playerPed, false) then
- local vehicle = GetVehiclePedIsIn(playerPed)
-
- for i=0, 7, 1 do
- SetVehicleTyreBurst(vehicle, i, true, 1000)
- end
- end
- end
-end)
-
-AddEventHandler('esx_policejob:hasExitedEntityZone', function(entity)
- if CurrentAction == 'remove_entity' then
- CurrentAction = nil
- end
-end)
-
-RegisterNetEvent('esx_policejob:handcuff')
-AddEventHandler('esx_policejob:handcuff', function()
- isHandcuffed = not isHandcuffed
- local playerPed = PlayerPedId()
-
- if isHandcuffed then
- RequestAnimDict('mp_arresting')
- while not HasAnimDictLoaded('mp_arresting') do
- Wait(100)
- end
-
- TaskPlayAnim(playerPed, 'mp_arresting', 'idle', 8.0, -8, -1, 49, 0, 0, 0, 0)
- RemoveAnimDict('mp_arresting')
-
- SetEnableHandcuffs(playerPed, true)
- DisablePlayerFiring(playerPed, true)
- SetCurrentPedWeapon(playerPed, `WEAPON_UNARMED`, true) -- unarm player
- SetPedCanPlayGestureAnims(playerPed, false)
- FreezeEntityPosition(playerPed, true)
- DisplayRadar(false)
-
- if Config.EnableHandcuffTimer then
- if handcuffTimer.active then
- ESX.ClearTimeout(handcuffTimer.task)
- end
-
- StartHandcuffTimer()
- end
- else
- if Config.EnableHandcuffTimer and handcuffTimer.active then
- ESX.ClearTimeout(handcuffTimer.task)
- end
-
- ClearPedSecondaryTask(playerPed)
- SetEnableHandcuffs(playerPed, false)
- DisablePlayerFiring(playerPed, false)
- SetPedCanPlayGestureAnims(playerPed, true)
- FreezeEntityPosition(playerPed, false)
- DisplayRadar(true)
- end
-end)
-
-RegisterNetEvent('esx_policejob:unrestrain')
-AddEventHandler('esx_policejob:unrestrain', function()
- if isHandcuffed then
- local playerPed = PlayerPedId()
- isHandcuffed = false
-
- ClearPedSecondaryTask(playerPed)
- SetEnableHandcuffs(playerPed, false)
- DisablePlayerFiring(playerPed, false)
- SetPedCanPlayGestureAnims(playerPed, true)
- FreezeEntityPosition(playerPed, false)
- DisplayRadar(true)
-
- -- end timer
- if Config.EnableHandcuffTimer and handcuffTimer.active then
- ESX.ClearTimeout(handcuffTimer.task)
- end
- end
-end)
-
-RegisterNetEvent('esx_policejob:drag')
-AddEventHandler('esx_policejob:drag', function(copId)
- if isHandcuffed then
- dragStatus.isDragged = not dragStatus.isDragged
- dragStatus.CopId = copId
- end
-end)
-
CreateThread(function()
- local wasDragged
-
- while true do
- local Sleep = 1500
-
- if isHandcuffed and dragStatus.isDragged then
- Sleep = 50
- local targetPed = GetPlayerPed(GetPlayerFromServerId(dragStatus.CopId))
-
- if DoesEntityExist(targetPed) and IsPedOnFoot(targetPed) and not IsPedDeadOrDying(targetPed, true) then
- if not wasDragged then
- AttachEntityToEntity(ESX.PlayerData.ped, targetPed, 11816, 0.54, 0.54, 0.0, 0.0, 0.0, 0.0, false, false, false, false, 2, true)
- wasDragged = true
- else
- Wait(1000)
- end
- else
- wasDragged = false
- dragStatus.isDragged = false
- DetachEntity(ESX.PlayerData.ped, true, false)
- end
- elseif wasDragged then
- wasDragged = false
- DetachEntity(ESX.PlayerData.ped, true, false)
- end
- Wait(Sleep)
- end
-end)
-
-RegisterNetEvent('esx_policejob:putInVehicle')
-AddEventHandler('esx_policejob:putInVehicle', function()
- if isHandcuffed then
- local playerPed = PlayerPedId()
- local vehicle, distance = ESX.Game.GetClosestVehicle()
-
- if vehicle and distance < 5 then
- local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(vehicle)
-
- for i=maxSeats - 1, 0, -1 do
- if IsVehicleSeatFree(vehicle, i) then
- freeSeat = i
- break
- end
- end
-
- if freeSeat then
- TaskWarpPedIntoVehicle(playerPed, vehicle, freeSeat)
- dragStatus.isDragged = false
- end
- end
- end
-end)
-
-RegisterNetEvent('esx_policejob:OutVehicle')
-AddEventHandler('esx_policejob:OutVehicle', function()
- local GetVehiclePedIsIn = GetVehiclePedIsIn
- local IsPedSittingInAnyVehicle = IsPedSittingInAnyVehicle
- local TaskLeaveVehicle = TaskLeaveVehicle
- if IsPedSittingInAnyVehicle(ESX.PlayerData.ped) then
- local vehicle = GetVehiclePedIsIn(ESX.PlayerData.ped, false)
- TaskLeaveVehicle(ESX.PlayerData.ped, vehicle, 64)
- end
-end)
-
--- Handcuff
-CreateThread(function()
- local DisableControlAction = DisableControlAction
- local IsEntityPlayingAnim = IsEntityPlayingAnim
- while true do
- local Sleep = 1000
-
- if isHandcuffed then
- Sleep = 0
- DisableControlAction(0, 1, true) -- Disable pan
- DisableControlAction(0, 2, true) -- Disable tilt
- DisableControlAction(0, 24, true) -- Attack
- DisableControlAction(0, 257, true) -- Attack 2
- DisableControlAction(0, 25, true) -- Aim
- DisableControlAction(0, 263, true) -- Melee Attack 1
- DisableControlAction(0, 32, true) -- W
- DisableControlAction(0, 34, true) -- A
- DisableControlAction(0, 31, true) -- S
- DisableControlAction(0, 30, true) -- D
-
- DisableControlAction(0, 45, true) -- Reload
- DisableControlAction(0, 22, true) -- Jump
- DisableControlAction(0, 44, true) -- Cover
- DisableControlAction(0, 37, true) -- Select Weapon
- DisableControlAction(0, 23, true) -- Also 'enter'?
-
- DisableControlAction(0, 288, true) -- Disable phone
- DisableControlAction(0, 289, true) -- Inventory
- DisableControlAction(0, 170, true) -- Animations
- DisableControlAction(0, 167, true) -- Job
-
- DisableControlAction(0, 0, true) -- Disable changing view
- DisableControlAction(0, 26, true) -- Disable looking behind
- DisableControlAction(0, 73, true) -- Disable clearing animation
- DisableControlAction(2, 199, true) -- Disable pause screen
-
- DisableControlAction(0, 59, true) -- Disable steering in vehicle
- DisableControlAction(0, 71, true) -- Disable driving forward in vehicle
- DisableControlAction(0, 72, true) -- Disable reversing in vehicle
+ for stationName, stationData in pairs(Config.PoliceStations) do
+ local blipConfig = stationData.blip
- DisableControlAction(2, 36, true) -- Disable going stealth
+ if blipConfig then
+ local blipHandle = AddBlipForCoord(blipConfig.coords.x, blipConfig.coords.y, blipConfig.coords.z)
- DisableControlAction(0, 47, true) -- Disable weapon
- DisableControlAction(0, 264, true) -- Disable melee
- DisableControlAction(0, 257, true) -- Disable melee
- DisableControlAction(0, 140, true) -- Disable melee
- DisableControlAction(0, 141, true) -- Disable melee
- DisableControlAction(0, 142, true) -- Disable melee
- DisableControlAction(0, 143, true) -- Disable melee
- DisableControlAction(0, 75, true) -- Disable exit vehicle
- DisableControlAction(27, 75, true) -- Disable exit vehicle
-
- if IsEntityPlayingAnim(ESX.PlayerData.ped, 'mp_arresting', 'idle', 3) ~= 1 then
- ESX.Streaming.RequestAnimDict('mp_arresting', function()
- TaskPlayAnim(ESX.PlayerData.ped, 'mp_arresting', 'idle', 8.0, -8, -1, 49, 0.0, false, false, false)
- RemoveAnimDict('mp_arresting')
- end)
- end
- end
- Wait(Sleep)
- end
-end)
-
--- Create blips
-CreateThread(function()
- for k,v in pairs(Config.PoliceStations) do
- local blip = AddBlipForCoord(v.Blip.Coords)
-
- SetBlipSprite (blip, v.Blip.Sprite)
- SetBlipDisplay(blip, v.Blip.Display)
- SetBlipScale (blip, v.Blip.Scale)
- SetBlipColour (blip, v.Blip.Colour)
- SetBlipAsShortRange(blip, true)
-
- BeginTextCommandSetBlipName('STRING')
- AddTextComponentSubstringPlayerName(TranslateCap('map_blip'))
- EndTextCommandSetBlipName(blip)
- end
-end)
-
--- Draw markers and more
-CreateThread(function()
- while true do
- local Sleep = 1500
- if ESX.PlayerData.job and ESX.PlayerData.job.name == 'police' then
- Sleep = 500
- local playerPed = PlayerPedId()
- local playerCoords = GetEntityCoords(playerPed)
- local isInMarker, hasExited = false, false
- local currentStation, currentPart, currentPartNum
-
- for k,v in pairs(Config.PoliceStations) do
- for i=1, #v.Cloakrooms, 1 do
- local distance = #(playerCoords - v.Cloakrooms[i])
-
- if distance < Config.DrawDistance then
- DrawMarker(Config.MarkerType.Cloakrooms, v.Cloakrooms[i], 0.0, 0.0, 0.0, 0, 0.0, 0.0, 1.0, 1.0, 1.0, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, true, false, false, false)
- Sleep = 0
-
- if distance < Config.MarkerSize.x then
- isInMarker, currentStation, currentPart, currentPartNum = true, k, 'Cloakroom', i
- end
- end
- end
-
- for i=1, #v.Armories, 1 do
- local distance = #(playerCoords - v.Armories[i])
-
- if distance < Config.DrawDistance then
- DrawMarker(Config.MarkerType.Armories, v.Armories[i], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, true, false, false, false)
- Sleep = 0
-
- if distance < Config.MarkerSize.x then
- isInMarker, currentStation, currentPart, currentPartNum = true, k, 'Armory', i
- end
- end
- end
-
- for i=1, #v.Vehicles, 1 do
- local distance = #(playerCoords - v.Vehicles[i].Spawner)
-
- if distance < Config.DrawDistance then
- DrawMarker(Config.MarkerType.Vehicles, v.Vehicles[i].Spawner, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, true, false, false, false)
- Sleep = 0
-
- if distance < Config.MarkerSize.x then
- isInMarker, currentStation, currentPart, currentPartNum = true, k, 'Vehicles', i
- end
- end
- end
-
- for i=1, #v.Helicopters, 1 do
- local distance = #(playerCoords - v.Helicopters[i].Spawner)
-
- if distance < Config.DrawDistance then
- DrawMarker(Config.MarkerType.Helicopters, v.Helicopters[i].Spawner, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, true, false, false, false)
- Sleep = 0
-
- if distance < Config.MarkerSize.x then
- isInMarker, currentStation, currentPart, currentPartNum = true, k, 'Helicopters', i
- end
- end
- end
-
- if Config.EnablePlayerManagement and ESX.PlayerData.job.grade_name == 'boss' then
- for i=1, #v.BossActions, 1 do
- local distance = #(playerCoords - v.BossActions[i])
-
- if distance < Config.DrawDistance then
- DrawMarker(Config.MarkerType.BossActions, v.BossActions[i], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, true, false, false, false)
- Sleep = 0
-
- if distance < Config.MarkerSize.x then
- isInMarker, currentStation, currentPart, currentPartNum = true, k, 'BossActions', i
- end
- end
- end
- end
- end
-
- if isInMarker and not HasAlreadyEnteredMarker or (isInMarker and (LastStation ~= currentStation or LastPart ~= currentPart or LastPartNum ~= currentPartNum)) then
- if
- (LastStation and LastPart and LastPartNum) and
- (LastStation ~= currentStation or LastPart ~= currentPart or LastPartNum ~= currentPartNum)
- then
- TriggerEvent('esx_policejob:hasExitedMarker', LastStation, LastPart, LastPartNum)
- hasExited = true
- end
-
- HasAlreadyEnteredMarker = true
- LastStation = currentStation
- LastPart = currentPart
- LastPartNum = currentPartNum
-
- TriggerEvent('esx_policejob:hasEnteredMarker', currentStation, currentPart, currentPartNum)
- end
-
- if not hasExited and not isInMarker and HasAlreadyEnteredMarker then
- HasAlreadyEnteredMarker = false
- TriggerEvent('esx_policejob:hasExitedMarker', LastStation, LastPart, LastPartNum)
- end
- end
- Wait(Sleep)
- end
-end)
-
--- Enter / Exit entity zone events
-CreateThread(function()
- local trackedEntities = {
- `prop_roadcone02a`,
- `prop_barrier_work05`,
- `p_ld_stinger_s`,
- `prop_boxpile_07d`,
- `hei_prop_cash_crate_half_full`
- }
-
- while true do
- local Sleep = 1500
-
- local GetEntityCoords = GetEntityCoords
- local GetClosestObjectOfType = GetClosestObjectOfType
- local DoesEntityExist = DoesEntityExist
- local playerCoords = GetEntityCoords(ESX.PlayerData.ped)
-
- local closestDistance = -1
- local closestEntity = nil
-
- for i=1, #trackedEntities, 1 do
- local object = GetClosestObjectOfType(playerCoords, 3.0, trackedEntities[i], false, false, false)
-
- if DoesEntityExist(object) then
- Sleep = 500
- local objCoords = GetEntityCoords(object)
- local distance = #(playerCoords - objCoords)
-
- if closestDistance == -1 or closestDistance > distance then
- closestDistance = distance
- closestEntity = object
- end
- end
- end
-
- if closestDistance ~= -1 and closestDistance <= 3.0 then
- if LastEntity ~= closestEntity then
- TriggerEvent('esx_policejob:hasEnteredEntityZone', closestEntity)
- LastEntity = closestEntity
- end
- else
- if LastEntity then
- TriggerEvent('esx_policejob:hasExitedEntityZone', LastEntity)
- LastEntity = nil
- end
- end
- Wait(Sleep)
- end
-end)
-
-ESX.RegisterInput("police:interact", "(ESX PoliceJob) " .. TranslateCap('interaction'), "keyboard", "E", function()
- if not CurrentAction then
- return
- end
-
- if not ESX.PlayerData.job or (ESX.PlayerData.job and not ESX.PlayerData.job.name == 'police') then
- return
- end
- if CurrentAction == 'menu_cloakroom' then
- OpenCloakroomMenu()
- elseif CurrentAction == 'menu_armory' then
- if not Config.EnableESXService then
- OpenArmoryMenu(CurrentActionData.station)
- elseif playerInService then
- OpenArmoryMenu(CurrentActionData.station)
- else
- ESX.ShowNotification(TranslateCap('service_not'))
- end
- elseif CurrentAction == 'menu_vehicle_spawner' then
- if not Config.EnableESXService then
- OpenVehicleSpawnerMenu('car', CurrentActionData.station, CurrentActionData.part, CurrentActionData.partNum)
- elseif playerInService then
- OpenVehicleSpawnerMenu('car', CurrentActionData.station, CurrentActionData.part, CurrentActionData.partNum)
- else
- ESX.ShowNotification(TranslateCap('service_not'))
- end
- elseif CurrentAction == 'Helicopters' then
- if not Config.EnableESXService then
- OpenVehicleSpawnerMenu('helicopter', CurrentActionData.station, CurrentActionData.part, CurrentActionData.partNum)
- elseif playerInService then
- OpenVehicleSpawnerMenu('helicopter', CurrentActionData.station, CurrentActionData.part, CurrentActionData.partNum)
- else
- ESX.ShowNotification(TranslateCap('service_not'))
- end
- elseif CurrentAction == 'delete_vehicle' then
- ESX.Game.DeleteVehicle(CurrentActionData.vehicle)
- elseif CurrentAction == 'menu_boss_actions' then
- ESX.CloseContext()
- TriggerEvent('esx_society:openBossMenu', 'police', function(data, menu)
- ESX.CloseContext()
-
- CurrentAction = 'menu_boss_actions'
- CurrentActionMsg = TranslateCap('open_bossmenu')
- CurrentActionData = {}
- end, { wash = false }) -- disable washing money
- elseif CurrentAction == 'remove_entity' then
- DeleteEntity(CurrentActionData.entity)
- end
-
- CurrentAction = nil
-end)
-
-ESX.RegisterInput("police:quickactions", "(ESX PoliceJob) "..TranslateCap('quick_actions'), "keyboard", "F6", function()
- if not ESX.PlayerData.job or (ESX.PlayerData.job.name ~= 'police') or isDead then
- return
- end
-
- if not Config.EnableESXService then
- OpenPoliceActionsMenu()
- elseif playerInService then
- OpenPoliceActionsMenu()
- else
- ESX.ShowNotification(TranslateCap('service_not'))
- end
-end)
-
-CreateThread(function()
- while true do
- local Sleep = 1000
-
- if CurrentAction then
- Sleep = 0
- ESX.ShowHelpNotification(CurrentActionMsg)
- end
- Wait(Sleep)
- end
-end)
-
--- Create blip for colleagues
-function createBlip(id)
- local ped = GetPlayerPed(id)
- local blip = GetBlipFromEntity(ped)
-
- if not DoesBlipExist(blip) then -- Add blip and create head display on player
- blip = AddBlipForEntity(ped)
- SetBlipSprite(blip, 1)
- ShowHeadingIndicatorOnBlip(blip, true) -- Player Blip indicator
- SetBlipRotation(blip, math.ceil(GetEntityHeading(ped))) -- update rotation
- SetBlipNameToPlayerName(blip, id) -- update blip name
- SetBlipScale(blip, 0.85) -- set scale
- SetBlipAsShortRange(blip, true)
-
- table.insert(blipsCops, blip) -- add blip to array so we can remove it later
- end
-end
-
-AddEventHandler('esx:onPlayerSpawn', function(spawn)
- isDead = false
- TriggerEvent('esx_policejob:unrestrain')
-
- if not hasAlreadyJoined then
- TriggerServerEvent('esx_policejob:spawned')
- end
- hasAlreadyJoined = true
-end)
-
-AddEventHandler('esx:onPlayerDeath', function(data)
- isDead = true
-end)
-
-AddEventHandler('onResourceStop', function(resource)
- if resource == GetCurrentResourceName() then
- TriggerEvent('esx_policejob:unrestrain')
- TriggerEvent('esx_phone:removeSpecialContact', 'police')
-
- if Config.EnableESXService then
- TriggerServerEvent('esx_service:disableService', 'police')
- end
-
- if Config.EnableHandcuffTimer and handcuffTimer.active then
- ESX.ClearTimeout(handcuffTimer.task)
- end
- end
-end)
-
--- handcuff timer, unrestrain the player after an certain amount of time
-function StartHandcuffTimer()
- if Config.EnableHandcuffTimer and handcuffTimer.active then
- ESX.ClearTimeout(handcuffTimer.task)
- end
-
- handcuffTimer.active = true
-
- handcuffTimer.task = ESX.SetTimeout(Config.HandcuffTimer, function()
- ESX.ShowNotification(TranslateCap('unrestrained_timer'))
- TriggerEvent('esx_policejob:unrestrain')
- handcuffTimer.active = false
- end)
-end
+ SetBlipSprite(blipHandle, blipConfig.sprite)
+ SetBlipScale(blipHandle, blipConfig.scale)
+ SetBlipColour(blipHandle, blipConfig.color)
+ SetBlipAsShortRange(blipHandle, blipConfig.shortRange)
+
+ BeginTextCommandSetBlipName("STRING")
+ AddTextComponentString(blipConfig.label)
+ EndTextCommandSetBlipName(blipHandle)
+ end
+ end
--- TODO
--- - return to garage if owned
--- - message owner that his vehicle has been impounded
-function ImpoundVehicle(vehicle)
- --local vehicleName = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)))
- ESX.Game.DeleteVehicle(vehicle)
- ESX.ShowNotification(TranslateCap('impound_successful'))
- currentTask.busy = false
-end
\ No newline at end of file
+ ESX.RegisterInput('policeMenu', TranslateCap('action_menu_description'), 'keyboard', Config.Keybinds.policeMenu or 'F6', openPoliceMenu)
+end)
\ No newline at end of file
diff --git a/client/modules/citizenActions.lua b/client/modules/citizenActions.lua
new file mode 100644
index 0000000..b3f48d7
--- /dev/null
+++ b/client/modules/citizenActions.lua
@@ -0,0 +1,143 @@
+local CitizenModule = {}
+
+local CuffModule = require('client.modules.handcuffs')
+
+local citizenInteractionMenuElements = {
+ { label = TranslateCap('id_card'), value = 'identityCard' },
+ { label = TranslateCap('handcuff'), value = 'handcuffPlayer' },
+ { label = TranslateCap('search'), value = 'searchPlayer' },
+ { label = TranslateCap('drag'), value = 'dragPlayer' },
+ { label = TranslateCap('put_in_vehicle'), value = 'putInVehicle' },
+ { label = TranslateCap('out_the_vehicle'), value = 'putOutVehicle' },
+}
+
+local licensesMenuElements = {}
+
+if Config.EnabledModules.esxLicense then
+ citizenInteractionMenuElements[#citizenInteractionMenuElements + 1] = { label = TranslateCap('check_licenses'), value =
+ 'checkLicense' }
+ local licenses = ESX.AwaitServerCallback('esx_license:getLicensesList')
+
+ for _, license in ipairs(licenses) do
+ if Config.Licenses[license.type] then
+ licensesMenuElements[#licensesMenuElements + 1] = { label = license.label, type = license.type }
+ end
+ end
+end
+
+if Config.EnabledModules.esxBilling then
+ citizenInteractionMenuElements[#citizenInteractionMenuElements+1] = { label = TranslateCap('fine'), value = 'fine' }
+ citizenInteractionMenuElements[#citizenInteractionMenuElements+1] = { label = TranslateCap('unpaid_bills'), value = 'unpaidBills' }
+end
+
+local function openCitizenIdCard(targetPlayer)
+ local targetData = ESX.AwaitServerCallback('esx_policejob:getOtherPlayerData', targetPlayer, { drunk = true })
+ assert(targetData, 'could not find targetData, maybe targetPlayer is offline?')
+
+ local elements = {}
+
+ for key, value in pairs(targetData) do
+ elements[#elements + 1] = { label = TranslateCap(key, value) }
+ end
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'otherPlayerData', {
+ title = TranslateCap('citizen_interaction'),
+ align = 'right',
+ elements = elements
+ }, nil, function(data, menu)
+ menu.close()
+ end)
+end
+
+local function showUnpaidBills(targetPlayer)
+ local targetBills = ESX.AwaitServerCallback('esx_billing:getTargetBills')
+ local elements = {}
+
+ for _, bill in ipairs(targetBills) do
+ elements[#elements + 1] = { label = ("%s - $%s"):format(bill.label,
+ ESX.Math.GroupDigits(bill.amount)) }
+ end
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'targetBills', {
+ title = TranslateCap('unpaid_bills'),
+ align = 'right',
+ elements = elements
+ }, nil, function(data, menu)
+ menu.close()
+ end)
+end
+
+local function openAddLicenseMenu(targetPlayer)
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'addLicenseMenu', {
+ title = TranslateCap('add_license'),
+ align = 'right',
+ elements = licensesMenuElements
+ }, function(data, menu)
+ TriggerServerEvent('esx_license:addLicense', targetPlayer, data.current.type)
+ menu.close()
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+local function showLicenses(targetPlayer)
+ local targetData = ESX.AwaitServerCallback('esx_policejob:getOtherPlayerData', targetPlayer, { licenses = true })
+ assert(targetData, 'could not find targetData, maybe targetPlayer is offline?')
+
+ local elements = {}
+
+ for _, license in ipairs(targetData.licenses) do
+ elements[#elements + 1] = { label = license.label, type = license.type }
+ end
+
+ elements[#elements + 1] = { label = ('> %s'):format(TranslateCap('add_license')), value = 'add' }
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'licensesMenu', {
+ title = TranslateCap('manage_licenses'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ if data.current.value == 'add' then
+ openAddLicenseMenu(targetPlayer)
+ elseif data.current.type then
+ TriggerServerEvent('esx_policejob:notify', targetPlayer, TranslateCap('license_revoked', data.current.type))
+ TriggerServerEvent('esx_license:removeLicense', targetPlayer, data.current.type)
+ ESX.ShowNotification(TranslateCap('revoked_license', data.current.type, targetData.name))
+ menu.close()
+ end
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+CitizenModule.openCitizenInteractionMenu = function()
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'citizen_interaction', {
+ title = TranslateCap('citizen_interaction'),
+ align = 'right',
+ elements = citizenInteractionMenuElements
+ }, function(data, menu)
+ local closestPlayer, closestPlayerDistance = ESX.Game.GetClosestPlayer()
+
+ if closestPlayer == -1 or closestPlayerDistance > (Config.MaxInteractionDistance or 3.0) then
+ return ESX.ShowNotification(TranslateCap('no_players_nearby'))
+ end
+
+ local closestPlayerServerId = GetPlayerServerId(closestPlayer)
+
+ if data.current.value == 'identityCard' then
+ openCitizenIdCard(closestPlayerServerId)
+ elseif CuffModule[data.current.value] then
+ CuffModule[data.current.value](closestPlayerServerId)
+ elseif data.current.value == 'fine' then
+ openFineMenu(closestPlayerServerId)
+ elseif data.current.value == 'unpaidBills' then
+ showUnpaidBills(closestPlayerServerId)
+ elseif data.current.value == 'checkLicense' then
+ showLicenses(closestPlayerServerId)
+ end
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+return CitizenModule
diff --git a/client/modules/handcuffs.lua b/client/modules/handcuffs.lua
new file mode 100644
index 0000000..57bcd6a
--- /dev/null
+++ b/client/modules/handcuffs.lua
@@ -0,0 +1,371 @@
+
+local CuffModule = {}
+local animations = Config.HandcuffsAnimations
+local cuffAnimation , cuffedAnimation , cuffedIdleAnimation , uncuffAnimation , uncuffedAnimation , searchingAnimation =
+ animations.handcuff, animations.cuffed, animations.cuffed_idle,
+ animations.uncuff, animations.uncuffed, animations.searching
+
+local prevVariation = nil
+local handcuffTimer = {
+ active = false,
+ currentTimeoutId = 0
+}
+
+local function getPositionInFrontOfTarget(target)
+ local targetPlayer = GetPlayerFromServerId(target)
+ if not targetPlayer or targetPlayer == -1 then return end
+
+ local targetPed = GetPlayerPed(targetPlayer)
+ if not DoesEntityExist(targetPed) then return end
+
+ local targetCoords = GetEntityCoords(targetPed)
+ local targetHeading = GetEntityHeading(targetPed)
+ local radians = math.rad(targetHeading)
+
+ return vector3(
+ targetCoords.x - math.sin(radians) * 0.8,
+ targetCoords.y + math.cos(radians) * 0.8,
+ targetCoords.z - 0.95
+ ), targetHeading
+end
+
+CuffModule.handcuffPlayer = function(targetPlayer)
+ local event = ('esx_policejob:%s'):format(Player(targetPlayer).state.isHandcuffed and 'uncuffPlayer' or
+ 'handcuffPlayer')
+ local handcuffed, errorCode = ESX.AwaitServerCallback(event, targetPlayer)
+
+ if errorCode then return ESX.ShowNotification(TranslateCap(errorCode)) end
+
+ local anim = handcuffed and animations.handcuff or animations.uncuff
+ ESX.Streaming.RequestAnimDict(anim.dict)
+ TaskPlayAnim(ESX.PlayerData.ped, anim.dict, anim.name, 8.0, -8.0, anim.duration, 2, 0, false, false, false)
+end
+
+CuffModule.searchPlayer = function(targetPlayer, skipProgress)
+ if not Player(targetPlayer).state.isHandcuffed then
+ return ESX.ShowNotification(TranslateCap('not_handcuffed'))
+ end
+
+ local targetData = ESX.AwaitServerCallback('esx_policejob:getOtherPlayerData', targetPlayer, { inventory = true, loadout = true, accounts = true })
+ assert(targetData, 'could not find targetData, maybe targetPlayer is offline?')
+
+ local elements = {}
+
+ for _, account in ipairs(targetData.accounts) do
+ if isItemSearchable(account.name) and account.money > 0 then
+ local title = TranslateCap((account.name == 'black_money') and 'confiscate_dirty' or 'confiscate_money',
+ account.money)
+ elements[#elements + 1] = { label = title, value = account.name, count = account.money, itemType = 'money' }
+ end
+ end
+
+ for weaponName, weaponData in pairs(targetData.loadout) do
+ if isItemSearchable(weaponName) then
+ elements[#elements + 1] = {
+ label = TranslateCap('confiscate_weapon', ESX.GetWeaponLabel(weaponName),
+ weaponData.ammo),
+ isWeapon = true,
+ count = weaponData.ammo,
+ value = weaponName,
+ itemType = 'weapon'
+ }
+ end
+ end
+
+ for itemName, itemCount in pairs(targetData.inventory) do
+ if isItemSearchable(itemName) and itemCount > 0 then
+ elements[#elements + 1] = {
+ label = TranslateCap('confiscate_item', itemCount, itemName),
+ value = itemName,
+ count =
+ itemCount,
+ itemType = 'item'
+ }
+ end
+ end
+
+ ESX.Streaming.RequestAnimDict(searchingAnimation.dict)
+ TaskPlayAnim(ESX.PlayerData.ped, searchingAnimation.dict, searchingAnimation.name, 8.0, -8.0,
+ searchingAnimation.duration, 49, 0, false, false, false)
+ Wait(searchingAnimation.duration or 1500)
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'playerInv', {
+ title = TranslateCap('citizen_interaction'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ local itemCount = data.current.count or 1
+
+ if not data.current.isWeapon and data.current.count and data.current.count > 1 then
+ itemCount = openAmountDialog()
+
+ if not itemCount or itemCount <= 0 then
+ return ESX.ShowNotification(TranslateCap('invalid_amount'))
+ end
+ end
+
+ TriggerServerEvent('esx_policejob:confiscatePlayerItem', targetPlayer, data.current.itemType, data.current.value,
+ itemCount)
+ CuffModule.searchPlayer(targetPlayer)
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+CuffModule.dragPlayer = function(targetPlayer)
+ if not Player(targetPlayer).state.isHandcuffed then
+ return ESX.ShowNotification(TranslateCap('not_handcuffed'))
+ end
+
+ TriggerServerEvent('esx_policejob:dragPlayer', targetPlayer)
+end
+
+CuffModule.putInVehicle = function(targetPlayer)
+ local closestVehicle, closestDistance = ESX.Game.GetClosestVehicle(ESX.PlayerData.coords)
+
+ if not closestVehicle or closestDistance > 5 then
+ return ESX.ShowNotification(TranslateCap('no_vehicle_nearby'))
+ end
+
+ if not Player(targetPlayer).state.isHandcuffed then
+ return ESX.ShowNotification(TranslateCap('not_handcuffed'))
+ end
+
+ TriggerServerEvent('esx_policejob:putInVehicle', targetPlayer, NetworkGetNetworkIdFromEntity(closestVehicle))
+end
+
+local function getVehiclePassengers(vehicle)
+ local passengers = {}
+ local maxSeats = GetVehicleMaxNumberOfPassengers(vehicle)
+
+ for i = maxSeats, -1, -1 do
+ local pedInSeat = GetPedInVehicleSeat(vehicle, i)
+ if DoesEntityExist(pedInSeat) and IsPedAPlayer(pedInSeat) then
+ local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(pedInSeat))
+ local playerState = Player(playerServerId).state
+ passengers[#passengers + 1] = {
+ label = ("%s [%s]"):format(playerState.name or "Unknown", playerServerId),
+ value = playerServerId
+ }
+ end
+ end
+
+ return passengers
+end
+
+local function getFreeSeat(vehicle)
+ local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(vehicle)
+
+ for i = maxSeats - 1, 0, -1 do
+ if IsVehicleSeatFree(vehicle, i) then
+ freeSeat = i
+ break
+ end
+ end
+
+ return freeSeat
+end
+
+CuffModule.putOutVehicle = function(targetPlayer)
+ local closestVehicle, closestDistance = ESX.Game.GetClosestVehicle(ESX.PlayerData.coords)
+
+ if not closestVehicle or closestDistance > 5 then
+ return ESX.ShowNotification(TranslateCap('no_vehicle_nearby'))
+ end
+
+ local passengers = getVehiclePassengers(closestVehicle)
+ if #passengers == 0 then
+ return ESX.ShowNotification(TranslateCap('no_passengers'))
+ end
+
+ local currentDrawingTarget = passengers[1].value
+ local menuOpen = true
+
+ CreateThread(function()
+ local sleep = 500
+ while menuOpen do
+ sleep = 500
+ if currentDrawingTarget > 0 then
+ local playerPed = GetPlayerPed(GetPlayerFromServerId(currentDrawingTarget))
+
+ if playerPed and GetVehiclePedIsIn(playerPed, false) == closestVehicle then
+ sleep = 0
+ local boneCoords = GetPedBoneCoords(playerPed, 31086, 0, 0, 0)
+ DrawMarker(21, boneCoords.x, boneCoords.y, boneCoords.z + 0.95, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, 200,
+ 200,
+ 200, 200, true, true, 0, false, nil, nil, false)
+ end
+ end
+ Wait(sleep)
+ end
+ end)
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'playerlist', {
+ title = TranslateCap('out_the_vehicle'),
+ align = 'right',
+ elements = passengers
+ }, function(data, menu)
+ TriggerServerEvent('esx_policejob:putOutVehicle', targetPlayer, NetworkGetNetworkIdFromEntity(closestVehicle))
+ end, function(data, menu)
+ menuOpen = false
+ menu.close()
+ end, function(data, menu)
+ currentDrawingTarget = data.current.value
+ end)
+end
+
+local function cuffedLoop()
+ while LocalPlayer.state.isHandcuffed do
+ if not IsEntityPlayingAnim(ESX.PlayerData.ped, animations.cuffed_idle.dict, animations.cuffed_idle.name, 3) then
+ TaskPlayAnim(ESX.PlayerData.ped, animations.cuffed_idle.dict, animations.cuffed_idle.name, 8.0, -8.0, -1, 49,
+ 0, false, false, false)
+ end
+
+ for _, keyPair in ipairs(Config.DisabledControlsWhileCuffed) do
+ DisableControlAction(keyPair[1], keyPair[2], true)
+ end
+ Wait(0)
+ end
+end
+
+local function getUncuffed()
+ if prevVariation ~= nil then
+ SetPedComponentVariation(ESX.PlayerData.ped, 7, prevVariation, 0, 0)
+ prevVariation = nil
+ end
+
+ if LocalPlayer.state.isDragged then
+ LocalPlayer.state:set('isDragged', false, true)
+ DetachEntity(ESX.PlayerData.ped, true, false)
+ FreezeEntityPosition(ESX.PlayerData.ped, false)
+ end
+
+ if Config.EnableHandcuffTimer and handcuffTimer.active then
+ handcuffTimer.active = false
+ ESX.ClearTimeout(handcuffTimer.currentTimeoutId)
+ end
+end
+
+ESX.SecureNetEvent('esx_policejob:updateHandcuffedStatus', function(status, handcuffedBy)
+ SetEnableHandcuffs(ESX.PlayerData.ped, status)
+
+ local position, heading = getPositionInFrontOfTarget(handcuffedBy)
+ if position then
+ SetEntityCoords(ESX.PlayerData.ped, position.x, position.y, position.z, false, false, false, false)
+ SetEntityHeading(ESX.PlayerData.ped, heading or 0.0)
+ Wait(100)
+ end
+
+ local anim = status and animations.cuffed or animations.uncuffed
+ ESX.Streaming.RequestAnimDict(anim.dict)
+ ClearPedTasks(ESX.PlayerData.ped)
+ TaskPlayAnim(ESX.PlayerData.ped, anim.dict, anim.name, 8.0, -8.0, anim.duration, 2, 0, false, false, false)
+ RemoveAnimDict(anim.dict)
+ Wait(anim.duration)
+
+ if status then
+ local pedModel = GetEntityModel(ESX.PlayerData.ped)
+ if prevVariation == nil then
+ prevVariation = GetPedDrawableVariation(ESX.PlayerData.ped, 7)
+ end
+ SetPedComponentVariation(ESX.PlayerData.ped, 7, (pedModel == `mp_m_freemode_01`) and 41 or 25, 0, 0)
+
+ if Config.EnableHandcuffTimer then
+ if handcuffTimer.active then ESX.ClearTimeout(handcuffTimer.currentTimeoutId) end
+
+ handcuffTimer.active = true
+ handcuffTimer.currentTimeoutId = ESX.SetTimeout((Config.HandcuffTimer or 5) * 1000 * 60, function()
+ handcuffTimer.active = false
+ LocalPlayer.state:set('isHandcuffed', false, true)
+ getUncuffed()
+ ESX.ShowNotification(TranslateCap('timer_over'))
+ ClearPedTasks(ESX.PlayerData.ped)
+ end)
+ end
+
+ CreateThread(cuffedLoop)
+ else
+ getUncuffed()
+ end
+
+ ClearPedTasks(ESX.PlayerData.ped)
+end)
+
+local dragOptions = Config.DragBoneOptions
+ESX.SecureNetEvent('esx_policejob:toggleDrag', function(draggedBy, status)
+ if status then
+ local draggerPed = GetPlayerPed(GetPlayerFromServerId(draggedBy))
+
+ if not draggerPed then
+ return error('draggerPed not found! draggedBy player is not nearby')
+ end
+
+ FreezeEntityPosition(ESX.PlayerData.ped, true)
+ DetachEntity(ESX.PlayerData.ped, true, false)
+
+ AttachEntityToEntity(ESX.PlayerData.ped, draggerPed, dragOptions.boneIndex, dragOptions.offset.x,
+ dragOptions.offset.y, dragOptions.offset.z, dragOptions.rot.x, dragOptions.rot.y, dragOptions.rot.z, false,
+ false, false, false, 2, true)
+ else
+ DetachEntity(ESX.PlayerData.ped, true, false)
+ FreezeEntityPosition(ESX.PlayerData.ped, false)
+ end
+end)
+
+ESX.SecureNetEvent('esx_policejob:getInVehicle', function(vehicleNetId)
+ local vehicle = NetworkGetEntityFromNetworkId(vehicleNetId)
+
+ if not DoesEntityExist(vehicle) then
+ return ESX.ShowNotification('vehcile not exist')
+ end
+
+ local freeSeat = getFreeSeat(vehicle)
+
+ if not freeSeat then
+ return ESX.ShowNotification('No free seat')
+ end
+
+ for i = GetVehicleMaxNumberOfPassengers(vehicle), 0, -1 do
+ if IsVehicleSeatFree(vehicle, i) then
+ ClearPedTasks(ESX.PlayerData.ped)
+
+ if LocalPlayer.state.isDragged then
+ DetachEntity(ESX.PlayerData.ped, true, false)
+ LocalPlayer.state:set('isDragged', false, true)
+ Wait(100)
+ end
+
+ SetPedIntoVehicle(ESX.PlayerData.ped, vehicle, i)
+
+ Wait(500)
+ if ESX.PlayerData.vehicle ~= vehicle then
+ local tries = 0
+
+ repeat
+ SetPedIntoVehicle(ESX.PlayerData.ped, vehicle, i)
+ tries = tries + 1
+ Wait(0)
+ until ESX.PlayerData.vehicle == vehicle or tries >= 100
+ end
+
+ break
+ end
+ end
+end)
+
+ESX.SecureNetEvent('esx_policejob:getOutVehicle', function(vehicleNetId, draggedOutBy)
+ local vehicle = NetworkGetEntityFromNetworkId(vehicleNetId)
+
+ if not DoesEntityExist(vehicle) then
+ return ESX.ShowNotification('vehcile not exist')
+ end
+
+ if LocalPlayer.state.isDead then
+ -- needs some refactoring, won't work as of now. TaskLeaveVehicle will not work aswell.
+ SetEntityCoords(ESX.PlayerData.ped, ESX.PlayerData.coords.x, ESX.PlayerData.coords.y, ESX.PlayerData.coords.z,
+ false, false, false, false)
+ else
+ TaskLeaveVehicle(ESX.PlayerData.ped, vehicle, 64)
+ end
+end)
+
+return CuffModule
\ No newline at end of file
diff --git a/client/modules/vehicleActions.lua b/client/modules/vehicleActions.lua
new file mode 100644
index 0000000..410f013
--- /dev/null
+++ b/client/modules/vehicleActions.lua
@@ -0,0 +1,163 @@
+
+local VehicleModule = {}
+local interactionConfig = Config.PoliceActions.vehicleInteractions
+local hijackConfig , impoundConfig , fixConfig , washConfig = interactionConfig.hijackVehicle, interactionConfig.impoundVehicle, interactionConfig.fixVehicle, interactionConfig.washVehicle
+
+local vehicleInteractionMenuElements = {
+ { label = TranslateCap('vehicle_info'), value = 'getVehicleInfo', requiresNearbyVehicle = true },
+ { label = TranslateCap('lockpick'), value = 'hijackVehicle', requiresNearbyVehicle = true },
+ { label = TranslateCap('impound'), value = 'impoundVehicle', requiresNearbyVehicle = true },
+ { label = TranslateCap('search_database'), value = 'searchDatabase' }
+}
+
+if Config.AllowedVehicleInteractions then
+ if Config.AllowedVehicleInteractions.fix then
+ vehicleInteractionMenuElements[#vehicleInteractionMenuElements+1] = { label = TranslateCap('fix'), value = 'fixVehicle', requiresNearbyVehicle = true }
+ end
+
+ if Config.AllowedVehicleInteractions.wash then
+ vehicleInteractionMenuElements[#vehicleInteractionMenuElements+1] = { label = TranslateCap('wash'), value = 'washVehicle', requiresNearbyVehicle = true }
+ end
+end
+
+--- If enabled, it will display a progress bar with the specified duration and animation.
+--- If not enabled, it will execute the action without the progress bar.
+--- @param actionName? string The name of the action (used for progress bar text).
+--- @param duration? number The duration (in milliseconds) the progress bar should last.
+--- @param animation? table The animation settings to be used during the action (if progress bar is shown).
+--- @param onFinishCallback function The callback function to be executed once the action completes (or progress bar finishes).
+local function performActionWithProgressBar(actionName, duration, animation, onFinishCallback)
+ assert(ESX.IsFunctionReference(onFinishCallback), 'onFinishCallback is not a function!')
+
+ if Config.EnabledModules.esxProgressBar then
+ ESX.Progressbar(TranslateCap(actionName), duration or 5000, {
+ FreezePlayer = true,
+ animation = animation or {},
+ onFinish = onFinishCallback
+ })
+ else
+ onFinishCallback()
+ end
+end
+
+
+---@param targetVehicle number The vehicle to interact with.
+---@param byPlate? boolean
+local function getVehicleInfo(targetVehicle, byPlate)
+ local vehicleData = ESX.AwaitServerCallback('esx_policejob:getVehicleData', byPlate and targetVehicle or GetVehicleNumberPlateText(targetVehicle))
+ local elements = {
+ { label = TranslateCap('plate', byPlate and targetVehicle or GetVehicleNumberPlateText(targetVehicle)) },
+ { label = TranslateCap(vehicleData.owner and 'owner' or 'owner_unknown', vehicleData.owner or '') }
+ }
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'vehicleInfo', {
+ title = TranslateCap('vehicle_info'),
+ align = 'right',
+ elements = elements
+ }, nil, function(data, menu)
+ menu.close()
+ end)
+end
+
+---@param targetVehicle number The vehicle to interact with.
+local function hijackVehicle(targetVehicle)
+ performActionWithProgressBar('hijacking', hijackConfig.duration, hijackConfig.animation, function()
+ if DoesEntityExist(targetVehicle) and #(GetEntityCoords(targetVehicle) - ESX.PlayerData.coords) < 10 then
+ SetVehicleDoorsLocked(targetVehicle, 1)
+ SetVehicleDoorsLockedForAllPlayers(targetVehicle, false)
+ ESX.ShowNotification(TranslateCap('vehicle_unlocked'))
+ else
+ ESX.ShowNotification(TranslateCap('no_vehicle_nearby'))
+ end
+ end)
+end
+
+---@param targetVehicle number The vehicle to interact with.
+local function impoundVehicle(targetVehicle)
+ performActionWithProgressBar('impounding', impoundConfig.duration, impoundConfig.animation, function()
+ if DoesEntityExist(targetVehicle) and #(GetEntityCoords(targetVehicle) - ESX.PlayerData.coords) < 10 then
+ TriggerServerEvent('esx_policejob:impoundVehicle', NetworkGetNetworkIdFromEntity(targetVehicle), ESX.Game.GetVehicleProperties(targetVehicle))
+ ESX.ShowNotification(TranslateCap('vehicle_impounded'))
+ else
+ ESX.ShowNotification(TranslateCap('no_vehicle_nearby'))
+ end
+ end)
+end
+
+local function searchDatabase()
+ ESX.UI.Menu.Open('dialog', ESX.currentResourceName, 'vehicleLookup', {
+ title = TranslateCap('plate_prompt')
+ }, function(data, menu)
+ if not data.value or #data.value < 2 or #data.value > 8 then
+ return ESX.ShowNotification(TranslateCap('invalid_plate'))
+ end
+
+ getVehicleInfo(data.value, true)
+ menu.close()
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+---@param targetVehicle number The vehicle to interact with.
+local function fixVehicle(targetVehicle)
+ performActionWithProgressBar('fixing', fixConfig.duration, fixConfig.animation, function()
+ if DoesEntityExist(targetVehicle) and #(GetEntityCoords(targetVehicle) - ESX.PlayerData.coords) < 10 then
+ SetVehicleBodyHealth(targetVehicle, 1000.0)
+ SetVehicleEngineHealth(targetVehicle, 1000.0)
+ SetVehicleFuelLevel(targetVehicle, 100.0)
+ SetVehicleFixed(targetVehicle)
+ ESX.ShowNotification(TranslateCap('vehicle_fixed'))
+ else
+ ESX.ShowNotification(TranslateCap('no_vehicle_nearby'))
+ end
+ end)
+end
+
+---@param targetVehicle number The vehicle to interact with.
+local function washVehicle(targetVehicle)
+ performActionWithProgressBar('washing', washConfig.duration, washConfig.animation, function()
+ if DoesEntityExist(targetVehicle) and #(GetEntityCoords(targetVehicle) - ESX.PlayerData.coords) < 10 then
+ SetVehicleDirtLevel(targetVehicle, 0.1)
+ WashDecalsFromVehicle(targetVehicle, 1.0)
+ ESX.ShowNotification(TranslateCap('vehicle_washed'))
+ else
+ ESX.ShowNotification(TranslateCap('no_vehicle_nearby'))
+ end
+ end)
+end
+
+VehicleModule.openVehicleInteractionMenu = function()
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'vehicle_interaction', {
+ title = TranslateCap('vehicle_interaction'),
+ align = 'right',
+ elements = vehicleInteractionMenuElements
+ }, function(data, menu)
+ local vehicle, closestVehicleDistance
+
+ if data.current.requiresNearbyVehicle then
+ vehicle, closestVehicleDistance = ESX.Game.GetClosestVehicle()
+ if not vehicle or closestVehicleDistance > 5.0 then
+ return ESX.ShowNotification(TranslateCap('no_vehicle_nearby'))
+ end
+ end
+
+ if data.current.value == 'getVehicleInfo' then
+ getVehicleInfo(vehicle)
+ elseif data.current.value == 'hijackVehicle' then
+ hijackVehicle(vehicle)
+ elseif data.current.value == 'impoundVehicle' then
+ impoundVehicle(vehicle)
+ elseif data.current.value == 'searchDatabase' then
+ searchDatabase()
+ elseif data.current.value == 'fixVehicle' then
+ fixVehicle(vehicle)
+ elseif data.current.value == 'washVehicle' then
+ washVehicle(vehicle)
+ end
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+return VehicleModule
\ No newline at end of file
diff --git a/client/modules/zoneUtils.lua b/client/modules/zoneUtils.lua
new file mode 100644
index 0000000..ef2b20f
--- /dev/null
+++ b/client/modules/zoneUtils.lua
@@ -0,0 +1,65 @@
+local ZonesModule = {}
+local activeZones = {}
+
+---@class ZoneObject
+---@field zoneId string
+---@field coords vector3
+---@field distance? number
+---@field canEnter? fun():boolean|nil
+---@field onEnter? fun():nil
+---@field textUILocale string
+---@field marker table
+---@field enterSound? table
+
+---@param zoneData ZoneObject
+ZonesModule.createZonePoint = function(zoneData)
+ assert(zoneData.zoneId, 'zoneId has not been provided!')
+
+ activeZones[zoneData.zoneId] = {
+ inZone = false,
+ data = zoneData
+ }
+
+ return ESX.Point:new({
+ coords = zoneData.coords,
+ distance = zoneData.distance or 2.0,
+ enter = function()
+ if zoneData.canEnter and ESX.IsFunctionReference(zoneData.canEnter) and not zoneData.canEnter() then return false end
+ activeZones[zoneData.zoneId].inZone = true
+ ESX.TextUI((TranslateCap(zoneData.textUILocale, ESX.GetInteractKey())), 'info')
+ if zoneData.onEnter and ESX.IsFunctionReference(zoneData.onEnter) then zoneData.onEnter() end
+ if zoneData.enterSound then PlaySoundFrontend(-1, zoneData.enterSound[1], zoneData.enterSound[2], true) end
+ end,
+ leave = function()
+ activeZones[zoneData.zoneId].inZone = false
+ ESX.HideUI()
+ ESX.UI.Menu.CloseAll()
+ end,
+ inside = function()
+ DrawMarker(
+ zoneData.marker.type,
+ zoneData.coords.x, zoneData.coords.y, zoneData.coords.z,
+ 0.0, 0.0, 0.0,
+ 0.0, 0.0, 0.0,
+ zoneData.marker.scale[1], zoneData.marker.scale[2], zoneData.marker.scale[3],
+ zoneData.marker.color[1], zoneData.marker.color[2], zoneData.marker.color[3],
+ zoneData.marker.color[4],
+ zoneData.marker.bobbing,
+ zoneData.marker.faceCamera,
+ 2,
+ zoneData.marker.rotate,
+ nil,
+ nil,
+ false
+ )
+ end
+ })
+end
+
+---@param zoneId string
+---@return boolean
+ZonesModule.isInZone = function(zoneId)
+ return activeZones[zoneId] and activeZones[zoneId].inZone or false
+end
+
+return ZonesModule
diff --git a/server/armories.lua b/server/armories.lua
new file mode 100644
index 0000000..d8dacbf
--- /dev/null
+++ b/server/armories.lua
@@ -0,0 +1,252 @@
+--- Utility function to check if a weapon is authorized for a player's grade
+--- @param playerGrade string The player's grade
+--- @param weaponName string The weapon name
+--- @return boolean, table|nil: Whether the weapon is authorized, and its data if authorized
+local function isWeaponAuthorized(playerGrade, weaponName)
+ local authorizedWeapons = Config.AuthorizedWeapons[playerGrade]
+
+ for _, weapon in ipairs(authorizedWeapons) do
+ if weapon.weapon == weaponName then
+ return true, weapon
+ end
+ end
+
+ return false
+end
+
+--- Retrieves police inventory based on armory type
+--- @param armoryType string 'items' or 'weapons'
+--- @return table The inventory data
+local function getPoliceInventory(armoryType)
+ local inventory = promise:new()
+
+ TriggerEvent(armoryType == 'items' and 'esx_addoninventory:getSharedInventory' or 'esx_datastore:getSharedDataStore', 'society_police', function(data)
+ inventory:resolve(data)
+ end)
+
+ return Citizen.Await(inventory)
+end
+
+ESX.RegisterServerCallback('esx_policejob:buyWeaponOrComponent',
+ function(source, cb, weaponName, buyType, componentIndex)
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if not xPlayer or xPlayer.job.name ~= 'police' then
+ kickCheater(source, "Unauthorized weapon/component purchase attempt.")
+ return
+ end
+
+ local isAuthorized, weaponData = isWeaponAuthorized(xPlayer.job.grade_name, weaponName)
+ if not isAuthorized then
+ print(("WARNING! Player %s attempted to buy unauthorized weapon/component %s"):format(source, weaponName))
+ return cb(false)
+ end
+
+ if not weaponData then
+ print(("WARNING! Player %s attempted to buy weapon/component %s that does not exist."):format(source, weaponName))
+ return cb(false)
+ end
+
+ if buyType == 'weapon' then
+ if xPlayer.getMoney() < weaponData.price then return cb(false, 'no_money') end
+ if xPlayer.hasWeapon(weaponName) then return cb(false, 'already_owned_weapon') end
+
+ if weaponData.price > 0 then xPlayer.removeMoney(weaponData.price, "Purchased weapon") end
+ xPlayer.addWeapon(weaponName, weaponData.defaultAmmo or 100)
+ cb(true)
+ elseif buyType == 'component' then
+ local componentData = Config.WeaponComponents[weaponName] and Config.WeaponComponents[weaponName][componentIndex]
+ if not componentData or componentData.price == nil then return cb(false) end
+ if xPlayer.getMoney() < componentData.price then return cb(false, 'no_money') end
+ if xPlayer.hasWeaponComponent(componentData.name) then return cb(false, "already_owned_component") end
+
+ if componentData.price > 0 then xPlayer.removeMoney(componentData.price, 'Purchased weapon component') end
+
+ if Config.ExclusiveWeaponComponents[componentData.name] then
+ for _, incompatibleComponent in ipairs(Config.ExclusiveWeaponComponents[componentData.name]) do
+ if xPlayer.hasWeaponComponent(weaponName, incompatibleComponent) then
+ xPlayer.removeWeaponComponent(weaponName, incompatibleComponent)
+ end
+ end
+ end
+
+ xPlayer.addWeaponComponent(weaponName, componentData.name)
+ cb(true)
+ end
+ end)
+
+ESX.RegisterServerCallback('esx_policejob:getArmory', function(source, cb, armoryType)
+ local xPlayer = ESX.GetPlayerFromId(source)
+ if not xPlayer or xPlayer.job.name ~= 'police' then
+ kickCheater(source, "Unauthorized armory access.")
+ return
+ end
+
+ local inventory = getPoliceInventory(armoryType)
+ if armoryType == 'weapons' then
+ local formattedInventory = {}
+ for _, weapon in ipairs(inventory.get('weapons') or {}) do
+ table.insert(formattedInventory, { count = weapon.count, name = weapon.name, label = ESX.GetWeaponLabel(weapon.name) })
+ end
+ return cb(formattedInventory)
+ end
+
+ cb(inventory.items)
+end)
+
+--- Handles adding or removing items from the armory
+--- @param armoryType 'items' | 'weapons'
+--- @param itemName string The item name
+--- @param itemCount number The item count
+--- @param isAdding boolean Whether the action is adding or removing
+--- @return boolean, boolean|nil: Success status and count issue flag if applicable
+local function handleArmoryItem(armoryType, itemName, itemCount, isAdding)
+ local inventory = getPoliceInventory(armoryType)
+ if not inventory then return false end
+
+ if armoryType == 'weapons' then
+ local weapons = inventory.get('weapons') or {}
+ local foundWeapon = nil
+
+ for _, weapon in ipairs(weapons) do
+ if weapon.name == itemName then
+ foundWeapon = weapon
+ break
+ end
+ end
+
+ if isAdding then
+ if foundWeapon then
+ foundWeapon.count = foundWeapon.count + itemCount
+ else
+ weapons[#weapons+1] = { name = itemName, count = itemCount }
+ end
+ else
+ if not foundWeapon or foundWeapon.count < itemCount then return false, true end
+ foundWeapon.count = foundWeapon.count - itemCount
+ if foundWeapon.count <= 0 then
+ for _, weapon in ipairs(weapons) do
+ if weapon.name == itemName then
+ table.remove(weapons, _)
+ break
+ end
+ end
+ end
+ end
+
+ inventory.set('weapons', weapons)
+ else
+ if isAdding then
+ inventory.addItem(itemName, itemCount)
+ else
+ if inventory.getItem(itemName).count < itemCount then return false, true end
+ inventory.removeItem(itemName, itemCount)
+ end
+ end
+
+ return true
+end
+
+ESX.RegisterServerCallback('esx_policejob:putArmoryItem', function(source, cb, armoryType, itemName, itemCount)
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if not xPlayer or xPlayer.job.name ~= 'police' then
+ kickCheater(source, "Tried to interact with armory without police job.")
+ return cb(false)
+ end
+
+ if armoryType == 'items' then
+ if not ESX.Items[itemName] then
+ cb(false)
+ return error(("Invalid item name %s provided by %s!"):format(itemName, xPlayer.source))
+ end
+ if xPlayer.getInventoryItem(itemName).count < itemCount then
+ return cb(false, true)
+ end
+ elseif armoryType == 'weapons' then
+ if not ESX.GetWeapon(itemName) then
+ cb(false)
+ return error(("Invalid weapon name %s provided by %s!"):format(itemName, xPlayer.source))
+ end
+ if not xPlayer.getWeapon(itemName) then
+ return cb(false, true)
+ end
+ end
+
+ local success, isCountIssue = handleArmoryItem(armoryType, itemName, itemCount, true)
+ if not success then return cb(false, isCountIssue) end
+
+ if armoryType == 'weapons' then
+ xPlayer.removeWeapon(itemName)
+ xPlayer.showNotification(TranslateCap('deposited_weapon', ESX.GetWeaponLabel(itemName)))
+ else
+ xPlayer.removeInventoryItem(itemName, itemCount)
+ xPlayer.showNotification(TranslateCap('deposited_item', itemCount, itemName))
+ end
+
+ cb(true)
+end)
+
+ESX.RegisterServerCallback('esx_policejob:getArmoryItem', function(source, cb, armoryType, itemName, itemCount)
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if not xPlayer or xPlayer.job.name ~= 'police' then
+ kickCheater(source, "Tried to interact with armory without police job.")
+ return cb(false)
+ end
+
+ if armoryType == 'items' then
+ if not ESX.Items[itemName] then
+ cb(false)
+ return error(("Invalid item name %s provided by %s!"):format(itemName, xPlayer.source))
+ end
+ if not xPlayer.canCarryItem(itemName, itemCount) then
+ return cb(false, 'max_weight')
+ end
+ elseif armoryType == 'weapons' then
+ if not ESX.GetWeapon(itemName) then
+ cb(false)
+ return error(("Invalid weapon name %s provided by %s!"):format(itemName, xPlayer.source))
+ end
+ if xPlayer.hasWeapon(itemName) then
+ return cb(false, 'max_weight')
+ end
+ end
+
+ local success, isCountIssue = handleArmoryItem(armoryType, itemName, itemCount, false)
+ if not success then return cb(false, isCountIssue and 'not_enough_items_armory' or nil) end
+
+ if armoryType == 'weapons' then
+ xPlayer.addWeapon(itemName, 100)
+ else
+ xPlayer.addInventoryItem(itemName, itemCount)
+ end
+
+ xPlayer.showNotification("Armory updated.")
+ cb(true)
+end)
+
+ESX.RegisterServerCallback('esx_policejob:getPlayerInventory', function(source, cb, armoryType)
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if not xPlayer then
+ return cb(false)
+ end
+
+ if xPlayer.job.name ~= 'police' then
+ kickCheater(source, "Tried to retrieve armory weapons without police job.")
+ return cb(false)
+ end
+
+ --- Reason for this is the minimal argument in xPlayer.getInventory that does not retrieve the item label.
+ --- If there would be a method that retrieves item label on the client ( same as ESX.GetItemLabel on server ) i could refactor this and handle it on the client.
+ --- I could send the whole xPlayer.getInventory() but i don't think it's worth sending that data to the player.
+ local playerInventory = xPlayer.getInventory(true)
+ local formedPlayerInventory = {}
+
+ for itemName, itemCount in pairs(playerInventory) do
+ formedPlayerInventory[itemName] = { label = ESX.GetItemLabel(itemName), count = itemCount }
+ end
+
+ cb(armoryType == 'items' and formedPlayerInventory or xPlayer.getLoadout(true))
+end)
\ No newline at end of file
diff --git a/server/callButtons.lua b/server/callButtons.lua
new file mode 100644
index 0000000..6261585
--- /dev/null
+++ b/server/callButtons.lua
@@ -0,0 +1,32 @@
+local lastCallTimes = {}
+local callCooldown = (Config.CallButtonCooldown or 1) * 60
+
+RegisterNetEvent('esx_policejob:callForHelp', function(stationName)
+ local source = source
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ local currentTime = os.time()
+
+ if lastCallTimes[source] and (currentTime - lastCallTimes[source]) < callCooldown then
+ local timeLeft = callCooldown - (currentTime - lastCallTimes[source])
+ local timeDisplay = (timeLeft < 60) and ('%d seconds'):format(timeLeft) or ('%d minute(s)'):format(math.ceil(timeLeft / 60))
+
+ return xPlayer.showNotification(TranslateCap('request_cooldown_active', timeDisplay))
+ end
+
+ lastCallTimes[source] = currentTime
+
+ --- Right now there is no option to check how many police officers are on service]
+ local policeOfficers = ESX.GetExtendedPlayers('job', 'police')
+
+ if not policeOfficers or not next(policeOfficers) then
+ return
+ end
+
+ local str = TranslateCap('police_reqeuest', xPlayer.getName(), stationName)
+ for _, xOfficer in pairs(policeOfficers) do
+ if xOfficer.job.onDuty then
+ xOfficer.showNotification(str)
+ end
+ end
+end)
\ No newline at end of file
diff --git a/server/handcuffs.lua b/server/handcuffs.lua
new file mode 100644
index 0000000..84a30b8
--- /dev/null
+++ b/server/handcuffs.lua
@@ -0,0 +1,186 @@
+--- Checks if player is within a specific distance from the target player.
+---@param playerSource number The source player's iD.
+---@param targetSource number The target player's ID.
+---@return boolean: Returns true if the player is withi the allowed distance, false if not.
+local function isPlayerWithinDistance(playerSource, targetSource)
+ local playerPed = GetPlayerPed(playerSource)
+ local targetPed = GetPlayerPed(targetSource)
+
+ if not playerPed or not targetPed then
+ return false
+ end
+
+ local playerCoords = GetEntityCoords(playerPed)
+ local targetCoords = GetEntityCoords(targetPed)
+
+ return #(playerCoords - targetCoords) <= (Config.AllowedHandcuffDistance or 10.0)
+end
+
+ESX.RegisterServerCallback('esx_policejob:handcuffPlayer', function(source, cb, target)
+ if not isPlayerWithinDistance(source, target) then
+ return cb(false, 'no_players_nearby')
+ end
+
+ local targetPlayer = Player(target)
+ if targetPlayer.state.isHandcuffed then
+ return cb(false, 'already_handcuffed')
+ end
+
+ Player(target).state:set('isHandcuffed', true, true)
+ TriggerClientEvent('esx_policejob:updateHandcuffedStatus', target, true, source)
+ cb(true)
+end)
+
+ESX.RegisterServerCallback('esx_policejob:uncuffPlayer', function(source, cb, target)
+ if not isPlayerWithinDistance(source, target) then
+ return cb(false, 'no_players_nearby')
+ end
+
+ local targetPlayer = Player(target)
+ if not targetPlayer.state.isHandcuffed then
+ return cb(false, 'not_handcuffed')
+ end
+
+ targetPlayer.state:set('isHandcuffed', false, true)
+ TriggerClientEvent('esx_policejob:updateHandcuffedStatus', target, false, source)
+
+ cb(false)
+end)
+
+
+RegisterNetEvent('esx_policejob:dragPlayer', function(target)
+ local source = source
+
+ if not isPlayerWithinDistance(source, target) then
+ return
+ end
+
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if not Player(target).state.isHandcuffed then
+ return xPlayer.showNotification(TranslateCap('not_handcuffed'))
+ end
+
+ local isDragged = Player(target).state.isDragged
+
+ local newDragState = not isDragged
+ Player(target).state:set('isDragged', newDragState, true)
+ TriggerClientEvent('esx_policejob:toggleDrag', target, source, newDragState)
+end)
+
+RegisterNetEvent('esx_policejob:putInVehicle', function(target, vehicleNetId)
+ local source = source
+
+ if not isPlayerWithinDistance(source, target) then
+ return
+ end
+
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if not Player(target).state.isHandcuffed then
+ return xPlayer.showNotification(TranslateCap('not_handcuffed'))
+ end
+
+ TriggerClientEvent('esx_policejob:getInVehicle', target, vehicleNetId)
+end)
+
+RegisterNetEvent('esx_policejob:putOutVehicle', function(target, vehicleNetId)
+ local source = source
+
+ if not isPlayerWithinDistance(source, target) then
+ return
+ end
+
+ TriggerClientEvent('esx_policejob:getOutVehicle', target, vehicleNetId, source)
+end)
+
+local function canConfiscate(itemName, itemCount, target)
+ if not Player(target).state.isHandcuffed then
+ return false, 'not_handcuffed'
+ end
+
+ if itemCount < 1 then
+ return false, 'invalid_amount'
+ end
+
+ if not isItemSearchable(itemName) then
+ return false, 'item_blacklisted'
+ end
+
+ return true
+end
+
+RegisterNetEvent('esx_policejob:confiscatePlayerItem', function(target, itemType, itemName, itemCount)
+ local source = source
+
+ if not isPlayerWithinDistance(source, target) then
+ return
+ end
+
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ local success, canConfiscateResponse = canConfiscate(itemName, itemCount, target)
+
+ if not success then
+ return xPlayer.showNotification(TranslateCap(canConfiscateResponse))
+ end
+
+ local targetPlayer = ESX.GetPlayerFromId(target)
+
+ if itemType == 'item' then
+ local targetInventoryItem = targetPlayer.getInventoryItem(itemName)
+
+ if not targetInventoryItem then
+ return xPlayer.showNotification(TranslateCap('invalid_amount'))
+ end
+
+ if targetInventoryItem.count < itemCount then
+ return xPlayer.showNotification(TranslateCap('has_not_enough', itemCount, targetInventoryItem.label))
+ end
+
+ if not xPlayer.canCarryItem(itemName, itemCount) then
+ return xPlayer.showNotification(TranslateCap('max_weight'))
+ end
+
+ targetPlayer.removeInventoryItem(itemName, itemCount)
+ xPlayer.addInventoryItem(itemName, itemCount)
+
+ xPlayer.showNotification(TranslateCap('you_confiscated', itemCount, targetInventoryItem.label, targetPlayer.name))
+ targetPlayer.showNotification(TranslateCap('got_confiscated', itemCount, targetInventoryItem.label, xPlayer.name))
+ elseif itemType == 'weapon' then
+ if not targetPlayer.hasWeapon(itemName) then
+ return xPlayer.showNotification(TranslateCap('invalid_amount'))
+ end
+
+ if xPlayer.hasWeapon(itemName) then
+ return xPlayer.showNotification(TranslateCap('already_owned_weapon'))
+ end
+
+ targetPlayer.removeWeapon(itemName)
+ xPlayer.addWeapon(itemName, itemCount)
+
+ local weaponLabel = ESX.GetWeaponLabel(itemName)
+ xPlayer.showNotification(TranslateCap('you_confiscated_weapon', weaponLabel, targetPlayer.name))
+ targetPlayer.showNotification(TranslateCap('got_confiscated_weapon', weaponLabel, xPlayer.name))
+ elseif itemType == 'money' then
+ local targetAccount = targetPlayer.getAccount(itemName)
+
+ if not targetAccount or targetAccount.money < itemCount then
+ return xPlayer.showNotification(TranslateCap('invalid_amount'))
+ end
+
+ targetPlayer.removeAccountMoney(itemName, itemCount, 'Confiscated')
+ xPlayer.addAccountMoney(itemName, itemCount, 'Confiscated')
+
+ xPlayer.showNotification(TranslateCap('you_confiscated_account', itemCount, targetPlayer.name, itemName))
+ targetPlayer.showNotification(TranslateCap('got_confiscated_account', itemCount, itemName, xPlayer.name))
+ end
+end)
+
+CreateThread(function()
+ for _, playerId in ipairs(GetPlayers()) do
+ local player = Player(playerId)
+ player.state:set('isHandcuffed', nil, true)
+ player.state:set('isDragged', nil, true)
+ end
+end)
\ No newline at end of file
diff --git a/server/main.lua b/server/main.lua
index c1bc37f..050b606 100644
--- a/server/main.lua
+++ b/server/main.lua
@@ -1,433 +1,155 @@
-if Config.EnableESXService then
- if Config.MaxInService ~= -1 then
- TriggerEvent('esx_service:activateService', 'police', Config.MaxInService)
+local modules = {
+ ['playerManagement'] = 'esx_society',
+ ['esxIdentity'] = 'esx_identity',
+ ['esxOptionalNeeds'] = 'esx_optionalneeds',
+ ['esxLicense'] = 'esx_license',
+ ['esxService'] = 'esx_service',
+ ['esxBilling'] = 'esx_billing'
+}
+
+for moduleName, isEnabled in pairs(Config.EnabledModules) do
+ if isEnabled and modules[moduleName] and GetResourceState(modules[moduleName]) == 'missing' then
+ print(("WARNING! %s module is enabled in Config.EnabeldModules but missing as a resource %s. Please download the latest release on https://github.com/orgs/esx-framework/repositories"):format(moduleName, modules[moduleName]))
end
end
-TriggerEvent('esx_phone:registerNumber', 'police', TranslateCap('alert_police'), true, true)
-TriggerEvent('esx_society:registerSociety', 'police', TranslateCap('society_police'), 'society_police', 'society_police', 'society_police', {type = 'public'})
-
-RegisterNetEvent('esx_policejob:confiscatePlayerItem')
-AddEventHandler('esx_policejob:confiscatePlayerItem', function(target, itemType, itemName, amount)
- local source = source
- local sourceXPlayer = ESX.GetPlayerFromId(source)
- local targetXPlayer = ESX.GetPlayerFromId(target)
-
- if sourceXPlayer.job.name ~= 'police' then
- print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit The Confuscation System!'):format(sourceXPlayer.source))
- return
- end
-
- if itemType == 'item_standard' then
- local targetItem = targetXPlayer.getInventoryItem(itemName)
- local sourceItem = sourceXPlayer.getInventoryItem(itemName)
-
- -- does the target player have enough in their inventory?
- if targetItem.count > 0 and targetItem.count <= amount then
-
- -- can the player carry the said amount of x item?
- if sourceXPlayer.canCarryItem(itemName, sourceItem.count) then
- targetXPlayer.removeInventoryItem(itemName, amount)
- sourceXPlayer.addInventoryItem (itemName, amount)
- sourceXPlayer.showNotification(TranslateCap('you_confiscated', amount, sourceItem.label, targetXPlayer.name))
- targetXPlayer.showNotification(TranslateCap('got_confiscated', amount, sourceItem.label, sourceXPlayer.name))
- else
- sourceXPlayer.showNotification(TranslateCap('quantity_invalid'))
- end
- else
- sourceXPlayer.showNotification(TranslateCap('quantity_invalid'))
- end
-
- elseif itemType == 'item_account' then
- local targetAccount = targetXPlayer.getAccount(itemName)
-
- -- does the target player have enough money?
- if targetAccount.money >= amount then
- targetXPlayer.removeAccountMoney(itemName, amount, "Confiscated")
- sourceXPlayer.addAccountMoney (itemName, amount, "Confiscated")
-
- sourceXPlayer.showNotification(TranslateCap('you_confiscated_account', amount, itemName, targetXPlayer.name))
- targetXPlayer.showNotification(TranslateCap('got_confiscated_account', amount, itemName, sourceXPlayer.name))
- else
- sourceXPlayer.showNotification(TranslateCap('quantity_invalid'))
- end
-
- elseif itemType == 'item_weapon' then
- if amount == nil then amount = 0 end
-
- -- does the target player have weapon?
- if targetXPlayer.hasWeapon(itemName) then
- targetXPlayer.removeWeapon(itemName)
- sourceXPlayer.addWeapon (itemName, amount)
-
- sourceXPlayer.showNotification(TranslateCap('you_confiscated_weapon', ESX.GetWeaponLabel(itemName), targetXPlayer.name, amount))
- targetXPlayer.showNotification(TranslateCap('got_confiscated_weapon', ESX.GetWeaponLabel(itemName), amount, sourceXPlayer.name))
- else
- sourceXPlayer.showNotification(TranslateCap('quantity_invalid'))
- end
- end
-end)
-
-RegisterNetEvent('esx_policejob:handcuff')
-AddEventHandler('esx_policejob:handcuff', function(target)
- local xPlayer = ESX.GetPlayerFromId(source)
-
- if xPlayer.job.name == 'police' then
- TriggerClientEvent('esx_policejob:handcuff', target)
- else
- print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit Handcuffs!'):format(xPlayer.source))
- end
-end)
+if Config.EnabledModules.esxService then
+ -- -1 was supposed to remove the limit completely - doesn't work in current esx_service
+ -- Which is why i created this work-around.
+ Config.MaxInService = Config.MaxInService == -1 and GetConvarInt('sv_maxclients', 512) or Config.MaxInService
+ TriggerEvent('esx_service:activateService', 'police', Config.MaxInService)
+end
-RegisterNetEvent('esx_policejob:drag')
-AddEventHandler('esx_policejob:drag', function(target)
- local xPlayer = ESX.GetPlayerFromId(source)
+if Config.EnabledModules.playerManagement then
+ TriggerEvent('esx_society:registerSociety', 'police', 'Police', 'society_police', 'society_police', 'society_police', {type = 'public'})
+end
- if xPlayer.job.name == 'police' then
- TriggerClientEvent('esx_policejob:drag', target, source)
- else
- print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit Dragging!'):format(xPlayer.source))
- end
-end)
-RegisterNetEvent('esx_policejob:putInVehicle')
-AddEventHandler('esx_policejob:putInVehicle', function(target)
- local xPlayer = ESX.GetPlayerFromId(source)
+---@param source number The player's server ID to kick
+---@param reason string The kick reason
+function kickCheater(source, reason)
+ local xPlayer = ESX.GetPlayerFromId(source)
+ if xPlayer then
+ xPlayer.kick(reason)
+ end
+ error(("Player %d has been kicked! Reason: %s"):format(source, reason))
+end
- if xPlayer.job.name == 'police' then
- TriggerClientEvent('esx_policejob:putInVehicle', target)
- else
- print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit Garage!'):format(xPlayer.source))
+ESX.RegisterServerCallback('esx_policejob:getOtherPlayerData', function(source, cb, target, requiredData)
+ local xTarget, xPlayer = ESX.GetPlayerFromId(target), ESX.GetPlayerFromId(source)
+
+ if not xTarget then
+ cb(false)
+ return xPlayer.showNotification(TranslateCap('no_players_nearby'))
end
-end)
-RegisterNetEvent('esx_policejob:OutVehicle')
-AddEventHandler('esx_policejob:OutVehicle', function(target)
- local xPlayer = ESX.GetPlayerFromId(source)
+ local targetData = {
+ name = xTarget.getName(),
+ job = ("%s - %s"):format(xTarget.job.label, xTarget.job.grade_label)
+ }
- if xPlayer.job.name == 'police' then
- TriggerClientEvent('esx_policejob:OutVehicle', target)
- else
- print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit Dragging Out Of Vehicle!'):format(xPlayer.source))
+ if Config.EnabledModules.esxIdentity then
+ targetData.dob = xTarget.get('dateofbirth')
+ targetData.height = xTarget.get('height')
+ targetData.sex = (xTarget.get('sex') == 'm') and 'male' or 'female'
end
-end)
-
-RegisterNetEvent('esx_policejob:getStockItem')
-AddEventHandler('esx_policejob:getStockItem', function(itemName, count)
- local source = source
- local xPlayer = ESX.GetPlayerFromId(source)
- TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
- local inventoryItem = inventory.getItem(itemName)
-
- -- is there enough in the society?
- if count > 0 and inventoryItem.count >= count then
-
- -- can the player carry the said amount of x item?
- if xPlayer.canCarryItem(itemName, count) then
- inventory.removeItem(itemName, count)
- xPlayer.addInventoryItem(itemName, count)
- xPlayer.showNotification(TranslateCap('have_withdrawn', count, inventoryItem.name))
- else
- xPlayer.showNotification(TranslateCap('quantity_invalid'))
- end
- else
- xPlayer.showNotification(TranslateCap('quantity_invalid'))
+ if requiredData then
+ if requiredData.inventory then
+ targetData.inventory = xTarget.getInventory(true)
end
- end)
-end)
-
-RegisterNetEvent('esx_policejob:putStockItems')
-AddEventHandler('esx_policejob:putStockItems', function(itemName, count)
- local xPlayer = ESX.GetPlayerFromId(source)
- local sourceItem = xPlayer.getInventoryItem(itemName)
-
- TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
- local inventoryItem = inventory.getItem(itemName)
- -- does the player have enough of the item?
- if sourceItem.count >= count and count > 0 then
- xPlayer.removeInventoryItem(itemName, count)
- inventory.addItem(itemName, count)
- xPlayer.showNotification(TranslateCap('have_deposited', count, inventoryItem.name))
- else
- xPlayer.showNotification(TranslateCap('quantity_invalid'))
+ if requiredData.accounts then
+ targetData.accounts = xTarget.getAccounts()
end
- end)
-end)
-
-ESX.RegisterServerCallback('esx_policejob:getOtherPlayerData', function(source, cb, target, notify)
- local xPlayer = ESX.GetPlayerFromId(target)
-
- if notify then
- xPlayer.showNotification(TranslateCap('being_searched'))
- end
-
- if xPlayer then
- local data = {
- name = xPlayer.getName(),
- job = xPlayer.job.label,
- grade = xPlayer.job.grade_label,
- inventory = xPlayer.getInventory(),
- accounts = xPlayer.getAccounts(),
- weapons = xPlayer.getLoadout()
- }
- if Config.EnableESXIdentity then
- data.dob = xPlayer.get('dateofbirth')
- data.height = xPlayer.get('height')
-
- if xPlayer.get('sex') == 'm' then data.sex = 'male' else data.sex = 'female' end
+ if requiredData.loadout then
+ targetData.loadout = xTarget.getLoadout(true)
end
- TriggerEvent('esx_status:getStatus', target, 'drunk', function(status)
- if status then
- data.drunk = ESX.Math.Round(status.percent)
- end
- end)
-
- if Config.EnableLicenses then
+ if requiredData.licenses then
TriggerEvent('esx_license:getLicenses', target, function(licenses)
- data.licenses = licenses
- cb(data)
+ targetData.licenses = licenses
end)
- else
- cb(data)
- end
- end
-end)
-
-local fineList = {}
-ESX.RegisterServerCallback('esx_policejob:getFineList', function(source, cb, category)
- if not fineList[category] then
- MySQL.query('SELECT * FROM fine_types WHERE category = ?', {category},
- function(fines)
- fineList[category] = fines
-
- cb(fines)
- end)
- else
- cb(fineList[category])
- end
-end)
-
-
-ESX.RegisterServerCallback('esx_policejob:getVehicleInfos', function(source, cb, plate)
- local retrivedInfo = {
- plate = plate
- }
- if Config.EnableESXIdentity then
- MySQL.single('SELECT users.firstname, users.lastname FROM owned_vehicles JOIN users ON owned_vehicles.owner = users.identifier WHERE plate = ?', {plate},
- function(result)
- if result then
- retrivedInfo.owner = ('%s %s'):format(result.firstname, result.lastname)
+
+ if not targetData.licenses then
+ ESX.Await(function()
+ return targetData.licenses ~= nil
+ end, 'Failed to retrieve licenses after 200ms', 200)
end
- cb(retrivedInfo)
- end)
- else
- MySQL.scalar('SELECT owner FROM owned_vehicles WHERE plate = ?', {plate},
- function(owner)
- if owner then
- local xPlayer = ESX.GetPlayerFromIdentifier(owner)
- if xPlayer then
- retrivedInfo.owner = xPlayer.getName()
- end
- end
- cb(retrivedInfo)
- end)
- end
-end)
-
-ESX.RegisterServerCallback('esx_policejob:getArmoryWeapons', function(source, cb)
- TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
- local weapons = store.get('weapons')
-
- if weapons == nil then
- weapons = {}
end
- cb(weapons)
- end)
-end)
-
-ESX.RegisterServerCallback('esx_policejob:addArmoryWeapon', function(source, cb, weaponName, removeWeapon)
- local xPlayer = ESX.GetPlayerFromId(source)
-
- if removeWeapon then
- xPlayer.removeWeapon(weaponName)
- end
-
- TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
- local weapons = store.get('weapons') or {}
- local foundWeapon = false
+ if requiredData.drunk and Config.EnabledModules.esxOptionalNeeds then
+ TriggerEvent('esx_status:getStatus', target, 'drunk', function(status)
+ print(json.encode(status))
+ if status then
+ targetData.drunk = ESX.Math.Round(status.percent, 1)
+ end
+ end)
- for i=1, #weapons, 1 do
- if weapons[i].name == weaponName then
- weapons[i].count = weapons[i].count + 1
- foundWeapon = true
- break
+ if not targetData.drunk then
+ ESX.Await(function()
+ return targetData.drunk ~= nil
+ end, 'Failed to retrieve drunk status after 200ms', 200)
end
end
+ end
- if not foundWeapon then
- table.insert(weapons, {
- name = weaponName,
- count = 1
- })
- end
-
- store.set('weapons', weapons)
- cb()
- end)
+ cb(targetData)
end)
-ESX.RegisterServerCallback('esx_policejob:removeArmoryWeapon', function(source, cb, weaponName)
- local xPlayer = ESX.GetPlayerFromId(source)
- xPlayer.addWeapon(weaponName, 500)
-
- TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
- local weapons = store.get('weapons') or {}
-
- local foundWeapon = false
-
- for i=1, #weapons, 1 do
- if weapons[i].name == weaponName then
- weapons[i].count = (weapons[i].count > 0 and weapons[i].count - 1 or 0)
- foundWeapon = true
- break
- end
- end
-
- if not foundWeapon then
- table.insert(weapons, {
- name = weaponName,
- count = 0
- })
- end
-
- store.set('weapons', weapons)
- cb()
- end)
+local cachedFineLists = {}
+ESX.RegisterServerCallback('esx_policejob:getFinesFromCategory', function(source, cb, category)
+ if not cachedFineLists[category] then
+ cachedFineLists[category] = MySQL.prepare.await('SELECT * FROM fine_types WHERE category = ?', { category })
+ end
+ cb(cachedFineLists[category])
end)
-ESX.RegisterServerCallback('esx_policejob:buyWeapon', function(source, cb, weaponName, type, componentNum)
- local xPlayer = ESX.GetPlayerFromId(source)
- local authorizedWeapons, selectedWeapon = Config.AuthorizedWeapons[xPlayer.job.grade_name]
-
- for k,v in ipairs(authorizedWeapons) do
- if v.weapon == weaponName then
- selectedWeapon = v
- break
- end
- end
-
- if not selectedWeapon then
- print(('[^3WARNING^7] Player ^5%s^7 Attempted To Buy Invalid Weapon - ^5%s^7!'):format(source, weaponName))
- cb(false)
- else
- -- Weapon
- if type == 1 then
- if xPlayer.getMoney() >= selectedWeapon.price then
- xPlayer.removeMoney(selectedWeapon.price, "Weapon Bought")
- xPlayer.addWeapon(weaponName, 100)
-
- cb(true)
- else
- cb(false)
- end
-
- -- Weapon Component
- elseif type == 2 then
- local price = selectedWeapon.components[componentNum]
- local weaponNum, weapon = ESX.GetWeapon(weaponName)
- local component = weapon.components[componentNum]
-
- if component then
- if xPlayer.getMoney() >= price then
- xPlayer.removeMoney(price, "Weapon Component Bought")
- xPlayer.addWeaponComponent(weaponName, component.name)
-
- cb(true)
- else
- cb(false)
- end
- else
- print(('[^3WARNING^7] Player ^5%s^7 Attempted To Buy Invalid Weapon Component - ^5%s^7!'):format(source, componentNum))
- cb(false)
- end
- end
+RegisterNetEvent('esx_policejob:notify', function(targetPlayer, message)
+ local source = source
+ if not targetPlayer or tonumber(targetPlayer) < 1 then
+ return kickCheater(source, ('Trying to notify an invalid player %s with the message %s'):format(targetPlayer, message))
end
-end)
-ESX.RegisterServerCallback('esx_policejob:buyJobVehicle', function(source, cb, vehicleProps, type)
local xPlayer = ESX.GetPlayerFromId(source)
- local price = getPriceFromHash(vehicleProps.model, xPlayer.job.grade_name, type)
- -- vehicle model not found
- if price == 0 then
- print(('[^3WARNING^7] Player ^5%s^7 Attempted To Buy Invalid Vehicle - ^5%s^7!'):format(source, vehicleProps.model))
- cb(false)
- else
- if xPlayer.getMoney() >= price then
- xPlayer.removeMoney(price, "Job Vehicle Bought")
-
- MySQL.insert('INSERT INTO owned_vehicles (owner, vehicle, plate, type, job, `stored`) VALUES (?, ?, ?, ?, ?, ?)', { xPlayer.identifier, json.encode(vehicleProps), vehicleProps.plate, type, xPlayer.job.name, true},
- function (rowsChanged)
- cb(true)
- end)
- else
- cb(false)
- end
+ if xPlayer.job.name ~= 'police' then
+ return kickCheater(source, 'Trying to use notify event without police job.')
end
-end)
-
-ESX.RegisterServerCallback('esx_policejob:storeNearbyVehicle', function(source, cb, plates)
- local xPlayer = ESX.GetPlayerFromId(source)
-
- local plate = MySQL.scalar.await('SELECT plate FROM owned_vehicles WHERE owner = ? AND plate IN (?) AND job = ?', {xPlayer.identifier, plates, xPlayer.job.name})
- if plate then
- MySQL.update('UPDATE owned_vehicles SET `stored` = true WHERE owner = ? AND plate = ? AND job = ?', {xPlayer.identifier, plate, xPlayer.job.name},
- function(rowsChanged)
- if rowsChanged == 0 then
- cb(false)
- else
- cb(plate)
- end
- end)
- else
- cb(false)
+ local xTarget = ESX.GetPlayerFromId(source)
+ if xTarget then
+ xTarget.showNotification(message)
end
end)
-function getPriceFromHash(vehicleHash, jobGrade, type)
- local vehicles = Config.AuthorizedVehicles[type][jobGrade]
+if Config.EnabledModules.esxService then
+ local serviceNotifications = {
+ left = {
+ title = TranslateCap('service_announcement'),
+ subject = '',
+ msg = '',
+ iconType = 1
+ },
+ enterred = {
+ title = TranslateCap('service_anonunce'),
+ subject = '',
+ msg = '',
+ iconType = 1
+ }
+ }
+
+ RegisterNetEvent('esx_policejob:toggledService', function(newStatus)
+ local source = source
+ local xPlayer = ESX.GetPlayerFromId(source)
- for i = 1, #vehicles do
- local vehicle = vehicles[i]
- if GetHashKey(vehicle.model) == vehicleHash then
- return vehicle.price
+ if xPlayer.job.name ~= 'police' then
+ return kickCheater(source, 'Trying to use toggledService event without police job.')
end
- end
-
- return 0
-end
-ESX.RegisterServerCallback('esx_policejob:getStockItems', function(source, cb)
- TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
- cb(inventory.items)
+ local notification = newStatus and serviceNotifications.enterred or serviceNotifications.left
+ notification.msg = newStatus and TranslateCap('service_enterred_announcement', xPlayer.name) or TranslateCap('service_left_announcement', xPlayer.name)
+ TriggerEvent('esx_service:notifyAllInService', notification, 'police', source)
end)
-end)
-
-ESX.RegisterServerCallback('esx_policejob:getPlayerInventory', function(source, cb)
- local xPlayer = ESX.GetPlayerFromId(source)
- local items = xPlayer.inventory
-
- cb({items = items})
-end)
-
-AddEventHandler('onResourceStop', function(resource)
- if resource == GetCurrentResourceName() then
- TriggerEvent('esx_phone:removeNumber', 'police')
- end
-end)
+end
\ No newline at end of file
diff --git a/server/vehicleActions.lua b/server/vehicleActions.lua
new file mode 100644
index 0000000..46258e1
--- /dev/null
+++ b/server/vehicleActions.lua
@@ -0,0 +1,47 @@
+RegisterNetEvent('esx_policejob:impoundVehicle', function(vehicleNetId, vehicleProps)
+ local source = source
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if not xPlayer or xPlayer.job.name ~= 'police' then
+ return kickCheater(source, 'Trying to impound a vehicle without having the police job')
+ end
+
+ local vehicle = NetworkGetEntityFromNetworkId(vehicleNetId)
+ if DoesEntityExist(vehicle) then
+ local plate = GetVehicleNumberPlateText(vehicle)
+ DeleteEntity(vehicle)
+
+ local owner = MySQL.prepare.await('SELECT owner FROM owned_vehicles WHERE plate = ?', { plate })
+ if owner then
+ local xOwner = ESX.GetPlayerFromIdentifier(owner)
+ if xOwner then
+ xOwner.showNotification(TranslateCap('owner_vehicle_impounded'))
+ end
+ MySQL.prepare('UPDATE owned_vehicles SET stored = 1, vehicle = ?, parking = "MissionRowPD" WHERE plate = ?', { json.encode(vehicleProps), plate })
+ end
+ end
+end)
+
+local preparedQueries = {
+ identity = 'SELECT users.firstname, users.lastname, users.identifier FROM owned_vehicles JOIN users ON owned_vehicles.owner = users.identifier WHERE plate = ?',
+ native = 'SELECT owner FROM owned_vehicles WHERE plate = ?'
+}
+
+ESX.RegisterServerCallback('esx_policejob:getVehicleData', function(source, cb, plate)
+ assert(plate, ('cb triggered by %s provided an invalid plate.'):format(source))
+
+ local query = Config.EnabledModules.esxIdentity and preparedQueries.identity or preparedQueries.native
+ local result = MySQL.prepare.await(query, { plate })
+
+ local vehicleData = { plate = plate }
+ if result then
+ vehicleData.owner = Config.EnabledModules.esxIdentity and ('%s %s'):format(result.firstname, result.lastname) or result.owner
+
+ if not Config.EnabledModules.esxIdentity then
+ local xPlayer = ESX.GetPlayerFromIdentifier(result.owner)
+ vehicleData.owner = xPlayer and xPlayer.getName() or vehicleData.owner -- if player is online it switches to name, if not just stays at identifier.
+ end
+ end
+
+ cb(vehicleData)
+end)
\ No newline at end of file
diff --git a/shared/utils.lua b/shared/utils.lua
new file mode 100644
index 0000000..528c8b3
--- /dev/null
+++ b/shared/utils.lua
@@ -0,0 +1,34 @@
+---@param item string
+---@return boolean
+function isItemSearchable(item)
+ for _, blacklistedItem in ipairs(Config.TakeItemBlacklist) do
+ if blacklistedItem == item then
+ return false
+ end
+ end
+ return true
+end
+
+if not IsDuplicityVersion() then
+ ---@return boolean
+ function isInService()
+ return ESX.AwaitServerCallback('esx_service:isInService', 'police')
+ end
+
+ ---@param customTitle? string
+ ---@return any
+ function openAmountDialog(customTitle)
+ local itemCount = promise:new()
+
+ ESX.UI.Menu.Open('dialog', ESX.currentResourceName, 'police_amountDialogMenu', {
+ title = customTitle or TranslateCap('amount'),
+ }, function(countData, countMenu)
+ itemCount:resolve(tonumber(countData.value))
+ countMenu.close()
+ end, function(countData, countMenu)
+ countMenu.close()
+ end)
+
+ return Citizen.Await(itemCount)
+ end
+end
From 448d23314a61f2ae9715a21f7624d0bec69dbcdd Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:28:13 +0100
Subject: [PATCH 06/18] Config, readme and fxmanifest changes
---
README.md | 55 ++++++++++++++++++++++++++++----------------------
config.lua | 8 ++++----
fxmanifest.lua | 2 +-
3 files changed, 36 insertions(+), 29 deletions(-)
diff --git a/README.md b/README.md
index 10203b6..a947f77 100644
--- a/README.md
+++ b/README.md
@@ -2,27 +2,22 @@
This resource for ESX adds police armories, vehicle garages and ability for cops to search, handcuff people and much more.
-### Requirements
-* Auto mode
- * [esx_billing](https://github.com/esx-framework/esx_billing)
- * [esx_vehicleshop](https://github.com/esx-framework/esx_vehicleshop)
+### **Required Dependencies**
-* Player management (boss actions and armory with buyable weapons)
- * [esx_addoninventory](https://github.com/esx-framework/esx_addoninventory)
- * [esx_datastore](https://github.com/esx-framework/esx_datastore)
- * [esx_society](https://github.com/esx-framework/esx_society)
+These dependencies are required **100%** for the resource to function properly:
-* ESX Identity Support
- * [esx_identity](https://github.com/esx-framework/esx_core/tree/main/%5Bcore%5D/esx_identity)
+* [ox_lib](https://github.com/overextended/ox_lib)
+* [esx_service](https://github.com/esx-framework/esx_service) *(Required on the server, but can be disabled in Config)*
+* [esx_society](https://github.com/esx-framework/esx_society) *(Required on the server, but can be disabled in Config)*
-* ESX License Support
- * [esx_license](https://github.com/esx-framework/esx_license)
+### **Optional Features Based on Configuration**
-* ESX Service Support
- * [esx_service](https://github.com/esx-framework/esx_service)
+These additional features can be enabled/disabled through the configuration in `Config.EnabledModules`:
-* ESX Status Support
- * [esx_status](https://github.com/esx-framework/esx_status)
+- **esx_optionalneeds** - *Allows checking the drunk state of a player (e.g., police officers can check the alcohol level of other players).*
+- **esx_license** - *Allows police officers to give and remove licenses from players.*
+
+These features are optional, and only required if enabled in the configuration.
## Download & Installation
@@ -41,20 +36,32 @@ git clone https://github.com/esx-framework/esx_policejob [esx]/esx_policejob
- Download https://github.com/esx-framework/esx_policejob/archive/master.zip
- Put it in the `[esx]` directory
+### Installation
+
+1. **Database Setup**
+ - Import the `esx_policejob.sql` file into your database.
+
+2. **Enable Optional Features**
+ Modify the `Config.EnabledModules` section in the `config.lua` file to enable the following features:
+
+ - **License Management:**
+ Set `Config.EnabledModules.esxLicense` to `true` to allow adding and removing licenses.
-## Installation
-- Import `esx_policejob.sql` in your database
-- Add this to your server.cfg:
+ - **Fine Issuing:**
+ Set `Config.EnabledModules.esxBilling` to `true` if you want to enable the ability to issue fines.
+
+ - **ID Card Info:**
+ Set `Config.EnabledModules.esxIdentity` to `true` to include additional information like gender, height, and date of birth on the ID card.
+
+ - **Drunk Level:**
+ Set `Config.EnabledModules.esxOptionalNeeds` to `true` to display the player's drunk level on the ID card.
+
+- Add this to your `server.cfg`:
```
start esx_policejob
```
-- * If you want player management you have to set `Config.EnablePlayerManagement` to `true` in `config.lua`
- * If you want armory management you have to set `Config.EnableArmoryManagement` to `true` in `config.lua`
- * If you want license management you have to set `Config.EnableLicenses` to `true` in `config.lua`
- * If you want service management you have to set `Config.MaxInService` to a higher value than `-1` in `config.lua`
-
# Legal
### License
esx_policejob - police script for ESX
diff --git a/config.lua b/config.lua
index 0a848c7..70cea72 100644
--- a/config.lua
+++ b/config.lua
@@ -11,11 +11,11 @@ Config.Keybinds = {
Config.EnabledModules = {
playerManagement = true, -- Enable if you want esx_society management
- esxIdentity = true, -- Enable if you're using esx_identity
- esxOptionalNeeds = true, -- Enable if you're using esx_optionalneeds
- esxLicense = true, -- Enable if you're using esx_license
+ esxIdentity = false, -- Enable if you're using esx_identity
+ esxOptionalNeeds = false, -- Enable if you're using esx_optionalneeds
+ esxLicense = false, -- Enable if you're using esx_license
esxService = true, -- Enable if you're using esx_service
- esxBilling = true, -- Enable if you're using esx_billing and want police officers to issue fines
+ esxBilling = false, -- Enable if you're using esx_billing and want police officers to issue fines
esxProgressBar = true, -- Enable if you're using ESX.Progressbar function (if not, all vehicle actions will be immediate)
}
diff --git a/fxmanifest.lua b/fxmanifest.lua
index 7e51fe9..1ff0829 100644
--- a/fxmanifest.lua
+++ b/fxmanifest.lua
@@ -33,6 +33,6 @@ files {
dependencies {
'es_extended',
'ox_lib',
- 'esx_service', -- Hate the fact that this has to be a dependency since i made it "optional" with Config.EnabledModules.esxService...
+ 'esx_service',
'esx_society'
}
\ No newline at end of file
From 3015e0d13c455970e0b6ac71d05e1a8e433d60cf Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:38:54 +0100
Subject: [PATCH 07/18] Create en_esx_policejob.sql
---
localization/en_esx_policejob.sql | 88 +++++++++++++++++++++++++++++++
1 file changed, 88 insertions(+)
create mode 100644 localization/en_esx_policejob.sql
diff --git a/localization/en_esx_policejob.sql b/localization/en_esx_policejob.sql
new file mode 100644
index 0000000..7792cb0
--- /dev/null
+++ b/localization/en_esx_policejob.sql
@@ -0,0 +1,88 @@
+INSERT INTO `addon_account` (name, label, shared)
+VALUES ('society_police', 'Police', 1);
+
+INSERT INTO `addon_inventory` (name, label, shared)
+VALUES ('society_police', 'Police', 1);
+
+INSERT INTO `datastore` (name, label, shared)
+VALUES ('society_police', 'Police', 1);
+
+INSERT INTO `jobs` (name, label)
+VALUES ('police', 'Police');
+
+INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female)
+VALUES
+ ('police', 0, 'recruit', 'Recruit', 10, '{}', '{}'),
+ ('police', 1, 'officer', 'Officer', 20, '{}', '{}'),
+ ('police', 2, 'sergeant', 'Sergeant', 30, '{}', '{}'),
+ ('police', 3, 'lieutenant', 'Lieutenant', 40, '{}', '{}'),
+ ('police', 4, 'boss', 'Chief', 0, '{}', '{}')
+;
+
+CREATE TABLE `fine_types` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `label` varchar(255) DEFAULT NULL,
+ `amount` int DEFAULT NULL,
+ `category` int DEFAULT NULL,
+
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+
+INSERT INTO `fine_types` (label, amount, category) VALUES
+ ('Misuse of a horn', 30, 0),
+ ('Illegally Crossing a continuous Line', 40, 0),
+ ('Driving on the wrong side of the road', 250, 0),
+ ('Illegal U-Turn', 250, 0),
+ ('Illegally Driving Off-road', 170, 0),
+ ('Refusing a Lawful Command', 30, 0),
+ ('Illegally Stopping a Vehicle', 150, 0),
+ ('Illegal Parking', 70, 0),
+ ('Failing to Yield to the right', 70, 0),
+ ('Failure to comply with Vehicle Information', 90, 0),
+ ('Failing to stop at a Stop Sign ', 105, 0),
+ ('Failing to stop at a Red Light', 130, 0),
+ ('Illegal Passing', 100, 0),
+ ('Driving an illegal Vehicle', 100, 0),
+ ('Driving without a License', 1500, 0),
+ ('Hit and Run', 800, 0),
+ ('Exceeding Speeds Over < 5 mph', 90, 0),
+ ('Exceeding Speeds Over 5-15 mph', 120, 0),
+ ('Exceeding Speeds Over 15-30 mph', 180, 0),
+ ('Exceeding Speeds Over > 30 mph', 300, 0),
+ ('Impeding traffic flow', 110, 1),
+ ('Public Intoxication', 90, 1),
+ ('Disorderly conduct', 90, 1),
+ ('Obstruction of Justice', 130, 1),
+ ('Insults towards Civilans', 75, 1),
+ ('Disrespecting of an LEO', 110, 1),
+ ('Verbal Threat towards a Civilan', 90, 1),
+ ('Verbal Threat towards an LEO', 150, 1),
+ ('Providing False Information', 250, 1),
+ ('Attempt of Corruption', 1500, 1),
+ ('Brandishing a weapon in city Limits', 120, 2),
+ ('Brandishing a Lethal Weapon in city Limits', 300, 2),
+ ('No Firearms License', 600, 2),
+ ('Possession of an Illegal Weapon', 700, 2),
+ ('Possession of Burglary Tools', 300, 2),
+ ('Grand Theft Auto', 1800, 2),
+ ('Intent to Sell/Distrube of an illegal Substance', 1500, 2),
+ ('Frabrication of an Illegal Substance', 1500, 2),
+ ('Possession of an Illegal Substance ', 650, 2),
+ ('Kidnapping of a Civilan', 1500, 2),
+ ('Kidnapping of an LEO', 2000, 2),
+ ('Robbery', 650, 2),
+ ('Armed Robbery of a Store', 650, 2),
+ ('Armed Robbery of a Bank', 1500, 2),
+ ('Assault on a Civilian', 2000, 3),
+ ('Assault of an LEO', 2500, 3),
+ ('Attempt of Murder of a Civilian', 3000, 3),
+ ('Attempt of Murder of an LEO', 5000, 3),
+ ('Murder of a Civilian', 10000, 3),
+ ('Murder of an LEO', 30000, 3),
+ ('Involuntary manslaughter', 1800, 3),
+ ('Fraud', 2000, 2);
+;
+
+INSERT INTO `licenses` (`type`, `label`) VALUES
+ ('weapon', 'Weapon license');
\ No newline at end of file
From 706d0a1568156041ca4186ff52d8e89e48c2b7c0 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:44:27 +0100
Subject: [PATCH 08/18] Delete en_esx_policejob.sql
---
localization/en_esx_policejob.sql | 88 -------------------------------
1 file changed, 88 deletions(-)
delete mode 100644 localization/en_esx_policejob.sql
diff --git a/localization/en_esx_policejob.sql b/localization/en_esx_policejob.sql
deleted file mode 100644
index 7792cb0..0000000
--- a/localization/en_esx_policejob.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-INSERT INTO `addon_account` (name, label, shared)
-VALUES ('society_police', 'Police', 1);
-
-INSERT INTO `addon_inventory` (name, label, shared)
-VALUES ('society_police', 'Police', 1);
-
-INSERT INTO `datastore` (name, label, shared)
-VALUES ('society_police', 'Police', 1);
-
-INSERT INTO `jobs` (name, label)
-VALUES ('police', 'Police');
-
-INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female)
-VALUES
- ('police', 0, 'recruit', 'Recruit', 10, '{}', '{}'),
- ('police', 1, 'officer', 'Officer', 20, '{}', '{}'),
- ('police', 2, 'sergeant', 'Sergeant', 30, '{}', '{}'),
- ('police', 3, 'lieutenant', 'Lieutenant', 40, '{}', '{}'),
- ('police', 4, 'boss', 'Chief', 0, '{}', '{}')
-;
-
-CREATE TABLE `fine_types` (
- `id` int NOT NULL AUTO_INCREMENT,
- `label` varchar(255) DEFAULT NULL,
- `amount` int DEFAULT NULL,
- `category` int DEFAULT NULL,
-
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-
-INSERT INTO `fine_types` (label, amount, category) VALUES
- ('Misuse of a horn', 30, 0),
- ('Illegally Crossing a continuous Line', 40, 0),
- ('Driving on the wrong side of the road', 250, 0),
- ('Illegal U-Turn', 250, 0),
- ('Illegally Driving Off-road', 170, 0),
- ('Refusing a Lawful Command', 30, 0),
- ('Illegally Stopping a Vehicle', 150, 0),
- ('Illegal Parking', 70, 0),
- ('Failing to Yield to the right', 70, 0),
- ('Failure to comply with Vehicle Information', 90, 0),
- ('Failing to stop at a Stop Sign ', 105, 0),
- ('Failing to stop at a Red Light', 130, 0),
- ('Illegal Passing', 100, 0),
- ('Driving an illegal Vehicle', 100, 0),
- ('Driving without a License', 1500, 0),
- ('Hit and Run', 800, 0),
- ('Exceeding Speeds Over < 5 mph', 90, 0),
- ('Exceeding Speeds Over 5-15 mph', 120, 0),
- ('Exceeding Speeds Over 15-30 mph', 180, 0),
- ('Exceeding Speeds Over > 30 mph', 300, 0),
- ('Impeding traffic flow', 110, 1),
- ('Public Intoxication', 90, 1),
- ('Disorderly conduct', 90, 1),
- ('Obstruction of Justice', 130, 1),
- ('Insults towards Civilans', 75, 1),
- ('Disrespecting of an LEO', 110, 1),
- ('Verbal Threat towards a Civilan', 90, 1),
- ('Verbal Threat towards an LEO', 150, 1),
- ('Providing False Information', 250, 1),
- ('Attempt of Corruption', 1500, 1),
- ('Brandishing a weapon in city Limits', 120, 2),
- ('Brandishing a Lethal Weapon in city Limits', 300, 2),
- ('No Firearms License', 600, 2),
- ('Possession of an Illegal Weapon', 700, 2),
- ('Possession of Burglary Tools', 300, 2),
- ('Grand Theft Auto', 1800, 2),
- ('Intent to Sell/Distrube of an illegal Substance', 1500, 2),
- ('Frabrication of an Illegal Substance', 1500, 2),
- ('Possession of an Illegal Substance ', 650, 2),
- ('Kidnapping of a Civilan', 1500, 2),
- ('Kidnapping of an LEO', 2000, 2),
- ('Robbery', 650, 2),
- ('Armed Robbery of a Store', 650, 2),
- ('Armed Robbery of a Bank', 1500, 2),
- ('Assault on a Civilian', 2000, 3),
- ('Assault of an LEO', 2500, 3),
- ('Attempt of Murder of a Civilian', 3000, 3),
- ('Attempt of Murder of an LEO', 5000, 3),
- ('Murder of a Civilian', 10000, 3),
- ('Murder of an LEO', 30000, 3),
- ('Involuntary manslaughter', 1800, 3),
- ('Fraud', 2000, 2);
-;
-
-INSERT INTO `licenses` (`type`, `label`) VALUES
- ('weapon', 'Weapon license');
\ No newline at end of file
From 9b661cf44aa17a6cb69d4e49edf51e7ddec86739 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:53:56 +0100
Subject: [PATCH 09/18] Add LuaDoc annotations for handcuffs module
---
client/modules/handcuffs.lua | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/client/modules/handcuffs.lua b/client/modules/handcuffs.lua
index 57bcd6a..8c2b165 100644
--- a/client/modules/handcuffs.lua
+++ b/client/modules/handcuffs.lua
@@ -11,6 +11,9 @@ local handcuffTimer = {
currentTimeoutId = 0
}
+
+---@param target number Target server id to get position in-front of.
+---@return vector3, number
local function getPositionInFrontOfTarget(target)
local targetPlayer = GetPlayerFromServerId(target)
if not targetPlayer or targetPlayer == -1 then return end
@@ -29,6 +32,7 @@ local function getPositionInFrontOfTarget(target)
), targetHeading
end
+---@param targetPlayer number Target player server id to handcuff
CuffModule.handcuffPlayer = function(targetPlayer)
local event = ('esx_policejob:%s'):format(Player(targetPlayer).state.isHandcuffed and 'uncuffPlayer' or
'handcuffPlayer')
@@ -41,6 +45,8 @@ CuffModule.handcuffPlayer = function(targetPlayer)
TaskPlayAnim(ESX.PlayerData.ped, anim.dict, anim.name, 8.0, -8.0, anim.duration, 2, 0, false, false, false)
end
+---@param targetPlayer number Target player server id to search
+---@param skipProgress boolean Should we skip the progressbar? Used when re-opening the menu when taking an item to refresh the elements
CuffModule.searchPlayer = function(targetPlayer, skipProgress)
if not Player(targetPlayer).state.isHandcuffed then
return ESX.ShowNotification(TranslateCap('not_handcuffed'))
@@ -111,6 +117,7 @@ CuffModule.searchPlayer = function(targetPlayer, skipProgress)
end)
end
+---@param targetPlayer number Target player server id to drag
CuffModule.dragPlayer = function(targetPlayer)
if not Player(targetPlayer).state.isHandcuffed then
return ESX.ShowNotification(TranslateCap('not_handcuffed'))
@@ -119,6 +126,7 @@ CuffModule.dragPlayer = function(targetPlayer)
TriggerServerEvent('esx_policejob:dragPlayer', targetPlayer)
end
+---@param targetPlayer number Target player server id to put in the vehicle.
CuffModule.putInVehicle = function(targetPlayer)
local closestVehicle, closestDistance = ESX.Game.GetClosestVehicle(ESX.PlayerData.coords)
@@ -133,6 +141,8 @@ CuffModule.putInVehicle = function(targetPlayer)
TriggerServerEvent('esx_policejob:putInVehicle', targetPlayer, NetworkGetNetworkIdFromEntity(closestVehicle))
end
+---@param vehicle number Vehicle entity handle
+---@return table
local function getVehiclePassengers(vehicle)
local passengers = {}
local maxSeats = GetVehicleMaxNumberOfPassengers(vehicle)
@@ -152,6 +162,8 @@ local function getVehiclePassengers(vehicle)
return passengers
end
+---@param vehicle number Vehicle entity handle
+---@return number | nil
local function getFreeSeat(vehicle)
local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(vehicle)
@@ -165,6 +177,7 @@ local function getFreeSeat(vehicle)
return freeSeat
end
+---@param targetPlayer number Target player server id to put out from vehicle
CuffModule.putOutVehicle = function(targetPlayer)
local closestVehicle, closestDistance = ESX.Game.GetClosestVehicle(ESX.PlayerData.coords)
From 515cb3bcd9d8970a6eebae0c0dc54f640f97f80e Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 05:54:28 +0100
Subject: [PATCH 10/18] Update armories.lua
---
client/armories.lua | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/client/armories.lua b/client/armories.lua
index 233c192..6a25e61 100644
--- a/client/armories.lua
+++ b/client/armories.lua
@@ -4,10 +4,9 @@ local armoryPoints, currentStation = {}, nil
--- Gets the list of authorized weapons for the player's grade
--- @return table: List of available weapons based on player's grade
local function getWeaponList()
- local playerGrade = ESX.PlayerData.job.grade_name
local weaponList = {}
- for _, weaponData in ipairs(Config.AuthorizedWeapons[playerGrade]) do
+ for _, weaponData in ipairs(Config.AuthorizedWeapons[ESX.PlayerData.job.grade_name]) do
local weaponHash = joaat(weaponData.weapon)
local _, weaponConfig = ESX.GetWeapon(weaponData.weapon)
local hasWeapon = HasPedGotWeapon(ESX.PlayerData.ped, weaponHash, false)
From 8e0ce9c6f5055f19eae3770dd91832eb151c9b66 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 06:06:33 +0100
Subject: [PATCH 11/18] Add locales
Added locale files for translators (currently all in english)
---
locales/cs.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/de.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/es.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/fi.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/fr.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/hu.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/it.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/nl.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/pl.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
locales/sr.lua | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
10 files changed, 1300 insertions(+)
create mode 100644 locales/cs.lua
create mode 100644 locales/de.lua
create mode 100644 locales/es.lua
create mode 100644 locales/fi.lua
create mode 100644 locales/fr.lua
create mode 100644 locales/hu.lua
create mode 100644 locales/it.lua
create mode 100644 locales/nl.lua
create mode 100644 locales/pl.lua
create mode 100644 locales/sr.lua
diff --git a/locales/cs.lua b/locales/cs.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/cs.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/de.lua b/locales/de.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/de.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/es.lua b/locales/es.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/es.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/fi.lua b/locales/fi.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/fi.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/fr.lua b/locales/fr.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/fr.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/hu.lua b/locales/hu.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/hu.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/it.lua b/locales/it.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/it.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/nl.lua b/locales/nl.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/nl.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/pl.lua b/locales/pl.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/pl.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
diff --git a/locales/sr.lua b/locales/sr.lua
new file mode 100644
index 0000000..bbe1870
--- /dev/null
+++ b/locales/sr.lua
@@ -0,0 +1,130 @@
+return {
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+ }
+
\ No newline at end of file
From 8aed86c5ebe652985ae691dec879dae3530f6ef2 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 06:11:03 +0100
Subject: [PATCH 12/18] Update fxmanifest.lua
---
fxmanifest.lua | 1 -
1 file changed, 1 deletion(-)
diff --git a/fxmanifest.lua b/fxmanifest.lua
index 1ff0829..47209db 100644
--- a/fxmanifest.lua
+++ b/fxmanifest.lua
@@ -10,7 +10,6 @@ version '2.0'
shared_scripts {
'@es_extended/imports.lua',
'@es_extended/locale.lua',
- 'locales/*.lua',
'@ox_lib/init.lua',
'config.lua',
'shared/utils.lua',
From e5ec04930c197a850c884b2e7424b7784ac5d4c9 Mon Sep 17 00:00:00 2001
From: zykem <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 08:29:41 +0100
Subject: [PATCH 13/18] Update handcuffs.lua
Code improvements (avoiding useless GetPlayerFromId function call, re-using targetPlayer state instead)
---
server/handcuffs.lua | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/server/handcuffs.lua b/server/handcuffs.lua
index 84a30b8..23a1941 100644
--- a/server/handcuffs.lua
+++ b/server/handcuffs.lua
@@ -26,7 +26,7 @@ ESX.RegisterServerCallback('esx_policejob:handcuffPlayer', function(source, cb,
return cb(false, 'already_handcuffed')
end
- Player(target).state:set('isHandcuffed', true, true)
+ targetPlayer.state:set('isHandcuffed', true, true)
TriggerClientEvent('esx_policejob:updateHandcuffedStatus', target, true, source)
cb(true)
end)
@@ -55,10 +55,8 @@ RegisterNetEvent('esx_policejob:dragPlayer', function(target)
return
end
- local xPlayer = ESX.GetPlayerFromId(source)
-
if not Player(target).state.isHandcuffed then
- return xPlayer.showNotification(TranslateCap('not_handcuffed'))
+ return ESX.GetPlayerFromId(source).showNotification(TranslateCap('not_handcuffed'))
end
local isDragged = Player(target).state.isDragged
@@ -75,10 +73,8 @@ RegisterNetEvent('esx_policejob:putInVehicle', function(target, vehicleNetId)
return
end
- local xPlayer = ESX.GetPlayerFromId(source)
-
if not Player(target).state.isHandcuffed then
- return xPlayer.showNotification(TranslateCap('not_handcuffed'))
+ return ESX.GetPlayerFromId(source).showNotification(TranslateCap('not_handcuffed'))
end
TriggerClientEvent('esx_policejob:getInVehicle', target, vehicleNetId)
@@ -183,4 +179,4 @@ CreateThread(function()
player.state:set('isHandcuffed', nil, true)
player.state:set('isDragged', nil, true)
end
-end)
\ No newline at end of file
+end)
From 7e4386577b89a642be34d9199af9b9aaa51cb8b8 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Wed, 19 Feb 2025 08:38:27 +0100
Subject: [PATCH 14/18] Add esx:onPlayerSpawn logic
---
client/modules/handcuffs.lua | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/client/modules/handcuffs.lua b/client/modules/handcuffs.lua
index 8c2b165..3fe1b04 100644
--- a/client/modules/handcuffs.lua
+++ b/client/modules/handcuffs.lua
@@ -381,4 +381,17 @@ ESX.SecureNetEvent('esx_policejob:getOutVehicle', function(vehicleNetId, dragged
end
end)
+AddEventHandler('esx:onPlayerSpawn', function()
+ if LocalPlayer.state.isHandcuffed then
+ LocalPlayer.state:set('isHandcuffed', false, true)
+ getUncuffed()
+ ClearPedTasks(ESX.PlayerData.ped)
+ end
+
+ if LocalPlayer.state.isDragged then
+ DetachEntity(ESX.PlayerData.ped, true, false)
+ LocalPlayer.state:set('isDragged', false, true)
+ end
+end)
+
return CuffModule
\ No newline at end of file
From f27944686aec791cc3fe50b96f9eb8a18945fefb Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Sun, 23 Feb 2025 09:49:04 +0100
Subject: [PATCH 15/18] Update locales for new update
---
locales/cs.lua | 265 +++++++++++++++++++++++++------------------------
locales/de.lua | 265 +++++++++++++++++++++++++------------------------
locales/en.lua | 8 ++
locales/es.lua | 265 +++++++++++++++++++++++++------------------------
locales/fi.lua | 265 +++++++++++++++++++++++++------------------------
locales/fr.lua | 265 +++++++++++++++++++++++++------------------------
locales/hu.lua | 265 +++++++++++++++++++++++++------------------------
locales/it.lua | 265 +++++++++++++++++++++++++------------------------
locales/nl.lua | 265 +++++++++++++++++++++++++------------------------
locales/pl.lua | 265 +++++++++++++++++++++++++------------------------
locales/sr.lua | 265 +++++++++++++++++++++++++------------------------
11 files changed, 1368 insertions(+), 1290 deletions(-)
diff --git a/locales/cs.lua b/locales/cs.lua
index bbe1870..b63fdde 100644
--- a/locales/cs.lua
+++ b/locales/cs.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/de.lua b/locales/de.lua
index bbe1870..b63fdde 100644
--- a/locales/de.lua
+++ b/locales/de.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/en.lua b/locales/en.lua
index 73e0e4d..b63fdde 100644
--- a/locales/en.lua
+++ b/locales/en.lua
@@ -32,6 +32,14 @@ return {
['deposited_weapon'] = 'Succesfully deposited %s',
['armory_owned'] = 'Owned',
['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
['press_to_open_armory'] = 'Press [%s] to access the Armory.',
-- Service
['service_announcement'] = 'Service Announcement',
diff --git a/locales/es.lua b/locales/es.lua
index bbe1870..b63fdde 100644
--- a/locales/es.lua
+++ b/locales/es.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/fi.lua b/locales/fi.lua
index bbe1870..b63fdde 100644
--- a/locales/fi.lua
+++ b/locales/fi.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/fr.lua b/locales/fr.lua
index bbe1870..b63fdde 100644
--- a/locales/fr.lua
+++ b/locales/fr.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/hu.lua b/locales/hu.lua
index bbe1870..b63fdde 100644
--- a/locales/hu.lua
+++ b/locales/hu.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/it.lua b/locales/it.lua
index bbe1870..b63fdde 100644
--- a/locales/it.lua
+++ b/locales/it.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/nl.lua b/locales/nl.lua
index bbe1870..b63fdde 100644
--- a/locales/nl.lua
+++ b/locales/nl.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/pl.lua b/locales/pl.lua
index bbe1870..b63fdde 100644
--- a/locales/pl.lua
+++ b/locales/pl.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
diff --git a/locales/sr.lua b/locales/sr.lua
index bbe1870..b63fdde 100644
--- a/locales/sr.lua
+++ b/locales/sr.lua
@@ -1,130 +1,137 @@
return {
- -- General
- ['no_money'] = 'You can not afford this item.',
- ['invalid_amount'] = 'You provided an invalid count',
- ['not_enough_items_player'] = 'You do not have enough of that item!',
- ['max_weight'] = "You can not carry more!",
- ['amount'] = 'Amount',
- ['no_players_nearby'] = 'There are no players near you!',
- ['no_vehicle_nearby'] = 'There is no vehicle near you!',
- ['no_passengers'] = 'This vehicle has no passengers',
- -- Cloakroom
- ['cloakroom'] = 'Cloakroom',
- ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
- ['civilian_clothes'] = 'Civilian Clothes',
- ['police_unfirom'] = 'Police Uniform',
- ['bulletproof_vest'] = 'Bulletproof Vest',
- ['reflective_jacket'] = 'Reflective Jacket',
- ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
- -- Armories & Stashes
- ['armory'] = 'Armory',
- ['already_owned_component'] = 'You already have this component equiped.',
- ['already_owned_weapon'] = 'You already own this weapon!',
- ['bought_weapon'] = 'You bought an %s for $%s',
- ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
- ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
- ['withdraw_item'] = 'Withdraw an item',
- ['deposit_item'] = 'Deposit an item',
- ['buy_weapons'] = 'Buy Weapons',
- ['withdraw_weapon'] = 'Withdraw a Weapon',
- ['deposit_weapon'] = 'Deposit a Weapon',
- ['deposited_item'] = 'Succesfuly deposited x%d %s',
- ['deposited_weapon'] = 'Succesfully deposited %s',
- ['armory_owned'] = 'Owned',
- ['armory_free'] = 'Free',
- ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
- -- Service
- ['service_announcement'] = 'Service Announcement',
- ['service_enterred'] = 'You\'ve enterred service, welcome!',
- ['service_enterred_announcement'] = 'Officer %s has enterred service!',
- ['service_left'] = 'You\'ve left service.',
- ['service_left_announcement'] = 'Officer %s has left service!',
- ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
- ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
- -- Action Menu
- ['action_menu_title'] = 'Police',
- ['action_menu_description'] = "Open police Menu",
- ['citizen_interaction'] = 'Citizen Interaction',
- ['vehicle_interaction'] = 'Vehicle Interaction',
- ['place_object'] = 'Place Object',
- ['id_card'] = 'Grab ID Card',
- -- > Handcuffs
- ['search'] = 'search',
- ['handcuff'] = 'cuff / Uncuff',
- ['drag'] = 'Escort',
- ['put_in_vehicle'] = 'Put in Vehicle',
- ['out_the_vehicle'] = 'Drag out from vehicle',
- ['already_handcuffed'] = 'This player is already handcuffed',
- ['not_handcuffed'] = 'This player is not handcuffed',
- ['has_not_enough'] = 'The player you are searching does not have x%s %s',
- ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
- ['confiscate_money'] = 'confiscate money: $%s',
- ['confiscate_weapon'] = 'confiscate %s with %s bullets',
- ['confiscate_item'] = 'confiscate x%s %s',
- ['you_confiscated'] = 'You confiscated x%s %s from %s',
- ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
- ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
- ['got_confiscated'] = 'x%s %s has been confiscated by %s',
- ['got_confiscated_weapon'] = '%s has been confiscated by %s',
- ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
- ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
- -- > Billing
- ['fine'] = 'Issue a Fine',
- ['unpaid_bills'] = 'Unpaid Bills',
- ['traffic_offense'] = 'Traffic Offense',
- ['minor_offense'] = 'Minor Offense',
- ['average_offense'] = 'Average Offense',
- ['major_offense'] = 'Major Offense',
- ['custom_offense'] = 'Custom Offense',
- ['issued_fine'] = 'You issued a fine with reason %s for $%s',
- -- > Licenses
- ['check_licenses'] = 'Check Licenses',
- ['add_license'] = 'Add License',
- ['manage_licenses'] = 'Licenses',
- ['revoked_license'] = 'you revoked the %s which belonged to %s',
- ['license_revoked'] = 'your %s has been revoked!',
- -- Vehicle interaction
- ['vehicle_info'] = 'Vehicle Information',
- ['lockpick'] = 'lockpick Vehicle',
- ['impound'] = 'impound vehicle',
- ['search_database'] = 'Search for Vehicle',
- ['fix'] = 'Fix Vehicle',
- ['wash'] = 'Wash Vehicle',
- ['plate'] = 'Plate: %s',
- ['owner'] = 'Owner: %s',
- ['owner_unknown'] = 'Owner: Unknown',
- ['hijacking'] = 'Hijacking Vehicle',
- ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
- ['impounding'] = 'Impounding Vehicle',
- ['vehicle_impounded'] = 'Vehicle impounded successfully',
- ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
- ['plate_prompt'] = 'Enter Vehicle Plate',
- ['invalid_plate'] = 'You have\'nt provided a valid plate',
- ['fixing'] = 'Fixing Vehicle',
- ['vehicle_fixed'] = 'Vehicle Fixed',
- ['washing'] = 'Washing Vehicle',
- ['vehicle_washed'] = 'Vehicle Washed',
- -- ID Card Menu
- ['name'] = 'name: %s',
- ['job'] = 'job: %s',
- ['sex'] = 'Gender: %s',
- ['dob'] = 'DOB: %s',
- ['height'] = 'height: %s',
- ['drunk'] = 'Intoxication Level: %s%%',
- -- BossActions
- ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
- -- Peds
- ['s_m_y_sheriff_01'] = 'Sheriff Ped',
- ['s_m_y_cop_01'] = 'Police Ped',
- ['s_m_y_swat_01'] = 'SWAT Ped',
- -- Garages
- ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
- -- Doorbells
- ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
- ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
- ['minutes'] = 'minutes',
- ['seconds'] = 'seconds',
- ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
- ['no_available_officers'] = 'There are no available police officers on duty.'
- }
-
\ No newline at end of file
+ -- General
+ ['no_money'] = 'You can not afford this item.',
+ ['invalid_amount'] = 'You provided an invalid count',
+ ['not_enough_items_player'] = 'You do not have enough of that item!',
+ ['max_weight'] = "You can not carry more!",
+ ['amount'] = 'Amount',
+ ['no_players_nearby'] = 'There are no players near you!',
+ ['no_vehicle_nearby'] = 'There is no vehicle near you!',
+ ['no_passengers'] = 'This vehicle has no passengers',
+ -- Cloakroom
+ ['cloakroom'] = 'Cloakroom',
+ ['no_outfit_for_grade'] = 'There is no suitable outfit configured for your grade.',
+ ['civilian_clothes'] = 'Civilian Clothes',
+ ['police_unfirom'] = 'Police Uniform',
+ ['bulletproof_vest'] = 'Bulletproof Vest',
+ ['reflective_jacket'] = 'Reflective Jacket',
+ ['press_to_open_cloakroom'] = 'press [%s] to change clothes.',
+ -- Armories & Stashes
+ ['armory'] = 'Armory',
+ ['already_owned_component'] = 'You already have this component equiped.',
+ ['already_owned_weapon'] = 'You already own this weapon!',
+ ['bought_weapon'] = 'You bought an %s for $%s',
+ ['bought_component'] = 'You bought the component %s for the weapon %s for $%s',
+ ['not_enough_items_armory'] = 'There is not enough of that item in the Armory!',
+ ['withdraw_item'] = 'Withdraw an item',
+ ['deposit_item'] = 'Deposit an item',
+ ['buy_weapons'] = 'Buy Weapons',
+ ['withdraw_weapon'] = 'Withdraw a Weapon',
+ ['deposit_weapon'] = 'Deposit a Weapon',
+ ['deposited_item'] = 'Succesfuly deposited x%d %s',
+ ['deposited_weapon'] = 'Succesfully deposited %s',
+ ['armory_owned'] = 'Owned',
+ ['armory_free'] = 'Free',
+ ['manage_armory'] = 'Manage Armory',
+ ['add_weapon'] = 'Add weapon',
+ ['add_weapon_for'] = 'Add weapon for %s', -- context: Add weapon for Boss grade
+ ['add_weapon_ammo_prompt'] = 'Enter default ammo count',
+ ['add_weapon_price_prompt'] = 'Enter price for weapon',
+ ['added_weapon'] = 'Successfully added %s',
+ ['removed_weapon'] = 'Successfully removed %s',
+ ['shared_weapons'] = 'Shared Weapons',
+ ['press_to_open_armory'] = 'Press [%s] to access the Armory.',
+ -- Service
+ ['service_announcement'] = 'Service Announcement',
+ ['service_enterred'] = 'You\'ve enterred service, welcome!',
+ ['service_enterred_announcement'] = 'Officer %s has enterred service!',
+ ['service_left'] = 'You\'ve left service.',
+ ['service_left_announcement'] = 'Officer %s has left service!',
+ ['not_in_service'] = 'You have\'nt enterred service! Get changed first.',
+ ['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
+ -- Action Menu
+ ['action_menu_title'] = 'Police',
+ ['action_menu_description'] = "Open police Menu",
+ ['citizen_interaction'] = 'Citizen Interaction',
+ ['vehicle_interaction'] = 'Vehicle Interaction',
+ ['place_object'] = 'Place Object',
+ ['id_card'] = 'Grab ID Card',
+ -- > Handcuffs
+ ['search'] = 'search',
+ ['handcuff'] = 'cuff / Uncuff',
+ ['drag'] = 'Escort',
+ ['put_in_vehicle'] = 'Put in Vehicle',
+ ['out_the_vehicle'] = 'Drag out from vehicle',
+ ['already_handcuffed'] = 'This player is already handcuffed',
+ ['not_handcuffed'] = 'This player is not handcuffed',
+ ['has_not_enough'] = 'The player you are searching does not have x%s %s',
+ ['confiscate_dirtymoney'] = 'confiscate dirty money: $%s',
+ ['confiscate_money'] = 'confiscate money: $%s',
+ ['confiscate_weapon'] = 'confiscate %s with %s bullets',
+ ['confiscate_item'] = 'confiscate x%s %s',
+ ['you_confiscated'] = 'You confiscated x%s %s from %s',
+ ['you_confiscated_weapon'] = 'You confiscated a %s from %s',
+ ['you_confiscated_account'] = 'You confiscated $%s from %s\'s %s',
+ ['got_confiscated'] = 'x%s %s has been confiscated by %s',
+ ['got_confiscated_weapon'] = '%s has been confiscated by %s',
+ ['got_confiscated_account'] = '$%s has been confiscated from %s by %s',
+ ['timer_over'] = 'You feel your handcuffs slowly losing grip and fading away.',
+ -- > Billing
+ ['fine'] = 'Issue a Fine',
+ ['unpaid_bills'] = 'Unpaid Bills',
+ ['traffic_offense'] = 'Traffic Offense',
+ ['minor_offense'] = 'Minor Offense',
+ ['average_offense'] = 'Average Offense',
+ ['major_offense'] = 'Major Offense',
+ ['custom_offense'] = 'Custom Offense',
+ ['issued_fine'] = 'You issued a fine with reason %s for $%s',
+ -- > Licenses
+ ['check_licenses'] = 'Check Licenses',
+ ['add_license'] = 'Add License',
+ ['manage_licenses'] = 'Licenses',
+ ['revoked_license'] = 'you revoked the %s which belonged to %s',
+ ['license_revoked'] = 'your %s has been revoked!',
+ -- Vehicle interaction
+ ['vehicle_info'] = 'Vehicle Information',
+ ['lockpick'] = 'lockpick Vehicle',
+ ['impound'] = 'impound vehicle',
+ ['search_database'] = 'Search for Vehicle',
+ ['fix'] = 'Fix Vehicle',
+ ['wash'] = 'Wash Vehicle',
+ ['plate'] = 'Plate: %s',
+ ['owner'] = 'Owner: %s',
+ ['owner_unknown'] = 'Owner: Unknown',
+ ['hijacking'] = 'Hijacking Vehicle',
+ ['vehicle_unlocked'] = 'Vehicle Unlocked succesfully',
+ ['impounding'] = 'Impounding Vehicle',
+ ['vehicle_impounded'] = 'Vehicle impounded successfully',
+ ['owner_vehicle_impounded'] = 'Your vehicle has been impounded by the police, you can find it in the Mission Row PD Garage.',
+ ['plate_prompt'] = 'Enter Vehicle Plate',
+ ['invalid_plate'] = 'You have\'nt provided a valid plate',
+ ['fixing'] = 'Fixing Vehicle',
+ ['vehicle_fixed'] = 'Vehicle Fixed',
+ ['washing'] = 'Washing Vehicle',
+ ['vehicle_washed'] = 'Vehicle Washed',
+ -- ID Card Menu
+ ['name'] = 'name: %s',
+ ['job'] = 'job: %s',
+ ['sex'] = 'Gender: %s',
+ ['dob'] = 'DOB: %s',
+ ['height'] = 'height: %s',
+ ['drunk'] = 'Intoxication Level: %s%%',
+ -- BossActions
+ ['press_to_open_bossactions'] = 'Press [%s] to open the Boss Menu.',
+ -- Peds
+ ['s_m_y_sheriff_01'] = 'Sheriff Ped',
+ ['s_m_y_cop_01'] = 'Police Ped',
+ ['s_m_y_swat_01'] = 'SWAT Ped',
+ -- Garages
+ ['press_to_open_garage'] = 'Press [%s] to open the Garage.',
+ -- Doorbells
+ ['press_to_request_officer'] = 'Press [%s] to request a police officer.',
+ ['request_cooldown_active'] = 'You already called for an officer. Please wait %s and try again.',
+ ['minutes'] = 'minutes',
+ ['seconds'] = 'seconds',
+ ['police_reqeuest'] = 'Citizen %s needs help at the Reception of %s Station.',
+ ['no_available_officers'] = 'There are no available police officers on duty.'
+}
From c442685b328d9bc5a10a332ac99968764e0db86b Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Sun, 23 Feb 2025 09:50:19 +0100
Subject: [PATCH 16/18] Add dynamic weapons
This feature allows to add/remove weapons for specific grades. (Grades that can do this are configurable under Config.ArmoryManagementGrades)
---
client/armories.lua | 153 +++++++++++++++++---
config.lua | 333 +++++++++++++++++++++++++-------------------
esx_policejob.sql | 16 ++-
server/armories.lua | 173 +++++++++++++++++++----
4 files changed, 491 insertions(+), 184 deletions(-)
diff --git a/client/armories.lua b/client/armories.lua
index 6a25e61..81ad9aa 100644
--- a/client/armories.lua
+++ b/client/armories.lua
@@ -4,22 +4,30 @@ local armoryPoints, currentStation = {}, nil
--- Gets the list of authorized weapons for the player's grade
--- @return table: List of available weapons based on player's grade
local function getWeaponList()
+ local weapons = ESX.AwaitServerCallback('esx_policejob:getAuthorizedWeapons')
local weaponList = {}
- for _, weaponData in ipairs(Config.AuthorizedWeapons[ESX.PlayerData.job.grade_name]) do
- local weaponHash = joaat(weaponData.weapon)
- local _, weaponConfig = ESX.GetWeapon(weaponData.weapon)
- local hasWeapon = HasPedGotWeapon(ESX.PlayerData.ped, weaponHash, false)
- local weaponLabel = hasWeapon and ("%s: %s"):format(weaponConfig.label, TranslateCap('armory_owned')) or
- (weaponData.price > 0 and ("%s: $%s"):format(weaponConfig.label, ESX.Math.GroupDigits(weaponData.price)) or
- ("%s: %s"):format(weaponConfig.label, TranslateCap('armory_free')))
+ if not weapons then return weaponList end
+
+ for i = 1, #weapons do
+ local weapon = weapons[i]
+ local weaponLabel = ESX.GetWeaponLabel(weapon.weapon)
+ local hasWeapon = HasPedGotWeapon(ESX.PlayerData.ped, joaat(weapon.weapon), false)
+
+ weaponLabel = hasWeapon and ("%s: %s"):format(weaponLabel, TranslateCap('armory_owned')) or
+ (weapon.price > 0 and ("%s: $%s"):format(weaponLabel, ESX.Math.GroupDigits(weapon.price)) or
+ ("%s: %s"):format(weaponLabel, TranslateCap('armory_free')))
+
+ if weapon.grade == 'shared' then
+ weaponLabel = ("%s [SHARED]"):format(weaponLabel)
+ end
weaponList[#weaponList + 1] = {
label = weaponLabel,
- value = weaponConfig.name,
+ value = weapon.weapon,
hasWeapon = hasWeapon,
- weaponData = weaponData,
- price = weaponData.price
+ weaponData = weapon,
+ price = weapon.price
}
end
@@ -37,7 +45,8 @@ local function getWeaponComponentList(playerPed, weaponData)
local weaponHash = joaat(weaponData.weapon)
- for index, component in ipairs(weaponComponents) do
+ for i = 1, #weaponComponents do
+ local component = weaponComponents[i]
local componentConfig = ESX.GetWeaponComponent(weaponData.weapon, component.name)
if componentConfig then
local isOwned = HasPedGotWeaponComponent(playerPed, weaponHash, componentConfig.hash)
@@ -50,7 +59,7 @@ local function getWeaponComponentList(playerPed, weaponData)
hasComponent = isOwned,
weaponName = weaponData.weapon,
componentName = component.name,
- componentIndex = index,
+ componentIndex = i,
price = component.price
}
end
@@ -167,7 +176,8 @@ local function openGetStockMenu(armoryType)
local armoryItems = ESX.AwaitServerCallback('esx_policejob:getArmory', armoryType)
local elements = {}
- for _, item in ipairs(armoryItems) do
+ for i = 1, #armoryItems do
+ local item = armoryItems[i]
if item.count > 0 then
elements[#elements + 1] = {
label = ("x%s %s"):format(item.count, item.label),
@@ -205,9 +215,113 @@ local function openGetStockMenu(armoryType)
end)
end
+---@param gradeLabel string Grade label for better display
+---@param gradeName string Grade name to act in Database
+local function openAddWeaponMenu(gradeLabel, gradeName, authorizedWeapons)
+ local elements = {}
+
+ local authorizedWeaponsSet = {}
+
+ if authorizedWeapons and next(authorizedWeapons) then
+ for i = 1, #authorizedWeapons do
+ authorizedWeaponsSet[authorizedWeapons[i].weapon] = true
+ end
+ end
+
+ for i = 1, #Config.Weapons do
+ local weapon = Config.Weapons[i]
+ if not authorizedWeaponsSet[weapon.weapon] then
+ elements[#elements + 1] = {
+ label = ("%s | Default Ammo: %s | Price: %s"):format(ESX.GetWeaponLabel(weapon.weapon),
+ weapon.defaultAmmo, weapon.price),
+ value = weapon.weapon,
+ defaultAmmo = weapon.defaultAmmo,
+ price = weapon.price
+ }
+ end
+ end
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'addWeaponMenu', {
+ title = TranslateCap('add_weapon_for', gradeLabel),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ local newAmmo = openAmountDialog(TranslateCap('add_weapon_ammo_prompt'))
+ if not newAmmo then newAmmo = data.current.defaultAmmo end
+
+ Wait(100)
+
+ local newPrice = openAmountDialog(TranslateCap('add_weapon_price_prompt'))
+ if not newPrice then newPrice = data.current.price end
+
+ TriggerServerEvent('esx_policejob:addWeaponForGrade', data.current.value, gradeName, newAmmo, newPrice)
+ menu.close()
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+---@param gradeLabel string Grade label for better display
+---@param gradeName string Grade name to act in Database
+local function openGradeArmoryMenu(gradeLabel, gradeName)
+ local authorizedWeapons = ESX.AwaitServerCallback('esx_policejob:getAuthorizedWeaponsFromGrade', gradeName)
+
+ local elements = {}
+
+ if authorizedWeapons and next(authorizedWeapons) then
+ for i = 1, #authorizedWeapons do
+ local authorizedWeapon = authorizedWeapons[i]
+ elements[#elements + 1] = {
+ label = ("%s [%s Ammo]"):format(ESX.GetWeaponLabel(authorizedWeapon.weapon),
+ authorizedWeapon.default_ammo),
+ value = authorizedWeapon.weapon
+ }
+ end
+ end
+
+ elements[#elements + 1] = { label = TranslateCap('add_weapon'), value = 'add' }
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'gradeArmoryMenu', {
+ title = TranslateCap('manage_armory'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ if data.current.value == 'add' then
+ openAddWeaponMenu(gradeLabel, gradeName, authorizedWeapons)
+ menu.close()
+ else
+ ESX.AwaitServerCallback('esx_policejob:removeWeapon', gradeName, data.current.value)
+ openGradeArmoryMenu(gradeLabel, gradeName)
+ end
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
+local function openManageArmoryMenu()
+ local grades = ESX.AwaitServerCallback('esx_policejob:getJobGrades')
+ local elements = {}
+
+ for grade, gradeLabel in pairs(grades) do
+ elements[#elements + 1] = { label = gradeLabel, value = grade }
+ end
+
+ elements[#elements + 1] = { label = TranslateCap('shared_weapons'), value = 'shared' }
+
+ ESX.UI.Menu.Open('default', ESX.currentResourceName, 'manageArmoryMenu', {
+ title = TranslateCap('manage_armory'),
+ align = 'right',
+ elements = elements
+ }, function(data, menu)
+ openGradeArmoryMenu(data.current.label, data.current.value)
+ end, function(data, menu)
+ menu.close()
+ end)
+end
+
local function openArmoryMenu()
if not isInService() then
- return ESX.ShowNotification(TranslateCap("not_in_service"))
+ return ESX.ShowNotification(TranslateCap("not_in_service"))
end
local elements = {}
@@ -220,6 +334,9 @@ local function openArmoryMenu()
elements[#elements + 1] = { label = TranslateCap('deposit_item'), value = 'put_stock', armoryType = 'items' }
elements[#elements + 1] = { label = TranslateCap('withdraw_weapon'), value = 'get_weapon', armoryType = 'weapons' }
elements[#elements + 1] = { label = TranslateCap('deposit_weapon'), value = 'put_weapon', armoryType = 'weapons' }
+ if Config.ArmoryManagementGrades and Config.ArmoryManagementGrades[ESX.PlayerData.job.grade_name] then
+ elements[#elements + 1] = { label = TranslateCap('manage_armory'), value = 'manage_armory' }
+ end
end
@@ -234,6 +351,8 @@ local function openArmoryMenu()
openPutStockMenu(data.current.armoryType)
elseif data.current.value == 'get_stock' or data.current.value == 'get_weapon' then
openGetStockMenu(data.current.armoryType)
+ elseif data.current.value == 'manage_armory' and (Config.ArmoryManagementGrades and Config.ArmoryManagementGrades[ESX.PlayerData.job.grade_name]) then
+ openManageArmoryMenu()
elseif data.current.value == 'open_ox_stash' then
exports.ox_inventory:openInventory('stash', { id = 'society_police', owner = currentStation })
end
@@ -244,9 +363,11 @@ end
CreateThread(function()
for stationName, stationData in pairs(Config.PoliceStations) do
- local armories = stationData.armories
+ local armories = stationData.armories
+
+ for i = 1, #armories do
+ local armoryZone = armories[i]
- for _, armoryZone in ipairs(armories) do
armoryPoints[#armoryPoints + 1] = zoneModule.createZonePoint({
zoneId = 'armory',
coords = armoryZone.coords,
diff --git a/config.lua b/config.lua
index 70cea72..777218a 100644
--- a/config.lua
+++ b/config.lua
@@ -1,15 +1,15 @@
-Config = {}
+Config = {}
-Config.Locale = GetConvar('esx:locale', 'en')
+Config.Locale = GetConvar('esx:locale', 'en')
-Config.OxInventory = ESX.GetConfig().OxInventory
+Config.OxInventory = ESX.GetConfig().OxInventory
-Config.Keybinds = {
+Config.Keybinds = {
policeMenu = 'F6',
-- spiketrip: 'DELETE' (idea for spawning objects faster)
}
-Config.EnabledModules = {
+Config.EnabledModules = {
playerManagement = true, -- Enable if you want esx_society management
esxIdentity = false, -- Enable if you're using esx_identity
esxOptionalNeeds = false, -- Enable if you're using esx_optionalneeds
@@ -20,25 +20,25 @@ Config.EnabledModules = {
}
-- List of additional options you can add to police man's F6 menu.
-Config.AllowedVehicleInteractions = {
+Config.AllowedVehicleInteractions = {
fix = true, -- Allow police officers to fix cars through the F6 menu?
wash = true -- Allow police officers to wash cars through the F6 menu?
}
-- The allowed distance the police man can do handcuff actions on other players
-- Prevents cheaters from handcuffing players that are far away
-Config.MaxInteractionDistance = 2.0
+Config.MaxInteractionDistance = 2.0
-- How many people can be in service at once? Set as -1 to have no limit
-Config.MaxInService = -1
+Config.MaxInService = -1
-- List of licenses police officer can add when esxService module is enabled. (need to be added in SQL Database too)
-Config.Licenses = {
+Config.Licenses = {
['weapon'] = 'Weapon License'
}
-- List of actions that a police man can do through the F6 Menu (Used for progressbar's)
-Config.PoliceActions = {
+Config.PoliceActions = {
vehicleInteractions = {
hijackVehicle = {
duration = 5000,
@@ -77,11 +77,11 @@ Config.PoliceActions = {
}
-- Enable handcuff timer? will unrestrain player after the time ends.
-Config.EnableHandcuffTimer = true
-Config.HandcuffTimer = 5 -- Time in minutes.
+Config.EnableHandcuffTimer = true
+Config.HandcuffTimer = 5 -- Time in minutes.
-- Bone attach options while dragging a player
-Config.DragBoneOptions = {
+Config.DragBoneOptions = {
boneIndex = 11861,
offset = vec3(0.54, 0.54, 0.0),
rot = vec3(0.0, 0.0, 0.0)
@@ -147,9 +147,9 @@ Config.DisabledControlsWhileCuffed = {
}
-- Call buttons
-Config.CallButtonCooldown = 5 -- In minutes
+Config.CallButtonCooldown = 5 -- In minutes
-Config.PoliceStations = {
+Config.PoliceStations = {
['Mission Row'] = {
blip = {
coords = vector3(425.1, -979.5, 30.7),
@@ -274,14 +274,19 @@ Config.PoliceStations = {
}
+-- List of grades that can add/remove authorized weapons for grades
+Config.ArmoryManagementGrades = {
+ ['boss'] = true
+}
+
-- Components that have to be removed when purchasing a specific one
-Config.ExclusiveWeaponComponents = {
+Config.ExclusiveWeaponComponents = {
clip_default = { 'clip_extended' },
clip_extended = { 'clip_default' }
}
--- Component prices that can be bought when police man bought weapon in armory
-Config.WeaponComponents = {
+Config.WeaponComponents = {
['WEAPON_APPISTOL'] = {
{ name = 'clip_default', price = 0 },
{ name = 'clip_extended', price = 0 },
@@ -304,53 +309,19 @@ Config.WeaponComponents = {
}
}
-Config.AuthorizedWeapons = {
- recruit = {
- { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
- { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
- { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 1500 },
- { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 80 }
- },
-
- officer = {
- { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
- { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
- { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
- { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 500 },
- { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 0 }
- },
+Config.Weapons = {
+ { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
+ { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
+ { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 1500 },
+ { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 80 },
+ { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
+ { weapon = 'WEAPON_PUMPSHOTGUN', defaultAmmo = 100, price = 70000 },
- sergeant = {
- { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
- { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
- { weapon = 'WEAPON_PUMPSHOTGUN', defaultAmmo = 100, price = 70000 },
- { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
- { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 500 },
- { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 0 }
- },
-
- lieutenant = {
- { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
- { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
- { weapon = 'WEAPON_PUMPSHOTGUN', defaultAmmo = 100, price = 70000 },
- { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
- { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 500 },
- { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 0 }
- },
-
- boss = {
- { weapon = 'WEAPON_APPISTOL', defaultAmmo = 100, price = 10000 },
- { weapon = 'WEAPON_ADVANCEDRIFLE', defaultAmmo = 100, price = 50000 },
- { weapon = 'WEAPON_PUMPSHOTGUN', defaultAmmo = 100, price = 70000 },
- { weapon = 'WEAPON_NIGHTSTICK', defaultAmmo = 100, price = 0 },
- { weapon = 'WEAPON_STUNGUN', defaultAmmo = 100, price = 500 },
- { weapon = 'WEAPON_FLASHLIGHT', defaultAmmo = 100, price = 0 }
- }
}
-- Enable custom peds in cloakroom? See Config.CustomPeds below to customize peds.
-Config.EnableCustomPeds = true
-Config.CustomPeds = {
+Config.EnableCustomPeds = false
+Config.CustomPeds = {
shared = {
{ label = TranslateCap('s_m_y_sheriff_01'), maleModel = 's_m_y_sheriff_01', femaleModel = 's_f_y_sheriff_01' },
{ label = TranslateCap('s_m_y_cop_01'), maleModel = 's_m_y_cop_01', femaleModel = 's_f_y_cop_01' }
@@ -369,129 +340,209 @@ Config.CustomPeds = {
}
}
-Config.PoliceOutfits = {
+Config.PoliceOutfits = {
recruit = {
male = {
- tshirt_1 = 59, tshirt_2 = 1,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 0, decals_2 = 0,
+ tshirt_1 = 59,
+ tshirt_2 = 1,
+ torso_1 = 55,
+ torso_2 = 0,
+ decals_1 = 0,
+ decals_2 = 0,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = 46, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25,
+ pants_2 = 0,
+ shoes_1 = 25,
+ shoes_2 = 0,
+ helmet_1 = 46,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
},
female = {
- tshirt_1 = 36, tshirt_2 = 1,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 0, decals_2 = 0,
+ tshirt_1 = 36,
+ tshirt_2 = 1,
+ torso_1 = 48,
+ torso_2 = 0,
+ decals_1 = 0,
+ decals_2 = 0,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = 45, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34,
+ pants_2 = 0,
+ shoes_1 = 27,
+ shoes_2 = 0,
+ helmet_1 = 45,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
}
},
officer = {
male = {
- tshirt_1 = 58, tshirt_2 = 0,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 0, decals_2 = 0,
+ tshirt_1 = 58,
+ tshirt_2 = 0,
+ torso_1 = 55,
+ torso_2 = 0,
+ decals_1 = 0,
+ decals_2 = 0,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25,
+ pants_2 = 0,
+ shoes_1 = 25,
+ shoes_2 = 0,
+ helmet_1 = -1,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
},
female = {
- tshirt_1 = 35, tshirt_2 = 0,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 0, decals_2 = 0,
+ tshirt_1 = 35,
+ tshirt_2 = 0,
+ torso_1 = 48,
+ torso_2 = 0,
+ decals_1 = 0,
+ decals_2 = 0,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34,
+ pants_2 = 0,
+ shoes_1 = 27,
+ shoes_2 = 0,
+ helmet_1 = -1,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
}
},
sergeant = {
male = {
- tshirt_1 = 58, tshirt_2 = 0,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 8, decals_2 = 1,
+ tshirt_1 = 58,
+ tshirt_2 = 0,
+ torso_1 = 55,
+ torso_2 = 0,
+ decals_1 = 8,
+ decals_2 = 1,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25,
+ pants_2 = 0,
+ shoes_1 = 25,
+ shoes_2 = 0,
+ helmet_1 = -1,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
},
female = {
- tshirt_1 = 35, tshirt_2 = 0,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 7, decals_2 = 1,
+ tshirt_1 = 35,
+ tshirt_2 = 0,
+ torso_1 = 48,
+ torso_2 = 0,
+ decals_1 = 7,
+ decals_2 = 1,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34,
+ pants_2 = 0,
+ shoes_1 = 27,
+ shoes_2 = 0,
+ helmet_1 = -1,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
}
},
lieutenant = {
male = {
- tshirt_1 = 58, tshirt_2 = 0,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 8, decals_2 = 2,
+ tshirt_1 = 58,
+ tshirt_2 = 0,
+ torso_1 = 55,
+ torso_2 = 0,
+ decals_1 = 8,
+ decals_2 = 2,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25,
+ pants_2 = 0,
+ shoes_1 = 25,
+ shoes_2 = 0,
+ helmet_1 = -1,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
},
female = {
- tshirt_1 = 35, tshirt_2 = 0,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 7, decals_2 = 2,
+ tshirt_1 = 35,
+ tshirt_2 = 0,
+ torso_1 = 48,
+ torso_2 = 0,
+ decals_1 = 7,
+ decals_2 = 2,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34,
+ pants_2 = 0,
+ shoes_1 = 27,
+ shoes_2 = 0,
+ helmet_1 = -1,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
}
},
boss = {
male = {
- tshirt_1 = 58, tshirt_2 = 0,
- torso_1 = 55, torso_2 = 0,
- decals_1 = 8, decals_2 = 3,
+ tshirt_1 = 58,
+ tshirt_2 = 0,
+ torso_1 = 55,
+ torso_2 = 0,
+ decals_1 = 8,
+ decals_2 = 3,
arms = 41,
- pants_1 = 25, pants_2 = 0,
- shoes_1 = 25, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 25,
+ pants_2 = 0,
+ shoes_1 = 25,
+ shoes_2 = 0,
+ helmet_1 = -1,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
},
female = {
- tshirt_1 = 35, tshirt_2 = 0,
- torso_1 = 48, torso_2 = 0,
- decals_1 = 7, decals_2 = 3,
+ tshirt_1 = 35,
+ tshirt_2 = 0,
+ torso_1 = 48,
+ torso_2 = 0,
+ decals_1 = 7,
+ decals_2 = 3,
arms = 44,
- pants_1 = 34, pants_2 = 0,
- shoes_1 = 27, shoes_2 = 0,
- helmet_1 = -1, helmet_2 = 0,
- chain_1 = 0, chain_2 = 0,
- ears_1 = 2, ears_2 = 0
+ pants_1 = 34,
+ pants_2 = 0,
+ shoes_1 = 27,
+ shoes_2 = 0,
+ helmet_1 = -1,
+ helmet_2 = 0,
+ chain_1 = 0,
+ chain_2 = 0,
+ ears_1 = 2,
+ ears_2 = 0
}
},
bullet_wear = {
diff --git a/esx_policejob.sql b/esx_policejob.sql
index 7792cb0..05b7688 100644
--- a/esx_policejob.sql
+++ b/esx_policejob.sql
@@ -85,4 +85,18 @@ INSERT INTO `fine_types` (label, amount, category) VALUES
;
INSERT INTO `licenses` (`type`, `label`) VALUES
- ('weapon', 'Weapon license');
\ No newline at end of file
+ ('weapon', 'Weapon license');
+
+CREATE TABLE IF NOT EXISTS authorized_weapons (
+ grade VARCHAR(50) NOT NULL,
+ weapon VARCHAR(50) NOT NULL,
+ default_ammo INT NOT NULL,
+ price INT NOT NULL,
+ PRIMARY KEY (grade, weapon)
+);
+
+INSERT INTO `authorized_weapons` (`grade`, `weapon`, `default_ammo`, `price`) VALUES
+ ('shared', 'WEAPON_APPISTOL', 250, 10000),
+ ('shared', 'WEAPON_NIGHTSTICK', 0, 0),
+ ('shared', 'WEAPON_STUNGUN', 250, 1500),
+ ('shared', 'WEAPON_FLASHLIGHT', 0, 80);
\ No newline at end of file
diff --git a/server/armories.lua b/server/armories.lua
index d8dacbf..2f6bea8 100644
--- a/server/armories.lua
+++ b/server/armories.lua
@@ -3,14 +3,14 @@
--- @param weaponName string The weapon name
--- @return boolean, table|nil: Whether the weapon is authorized, and its data if authorized
local function isWeaponAuthorized(playerGrade, weaponName)
- local authorizedWeapons = Config.AuthorizedWeapons[playerGrade]
-
- for _, weapon in ipairs(authorizedWeapons) do
- if weapon.weapon == weaponName then
- return true, weapon
- end
+ local result = MySQL.prepare.await(
+ 'SELECT * FROM authorized_weapons WHERE (grade = ? OR grade = "shared") AND weapon = ? LIMIT 1',
+ { playerGrade, weaponName })
+
+ if result then
+ return true, result
end
-
+
return false
end
@@ -20,10 +20,11 @@ end
local function getPoliceInventory(armoryType)
local inventory = promise:new()
- TriggerEvent(armoryType == 'items' and 'esx_addoninventory:getSharedInventory' or 'esx_datastore:getSharedDataStore', 'society_police', function(data)
+ TriggerEvent(armoryType == 'items' and 'esx_addoninventory:getSharedInventory' or 'esx_datastore:getSharedDataStore',
+ 'society_police', function(data)
inventory:resolve(data)
end)
-
+
return Citizen.Await(inventory)
end
@@ -43,7 +44,8 @@ ESX.RegisterServerCallback('esx_policejob:buyWeaponOrComponent',
end
if not weaponData then
- print(("WARNING! Player %s attempted to buy weapon/component %s that does not exist."):format(source, weaponName))
+ print(("WARNING! Player %s attempted to buy weapon/component %s that does not exist."):format(source,
+ weaponName))
return cb(false)
end
@@ -55,21 +57,24 @@ ESX.RegisterServerCallback('esx_policejob:buyWeaponOrComponent',
xPlayer.addWeapon(weaponName, weaponData.defaultAmmo or 100)
cb(true)
elseif buyType == 'component' then
- local componentData = Config.WeaponComponents[weaponName] and Config.WeaponComponents[weaponName][componentIndex]
+ local componentData = Config.WeaponComponents[weaponName] and
+ Config.WeaponComponents[weaponName][componentIndex]
+
if not componentData or componentData.price == nil then return cb(false) end
if xPlayer.getMoney() < componentData.price then return cb(false, 'no_money') end
if xPlayer.hasWeaponComponent(componentData.name) then return cb(false, "already_owned_component") end
if componentData.price > 0 then xPlayer.removeMoney(componentData.price, 'Purchased weapon component') end
-
+
if Config.ExclusiveWeaponComponents[componentData.name] then
- for _, incompatibleComponent in ipairs(Config.ExclusiveWeaponComponents[componentData.name]) do
+ for i = 1, #Config.ExclusiveWeaponComponents[componentData.name] do
+ local incompatibleComponent = Config.ExclusiveWeaponComponents[componentData.name][i]
if xPlayer.hasWeaponComponent(weaponName, incompatibleComponent) then
xPlayer.removeWeaponComponent(weaponName, incompatibleComponent)
end
end
end
-
+
xPlayer.addWeaponComponent(weaponName, componentData.name)
cb(true)
end
@@ -85,8 +90,11 @@ ESX.RegisterServerCallback('esx_policejob:getArmory', function(source, cb, armor
local inventory = getPoliceInventory(armoryType)
if armoryType == 'weapons' then
local formattedInventory = {}
- for _, weapon in ipairs(inventory.get('weapons') or {}) do
- table.insert(formattedInventory, { count = weapon.count, name = weapon.name, label = ESX.GetWeaponLabel(weapon.name) })
+ local weapons = inventory.get('weapons') or {}
+ for i = 1, #weapons do
+ local weapon = weapons[i]
+ table.insert(formattedInventory,
+ { count = weapon.count, name = weapon.name, label = ESX.GetWeaponLabel(weapon.name) })
end
return cb(formattedInventory)
end
@@ -107,9 +115,9 @@ local function handleArmoryItem(armoryType, itemName, itemCount, isAdding)
if armoryType == 'weapons' then
local weapons = inventory.get('weapons') or {}
local foundWeapon = nil
-
- for _, weapon in ipairs(weapons) do
- if weapon.name == itemName then
+
+ for i = 1, #weapons do
+ if weapons[i].name == itemName then
foundWeapon = weapon
break
end
@@ -119,14 +127,14 @@ local function handleArmoryItem(armoryType, itemName, itemCount, isAdding)
if foundWeapon then
foundWeapon.count = foundWeapon.count + itemCount
else
- weapons[#weapons+1] = { name = itemName, count = itemCount }
+ weapons[#weapons + 1] = { name = itemName, count = itemCount }
end
else
if not foundWeapon or foundWeapon.count < itemCount then return false, true end
foundWeapon.count = foundWeapon.count - itemCount
if foundWeapon.count <= 0 then
- for _, weapon in ipairs(weapons) do
- if weapon.name == itemName then
+ for i = 1, #weapons do
+ if weapons[i].name == itemName then
table.remove(weapons, _)
break
end
@@ -143,7 +151,7 @@ local function handleArmoryItem(armoryType, itemName, itemCount, isAdding)
inventory.removeItem(itemName, itemCount)
end
end
-
+
return true
end
@@ -215,13 +223,13 @@ ESX.RegisterServerCallback('esx_policejob:getArmoryItem', function(source, cb, a
local success, isCountIssue = handleArmoryItem(armoryType, itemName, itemCount, false)
if not success then return cb(false, isCountIssue and 'not_enough_items_armory' or nil) end
-
+
if armoryType == 'weapons' then
xPlayer.addWeapon(itemName, 100)
else
xPlayer.addInventoryItem(itemName, itemCount)
end
-
+
xPlayer.showNotification("Armory updated.")
cb(true)
end)
@@ -249,4 +257,117 @@ ESX.RegisterServerCallback('esx_policejob:getPlayerInventory', function(source,
end
cb(armoryType == 'items' and formedPlayerInventory or xPlayer.getLoadout(true))
-end)
\ No newline at end of file
+end)
+
+local cachedGrades = nil
+
+local function initializeCachedGrades()
+ if not cachedGrades then
+ cachedGrades = {}
+ local policeGrades = ESX.GetJobs().police.grades
+
+ for grade, gradeData in pairs(policeGrades) do
+ cachedGrades[gradeData.name] = gradeData.label
+ end
+ end
+end
+
+ESX.RegisterServerCallback('esx_policejob:getJobGrades', function(source, cb)
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if Config.ArmoryManagementGrades and not Config.ArmoryManagementGrades[xPlayer.job.grade_name] then
+ print(("WARNING! Player %s is trying to get police job grades with no access. His grade: %s"):format(xPlayer.source, xPlayer.job.grade_name))
+ return cb(false)
+ end
+
+ if not cachedGrades then
+ initializeCachedGrades()
+ end
+
+ cb(cachedGrades)
+end)
+
+ESX.RegisterServerCallback('esx_policejob:getAuthorizedWeaponsFromGrade', function(source, cb, gradeName)
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if (Config.ArmoryManagementGrades and not Config.ArmoryManagementGrades[xPlayer.job.grade_name]) and gradeName ~= 'shared' then
+ if not cachedGrades then
+ initializeCachedGrades()
+ end
+
+ if not cachedGrades or not cachedGrades[gradeName] then
+ print(("WARNING! Player %s is trying to get authorized weapons but cachedGrades does not exist for his grade %s"):format(xPlayer.source, gradeName))
+ return cb(false)
+ end
+ end
+
+ local result = MySQL.prepare.await('SELECT * FROM authorized_weapons WHERE grade = ?', { gradeName })
+
+ if result and not result[1] then
+ result = { result }
+ end
+
+ cb(result)
+end)
+
+RegisterNetEvent('esx_policejob:addWeaponForGrade', function(weapon, gradeName, defaultAmmo, price)
+ local source = source
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if Config.ArmoryManagementGrades and not Config.ArmoryManagementGrades[xPlayer.job.grade_name] or (gradeName ~= 'shared') then
+ if not cachedGrades then
+ initializeCachedGrades()
+ end
+
+ if not cachedGrades or not cachedGrades[gradeName] then
+ print(("WARNING! Player %s is trying to get authorized weapons but cachedGrades does not exist for grade %s"):format(xPlayer.source, xPlayer.job.grade_name))
+ return
+ end
+ end
+
+ MySQL.prepare('INSERT INTO authorized_weapons (grade, weapon, default_ammo, price) VALUES (?, ?, ?, ?)',
+ { gradeName, weapon, defaultAmmo, price })
+ xPlayer.showNotification(TranslateCap('added_weapon', ESX.GetWeaponLabel(weapon)))
+end)
+
+ESX.RegisterServerCallback('esx_policejob:removeWeapon', function(source, cb, gradeName, weapon)
+ local source = source
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if Config.ArmoryManagementGrades and not Config.ArmoryManagementGrades[xPlayer.job.grade_name] or (gradeName ~= 'shared') then
+ if not cachedGrades then
+ initializeCachedGrades()
+ end
+
+ if not cachedGrades or not cachedGrades[gradeName] then
+ print(("WARNING! Player %s is trying to get authorized weapons but cachedGrades does not exist for his grade %s"):format(xPlayer.source, xPlayer.job.grade_name))
+ return cb(false)
+ end
+ end
+
+ MySQL.prepare('DELETE FROM authorized_weapons WHERE grade = ? AND weapon = ?', { gradeName, weapon })
+ xPlayer.showNotification(TranslateCap('removed_weapon', ESX.GetWeaponLabel(weapon)))
+ cb(true)
+end)
+
+ESX.RegisterServerCallback('esx_policejob:getAuthorizedWeapons', function(source, cb)
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if not cachedGrades then
+ initializeCachedGrades()
+ end
+
+ if not cachedGrades or not cachedGrades[xPlayer.job.grade_name] then
+ print(("WARNING! Player %s is trying to get authorized weapons but cachedGrades does not exist for his grade %s"):format(xPlayer.source, xPlayer.job.grade_name))
+ return cb(false)
+ end
+
+ local result = MySQL.prepare.await('SELECT * FROM authorized_weapons WHERE grade = ? OR grade = "shared"',
+ { xPlayer.job.grade_name })
+
+ if result and not result[1] then
+ result = { result }
+ end
+
+ cb(result)
+end)
From febb6b2cf11e368cc2580332500500d0b5a8d189 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Sun, 23 Feb 2025 09:51:12 +0100
Subject: [PATCH 17/18] replace ipairs() with for i = 1, # loops
---
client/bossActions.lua | 3 ++-
client/callButtons.lua | 3 ++-
client/cloakrooms.lua | 35 +++++++++++++++++++----------------
client/fines.lua | 3 ++-
client/garages.lua | 3 ++-
server/callButtons.lua | 2 +-
server/handcuffs.lua | 5 +++--
shared/utils.lua | 4 ++--
8 files changed, 33 insertions(+), 25 deletions(-)
diff --git a/client/bossActions.lua b/client/bossActions.lua
index 08f7e9c..bb27b52 100644
--- a/client/bossActions.lua
+++ b/client/bossActions.lua
@@ -13,7 +13,8 @@ CreateThread(function()
for stationName, stationData in pairs(Config.PoliceStations) do
local bossActions = stationData.bossActions
- for _, bossActionsZone in ipairs(bossActions) do
+ for i = 1, #bossActions do
+ local bossActionsZone = bossActions[i]
local markerSettings = bossActionsZone.marker
bossActionsPoints[#bossActionsPoints + 1] = zoneModule.createZonePoint({
zoneId = 'bossActions',
diff --git a/client/callButtons.lua b/client/callButtons.lua
index c0241b8..4229158 100644
--- a/client/callButtons.lua
+++ b/client/callButtons.lua
@@ -10,7 +10,8 @@ CreateThread(function()
for stationName, stationData in pairs(Config.PoliceStations) do
local callButtons = stationData.callButtons
- for _, callButtonZone in ipairs(callButtons) do
+ for i = 1, #callButtons do
+ local callButtonZone = callButtons[i]
zoneModule.createZonePoint({
zoneId = 'callButton',
coords = callButtonZone.coords,
diff --git a/client/cloakrooms.lua b/client/cloakrooms.lua
index 7daf618..5e69872 100644
--- a/client/cloakrooms.lua
+++ b/client/cloakrooms.lua
@@ -7,7 +7,8 @@ local function toggleService(toggle)
if toggle then
if not inServiceServer then
- local canTakeService, maxInService, inServiceCount = ESX.AwaitServerCallback('esx_service:enableService', 'police')
+ local canTakeService, maxInService, inServiceCount = ESX.AwaitServerCallback('esx_service:enableService',
+ 'police')
if not canTakeService then
ESX.ShowNotification(TranslateCap('service_max', inServiceCount, maxInService))
return false
@@ -37,7 +38,7 @@ local function loadCitizenWear()
end
exports.skinchanger:LoadSkin(playerSkin)
-
+
if Config.EnabledModules.esxService then
toggleService(false)
end
@@ -58,7 +59,7 @@ local function loadPoliceWear(uniform)
if not enterred then
print('Something went wrong when enterring service, can not set police clothes.')
return
- end
+ end
end
exports.skinchanger:LoadClothes(playerSkin, uniformObject)
@@ -76,9 +77,9 @@ local function loadCustomPed(modelHash)
if not enterred then
print('Something went wrong when enterring service, can not set police clothes.')
return
- end
+ end
end
-
+
ESX.Streaming.RequestModel(modelHash)
SetPlayerModel(ESX.playerId, modelHash)
@@ -88,18 +89,19 @@ local function loadCustomPed(modelHash)
end
local function openCloakroomMenu()
- local grade = ESX.PlayerData.job.grade_name
- local elements = {
- { label = TranslateCap('civilian_clothes'), value = 'citizen_wear' },
- { label = TranslateCap('police_unfirom'), value = 'police_wear', uniform = grade },
+ local grade = ESX.PlayerData.job.grade_name
+ local elements = {
+ { label = TranslateCap('civilian_clothes'), value = 'citizen_wear' },
+ { label = TranslateCap('police_unfirom'), value = 'police_wear', uniform = grade },
{ label = TranslateCap('bulletproof_vest'), value = 'police_wear', uniform = 'bullet_wear' },
- { label = TranslateCap('reflective_jacket'), value = 'police_wear', uniform = 'gilet_wear' }
+ { label = TranslateCap('reflective_jacket'), value = 'police_wear', uniform = 'gilet_wear' }
}
if Config.EnableCustomPeds then
- local customPeds = Config.CustomPeds
+ local customPeds = Config.CustomPeds
- for _, customPed in ipairs(customPeds.shared) do
+ for i = 1, #customPeds.shared do
+ local customPed = customPeds.shared[i]
elements[#elements + 1] = {
label = customPed.label,
value = 'customPed',
@@ -109,7 +111,8 @@ local function openCloakroomMenu()
end
if customPeds[grade] then
- for _, customGradePed in ipairs(customPeds[grade]) do
+ for i = 1, #customPeds[grade] do
+ local customGradePed = customPeds[grade][i]
elements[#elements + 1] = {
label = customGradePed.label,
value = 'customPed',
@@ -143,8 +146,9 @@ CreateThread(function()
for stationName, stationData in pairs(Config.PoliceStations) do
local cloakrooms = stationData.cloakrooms
- for _, cloakroomZone in ipairs(cloakrooms) do
- cloakroomPoints[#cloakroomPoints+1] = zoneModule.createZonePoint({
+ for i = 1, #cloakrooms do
+ local cloakroomZone = cloakrooms[i]
+ cloakroomPoints[#cloakroomPoints + 1] = zoneModule.createZonePoint({
zoneId = 'cloakroom',
coords = cloakroomZone.coords,
distance = 2.0,
@@ -152,7 +156,6 @@ CreateThread(function()
marker = cloakroomZone.marker,
enterSound = { 'SELECT', 'HUD_FRONTEND_DEFAULT_SOUNDSET' },
})
-
end
end
diff --git a/client/fines.lua b/client/fines.lua
index f69d5fa..7753dfc 100644
--- a/client/fines.lua
+++ b/client/fines.lua
@@ -48,7 +48,8 @@ local function openFinesByCategory(category, targetPlayer)
local elements = {}
- for _, fine in ipairs(cachedFines[category]) do
+ for i = 1, #cachedFines[category] do
+ local fine = cachedFines[category][i]
elements[#elements + 1] = {
label = ("%s - $%s"):format(fine.label, ESX.Math.GroupDigits(fine.amount)),
value = fine.id,
diff --git a/client/garages.lua b/client/garages.lua
index ccdfb3e..d8deaab 100644
--- a/client/garages.lua
+++ b/client/garages.lua
@@ -5,7 +5,8 @@ CreateThread(function()
for stationName, stationData in pairs(Config.PoliceStations) do
local garages = stationData.garages
- for _, garageZone in ipairs(garages) do
+ for i = 1, #garages do
+ local garageZone = garages[i]
garagePoints[#garagePoints + 1] = zoneModule.createZonePoint({
zoneId = 'garage',
coords = garageZone.coords,
diff --git a/server/callButtons.lua b/server/callButtons.lua
index 6261585..305a034 100644
--- a/server/callButtons.lua
+++ b/server/callButtons.lua
@@ -16,7 +16,7 @@ RegisterNetEvent('esx_policejob:callForHelp', function(stationName)
lastCallTimes[source] = currentTime
- --- Right now there is no option to check how many police officers are on service]
+ --- Right now there is no option to check how many police officers are on service so we have to do this
local policeOfficers = ESX.GetExtendedPlayers('job', 'police')
if not policeOfficers or not next(policeOfficers) then
diff --git a/server/handcuffs.lua b/server/handcuffs.lua
index 23a1941..196fba1 100644
--- a/server/handcuffs.lua
+++ b/server/handcuffs.lua
@@ -174,8 +174,9 @@ RegisterNetEvent('esx_policejob:confiscatePlayerItem', function(target, itemType
end)
CreateThread(function()
- for _, playerId in ipairs(GetPlayers()) do
- local player = Player(playerId)
+ local players = GetPlayers()
+ for i = 1, #players do
+ local player = Player(players[i])
player.state:set('isHandcuffed', nil, true)
player.state:set('isDragged', nil, true)
end
diff --git a/shared/utils.lua b/shared/utils.lua
index 528c8b3..23a1d5f 100644
--- a/shared/utils.lua
+++ b/shared/utils.lua
@@ -1,8 +1,8 @@
---@param item string
---@return boolean
function isItemSearchable(item)
- for _, blacklistedItem in ipairs(Config.TakeItemBlacklist) do
- if blacklistedItem == item then
+ for i = 1, #Config.TakeItemBlacklist do
+ if Config.TakeItemBlacklist[i] == item then
return false
end
end
From 1daacf6a5819385fd99397fa717e441797b5c6d0 Mon Sep 17 00:00:00 2001
From: zykem#0643 <86602828+Zykem@users.noreply.github.com>
Date: Sun, 23 Feb 2025 09:54:49 +0100
Subject: [PATCH 18/18] Remove useless print
---
server/main.lua | 1 -
1 file changed, 1 deletion(-)
diff --git a/server/main.lua b/server/main.lua
index 050b606..30996f8 100644
--- a/server/main.lua
+++ b/server/main.lua
@@ -81,7 +81,6 @@ ESX.RegisterServerCallback('esx_policejob:getOtherPlayerData', function(source,
if requiredData.drunk and Config.EnabledModules.esxOptionalNeeds then
TriggerEvent('esx_status:getStatus', target, 'drunk', function(status)
- print(json.encode(status))
if status then
targetData.drunk = ESX.Math.Round(status.percent, 1)
end