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