diff --git a/resources/BigDaddy-VendingMachines/BigDaddy-VendingMachines.Client.net.dll b/resources/BigDaddy-VendingMachines/BigDaddy-VendingMachines.Client.net.dll new file mode 100644 index 000000000..70de1d603 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/BigDaddy-VendingMachines.Client.net.dll differ diff --git a/resources/BigDaddy-VendingMachines/BigDaddy-VendingMachines.Server.net.dll b/resources/BigDaddy-VendingMachines/BigDaddy-VendingMachines.Server.net.dll new file mode 100644 index 000000000..4e07d0eb9 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/BigDaddy-VendingMachines.Server.net.dll differ diff --git a/resources/BigDaddy-VendingMachines/LICENSE.txt b/resources/BigDaddy-VendingMachines/LICENSE.txt new file mode 100644 index 000000000..9be46a940 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/LICENSE.txt @@ -0,0 +1,72 @@ +End User License Agreement + +THIS END USER LICENSE AGREEMENT (the "Agreement") + +BETWEEN: + + Big Daddy Scripts (a division of I CAN MAKE THAT, LLC) + (the "Vendor") + +OF THE FIRST PART + +- AND - + + Purchaser of Big Daddy Scripts resource + (the "Licensee") + +OF THE SECOND PART + +BACKGROUND: + +The Vendor wishes to license computer software to the Licensee and the Licensee desires to purchase the software license under the terms and conditions stated below. + +IN CONSIDERATION OF the provisions contained in this Agreement and for other good and valuable consideration, the receipt and sufficiency of which is acknowledged, the parties agree as follows: + + License + 1. Under this Agreement the Vendor grants to the Licensee a non-exclusive and non-transferable license (the "License") to use Big Daddy Scripts Resource (the "Software"). + 2. "Software" includes the executable computer programs and any related printed, electronic and online documentation and any other files that may accompany the product. + 3. Title, copyright, intellectual property rights and distribution rights of the Software remain exclusively with the Vendor. Intellectual property rights include the look and feel of the Software. This Agreement constitutes a license for use only and is not in any way a transfer of ownership rights to the Software. + 4. The Software may be loaded onto no more than one computer. A single copy may be made for backup purposes only. + 5. The rights and obligations of this Agreement are personal rights granted to the Licensee only. The Licensee may not transfer or assign any of the rights or obligations granted under this Agreement to any other person or legal entity. The Licensee may not make available the Software for use by one or more third parties. + 6. The Software may not be modified, reverse-engineered, or de-compiled in any manner through current or future available technologies. + 7. Failure to comply with any of the terms under the License section will be considered a material breach of this Agreement. + + License Fee + 8. The purchase price paid by the Licensee will constitute the entire license fee and is the full consideration for this Agreement. + Limitation of Liability + 9. The Software is provided by the Vendor and accepted by the Licensee "as is". Liability of the Vendor will be limited to a maximum of the original purchase price of the Software. The Vendor will not be liable for any general, special, incidental or consequential damages including, but not limited to, loss of production, loss of profits, loss of revenue, loss of data, or any other business or economic disadvantage suffered by the Licensee arising out of the use or failure to use the Software. + 10. The Vendor makes no warranty expressed or implied regarding the fitness of the Software for a particular purpose or that the Software will be suitable or appropriate for the specific requirements of the Licensee. + 11. The Vendor does not warrant that use of the Software will be uninterrupted or error-free. The Licensee accepts that software in general is prone to bugs and flaws within an acceptable level as determined in the industry. + + Warrants and Representations + 12. The Vendor warrants and represents that it is the copyright holder of the Software. The Vendor warrants and represents that granting the license to use this Software is not in violation of any other agreement, copyright or applicable statute. + + Acceptance + 13. All terms, conditions and obligations of this Agreement will be deemed to be accepted by the Licensee ("Acceptance") upon the purchse of the software. + + User Support + 14. The Licensee will be entitled to support within Big Daddy Scripts Discord available most days, at no additional cost. + 15. The Licensee will be entitled to maintenance upgrades and bug fixes, at no additional cost, forever. + + Term + 16. The term of this Agreement will begin on purchase of the software and is perpetual. + + Termination + 17. This Agreement will be terminated and the License forfeited without the chance of a refund where the Licensee has failed to comply with any of the terms of this Agreement or is in breach of this Agreement. On termination of this Agreement for any reason, the Licensee will promptly destroy the Software or return the Software to the Vendor. + + Force Majeure + 18. The Vendor will be free of liability to the Licensee where the Vendor is prevented from executing its obligations under this Agreement in whole or in part due to Force Majeure, such as earthquake, typhoon, flood, fire, and war or any other unforeseen and uncontrollable event where the Vendor has taken any and all appropriate action to mitigate such an event. + + Additional Clauses + 19. You may not share any prop, texture, code, imagery, or any pieces that come with this resource. Failure to comply with this will result in the license being revoked without refund. + + Governing Law + 20. The Parties to this Agreement submit to the jurisdiction of the courts of the State of West Virginia for the enforcement of this Agreement or any arbitration award or decision arising from this Agreement. This Agreement will be enforced or construed according to the laws of the State of West Virginia. + + Miscellaneous + 21. This Agreement can only be modified in writing and can be modified at any time without warning or notice, although attempt to provide notice will be made. + 22. This Agreement does not create or imply any relationship in agency or partnership between the Vendor and the Licensee. + 23. Headings are inserted for the convenience of the parties only and are not to be considered when interpreting this Agreement. Words in the singular mean and include the plural and vice versa. Words in the masculine gender include the feminine gender and vice versa. Words in the neuter gender include the masculine gender and the feminine gender and vice versa. + 24. If any term, covenant, condition or provision of this Agreement is held by a court of competent jurisdiction to be invalid, void or unenforceable, it is the parties' intent that such provision be reduced in scope by the court only to the extent deemed necessary by that court to render the provision reasonable and enforceable and the remainder of the provisions of this Agreement will in no way be affected, impaired or invalidated as a result. + 25. This Agreement contains the entire agreement between the parties. All understandings have been included in this Agreement. Representations which may have been made by any party to this Agreement may in some way be inconsistent with this final written Agreement. All such statements are declared to be of no value in this Agreement. Only the written terms of this Agreement will bind the parties. + 26. This Agreement and the terms and conditions contained in this Agreement apply to and are binding upon the Vendor's successors and assigns. diff --git a/resources/BigDaddy-VendingMachines/Newtonsoft.Json.dll b/resources/BigDaddy-VendingMachines/Newtonsoft.Json.dll new file mode 100644 index 000000000..6e233b9f7 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/Newtonsoft.Json.dll differ diff --git a/resources/BigDaddy-VendingMachines/Vending.json b/resources/BigDaddy-VendingMachines/Vending.json new file mode 100644 index 000000000..4d716d27d --- /dev/null +++ b/resources/BigDaddy-VendingMachines/Vending.json @@ -0,0 +1,114 @@ +// If you change anything below you will probably break the script. This is not meant to be a configurable file due to the complexity of the data +[ + { + "model": "prop_vend_coffe_01", + "type": "coffee", + "gives": "bzzz_bigdaddy_prop_coffee,bzzz_bigdaddy_prop_mocha,bzzz_bigdaddy_prop_late,bzzz_bigdaddy_prop_espresso,bzzz_bigdaddy_prop_chocolate", + "givesFriendly": "beanmachine-coffee,beanmachine-mocha,beanmachine-latte,beanmachine-espresso,beanmachine-hotchocolage", + "givesOffset": "0.12,0,-0.04,-82.0,19.0,-16", + "givesBoneIndex": 57005, + "givesAnimDict": "amb@world_human_drinking@coffee@male@idle_a", + "givesAnim": "idle_a", + "prices": "1.50" + }, + { + "model": "prop_vend_soda_02", + "type": "soda", + "gives": "bzzz_bigdaddy_prop_cola,bzzz_bigdaddy_prop_zero,bzzz_bigdaddy_prop_sprunk,bzzz_bigdaddy_prop_sprunk,bzzz_bigdaddy_prop_orange,bzzz_bigdaddy_prop_coldtea,bzzz_bigdaddy_prop_miranda", + "givesFriendly": "eCola,ecolazero,Sprunk,sprunkdiet,orang-o-tang,coldtea,miranda", + "givesOffset": "0.14,0.02,-0.03,-75,-31,-53", + "givesBoneIndex": 57005, + "givesAnimDict": "amb@world_human_drinking@coffee@male@base", + "givesAnim": "base", + "prices": "1.00" + }, + { + "model": "prop_vend_soda_01", + "type": "soda", + "gives": "bzzz_bigdaddy_prop_cola,bzzz_bigdaddy_prop_zero,bzzz_bigdaddy_prop_sprunk,bzzz_bigdaddy_prop_sprunk,bzzz_bigdaddy_prop_orange,bzzz_bigdaddy_prop_coldtea,bzzz_bigdaddy_prop_miranda", + "givesFriendly": "eCola,ecolazero,Sprunk,sprunkdiet,orang-o-tang,coldtea,miranda", + "givesOffset": "0.14,0.02,-0.03,-75,-31,-53", + "givesBoneIndex": 57005, + "givesAnimDict": "amb@world_human_drinking@coffee@male@base", + "givesAnim": "base", + "prices": "1.00" + }, + { + "model": "prop_vend_fridge01", + "type": "fridge", + "gives": "ng_proc_sodabot_01a", + "givesFriendly": "eCola", + "givesOffset": "0.11,-0.06,-0.06,25.0,83.0,74.0", + "givesBoneIndex": 57005, + "givesAnimDict": "amb@world_human_drinking@coffee@male@idle_a", + "givesAnim": "idle_a", + "prices": "2.00" + }, + { + "model": "prop_vend_snak_01", + "type": "snack", + "gives": "bzzz_bigdaddy_prop_chips_d,bzzz_bigdaddy_prop_chips_b,bzzz_bigdaddy_prop_chips_f,bzzz_bigdaddy_prop_chips_a,bzzz_bigdaddy_prop_chips_e,bzzz_bigdaddy_prop_chips_c,bzzz_bigdaddy_prop_candybox,bzzz_bigdaddy_prop_cbbrown,bzzz_bigdaddy_prop_cbgreen,bzzz_bigdaddy_prop_cbred,bzzz_bigdaddy_prop_cbyellow,bzzz_bigdaddy_prop_captains,bzzz_bigdaddy_prop_meteorite,bzzz_bigdaddy_prop_nothings,bzzz_bigdaddy_prop_relblue,bzzz_bigdaddy_prop_relgreen,bzzz_bigdaddy_prop_relpink,bzzz_bigdaddy_prop_zebrabar", + "givesFriendly": "phatchips_bigcheese,phatchips_saltsauce,phatchips_stickyribs,phatchips_supersalt,phatchips_crinkle,phatchips_crinklehabanero,ps&qs,candybox_brown,candybox_green,candybox_red,candybox_yellow,captainslog,meteorite,sweetnothings,release_blue,release_green,release_pink,zebrabar", + "givesOffset": "0.14,-0.04,0.04,59.0,93.0,58.0", + "givesBoneIndex": 18905, + "givesAnimDict": "mp_player_inteat@pnq", + "givesAnim": "loop", + "prices": "1.00,1.00,1.00,1.00,1.00,1.00,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75" + }, + { + "model": "prop_vend_snak_01_tu", + "type": "snack", + "gives": "bzzz_bigdaddy_prop_chips_d,bzzz_bigdaddy_prop_chips_b,bzzz_bigdaddy_prop_chips_f,bzzz_bigdaddy_prop_chips_a,bzzz_bigdaddy_prop_chips_e,bzzz_bigdaddy_prop_chips_c,bzzz_bigdaddy_prop_candybox,bzzz_bigdaddy_prop_cbbrown,bzzz_bigdaddy_prop_cbgreen,bzzz_bigdaddy_prop_cbred,bzzz_bigdaddy_prop_cbyellow,bzzz_bigdaddy_prop_captains,bzzz_bigdaddy_prop_meteorite,bzzz_bigdaddy_prop_nothings,bzzz_bigdaddy_prop_relblue,bzzz_bigdaddy_prop_relgreen,bzzz_bigdaddy_prop_relpink,bzzz_bigdaddy_prop_zebrabar", + "givesFriendly": "phatchips_bigcheese,phatchips_saltsauce,phatchips_stickyribs,phatchips_supersalt,phatchips_crinkle,phatchips_crinklehabanero,ps&qs,candybox_brown,candybox_green,candybox_red,candybox_yellow,captainslog,meteorite,sweetnothings,release_blue,release_green,release_pink,zebrabar", + "givesOffset": "0.14,-0.04,0.04,59.0,93.0,58.0", + "givesBoneIndex": 18905, + "givesAnimDict": "mp_player_inteat@pnq", + "givesAnim": "loop", + "prices": "1.00,1.00,1.00,1.00,1.00,1.00,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75,0.75" + }, + { + "model": "prop_bar_beerfridge_01", + "type": "fridge", + "gives": "prop_beer_bar,prop_beer_blr,prop_beer_jakey,prop_beer_logger,prop_beer_patriot,prop_beer_pissh,prop_beer_pride,prop_beer_stz,prop_beerdusche", + "givesFriendly": "Just Beer,Blue,Jakey,Logger,Patriot,Pisswasser,Pride,Stz,Dusche", + "givesOffset": "0.11,-0.06,-0.06,25.0,83.0,74.0", + "givesBoneIndex": 57005, + "givesAnimDict": "amb@world_human_drinking@coffee@female@idle_a", + "givesAnim": "idle_a", + "prices": "4.00" + }, + { + "model": "prop_vend_fags_01", + "type": "cigarette", + "gives": "v_ret_ml_cigs,v_ret_ml_cigs2,v_ret_ml_cigs4,v_ret_ml_cigs5,v_ret_ml_cigs6,prop_cigar_pack_01", + "givesFriendly": "cig_redwood,cig_redwoodgold,cig_debonaire,cig_cardiaque,cig_69,cig_estancia", + "givesOffset": "0.13,0.03,0.0,-61,0,0", + "givesBoneIndex": 57005, + "givesAnimDict": "amb@code_human_wander_texting@male@exit", + "givesAnim": "exit", + "prices": "7.50,7.50,8.00,7.50,6.50,8.00" + }, + { + "model": "sf_prop_sf_vend_drink_01a", + "type": "soda", + "gives": "bzzz_bigdaddy_prop_energy_blueberry,bzzz_bigdaddy_prop_energy_kiwi,bzzz_bigdaddy_prop_energy_orange,bzzz_bigdaddy_prop_energy_raspberry", + "givesFriendly": "junk_blueberry,junk_kiwi,junk_orange,junk_raspberry", + "givesOffset": "0.14,0.02,-0.03,-75,-31,-53", + "givesBoneIndex": 57005, + "givesAnimDict": "amb@world_human_drinking@coffee@male@base", + "givesAnim": "base", + "prices": "1.00" + }, + { + "model": "prop_vend_water_01", + "type": "soda", + "gives": "bzzz_bigdaddy_prop_water_slightly,bzzz_bigdaddy_prop_water_sparkling,bzzz_bigdaddy_prop_water_still", + "givesFriendly": "raine_sligtly,raine_sparkling,raine_still", + "givesOffset": "0.11,-0.07,-0.04,-75,-2,-14", + "givesBoneIndex": 57005, + "givesAnimDict": "amb@world_human_drinking@coffee@male@base", + "givesAnim": "base", + "prices": "2.00" + }, + +] \ No newline at end of file diff --git a/resources/BigDaddy-VendingMachines/fxmanifest.lua b/resources/BigDaddy-VendingMachines/fxmanifest.lua new file mode 100644 index 000000000..40afa4784 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/fxmanifest.lua @@ -0,0 +1,30 @@ +fx_version 'bodacious' +game 'gta5' + +author 'Big Daddy' +version '1.2' +description 'Interact with Vending Machines' + +client_scripts { + '*Client.net.dll', + 'settings.ini', + 'Newtonsoft.Json.dll', + 'Vending.json' +} +server_scripts { + '*Server.net.dll', + 'Newtonsoft.Json.dll', + 'server.lua', + 'settings.ini' +} + +ui_page 'nui/ui.html' + +files { + 'nui/ui.html', + 'settings.ini', + 'nui/sounds/*.ogg', + 'nui/*.png' +} + +data_file 'DLC_ITYP_REQUEST' 'stream/bzzz_bigdaddy_prop_vending_machines.ytyp' \ No newline at end of file diff --git a/resources/BigDaddy-VendingMachines/nui/CoffeeSuccess.ogg b/resources/BigDaddy-VendingMachines/nui/CoffeeSuccess.ogg new file mode 100644 index 000000000..549ef6ae0 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/CoffeeSuccess.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/Jammed.ogg b/resources/BigDaddy-VendingMachines/nui/Jammed.ogg new file mode 100644 index 000000000..6154bfbf6 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/Jammed.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/Jammed.xmp b/resources/BigDaddy-VendingMachines/nui/Jammed.xmp new file mode 100644 index 000000000..e9cecdbc0 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/nui/Jammed.xmp @@ -0,0 +1,77 @@ + + + + + + + + CuePoint Markers + Cue + f48000 + + + CD Track Markers + Track + f48000 + + + Subclip Markers + InOut + f48000 + + + + 2023-06-26T16:31:26-04:00 + 2023-06-26T16:31:26-04:00 + xmp.iid:33789077-9455-e445-b7a0-1a879f2d5b4f + xmp.did:abfd5969-b80e-b54a-9630-b3e9d78c5365 + xmp.did:abfd5969-b80e-b54a-9630-b3e9d78c5365 + + + + saved + xmp.iid:abfd5969-b80e-b54a-9630-b3e9d78c5365 + 2023-06-26T16:31:26-04:00 + Adobe Audition 23.5 (Windows) + /metadata + + + saved + xmp.iid:33789077-9455-e445-b7a0-1a879f2d5b4f + 2023-06-26T16:31:26-04:00 + Adobe Audition 23.5 (Windows) + / + + + + audio/ogg; codec="vorbis" + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/BigDaddy-VendingMachines/nui/Pay.ogg b/resources/BigDaddy-VendingMachines/nui/Pay.ogg new file mode 100644 index 000000000..5e7de4ad0 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/Pay.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/SnackSuccess.ogg b/resources/BigDaddy-VendingMachines/nui/SnackSuccess.ogg new file mode 100644 index 000000000..6d9806253 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/SnackSuccess.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/SodaSuccess.ogg b/resources/BigDaddy-VendingMachines/nui/SodaSuccess.ogg new file mode 100644 index 000000000..651e3eabe Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/SodaSuccess.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/beanmachine-coffee.png b/resources/BigDaddy-VendingMachines/nui/beanmachine-coffee.png new file mode 100644 index 000000000..967f61f73 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/beanmachine-coffee.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/beanmachine-espresso.png b/resources/BigDaddy-VendingMachines/nui/beanmachine-espresso.png new file mode 100644 index 000000000..eb53846ef Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/beanmachine-espresso.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/beanmachine-hotchocolage.png b/resources/BigDaddy-VendingMachines/nui/beanmachine-hotchocolage.png new file mode 100644 index 000000000..22df5c029 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/beanmachine-hotchocolage.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/beanmachine-latte.png b/resources/BigDaddy-VendingMachines/nui/beanmachine-latte.png new file mode 100644 index 000000000..55ff6205a Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/beanmachine-latte.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/beanmachine-mocha.png b/resources/BigDaddy-VendingMachines/nui/beanmachine-mocha.png new file mode 100644 index 000000000..2acc8b929 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/beanmachine-mocha.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/candybox_brown.png b/resources/BigDaddy-VendingMachines/nui/candybox_brown.png new file mode 100644 index 000000000..b72dfcf43 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/candybox_brown.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/candybox_green.png b/resources/BigDaddy-VendingMachines/nui/candybox_green.png new file mode 100644 index 000000000..c9e73756e Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/candybox_green.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/candybox_red.png b/resources/BigDaddy-VendingMachines/nui/candybox_red.png new file mode 100644 index 000000000..8758e7c79 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/candybox_red.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/candybox_yellow.png b/resources/BigDaddy-VendingMachines/nui/candybox_yellow.png new file mode 100644 index 000000000..3d3552480 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/candybox_yellow.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/captainslog.png b/resources/BigDaddy-VendingMachines/nui/captainslog.png new file mode 100644 index 000000000..e3b6d7749 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/captainslog.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/cig_69.png b/resources/BigDaddy-VendingMachines/nui/cig_69.png new file mode 100644 index 000000000..cf98195a1 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/cig_69.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/cig_cardiaque.png b/resources/BigDaddy-VendingMachines/nui/cig_cardiaque.png new file mode 100644 index 000000000..b3df690e7 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/cig_cardiaque.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/cig_debonaire.png b/resources/BigDaddy-VendingMachines/nui/cig_debonaire.png new file mode 100644 index 000000000..1f5edd215 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/cig_debonaire.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/cig_estancia.png b/resources/BigDaddy-VendingMachines/nui/cig_estancia.png new file mode 100644 index 000000000..7a63a08e1 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/cig_estancia.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/cig_redwood.png b/resources/BigDaddy-VendingMachines/nui/cig_redwood.png new file mode 100644 index 000000000..197dee297 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/cig_redwood.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/cig_redwoodgold.png b/resources/BigDaddy-VendingMachines/nui/cig_redwoodgold.png new file mode 100644 index 000000000..35f6e3a74 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/cig_redwoodgold.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/coldtea.png b/resources/BigDaddy-VendingMachines/nui/coldtea.png new file mode 100644 index 000000000..4f0847848 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/coldtea.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/earthquakes.png b/resources/BigDaddy-VendingMachines/nui/earthquakes.png new file mode 100644 index 000000000..b5ec9e663 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/earthquakes.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/ecola.png b/resources/BigDaddy-VendingMachines/nui/ecola.png new file mode 100644 index 000000000..e804922b3 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/ecola.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/ecolazero.png b/resources/BigDaddy-VendingMachines/nui/ecolazero.png new file mode 100644 index 000000000..184db6964 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/ecolazero.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/junk_blueberry.png b/resources/BigDaddy-VendingMachines/nui/junk_blueberry.png new file mode 100644 index 000000000..a4ddbe9df Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/junk_blueberry.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/junk_kiwi.png b/resources/BigDaddy-VendingMachines/nui/junk_kiwi.png new file mode 100644 index 000000000..74283c49b Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/junk_kiwi.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/junk_orange.png b/resources/BigDaddy-VendingMachines/nui/junk_orange.png new file mode 100644 index 000000000..70e7c6201 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/junk_orange.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/junk_raspberry.png b/resources/BigDaddy-VendingMachines/nui/junk_raspberry.png new file mode 100644 index 000000000..3b14f87cc Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/junk_raspberry.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/meteorite.png b/resources/BigDaddy-VendingMachines/nui/meteorite.png new file mode 100644 index 000000000..8cfb645b4 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/meteorite.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/miranda.png b/resources/BigDaddy-VendingMachines/nui/miranda.png new file mode 100644 index 000000000..99cab42b9 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/miranda.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/orang-o-tang.png b/resources/BigDaddy-VendingMachines/nui/orang-o-tang.png new file mode 100644 index 000000000..6e0daaa0c Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/orang-o-tang.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/phatchips_bigcheese.png b/resources/BigDaddy-VendingMachines/nui/phatchips_bigcheese.png new file mode 100644 index 000000000..6c4806827 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/phatchips_bigcheese.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/phatchips_crinkle.png b/resources/BigDaddy-VendingMachines/nui/phatchips_crinkle.png new file mode 100644 index 000000000..625b9d1ac Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/phatchips_crinkle.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/phatchips_crinklehabanero.png b/resources/BigDaddy-VendingMachines/nui/phatchips_crinklehabanero.png new file mode 100644 index 000000000..c8e69b561 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/phatchips_crinklehabanero.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/phatchips_saltsauce.png b/resources/BigDaddy-VendingMachines/nui/phatchips_saltsauce.png new file mode 100644 index 000000000..0d629248a Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/phatchips_saltsauce.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/phatchips_stickyribs.png b/resources/BigDaddy-VendingMachines/nui/phatchips_stickyribs.png new file mode 100644 index 000000000..ee1c32180 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/phatchips_stickyribs.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/phatchips_supersalt.png b/resources/BigDaddy-VendingMachines/nui/phatchips_supersalt.png new file mode 100644 index 000000000..04a164c06 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/phatchips_supersalt.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/ps&qs.png b/resources/BigDaddy-VendingMachines/nui/ps&qs.png new file mode 100644 index 000000000..f9078d81d Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/ps&qs.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/raine_sligtly.png b/resources/BigDaddy-VendingMachines/nui/raine_sligtly.png new file mode 100644 index 000000000..df0415b2f Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/raine_sligtly.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/raine_sparkling.png b/resources/BigDaddy-VendingMachines/nui/raine_sparkling.png new file mode 100644 index 000000000..6cf5bcac5 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/raine_sparkling.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/raine_still.png b/resources/BigDaddy-VendingMachines/nui/raine_still.png new file mode 100644 index 000000000..1393d68c8 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/raine_still.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/release_blue.png b/resources/BigDaddy-VendingMachines/nui/release_blue.png new file mode 100644 index 000000000..18751244d Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/release_blue.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/release_green.png b/resources/BigDaddy-VendingMachines/nui/release_green.png new file mode 100644 index 000000000..66a64a3b0 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/release_green.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/release_pink.png b/resources/BigDaddy-VendingMachines/nui/release_pink.png new file mode 100644 index 000000000..723b11e6f Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/release_pink.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/sounds/CoffeeSuccess.ogg b/resources/BigDaddy-VendingMachines/nui/sounds/CoffeeSuccess.ogg new file mode 100644 index 000000000..549ef6ae0 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/sounds/CoffeeSuccess.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/sounds/Jammed.ogg b/resources/BigDaddy-VendingMachines/nui/sounds/Jammed.ogg new file mode 100644 index 000000000..6154bfbf6 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/sounds/Jammed.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/sounds/Pay.ogg b/resources/BigDaddy-VendingMachines/nui/sounds/Pay.ogg new file mode 100644 index 000000000..5e7de4ad0 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/sounds/Pay.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/sounds/SnackSuccess.ogg b/resources/BigDaddy-VendingMachines/nui/sounds/SnackSuccess.ogg new file mode 100644 index 000000000..6d9806253 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/sounds/SnackSuccess.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/sounds/SodaSuccess.ogg b/resources/BigDaddy-VendingMachines/nui/sounds/SodaSuccess.ogg new file mode 100644 index 000000000..651e3eabe Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/sounds/SodaSuccess.ogg differ diff --git a/resources/BigDaddy-VendingMachines/nui/sprunk.png b/resources/BigDaddy-VendingMachines/nui/sprunk.png new file mode 100644 index 000000000..9ab87750d Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/sprunk.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/sprunkdiet.png b/resources/BigDaddy-VendingMachines/nui/sprunkdiet.png new file mode 100644 index 000000000..018545e99 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/sprunkdiet.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/sweetnothings.png b/resources/BigDaddy-VendingMachines/nui/sweetnothings.png new file mode 100644 index 000000000..c8e24c511 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/sweetnothings.png differ diff --git a/resources/BigDaddy-VendingMachines/nui/ui.html b/resources/BigDaddy-VendingMachines/nui/ui.html new file mode 100644 index 000000000..ef27e722f --- /dev/null +++ b/resources/BigDaddy-VendingMachines/nui/ui.html @@ -0,0 +1,202 @@ + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/BigDaddy-VendingMachines/nui/zebrabar.png b/resources/BigDaddy-VendingMachines/nui/zebrabar.png new file mode 100644 index 000000000..093123364 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/nui/zebrabar.png differ diff --git a/resources/BigDaddy-VendingMachines/server.lua b/resources/BigDaddy-VendingMachines/server.lua new file mode 100644 index 000000000..39b0449f3 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/server.lua @@ -0,0 +1,87 @@ + +framework = 'bigdaddy' --VALUES CAN BE 'nat', 'qb', 'esx', 'nd', 'bigdaddy' or 'custom' + +reason = 'Vending Machine' --reason for the transaction will notify using framework methods + +useSociety = false +toSocietyaccount = '' +local currencySymbol = '$' + +if framework == 'nat' then + print('Framework set to nat') +elseif framework == 'qb' then + QBCore = exports['qb-core']:GetCoreObject() +elseif framework == 'esx' then + ESX = exports["es_extended"]:getSharedObject() +elseif framework == 'nd' then + NDCore = exports.ND_Core:GetCoreObject() +elseif framework == 'bigdaddy' then + print('Framework set to Big Daddy') +elseif framework == 'custom' then + print('LOAD CORE OBJECT HERE IF REQUIRED, if not then you may disregard this statement.') +else + print('FRAMEWORK IS NOT SET PROPERLY FOR RESOURCE! Check server.lua in ' .. GetCurrentResourceName() .. ' for money events. The current value is set to ' .. framework .. ', and this is not a valid selection.' ) +end + +RegisterNetEvent('BigDaddy-VendingMachines:Pay', function(amount, playerId) + local src = source + + if framework == 'nat' then + local account = exports.money:getaccount(src) + if (tonumber(account.bank) >= tonumber(amount)) then + local newbalance = tonumber(account.cash) - tonumber(amount) + exports.money:updateaccount(src, {cash = newbalance, bank = account.bank}) + exports.money:bankNotify(src, reason .. ' ' .. currencySymbol .. amount ) + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, true) + else + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, false) + end + elseif framework == 'qb' then + local Player = QBCore.Functions.GetPlayer(src) + if (Player.Functions.GetMoney('cash') >= tonumber(amount)) then + Player.Functions.RemoveMoney('cash', tonumber(amount), reason) + if (useSociety) then + exports['qb-management']:AddMoney(toSocietyaccount, tonumber(amount)) + end + TriggerClientEvent('QBCore:Notify', src, reason, 'primary', 5000) + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, true) + else + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, false) + end + elseif framework == 'esx' then + local xPlayer = ESX.GetPlayerFromId(src) + local account = xPlayer.getAccount('cash') + if (account.money >= tonumber(amount)) then + xPlayer.removeAccountMoney('cash', tonumber(amount)) + xPlayer.showNotification(reason) + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, true) + else + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, false) + end + elseif framework == 'nd' then + local Player = NDCore:getPlayer(src) + if (Player.cash >= amount) then + Player.DeductMoney('cash', amount, reason) + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, true) + else + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, false) + end + elseif framework == 'bigdaddy' then + local account = exports['BigDaddy-Money']:GetAccounts(src, playerId, -1) + local data = json.decode(account) + if (tonumber(data.cash) >= tonumber(amount)) then + local newbalance = tonumber(data.cash) - tonumber(amount) + exports['BigDaddy-Money']:UpdateTotals(src, data.bank, newbalance, data.dirty, -1) + TriggerClientEvent("BigDaddy-Money:Notify", src, 'Paid ' .. currencySymbol .. string.format("%.2f", amount) .. ' in cash ' .. reason) + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, true) + else + TriggerClientEvent('BigDaddy-VendingMachines:IsPaid', src, false) + end + elseif framework == 'custom' then + --INSERT CUSTOM CODE HERE FOR CASH MANAGEMENT + else + print('FRAMEWORK IS NOT SET PROPERLY FOR RESOURCE! Check server.lua in ' .. GetCurrentResourceName() .. ' for money events. The current value is set to ' .. framework .. ', and this is not a valid selection.' ) + end +end) + + diff --git a/resources/BigDaddy-VendingMachines/settings.ini b/resources/BigDaddy-VendingMachines/settings.ini new file mode 100644 index 000000000..80d7fd176 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/settings.ini @@ -0,0 +1,17 @@ +[licensing] +key1=pyqo129MJhQB9jFhFGFpeafMxFaynZjcGwlEyhYPz9Bl8v0j66LKVw%3d%3d + +[settings] +useMoney=true +showPrompts=true + +[keys] +;please see documenation on what these do and how to set them +actionKey=38 + +[locales] +outOfOrder=Out of order +;leave the $ in place or you will break the script +presToUse=Press $ to use Vending Machine +noMoney=You do not have enough money to purchase +jammed=The Machine Jammed diff --git a/resources/BigDaddy-VendingMachines/stream/_manifest.ymf b/resources/BigDaddy-VendingMachines/stream/_manifest.ymf new file mode 100644 index 000000000..394855b27 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/_manifest.ymf @@ -0,0 +1,18 @@ + + + + + + + + vendingmachines + + + v_coin_op + sf_prop_sf_interior + + + + + + diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_candybox.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_candybox.ydr new file mode 100644 index 000000000..ab51cbb85 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_candybox.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44cc45007344177980d75889ae0353259fec07c8798ccf199c333a326012c77c +size 27190 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cappuccino.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cappuccino.ydr new file mode 100644 index 000000000..4676b2508 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cappuccino.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a73ad87d48eec26fb2f578d3f2a2f6d9be0f1c0f67adf4a8b525d82c2d2e7d72 +size 25303 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_captains.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_captains.ydr new file mode 100644 index 000000000..209292a2a --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_captains.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13a3fe668e7d429f965b9fb30ba5e26e790541d51e0c997277777f3273e9936f +size 4801 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbbrown.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbbrown.ydr new file mode 100644 index 000000000..2926e2482 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbbrown.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bcbea8d2767cde98480eeb377b70d1991facb174e06281d579fa4cc224f587c +size 4365 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbgreen.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbgreen.ydr new file mode 100644 index 000000000..187f9d66e --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbgreen.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d33e70efd24ad61c6a130e6362ec62c1f4bbd72fe15feeeec3473976d1328cfb +size 4622 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbred.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbred.ydr new file mode 100644 index 000000000..8b927609d --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbred.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:872d51e984d781201b604bc70e12a1795787fbc7e7dd7f622b2e24dfb1e434aa +size 4449 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbyellow.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbyellow.ydr new file mode 100644 index 000000000..b9b403db6 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cbyellow.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f46193d5733140334fea95b41746839ca6bddc0c8fa94d085add97b8f11dfda +size 4662 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_a.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_a.ydr new file mode 100644 index 000000000..5086ab977 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_a.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edf70c1db016d7bd89d47a76a14966270830a68564329e73fba73a66bbe89dd8 +size 9029 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_b.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_b.ydr new file mode 100644 index 000000000..9c7e55d3b --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_b.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e643b8ec005f7f5d73e49fdc960d665ccc6c6da6b4f9a48400a1aae8ff7e27c +size 8718 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_c.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_c.ydr new file mode 100644 index 000000000..2fe74b7d6 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_c.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a253ab04ecec90f59326b5601d67e2b0294ac0eafaf2669b27e6f518e28f4a2 +size 8428 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_d.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_d.ydr new file mode 100644 index 000000000..4d8ad694e --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_d.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4959f63781070750d9ebdd9558379258f4d57069aaa5f94748b28fbcbbe6edd9 +size 8657 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_e.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_e.ydr new file mode 100644 index 000000000..eab24b20e --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_e.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6e7cf6627f1a1eff87bdfa62d0a5d2994701469cd9d81d104f4a5765e43308c +size 8303 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_f.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_f.ydr new file mode 100644 index 000000000..9bf1d303d --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chips_f.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d38a7e321c46af750aa5ceec9deed55e2b80523f65e86bc44df7217ec555426 +size 8762 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chocolate.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chocolate.ydr new file mode 100644 index 000000000..b2e91aabd --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_chocolate.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64e8f700dee8a4973c1258c94d292b0011579a2b2cf588a703ef249d9cc22e5c +size 24653 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_coffee.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_coffee.ydr new file mode 100644 index 000000000..fa5134a6a --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_coffee.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54f934cd1aa5ccef9073f179e5a76afa8ed01ab904763fe0fd6b7869bd8279b4 +size 24259 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cola.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cola.ydr new file mode 100644 index 000000000..14441808d --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_cola.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4848fa4440a153b63b5556f1e2025f5d33414c15dd50c0bd8d2d411a8af8e4a1 +size 26953 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_coldtea.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_coldtea.ydr new file mode 100644 index 000000000..5bfbb1c71 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_coldtea.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3eb21afff64ab7864b782c19aa1153dc614bd356255d11d0aa8ecbb8638e3b13 +size 30633 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_blueberry.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_blueberry.ydr new file mode 100644 index 000000000..9fda8bfba --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_blueberry.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e745fc5080d24062dfed0c4512fbb507f95c63e23d195417c48d2ddea47cfc1 +size 28818 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_kiwi.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_kiwi.ydr new file mode 100644 index 000000000..372f6f6ea --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_kiwi.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ddaffc6ca6c3c7c178581e12eda3dfe3bd84502bca82101480743fd608255d7 +size 29167 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_orange.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_orange.ydr new file mode 100644 index 000000000..ee162a22d --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_orange.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ec1d714c7ec3dfd6d12dbc4d7fb937f09d5640c99c38c6955bbcd80e983116c +size 28608 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_raspberry.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_raspberry.ydr new file mode 100644 index 000000000..83c29a045 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_energy_raspberry.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d26fd8c0010895d1fe84e6511943e8b3480de28ea71af34942131fa35f73b78d +size 28458 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_espresso.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_espresso.ydr new file mode 100644 index 000000000..656ce907c --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_espresso.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6367211c1132a7e316c8c93b48d951f55dbaff4e2cb5d2f435d2e0a894170a2a +size 24246 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_late.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_late.ydr new file mode 100644 index 000000000..78ed87be3 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_late.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10d09cf14ac21d9fd45740ccf5d7573084d6387e77fa00fb24197fe8a163d282 +size 24662 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_machine.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_machine.ydr new file mode 100644 index 000000000..262140eb0 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_machine.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22791a9d8a0ddaf970006dbe48353f2f584aad7348f84232ad8b1ba34961b05e +size 230354 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_meteorite.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_meteorite.ydr new file mode 100644 index 000000000..46baf10a7 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_meteorite.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:741c9f9cddae887bf9203853987c287e0916e2ecb445b5af508382223b0d6308 +size 5646 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_miranda.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_miranda.ydr new file mode 100644 index 000000000..2f0218f43 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_miranda.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae147a8d839491bca317793cb8c613c77e33fce9f2f400e8cad409c97062b1c1 +size 26920 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_mocha.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_mocha.ydr new file mode 100644 index 000000000..90d1d982d --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_mocha.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab3254be7e9ac4b87ca6642e9489199a039dfbd9ac7bfbfe2ccd542357f66e5e +size 24939 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_nothings.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_nothings.ydr new file mode 100644 index 000000000..0fdd1525c --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_nothings.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44a63039b94d6201d4aa993c8144e230f0e436961f644894ad614e23e851a7c3 +size 5359 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_orange.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_orange.ydr new file mode 100644 index 000000000..10a804e36 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_orange.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1e2ee1ab710dbee4eb64767e93f549694d0749865ffb115a4f38e716984e02a +size 26258 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relblue.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relblue.ydr new file mode 100644 index 000000000..225e2fe9a --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relblue.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dcf19d324199fb96aad6e90b9699797e52c9ea1c04953010232e88d0b0e8324 +size 2976 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relgreen.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relgreen.ydr new file mode 100644 index 000000000..76d938fc9 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relgreen.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74aac72f7935873177b146596ea163425098f335897d2d55099dfd085840651e +size 3110 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relpink.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relpink.ydr new file mode 100644 index 000000000..0846a31df --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_relpink.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff765d31c998d8a1254292bb6775f96e8fbaa7a3b9f59187c44020b7be0214eb +size 3042 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_sprunk.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_sprunk.ydr new file mode 100644 index 000000000..caff8f85f --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_sprunk.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f476948ec7218b25c130174410b5b9878570aaf8fc617ff067d6a6dc5afb0603 +size 31317 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_vending_machines.ytyp b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_vending_machines.ytyp new file mode 100644 index 000000000..98898c797 Binary files /dev/null and b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_vending_machines.ytyp differ diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_slightly.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_slightly.ydr new file mode 100644 index 000000000..65531c657 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_slightly.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef158d7170afee0614fdf3af166260ef4720760047cc75571eb2ae58cd7979b1 +size 37548 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_sparkling.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_sparkling.ydr new file mode 100644 index 000000000..27c3c023e --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_sparkling.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6531d9b9293a0b4543b012d361de1b9210a878a6e6d116ceb9c04962edc1f3f1 +size 37863 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_still.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_still.ydr new file mode 100644 index 000000000..cd6029e41 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_water_still.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f8d54b30fa20cea2e41e0ddc027f44d34ffd245035328ad95ab48c2b78d6dbc +size 37531 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_zebrabar.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_zebrabar.ydr new file mode 100644 index 000000000..5bd453feb --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_zebrabar.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86897ca67536d36ad91d9c7a0e1edd5846c46bb67fa978417a0d044caff28b67 +size 17612 diff --git a/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_zero.ydr b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_zero.ydr new file mode 100644 index 000000000..2f3414fbe --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/bzzz_bigdaddy_prop_zero.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a86ed5aaa8e7c672d47f16b7b545f7a009628d5b09fac6a63abfc01bc16c2fb1 +size 23387 diff --git a/resources/BigDaddy-VendingMachines/stream/vendingmachines.cwproj b/resources/BigDaddy-VendingMachines/stream/vendingmachines.cwproj new file mode 100644 index 000000000..69831c9c6 --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/vendingmachines.cwproj @@ -0,0 +1,12 @@ + + New CodeWalker Project + + + vendingmachines.ymap + + + + + + + \ No newline at end of file diff --git a/resources/BigDaddy-VendingMachines/stream/vendingmachines.ymap b/resources/BigDaddy-VendingMachines/stream/vendingmachines.ymap new file mode 100644 index 000000000..df20d281c --- /dev/null +++ b/resources/BigDaddy-VendingMachines/stream/vendingmachines.ymap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba56e572987b1d78c84582160f9f82b12133c16bc5d9882afce707cc73497cc4 +size 1662 diff --git a/resources/BigDaddy-VendingMachines/validkeys.txt b/resources/BigDaddy-VendingMachines/validkeys.txt new file mode 100644 index 000000000..0af2615af --- /dev/null +++ b/resources/BigDaddy-VendingMachines/validkeys.txt @@ -0,0 +1,78 @@ +Useable keys. Case Sensitive in the config. + + ESC + F1 + F2 + F3 + F5 + F6 + F7 + F8 + F9 + F10 + ~ + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + - + = + BACKSPACE + TAB + Q + W + E + R + T + Y + U + P + ] + ] + ENTER + CAPS + A + S + D + F + G + H + K + L + LEFTSHIFT + Z + X + C + V + B + N + M + COMMA + . + LEFTCTRL + LEFTALT + SPACE + RIGHTCTRL + INSERT + HOME + PAGEUP + PAGEDOWN + DELETE + LEFT + RIGHT + TOP + DOWN + NENTER + N4 + N5 + N6 + N+ + N- + N7 + N8 + N9 diff --git a/resources/[EGRP-Map-Addons]/LSSD_MAP/stream/davissheriff.ymap b/resources/[EGRP-Map-Addons]/LSSD_MAP/stream/davissheriff.ymap index 1bb861b8b..ab4760e77 100644 --- a/resources/[EGRP-Map-Addons]/LSSD_MAP/stream/davissheriff.ymap +++ b/resources/[EGRP-Map-Addons]/LSSD_MAP/stream/davissheriff.ymap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af916d8acdc6d676536157203ee74a5f9dc2f4e0b9c0d651baf1b1e57616c421 -size 2582 +oid sha256:4ed8d19eb162ded4b10b08317bc7770da55a59811bb463faff4b0e39d83e9e70 +size 2588 diff --git a/resources/[EGRP-Map-Addons]/LSSD_MAP/stream/lightpack.ymap b/resources/[EGRP-Map-Addons]/LSSD_MAP/stream/lightpack.ymap index 12108ec73..97f7df210 100644 --- a/resources/[EGRP-Map-Addons]/LSSD_MAP/stream/lightpack.ymap +++ b/resources/[EGRP-Map-Addons]/LSSD_MAP/stream/lightpack.ymap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2bdf8a566feaf3799ace666e40e8368dc7eeaa024c6e8c768829ba3bd86b4ab8 -size 2211 +oid sha256:04d2591da97e5dc78bf8bbb668eefeba1e2fc02a86a481f990e6e6354f006b0e +size 2930 diff --git a/resources/[EGRP-Map-Addons]/jd-harmonysheriff/stream/lasdroute68 .ymap b/resources/[EGRP-Map-Addons]/jd-harmonysheriff/stream/lasdroute68 .ymap new file mode 100644 index 000000000..0faef3d17 --- /dev/null +++ b/resources/[EGRP-Map-Addons]/jd-harmonysheriff/stream/lasdroute68 .ymap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99a7b4aec17fe8bd4d15c0381977bedce00935f1be4e130745c3d68f9becf527 +size 2836 diff --git a/resources/night_shifts/.fxap b/resources/night_shifts/.fxap new file mode 100644 index 000000000..1354be493 Binary files /dev/null and b/resources/night_shifts/.fxap differ diff --git a/resources/night_shifts/NUI/css/styles.css b/resources/night_shifts/NUI/css/styles.css new file mode 100644 index 000000000..9c70870bd --- /dev/null +++ b/resources/night_shifts/NUI/css/styles.css @@ -0,0 +1,1081 @@ +/* COLOR SETTINGS */ +body, html { + overflow: hidden; + margin: 0; + padding: 0; +} +:root { + /* Overwrite Bootstrap */ + --bs-body-bg: transparent; + + /* NOTIFICATION - POSITION » BOTTOM-CENTER SETTINGS */ + --notification-top: -2.5%; + --notification-left: 50%; + --notification-translateX: -50%; + /* NOTIFICATION - COLORS */ + --notification-success-color: rgba(0, 148, 20, 0.8); + --notification-success-border: rgba(0, 148, 20, 0.9); + --notification-warning-color: rgba(202, 125, 1, 0.8); + --notification-warning-border: rgba(202, 125, 1, 0.9); + --notification-error-color: rgba(207, 0, 0, 0.8); + --notification-error-border: rgba(207, 0, 0, 0.9); + --notification-dispatch-color: rgba(0, 141, 207, 0.8); + --notification-dispatch-border: rgba(0, 141, 207, 0.9); + --notification-emergency-color: rgba(124, 0, 207, 0.8); + --notification-emergency-border: rgba(124, 0, 207, 0.9); + + /* ICONS (e.g. Markers) */ + --exclamation-circle-fill: rgb(226, 30, 30, 1); + --check-square-fill-color: rgba(25, 135, 84, 1); + --x-square-fill-color: rgba(220, 53, 69, 1); + --exclamation-triangle-fill-color: rgba(233, 161, 28, 1); + --shield-fill-exclamation-color: rgba(226, 30, 30, 1); + --door-closed-fill-color: rgba(56, 44, 221, 1); + --capsule-pill-color: rgba(118, 184, 82, 1); + --people-fill-color: rgba(0, 123, 255, 1); + --person-dash-fill-color: rgba(220, 53, 69, 1); + --person-fill-color: rgba(255, 193, 7, 1); + --thermometer-half-color: rgba(23, 162, 184, 1); + --heartbreak-color: rgba(220, 53, 69, 1); + --fire-color: rgb(255, 129, 79); + --cone-color: rgb(255, 200, 48); + --heart-fill-color: rgb(230, 84, 0); + --shield-fill-color: rgb(163, 206, 255); + --bag-fill-color: rgba(136, 255, 0, 1); + --geo-alt-fill-color: rgba(23, 162, 184, 1); + --person-bounding-box-color: rgba(255, 193, 7, 1); + --dot-color: rgba(220, 53, 69, 1); + --file-earmark-lock-fill-color: rgba(255, 153, 0, 1); + --exclamation-octagon-fill-color: rgba(255, 153, 0, 1); + --send-fill-color: rgba(166, 209, 255, 1); + --card-text-fill-color: rgba(199, 226, 255, 1); + + /* MENU */ + --menucontainer_background_gradient_color_1: rgba(0, 0, 0, 0.92); + --menucontainer_background_gradient_color_2: rgba(0, 0, 0, 0.84); + --menucontainer_background_gradient_color_3: rgba(0, 0, 0, 0.78); + --menucontainer_background_shadow_color: rgba(15, 15, 15, 1); + --menucontainer_background_basecolor: rgba(0, 0, 0, 0); + --menucontainer_header_text_color: rgba(204, 204, 204, 0.47); + --menucontainer_footer_text_color: rgba(204, 204, 204, 0.47); + + /* SIDEBAR */ + --sidebar_background_color: rgba(20, 20, 20, 0.8); + --sidebar_divider_color: rgba(204, 204, 204, 0.36); + --sidebar_divider_right_color: rgba(204, 204, 204, 0.56); + --sidebar_item_disabled: rgba(204, 204, 204, 0.52); + --sidebar_item_background_active_color: rgba(255, 255, 255, 0.15); + --sidebar_item_background_active_color_hover: rgba(255, 255, 255, 0.69); + + /* STATUS BOX */ + --statusbox_background_color: rgba(33, 37, 41, 1); + --statusbox_border_color: rgba(255, 255, 255, 0.47); + --statusbox_button_border_color: rgba(52, 58, 64, 1); + --statusbox_button_hover_color: rgba(7, 10, 39, 0.8); + + /* HELP MENU */ + --helpmenu_background_color: rgba(0, 0, 0, 0.88); + --helpmenu_border_color: rgba(204, 204, 204, 1); + --helpmenu_text_color: rgba(204, 204, 204, 1); + --helpmenu_header_color: rgba(204, 204, 204, 1); + + /* BUTTONS */ + --button_close_text_color: rgba(204, 204, 204, 1); + --button_help_text_color: rgba(204, 204, 204, 1); + + /* SCROLLBAR */ + --scrollbar_track: rgba(255, 255, 255, 0.6); + --scrollbar_thumb: rgba(255, 255, 255, 0.26); + --scrollbar_hover: rgba(255, 255, 255, 0.5); + + --scrollbar_track_dark: rgba(29, 29, 29, 0.6); + --scrollbar_thumb_dark: rgba(14, 14, 14, 0.26); + --scrollbar_hover_dark: rgba(0, 0, 0, 0.5); + + /* HUD */ + --hud_colour: rgba(141, 141, 255, 1); + --hud_colour_faded: rgba(141, 141, 255, 0.36); + --hud_text_colour: rgba(204, 204, 204, 1); + + /* ANPR HUD */ + --anpr_hud_colour: rgba(255, 196, 0, 0.89); + --anpr_hud_background_colour: rgba(0, 0, 0, 0.5); + --anpr_hud_text_colour: rgba(204, 204, 204, 1); + --anpr_hud_plate_border_colour: rgba(255, 196, 0, 0.89); + --anpr_hud_alternate_colour: rgba(255, 0, 0, 1); + +} + +/* FORM CONTROL */ + +.form-control:valid, .form-select:valid { + border-color: rgba(0, 128, 0, 0.75); +} +.form-control:invalid, .form-select:invalid { + border-color: rgba(255, 0, 0, 0.75); +} + + +/* MENU */ + +#menucontainer { + position: absolute; + display: none; + flex-direction: row; + justify-content: center; + align-items: center; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: radial-gradient(var(--menucontainer_background_gradient_color_1) 1px, var(--menucontainer_background_gradient_color_2) 85%, var(--menucontainer_background_gradient_color_3) 95%); + border-radius: 8px; + border-style: none; + box-sizing: border-box; + color: #FFFFFF; + width: 1500px; + height: 800px; + padding: 1rem; + box-shadow: 0 0 8px var(--menucontainer_background_shadow_color); + background-color: var(--menucontainer_background_basecolor); + gap: 1rem; + animation: slideInMenu 2s ease-in-out infinite; + animation-iteration-count: 1; + z-index: 1; +} + +@keyframes slideInMenu { + 0% { + top:-50%; + } + 10%, 100% { + top: 50%; + } +} + +.menucontainer_header { + position: absolute; + top: 1.25rem; + left: 50%; + transform: translate(-50%, -50%); + margin: 0.5rem; + color: var(--menucontainer_header_text_color); + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-weight: bold; + font-size: 28px; +} + +.menucontainer_footer { + position: absolute; + bottom: 1.25rem; + left: 50%; + transform: translate(-50%, -50%); + margin: 0.5rem; + color: var(--menucontainer_footer_text_color); + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-weight: bold; + font-size: 20px; +} + +.menucontainer_iconsection { + position: absolute; + top: 1.25rem; + left: 85%; + transform: translate(-50%, -50%); + margin: 0.5rem; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-weight: bold; + font-size: 16px; +} + +#mdt-clock { + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-weight: bold; + font-size: 12px; +} + +.menucontainer_contentwrapper { + position: absolute; + display: flex; + flex-direction: row; + justify-content: center; + background: linear-gradient(to right, rgba(0, 0, 0, 0.8), rgba(50, 50, 50, 0.8)); + border-radius: 8px; + border-style: 1px solid rgb(0, 0, 0); + box-sizing: border-box; + box-shadow: 0px 0px 12px 2px inset var(--menucontainer_background_shadow_color); + padding: 1rem; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 1400px; + height: 700px; + z-index: 2; +} + +/* SIDEBAR */ + +.menucontainer_contentwrapper_sidemenu { + position: absolute; + display: flex; + flex-direction: column; + justify-content: start; + align-items: center; + align-content: stretch; + background: var(--sidebar_background_color); + border-style: none; + border-radius: 8px; + padding-bottom: 10px; + box-sizing: border-box; + box-shadow: 0px 0px 12px 2px inset var(--menucontainer_background_shadow_color); + top: 0; + left: 0; + width: 250px; + height: 700px; + overflow-y: auto; + transition: all 0.1s ease; + z-index: 3; +} + +.menucontainer_contentwrapper_sidemenu::-webkit-scrollbar { + cursor: pointer; + width: 10px; + height: 10px; +} + +.menucontainer_contentwrapper_sidemenu::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px var(--scrollbar_track); + border-radius: 6px; +} + +.menucontainer_contentwrapper_sidemenu::-webkit-scrollbar-thumb { + background: var(--scrollbar_thumb); + border-radius: 6px; +} + +.menucontainer_contentwrapper_sidemenu::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar_hover); +} + + +.menucontainer_contentwrapper_sidemenu::after { + content: ""; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 1px; + height: 90%; + background: linear-gradient(to bottom, transparent 0%, var(--sidebar_divider_right_color) 50%, transparent 100%); +} + +.menucontainer_contentwrapper_sidemenu_profile_img { + display: block; + width: 100px; + height: 100px; + border-radius: 50%; + border-style: solid; + border-width: 1px; + border-color: #00000000; + margin: 2rem; +} + +.sidebar_item { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 250px; + height: 50px; + border-style: none; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-size: 16px; + font-weight: 500; + transition: all 0.1s ease; + cursor: pointer; +} + +.sidebar_item::after { + content: ""; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 90%; + height: 1px; + background: linear-gradient(to left, transparent 0%, var(--sidebar_divider_color) 50%, transparent 100%); +} + +.sidebar_item:hover { + /* box-shadow: 0px 0px 6px 1px inset rgba(245, 222, 179, 0.8); */ + font-weight: bold; +} + +.sidebar_item.disabled { + color: var(--sidebar_item_disabled); + cursor: not-allowed; +} + +.sidebar_item.disabled:hover { + box-shadow: unset; + font-weight: unset; +} + +.sidebar_background_active { + background-color: var(--sidebar_item_background_active_color); + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1), + inset 0 0 0 3px rgba(255, 255, 255, 0.5); + transition: box-shadow 0.2s ease-out; +} + +.sidebar_background_active:hover { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1), + inset 0 0 0 6px rgba(255, 255, 255, 0.5); +} + +/* DROPDOWN DIVIDER */ + +.divider-light { + border-top: 1px solid rgba(255, 255, 255, 0.2); +} + +/* INNER MENU WRAPPER PLACED BY OFFSET FROM SIDEBAR */ + +.menucontainer_contentwrapper_menuwrapper { + position: absolute; + display: flex; + flex-direction: column; + justify-content: start; + align-items: center; + left: 280px; + width: 77.5%; + height: 95%; + background: rgba(0, 0, 0, 0); + overflow-y: auto; + overflow-x: hidden; /* Hide scrollbar on the x-axis */ + z-index: 4; +} + +.menucontainer_contentwrapper_menuwrapper::-webkit-scrollbar { + cursor: pointer; + width: 10px; + height: 10px; + } + +.menucontainer_contentwrapper_menuwrapper::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px var(--scrollbar_track); + border-radius: 6px; +} + +.menucontainer_contentwrapper_menuwrapper::-webkit-scrollbar-thumb { + background: var(--scrollbar_thumb); + border-radius: 6px; +} + +.menucontainer_contentwrapper_menuwrapper::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar_hover); +} + +.no_text_deco { + /* font-size: 14px; */ + font-weight: 400; + text-decoration: none; +} + +.statusboxwrapper { + position: relative; + display: flex; + flex-wrap: wrap; + flex-direction: row; + margin: 0.2rem; + padding: 0.5rem; + background-color: var(--statusbox_background_color); + justify-content: space-evenly; + align-items: center; + gap: 0.5rem; + border-width: 2px; + border-style: inset; + border-color: var(--statusbox_border_color); + color: rgba(0, 0, 0, 0.8); + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-size: 14px; + + max-height: 500px; + overflow-y: auto; +} + +.statusbutton { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 50px; + height: 50px; + padding: 0.5rem; + color: #f8f9fa; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-size: 11px; /* 11 px for american callsigns recommended */ + font-weight: bold; + border-width: 2px; + border-style: inset; + border-color: var(--statusbox_button_border_color); + box-sizing: border-box; + cursor: pointer; +} + +.statusbutton:hover { + box-shadow: 0px 0px 12px 2px inset var(--statusbox_button_hover_color); +} + +.statusbuttonexplanations { + position: relative; + display: flex; + flex-direction: column; + margin: 0.2rem; + padding: 0.5rem; + justify-content: left; + align-items: left; + font-size: 11px; + max-height: 500px; + overflow-y: auto; +} + +.statusbuttonexplanations::-webkit-scrollbar, .statusboxwrapper::-webkit-scrollbar { + cursor: pointer; + width: 10px; + height: 10px; + } + +.statusbuttonexplanations::-webkit-scrollbar-track, .statusboxwrapper::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px var(--scrollbar_track); + border-radius: 6px; +} + +.statusbuttonexplanations::-webkit-scrollbar-thumb, .statusboxwrapper::-webkit-scrollbar-thumb { + background: var(--scrollbar_thumb); + border-radius: 6px; +} + +.statusbuttonexplanations::-webkit-scrollbar-thumb:hover, .statusboxwrapper::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar_hover); +} + +/* DROPDOWN ADDITIONS */ + +.custom-dropdown-menu { + max-height: 400px; /* Set a maximum height for the dropdown */ + overflow-y: auto; /* Enable vertical scrolling when content exceeds the height */ +} + +.custom-dropdown-menu a.dropdown-item:hover { + color: black !important; +} + +.custom-dropdown-menu::-webkit-scrollbar { + cursor: pointer; + width: 10px; + height: 10px; +} + +.custom-dropdown-menu::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px var(--scrollbar_track_dark); + border-radius: 6px; +} + +.custom-dropdown-menu::-webkit-scrollbar-thumb { + background: var(--scrollbar_thumb_dark); + border-radius: 6px; +} + +.custom-dropdown-menu::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar_hover_dark); +} + +/* CLOSE BUTTON */ + +.exit { + position: absolute; + background: none; + border: none; + right: 1rem; + top: 0.5rem; + width: 2rem; + height: 2rem; + opacity: 0.6; + cursor: pointer; + color: var(--button_close_text_color); + font-weight: bold; + font-size: 32px; +} + +.exit:hover { + opacity: 1; +} + +/* HELP BUTTON */ + +.help { + position: absolute; + background: none; + border:none; + left: 1rem; + top: 0.5rem; + width: 2rem; + height: 2rem; + opacity: 0.6; + cursor: pointer; + color: var(--button_help_text_color); + font-weight: bold; + font-size: 32px; +} + +.help:hover { + opacity: 1; +} + +/* HELP MENU */ + +#helpmenucontainer { + display: none; + flex-direction: column; + align-items: left; + position: absolute; + overflow-y: auto; + overflow-x: hidden; /* Hide scrollbar on the x-axis */ + background: var(--helpmenu_background_color); + border: inset; + border-color: var(--helpmenu_border_color); + padding: 1rem; + left: 3rem; + top: 3.25rem; + width: 20rem; + height: 30rem; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + color: var(--helpmenu_text_color); + font-size: 16px; + font-weight: 400; + animation: fadein-top 0.25s ease-in-out 1; + z-index: 99; +} + +.helpmenucontainer::-webkit-scrollbar { + cursor: pointer; + width: 10px; + height: 10px; + } + +.helpmenucontainer::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px var(--scrollbar_track); + border-radius: 6px; +} + +.helpmenucontainer::-webkit-scrollbar-thumb { + background: var(--scrollbar_thumb); + border-radius: 6px; +} + +.helpmenucontainer::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar_hover); +} + +@keyframes fadein-top { + 0% { opacity: 0; margin-bottom: 45px; } + 100% { opacity: 1; margin-bottom: 0; } +} + +.helpmenu-header { + position: relative; + top: 1%; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + color: var(--helpmenu_header_color); + font-size: 22px; + font-weight: bold; +} + +/* NOTIFICATIONS */ + +#notification-area { + position: fixed; + top: var(--notification-top); + left: var(--notification-left); + transform: translateX(var(--notification-translateX)); + width: auto; + height: 100vh; + display: flex; + flex-direction: column; + justify-content: flex-end; + } + +.notification { + position: relative; + padding: 10px 8px; + color: #f5f5f5; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-size: 14px; + font-weight: 700; + border-radius: 4px; + margin-top: 10px; +} + +.notification::after { + content: ""; + position: absolute; + bottom: -3px; + left: 0; + width: 100%; + height: 3px; + background: linear-gradient(to right, transparent, rgba(0, 0, 0, 0.75), transparent); +} + +.notification.success { + animation: slideInNotification 0.5s ease forwards; + background-color: var(--notification-success-color); + border-top: 1px solid var(--notification-success-border); + } + + .notification.warning { + animation: slideInNotification 0.5s ease forwards; + background-color: var(--notification-warning-color); + border-top: 1px solid var(--notification-warning-border); + } + + .notification.error { + animation: slideInNotification 0.5s ease forwards; + background-color: var(--notification-error-color); + border-top: 1px solid var(--notification-error-border); + } + + .notification.dispatch { + animation: slideInNotification 0.5s ease forwards; + background-color: var(--notification-dispatch-color); + border-top: 1px solid var(--notification-dispatch-border); + } + + .notification.emergency { + animation: slideInNotification 0.5s ease forwards; + background-color: var(--notification-emergency-color); + border-top: 1px solid var(--notification-emergency-border); + } + +/* ANIMATION */ + +@keyframes slideInNotification { + 0%{ + transform: translateX(100%); + } + 40%{ + transform: translateX(-10%); + } + 80%{ + transform: translateX(0%); + } + 100%{ + transform: translateX(-10px); + } +} + +.data_icon { + margin-right: 10px; + margin-left: 10px; + display: inline-block; + vertical-align: middle; + line-height: normal; +} + +/* NS MDT - HUD */ + +.icon-group { + display: flex; + position: absolute; + top: 2.5%; + left: 50%; + transform: translateX(-50%); + justify-content: center; + align-items: center; + z-index: 999; + } + + .icon-group > div { + margin: 0 5px; /* Adjust the margin as per your desired spacing */ + } + +.location-group { + display: flex; + position: absolute; + top: 6%; + left: 50%; + transform: translateX(-50%); + justify-content: center; + align-items: center; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-size: 11px; + color: var(--hud_text_colour); + text-align: center; + z-index: 999; + } + +.location-group > div { + margin: 0 5px; /* Adjust the margin as per your desired spacing */ +} + +.dispatch-group { + display: flex; + position: absolute; + top: 8%; + left: 50%; + transform: translateX(-50%); + justify-content: center; + align-items: center; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-size: 11px; + color: var(--hud_text_colour); + text-align: center; + z-index: 999; + } + + .dispatch-group > div { + margin: 0 5px; /* Adjust the margin as per your desired spacing */ + } + +/* ANPR HUD */ + +.anpr-hud { + display: none; + position: absolute; + flex-direction: column; + top: 90%; + left: 90%; + transform: translate(-50%, -50%); + justify-content: center; + align-items: center; + min-width: 100px; + margin: 10px; + padding: 10px; + /* font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; */ + font-family: "License Plate", sans-serif; + font-size: 20px; + font-weight: 700; + color: var(--hud_text_colour); + text-align: center; + z-index: 999; + border: 3px inset var(--anpr_hud_colour); + /* background: linear-gradient(to bottom, #4c669f, #3b5998); */ + border-radius: 10px; + background: var(--anpr_hud_background_colour); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + white-space: nowrap; +} + +.anpr-front, +.anpr-rear { + flex: 1; + display: flex; + min-width: 70px; + padding: 5px 10px; + margin: 5px; + justify-content: center; + align-items: center; + /* background: rgba(0, 0, 0, 0.0);*/ + border: inset 2px; + border-color: var(--anpr_hud_plate_border_colour); + white-space: nowrap; +} + +.anpr-details { + display: none; + position: absolute; + flex-direction: column; + justify-content: left; + align-items: left; + text-align: left; + top: 20%; + left: 50%; + transform: translate(-50%, -50%); + margin: 10px; + padding: 10px; + font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; + font-size: 12px; + font-weight: 500; + color: var(--anpr_hud_text_colour); + z-index: 999; + border: 3px inset var(--anpr_hud_colour); + background: var(--anpr_hud_background_colour); + /* background: linear-gradient(to bottom, #4c669f, #3b5998); */ + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + white-space: normal; +} + +.anpr-flashing { + color: white; + border-color: white; + animation: flash 1s alternate infinite; +} + +@keyframes flash { + 0% { + color: var(--anpr_hud_alternate_colour); + border-color: var(--anpr_hud_alternate_colour); + } + 10% { + color: var(--anpr_hud_colour); + border-color: var(--anpr_hud_colour); + } + 20% { + color: var(--anpr_hud_alternate_colour); + border-color: var(--anpr_hud_alternate_colour); + } + 30% { + color: var(--anpr_hud_colour); + border-color: var(--anpr_hud_colour); + } + 40% { + color: var(--anpr_hud_alternate_colour); + border-color: var(--anpr_hud_alternate_colour); + } + 50% { + color: var(--anpr_hud_colour); + border-color: var(--anpr_hud_alternate_colour); + } + 100% { + color: var(--anpr_hud_colour); + border-color: var(--anpr_hud_alternate_colour); + } +} + +.noisy { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg==); +} +/* SHIFT ICON */ + +#shift-toggle { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 30px; + height: 30px; + border-radius: 50%; + background-color: transparent; + border: 2px solid var(--hud_colour); + animation: pulse 2s ease-in-out infinite; + box-shadow: 0 0 8px var(--hud_colour_faded); +} + +#shift-toggle.on-shift { + border-color: #00ff80; + box-shadow: 0 0 8px rgba(0, 255, 128, 0.8); +} + +#shift-toggle.off-shift { + border-color: var(--hud_colour_faded); +} + +/* CHARGE ICON */ + +#charge-toggle { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 30px; + height: 30px; + border-radius: 50%; + background-color: transparent; + border: 2px solid var(--hud_colour); + animation: pulse 2s ease-in-out infinite; + box-shadow: 0 0 8px var(--hud_colour_faded); +} + +#charge-toggle.charge-on { + border-color: #00ff80; + box-shadow: 0 0 8px rgba(0, 255, 128, 0.8); +} + +#charge-toggle.charge-off { + border-color: var(--hud_colour_faded); +} + +/* RADIO ICON */ + +#radio-toggle { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 30px; + height: 30px; + border-radius: 50%; + background-color: transparent; + border: 2px solid var(--hud_colour); + animation: pulse 2s ease-in-out infinite; + box-shadow: 0 0 8px var(--hud_colour_faded); +} + +#radio-toggle.on { + border-color: #00ff80; + box-shadow: 0 0 8px rgba(0, 255, 128, 0.8); +} + +#radio-toggle.off { + border-color: var(--hud_colour_faded); +} + +/* BUTTON STYLES */ + +.custom-btn:hover .tooltip-text { + display: inline; + transform: translateY(-100%); + transition: transform 0.3s ease-in-out; +} + +.tooltip-text { + display: none; +} + +/* Pulse Effect for Icons */ + +@keyframes pulse { + 0% { + opacity: 1; + } + 50% { + opacity: 0.8; + } + 100% { + opacity: 1; + } +} + +/* Bootstrap Icons */ + +.bi-exclamation-circle-fill { + color: var(--exclamation-circle-fill); +} +.bi-check-square-fill { + color: var(--check-square-fill-color); +} +.bi-x-square-fill { + color: var(--x-square-fill-color); +} +.bi-exclamation-triangle-fill { + color: var(--exclamation-triangle-fill-color); +} +.bi-shield-fill-exclamation { + color: var(--shield-fill-exclamation-color); +} +.bi-door-closed-fill { + color: var(--door-closed-fill-color); +} +.bi-capsule-pill { + color: var(--capsule-pill-color); +} +.bi-people-fill { + color: var(--people-fill-color); +} +.bi-person-dash-fill { + color: var(--person-dash-fill-color); +} +.bi-person-fill { + color: var(--person-fill-color); +} +.bi-thermometer-half { + color: var(--thermometer-half-color); +} +.bi-heartbreak { + color: var(--heartbreak-color); +} +.bi-fire { + color: var(--fire-color); +} +.bi-cone-striped { + color: var(--cone-color); +} +.bi-heart-pulse-fill { + color: var(--heart-fill-color); +} +.bi-shield-shaded { + color: var(--shield-fill-color); +} +.bi-bag-fill { + color: var(--bag-fill-color); +} +.bi-geo-alt-fill { + color: var(--geo-alt-fill-color); +} +.bi-person-bounding-box { + color: var(--person-bounding-box-color); +} +.bi-dot { + color: var(--dot-color); +} +.bi-file-earmark-lock-fill { + color: var(--file-earmark-lock-fill-color); +} +.bi-exclamation-octagon-fill { + color: var(--exclamation-octagon-fill-color); +} +.bi-send-fill { + color: var(--send-fill-color); +} +.bi-card-text { + color: var(--card-text-fill-color); +} + +/* Microtext */ + +.microtext { + font-size: 12px; +} + +/* LOADING */ + +.loading { + display: flex; + position: relative; + width: 20px; + height: 20px; + z-index: 9999; + border-radius: 50%; + border: 5px solid #f3f3f3; + border-top: 5px solid #3498db; + animation: spin 1s linear infinite, fadeInOut 1s ease-in-out infinite; + } + + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +@keyframes fadeInOut { + 0%, 100% { + opacity: 0.1; + } + 50% { + opacity: 1; + } +} + +.pagination-dark .page-link { + color: #fff; + background-color: #343a40; + border-color: #adb5bd69; +} + +.pagination-dark .page-item.active .page-link { + background-color: #28a745; + border-color: #28a745; +} + +.pagination-dark .page-link:focus, +.pagination-dark .page-link:hover { + background-color: #28a745; + border-color: #28a745; +} + + diff --git a/resources/night_shifts/NUI/images/999_call.png b/resources/night_shifts/NUI/images/999_call.png new file mode 100644 index 000000000..377d37b5e Binary files /dev/null and b/resources/night_shifts/NUI/images/999_call.png differ diff --git a/resources/night_shifts/NUI/images/999_call2.png b/resources/night_shifts/NUI/images/999_call2.png new file mode 100644 index 000000000..6352566d5 Binary files /dev/null and b/resources/night_shifts/NUI/images/999_call2.png differ diff --git a/resources/night_shifts/NUI/images/home_civ.png b/resources/night_shifts/NUI/images/home_civ.png new file mode 100644 index 000000000..677a8fac6 Binary files /dev/null and b/resources/night_shifts/NUI/images/home_civ.png differ diff --git a/resources/night_shifts/NUI/images/home_las.png b/resources/night_shifts/NUI/images/home_las.png new file mode 100644 index 000000000..7214d27df Binary files /dev/null and b/resources/night_shifts/NUI/images/home_las.png differ diff --git a/resources/night_shifts/NUI/images/home_lfb.png b/resources/night_shifts/NUI/images/home_lfb.png new file mode 100644 index 000000000..54ede0250 Binary files /dev/null and b/resources/night_shifts/NUI/images/home_lfb.png differ diff --git a/resources/night_shifts/NUI/images/home_met.png b/resources/night_shifts/NUI/images/home_met.png new file mode 100644 index 000000000..a51d65253 Binary files /dev/null and b/resources/night_shifts/NUI/images/home_met.png differ diff --git a/resources/night_shifts/NUI/images/home_tow.png b/resources/night_shifts/NUI/images/home_tow.png new file mode 100644 index 000000000..342c3c7ed Binary files /dev/null and b/resources/night_shifts/NUI/images/home_tow.png differ diff --git a/resources/night_shifts/NUI/index.html b/resources/night_shifts/NUI/index.html new file mode 100644 index 000000000..feba603ce --- /dev/null +++ b/resources/night_shifts/NUI/index.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + +
+
+
+
+
+
+ +
+
+   +
+
+   +
+
+
+ + \ No newline at end of file diff --git a/resources/night_shifts/NUI/js/api.js b/resources/night_shifts/NUI/js/api.js new file mode 100644 index 000000000..458fbafbd --- /dev/null +++ b/resources/night_shifts/NUI/js/api.js @@ -0,0 +1,7 @@ +export const sendToLua = (action, data) => { + fetch(`https://${GetParentResourceName()}/${action}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data), + }); +} \ No newline at end of file diff --git a/resources/night_shifts/NUI/js/config.js b/resources/night_shifts/NUI/js/config.js new file mode 100644 index 000000000..bea7a529b --- /dev/null +++ b/resources/night_shifts/NUI/js/config.js @@ -0,0 +1,4 @@ +export const NUI_CONFIG = { + fadeDuration: 300, + debugMode: true, +}; \ No newline at end of file diff --git a/resources/night_shifts/NUI/js/events.js b/resources/night_shifts/NUI/js/events.js new file mode 100644 index 000000000..24c10b7b4 --- /dev/null +++ b/resources/night_shifts/NUI/js/events.js @@ -0,0 +1,7 @@ +export const registerEvents = () => { + window.addEventListener('message', (event) => { + if (event.data.action === 'openNUI') { + document.getElementById('nui-container').style.display = 'block'; + } + }); +} diff --git a/resources/night_shifts/NUI/js/main.js b/resources/night_shifts/NUI/js/main.js new file mode 100644 index 000000000..c71c2e264 --- /dev/null +++ b/resources/night_shifts/NUI/js/main.js @@ -0,0 +1,8 @@ +import { registerEvents } from './events.js'; +import { updateUI } from './ui.js'; + +// Initialize events and UI +registerEvents(); + +// // Example function call +// updateUI({ text: "Hello, FiveM!" }); \ No newline at end of file diff --git a/resources/night_shifts/NUI/js/ui.js b/resources/night_shifts/NUI/js/ui.js new file mode 100644 index 000000000..3b2c3b756 --- /dev/null +++ b/resources/night_shifts/NUI/js/ui.js @@ -0,0 +1,3 @@ +export const updateUI = (data) => { + document.getElementById('nui-text').innerText = data.text; +} \ No newline at end of file diff --git a/resources/night_shifts/NUI/js/utility.js b/resources/night_shifts/NUI/js/utility.js new file mode 100644 index 000000000..77d7aad66 --- /dev/null +++ b/resources/night_shifts/NUI/js/utility.js @@ -0,0 +1,3 @@ +export const sleep = (ms) => { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/resources/night_shifts/NUI/main.js b/resources/night_shifts/NUI/main.js new file mode 100644 index 000000000..0c5af4ea8 --- /dev/null +++ b/resources/night_shifts/NUI/main.js @@ -0,0 +1,241 @@ +const UNKNOWN_USER_PICTURE="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3NjM5MkNEMTM5ODhFNzExQTU4Mzg5Qzc5RTU5MUQ2QiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowMjkyMjc2ODg4NDIxMUU3OTYwN0IwQjJGRDYwQ0ZGMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMjkyMjc2Nzg4NDIxMUU3OTYwN0IwQjJGRDYwQ0ZGMyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjdBMzkyQ0QxMzk4OEU3MTFBNTgzODlDNzlFNTkxRDZCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjc2MzkyQ0QxMzk4OEU3MTFBNTgzODlDNzlFNTkxRDZCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+bguwzwAAEORJREFUeNrsnQ/0V+Mdx2//tqQpQ2b+578y6RdC+51kCNEOytkmRTbU8efIDlGizHRoi82/bYSyHSVmq2QmzhdLKCJhCstixDCJKdr74z7L79Cvfj33z/e59/t6nfM593RO9/6e+7nP87rPvd/neW6z1atXRwBQmzRDAAAIAAAQAAAgAABAAACAAAAAAQAAAgAABAAACAAAEAAAIAAAQAAAgAAAAAEAAAIAAAQAAAgAABAAACAAAEAAAIAAAAABAAACAAAEAAAIAAAQAAAgAABAAACAAAAAAQAAAgAABAAACAAAEAAAIAAAQAAACAABACAAAEAAAIAAAAABAAACAAAEAAAIAAAQAAAgAABAAACAAAAAAQAAAgAABAAACAAAEAAAIAAAQAAAgAAAAAEAAAIIKkHNmhW27JVKpbk2eyq6KfZW7KTYQdFBsZmiZYP/vkrxjuItxauKxYr5iicVC+vr6z8rah6o4wigZgSgRr+FNn0VRyp6KdqlcNj3FbMUMxT3SAbLEAACQADhNPqWrtEPVhz6pTt72lhP4X7FTU4GqxAAAkAA1Wn4bbQ5Q3G2YtsqFOE1xdWK6yWCFQgAASCA/O74pysuUnwrgCL9S/EzxQ0h9gio4wigNAJQ4/+uNbQofrkXGgtNTJLAwwgAASCAdBv+RtpcqRhagLRdq/ipRPARAkAACCB547e7/ZRA7/rr6g30kwQWIgAEgAD8G//3tZmoaFvA9C1XDJAE/ogAEAAC2PDGf4424xTNC5xCG0A0TBIYjwAQAAJoeuMfpc0lJUrlJZLApQgAASCA9Tf+EdqMKWE6R0oClyEABIAAGm/8Q6L4LXpZGSoJXIcAEAAC+GrjP0KbaTk8869ULI3iMf72os5eMNqcga0VrXJ4J9BHErgXASAABPBF47eZejbzrn0Gh39ZMVPxkGKe4lU1wE/XUoYWUTxbsKviYMXhio4ZlOc9RTeVYTECQAA1LwA1PLvrzlbUpXjYjxW3Km5RQ3ssQdm6azNIMVDROsXyzVUcoLKtRAAIoNYFYOPoL0yxe3+NYpwa1xsplnErbYYpzkrxMeFylfEiBIAAalYAalh7u7thixQOZ138M9SoXsiwvLtrc72iZwqHs8eQOpV3PgJAADUnADUmO/ij1hVOoSHZT4dj1Zgyv6Cu3OcrLktBXPboc1CW5aaOI4BQBdBfmzsSHuYDxbFqQH/NOzcq//e0uUvxjYSHOkHln4wAEEDNCMDN6beJMrskOMzbit5qPHOrlR+dh724tF8YNk9wmJcUe2a1lgB1vHGak4KqcULCxm9TbftUs/Eb7u/3ceXxZReXD0AANcO5Cfe3qbZzQjgRV45+Vc4HIIBioG7z/lE82MYXe9k3PaRzcuUZm+AQXV1eAAGUnlMT7PtMFL/xD5ERrnzVyAt4wEvA9SUo5ZeAbtTfm4pNPQ/RQ3fbRwPu3RykzSOeu7+r2DLt0YHUcXoAIdEzQeO/I+TG7x4FrHy+P21uGqUzwAgQQLAckeTZvyDnOLZK+QEEEDyHeO73gO6uTxXhBF05H8g5P4AAwkbPx5to09lz94kFO13f8nZ2eQIEUDq6eObcXopNLdi5TnXl9qmTXagqCKCM7OW53xx1q5cX6URdeefknCdAAEGzk+d+Dxb0fB/MOU+AAILG9wu+Cwp6vgtyzhMggKDx/ZLviwU93xdzzhMggKDxnTf/ekHPd2nOeQIEEDTtPPf7oKDnuzznPAECCBqviQX19fUfF/FkE5S7GVUFAZQRr0kulUqlkF3iBOVeSVVBAGXEt0vctqDn2zbnPAECCJp3PPfbsaDnu2POeQIEEDRvee63W0HPd7ec8wQIIGhe9tyvrqDnW5dzngABBM1Lnvv1LOj59sw5T4AAgsb3E1idKpXKdkU6UVfeTp67P0NVQQBl5LnIf/38HxXsXH3La/lZQFVBAKXDLXb5uOfug9w3+Ypw97dyDvLc/fE8PhkOCKBa3O+5366KvgU5x76uvHnmBxBAIZiRYN9RursGfc1c+UZVKT+AAIJ/DLAFMxd57m5LZQ0O/BQHR/5Lei0qysKnCACSMCnBvlfoLhvkfHlXriuqlBdAAIVhgsL3czXfVNyuxtYisMZv5bndlc+H1S4vgABK/xiwRJu7Exyil2JMYKc1xpXLl7tdXgAB1ARXJtx/uO66ZwZy97dyDK9yPsADPg66vgQ1a5Zlw5mpzeEJD3O27pzXVLHxn6XN1QkPc5/OoXdWZaSOI4BQBdBVmyej5Cvg2Iu3EWpEn+b8zH+Z4oKk7VPRTWWfhwAQQE0JwDWkm7Q5JYVDzVKcqIb0Rg6Nf6sofmPfK4XD3awyZ/rTJnUcAYQsgM20eV6xRQqHe09xoeJGNarPMiirvTM6TXG5on0Kh1ym2ENlfQcBIICaFIBrWMdrMyXFQ9psup8rJqchAtfw+0fxi77vpFjOfirfnVnnlzqOAIIWgGtkN2tzcsqHtYU17Cu9k9TQFnmUaWd7rFAMUHRMuWwTVKZT8sgtdRwBFEEAbbSZnfId9ssysG/1Pe0eOew3d/vegC3d3TqKP8Zhc/j3iOKhvAdn0Ogb9lAOkABWIAAEgAC+kIAtovmYokOJU2rr/XVX438lrz9IHUcAhRCAk8C+2jykaFPCdNodv6ca/xN5/lHqOAIojACcBOzntWmKjUqUSlvpp48a/6y8/zB1HAEUSgANJPAnxcYlSOOHimOq0fgRAAIopACcBGxZ7emKLQucwjcVR6nxz61WAajjCKCQAnAS2F6buxRdC5g+G957rBr/P6pZCOo4AiisAJwE7Ge68VE8Cq8o3Kg4J4QvG1PHEUChBdBABEdrc4Pi2wGn7HXF6Wr4fw6lQNRxBFAKATgJbBLFs/CGKEJaFchmIl4XxbMS/xNSzqjjCKA0Amgggt2jeBWe4wMojo3nH6mG/0KIuaKOI4DSCaCBCDprM0zxA8XXc/zTnyh+rxinhh/0l3yo4wigtAJoIAJbjHOAE8H+Gf6pOYo/KCaq4f+7CLmhjiOA0gvgSzLYVpsjFYcoeii2SnA4W2DkEcUDihlq9K8VLR/UcQRQUwJYixBMAHspbHrvDlE8sKidwl4o2lx/WzPAXty9H8UDd16N4o+XPJvHCkMIAAEgAEAACAABAAJAAAgAEAACQACAABAAAgAEgAAQACAABIAAmkSlUmmlzU4KGzJsU4q3ieJJRJu6sNWGbC6BLQZqi4PaWH5bteddFzap558Km8prQ3wX19fXr0QACAABhNng7Td+W0VoXxedFC1T/BOrFM8pnnAxy2epcQSAABBAOg2+rTaHKmyK8GGKratQjKWKvyhs6u/9EsJyBIAAEEC23Xob4mvj/Y+Jwlo01B4fbA1DmycwI6THBeo4Aii0ANzY/jOi+COiRVgf0IYT25eOrg9h7gB1HAEUUgBq+Ptoc57ihCisxT+air1YvENxlUTwFAJAAAigaQ3fPg82WtG3RKm8R3GxRPAMAkAACGDtDd9+prNVfuwjoWUcgGCVbUIUrx70OgJAAAggbvj2c91ZiksVbWsgrfZrwSjFNRLBKgSAAGpWAGr8XdxdsUsNpte+VHyyJPA0AkAANSUANXx7qXe+4hJFqxpO8UqXg7ESwacIAAGUXgBuhZ5JUTxyD2Lsu4EnZrECEXUcAQQjADX+g7SZGhX7e39ZYeMHjpMEHkUACKB0AlDjPzWKP54RSpffutz2Qs5ePIYyzsAeCYZIAr9DAAigFAJQw7eD2O/6I3Iu/jLFbMVCxcuKxYolircVK9TIPmlQxq9p00axuWK7KJ5J2FGxp+IAxRY5l92+fmTjBlYjAARQWAG4l32/jeLf9rPGVva1iTk2Qedvac7Wc7MND4ziiUc2AWmTHM7Hfh35cdKXg9RxBFAVAbjGf5vihxkWcUUUD7edrHhQjeW/WedE52VfIDpY0T+Khym3yfDP2deHTkoiAeo4AshdADk0fru7X2t3STWO96uVH51nO9e7GRrF3x0ITgLUcQSQqwDcM7+97Ds9gyI9rxipuCuN5+MURWDnfGwUD2XeI4M/YZ9FH+JzztRxBJC3AC6O4mG9aWLLc9lxJ+YxfDaBCGxYs32j0F56bpPy4Ufp3EcjAAQQrADUAE60RppiEayx/8KEosq/oih5Ux7svYCN9z83SndpsgHKwyQEgACCE4Aqfbco/pBmWp/ptjX4BqrCzy1q/pSTOm1ujeI1CtPAXnL2UE6eRAAIIBgBqKLb7+fWULdL6U/fqDhHFf3joudQuWmtzXjFaSkd0sYy1Ck3byMABFB1AbgXYLbgxdEp/Elr8D9R5Z5YtlwqT/Zu4DeK1ikczsY79G3KS0HqeOM0JwWpMDSlxm9r8O9XxsZvuPPaz51nUo52eQd6ANXrAeiuZsNlF0TJV+i1YxyWxWy4AHsCNhvSRit2TngoW4m4k3L2Cj0ABJC7AFzX36ax9kz4Z+YpeqsiL6uVvCp3NrdgpqJrwkM9pOi1rkcB6jiPAFkxIIXGv6DWGr97HLDz7e3OPwk93XUAegD59QDcENi/KzokOLwN7umuxrC0VvOrPNoXjR6Lkg0aekuxa2NDoqnj9ACy4IKEjf9DxVG13PhdT8DO/yiXD186uOsB9ACy7wG4u5ZNxknyc1Y/Vf47yfCanB6vzZQEh7CfT3dem1Cp4/QA0mZkwsY/nsb/lZ6A5WN8gkO0dtcFEECmdyr7CWtggkPMp7u6zseq+Qn2H+iuDyCAzBiW4O5vE3sG5bFoR0F7AZaXQS5Pvr2AYWSSdwCZvAPQ3WXjKH5z397zcLb2PXf/9feyrojibyb48J5iG+X5Q94B0ANIm5MSNH57OTWGFDaJMS5fPrR31wkQQOoMTrDviIZ3JVjno4DlaUSVrhMCgLV2S+2T3XWeu9syXreRxQ3iNpc3H+rc9QIEkBpJFvccrbvaZ6Rwg3oBlq/RVbpeCAC+Qj/P/Wzq6xTS58WUyH/qcD/ShwDS6v7bp7s7eu5+bVZfva2BXoDl7deeu3d01w0QQGKO8NzPvnM3gfQl4haXxzyvGwKAVCrStKauWweN9gIsf9MQAAKoVvffRpd199x9KhlMBd88dnfXDxCAN7aGnc/nvG046wzSlwozIr/hwa3c9QME4M2Bnvs9rO7ru6QvlccAy+PDOV8/BACfs0+Cuxak2wvI8/ohAPgc35+SZpO6VJmd8/VDAPA5O3jsY79fzyN1qTLP5TWP64cAYA0+LwCf1XPrR6Qu1fcAls9nc7p+CADWsITuf6EfA5aQNgSQhJke+9xL2jLh3pyuHwKANfwy2rChqAsV00lbJkx3+W0qK931AwTg/ez5ojbDm/jf7Tl1AFN/M7sWltcBLs9NYbi7ftAIrAm4vgS5NQErlcp52thadS0a+a/2dZrjVOEeIWvZomvRI4qHBzf2YRb7teACXYur7B/UcQSQWACu4u0cxavOHq7YPoqHp9odZrLiV419mgoykYB9mu1MRX/FboqWUbx2wH2KcboWi/7/f6njCAAAEAAAIAAAQAAACAABACAAAEAAAIAAAAABAAACAAAEAAAIAAAQAAAgAABAAACAAAAAAQAAAgAABAAACAAAEAAAIAAAQAAAgAAAAAEAAAIAAAQAAAgAABAAACAAAEAAAIAAAAABAAACAAAEAAAIAAAQAAAgAABAAACAAAAAAQAgAAQAgAAAAAEAAAIAAAQAAAgAABAAACAAAEAAAIAAAAABAAACAAAEAAAIAAAQAAAgAABAAACAAAAAAQBA9fifAAMAqBIXHEIuf1QAAAAASUVORK5CYII=";var ownDiscordAvatar,UNKNOWN_VEHICLE_PICTURE="https://assets.ea-rp.com/img/vehicle_placeholder.png",UNKNOWN_CIVILIAN_PICTURE="https://assets.ea-rp.com/img/civilian_placeholder.png",UNKNOWN_PROPERTY_PICTURE="https://assets.ea-rp.com/img/property_placeholder.png",displayIconsForHUD=!1,displayLocationForHUD=!1,displayWhetherDispatchIsActive=!1,SpinnerLoadingTimeInMs=250,notification_duration=5e3,ListenersAdded=!1,helpMenuOpen=!1,setColours=!1,batteryIcon=null,radioTransToggle=!1,theActiveDepartment=null,theActiveSubDepartment=null,activePage=1,activeArchivedPage=1,isDisplayingActiveCall=!1,keepInputForKeyboard=!1,timeZone="Europe/Amsterdam",timeFormat="nl-NL",mdtData={},helpMenuText={},mdtLanguage={},policeHandbook={},propertyTypes={},operationReports={},trainings={},displayHUD=!0,currentShiftTime=0,dispatchData=!1,statuscodes=null,personalData=null,playerList=null,userRoles=null,callData=null,callNotesData=null,shiftData=null,allCivilianData=null,civilianData=null,allVehicleData=null,vehicleData=null,markerData=null,fineData=null,operationsData=null,policeRecordData=null,statisticsData=null,fleetData=null,trainingData=null,departmentsCountData=null,npcCivilianData=null,propertyData=null,allPropertyData=null;function UpdateLoadingSpinner(e){e?($("#loading-container").append(`
${mdtLanguage.Loading}
${mdtLanguage.Loading}
`),$("#loading-container").fadeIn(10)):($("#loading-container").fadeOut(100),setTimeout(()=>{$("#loading-container").empty()},100))}function AddFleetManagementArea(){$.each(mdtData.DepartmentList,(e,a)=>{"civilian"!=a.DepartmentType&&$("#fleet-management-dropdown").append($(`
  • ${a.DepartmentName}
  • `))}),$("#fleet-management-dropdown .dropdown-item").on("click",function(){let e=$(this).data("department"),a=$(this).data("departmentname");$("#fleet-card-section").empty(),$("#fleet-card-section").append(` +
    +

    ${a}

    +
    + `);let t=fleetData.filter(a=>a.department_index===e);t.sort((e,a)=>e.id-a.id),t?.length===0&&$("#fleet-card-section").append(` +
    +
    ${mdtLanguage.NoVehiclesInThisFleet}
    +
    + `),t.forEach(e=>{let a=`
    ${e.vehicleName}
    ${e.vehicle_name}

    # ${e.id}

    ${mdtLanguage.FleetCardVehicleModel}: ${e.vehicle_model}
    ${mdtLanguage.SubDepartment}: ${mdtData.DepartmentList[e.department_index-1].SubDepartments[e.sub_department_index-1].SubDepartmentName}
    ${mdtLanguage.FleetCardRoofCodeCallsign}: ${e.roof_code_callsign}
    ${mdtLanguage.LicensePlate}: ${e.vehicle_plate}
    ${mdtLanguage.FleetCardVehicleInService}: ${e.in_service?mdtLanguage.Yes:mdtLanguage.No}
    ${mdtLanguage.FleetCardVehicleAttachedUnits}: ${e.attached_units?e.attached_units:mdtLanguage.None}

    `;$("#fleet-card-section").append(a)})}),$("#fleet-management-dropdown .dropdown-item").eq(1).trigger("click")}function detachAnyUnitsFromFleetVehicle(e){$.post("https://night_shifts/detachAnyUnitsFromFleetVehicle",JSON.stringify({fleetCardId:e}))}function ClickAddVehicleToFleetButton(){$("#add-vehicle-to-fleet-modal").remove();let e=` `;$("body").append(e),$.each(mdtData.DepartmentList,(e,a)=>{if("civilian"!=a.DepartmentType){let t=`${e+1} - ${a.DepartmentName}`;$("#fleet_department").append($(``))}}),$("#fleet_department").on("change",function(){let e=parseInt($("#fleet_department").val(),10),a=mdtData.DepartmentList[e-1];$("#fleet_sub_department").empty(),$.each(a.SubDepartments,(e,a)=>{let t=`${e+1} - ${a.SubDepartmentName}`;$("#fleet_sub_department").append($(``))})}),$("#add-fleet-card-button").on("click",function(){let e=$("#fleet_vehicle_picture_url").val().trim(),a=parseInt($("#fleet_department").val(),10),t=parseInt($("#fleet_sub_department").val(),10),i=$("#fleet_vehicle_name").val().trim(),l=$("#fleet_vehicle_model").val().trim(),s=$("#fleet_vehicle_roof_code_callsign").val().trim(),n=$("#fleet_vehicle_plate").val().trim();if(""!==e&&!isNaN(a)&&a>=0&&!isNaN(t)&&t>=0&&""!==i&&""!==l&&""!==s&&""!==n)$.post("https://night_shifts/addVehicleToFleet",JSON.stringify({fleet_vehicle_picture_url:e,department_index:a,sub_department_index:t,vehicle_name:i,vehicle_model:l,roof_code_callsign:s,vehicle_plate:n,in_service:!1})),$("#add-vehicle-to-fleet-modal").modal("hide"),$("#add-fleet-card-button").off("click");else{console.log(`${mdtLanguage.ValidationFailed}`);let r=$(` + `);$("#fleet-alert-area").prepend(r),setTimeout(()=>{r.alert("close")},2500),$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.ValidationFailed}))}}),$("#fleet_department").trigger("change"),$("#add-vehicle-to-fleet-modal").modal("show")}function editFleetCard(e){let a=fleetData.filter(a=>a.id===e);if((a?.length??0)===0)return;let t=a[0];$("#edit-fleet-card-modal").remove();let i=` `;$("body").append(i),$.each(mdtData.DepartmentList,(e,a)=>{if("civilian"!=a.DepartmentType){let i=`${e+1} - ${a.DepartmentName}`;$("#edit_fleet_department").append($(``)),e+1===t.department_index&&$("#edit_fleet_department").val(e+1)}}),$("#edit_fleet_department").on("change",function(){let e=parseInt($("#edit_fleet_department").val(),10),a=mdtData.DepartmentList[e-1];$("#edit_fleet_sub_department").empty(),$.each(a.SubDepartments,(e,a)=>{let i=`${e+1} - ${a.SubDepartmentName}`;$("#edit_fleet_sub_department").append($(``)),e+1===t.sub_department_index&&$("#edit_fleet_sub_department").val(e+1)})}),$("#edit-fleet-card-button").on("click",function(){let e=$("#edit_fleet_vehicle_picture_url").val().trim(),a=parseInt($("#edit_fleet_department").val(),10),i=parseInt($("#edit_fleet_sub_department").val(),10),l=$("#edit_fleet_vehicle_name").val().trim(),s=$("#edit_fleet_vehicle_model").val().trim(),n=$("#edit_fleet_vehicle_roof_code_callsign").val().trim(),r=$("#edit_fleet_vehicle_plate").val().trim(),d=$("#edit_fleet_vehicle_in_service").is(":checked");if(""!==e&&!isNaN(a)&&a>=0&&!isNaN(i)&&i>=0&&""!==l&&""!==s&&""!==n&&""!==r)$.post("https://night_shifts/editVehicleInFleet",JSON.stringify({id:Number(t.id),fleet_vehicle_picture_url:e,department_index:a,sub_department_index:i,vehicle_name:l,vehicle_model:s,roof_code_callsign:n,vehicle_plate:r,in_service:d})),$("#edit-fleet-card-modal").modal("hide"),$("#edit-fleet-card-button").off("click");else{console.log(`${mdtLanguage.ValidationFailed}`);let o=$(` + `);$("#fleet-alert-area-edit").prepend(o),setTimeout(()=>{o.alert("close")},2500),$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.ValidationFailed}))}$("#edit-fleet-card-modal").modal("hide"),$("#edit-fleet-card-button").off("click")}),$("#edit_fleet_department").trigger("change"),$("#edit-fleet-card-modal").modal("show")}function deleteFleetCard(e){$("#deleteFleetCardModal").remove();let a=` `;$("body").append(a),$("#deleteFleetCardModal").modal("show")}function performDelete(e){$.post("https://night_shifts/deleteVehicleFromFleet",JSON.stringify({id:Number(e)})),$("#deleteFleetCardModal").modal("hide")}function submitPropertyForm(){let e=$("#input_property_type option:selected").text(),a=$("#property_address").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),t=$("#property_house_number").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),i=$("#property_area").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),l=$("#property_postal").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),s=$("#property_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),n=$("#property_price").val().trim().replace(/[^\d.-]/g,""),r=$("#property_build_year").val().trim().replace(/[^\d]/g,""),d=$("#property_amenities").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),o=$("#property_seized").is(":checked"),c=new Date().toISOString().slice(0,19).replace("T"," "),p=$("#property_picture_url").val().trim().replace(/[^a-zA-Z0-9\-._~:/?#\[\]@!$&'()*+,;=]/g,""),m=$("#input_property_civ_id_value").val();""===e||""===a||""===t||""===i||""===l||""===s||""===n||""===r||""===d||""===p||""===m?$.post("https://night_shifts/errorMessage",JSON.stringify({message:"One or more fields have not been filled."})):$.post("https://night_shifts/registerProperty",JSON.stringify({property_type:e,address:a,house_number:t,area:i,postal_code:l,description:s,price:n,year_built:r,amenities:d,property_seized:o,registration_date:c,property_picture_url:p,civ_id:m}))}function editProperty(e){let a=JSON.parse(decodeURIComponent(e));$("#edit-modal-property").remove();let t=` `;$("body").append(t);var i=$("#edit_property_type"),l=$("");l.attr("value",""),l.text(mdtLanguage.SelectPropertyType),i.append(l),$.each(propertyTypes,function(e,a){var t=a.PropertyType,l=$("");l.attr("value",e),l.text(t),i.append(l)}),i.attr("required",!0),i.find("option:first").attr("selected",!0),i.change(function(){var e=$(this).find("option:selected").text();$("#edit_property_display_name").text(e),$("#edit_property_type_index_value").val(e)});var s=$("");$("#edit_property_type").after(s),$("#edit-button-editproperty").on("click",function(){let e=$("#edit_property_type_index_value").val().trim(),t=$("#edit_property_address").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),i=$("#edit_property_house_number").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),l=$("#edit_property_area").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),s=$("#edit_property_postal_code").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),n=$("#edit_property_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),r=$("#edit_property_price").val().trim().replace(/[^\d.-]/g,""),d=$("#edit_property_build_year").val().trim().replace(/[^\d]/g,""),o=$("#edit_property_amenities").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),c=$("#edit_property_seized").is(":checked"),p=new Date($("#edit_registration_date").val()).toISOString().slice(0,19).replace("T"," "),m=$("#edit_property_picture_url").val().trim().replace(/[^a-zA-Z0-9\-._~:/?#\[\]@!$&'()*+,;=]/g,""),u=$("#edit_property_owned_by").val();""!==e&&""!==t&&""!==i&&""!==l&&""!==s&&""!==n&&""!==r&&""!==d&&""!==o&&""!==m?($.post("https://night_shifts/updateProperty",JSON.stringify({id:a.id,property_type:e,address:t,house_number:i,area:l,postal_code:s,description:n,price:r,year_built:d,amenities:o,property_seized:c,registration_date:p,property_picture_url:m,civ_id:u})),$("#edit-modal-property").modal("hide"),$("#edit-button-editproperty").off("click")):console.log("Validation failed. Please fill in all required fields.")}),$("#edit-modal-property").modal("show")}function deleteProperty(e){$("#delete-modal-property").remove();let a=` `;$("body").append(a),$("#delete-button-property").on("click",function(){$.post("https://night_shifts/deleteProperty",JSON.stringify({id:e})),$("#delete-modal-property").modal("hide"),$("#delete-button-property").off("click")}),$("#delete-modal-property").modal("show")}function openCallsignModal(){$("#callsign-modal").remove();let e=` `;$("body").append(e),$("#callsign-modal").modal("show"),$("#save-callsign-button").on("click",function(){let e=$("#new-callsign-input").val().trim(),a=$("#callsign-error-container");if(!/^[A-Za-z0-9-]+$/.test(e)||e==mdtLanguage.System){a.text(mdtLanguage.CallsignErrorMessage1);return}a.text(""),$.post("https://night_shifts/saveNewCallsign",JSON.stringify({callsign:e})),$("#callsign-modal").modal("hide"),$("#save-callsign-button").off("click")})}function AddActiveCallPages(){let e=Math.ceil((callData?.filter(e=>!e.archived_call).length??0)/10);function a(e){let a=(e-1)*10,t=callData.filter(e=>!e.archived_call).sort((e,a)=>a.id-e.id),i=t.slice(a,a+10);$("#cwrapper").empty(),$.each(i,function(e,a){$("#cwrapper").append(`
    ${a.emergency_type?mdtLanguage.EmergencyCall:mdtLanguage.NonEmergencyCall} ${mdtLanguage.CallID+a.id}

    ${mdtLanguage.EmergencyCallBy} ${a.callername}

    999
    ${mdtLanguage.CallRequiredUnits}
    ${a.police_required?`
    ${mdtLanguage.Police}
     `:""} ${a.ambulance_required?`
    ${mdtLanguage.Ambulance}
     `:""} ${a.fire_required?`
    ${mdtLanguage.Fire}
     `:""} ${a.tow_required?`
    ${mdtLanguage.Tow}
    `:""}
    ${mdtLanguage.CallDescription}

    ${a.description}

    ${mdtLanguage.CallDetails}
    ${mdtLanguage.CallAddNotesButton} ${mdtLanguage.CallAddUnitsButton}
    • ${mdtLanguage.CallEmergencyType} ${a.emergency_type?mdtLanguage.CallEmergency:mdtLanguage.CallNonEmergency}
    • ${mdtLanguage.CallerPostal} ${a.postal}
    • ${mdtLanguage.CallerStreetName} ${a.street}
    • ${mdtLanguage.CallerAreaName} ${a.area}
    • ${mdtLanguage.ContactDetails}${a.contact_details}
    • ${mdtLanguage.CallUnits}
    `),Array.isArray(a.calltrackedby)&&(a.calltrackedby.length??0)>0&&$.each(a.calltrackedby,function(e,t){$("#call_trackers_"+a.id).append(" "+t)})})}function t(e){a(activePage=e),$("#active-calls-pagination").empty(),i()}function i(){$("#active-calls-pagination").empty();let a=Math.min(e,10),i=activePage,l=activePage+a-1;if(l>e&&(i=Math.max((l=e)-a+1,1)),activePage>1){let s=$(`
  • ${mdtLanguage.Previous}
  • `);s.on("click",function(){activePage>1&&t(activePage-1)}),$("#active-calls-pagination").append(s)}if(i>1){let n=$('
  • 1
  • ');if(n.on("click",function(){t(1)}),$("#active-calls-pagination").append(n),i>2){let r=$('
  • ...
  • ');$("#active-calls-pagination").append(r)}}for(let d=i;d<=l;d++){let o=d,c=$(`
  • ${o}
  • `);o===activePage&&c.addClass("active"),c.on("click",function(){t(o)}),$("#active-calls-pagination").append(c)}if(l...');$("#active-calls-pagination").append(p)}let m=$(`
  • ${e}
  • `);m.on("click",function(){t(e)}),$("#active-calls-pagination").append(m)}if(e>l){let u=$(`
  • ${mdtLanguage.Next}
  • `);u.on("click",function(){activePagea.id===e),t=shiftData.filter(e=>!0===e.userIsOnShift);$("#unit-designation-modal").remove();let i=` `;$("body").append(i),$("#unit-designation-body").append(`
    ${mdtLanguage.EmergencyCall} ${mdtLanguage.CallID}${a[0].id}

    ${new Date(a[0].call_time).toLocaleString(timeFormat,{timeZone:timeZone,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}

    ${a[0].street} ${a[0].area} ${a[0].postal}

    ${mdtLanguage.CallRequiredUnits}
    ${a[0].police_required?`
    ${mdtLanguage.Police}
     `:""} ${a[0].ambulance_required?`
    ${mdtLanguage.Ambulance}
     `:""} ${a[0].fire_required?`
    ${mdtLanguage.Fire}
     `:""} ${a[0].tow_required?`
    ${mdtLanguage.Tow}
    `:""}

    ${mdtLanguage.UnitsTrackingCall}

    ${Array.isArray(a[0].calltrackedby)&&(a[0].calltrackedby.length??0)!==0?a[0].calltrackedby.join(", "):mdtLanguage.None}


    ${mdtLanguage.CallDescription}

    ${a[0].description}

    `),$.each(t,function(e,a){$("#callsign-buttons").prepend(`
    `)}),$("#callsign-buttons").append(` + + `),$("#unit-designation-modal").modal("show")}function submitAssignments(e){let a=shiftData.filter(e=>!0===e.userIsOnShift),t=[];if($('input[type="checkbox"]:checked').each(function(){let e=this.getAttribute("id");if(!e){console.log("Checkbox missing ID attribute, this is the error: ",this);return}let i=e.replace("unitCheckbox_",""),l=a.find(e=>e.userCallsign===i);l&&t.push(l)}),t&&t.length>0){let i=callData.filter(a=>a.id===e);$("#unit-designation-modal").modal("hide"),$.post("https://night_shifts/assignUnitsToCall",JSON.stringify({calldata:i,selected_units:t}))}else{console.log("No units selected.");let l=$(` + `);$("#unit-designation-body").prepend(l),setTimeout(()=>{l.alert("close")},2500),$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.NoUnitsSelected}))}}function viewCallNotes(e){if(null===callNotesData)return;let a=[],t=[];$.each(callNotesData,function(a,i){if(i.call_id==e){let l=i.note_text,s=i.note_time,n=i.note_callsign;t.push({note_text:l,note_time:s,note_callsign:n})}}),$.each(callData,function(t,i){if(i.id==e){let l=i.callername,s=i.description,n=i.street,r=i.area,d=i.postal;a.push({caller_name:l,call_description:s,call_location:n,call_area:r,call_postal:d})}}),t.reverse(),$("#call-notes-modal").remove();let i=` `;$("body").append(i),document.getElementById("add-new-note").addEventListener("click",function(){$("#call-notes-modal").modal("hide");let a=document.getElementById("new-note-text").value.trim(),t=new Date().toLocaleString(timeFormat,{timeZone:timeZone}),i=t.slice(6,10)+"-"+t.slice(3,5)+"-"+t.slice(0,2)+" "+t.slice(11);$.post("https://night_shifts/addNewNoteToCall",JSON.stringify({call_id:e,note_text:a,note_time:i,note_callsign:personalData.userCallsign}))}),$("#call-notes-modal").modal("show")}function viewArchivedCallNotes(e){if(null===callNotesData)return;let a=[],t=[];$.each(callNotesData,function(a,i){if(i.call_id==e){let l=i.note_text,s=i.note_time,n=i.note_callsign;t.push({note_text:l,note_time:s,note_callsign:n})}}),$.each(callData,function(t,i){if(i.id==e){let l=i.callername,s=i.description,n=i.street,r=i.area,d=i.postal;a.push({caller_name:l,call_description:s,call_location:n,call_area:r,call_postal:d})}}),t.reverse(),$("#archived-call-notes-modal").remove();let i=` `;$("body").append(i),$("#archived-call-notes-modal").modal("show")}function AddArchivedCallPages(){let e=Math.ceil((callData.filter(e=>e.archived_call).length??0)/10);function a(e){let a=(e-1)*10,t=callData.filter(e=>e.archived_call),i=t.sort((e,a)=>a.id-e.id),l=i.slice(a,a+10);$("#acwrapper").empty(),$.each(l,function(e,a){$("#acwrapper").append(`
    ${a.emergency_type?mdtLanguage.EmergencyCall:mdtLanguage.NonEmergencyCall} ${mdtLanguage.CallID+a.id}

    ${mdtLanguage.EmergencyCallBy} ${a.callername}

    ${mdtLanguage.CallRequiredUnits}
    ${a.police_required?`
    ${mdtLanguage.Police}
     `:""} ${a.ambulance_required?`
    ${mdtLanguage.Ambulance}
     `:""} ${a.fire_required?`
    ${mdtLanguage.Fire}
     `:""} ${a.tow_required?`
    ${mdtLanguage.Tow}
    `:""}
    ${mdtLanguage.CallDescription}

    ${a.description}

    ${mdtLanguage.CallDetails}
    ${mdtLanguage.CallAddNotesButton}
    • ${mdtLanguage.CallEmergencyType} ${a.emergency_type?mdtLanguage.CallEmergency:mdtLanguage.CallNonEmergency}
    • ${mdtLanguage.CallerPostal} ${a.postal}
    • ${mdtLanguage.CallerStreetName} ${a.street}
    • ${mdtLanguage.CallerAreaName} ${a.area}
    • ${mdtLanguage.ContactDetails}${a.contact_details}
    • ${mdtLanguage.CallUnits}
    `),Array.isArray(a.calltrackedby)&&(a.calltrackedby.length??0)>0&&$.each(a.calltrackedby,function(e,t){$("#call_trackers_"+a.id).append(" "+t)})})}function t(e){a(activeArchivedPage=e),$("#archived-calls-pagination").empty(),i()}function i(){$("#archived-calls-pagination").empty();let a=Math.min(e,10),i=activeArchivedPage,l=activeArchivedPage+a-1;if(l>e&&(i=Math.max((l=e)-a+1,1)),activeArchivedPage>1){let s=$('
  • Previous
  • ');s.on("click",function(){activeArchivedPage>1&&t(activeArchivedPage-1)}),$("#archived-calls-pagination").append(s)}if(i>1){let n=$('
  • 1
  • ');n.on("click",function(){t(1)}),$("#archived-calls-pagination").append(n)}if(i>2){let r=$('
  • ...
  • ');$("#archived-calls-pagination").append(r)}for(let d=i;d<=l;d++){let o=d,c=$(`
  • ${o}
  • `);o===activeArchivedPage&&c.addClass("active"),c.on("click",function(){t(o)}),$("#archived-calls-pagination").append(c)}if(l...');$("#archived-calls-pagination").append(p)}let m=$(`
  • ${e}
  • `);m.on("click",function(){t(e)}),$("#archived-calls-pagination").append(m)}if(e>l){let u=$('
  • Next
  • ');u.on("click",function(){activeArchivedPagea[1]-e[1]);let t={labels:a.map(e=>e[0].replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())),datasets:[{label:mdtLanguage.Statistics,backgroundColor:mdtLanguage.barColor,borderColor:mdtLanguage.barBorderColor,borderWidth:1,data:a.map(e=>e[1])}]},i={scales:{y:{beginAtZero:!0,ticks:{color:mdtLanguage.AxesColor}},x:{ticks:{color:mdtLanguage.AxesColor}}},plugins:{legend:{labels:{color:mdtLanguage.AxesColor}},tooltip:{callbacks:{label:function(e){let a;return t.labels[e.dataIndex]+": "+e.parsed.y}}}}},l=document.getElementById("statistics-chart").getContext("2d");new Chart(l,{type:"bar",data:t,options:i})}function AddOperationsNavListener(){$("#add-operation-report").show(),$("#search-operation-report").hide(),$("#police-handbook").hide(),$("#training").hide(),BuildGuidelines(),$("a[data-target='#add-operation-report']").click(function(){$("#add-operation-report").show(),$("#search-operation-report-results").empty(),$("#search-operation-report").hide(),$("#police-handbook").hide(),$("#training").hide()}),$("a[data-target='#search-operation-report']").click(function(){$("#add-operation-report").hide(),$("#search-operation-report").show(),$("#police-handbook").hide(),$("#training").hide()}),$("a[data-target='#police-handbook']").click(function(){$("#add-operation-report").hide(),$("#search-operation-report-results").empty(),$("#search-operation-report").hide(),$("#police-handbook").show(),$("#training").hide()}),$("a[data-target='#training']").click(function(){$("#add-operation-report").hide(),$("#training-results").empty(),$("#search-operation-report").hide(),$("#police-handbook").hide(),$("#training").show();var e=$("");e.append($("").text(mdtLanguage.NameId).addClass("small")),e.append($("").text(mdtLanguage.Department).addClass("small")),e.append($("").text(mdtLanguage.SubDepartment).addClass("small")),$.each(trainings,function(a,t){e.append($("").text(t.TrainingName))}),e.append($("").text(mdtLanguage.EditButton));var a=$("").append(e);$("#training-results").append(a);var t=$("");$.each(shiftData,function(e,a){if(a.userIsOnShift){let i=a.userActiveDepartment-1,l=mdtData.DepartmentList[i].DepartmentShortName,s=a.userActiveSubDepartment-1,n=mdtData.DepartmentList[i].SubDepartments[s].SubDepartmentShortName;var r=$("");r.append($("").text(`${a.userRoleplayName} (${a.userServerId})`).addClass("small")),r.append($("").text(l).addClass("small")),r.append($("").text(n).addClass("small")),$.each(trainings,function(e,t){var i=$(""),l=!1;$.each(trainingData,function(t,i){a.user_fivem_id==i.user_fivem_id&&(l=JSON.stringify(i.completed_trainings).includes(e+1))});var s=$(l?'':'');i.append(s),r.append(i)});var d=$("").html(` + + `);r.append(d),d.find("button").on("click",function(){var e=$(this).data("user-fivem-id");updateTrainingData(e)}),t.append(r)}}),$("#training-results").append(t)})}function updateTrainingData(e){$("#updateTrainingModal").remove();let a=` `;$("body").append(a);var t=$("").append($(""));$.each(trainings,function(e,a){t.find("tr").append($("").text(a.TrainingName).addClass("text-light"))}),$("#updateTrainingTable").append(t);var i=$("");$.each(trainings,function(a,t){var l=$(""),s=!1;$.each(trainingData,function(t,i){e==i.user_fivem_id&&(s=JSON.stringify(i.completed_trainings).includes(a+1))});var n=$('').prop("checked",s);l.append(n),i.append(l)}),$("#updateTrainingTable tbody").append(i),$("#updateTrainingModal").modal("show"),$("#save-trainings-button").on("click",function(){var a=[];$('#updateTrainingTable input[type="checkbox"]:checked').each(function(){a.push($(this).closest("td").index())}),saveUpdatedTrainingData(e,a)})}function saveUpdatedTrainingData(e,a){$("#updateTrainingModal").modal("hide");let t=a.map(e=>e+1);$.post("https://night_shifts/updateTrainingData",JSON.stringify({user_fivem_id:e,completed_trainings:t}))}function sanitizeId(e){return e.replace(/[^a-z0-9]/gi,"-").toLowerCase()}function escapeHtml(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function BuildGuidelines(){let e=$("#police-handbook-results"),a="";$.each(policeHandbook,function(e,t){let i=sanitizeId(t.HandbookName);a+=` +
    +

    + +

    +
    +
    + `,$.each(t.ActOrLaws,function(t,l){let s=sanitizeId(l.ActOrLawName);a+=` +
    +

    + +

    +
    +
    + `,$.each(l.Sections,function(e,l){let n=sanitizeId(l.SectionName);a+=` +
    +

    + +

    +
    +
    + `,$.each(l.Articles,function(t,l){let r=sanitizeId(l.ArticleName);a+=` +
    +

    + +

    +
    +
    + ${escapeHtml(l.ArticleDescription)} +
    +
    +
    + `}),a+=` +
    +
    +
    + `}),a+=` +
    +
    +
    + `}),a+=` +
    +
    +
    + `}),e.html(a)}function AddOperationsResultsListener(){$("#search-operation-report-button").click(function(e){e.preventDefault();let a=$("#search-operation-report-input").val();OperationsDataSearchByQuery(a)}),$("#search-operation-report-button-2").click(function(e){e.preventDefault();let a=$("#search-operation-report-date-input").val();OperationsDataSearch(a)})}function OperationsDataSearchByQuery(e){let a=operationsData,t=!1;if($("#add-operation-report").hide(),$("#search-operation-report-results").empty(),(e.length??0)>=3){a.sort(function(e,a){return a.id-e.id});let i=[];a.forEach(function(a){Object.values(a).some(a=>"string"==typeof a?a.includes(e):"object"==typeof a?JSON.stringify(a).includes(e):String(a).includes(e))&&i.push(a)}),i.forEach(function(e){t=!0;let a="";"police"===e.report_type?a=`${mdtLanguage.Police}`:"medical"===e.report_type?a=`${mdtLanguage.Ambulance}`:"fire"===e.report_type&&(a=`${mdtLanguage.Fire}`);let i=`
    ${a} ${e.sub_report_type+" "+mdtLanguage.Report+" #"+e.id}

    ${mdtLanguage.Location+": "+e.location}

    ${e.description.slice(0,25)}${(e.description.length??0)>25?"...":""}

    ${mdtLanguage.SignedBy+" "+e.signature}

    ";$("#search-operation-report-results").append(i);let l=` `;$("body").append(l)}),t||($("#search-operation-report-results").empty(),$("#search-operation-report-results").append(``))}else $("#search-operation-report-results").empty(),$("#search-operation-report-results").append(``)}function OperationsDataSearch(e){let a=operationsData,t=new Date(e),i=!1;$("#add-operation-report").hide(),$("#search-operation-report-results").empty(),a.sort(function(e,a){let t=new Date(e.date),i=new Date(a.date);return i-t}),a.reverse(),$.each(a,function(e,a){let l=new Date(a.report_date);if(t.toDateString()===l.toDateString()){i=!0;let s="";"police"===a.report_type?s=`${mdtLanguage.Police}`:"medical"===a.report_type?s=`${mdtLanguage.Ambulance}`:"fire"===a.report_type&&(s=`${mdtLanguage.Fire}`);let n=`
    ${s} ${a.sub_report_type+" "+mdtLanguage.Report+" #"+a.id}

    ${mdtLanguage.Location+": "+a.location}

    ${a.description.slice(0,25)}${(a.description.length??0)>25?"...":""}

    ${mdtLanguage.SignedBy+" "+a.signature}

    ";$("#search-operation-report-results").append(n);let r=``;$("body").append(r)}}),i||($("#search-operation-report-results").empty(),$("#search-operation-report-results").append(``))}function AddFormTypeSelectListener(){let e=document.getElementById("operation-report-type"),a=document.getElementById("police-fields"),t=document.getElementById("fire-fields"),i=document.getElementById("medical-fields"),l=document.getElementById("operations-report-form-title");e.addEventListener("change",function(){let s=e.value,n=[a,t,i];n.forEach(e=>{if(e!==s+"-fields"){let a=e.querySelectorAll("input");a.forEach(e=>{e.required=!1});let t=e.querySelector("textarea");t.required=!1}});let r=document.getElementById(s+"-fields"),d=r.querySelectorAll("input");d.forEach(e=>{e.required=!0});let o=r.querySelector("textarea");o.required=!0,a.style.display="police"===s?"block":"none",t.style.display="fire"===s?"block":"none",i.style.display="medical"===s?"block":"none",s=s.charAt(0).toUpperCase()+s.slice(1),l.innerHTML=`

    ${s} ${mdtLanguage.Operations}

    `});let s=document.getElementById("operation-police-report-type"),n=document.getElementById("operation-medical-report-type"),r=document.getElementById("operation-fire-report-type");$.each(operationReports,function(e,a){let t="Police"===e?s:"Medical"===e?n:"Fire"===e?r:null;t&&$.each(a,function(e,a){$(t).append(``)})})}function SubmitOperationReport(){let e=document.getElementById("operation-report-type").value;if(""===e){console.log("Please select a report type.");return}let a={police:["operation-police-report-type","operation-report-police-officer","operation-report-police-civilian","operation-report-police-vehicle","operation-report-police-location","operation-report-police-description","operation-report-police-report-date","operation-report-police-signature"],fire:["operation-fire-report-type","operation-report-fire-firefighter","operation-report-fire-civilian","operation-report-fire-vehicle","operation-report-fire-location","operation-report-fire-description","operation-report-fire-report-date","operation-report-fire-signature"],medical:["operation-medical-report-type","operation-report-medical-paramedic","operation-report-medical-civilian","operation-report-medical-vehicle","operation-report-medical-location","operation-report-medical-description","operation-report-medical-report-date","operation-report-medical-signature"]},t=a[e].reduce((e,a)=>(e[a]=document.getElementById(a).value.replace(/[<>(){}[\]^&|+*;:]/g,""),a.endsWith("-report-date")&&(e[a]=document.getElementById(a).value),e),{}),i={police:{"operation-police-report-type":"Please select a report type.","operation-report-police-officer":"Please provide the name of the police officer(s).","operation-report-police-civilian":"Please provide the name of the civilian involved.","operation-report-police-vehicle":"Please provide the vehicle information.","operation-report-police-location":"Please provide the location of the incident.","operation-report-police-description":"Please provide a description of the incident.","operation-report-police-report-date":"Please provide the date of the report.","operation-report-police-signature":"Please provide your name."},fire:{"operation-fire-report-type":"Please select a report type.","operation-report-fire-firefighter":"Please provide the name of the firefighter(s).","operation-report-fire-civilian":"Please provide the name of the civilian involved.","operation-report-fire-vehicle":"Please provide the vehicle information.","operation-report-fire-location":"Please provide the location of the incident.","operation-report-fire-description":"Please provide a description of the incident.","operation-report-fire-report-date":"Please provide the date of the report.","operation-report-fire-signature":"Please provide your name."},medical:{"operation-medical-report-type":"Please select a report type.","operation-report-medical-paramedic":"Please provide the name of the (para)medic(s).","operation-report-medical-civilian":"Please provide the name of the civilian involved.","operation-report-medical-vehicle":"Please provide the vehicle information.","operation-report-medical-location":"Please provide the location of the incident.","operation-report-medical-description":"Please provide a description of the incident.","operation-report-medical-report-date":"Please provide the date of the report.","operation-report-medical-signature":"Please provide your name."}},l=a[e].filter(e=>!t[e]);if((l.length??0)>0){let s=l.map(a=>i[e][a]);console.log(s.join("\n"))}else $.post("https://night_shifts/submitOperationsForm",JSON.stringify({report_type:e,form_values:t}))}function CreateAlertMessage(e,a,t){var i="alert-info";"warning"===a?i="alert-warning":"danger"===a&&(i="alert-danger");var l=$("
    ",{class:"alert "+i,role:"alert",text:e});$(t).prepend(l)}function ResetMDTToHomePage(e,a,t){$.post("https://night_shifts/mdthome",JSON.stringify({requiredAccessLevel:t,accessLevel:a,menuName:e}))}function CheckUserAccessLevel(e,a){$.each(mdtData.MDTMenus,function(t,i){if(t==a)return!(e=10?$.post("https://night_shifts/sendDispatchMessage",JSON.stringify({messageinput:e})):($("#dispatchErrorAlerts").prepend(``),setTimeout(function(){$("#dispatch-warning-message").remove()},5e3))}function AddUnitOverviewListener(){$("#active-units").show(),$("a[data-target='#unit-overview']").click(function(){$("#active-units").show(),$("#backup-page").hide(),$("#fleet-management").hide()}),$("a[data-target='#backup-requests']").click(function(){$("#active-units").hide(),$("#backup-page").show(),$("#fleet-management").hide()}),$("a[data-target='#fleet-management']").click(function(){$("#active-units").hide(),$("#backup-page").hide(),$("#fleet-management").show()})}function AddUnitOverviewResultsListener(){$("#dispatch-message-button").click(function(e){e.preventDefault();let a=$("#dispatch-message-input").val();SendDispatchMessage(a)})}function AddUnitsToOverview(){let e=getCountByDepartment(shiftData,"police"),a=getCountByDepartment(shiftData,"ambulance"),t=getCountByDepartment(shiftData,"fire"),i=getCountByDepartment(shiftData,"tow"),l=getCivCount();$("#emergency_count, #emergency_count_backup").append(`

    ${e}

     

    ${a}

     

    ${t}

     

    ${i}

     

    ${l}

    `),shiftData.sort(function(e,a){return e.userServerId-a.userServerId}),$.each(shiftData,function(e,a){if(!0===a.userIsOnShift){let t="",i=a.userActiveDepartment-1;t=mdtData.DepartmentList[i].DepartmentShortName;let l="",s=a.userActiveSubDepartment-1;l=mdtData.DepartmentList[i].SubDepartments[s].SubDepartmentShortName;let n=mdtData.DepartmentList[i].DepartmentType,r="btn-primary",d="text-primary";"police"===n?(r="btn-primary",d="text-primary"):"ambulance"===n?(r="btn-warning",d="text-warning"):"fire"===n?(r="btn-danger",d="text-danger"):"tow"===n&&(r="btn-info",d="text-info");let o="";-1===a.userCurrentVehicleClass?o=``:[0,1,2,3,4,5,6,7,9].includes(a.userCurrentVehicleClass)?o=``:[18].includes(a.userCurrentVehicleClass)?o=``:[8].includes(a.userCurrentVehicleClass)?o=``:[13].includes(a.userCurrentVehicleClass)?o=``:[14].includes(a.userCurrentVehicleClass)?o=``:[15].includes(a.userCurrentVehicleClass)?o=``:[16].includes(a.userCurrentVehicleClass)?o=``:[19].includes(a.userCurrentVehicleClass)&&(o=``);let c="6c757d";$.each(statuscodes,function(e,t){if(t.StatusCode===a.userStatusCode.toString())return c=t.StatusColor}),$("#active-units-results").append($("").html(` ${a.userRoleplayName} (${a.userServerId}) ${a.userCallsign} ${a.userAttachedFleetVehicleCallsignRoofcode} ${o} ${a.userHasSirensOn?` ${mdtLanguage.SirensOn}`:` ${mdtLanguage.SirensOff}`} ${t} ${l} ${a.userRank} ${a.userCurrentStreetName} ${a.userCurrentPostal} ${0===a.userAttachedToCallID?mdtLanguage.None:a.userAttachedToCallID} ${a.userStatusCode} `)).find("tr:last").each(function(){let e=$(this),t=a;e.find(".statusbutton").on("click",()=>initiateAssignNewStatus(encodeURIComponent(JSON.stringify(t)))),e.find(".beep-action").on("click",()=>initiateSendBeep(t.userServerId,t.userCallsign)),e.find(".track-action").on("click",()=>initiateTrackPlayer(t.userServerId,t.userCallsign)),e.find(".call-action").on("click",()=>initiateCallDesignation(encodeURIComponent(JSON.stringify(t)))),e.find(".status-action").on("click",()=>initiateAssignNewStatus(encodeURIComponent(JSON.stringify(t)))),e.find(".callsign-action").on("click",()=>initiateAssignNewCallsign(encodeURIComponent(JSON.stringify(t)))),e.find(".fleet-action").on("click",()=>initiateAssignNewFleetVehicle(encodeURIComponent(JSON.stringify(t))))})}})}function initiateSendBeep(e,a){$.post("https://night_shifts/sendBeepToPlayer",JSON.stringify({userServerId:e,callsign:a}))}function initiateAssignNewCallsign(e){let a=JSON.parse(decodeURIComponent(e));$("#callsign-designation-modal").remove();let t=` `;$("body").append(t),$("#callsign-designation-modal").modal("show"),$("#assign-callsign-button").on("click",function(){let e=$("#new-assigned-callsign-input").val().trim(),t=$("#callsign-assign-error-container");if(!/^[A-Za-z0-9-]+$/.test(e)||e==mdtLanguage.System){t.text(mdtLanguage.CallsignErrorMessage1);return}t.text(""),$.post("https://night_shifts/assignNewCallsign",JSON.stringify({user_data:a,callsign:e})),$("#callsign-designation-modal").modal("hide"),$("#assign-callsign-button").off("click")})}function initiateAssignNewFleetVehicle(e){let a=JSON.parse(decodeURIComponent(e));$("#fleet-vehicle-designation-modal").remove();let t=` `;$("body").append(t),$(".detach-fleet-button").on("click",function(){DetachUnitFromAnyFleetVehicles(encodeURIComponent(JSON.stringify(a)))}),$.each(mdtData.DepartmentList,(e,a)=>{"civilian"!=a.DepartmentType&&$("#fleet-vehicle-selection-dropdown").append($(`
  • ${a.DepartmentName}
  • `))}),$("#fleet-vehicle-selection-dropdown .dropdown-item").on("click",function(){let e=$(this).data("department"),a=$(this).data("departmentname");$("#fleet-selection-card-section").empty(),$("#fleet-selection-card-section").append(`

    ${a}

    `);let t=fleetData.filter(a=>a.department_index===e);t.sort((e,a)=>e.id-a.id),(t.length??0)===0&&$("#fleet-selection-card-section").append(`
    ${mdtLanguage.NoVehiclesInThisFleet}
    `),t.forEach(e=>{let a=`
    ${e.vehicleName}
    ${e.vehicle_name}

    # ${e.id}

    ${mdtLanguage.FleetCardVehicleModel}: ${e.vehicle_model}
    ${mdtLanguage.SubDepartment}: ${mdtData.DepartmentList[e.department_index-1].SubDepartments[e.sub_department_index-1].SubDepartmentName}
    ${mdtLanguage.FleetCardRoofCodeCallsign}: ${e.roof_code_callsign}
    ${mdtLanguage.LicensePlate}: ${e.vehicle_plate}
    ${mdtLanguage.FleetCardVehicleInService}: ${e.in_service?mdtLanguage.Yes:mdtLanguage.No}
    ${mdtLanguage.FleetCardVehicleAttachedUnits}: ${e.attached_units?e.attached_units:mdtLanguage.None}

    `;$("#fleet-selection-card-section").append(a)})}),$("#fleet-selection-card-section").on("click",".attach-fleet-button",function(){let e=$(this).data("fleet-id");AttachFleetVehicleToUnit(e,encodeURIComponent(JSON.stringify(a)))}),$("#fleet-vehicle-selection-dropdown .dropdown-item").eq(1).trigger("click"),$("#fleet-vehicle-designation-modal").modal("show")}function DetachUnitFromAnyFleetVehicles(e){$("#fleet-vehicle-designation-modal").modal("hide");let a=JSON.parse(decodeURIComponent(e));$.post("https://night_shifts/detachUnitFromAnyFleetVehicles",JSON.stringify({userData:a}))}function AttachFleetVehicleToUnit(e,a){$("#fleet-vehicle-designation-modal").modal("hide");let t=JSON.parse(decodeURIComponent(a)),i=fleetData.filter(a=>a.id===e);if((i.length??0)===0)return;let l=i[0];$.post("https://night_shifts/assignedNewFleetVehicle",JSON.stringify({userData:t,fleetCardData:l}))}function initiateAssignNewStatus(e){let a=JSON.parse(decodeURIComponent(e));$("#status-designation-modal").remove();let t=` `;$("body").append(t),$.each(statuscodes,function(e,t){$("#spanel2").append(`
    ${t.StatusCode}
    `),!1===personalData.userIsOnShift?document.getElementById("statusbutton_"+e).style.cursor="not-allowed":(document.getElementById("statusbutton_"+e).style.cursor="pointer",document.getElementById("statusbutton_"+e).addEventListener("click",function(){$("#status-designation-modal").modal("hide"),$.post("https://night_shifts/assignedNewStatus",JSON.stringify({userServerId:a.userServerId,StatusIndex:e,StatusCode:t.StatusCode,StatusName:t.StatusName}))}))}),$("#status-designation-modal").modal("show")}function initiateCallDesignation(e){let a=JSON.parse(decodeURIComponent(e));$("#call-designation-modal").remove();let t=` `;$("body").append(t),callData.sort(function(e,a){return a.id-e.id});let i=!1;$.each(callData,function(e,t){!1===t.archived_call&&(i=!0,$("#call-designation-body").append(`
    ${mdtLanguage.EmergencyCall} ${mdtLanguage.CallID}${t.id}

    ${new Date(t.call_time).toLocaleString(timeFormat,{timeZone:timeZone,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}

    ${t.street} ${t.area} ${t.postal}

    ${mdtLanguage.CallRequiredUnits}
    ${t.police_required?`
    ${mdtLanguage.Police}
     `:""} ${t.ambulance_required?`
    ${mdtLanguage.Ambulance}
     `:""} ${t.fire_required?`
    ${mdtLanguage.Fire}
     `:""} ${t.tow_required?`
    ${mdtLanguage.Tow}
    `:""}

    ${mdtLanguage.UnitsTrackingCall}

    ${0!==Object.keys(t.calltrackedby).length?t.calltrackedby:mdtLanguage.None}


    ${mdtLanguage.CallDescription}

    ${t.description}

    `).find(".col-md-4:last").each(function(){let e=$(this),i=t,l=a;e.find(".assign-call-action").on("click",()=>AssignUnitToCall(encodeURIComponent(JSON.stringify(i)),encodeURIComponent(JSON.stringify(l))))}))}),i||$("#call-designation-body").append(` + + `),$("#call-designation-modal").modal("show")}function AssignUnitToCall(e,a){let t=JSON.parse(decodeURIComponent(a)),i=JSON.parse(decodeURIComponent(e));$("#call-designation-modal").modal("hide"),$("#call-designate-btn").off("click"),$.post("https://night_shifts/assignUnitToCall",JSON.stringify({userdata:t,calldata:i}))}function initiateTrackPlayer(e,a){$.post("https://night_shifts/trackPlayer",JSON.stringify({userServerId:e,userCallsign:a}))}function AddBackupArea(){$("#request-backup-area").append(`
    ${mdtLanguage.Police}

    ${mdtLanguage.RequestBackupFromPolice}

    ${mdtLanguage.Ambulance}

    ${mdtLanguage.RequestBackupFromAmbulance}

    ${mdtLanguage.Fire}

    ${mdtLanguage.RequestBackupFromFire}

    ${mdtLanguage.Tow}

    ${mdtLanguage.RequestBackupFromTow}

    `),document.querySelectorAll(".request-backup").forEach(e=>{e.addEventListener("click",()=>{let a=e.dataset.department;$.post("https://night_shifts/requestBackup",JSON.stringify({departmentRequested:a}))})})}function AddPNCListener(){$("#person-search").show(),$("a[data-target='#person-search']").click(function(){$("#person-search").show(),$("#vehicle-search").hide(),$("#record-search").hide(),$("#property-search").hide(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#person-search-results").empty(),$("#vehicle-search-results").empty(),$("#record-search-results").empty(),$("#property-search-results").empty(),$("#fine-search-results").empty(),$("#wanted-person-results").empty(),$("#anpr-results").empty()}),$("a[data-target='#vehicle-search']").click(function(){$("#person-search").hide(),$("#vehicle-search").show(),$("#property-search").hide(),$("#record-search").hide(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#person-search-results").empty(),$("#vehicle-search-results").empty(),$("#record-search-results").empty(),$("#property-search-results").empty(),$("#fine-search-results").empty(),$("#wanted-person-results").empty(),$("#anpr-results").empty()}),$("a[data-target='#property-search']").click(function(){$("#person-search").hide(),$("#vehicle-search").hide(),$("#property-search").show(),$("#record-search").hide(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#person-search-results").empty(),$("#vehicle-search-results").empty(),$("#record-search-results").empty(),$("#property-search-results").empty(),$("#fine-search-results").empty(),$("#wanted-person-results").empty(),$("#anpr-results").empty()}),$("a[data-target='#record-search']").click(function(){$("#person-search").hide(),$("#vehicle-search").hide(),$("#property-search").hide(),$("#record-search").show(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#person-search-results").empty(),$("#vehicle-search-results").empty(),$("#record-search-results").empty(),$("#property-search-results").empty(),$("#fine-search-results").empty(),$("#wanted-person-results").empty(),$("#anpr-results").empty()}),$("a[data-target='#fine-search']").click(function(){$("#person-search").hide(),$("#vehicle-search").hide(),$("#property-search").hide(),$("#record-search").hide(),$("#fine-search").show(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#person-search-results").empty(),$("#vehicle-search-results").empty(),$("#record-search-results").empty(),$("#property-search-results").empty(),$("#fine-search-results").empty(),$("#wanted-person-results").empty(),$("#anpr-results").empty()}),$("a[data-target='#wanted-person']").click(function(){$("#person-search").hide(),$("#vehicle-search").hide(),$("#property-search").hide(),$("#record-search").hide(),$("#fine-search").hide(),$("#wanted-person").show(),$("#anpr-section").hide(),$("#person-search-results").empty(),$("#vehicle-search-results").empty(),$("#record-search-results").empty(),$("#property-search-results").empty(),$("#fine-search-results").empty(),$("#wanted-person-results").empty(),$("#anpr-results").empty(),AddPNCWantedPersons()}),$("a[data-target='#anpr-section']").click(function(){$("#person-search").hide(),$("#vehicle-search").hide(),$("#property-search").hide(),$("#record-search").hide(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").show(),$("#person-search-results").empty(),$("#vehicle-search-results").empty(),$("#record-search-results").empty(),$("#property-search-results").empty(),$("#fine-search-results").empty(),$("#wanted-person-results").empty(),$("#anpr-results").empty(),AddPNCBoloVehicles()})}function AddPNCBoloVehicles(){showLoading(),setTimeout(function(){let e=allVehicleData,a=allCivilianData,t=!1;for(let i of($("#anpr-results").html(""),$.each(e,function(e,i){(!0===i.stolen||!1===i.insurance||!1===i.mot||!1===i.tax||!0===i.bolo)&&$.each(a,function(e,a){i.civ_id==a.id&&(t=!0,$("#anpr-results").append(`
    ${i.license_plate} (${mdtLanguage.VehicleRegisterId+" #"+i.id})
    • ${mdtLanguage.RegisteredToCitizenId}: `+i.civ_id+"
    • "+`
    • ${mdtLanguage.CitizenName}: `+a.first_name+" "+a.last_name+`
    • ${mdtLanguage.Make}: `+i.make+`
    • ${mdtLanguage.Model}: `+i.model+`
    • ${mdtLanguage.Color}: `+i.color+`
    • ${mdtLanguage.BuildYear}: `+i.build_year+`
    • ${mdtLanguage.TaxPaid} `+(i.tax?'':'')+"
    • "+`
    • ${mdtLanguage.MoT} `+(i.mot?'':'')+"
    • "+`
    • ${mdtLanguage.Insurance} `+(i.insurance?'':'')+"
    • "+`
    • ${mdtLanguage.ReportedStolen} `+(i.stolen?'':'')+"
    • "+`
    • ${mdtLanguage.PNCBolo} ${i.bolo?'':''}
    • `+`
    • ${mdtLanguage.PNCBoloDescription} ${i.bolo_description}
    • `+'
    "))})}),npcVehicleData))if(!0===i.stolen||!1===i.insurance||!1===i.mot||!1===i.tax||!0===i.bolo){let l=i.owner_name;t=!0,$("#anpr-results").append(`
    ${i.license_plate} (${mdtLanguage.VehicleRegisterId+" #"+i.id})
    • ${mdtLanguage.RegisteredToCitizenId}: `+i.civ_id+"
    • "+`
    • ${mdtLanguage.CitizenName}: ${l}
    • `+`
    • ${mdtLanguage.Make}: `+i.make+"
    • "+`
    • ${mdtLanguage.Model}: `+i.model+"
    • "+`
    • ${mdtLanguage.Color}: `+i.color+"
    • "+`
    • ${mdtLanguage.BuildYear}: `+i.build_year+"
    • "+`
    • ${mdtLanguage.TaxPaid} `+(i.tax?'':'')+"
    • "+`
    • ${mdtLanguage.MoT} `+(i.mot?'':'')+"
    • "+`
    • ${mdtLanguage.Insurance} `+(i.insurance?'':'')+"
    • "+`
    • ${mdtLanguage.ReportedStolen} `+(i.stolen?'':'')+"
    • "+`
    • ${mdtLanguage.PNCBolo} ${i.bolo?'':''}
    • `+`
    • ${mdtLanguage.PNCBoloDescription} ${i.bolo_description}
    • `+'
    `)}t||$("#anpr-results").append(``),hideLoading()},SpinnerLoadingTimeInMs)}function ReportVehicleSighting(e,a){let t=JSON.parse(decodeURIComponent(e)),i=JSON.parse(decodeURIComponent(a));$.post("https://night_shifts/reportVehicleSighting",JSON.stringify({vehicleOwnerDetails:t,vehicleDetails:i}))}function AddPNCWantedPersons(){showLoading(),setTimeout(function(){let e=markerData,a=allCivilianData,t=!1;for(let i of($("#wanted-person-results").html(""),$.each(a,function(a,i){$.each(e,function(e,a){if(a.civ_id==i.id&&(!0===a.wanted_person||!0===a.active_warrant)){var l=i.first_name+" "+i.last_name;t=!0,$("#wanted-person-results").append(`
    ${l} (${mdtLanguage.CitizenId+" #"+i.id})

    ${a.flag_description}

    ${new Date(a.date_created).toLocaleString(timeFormat,{timeZone:timeZone})}

    `)}})}),npcCivilianData)){let l=i.id,s=JSON.parse(i.personal_data),n=s.FlagsOrMarkers;if(n.active_warrant||n.wanted_person){let r=`${s.FirstName} ${s.LastName}`;t=!0,$("#wanted-person-results").append(`
    ${r} (${mdtLanguage.CitizenId+" #"+l})

    ${n.flag_description}

    ${new Date().toLocaleString(timeFormat,{timeZone:timeZone})}

    `)}}t||$("#wanted-person-results").append(``),hideLoading()},SpinnerLoadingTimeInMs)}function ReportSighting(e,a){let t=JSON.parse(decodeURIComponent(e)),i=JSON.parse(decodeURIComponent(a));$.post("https://night_shifts/reportSighting",JSON.stringify({personDetails:t,markerDetails:i}))}function PNCPersonSearch(e){showLoading(),setTimeout(function(){let a=[];for(let t of markerData)t.civ_id.toString()==e&&(a=t);$("#person-search").show(),$("#vehicle-search").hide(),$("#property-search").hide(),$("#record-search").hide(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#person-search-results").empty(),"number"==typeof e&&(e=e.toString());let i=!1,l=[];if((e.length??0)>=1){let s=e.split(" "),n=s.map(e=>`(${e})`).join("|"),r=RegExp(n,"i");for(let d of allCivilianData)(r.test(d.first_name)||r.test(d.last_name)||d.id.toString()==e)&&(a=markerData.find(e=>e.civ_id===d.id)||{},l.includes(d.id)||(l.push(d.id),i=!0,$("#person-search-results").append(`
    ${d.profile_picture_url?
    ${d.first_name} ${d.last_name}

    ${mdtLanguage.BornOn}${new Date(d.dob).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}.

    ${mdtLanguage.Markers}

    ${mdtLanguage.MarkersSubTitle}

    ${a.armed_and_dangerous?` ${mdtLanguage.ArmedAndDangerous}
    `:""} ${a.assault?` ${mdtLanguage.Assault}
    `:""} ${a.burglary?` ${mdtLanguage.Burglary}
    `:""} ${a.drug_related?` ${mdtLanguage.DrugRelated}
    `:""} ${a.gang_affiliation?` ${mdtLanguage.GangAffiliation}
    `:""} ${a.homicide?` ${mdtLanguage.Homicide}
    `:""} ${a.kidnapping?` ${mdtLanguage.Kidnapping}
    `:""} ${a.mental_health_issues?` ${mdtLanguage.MentalHealth}
    `:""} ${a.sex_offense?` ${mdtLanguage.SexOffense}
    `:""} ${a.terrorism?` ${mdtLanguage.Terrorism}
    `:""} ${a.theft?` ${mdtLanguage.Theft}
    `:""} ${a.traffic_violation?` ${mdtLanguage.TrafficViolation}
    `:""} ${a.wanted_person?` ${mdtLanguage.WantedPerson}
    `:""} ${a.other?` ${mdtLanguage.OtherMarker}
    `:""} ${a.active_warrant?` ${mdtLanguage.ActiveWarrant}
    `:""}

    • ${mdtLanguage.CitizenId}: ${d.id}
    • ${mdtLanguage.Gender}: ${d.gender}
    • ${mdtLanguage.Email}: ${d.email}
    • ${mdtLanguage.PhoneNumber}: ${d.phone_number}
    • ${mdtLanguage.Address}: ${d.address_line_1}
    • ${mdtLanguage.AddressType}: ${d.address_line_2}
    • ${mdtLanguage.City}: ${d.city}
    • ${mdtLanguage.State}: ${d.state}
    • ${mdtLanguage.PostalCode}: ${d.postal_code}
    • ${mdtLanguage.Country}: ${d.country}
    • ${mdtLanguage.Occupation}: ${d.occupation}
    • ${mdtLanguage.Nationality}: ${d.nationality}
    • ${mdtLanguage.CarLicense}: ${d.license_car?'':''}
    • ${mdtLanguage.BikeLicense}: ${d.license_bike?'':''}
    • ${mdtLanguage.TruckLicense}: ${d.license_truck?'':''}
    • ${mdtLanguage.BoatLicense}: ${d.license_boat?'':''}
    • ${mdtLanguage.PilotLicense}: ${d.license_pilot?'':''}
    `)));for(let o of npcCivilianData){let c=o.id,p=JSON.parse(o.personal_data);if((r.test(p.FirstName)||r.test(p.LastName)||c.toString()==e)&&!l.includes(c)){l.push(c),i=!0;let m={armed_and_dangerous:p.FlagsOrMarkers.armed_and_dangerous||!1,assault:p.FlagsOrMarkers.assault||!1,burglary:p.FlagsOrMarkers.burglary||!1,drug_related:p.FlagsOrMarkers.drug_related||!1,gang_affiliation:p.FlagsOrMarkers.gang_affiliation||!1,homicide:p.FlagsOrMarkers.homicide||!1,kidnapping:p.FlagsOrMarkers.kidnapping||!1,mental_health_issues:p.FlagsOrMarkers.mental_health_issues||!1,sex_offense:p.FlagsOrMarkers.sex_offense||!1,terrorism:p.FlagsOrMarkers.terrorism||!1,theft:p.FlagsOrMarkers.theft||!1,traffic_violation:p.FlagsOrMarkers.traffic_violation||!1,wanted_person:p.FlagsOrMarkers.wanted_person||!1,other:p.FlagsOrMarkers.other||!1,active_warrant:p.FlagsOrMarkers.active_warrant||!1};$("#person-search-results").append(`
    Photo
    ${p.FirstName} ${p.LastName}

    ${mdtLanguage.BornOn}${p.DOB}.

    ${mdtLanguage.Markers}

    ${mdtLanguage.MarkersSubTitle}

    ${m.armed_and_dangerous?` ${mdtLanguage.ArmedAndDangerous}
    `:""} ${m.assault?` ${mdtLanguage.Assault}
    `:""} ${m.burglary?` ${mdtLanguage.Burglary}
    `:""} ${m.drug_related?` ${mdtLanguage.DrugRelated}
    `:""} ${m.gang_affiliation?` ${mdtLanguage.GangAffiliation}
    `:""} ${m.homicide?` ${mdtLanguage.Homicide}
    `:""} ${m.kidnapping?` ${mdtLanguage.Kidnapping}
    `:""} ${m.mental_health_issues?` ${mdtLanguage.MentalHealth}
    `:""} ${m.sex_offense?` ${mdtLanguage.SexOffense}
    `:""} ${m.terrorism?` ${mdtLanguage.Terrorism}
    `:""} ${m.theft?` ${mdtLanguage.Theft}
    `:""} ${m.traffic_violation?` ${mdtLanguage.TrafficViolation}
    `:""} ${m.wanted_person?` ${mdtLanguage.WantedPerson}
    `:""} ${m.other?` ${mdtLanguage.OtherMarker}
    `:""} ${m.active_warrant?` ${mdtLanguage.ActiveWarrant}
    `:""}

    • ${mdtLanguage.CitizenId}: ${c}
    • ${mdtLanguage.Gender}: ${p.Gender}
    • ${mdtLanguage.Email}: ${p.Email}
    • ${mdtLanguage.PhoneNumber}: ${p.PhoneNumber}
    • ${mdtLanguage.Address}: ${p.Address}
    • ${mdtLanguage.AddressType}: ${p.AddressType}
    • ${mdtLanguage.City}: ${p.City}
    • ${mdtLanguage.State}: ${p.State}
    • ${mdtLanguage.PostalCode}: ${p.PostalCode}
    • ${mdtLanguage.Country}: ${p.Country}
    • ${mdtLanguage.Nationality}: ${p.Nationality}
    • ${mdtLanguage.CarLicense}: ${!0===p.License_Car_Is_Valid?'':''}
    • ${mdtLanguage.BikeLicense}: ${!0===p.License_Bike_Is_Valid?'':''}
    • ${mdtLanguage.TruckLicense}: ${!0===p.License_Truck_Is_Valid?'':''}
    • ${mdtLanguage.BoatLicense}: ${!0===p.License_Boat_Is_Valid?'':''}
    • ${mdtLanguage.PilotLicense}: ${!0===p.License_Pilot_Is_Valid?'':''}
    `)}}i||($("#person-search-results").empty(),$("#person-search-results").append(``))}else $("#person-search-results").empty(),$("#person-search-results").append(``);hideLoading()},SpinnerLoadingTimeInMs)}function PNCAddNPCRecord(e){let a=npcCivilianData.filter(a=>a.id===e);if($("#add-npc-record-modal").remove(),a.length>0){let t=JSON.parse(a[0].personal_data),i=` `;$("body").append(i),$("#add-npc-record-button").on("click",function(){let a=$("#charge-npc").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),t=$("#description-npc").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),i=$("#victims-npc").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),l=$("#location-npc").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),s=$("#officer-npc").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),n=$("#sentence-npc").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),r=$("#prosecuted-npc").is(":checked"),d=formatAndValidateDate($("#report_date-npc").val());""==a||""==t||""==i||""==l||""==s||""==n||""==d?$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.OneOrMoreFieldsHaveNotBeenFilled})):($.post("https://night_shifts/addNPCPoliceRecord",JSON.stringify({charge:a,description:t,victims:i,location:l,officer:s,sentence:n,prosecuted:r,report_date:d,civ_id:e})),$("#add-npc-record-modal").modal("hide"),$("#add-npc-record-button").off("click"))}),$("#add-npc-record-modal").modal("show")}}function PNCAddRecord(e){let a=allCivilianData.filter(a=>a.id===e);$("#add-record-modal").remove();let t=` `;$("body").append(t),$("#add-record-button").on("click",function(){let a=$("#charge").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),t=$("#description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),i=$("#victims").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),l=$("#location").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),s=$("#officer").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),n=$("#sentence").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),r=$("#prosecuted").is(":checked"),d=new Date($("#report_date").val()).toISOString().slice(0,19).replace("T"," ");""==a||""==t||""==i||""==l||""==s||""==n||""==d?$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.OneOrMoreFieldsHaveNotBeenFilled})):($.post("https://night_shifts/addPoliceRecord",JSON.stringify({charge:a,description:t,victims:i,location:l,officer:s,sentence:n,prosecuted:r,report_date:d,civ_id:e})),$("#add-record-modal").modal("hide"),$("#add-record-button").off("click"))}),$("#add-record-modal").modal("show")}function PNCAddNPCFine(e){let a=npcCivilianData.filter(a=>a.id===e),t=JSON.parse(a[0].personal_data),i=t.FirstName+" "+t.LastName;$("#add-npc-fine-modal").remove();let l=` `;$("body").append(l),$("#add-npc-fine-button").on("click",function(){let a=$("#npc-due_date").val(),t=$("#npc-fine_date").val(),i=$("#npc-fine_type").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),l=$("#npc-fine_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),s=$("#npc-fine_amount").val(),n=$("#npc-fine_location").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),r=$("#npc-issuing_officer").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),d=formatAndValidateDueDate(a),o=$("#npc-paid").is(":checked"),c=formatAndValidateDate(t);""==i||""==l||""==s||""==n||""==r||""==d||""==c?$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.OneOrMoreFieldsHaveNotBeenFilled})):($.post("https://night_shifts/addNPCPoliceFine",JSON.stringify({fine_type:i,fine_description:l,fine_amount:s,fine_location:n,issuing_officer:r,due_date:d,paid:o,fine_date:c,civ_id:e})),$("#add-npc-fine-modal").modal("hide"),$("#add-npc-fine-button").off("click"))}),$("#add-npc-fine-modal").modal("show")}function getDefaultDueDate(){let e=new Date;return e.setDate(e.getDate()+30),e.toISOString().slice(0,16)}function formatAndValidateDueDate(e){let a=new Date,t=new Date(a);t.setDate(a.getDate()+30);let i=t.toISOString().slice(0,19).replace("T"," ");if(!e||""===e)return console.log("Empty input date, using default:",i),i;try{let l=new Date(e);if(isNaN(l.getTime()))return console.log("Invalid date format, using default:",i),i;if(2e3>l.getFullYear()||l.getFullYear()>2100)return console.log("Invalid year, using default:",i),i;if(la?a.toISOString().slice(0,19).replace("T"," "):t.toISOString().slice(0,19).replace("T"," ")}function PNCAddFine(e){let a=allCivilianData.filter(a=>a.id===e);$("#add-fine-modal").remove();let t=` `;$("body").append(t),$("#add-fine-button").on("click",function(){let a=$("#due_date").val(),t=$("#fine_date").val(),i=$("#fine_type").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),l=$("#fine_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),s=$("#fine_amount").val(),n=$("#fine_location").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),r=$("#issuing_officer").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),d=formatAndValidateDueDate(a),o=$("#paid").is(":checked"),c=formatAndValidateDate(t);""==i||""==l||""==s||""==n||""==r||""==d||""==c?$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.OneOrMoreFieldsHaveNotBeenFilled})):($.post("https://night_shifts/addPoliceFine",JSON.stringify({fine_type:i,fine_description:l,fine_amount:s,fine_location:n,issuing_officer:r,due_date:d,paid:o,fine_date:c,civ_id:e})),$("#add-fine-modal").modal("hide"),$("#add-fine-button").off("click"))}),$("#add-fine-modal").modal("show")}function PNCRecordSearch(e){showLoading(),setTimeout(function(){$("#person-search").hide(),$("#vehicle-search").hide(),$("#property-search").hide(),$("#record-search").show(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#record-search-results").empty();let a=!1;"number"==typeof e&&(e=e.toString());let t=[];if((e.length??0)>=1){for(let i of policeRecordData)if(Number(i.civ_id)===Number(e)&&void 0!==i.description&&null!==i.description&&!t.includes(i.report_date)){a=!0;let l=allCivilianData.filter(a=>a.id===Number(e)),s=l[0].first_name+" "+l[0].last_name,n=`
    ${i.charge} | ${s}

    Record created on ${new Date(i.report_date).toLocaleString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}

    • ${mdtLanguage.GeneratedForCitizenId}: ${i.civ_id}
    • ${mdtLanguage.Description}: ${i.description}
    • ${mdtLanguage.Victims}: ${i.victims}
    • ${mdtLanguage.Location}: ${i.location}
    • ${mdtLanguage.OfficerDetails}: ${i.officer}
    • ${mdtLanguage.Sentence}: ${i.sentence}
    • ${mdtLanguage.Prosecuted2}? ${i.prosecuted?'':''}
    `;$("#record-search-results").append(n),t.push(i.report_date)}for(let r of npcRecordData)if(Number(r.civ_id)===Number(e)&&void 0!==r.description&&null!==r.description&&!t.includes(r.report_date)){a=!0;let d=npcCivilianData.filter(a=>a.id===Number(e)),o=JSON.parse(d[0].personal_data),c=o.FirstName+" "+o.LastName,p=`
    ${r.charge} | ${c}

    Record created on ${new Date(r.report_date).toLocaleString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}

    • ${mdtLanguage.GeneratedForCitizenId}: ${r.civ_id}
    • ${mdtLanguage.Description}: ${r.description}
    • ${mdtLanguage.Victims}: ${r.victims}
    • ${mdtLanguage.Location}: ${r.location}
    • ${mdtLanguage.OfficerDetails}: ${r.officer}
    • ${mdtLanguage.Sentence}: ${r.sentence}
    • ${mdtLanguage.Prosecuted2}? ${r.prosecuted?'':''}
    `;$("#record-search-results").append(p),t.push(r.report_date)}a||($("#record-search-results").empty(),$("#record-search-results").append(``))}else $("#record-search-results").empty(),$("#record-search-results").append(``);hideLoading()},SpinnerLoadingTimeInMs)}function PNCVehicleSearch(e,a){showLoading(),setTimeout(function(){let t=!1;$("#person-search").hide(),$("#vehicle-search").show(),$("#property-search").hide(),$("#record-search").hide(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#vehicle-search-results").empty(),"number"==typeof e&&(e=e.toString());let i=[];if(!0===a){for(let l of allVehicleData)if(Number(l.civ_id)===Number(e)&&void 0!==l.license_plate&&null!==l.license_plate&&!i.includes(l.license_plate)){t=!0;let s=allCivilianData.filter(a=>a.id===Number(e)),n=`
    ${l.profile_picture_url?
    ${l.license_plate}
    ${l.stolen||l.bolo?'':""}

    ${mdtLanguage.RegisteredOn} ${new Date(l.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.RegisteredToCitizenId}: ${l.civ_id}
    • ${mdtLanguage.CitizenName}: ${s[0].first_name} ${s[0].last_name}
    • ${mdtLanguage.Make}: ${l.make}
    • ${mdtLanguage.Model}: ${l.model}
    • ${mdtLanguage.Color}: ${l.color}
    • ${mdtLanguage.BuildYear}: ${l.build_year}
    • ${mdtLanguage.TaxPaid} ${l.tax?'':''}
    • ${mdtLanguage.MoT} ${l.mot?'':''}
    • ${mdtLanguage.Insurance} ${l.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${l.stolen?'':''}
    • ${mdtLanguage.PNCBolo} ${l.bolo?'':''}
    • ${mdtLanguage.PNCBoloDescription} ${l.bolo_description}
    `;$("#vehicle-search-results").append(n),i.push(l.license_plate)}for(let r of npcVehicleData)if(Number(r.civ_id)===Number(e)&&void 0!==r.license_plate&&null!==r.license_plate&&!i.includes(r.license_plate)){t=!0;let d=npcCivilianData.filter(a=>a.id===Number(e)),o=r.owner_name;if(d.length>0){let c=JSON.parse(d[0].personal_data);o=c.FirstName+" "+c.LastName}let p=`
    ${r.profile_picture_url?
    ${r.license_plate}
    ${r.stolen||r.bolo?'':""}

    ${mdtLanguage.RegisteredOn} ${new Date(r.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.RegisteredToCitizenId}: ${r.civ_id}
    • ${mdtLanguage.CitizenName}: ${o||"N/A"}
    • ${mdtLanguage.Make}: ${r.make}
    • ${mdtLanguage.Model}: ${r.model}
    • ${mdtLanguage.Color}: ${r.color}
    • ${mdtLanguage.BuildYear}: ${r.build_year}
    • ${mdtLanguage.TaxPaid} ${r.tax?'':''}
    • ${mdtLanguage.MoT} ${r.mot?'':''}
    • ${mdtLanguage.Insurance} ${r.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${r.stolen?'':''}
    • ${mdtLanguage.PNCBolo} ${r.bolo?'':''}
    • ${mdtLanguage.PNCBoloDescription} ${r.bolo_description}
    `;$("#vehicle-search-results").append(p),i.push(r.license_plate)}t||($("#vehicle-search-results").empty(),$("#vehicle-search-results").append(``))}else if((e.length??0)>=1){let m=RegExp(e,"i");for(let u of allVehicleData)if(m.test(u.license_plate)&&void 0!==u.license_plate&&null!==u.license_plate&&!i.includes(u.license_plate)){t=!0;let g=u,b=allCivilianData.filter(e=>e.id===Number(g.civ_id));$("#vehicle-search-results").append(`
    ${g.profile_picture_url?
    ${g.license_plate}
    ${g.stolen||g.bolo?'':""}

    ${mdtLanguage.RegisteredOn} ${new Date(g.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.RegisteredToCitizenId}: ${g.civ_id}
    • ${mdtLanguage.CitizenName}: ${b[0].first_name} ${b[0].last_name}
    • ${mdtLanguage.Make}: ${g.make}
    • ${mdtLanguage.Model}: ${g.model}
    • ${mdtLanguage.Color}: ${g.color}
    • ${mdtLanguage.BuildYear}: ${g.build_year}
    • ${mdtLanguage.TaxPaid} ${g.tax?'':''}
    • ${mdtLanguage.MoT} ${g.mot?'':''}
    • ${mdtLanguage.Insurance} ${g.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${g.stolen?'':''}
    • ${mdtLanguage.PNCBolo} ${g.bolo?'':''}
    • ${mdtLanguage.PNCBoloDescription} ${g.bolo_description}
    `),i.push(g.license_plate)}for(let h of allVehicleData)if(Number(h.civ_id)===Number(e)&&void 0!==h.license_plate&&null!==h.license_plate&&!i.includes(h.license_plate)){t=!0;let v=allCivilianData.filter(e=>e.id===Number(h.civ_id)),f=`
    ${h.profile_picture_url?
    ${h.license_plate}
    ${h.stolen||h.bolo?'':""}

    ${mdtLanguage.RegisteredOn} ${new Date(h.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.RegisteredToCitizenId}: ${h.civ_id}
    • ${mdtLanguage.CitizenName}: ${v[0].first_name} ${v[0].last_name}
    • ${mdtLanguage.Make}: ${h.make}
    • ${mdtLanguage.Model}: ${h.model}
    • ${mdtLanguage.Color}: ${h.color}
    • ${mdtLanguage.BuildYear}: ${h.build_year}
    • ${mdtLanguage.TaxPaid} ${h.tax?'':''}
    • ${mdtLanguage.MoT} ${h.mot?'':''}
    • ${mdtLanguage.Insurance} ${h.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${h.stolen?'':''}
    • ${mdtLanguage.PNCBolo} ${h.bolo?'':''}
    • ${mdtLanguage.PNCBoloDescription} ${h.bolo_description}
    `;$("#vehicle-search-results").append(f),i.push(h.license_plate)}for(let y of npcVehicleData)if(m.test(y.license_plate)&&void 0!==y.license_plate&&null!==y.license_plate&&!i.includes(y.license_plate)){t=!0;let L=y,x=npcCivilianData.filter(e=>e.id===Number(L.civ_id)),w=y.owner_name;if(x.length>0){let k=JSON.parse(x[0].personal_data);w=k.FirstName+" "+k.LastName}$("#vehicle-search-results").append(`
    ${L.profile_picture_url?
    ${L.license_plate}
    ${L.stolen||L.bolo?'':""}

    ${mdtLanguage.RegisteredOn} ${new Date(L.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.RegisteredToCitizenId}: ${L.civ_id}
    • ${mdtLanguage.CitizenName}: ${w||"N/A"}
    • ${mdtLanguage.Make}: ${L.make}
    • ${mdtLanguage.Model}: ${L.model}
    • ${mdtLanguage.Color}: ${L.color}
    • ${mdtLanguage.BuildYear}: ${L.build_year}
    • ${mdtLanguage.TaxPaid} ${L.tax?'':''}
    • ${mdtLanguage.MoT} ${L.mot?'':''}
    • ${mdtLanguage.Insurance} ${L.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${L.stolen?'':''}
    • ${mdtLanguage.PNCBolo} ${L.bolo?'':''}
    • ${mdtLanguage.PNCBoloDescription} ${L.bolo_description}
    `),i.push(L.license_plate)}for(let A of npcVehicleData)if(Number(A.civ_id)===Number(e)&&void 0!==A.license_plate&&null!==A.license_plate&&!i.includes(A.license_plate)){t=!0;let C=npcCivilianData.filter(e=>e.id===Number(e.civ_id)),D=A.owner_name;if(C.length>0){let P=JSON.parse(C[0].personal_data);D=P.FirstName+" "+P.LastName}let S=`
    ${A.profile_picture_url?
    ${A.license_plate}
    ${A.stolen||A.bolo?'':""}

    ${mdtLanguage.RegisteredOn} ${new Date(A.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.RegisteredToCitizenId}: ${A.civ_id}
    • ${mdtLanguage.CitizenName}: ${D||"N/A"}
    • ${mdtLanguage.Make}: ${A.make}
    • ${mdtLanguage.Model}: ${A.model}
    • ${mdtLanguage.Color}: ${A.color}
    • ${mdtLanguage.BuildYear}: ${A.build_year}
    • ${mdtLanguage.TaxPaid} ${A.tax?'':''}
    • ${mdtLanguage.MoT} ${A.mot?'':''}
    • ${mdtLanguage.Insurance} ${A.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${A.stolen?'':''}
    • ${mdtLanguage.PNCBolo} ${A.bolo?'':''}
    • ${mdtLanguage.PNCBoloDescription} ${A.bolo_description}
    `;$("#vehicle-search-results").append(S),i.push(A.license_plate)}t||($("#vehicle-search-results").empty(),$("#vehicle-search-results").append(``))}else $("#vehicle-search-results").empty(),$("#vehicle-search-results").append(``);hideLoading()},SpinnerLoadingTimeInMs)}function PNCPropertySearch(e){showLoading(),setTimeout(function(){let a=!1;$("#person-search").hide(),$("#vehicle-search").hide(),$("#property-search").show(),$("#record-search").hide(),$("#fine-search").hide(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#property-search-results").empty();let t=[];for(let i of allPropertyData)if(Number(i.civ_id)===Number(e)){let l=`${i.address}-${i.house_number}`;if(!t.includes(l)){let s=allCivilianData.filter(e=>e.id===Number(i.civ_id));a=!0;let n=`
    ${i.property_picture_url?
    ${i.property_type}
    ${i.seized?'':""}

    ${mdtLanguage.RegisteredOn} ${new Date(i.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.PropertyRegisterId}: ${i.id}
    • ${mdtLanguage.RegisteredToCitizenId}: ${i.civ_id}
    • ${mdtLanguage.PropertyOwnedBy}: ${s[0].first_name} ${s[0].last_name}
    • ${mdtLanguage.PropertyAddress}: ${i.address}
    • ${mdtLanguage.PropertyHouseNumber}: ${i.house_number}
    • ${mdtLanguage.PropertyArea}: ${i.area}
    • ${mdtLanguage.PropertyPostalCode}: ${i.postal_code}
    • ${mdtLanguage.PropertyDescription}: ${i.description}
    • ${mdtLanguage.PropertyPrice}: ${mdtLanguage.Valuta}${i.price}
    • ${mdtLanguage.PropertyBuildYear}: ${i.year_built}
    • ${mdtLanguage.PropertyAmenities}: ${i.amenities}
    • ${mdtLanguage.PropertySeized} ${i.property_seized?'':''}
    `;$("#property-search-results").append(n),t.push(l)}}a||($("#property-search-results").empty(),$("#property-search-results").append(``)),hideLoading()},SpinnerLoadingTimeInMs)}function PNCEditPropertySeized(e,a){let t="false"===a.toLowerCase();$.post("https://night_shifts/updatePropertySeized",JSON.stringify({id:e,property_seized:t}))}function PNCEditNPCBolo(e){let a=decodeURIComponent(e);for(let t of npcVehicleData)if(t.license_plate===a){$("#edit-modal-npc-bolo").remove();let i=` `;$("body").append(i),$("#edit-button-npc-bolo").on("click",function(){let e=t.id,a=t.license_plate,i=t.make,l=t.model,s=t.color,n=t.build_year,r=t.tax,d=t.mot,o=t.insurance,c=$("#npc-mark_stolen").is(":checked"),p=$("#npc-active_bolo").is(":checked"),m=$("#npc-bolo_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),u=t.owner_name,g=t.vehicle_picture_url,b=t.license_plate,h=t.civ_id;$.post("https://night_shifts/updateNPCBolo",JSON.stringify({id:Number(e),license_plate:a,make:i,model:l,color:s,build_year:n,registration_date:b,tax:r,mot:d,insurance:o,stolen:c,bolo:p,bolo_description:m,owner_name:u,vehicle_picture_url:g,civ_id:h})),$("#edit-modal-npc-bolo").modal("hide"),$("#edit-button-npc-bolo").off("click")}),$("#edit-modal-npc-bolo").modal("show")}}function PNCEditBOLO(e){let a=decodeURIComponent(e);for(let t of allVehicleData)if(t.license_plate==a){$("#edit-modal-bolo").remove();let i=` `;$("body").append(i),$("#edit-button-bolo").on("click",function(){let e=t.id,a=t.license_plate,i=t.make,l=t.model,s=t.color,n=t.build_year,r=t.tax,d=t.mot,o=t.insurance,c=$("#mark_stolen").is(":checked"),p=$("#active_bolo").is(":checked"),m=$("#bolo_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),u=t.vehicle_picture_url,g=t.license_plate,b=t.civ_id,h=t.user_fivem_id;$.post("https://night_shifts/updateBolo",JSON.stringify({id:Number(e),license_plate:a,make:i,model:l,color:s,build_year:n,registration_date:g,tax:r,mot:d,insurance:o,stolen:c,bolo:p,bolo_description:m,vehicle_picture_url:u,civ_id:b,user_fivem_id:h})),$("#edit-modal-bolo").modal("hide"),$("#edit-button-bolo").off("click")}),$("#edit-modal-bolo").modal("show")}}function PNCFineSearch(e){showLoading(),setTimeout(function(){let a=!1;$("#person-search").hide(),$("#vehicle-search").hide(),$("#property-search").hide(),$("#record-search").hide(),$("#fine-search").show(),$("#wanted-person").hide(),$("#anpr-section").hide(),$("#fine-search-results").empty(),"number"==typeof e&&(e=e.toString());let t=[];if((e.length??0)>=1){for(let i of fineData)if(Number(i.civ_id)===Number(e)&&void 0!==i.fine_description&&null!==i.fine_description&&!t.includes(i.fine_date)){a=!0;let l=allCivilianData.filter(e=>e.id===Number(i.civ_id)),s=`
    ${i.fine_type} #${i.id} | ${l[0].first_name} ${l[0].last_name}

    ${mdtLanguage.FineIssuedOn} ${isValidDate(i.fine_date)?new Date(i.fine_date).toLocaleString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Invalid date"}.

    • ${mdtLanguage.GeneratedForCitizenId}: ${i.civ_id}
    • ${mdtLanguage.Description}: ${i.fine_description}
    • ${mdtLanguage.FineAmount}: ${mdtLanguage.Valuta}${i.fine_amount}
    • ${mdtLanguage.Location}: ${i.fine_location}
    • ${mdtLanguage.OfficerDetails}: ${i.issuing_officer}
    • ${mdtLanguage.DueDate}: ${isValidDate(i.due_date)?new Date(i.due_date).toLocaleString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Invalid date"}
    • ${mdtLanguage.FinePaid}? ${i.paid?'':''}
    `;$("#fine-search-results").append(s),t.push(i.fine_date)}for(let n of npcFineData)if(Number(n.civ_id)===Number(e)&&void 0!==n.fine_description&&null!==n.fine_description&&!t.includes(n.fine_date)){a=!0;let r=npcCivilianData.filter(a=>a.id===Number(e)),d=JSON.parse(r[0].personal_data),o=d.FirstName+" "+d.LastName,c=`
    ${n.fine_type} #${n.id} | ${o}

    ${mdtLanguage.FineIssuedOn} ${isValidDate(n.fine_date)?new Date(n.fine_date).toLocaleString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Invalid date"}.

    • ${mdtLanguage.GeneratedForCitizenId}: ${n.civ_id}
    • ${mdtLanguage.Description}: ${n.fine_description}
    • ${mdtLanguage.FineAmount}: ${mdtLanguage.Valuta}${n.fine_amount}
    • ${mdtLanguage.Location}: ${n.fine_location}
    • ${mdtLanguage.OfficerDetails}: ${n.issuing_officer}
    • ${mdtLanguage.DueDate}: ${isValidDate(n.due_date)?new Date(n.due_date).toLocaleString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Invalid date"}
    • ${mdtLanguage.FinePaid}? ${n.paid?'':''}
    `;$("#fine-search-results").append(c),t.push(n.fine_date)}a||($("#fine-search-results").empty(),$("#fine-search-results").append(``))}else $("#fine-search-results").empty(),$("#fine-search-results").append(``);hideLoading()},SpinnerLoadingTimeInMs)}function PNCMarkFinePaid(e){let a=JSON.parse(decodeURIComponent(e));$.post("https://night_shifts/updateFine",JSON.stringify({fine_data:a}))}function PNCMarkNPCFinePaid(e){let a=JSON.parse(decodeURIComponent(e));$.post("https://night_shifts/updateNPCFine",JSON.stringify({fine_data:a}))}function AddPNCResultsListener(){$("#person-search-button").click(function(e){e.preventDefault();let a=$("#person-search-input").val();PNCPersonSearch(a)}),$("#vehicle-search-button").click(function(e){e.preventDefault();let a=$("#vehicle-search-input").val();PNCVehicleSearch(a,!1)}),$("#property-search-button").click(function(e){e.preventDefault();let a=$("#property-search-input").val();PNCPropertySearch(a)}),$("#record-search-button").click(function(e){e.preventDefault();let a=$("#record-search-input").val();PNCRecordSearch(a)}),$("#fine-search-button").click(function(e){e.preventDefault();let a=$("#fine-search-input").val();PNCFineSearch(a)})}function deleteCall(e,a,t){e>=a?$.post("https://night_shifts/deleteCall",JSON.stringify({CallIndex:t})):$.post("https://night_shifts/noAccess",JSON.stringify({RequiredLevel:a,YourLevel:e}))}function trackCall(e){$.post("https://night_shifts/trackCall",JSON.stringify({CallID:Number(e)}))}function PNCEditNPCMarkers(e){let a=npcCivilianData.filter(a=>a.id===Number(e));if(a.length>0){let t=JSON.parse(a[0].personal_data),i=t.FlagsOrMarkers;$("#edit-modal-markers-npc").remove();let l={armed_and_dangerous:i.armed_and_dangerous||!1,assault:i.assault||!1,burglary:i.burglary||!1,drug_related:i.drug_related||!1,gang_affiliation:i.gang_affiliation||!1,homicide:i.homicide||!1,kidnapping:i.kidnapping||!1,mental_health_issues:i.mental_health_issues||!1,sex_offense:i.sex_offense||!1,terrorism:i.terrorism||!1,theft:i.theft||!1,traffic_violation:i.traffic_violation||!1,wanted_person:i.wanted_person||!1,other:i.other||!1,active_warrant:i.active_warrant||!1,flag_description:i.flag_description||""},s=` `;$("body").append(s);let n=$("#edit-modal-markers-npc");if(0===n.length){console.error("Failed to create modal element");return}$("#edit-button-markers-npc").on("click",function(){let a=$("#armed_and_dangerous-npc").is(":checked"),i=$("#assault-npc").is(":checked"),l=$("#burglary-npc").is(":checked"),s=$("#drug_related-npc").is(":checked"),r=$("#gang_affiliation-npc").is(":checked"),d=$("#homicide-npc").is(":checked"),o=$("#kidnapping-npc").is(":checked"),c=$("#mental_health_issues-npc").is(":checked"),p=$("#sex_offense-npc").is(":checked"),m=$("#terrorism-npc").is(":checked"),u=$("#theft-npc").is(":checked"),g=$("#traffic_violation-npc").is(":checked"),b=$("#wanted_person-npc").is(":checked"),h=$("#other-npc").is(":checked"),v=$("#active_warrant-npc").is(":checked"),f=$("#flag_description-npc").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,"");t.FlagsOrMarkers={armed_and_dangerous:a,assault:i,burglary:l,drug_related:s,gang_affiliation:r,homicide:d,kidnapping:o,mental_health_issues:c,sex_offense:p,terrorism:m,theft:u,traffic_violation:g,wanted_person:b,other:h,active_warrant:v,flag_description:f},$.post("https://night_shifts/updateNPCMarkers",JSON.stringify({civ_id:e,personal_data:t})),n.modal("hide"),$("#edit-button-markers-npc").off("click")}),n.modal("show")}}function PNCEditMarkers(e){let a=allCivilianData.filter(a=>a.id===Number(e)),t=markerData.filter(a=>a.civ_id===Number(e));$("#edit-modal-markers").remove();let i=` `;$("body").append(i),$("#edit-button-markers").on("click",function(){let t=$("#armed_and_dangerous").is(":checked"),i=$("#assault").is(":checked"),l=$("#burglary").is(":checked"),s=$("#drug_related").is(":checked"),n=$("#gang_affiliation").is(":checked"),r=$("#homicide").is(":checked"),d=$("#kidnapping").is(":checked"),o=$("#mental_health_issues").is(":checked"),c=$("#sex_offense").is(":checked"),p=$("#terrorism").is(":checked"),m=$("#theft").is(":checked"),u=$("#traffic_violation").is(":checked"),g=$("#wanted_person").is(":checked"),b=$("#other").is(":checked"),h=$("#active_warrant").is(":checked"),v=$("#flag_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),f=new Date().getTime(),y=$("#created_by").val(),L=$("#marker_id").val();$.post("https://night_shifts/updateMarkers",JSON.stringify({id:Number(L),armed_and_dangerous:t,assault:i,burglary:l,drug_related:s,gang_affiliation:n,homicide:r,kidnapping:d,mental_health_issues:o,sex_offense:c,terrorism:p,theft:m,traffic_violation:u,wanted_person:g,other:b,active_warrant:h,flag_description:v,date_created:Math.round(f/1e3),created_by:y,civ_id:e,user_fivem_id:a[0].user_fivem_id})),$("#edit-modal-markers").modal("hide"),$("#edit-button-markers").off("click")}),$("#edit-modal-markers").modal("show")}function editVehicle(e){let a=JSON.parse(decodeURIComponent(e)),t=a.id;$("#edit-modal-editveh").remove();let i=new Date(a.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"}),l=` `;$("body").append(l),$("#edit-button-editveh").on("click",function(){let e=$("#edit_vehicle_picture_url").val().trim(),i=$("#edit_license_plate").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),l=$("#edit_make").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),s=$("#edit_model").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),n=$("#edit_color").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),r=$("#edit_build_year").val(),d=$("#edit_tax").is(":checked"),o=$("#edit_mot").is(":checked"),c=$("#edit_insurance").is(":checked"),p=$("#edit_stolen").is(":checked"),m=$("#edit_bolo").is(":checked"),u=$("#edit_bolo_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),g=$("#edit_owned_by").val(),b=a.registration_date;$.post("https://night_shifts/updateVehicle",JSON.stringify({id:t,vehicle_picture_url:e,license_plate:i,make:l,model:s,color:n,build_year:r,registration_date:b,tax:d,mot:o,insurance:c,stolen:p,bolo:m,bolo_description:u,civ_id:g})),$("#edit-modal-editveh").modal("hide"),$("#edit-button-editveh").off("click")}),$("#edit-modal-editveh").modal("show")}function editCharacter(e){e=JSON.parse(decodeURIComponent(e));let a=e.id;$("#edit-modal-char").remove();let t=` `;$("body").append(t),$("#edit-button-char").on("click",function(){let e=$("#edit_profile_picture_url").val().trim(),t=$("#edit_first_name").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),i=$("#edit_last_name").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),l=$("#edit_gender").val().trim().replace(/[<>(){}[\]^&|*;:]/g,""),s=$("#edit_dob").val(),n=$("#edit_email").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),r=$("#edit_phone_number").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),d=$("#edit_address_line_1").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),o=$("#edit_address_line_2").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),c=$("#edit_city").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),p=$("#edit_state").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),m=$("#edit_postal_code").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),u=$("#edit_country").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),g=$("#edit_occupation").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),b=$("#edit_nationality").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),h=$("#edit_car_license").is(":checked"),v=$("#edit_bike_license").is(":checked"),f=$("#edit_truck_license").is(":checked"),y=$("#edit_boat_license").is(":checked"),L=$("#edit_pilot_license").is(":checked");""==e||""==t||""==i||""==l||""==n||""==r||""==d||""==o||""==c||""==p||""==g||""==b?$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.OneOrMoreFieldsHaveNotBeenFilled})):($.post("https://night_shifts/updateCivilian",JSON.stringify({id:a,profile_picture_url:e,first_name:t,last_name:i,dob:s,gender:l,email:n,phone_number:r,address_line_1:d,address_line_2:o,city:c,state:p,postal_code:m,country:u,occupation:g,nationality:b,license_car:h,license_bike:v,license_truck:f,license_boat:y,license_pilot:L})),$("#edit-modal-char").modal("hide"),$("#edit-button-char").off("click"))}),$("#edit-modal-char").modal("show")}function validateDate(){let e=document.getElementById("civ_dob").value;if(!isNaN(Date.parse(e))){let a=new Date(e),t=new Date;a>t&&(document.getElementById("civ_dob").value=t.toISOString().split("T")[0])}}function deleteVehicle(e){$("#delete-modal-veh").remove();let a=` `;$("body").append(a),$("#delete-button-veh").on("click",function(){$.post("https://night_shifts/deleteVehicle",JSON.stringify({id:e})),$("#delete-modal-veh").modal("hide"),$("#delete-button-veh").off("click")}),$("#delete-modal-veh").modal("show")}function deleteCharacter(e){$("#delete-modal-civ").remove();let a=` `;$("body").append(a),$("#delete-button-civ").on("click",function(){$.post("https://night_shifts/deleteCivilian",JSON.stringify({id:e})),$("#delete-modal-civ").modal("hide"),$("#delete-button-civ").off("click")}),$("#delete-modal-civ").modal("show")}function submitCivilianRegistrationForm(){let e=$("#civ_profile_picture_url").val().trim(),a=$("#civ_firstname").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),t=$("#civ_lastname").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),i=$("#civ_dob").val(),l=$("#civ_gender").val().trim().replace(/[<>(){}[\]^&|*;:]/g,""),s=$("#civ_email").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),n=$("#civ_phone_number").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),r=$("#civ_address_1").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),d=$("#civ_address_2").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),o=$("#civ_city").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),c=$("#civ_state").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),p=$("#civ_postal").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),m=$("#civ_country").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),u=$("#civ_occupation").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),g=$("#civ_nationality").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),b=$("#civ_license_car").is(":checked"),h=$("#civ_license_bike").is(":checked"),v=$("#civ_license_truck").is(":checked"),f=$("#civ_license_boat").is(":checked"),y=$("#civ_license_pilot").is(":checked");""==e||""==a||""==t||null==i||""==i||isNaN(Date.parse(i))||""==l||""==s||""==n||""==r||""==o||""==c||""==p||""==m||""==u||""==g?$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.OneOrMoreFieldsHaveNotBeenFilled})):$.post("https://night_shifts/registerCivilian",JSON.stringify({profile_picture_url:e,first_name:a,last_name:t,dob:i,gender:l,email:s,phone_number:n,address_line_1:r,address_line_2:d,city:o,state:c,postal_code:p,country:m,occupation:u,nationality:g,license_car:b,license_bike:h,license_truck:v,license_boat:f,license_pilot:y}))}function getSafeHTML(e){return e&&"string"==typeof e?e.replace(/&/g,"&").replace(//g,">"):e}function submitVehicleForm(){let e=getSafeHTML($("#veh_license_plate").val().trim()),a=getSafeHTML($("#veh_make").val().trim()),t=getSafeHTML($("#veh_model").val()),i=getSafeHTML($("#veh_color").val().trim()),l=getSafeHTML($("#veh_build_year").val()),s=getSafeHTML($("#vehicle_picture_url").val().trim()),n=getSafeHTML($("#input_civ_id_value").val());if(0===e.length||0===a.length||0===t.length||0===i.length||0===l.length||0===s.length||0===n.length)$.post("https://night_shifts/errorMessage",JSON.stringify({message:mdtLanguage.OneOrMoreFieldsHaveNotBeenFilled}));else{let r=$("#veh_tax").is(":checked"),d=$("#veh_mot").is(":checked"),o=$("#veh_insurance").is(":checked"),c=$("#veh_stolen").is(":checked"),p=new Date().toISOString().slice(0,19).replace("T"," ");$.post("https://night_shifts/registerVehicle",JSON.stringify({license_plate:e,make:a,model:t,color:i,build_year:l,registration_date:p,tax:r,mot:d,insurance:o,stolen:c,bolo:!1,bolo_description:"None",vehicle_picture_url:s,civ_id:n}))}}function ToggleMDT(e){let a=0;!function t(){let i=document.getElementById("menucontainer");if(i){i.style.display=e?"flex":"none";return}++a<10&&e?(console.log(`Menu container not found because the DOM is being updated, retrying in 100ms... Attempt ${a}/10`),setTimeout(t,100)):e?console.error("Failed to find menu container after multiple attempts. Please try opening the MDT again later..."):console.log("Hiding menu, container not found due to the DOM being updated. This is normal.")}()}function ToggleEmergencyCallSystem(e,a,t,i){if(document.getElementById("emergency-call-system").style.display=e?"flex":"none",!0===e){$("#emergency-call-modal").remove();let l=' `;$("body").append(l),$("#emergency-call-modal").on("hidden.bs.modal",function(e){$("#cancel-call-button").trigger("click")});var s=$("#call_input_civ_id"),n=$("");n.attr("value",""),n.text(a.PlaceHolderSelectCivilian),s.append(n),$.each(t,function(e,a){var t=a.id,i=a.first_name+" "+a.last_name,l=$("");l.attr("value",t),l.text(i),s.append(l)}),s.attr("required",!0),s.find("option:first").attr("selected",!0),s.change(function(){for(var e,a=$(this).val(),i=0;i<(t.length??0);i++)if(t[i].id===a){e=t[i].first_name+" "+t[i].last_name;break}$("#call_display_name").text(e),$("#call_input_civ_id_value").val(a)});var r=$("");$("#call_input_civ_id").after(r),$("#cancel-call-button").on("click",function(){$.post("https://night_shifts/cancelCall",JSON.stringify({}))}),$("#close-call-button").on("click",function(){$.post("https://night_shifts/cancelCall",JSON.stringify({}))}),$("#emergency-call-button").on("click",function(){let e=$("#call_input_civ_id_value").val(),t=document.getElementById("call_input_anonymous").checked,i=document.getElementById("call_input_emergency").checked,l=document.getElementById("call_input_police").checked,s=document.getElementById("call_input_ambulance").checked,n=document.getElementById("call_input_fire").checked,r=document.getElementById("call_input_tow").checked,d=$("#call_input_postal").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),o=$("#call_input_street").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),c=$("#call_input_area").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),p=$("#call_description").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,""),m=$("#call_input_time").val(),u=$("#call_input_their_contactdetails").val().trim().replace(/[<>(){}[\]^&|+*;:]/g,"");""==e||""==d||""==o||""==c||""==p||""==u?$.post("https://night_shifts/errorMessage",JSON.stringify({message:a.OneOrMoreFieldsHaveNotBeenFilled})):($.post("https://night_shifts/sendEmergencyCall",JSON.stringify({caller_civ_id:e,anonymous_call:t,emergency_type:i,police_required:l,ambulance_required:s,fire_required:n,tow_required:r,postal:d,street:o,area:c,description:p,call_time:m,contact_details:u})),$("#emergency-call-modal").modal("hide"),$("#emergency-call-button").off("click"))}),$("#emergency-call-modal").modal("show")}else $("#emergency-call-modal").modal("hide"),$(".modal-backdrop").remove()}function ToggleHelpMenu(e){helpMenuOpen=!!e,document.getElementById("helpmenucontainer").style.display=e?"flex":"none"}function CutString(e,a){return(e.length??0)>a?e=e.slice(0,a)+"...":e}function Notify(e){let a=document.createElement("div"),t=Math.random().toString(36).slice(2,10);a.setAttribute("id",t),a.classList.add("notify");let i=e.data.data_position,l=document.createElement("div");l.classList.add("notification",e.data.data_type),l.style.flexDirection=i;let s=e.data.data_icon;l.innerHTML=' '+e.data.data_text;let n=document.getElementById("notification-area");a.appendChild(l),n.appendChild(a),setTimeout(()=>{var e=n.getElementsByClassName("notify");for(let a=0;a<(e.length??0);a++)if(e[a].getAttribute("id")==t){e[a].remove();break}},e.data.data_duration)}function SetMenuActive(e,a){$.each(e,function(e,a){a.Show&&(document.getElementById("sidebar_item_"+e).classList.add("disabled"),document.getElementById("sidebar_item_"+e).classList.remove("sidebar_background_active"),document.getElementById("sidebar_item_"+e).classList.remove("text-light"),document.getElementById("sidebar_item_"+e).classList.remove("font-weight-bold"))}),document.getElementById(a).classList.remove("disabled"),document.getElementById(a).classList.add("sidebar_background_active"),document.getElementById(a).classList.add("text-light"),document.getElementById(a).classList.add("font-weight-bold")}function AllowMenuButton(e){$.each(mdtData.MDTMenus,function(a,t){"sidebar_item_"+a==e&&t.Show&&document.getElementById(e).classList.remove("disabled")})}function AddMenuButton(e){let a="sidebar_item_"+e;$.each(mdtData.MDTMenus,function(t,i){"sidebar_item_"+t==a&&i.Show&&document.getElementById(a).addEventListener("click",function(){$.post("https://night_shifts/switchMenuStage",JSON.stringify({MenuStage:e}))})})}function ClickShiftButton(){updateShiftToggle(),$.post("https://night_shifts/toggleShift",JSON.stringify({}))}function UpdateRadioToggle(e){let a=document.getElementById("radio-toggle");if(null!==a){if(displayHUD){let t=document.getElementById("radioicon");null!==t&&(e?(a.classList.remove("off"),a.classList.add("on"),t.style.color="#4CAF50"):(a.classList.remove("on"),a.classList.add("off"),t.style.color="#c7c7c7"))}else a.style.display="none"}}window.addEventListener("message",e=>{let a=e.data;var t,i=null;if("playSound"==a.transactionType&&(null!=i&&i.pause(),(i=new Howl({src:["nui://night_shifts/NUI/sounds/"+a.transactionFile+".ogg"]})).volume(a.transactionVolume),i.play()),"notification_main"==a.type&&!0===a.activate){if(!a.data_type.match(/^(warning|success|error|dispatch|emergency)$/)){fetch("https://night_shifts/error");return}let l=a.data_type;a.data_type.match("success")?$.post("https://night_shifts/sendSoundAlert",JSON.stringify({soundtype:l})):a.data_type.match("warning")?$.post("https://night_shifts/sendSoundAlert",JSON.stringify({soundtype:l})):a.data_type.match("error")?$.post("https://night_shifts/sendSoundAlert",JSON.stringify({soundtype:l})):a.data_type.match("dispatch")?$.post("https://night_shifts/sendSoundAlert",JSON.stringify({soundtype:l})):a.data_type.match("emergency")&&$.post("https://night_shifts/sendSoundAlert",JSON.stringify({soundtype:l})),Notify(e)}if("radiotransmission"===a.type&&UpdateRadioToggle(radioTransToggle=a.toggle),"anprhud"===a.type){let s=a.display,n;ToggleANPRHUD(s,a.vehiclefrontdata,a.vehiclereardata)}if("mdtsignal"===a.type){pingIcon=a.pingicon;let r=document.getElementById("mdtsignal");null!==r&&(r.className=pingIcon),pingColor=a.pingcolor,null!==r&&(r.style.color=pingColor)}if("mdtbattery"===a.type){batteryIcon=a.batteryicon;let d=document.getElementById("mdtbattery");d.className=batteryIcon,batteryColor=a.batterycolor,d.style.color=batteryColor;let o=document.getElementById("mdtbatteryicon");o.className=batteryIcon,o.style.color=batteryColor}if("chargemdtbattery"===a.type){let c=a.toggle;UpdateBatteryToggle(c)}if("ShowIDAndLicenses"===a.type&&DisplayIDCard(civilian_id_card=a.civdata),"emergencycall"===a.type){let p=a.openemergencysystem;mdtLanguage=a.mdtlanguage,ToggleEmergencyCallSystem(p,mdtLanguage,civilianData=a.owncivdata,personalData=a.personaldata)}if("displayactivecall"===a.type){if(isDisplayingActiveCall)return;isDisplayingActiveCall=!0;let m=a.callid;DisplayActiveCall(m)}if("init"===a.type){if(null===a.configdata){console.log("[^1ERROR^7] Configdata is not available yet (on init). Please try again...");return}let u=a.configdata;displayHUD=u.DisplayMDTHud,timeZone=u.Timezone,timeFormat=u.TimeFormat,mdtData=u.MobileDataTerminal,operationReports=u.OperationReports,propertyTypes=u.PropertyTypes,policeHandbook=u.PoliceHandbook,displayIconsForHUD=u.DisplayIconsForHUD,displayLocationForHUD=u.DisplayLocationForHUD,displayWhetherDispatchIsActive=u.DisplayWhetherDispatchIsActive,trainings=u.Trainings,mdtLanguage=u.Messages.MDTText,helpMenuText=u.Messages.HelpMenuText}if("mdtupdate"===a.type&&(personalData=a.personaldata,dispatchData=a.dispatchdata,EnableOrDisableHUD(a.displayhud),UpdateLocationGroup(personalData),UpdateDispatchGroup(dispatchData)),"mdtloading"===a.type){let g=a.loading;UpdateLoadingSpinner(g)}if("mdt"===a.type){if(null===a.configdata){console.log("[^1ERROR^7] Configdata is not available yet (on opening the MDT). Please try again...");return}updateKeyboardInputIcon(!1);let b=a.openmdt;personalData=a.personaldata,userRoles=a.userroles,shiftData=a.cachedata.cached_shift_data_client,callData=a.cachedata.cached_call_data_client,callNotesData=a.cachedata.cached_call_notes_data_client,allCivilianData=a.cachedata.cached_all_civ_data_client,civilianData=a.cachedata.cached_civ_data_client,allVehicleData=a.cachedata.cached_all_veh_data_client,vehicleData=a.cachedata.cached_veh_data_client,markerData=a.cachedata.cached_marker_data_client,fineData=a.cachedata.cached_fine_data_client,policeRecordData=a.cachedata.cached_police_record_data_client,operationsData=a.cachedata.cached_operations_data_client,statisticsData=a.cachedata.cached_statistics_data_client,fleetData=a.cachedata.cached_fleet_data_client,propertyData=a.cachedata.cached_property_data_client,allPropertyData=a.cachedata.cached_all_property_data_client,trainingData=a.cachedata.cached_training_data_client,departmentsCountData=a.cachedata.cached_departments_count_data_client,npcCivilianData=a.cachedata.cached_npc_civilian_data_client,npcVehicleData=a.cachedata.cached_npc_vehicle_data_client,npcRecordData=a.cachedata.cached_npc_police_record_data_client,npcFineData=a.cachedata.cached_npc_fine_data_client,theActiveDepartment=personalData.userActiveDepartment-1,theActiveSubDepartment=personalData.userActiveSubDepartment-1;let h=a.configdata;if(displayHUD=h.DisplayMDTHud,timeZone=h.Timezone,timeFormat=h.TimeFormat,mdtData=h.MobileDataTerminal,operationReports=h.OperationReports,propertyTypes=h.PropertyTypes,policeHandbook=h.PoliceHandbook,displayIconsForHUD=h.DisplayIconsForHUD,displayLocationForHUD=h.DisplayLocationForHUD,displayWhetherDispatchIsActive=h.DisplayWhetherDispatchIsActive,trainings=h.Trainings,mdtLanguage=h.Messages.MDTText,helpMenuText=h.Messages.HelpMenuText,currentShiftTime=a.currenshifttime,playerList=a.playerlist,UNKNOWN_CIVILIAN_PICTURE=mdtData.CivilianPlaceholder,UNKNOWN_VEHICLE_PICTURE=mdtData.VehiclePlaceholder,UNKNOWN_PROPERTY_PICTURE=mdtData.PropertyPlaceholder,statuscodes=mdtData.MDTStatusCodes,notification_duration=mdtData.DurationOfNotifications,ToggleMDT(b),updateShiftToggle(personalData.userIsOnShift),!b)return;CheckAndAddMDTListeners(),$.each(playerList,function(e,a){a.id===personalData.userServerId&&(ownDiscordAvatar=a.discordMember.avatar)});var v=personalData.userOnMenuStage;switch(CheckUserAccessLevel(personalData.userAccess.AccessLevel,v),personalData.userOnMenuStage){case 0:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(`
    `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_0"),CheckManagementAccess()&&(AllowMenuButton("sidebar_item_10"),AddMenuButton(10)),$.each(mdtData.DepartmentList,function(e,a){let t=getCountByDepartmentIndex(e,departmentsCountData);$("#home-card-wrapper").append(`
    DeptLogo
    ${a.DepartmentName}

    ${a.DepartmentDescription}

    ${t}

    `),document.getElementById(`department_${e}`).addEventListener("click",function(){$.post("https://night_shifts/selectedDepartment",JSON.stringify({DepartmentIndex:e,DepartmentName:a.DepartmentName}))})}),hideLoading()},SpinnerLoadingTimeInMs);break;case 1:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_1"),!1===personalData.userIsOnShift&&(AllowMenuButton("sidebar_item_0"),AddMenuButton(0)),$("#menucontainer_contentwrapper_menuwrapper_main").append(`

    ${mdtData.DepartmentList[theActiveDepartment].DepartmentName}

    ${mdtLanguage.SelectSubDepartmentAndShiftInfo}

    ${mdtLanguage.EmployeeDetails}
    • ${mdtLanguage.EmployeeName}${personalData.userRoleplayName}
    • ${mdtLanguage.EmployeeRank}${personalData.userRank}
    • ${mdtLanguage.EmployeeCallsign} ${personalData.userCallsign}
    • ${mdtLanguage.EmployeeVehicleRoofcode}${personalData.userAttachedFleetVehicleCallsignRoofcode}
    • ${mdtLanguage.EmployeeActiveCall}${personalData.userAttachedToCallID}
    • ${mdtLanguage.EmployeeCurrentShiftTime}${(()=>{let e=currentShiftTime,a=new Date,t=new Date(a.getTime()+6e4*e),i=t.getTime()-a.getTime(),l=Math.floor(i/6e4);return`${Math.floor(l/1440)} ${mdtLanguage.EmployeeDays} | ${Math.floor(l%1440/60)} ${mdtLanguage.EmployeeHours} | ${l%60} ${mdtLanguage.EmployeeMinutes}`})()}
    • ${mdtLanguage.EmployeeShiftTime}${(()=>{let e=personalData.userShiftTime,a=new Date,t=new Date(a.getTime()+6e4*e),i=t.getTime()-a.getTime(),l=Math.floor(i/6e4);return`${Math.floor(l/1440)} ${mdtLanguage.EmployeeDays} | ${Math.floor(l%1440/60)} ${mdtLanguage.EmployeeHours} | ${l%60} ${mdtLanguage.EmployeeMinutes}`})()}
    • ${mdtLanguage.EmployeeAccessLevel}${personalData.userAccess.AccessLevel}
    • ${mdtLanguage.EmployeeStatus}${personalData.userStatusCode}
    • ${mdtLanguage.EmployeeStatus2}${personalData.userStatusName}
    • ${mdtLanguage.EmployeeActiveSubDepartment}${mdtData.DepartmentList[theActiveDepartment].SubDepartments[theActiveSubDepartment].SubDepartmentName}

    ${mdtLanguage.StatusPanel}

    ${mdtLanguage.StatusPanelInfo}

    ${mdtLanguage.SelectStatus}
    `),$.each(mdtData.DepartmentList[theActiveDepartment].SubDepartments,function(e,a){$("#subDepartmentDropdown").append(`
  • ${a.SubDepartmentName}
  • `),document.getElementById("sub_dept_"+e).addEventListener("click",function(){$.post("https://night_shifts/selectedSubDepartment",JSON.stringify({SubDepartmentIndex:e,SubDepartmentName:a.SubDepartmentName}))})}),$.each(statuscodes,function(e,a){$("#spanel").append(`
    ${a.StatusCode}
    `),!1===personalData.userIsOnShift?document.getElementById("statusbutton_"+e).style.cursor="not-allowed":(document.getElementById("statusbutton_"+e).style.cursor="pointer",document.getElementById("statusbutton_"+e).addEventListener("click",function(){$.post("https://night_shifts/selectedStatus",JSON.stringify({StatusIndex:e,StatusCode:a.StatusCode,StatusName:a.StatusName}))}))}),$.each(statuscodes,function(e,a){$("#status-button-explanations").append(`
    ${a.StatusCode} - ${a.StatusName}
    `)}),personalData.userIsOnShift&&(AllowMenuButton("sidebar_item_2"),AddMenuButton(2),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentPoliceComputerAccess&&(AllowMenuButton("sidebar_item_3"),AddMenuButton(3)),AllowMenuButton("sidebar_item_4"),AddMenuButton(4),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentOperationsAccess&&(AllowMenuButton("sidebar_item_5"),AddMenuButton(5)),AllowMenuButton("sidebar_item_6"),AddMenuButton(6)),hideLoading()},SpinnerLoadingTimeInMs);break;case 2:showLoading(),setTimeout(function(){if($("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData?.MDTMenus??[],function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_2"),AllowMenuButton("sidebar_item_1"),AddMenuButton(1),AllowMenuButton("sidebar_item_2"),AddMenuButton(2),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentPoliceComputerAccess&&(AllowMenuButton("sidebar_item_3"),AddMenuButton(3)),AllowMenuButton("sidebar_item_4"),AddMenuButton(4),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentOperationsAccess&&(AllowMenuButton("sidebar_item_5"),AddMenuButton(5)),AllowMenuButton("sidebar_item_6"),AddMenuButton(6),callData){let e=callData?.filter(e=>!e.archived_call).length??0,a=callData?.filter(e=>e.archived_call).length??0;$("#menucontainer_contentwrapper_menuwrapper_main").append(`

    ${mdtLanguage.ActiveCalls} (${e})



    ${mdtLanguage.ArchivedCalls} (${a})



    `),AddRefreshOverviewBtn(),AddCallMenuListener(),AddActiveCallPages(),AddArchivedCallPages(),hideLoading()}},SpinnerLoadingTimeInMs);break;case 3:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_3"),AllowMenuButton("sidebar_item_1"),AddMenuButton(1),AllowMenuButton("sidebar_item_2"),AddMenuButton(2),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentPoliceComputerAccess&&(AllowMenuButton("sidebar_item_3"),AddMenuButton(3)),AllowMenuButton("sidebar_item_4"),AddMenuButton(4),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentOperationsAccess&&(AllowMenuButton("sidebar_item_5"),AddMenuButton(5)),AllowMenuButton("sidebar_item_6"),AddMenuButton(6),$("#menucontainer_contentwrapper_menuwrapper_main").append(`
    `),AddPNCListener(),AddPNCResultsListener(),AddRefreshOverviewBtn(),hideLoading()},SpinnerLoadingTimeInMs);break;case 4:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_4"),!1===personalData.userIsOnShift?(AllowMenuButton("sidebar_item_0"),AddMenuButton(0),AllowMenuButton("sidebar_item_8"),AddMenuButton(8)):(AllowMenuButton("sidebar_item_1"),AddMenuButton(1),AllowMenuButton("sidebar_item_2"),AddMenuButton(2),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentPoliceComputerAccess&&(AllowMenuButton("sidebar_item_3"),AddMenuButton(3)),AllowMenuButton("sidebar_item_4"),AddMenuButton(4),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentOperationsAccess&&(AllowMenuButton("sidebar_item_5"),AddMenuButton(5)),AllowMenuButton("sidebar_item_6"),AddMenuButton(6)),$("#menucontainer_contentwrapper_menuwrapper_main").append(`

    ${mdtLanguage.ActiveUnits}


    ${mdtLanguage.NameId} ${mdtLanguage.Callsign} ${mdtLanguage.VehicleRoofcode} ${mdtLanguage.ModeOfTransport} ${mdtLanguage.Department} ${mdtLanguage.SubDepartment} ${mdtLanguage.Rank} ${mdtLanguage.Location} ${mdtLanguage.Postal} ${mdtLanguage.ActiveCallID} ${mdtLanguage.Status} ${mdtLanguage.Actions}
    `),AddUnitOverviewListener(),AddUnitOverviewResultsListener(),AddUnitsToOverview(),AddBackupArea(),AddFleetManagementArea(),AddRefreshOverviewBtn(),hideLoading()},SpinnerLoadingTimeInMs);break;case 5:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_5"),!1===personalData.userIsOnShift?(AllowMenuButton("sidebar_item_0"),AddMenuButton(0),AllowMenuButton("sidebar_item_8"),AddMenuButton(8)):(AllowMenuButton("sidebar_item_1"),AddMenuButton(1),AllowMenuButton("sidebar_item_2"),AddMenuButton(2),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentPoliceComputerAccess&&(AllowMenuButton("sidebar_item_3"),AddMenuButton(3)),AllowMenuButton("sidebar_item_4"),AddMenuButton(4),AllowMenuButton("sidebar_item_6"),AddMenuButton(6)),$("#menucontainer_contentwrapper_menuwrapper_main").append(`

    ${mdtLanguage.AddReports}




    ${mdtLanguage.Guidelines}

    `),AddOperationsNavListener(),AddOperationsResultsListener(),AddFormTypeSelectListener(),AddRefreshOverviewBtn(),hideLoading()},SpinnerLoadingTimeInMs);break;case 6:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_6"),!1===personalData.userIsOnShift?(AllowMenuButton("sidebar_item_0"),AddMenuButton(0),AllowMenuButton("sidebar_item_8"),AddMenuButton(8)):(AllowMenuButton("sidebar_item_1"),AddMenuButton(1),AllowMenuButton("sidebar_item_2"),AddMenuButton(2),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentPoliceComputerAccess&&(AllowMenuButton("sidebar_item_3"),AddMenuButton(3)),AllowMenuButton("sidebar_item_4"),AddMenuButton(4),!0===mdtData.DepartmentList[theActiveDepartment].DepartmentOperationsAccess&&(AllowMenuButton("sidebar_item_5"),AddMenuButton(5))),$("#menucontainer_contentwrapper_menuwrapper_main").append(`

    ${mdtLanguage.ViewStatistics}


    `),AddStatisticsGraph(),hideLoading()},SpinnerLoadingTimeInMs);break;case 7:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_7"),!1===personalData.userIsOnShift&&(AllowMenuButton("sidebar_item_0"),AddMenuButton(0),AllowMenuButton("sidebar_item_8"),AddMenuButton(8),AllowMenuButton("sidebar_item_9"),AddMenuButton(9)),$("#menucontainer_contentwrapper_menuwrapper_main").append(`
    +
    +

    ${mdtLanguage.DMV}

    +
    +
    +
    +
    +
    +

    ${mdtLanguage.ViewRegisteredVehicles}

    +
    + +
    + +
    + +
    +
    + +
    +
    +
    +

    ${mdtLanguage.RegisterAVehicle}

    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    + + +
    + +
    + +
    +
    +
    +
    +
    `);var e=$("#input_civ_id"),a=$("");a.attr("value",""),a.text(mdtLanguage.SelectCitizen),e.append(a),$.each(civilianData,function(a,t){var i=t.id,l=t.first_name+" "+t.last_name,s=$("");s.attr("value",i),s.text(l),e.append(s)}),e.attr("required",!0),e.find("option:first").attr("selected",!0),e.change(function(){for(var e,a=parseInt($(this).val()),t=0;t");$("#input_civ_id").after(t),vehicleData.sort(function(e,a){return e.id-a.id}),$.each(vehicleData,function(e,a){var t={id:a.id,vehicle_picture_url:a.vehicle_picture_url,license_plate:a.license_plate,make:a.make,model:a.model,color:a.color,build_year:a.build_year,registration_date:a.registration_date,tax:a.tax,mot:a.mot,insurance:a.insurance,stolen:a.stolen,bolo:a.bolo,bolo_description:a.bolo_description,civ_id:a.civ_id},i=null;$.each(civilianData,function(e,a){var l=a.id;t.civ_id==l&&(i=a.first_name+" "+a.last_name)});var l=JSON.stringify(t);$("#existing_vehicles").append(`
    ${t.profile_picture_url?
    ${t.license_plate}


    ${mdtLanguage.RegisteredOn} ${new Date(t.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}.

    • ${mdtLanguage.OwnedBy}: ${i}
    • ${mdtLanguage.VehicleRegisterId}: ${t.id}
    • ${mdtLanguage.Make}: ${t.make}
    • ${mdtLanguage.Model}: ${t.model}
    • ${mdtLanguage.Color}: ${t.color}
    • ${mdtLanguage.BuildYear}: ${t.build_year}
    • ${mdtLanguage.TaxPaid} ${t.tax?'':''}
    • ${mdtLanguage.MoT} ${t.mot?'':''}
    • ${mdtLanguage.Insurance} ${t.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${t.stolen?'':''}
    `)}),hideLoading()},SpinnerLoadingTimeInMs);break;case 8:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_8"),!1===personalData.userIsOnShift&&(AllowMenuButton("sidebar_item_0"),AddMenuButton(0),AllowMenuButton("sidebar_item_7"),AddMenuButton(7),AllowMenuButton("sidebar_item_9"),AddMenuButton(9)),$("#menucontainer_contentwrapper_menuwrapper_main").append(`

    ${mdtLanguage.CityHall}

    ${mdtLanguage.ViewRegisteredCivilians}

    ${mdtLanguage.RegisterACivilian}

    Please enter a valid date of birth in the format DD/MM/YYYY.
    `);var e={};$.each(civilianData,function(a,t){var i=t.first_name+" "+t.last_name;e.hasOwnProperty(i)||(e[i]=t)});var a=Object.values(e).sort((e,a)=>e.id-a.id);$.each(a,function(e,a){var t={id:a.id,profile_picture_url:a.profile_picture_url,first_name:a.first_name,last_name:a.last_name,dob:a.dob,gender:a.gender,email:a.email,phone_number:a.phone_number,address_line_1:a.address_line_1,address_line_2:a.address_line_2,city:a.city,state:a.state,postal_code:a.postal_code,country:a.country,occupation:a.occupation,nationality:a.nationality,license_car:a.license_car,license_bike:a.license_bike,license_truck:a.license_truck,license_boat:a.license_boat,license_pilot:a.license_pilot},i=JSON.stringify(t);$("#existing_characters").append(`
    ${t.profile_picture_url?
    ${t.first_name} ${t.last_name}

    Born on ${new Date(t.dob).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.CitizenId}: ${t.id}
    • ${mdtLanguage.Gender}: ${t.gender}
    • ${mdtLanguage.Email}: ${t.email}
    • ${mdtLanguage.PhoneNumber}: ${t.phone_number}
    • ${mdtLanguage.Address}: ${t.address_line_1}
    • ${mdtLanguage.AddressType}: ${t.address_line_2}
    • ${mdtLanguage.City}: ${t.city}
    • ${mdtLanguage.State}: ${t.state}
    • ${mdtLanguage.PostalCode}: ${t.postal_code}
    • ${mdtLanguage.Country}: ${t.country}
    • ${mdtLanguage.Occupation}: ${t.occupation}
    • ${mdtLanguage.Nationality}: ${t.nationality}
    • ${mdtLanguage.CarLicense}: ${t.license_car?'':''}
    • ${mdtLanguage.BikeLicense}: ${t.license_bike?'':''}
    • ${mdtLanguage.TruckLicense}: ${t.license_truck?'':''}
    • ${mdtLanguage.BoatLicense}: ${t.license_boat?'':''}
    • ${mdtLanguage.PilotLicense}: ${t.license_pilot?'':''}
    `)}),hideLoading()},SpinnerLoadingTimeInMs);break;case 9:showLoading(),setTimeout(function(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `),$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)}),SetMenuActive(mdtData.MDTMenus,"sidebar_item_9"),!1===personalData.userIsOnShift&&(AllowMenuButton("sidebar_item_0"),AddMenuButton(0),AllowMenuButton("sidebar_item_7"),AddMenuButton(7),AllowMenuButton("sidebar_item_8"),AddMenuButton(8));let e=new Date().toLocaleString(timeFormat,{timeZone:timeZone});$("#menucontainer_contentwrapper_menuwrapper_main").append(`

    ${mdtLanguage.RealEstate}

    ${mdtLanguage.ViewRegisteredProperties}

    ${mdtLanguage.RegisterAProperty}

    ${mdtLanguage.Valuta}
    `);var a=$("#input_property_civ_id"),t=$("");t.attr("value",""),t.text(mdtLanguage.SelectCitizen),a.append(t),$.each(civilianData,function(e,t){var i=t.id,l=t.first_name+" "+t.last_name,s=$("");s.attr("value",i),s.text(l),a.append(s)}),a.attr("required",!0),a.find("option:first").attr("selected",!0),a.change(function(){for(var e,a=parseInt($(this).val()),t=0;t<(civilianData?.length||0);t++)if(civilianData[t].id===a){e=civilianData[t].first_name+" "+civilianData[t].last_name;break}$("#display_name").text(e),$("#input_property_civ_id_value").val(a)});var i=$("");$("#input_property_civ_id").after(i);var l=$("#input_property_type"),t=$("");t.attr("value",""),t.text(mdtLanguage.SelectPropertyType),l.append(t),$.each(propertyTypes,function(e,a){var t=a.PropertyType,i=$("");i.attr("value",e),i.text(t),l.append(i)}),l.attr("required",!0),l.find("option:first").attr("selected",!0),l.change(function(){var e=$(this).find("option:selected"),a=e.val(),t=e.text();$("#property_display_name").text(t),$("#input_property_type_index_value").val(a)});var i=$("");$("#input_property_type").after(i),propertyData.sort(function(e,a){return e.id-a.id}),$.each(propertyData,function(e,a){var t=null,i=null;$.each(civilianData,function(e,l){var s=l.id;a.civ_id==s&&(t=`${l.first_name} ${l.last_name}`,i=s)}),a.user_fivem_id===personalData.user_fivem_id&&$("#existing_properties").append(`
    ${a.property_picture_url?
    ${a.property_type}


    ${mdtLanguage.RegisteredOn} ${new Date(a.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}.

    • ${mdtLanguage.PropertyOwnedBy}: ${t} (${i})
    • ${mdtLanguage.PropertyRegisterId}: ${a.id}
    • ${mdtLanguage.PropertyAddress}: ${a.address}
    • ${mdtLanguage.PropertyHouseNumber}: ${a.house_number}
    • ${mdtLanguage.PropertyArea}: ${a.area}
    • ${mdtLanguage.PropertyPostalCode}: ${a.postal_code}
    • ${mdtLanguage.PropertyDescription}: ${a.description}
    • ${mdtLanguage.PropertyPrice}: ${mdtLanguage.Valuta}${a.price}
    • ${mdtLanguage.PropertyBuildYear}: ${a.year_built}
    • ${mdtLanguage.PropertyAmenities}: ${a.amenities}
    • ${mdtLanguage.PropertySeized} ${a.property_seized?'':''}
    `)}),hideLoading()},SpinnerLoadingTimeInMs);break;case 10:showLoading(),setTimeout(function(){BuildMenu(),BuildSideBar(),SetMenuActive(mdtData.MDTMenus,"sidebar_item_10"),AllowMenuButton("sidebar_item_0"),AddMenuButton(0),$("#menucontainer_contentwrapper_menuwrapper_main").append(`

    ${mdtLanguage.ManageCivilians}


    ${mdtLanguage.ManageVehicles}


    ${mdtLanguage.ManageProperties}


    ${mdtLanguage.ManageCalls}


    `),AddManagementPanelListener(),AddRefreshOverviewBtn(),hideLoading()},SpinnerLoadingTimeInMs)}}});let ANPRDetailsTimer,ANPRHits=0;function ToggleANPRHUD(e,a,t){let i=document.getElementById("anpr-hud"),l=document.getElementById("anpr-plate-container-front"),s=document.getElementById("anpr-icon-front"),n=document.getElementById("anpr-front"),r=document.getElementById("anpr-plate-container-rear"),d=document.getElementById("anpr-icon-rear"),o=document.getElementById("anpr-rear"),c=document.getElementById("anpr-details");c.style.display="none",n.classList.remove("anpr-flashing"),l.classList.remove("anpr-flashing"),s.classList.remove("anpr-flashing"),r.classList.remove("anpr-flashing"),d.classList.remove("anpr-flashing"),o.classList.remove("anpr-flashing"),e?i.style.display="flex":i.style.display="none",null!=a.vehiclePlate?(n.textContent=`${a.vehiclePlate}`,a.vehicleInANPR&&(ANPRHits+=1,c.style.display="flex",""!=c.innerHTML?c.style.top="22.5%":c.style.top="15%",c.innerHTML+=`
    ${mdtLanguage.ANPRFront}
    ${mdtLanguage.ANPRModel} ${a.modelName}
    ${mdtLanguage.ANPRColour} ${a.vehicleColor}
    ${mdtLanguage.ANPRSpeed} ${a.vehicleSpeed} ${a.speedType}
    ${mdtLanguage.ANPRFlags} ${a.vehicleBolo}, ${a.vehicleStolen}, ${a.vehicleInsurance}, ${a.vehicleMOT}, ${a.vehicleTAX}
    ${mdtLanguage.ANPRLocation} ${a.vehiclePostal}, ${a.vehicleStreetName}, ${a.vehicleArea}.

    `,clearTimeout(ANPRDetailsTimer),ANPRDetailsTimer=setTimeout(()=>{c.innerHTML="",c.style.display="none"},a.timeToUnlockANPR),l.classList.add("anpr-flashing"),s.classList.add("anpr-flashing"),n.classList.add("anpr-flashing"))):n.textContent="",null!=t.vehiclePlate?(o.textContent=`${t.vehiclePlate}`,t.vehicleInANPR&&(ANPRHits+=1,c.style.display="flex",""!=c.innerHTML?c.style.top="21.5%":c.style.top="15%",c.innerHTML+=`
    ${mdtLanguage.ANPRRear}
    ${mdtLanguage.ANPRModel} ${t.modelName}
    ${mdtLanguage.ANPRColour} ${t.vehicleColor}
    ${mdtLanguage.ANPRSpeed} ${t.vehicleSpeed} ${t.speedType}
    ${mdtLanguage.ANPRFlags} ${t.vehicleBolo}, ${t.vehicleStolen}, ${t.vehicleInsurance}, ${t.vehicleMOT}, ${t.vehicleTAX}
    ${mdtLanguage.ANPRLocation} ${t.vehiclePostal}, ${t.vehicleStreetName}, ${t.vehicleArea}.

    `,clearTimeout(ANPRDetailsTimer),ANPRDetailsTimer=setTimeout(()=>{c.innerHTML="",c.style.display="none"},t.timeToUnlockANPR),r.classList.add("anpr-flashing"),d.classList.add("anpr-flashing"),o.classList.add("anpr-flashing"))):o.textContent=""}function updateShiftToggle(){let e=document.getElementById("shift-toggle");if(null!==e){if(displayHUD){let a=document.getElementById("shifticon");personalData.userIsOnShift?(e.style.display="",e.classList.remove("off-shift"),e.classList.add("on-shift"),a.classList.remove("fa-toggle-off"),a.classList.add("fa-toggle-on"),a.style.color="#4CAF50"):(e.style.display="",e.classList.remove("on-shift"),e.classList.add("off-shift"),a.classList.remove("fa-toggle-on"),a.classList.add("fa-toggle-off"),a.style.color="#cccccc")}else e.style.display="none"}}function UpdateBatteryToggle(e){let a=document.getElementById("charge-toggle");null!==a&&(displayHUD?!0===e?(a.style.display="",a.classList.remove("charge-off"),a.classList.add("charge-on")):(a.style.display="",a.classList.remove("charge-on"),a.classList.add("charge-off")):a.style.display="none")}function UpdateLocationGroup(e){let a=document.getElementById("street-name"),t=document.getElementById("compass"),i=document.getElementById("postal");null!==a&&(a.textContent=e.userCurrentStreetName),null!==t&&(t.textContent=e.userCurrentCompassDirection),null!==i&&(i.textContent=e.userCurrentPostal)}function UpdateDispatchGroup(e){let a=document.getElementById("dispatch-group");if(!displayWhetherDispatchIsActive){a.style.display="none";return}if(personalData.userIsOnShift)a.style.display="flex";else{a.style.display="none";return}let t=document.getElementById("dispatch-icon"),i=document.getElementById("dispatch-active");e.isDispatchActive?(t.style.color="#4CAF50",i.textContent=`${mdtLanguage.DispatchActive}`):(t.style.color="#af4c4c",i.textContent=`${mdtLanguage.DispatchInactive}`)}function EnableOrDisableHUD(e){let a=document.getElementById("mdt-hud"),t=document.getElementById("charge-toggle"),i=document.getElementById("shift-toggle"),l=document.getElementById("radio-toggle");e?(a.style.display="flex",t.style.display="flex",i.style.display="flex",l.style.display="flex"):(a.style.display="none",t.style.display="none",i.style.display="none",l.style.display="none");let s=document.getElementById("icon-group"),n=document.getElementById("location-group");displayIconsForHUD&&(s.style.display="flex"),displayLocationForHUD&&(n.style.display="flex")}function DisplayIDCard(e){let a=document.getElementById("idCardModal");a&&a.remove();let t=` `;$("body").append(t);let i=$("#idCardModal");i.modal("show"),document.getElementById("profilePicture").src=e.profile_picture_url,document.getElementById("firstName").textContent=e.first_name,document.getElementById("lastName").textContent=e.last_name,document.getElementById("dob").textContent=(e=>{let a=new Date(e),t=String(a.getDate()).padStart(2,"0"),i=String(a.getMonth()+1).padStart(2,"0"),l=a.getFullYear();return`${t}/${i}/${l}`})(e.dob),document.getElementById("gender").textContent=e.gender,document.getElementById("nationality").textContent=e.nationality,document.getElementById("licenseCar").textContent=e.license_car?`${mdtLanguage.CarLicense}`:"",document.getElementById("licenseBike").textContent=e.license_bike?`${mdtLanguage.BikeLicense}`:"",document.getElementById("licenseTruck").textContent=e.license_truck?`${mdtLanguage.TruckLicense}`:"",document.getElementById("licenseBoat").textContent=e.license_boat?`${mdtLanguage.BoatLicense}`:"",document.getElementById("licensePilot").textContent=e.license_pilot?`${mdtLanguage.PilotLicense}`:"";let l=document.createElement("span");l.id="remainingTime",l.textContent="30";let s=document.createElement("div");s.classList.add("text-muted");let n=document.createElement("span");n.textContent=`${mdtLanguage.ClosingIn} `;let r=document.createElement("span");r.textContent=` ${mdtLanguage.ClosingSeconds}`,s.appendChild(n),s.appendChild(l),s.appendChild(r);let d=document.querySelector(".modal-footer"),o=document.getElementById("close-id-button");d.insertBefore(s,o);let c=30;!function e(){l.textContent=c,--c>=0?setTimeout(e,1e3):(i.modal("hide"),$.post("https://night_shifts/closeIDAndLicenseCard",JSON.stringify({})))}(),i.on("hidden.bs.modal",function(){$.post("https://night_shifts/closeIDAndLicenseCard",JSON.stringify({}))})}function getCivCount(){let e=0;for(let a of["police","ambulance","fire","tow"])e+=getCountByDepartment(shiftData,a);let t=(playerList.length??0)-e;return t}function getCountByDepartment(e,a){let t=0;return"civilian"!=a?$.each(e,function(e,i){i.userActiveDepartmentType===a&&t++}):$.each(e,function(e,i){!1===i.userIsOnShift&&i.userActiveDepartmentType===a&&t++}),t}function checkLength(e,a){(a.value.length??0)>e&&(a.value=a.value.slice(0,e))}function isValidDate(e){return!isNaN(new Date(e))}function getCurrentTime(){let e=new Date().toLocaleTimeString(timeFormat,{timeZone:timeZone});return e}function getCurrentDateTime(){let e=new Date,a=6e4*e.getTimezoneOffset(),t=new Date(e-a).toISOString();return t.slice(0,16)}function updateClock(){let e=getCurrentTime(),a=document.getElementById("mdt-clock");null!==a&&(a.textContent=e)}function DisplayActiveCall(e){let a=callData.filter(a=>a.id===e);if(a&&0===a.length){console.log("Filtered data is empty or not found, skipping displaying the active call.");return}let t=document.createElement("div");t.classList.add("card","noisy","border-primary","position-fixed","end-0","top-50","translate-middle-y","shadow-lg","p-3"),t.style.backgroundColor="rgba(0, 0, 0, 0.2)";let i=document.createElement("div");i.classList.add("card-body"),i.innerHTML=`

    ${a[0].emergency_type?mdtLanguage.EmergencyCall:mdtLanguage.NonEmergencyCall} ${mdtLanguage.CallID+a[0].id}

    ${mdtLanguage.CallRequiredUnits}
    ${a[0].police_required?`
    ${mdtLanguage.Police}
     `:""} ${a[0].ambulance_required?`
    ${mdtLanguage.Ambulance}
     `:""} ${a[0].fire_required?`
    ${mdtLanguage.Fire}
     `:""} ${a[0].tow_required?`
    ${mdtLanguage.Tow}
    `:""}

    ${mdtLanguage.EmergencyCallBy} ${a[0].callername}

    ${(()=>{let e=a[0].description,t=e.slice(0,500),i=[],l="";for(let s=0;s<(t.length??0);s++)(((l+=t[s]).length??0)>=50||s===(t.length??0)-1)&&(i.push(l),l="");let n=i.join("
    ")+((t.length??0)>1e3?"...":"");return n})()}


    ${mdtLanguage.CallDetails}
    • ${mdtLanguage.CallEmergencyType} ${a[0].emergency_type?mdtLanguage.CallEmergency:mdtLanguage.CallNonEmergency}
    • ${mdtLanguage.CallerPostal} ${a[0].postal}
    • ${mdtLanguage.CallerStreetName} ${a[0].street}
    • ${mdtLanguage.CallerAreaName} ${a[0].area}
    • ${mdtLanguage.ContactDetails}${a[0].contact_details}
    `,t.appendChild(i),document.body.appendChild(t),Array.isArray(a[0].calltrackedby)&&(a[0].calltrackedby.length??0)>0&&$.each(a[0].calltrackedby,function(a,t){a<15&&$("#popup_call_trackers_"+e).append(" "+t)}),updateActiveCallDisplayCountdown(),setTimeout(()=>{t.remove(),isDisplayingActiveCall=!1},15e3)}function updateActiveCallDisplayCountdown(){let e=document.getElementById("activecall_countdown_timer"),a=mdtData.DisplayActiveCallTimeout/1e3,t=setInterval(()=>{a--,e.textContent=a,a<=0&&clearInterval(t)},1e3)}function moveLoading(e,a){e.style.left=a.pageX+15+"px",e.style.top=a.pageY+"px"}function showLoading(){let e=document.getElementById("loading");e.style.display="block",document.addEventListener("mousemove",a=>moveLoading(e,a))}function hideLoading(){let e=document.getElementById("loading");e.style.display="none",setTimeout(()=>{document.removeEventListener("mousemove",a=>moveLoading(e,a))},2500)}function updateKeyboardInputIcon(e){let a=e,t=document.getElementById("mdt-keyboard-input");"green"===t.style.color&&(a=!1),t.style.color=a?"green":"#cccccc",$.post("https://night_shifts/toggleKeyInputOnNUIFocus",JSON.stringify({keepInput:a}))}function isRoleInManagement(e){return mdtData.ManagementRoles.includes(e)}function CheckManagementAccess(){return userRoles.some(e=>{if(isRoleInManagement(e))return!0})}function AddManagementPanelListener(){$("#manage-civilians").hide(),$("#manage-vehicles").hide(),$("#manage-properties").hide(),$("#manage-calls").hide(),$("a[data-target='#manage-civilians']").click(function(){$("#manage-civilians-section").empty(),$("#manage-civilians").show(),$("#manage-vehicles").hide(),$("#manage-properties").hide(),$("#manage-calls").hide(),allCivilianData.sort((e,a)=>a.id-e.id),$.each(allCivilianData,function(e,a){var t={id:a.id,profile_picture_url:a.profile_picture_url,first_name:a.first_name,last_name:a.last_name,dob:a.dob,gender:a.gender,email:a.email,phone_number:a.phone_number,address_line_1:a.address_line_1,address_line_2:a.address_line_2,city:a.city,state:a.state,postal_code:a.postal_code,country:a.country,occupation:a.occupation,nationality:a.nationality,license_car:a.license_car,license_bike:a.license_bike,license_truck:a.license_truck,license_boat:a.license_boat,license_pilot:a.license_pilot};$("#manage-civilians-section").append(`
    ${t.profile_picture_url?
    ${t.first_name} ${t.last_name}

    Born on ${new Date(t.dob).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.CitizenId}: ${t.id}
    • ${mdtLanguage.Gender}: ${t.gender}
    • ${mdtLanguage.Email}: ${t.email}
    • ${mdtLanguage.PhoneNumber}: ${t.phone_number}
    • ${mdtLanguage.Address}: ${t.address_line_1}
    • ${mdtLanguage.AddressType}: ${t.address_line_2}
    • ${mdtLanguage.City}: ${t.city}
    • ${mdtLanguage.State}: ${t.state}
    • ${mdtLanguage.PostalCode}: ${t.postal_code}
    • ${mdtLanguage.Country}: ${t.country}
    • ${mdtLanguage.Occupation}: ${t.occupation}
    • ${mdtLanguage.Nationality}: ${t.nationality}
    • ${mdtLanguage.CarLicense}: ${t.license_car?'':''}
    • ${mdtLanguage.BikeLicense}: ${t.license_bike?'':''}
    • ${mdtLanguage.TruckLicense}: ${t.license_truck?'':''}
    • ${mdtLanguage.BoatLicense}: ${t.license_boat?'':''}
    • ${mdtLanguage.PilotLicense}: ${t.license_pilot?'':''}
    `)}),$("#live-search-civilian").on("input",function(){var e=$(this).val().toLowerCase();if(""===e){displayCivilianData(allCivilianData);return}var a=allCivilianData.filter(function(a){return a.id.toString().includes(e)});displayCivilianData(a)})}),$("a[data-target='#manage-vehicles']").click(function(){$("#manage-vehicles-section").empty(),$("#manage-civilians").hide(),$("#manage-vehicles").show(),$("#manage-properties").hide(),$("#manage-calls").hide(),allVehicleData.sort((e,a)=>a.id-e.id),$.each(allVehicleData,function(e,a){var t={id:a.id,vehicle_picture_url:a.vehicle_picture_url,license_plate:a.license_plate,make:a.make,model:a.model,color:a.color,build_year:a.build_year,registration_date:a.registration_date,tax:a.tax,mot:a.mot,insurance:a.insurance,stolen:a.stolen,bolo:a.bolo,bolo_description:a.bolo_description,civ_id:a.civ_id},i=null;$.each(allCivilianData,function(e,a){var l=a.id;t.civ_id==l&&(i=a.first_name+" "+a.last_name)}),$("#manage-vehicles-section").append(`
    ${t.profile_picture_url?
    ${t.license_plate}


    ${mdtLanguage.RegisteredOn} ${new Date(t.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}.

    • ${mdtLanguage.OwnedBy}: ${i}
    • ${mdtLanguage.VehicleRegisterId}: ${t.id}
    • ${mdtLanguage.Make}: ${t.make}
    • ${mdtLanguage.Model}: ${t.model}
    • ${mdtLanguage.Color}: ${t.color}
    • ${mdtLanguage.BuildYear}: ${t.build_year}
    • ${mdtLanguage.TaxPaid} ${t.tax?'':''}
    • ${mdtLanguage.MoT} ${t.mot?'':''}
    • ${mdtLanguage.Insurance} ${t.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${t.stolen?'':''}
    `),$("#live-search-vehicles").on("input",function(){var e=$(this).val().toLowerCase();if(""===e){displayVehicleData(allVehicleData);return}var a=allVehicleData.filter(function(a){return a.id.toString().includes(e)});displayVehicleData(a)})})}),$("a[data-target='#manage-properties']").click(function(){$("#manage-properties-section").empty(),$("#manage-civilians").hide(),$("#manage-vehicles").hide(),$("#manage-properties").show(),$("#manage-calls").hide(),propertyData.sort((e,a)=>a.id-e.id),$.each(propertyData,function(e,a){var t=null,i=null;$.each(allCivilianData,function(e,l){var s=l.id;a.civ_id==s&&(t=`${l.first_name} ${l.last_name}`,i=s)}),$("#manage-properties-section").append(`
    ${a.property_picture_url?
    ${a.property_type}


    ${mdtLanguage.RegisteredOn} ${new Date(a.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}.

    • ${mdtLanguage.PropertyOwnedBy}: ${t} (${i})
    • ${mdtLanguage.PropertyRegisterId}: ${a.id}
    • ${mdtLanguage.PropertyAddress}: ${a.address}
    • ${mdtLanguage.PropertyHouseNumber}: ${a.house_number}
    • ${mdtLanguage.PropertyArea}: ${a.area}
    • ${mdtLanguage.PropertyPostalCode}: ${a.postal_code}
    • ${mdtLanguage.PropertyDescription}: ${a.description}
    • ${mdtLanguage.PropertyPrice}: ${mdtLanguage.Valuta}${a.price}
    • ${mdtLanguage.PropertyBuildYear}: ${a.year_built}
    • ${mdtLanguage.PropertyAmenities}: ${a.amenities}
    • ${mdtLanguage.PropertySeized} ${a.property_seized?'':''}
    `),$("#live-search-properties").on("input",function(){var e=$(this).val().toLowerCase();if(""===e){displayPropertyData(allPropertyData);return}var a=allPropertyData.filter(function(a){return a.id.toString().includes(e)});displayPropertyData(a)})})}),$("a[data-target='#manage-calls']").click(function(){$("#manage-calls-section").empty(),$("#manage-civilians").hide(),$("#manage-vehicles").hide(),$("#manage-properties").hide(),$("#manage-calls").show(),callData.sort((e,a)=>a.id-e.id),$.each(callData,function(e,a){$("#manage-calls-section").append(`
    ${a.emergency_type?mdtLanguage.EmergencyCall:mdtLanguage.NonEmergencyCall} ${mdtLanguage.CallID+a.id} ${a.archived_call?`(${mdtLanguage.ArchivedCall})`:""}

    ${mdtLanguage.EmergencyCallBy} ${a.callername}

    999
    ${mdtLanguage.CallRequiredUnits}
    ${a.police_required?`
    ${mdtLanguage.Police}
     `:""} ${a.ambulance_required?`
    ${mdtLanguage.Ambulance}
     `:""} ${a.fire_required?`
    ${mdtLanguage.Fire}
     `:""} ${a.tow_required?`
    ${mdtLanguage.Tow}
    `:""}
    ${mdtLanguage.CallDescription}

    ${a.description}

    ${mdtLanguage.CallDetails}
    • ${mdtLanguage.CallEmergencyType} ${a.emergency_type?mdtLanguage.CallEmergency:mdtLanguage.CallNonEmergency}
    • ${mdtLanguage.CallerPostal} ${a.postal}
    • ${mdtLanguage.CallerStreetName} ${a.street}
    • ${mdtLanguage.CallerAreaName} ${a.area}
    • ${mdtLanguage.ContactDetails}${a.contact_details}
    • ${mdtLanguage.CallUnits}
    `),Array.isArray(a.calltrackedby)&&(a.calltrackedby.length??0)>0&&$.each(a.calltrackedby,function(e,t){$("#call_trackers_"+a.id).append(" "+t)})}),$("#live-search-calls").on("input",function(){var e=$(this).val().toLowerCase();if(""===e){displayCallData(callData);return}var a=callData.filter(function(a){return a.id.toString().includes(e)});displayCallData(a)})}),$("a[data-target='#manage-civilians']").click()}function deleteCalls(e){e>callData.length&&(e=parseInt(callData.length)),$.post("https://night_shifts/destroyCalls",JSON.stringify({callAmount:e}))}function renderCivilianData(e){$.each(e,function(e,a){var t={id:a.id,profile_picture_url:a.profile_picture_url,first_name:a.first_name,last_name:a.last_name,dob:a.dob,gender:a.gender,email:a.email,phone_number:a.phone_number,address_line_1:a.address_line_1,address_line_2:a.address_line_2,city:a.city,state:a.state,postal_code:a.postal_code,country:a.country,occupation:a.occupation,nationality:a.nationality,license_car:a.license_car,license_bike:a.license_bike,license_truck:a.license_truck,license_boat:a.license_boat,license_pilot:a.license_pilot};$("#manage-civilians-section").append(`
    ${t.profile_picture_url?
    ${t.first_name} ${t.last_name}

    Born on ${new Date(t.dob).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}

    • ${mdtLanguage.CitizenId}: ${t.id}
    • ${mdtLanguage.Gender}: ${t.gender}
    • ${mdtLanguage.Email}: ${t.email}
    • ${mdtLanguage.PhoneNumber}: ${t.phone_number}
    • ${mdtLanguage.Address}: ${t.address_line_1}
    • ${mdtLanguage.AddressType}: ${t.address_line_2}
    • ${mdtLanguage.City}: ${t.city}
    • ${mdtLanguage.State}: ${t.state}
    • ${mdtLanguage.PostalCode}: ${t.postal_code}
    • ${mdtLanguage.Country}: ${t.country}
    • ${mdtLanguage.Occupation}: ${t.occupation}
    • ${mdtLanguage.Nationality}: ${t.nationality}
    • ${mdtLanguage.CarLicense}: ${t.license_car?'':''}
    • ${mdtLanguage.BikeLicense}: ${t.license_bike?'':''}
    • ${mdtLanguage.TruckLicense}: ${t.license_truck?'':''}
    • ${mdtLanguage.BoatLicense}: ${t.license_boat?'':''}
    • ${mdtLanguage.PilotLicense}: ${t.license_pilot?'':''}
    `)})}function displayCivilianData(e){$("#manage-civilians-section").empty(),renderCivilianData(e)}function renderVehicleData(e){$.each(e,function(e,a){var t={id:a.id,vehicle_picture_url:a.vehicle_picture_url,license_plate:a.license_plate,make:a.make,model:a.model,color:a.color,build_year:a.build_year,registration_date:a.registration_date,tax:a.tax,mot:a.mot,insurance:a.insurance,stolen:a.stolen,bolo:a.bolo,bolo_description:a.bolo_description,civ_id:a.civ_id},i=null;$.each(allCivilianData,function(e,a){var l=a.id;t.civ_id==l&&(i=a.first_name+" "+a.last_name)}),$("#manage-vehicles-section").append(`
    ${t.profile_picture_url?
    ${t.license_plate}


    ${mdtLanguage.RegisteredOn} ${new Date(t.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}.

    • ${mdtLanguage.OwnedBy}: ${i}
    • ${mdtLanguage.VehicleRegisterId}: ${t.id}
    • ${mdtLanguage.Make}: ${t.make}
    • ${mdtLanguage.Model}: ${t.model}
    • ${mdtLanguage.Color}: ${t.color}
    • ${mdtLanguage.BuildYear}: ${t.build_year}
    • ${mdtLanguage.TaxPaid} ${t.tax?'':''}
    • ${mdtLanguage.MoT} ${t.mot?'':''}
    • ${mdtLanguage.Insurance} ${t.insurance?'':''}
    • ${mdtLanguage.ReportedStolen} ${t.stolen?'':''}
    `)})}function displayVehicleData(e){$("#manage-vehicles-section").empty(),renderVehicleData(e)}function renderPropertyData(e){$.each(e,function(e,a){var t=null,i=null;$.each(allCivilianData,function(e,l){var s=l.id;a.civ_id==s&&(t=`${l.first_name} ${l.last_name}`,i=s)}),$("#manage-properties-section").append(`
    ${a.property_picture_url?
    ${a.property_type}


    ${mdtLanguage.RegisteredOn} ${new Date(a.registration_date).toLocaleDateString(timeFormat,{day:"2-digit",month:"2-digit",year:"numeric"})}.

    • ${mdtLanguage.PropertyOwnedBy}: ${t} (${i})
    • ${mdtLanguage.PropertyRegisterId}: ${a.id}
    • ${mdtLanguage.PropertyAddress}: ${a.address}
    • ${mdtLanguage.PropertyHouseNumber}: ${a.house_number}
    • ${mdtLanguage.PropertyArea}: ${a.area}
    • ${mdtLanguage.PropertyPostalCode}: ${a.postal_code}
    • ${mdtLanguage.PropertyDescription}: ${a.description}
    • ${mdtLanguage.PropertyPrice}: ${mdtLanguage.Valuta}${a.price}
    • ${mdtLanguage.PropertyBuildYear}: ${a.year_built}
    • ${mdtLanguage.PropertyAmenities}: ${a.amenities}
    • ${mdtLanguage.PropertySeized} ${a.property_seized?'':''}
    `)})}function displayPropertyData(e){$("#manage-properties-section").empty(),renderPropertyData(e)}function renderCallData(e){$.each(e,function(e,a){$("#manage-calls-section").append(`
    ${a.emergency_type?mdtLanguage.EmergencyCall:mdtLanguage.NonEmergencyCall} ${mdtLanguage.CallID+a.id} ${a.archived_call?`(${mdtLanguage.ArchivedCall})`:""}

    ${mdtLanguage.EmergencyCallBy} ${a.callername}

    999
    ${mdtLanguage.CallRequiredUnits}
    ${a.police_required?`
    ${mdtLanguage.Police}
     `:""} ${a.ambulance_required?`
    ${mdtLanguage.Ambulance}
     `:""} ${a.fire_required?`
    ${mdtLanguage.Fire}
     `:""} ${a.tow_required?`
    ${mdtLanguage.Tow}
    `:""}
    ${mdtLanguage.CallDescription}

    ${a.description}

    ${mdtLanguage.CallDetails}
    • ${mdtLanguage.CallEmergencyType} ${a.emergency_type?mdtLanguage.CallEmergency:mdtLanguage.CallNonEmergency}
    • ${mdtLanguage.CallerPostal} ${a.postal}
    • ${mdtLanguage.CallerStreetName} ${a.street}
    • ${mdtLanguage.CallerAreaName} ${a.area}
    • ${mdtLanguage.ContactDetails}${a.contact_details}
    • ${mdtLanguage.CallUnits}
    `),Array.isArray(a.calltrackedby)&&(a.calltrackedby.length??0)>0&&$.each(a.calltrackedby,function(e,t){$("#call_trackers_"+a.id).append(" "+t)})})}function displayCallData(e){$("#manage-calls-section").empty(),renderCallData(e)}function DestroyCall(e){$.post("https://night_shifts/destroyCall",JSON.stringify({CallIndex:e}))}function BuildMenu(){$("#menuwrappers").html(""),$("#menuwrappers").append(` `)}function BuildSideBar(){$.each(mdtData.MDTMenus,function(e,a){a.Show&&$("#sidemenu").append(``)})}function CheckAndAddMDTListeners(){!1===ListenersAdded&&(document.getElementById("helpbutton").addEventListener("click",function(){!0===helpMenuOpen?ToggleHelpMenu(!1):($("#helpmenucontainer").html(""),$("#helpmenucontainer").append(`
    ${helpMenuText.Header}
    • ${helpMenuText.Info1}

    • ${helpMenuText.Info2}

    • ${helpMenuText.Info3}

    • ${helpMenuText.Info4}

    `),ToggleHelpMenu(!0))}),document.getElementById("mdt-keyboard-input").addEventListener("click",function(){updateKeyboardInputIcon(!0)}),document.getElementById("exitbutton").addEventListener("click",function(){$.post("https://night_shifts/exitmdt",JSON.stringify({}))}),document.addEventListener("keyup",function(e){"Escape"===e.key&&$.post("https://night_shifts/exitmdt",JSON.stringify({}))}),ListenersAdded=!0)}function getCountByDepartmentIndex(e,a){return a[e]}updateClock(),setInterval(updateClock,1e3); \ No newline at end of file diff --git a/resources/night_shifts/NUI/sounds/anpralert.ogg b/resources/night_shifts/NUI/sounds/anpralert.ogg new file mode 100644 index 000000000..4fcb3073a Binary files /dev/null and b/resources/night_shifts/NUI/sounds/anpralert.ogg differ diff --git a/resources/night_shifts/NUI/sounds/firealarm.ogg b/resources/night_shifts/NUI/sounds/firealarm.ogg new file mode 100644 index 000000000..4a51afcbc Binary files /dev/null and b/resources/night_shifts/NUI/sounds/firealarm.ogg differ diff --git a/resources/night_shifts/NUI/sounds/notification_dispatch.ogg b/resources/night_shifts/NUI/sounds/notification_dispatch.ogg new file mode 100644 index 000000000..51a612aec Binary files /dev/null and b/resources/night_shifts/NUI/sounds/notification_dispatch.ogg differ diff --git a/resources/night_shifts/NUI/sounds/notification_emergency.ogg b/resources/night_shifts/NUI/sounds/notification_emergency.ogg new file mode 100644 index 000000000..4ac1ef81d Binary files /dev/null and b/resources/night_shifts/NUI/sounds/notification_emergency.ogg differ diff --git a/resources/night_shifts/NUI/sounds/notification_error.ogg b/resources/night_shifts/NUI/sounds/notification_error.ogg new file mode 100644 index 000000000..632e5d339 Binary files /dev/null and b/resources/night_shifts/NUI/sounds/notification_error.ogg differ diff --git a/resources/night_shifts/NUI/sounds/notification_success.ogg b/resources/night_shifts/NUI/sounds/notification_success.ogg new file mode 100644 index 000000000..853a65192 Binary files /dev/null and b/resources/night_shifts/NUI/sounds/notification_success.ogg differ diff --git a/resources/night_shifts/NUI/sounds/notification_warning.ogg b/resources/night_shifts/NUI/sounds/notification_warning.ogg new file mode 100644 index 000000000..0b64a8a75 Binary files /dev/null and b/resources/night_shifts/NUI/sounds/notification_warning.ogg differ diff --git a/resources/night_shifts/NUI/sounds/panicbutton.ogg b/resources/night_shifts/NUI/sounds/panicbutton.ogg new file mode 100644 index 000000000..fb2209576 Binary files /dev/null and b/resources/night_shifts/NUI/sounds/panicbutton.ogg differ diff --git a/resources/night_shifts/NUI/sounds/sepurabeep.ogg b/resources/night_shifts/NUI/sounds/sepurabeep.ogg new file mode 100644 index 000000000..5ae71a2db Binary files /dev/null and b/resources/night_shifts/NUI/sounds/sepurabeep.ogg differ diff --git a/resources/night_shifts/README.md b/resources/night_shifts/README.md new file mode 100644 index 000000000..c98c133d6 --- /dev/null +++ b/resources/night_shifts/README.md @@ -0,0 +1,8 @@ +# Night Shifts - MDT + +* Please visit https://docs.nights-software.com/resources/nightShifts/ for any support related questions. This is a step-by-step tutorial to install the resource correctly, use this! +* Or check out the video installation tutorial at Nights Software on Discord in channel: https://discord.com/channels/989438923925229598/1152361824554061824 +* To configure the resource, read ALL comments behind the variables in the config.lua: It has it's instructions included. (Use this program to edit the config files: https://code.visualstudio.com/download) +* For any other questions visit Nights Software on Discord: https://discord.com/invite/hA5u5PQR7k +* For updates and important information about these updates visit: https://discord.com/channels/989438923925229598/989479177847709716 +* No need to install database tables yourself. If you've correctly installed oxmysql, it will automatically create the tables on startup for you. diff --git a/resources/night_shifts/client/c_functions.lua b/resources/night_shifts/client/c_functions.lua new file mode 100644 index 000000000..fd1737125 --- /dev/null +++ b/resources/night_shifts/client/c_functions.lua @@ -0,0 +1,583 @@ +--============ POSTAL CODE INTEGRATION ============-- + +local raw = nil +local postals = nil +local nearestCalloutPostal = nil + +if Config.Enable_Nearest_Postal then + -- Use this, or adjust this to your postal system as an integration + raw = LoadResourceFile("nearest-postal", GetResourceMetadata("nearest-postal", 'postal_file')) + if raw == nil then + print("^1ERROR^7 Postal resource 'nearest-postal' file does not exist (is not installed or is renamed) or failed to load. Check https://docs.nights-software.com for installation support.") + else + postals = json.decode(raw) + end +end + +function getPostal(x, y) -- Editing this? Postals can not be anything other than numbers! + if Config.Enable_Nearest_Postal then + local theCalloutPostal = nil + if postals ~= nil then + local ndm = -1 -- nearest distance magnitude + local ni = -1 -- nearest index + for i, p in ipairs(postals) do + local dm = (x - p.x) ^ 2 + (y - p.y) ^ 2 -- distance magnitude + if ndm == -1 or dm < ndm then + ni = i + ndm = dm + end + end + --setting the nearest + if ni ~= -1 then + local nd = math.sqrt(ndm) -- nearest distance + nearestCalloutPostal = {i = ni, d = nd} + end + + local text = postals[nearestCalloutPostal.i].code, nearestCalloutPostal.d + theCalloutPostal = text + else + return "Unknown postal" + end + return theCalloutPostal + else + return "Unknown postal" + end +end + +--============ FUNCTIONS ============-- + +local notificationsEnabled = true +RegisterCommand(Config.Commands.ToggleNotifications, function(source, args) + notificationsEnabled = not notificationsEnabled + local status = notificationsEnabled and Config.Messages[Config.Language].Enabled or Config.Messages[Config.Language].Disabled + TriggerEvent("chatMessage", Config.Messages[Config.Language].ToggleNotifications .. status) +end) + +function notify(notificationText, notificationType, notificationIcon, notificationDirectionAndPosition, notificationDuration) + if not notificationsEnabled then return end + + exports.night_shifts:SystemNotify({ + text = notificationText, + type = notificationType, + icon = notificationIcon, + position = notificationDirectionAndPosition, + duration = notificationDuration + }) + -- Default: + -- SetNotificationTextEntry("STRING") + -- AddTextComponentString(notificationText) + -- DrawNotification(true, true) +end + +function firstToUpper(str) + return (str:gsub("^%l", string.upper)) +end + + +function PlaySound(file, vol) + SendNUIMessage({ + transactionType = 'playSound', + transactionFile = file, + transactionVolume = vol + }) +end + +function isUserPartOfRole(targetRoleName) + if #userRoles == 0 then return false end + for i, roleName in pairs(userRoles) do + if roleName == targetRoleName then + return true + end + end + return false +end + +function message(lineOne, lineTwo, lineThree, duration) + BeginTextCommandDisplayHelp("THREESTRINGS") + AddTextComponentSubstringPlayerName(lineOne) + AddTextComponentSubstringPlayerName(lineTwo or "") + AddTextComponentSubstringPlayerName(lineThree or "") + EndTextCommandDisplayHelp(0, false, true, duration or 5000) +end + +function GetRankName(userActiveDepartment) + local lastRankIndex = 0 + local userRank = nil + + -- Error fetch + local rankData = Config.MobileDataTerminal.DepartmentList[userActiveDepartment].DepartmentRanksAndRoles + if rankData == nil then + print("[night_shifts] ^1ERROR ^7No rank data found, the server owner must define at least one rank & discord role in the (sub)department section in config.lua.") + return "No rank found" + end + + for i, v in pairs(rankData) do + if i >= lastRankIndex and isUserPartOfRole(v.RoleName) then + lastRankIndex = i + userRank = v.RankName + end + end + + if userRank == nil then + return "No rank found" + end + + return userRank +end + +function GetMDTAccessLevel(userActiveDepartment) + local accessLevel = 1 + local rank = GetRankName(userActiveDepartment) + + -- Error fetch + local rankData = Config.MobileDataTerminal.DepartmentList[userActiveDepartment].DepartmentRanksAndRoles + if rankData == nil then + print("[night_shifts] ^1ERROR ^7No access level data found, the server owner must define at least one rank & discord role in the (sub)department section in config.lua.") + return accessLevel -- "No access level found" + end + + for i, v in pairs(Config.MobileDataTerminal.DepartmentList[userActiveDepartment].DepartmentRanksAndRoles) do + if v.RankName == rank then + accessLevel = v.AccessLevel + end + end + return accessLevel +end + +-- function IsMDTSuperUser() -- Future reference. +-- for i, roleName in pairs(Config.MobileDataTerminal.RolesWithSuperUserAccessToMDT) do +-- if isUserPartOfRole(roleName) then +-- return true +-- end +-- end +-- return false +-- end + +function find(t, predicate) + for i, v in ipairs(t) do + if predicate(v) then + return v + end + end +end + + +--==================== OPTIONAL SELF-DEVELOPMENT ====================-- + +function OnCheckHasUserMDTItem() + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + -- Build code here yourself. + return true +end + +function OnCheckHasUserMDTChargerItem() + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + -- Build code here yourself. + return true +end + +function OnCheckHasUserPhoneItem() + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + -- Build code here yourself. + return true +end + +function OnCheckIsUserConnectedToRadio() -- Used for checking if a person is connected to a radio channel. Allows the radio display to work if true (HUD). + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + -- Build code here yourself. + return true +end + +function OnReceivedEmergencyCall(data) + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + -- Build code here yourself. +end + +--==================== Discord Webhooks ====================-- + +local randomImagesExample = { + "https://assets.ea-rp.com/img/random_placeholder_1.png", + -- Add more here. +} +function OnUserStartedShift() + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + if player then + local departmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].DepartmentName + local subDepartmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].SubDepartments[PersonalData.userActiveSubDepartment].SubDepartmentName + local messageData = { + title = "SHIFT", + description = PersonalData.userCallsign.." has signed on shift.", + color = 60832, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = departmentName, + subjectdescription = subDepartmentName, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "shift", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnUserStoppedShift() + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + if player then + local departmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].DepartmentName + local subDepartmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].SubDepartments[PersonalData.userActiveSubDepartment].SubDepartmentName + local messageData = { + title = "SHIFT", + description = PersonalData.userCallsign.." has signed off shift.", + color = 14483456, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = departmentName, + subjectdescription = subDepartmentName, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "shift", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnUserPressedPanicButton() + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + if player then + local departmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].DepartmentName + local subDepartmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].SubDepartments[PersonalData.userActiveSubDepartment].SubDepartmentName + local messageData = { + title = "ALERT!", + description = PersonalData.userCallsign.." has pressed their panicbutton at "..PersonalData.userCurrentStreetName..". Postal: "..PersonalData.userCurrentPostal, + color = 16711680, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = departmentName, + subjectdescription = subDepartmentName, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "panic", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnUserSelectedStatus() + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + if player then + local departmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].DepartmentName + local subDepartmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].SubDepartments[PersonalData.userActiveSubDepartment].SubDepartmentName + local messageData = { + title = "STATUS UPDATE", + description = PersonalData.userCallsign.." has reported status "..PersonalData.userStatusCode.." "..PersonalData.userStatusName, + color = 4952725, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = departmentName, + subjectdescription = subDepartmentName, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "status", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnUserCalledEmergencyServices(data) + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + if player then + local messageData = { + title = "EMERGENCY HOTLINE", + description = "Incoming call", + color = 4952725, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = data.street.." at "..data.postal, + subjectdescription = data.description, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "incomingcall", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnUserTrackingCall(call_id) + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + if player then + local departmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].DepartmentName + local subDepartmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].SubDepartments[PersonalData.userActiveSubDepartment].SubDepartmentName + local messageData = { + title = "CALL RESPONSE", + description = PersonalData.userCallsign.." has attached to call #"..call_id, + color = 4952725, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = departmentName, + subjectdescription = subDepartmentName, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "trackcall", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnUserRequestedBackup(department) + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + local deptString + if department == 'police' then + deptString = Config.MobileDataTerminal.DepartmentList[1].DepartmentName + elseif department == 'ambulance' then + deptString = Config.MobileDataTerminal.DepartmentList[2].DepartmentName + elseif department == 'fire' then + deptString = Config.MobileDataTerminal.DepartmentList[3].DepartmentName + end + if player then + local departmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].DepartmentName + local subDepartmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].SubDepartments[PersonalData.userActiveSubDepartment].SubDepartmentName + local messageData = { + title = "BACKUP REQUEST", + description = PersonalData.userCallsign.." is requesting backup from: "..deptString.." at "..PersonalData.userCurrentStreetName..". Postal: "..PersonalData.userCurrentPostal, + color = 16737820, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = departmentName, + subjectdescription = subDepartmentName, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "backup", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnPersonSighted(sighted_person_name) + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + local deptString + if department == 'police' then + deptString = Config.MobileDataTerminal.DepartmentList[1].DepartmentName + elseif department == 'ambulance' then + deptString = Config.MobileDataTerminal.DepartmentList[2].DepartmentName + elseif department == 'fire' then + deptString = Config.MobileDataTerminal.DepartmentList[3].DepartmentName + end + if player then + local departmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].DepartmentName + local subDepartmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].SubDepartments[PersonalData.userActiveSubDepartment].SubDepartmentName + local messageData = { + title = "Sighted Person", + description = PersonalData.userCallsign.." has reporting sighting of: "..sighted_person_name.." at "..PersonalData.userCurrentStreetName..". Postal: "..PersonalData.userCurrentPostal, + color = 15304735, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = departmentName, + subjectdescription = subDepartmentName, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "sightedperson", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnVehicleSighted(plate) + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + local deptString + if department == 'police' then + deptString = Config.MobileDataTerminal.DepartmentList[1].DepartmentName + elseif department == 'ambulance' then + deptString = Config.MobileDataTerminal.DepartmentList[2].DepartmentName + elseif department == 'fire' then + deptString = Config.MobileDataTerminal.DepartmentList[3].DepartmentName + end + if player then + local departmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].DepartmentName + local subDepartmentName = Config.MobileDataTerminal.DepartmentList[PersonalData.userActiveDepartment].SubDepartments[PersonalData.userActiveSubDepartment].SubDepartmentName + local messageData = { + title = "Sighted Vehicle", + description = PersonalData.userCallsign.." has reporting sighting of a vehicle with plate: "..plate.." at "..PersonalData.userCurrentStreetName..". Postal: "..PersonalData.userCurrentPostal, + color = 15304735, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = departmentName, + subjectdescription = subDepartmentName, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "sightedvehicle", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end + +function OnANPRHit(plate) + if Config.Enable_Discord_Webhooks then + local ped = PlayerPedId() + local playerServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(ped)) + local player = find(playerList, function(p) return p.id == playerServerId end) + local deptString + if department == 'police' then + deptString = Config.MobileDataTerminal.DepartmentList[1].DepartmentName + elseif department == 'ambulance' then + deptString = Config.MobileDataTerminal.DepartmentList[2].DepartmentName + elseif department == 'fire' then + deptString = Config.MobileDataTerminal.DepartmentList[3].DepartmentName + end + if player then + local messageData = { + title = "ANPR", + description = "The ANPR system registered a hit!", + color = 15304735, -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html (Decimal colors is what this requires, so the one with numbers only) + authorname = player.discordMember.name, + authoravatarurl = player.discordMember.avatar, + + sender = "Sender", + senderdiscordid = player.discordMember.id, + + subjecttitle = "Plate: "..plate, + subjectdescription = PersonalData.userCurrentStreetName.." at postal: "..PersonalData.userCurrentPostal, + + footer = "Night Shifts - MDT by Nights Software", + footericon = "https://assets.ea-rp.com/ns_logo_placeholder.png", + + thumbnail = "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + image = randomImagesExample[math.random(#randomImagesExample)], + + discordwebhookurltype = "anprhit", + systemname = "MDT - System", + } + TriggerServerEvent("night_shifts:sendDiscordEmbedMessage", messageData) + end + end +end diff --git a/resources/night_shifts/client/client.lua b/resources/night_shifts/client/client.lua new file mode 100644 index 000000000..a65bfc7da Binary files /dev/null and b/resources/night_shifts/client/client.lua differ diff --git a/resources/night_shifts/client/client_cache.lua b/resources/night_shifts/client/client_cache.lua new file mode 100644 index 000000000..5ed4a0286 Binary files /dev/null and b/resources/night_shifts/client/client_cache.lua differ diff --git a/resources/night_shifts/client/client_connect.lua b/resources/night_shifts/client/client_connect.lua new file mode 100644 index 000000000..41d983324 Binary files /dev/null and b/resources/night_shifts/client/client_connect.lua differ diff --git a/resources/night_shifts/client/client_exports.lua b/resources/night_shifts/client/client_exports.lua new file mode 100644 index 000000000..898786b16 --- /dev/null +++ b/resources/night_shifts/client/client_exports.lua @@ -0,0 +1,146 @@ +--====================== EXPORTS ======================-- + +-- Example Usage: +-- exports.night_shifts:TriggerAlarm(isEmergency --[[ bool ]], isPoliceRequired --[[ bool ]], isAmbulanceRequired --[[ bool ]], isFireRequired --[[ bool ]], isTowRequired --[[ bool ]], description --[[ string ]], coordinates --[[ Vector3 ]], isSilent --[[ bool ]]) +-- exports.night_shifts:CreateEmergencyCall(isEmergency --[[ bool ]], isPoliceRequired --[[ bool ]], isAmbulanceRequired --[[ bool ]], isFireRequired --[[ bool ]], isTowRequired --[[ bool ]], description --[[ string ]], caller_name --[[ string ]], coordinates --[[ Vector3 ]], contact_details --[[ string ]]) + +function TriggerAlarm(isEmergency, isPoliceRequired, isAmbulanceRequired, isFireRequired, isTowRequired, description, coordinates, isSilent) + local fullAddress = GetCurrentStreetName(coordinates.x, coordinates.y, coordinates.z) + local zone = tostring(GetNameOfZone(coordinates.x, coordinates.y, coordinates.z)) + local currentZone = Zones[zone] + local newData = { + fullAddress = fullAddress or "Unknown", + currentZone = currentZone or "Unknown", + postal = getPostal(coordinates.x, coordinates.y) or Config.Messages[Config.Language].Unknown, + } + + local data = { + emergency_type = isEmergency or false, + police_required = isPoliceRequired or false, + ambulance_required = isAmbulanceRequired or false, + fire_required = isFireRequired or false, + tow_required = isTowRequired or false, + description = description or Config.Messages[Config.Language].Unknown, + area = newData.currentZone or Config.Messages[Config.Language].Unknown, + postal = newData.postal or Config.Messages[Config.Language].Unknown, + street = newData.fullAddress or Config.Messages[Config.Language].Unknown, + contact_details = Config.Messages[Config.Language].Unknown, + callername = Config.Messages[Config.Language].AutomaticAlarm, + calltrackedby = json.encode({}), -- Emtpy, because it's a new call. + call_coords_x = coordinates.x or 0.0, + call_coords_y = coordinates.y or 0.0, + call_coords_z = coordinates.z or 0.0, + archived_call = false, + is_silent = isSilent or false + } + TriggerServerEvent("night_shifts:999", data) +end + +exports('TriggerAlarm', TriggerAlarm) + +function CreateEmergencyCall(isEmergency, isPoliceRequired, isAmbulanceRequired, isFireRequired, isTowRequired, description, caller_name, coordinates, contact_details) + local fullAddress = GetCurrentStreetName(coordinates.x, coordinates.y, coordinates.z) + local zone = tostring(GetNameOfZone(coordinates.x, coordinates.y, coordinates.z)) + local currentZone = Zones[zone] + local newData = { + fullAddress = fullAddress or "Unknown", + currentZone = currentZone or "Unknown", + postal = getPostal(coordinates.x, coordinates.y) or Config.Messages[Config.Language].Unknown, + } + + local data = { + emergency_type = isEmergency or false, + police_required = isPoliceRequired or false, + ambulance_required = isAmbulanceRequired or false, + fire_required = isFireRequired or false, + tow_required = isTowRequired or false, + description = description or Config.Messages[Config.Language].Unknown, + area = newData.currentZone or Config.Messages[Config.Language].Unknown, + postal = newData.postal or Config.Messages[Config.Language].Unknown, + street = newData.fullAddress or Config.Messages[Config.Language].Unknown, + contact_details = contact_details or Config.Messages[Config.Language].Unknown, + callername = caller_name or Config.Messages[Config.Language].Unknown, + calltrackedby = json.encode({}), -- Emtpy, because it's a new call. + call_coords_x = coordinates.x or 0.0, + call_coords_y = coordinates.y or 0.0, + call_coords_z = coordinates.z or 0.0, + archived_call = false, + is_silent = false + } + TriggerServerEvent("night_shifts:999", data) +end + +exports('CreateEmergencyCall', CreateEmergencyCall) + +--=================== COUNTERS FOR SERVICES BY TYPE (not for specific departments) ===================-- + +function GetCivilianCount() + local totalCount = 0 + totalCount = totalCount + exports.night_shifts:GetPoliceCount() + totalCount = totalCount + exports.night_shifts:GetAmbulanceCount() + totalCount = totalCount + exports.night_shifts:GetFireCount() + totalCount = totalCount + exports.night_shifts:GetTowCount() + local civCount = #playerList - totalCount + return civCount +end + +exports('GetCivilianCount', GetCivilianCount) + +function GetPoliceCount() + local count = 0 + for k, v in pairs(cacheData.cached_shift_data_client) do + if v.userActiveDepartmentType == "police" then + count = count + 1 + end + end + return count +end + +exports('GetPoliceCount', GetPoliceCount) + +function GetAmbulanceCount() + local count = 0 + for k, v in pairs(cacheData.cached_shift_data_client) do + if v.userActiveDepartmentType == "ambulance" then + count = count + 1 + end + end + return count +end + +exports('GetAmbulanceCount', GetAmbulanceCount) + +function GetFireCount() + local count = 0 + for k, v in pairs(cacheData.cached_shift_data_client) do + if v.userActiveDepartmentType == "fire" then + count = count + 1 + end + end + return count +end + +exports('GetFireCount', GetFireCount) + +function GetTowCount() + local count = 0 + for k, v in pairs(cacheData.cached_shift_data_client) do + if v.userActiveDepartmentType == "tow" then + count = count + 1 + end + end + return count +end + +exports('GetTowCount', GetTowCount) + +-- function TestEmergencyServiceCounts() +-- print("Testing emergency service counts:") +-- print("Civilian count:", exports.night_shifts:GetCivilianCount()) +-- print("Police count:", exports.night_shifts:GetPoliceCount()) +-- print("Ambulance count:", exports.night_shifts:GetAmbulanceCount()) +-- print("Fire count:", exports.night_shifts:GetFireCount()) +-- print("Tow count:", exports.night_shifts:GetTowCount()) +-- end + +-- RegisterCommand("emscounts", TestEmergencyServiceCounts) \ No newline at end of file diff --git a/resources/night_shifts/config/anpr_config.lua b/resources/night_shifts/config/anpr_config.lua new file mode 100644 index 000000000..29ab9f566 --- /dev/null +++ b/resources/night_shifts/config/anpr_config.lua @@ -0,0 +1,113 @@ +Config = Config or {} + +--====================== ANPR CONFIG =====================-- + +-- Static Camera ANPR +Config.ANPRSendMessageToMarkedPerson = true -- Do you want to send an alert to the one being spotted by ANPR? (» Message variable: SeenByANPR) +Config.TimeToDeleteANPRBlip = 60 -- Seconds +Config.ANPRBlipSpriteId = 184 -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips +Config.ANPRBlipText = "ANPR: " -- License plate follows. +Config.ANPRBlipColor = 1 -- This is a color ID: https://docs.fivem.net/docs/game-references/blips/#blip-colors +Config.ANPRBlipFlashes = true -- Does the blip flash or not +Config.ANPRBlipScale = 0.9 -- This is the blip scale: 0.1 (smallest) 1.0 (default) + +-- Vehicle ANPR +Config.DisplayANPRHUD = true -- False disables the ANPR in vehicles. +Config.ANPRSignalSoundFile = "anpralert" -- Upload your .ogg sound file to night_shifts/NUI/sounds/panicbutton.ogg, mention just the name without .ogg here +Config.ANPRSignalSoundFileVolume = 0.25 -- This is at your own risk and Nights Software is not liable for any damage caused by you changing this setting. (Limited to 1.0) +Config.VehicleANPRRange = 100.0 -- GTA Meters. +Config.TimeToUnlockANPR = 20 -- Seconds to unlock the ANPR after scanning a plate registered in the ANPR. +Config.ANPRVehicles = { -- Define vehicle spawn model names to fit ANPR in them. The system checks for the first 4 characters to match. + "police", + "police2", + "tskodae", + -- Add more here: "example", +} + +Config.ANPRCameraLocations = { + + -- Note: Keep in mind your index ([1], [2], [3]) numbers should follow up in the correct counting order. + -- Note: These locations are based on non-existent cameras. You can change the locations if you desire and adjust it to your cameras in-game, or pick random locations. The one below is based of a camera script by LondonStudios (averagespeedcam) + + [1] = {coords = vector3(444.9829, -1056.5446, 31.3127), radius = 25.0}, + [2] = {coords = vector3(661.3218, -1029.9957, 36.3579), radius = 25.0}, + [3] = {coords = vector3(658.3356, -1005.5438, 36.4008), radius = 25.0}, + [4] = {coords = vector3(473.5020, -1028.5477, 34.1334), radius = 25.0}, + [5] = {coords = vector3(350.6205, -432.3000, 44.7901), radius = 25.0}, + [6] = {coords = vector3(455.8097, -361.8786, 46.9817), radius = 25.0}, + [7] = {coords = vector3(-107.5178, -81.6130, 57.0629), radius = 25.0}, + [8] = {coords = vector3(-212.0237, -46.2460, 50.1804), radius = 25.0}, + [9] = {coords = vector3(-434.3381, -283.4631, 36.0121), radius = 25.0}, + [10] = {coords = vector3(-335.0393, -355.0107, 30.2856), radius = 25.0}, + + [11] = {coords = vector3(-360.4594, -375.5770, 30.8645), radius = 25.0}, + [12] = {coords = vector3(-506.1383, -357.3091, 35.1580), radius = 25.0}, + [13] = {coords = vector3(-650.4554, -695.4469, 30.4144), radius = 25.0}, + [14] = {coords = vector3(-649.7978, -797.1583, 24.9874), radius = 25.0}, + [15] = {coords = vector3(-75.2298, 60.6948, 71.8627), radius = 25.0}, + [16] = {coords = vector3(-185.1800, 123.1297, 69.9262), radius = 25.0}, + [17] = {coords = vector3(-260.5720, 134.1356, 69.1722), radius = 25.0}, + [18] = {coords = vector3(-362.3298, 135.8256, 66.3131), radius = 25.0}, + [19] = {coords = vector3(-353.7046, 115.8156, 66.5841), radius = 25.0}, + [20] = {coords = vector3(-251.8915, 114.5057, 69.4023), radius = 25.0}, + + [21] = {coords = vector3(-190.1297, 103.9687, 69.9844), radius = 25.0}, + [22] = {coords = vector3(-129.3595, 68.5297, 71.1034), radius = 25.0}, + [23] = {coords = vector3(438.5699, -340.9151, 47.5607), radius = 25.0}, + [24] = {coords = vector3(373.3358, -387.0987, 46.2673), radius = 25.0}, + [25] = {coords = vector3(-60.3057, -1625.9524, 29.3500), radius = 25.0}, + [26] = {coords = vector3(-122.7689, -1700.6539, 29.3901), radius = 25.0}, + [27] = {coords = vector3(-490.5338, -1884.6572, 17.1263), radius = 25.0}, + [28] = {coords = vector3(-657.2271, -2048.9219, 15.8765), radius = 25.0}, + [29] = {coords = vector3(-697.5451, -2132.6316, 12.9239), radius = 25.0}, + [30] = {coords = vector3(-509.1899, -1937.0714, 16.2717), radius = 25.0}, + + [31] = {coords = vector3(-525.4942, -1759.4008, 21.4763), radius = 25.0}, + [32] = {coords = vector3(-631.4293, -1682.3999, 24.8544), radius = 25.0}, + [33] = {coords = vector3(-648.3516, -1686.1282, 25.0921), radius = 25.0}, + [34] = {coords = vector3(-535.0145, -1770.5436, 21.4531), radius = 25.0}, + [35] = {coords = vector3(-2210.8735, -329.9511, 13.2849), radius = 25.0}, + [36] = {coords = vector3(-2443.3113, -213.9013, 16.6510), radius = 25.0}, + [37] = {coords = vector3(100.0, 100.0, 100.0), radius = 25.0}, + [38] = {coords = vector3(-3078.5261, 789.5964, 19.5776), radius = 25.0}, + [39] = {coords = vector3(-3110.7920, 1036.3386, 19.7748), radius = 25.0}, + [40] = {coords = vector3(-2687.4712, 2344.3611, 16.9748), radius = 25.0}, + + [41] = {coords = vector3(-2540.8560, 3409.2993, 13.2609), radius = 25.0}, + [42] = {coords = vector3(-2023.4358, 4480.2866, 56.9937), radius = 25.0}, + [43] = {coords = vector3(-1747.9795, 4750.9492, 57.1458), radius = 25.0}, + [44] = {coords = vector3(-659.8248, 5547.4185, 38.5107), radius = 25.0}, + [45] = {coords = vector3(-511.0099, 5789.7144, 35.2438), radius = 25.0}, + [46] = {coords = vector3(1578.3236, 6390.5654, 25.3150), radius = 25.0}, + [47] = {coords = vector3(1955.3367, 6180.5122, 45.3713), radius = 25.0}, + [48] = {coords = vector3(2630.0645, 5060.2798, 44.7457), radius = 25.0}, + [49] = {coords = vector3(2693.4573, 4807.2515, 44.4928), radius = 25.0}, + [50] = {coords = vector3(2901.0281, 3812.6240, 52.6259), radius = 25.0}, + + [51] = {coords = vector3(2817.9675, 3523.1821, 54.3887), radius = 25.0}, + [52] = {coords = vector3(1768.6747, 2124.3477, 64.6199), radius = 25.0}, + [53] = {coords = vector3(1713.0435, 1642.7545, 82.6449), radius = 25.0}, + [54] = {coords = vector3(895.6431, 206.2509, 76.9157), radius = 25.0}, + [55] = {coords = vector3(698.2474, -97.5875, 54.6997), radius = 25.0}, + [56] = {coords = vector3(753.5383, -89.0521, 55.7270), radius = 25.0}, + [57] = {coords = vector3(967.6284, 219.2735, 78.5446), radius = 25.0}, + [58] = {coords = vector3(1726.4495, 1525.2784, 84.6828), radius = 25.0}, + [59] = {coords = vector3(1925.5909, 2426.2825, 54.5445), radius = 25.0}, + [60] = {coords = vector3(2838.6582, 3503.5039, 54.4947), radius = 25.0}, + + [61] = {coords = vector3(2928.4038, 3810.8823, 52.5231), radius = 25.0}, + [62] = {coords = vector3(2699.7864, 4808.2485, 44.4659), radius = 25.0}, + [63] = {coords = vector3(2640.6008, 5072.4487, 44.7297), radius = 25.0}, + [64] = {coords = vector3(-1388.2404, 5111.3306, 60.8053), radius = 25.0}, + [65] = {coords = vector3(-1780.3440, 4752.9419, 57.0219), radius = 25.0}, + [66] = {coords = vector3(-1018.0430, -2475.6028, 20.1693), radius = 25.0}, + [67] = {coords = vector3(-2554.3157, 3469.7424, 13.5039), radius = 25.0}, + [68] = {coords = vector3(-2716.2976, 2351.6921, 16.7254), radius = 25.0}, + [69] = {coords = vector3(-3012.1589, 604.9083, 19.9052), radius = 25.0}, + [70] = {coords = vector3(-3041.8799, 262.987, 15.8275), radius = 25.0}, + + [71] = {coords = vector3(-2409.8367, -268.4828, 15.2493), radius = 25.0}, + [72] = {coords = vector3(-2242.6208, -358.1303, 13.3232), radius = 25.0}, + [73] = {coords = vector3(-469.5535, -542.7756, 25.3255), radius = 25.0}, + [74] = {coords = vector3(-119.566, -540.8381, 30.3053), radius = 25.0}, +} \ No newline at end of file diff --git a/resources/night_shifts/config/config.lua b/resources/night_shifts/config/config.lua new file mode 100644 index 000000000..177252461 --- /dev/null +++ b/resources/night_shifts/config/config.lua @@ -0,0 +1,404 @@ +Config = Config or {} + +--====================== BEFORE YOU START ======================-- +-- Hi. Thanks for choosing Nights Software. This script has a lot of configuration options, we recommend you to try it out after doing the basic setup and before changing it all to your preferences. +-- The reason for this is that we want you to test your edits one by one, to prevent us having an overload of support tickets for things you can resolve yourself. If you still need help, contact us via discord. +-- Might you encounter issues, this is not a reason to worry. We trial and error every hour, every day. Let us know your issue (in detail) and we can most likely provide a solution or fix. +-- We really hope this resource provides you what many resources could not and that this opens a world to your community. We're proud to have you as a customer and appreciate your feedback. Get in touch! + +-- Code written with passion by Nights Software +-- Installation & documentation: https://docs.nights-software.com +-- Discord: https://discord.nights-software.com +-- Store: https://store.nights-software.com +-- Hint: Use CNTL + F in Visual Studio Code to find variables: https://code.visualstudio.com/download (Use this program to edit this file!) + +Config = { + + ConfigVersion = "0.11.8", + + -- Hint: Read the comments when configuring! Relax, it's easier when you read! + + --====================== Debug ======================-- + + Debug = false, -- Debug shows developer & testing info, recommended to set to false when you are ready to use it in production AFTER installation :) + + --==================== Settings ====================-- + + Language = "en", -- Options: "en" | "nl" | "de" | "fr" | "pl" + Timezone = "Europe/London", -- Set the timezone for the MDT. https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + TimeFormat = "en-GB", -- en-US, fr-FR, de-DE etc. + KMHorMPH = "MPH", -- "KMH" or "MPH" + + Enable_Discord_API = true, -- You need the discord API for this script, otherwise it will not work https://store.nights-software.com/package/5035729 [FREE] Included in the Tebex package. + Enable_Nearest_Postal = false, -- Nearest-postal integration, if false it will always return "Unknown" on postals. (CFX Post: https://forum.cfx.re/t/release-nearest-postal-script/293511) Edit getPostal(x,y) in c_functions.lua if you desire to integrate your own postal system. + Enable_MDT_Battery_System = true, -- Set to false to disable the battery system, if disabled it'll always stay 100%. Charging can be done in vehicles and interiors + DefaultSoundVolume = 0.15, -- Used for notifications. Higher than 0.5 will set it to 0.25, limited to protect ears + Enable_Discord_Webhooks = true, -- Set your webhook URL in s_functions.lua, edit your preferences for these messages in c_functions.lua and s_functions.lua + Enable_Blips = true, -- Allow this system to add blips for backup requests, panic buttons, sighting reports, ANPR hits etc. + Enable_Unit_Blips = true, -- Allow this system to add blips for active units on map. + Enable_Save_Callsigns = true, -- If true it will set the last used callsign. If false it will use the config pre-set callsigns for departments & sub-departments. + Enable_ERS = true, -- Optional PVE gamemode: https://store.nights-software.com/category/ersgamemode (Enables MDT integration with the gamemode, make sure to have this installed as night_ers) + KickMissingIdentifiers = false, -- If users without a fivem/discord identifier should be kicked upon joining + + -- OPTIONAL SETTINGS: write the functionalities yourself in c_functions or s_functions.lua! (Developers only, don't touch this if you are not a developer. Nights Software does not provide support for custom script edits) + Enable_CheckForMDTItemInInventory = true, -- client/c_functions.lua + Enable_CheckForMDTChargerItemInInventory = true, -- client/c_functions.lua + Enable_CheckForPhoneInInventory = true, -- client/c_functions.lua + + --====================== Commands, HotKeys & Buttons ======================-- + + Enable_Commands = true, -- Allow Commands? + Commands = { + MobileDataTerminal = "mdt", -- Syntax: /mdt | Open the MDT + CallEmergencies = "999", -- Syntax: /999 | Open emergency hotline call system + ChargeMDT = "chargemdt", -- Syntax: /chargemdt | Charges the MDT, can be done in vehicles and interiors + StatusChange = "status", -- Syntax: /status 10-42 or /status 2, depends on what you define as statuses. + ForceCloseMDT = "forceclosemdt", -- Syntax: /forceclosemdt or use F8 and type it without the slash. + RadioTransmission = "radiotransmission", -- Command is unused, leave this: only used for the hud icon color toggle upon pressing the hotkey for RadioTransmission. + + -- v0.9.4 + ShowIDAndLicenses = "showid", -- Syntax: /showid (most nearby player) + DisplayActiveCall = "opencall", -- Syntax: /opencall (uses active call ID) + + -- v0.9.7 + ToggleANPR = "toggleanpr", -- Syntax: /toggleanpr | Enables/Disables the in-vehicle ANPR (HUD) during gameplay. + + -- v0.9.10 + ToggleNotifications = "togglenotifs", -- Disables the "notify" function in c_functions.lua, which is dangerous because it shares important information with the player in relation to the MDT. + }, + + Enable_HotKeys = true, -- See this link for hotkey names » https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ & https://docs.fivem.net/natives/?_0xD7664FD1 + HotKeys = { -- » This uses RegisterKeyMapping(commandString --[[ string ]], description --[[ string ]], defaultMapper --[[ string ]], defaultParameter --[[ string ]]) + MobileDataTerminal = "F10", -- F10 » (Edit message variable in translations.lua: 'NewIncidentReceived' accordingly when you edit this) + CallEmergencies = "F3", -- F3 + ChargeMDT = "F11", -- F11 + ForceCloseMDT = "ESCAPE", -- ESCAPE + RadioTransmission = "CAPITAL", -- CAPSLOCK (The key you want as default for talking over a radio. People can change it clientside via the FiveM Keybind Settings) + + -- v0.9.4 + ShowIDAndLicenses = "F4", -- Syntax: /showid (most nearby player) + DisplayActiveCall = "TAB", -- TAB + + -- Accept/decline ID requests -- (https://docs.fivem.net/docs/game-references/controls/) + BrowseLeft = 307, -- Arrow Left + BrowseRight = 308, -- Arrow Right + SubmitBtn = 51, -- E + CancelBtn = 177, -- BACKSPACE / ESC / RIGHT MOUSE BUTTON + + }, + + Buttons = { -- MATCH THESE TO THE HOTKEYS (https://docs.fivem.net/docs/game-references/controls/) + BrowseLeft = "~INPUT_REPLAY_BACK~", + BrowseRight = "~INPUT_REPLAY_ADVANCE~", + SubmitBtn = "~INPUT_CONTEXT~", + CancelBtn = "~INPUT_CELLPHONE_CANCEL~", + }, + + --====================== Reports =====================-- + -- Mind the [1], [2], [3] indexes, which need to be ordered! You may add or remove reports. + + OperationReports = { + Police = { + [1] = {ReportName = "Incident"}, + [2] = {ReportName = "Vehicle seizure"}, + [3] = {ReportName = "Missing person"}, + [4] = {ReportName = "Domestic violence"}, + [5] = {ReportName = "Vandalism"}, + [6] = {ReportName = "Assault"}, + [7] = {ReportName = "Burglary"}, + [8] = {ReportName = "Theft"}, + [9] = {ReportName = "Fraud"}, + [10] = {ReportName = "Cybercrime"}, + [11] = {ReportName = "Repeated offender"}, + [12] = {ReportName = "Terrorism"}, + [13] = {ReportName = "Major Incident"}, + [14] = {ReportName = "Other..."}, + }, + Medical = { + [1] = {ReportName = "Incident"}, + [2] = {ReportName = "Patient"}, + [3] = {ReportName = "Cardiac arrest"}, + [4] = {ReportName = "Stroke"}, + [5] = {ReportName = "Allergic reaction"}, + [6] = {ReportName = "Seizure"}, + [7] = {ReportName = "Poisoning"}, + [8] = {ReportName = "High fever"}, + [9] = {ReportName = "Breathing difficulties"}, + [10] = {ReportName = "Other..."}, + }, + Fire = { + [1] = {ReportName = "Incident"}, + [2] = {ReportName = "Fire"}, + [3] = {ReportName = "Hazardous materials"}, + [4] = {ReportName = "Gas leak"}, + [5] = {ReportName = "Building collapse"}, + [6] = {ReportName = "Explosion"}, + [7] = {ReportName = "Maintenance"}, + [8] = {ReportName = "Other..."}, + } + }, + + --====================== REAL ESTATE & TRANSLATIONS =====================-- + + Enable_Property_Blips = true, + PropertyTypes = { + [1] = {PropertyType = "House"}, + [2] = {PropertyType = "Apartment"}, + [3] = {PropertyType = "Floor"}, + [4] = {PropertyType = "Office"}, + [5] = {PropertyType = "Warehouse"}, + [6] = {PropertyType = "Factory"}, + [7] = {PropertyType = "Retail Space"}, + [8] = {PropertyType = "Condo"}, + [9] = {PropertyType = "Townhouse"}, + [10] = {PropertyType = "Villa"}, + [11] = {PropertyType = "Duplex"}, + [12] = {PropertyType = "Loft"}, + [13] = {PropertyType = "Studio"}, + [14] = {PropertyType = "Penthouse"}, + [15] = {PropertyType = "Cottage"}, + [16] = {PropertyType = "Bungalow"}, + [17] = {PropertyType = "Farmhouse"}, + [18] = {PropertyType = "Mansion"}, + [19] = {PropertyType = "Mobile Home"}, + [20] = {PropertyType = "Hotel"}, + [21] = {PropertyType = "Hostel"}, + [22] = {PropertyType = "Resort"}, + [23] = {PropertyType = "Guesthouse"}, + [24] = {PropertyType = "Cabin"}, + [25] = {PropertyType = "Chalet"}, + [26] = {PropertyType = "Commercial Building"}, + [27] = {PropertyType = "Mixed-Use Property"}, + [28] = {PropertyType = "Storage Unit"}, + [29] = {PropertyType = "Event Venue"}, + [30] = {PropertyType = "Gym/Fitness Center"}, + [31] = {PropertyType = "Restaurant"}, + [32] = {PropertyType = "Bar/Nightclub"}, + [33] = {PropertyType = "School/Institution"}, + [34] = {PropertyType = "Church/Temple"}, + [35] = {PropertyType = "Hospital/Clinic"}, + [36] = {PropertyType = "Gas Station"}, + [37] = {PropertyType = "Car Dealership"}, + [38] = {PropertyType = "Vacant Land"}, + [39] = {PropertyType = "Industrial Site"}, + [40] = {PropertyType = "Recreational Property"}, + [41] = {PropertyType = "Waterfront Property"}, + [42] = {PropertyType = "Historic Property"}, + [43] = {PropertyType = "Ranch"}, + [44] = {PropertyType = "Orchard/Vineyard"}, + [45] = {PropertyType = "Equestrian Property"}, + [46] = {PropertyType = "Island"}, + [47] = {PropertyType = "Floating Home"}, + [48] = {PropertyType = "Treehouse"}, + [49] = {PropertyType = "Igloo"}, + [50] = {PropertyType = "Underground Dwelling"}, + -- Add or remove property types: Mind the [1], [2] index numbers. They must be in order. + }, + + --====================== TRAININGS & CERTIFICATES =====================-- + + Trainings = { + [1] = { + TrainingName = "Emergency Driving Training", + TrainingDescription = "A training provided for emergency personnel learning how to drive while using lights and sirens or drive in emergency circumstances.", + TrainingPrivileges = "On completion, the employee is allowed to drive with lights and sirens.", + TrainingCertificate = "Blue Light Certified", + }, + [2] = { + TrainingName = "Taser Training", + TrainingDescription = "A training provided for emergency personnel to learn how to work with tasers alongside the legislation for the use of tasers.", + TrainingPrivileges = "On completion, the employee is allowed to use force by applying the taser.", + TrainingCertificate = "Taser Certified", + }, + [3] = { + TrainingName = "TPAC Training", + TrainingDescription = "Intensive training for police officers focused on Tactical Pursuit and Containment (TPAC) techniques. The training covers advanced driving maneuvers, vehicle tactics, and coordination in high-speed pursuits.", + TrainingPrivileges = "On completion, the officer is authorized to engage in high-speed pursuits and employ advanced vehicle tactics for effective containment.", + TrainingCertificate = "TPAC Certified", + }, + [4] = { + TrainingName = "Police Firearms Training", + TrainingDescription = "Training for police officers to become proficient in the use of firearms, including marksmanship and tactical considerations.", + TrainingPrivileges = "On completion, the officer is authorized to carry and use firearms in the line of duty.", + TrainingCertificate = "Firearms Certified", + }, + [5] = { + TrainingName = "Paramedic Life Support Training", + TrainingDescription = "Comprehensive life support training for paramedics covering advanced medical procedures and emergency life-saving techniques.", + TrainingPrivileges = "On completion, the paramedic is authorized to perform advanced life support interventions.", + TrainingCertificate = "Life Support Certified", + }, + [6] = { + TrainingName = "Firefighter Basic Training", + TrainingDescription = "Basic training for firefighters covering firefighting techniques, equipment usage, and safety procedures.", + TrainingPrivileges = "On completion, the firefighter gains basic firefighting capabilities.", + TrainingCertificate = "Firefighting Certified", + }, + [7] = { + TrainingName = "Hazmat Response Training", + TrainingDescription = "Training for emergency responders to handle hazardous materials incidents, including identification, containment, and decontamination procedures.", + TrainingPrivileges = "On completion, the responder is authorized to participate in hazardous materials response operations.", + TrainingCertificate = "Hazmat Certified", + }, + [8] = { + TrainingName = "Search and Rescue Training", + TrainingDescription = "Training for emergency personnel on search and rescue techniques, equipment usage, and coordination in disaster scenarios.", + TrainingPrivileges = "On completion, the responder is authorized to participate in search and rescue missions.", + TrainingCertificate = "Search and Rescue Certified", + }, + }, + + --====================== VEHICLE COLOURS & TRANSLATIONS =====================-- + + VehicleColours = { -- These are just some, Add more to your desire: https://wiki.rage.mp/index.php?title=Vehicle_Colors + -- primarymetallic + {name = "Black", colorindex = 0}, + {name = "Carbon Black", colorindex = 147}, + {name = "Hraphite", colorindex = 1}, + {name = "Anhracite Black", colorindex = 11}, + {name = "Black Steel", colorindex = 2}, + {name = "Dark Steel", colorindex = 3}, + {name = "Silver", colorindex = 4}, + {name = "Bluish Silver", colorindex = 5}, + {name = "Rolled Steel", colorindex = 6}, + {name = "Shadow Silver", colorindex = 7}, + {name = "Stone Silver", colorindex = 8}, + {name = "Midnight Silver", colorindex = 9}, + {name = "Cast Iron Silver", colorindex = 10}, + {name = "Metallic Anthracite Grey", colorindex = 11}, + {name = "Util Black", colorindex = 15}, + {name = "Util Black Poly", colorindex = 16}, + {name = "Util Dark Silver", colorindex = 17}, + {name = "Util Silver", colorindex = 18}, + {name = "Util Gun Metal", colorindex = 19}, + {name = "Util Shadow Silver", colorindex = 20}, + {name = "Worn Black", colorindex = 21}, + {name = "Worn Graphite", colorindex = 22}, + {name = "Worn Silver Grey", colorindex = 23}, + {name = "Worn Silver", colorindex = 24}, + {name = "Worn Blue Silver", colorindex = 25}, + {name = "Worn Shadow Silver", colorindex = 26}, + {name = "Metallic Red", colorindex = 27}, + {name = "Torino Red", colorindex = 28}, + {name = "Formula Red", colorindex = 29}, + {name = "Lava Red", colorindex = 150}, + {name = "Blaze Red", colorindex = 30}, + {name = "Grace Red", colorindex = 31}, + {name = "Garnet Red", colorindex = 32}, + {name = "Sunset Red", colorindex = 33}, + {name = "Cabernet Red", colorindex = 34}, + {name = "Wine Red", colorindex = 143}, + {name = "Candy Red", colorindex = 35}, + {name = "Hot Pink", colorindex = 135}, + {name = "Pfsiter Pink", colorindex = 137}, + {name = "Salmon Pink", colorindex = 136}, + {name = "Sunrise Orange", colorindex = 36}, + {name = "Metallic Classic Gold", colorindex = 37}, + {name = "Orange", colorindex = 38}, + {name = "Util Red", colorindex = 43}, + {name = "Util Bright Red", colorindex = 44}, + {name = "Util Garnet Red", colorindex = 45}, + {name = "Worn Red", colorindex = 46}, + {name = "Worn Golden Red", colorindex = 47}, + {name = "Worn Dark Red", colorindex = 48}, + {name = "Bright Orange", colorindex = 138}, + {name = "Gold", colorindex = 99}, + {name = "Bronze", colorindex = 90}, + {name = "Yellow", colorindex = 88}, + {name = "Race Yellow", colorindex = 89}, + {name = "Dew Yellow", colorindex = 91}, + {name = "Dark Green", colorindex = 49}, + {name = "Racing Green", colorindex = 50}, + {name = "Sea Green", colorindex = 51}, + {name = "Olive Green", colorindex = 52}, + {name = "Bright Green", colorindex = 53}, + {name = "Gasoline Green", colorindex = 54}, + {name = "Matte Lime Green", colorindex = 55}, + {name = "Util Dark Green", colorindex = 56}, + {name = "Util Green", colorindex = 57}, + {name = "Worn Dark Green", colorindex = 58}, + {name = "Worn Green", colorindex = 59}, + {name = "Lime Green", colorindex = 92}, + {name = "Midnight Blue", colorindex = 141}, + {name = "Galaxy Blue", colorindex = 61}, + {name = "Dark Blue", colorindex = 62}, + {name = "Saxon Blue", colorindex = 63}, + {name = "Blue", colorindex = 64}, + {name = "Mariner Blue", colorindex = 65}, + {name = "Harbor Blue", colorindex = 66}, + {name = "Diamond Blue", colorindex = 67}, + {name = "Surf Blue", colorindex = 68}, + {name = "Nautical Blue", colorindex = 69}, + {name = "Racing Blue", colorindex = 73}, + {name = "Ultra Blue", colorindex = 70}, + {name = "Light Blue", colorindex = 74}, + {name = "Util Dark Blue", colorindex = 75}, + {name = "Util Midnight Blue", colorindex = 76}, + {name = "Util Blue", colorindex = 77}, + {name = "Util Sea Foam Blue", colorindex = 78}, + {name = "Util Lightning Blue", colorindex = 79}, + {name = "Util Maui Blue Poly", colorindex = 80}, + {name = "Util Bright Blue", colorindex = 81}, + {name = "Matte Dark Blue", colorindex = 82}, + {name = "Matte Blue", colorindex = 83}, + {name = "Matte Midnight Blue", colorindex = 84}, + {name = "Worn Dark blue", colorindex = 85}, + {name = "Worn Blue", colorindex = 86}, + {name = "Worn Light blue", colorindex = 87}, + {name = "Metallic Taxi Yellow", colorindex = 88}, + {name = "Metallic Race Yellow", colorindex = 89}, + {name = "Metallic Bronze", colorindex = 90}, + {name = "Metallic Yellow Bird", colorindex = 91}, + {name = "Metallic Lime", colorindex = 92}, + {name = "Metallic Champagne", colorindex = 93}, + {name = "Chocolate Brown", colorindex = 96}, + {name = "Bison Brown", colorindex = 101}, + {name = "Creeen Brown", colorindex = 95}, + {name = "Feltzer Brown", colorindex = 94}, + {name = "Maple Brown", colorindex = 97}, + {name = "Beechwood Brown", colorindex = 103}, + {name = "Sienna Brown", colorindex = 104}, + {name = "Saddle Brown", colorindex = 98}, + {name = "Moss Brown", colorindex = 100}, + {name = "Woodbeech Brown", colorindex = 102}, + {name = "Straw Brown", colorindex = 99}, + {name = "Sandy Brown", colorindex = 105}, + {name = "Bleached Brown", colorindex = 106}, + {name = "Schafter Purple", colorindex = 71}, + {name = "Spinnaker Purple", colorindex = 72}, + {name = "Midnight Purple", colorindex = 142}, + {name = "Bright Purple", colorindex = 145}, + {name = "Cream", colorindex = 107}, + {name = "Ice White", colorindex = 111}, + {name = "Frost White", colorindex = 112}, + -- primarymatte + {name = "Black", colorindex = 12}, + {name = "Gray", colorindex = 13}, + {name = "Light Gray", colorindex = 14}, + {name = "Ice White", colorindex = 131}, + {name = "Blue", colorindex = 83}, + {name = "Dark Blue", colorindex = 82}, + {name = "Midnight Blue", colorindex = 84}, + {name = "Midnight Purple", colorindex = 149}, + {name = "Schafter Purple", colorindex = 148}, + {name = "Red", colorindex = 39}, + {name = "Dark Red", colorindex = 40}, + {name = "Orange", colorindex = 41}, + {name = "Yellow", colorindex = 42}, + {name = "Lime Green", colorindex = 55}, + {name = "Green", colorindex = 128}, + {name = "Frost Green", colorindex = 151}, + {name = "Foliage Green", colorindex = 155}, + {name = "Olive Darb", colorindex = 152}, + {name = "Dark Earth", colorindex = 153}, + {name = "Desert Tan", colorindex = 154}, + -- primarymetal + {name = "Brushed Steel", colorindex = 117}, + {name = "Brushed Black Steel", colorindex = 118}, + {name = "Brushed Aluminum", colorindex = 119}, + {name = "Pure Gold", colorindex = 158}, + {name = "Brushed Gold", colorindex = 159}, + -- chrome + {name = "Chrome", colorindex = 120} + }, +} \ No newline at end of file diff --git a/resources/night_shifts/config/departments_config.lua b/resources/night_shifts/config/departments_config.lua new file mode 100644 index 000000000..b6042cf86 --- /dev/null +++ b/resources/night_shifts/config/departments_config.lua @@ -0,0 +1,357 @@ +Config = Config or {} +Config.MobileDataTerminal = Config.MobileDataTerminal or {} + +--========================= Departments Config ========================-- +-- For readability, download 'Visual Studio Code'. Otherwise editing the below is not recommended. +-- Misplaced brackets and/or commas can break your script. https://code.visualstudio.com/download + +-- [IMPORTANT] Edit these roles to match your Discord API. +Config.MobileDataTerminal.DiscordGuildNames = {"Your_Discord_Community_Name"} -- It checks whether the user is in any of these Discord servers and checks for the roles the user has in these Discord servers. Match these names to your Discord API. The first guild defined is where it fetches the Discord member data from (avatar, nickname etc.). +Config.MobileDataTerminal.RolesWithAccessToMDT = {"Your_Police_Role", "Your_Ambulance_Role", "Your_Fire_Role", "Your_Tow_Role", "Your_Civilian_Role"} -- Edit these to match your roles (role names) from Night Discord API [FREE] https://store.nights-software.com/package/5035729 +Config.MobileDataTerminal.ManagementRoles = {"Your_Management_Role"} + +-- [IMPORTANT] Edit the department list below and make sure each department has a main role, used for the department, first rank and first sub-department. +Config.MobileDataTerminal.DepartmentList = { + + -- [IMPORTANT] ORDER department index numbers. Example: [1] = police, [2] = ambulance, [3] = fire, [4] = tow, [5] = civilians, this must be in a counting order or it will bug out the script! + -- [IMPORTANT] Provide the main department role to at least: the DepartmentRoleName, the first rank and the first SubDepartmentRoleName. + [1] = { + DepartmentName = "Metropolitan Police Service", + DepartmentLogo = "home_met.png", -- NUI/images/home_met.png + DepartmentDescription = "The Metropolitan Police Service (MPS), formerly and still commonly known as the Metropolitan Police (and informally as the Met Police, the Met, Scotland Yard, or the Yard), is the territorial police force responsible for law enforcement and the prevention of crime in Greater London.", + DepartmentFooterText = "Select to enter the shift menu.", + DepartmentShortName = "MET", + DepartmentRoleName = "Your_Police_Role", -- Match to the role name in the Discord API config.lua! + DepartmentCallsignPrefix = "CW-", + DepartmentType = "police", -- This defines the emergency service type, options: police | ambulance | fire | tow + DepartmentShiftAccess = true, -- Is this department allowed to use the Shift system? + DepartmentPoliceComputerAccess = true, -- Is this department allowed to access the Police Computer? + DepartmentOperationsAccess = true, -- Is this department allowed to access operation reports? + DepartmentRanksAndRoles = { -- Match to the role name in the Discord API config.lua! + [1] = {RankName = "Student Police Constable", RoleName = "Your_Police_Role", AccessLevel = 1}, -- Access levels MUST go from lower, to equal or higher as you add ranks. + [2] = {RankName = "Police Constable", RoleName = "Police_Constable", AccessLevel = 2}, -- Add ranks, low to high (top to bottom) as in the example here. + [3] = {RankName = "Sergeant", RoleName = "Sergeant", AccessLevel = 2}, + [4] = {RankName = "Inspector", RoleName = "Inspector", AccessLevel = 3}, + [5] = {RankName = "Chief Inspector", RoleName = "Chief_Inspector", AccessLevel = 3}, + [6] = {RankName = "Superintendent", RoleName = "Superintendent", AccessLevel = 4}, + [7] = {RankName = "Chief Superintendent", RoleName = "Chief_Superintendent", AccessLevel = 4}, + [8] = {RankName = "Commander", RoleName = "Commander", AccessLevel = 5}, + [9] = {RankName = "Deputy Assistant Commissioner", RoleName = "Deputy_Assistant_Commissioner", AccessLevel = 6}, + [10] = {RankName = "Assistant Commissioner", RoleName = "Assistant_Commissioner", AccessLevel = 6}, + [11] = {RankName = "Deputy Commissioner", RoleName = "Deputy_Commissioner", AccessLevel = 6}, + [12] = {RankName = "Commissioner", RoleName = "Commissioner", AccessLevel = 7}, + -- Add or remove ranks to your desire. + }, + SubDepartments = { -- You must have at least 1 sub-department + [1] = { + SubDepartmentName = "Emergency Response & Patrol Team", -- Full sub-department name + SubDepartmentShortName = "ERPT", -- Just a shortname used to display, keep it short! + SubDepartmentRoleName = "Your_Police_Role", -- Match to the role name in the Discord API config.lua! + SubDepartmentCallsignPrefix = "CW-", -- Example: Server ID 1 will be 'CW-01' + SubDepartmentBlipData = { -- Blips: https://docs.fivem.net/docs/game-references/blips/ + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + [2] = { + SubDepartmentName = "MO8", + SubDepartmentShortName = "MO8", + SubDepartmentRoleName = "RPU", + SubDepartmentCallsignPrefix = "OC-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + [3] = { + SubDepartmentName = "MO7 - DSU", + SubDepartmentShortName = "MO7 - DSU", + SubDepartmentRoleName = "DSU", + SubDepartmentCallsignPrefix = "XD-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + [4] = { + SubDepartmentName = "MO7 - TSG", + SubDepartmentShortName = "MO7 - TSG", + SubDepartmentRoleName = "TSG", + SubDepartmentCallsignPrefix = "XT-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + [5] = { + SubDepartmentName = "MO7 - Marine", + SubDepartmentShortName = "MO7 - Marine", + SubDepartmentRoleName = "Marine", + SubDepartmentCallsignPrefix = "XM-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + [6] = { + SubDepartmentName = "MO19", + SubDepartmentShortName = "MO19", + SubDepartmentRoleName = "AFO", + SubDepartmentCallsignPrefix = "FM-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + [7] = { + SubDepartmentName = "National Police Air Service", + SubDepartmentShortName = "NPAS", + SubDepartmentRoleName = "NPAS", + SubDepartmentCallsignPrefix = "QZ-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + [8] = { + SubDepartmentName = "British Transport Police", + SubDepartmentShortName = "BTP", + SubDepartmentRoleName = "British_Transport_Police", + SubDepartmentCallsignPrefix = "BT-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + [9] = { + SubDepartmentName = "Special Escort Group", + SubDepartmentShortName = "SEG", + SubDepartmentRoleName = "SEG", + SubDepartmentCallsignPrefix = "SE-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 38, + SubScale = 0.9, + }, + }, + }, + }, + [2] = { + DepartmentName = "London Ambulance Service", + DepartmentLogo = "home_las.png", -- NUI/images/mylogo.png + DepartmentDescription = "Our main role is to respond to emergency 999 calls, providing medical care to patients across the capital, 24-hours a day, 365 days a year. Other services we offer include providing pre-arranged patient transport and finding hospital beds", + DepartmentFooterText = "Select to enter the shift menu.", + DepartmentShortName = "LAS", + DepartmentRoleName = "Your_Ambulance_Role", -- Match to the role name in the Discord API config.lua! + DepartmentCallsignPrefix = "BS-", + DepartmentType = "ambulance", -- This defines the emergency service type, options: police | ambulance | fire | tow + DepartmentShiftAccess = true, -- Is this department allowed to use the Shift system? + DepartmentPoliceComputerAccess = true, -- Is this department allowed to access the Police Computer? + DepartmentOperationsAccess = true, -- Is this department allowed to access operation reports? + DepartmentRanksAndRoles = { -- Match to the role name in the Discord API config.lua! + [1] = {RankName = "Student Paramedic", RoleName = "Your_Ambulance_Role", AccessLevel = 1}, + [2] = {RankName = "Paramedic", RoleName = "Ambu_Paramedic", AccessLevel = 2}, + [3] = {RankName = "Advanced Paramedic", RoleName = "Ambu_Senior_Paramedic", AccessLevel = 3}, + [4] = {RankName = "Care Clinician", RoleName = "Ambu_Advanced_Paramedic", AccessLevel = 4}, + [5] = {RankName = "Advanced Care Clinician", RoleName = "Ambu_Leading_Operations_Manager", AccessLevel = 5}, + [6] = {RankName = "Deputy Director of Ambulance", RoleName = "Ambu_Deputy_Director", AccessLevel = 6}, + [7] = {RankName = "Director of Ambulance", RoleName = "Ambu_Director", AccessLevel = 7}, + }, + SubDepartments = { -- At least 1 sub-department! + [1] = { + SubDepartmentName = "Rapid Response", + SubDepartmentShortName = "RRV", + SubDepartmentRoleName = "Your_Ambulance_Role", + SubDepartmentCallsignPrefix = "BS-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 46, + SubScale = 0.9, + }, + }, + [2] = { + SubDepartmentName = "Helicopter Emergency Medical Services", + SubDepartmentShortName = "HEMS", + SubDepartmentRoleName = "HEMS", + SubDepartmentCallsignPrefix = "HO-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 46, + SubScale = 0.9, + }, + }, + [3] = { + SubDepartmentName = "Hazardous Area Response Team", + SubDepartmentShortName = "HART", + SubDepartmentRoleName = "HART", + SubDepartmentCallsignPrefix = "HA-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 46, + SubScale = 0.9, + }, + }, + }, + }, + [3] = { + DepartmentName = "London Fire Brigade", + DepartmentLogo = "home_lfb.png", -- NUI/images/mylogo.png + DepartmentDescription = "As well as firefighting, the LFB also responds to road traffic collisions, floods, shut-in-lift releases, and other incidents such as those involving hazardous materials or major transport accidents. It also conducts emergency planning and performs fire safety inspections and education.", + DepartmentFooterText = "Select to enter the shift menu.", + DepartmentShortName = "LFB", + DepartmentRoleName = "Your_Fire_Role", -- Match to the role name in the Discord API config.lua! + DepartmentCallsignPrefix = "PL-", + DepartmentType = "fire", -- This defines the emergency service type, options: police | ambulance | fire | tow + DepartmentShiftAccess = true, -- Is this department allowed to use the Shift system? + DepartmentPoliceComputerAccess = true, -- Is this department allowed to access the Police Computer? + DepartmentOperationsAccess = true, -- Is this department allowed to access operation reports? + DepartmentRanksAndRoles = { -- Match to the role name in the Discord API config.lua! + [1] = {RankName = "Firefighter", RoleName = "Your_Fire_Role", AccessLevel = 2}, + [2] = {RankName = "Leading Firefighter", RoleName = "Lead_Firefighter", AccessLevel = 3}, + [3] = {RankName = "Sub-Officer", RoleName = "Sub_Manager", AccessLevel = 3}, + [4] = {RankName = "Station Officer", RoleName = "Station_Officer", AccessLevel = 4}, + [5] = {RankName = "Station Commander", RoleName = "Station_Manager", AccessLevel = 4}, + [6] = {RankName = "Group Commander", RoleName = "Group_Manager", AccessLevel = 5}, + [7] = {RankName = "Deputy Assistant Commissioner", RoleName = "DACFO", AccessLevel = 6}, + [8] = {RankName = "Assistant Commissioner", RoleName = "ACFO", AccessLevel = 6}, + [9] = {RankName = "Deputy Commissioner", RoleName = "DCFO", AccessLevel = 6}, + [10] = {RankName = "Commissioner", RoleName = "CFO", AccessLevel = 7}, + }, + SubDepartments = { -- At least 1 sub-department! + [1] = { + SubDepartmentName = "London Fire & Rescue", + SubDepartmentShortName = "F&R", + SubDepartmentRoleName = "Your_Fire_Role", + SubDepartmentCallsignPrefix = "PL-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 1, + SubScale = 0.9, + }, + }, + [2] = { + SubDepartmentName = "Heathrow Airport Fire & Rescue", + SubDepartmentShortName = "AFR", + SubDepartmentRoleName = "heathrowfire", + SubDepartmentCallsignPrefix = "HF-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 1, + SubScale = 0.9, + }, + }, + [3] = { + SubDepartmentName = "Marine Unit", + SubDepartmentShortName = "MARU", + SubDepartmentRoleName = "Marine", + SubDepartmentCallsignPrefix = "MA-", + SubDepartmentBlipData = { + SubSpriteID = 1, + SubColourID = 1, + SubScale = 0.9, + }, + }, + }, + }, + [4] = { + DepartmentName = "Tow Service", + DepartmentLogo = "home_tow.png", -- NUI/images/mylogo.png + DepartmentDescription = "AA Towing is a trusted and efficient service that offers prompt assistance to stranded vehicles. With a fleet of well-equipped tow trucks and skilled operators, they excel at rescuing vehicles from breakdowns, accidents, and challenging situations. Whether it's on-site repairs, safe towing to service centers, or long-distance transportation, AA Towing ensures reliable and professional service to keep the roads running smoothly.", + DepartmentFooterText = "Start your career as a towing service operator.", + DepartmentShortName = "TOW", + DepartmentRoleName = "Your_Tow_Role", -- Match to the role name in the Discord API config.lua! + DepartmentCallsignPrefix = "AA-", + DepartmentType = "tow", -- This defines the emergency service type, options: police | ambulance | fire | tow (civilian is a placeholder) + DepartmentShiftAccess = true, -- Is this department allowed to access the Shift system? + DepartmentPoliceComputerAccess = false, -- Is this department allowed to access the Police Computer? + DepartmentOperationsAccess = false, -- Is this department allowed to access Operation reports? + DepartmentRanksAndRoles = { -- Match to the role name in the Discord API config.lua! + [1] = {RankName = "Recovery Operator", RoleName = "Your_Tow_Role", AccessLevel = 7}, + }, + SubDepartments = { + [1] = { + SubDepartmentName = "AA Towing Service", + SubDepartmentShortName = "AA", + SubDepartmentRoleName = "Your_Tow_Role", + SubDepartmentCallsignPrefix = "AA-", + SubDepartmentBlipData = { + SubSpriteID = 317, + SubColourID = 73, + SubScale = 0.9, + }, + }, + }, + }, + -- [IMPORTANT] ONE civilian department is required. You must set the civilian RoleName(s) to a matching Discord API role which everyone has in your Discord. + -- This will allow everyone to use the civilian section. + [5] = { + DepartmentName = "Civilian", + DepartmentLogo = "home_civ.png", -- NUI/images/mylogo.png + DepartmentDescription = "Be free and play whoever you want to be as a civilian. Legal or illegal? It's all up to you.", + DepartmentFooterText = "Select to get access to the DVLA & Council.", + DepartmentShortName = "CIV", + DepartmentRoleName = "Your_Civilian_Role", -- Match to the role name in the Discord API config.lua! + DepartmentCallsignPrefix = "NONE", + DepartmentType = "civilian", -- This defines the emergency service type, options: civilian + DepartmentShiftAccess = false, -- Is this department allowed to access the Shift system? + DepartmentPoliceComputerAccess = false, -- Is this department allowed to access the Police Computer? + DepartmentOperationsAccess = false, -- Is this department allowed to access Operation reports? + DepartmentRanksAndRoles = { -- Match to the role name in the Discord API config.lua! + [1] = {RankName = "Civilian", RoleName = "Your_Civilian_Role", AccessLevel = 1}, + }, + SubDepartments = {}, -- Leave this empty, for other departments you must add at least one sub-department, see examples in the other departments. + }, + + -- Add another department here. (See an example below, uncomment it) + + -- [6] = { + -- DepartmentName = "Example Department", + -- DepartmentLogo = "home_civ.png", -- NUI/images/mylogo.png + -- DepartmentDescription = "Be free and play whoever you want to be as a civilian. Legal or illegal? It's all up to you.", + -- DepartmentFooterText = "Select to get access to the DVLA & Council.", + -- DepartmentShortName = "EX", + -- DepartmentRoleName = "Example_Role", -- Match to the role name in the Discord API config.lua! + -- DepartmentCallsignPrefix = "NONE", + -- DepartmentType = "police", -- This defines the emergency service type, options: civilian + -- DepartmentShiftAccess = true, -- Is this department allowed to access the Shift system? + -- DepartmentPoliceComputerAccess = true, -- Is this department allowed to access the Police Computer? + -- DepartmentOperationsAccess = true, -- Is this department allowed to access Operation reports? + -- DepartmentRanksAndRoles = { -- Match to the role name in the Discord API config.lua! + -- [1] = {RankName = "Example_Rank", RoleName = "Example_Role", AccessLevel = 1}, + -- [2] = {RankName = "Example_Rank_2", RoleName = "Example_Role_2", AccessLevel = 2}, + -- [3] = {RankName = "Example_Rank_3", RoleName = "Example_Role_3", AccessLevel = 3}, + -- }, + -- SubDepartments = { + -- [1] = { + -- SubDepartmentName = "Example Sub-Department 1", + -- SubDepartmentShortName = "EX1", + -- SubDepartmentRoleName = "Example_Role_1", + -- SubDepartmentCallsignPrefix = "EX-", + -- SubDepartmentBlipData = { + -- SubSpriteID = 317, + -- SubColourID = 73, + -- SubScale = 0.9, + -- }, + -- }, + -- [2] = { + -- SubDepartmentName = "Example Sub-Department 2", + -- SubDepartmentShortName = "EX2", + -- SubDepartmentRoleName = "Example_Role_2", + -- SubDepartmentCallsignPrefix = "EX-", + -- SubDepartmentBlipData = { + -- SubSpriteID = 317, + -- SubColourID = 73, + -- SubScale = 0.9, + -- }, + -- }, + -- }, + -- }, +} diff --git a/resources/night_shifts/config/fictivenames_config.lua b/resources/night_shifts/config/fictivenames_config.lua new file mode 100644 index 000000000..d2e493a46 --- /dev/null +++ b/resources/night_shifts/config/fictivenames_config.lua @@ -0,0 +1,410 @@ +Config.Common_first_names = { + "Alexandre", + "Alessandro", + "Andrea", + "Antonio", + "Luca", + "Marco", + "Matteo", + "Fabio", + "Giuseppe", + "Dario", + "Lorenzo", + "Mario", + "Massimo", + "Nicolò", + "Pietro", + "Riccardo", + "Simone", + "Stefano", + "Filippo", + "Gabriele", + "Giovanni", + "Francesco", + "Raffaele", + "Alessia", + "Anna", + "Chiara", + "Cristina", + "Elisa", + "Francesca", + "Giulia", + "Laura", + "Ludovica", + "Marta", + "Martina", + "Sara", + "Valentina", + "Veronica", + "Alice", + "Bianca", + "Camilla", + "Carla", + "Elena", + "Federica", + "Isabella", + "Letizia", + "Lucia", + "Maria", + "Marta", + "Marta", + "Miriam", + "Silvia", + "Sophia", + "Vittoria", + "Claude", + "Denis", + "Émile", + "Antoine", + "Benoît", + "Cédric", + "Christophe", + "Damien", + "Didier", + "Éric", + "Fabien", + "Gilles", + "Hugo", + "Jacques", + "Jean", + "Laurent", + "Luc", + "Marc", + "Mathieu", + "Nicolas", + "Olivier", + "Pascal", + "Philippe", + "Pierre", + "Rémi", + "Romain", + "Sébastien", + "Thierry", + "Vincent", + "Amandine", + "Amélie", + "Anaïs", + "Aurélie", + "Caroline", + "Chloé", + "Christelle", + "Claire", + "Delphine", + "Élodie", + "Emilie", + "Eva", + "Inès", + "Julie", + "Justine", + "Léa", + "Lisa", + "Manon", + "Marie", + "Mélanie", + "Nathalie", + "Pauline", + "Sandra", + "Sophie", + "Valérie", + "Yvette", + "Adams", + "Albert", + "Beck", + "Berger", + "Bernard", + "Blanc", + "Boucher", + "Caron", + "Chevalier", + "Clement", + "Deschamps", + "Dubois", + "Durand", + "Dupont", + "Fournier", + "Gauthier", + "Girard", + "Lambert", + "Lefebvre", + "Lefevre", + "Lemaitre", + "Leroy", + "Martin", + "Moreau", + "Morin", + "Moulin", + "Noel", + "Perrin", + "Petit", + "Renard", + "Rey", + "Renaud", + "Robert", + "Rousseau", + "Roy", + "Simon", + "Thomas", + "Vidal", + "Vincent", + "Aubert", + "Barbier", + "Baron", + "Blanchard", + "Boulanger", + "Bourgeois", + "Brun", + "Brunet", + "Chapuis", + "Clement", + "Clerc", + "Colin", + "David", + "Dufour", + "Dumas", + "Faure", + "Fontaine", + "Gillet", + "Guillaume", + "Henry", + "Joly", + "Lacroix", + "Leclerc", + "Legrand", + "Lemoine", + "Mercier", + "Michel", + "Monnier", + "Morel", + "Perrot", + "Roussel", + "Tessier", + "Vasseur", + "Blaise", + "Bonnet", + "Carré", + "Charpentier", + "Collin", + "Cousin", + "Da Silva", + "Delattre", + "Delgado", + "Denis", + "Diaz", + "Dijoux", + "Dumont", + "Duran", + "Durand", + "Duval", + "Fabre", + "Fernandez", + "Ferreira", + "Gimenez", + "Gomez", + "Guérin", + "Lafont", + "Lecomte", + "Leroux", + "Leroy", + "Lopez", + "Mallet", + "Marin", + "Maurice", + "Mercier", + "Meyer", + "Millot", + "Monnier", + "Moreau", + "Moulin", + "Nogueira", + "Pereira", + "Perrin", + "Pierre", + "Rey", + "Reynaud", + "Ribeiro", + "Ricard", + "Riou", + "Robin", + "Roux", + "Santos", + "Tavares", + "Valette", + "Vial", + "Vidal", + "Villeneuve" +} + +Config.Common_last_names = { + "Smith", + "Johnson", + "Williams", + "Brown", + "Jones", + "Garcia", + "Miller", + "Davis", + "Rodriguez", + "Martinez", + "Hernandez", + "Lopez", + "Gonzalez", + "Wilson", + "Anderson", + "Thomas", + "Taylor", + "Moore", + "Jackson", + "Martin", + "Lee", + "Perez", + "Thompson", + "White", + "Harris", + "Sanchez", + "Clark", + "Ramirez", + "Lewis", + "Robinson", + "Walker", + "Young", + "Hall", + "Allen", + "Torres", + "Nguyen", + "Wright", + "Flores", + "King", + "Scott", + "Rivera", + "Green", + "Hill", + "Adams", + "Baker", + "Nelson", + "Carter", + "Mitchell", + "Perez", + "Roberts", + "Turner", + "Phillips", + "Campbell", + "Parker", + "Evans", + "Edwards", + "Collins", + "Stewart", + "Sanchez", + "Morris", + "Rogers", + "Reed", + "Cook", + "Morgan", + "Bell", + "Murphy", + "Bailey", + "Rivera", + "Cooper", + "Richardson", + "Cox", + "Howard", + "Ward", + "Torres", + "Peterson", + "Gray", + "Ramirez", + "James", + "Watson", + "Brooks", + "Kelly", + "Sanders", + "Price", + "Bennett", + "Wood", + "Barnes", + "Aubert", + "Barbier", + "Baron", + "Blanchard", + "Boulanger", + "Bourgeois", + "Brun", + "Brunet", + "Chapuis", + "Clement", + "Clerc", + "Colin", + "David", + "Dufour", + "Dumas", + "Faure", + "Fontaine", + "Gillet", + "Guillaume", + "Henry", + "Joly", + "Lacroix", + "Leclerc", + "Legrand", + "Lemoine", + "Mercier", + "Michel", + "Monnier", + "Morel", + "Perrot", + "Roussel", + "Tessier", + "Vasseur", + "Blaise", + "Bonnet", + "Carré", + "Charpentier", + "Collin", + "Cousin", + "Da Silva", + "Delattre", + "Delgado", + "Denis", + "Diaz", + "Dijoux", + "Dumont", + "Duran", + "Durand", + "Duval", + "Fabre", + "Fernandez", + "Ferreira", + "Gimenez", + "Gomez", + "Guérin", + "Lafont", + "Lecomte", + "Leroux", + "Leroy", + "Lopez", + "Mallet", + "Marin", + "Maurice", + "Mercier", + "Meyer", + "Millot", + "Monnier", + "Moreau", + "Moulin", + "Nogueira", + "Pereira", + "Perrin", + "Pierre", + "Rey", + "Reynaud", + "Ribeiro", + "Ricard", + "Riou", + "Robin", + "Roux", + "Santos", + "Tavares", + "Valette", + "Vial", + "Vidal", + "Villeneuve" +} diff --git a/resources/night_shifts/config/handbooks_config.lua b/resources/night_shifts/config/handbooks_config.lua new file mode 100644 index 000000000..0ffa2df25 --- /dev/null +++ b/resources/night_shifts/config/handbooks_config.lua @@ -0,0 +1,596 @@ +Config = Config or {} +-- Note: This was built to be usable for multiple countries with very different laws. The presented law information may contain mistakes. It is meant to be an example for you to edit. +-- IMPORTANT: Mind the commas, brackets and the [1] [2] [3] index numbers to prevent syntax errors. You need Visual Studio Code to properly read & edit this code. +-- IMPORTANT: Do NOT use commas (,) or other symbols (!+_&%^/*{}[]?\/:;.), other than dashes (-) in your HandbookName, ActOrLawName or SectionName variables. Allowed only in ArticleName and ArticleDescription. + +Config.PoliceHandbook = { + [1] = { + HandbookName = "1 - Police Handbook", + ActOrLaws = { + [1] = { + ActOrLawName = "1 - Police and Criminal Evidence Act", + Sections = { + [1] = { + SectionName = "CODE A", + Articles = { + [1] = { + ArticleName = "Arrest without a warrant", + ArticleDescription = "Police officers have the power to arrest without a warrant in certain situations, such as when they have reasonable grounds to suspect that a person has committed, or is about to commit, an offense.", + }, + [2] = { + ArticleName = "Use of force", + ArticleDescription = "Police officers can use reasonable force when necessary to carry out their duties, such as to make an arrest or to prevent a crime from being committed.", + }, + [3] = { + ArticleName = "Detention", + ArticleDescription = "Police officers can detain a person for up to 24 hours without charge if they have reasonable grounds to suspect that they have committed an offense.", + }, + -- Add another article here with index [4], because the previous one is [3], mind the comma's and brackets, you need them behind each line, so add one above as well! + + -- Example: + -- [4] = { + -- ArticleName = "Number Four", + -- ArticleDescription = "Description of Number Four", + -- }, + + } + }, + [2] = { + SectionName = "CODE B", + Articles = { + [1] = { + ArticleName = "Search and seizure", + ArticleDescription = "Police officers have the power to search a person or their property if they have reasonable grounds to suspect that they are in possession of something illegal.", + }, + [2] = { + ArticleName = "Interviewing suspects", + ArticleDescription = "Police officers must inform suspects of their rights before conducting an interview, including the right to legal representation.", + }, + [3] = { + ArticleName = "Identification procedures", + ArticleDescription = "Police officers can require suspects to provide fingerprints, DNA samples, and other identifying information.", + } + } + }, + [3] = { + SectionName = "CODE C", + Articles = { + [1] = { + ArticleName = "Custody procedures", + ArticleDescription = "Police officers must follow specific procedures when detaining and holding suspects in custody.", + }, + [2] = { + ArticleName = "Access to medical treatment", + ArticleDescription = "Police officers must ensure that suspects in custody have access to medical treatment if needed.", + } + } + }, + -- Add another section here with index [4], because the previous one is [3], mind the comma's and brackets, you need them behind each line, so add one above as well! + + -- Example: + -- [4] = { + -- SectionName = "CODE D", + -- Articles = { + -- [1] = { + -- ArticleName = "D Article 1", + -- ArticleDescription = "D article 1 description", + -- } + -- } + -- }, + } + }, + [2] = { + ActOrLawName = "2 - Misuse of Drugs Regulations Act", + Sections = { + [1] = { + SectionName = "Offenses", + Articles = { + [1] = { + ArticleName = "Possession of a controlled drug", + ArticleDescription = "It is an offense to possess a controlled drug, such as heroin or cocaine, without a valid prescription or license.", + }, + [2] = { + ArticleName = "Supply of a controlled drug", + ArticleDescription = "It is an offense to supply a controlled drug to another person, including giving it away for free.", + }, + [3] = { + ArticleName = "Production of a controlled drug", + ArticleDescription = "It is an offense to produce a controlled drug, such as growing cannabis or manufacturing methamphetamine.", + }, + [4] = { + ArticleName = "Import or export of a controlled drug", + ArticleDescription = "It is an offense to import or export a controlled drug, such as smuggling cocaine or heroin across international borders.", + }, + [5] = { + ArticleName = "Possession of equipment for drug use", + ArticleDescription = "It is an offense to possess equipment for the use of controlled drugs, such as syringes or smoking pipes.", + } + } + }, + [2] = { + SectionName = "Powers", + Articles = { + [1] = { + ArticleName = "Search and seizure", + ArticleDescription = "Police officers have the power to search a person or their property if they have reasonable grounds to suspect that they are in possession of a controlled drug.", + }, + [2] = { + ArticleName = "Forfeiture", + ArticleDescription = "Police officers can seize and forfeit any controlled drugs they find during a search.", + }, + [3] = { + ArticleName = "Closure of premises", + ArticleDescription = "Police officers have the power to close down premises where controlled drugs are being produced or supplied.", + } + } + }, + }, + }, + [3] = { + ActOrLawName = "3 - Criminal Justice Act", + Sections = { + [1] = { + SectionName = "General provisions", + Articles = { + [1] = { + ArticleName = "Abolition of death penalty", + ArticleDescription = "The death penalty is abolished for all crimes.", + }, + [2] = { + ArticleName = "Interpretation", + ArticleDescription = "Defines key terms and concepts used throughout the act.", + }, + [3] = { + ArticleName = "Powers of arrest", + ArticleDescription = "Sets out the circumstances under which a police officer may arrest a person without a warrant.", + }, + } + }, + [2] = { + SectionName = "Offenses", + Articles = { + [1] = { + ArticleName = "Assault", + ArticleDescription = "Defines the offense of assault and provides maximum penalties for conviction.", + }, + [2] = { + ArticleName = "Theft", + ArticleDescription = "Defines the offense of theft and provides maximum penalties for conviction.", + }, + [3] = { + ArticleName = "Criminal damage", + ArticleDescription = "Defines the offense of criminal damage and provides maximum penalties for conviction.", + }, + } + }, + [3] = { + SectionName = "Sentencing", + Articles = { + [1] = { + ArticleName = "Sentencing guidelines", + ArticleDescription = "Sets out factors that courts must consider when determining an appropriate sentence for a criminal offense.", + }, + [2] = { + ArticleName = "Community sentences", + ArticleDescription = "Provides for community-based alternatives to custodial sentences for certain offenses.", + }, + } + }, + }, + }, + [4] = { + ActOrLawName = "4 - Public Order Act", + Sections = { + [1] = { + SectionName = "Offenses", + Articles = { + [1] = { + ArticleName = "Riot", + ArticleDescription = "It is an offense for twelve or more persons to use or threaten to use violence for a common purpose in a public place, causing a person of reasonable firmness present at the scene to fear for their safety.", + }, + [2] = { + ArticleName = "Violent disorder", + ArticleDescription = "It is an offense for three or more persons to use or threaten to use violence together in a public place, causing a person of reasonable firmness present at the scene to fear for their safety.", + }, + [3] = { + ArticleName = "Affray", + ArticleDescription = "It is an offense for two or more persons to use or threaten to use violence towards each other in a public place, causing a person of reasonable firmness present at the scene to fear for their safety.", + }, + [4] = { + ArticleName = "Fear or provocation of violence", + ArticleDescription = "It is an offense for a person to use threatening, abusive or insulting words or behavior or display any written material which is threatening, abusive or insulting, within the hearing or sight of a person likely to be caused harassment, alarm or distress, thereby causing that person to fear for their safety or to provoke violence.", + }, + } + }, + [2] = { + SectionName = "Powers", + Articles = { + [1] = { + ArticleName = "Arrest", + ArticleDescription = "Police officers have the power to arrest without warrant anyone whom they reasonably suspect to be committing or to have committed an offense under this Act.", + }, + [2] = { + ArticleName = "Dispersal", + ArticleDescription = "Police officers have the power to give a direction to leave a locality to any person who they reasonably believe to be causing or likely to cause harassment, alarm or distress to any other person within the locality, and to any group of two or more persons in a public place who they reasonably believe to be causing or likely to cause harassment, alarm or distress to members of the public not of the same group.", + } + } + }, + }, + }, + [5] = { + ActOrLawName = "5 - Offences Against the Person Act", + Sections = { + [1] = { + SectionName = "Assault, Battery and Actual Bodily Harm", + Articles = { + [1] = { + ArticleName = "Assault", + ArticleDescription = "A person commits an assault if they intentionally or recklessly cause another person to apprehend immediate unlawful violence.", + }, + [2] = { + ArticleName = "Battery", + ArticleDescription = "A person commits battery if they intentionally or recklessly apply unlawful force to another person.", + }, + [3] = { + ArticleName = "Actual Bodily Harm", + ArticleDescription = "A person commits actual bodily harm if they intentionally or recklessly cause physical harm to another person.", + } + } + }, + [2] = { + SectionName = "Wounding and Grievous Bodily Harm", + Articles = { + [1] = { + ArticleName = "Unlawful Wounding", + ArticleDescription = "A person commits unlawful wounding if they inflict a wound, break or other injury to another person, with or without a weapon.", + }, + [2] = { + ArticleName = "Grievous Bodily Harm", + ArticleDescription = "A person commits grievous bodily harm if they inflict really serious harm, such as a broken bone, loss of an organ or serious disfigurement, to another person.", + } + } + }, + [3] = { + SectionName = "Murder and Manslaughter", + Articles = { + [1] = { + ArticleName = "Murder", + ArticleDescription = "A person commits murder if they intentionally kill another person or if they cause the death of another person through actions that are likely to cause death.", + }, + [2] = { + ArticleName = "Manslaughter", + ArticleDescription = "A person commits manslaughter if they kill another person, but the killing is not murder, for example if the killing was due to a lack of intent, provocation or diminished responsibility.", + } + } + }, + }, + }, + [6] = { + ActOrLawName = "6 - Criminal Damage Act", + Sections = { + [1] = { + SectionName = "Offenses", + Articles = { + [1] = { + ArticleName = "Criminal damage", + ArticleDescription = "It is an offense to intentionally or recklessly damage property belonging to someone else, without lawful excuse.", + }, + [2] = { + ArticleName = "Aggravated criminal damage", + ArticleDescription = "If the damage caused endangers life, the offense becomes aggravated and carries a higher penalty.", + } + } + }, + [2] = { + SectionName = "Defenses", + Articles = { + [1] = { + ArticleName = "Lawful excuse", + ArticleDescription = "A person may have a lawful excuse for causing damage, such as in self-defense or to prevent a greater harm.", + }, + [2] = { + ArticleName = "Consent", + ArticleDescription = "If the owner of the property consented to the damage, the offense may not apply.", + } + } + }, + [3] = { + SectionName = "Powers", + Articles = { + [1] = { + ArticleName = "Entry and search", + ArticleDescription = "Police officers can enter and search premises to prevent further damage or to investigate an offense.", + }, + [2] = { + ArticleName = "Seizure of property", + ArticleDescription = "Police officers can seize any property they suspect has been used to commit a criminal damage offense.", + } + } + }, + }, + }, + [7] = { + ActOrLawName = "7 - Theft Act", + Sections = { + [1] = { + SectionName = "Offenses", + Articles = { + [1] = { + ArticleName = "Theft", + ArticleDescription = "It is an offense to dishonestly appropriate property belonging to another with the intention of permanently depriving the other of it.", + }, + [2] = { + ArticleName = "Robbery", + ArticleDescription = "It is an offense to steal and immediately before or at the time of doing so, and in order to do so, to use force on any person or put or seek to put any person in fear of being then and there subjected to force.", + }, + [3] = { + ArticleName = "Burglary", + ArticleDescription = "It is an offense to enter a building or part of a building as a trespasser with intent to steal, inflict grievous bodily harm, or do unlawful damage to the building or anything in it.", + }, + [4] = { + ArticleName = "Handling stolen goods", + ArticleDescription = "It is an offense to handle stolen goods, or to receive them knowing or believing them to be stolen, with the intention of dishonestly depriving the owner of them.", + } + } + }, + [2] = { + SectionName = "Powers", + Articles = { + [1] = { + ArticleName = "Search and seizure", + ArticleDescription = "Police officers have the power to search a person or their property if they have reasonable grounds to suspect that they are in possession of stolen property.", + }, + [2] = { + ArticleName = "Arrest without a warrant", + ArticleDescription = "Police officers have the power to arrest without a warrant if they have reasonable grounds to suspect that a person has committed, is committing, or is about to commit an offense under the Theft Act.", + } + } + } + }, + }, + [8] = { + ActOrLawName = "8 - Firearms Act", + Sections = { + [1] = { + SectionName = "Offenses", + Articles = { + [1] = { + ArticleName = "Possession of a firearm without a certificate", + ArticleDescription = "It is an offense to possess a firearm without a valid certificate, which must be issued by the police.", + }, + [2] = { + ArticleName = "Possession of a firearm with intent to endanger life", + ArticleDescription = "It is an offense to possess a firearm with intent to endanger life or cause serious injury.", + }, + [3] = { + ArticleName = "Possession of a prohibited firearm", + ArticleDescription = "It is an offense to possess a prohibited firearm, such as a machine gun or a sawn-off shotgun.", + } + } + }, + [2] = { + SectionName = "Powers", + Articles = { + [1] = { + ArticleName = "Power of entry and search", + ArticleDescription = "Police officers have the power to enter and search premises for firearms, ammunition, or other related items.", + }, + [2] = { + ArticleName = "Forfeiture", + ArticleDescription = "Police officers can seize and forfeit any firearms, ammunition, or related items that are found during a search.", + } + } + }, + }, + }, + [9] = { + ActOrLawName = "9 - Road Traffic Act", + Sections = { + [1] = { + SectionName = "Offenses", + Articles = { + [1] = { + ArticleName = "Driving under the influence", + ArticleDescription = "It is an offense to drive a motor vehicle while under the influence of drugs or alcohol above the legal limit.", + }, + [2] = { + ArticleName = "Dangerous driving", + ArticleDescription = "It is an offense to drive a motor vehicle dangerously, which includes driving at excessive speeds, driving recklessly, and ignoring traffic signals.", + }, + [3] = { + ArticleName = "Driving without a license", + ArticleDescription = "It is an offense to drive a motor vehicle without a valid driver's license.", + }, + [4] = { + ArticleName = "Driving without insurance", + ArticleDescription = "It is an offense to drive a motor vehicle without valid insurance.", + }, + } + }, + [2] = { + SectionName = "Penalties", + Articles = { + [1] = { + ArticleName = "Fines", + ArticleDescription = "Fines may be imposed for various driving offenses under the Road Traffic Act.", + }, + [2] = { + ArticleName = "Disqualification from driving", + ArticleDescription = "A person may be disqualified from driving for a period of time for certain driving offenses.", + }, + [3] = { + ArticleName = "Imprisonment", + ArticleDescription = "A person may be sentenced to imprisonment for certain driving offenses under the Road Traffic Act.", + }, + } + }, + [3] = { + SectionName = "Powers", + Articles = { + [1] = { + ArticleName = "Stop and search", + ArticleDescription = "Police officers have the power to stop and search a vehicle if they have reasonable grounds to suspect that an offense has been committed.", + }, + [2] = { + ArticleName = "Impounding", + ArticleDescription = "Police officers have the power to impound a vehicle if the driver has committed certain offenses, such as driving without insurance or a license.", + }, + } + }, + }, + }, + -- Add another act or law here with index [10], because the previous one is [9], mind the comma's and brackets, you need them behind each line, so add one above as well! + + -- Example: + -- [10] = { + -- ActOrLawName = "10 - Some Act", + -- Sections = { + -- [1] = { + -- SectionName = "Offenses", + -- Articles = { + -- [1] = { + -- ArticleName = "Driving under the influence", + -- ArticleDescription = "It is an offense to drive a motor vehicle while under the influence of drugs or alcohol above the legal limit.", + -- }, + -- [2] = { + -- ArticleName = "Dangerous driving", + -- ArticleDescription = "It is an offense to drive a motor vehicle dangerously, which includes driving at excessive speeds, driving recklessly, and ignoring traffic signals.", + -- }, + -- [3] = { + -- ArticleName = "Driving without a license", + -- ArticleDescription = "It is an offense to drive a motor vehicle without a valid driver's license.", + -- }, + -- [4] = { + -- ArticleName = "Driving without insurance", + -- ArticleDescription = "It is an offense to drive a motor vehicle without valid insurance.", + -- }, + -- } + -- }, + -- [2] = { + -- SectionName = "Penalties", + -- Articles = { + -- [1] = { + -- ArticleName = "Fines", + -- ArticleDescription = "Fines may be imposed for various driving offenses under the Road Traffic Act.", + -- }, + -- [2] = { + -- ArticleName = "Disqualification from driving", + -- ArticleDescription = "A person may be disqualified from driving for a period of time for certain driving offenses.", + -- }, + -- [3] = { + -- ArticleName = "Imprisonment", + -- ArticleDescription = "A person may be sentenced to imprisonment for certain driving offenses under the Road Traffic Act.", + -- }, + -- } + -- }, + -- [3] = { + -- SectionName = "Powers", + -- Articles = { + -- [1] = { + -- ArticleName = "Stop and search", + -- ArticleDescription = "Police officers have the power to stop and search a vehicle if they have reasonable grounds to suspect that an offense has been committed.", + -- }, + -- [2] = { + -- ArticleName = "Impounding", + -- ArticleDescription = "Police officers have the power to impound a vehicle if the driver has committed certain offenses, such as driving without insurance or a license.", + -- }, + -- } + -- }, + -- }, + -- }, + }, + }, + + -- Example for a second handbook here with index [2] because the previous handbook index is [1]: + [2] = { + HandbookName = "2 - Medical Guidelines", + ActOrLaws = { + [1] = { + ActOrLawName = "General Medical Council - Good Medical Practice", + Sections = { + [1] = { + SectionName = "Domain 1 - Knowledge skills and performance", + Articles = { + [1] = { + ArticleName = "Maintain professional performance", + ArticleDescription = "Doctors must continually develop their knowledge, skills, and performance in line with relevant guidelines and with the principles of Good Medical Practice.", + }, + [2] = { + ArticleName = "Apply knowledge and experience to practice", + ArticleDescription = "Doctors must use their professional judgment, based on their knowledge and experience, to provide good clinical care to patients.", + }, + [3] = { + ArticleName = "Record your work clearly, accurately and legibly", + ArticleDescription = "Doctors must keep clear, accurate, and legible records of all their work.", + } + } + }, + [2] = { + SectionName = "Domain 2 - Safety and quality", + Articles = { + [1] = { + ArticleName = "Contribute to and comply with systems to protect patients", + ArticleDescription = "Doctors must work with colleagues to keep patients safe and ensure that clinical care is of a high standard.", + }, + [2] = { + ArticleName = "Respond to risks to safety", + ArticleDescription = "Doctors must respond to risks to patient safety promptly and appropriately.", + }, + [3] = { + ArticleName = "Protect patients and colleagues from and risk posed by your health", + ArticleDescription = "Doctors must take prompt action if they think that their own health may be putting patients or colleagues at risk.", + } + } + } + } + }, + [2] = { + ActOrLawName = "Medicines and Healthcare products Regulatory Agency", + Sections = { + [1] = { + SectionName = "Principles of Good Clinical Practice", + Articles = { + [1] = { + ArticleName = "Ethical principles", + ArticleDescription = "Clinical trials must be conducted in accordance with ethical principles, including respect for the rights, dignity and well-being of trial subjects.", + }, + [2] = { + ArticleName = "Risk management", + ArticleDescription = "Clinical trials must be designed and conducted to minimize risks to trial subjects.", + }, + [3] = { + ArticleName = "Data integrity", + ArticleDescription = "All data generated during a clinical trial must be recorded, handled, and stored in a way that ensures its accuracy, reliability, and completeness.", + }, + [4] = { + ArticleName = "Informed consent", + ArticleDescription = "Trial subjects must provide informed consent before participating in a clinical trial.", + } + } + }, + [2] = { + SectionName = "Investigator Responsibilities", + Articles = { + [1] = { + ArticleName = "Trial conduct", + ArticleDescription = "Investigators must ensure that clinical trials are conducted in compliance with the protocol, applicable regulations, and Good Clinical Practice.", + }, + [2] = { + ArticleName = "Safety reporting", + ArticleDescription = "Investigators must promptly report to the sponsor and the relevant regulatory authorities any adverse events or safety issues that arise during a clinical trial.", + }, + [3] = { + ArticleName = "Trial records", + ArticleDescription = "Investigators must maintain accurate and complete records of a clinical trial, including case histories and source documents.", + }, + -- Add another article here with index [4], because the previous one is [3]. + }, + }, + -- Add another Section here with index [3], because the previous one is [2]. + }, + }, + -- Add another act, law or guideline here with index [3], because the previous one is [2]. + }, + }, + -- Add another handbook here with index [3], because the previous one is [2]. +} diff --git a/resources/night_shifts/config/mdt_config.lua b/resources/night_shifts/config/mdt_config.lua new file mode 100644 index 000000000..a79fa5494 --- /dev/null +++ b/resources/night_shifts/config/mdt_config.lua @@ -0,0 +1,214 @@ +Config = Config or {} + +--====================== MDT CONFIG =====================-- + +Config.MobileDataTerminal = { + + MDTName = "MOBILE DATA TERMINAL", -- Title at the top of the MDT UI, to hide the title set it to an empty string: "", + + --====================== Intervals ===================-- + + DurationOfNotifications = 7500, -- 7.5 seconds = 7500 milliseconds by default. + BlipUpdateInterval = 5000, -- 5 seconds = 5000 milliseconds by default. Not recommend to make the interval faster. + DisplayActiveCallTimeout = 15000, -- 15 seconds = 15000 milliseconds by default. + + --====================== Image placeholders ===================-- + + CivilianPlaceholder = "https://assets.ea-rp.com/img/civilian_placeholder.png", + VehiclePlaceholder = "https://assets.ea-rp.com/img/vehicle_placeholder.png", + PropertyPlaceholder = "https://assets.ea-rp.com/img/property_placeholder.png", + + --====================== HUD settings ===================-- + + DisplayHUD = true, -- Set to false to hide the MDT HUD which is on screen by default. Edit the HUD: NUI/styles.css + DisplayIconsForHUD = true, -- If true will display icons in a HUD style on screen, DisplayHUD must be true. + DisplayLocationForHUD = true, -- If true will display locations in a HUD style on screen, DisplayHUD must be true. + DisplayWhetherDispatchIsActive = true, -- Displays the dispatch icon + text on the HUD on true. (When on shift) + + --====================== Access level settings ===================-- + + AccessLevelToArchiveCalls = 3, -- This means that access level 3 or higher can archive calls, same logic goes for the variables below. + AccessLevelForDispatch = 3, + AccessLevelToChangeCallsign = 1, + AccessLevelToEditFleetManagement = 5, + AccessLevelToEditTrainings = 5, + + --====================== MDT Menus ===================-- + + MDTMenus = { -- Edit options: Name and accesslevels. Do not edit, add or remove other things in MDTMenus! + -- All + [1] = {MenuName = "HOME", RequiredAccessLevel = 1, Show = true}, -- Department/civ selection (Always show) + -- Emergency services + [2] = {MenuName = "SHIFT", RequiredAccessLevel = 1, Show = true}, -- Status panel and shift toggling (Always show) + [3] = {MenuName = "EMERGENCY HOTLINE", RequiredAccessLevel = 1, Show = true}, -- Add menu: Active calls, Archived calls. EDIT CALLS LAYOUT TO WIDER CARD AND LIST UNDERNEATH EACHOTHER + -- Police + [4] = {MenuName = "PNC", RequiredAccessLevel = 1, Show = true}, -- Police National Computer (Search registrations of vehicles, civilians, fines and criminal records) Only police can access this. + -- Emergency services + [5] = {MenuName = "UNIT OVERVIEW", RequiredAccessLevel = 1, Show = true}, -- Overview of active units & locations, backup requests (You could name this Control / Dispatch) + [6] = {MenuName = "OPERATIONS", RequiredAccessLevel = 2, Show = true}, -- Memos, Report forms (medical report, fire incident, police incident) + [7] = {MenuName = "STATISTICS", RequiredAccessLevel = 4, Show = true}, -- General statistics in regards to the MDT. + -- Civilians + [8] = {MenuName = "DVLA", RequiredAccessLevel = 1, Show = true}, -- DMV in America, RDW in the Netherlands, DVLA in the UK + [9] = {MenuName = "COUNCIL", RequiredAccessLevel = 1, Show = true}, -- City Hall in America, Gemeente in the Netherlands, Council in the UK (Always Show) + [10] = {MenuName = "REAL ESTATE", RequiredAccessLevel = 1, Show = true}, -- Real Estate Authority in America, Het Kadaster in the Netherlands, Real Estate Authority in the UK + -- Management + [11] = {MenuName = "MANAGEMENT", RequiredAccessLevel = 1, Show = true}, -- Management (Future reference) + }, + + --====================== Emergency calls ===================-- + + EmergencyCallPicture = "999_call2.png", -- NUI/images/mylogo.png + EmergencyCallCooldown = 5, -- Seconds + + --====================== Tracking ===================-- + + AmountOfTimesToUpdateGPS = 10, -- Pushes given amount of updates and then disables tracker. + IntervalToUpdateGPS = 5, -- Seconds (10x5 = 50 seconds before tracker turns off automatically by default.) + SendMessageOnTrackerGPSUpdate = false, -- Can be quite annoying, recommended false. + + --====================== World (crime) events ===================-- + + EnableWorldCrimeEvents = true, -- Will NPC's report crimes or not? [Enabling this feature can increase resmon 0.10ms~ on trigger checks] + WorldCrimeEventTriggerCooldown = 120, -- Seconds (Cools down any world crime event serverwide to prevent flooding incoming calls.) + WeaponsExcludedFromShotSpotter = {"weapon_fireextinguisher", "weapon_hazardcan", "weapon_fertilizercan", "weapon_petrolcan", "gadget_parachute"}, + TimeToDeleteWorldCrimeEventBlip = 180, -- Seconds + + -- Shot spotter + ShotSpotterEnabled = true, -- Enable shot spotter? + ShotSpotterBlipSpriteId = 119, -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips + ShotSpotterBlipColor = 1, -- This is a color ID: https://docs.fivem.net/docs/game-references/blips/#blip-colors + ShotSpotterBlipText = "Reportedly shots fired", -- Blip text in legenda. + + -- Fight + FightSpotterEnabled = true, -- Enable fight spotter? + FightSpotterBlipSpriteId = 468, -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips + FightSpotterBlipColor = 1, -- This is a color ID: https://docs.fivem.net/docs/game-references/blips/#blip-colors + FightSpotterBlipText = "Reportedly a fight", -- Blip text in legenda. + + -- Road crime + RoadCrimeSpotterEnabled = true, -- Enable road crime spotter? + RoadCrimeSpotterBlipSpriteId = 645, -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips + RoadCrimeSpotterBlipColor = 1, -- This is a color ID: https://docs.fivem.net/docs/game-references/blips/#blip-colors + RoadCrimeSpotterBlipText = "Reportedly a road crime", -- Blip text in legenda. + + WorldCrimeEventBlipFlashes = true, -- Does the blip flash or not + WorldCrimeEventBlipScale = 0.9, -- This is the blip scale: 0.1 (smallest) 1.0 (default) + RecklessDrivingSpeedThreshold = 100, -- Any number, KMH or MPH is automatically converted via "KMHorMPH" at the top of the config. + + --====================== MDT Battery ===================-- + + TimeToDeductTwentyFivePercent = 900, -- Seconds + TimeToChargeTwentyFivePercent = 60, -- Seconds + + --====================== Panic button / Route & blips ===================-- + + TimeToDeleteBlipAndRoute = 180, -- Seconds + DistressSignalBlipColorOptions = {1, 38}, -- This is a random color selector: https://docs.fivem.net/docs/game-references/blips/#blip-colors + DistressSignalBlipRouteColorOptions = {6, 1}, -- This is a color pattern, add more or remove some in the format {0, 1, 2, 3, 4, 5}, + DistressSignalBlipSpriteId = 161, -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips + DistressSignalBlipText = "Distress Signal: ", -- Callsign follows. + DistressSignalBlipScale = 1.0, -- This is the blip scale: 0.1 (smallest) 1.0 (default) + DistressSignalSoundFile = "panicbutton", -- Upload your .ogg sound file to night_shifts/NUI/sounds/panicbutton.ogg, mention just the name without .ogg here + DistressSignalSoundFileVolume = 0.25, -- This is at your own risk and Nights Software is not liable for any damage caused by you changing this setting. (Limited to 1.0) + + --====================== BEEP (Dispatch action) ===================-- + + RadioBeepSound = "sepurabeep", + RadioBeepSoundVolume = 0.5, + + --====================== ANPR (1/2) ===================-- + + -- ANPRSendMessageToMarkedPerson = true, -- Do you want to send an alert to the one being spotted by ANPR? (» Message variable: SeenByANPR) + -- TimeToDeleteANPRBlip = 60, -- Seconds + -- ANPRBlipSpriteId = 184, -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips + -- ANPRBlipText = "ANPR: ", -- License plate follows. + -- ANPRBlipColor = 1, -- This is a color ID: https://docs.fivem.net/docs/game-references/blips/#blip-colors + -- ANPRBlipFlashes = true, -- Does the blip flash or not + -- ANPRBlipScale = 0.9, -- This is the blip scale: 0.1 (smallest) 1.0 (default) + + --====================== Backup requests ===================-- + + BackupCooldownTime = 60, -- Seconds + TimeToDeleteBackupBlip = 180, -- Seconds + BackupBlipSpriteId = 409, -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips + BackupBlipText = "Backup: ", -- Callsign follows + BackupBlipColors = { -- This is a color ID: https://docs.fivem.net/docs/game-references/blips/#blip-colors + Police = 38, + Ambulance = 5, + Fire = 1, + Tow = 73, + }, + BackupBlipFlashes = true, -- Does the blip flash or not + BackupBlipScale = 0.9, -- This is the blip scale: 0.1 (smallest) 1.0 (default) + + --====================== Report Sighting ===================-- + + TimeToDeleteSightingBlip = 240, -- Seconds + SightedPersonBlipSpriteId = 776, -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips + SightedPersonBlipColor = 1, -- This is a color ID: https://docs.fivem.net/docs/game-references/blips/#blip-colors + SightedVehicleBlipSpriteId = 645, -- This is a sprite ID: https://docs.fivem.net/docs/game-references/blips/#blips + SightedVehicleBlipColor = 1, -- This is a color ID: https://docs.fivem.net/docs/game-references/blips/#blip-colors + SightedBlipText = "Sighted: ", -- Sighted person name or sighted vehicle license plate will follow. + SightedBlipFlashes = true, -- Does the blip flash or not + SightedBlipScale = 0.9, -- This is the blip scale: 0.1 (smallest) 1.0 (default) + + --====================== Animations & Props ===================-- + + -- Show ID and Licenses + IDCardAndLicenseProp = "prop_franklin_dl", -- Native prop + ShowIDAndLicensesAnimationDictionary = "cop_badge_1@dad", -- Custom emote from script: rpemotes + ShowIDAndLicensesAnimation = "cop_badge_1_clip", -- Custom emote from script: rpemotes + ExitShowIDAndLicensesAnimationDictionary = "anim@cellphone@in_car@ps", -- Native emote + ExitShowIDAndLicensesAnimation = "cellphone_text_exit", -- Native emote + + -- Open MDT + MDTProp = "prop_cs_tablet", -- Native prop + ShowMDTAnimationDictionary = "amb@world_human_tourist_map@male@base", -- Native emote + ShowMDTAnimation = "base", -- Native emote + ExitShowMDTAnimationDictionary = "anim@cellphone@in_car@ps", -- Native emote + ExitShowMDTAnimation = "cellphone_text_exit", -- Native emote + + --====================== Station Alarms ===================-- + + -- Upload your .ogg sound file to night_shifts/NUI/sounds/*.ogg, mention just the name without .ogg in SoundFileName. + -- When a player is close to the station and a relevant call is triggered, it will play the configured station alarm. + -- CallType options: "police", "ambulance", "fire", "tow" + StationAlarmData = { + [1] = {StationName = "Station 1", CallType = "fire", StationCoordinates = vector3(1178.4938, -1467.9377, 42.4733), SoundFileName = "firealarm", SoundVolume = 0.25, SoundRadius = 250.0}, + [2] = {StationName = "Station 2", CallType = "fire", StationCoordinates = vector3(1701.1998, 3587.7131, 40.3211), SoundFileName = "firealarm", SoundVolume = 0.25, SoundRadius = 250.0}, + [3] = {StationName = "Station 3", CallType = "fire", StationCoordinates = vector3(-368.8117, 6112.9038, 39.4624), SoundFileName = "firealarm", SoundVolume = 0.25, SoundRadius = 250.0}, + [4] = {StationName = "Station 4", CallType = "fire", StationCoordinates = vector3(-1039.0610, -2382.3792, 28.5009), SoundFileName = "firealarm", SoundVolume = 0.25, SoundRadius = 250.0}, + [5] = {StationName = "Station 5", CallType = "fire", StationCoordinates = vector3(193.9283, -1662.9021, 29.5363), SoundFileName = "firealarm", SoundVolume = 0.25, SoundRadius = 250.0}, + }, + + --====================== MDT Status Codes ===================-- + + -- Automated status responses for status indexes, status indexes are: [1] or [4] for example. Example: index [4] is statusCode 3 which means Officer is at a station. + OnDutyStatusIndex = 2, + OffDutyStatusIndex = 12, -- Change these along with your index number in MDTStatusCodes. + RespondingStatusIndex = 6, + OnSceneStatusIndex = 7, + PanicButtonStatusIndex = 1, + + -- All status codes, you can add more. But recommended to list only those you use. Mind the index numbers, they have to be ordered like in the example below. + MDTStatusCodes = { + [1] = {StatusCode = "0", StatusName = "Officer in life threatening situation.", StatusColor = "dc3545", DetachFromLastCall = true}, -- Color HEX: https://www.color-hex.com/ without the hashtag. + [2] = {StatusCode = "1", StatusName = "Officer on-duty.", StatusColor = "28a745", DetachFromLastCall = true}, + [3] = {StatusCode = "2", StatusName = "Officer is available (deployable).", StatusColor = "28a745", DetachFromLastCall = true}, + [4] = {StatusCode = "3", StatusName = "Officer is at a station.", StatusColor = "28a745", DetachFromLastCall = true}, + [5] = {StatusCode = "4", StatusName = "Officer is available but on a break.", StatusColor = "ffc107", DetachFromLastCall = true}, + [6] = {StatusCode = "5", StatusName = "Officer is en-route to scene.", StatusColor = "ffc107", DetachFromLastCall = false}, + [7] = {StatusCode = "6", StatusName = "Officer is now at scene.", StatusColor = "ffc107", DetachFromLastCall = false}, + [8] = {StatusCode = "7", StatusName = "Committed, but deployable.", StatusColor = "ffc107", DetachFromLastCall = false}, + [9] = {StatusCode = "8", StatusName = "Committed, not deployable.", StatusColor = "ffc107", DetachFromLastCall = false}, + [10] = {StatusCode = "9", StatusName = "Prisoner Escort.", StatusColor = "6c757d", DetachFromLastCall = false}, + [11] = {StatusCode = "10", StatusName = "At courts.", StatusColor = "6c757d", DetachFromLastCall = false}, + [12] = {StatusCode = "11", StatusName = "Officer off-duty.", StatusColor = "0e0e0e", DetachFromLastCall = true}, + [13] = {StatusCode = "12", StatusName = "Confidential message.", StatusColor = "6c757d", DetachFromLastCall = false}, + [14] = {StatusCode = "13", StatusName = "Call back, not urgent.", StatusColor = "6c757d", DetachFromLastCall = false}, + [15] = {StatusCode = "14", StatusName = "Urgent call back.", StatusColor = "6c757d", DetachFromLastCall = false}, + [16] = {StatusCode = "15", StatusName = "Received.", StatusColor = "6c757d", DetachFromLastCall = false}, + [17] = {StatusCode = "16", StatusName = "Repeat.", StatusColor = "6c757d", DetachFromLastCall = false}, + [18] = {StatusCode = "17", StatusName = "Traffic stop.", StatusColor = "6c757d", DetachFromLastCall = false}, + } +} \ No newline at end of file diff --git a/resources/night_shifts/config/setup_config.lua b/resources/night_shifts/config/setup_config.lua new file mode 100644 index 000000000..197c8434a --- /dev/null +++ b/resources/night_shifts/config/setup_config.lua @@ -0,0 +1,8 @@ +Config = Config or {} + +--========================= Setup Config ========================-- + +Config.Setup = { + -- Future reference. +} + diff --git a/resources/night_shifts/config/translations.lua b/resources/night_shifts/config/translations.lua new file mode 100644 index 000000000..cfdb897e2 --- /dev/null +++ b/resources/night_shifts/config/translations.lua @@ -0,0 +1,3512 @@ +--====================== Language ======================-- + +-- Use CNTL + F to search and find your language (English language names). + +Config.Messages = { + + --============================== ENGLISH ==============================-- + ['en'] = { + Info = "^2INFO^7", + Error = "^1ERROR^7", + Syntax = "Syntax", + Yes = "Yes", + No = "No", + Nearby = "nearby", + Unknown = "Unknown", + Enabled = "enabled", + Disabled = "disabled", + Downloading = "Downloading...", + AutomaticAlarm = "Automatic Alarm Trigger", + SomethingWentWrong = "Something went wrong when trying to update your data. This error can be critical, please contact the server owner and ask them to check the server logs.", + ToggleNotifications = "^3Notifications ^7are now ", + North = "N", + NorthEast = "NE", + East = "E", + SouthEast = "SE", + South = "S", + SouthWest = "SW", + West = "W", + NorthWest = "NW", + Browse = "Browse", + Cancel = "Cancel", + Anonymous = "Anonymous", + ShowID = "Show ID", + ShowingIDCardOF = "Showing ID card of", + CancelledShowingIDCard = "Cancelled showing an ID card...", + Location = "Location:", + MDTReady = "Your MDT is ready for usage!", + DisconnectedFromMDT = "Your MDT is now on stand-by mode.", + CancelledCall = "You've hung up and cancelled your emergency hotline call.", + ForceClosedMDT = "You've forced the MDT & call screen to close.", + MDTIsUpdating = "Your MDT is updating. Please try again later...", + MDTIsCharging = "Your MDT is already charging.", + MDTIsStillOpen = "You can't do this whilst your MDT is turned on.", + MDTIsStillLoading = "Could NOT find one of the following subjects: Your fivem ID or Discord roles. Make sure to log into the FiveM App and link your CFX & Discord account. If this issue persists, please contact the server owner.", + EmergencyCallCooldown = "You have to wait 1 minute to call in another emergency...", + EmergencyCallScreenStillOpen = "You can't do this whilst your emergency call system is turned on.", + MDTRecentlyRefreshed = "Your MDT has recently been refreshed, try again soon...", + NoAccessToMDT = "You seem to be missing the required discord roles to access the MDT.", + AccessGrantedMDT = "You've been granted access to", + AccessDeniedMDT = "Access denied to", + NoAccess = "You do not have the required access level: ", + DispatchWasAlreadyActive = "Could not assign you as dispatcher, because dispatch is already active.", + UnitAssigned = "You have assigned the unit to the call.", + UnitsAssigned = "You have assigned the selected units to the call.", + AssignedNewStatus = "You have assigned a new status to the unit.", + AssignedNewFleetVehicle = "You've assigned a fleet vehicle.", + DetachedThemFromVehicleInFleet = "You've detached the unit from any fleet vehicle.", + YouHaveBeenAssignedAFleetVehicle = "You have been assigned a fleet vehicle:", + YouHaveBeenDetachedFromAnyFleetVehicle = "You have been detached from any fleet vehicle.", + Selected = "Selected: ", + YourAccessLevel = "Your access level: ", + RequiredAccessLevel = "Required Access level: ", + SuccesfullyDeletedCall = "Successfully deleted the call.", + TrackingCall = "You're now tracking the call.", + AssignedToCall = "Dispatch has assigned you to a call, marked on your map by GPS navigation, more information will follow ASAP...", + AssignedCallInfo = "You've been dispatched to call ", + AssignedCallEmergency = "Emergency: ", + CallerName = "Caller Name: ", + CallerContactDetails = "Contact details: ", + CallStreet = "Street: ", + CallArea = "District: ", + CallPostal = "Postal: ", + CallDescription = "Call description: ", + CallContactDetails = "Contact details: ", + OffShift = "You have ended your shift.", + OnShift = "You have started your shift.", + Status = "Status: ", + StatusChanged = "Status changed!", + EmergencyCallMade = "Your emergency call was forwarded to the authorities.", + EmergencyCallFailed = "Your emergency call was not detailed enough. Try again.", + EmergencyHotlineBusy = "The emergency service hotline is busy at this moment. Try again later...", + CannotSwitchDepartmentWhilstOffShift = "You can't switch departments when not shift. Sign on shift first.", + DispatchMessage = "Dispatch Message: ", + DispatchMessageCooldown = "You've recently sent a dispatch message. Please wait 10 seconds.", + RegisteredVehicle = "Registered your vehicle!", + DeletedVehicle = "Deleted your registered vehicle successfully!", + DeletedVehicleFailed = "You can not delete the vehicle, since the database requires at least one entry, add a new one first.", + UpdatedVehicle = "Updated your vehicle successfully!", + UpdatedBolo = "Updated a BOLO successfully!", + RegisteredCivilian = "Registered your civilian successfully!", + DeletedCivilian = "Deleted your civilian successfully!", + DeletedCivilianFailed = "You can not delete the Civilian, since the database requires at least one entry, add a new one first.", + UpdatedCivilian = "Updated your civilian successfully!", + UpdatedMarkers = "Updated their markers successfully!", + AddedPoliceReport = "Successfully added the police report!", + AddedPoliceFine = "Successfully added the fine!", + DuplicateEntryCivilian = "You cannot register an already existing civilian with name: ", + DuplicateEntryVehicle = "You cannot register an already existing vehicle with plate: ", + LoadingCallSystem = "The call system is still loading... Please try again soon!", + YourEmergencyCall = "Your (emergency) call", + HasBeenForwarded = "has been forwarded to the emergency services hotline.", + CouldNotFindStatusCode = "Could not find this status code.", + ServerWasSynchronizingTryAgain = "The server was still synchronizing... Please try again soon!", + NewIncidentReceived = "🚨 999 EMERGENCY CALL 🚨 Press F10 to open the MDT.", + TrackerDisabled = "The tracker has been disabled. If you require more locations to be pushed, track them again.", + UpdatedTracker = "Updated tracker with new GPS navigation coordinates for ", + ResetTracker = "Reset tracker for ", + NewTrackerCoords = "Setting new GPS navigation coordinates to ", + MDTInitiateCharging = "Charging your MDT battery.", + MDTBatteryCharging = "Your MDT battery is being charged, this can take a few minutes. You're currently on: ", + MDTBatteryCharged = "Your MDT battery has been charged to: ", + MDTBatteryLevelLow = "Battery level low! Charge your MDT in a vehicle or interior. Syntax: /chargemdt", + MDTBatteryEmpty = "Battery empty! Charge your MDT in a vehicle or interior. Syntax: /chargemdt", + MDTBatteryIsFullAlready = "Your MDT battery is already full.", + AddedOperationsReport = "You've succesfully added an operations report.", + CannotTrackYourself = "You can not track yourself.", + NoChargePointNearby = "Your MDT can not charge: there is no charging port close to you. Enter a vehicle or interior to your MDT. Syntax: /chargemdt", + MDTBatterySystemDisabled = "The server owner has disabled the MDT battery system.", + MissingMDTItemInInventory = "You do not have an MDT in your inventory.", + MissingMDTChargerItemInInventory = "You do not have an MDT charger in your inventory.", + MissingPhoneItemInInventory = "You do not have a phone to call the emergency services in your inventory.", + PanicButtonPressed = "Panic button pressed! A distress signal has been marked on other units' map.", + DistressSignalActivated = "ALERT! A panic button was pressed. Please make way to the (latest) distress signal location marked on your map.", + DistressSignalStillActive = "Your distress signal was recently sent out to other units, please await the cooldown.", + BackupRequestCooldown = "You have recently requested backup, please try again later...", + BackupRequest = "Backup Request - ", + BackupDepartment = "Department requested: ", + BackupStreet = "Location: ", + BackupPostal = "Postal: ", + BackupRequesterDepartment = "Requester department: ", + BackupMarkedOnYourMap = "The backup request has been pinpointed on your map.", + BackupDefaultType = "None.", + WantedPersonSighted = "Wanted person sighting reported by ", + SightedAt = "at", + SightedMarkerDescription = "Marker description: ", + ANPRHit = "ANPR ALERT - ", + ANPRBOLO = "BOLO: ", + ANPRStolen = "Stolen: ", + ANPRInsurance = "Insurance: ", + ANPRMot = "MOT: ", + ANPRTax = "Tax: ", + ANPRStreet = "Streetname: ", + ANPRPostal = "Postal: ", + ANPRMarkedBOLO = "BOLO active", + ANPRNoBOLO = "BOLO inactive", + ANPRMarkedStolen = "Marked stolen", + ANPRNotStolen = "Not Stolen", + ANPRValid = "Valid MOT", + ANPRInvalid = "Invalid MOT", + ANPRPaid = "Tax Paid", + ANPRNotPaid = "Tax not paid", + ANPRInsured = "Insured", + ANPRNotInsured = "Not insured", + ANPRNo = "No.", + ANPRYes = "Yes.", + SeenByANPR = "SNAP! The ANPR camera feed has marked & located your vehicle.", + ANPRVehicleSighted = "ANPR registered vehicle sighting reported by", + ANPRVehicleOwnedBy = "Owner: ", + ANPRVehicleFlags = "Flags:", + LoadingANPR = "The ANPR system is still loading... Please try again soon!", + ANPRInVehicleEnabled = "You've switched on the in-vehicle ANPR system.", + ANPRInVehicleDisabled = "You've switched off the in-vehicle ANPR system.", + ANPRUnlocked = "ANPR Unlocked!", + NotInVehicle = "You must be in a vehicle to do this...", + YouAreNotOnShift = "You need to be on shift to do this...", + ChangedYourCallsign = "You've succesfully changed your callsign to: ", + ChangedTheirCallsign = "You've succesfully changed their callsign to: ", + DispatchSetYourCallsign = "Dispatch has assigned you a new callsign: ", + BeepedUnit = "You've sent a beep sound to unit: ", + CannotDeleteThisCivilianStillHasVehicles = "You can't delete this civilian, because they still have vehicles registered to them...", + BackupPolice = "Police Services", + BackupAmbulance = "Medical Services", + BackupFire = "Fire Services", + BackupTow = "Tow Services", + NoPlayerNearby = "There are no players nearby...", + YouHaveNoCivilianCharacters = "You've got no registered civilians...", + APlayerNearbyShowsID = "A player nearby shows their ID card to you.", + APlayerNearbyShowsID2 = "to look at it.", + UpdatedFine = "Succesfully updated the fine.", + CouldNotUpdatedFine = "Could not update this fine, the server was still synchronizing recent updates for it...", + DetachedFromCall = "You've detached from the last call.", + UnitDetached = "UNIT DETACHED -", + DuplicatePropertyAddress = "A property has already been registered on this address: ", + RegisteredProperty = "Registered your property!", + UpdatedProperty = "Updated your property!", + DeletedProperty = "Deleted your property!", + DeletedPropertyFailed = "You can not delete the Property, since the database requires at least one entry, add a new one first.", + UpdatedPropertySeized = "(Un)seized the property!", + NotAttachedToAnyCall = "You are not attached to any active call.", + VehicleAddedToFleet = "You've succesfully added a vehicle to the fleet.", + VehicleDeletedFromFleet = "You've succesfully deleted a vehicle from the fleet.", + VehicleDeletedFromFleetFailed = "You can not delete the vehicle from the fleet, since the database requires at least one entry, add a new one first.", + VehicleUpdatedInFleet = "Updated the vehicle in the fleet.", + StatisticsCalls = "Calls Registered", + StatisticsCallNotes = "Call Notes Registered", + StatisticsFines = "Fines Registered", + StatisticsVehicles = "Vehicles Registered", + StatisticsFleetVehicles = "Fleet Vehicles Registered", + StatisticsCivilians = "Civilians Registered", + StatisticsProperties = "Properties Registered", + StatisticsOperationReports = "Operation Reports Registered", + StatisticsANPRVehicles = "Vehicles in ANPR", + StatisticsWantedPeople = "Wanted People", + UpdatedTrainings = "Updated their training & certificates.", + ShotsFiredAt = "Shots fired at", + FightAt = "Fight at", + RoadCrimeAt = "Misbehaviour in traffic at", + SentDispatchMessage = "Broadcasted your dispatch message to all units.", + + -- COMMAND CHAT SUGGESTIONS + ToggleNotificationsHelpText = "A command used to toggle notifications for the MDT. (Not recommended to disable)", + MobileDataTerminalHelpText = "A command to open the mobile data terminal.", + CallEmergenciesHelpText = "A command to call the emergency services hotline.", + ChargeMDTHelpText = "A command to charge your MDT's battery.", + ForceCloseMDTHelpText = "Force close the MDT with this command.", + StatusChangeHelpText = "A command to quickly change your status.", + ShowIDAndLicensesHelpText = "A command to offer showing your ID & Licenses to the nearest player.", + StatusChangeArgument1 = "statuscode", + StatusChangeArgument1Example = "2", + ToggleANPRHelpText = "A command used to toggle the use ANPR within a vehicle.", + DisplayActiveCallHelpText = "A command to display the details your current active call on screen.", + + Icons = { -- https://fontawesome.com/search?q=check&o=r&m=free + SuccessIcon = "fa-solid fa-check", + WarningIcon = "fa-solid fa-triangle-exclamation", + ErrorIcon = "fa-solid fa-xmark", + DispatchIcon = "fa-solid fa-walkie-talkie", + EmergencyIcon = "fa-solid fa-phone-volume", + }, + + -- TRANSLATIONS INSIDE THE MDT + MDTText = { + -- GENERAL + Loading = "Loading...", + Yes = "Yes", + No = "No", + Select = "Select", + Attach = "Attach", + Police = "Police", + Ambulance = "Ambulance", + Fire = "Fire", + Tow = "Tow", + DMV = "DVLA", + CityHall = "COUNCIL", + DispatchActive = "Dispatch Active", + DispatchInactive = "Dispatch Inactive", + Actions = "Actions", + AddFleetCard = "Add vehicle", + EditFleetCard = "Edit vehicle", + FleetCardPictureURL = "Picture URL", + FleetCardVehicleName = "Make & Model", + FleetVehicleNamePlaceHolder = "Audi A4", + FleetCardVehicleModel = "Spawn model name", + FleetVehicleModelPlaceHolder = "taudia4", + FleetCardVehicleInService = "In Service", + FleetCardVehicleAttachedUnits = "Attached units", + FleetCardRoofCodeCallsign = "Roofcode/callsign", + FleetRoofCodeCallsignPlaceHolder = "CW-01", + NoVehiclesInThisFleet = "There are no vehicles in this fleet.", + DetachFromAnyFleetVehicles = "Detach from any fleet vehicles", + ValidationFailed = "Validation failed. Please fill in all required fields.", + CreatedAt = "Created or last updated at", + AreYouSureDeleteFleetVehicle = "Are you sure you want to delete this vehicle from the fleet?", + DeleteVehicleFromFleet = "Delete vehicle from fleet", + SelectAction = "Select an action", + SelectDepartment = "Select a department", + --SelectSubDepartment = "Select a subdepartment", + RefreshButton = "Refresh", + AddCallButton = "Add call", + ActivateDispatchButton = "(De)activate dispatch", + RegisterButton = "Register", + EditButton = "Edit", + DeleteButton = "Delete", + DetachAnyUnitsButton = "Detach all", + ArchiveButton = "Archive", + SaveChangesButton = "Save changes", + AddFineButton = "Add Fine", + MarkFineAsPaidButton = "Mark As Paid", + AddRecordButton = "Add Record", + CloseButton = "Close", + ShowCitizenButton = "Show Citizen", + EditBOLOButton = "Edit BOLO", + CancelButton = "Cancel", + CallEmergencyServicesButton = "Call emergency services", + OneOrMoreFieldsHaveNotBeenFilled = "One or more fields have not been filled!", + NoUnitsSelected = "You haven't selected any units...", + ClosingIn = "Closing in", + ClosingSeconds = "seconds...", + + -- SHIFT MENU + ToggleShift = "Toggle Shift", + SelectSubDepartmentAndShiftInfo = "Select your sub-department and start your shift.", + SelectSubDepartment = "Select Sub-department", + SubDepartment = "Sub-Department", + EmployeeDetails = "Employee Details", + EmployeeName = "Name: ", + EmployeeRank = "Rank: ", + EmployeeCallsign = "Callsign: ", + EmployeeVehicleRoofcode = "Vehicle roofcode: ", + EmployeeActiveCall = "Active call ID: ", + EmployeeCurrentShiftTime = "Current shift duration: ", + EmployeeShiftTime = "Total shift duration: ", + EmployeeMinutes = "minutes.", + EmployeeHours = "hours", + EmployeeDays = "days", + EmployeeAccessLevel = "User Access Level: ", + EmployeeStatus = "Active Status Code: ", + EmployeeStatus2 = "Active Status: ", + EmployeeActiveSubDepartment = "Active Sub-department: ", + StatusPanel = "Status panel", + SelectStatus = "Select your status", + StatusPanelInfo = "Select your status whilst on shift and keep dispatch updated.", + EditCallsign = "Edit Callsign", + EnterNewCallsign = "Enter new callsign", + NewCallsign = "New Callsign", + CallsignErrorMessage1 = "Please enter a new callsign with only letters, numbers, and hyphens.", + CallsignErrorMessage2 = "Please enter a new callsign with a maximum of 15 characters.", + + -- EMERGENCY HOTLINE + EmergencyCall = "Emergency call", + NonEmergencyCall = "Non-Emergency Call", + EmergencyCalls = "Emergency Hotline", + ActiveCalls = "Active Calls", + ArchivedCalls = "Archived Calls", + ArchivedCall = "Archived call", + DestroyedCall = "Deleted call", + DestroyedCalls = "Deleted calls", + DestroyedCallFailed = "You can not delete the call, since the database requires at least one entry, add a new one first.", + CallID = "#", + CallerId = "ID:", -- Unused? + CallDetails = "Details", + CallInformation = "Get insight into the call by reading the details below.", + CallDescription = "Description", + CallerPostal = "Postal: ", + CallerStreetName = "Street: ", + CallerAreaName = "District: ", + ContactDetails = "Contact details: ", + CallUnits = "Units tracking/tracked call: ", + CallEmergencyType = "Emergency type: ", + CallEmergency = "Emergency", + CallNonEmergency = "Non-Emergency", + CallRequiredUnits = "Required units", + EmergencyServicesHotline = "Emergency Services Hotline", + EmergencyCallBy = "Caller:", + DeleteCall = "Archive", + GPS = "Locate via GPS", + SendBeep = "Send beep", + SelectCivilianMakingTheCall = "Select the civilian making the call...", + IsThisAnEmergency = "Is this call an emergency?", + IsThisCallAnonymous = "Are you calling anonymous?", + DoYouRequire = "Do you require", + ToAttend = "to attend?", + AtWhatPostal = "At what postal is this incident?", + AtWhatStreet = "At what street is this incident?", + AtWhatArea = "At what district/area is this incident?", + TimeOfCall = "Time of call", + HowToContact = "How can we contact you?", + PlaceHolderSelectCivilian = "Select a citizen...", + PlaceholderHowToContact = "Phone, E-mail or a station to visit", + EmergencyCallOverview = "Emergency call overview", + CallNotes = "Call Notes", + CallAddNotesButton = "View/Add notes", + CallAddUnitsButton = "Assign units", + CallViewNotesButton = "View notes", + CallNotesTitle = "Call Notes | Call ", + CallNoteCreatedSystemMessage = "CALL NOTE CREATED.", + CallerName = "Caller Name: ", + AddNoteButton = "Add Note", + AddNotePlaceholder = "Add a new note...", + AddedCallNote = "Added a call note to call ", + System = "SYSTEM", + Next = "Next", + Previous = "Previous", + + -- PNC + BornOn = "Born on ", + Markers = "Markers", + MarkersSubTitle = "Any active markers are displayed below.", + ArmedAndDangerous = "Armed and Dangerous", + Assault = "Assault", + Burglary = "Burglary", + DrugRelated = "Drug Related", + GangAffiliation = "Gang Affiliation", + Homicide = "Homicide", + Kidnapping = "Kidnapping", + MentalHealth = "Mental Health Issues", + SexOffense = "Sex Offense", + Terrorism = "Terrorism", + Theft = "Theft", + TrafficViolation = "Traffic Violation", + WantedPerson = "Wanted Person", + OtherMarker = "Other, read description...", + ActiveWarrant = "Active Warrant", + DescribeMarkerAndWarrant = "Describe markers/warrant", + Timestamp = "Timestamp", + ShowVehicles = "Show Vehicles", + ShowProperties = "Show Properties", + ShowRecords = "Show Records", + ShowFines = "Show Fines", + EditMarkers = "Edit Markers", + AddRecord = "Add Record", + AddFine = "Add Fine", + NoCitizensFound = "No citizens found by", + EnterAtLeast = "Please enter at least", + Characters = "character(s)", + AddRecordFor = "Add a record for", + Charge = "Criminal Offense", + Description = "Description", + Victims = "Victims", + LocationDescription = "Location description", + OfficerDetails = "Officer Details", + Sentence = "Sentence", + Prosecuted = "Has the suspect been prosecuted for this offense?", + Prosecuted2 = "Prosecuted", + ReportDate = "Report date", + AddFineFor = "Add a fine for", + TicketableOffense = "Ticketable Offense", + FineDescription = "Fine Description", + FineAmount = "Fine Amount", + DueDate = "Due Date", + PaidFine = "Has the offender paid the fine?", + FineDate = "Fine Date", + GeneratedForCitizenId = "Generated for Citizen ID", + NoRecordsFound = "No records found for Citizen ID", + RegisteredToCitizenId = "Registered to citizen ID", + CitizenName = "Citizen Name", + NoVehiclesFoundForCitizenId = "No vehicles found for Citizen ID", + FineIssuedOn = "Fine issued on", + FinePaid = "Fine Paid", + NoFinesFoundForCitizenId = "No fines found for Citizen ID", + EditMarkersFor = "Edit Markers for", + LastUpdatedBy = "Last updated by", + PNCOverview = "PNC", + PNCPersonSearch = "Person Search", + PNCPersonSearchPlaceholder = "John Doe / Citizen ID", + PNCVehicleSearch = "Vehicle Search", + PNCVehicleSearchPlaceholder = "HF22 BXU / Citizen ID", + PNCPropertySearch = "Property Search", + PNCPropertySearchPlaceholder = "Citizen ID", + NoPropertiesFoundForCitizenId = "No properties found for Citizen ID", + PNCRecordSearch = "Record Search", + PNCRecordSearchPlaceholder = "Citizen ID", + PNCFineSearch = "Fine Search", + PNCFineSearchPlaceholder = "Citizen ID", + PNCResults = "Results", + PNCMarkStolen = "Mark as stolen?", + PNCBolo = "BOLO Active?", + DescribeBolo = "Describe the reason for initiating a BOLO", + PNCBoloDescription = "BOLO Description:", + EditBoloFor = "Edit BOLO for ", + Search = "Search", + Send = "Send", + Dispatch = "Control", + DispatchMessagePlaceholder = "Send a message to all active units.", + DispatchMessageTitle = "Control Announcement", + ActiveUnits = "Active Units", + Backup = "Backup", + FleetManagement = "Fleet Management", + ActiveWarrants = "Active Warrants", + WantedFor = "Wanted for:", + LastUpdated = "Last updated:", + ReportSighting = "Report sighting", + DateAndTime = "Date and Time", + ANPRSection = "ANPR", + ANPRSectionFullName = "Automatic Number Plate Recognition", + PlaceholderCharge = "Theft", + PlaceholderVictims = "John Doe, Jane Doe", + PlaceholderLocationDescription = "Streetname, postal, address", + PlaceholderOfficerDetails = "C. Lowly - Badge #3622", + PlaceholderSentence = "Describe the sentence", + PlaceholderTicketableOffense = "Speeding", + NoWantedPersonsFound = "No wanted persons found...", + NoWantedVehiclesFound = "No wanted vehicles found...", + ANPRFront = "ANPR FRONT", + ANPRRear = "ANPR REAR", + ANPRModel = "Model:", + ANPRColour = "Colour:", + ANPRSpeed = "Speed:", + ANPRFlags = "Flags:", + ANPRLocation = "Location:", + + -- UNIT OVERVIEW + NameId = "Name (ID)", + Callsign = "Callsign", + ModeOfTransport = "Mode of transport", + VehicleRoofcode = "Vehicle roofcode", + Department = "Department", + Rank = "Rank", + Location = "Location", + Postal = "Postal", + Status = "Status", + Tracking = "Tracking", + DispatchMessageError = "Please insert at least 10 characters.", + RequestBackupFromPolice = "Request backup from the police department.", + RequestBackupFromAmbulance = "Request backup from the ambulance department.", + RequestBackupFromFire = "Request backup from the fire department.", + RequestBackupFromTow = "Request the tow services.", + RequestBackupButton = "Request Backup", + RequestedBackupType = "Backup Requested", + NoActiveCalls = "There are no active calls at this moment...", + NoActiveUnits = "There are no active units at this moment...", + AssignToACall = "Assign to a call", + AssignToCallButton = "Assign to call", + AssignUnitsToCallButton = "Assign Unit(s)", + AssignUnitToCallOverview = "ACTIVE UNIT OVERVIEW | Assign units to call", + AssignUnitToCall = "ACTIVE CALL OVERVIEW | Assign ", + AssignToCallHelp = "When they are assigned to the call, they will receive a route indicator on their map. They will also get set to the 'responding' status.", + AssignNewStatus = "Assign new status", + AssignNewCallsign = "Assign new callsign", + AssignNewFleetVehicle = "Assign new fleet vehicle", + AssignUnitNewStatus = "ASSIGN STATUS TO UNIT ", + UnitsTrackingCall = "Units tracking call", + None = "None", + ActiveCallID = "Active Call", + SirensOn = "Sirens ON", + SirensOff = "Sirens OFF", + + -- OPERATIONS + Report = "Report", + ReportType = "Report Type", + Operations = "Operations", + AddReports = "Add Operation Reports", + SearchReports = "Search Operation Reports", + SearchReportsPlaceholder = "Enter a query (eg. name or part of the description)", + SearchReportsByDatePlaceholder = "Search by date", + SelectReportType = "Select a report type...", + SelectReportTypePolice = "Police reports", + SelectReportTypeFire = "Fire reports", + SelectReportTypeMedical = "Medical reports", + MedicalReportType = "Medical Report Type", + FireReportType = "Fire Report Type", + PoliceReportType = "Police Report Type", + SubmitReport = "Submit Report", + ViewReport = "View Full Report", + NoOperationReportsFound = "No operation reports found on", + SignedBy = "Signed by", + SignedByPlaceholder = "Enter your name", + DescriptionPlaceholder = "Enter a description", + LocationPlaceholder = "Enter a location (eg. streetname, area, postal)", + EmployeeInvolved = "Employee(s) involved", + EmployeeInvolvedPlaceholder = "Enter names / Badge numbers / Citizen ID's (eg. Department, rank, name and more details)", + CivilianInvolved = "Civilian(s) involved", + CivilianInvolvedPlaceholder = "Enter names / Citizen ID's", + VehicleInvolved = "Vehicle(s) involved", + VehicleInvolvedPlaceholder = "Enter vehicles / Vehicle ID's / Citizen ID's (eg. vehicle owners)", + PenalCode = "Police Handbook", + Guidelines = "Guidelines", + Training = "Training", + UpdateTrainings = "Update Trainings", + + -- STATISTICS + Statistics = "Statistics", + ViewStatistics = "View All Time Statistics", + --== COLORS + AxesColor = "rgba(255, 255, 255, 0.6)", + barColor = "rgba(122, 189, 225, 0.2)", + barBorderColor = "rgba(122, 189, 225, 1)", + + -- DMV + LicensePlate = "License Plate", + Make = "Make", + Model = "Model", + Color = "Colour", + BuildYear = "Build year", + TaxPaid = "Tax Paid?", + MOTPassed = "Ministry of Transport (MOT) annual test passed?", + Insurance = "Insurance?", + ReportAsStolen = "Report as stolen?", + ReportedStolen = "Reported Stolen?", + RegisteredOn = "Registered on", + OwnedBy = "Owned by", + VehicleRegisterId = "Vehicle Registration Number", + MoT = "MOT?", + EditVehicleRegistration = "Edit vehicle registration", + OwnedByCitizenId = "Owned by Citizen ID", + VehiclePictureURL = "Vehicle Picture URL", + RegistrationDate = "Registration Date", + SelectCitizen = "Select a citizen...", + RegisterAVehicle = "Register a vehicle", + RegisterVehicleSubtitle = "Register your desired vehicle!", + ViewRegisteredVehicles = "View your registered vehicles", + EditVehiclesSubtitle = "Edit them all your way!", + AreYouSureDeleteVehicle = "Are you sure you want to delete your registered vehicle?", + DeletingVehicleCannotBeUndone = "Deleting this registered vehicle cannot be undone.", + YesDeleteVehicle = "Yes, delete my registered vehicle.", + PlaceholderLicensePlate = "HA23-RHY (No whitespaces)", + PlaceholderMake = "Audi", + PlaceholderModel = "A6 Avant", + PlaceholderColor = "Red", + PlaceholderYear = "2023", + + -- CITY HALL + FirstName = "First Name", + LastName = "Last Name", + DateOfBirth = "Date of birth", + Gender = "Gender", + Email = "E-mail", + PhoneNumber = "Phone number", + Address = "Address", + AddressType = "Address type", + City = "City", + State = "State", + PostalCode = "Postal code", + Country = "Country", + Occupation = "Occupation", + Nationality = "Nationality", + PictureURL = "Picture URL", + RegisterCarLicense = "Register car license?", + RegisterBikeLicense = "Register bike license?", + RegisterTruckLicense = "Register truck license?", + RegisterBoatLicense = "Register boat license?", + RegisterPilotLicense = "Register pilot license?", + Licenses = "Licenses", + CitizenId = "Citizen ID", + CarLicense = "Car License", + BikeLicense = "Bike License", + TruckLicense = "Truck License", + BoatLicense = "Boat License", + PilotLicense = "Pilot License", + EditCitizen = "Edit civilian", + ProfilePictureURL = "Civilian Picture URL", + RegisterACivilian = "Register a civilian", + RegisterCivilianSubtitle = "Register whoever you want to be!", + ViewRegisteredCivilians = "View your registered civilians", + EditCiviliansSubtitle = "Edit them all your way!", + AreYouSureDeleteCivilian = "Are you sure you want to delete your civilian?", + DeletingCivilianCannotBeUndone = "Deleting this character cannot be undone.", + YesDeleteCivilian = "Yes, delete my civilian.", + PlaceholderFirstName = "John", + PlaceholderLastName = "Doe", + PlaceholderGender = "Any gender", + PlaceholderEmail = "johndoe@nsmail.com", + PlaceholderPhonenumber = "31613371337", + PlaceholderAddress = "Grove Street 5", + PlaceholderAddressType = "House, apartment, studio, and/or floor", + PlaceholderCity = "London", + PlaceholderState = "Greater London", + PlaceholderPostal = "9104", + PlaceholderCountry = "United Kingdom", + PlaceholderOccupation = "Accountant", + PlaceholderNationality = "English", + + -- REAL ESTATE + RealEstate = "Real Estate", + ViewRegisteredProperties = "View your registered properties", + EditPropertiesSubtitle = "Edit them the way you like!", + RegisterAProperty = "Register a property", + RegisterPropertySubtitle = "Register your desired properties", + SelectPropertyType = "Property type...", + HouseNumber = "House number", + PlaceholderHouseNumber = "12", + PropertyPictureURL = "Property Picture URL", + Area = "District", + PlaceholderArea = "Vinewood Hills", + PlaceholderPostalCode = "5001", + PlaceholderPrice = "25000", + Amenities = "Amenities", + PlaceholderAmenities = "Describe the amenities...", + PropertyOwnedBy = "Owned by", + PropertySeized = "Seized Property?", + EditPropertySeizedButton = "(Un)seize", + PropertyType = "Property Type", + PropertyRegisterId = "Property Registration Number", + PropertyAddress = "Adress", + PropertyHouseNumber = "House Number", + PropertyArea = "District", + PropertyPostalCode = "Postal Code", + PropertyDescription = "Description", + PropertyPrice = "Price", + PropertyBuildYear = "Build Year", + PropertyAmenities = "Aminities", + AreYouSureDeleteProperty = "Are you sure to delete this property?", + DeletingPropertyCannotBeUndone = "Deleting this property can not be undone.", + YesDeleteProperty = "Delete Property", + EditPropertyRegistration = "Edit Property Registration", + + -- Management + Management = "Management Panel", + ManageCivilians = "Civilians", + ManageVehicles = "Vehicles", + ManageProperties = "Properties", + ManageCalls = "Calls", + CivilianIDPlaceholder = "Citizen ID", + VehicleIDPlaceholder = "Vehicle Registration ID", + PropertyIDPlaceholder = "Property Registration ID", + CallIDPlaceholder = "Call ID", + + Delete10Calls = "Delete 10 oldest calls", + Delete50Calls = "Delete 50 oldest calls", + Delete100Calls = "Delete 100 oldest calls", + + -- VALUTA + Valuta = "£", -- or USD, up to you. + }, + + -- HELP MENU TRANSLATIONS + HelpMenuText = { + Header = "MDT Information", + Info1 = "Each menu has it's own access level assigned by the server owner. You have access to the sections you require, based on your rank.", + Info2 = "MDT stands for 'Mobile Data Terminal', it was built to search and register data. It provides insight into active units, persons, vehicles, markers, warrants, police records, medical records, incident reports, fines, emergency calls and statistics.", + Info3 = "The MDT is built to allow self-service. This means civilians can create their own character & vehicles and they can edit them at all times. Police records and fines on the other hand are controlled by police. The same goes for other department related records.", + Info4 = "Keybinds are available via ESC -> Settings - > Key Bindings -> FiveM. May you need more explanation on how to use the MDT, please visit the documentation: https://docs.nights-software.com/resources/nightShifts/", + }, + }, + + + + + --============================== DUTCH ==============================-- + ['nl'] = { + Info = "^2INFO^7", + Error = "^1ERROR^7", + Syntax = "Syntax", + Yes = "Ja", + No = "Nee", + Nearby = "nabij", + Unknown = "Onbekend", + Downloading = "Aan het downloaden...", + Enabled = "ingeschakeld", + Disabled = "uitgeschakeld", + AutomaticAlarm = "Automatisch Alarm", + SomethingWentWrong = "Er is iets misgegaan tijdens het updaten van jouw data. Deze error kan cruciaal zijn. Zoek contact met de server eigenaar, zodat zij de server logs kunnen bekijken.", + ToggleNotifications = "^3Notificaties ^7zijn nu ", + North = "N", + NorthEast = "NE", + East = "E", + SouthEast = "SE", + South = "S", + SouthWest = "SW", + West = "W", + NorthWest = "NW", + Browse = "Bladeren", + Cancel = "Annuleren", + Anonymous = "Anoniem", + ShowID = "Toon ID", + ShowingIDCardOF = "Toont ID-kaart van", + CancelledShowingIDCard = "ID-kaart tonen geannuleerd...", + Location = "Locatie:", + MDTReady = "Uw MDT is gereed voor gebruik!", + DisconnectedFromMDT = " MDT in stand-by modus.", + CancelledCall = "U heeft opgehangen en uw noodoproep geannuleerd.", + ForceClosedMDT = "U heeft het MDT- en noodoproepsysteem geforceerd te sluiten.", + MDTIsUpdating = "Uw MDT wordt bijgewerkt. Probeer het later opnieuw...", + MDTIsCharging = "Uw MDT wordt al opgeladen.", + MDTIsStillOpen = "Dit kan niet terwijl uw MDT is ingeschakeld.", + MDTIsStillLoading = "Kon een van de volgende onderwerpen NIET vinden: Uw FiveM-ID of Discord-rollen. Zorg ervoor dat u inlogt in de FiveM-app en uw CFX- en Discord-account koppelt. Als dit probleem zich blijft voordoen, neem dan contact op met de servereigenaar.", + EmergencyCallCooldown = "Je moet 1 minuut wachten nadat je een melding hebt gedaan om wederom een melding te maken...", + EmergencyCallScreenStillOpen = "Dit kan niet terwijl uw noodoproepsysteem is ingeschakeld.", + MDTRecentlyRefreshed = "Uw MDT is recentelijk ververst, probeer het binnenkort opnieuw...", + NoAccessToMDT = "U lijkt de vereiste Discord-rollen te missen om toegang te krijgen tot de MDT.", + AccessGrantedMDT = "U heeft toegang gekregen tot", + AccessDeniedMDT = "Toegang geweigerd tot", + NoAccess = "U heeft niet het vereiste toegangsniveau:", + DispatchWasAlreadyActive = "U kunt niet als meldkamer worden toegewezen. De meldkamer is al actief.", + UnitAssigned = "U heeft een eenheid aan de melding gekoppeld.", + UnitsAssigned = "U heeft meerdere eenheden aan de melding gekoppeld.", + AssignedNewStatus = "U heeft de status van een eenheid gewijzigd.", + AssignedNewFleetVehicle = "U hebt een voertuig uit het wagenpark aan een eenheid toegewezen.", + DetachedThemFromVehicleInFleet = "U heeft de eenheid losgekoppeld van enig wagenparkvoertuig.", + YouHaveBeenAssignedAFleetVehicle = "U bent toegewezen aan een voertuig:", + YouHaveBeenDetachedFromAnyFleetVehicle = "U bent van een voertuig uit het wagenpark losgekoppeld.", + Selected = "Geselecteerd:", + YourAccessLevel = "Uw toegangsniveau:", + RequiredAccessLevel = "Vereist toegangsniveau:", + SuccesfullyDeletedCall = "Oproep succesvol verwijderd.", + TrackingCall = "U volgt nu de oproep.", + AssignedToCall = "Dispatch heeft u toegewezen aan een oproep, gemarkeerd op uw kaart met GPS-navigatie, meer informatie volgt zo snel mogelijk...", + AssignedCallInfo = "U bent toegewezen aan oproep", + AssignedCallEmergency = "Nood: ", + CallerName = "Naam beller:", + CallerContactDetails = "Contactgegevens:", + CallStreet = "Straat:", + CallArea = "District:", + CallPostal = "Postcode:", + CallDescription = "Oproepomschrijving:", + CallContactDetails = "Contactgegevens:", + OffShift = "U heeft uw dienst beëindigd.", + OnShift = "U heeft uw dienst gestart.", + Status = "Status:", + StatusChanged = "Status gewijzigd!", + EmergencyCallMade = "Uw noodoproep is doorgestuurd naar de autoriteiten.", + EmergencyCallFailed = "Uw noodoproep was niet gedetailleerd genoeg. Probeer het opnieuw.", + EmergencyHotlineBusy = "De hotline van de nooddienst is op dit moment bezet. Probeer het later opnieuw...", + CannotSwitchDepartmentWhilstOffShift = "U kunt niet van afdeling wisselen zonder dat u op dienst bent. Meld u eerst aan.", + DispatchMessage = "Meldkamer-bericht:", + DispatchMessageCooldown = "U heeft onlangs een meldkamer-bericht verzonden. Wacht 10 seconden.", + RegisteredVehicle = "Uw voertuig is geregistreerd!", + DeletedVehicle = "Uw geregistreerde voertuig is succesvol verwijderd!", + DeletedVehicleFailed = "U kunt uw geregistreerde voertuig niet verwijderen, omdat de database minimaal 1 bestaande rij nodig heeft.", + UpdatedVehicle = "Uw voertuig is succesvol bijgewerkt!", + UpdatedBolo = "BOLO succesvol bijgewerkt!", + RegisteredCivilian = "Uw burger is succesvol geregistreerd!", + DeletedCivilian = "Uw burger is succesvol verwijderd!", + DeletedCivilianFailed = "U kunt uw burger niet verwijderen, omdat de database minimaal 1 bestaande rij nodig heeft.", + UpdatedCivilian = "Uw burger is succesvol bijgewerkt!", + UpdatedMarkers = "Hun markeringen zijn succesvol bijgewerkt!", + AddedPoliceReport = "Politierapport succesvol toegevoegd!", + AddedPoliceFine = "Boete succesvol toegevoegd!", + DuplicateEntryCivilian = "U kunt geen reeds bestaande burger registreren met de naam:", + DuplicateEntryVehicle = "U kunt geen reeds bestaand voertuig registreren met kenteken:", + LoadingCallSystem = "Het oproepsysteem wordt nog steeds geladen... Probeer het binnenkort opnieuw!", + YourEmergencyCall = "Uw (nood)oproep", + HasBeenForwarded = "is doorgestuurd naar de hotline van de hulpdiensten.", + CouldNotFindStatusCode = "Kon deze statuscode niet vinden.", + ServerWasSynchronizingTryAgain = "De server was nog steeds aan het synchroniseren... Probeer het binnenkort opnieuw!", + NewIncidentReceived = "🚨 999 NOODOPROEP 🚨 Druk op F10 om de MDT te openen.", + TrackerDisabled = "De tracker is uitgeschakeld. Als u meer locaties wilt ontvangen, volg ze dan opnieuw.", + UpdatedTracker = "Tracker bijgewerkt met nieuwe GPS-navigatiecoördinaten voor", + ResetTracker = "Tracker gereset voor", + NewTrackerCoords = "Instellen van nieuwe GPS-navigatiecoördinaten naar", + MDTInitiateCharging = "Uw MDT-batterij wordt opgeladen.", + MDTBatteryCharging = "Uw MDT-batterij wordt opgeladen. Dit kan enkele minuten duren. U zit momenteel op: ", + MDTBatteryCharged = "Uw MDT-batterij is opgeladen tot: ", + MDTBatteryLevelLow = "Batterijniveau laag! Laad uw MDT op in een voertuig of interieur. Syntax: /chargemdt", + MDTBatteryEmpty = "Batterij leeg! Laad uw MDT op in een voertuig of interieur. Syntax: /chargemdt", + MDTBatteryIsFullAlready = "Uw MDT-batterij is al vol.", + AddedOperationsReport = "U heeft succesvol een operationeel rapport toegevoegd.", + CannotTrackYourself = "U kunt uzelf niet volgen.", + NoChargePointNearby = "Uw MDT kan niet worden opgeladen: er is geen laadpunt dichtbij. Ga in een voertuig of interieur naar uw MDT. Syntax: /chargemdt", + MDTBatterySystemDisabled = "De eigenaar van de server heeft het MDT-batterijsysteem uitgeschakeld.", + MissingMDTItemInInventory = "U heeft geen MDT in uw inventaris.", + MissingMDTChargerItemInInventory = "U heeft geen MDT-oplader in uw inventaris.", + MissingPhoneItemInInventory = "U heeft geen telefoon om de nooddiensten te bellen in uw inventaris.", + PanicButtonPressed = "Paniekknop ingedrukt! Een noodsignaal is gemarkeerd op de kaart van andere eenheden.", + DistressSignalActivated = "ALERT! Een paniekknop is ingedrukt. Ga alstublieft naar de (laatste) locatie van het noodsignaal gemarkeerd op uw kaart.", + DistressSignalStillActive = "Uw noodsignaal is onlangs verzonden naar andere eenheden, wacht op de cooldown.", + BackupRequestCooldown = "U heeft recentelijk om backup gevraagd, probeer het later opnieuw...", + BackupRequest = "Backup Aanvraag - ", + BackupDepartment = "Aangevraagde afdeling: ", + BackupStreet = "Locatie: ", + BackupPostal = "Postcode: ", + BackupRequesterDepartment = "Afdeling aanvrager: ", + BackupMarkedOnYourMap = "De backup-aanvraag is gemarkeerd op uw kaart.", + BackupDefaultType = "Geen.", + WantedPersonSighted = "Gezocht persoon gesignaleerd door ", + SightedAt = "op", + SightedMarkerDescription = "Markering beschrijving: ", + ANPRHit = "ANPR ALERT - ", + ANPRBOLO = "BOLO: ", + ANPRStolen = "Gestolen: ", + ANPRInsurance = "Verzekering: ", + ANPRMot = "APK: ", + ANPRTax = "Belasting: ", + ANPRStreet = "Straatnaam: ", + ANPRPostal = "Postcode: ", + ANPRMarkedBOLO = "BOLO actief", + ANPRNoBOLO = "BOLO inactief", + ANPRMarkedStolen = "Gemarkeerd als gestolen", + ANPRNotStolen = "Niet gestolen", + ANPRValid = "Geldige APK", + ANPRInvalid = "Ongeldige APK", + ANPRPaid = "Belasting betaald", + ANPRNotPaid = "Belasting niet betaald", + ANPRInsured = "Verzekerd", + ANPRNotInsured = "Niet verzekerd", + ANPRNo = "Nee.", + ANPRYes = "Ja.", + SeenByANPR = "SNAP! De ANPR-camera-feed heeft uw voertuig gemarkeerd en gelokaliseerd.", + ANPRVehicleSighted = "ANPR geregistreerd voertuig waargenomen gemeld door", + ANPRVehicleOwnedBy = "Eigenaar: ", + ANPRVehicleFlags = "Signaleringen:", + LoadingANPR = "Het ANPR-systeem wordt nog steeds geladen... Probeer het binnenkort opnieuw!", + ANPRInVehicleEnabled = "U heeft het ANPR-systeem in het voertuig ingeschakeld.", + ANPRInVehicleDisabled = "U heeft het ANPR-systeem in het voertuig uitgeschakeld.", + ANPRUnlocked = "ANPR Ontgrendeld!", + NotInVehicle = "U moet in een voertuig zitten om dit te doen...", + YouAreNotOnShift = "U moet in dienst zijn om dit te doen...", + ChangedYourCallsign = "U heeft succesvol uw roepnummer gewijzigd naar: ", + ChangedTheirCallsign = "U heeft succesvol het roepnummer van de eenheid gewijzigd naar: ", + DispatchSetYourCallsign = "De meldkamer heeft u een nieuw roepnummer toegewezen: ", + BeepedUnit = "Je hebt een geluidssignaal verzonden aan eenheid: ", + CannotDeleteThisCivilianStillHasVehicles = "U kunt deze burger niet verwijderen, omdat er nog voertuigen aan hen zijn gekoppeld...", + BackupPolice = "Politiediensten", + BackupAmbulance = "Medische diensten", + BackupFire = "Brandweerdiensten", + BackupTow = "Sleepdiensten", + NoPlayerNearby = "Er zijn geen spelers in de buurt...", + YouHaveNoCivilianCharacters = "U heeft geen geregistreerde burgers...", + APlayerNearbyShowsID = "Een speler in de buurt laat zijn ID-kaart aan u zien.", + APlayerNearbyShowsID2 = "om ernaar te kijken.", + UpdatedFine = "De boete is succesvol bijgewerkt.", + CouldNotUpdatedFine = "Kon deze boete niet bijwerken, de server was nog steeds aan het synchroniseren met recente updates ervoor...", + DetachedFromCall = "U heeft zich losgemaakt van de laatste oproep.", + UnitDetached = "EENHEID LOSGEKOPPELD -", + DuplicatePropertyAddress = "Er is al een eigendom geregistreerd op dit adres: ", + RegisteredProperty = "Uw eigendom is geregistreerd!", + UpdatedProperty = "Uw eigendom is succesvol bijgewerkt!", + DeletedProperty = "Uw eigendom is verwijderd!", + DeletedPropertyFailed = "U kunt uw eigendom niet verwijderen, omdat er minimaal 1 bestaande rij nodig is in de database.", + UpdatedPropertySeized = "(On)in beslag genomen van het eigendom!", + NotAttachedToAnyCall = "U bent niet verbonden met een actieve oproep.", + VehicleAddedToFleet = "Je hebt een voertuig aan de vloot toegevoegd.", + VehicleDeletedFromFleet = "Je hebt een voertuig uit de vloot verwijderd.", + VehicleDeletedFromFleetFailed = "Foutmelding: er is tenminste 1 database rij nodig om een voertuig te kunnen verwijderen uit de vloot.", + VehicleUpdatedInFleet = "Voertuig in de vloot geupdated.", + StatisticsCalls = "Oproepen Geregistreerd", + StatisticsCallNotes = "Oproep Notities Geregistreerd", + StatisticsFines = "Boetes Geregistreerd", + StatisticsVehicles = "Voertuigen Geregistreerd", + StatisticsFleetVehicles = "Vloot Voertuigen Geregistreerd", + StatisticsCivilians = "Burgers Geregistreerd", + StatisticsProperties = "Eigendommen Geregistreerd", + StatisticsOperationReports = "Operatie Rapporten Geregistreerd", + StatisticsANPRVehicles = "Voertuigen in ANPR", + StatisticsWantedPeople = "Gezochte Personen", + UpdatedTrainings = "Training & Certificaten geupdate voor de medewerker in kwestie.", + ShotsFiredAt = "Vuurwapengevecht aan de", + FightAt = "Gevecht aan de", + RoadCrimeAt = "Wangedrag in het verkeer aan de", + SentDispatchMessage = "Meldkamerbericht verzonden naar alle eenheden.", + + + -- COMMANDO CHAT SUGGESTIES + ToggleNotificationsHelpText = "Een commando om notificaties verzonden door de MDT in of uit te schakelen. (Het wordt niet aangeraden om ze uit te schakelen)", + MobileDataTerminalHelpText = "Een commando om de mobiele gegevensterminal te openen.", + CallEmergenciesHelpText = "Een commando om de hotline voor nooddiensten te bellen.", + ChargeMDTHelpText = "Een commando om de batterij van uw MDT op te laden.", + ForceCloseMDTHelpText = "Forceer het sluiten van de MDT met dit commando.", + StatusChangeHelpText = "Een commando om snel uw status te wijzigen.", + ShowIDAndLicensesHelpText = "Een commando om uw ID en rijbewijzen aan de dichtstbijzijnde speler te tonen.", + StatusChangeArgument1 = "statuscode", + StatusChangeArgument1Example = "2", + ToggleANPRHelpText = "Een commando waarmee je de ANPR in een voertuig aan en uit kan zetten.", + DisplayActiveCallHelpText = "Een commando waarmee je de huidige melding op het scherm weer kan geven voor een bepaalde tijd.", + + + Icons = { -- https://fontawesome.com/search?q=check&o=r&m=free + SuccessIcon = "fa-solid fa-check", + WarningIcon = "fa-solid fa-triangle-exclamation", + ErrorIcon = "fa-solid fa-xmark", + DispatchIcon = "fa-solid fa-walkie-talkie", + EmergencyIcon = "fa-solid fa-phone-volume", + }, + + -- VERTALINGEN IN DE MDT + + MDTText = { + -- ALGEMEEN + Loading = "Aan het laden...", + Yes = "Ja", + No = "Nee", + Select = "Selecteer", + Attach = "Wijs toe", + Police = "Politie", + Ambulance = "Ambulance", + Fire = "Brandweer", + Tow = "Takelwagen", + DMV = "RDW", + CityHall = "GEMEENTEHUIS", + DispatchActive = "Meldkamer actief", + DispatchInactive = "Meldkamer inactief", + Actions = "Acties", + AddFleetCard = "Voeg voertuig toe", + EditFleetCard = "Pas voertuig aan", + FleetCardPictureURL = "Voertuig Afbeelding URL", + FleetCardVehicleName = "Voertuig merk en model", + FleetVehicleNamePlaceHolder = "Audi A4", + FleetCardVehicleModel = "Voertuig spawn model naam", + FleetVehicleModelPlaceHolder = "taudia4", + FleetCardVehicleInService = "In dienst", + FleetCardVehicleAttachedUnits = "Toegewezen eenheden", + FleetCardRoofCodeCallsign = "Voertuig roepnummer", + FleetRoofCodeCallsignPlaceHolder = "CW-01", + NoVehiclesInThisFleet = "Er bestaan geen voertuigen in dit wagenpark.", + DetachFromAnyFleetVehicles = "Ontkoppel enig voertuig.", + ValidationFailed = "Foutmelding: Vul alle verplichte velden in...", + CreatedAt = "Aangemaakt of geupdate op", + AreYouSureDeleteFleetVehicle = "Weet je zeker dat je dit voertuig uit het wagenpark wilt verwijderen?", + DeleteVehicleFromFleet = "Voertuig verwijderen uit het wagenpark", + SelectAction = "Selecteer een actie", + SelectDepartment = "Selecteer een afdeling", + --SelectSubDepartment = "Selecteer een subafdeling", + RefreshButton = "Verversen", + AddCallButton = "Melding maken", + ActivateDispatchButton = "(De)activeer meldkamer", + RegisterButton = "Registreren", + EditButton = "Bewerken", + DeleteButton = "Verwijderen", + DetachAnyUnitsButton = "Ontkoppel allen", + ArchiveButton = "Archiveren", + SaveChangesButton = "Wijzigingen opslaan", + AddFineButton = "Boete toevoegen", + MarkFineAsPaidButton = "Markeren als betaald", + AddRecordButton = "Record toevoegen", + CloseButton = "Sluiten", + ShowCitizenButton = "Toon Burger", + EditBOLOButton = "BOLO bewerken", + CancelButton = "Annuleren", + CallEmergencyServicesButton = "Bel nooddiensten", + OneOrMoreFieldsHaveNotBeenFilled = "Een of meer velden zijn niet ingevuld!", + NoUnitsSelected = "Je hebt geen eenheden geselecteerd...", + ClosingIn = "Sluit af in", + ClosingSeconds = "seconden...", + + -- DIENST MENU + ToggleShift = "In/Uit Dienst", + SelectSubDepartmentAndShiftInfo = "Selecteer je sub-afdeling en start je dienst.", + SelectSubDepartment = "Selecteer Sub-afdeling", + SubDepartment = "Sub-Afdeling", + EmployeeDetails = "Werknemer Details", + EmployeeName = "Naam: ", + EmployeeRank = "Functie: ", + EmployeeCallsign = "Roepnummer: ", + EmployeeVehicleRoofcode = "Roepnummer voertuig: ", + EmployeeActiveCall = "Actief oproep-ID: ", + EmployeeCurrentShiftTime = "Huidige diensttijd: ", + EmployeeShiftTime = "Totale diensttijd: ", + EmployeeMinutes = "minuten.", + EmployeeHours = "uren", + EmployeeDays = "dagen", + EmployeeAccessLevel = "Gebruikerstoegangsniveau: ", + EmployeeStatus = "Actieve statuscode: ", + EmployeeStatus2 = "Actieve status: ", + EmployeeActiveSubDepartment = "Actieve Sub-afdeling: ", + StatusPanel = "Statuspaneel", + SelectStatus = "Selecteer je status", + StatusPanelInfo = "Selecteer je status tijdens je dienst en houd de meldkamer op de hoogte.", + EditCallsign = "Bewerk Roepnummer", + EnterNewCallsign = "Voer een nieuw roepnummer in", + NewCallsign = "Nieuw Roepnummer", + CallsignErrorMessage1 = "Voer een nieuwe roepnummer in met alleen letters, cijfers en streepjes.", + CallsignErrorMessage2 = "Voer een nieuwe roepnummer in met maximaal 15 tekens.", + + -- NOODCENTRALE + EmergencyCall = "Noodoproep", + NonEmergencyCall = "Geen Noodoproep", + EmergencyCalls = "Noodcentrale", + ActiveCalls = "Actieve Oproepen", + ArchivedCalls = "Gearchiveerde Oproepen", + ArchivedCall = "Gearchiveerde Oproep", + DestroyedCall = "Melding verwijderd", + DestroyedCalls = "Meldingen verwijderd", + DestroyedCallFailed = "Je kunt deze melding niet verwijderen, omdat er tenminste 1 melding in de database beschikbaar moet blijven.", + CallID = "#", + CallerId = "ID:", -- Ongebruikt? + CallDetails = "Details", + CallInformation = "Krijg inzicht in de oproep door de onderstaande details te lezen.", + CallDescription = "Omschrijving", + CallerPostal = "Postcode: ", + CallerStreetName = "Straat: ", + CallerAreaName = "District: ", + ContactDetails = "Contactgegevens: ", + CallUnits = "Gekoppelde eenheden: ", + CallEmergencyType = "Noodtype: ", + CallEmergency = "Noodgeval", + CallNonEmergency = "Geen Noodgeval", + CallRequiredUnits = "Benodigde eenheden", + EmergencyServicesHotline = "Nooddiensten Hotline", + EmergencyCallBy = "Beller:", + DeleteCall = "Archiveren", + GPS = "Localiseer via GPS", + SendBeep = "Zend piepsignaal", + SelectCivilianMakingTheCall = "Selecteer de burger die de oproep maakt...", + IsThisAnEmergency = "Is deze oproep een noodgeval?", + IsThisCallAnonymous = "Bel je anoniem?", + DoYouRequire = "Heb je nodig", + ToAttend = "om te reageren?", + AtWhatPostal = "Op welke postcode is dit incident?", + AtWhatStreet = "Op welke straat is dit incident?", + AtWhatArea = "Op welk district/gebied is dit incident?", + TimeOfCall = "Tijdstip van oproep", + HowToContact = "Hoe kunnen we contact met je opnemen?", + PlaceHolderSelectCivilian = "Selecteer een burger...", + PlaceholderHowToContact = "Telefoon, E-mail of een station om te bezoeken", + EmergencyCallOverview = "Overzicht Noodoproep", + CallNotes = "Oproepnotities", + CallAddNotesButton = "Notities", + CallAddUnitsButton = "Eenheden toewijzen", + CallViewNotesButton = "Bekijk notities", + CallNotesTitle = "Oproepnotities | Oproep ", + CallNoteCreatedSystemMessage = "OPROEPNOTITIE AANGEMAAKT.", + CallerName = "Naam Beller: ", + AddNoteButton = "Voeg Notitie Toe", + AddNotePlaceholder = "Voeg een nieuwe notitie toe...", + AddedCallNote = "Notitie toegevoegd aan oproep ", + System = "SYSTEEM", + Next = "Volgende", + Previous = "Vorige", + + -- PNC + BornOn = "Geboren op ", + Markers = "Markeringen", + MarkersSubTitle = "Alle actieve markeringen worden hieronder weergegeven.", + ArmedAndDangerous = "Gewapend en Gevaarlijk", + Assault = "Aanval", + Burglary = "Inbraak", + DrugRelated = "Druggerelateerd", + GangAffiliation = "Bendeverband", + Homicide = "Moord", + Kidnapping = "Ontvoering", + MentalHealth = "Geestelijke Gezondheidsproblemen", + SexOffense = "Seksueel Delict", + Terrorism = "Terrorisme", + Theft = "Diefstal", + TrafficViolation = "Verkeersovertreding", + WantedPerson = "Gezochte Persoon", + OtherMarker = "Overig, lees beschrijving...", + ActiveWarrant = "Actief Arrestatiebevel", + DescribeMarkerAndWarrant = "Beschrijf markeringen/arrestatiebevel", + Timestamp = "Tijdstempel", + ShowVehicles = "Toon Voertuigen", + ShowProperties = "Toon Eigendommen", + ShowRecords = "Toon Dossiers", + ShowFines = "Toon Boetes", + EditMarkers = "Bewerk Markeringen", + AddRecord = "Voeg Dossier Toe", + AddFine = "Voeg Boete Toe", + NoCitizensFound = "Geen burgers gevonden door", + EnterAtLeast = "Voer minimaal", + Characters = "tekens in", + AddRecordFor = "Voeg een dossier toe voor", + Charge = "Strafrechtelijke Overtreding", + Description = "Beschrijving", + Victims = "Slachtoffers", + LocationDescription = "Locatiebeschrijving", + OfficerDetails = "Agent Details", + Sentence = "Straf", + Prosecuted = "Is de verdachte vervolgd voor dit misdrijf?", + Prosecuted2 = "Vervolgd", + ReportDate = "Datum van melding", + AddFineFor = "Voeg een boete toe voor", + TicketableOffense = "Bekeurbare Overtreding", + FineDescription = "Boete Beschrijving", + FineAmount = "Boetebedrag", + DueDate = "Vervaldatum", + PaidFine = "Heeft de overtreder de boete betaald?", + FineDate = "Datum van Boete", + GeneratedForCitizenId = "Gegenereerd voor Burgerservicenummer", + NoRecordsFound = "Geen dossiers gevonden voor Burgerservicenummer", + RegisteredToCitizenId = "Geregistreerd op Burgerservicenummer", + CitizenName = "Naam Burger", + NoVehiclesFoundForCitizenId = "Geen voertuigen gevonden voor Burgerservicenummer", + FineIssuedOn = "Boete uitgegeven op", + FinePaid = "Boete Betaald", + NoFinesFoundForCitizenId = "Geen boetes gevonden voor Burgerservicenummer", + EditMarkersFor = "Bewerk Markeringen voor", + LastUpdatedBy = "Laatst bijgewerkt door", + PNCOverview = "PNC", + PNCPersonSearch = "Persoon Zoeken", + PNCPersonSearchPlaceholder = "John Doe / Burgerservicenummer", + PNCVehicleSearch = "Voertuig Zoeken", + PNCVehicleSearchPlaceholder = "HF22 BXU / Burgerservicenummer", + PNCPropertySearch = "Eigendom Zoeken", + PNCPropertySearchPlaceholder = "Burgerservicenummer", + NoPropertiesFoundForCitizenId = "Geen eigendommen gevonden voor Burgerservicenummer", + PNCRecordSearch = "Dossier Zoeken", + PNCRecordSearchPlaceholder = "Burgerservicenummer", + PNCFineSearch = "Boete Zoeken", + PNCFineSearchPlaceholder = "Burgerservicenummer", + PNCResults = "Resultaten", + PNCMarkStolen = "Markeren als gestolen?", + PNCBolo = "BOLO Actief?", + DescribeBolo = "Beschrijf de reden voor het starten van een BOLO", + PNCBoloDescription = "BOLO Beschrijving:", + EditBoloFor = "Bewerk BOLO voor ", + Search = "Zoeken", + Send = "Versturen", + Dispatch = "Controle", + DispatchMessagePlaceholder = "Stuur een bericht naar alle actieve eenheden.", + DispatchMessageTitle = "Controle Mededeling", + ActiveUnits = "Actieve Eenheden", + Backup = "Backup", + FleetManagement = "Vloot Manager", + ActiveWarrants = "Actieve Arrestatiebevelen", + WantedFor = "Gezocht voor:", + LastUpdated = "Laatst bijgewerkt:", + ReportSighting = "Melding maken", + DateAndTime = "Datum en Tijd", + ANPRSection = "ANPR", + ANPRSectionFullName = "Automatische Nummerplaat Herkenning", + PlaceholderCharge = "Diefstal", + PlaceholderVictims = "John Doe, Jane Doe", + PlaceholderLocationDescription = "Straatnaam, postcode, adres", + PlaceholderOfficerDetails = "C. Lowly - Badge #3622", + PlaceholderSentence = "Beschrijf de straf", + PlaceholderTicketableOffense = "Snelheidsovertreding", + NoWantedPersonsFound = "Geen gezochte personen gevonden...", + NoWantedVehiclesFound = "Geen gezochte voertuigen gevonden...", + ANPRFront = "ANPR VOORKANT", + ANPRRear = "ANPR ACHTERKANT", + ANPRModel = "Model:", + ANPRColour = "Kleur:", + ANPRSpeed = "Snelheid:", + ANPRFlags = "Vlaggen:", + ANPRLocation = "Locatie:", + + -- EENHEID OVERZICHT + NameId = "Naam (ID)", + Callsign = "Roepnummer", + ModeOfTransport = "Vervoerswijze", + VehicleRoofcode = "Roepnummer voertuig", + Department = "Afdeling", + Rank = "Rang", + Location = "Locatie", + Postal = "Postcode", + Status = "Status", + Tracking = "Koppelen", + DispatchMessageError = "Voer minstens 10 tekens in.", + RequestBackupFromPolice = "Verzoek om backup van de politieafdeling.", + RequestBackupFromAmbulance = "Verzoek om backup van de ambulanceafdeling.", + RequestBackupFromFire = "Verzoek om backup van de brandweerafdeling.", + RequestBackupFromTow = "Verzoek om sleepdiensten.", + RequestBackupButton = "Backup Aanvragen", + RequestedBackupType = "Backup Aangevraagd", + NoActiveCalls = "Er zijn op dit moment geen actieve meldingen...", + NoActiveUnits = "Er zijn op dit moment geen actieve eenheden...", + AssignToACall = "Toewijzen aan een melding", + AssignToCallButton = "Toewijzen aan melding", + AssignUnitsToCallButton = "Eenheid(en) toewijzen", + AssignUnitToCallOverview = "OVERZICHT ACTIEVE EENHEDEN | Eenheden toewijzen aan melding", + AssignUnitToCall = "OVERZICHT ACTIEVE MELDING | Toewijzen aan ", + AssignToCallHelp = "Wanneer eenheden gekoppeld worden ontvangen ze een routeaanduiding op hun kaart. Tevens wordt hun status automatisch aangepast.", + AssignNewStatus = "Nieuwe status toewijzen", + AssignNewCallsign = "Nieuw roepnummer toewijzen", + AssignNewFleetVehicle = "Nieuw voertuig toewijzen", + AssignUnitNewStatus = "STATUS TOEWIJZEN AAN EENHEID ", + UnitsTrackingCall = "Gekoppelde eenheden", + None = "Geen", + ActiveCallID = "Actieve Melding", + SirensOn = "Sirenes AAN", + SirensOff = "Sirenes UIT", + + -- OPERATIES + Report = "Rapport", + ReportType = "Rapporttype", + Operations = "Operaties", + AddReports = "Rapporten Toevoegen", + SearchReports = "Zoek Operatierapporten", + SearchReportsPlaceholder = "Voer een zoekopdracht in (bijvoorbeeld naam of deel van de beschrijving)", + SearchReportsByDatePlaceholder = "Zoeken op datum", + SelectReportType = "Selecteer een rapporttype...", + SelectReportTypePolice = "Politierapporten", + SelectReportTypeFire = "Brandweerrapporten", + SelectReportTypeMedical = "Medische rapporten", + MedicalReportType = "Type Medisch Rapport", + FireReportType = "Type Brandweerrapport", + PoliceReportType = "Type Politierapport", + SubmitReport = "Rapport Indienen", + ViewReport = "Bekijk Volledig Rapport", + NoOperationReportsFound = "Geen operatierapporten gevonden op", + SignedBy = "Ondertekend door", + SignedByPlaceholder = "Voer je naam in", + DescriptionPlaceholder = "Voer een beschrijving in", + LocationPlaceholder = "Voer een locatie in (bijvoorbeeld straatnaam, gebied, postcode)", + EmployeeInvolved = "Betrokken medewerker(s)", + EmployeeInvolvedPlaceholder = "Voer namen / Badge-nummers / BSN in (bijvoorbeeld afdeling, rang, naam en meer details)", + CivilianInvolved = "Betrokken burger(s)", + CivilianInvolvedPlaceholder = "Voer namen / BSN in", + VehicleInvolved = "Voertuig(en) betrokken", + VehicleInvolvedPlaceholder = "Voer voertuigen / Voertuig-ID's / BSN in (bijvoorbeeld eigenaren van voertuigen)", + PenalCode = "Politiereglement", + Guidelines = "Richtlijnen", + Training = "Training", + UpdateTrainings = "Update Trainingen", + + -- STATISTICS + Statistics = "Statistieken", + ViewStatistics = "Totaal Statistieken", + --== COLORS + AxesColor = "rgba(255, 255, 255, 0.6)", + barColor = "rgba(122, 189, 225, 0.2)", + barBorderColor = "rgba(122, 189, 225, 1)", + + -- RDW (Rijksdienst voor het Wegverkeer) + LicensePlate = "Kenteken", + Make = "Merk", + Model = "Model", + Color = "Kleur", + BuildYear = "Bouwjaar", + TaxPaid = "Belasting betaald?", + MOTPassed = "Jaarlijkse APK geslaagd?", + Insurance = "Verzekering?", + ReportAsStolen = "Melden als gestolen?", + ReportedStolen = "Gemeld als gestolen?", + RegisteredOn = "Geregistreerd op", + OwnedBy = "Eigenaar", + VehicleRegisterId = "Voertuig Registratienummer", + MoT = "APK?", + EditVehicleRegistration = "Voertuigregistratie bewerken", + OwnedByCitizenId = "Eigenaar Burgerservicenummer", + VehiclePictureURL = "URL Voertuigafbeelding", + RegistrationDate = "Registratiedatum", + SelectCitizen = "Selecteer een burger...", + RegisterAVehicle = "Registreer een voertuig", + RegisterVehicleSubtitle = "Registreer je gewenste voertuig!", + ViewRegisteredVehicles = "Bekijk je geregistreerde voertuigen", + EditVehiclesSubtitle = "Bewerk ze op jouw manier!", + AreYouSureDeleteVehicle = "Weet je zeker dat je je geregistreerde voertuig wilt verwijderen?", + DeletingVehicleCannotBeUndone = "Het verwijderen van dit geregistreerde voertuig kan niet ongedaan worden gemaakt.", + YesDeleteVehicle = "Ja, verwijder mijn geregistreerde voertuig.", + PlaceholderLicensePlate = "HA23-RHY (Geen spaties)", + PlaceholderMake = "Audi", + PlaceholderModel = "A6 Avant", + PlaceholderColor = "Rood", + PlaceholderYear = "2023", + + -- STADHUIS + FirstName = "Voornaam", + LastName = "Achternaam", + DateOfBirth = "Geboortedatum", + Gender = "Geslacht", + Email = "E-mail", + PhoneNumber = "Telefoonnummer", + Address = "Adres", + AddressType = "Adrestype", + City = "Stad", + State = "Staat", + PostalCode = "Postcode", + Country = "Land", + Occupation = "Beroep", + Nationality = "Nationaliteit", + PictureURL = "Afbeelding URL", + RegisterCarLicense = "Autorijbewijs registreren?", + RegisterBikeLicense = "Motorrijbewijs registreren?", + RegisterTruckLicense = "Vrachtwagenrijbewijs registreren?", + RegisterBoatLicense = "Vaarbewijs registreren?", + RegisterPilotLicense = "Vliegbrevet registreren?", + Licenses = "Rijbewijzen", + CitizenId = "Burgerservicenummer", + CarLicense = "Autorijbewijs", + BikeLicense = "Motorrijbewijs", + TruckLicense = "Vrachtwagenrijbewijs", + BoatLicense = "Vaarbewijs", + PilotLicense = "Vliegbrevet", + EditCitizen = "Bewerk burger", + ProfilePictureURL = "Burger Afbeelding URL", + RegisterACivilian = "Registreer een burger", + RegisterCivilianSubtitle = "Registreer wie je maar wilt zijn!", + ViewRegisteredCivilians = "Bekijk je geregistreerde burgers", + EditCiviliansSubtitle = "Pas je burger aan naar jouw wens!", + AreYouSureDeleteCivilian = "Weet je zeker dat je je burger wilt verwijderen?", + DeletingCivilianCannotBeUndone = "Het verwijderen van dit personage kan niet ongedaan worden gemaakt.", + YesDeleteCivilian = "Ja, verwijder mijn burger.", + PlaceholderFirstName = "John", + PlaceholderLastName = "Doe", + PlaceholderGender = "Elk geslacht", + PlaceholderEmail = "johndoe@nsmail.com", + PlaceholderPhonenumber = "31613371337", + PlaceholderAddress = "Grove Street 5", + PlaceholderAddressType = "Huis, appartement, studio en/of verdieping", + PlaceholderCity = "Amsterdam", + PlaceholderState = "Noord-Holland", + PlaceholderPostal = "9104", + PlaceholderCountry = "Nederland", + PlaceholderOccupation = "Accountant", + PlaceholderNationality = "Nederlandse", + + -- ONROEREND GOED + RealEstate = "Onroerend Goed", + ViewRegisteredProperties = "Bekijk je geregistreerde eigendommen", + EditPropertiesSubtitle = "Bewerk ze zoals jij dat wilt!", + RegisterAProperty = "Registreer een eigendom", + RegisterPropertySubtitle = "Registreer je gewenste eigendommen", + SelectPropertyType = "Type eigendom...", + HouseNumber = "Huisnummer", + PlaceholderHouseNumber = "12", + PropertyPictureURL = "URL Afbeelding Eigendom", + Area = "District", + PlaceholderArea = "Vinewood Hills", + PlaceholderPostalCode = "5001", + PlaceholderPrice = "25000", + Amenities = "Voorzieningen", + PlaceholderAmenities = "Beschrijf de voorzieningen...", + PropertyOwnedBy = "Eigenaar", + PropertySeized = "In beslag genomen eigendom?", + EditPropertySeizedButton = "(Ont)neem", + PropertyType = "Type eigendom", + PropertyRegisterId = "Registratienummer eigendom", + PropertyAddress = "Adres", + PropertyHouseNumber = "Huisnummer", + PropertyArea = "District", + PropertyPostalCode = "Postcode", + PropertyDescription = "Beschrijving", + PropertyPrice = "Prijs", + PropertyBuildYear = "Bouwjaar", + PropertyAmenities = "Voorzieningen", + AreYouSureDeleteProperty = "Weet je zeker dat je dit eigendom wilt verwijderen?", + DeletingPropertyCannotBeUndone = "Het verwijderen van dit eigendom kan niet ongedaan worden gemaakt.", + YesDeleteProperty = "Verwijder Eigendom", + EditPropertyRegistration = "Bewerk Eigendomsregistratie", + + -- Management + Management = "Management Paneel", + ManageCivilians = "Inwoners", + ManageVehicles = "Voertuigen", + ManageProperties = "Onroerend goed", + ManageCalls = "Meldingen", + CivilianIDPlaceholder = "Burgerservicenummer", + VehicleIDPlaceholder = "Voertuig Registratienummer", + PropertyIDPlaceholder = "Onroerend Goed Registratienummer", + CallIDPlaceholder = "Meldingnummer", + + Delete10Calls = "Verwijder 10 oudste meldingen", + Delete50Calls = "Verwijder 50 oudste meldingen", + Delete100Calls = "Verwijder 100 oudste meldingen", + + -- VALUTA + Valuta = "€", + }, + + -- HELP MENU TRANSLATIONS + HelpMenuText = { + Header = "MDT Informatie", + Info1 = "Elk menu heeft zijn eigen toegangsniveau dat is toegewezen door de server-eigenaar. Je hebt toegang tot de secties die je nodig hebt, gebaseerd op je rang.", + Info2 = "MDT staat voor 'Mobile Data Terminal'; het is gebouwd om gegevens te doorzoeken en te registreren. Het biedt inzicht in actieve eenheden, personen, voertuigen, markeringen, warrants, politierecords, medische dossiers, incidentrapporten, boetes, noodoproepen en statistieken.", + Info3 = "De MDT is gebouwd om zelfbediening mogelijk te maken. Dit betekent dat burgers hun eigen personage en voertuigen kunnen aanmaken en deze op elk moment kunnen bewerken. Politie-records en boetes daarentegen worden gecontroleerd door de politie. Hetzelfde geldt voor andere afdelingsgerelateerde records.", + Info4 = "Keybinds zijn beschikbaar via ESC -> Instellingen -> Sneltoetsen -> FiveM. Als je meer uitleg nodig hebt over hoe je de MDT moet gebruiken, bezoek dan de documentatie: https://docs.nights-software.com/resources/nightShifts/", + }, + }, + + + + --============================== FRENCH ==============================-- + ['fr'] = { + Info = "^2INFO^7", + Error = "^1ERROR^7", + Syntax = "Syntax", + Yes = "Yes", + No = "No", + Nearby = "nearby", + Unknown = "Unknown", + Downloading = "Downloading...", + Enabled = "enabled", + Disabled = "disabled", + AutomaticAlarm = "Automatic Alarm Trigger", + SomethingWentWrong = "Something went wrong when trying to update your data. This error can be critical, please contact the server owner and ask them to check the server logs.", + ToggleNotifications = "^3Notifications ^7are now ", + North = "N", + NorthEast = "NE", + East = "E", + SouthEast = "SE", + South = "S", + SouthWest = "SW", + West = "W", + NorthWest = "NW", + Browse = "Browse", + Cancel = "Cancel", + Anonymous = "Anonymous", + ShowID = "Show ID", + ShowingIDCardOF = "Showing ID card of", + CancelledShowingIDCard = "Cancelled showing an ID card...", + Location = "Location:", + MDTReady = "Your MDT is ready for usage!", + DisconnectedFromMDT = "Your MDT is now on stand-by mode.", + CancelledCall = "You've hung up and cancelled your emergency hotline call.", + ForceClosedMDT = "You've forced the MDT & call screen to close.", + MDTIsUpdating = "Your MDT is updating. Please try again later...", + MDTIsCharging = "Your MDT is already charging.", + MDTIsStillOpen = "You can't do this whilst your MDT is turned on.", + MDTIsStillLoading = "Could NOT find one of the following subjects: Your fivem ID or Discord roles. Make sure to log into the FiveM App and link your CFX & Discord account. If this issue persists, please contact the server owner.", + EmergencyCallCooldown = "You have to wait 1 minute to call in another emergency...", + EmergencyCallScreenStillOpen = "You can't do this whilst your emergency call system is turned on.", + MDTRecentlyRefreshed = "Your MDT has recently been refreshed, try again soon...", + NoAccessToMDT = "You seem to be missing the required discord roles to access the MDT.", + AccessGrantedMDT = "You've been granted access to", + AccessDeniedMDT = "Access denied to", + NoAccess = "You do not have the required access level: ", + DispatchWasAlreadyActive = "Could not assign you as dispatcher, because dispatch is already active.", + UnitAssigned = "You have assigned the unit to the call.", + UnitsAssigned = "You have assigned the selected units to the call.", + AssignedNewStatus = "You have assigned a new status to the unit.", + AssignedNewFleetVehicle = "You've assigned a fleet vehicle.", + DetachedThemFromVehicleInFleet = "You've detached the unit from any fleet vehicle.", + YouHaveBeenAssignedAFleetVehicle = "You have been assigned a fleet vehicle:", + YouHaveBeenDetachedFromAnyFleetVehicle = "You have been detached from any fleet vehicle.", + Selected = "Selected: ", + YourAccessLevel = "Your access level: ", + RequiredAccessLevel = "Required Access level: ", + SuccesfullyDeletedCall = "Successfully deleted the call.", + TrackingCall = "You're now tracking the call.", + AssignedToCall = "Dispatch has assigned you to a call, marked on your map by GPS navigation, more information will follow ASAP...", + AssignedCallInfo = "You've been dispatched to call ", + AssignedCallEmergency = "Emergency: ", + CallerName = "Caller Name: ", + CallerContactDetails = "Contact details: ", + CallStreet = "Street: ", + CallArea = "District: ", + CallPostal = "Postal: ", + CallDescription = "Call description: ", + CallContactDetails = "Contact details: ", + OffShift = "You have ended your shift.", + OnShift = "You have started your shift.", + Status = "Status: ", + StatusChanged = "Status changed!", + EmergencyCallMade = "Your emergency call was forwarded to the authorities.", + EmergencyCallFailed = "Your emergency call was not detailed enough. Try again.", + EmergencyHotlineBusy = "The emergency service hotline is busy at this moment. Try again later...", + CannotSwitchDepartmentWhilstOffShift = "You can't switch departments when not shift. Sign on shift first.", + DispatchMessage = "Dispatch Message: ", + DispatchMessageCooldown = "You've recently sent a dispatch message. Please wait 10 seconds.", + RegisteredVehicle = "Registered your vehicle!", + DeletedVehicle = "Deleted your registered vehicle successfully!", + DeletedVehicleFailed = "You can not delete the vehicle, since the database requires at least one entry, add a new one first.", + UpdatedVehicle = "Updated your vehicle successfully!", + UpdatedBolo = "Updated a BOLO successfully!", + RegisteredCivilian = "Registered your civilian successfully!", + DeletedCivilian = "Deleted your civilian successfully!", + DeletedCivilianFailed = "You can not delete the Civilian, since the database requires at least one entry, add a new one first.", + UpdatedCivilian = "Updated your civilian successfully!", + UpdatedMarkers = "Updated their markers successfully!", + AddedPoliceReport = "Successfully added the police report!", + AddedPoliceFine = "Successfully added the fine!", + DuplicateEntryCivilian = "You cannot register an already existing civilian with name: ", + DuplicateEntryVehicle = "You cannot register an already existing vehicle with plate: ", + LoadingCallSystem = "The call system is still loading... Please try again soon!", + YourEmergencyCall = "Your (emergency) call", + HasBeenForwarded = "has been forwarded to the emergency services hotline.", + CouldNotFindStatusCode = "Could not find this status code.", + ServerWasSynchronizingTryAgain = "The server was still synchronizing... Please try again soon!", + NewIncidentReceived = "🚨 999 EMERGENCY CALL 🚨 Press F10 to open the MDT.", + TrackerDisabled = "The tracker has been disabled. If you require more locations to be pushed, track them again.", + UpdatedTracker = "Updated tracker with new GPS navigation coordinates for ", + ResetTracker = "Reset tracker for ", + NewTrackerCoords = "Setting new GPS navigation coordinates to ", + MDTInitiateCharging = "Charging your MDT battery.", + MDTBatteryCharging = "Your MDT battery is being charged, this can take a few minutes. You're currently on: ", + MDTBatteryCharged = "Your MDT battery has been charged to: ", + MDTBatteryLevelLow = "Battery level low! Charge your MDT in a vehicle or interior. Syntax: /chargemdt", + MDTBatteryEmpty = "Battery empty! Charge your MDT in a vehicle or interior. Syntax: /chargemdt", + MDTBatteryIsFullAlready = "Your MDT battery is already full.", + AddedOperationsReport = "You've succesfully added an operations report.", + CannotTrackYourself = "You can not track yourself.", + NoChargePointNearby = "Your MDT can not charge: there is no charging port close to you. Enter a vehicle or interior to your MDT. Syntax: /chargemdt", + MDTBatterySystemDisabled = "The server owner has disabled the MDT battery system.", + MissingMDTItemInInventory = "You do not have an MDT in your inventory.", + MissingMDTChargerItemInInventory = "You do not have an MDT charger in your inventory.", + MissingPhoneItemInInventory = "You do not have a phone to call the emergency services in your inventory.", + PanicButtonPressed = "Panic button pressed! A distress signal has been marked on other units' map.", + DistressSignalActivated = "ALERT! A panic button was pressed. Please make way to the (latest) distress signal location marked on your map.", + DistressSignalStillActive = "Your distress signal was recently sent out to other units, please await the cooldown.", + BackupRequestCooldown = "You have recently requested backup, please try again later...", + BackupRequest = "Backup Request - ", + BackupDepartment = "Department requested: ", + BackupStreet = "Location: ", + BackupPostal = "Postal: ", + BackupRequesterDepartment = "Requester department: ", + BackupMarkedOnYourMap = "The backup request has been pinpointed on your map.", + BackupDefaultType = "None.", + WantedPersonSighted = "Wanted person sighting reported by ", + SightedAt = "at", + SightedMarkerDescription = "Marker description: ", + ANPRHit = "ANPR ALERT - ", + ANPRBOLO = "BOLO: ", + ANPRStolen = "Stolen: ", + ANPRInsurance = "Insurance: ", + ANPRMot = "MOT: ", + ANPRTax = "Tax: ", + ANPRStreet = "Streetname: ", + ANPRPostal = "Postal: ", + ANPRMarkedBOLO = "BOLO active", + ANPRNoBOLO = "BOLO inactive", + ANPRMarkedStolen = "Marked stolen", + ANPRNotStolen = "Not Stolen", + ANPRValid = "Valid MOT", + ANPRInvalid = "Invalid MOT", + ANPRPaid = "Tax Paid", + ANPRNotPaid = "Tax not paid", + ANPRInsured = "Insured", + ANPRNotInsured = "Not insured", + ANPRNo = "No.", + ANPRYes = "Yes.", + SeenByANPR = "SNAP! The ANPR camera feed has marked & located your vehicle.", + ANPRVehicleSighted = "ANPR registered vehicle sighting reported by", + ANPRVehicleOwnedBy = "Owner: ", + ANPRVehicleFlags = "Flags:", + LoadingANPR = "The ANPR system is still loading... Please try again soon!", + ANPRInVehicleEnabled = "You've switched on the in-vehicle ANPR system.", + ANPRInVehicleDisabled = "You've switched off the in-vehicle ANPR system.", + ANPRUnlocked = "ANPR Unlocked!", + NotInVehicle = "You must be in a vehicle to do this...", + YouAreNotOnShift = "You need to be on shift to do this...", + ChangedYourCallsign = "You've succesfully changed your callsign to: ", + ChangedTheirCallsign = "You've succesfully changed their callsign to: ", + DispatchSetYourCallsign = "Dispatch has assigned you a new callsign: ", + BeepedUnit = "You've sent a beep sound to unit: ", + CannotDeleteThisCivilianStillHasVehicles = "You can't delete this civilian, because they still have vehicles registered to them...", + BackupPolice = "Police Services", + BackupAmbulance = "Medical Services", + BackupFire = "Fire Services", + BackupTow = "Tow Services", + NoPlayerNearby = "There are no players nearby...", + YouHaveNoCivilianCharacters = "You've got no registered civilians...", + APlayerNearbyShowsID = "A player nearby shows their ID card to you.", + APlayerNearbyShowsID2 = "to look at it.", + UpdatedFine = "Succesfully updated the fine.", + CouldNotUpdatedFine = "Could not update this fine, the server was still synchronizing recent updates for it...", + DetachedFromCall = "You've detached from the last call.", + UnitDetached = "UNIT DETACHED -", + DuplicatePropertyAddress = "A property has already been registered on this address: ", + RegisteredProperty = "Registered your property!", + UpdatedProperty = "Updated your property!", + DeletedProperty = "Deleted your property!", + DeletedPropertyFailed = "You can not delete the Property, since the database requires at least one entry, add a new one first.", + UpdatedPropertySeized = "(Un)seized the property!", + NotAttachedToAnyCall = "You are not attached to any active call.", + VehicleAddedToFleet = "You've succesfully added a vehicle to the fleet.", + VehicleDeletedFromFleet = "You've succesfully deleted a vehicle from the fleet.", + VehicleDeletedFromFleetFailed = "You can not delete the vehicle from the fleet, since the database requires at least one entry, add a new one first.", + VehicleUpdatedInFleet = "Updated the vehicle in the fleet.", + StatisticsCalls = "Calls Registered", + StatisticsCallNotes = "Call Notes Registered", + StatisticsFines = "Fines Registered", + StatisticsVehicles = "Vehicles Registered", + StatisticsFleetVehicles = "Fleet Vehicles Registered", + StatisticsCivilians = "Civilians Registered", + StatisticsProperties = "Properties Registered", + StatisticsOperationReports = "Operation Reports Registered", + StatisticsANPRVehicles = "Vehicles in ANPR", + StatisticsWantedPeople = "Wanted People", + UpdatedTrainings = "Updated their training & certificates.", + ShotsFiredAt = "Shots fired at", + FightAt = "Fight at", + RoadCrimeAt = "Misbehaviour in traffic at", + SentDispatchMessage = "Broadcasted your dispatch message to all units.", + + -- COMMAND CHAT SUGGESTIONS + ToggleNotificationsHelpText = "A command used to toggle notifications for the MDT. (Not recommended to disable)", + MobileDataTerminalHelpText = "A command to open the mobile data terminal.", + CallEmergenciesHelpText = "A command to call the emergency services hotline.", + ChargeMDTHelpText = "A command to charge your MDT's battery.", + ForceCloseMDTHelpText = "Force close the MDT with this command.", + StatusChangeHelpText = "A command to quickly change your status.", + ShowIDAndLicensesHelpText = "A command to offer showing your ID & Licenses to the nearest player.", + StatusChangeArgument1 = "statuscode", + StatusChangeArgument1Example = "2", + ToggleANPRHelpText = "A command used to toggle the use ANPR within a vehicle.", + DisplayActiveCallHelpText = "A command to display the details your current active call on screen.", + + Icons = { -- https://fontawesome.com/search?q=check&o=r&m=free + SuccessIcon = "fa-solid fa-check", + WarningIcon = "fa-solid fa-triangle-exclamation", + ErrorIcon = "fa-solid fa-xmark", + DispatchIcon = "fa-solid fa-walkie-talkie", + EmergencyIcon = "fa-solid fa-phone-volume", + }, + + -- TRANSLATIONS INSIDE THE MDT + MDTText = { + -- GENERAL + Loading = "Loading...", + Yes = "Yes", + No = "No", + Select = "Select", + Attach = "Attach", + Police = "Police", + Ambulance = "Ambulance", + Fire = "Fire", + Tow = "Tow", + DMV = "DVLA", + CityHall = "COUNCIL", + DispatchActive = "Dispatch Active", + DispatchInactive = "Dispatch Inactive", + Actions = "Actions", + AddFleetCard = "Add vehicle", + EditFleetCard = "Edit vehicle", + FleetCardPictureURL = "Vehicle Picture URL", + FleetCardVehicleName = "Vehicle Name & Model", + FleetVehicleNamePlaceHolder = "Audi A4", + FleetCardVehicleModel = "Vehicle spawn model name", + FleetVehicleModelPlaceHolder = "taudia4", + FleetCardVehicleInService = "In Service", + FleetCardVehicleAttachedUnits = "Attached units", + FleetCardRoofCodeCallsign = "Veicle roofcode or callsign", + FleetRoofCodeCallsignPlaceHolder = "CW-01", + NoVehiclesInThisFleet = "There are no vehicles in this fleet.", + DetachFromAnyFleetVehicles = "Detach from any fleet vehicles", + ValidationFailed = "Validation failed. Please fill in all required fields.", + CreatedAt = "Created or last updated at", + AreYouSureDeleteFleetVehicle = "Are you sure you want to delete this vehicle from the fleet?", + DeleteVehicleFromFleet = "Delete vehicle from fleet", + SelectAction = "Select an action", + SelectDepartment = "Select a department", + --SelectSubDepartment = "Select a subdepartment", + RefreshButton = "Refresh", + AddCallButton = "Add call", + ActivateDispatchButton = "(De)activate dispatch", + RegisterButton = "Register", + EditButton = "Edit", + DeleteButton = "Delete", + DetachAnyUnitsButton = "Detach all", + ArchiveButton = "Archive", + SaveChangesButton = "Save changes", + AddFineButton = "Add Fine", + MarkFineAsPaidButton = "Mark As Paid", + AddRecordButton = "Add Record", + CloseButton = "Close", + ShowCitizenButton = "Show Citizen", + EditBOLOButton = "Edit BOLO", + CancelButton = "Cancel", + CallEmergencyServicesButton = "Call emergency services", + OneOrMoreFieldsHaveNotBeenFilled = "One or more fields have not been filled!", + NoUnitsSelected = "You haven't selected any units...", + ClosingIn = "Closing in", + ClosingSeconds = "seconds...", + + -- SHIFT MENU + ToggleShift = "Toggle Shift", + SelectSubDepartmentAndShiftInfo = "Select your sub-department and start your shift.", + SelectSubDepartment = "Select Sub-department", + SubDepartment = "Sub-Department", + EmployeeDetails = "Employee Details", + EmployeeName = "Name: ", + EmployeeRank = "Rank: ", + EmployeeCallsign = "Callsign: ", + EmployeeVehicleRoofcode = "Vehicle roofcode: ", + EmployeeActiveCall = "Active call ID: ", + EmployeeCurrentShiftTime = "Current shift duration: ", + EmployeeShiftTime = "Total shift duration: ", + EmployeeMinutes = "minutes.", + EmployeeHours = "hours", + EmployeeDays = "days", + EmployeeAccessLevel = "User Access Level: ", + EmployeeStatus = "Active Status Code: ", + EmployeeStatus2 = "Active Status: ", + EmployeeActiveSubDepartment = "Active Sub-department: ", + StatusPanel = "Status panel", + SelectStatus = "Select your status", + StatusPanelInfo = "Select your status whilst on shift and keep dispatch updated.", + EditCallsign = "Edit Callsign", + EnterNewCallsign = "Enter new callsign", + NewCallsign = "New Callsign", + CallsignErrorMessage1 = "Please enter a new callsign with only letters, numbers, and hyphens.", + CallsignErrorMessage2 = "Please enter a new callsign with a maximum of 15 characters.", + + -- EMERGENCY HOTLINE + EmergencyCall = "Emergency call", + NonEmergencyCall = "Non-Emergency Call", + EmergencyCalls = "Emergency Hotline", + ActiveCalls = "Active Calls", + ArchivedCalls = "Archived Calls", + ArchivedCall = "Archived call", + DestroyedCall = "Deleted call", + DestroyedCalls = "Deleted calls", + DestroyedCallFailed = "You can not delete the call, since the database requires at least one entry, add a new one first.", + CallID = "#", + CallerId = "ID:", -- Unused? + CallDetails = "Details", + CallInformation = "Get insight into the call by reading the details below.", + CallDescription = "Description", + CallerPostal = "Postal: ", + CallerStreetName = "Street: ", + CallerAreaName = "District: ", + ContactDetails = "Contact details: ", + CallUnits = "Attached units: ", + CallEmergencyType = "Emergency type: ", + CallEmergency = "Emergency", + CallNonEmergency = "Non-Emergency", + CallRequiredUnits = "Required units", + EmergencyServicesHotline = "Emergency Services Hotline", + EmergencyCallBy = "Caller:", + DeleteCall = "Archive", + GPS = "Locate via GPS", + SendBeep = "Send beep", + SelectCivilianMakingTheCall = "Select the civilian making the call...", + IsThisAnEmergency = "Is this call an emergency?", + IsThisCallAnonymous = "Are you calling anonymous?", + DoYouRequire = "Do you require", + ToAttend = "to attend?", + AtWhatPostal = "At what postal is this incident?", + AtWhatStreet = "At what street is this incident?", + AtWhatArea = "At what district/area is this incident?", + TimeOfCall = "Time of call", + HowToContact = "How can we contact you?", + PlaceHolderSelectCivilian = "Select a citizen...", + PlaceholderHowToContact = "Phone, E-mail or a station to visit", + EmergencyCallOverview = "Emergency call overview", + CallNotes = "Call Notes", + CallAddNotesButton = "View/Add notes", + CallAddUnitsButton = "Assign units", + CallViewNotesButton = "View notes", + CallNotesTitle = "Call Notes | Call ", + CallNoteCreatedSystemMessage = "CALL NOTE CREATED.", + CallerName = "Caller Name: ", + AddNoteButton = "Add Note", + AddNotePlaceholder = "Add a new note...", + AddedCallNote = "Added a call note to call ", + System = "SYSTEM", + Next = "Next", + Previous = "Previous", + + -- PNC + BornOn = "Born on ", + Markers = "Markers", + MarkersSubTitle = "Any active markers are displayed below.", + ArmedAndDangerous = "Armed and Dangerous", + Assault = "Assault", + Burglary = "Burglary", + DrugRelated = "Drug Related", + GangAffiliation = "Gang Affiliation", + Homicide = "Homicide", + Kidnapping = "Kidnapping", + MentalHealth = "Mental Health Issues", + SexOffense = "Sex Offense", + Terrorism = "Terrorism", + Theft = "Theft", + TrafficViolation = "Traffic Violation", + WantedPerson = "Wanted Person", + OtherMarker = "Other, read description...", + ActiveWarrant = "Active Warrant", + DescribeMarkerAndWarrant = "Describe markers/warrant", + Timestamp = "Timestamp", + ShowVehicles = "Show Vehicles", + ShowProperties = "Show Properties", + ShowRecords = "Show Records", + ShowFines = "Show Fines", + EditMarkers = "Edit Markers", + AddRecord = "Add Record", + AddFine = "Add Fine", + NoCitizensFound = "No citizens found by", + EnterAtLeast = "Please enter at least", + Characters = "character(s)", + AddRecordFor = "Add a record for", + Charge = "Criminal Offense", + Description = "Description", + Victims = "Victims", + LocationDescription = "Location description", + OfficerDetails = "Officer Details", + Sentence = "Sentence", + Prosecuted = "Has the suspect been prosecuted for this offense?", + Prosecuted2 = "Prosecuted", + ReportDate = "Report date", + AddFineFor = "Add a fine for", + TicketableOffense = "Ticketable Offense", + FineDescription = "Fine Description", + FineAmount = "Fine Amount", + DueDate = "Due Date", + PaidFine = "Has the offender paid the fine?", + FineDate = "Fine Date", + GeneratedForCitizenId = "Generated for Citizen ID", + NoRecordsFound = "No records found for Citizen ID", + RegisteredToCitizenId = "Registered to citizen ID", + CitizenName = "Citizen Name", + NoVehiclesFoundForCitizenId = "No vehicles found for Citizen ID", + FineIssuedOn = "Fine issued on", + FinePaid = "Fine Paid", + NoFinesFoundForCitizenId = "No fines found for Citizen ID", + EditMarkersFor = "Edit Markers for", + LastUpdatedBy = "Last updated by", + PNCOverview = "PNC", + PNCPersonSearch = "Person Search", + PNCPersonSearchPlaceholder = "John Doe / Citizen ID", + PNCVehicleSearch = "Vehicle Search", + PNCVehicleSearchPlaceholder = "HF22 BXU / Citizen ID", + PNCPropertySearch = "Property Search", + PNCPropertySearchPlaceholder = "Citizen ID", + NoPropertiesFoundForCitizenId = "No properties found for Citizen ID", + PNCRecordSearch = "Record Search", + PNCRecordSearchPlaceholder = "Citizen ID", + PNCFineSearch = "Fine Search", + PNCFineSearchPlaceholder = "Citizen ID", + PNCResults = "Results", + PNCMarkStolen = "Mark as stolen?", + PNCBolo = "BOLO Active?", + DescribeBolo = "Describe the reason for initiating a BOLO", + PNCBoloDescription = "BOLO Description:", + EditBoloFor = "Edit BOLO for ", + Search = "Search", + Send = "Send", + Dispatch = "Control", + DispatchMessagePlaceholder = "Send a message to all active units.", + DispatchMessageTitle = "Control Announcement", + ActiveUnits = "Active Units", + Backup = "Backup", + FleetManagement = "Fleet Management", + ActiveWarrants = "Active Warrants", + WantedFor = "Wanted for:", + LastUpdated = "Last updated:", + ReportSighting = "Report sighting", + DateAndTime = "Date and Time", + ANPRSection = "ANPR", + ANPRSectionFullName = "Automatic Number Plate Recognition", + PlaceholderCharge = "Theft", + PlaceholderVictims = "John Doe, Jane Doe", + PlaceholderLocationDescription = "Streetname, postal, address", + PlaceholderOfficerDetails = "C. Lowly - Badge #3622", + PlaceholderSentence = "Describe the sentence", + PlaceholderTicketableOffense = "Speeding", + NoWantedPersonsFound = "No wanted persons found...", + NoWantedVehiclesFound = "No wanted vehicles found...", + ANPRFront = "ANPR FRONT", + ANPRRear = "ANPR REAR", + ANPRModel = "Model:", + ANPRColour = "Colour:", + ANPRSpeed = "Speed:", + ANPRFlags = "Flags:", + ANPRLocation = "Location:", + + -- UNIT OVERVIEW + NameId = "Name (ID)", + Callsign = "Callsign", + ModeOfTransport = "Mode of transport", + VehicleRoofcode = "Vehicle roofcode", + Department = "Department", + Rank = "Rank", + Location = "Location", + Postal = "Postal", + Status = "Status", + Tracking = "Tracking", + DispatchMessageError = "Please insert at least 10 characters.", + RequestBackupFromPolice = "Request backup from the police department.", + RequestBackupFromAmbulance = "Request backup from the ambulance department.", + RequestBackupFromFire = "Request backup from the fire department.", + RequestBackupFromTow = "Request the tow services.", + RequestBackupButton = "Request Backup", + RequestedBackupType = "Backup Requested", + NoActiveCalls = "There are no active calls at this moment...", + NoActiveUnits = "There are no active units at this moment...", + AssignToACall = "Assign to a call", + AssignToCallButton = "Assign to call", + AssignUnitsToCallButton = "Assign Unit(s)", + AssignUnitToCallOverview = "ACTIVE UNIT OVERVIEW | Assign units to call", + AssignUnitToCall = "ACTIVE CALL OVERVIEW | Assign ", + AssignToCallHelp = "When they are assigned to the call, they will receive a route indicator on their map. They will also get set to the 'responding' status.", + AssignNewStatus = "Assign new status", + AssignNewCallsign = "Assign new callsign", + AssignNewFleetVehicle = "Assign new fleet vehicle", + AssignUnitNewStatus = "ASSIGN STATUS TO UNIT ", + UnitsTrackingCall = "Units tracking call", + None = "None", + ActiveCallID = "Active Call", + SirensOn = "Sirens ON", + SirensOff = "Sirens OFF", + + -- OPERATIONS + Report = "Report", + ReportType = "Report Type", + Operations = "Operations", + AddReports = "Add Operation Reports", + SearchReports = "Search Operation Reports", + SearchReportsPlaceholder = "Enter a query (eg. name or part of the description)", + SearchReportsByDatePlaceholder = "Search by date", + SelectReportType = "Select a report type...", + SelectReportTypePolice = "Police reports", + SelectReportTypeFire = "Fire reports", + SelectReportTypeMedical = "Medical reports", + MedicalReportType = "Medical Report Type", + FireReportType = "Fire Report Type", + PoliceReportType = "Police Report Type", + SubmitReport = "Submit Report", + ViewReport = "View Full Report", + NoOperationReportsFound = "No operation reports found on", + SignedBy = "Signed by", + SignedByPlaceholder = "Enter your name", + DescriptionPlaceholder = "Enter a description", + LocationPlaceholder = "Enter a location (eg. streetname, area, postal)", + EmployeeInvolved = "Employee(s) involved", + EmployeeInvolvedPlaceholder = "Enter names / Badge numbers / Citizen ID's (eg. Department, rank, name and more details)", + CivilianInvolved = "Civilian(s) involved", + CivilianInvolvedPlaceholder = "Enter names / Citizen ID's", + VehicleInvolved = "Vehicle(s) involved", + VehicleInvolvedPlaceholder = "Enter vehicles / Vehicle ID's / Citizen ID's (eg. vehicle owners)", + PenalCode = "Police Handbook", + Guidelines = "Guidelines", + Training = "Training", + UpdateTrainings = "Update Trainings", + + -- STATISTICS + Statistics = "Statistics", + ViewStatistics = "View All Time Statistics", + --== COLORS + AxesColor = "rgba(255, 255, 255, 0.6)", + barColor = "rgba(122, 189, 225, 0.2)", + barBorderColor = "rgba(122, 189, 225, 1)", + + -- DMV + LicensePlate = "License Plate", + Make = "Make", + Model = "Model", + Color = "Colour", + BuildYear = "Build year", + TaxPaid = "Tax Paid?", + MOTPassed = "Ministry of Transport (MOT) annual test passed?", + Insurance = "Insurance?", + ReportAsStolen = "Report as stolen?", + ReportedStolen = "Reported Stolen?", + RegisteredOn = "Registered on", + OwnedBy = "Owned by", + VehicleRegisterId = "Vehicle Registration Number", + MoT = "MOT?", + EditVehicleRegistration = "Edit vehicle registration", + OwnedByCitizenId = "Owned by Citizen ID", + VehiclePictureURL = "Vehicle Picture URL", + RegistrationDate = "Registration Date", + SelectCitizen = "Select a citizen...", + RegisterAVehicle = "Register a vehicle", + RegisterVehicleSubtitle = "Register your desired vehicle!", + ViewRegisteredVehicles = "View your registered vehicles", + EditVehiclesSubtitle = "Edit them all your way!", + AreYouSureDeleteVehicle = "Are you sure you want to delete your registered vehicle?", + DeletingVehicleCannotBeUndone = "Deleting this registered vehicle cannot be undone.", + YesDeleteVehicle = "Yes, delete my registered vehicle.", + PlaceholderLicensePlate = "HA23-RHY (No whitespaces)", + PlaceholderMake = "Audi", + PlaceholderModel = "A6 Avant", + PlaceholderColor = "Red", + PlaceholderYear = "2023", + + -- CITY HALL + FirstName = "First Name", + LastName = "Last Name", + DateOfBirth = "Date of birth", + Gender = "Gender", + Email = "E-mail", + PhoneNumber = "Phone number", + Address = "Address", + AddressType = "Address type", + City = "City", + State = "State", + PostalCode = "Postal code", + Country = "Country", + Occupation = "Occupation", + Nationality = "Nationality", + PictureURL = "Picture URL", + RegisterCarLicense = "Register car license?", + RegisterBikeLicense = "Register bike license?", + RegisterTruckLicense = "Register truck license?", + RegisterBoatLicense = "Register boat license?", + RegisterPilotLicense = "Register pilot license?", + Licenses = "Licenses", + CitizenId = "Citizen ID", + CarLicense = "Car License", + BikeLicense = "Bike License", + TruckLicense = "Truck License", + BoatLicense = "Boat License", + PilotLicense = "Pilot License", + EditCitizen = "Edit civilian", + ProfilePictureURL = "Civilian Picture URL", + RegisterACivilian = "Register a civilian", + RegisterCivilianSubtitle = "Register whoever you want to be!", + ViewRegisteredCivilians = "View your registered civilians", + EditCiviliansSubtitle = "Edit them all your way!", + AreYouSureDeleteCivilian = "Are you sure you want to delete your civilian?", + DeletingCivilianCannotBeUndone = "Deleting this character cannot be undone.", + YesDeleteCivilian = "Yes, delete my civilian.", + PlaceholderFirstName = "John", + PlaceholderLastName = "Doe", + PlaceholderGender = "Any gender", + PlaceholderEmail = "johndoe@nsmail.com", + PlaceholderPhonenumber = "31613371337", + PlaceholderAddress = "Grove Street 5", + PlaceholderAddressType = "House, apartment, studio, and/or floor", + PlaceholderCity = "London", + PlaceholderState = "Greater London", + PlaceholderPostal = "9104", + PlaceholderCountry = "United Kingdom", + PlaceholderOccupation = "Accountant", + PlaceholderNationality = "English", + + -- REAL ESTATE + RealEstate = "Real Estate", + ViewRegisteredProperties = "View your registered properties", + EditPropertiesSubtitle = "Edit them the way you like!", + RegisterAProperty = "Register a property", + RegisterPropertySubtitle = "Register your desired properties", + SelectPropertyType = "Property type...", + HouseNumber = "House number", + PlaceholderHouseNumber = "12", + PropertyPictureURL = "Property Picture URL", + Area = "District", + PlaceholderArea = "Vinewood Hills", + PlaceholderPostalCode = "5001", + PlaceholderPrice = "25000", + Amenities = "Amenities", + PlaceholderAmenities = "Describe the amenities...", + PropertyOwnedBy = "Owned by", + PropertySeized = "Seized Property?", + EditPropertySeizedButton = "(Un)seize", + PropertyType = "Property Type", + PropertyRegisterId = "Property Registration Number", + PropertyAddress = "Adress", + PropertyHouseNumber = "House Number", + PropertyArea = "District", + PropertyPostalCode = "Postal Code", + PropertyDescription = "Description", + PropertyPrice = "Price", + PropertyBuildYear = "Build Year", + PropertyAmenities = "Aminities", + AreYouSureDeleteProperty = "Are you sure to delete this property?", + DeletingPropertyCannotBeUndone = "Deleting this property can not be undone.", + YesDeleteProperty = "Delete Property", + EditPropertyRegistration = "Edit Property Registration", + + -- Management + Management = "Management Panel", + ManageCivilians = "Civilians", + ManageVehicles = "Vehicles", + ManageProperties = "Properties", + ManageCalls = "Calls", + CivilianIDPlaceholder = "Citizen ID", + VehicleIDPlaceholder = "Vehicle Registration ID", + PropertyIDPlaceholder = "Property Registration ID", + CallIDPlaceholder = "Call ID", + + Delete10Calls = "Delete 10 oldest calls", + Delete50Calls = "Delete 50 oldest calls", + Delete100Calls = "Delete 100 oldest calls", + + -- VALUTA + Valuta = "£", + }, + + -- HELP MENU TRANSLATIONS + HelpMenuText = { + Header = "MDT Information", + Info1 = "Each menu has it's own access level assigned by the server owner. You have access to the sections you require, based on your rank.", + Info2 = "MDT stands for 'Mobile Data Terminal', it was built to search and register data. It provides insight into active units, persons, vehicles, markers, warrants, police records, medical records, incident reports, fines, emergency calls and statistics.", + Info3 = "The MDT is built to allow self-service. This means civilians can create their own character & vehicles and they can edit them at all times. Police records and fines on the other hand are controlled by police. The same goes for other department related records.", + Info4 = "Keybinds are available via ESC -> Settings - > Key Bindings -> FiveM. May you need more explanation on how to use the MDT, please visit the documentation: https://docs.nights-software.com/resources/nightShifts/", + }, + }, + + + --============================== GERMAN ==============================-- + ['de'] = { + Info = "^2INFO^7", + Error = "^1ERROR^7", + Syntax = "Syntax", + Yes = "Ja", + No = "Nein", + Nearby = "in der Nähe", + Unknown = "Unbekannt", + Downloading = "Wird heruntergeladen...", + Enabled = "aktiviert", + Disabled = "deaktiviert", + AutomaticAlarm = "Automatischer Alarm", + SomethingWentWrong = "Beim Versuch, Ihre Daten zu aktualisieren, ist ein Fehler aufgetreten. Dieser Fehler kann kritisch sein. Bitte wenden Sie sich an den Serverbesitzer und bitten Sie ihn, die Serverprotokolle zu überprüfen.", + ToggleNotifications = "^3Benachrichtigungen ^7sind jetzt", + North = "N", + NorthEast = "NE", + East = "O", + SouthEast = "SO", + South = "S", + SouthWest = "SW", + West = "W", + NorthWest = "NW", + Browse = "Durchsuchen", + Cancel = "Abbrechen", + Anonymous = "Anonym", + ShowID = "ID zeigen", + ShowingIDCardOF = "Ausweis zeigen von", + CancelledShowingIDCard = "Ausweiszeigen abgebrochen...", + Location = "Standort:", + MDTReady = "Ihr MDT ist einsatzbereit!", + DisconnectedFromMDT = "Ihr MDT ist jetzt im Standby-Modus.", + CancelledCall = "Sie haben Ihren Notruf abgebrochen.", + ForceClosedMDT = "Sie haben das MDT & den Anrufbildschirm erzwungen geschlossen.", + MDTIsUpdating = "Ihr MDT wird aktualisiert. Bitte versuchen Sie es später noch einmal...", + MDTIsCharging = "Ihr MDT wird bereits aufgeladen.", + MDTIsStillOpen = "Sie können dies nicht tun, während Ihr MDT eingeschaltet ist.", + MDTIsStillLoading = "Konnte eines der folgenden Themen NICHT finden: Ihre FiveM-ID oder Discord-Rollen. Stellen Sie sicher, dass Sie sich in die FiveM-App einloggen und Ihr CFX- und Discord-Konto verknüpfen. Wenn dieses Problem weiterhin besteht, wenden Sie sich bitte an den Serverbesitzer.", + EmergencyCallCooldown = "Sie müssen 1 Minute warten, um einen weiteren Notruf zu tätigen...", + EmergencyCallScreenStillOpen = "Sie können dies nicht tun, während Ihr Notrufsystem eingeschaltet ist.", + MDTRecentlyRefreshed = "Ihr MDT wurde kürzlich aktualisiert, versuchen Sie es später noch einmal...", + NoAccessToMDT = "Ihnen fehlen die erforderlichen Discord-Rollen für den Zugriff auf das MDT.", + AccessGrantedMDT = "Zugriff gewährt zu", + AccessDeniedMDT = "Zugriff verweigert zu", + NoAccess = "Sie haben nicht das erforderliche Zugriffslevel: ", + DispatchWasAlreadyActive = "Sie konnten nicht als Dispatcher zugewiesen werden, da der Dispatch bereits aktiv ist.", + UnitAssigned = "Sie haben die Einheit dem Anruf zugewiesen.", + UnitsAssigned = "Sie haben die ausgewählten Einheiten dem Anruf zugewiesen.", + AssignedNewStatus = "Sie haben der Einheit einen neuen Status zugewiesen.", + AssignedNewFleetVehicle = "Sie haben ein Flottenfahrzeug zugewiesen.", + DetachedThemFromVehicleInFleet = "Sie haben die Einheit von einem Flottenfahrzeug getrennt.", + YouHaveBeenAssignedAFleetVehicle = "Ihnen wurde ein Flottenfahrzeug zugewiesen:", + YouHaveBeenDetachedFromAnyFleetVehicle = "Sie wurden von einem Flottenfahrzeug getrennt.", + Selected = "Ausgewählt: ", + YourAccessLevel = "Ihr Zugriffslevel: ", + RequiredAccessLevel = "Erforderliches Zugriffslevel: ", + SuccesfullyDeletedCall = "Anruf erfolgreich gelöscht.", + TrackingCall = "Sie verfolgen jetzt den Anruf.", + AssignedToCall = "Sie wurden zu einem Anruf zugewiesen, markiert auf Ihrer Karte durch GPS-Navigation, weitere Informationen folgen so schnell wie möglich...", + AssignedCallInfo = "Sie wurden zu einem Anruf zugewiesen ", + AssignedCallEmergency = "Notfall: ", + CallerName = "Anrufername: ", + CallerContactDetails = "Kontaktdaten: ", + CallStreet = "Straße: ", + CallArea = "Bezirk: ", + CallPostal = "Postleitzahl: ", + CallDescription = "Anrufbeschreibung: ", + CallContactDetails = "Kontaktdaten: ", + OffShift = "Sie haben Ihre Schicht beendet.", + OnShift = "Sie haben Ihre Schicht begonnen.", + Status = "Status: ", + StatusChanged = "Status geändert!", + EmergencyCallMade = "Ihr Notruf wurde an die Behörden weitergeleitet.", + EmergencyCallFailed = "Ihr Notruf war nicht detailliert genug. Versuchen Sie es erneut.", + EmergencyHotlineBusy = "Die Notrufzentrale ist derzeit besetzt. Versuchen Sie es später noch einmal...", + CannotSwitchDepartmentWhilstOffShift = "Sie können die Abteilung nicht wechseln, ohne im Dienst zu sein. Bitte loggen Sie sich zuerst ein.", + DispatchMessage = "Einsatznachricht: ", + DispatchMessageCooldown = "Sie haben kürzlich eine Einsatznachricht gesendet. Bitte warten Sie 10 Sekunden.", + RegisteredVehicle = "Ihr Fahrzeug wurde registriert!", + DeletedVehicle = "Ihr registriertes Fahrzeug wurde erfolgreich gelöscht!", + DeletedVehicleFailed = "Sie können das Fahrzeug nicht löschen, da die Datenbank mindestens einen Eintrag benötigt, fügen Sie zunächst einen neuen hinzu.", + UpdatedVehicle = "Ihr Fahrzeug wurde erfolgreich aktualisiert!", + UpdatedBolo = "Ein BOLO wurde erfolgreich aktualisiert!", + RegisteredCivilian = "Ihr Zivilist wurde erfolgreich registriert!", + DeletedCivilian = "Ihr Zivilist wurde erfolgreich gelöscht!", + DeletedCivilianFailed = "Sie können den Zivilisten nicht löschen, da die Datenbank mindestens einen Eintrag erfordert. Fügen Sie zuerst einen neuen hinzu.", + UpdatedCivilian = "Ihr Zivilist wurde erfolgreich aktualisiert!", + UpdatedMarkers = "Deren Markierungen wurden erfolgreich aktualisiert!", + AddedPoliceReport = "Der Polizeibericht wurde erfolgreich hinzugefügt!", + AddedPoliceFine = "Das Bußgeld wurde erfolgreich hinzugefügt!", + DuplicateEntryCivilian = "Sie können keinen bereits existierenden Zivilisten mit dem Namen registrieren: ", + DuplicateEntryVehicle = "Sie können kein bereits existierendes Fahrzeug mit dem Kennzeichen registrieren: ", + LoadingCallSystem = "Das Anrufsystem lädt noch... Bitte versuchen Sie es später noch einmal!", + YourEmergencyCall = "Ihr (Notfall-)Anruf", + HasBeenForwarded = "wurde an die Notrufzentrale weitergeleitet.", + CouldNotFindStatusCode = "Konnte diesen Statuscode nicht finden.", + ServerWasSynchronizingTryAgain = "Der Server synchronisierte noch... Bitte versuchen Sie es noch einmal!", + NewIncidentReceived = "🚨 999 NOTRUF 🚨 Drücken Sie F10, um das MDT zu öffnen.", + TrackerDisabled = "Der Tracker wurde deaktiviert. Wenn Sie weitere Standorte hinzufügen möchten, verfolgen Sie sie erneut.", + UpdatedTracker = "Tracker mit neuen GPS-Navigationskoordinaten für ", + ResetTracker = "Tracker für ", + NewTrackerCoords = "Setze neue GPS-Navigationskoordinaten zu ", + MDTInitiateCharging = "Laden Sie Ihren MDT-Akku auf.", + MDTBatteryCharging = "Ihr MDT-Akku wird aufgeladen, dies kann einige Minuten dauern. Sie befinden sich derzeit auf: ", + MDTBatteryCharged = "Ihr MDT-Akku wurde aufgeladen auf: ", + MDTBatteryLevelLow = "Batteriestand niedrig! Laden Sie Ihr MDT in einem Fahrzeug oder Innenraum auf. Syntax: /chargemdt", + MDTBatteryEmpty = "Batterie leer! Laden Sie Ihr MDT in einem Fahrzeug oder Innenraum auf. Syntax: /chargemdt", + MDTBatteryIsFullAlready = "Ihr MDT-Akku ist bereits voll.", + AddedOperationsReport = "Sie haben erfolgreich einen Einsatzbericht hinzugefügt.", + CannotTrackYourself = "Sie können sich nicht selbst verfolgen.", + NoChargePointNearby = "Ihr MDT kann nicht geladen werden: Es gibt keinen Ladeanschluss in Ihrer Nähe. Betreten Sie ein Fahrzeug oder Innenraum, um Ihr MDT zu laden. Syntax: /chargemdt", + MDTBatterySystemDisabled = "Der Serverbesitzer hat das MDT-Batteriesystem deaktiviert.", + MissingMDTItemInInventory = "Sie haben kein MDT in Ihrem Inventar.", + MissingMDTChargerItemInInventory = "Sie haben kein MDT-Ladegerät in Ihrem Inventar.", + MissingPhoneItemInInventory = "Sie haben kein Telefon dabei, um den Notruf anzurufen.", + PanicButtonPressed = "Panikknopf gedrückt! Ein Notsignal wurde auf den Karten anderer Einheiten markiert.", + DistressSignalActivated = "ALARM! Ein Panikknopf wurde gedrückt. Bitte machen Sie sich auf den Weg zum (neuesten) Notfallsignalort, der auf Ihrer Karte markiert ist.", + DistressSignalStillActive = "Ihr Notsignal wurde erst kürzlich an andere Einheiten gesendet, bitte warten Sie ab.", + BackupRequestCooldown = "Sie haben erst kürzlich um Unterstützung gebeten, bitte versuchen Sie es später noch einmal...", + BackupRequest = "Unterstützungsanfrage - ", + BackupDepartment = "Angeforderte Abteilung: ", + BackupStreet = "Standort: ", + BackupPostal = "Postleitzahl: ", + BackupRequesterDepartment = "Anfordernde Abteilung: ", + BackupMarkedOnYourMap = "Die Unterstützungsanfrage wurde auf Ihrer Karte markiert.", + BackupDefaultType = "Keine.", + WantedPersonSighted = "Gesuchte Person gesichtet von ", + SightedAt = "bei", + SightedMarkerDescription = "Markierungsbeschreibung: ", + ANPRHit = "ANPR ALARM - ", + ANPRBOLO = "BOLO: ", + ANPRStolen = "Gestohlen: ", + ANPRInsurance = "Versicherung: ", + ANPRMot = "MOT: ", + ANPRTax = "Steuer: ", + ANPRStreet = "Straßenname: ", + ANPRPostal = "Postleitzahl: ", + ANPRMarkedBOLO = "BOLO aktiv", + ANPRNoBOLO = "BOLO inaktiv", + ANPRMarkedStolen = "Als gestohlen markiert", + ANPRNotStolen = "Nicht gestohlen", + ANPRValid = "Gültiges MOT", + ANPRInvalid = "Ungültiges MOT", + ANPRPaid = "Steuer bezahlt", + ANPRNotPaid = "Steuer nicht bezahlt", + ANPRInsured = "Versichert", + ANPRNotInsured = "Nicht versichert", + ANPRNo = "Nr.", + ANPRYes = "Ja.", + SeenByANPR = "SNAP! Die ANPR-Kamera hat Ihr Fahrzeug erfasst und lokalisiert.", + ANPRVehicleSighted = "ANPR registrierte Fahrzeugsichtung gemeldet von", + ANPRVehicleOwnedBy = "Besitzer: ", + ANPRVehicleFlags = "Flags:", + LoadingANPR = "Das ANPR-System lädt noch... Bitte versuchen Sie es bald noch einmal!", + ANPRInVehicleEnabled = "Sie haben das ANPR-System im Fahrzeug aktiviert.", + ANPRInVehicleDisabled = "Sie haben das ANPR-System im Fahrzeug deaktiviert.", + ANPRUnlocked = "ANPR entsperrt!", + NotInVehicle = "Sie müssen in einem Fahrzeug sein, um dies zu tun...", + YouAreNotOnShift = "Sie müssen in Schicht sein, um dies zu tun...", + ChangedYourCallsign = "Sie haben Ihr Rufzeichen erfolgreich geändert in: ", + ChangedTheirCallsign = "Sie haben deren Rufzeichen erfolgreich geändert in: ", + DispatchSetYourCallsign = "Die Zentrale hat Ihnen ein neues Rufzeichen zugewiesen: ", + BeepedUnit = "Sie haben einen Piepton an das Gerät gesendet: ", + CannotDeleteThisCivilianStillHasVehicles = "Sie können diesen Zivilisten nicht löschen, weil er noch Fahrzeuge auf sich registriert hat...", + BackupPolice = "Polizeidienste", + BackupAmbulance = "Medizinische Dienste", + BackupFire = "Feuerwehrdienste", + BackupTow = "Abschleppdienste", + NoPlayerNearby = "Es sind keine Spieler in der Nähe...", + YouHaveNoCivilianCharacters = "Sie haben keine registrierten Zivilisten...", + APlayerNearbyShowsID = "Ein in der Nähe befindlicher Spieler zeigt Ihnen seinen Ausweis.", + APlayerNearbyShowsID2 = "um ihn anzusehen.", + UpdatedFine = "Bußgeld erfolgreich aktualisiert.", + CouldNotUpdatedFine = "Konnte dieses Bußgeld nicht aktualisieren, der Server synchronisiert noch kürzliche Aktualisierungen dafür...", + DetachedFromCall = "Sie haben sich vom letzten Anruf abgemeldet.", + UnitDetached = "EINHEIT ABGEKOPPELT -", + DuplicatePropertyAddress = "Eine Immobilie wurde bereits auf dieser Adresse registriert: ", + RegisteredProperty = "Ihre Immobilie registriert!", + UpdatedProperty = "Ihre Immobilie aktualisiert!", + DeletedProperty = "Ihre Immobilie gelöscht!", + DeletedPropertyFailed = "Sie können die Eigenschaft nicht löschen, da die Datenbank mindestens einen Eintrag erfordert. Fügen Sie zuerst einen neuen hinzu.", + UpdatedPropertySeized = "Immobilie beschlagnahmt/zurückgegeben!", + NotAttachedToAnyCall = "Sie sind an keinem aktiven Anruf beteiligt.", + VehicleAddedToFleet = "Sie haben der Flotte erfolgreich ein Fahrzeug hinzugefügt.", + VehicleDeletedFromFleet = "Sie haben ein Fahrzeug erfolgreich aus der Flotte gelöscht.", + VehicleDeletedFromFleetFailed = "Sie können das Fahrzeug nicht aus der Flotte löschen, da die Datenbank mindestens einen Eintrag erfordert. Fügen Sie zunächst einen neuen hinzu.", + VehicleUpdatedInFleet = "Das Fahrzeug in der Flotte wurde aktualisiert.", + StatisticsCalls = "Anrufe registriert", + StatisticsCallNotes = "Anrufnotizen registriert", + StatisticsFines = "Strafen registriert", + StatisticsVehicles = "Fahrzeuge registriert", + StatisticsFleetVehicles = "Firmenfahrzeuge registriert", + StatisticsCivilians = "Zivilisten registriert", + StatisticsProperties = "Eigenschaften registriert", + StatisticsOperationReports = "Einsatzberichte registriert", + StatisticsANPRVehicles = "Fahrzeuge in ANPR", + StatisticsWantedPeople = "Gesuchte Personen", + UpdatedTrainings = "Ihre Schulungen und Zertifikate wurden aktualisiert.", + ShotsFiredAt = "Es wurden Schüsse abgefeuert", + FightAt = "Kämpfe um", + RoadCrimeAt = "Fehlverhalten im Straßenverkehr", + SentDispatchMessage = "Ihre Versandnachricht wurde an alle Einheiten gesendet.", + + -- COMMAND CHAT SUGGESTIONS + ToggleNotificationsHelpText = "Ein Befehl zum Umschalten von Benachrichtigungen für den MDT. (Deaktivierung wird nicht empfohlen)", + MobileDataTerminalHelpText = "Ein Befehl, um das mobile Datenterminal zu öffnen.", + CallEmergenciesHelpText = "Ein Befehl, um die Notrufzentrale anzurufen.", + ChargeMDTHelpText = "Ein Befehl, um den Akku Ihres MDT aufzuladen.", + ForceCloseMDTHelpText = "Erzwingen Sie das Schließen des MDT mit diesem Befehl.", + StatusChangeHelpText = "Ein Befehl, um schnell Ihren Status zu ändern.", + ShowIDAndLicensesHelpText = "Ein Befehl, um dem nächstgelegenen Spieler Ihren Ausweis und Ihre Führerscheine zu zeigen.", + StatusChangeArgument1 = "statuscode", + StatusChangeArgument1Example = "2", + ToggleANPRHelpText = "Ein Befehl zum Umschalten der Verwendung von ANPR innerhalb eines Fahrzeugs.", + DisplayActiveCallHelpText = "Ein Befehl zum Anzeigen der Details Ihres aktuellen aktiven Anrufs auf dem Bildschirm.", + + Icons = { -- https://fontawesome.com/search?q=check&o=r&m=free + SuccessIcon = "fa-solid fa-check", + WarningIcon = "fa-solid fa-triangle-exclamation", + ErrorIcon = "fa-solid fa-xmark", + DispatchIcon = "fa-solid fa-walkie-talkie", + EmergencyIcon = "fa-solid fa-phone-volume", + }, + + -- TRANSLATIONS INSIDE THE MDT + MDTText = { + -- GENERAL + Loading = "Laden...", + Yes = "Ja", + No = "Nein", + Select = "Wählen", + Attach = "Anfügen", + Police = "Polizei", + Ambulance = "Krankenwagen", + Fire = "Feuerwehr", + Tow = "Abschleppdienst", + DMV = "Kfz-Zulassungsstelle", + CityHall = "RATHAUS", + DispatchActive = "Versand aktiv", + DispatchInactive = "Versand inaktiv", + Actions = "Aktionen", + AddFleetCard = "Fahrzeug hinzufügen", + EditFleetCard = "Fahrzeug bearbeiten", + FleetCardPictureURL = "Fahrzeugbild-URL", + FleetCardVehicleName = "Fahrzeugname und -modell", + FleetVehicleNamePlaceHolder = "Audi A4", + FleetCardVehicleModel = "Name des Fahrzeug-Spawn-Modells", + FleetVehicleModelPlaceHolder = "taudia4", + FleetCardVehicleInService = "Im Dienst", + FleetCardVehicleAttachedUnits = "Angebaute Einheiten", + FleetCardRoofCodeCallsign = "Dachcode oder Rufzeichen des Fahrzeugs", + FleetRoofCodeCallsignPlaceHolder = "CW-01", + NoVehiclesInThisFleet = "Es gibt keine Fahrzeuge in dieser Flotte.", + DetachFromAnyFleetVehicles = "Von allen Flottenfahrzeugen trennen", + ValidationFailed = "Überprüfung fehlgeschlagen. Bitte füllen Sie alle geforderten Felder aus.", + CreatedAt = "Erstellt oder zuletzt aktualisiert unter", + AreYouSureDeleteFleetVehicle = "Möchten Sie dieses Fahrzeug wirklich aus der Flotte löschen?", + DeleteVehicleFromFleet = "Fahrzeug aus der Flotte löschen", + SelectAction = "Wählen Sie eine Aktion", + SelectDepartment = "Wählen Sie eine Abteilung aus", + --SelectSubDepartment = "Wählen Sie eine Unterabteilung aus", + RefreshButton = "Aktualisieren", + AddCallButton = "Anruf hinzufügen", + ActivateDispatchButton = "Versand (de)aktivieren", + RegisterButton = "Registrieren", + EditButton = "Bearbeiten", + DeleteButton = "Löschen", + DetachAnyUnitsButton = "Alles lösen", + ArchiveButton = "Archivieren", + SaveChangesButton = "Änderungen speichern", + AddFineButton = "Bußgeld hinzufügen", + MarkFineAsPaidButton = "Als bezahlt markieren", + AddRecordButton = "Eintrag hinzufügen", + CloseButton = "Schließen", + ShowCitizenButton = "Bürger zeigen", + EditBOLOButton = "BOLO bearbeiten", + CancelButton = "Abbrechen", + CallEmergencyServicesButton = "Notdienste rufen", + OneOrMoreFieldsHaveNotBeenFilled = "Ein oder mehrere Felder wurden nicht ausgefüllt!", + NoUnitsSelected = "Sie haben keine Einheiten ausgewählt...", + ClosingIn = "Schließt in", + ClosingSeconds = "Sekunden...", + + -- SHIFT MENU + ToggleShift = "Schicht wechseln", + SelectSubDepartmentAndShiftInfo = "Wählen Sie Ihre Unterabteilung aus und beginnen Sie Ihre Schicht.", + SelectSubDepartment = "Unterabteilung wählen", + SubDepartment = "Unterabteilung", + EmployeeDetails = "Mitarbeiterdetails", + EmployeeName = "Name: ", + EmployeeRank = "Rang: ", + EmployeeCallsign = "Rufzeichen: ", + EmployeeActiveCall = "Aktive Anruf-ID: ", + EmployeeVehicleRoofcode = "Fahrzeugdachcode: ", + EmployeeCurrentShiftTime = "Aktuelle Schichtdauer: ", + EmployeeShiftTime = "Gesamte Schichtdauer: ", + EmployeeMinutes = "Minuten.", + EmployeeHours = "Stunden", + EmployeeDays = "Tage", + EmployeeAccessLevel = "Benutzerzugriffsebene: ", + EmployeeStatus = "Aktiver Statuscode: ", + EmployeeStatus2 = "Aktiver Status: ", + EmployeeActiveSubDepartment = "Aktive Unterabteilung: ", + StatusPanel = "Statuspanel", + SelectStatus = "Wählen Sie Ihren Status", + StatusPanelInfo = "Wählen Sie Ihren Status während der Schicht und halten Sie die Leitstelle auf dem Laufenden.", + EditCallsign = "Rufzeichen bearbeiten", + EnterNewCallsign = "Neues Rufzeichen eingeben", + NewCallsign = "Neues Rufzeichen", + CallsignErrorMessage1 = "Bitte geben Sie ein neues Rufzeichen ein, das nur Buchstaben, Zahlen und Bindestriche enthält.", + CallsignErrorMessage2 = "Bitte geben Sie ein neues Rufzeichen mit maximal 15 Zeichen ein.", + + -- EMERGENCY HOTLINE + EmergencyCall = "Notruf", + NonEmergencyCall = "Nicht-Notruf", + EmergencyCalls = "Notrufzentrale", + ActiveCalls = "Aktive Anrufe", + ArchivedCalls = "Archivierte Anrufe", + ArchivedCall = "Archivierter Anruf", + DestroyedCall = "Anruf gelöscht", + DestroyedCalls = "Archivierte Anrufe gelöscht", + DestroyedCallFailed = "Sie können den Anruf nicht löschen, da die Datenbank mindestens einen Eintrag erfordert. Fügen Sie zuerst einen neuen hinzu.", + CallID = "#", + CallerId = "ID:", -- Unused? + CallDetails = "Details", + CallInformation = "Erfahren Sie mehr über den Anruf durch Lesen der Details unten.", + CallDescription = "Beschreibung", + CallerPostal = "Postleitzahl: ", + CallerStreetName = "Straße: ", + CallerAreaName = "Bezirk: ", + ContactDetails = "Kontaktdaten: ", + CallUnits = "Einheiten verfolgen/verfolgten Anruf: ", + CallEmergencyType = "Notfalltyp: ", + CallEmergency = "Notfall", + CallNonEmergency = "Nicht-Notfall", + CallRequiredUnits = "Erforderliche Einheiten", + EmergencyServicesHotline = "Notdienst-Hotline", + EmergencyCallBy = "Anrufer:", + DeleteCall = "Archivieren", + GPS = "Über GPS orten", + SendBeep = "Signalton senden", + SelectCivilianMakingTheCall = "Wählen Sie den Zivilisten, der den Anruf tätigt...", + IsThisAnEmergency = "Handelt es sich bei diesem Anruf um einen Notfall?", + IsThisCallAnonymous = "Rufen Sie anonym an?", + DoYouRequire = "Benötigen Sie", + ToAttend = "beim Einsatzort?", + AtWhatPostal = "Bei welcher Postleitzahl ereignet sich der Vorfall?", + AtWhatStreet = "Auf welcher Straße ereignet sich der Vorfall?", + AtWhatArea = "In welchem Bezirk/Gebiet ereignet sich der Vorfall?", + TimeOfCall = "Anrufzeit", + HowToContact = "Wie können wir Sie erreichen?", + PlaceHolderSelectCivilian = "Wählen Sie einen Bürger...", + PlaceholderHowToContact = "Telefon, E-Mail oder eine Station zum melden", + EmergencyCallOverview = "Übersicht über den Notruf", + CallNotes = "Anrufnotizen", + CallAddNotesButton = "Notizen ansehen/hinzufügen", + CallAddUnitsButton = "Einheiten zuweisen", + CallViewNotesButton = "Notizen ansehen", + CallNotesTitle = "Anrufnotizen | Anruf ", + CallNoteCreatedSystemMessage = "ANRUFNOTIZ ERSTELLT.", + CallerName = "Anrufername: ", + AddNoteButton = "Notiz hinzufügen", + AddNotePlaceholder = "Eine neue Notiz hinzufügen...", + AddedCallNote = "Anrufnotiz hinzugefügt zu Anruf ", + System = "SYSTEM", + Next = "Weiter", + Previous = "Zurück", + + -- PNC + BornOn = "Geboren am ", + Markers = "Markierung", + MarkersSubTitle = "Aktive Markierungen werden unten angezeigt.", + ArmedAndDangerous = "Bewaffnet und gefährlich", + Assault = "Körperverletzung", + Burglary = "Einbruch", + DrugRelated = "Drogenbezogen", + GangAffiliation = "Bande Zugehörigkeit", + Homicide = "Tötungsdelikt", + Kidnapping = "Entführung", + MentalHealth = "Psychische Probleme", + SexOffense = "Sexualstraftat", + Terrorism = "Terrorismus", + Theft = "Diebstahl", + TrafficViolation = "Verkehrsverstoß", + WantedPerson = "Gesuchte Person", + OtherMarker = "Anderes, siehe Beschreibung...", + ActiveWarrant = "Aktiver Haftbefehl", + DescribeMarkerAndWarrant = "Beschreiben Sie Markierung/Haftbefehl", + Timestamp = "Zeitstempel", + ShowVehicles = "Fahrzeuge anzeigen", + ShowProperties = "Eigenschaften anzeigen", + ShowRecords = "Aufzeichnungen anzeigen", + ShowFines = "Bußgelder anzeigen", + EditMarkers = "Markierung bearbeiten", + AddRecord = "Aufzeichnung hinzufügen", + AddFine = "Bußgeld hinzufügen", + NoCitizensFound = "Keine Bürger gefunden von", + EnterAtLeast = "Bitte geben Sie mindestens ein", + Characters = "Zeichen", + AddRecordFor = "Eine Aufzeichnung hinzufügen für", + Charge = "Straftat", + Description = "Beschreibung", + Victims = "Opfer", + LocationDescription = "Ortsbeschreibung", + OfficerDetails = "Beamtenangaben", + Sentence = "Urteil", + Prosecuted = "Wurde der Verdächtige für dieses Vergehen strafrechtlich verfolgt?", + Prosecuted2 = "Strafverfolgt", + ReportDate = "Berichtsdatum", + AddFineFor = "Ein Bußgeld hinzufügen für", + TicketableOffense = "Bußgeldfähiges Vergehen", + FineDescription = "Bußgeldbeschreibung", + FineAmount = "Bußgeldbetrag", + DueDate = "Fälligkeitsdatum", + PaidFine = "Wurde das Bußgeld vom Täter bezahlt?", + FineDate = "Bußgelddatum", + GeneratedForCitizenId = "Erstellt für Bürger-ID", + NoRecordsFound = "Keine Aufzeichnungen gefunden für Bürger-ID", + RegisteredToCitizenId = "Registriert für Bürger-ID", + CitizenName = "Bürgername", + NoVehiclesFoundForCitizenId = "Keine Fahrzeuge gefunden für Bürger-ID", + FineIssuedOn = "Bußgeld erteilt am", + FinePaid = "Bußgeld bezahlt", + NoFinesFoundForCitizenId = "Keine Bußgelder gefunden für Bürger-ID", + EditMarkersFor = "Markierung bearbeiten für", + LastUpdatedBy = "Zuletzt aktualisiert von", + PNCOverview = "PNC", + PNCPersonSearch = "Personensuche", + PNCPersonSearchPlaceholder = "Max Mustermann / Bürger-ID", + PNCVehicleSearch = "Fahrzeugsuche", + PNCVehicleSearchPlaceholder = "HF22 BXU / Bürger-ID", + PNCPropertySearch = "Immobilien Suche", + PNCPropertySearchPlaceholder = "Bürger-ID", + NoPropertiesFoundForCitizenId = "Keine Immobilien gefunden für Bürger-ID", + PNCRecordSearch = "Aufzeichnungssuche", + PNCRecordSearchPlaceholder = "Bürger-ID", + PNCFineSearch = "Bußgeldsuche", + PNCFineSearchPlaceholder = "Bürger-ID", + PNCResults = "Ergebnisse", + PNCMarkStolen = "Als gestohlen markieren?", + PNCBolo = "BOLO aktiv?", + DescribeBolo = "Beschreiben Sie den Grund für die Initiierung eines BOLO", + PNCBoloDescription = "BOLO Beschreibung:", + EditBoloFor = "BOLO bearbeiten für ", + Search = "Suchen", + Send = "Senden", + Dispatch = "Leitstelle", + DispatchMessagePlaceholder = "Senden Sie eine Nachricht an alle aktiven Einheiten.", + DispatchMessageTitle = "Leitstellenansage", + ActiveUnits = "Aktive Einheiten", + Backup = "Unterstützung", + FleetManagement = "Flottenmanagement", + ActiveWarrants = "Aktive Haftbefehle", + WantedFor = "Gesucht für:", + LastUpdated = "Zuletzt aktualisiert:", + ReportSighting = "Sichtung melden", + DateAndTime = "Datum und Uhrzeit", + ANPRSection = "ANPR", + ANPRSectionFullName = "Automatische Nummernschilderkennung", + PlaceholderCharge = "Diebstahl", + PlaceholderVictims = "Max Mustermann, Erika Mustermann", + PlaceholderLocationDescription = "Straßenname, Postleitzahl, Adresse", + PlaceholderOfficerDetails = "C. Lowly - Dienstmarke #3622", + PlaceholderSentence = "Beschreiben Sie das Urteil", + PlaceholderTicketableOffense = "Geschwindigkeitsüberschreitung", + NoWantedPersonsFound = "Keine gesuchten Personen gefunden...", + NoWantedVehiclesFound = "Keine gesuchten Fahrzeuge gefunden...", + ANPRFront = "ANPR VORDERSEITE", + ANPRRear = "ANPR RÜCKSEITE", + ANPRModel = "Modell:", + ANPRColour = "Farbe:", + ANPRSpeed = "Geschwindigkeit:", + ANPRFlags = "Flags:", + ANPRLocation = "Standort:", + + -- UNIT OVERVIEW + NameId = "Name (ID)", + Callsign = "Rufzeichen", + ModeOfTransport = "Transportmittel", + VehicleRoofcode = "Fahrzeugdachcode", + Department = "Abteilung", + Rank = "Rang", + Location = "Standort", + Postal = "Postleitzahl", + Status = "Status", + Tracking = "Verfolgung", + DispatchMessageError = "Bitte geben Sie mindestens 10 Zeichen ein.", + RequestBackupFromPolice = "Unterstützung von der Polizei anfordern.", + RequestBackupFromAmbulance = "Unterstützung vom Rettungsdienst anfordern.", + RequestBackupFromFire = "Unterstützung von der Feuerwehr anfordern.", + RequestBackupFromTow = "Abschleppdienst anfordern.", + RequestBackupButton = "Unterstützung anfordern", + RequestedBackupType = "Angeforderte Unterstützung", + NoActiveCalls = "Es gibt derzeit keine aktiven Anrufe...", + NoActiveUnits = "Es gibt derzeit keine aktiven Einheiten...", + AssignToACall = "Einem Anruf zuweisen", + AssignToCallButton = "Anruf zuweisen", + AssignUnitsToCallButton = "Einheit(en) zuweisen", + AssignUnitToCallOverview = "AKTIVE EINHEITENÜBERSICHT | Einheiten einem Anruf zuweisen", + AssignUnitToCall = "AKTIVER ANRUFÜBERSICHT | Zuweisen ", + AssignToCallHelp = "Wenn sie dem Anruf zugewiesen werden, erhalten Sie eine Routenführung auf Ihrer Karte. Sie werden auch auf den Status 'reagierend' gesetzt.", + AssignNewStatus = "Neuen Status zuweisen", + AssignNewCallsign = "Neues Rufzeichen zuweisen", + AssignNewFleetVehicle = "Neues Flottenfahrzeug zuweisen", + AssignUnitNewStatus = "STATUS FÜR EINHEIT ZUWEISEN ", + UnitsTrackingCall = "Einheiten verfolgen Anruf", + None = "Keine", + ActiveCallID = "Aktiver Anruf", + SirensOn = "Sirenen EIN", + SirensOff = "Sirenen AUS", + + -- OPERATIONS + Report = "Bericht", + ReportType = "Berichtstyp", + Operations = "Einsätze", + AddReports = "Einsatzberichte hinzufügen", + SearchReports = "Einsatzberichte suchen", + SearchReportsPlaceholder = "Geben Sie eine Anfrage ein (z.B. Name oder Teil der Beschreibung)", + SearchReportsByDatePlaceholder = "Nach Datum suchen", + SelectReportType = "Wählen Sie einen Berichtstyp...", + SelectReportTypePolice = "Polizeiberichte", + SelectReportTypeFire = "Feuerwehrberichte", + SelectReportTypeMedical = "Medizinische Berichte", + MedicalReportType = "Medizinischer Berichtstyp", + FireReportType = "Feuerwehrberichtstyp", + PoliceReportType = "Polizeiberichtstyp", + SubmitReport = "Bericht einreichen", + ViewReport = "Vollständigen Bericht anzeigen", + NoOperationReportsFound = "Keine Einsatzberichte gefunden am", + SignedBy = "Unterzeichnet von", + SignedByPlaceholder = "Geben Sie Ihren Namen ein", + DescriptionPlaceholder = "Geben Sie eine Beschreibung ein", + LocationPlaceholder = "Geben Sie einen Ort ein (z.B. Straßenname, Gebiet, Postleitzahl)", + EmployeeInvolved = "Beteiligte Mitarbeiter", + EmployeeInvolvedPlaceholder = "Geben Sie Namen / Dienstnummern / Bürger-ID's ein (z.B. Abteilung, Rang, Name und weitere Details)", + CivilianInvolved = "Beteiligte Zivilisten", + CivilianInvolvedPlaceholder = "Geben Sie Namen / Bürger-ID's ein", + VehicleInvolved = "Beteiligte Fahrzeuge", + VehicleInvolvedPlaceholder = "Geben Sie Fahrzeuge / Fahrzeug-ID's / Bürger-ID's ein (z.B. Fahrzeughalter)", + PenalCode = "Polizeihandbuch", + Guidelines = "Richtlinien", + Training = "Training", + UpdateTrainings = "Schulungen aktualisieren", + + -- STATISTICS + Statistics = "Statistiken", + ViewStatistics = "Alle Zeitstatistiken ansehen", + --== COLORS + AxesColor = "rgba(255, 255, 255, 0.6)", + barColor = "rgba(122, 189, 225, 0.2)", + barBorderColor = "rgba(122, 189, 225, 1)", + + -- DMV + LicensePlate = "Kennzeichen", + Make = "Marke", + Model = "Modell", + Color = "Farbe", + BuildYear = "Baujahr", + TaxPaid = "Steuer bezahlt?", + MOTPassed = "Ministry of Transport (MOT) Jahresprüfung bestanden?", + Insurance = "Versichert?", + ReportAsStolen = "Als gestohlen melden?", + ReportedStolen = "Als gestohlen gemeldet?", + RegisteredOn = "Registriert am", + OwnedBy = "Eigentümer", + VehicleRegisterId = "Fahrzeugregistrierungsnummer", + MoT = "MOT?", + EditVehicleRegistration = "Fahrzeugregistrierung bearbeiten", + OwnedByCitizenId = "Eigentümer Bürger-ID", + VehiclePictureURL = "Fahrzeugbild-URL", + RegistrationDate = "Registrierungsdatum", + SelectCitizen = "Wählen Sie einen Bürger...", + RegisterAVehicle = "Ein Fahrzeug registrieren", + RegisterVehicleSubtitle = "Registrieren Sie Ihr gewünschtes Fahrzeug!", + ViewRegisteredVehicles = "Ihre registrierten Fahrzeuge ansehen", + EditVehiclesSubtitle = "Bearbeiten Sie sie nach Ihren Wünschen!", + AreYouSureDeleteVehicle = "Sind Sie sicher, dass Sie Ihr registriertes Fahrzeug löschen möchten?", + DeletingVehicleCannotBeUndone = "Das Löschen dieses registrierten Fahrzeugs kann nicht rückgängig gemacht werden.", + YesDeleteVehicle = "Ja, mein registriertes Fahrzeug löschen.", + PlaceholderLicensePlate = "HA23-RHY (Keine Leerzeichen)", + PlaceholderMake = "Audi", + PlaceholderModel = "A6 Avant", + PlaceholderColor = "Rot", + PlaceholderYear = "2023", + + -- CITY HALL + FirstName = "Vorname", + LastName = "Nachname", + DateOfBirth = "Geburtsdatum", + Gender = "Geschlecht", + Email = "E-Mail", + PhoneNumber = "Telefonnummer", + Address = "Adresse", + AddressType = "Adresstyp", + City = "Stadt", + State = "Bundesland", + PostalCode = "Postleitzahl", + Country = "Land", + Occupation = "Beruf", + Nationality = "Nationalität", + PictureURL = "Bild-URL", + RegisterCarLicense = "PKW-Führerschein registrieren?", + RegisterBikeLicense = "Motorradführerschein registrieren?", + RegisterTruckLicense = "LKW-Führerschein registrieren?", + RegisterBoatLicense = "Bootsschein registrieren?", + RegisterPilotLicense = "Pilotenschein registrieren?", + Licenses = "Führerscheine", + CitizenId = "Bürger-ID", + CarLicense = "PKW-Führerschein", + BikeLicense = "Motorradführerschein", + TruckLicense = "LKW-Führerschein", + BoatLicense = "Bootsschein", + PilotLicense = "Pilotenschein", + EditCitizen = "Zivilist bearbeiten", + ProfilePictureURL = "Zivilistenbild-URL", + RegisterACivilian = "Einen Zivilisten registrieren", + RegisterCivilianSubtitle = "Registrieren Sie, wer immer Sie sein möchten!", + ViewRegisteredCivilians = "Ihre registrierten Zivilisten ansehen", + EditCiviliansSubtitle = "Bearbeiten Sie sie nach Ihren Wünschen!", + AreYouSureDeleteCivilian = "Sind Sie sicher, dass Sie Ihren Zivilisten löschen möchten?", + DeletingCivilianCannotBeUndone = "Das Löschen dieses Charakters kann nicht rückgängig gemacht werden.", + YesDeleteCivilian = "Ja, meinen Zivilisten löschen.", + PlaceholderFirstName = "Max", + PlaceholderLastName = "Mustermann", + PlaceholderGender = "Beliebiges Geschlecht", + PlaceholderEmail = "max.mustermann@nsmail.com", + PlaceholderPhonenumber = "31613371337", + PlaceholderAddress = "Großer Stern 1", + PlaceholderAddressType = "Haus, Wohnung, Studio und/oder Etage", + PlaceholderCity = "Berlin", + PlaceholderState = "Berlin", + PlaceholderPostal = "10557", + PlaceholderCountry = "Deutschland", + PlaceholderOccupation = "Fotograf", + PlaceholderNationality = "Deutsch", + + -- REAL ESTATE + RealEstate = "Immobilien", + ViewRegisteredProperties = "Ihre registrierten Immobilien ansehen", + EditPropertiesSubtitle = "Bearbeiten Sie sie, wie Sie möchten!", + RegisterAProperty = "Eine Immobilie registrieren", + RegisterPropertySubtitle = "Registrieren Sie Ihre gewünschten Immobilien", + SelectPropertyType = "Immobilientyp...", + HouseNumber = "Hausnummer", + PlaceholderHouseNumber = "12", + PropertyPictureURL = "Immobilienbild-URL", + Area = "Bezirk", + PlaceholderArea = "Vinewood Hills", + PlaceholderPostalCode = "5001", + PlaceholderPrice = "25000", + Amenities = "Annehmlichkeiten", + PlaceholderAmenities = "Beschreiben Sie die Annehmlichkeiten...", + PropertyOwnedBy = "Eigentümer", + PropertySeized = "Beschlagnahmte Immobilie?", + EditPropertySeizedButton = "(Un)beschlagnahmen", + PropertyType = "Immobilientyp", + PropertyRegisterId = "Immobilienregistrierungsnummer", + PropertyAddress = "Adresse", + PropertyHouseNumber = "Hausnummer", + PropertyArea = "Bezirk", + PropertyPostalCode = "Postleitzahl", + PropertyDescription = "Beschreibung", + PropertyPrice = "Preis", + PropertyBuildYear = "Baujahr", + PropertyAmenities = "Annehmlichkeiten", + AreYouSureDeleteProperty = "Sind Sie sicher, dass Sie diese Immobilie löschen möchten?", + DeletingPropertyCannotBeUndone = "Das Löschen dieser Immobilie kann nicht rückgängig gemacht werden.", + YesDeleteProperty = "Immobilie löschen", + EditPropertyRegistration = "Immobilienregistrierung bearbeiten", + + -- Management + Management = "Management-Panel", + ManageCivilians = "Zivilisten", + ManageVehicles = "Fahrzeuge", + ManageProperties = "Eigenschaften", + ManageCalls = "Anrufe", + CivilianIDPlaceholder = "Bürger-ID", + VehicleIDPlaceholder = "Fahrzeugregistrierungs-ID", + PropertyIDPlaceholder = "Eigenschaftsregistrierungs-ID", + CallIDPlaceholder = "Anruf-ID", + + Delete10Calls = "10 ältere Anrufe löschen", + Delete50Calls = "50 ältere Anrufe löschen", + Delete100Calls = "100 ältere Anrufe löschen", + + -- VALUTA + Valuta = "€", + }, + + -- HELP MENU TRANSLATIONS + HelpMenuText = { + Header = "MDT-Informationen", + Info1 = "Jedes Menü hat seine eigene Zugriffsebene, die vom Serverbesitzer festgelegt wird. Sie haben Zugriff auf die Abschnitte, die Sie benötigen, basierend auf Ihrem Rang.", + Info2 = "MDT steht für 'Mobiles Datenendgerät' und wurde entwickelt, um Daten zu suchen und zu registrieren. Es bietet Einblicke in aktive Einheiten, Personen, Fahrzeuge, Kennzeichen, Haftbefehle, Polizeiaufzeichnungen, medizinische Aufzeichnungen, Einsatzberichte, Bußgelder, Notrufe und Statistiken.", + Info3 = "Das MDT ist so konzipiert, dass es Selbstbedienung ermöglicht. Das bedeutet, dass Zivilisten ihren eigenen Charakter und ihre Fahrzeuge erstellen und jederzeit bearbeiten können. Polizeiaufzeichnungen und Bußgelder hingegen werden von der Polizei kontrolliert. Gleiches gilt für andere abteilungsbezogene Aufzeichnungen.", + Info4 = "Tastenkombinationen sind verfügbar über ESC -> Einstellungen -> Tastenbelegungen -> FiveM. Sollten Sie weitere Erklärungen zur Nutzung des MDT benötigen, besuchen Sie bitte die Dokumentation: https://docs.nights-software.com/resources/nightShifts/", + }, + }, + + + + --============================== POLISH ==============================-- + ['pl'] = { + Info = "^2INFORMACJE^7", + Error = "^1ERROR^7", + Syntax = "Składnia", + Yes = "Tak", + No = "Nie", + Nearby = "w pobliżu", + Unknown = "Nieznany", + Downloading = "Ściąganie...", + Enabled = "włączone", + Disabled = "wyłączony", + AutomaticAlarm = "Automatyczny alarm", + SomethingWentWrong = "Coś poszło nie tak podczas próby aktualizacji Twoich danych. Ten błąd może być krytyczny. Skontaktuj się z właścicielem serwera i poproś o sprawdzenie logów serwera.", + ToggleNotifications = "^3Powiadomienia ^7są teraz ", + North = "N", + NorthEast = "NE", + East = "E", + SouthEast = "SE", + South = "S", + SouthWest = "SW", + West = "W", + NorthWest = "NW", + Browse = "Przeglądać", + Cancel = "Anulować", + Anonymous = "Anonimowy", + ShowID = "Pokaż identyfikator", + ShowingIDCardOF = "Okazanie dowodu osobistego", + CancelledShowingIDCard = "Anulowano okazanie dowodu osobistego...", + Location = "Lokalizacja:", + MDTReady = "Twój MDT jest gotowy do użycia!", + DisconnectedFromMDT = "Twoje MDT znajduje się teraz w trybie gotowości.", + CancelledCall = "Rozłączyłeś się i anulowałeś połączenie z infolinią alarmową.", + ForceClosedMDT = "Wymusiłeś zamknięcie ekranu MDT i połączeń.", + MDTIsUpdating = "Twój MDT jest aktualizowany. Spróbuj ponownie później...", + MDTIsCharging = "Twój MDT już się ładuje.", + MDTIsStillOpen = "Nie możesz tego zrobić, gdy MDT jest włączone.", + MDTIsStillLoading = "Nie można znaleźć jednego z następujących elementów: Twojego identyfikatora FiveM lub ról Discord. Upewnij się, że jesteś zalogowany do aplikacji FiveM i połączyłeś swoje konto CFX i Discord. Jeśli problem będzie się powtarzał, skontaktuj się z właścicielem serwera.", + EmergencyCallCooldown = "Musisz poczekać 1 minutę, aby zgłosić kolejne zagrożenie..."; + EmergencyCallScreenStillOpen = "Nie można tego zrobić, gdy system połączeń alarmowych jest włączony.", + MDTRecentlyRefreshed = "Twoje MDT zostało niedawno odświeżone, spróbuj ponownie wkrótce...", + NoAccessToMDT = "Wygląda na to, że brakuje Ci wymaganych ról niezgody, aby uzyskać dostęp do MDT.", + AccessGrantedMDT = "Otrzymałeś dostęp do", + AccessDeniedMDT = "Odmowa dostępu do", + NoAccess = "Nie masz wymaganego poziomu dostępu: ", + DispatchWasAlreadyActive = "Nie można przypisać Cię jako dyspozytora, ponieważ wysyłka jest już aktywna.", + UnitAssigned = "Przypisałeś jednostkę do zgłoszenia.", + UnitsAssigned = "Przypisałeś wybrane jednostki do zgłoszenia.", + AssignedNewStatus = "Przypisałeś nowy status jednostce.", + AssignedNewFleetVehicle = "Przypisałeś pojazd flotowy.", + DetachedThemFromVehicleInFleet = "Odłączyłeś urządzenie od dowolnego pojazdu floty.", + YouHaveBeenAssignedAFleetVehicle = "Przydzielono Ci pojazd flotowy:", + YouHaveBeenDetachedFromAnyFleetVehicle = "Zostałeś odłączony od dowolnego pojazdu floty.", + Selected = "Wybrany: ", + YourAccessLevel = "Twój poziom dostępu: ", + RequiredAccessLevel = "Wymagany poziom dostępu: ", + SuccesfullyDeletedCall = "Pomyślnie usunięto połączenie.", + TrackingCall = "Teraz śledzisz połączenie.", + AssignedToCall = "Dyspozytor przypisał Ci połączenie, zaznaczone na mapie przez nawigację GPS, więcej informacji podam najszybciej jak to możliwe...", + AssignedCallInfo = "Zostałeś wysłany, żeby zadzwonić ", + AssignedCallEmergency = "Nagły wypadek: ", + CallerName = "Nazwa dzwoniącego: ", + CallerContactDetails = "Szczegóły kontaktu: ", + CallStreet = "Ulica: ", + CallArea = "Dzielnica: ", + CallPostal = "Pocztowy: ", + CallDescription = "Opis połączenia: ", + CallContactDetails = "Szczegóły kontaktu: ", + OffShift = "Zakończyłeś swoją zmianę.", + OnShift = "Rozpocząłeś swoją zmianę.", + Status = "Stan: ", + StatusChanged = "Stan zmieniony!", + EmergencyCallMade = "Twoje połączenie alarmowe zostało przekazane władzom.", + EmergencyCallFailed = "Twoje połączenie alarmowe nie było wystarczająco szczegółowe. Spróbuj ponownie.", + EmergencyHotlineBusy = "Infolinia pogotowia ratunkowego jest w tej chwili zajęta. Spróbuj ponownie później...", + CannotSwitchDepartmentWhilstOffShift = "Nie możesz zmienić działu, nie będąc na służbie. Proszę najpierw się zalogować.", + DispatchMessage = "Wiadomość wysłania: ", + DispatchMessageCooldown = "Niedawno wysłałeś wiadomość wysyłkową. Proszę poczekać 10 sekund.", + RegisteredVehicle = "Zarejestruj swój pojazd!", + DeletedVehicle = "Pomyślnie usunięto zarejestrowany pojazd!", + DeletedVehicleFailed = "Pojazdu nie można usunąć, gdyż baza danych wymaga co najmniej jednego wpisu, należy najpierw dodać nowy.", + UpdatedVehicle = "Pomyślnie zaktualizowano Twój pojazd!", + UpdatedBolo = "Pomyślnie zaktualizowano BOLO!", + RegisteredCivilian = "Pomyślnie zarejestrowałeś swojego cywila!", + DeletedCivilian = "Pomyślnie usunięto cywila!", + DeletedCivilianFailed = "Nie możesz usunąć Cywila, ponieważ baza danych wymaga co najmniej jednego wpisu, najpierw dodaj nowy.", + UpdatedCivilian = "Pomyślnie zaktualizowałeś swojego cywila!", + UpdatedMarkers = "Pomyślnie zaktualizowano ich znaczniki!", + AddedPoliceReport = "Pomyślnie dodano raport policyjny!", + AddedPoliceFine = "Pomyślnie dodano karę!", + DuplicateEntryCivilian = "Nie można zarejestrować już istniejącego cywila z nazwiskiem: ", + DuplicateEntryVehicle = "Nie można zarejestrować już istniejącego pojazdu na tablicę rejestracyjną: ", + LoadingCallSystem = "System połączeń wciąż się ładuje... Spróbuj ponownie wkrótce!", + YourEmergencyCall = "Twoje (alarmowe) połączenie", + HasBeenForwarded = "został przekazany na infolinię służb ratunkowych.", + CouldNotFindStatusCode = "Nie można znaleźć tego kodu stanu.", + ServerWasSynchronizingTryAgain = "Serwer nadal się synchronizował... Spróbuj ponownie wkrótce!", + NewIncidentReceived = "🚨 POŁĄCZENIE ALARMOWE 999 🚨 Naciśnij klawisz F10, aby otworzyć MDT.", + TrackerDisabled = "Moduł śledzący został wyłączony. Jeśli chcesz przesunąć więcej lokalizacji, śledź je ponownie.", + UpdatedTracker = "Zaktualizowany tracker z nowymi współrzędnymi nawigacji GPS dla ", + ResetTracker = "Zresetuj moduł śledzący dla ", + NewTrackerCoords = "Ustawianie nowych współrzędnych nawigacji GPS na ", + MDTInitiateCharging = "Ładowanie akumulatora MDT.", + MDTBatteryCharging = "Bateria urządzenia MDT jest ładowana. Może to potrwać kilka minut. Aktualnie jesteś włączony: ", + MDTBatteryCharged = "Bateria Twojego MDT została naładowana: ", + MDTBatteryLevelLow = "Niski poziom baterii! Naładuj swój MDT w pojeździe lub we wnętrzu. Składnia: /chargemdt", + MDTBatteryEmpty = "Bateria pusta! Naładuj swój MDT w pojeździe lub we wnętrzu. Składnia: /chargemdt", + MDTBatteryIsFullAlready = "Twoja bateria MDT jest już pełna.", + AddedOperationsReport = "Pomyślnie dodałeś raport operacyjny.", + CannotTrackYourself = "Nie możesz siebie śledzić.", + NoChargePointNearby = "Twoje urządzenie MDT nie może ładować: w pobliżu nie ma portu ładowania. Wprowadź pojazd lub wnętrze do swojego MDT. Składnia: /chargemdt", + MDTBatterySystemDisabled = "Właściciel serwera wyłączył system baterii MDT.", + MissingMDTItemInInventory = "Nie masz MDT w swoim ekwipunku.", + MissingMDTChargerItemInInventory = "Nie masz ładowarki MDT w swoim ekwipunku.", + MissingPhoneItemInInventory = "Nie masz telefonu, aby zadzwonić po służby ratunkowe w swoim ekwipunku.", + PanicButtonPressed = "Wciśnięty przycisk paniki! Sygnał pomocy został zaznaczony na mapie innych jednostek.", + DistressSignalActivated = "ALARM! Naciśnięto przycisk paniki. Proszę udać się do (najnowszej) lokalizacji sygnału alarmowego zaznaczonej na mapie.", + DistressSignalStillActive = "Twój sygnał pomocy został niedawno wysłany do innych jednostek, poczekaj na czas odnowienia.", + BackupRequestCooldown = "Niedawno poprosiłeś o kopię zapasową, spróbuj ponownie później...", + BackupRequest = "Żądanie kopii zapasowej - ", + BackupDepartment = "Departament zażądał: ", + BackupStreet = "Lokalizacja: ", + BackupPostal = "Pocztowy: ", + BackupRequesterDepartment = "Dział wnioskodawców: ", + BackupMarkedOnYourMap = "Żądanie wykonania kopii zapasowej zostało wskazane na Twojej mapie.", + BackupDefaultType = "Nic.", + WantedPersonSighted = "Obserwację osoby poszukiwanej zgłosił ", + SightedAt = "Na", + SightedMarkerDescription = "Opis znacznika: ", + ANPRHit = "OSTRZEŻENIE ANPR - ", + ANPRBOLO = "BOLO: ", + ANPRStolen = "Skradziony: ", + ANPRInsurance = "Ubezpieczenie: ", + ANPRMot = "MOT: ", + ANPRTax = "Podatek: ", + ANPRStreet = "Nazwa ulicy: ", + ANPRPostal = "Pocztowy: ", + ANPRMarkedBOLO = "BOLO aktywny", + ANPRNoBOLO = "BOLO nieaktywny", + ANPRMarkedStolen = "Oznaczone jako kradzione", + ANPRNotStolen = "Nie skradziony", + ANPRValid = "Ważny MOT", + ANPRInvalid = "Nieważny MOT", + ANPRPaid = "Podatek zapłacony", + ANPRNotPaid = "Podatek nie zapłacony", + ANPRInsured = "Ubezpieczony", + ANPRNotInsured = "Nie ubezpieczony", + ANPRNo = "Nie.", + ANPRYes = "Tak.", + SeenByANPR = "PSTRYKNĄĆ! Obraz z kamery ANPR oznaczył i zlokalizował Twój pojazd.", + ANPRVehicleSighted = "Obserwacja pojazdu zarejestrowanego w ANPR zgłoszona przez", + ANPRVehicleOwnedBy = "Właściciel: ", + ANPRVehicleFlags = "Flagi:", + LoadingANPR = "System ANPR wciąż się ładuje... Spróbuj ponownie wkrótce!", + ANPRInVehicleEnabled = "Włączyłeś pokładowy system ANPR.", + ANPRInVehicleDisabled = "Wyłączyłeś system ANPR w pojeździe.", + ANPRUnlocked = "ANPR odblokowany!", + NotInVehicle = "Aby to zrobić, musisz być w pojeździe...", + YouAreNotOnShift = "Aby to zrobić, musisz być na zmianie...", + ChangedYourCallsign = "Pomyślnie zmieniłeś swój znak wywoławczy na: ", + ChangedTheirCallsign = "Pomyślnie zmieniłeś ich sygnał wywoławczy na: ", + DispatchSetYourCallsign = "Dyspozytor przydzielił ci nowy sygnał wywoławczy: ", + BeepedUnit = "Wysłałeś sygnał dźwiękowy do urządzenia: ", + CannotDeleteThisCivilianStillHasVehicles = "Tego cywila nie można usunąć, bo nadal mają na niego zarejestrowane pojazdy...", + BackupPolice = "Służby Policyjne", + BackupAmbulance = "Usługi medyczne", + BackupFire = "Straż Pożarna", + BackupTow = "Usługi holownicze", + NoPlayerNearby = "W pobliżu nie ma graczy...", + YouHaveNoCivilianCharacters = "Nie macie zarejestrowanych cywilów...", + APlayerNearbyShowsID = "Gracz w pobliżu pokazuje Ci swoją kartę identyfikacyjną.", + APlayerNearbyShowsID2 = "żeby na to spojrzeć.", + UpdatedFine = "Pomyślnie zaktualizowano karę.", + CouldNotUpdatedFine = "Nie można zaktualizować tego, serwer nadal synchronizował dla niego ostatnie aktualizacje...", + DetachedFromCall = "Rozłączyłeś się z ostatnią rozmową.", + UnitDetached = "JEDNOSTKA ODŁĄCZONA -", + DuplicatePropertyAddress = "Nieruchomość została już zarejestrowana pod tym adresem: ", + RegisteredProperty = "Zarejestruj swoją nieruchomość!", + UpdatedProperty = "Zaktualizowano Twoją nieruchomość!", + DeletedProperty = "Usunięto Twoją nieruchomość!", + DeletedPropertyFailed = "Nie możesz usunąć Właściwości, ponieważ baza danych wymaga co najmniej jednego wpisu, najpierw dodaj nowy.", + UpdatedPropertySeized = "(Nie)zajęte majątek!", + NotAttachedToAnyCall = "Nie jesteś podłączony do żadnego aktywnego połączenia.", + VehicleAddedToFleet = "Pomyślnie dodałeś pojazd do floty.", + VehicleDeletedFromFleet = "Pojazd usunięty z floty.", + VehicleDeletedFromFleetFailed = "Pojazdu nie można usunąć z floty, gdyż baza wymaga przynajmniej jednego wpisu, należy najpierw dodać nowy.", + VehicleUpdatedInFleet = "Zaktualizowano pojazd we flocie.", + StatisticsCalls = "Zarejestrowane połączenia", + StatisticsCallNotes = "Zarejestrowane notatki z połączeń", + StatisticsFines = "Zarejestrowane kary", + StatisticsVehicles = "Zarejestrowane pojazdy", + StatisticsFleetVehicles = "Zarejestrowane pojazdy floty", + StatisticsCivilians = "Zarejestrowani cywile", + StatisticsProperties = "Zarejestrowane nieruchomości", + StatisticsOperationReports = "Zarejestrowane raporty operacyjne", + StatisticsANPRVehicles = "Pojazdy w ANPR", + StatisticsWantedPeople = "Poszukiwane osoby", + UpdatedTrainings = "Zaktualizowali swoje szkolenia i certyfikaty.", + ShotsFiredAt = "Padły strzały do", + FightAt = "Walcz o", + RoadCrimeAt = "Niewłaściwe zachowanie w ruchu drogowym", + SentDispatchMessage = "Przesłałeś wiadomość wysyłkową do wszystkich jednostek.", + + -- COMMAND CHAT SUGGESTIONS + ToggleNotificationsHelpText = "Polecenie używane do przełączania powiadomień dla MDT. (Nie zaleca się wyłączania)", + MobileDataTerminalHelpText = "Polecenie otwarcia mobilnego terminala danych.", + CallEmergenciesHelpText = "Polecenie wezwania numeru alarmowego.", + ChargeMDTHelpText = "Polecenie ładowania akumulatora MDT.", + ForceCloseMDTHelpText = "Wymuś zamknięcie MDT za pomocą tego polecenia.", + StatusChangeHelpText = "Polecenie umożliwiające szybką zmianę statusu.", + ShowIDAndLicensesHelpText = "Polecenie umożliwiające pokazanie swojego identyfikatora i licencji najbliższemu graczowi.", + StatusChangeArgument1 = "Kod statusu", + StatusChangeArgument1Example = "2", + ToggleANPRHelpText = "Polecenie używane do przełączania użycia ANPR w pojeździe.", + DisplayActiveCallHelpText = "Polecenie umożliwiające wyświetlenie na ekranie szczegółów bieżącego aktywnego połączenia.", + + Icons = { -- https://fontawesome.com/search?q=check&o=r&m=free + SuccessIcon = "fa-solid fa-check", + WarningIcon = "fa-solid fa-triangle-exclamation", + ErrorIcon = "fa-solid fa-xmark", + DispatchIcon = "fa-solid fa-walkie-talkie", + EmergencyIcon = "fa-solid fa-phone-volume", + }, + + -- TRANSLATIONS INSIDE THE MDT + MDTText = { + -- GENERAL + Loading = "Ładowanie...", + Yes = "Tak", + No = "Nie", + Select = "Wybierać", + Attach = "Przytwierdzać", + Police = "Policja", + Ambulance = "Ambulans", + Fire = "Straż pożarna", + Tow = "Holowniczy", + DMV = "DVLA", + CityHall = "RADA", + DispatchActive = "Wysyłka aktywna", + DispatchInactive = "Wysyłka nieaktywna", + Actions = "działania", + AddFleetCard = "Dodaj pojazd", + EditFleetCard = "Edytuj pojazd", + FleetCardPictureURL = "Adres URL zdjęcia pojazdu", + FleetCardVehicleName = "Nazwa i model pojazdu", + FleetVehicleNamePlaceHolder = "Audi A4", + FleetCardVehicleModel = "Nazwa modelu pojawiającego się pojazdu", + FleetVehicleModelPlaceHolder = "taudia4", + FleetCardVehicleInService = "Czynny", + FleetCardVehicleAttachedUnits = "Dołączone jednostki", + FleetCardRoofCodeCallsign = "Kod dachu pojazdu lub znak wywoławczy", + FleetRoofCodeCallsignPlaceHolder = "CW-01", + NoVehiclesInThisFleet = "W tej flocie nie ma pojazdów.", + DetachFromAnyFleetVehicles = "Odłącz się od wszelkich pojazdów floty", + ValidationFailed = "Walidacja nie powiodła się. Proszę wypełnić wszystkie wymagane pola.", + CreatedAt = "Utworzono lub ostatnio zaktualizowano o godz", + AreYouSureDeleteFleetVehicle = "Czy na pewno chcesz usunąć ten pojazd z floty?", + DeleteVehicleFromFleet = "Usuń pojazd z floty", + SelectAction = "Wybierz akcję", + SelectDepartment = "Wybierz dział", + --SelectSubDepartment = "Wybierz poddział", + RefreshButton = "Odświeżać", + AddCallButton = "Dodaj zgłoszenie", + ActivateDispatchButton = "(De)aktywuj wysyłkę", + RegisterButton = "Rejestr", + EditButton = "Edytować", + DeleteButton = "Usuwać", + DetachAnyUnitsButton = "Odłącz wszystko", + ArchiveButton = "Archiwum", + SaveChangesButton = "Zapisz zmiany", + AddFineButton = "Dodaj Dobrze", + MarkFineAsPaidButton = "Oznacz jako opłacone", + AddRecordButton = "Dodaj rekord", + CloseButton = "Zamknąć", + ShowCitizenButton = "Pokaż Obywatela", + EditBOLOButton = "Edytuj BOLO", + CancelButton = "Anulować", + CallEmergencyServicesButton = "Wezwij służby ratunkowe", + OneOrMoreFieldsHaveNotBeenFilled = "Jedno lub więcej pól nie zostało wypełnionych!", + NoUnitsSelected = "Nie wybrałeś żadnych jednostek...", + ClosingIn = "Zamykanie", + ClosingSeconds = "sekundy...", + + -- SHIFT MENU + ToggleShift = "Przełącz przesunięcie", + SelectSubDepartmentAndShiftInfo = "Wybierz swój poddział i rozpocznij zmianę.", + SelectSubDepartment = "Wybierz poddział", + SubDepartment = "Pododział", + EmployeeDetails = "Dane pracownika", + EmployeeName = "Nazwa: ", + EmployeeRank = "Ranga: ", + EmployeeCallsign = "Znak wywoławczy: ", + EmployeeVehicleRoofcode = "Kod dachu pojazdu: ", + EmployeeActiveCall = "Aktywny identyfikator połączenia: ", + EmployeeCurrentShiftTime = "Aktualny czas trwania zmiany: ", + EmployeeShiftTime = "Całkowity czas trwania zmiany: ", + EmployeeMinutes = "minuty.", + EmployeeHours = "godziny", + EmployeeDays = "dni", + EmployeeAccessLevel = "Poziom dostępu użytkownika: ", + EmployeeStatus = "Aktywny kod stanu: ", + EmployeeStatus2 = "Stan aktywny: ", + EmployeeActiveSubDepartment = "Aktywny poddział: ", + StatusPanel = "Panel stanu", + SelectStatus = "Wybierz swój status", + StatusPanelInfo = "Wybierz swój status podczas zmiany i informuj na bieżąco o wysyłce.", + EditCallsign = "Edytuj znak wywoławczy", + EnterNewCallsign = "Wprowadź nowy znak wywoławczy", + NewCallsign = "Nowy znak wywoławczy", + CallsignErrorMessage1 = "Proszę wprowadzić nowy znak wywoławczy składający się wyłącznie z liter, cyfr i łączników.", + CallsignErrorMessage2 = "Proszę wprowadzić nowy znak wywoławczy składający się maksymalnie z 15 znaków.", + + -- EMERGENCY HOTLINE + EmergencyCall = "Połączenie alarmowe", + NonEmergencyCall = "Połączenie inne niż alarmowe", + EmergencyCalls = "Infolinia alarmowa", + ActiveCalls = "Aktywne połączenia", + ArchivedCalls = "Zarchiwizowane połączenia", + ArchivedCall = "Zarchiwizowane połączenie", + DestroyedCall = "Usunięte połączenie", + DestroyedCalls = "Usunięte połączenia", + DestroyedCallFailed = "Nie możesz usunąć połączenia, ponieważ baza danych wymaga przynajmniej jednego wpisu, najpierw dodaj nowy.", + CallID = "#", + CallerId = "ID:", -- Nie używany? + CallDetails = "Detale", + CallInformation = "Uzyskaj wgląd w przebieg rozmowy, czytając szczegóły poniżej.", + CallDescription = "Opis", + CallerPostal = "Pocztowy: ", + CallerStreetName = "Ulica: ", + CallerAreaName = "Dzielnica: ", + ContactDetails = "Contact details: ", + CallUnits = "Jednostki śledzące/śledzone połączenie: ", + CallEmergencyType = "Typ awaryjny: ", + CallEmergency = "Nagły wypadek", + CallNonEmergency = "Nie awaryjne", + CallRequiredUnits = "Wymagane jednostki", + EmergencyServicesHotline = "Infolinia służb ratunkowych", + EmergencyCallBy = "Gość:", + DeleteCall = "Archiwum", + GPS = "Zlokalizuj za pomocą GPS", + SendBeep = "Wyślij sygnał", + SelectCivilianMakingTheCall = "Wybierz cywila wykonującego połączenie...", + IsThisAnEmergency = "Czy to wezwanie jest pilne?", + IsThisCallAnonymous = "Dzwonisz anonimowo?", + DoYouRequire = "Czy wymagasz", + ToAttend = "uczęszczać?", + AtWhatPostal = "Na jakiej poczcie jest to wydarzenie?", + AtWhatStreet = "Na jakiej ulicy doszło do tego zdarzenia?", + AtWhatArea = "W jakiej dzielnicy/obszarze doszło do tego zdarzenia?", + TimeOfCall = "Czas rozmowy", + HowToContact = "jak możemy się z Tobą skontaktować?", + PlaceHolderSelectCivilian = "Wybierz obywatela...", + PlaceholderHowToContact = "Telefon, e-mail lub stacja do odwiedzenia", + EmergencyCallOverview = "Przegląd połączeń alarmowych", + CallNotes = "Zadzwoń do Notatek", + CallAddNotesButton = "Wyświetl/Dodaj notatki", + CallAddUnitsButton = "Przypisz jednostki", + CallViewNotesButton = "Zobacz notatki", + CallNotesTitle = "Notatki dotyczące połączeń | Dzwonić ", + CallNoteCreatedSystemMessage = "Utworzono notatkę o połączeniu.", + CallerName = "Nazwa dzwoniącego: ", + AddNoteButton = "Dodaj notatkę", + AddNotePlaceholder = "Dodaj nową notatkę...", + AddedCallNote = "Dodano notatkę o połączeniu, aby zadzwonić ", + System = "SYSTEM", + Next = "Następny", + Previous = "Poprzedni", + + -- PNC + BornOn = "Urodzony ", + Markers = "Markery", + MarkersSubTitle = "Wszystkie aktywne znaczniki są wyświetlane poniżej.", + ArmedAndDangerous = "Uzbrojony i niebezpieczny", + Assault = "Napaść", + Burglary = "Włamanie", + DrugRelated = "Związane z narkotykami", + GangAffiliation = "Przynależność do gangu", + Homicide = "Zabójstwo", + Kidnapping = "Porwanie", + MentalHealth = "Problemy ze zdrowiem psychicznym", + SexOffense = "Przestępstwo seksualne", + Terrorism = "Terroryzm", + Theft = "Kradzież", + TrafficViolation = "Wykroczenie drogowe", + WantedPerson = "Poszukiwana osoba", + OtherMarker = "Inne, przeczytaj opis...", + ActiveWarrant = "Aktywny nakaz", + DescribeMarkerAndWarrant = "Opisz znaczniki/nakaz", + Timestamp = "Znak czasu", + ShowVehicles = "Pokaż pojazdy", + ShowProperties = "Pokaż właściwości", + ShowRecords = "Pokaż rekordy", + ShowFines = "Pokaż kary", + EditMarkers = "Edytuj znaczniki", + AddRecord = "Dodaj rekord", + AddFine = "Dodaj Dobrze", + NoCitizensFound = "Nie znaleziono żadnych obywateli", + EnterAtLeast = "Proszę przynajmniej wejść", + Characters = "postacie(s)", + AddRecordFor = "Dodaj rekord dla", + Charge = "Przestępstwo", + Description = "Opis", + Victims = "Ofiary", + LocationDescription = "Opis lokalizacji", + OfficerDetails = "Szczegóły oficera", + Sentence = "Zdanie", + Prosecuted = "Czy podejrzany był ścigany za to przestępstwo?", + Prosecuted2 = "Ścigany", + ReportDate = "Data raportu", + AddFineFor = "Dodaj karę za", + TicketableOffense = "Przestępstwo karalne", + FineDescription = "Świetny opis", + FineAmount = "Dobra kwota", + DueDate = "Termin", + PaidFine = "Czy sprawca zapłacił karę?", + FineDate = "Świetna randka", + GeneratedForCitizenId = "Wygenerowano dla identyfikatora obywatela", + NoRecordsFound = "Nie znaleziono żadnych danych dla identyfikatora obywatela", + RegisteredToCitizenId = "Zarejestrowany na dowód osobisty", + CitizenName = "Imię obywatela", + NoVehiclesFoundForCitizenId = "Nie znaleziono pojazdów dla identyfikatora obywatelskiego", + FineIssuedOn = "Grzywna wydana dnia", + FinePaid = "Dobra zapłacona", + NoFinesFoundForCitizenId = "Nie znaleziono kar pieniężnych dla identyfikatora obywatelskiego", + EditMarkersFor = "Edytuj znaczniki dla", + LastUpdatedBy = "Ostatnia aktualizacja:", + PNCOverview = "PNC", + PNCPersonSearch = "Wyszukiwanie osoby", + PNCPersonSearchPlaceholder = "John Doe / Dowód osobisty", + PNCVehicleSearch = "Wyszukiwanie pojazdu", + PNCVehicleSearchPlaceholder = "HF22 BXU / identyfikator obywatela", + PNCPropertySearch = "Wyszukiwanie nieruchomości", + PNCPropertySearchPlaceholder = "Identyfikator obywatela", + NoPropertiesFoundForCitizenId = "Nie znaleziono żadnych obiektów dla identyfikatora obywatela", + PNCRecordSearch = "Wyszukiwanie rekordów", + PNCRecordSearchPlaceholder = "Identyfikator obywatela", + PNCFineSearch = "Szukaj dobrze", + PNCFineSearchPlaceholder = "Identyfikator obywatela", + PNCResults = "Wyniki", + PNCMarkStolen = "Oznacz jako skradziony?", + PNCBolo = "BOLO Aktywny?", + DescribeBolo = "Opisz powód wszczęcia a BOLO", + PNCBoloDescription = "BOLO Opis:", + EditBoloFor = "Edytuj BOLO dla ", + Search = "Szukaj", + Send = "Wysłać", + Dispatch = "Kontrola", + DispatchMessagePlaceholder = "Wyślij wiadomość do wszystkich aktywnych jednostek.", + DispatchMessageTitle = "Ogłoszenie kontrolne", + ActiveUnits = "Aktywne jednostki", + Backup = "Kopia zapasowa", + FleetManagement = "Zarządzanie flotą", + ActiveWarrants = "Aktywne Warranty", + WantedFor = "Poszukiwany za:", + LastUpdated = "Ostatnio zaktualizowany:", + ReportSighting = "Zgłoś obserwację", + DateAndTime = "Data i godzina", + ANPRSection = "ANPR", + ANPRSectionFullName = "Automatyczne rozpoznawanie tablic rejestracyjnych", + PlaceholderCharge = "Kradzież", + PlaceholderVictims = "John Doe, Jane Doe", + PlaceholderLocationDescription = "Ulica, poczta, adres", + PlaceholderOfficerDetails = "C. Lowly - Odznaka nr 3622", + PlaceholderSentence = "Opisz zdanie", + PlaceholderTicketableOffense = "Przyśpieszenie", + NoWantedPersonsFound = "Nie znaleziono osób poszukiwanych...", + NoWantedVehiclesFound = "Nie znaleziono pojazdów poszukiwanych...", + ANPRFront = "PRZÓD ANPR", + ANPRRear = "ANPR TYŁ", + ANPRModel = "Model:", + ANPRColour = "Kolor:", + ANPRSpeed = "Prędkość:", + ANPRFlags = "Flagi:", + ANPRLocation = "Lokalizacja:", + + -- UNIT OVERVIEW + NameId = "Nazwa (ID)", + Callsign = "Znak wywoławczy", + ModeOfTransport = "Środek transportu", + VehicleRoofcode = "Kod dachu pojazdu", + Department = "Dział", + Rank = "Ranga", + Location = "Lokalizacja", + Postal = "Pocztowy", + Status = "Status", + Tracking = "Śledzenie", + DispatchMessageError = "Proszę wpisać co najmniej 10 znaków.", + RequestBackupFromPolice = "Poproś policję o wsparcie.", + RequestBackupFromAmbulance = "Poproś o wsparcie ze strony ambulansu.", + RequestBackupFromFire = "Poproś o wsparcie straży pożarnej.", + RequestBackupFromTow = "Zamów usługi holownicze.", + RequestBackupButton = "Poproś o kopię zapasową", + RequestedBackupType = "Żądano kopii zapasowej", + NoActiveCalls = "W tej chwili nie ma aktywnych połączeń...", + NoActiveUnits = "W tej chwili nie ma aktywnych jednostek...", + AssignToACall = "Przypisz do połączenia", + AssignToCallButton = "Przypisz, aby zadzwonić", + AssignUnitsToCallButton = "Przypisz jednostki", + AssignUnitToCallOverview = "PRZEGLĄD JEDNOSTKI AKTYWNEJ | Przypisz jednostki do wezwania", + AssignUnitToCall = "PRZEGLĄD AKTYWNYCH POŁĄCZEŃ | Przydzielać ", + AssignToCallHelp = "Kiedy zostaną przypisani do połączenia, otrzymają wskaźnik trasy na swojej mapie. Otrzymają również status „odpowiadający”.", + AssignNewStatus = "Przypisz nowy status", + AssignNewCallsign = "Przypisz nowy sygnał wywoławczy", + AssignNewFleetVehicle = "Przypisz nowy pojazd flotowy", + AssignUnitNewStatus = "PRZYPISZ STATUS DO JEDNOSTKI ", + UnitsTrackingCall = "Połączenie śledzące jednostki", + None = "Nic", + ActiveCallID = "Aktywne połączenie", + SirensOn = "Syreny WŁĄCZONE", + SirensOff = "Syreny WYŁĄCZONE", + + -- OPERATIONS + Report = "Aktywne połączenie", + ReportType = "Typ raportu", + Operations = "Operacje", + AddReports = "Dodaj raporty operacyjne", + SearchReports = "Wyszukaj raporty operacji", + SearchReportsPlaceholder = "Wprowadź zapytanie (np. nazwę lub część opisu)", + SearchReportsByDatePlaceholder = "Szukaj według daty", + SelectReportType = "Wybierz typ raportu...", + SelectReportTypePolice = "Policja raportuje", + SelectReportTypeFire = "Raporty o pożarze", + SelectReportTypeMedical = "Raporty medyczne", + MedicalReportType = "Typ raportu medycznego", + FireReportType = "Typ raportu o pożarze", + PoliceReportType = "Typ raportu policyjnego", + SubmitReport = "Złożyć raport", + ViewReport = "Zobacz pełny raport", + NoOperationReportsFound = "Nie znaleziono żadnych raportów z operacji", + SignedBy = "Podpisane przez", + SignedByPlaceholder = "Wpisz swoje imię", + DescriptionPlaceholder = "Wprowadź opis", + LocationPlaceholder = "Podaj lokalizację (np. ulica, rejon, poczta)", + EmployeeInvolved = "Zaangażowany(-i) pracownik(-owie).", + EmployeeInvolvedPlaceholder = "Wpisz nazwiska/numery identyfikatorów/identyfikatory obywateli (np. wydział, stopień, nazwisko i więcej szczegółów)", + CivilianInvolved = "Zaangażowani cywile", + CivilianInvolvedPlaceholder = "Wprowadź nazwiska / identyfikatory obywateli", + VehicleInvolved = "Pojazdy, których to dotyczy", + VehicleInvolvedPlaceholder = "Wprowadź pojazdy / identyfikatory pojazdów / identyfikatory obywateli (np. właścicieli pojazdów)", + PenalCode = "Podręcznik policji", + Guidelines = "Wytyczne", + Szkolenie = "Szkolenie", + UpdateTrainings = "Aktualizuj szkolenia", + + -- STATISTICS + Statistics = "Statystyka", + ViewStatistics = "Zobacz statystyki wszechczasów", + --== COLORS + AxesColor = "rgba(255, 255, 255, 0.6)", + barColor = "rgba(122, 189, 225, 0.2)", + barBorderColor = "rgba(122, 189, 225, 1)", + + -- DMV + LicensePlate = "Tablica rejestracyjna", + Make = "Robić", + Model = "Model", + Color = "Kolor", + BuildYear = "Rok budowy", + TaxPaid = "Podatek zapłacony?", + MOTPassed = "Zdany roczny test Ministerstwa Transportu (MOT)?", + Insurance = "Ubezpieczenie?", + ReportAsStolen = "Zgłosić jako skradziony?", + ReportedStolen = "Zgłoszono kradzież?", + RegisteredOn = "Zarejestrowano", + OwnedBy = "Posiadany przez", + VehicleRegisterId = "Numer rejestracyjny pojazdu", + MoT = "MOT?", + EditVehicleRegistration = "Edytuj rejestrację pojazdu", + OwnedByCitizenId = "Właścicielem jest Citizen ID", + VehiclePictureURL = "Adres URL zdjęcia pojazdu", + RegistrationDate = "Data rejestracji", + SelectCitizen = "Wybierz obywatela...", + RegisterAVehicle = "Zarejestruj pojazd", + RegisterVehicleSubtitle = "Zarejestruj wybrany pojazd!", + ViewRegisteredVehicles = "Zobacz swoje zarejestrowane pojazdy", + EditVehiclesSubtitle = "Edytuj je na swój sposób!", + AreYouSureDeleteVehicle = "Czy na pewno chcesz usunąć zarejestrowany pojazd?", + DeletingVehicleCannotBeUndone = "Usunięcia zarejestrowanego pojazdu nie można cofnąć.", + YesDeleteVehicle = "Tak, usuń mój zarejestrowany pojazd.", + PlaceholderLicensePlate = "HA23-RHY (bez białych znaków)", + PlaceholderMake = "Audi", + PlaceholderModel = "A6 Avant", + PlaceholderColor = "Czerwony", + PlaceholderYear = "2023", + + -- CITY HALL + FirstName = "Imię", + LastName = "Nazwisko", + DateOfBirth = "Data urodzenia", + Gender = "Płeć", + Email = "E-mail", + PhoneNumber = "Numer telefonu", + Address = "Adres", + AddressType = "Typ adresu", + City = "Miasto", + State = "Państwo", + PostalCode = "Kod pocztowy", + Country = "Kraj", + Occupation = "Zawód", + Nationality = "Narodowość", + PictureURL = "Adres URL zdjęcia", + RegisterCarLicense = "Zarejestrować prawo jazdy?", + RegisterBikeLicense = "Zarejestrować prawo jazdy na rower?", + RegisterTruckLicense = "Zarejestrować prawo jazdy na ciężarówkę?", + RegisterBoatLicense = "Zarejestrować licencję na łódź?", + RegisterPilotLicense = "Zarejestrować licencję pilota?", + Licenses = "Licencje", + CitizenId = "Identyfikator obywatela", + CarLicense = "Prawo jazdy", + BikeLicense = "Licencja rowerowa", + TruckLicense = "Licencja na ciężarówkę", + BoatLicense = "Licencja na łódź", + PilotLicense = "Licencja pilota", + EditCitizen = "Edytuj cywil", + ProfilePictureURL = "Adres URL zdjęcia cywilnego", + RegisterACivilian = "Zarejestruj cywila", + RegisterCivilianSubtitle = "Zarejestruj się, kim chcesz!", + ViewRegisteredCivilians = "Zobacz zarejestrowanych cywilów", + EditCiviliansSubtitle = "Edytuj je na swój sposób!", + AreYouSureDeleteCivilian = "Czy na pewno chcesz usunąć swojego cywila?", + DeletingCivilianCannotBeUndone = "Usunięcia tego znaku nie można cofnąć.", + YesDeleteCivilian = "Tak, usuń mojego cywila.", + PlaceholderFirstName = "John", + PlaceholderLastName = "Doe", + PlaceholderGender = "Dowolna płeć", + PlaceholderEmail = "johndoe@nsmail.com", + PlaceholderPhonenumber = "605-481-381", + PlaceholderAddress = "Grove Street 5", + PlaceholderAddressType = "Dom, mieszkanie, studio i/lub piętror", + PlaceholderCity = "Londyn", + PlaceholderState = "Większy Londyn", + PlaceholderPostal = "9104", + PlaceholderCountry = "Zjednoczone Królestwo", + PlaceholderOccupation = "Księgowy", + PlaceholderNationality = "język angielski", + + -- REAL ESTATE + RealEstate = "Nieruchomość", + ViewRegisteredProperties = "Zobacz swoje zarejestrowane nieruchomości", + EditPropertiesSubtitle = "Edytuj je tak, jak lubisz!", + RegisterAProperty = "Zarejestruj nieruchomość", + RegisterPropertySubtitle = "Zarejestruj wybrane nieruchomości", + SelectPropertyType = "Typ nieruchomości...", + HouseNumber = "numer domu", + PlaceholderHouseNumber = "12", + PropertyPictureURL = "Adres URL obrazu właściwości", + Area = "Dzielnica", + PlaceholderArea = "Wzgórza Vinewood", + PlaceholderPostalCode = "5001", + PlaceholderPrice = "25000", + Amenities = "Udogodnienia", + PlaceholderAmenities = "Opisz udogodnienia...", + PropertyOwnedBy = "Posiadany przez", + PropertySeized = "Zajęta nieruchomość?", + EditPropertySeizedButton = "(Nie)chwytać", + PropertyType = "Typ nieruchomości", + PropertyRegisterId = "Numer rejestracyjny nieruchomości", + PropertyAddress = "Adres", + PropertyHouseNumber = "Numer domu", + PropertyArea = "Dzielnica", + PropertyPostalCode = "kod pocztowy", + PropertyDescription = "Opis", + PropertyPrice = "Cena", + PropertyBuildYear = "Rok budowy", + PropertyAmenities = "Udogodnienia", + AreYouSureDeleteProperty = "Czy na pewno chcesz usunąć tę usługę?", + DeletingPropertyCannotBeUndone = "Usunięcia tej właściwości nie można cofnąć.", + YesDeleteProperty = "Usuń właściwość", + EditPropertyRegistration = "Edytuj rejestrację nieruchomości", + + -- Management + Management = "Panel Zarządzający", + ManageCivilians = "Cywilami", + ManageVehicles = "Pojazdami", + ManageProperties = "Właściwościami", + ManageCalls = "Połączeniami", + CivilianIDPlaceholder = "ID obywatela", + VehicleIDPlaceholder = "ID rejestracji pojazdu", + PropertyIDPlaceholder = "ID rejestracji nieruchomości", + CallIDPlaceholder = "ID połączenia", + + Delete10Calls = "Usuń 10 najstarszych połączeń", + Delete50Calls = "Usuń 50 najstarszych połączeń", + Delete100Calls = "Usuń 100 najstarszych połączeń", + + -- VALUTA + Valuta = "£", + }, + + -- HELP MENU TRANSLATIONS + HelpMenuText = { + Header = "Informacje MDT", + Info1 = "Każde menu ma swój własny poziom dostępu przypisany przez właściciela serwera. Masz dostęp do wymaganych sekcji, w zależności od Twojej rangi.", + Info2 = "MDT oznacza „Mobilny terminal danych”. Został zbudowany do wyszukiwania i rejestrowania danych. Zapewnia wgląd w aktywne jednostki, osoby, pojazdy, znaczniki, nakazy, dokumentację policyjną, dokumentację medyczną, raporty o incydentach, grzywny, wezwania alarmowe i statystyki.", + Info3 = "Konstrukcja MDT pozwala na samoobsługę. Oznacza to, że cywile mogą tworzyć własne postacie i pojazdy oraz mogą je w każdej chwili edytować. Z drugiej strony rejestry policyjne i kary są kontrolowane przez policję. To samo dotyczy innych dokumentów związanych z działem.", + Info4 = "Skróty klawiszowe są dostępne poprzez ESC -> Ustawienia -> Powiązania klawiszy -> FiveM. Jeśli potrzebujesz więcej wyjaśnień na temat korzystania z MDT, odwiedź dokumentację: https://docs.nights-software.com/resources/nightShifts/", + }, + }, +} \ No newline at end of file diff --git a/resources/night_shifts/datatables.sql b/resources/night_shifts/datatables.sql new file mode 100644 index 000000000..03f896bac --- /dev/null +++ b/resources/night_shifts/datatables.sql @@ -0,0 +1,243 @@ +CREATE TABLE ns_mdt_user ( + fivem_id VARCHAR(100) PRIMARY KEY, + discord_id VARCHAR(100) NOT NULL, + playername VARCHAR(500) NOT NULL, + shift_time INTEGER UNSIGNED NOT NULL, + last_callsign VARCHAR(15) DEFAULT 'XX-00' NOT NULL +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_call ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + emergency_type TINYINT(1) DEFAULT 0 NOT NULL, + police_required TINYINT(1) DEFAULT 0 NOT NULL, + ambulance_required TINYINT(1) DEFAULT 0 NOT NULL, + fire_required TINYINT(1) DEFAULT 0 NOT NULL, + tow_required TINYINT(1) DEFAULT 0 NOT NULL, + `description` VARCHAR(5000) NOT NULL, + callername VARCHAR(100) NOT NULL, + contact_details VARCHAR(100) NOT NULL, + area VARCHAR(100) NOT NULL, + postal VARCHAR(25) NOT NULL, + street VARCHAR(100) NOT NULL, + calltrackedby VARCHAR(5000) NOT NULL, + call_coords_x DECIMAL(10, 6) NOT NULL, + call_coords_y DECIMAL(10, 6) NOT NULL, + call_coords_z DECIMAL(10, 6) NOT NULL, + archived_call TINYINT(1) DEFAULT 0 NOT NULL, + call_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_call_notes ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + call_id INTEGER NOT NULL, + note_text VARCHAR(5000) NOT NULL, + note_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + note_callsign VARCHAR(15) NOT NULL, + FOREIGN KEY (call_id) REFERENCES ns_mdt_call(id) ON DELETE CASCADE +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_civilian ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + profile_picture_url VARCHAR(250), + first_name VARCHAR(25) NOT NULL, + last_name VARCHAR(25) NOT NULL, + dob DATE, + gender VARCHAR(25) NOT NULL, + email VARCHAR(100) NOT NULL, + phone_number VARCHAR(25) NOT NULL, + address_line_1 VARCHAR(100) NOT NULL, + address_line_2 VARCHAR(25), + city VARCHAR(25) NOT NULL, + state VARCHAR(25) NOT NULL, + postal_code VARCHAR(25) NOT NULL, + country VARCHAR(25) NOT NULL, + occupation VARCHAR(25) NOT NULL, + nationality VARCHAR(25) NOT NULL, + license_car TINYINT(1) NOT NULL, + license_bike TINYINT(1) NOT NULL, + license_truck TINYINT(1) NOT NULL, + license_boat TINYINT(1) NOT NULL, + license_pilot TINYINT(1) NOT NULL, + user_fivem_id VARCHAR(100) NOT NULL, + FOREIGN KEY (user_fivem_id) REFERENCES ns_mdt_user(fivem_id) ON DELETE CASCADE +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_marker ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + armed_and_dangerous TINYINT(1) DEFAULT 0 NOT NULL, + assault TINYINT(1) DEFAULT 0 NOT NULL, + burglary TINYINT(1) DEFAULT 0 NOT NULL, + drug_related TINYINT(1) DEFAULT 0 NOT NULL, + gang_affiliation TINYINT(1) DEFAULT 0 NOT NULL, + homicide TINYINT(1) DEFAULT 0 NOT NULL, + kidnapping TINYINT(1) DEFAULT 0 NOT NULL, + mental_health_issues TINYINT(1) DEFAULT 0 NOT NULL, + sex_offense TINYINT(1) DEFAULT 0 NOT NULL, + terrorism TINYINT(1) DEFAULT 0 NOT NULL, + theft TINYINT(1) DEFAULT 0 NOT NULL, + traffic_violation TINYINT(1) DEFAULT 0 NOT NULL, + wanted_person TINYINT(1) DEFAULT 0 NOT NULL, + other TINYINT(1) DEFAULT 0 NOT NULL, + flag_description VARCHAR(5000) NOT NULL, + active_warrant TINYINT(1) DEFAULT 0 NOT NULL, + date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + created_by VARCHAR(500) NOT NULL, + civ_id INTEGER NOT NULL, + user_fivem_id VARCHAR(100) NOT NULL, + FOREIGN KEY (civ_id) REFERENCES ns_mdt_civilian(id) ON DELETE CASCADE, + FOREIGN KEY (user_fivem_id) REFERENCES ns_mdt_user(fivem_id) ON DELETE CASCADE +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_vehicle ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + vehicle_picture_url VARCHAR(250), + license_plate VARCHAR(8) NOT NULL, + make VARCHAR(50) NOT NULL, + model VARCHAR(50) NOT NULL, + color VARCHAR(50) NOT NULL, + build_year YEAR NOT NULL, + registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + tax TINYINT(1) DEFAULT 0 NOT NULL, + mot TINYINT(1) DEFAULT 0 NOT NULL, + insurance TINYINT(1) DEFAULT 0 NOT NULL, + stolen TINYINT(1) DEFAULT 0 NOT NULL, + bolo TINYINT(1) DEFAULT 0 NOT NULL, + bolo_description VARCHAR(5000) NOT NULL, + civ_id INTEGER NOT NULL, + user_fivem_id VARCHAR(100) NOT NULL, + FOREIGN KEY (civ_id) REFERENCES ns_mdt_civilian(id) ON DELETE CASCADE, + FOREIGN KEY (user_fivem_id) REFERENCES ns_mdt_user(fivem_id) ON DELETE CASCADE +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_police_report ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + charge VARCHAR(500) NOT NULL, + `description` VARCHAR(5000) NOT NULL, + victims VARCHAR(500) NOT NULL, + location VARCHAR(500) NOT NULL, + officer VARCHAR(49) NOT NULL, + sentence VARCHAR(500) NOT NULL, + report_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + prosecuted TINYINT(1) DEFAULT 0 NOT NULL, + civ_id INTEGER NOT NULL, + FOREIGN KEY (civ_id) REFERENCES ns_mdt_civilian(id) ON DELETE CASCADE +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_police_fine ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + fine_type VARCHAR(50) NOT NULL, + fine_description VARCHAR(5000) NOT NULL, + fine_amount DECIMAL(10, 2) NOT NULL, + fine_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + fine_location VARCHAR(250) NOT NULL, + issuing_officer VARCHAR(50) NOT NULL, + due_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + paid TINYINT(1) DEFAULT 0 NOT NULL, + civ_id INTEGER NOT NULL, + FOREIGN KEY (civ_id) REFERENCES ns_mdt_civilian(id) ON DELETE CASCADE +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_operations ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + report_type VARCHAR(50) NOT NULL, + sub_report_type VARCHAR(500) NOT NULL, + employee_involved VARCHAR(500) NOT NULL, + civilian_involved VARCHAR(500) NOT NULL, + vehicle_involved VARCHAR(500) NOT NULL, + location VARCHAR(100) NOT NULL, + `description` VARCHAR(5000) NOT NULL, + report_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + signature VARCHAR(100) NOT NULL +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_property ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + property_picture_url VARCHAR(500), + property_type VARCHAR(50) NOT NULL, + address VARCHAR(500) NOT NULL, + house_number INTEGER NOT NULL, + area VARCHAR(500) NOT NULL, + postal_code VARCHAR(25) NOT NULL, + `description` VARCHAR(5000) NOT NULL, + price DECIMAL(15, 2) NOT NULL, + year_built INTEGER NOT NULL, + amenities VARCHAR(500), + property_seized TINYINT(1) DEFAULT 0 NOT NULL, + registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + civ_id INTEGER NOT NULL, + user_fivem_id VARCHAR(100) NOT NULL, + FOREIGN KEY (civ_id) REFERENCES ns_mdt_civilian(id) ON DELETE CASCADE, + FOREIGN KEY (user_fivem_id) REFERENCES ns_mdt_user(fivem_id) ON DELETE CASCADE +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_fleet ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + fleet_vehicle_picture_url VARCHAR(250), + department_index INTEGER NOT NULL, + sub_department_index INTEGER NOT NULL, + vehicle_name VARCHAR(100) NOT NULL, + vehicle_model VARCHAR(100) NOT NULL, + roof_code_callsign VARCHAR(15) NOT NULL, + vehicle_plate VARCHAR(8) NOT NULL, + in_service TINYINT(1) DEFAULT 0 NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_training ( + user_fivem_id VARCHAR(100) NOT NULL, + completed_trainings VARCHAR(5000) DEFAULT '[]' NOT NULL, + FOREIGN KEY (user_fivem_id) REFERENCES ns_mdt_user(fivem_id) ON DELETE CASCADE +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_npc_civilian ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + entity_model VARCHAR(250) NOT NULL, + unique_id VARCHAR(250) NOT NULL, + personal_data LONGTEXT NOT NULL +) AUTO_INCREMENT = 10000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_npc_vehicle ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + vehicle_picture_url VARCHAR(250), + license_plate VARCHAR(8) NOT NULL, + make VARCHAR(50) NOT NULL, + model VARCHAR(50) NOT NULL, + color VARCHAR(50) NOT NULL, + build_year YEAR NOT NULL, + registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + tax TINYINT(1) DEFAULT 0 NOT NULL, + mot TINYINT(1) DEFAULT 0 NOT NULL, + insurance TINYINT(1) DEFAULT 0 NOT NULL, + stolen TINYINT(1) DEFAULT 0 NOT NULL, + bolo TINYINT(1) DEFAULT 0 NOT NULL, + bolo_description VARCHAR(5000) NOT NULL, + inventory LONGTEXT NOT NULL, + owner_name VARCHAR(500) NOT NULL, + civ_id INTEGER NOT NULL +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_npc_police_record ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + charge VARCHAR(500) NOT NULL, + `description` VARCHAR(5000) NOT NULL, + victims VARCHAR(500) NOT NULL, + location VARCHAR(500) NOT NULL, + officer VARCHAR(49) NOT NULL, + sentence VARCHAR(500) NOT NULL, + report_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + prosecuted TINYINT(1) DEFAULT 0 NOT NULL, + civ_id INTEGER NOT NULL +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE ns_mdt_npc_fine ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + fine_type VARCHAR(50) NOT NULL, + fine_description VARCHAR(5000) NOT NULL, + fine_amount DECIMAL(10, 2) NOT NULL, + fine_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + fine_location VARCHAR(250) NOT NULL, + issuing_officer VARCHAR(50) NOT NULL, + due_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + paid TINYINT(1) DEFAULT 0 NOT NULL, + civ_id INTEGER NOT NULL +) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; \ No newline at end of file diff --git a/resources/night_shifts/droptables.sql b/resources/night_shifts/droptables.sql new file mode 100644 index 000000000..d664cdba7 --- /dev/null +++ b/resources/night_shifts/droptables.sql @@ -0,0 +1,17 @@ + +DROP TABLE IF EXISTS ns_mdt_npc_police_record; +DROP TABLE IF EXISTS ns_mdt_npc_fine; +DROP TABLE IF EXISTS ns_mdt_npc_vehicle; +DROP TABLE IF EXISTS ns_mdt_npc_civilian; +DROP TABLE IF EXISTS ns_mdt_training; +DROP TABLE IF EXISTS ns_mdt_fleet; +DROP TABLE IF EXISTS ns_mdt_marker; +DROP TABLE IF EXISTS ns_mdt_property; +DROP TABLE IF EXISTS ns_mdt_police_fine; +DROP TABLE IF EXISTS ns_mdt_police_report; +DROP TABLE IF EXISTS ns_mdt_vehicle; +DROP TABLE IF EXISTS ns_mdt_civilian; +DROP TABLE IF EXISTS ns_mdt_operations; +DROP TABLE IF EXISTS ns_mdt_call_notes; +DROP TABLE IF EXISTS ns_mdt_call; +DROP TABLE IF EXISTS ns_mdt_user; \ No newline at end of file diff --git a/resources/night_shifts/fxmanifest.lua b/resources/night_shifts/fxmanifest.lua new file mode 100644 index 000000000..63f720767 --- /dev/null +++ b/resources/night_shifts/fxmanifest.lua @@ -0,0 +1,49 @@ +fx_version 'cerulean' +games { 'gta5' } + +author 'Nights Software' +description 'Night Shifts MDT - Early Access' +version '0.12.4' +lua54 'yes' + +loadscreen_manual_shutdown "yes" + +shared_scripts { + "config/setup_config.lua", + "config/config.lua", + "config/mdt_config.lua", + "config/anpr_config.lua", + "config/departments_config.lua", + "config/translations.lua", + "config/fictivenames_config.lua", + "config/handbooks_config.lua", +} + +server_scripts { + '@oxmysql/lib/MySQL.lua', + "server/*.lua", +} + +client_scripts { + "client/*.lua", +} + +ui_page "NUI/index.html" +files{ + "NUI/index.html", + 'NUI/images/*.jpg', + 'NUI/images/*.png', + 'NUI/sounds/*.ogg', + 'NUI/main.js', + 'NUI/js/*.js', + 'NUI/css/*.css', +} + +escrow_ignore { + 'config/*.lua', + 'server/s_functions.lua', + 'server/server_exports.lua', + 'client/c_functions.lua', + 'client/client_exports.lua' +} +dependency '/assetpacks' \ No newline at end of file diff --git a/resources/night_shifts/server/database_migration.lua b/resources/night_shifts/server/database_migration.lua new file mode 100644 index 000000000..9d2c1878f Binary files /dev/null and b/resources/night_shifts/server/database_migration.lua differ diff --git a/resources/night_shifts/server/database_transactions.lua b/resources/night_shifts/server/database_transactions.lua new file mode 100644 index 000000000..8395f74a3 Binary files /dev/null and b/resources/night_shifts/server/database_transactions.lua differ diff --git a/resources/night_shifts/server/s_functions.lua b/resources/night_shifts/server/s_functions.lua new file mode 100644 index 000000000..fb3a220a9 --- /dev/null +++ b/resources/night_shifts/server/s_functions.lua @@ -0,0 +1,350 @@ +--============ FUNCTIONS ============-- + +function GetCustomPlayerName(id) -- Used for shift data only to represent the "Officer/Firefighter/Medics name" + local src = tonumber(id) + local playerName = GetPlayerName(src) or "Unknown name" + return playerName + + -- Write your own stuff here. +end + +function GetMyCallsignNumber(userServerId) -- Current format examples: Uses a prefix like CW- and a number like 01, PL-02, BS-12 (See config.lua & this function to customize it.) + local callsignNr = nil + local number = tonumber(userServerId) + if number < 10 then + callsignNr = "0"..number + else + callsignNr = number + end + return callsignNr or 0 +end + +function DebugPrint(msg) + if Config.Debug then + if msg ~= nil then + print("["..GetCurrentResourceName().."] "..msg) + end + end +end + +--=============== Exports & Editable Functions ===============-- + +-- Getting User Shift Data +function GetUserShiftData(targetServerId) + for k, v in pairs(cached_shift_data) do + if v.userServerId == targetServerId then + return v + end + end + return {} + + -- If you want to print out the results in your server side script, use this commented code: + + -- local src = source + -- local shiftDataResults = exports['night_shifts']:GetUserShiftData(src) + -- if #shiftDataResults > 0 then + -- for k, v in pairs(shiftDataResults) do + -- print("Key: "..k.." | Value: "..v) + -- end + -- end +end + +-- Usage Example (Server Side only) +-- exports['night_shifts']:GetUserShiftData(source) + +exports('GetUserShiftData', GetUserShiftData) + + +-- Get data when a player registers a property. +function OnPlayerRegisteredProperty(data) + -- Example: Printing the data table + -- for key, value in pairs(data) do + -- print(key, value) + -- end +end + +-- Get data when a player registers a property. +function OnPlayerUpdateProperty(data) + -- Example: Printing the data table + -- for key, value in pairs(data) do + -- print(key, value) + -- end +end + +-- Get data when a player registers a vehicle. +function OnPlayerRegisteredVehicle(data) + local registryData = { + vehicle_license_plate = data.license_plate, + vehicle_make = data.make, + vehicle_model = data.model, + vehicle_color = data.color, + vehicle_build_year = data.build_year, + vehicle_registration_date = data.registration_date, + vehicle_tax = data.tax, + vehicle_mot = data.mot, + vehicle_insurance = data.insurance, + vehicle_stolen = data.stolen, + vehicle_bolo = data.bolo, + vehicle_bolo_description = data.bolo_description, + vehicle_picture_url = data.vehicle_picture_url, + vehicle_owned_by_civ_id = tonumber(data.civ_id), + player_fivem_id = data.user_fivem_id, + vehicle_id = tonumber(data.id) + } + + -- Further processing or actions with the registryData can be added here + + -- Example: Printing the registryData table + -- for key, value in pairs(registryData) do + -- print(key, value) + -- end +end + +function OnPlayerUpdateVehicle(data) + local registryData = { + vehicle_picture_url = data.vehicle_picture_url, + vehicle_license_plate = data.license_plate, + vehicle_make = data.make, + vehicle_model = data.model, + vehicle_color = data.color, + vehicle_build_year = data.build_year, + vehicle_tax = data.tax, + vehicle_mot = data.mot, + vehicle_insurance = data.insurance, + vehicle_stolen = data.stolen, + vehicle_bolo = data.bolo, + vehicle_bolo_description = data.bolo_description, + vehicle_id = tonumber(data.id) + } + + -- Further processing or actions with the registryData can be added here + + -- Example: Printing the registryData table + -- for key, value in pairs(registryData) do + -- print(key, value) + -- end +end + + +-- Get data when a player registers a civilian. +function OnPlayerRegisteredCivilian(data) + local registryData = { + civilian_profile_picture_url = data.profile_picture_url, + civilian_first_name = data.first_name, + civilian_last_name = data.last_name, + civilian_dob = data.dob, + civilian_gender = data.gender, + civilian_email = data.email, + civilian_phone_number = data.phone_number, + civilian_address_line_1 = data.address_line_1, + civilian_address_line_2 = data.address_line_2, + civilian_city = data.city, + civilian_state = data.state, + civilian_postal_code = data.postal_code, + civilian_country = data.country, + civilian_occupation = data.occupation, + civilian_nationality = data.nationality, + civilian_license_car = data.license_car, + civilian_license_bike = data.license_bike, + civilian_license_truck = data.license_truck, + civilian_license_boat = data.license_boat, + civilian_license_pilot = data.license_pilot, + civilian_user_fivem_id = data.user_fivem_id, + civilian_id = tonumber(data.id) + } + + -- Further processing or actions with the registryData can be added here + + -- Example: Printing the registryData table + -- for key, value in pairs(registryData) do + -- print(key, value) + -- end +end + +function OnPlayerUpdateCivilian(data) + local registryData = { + civilian_dob = data.dob, + civilian_profile_picture_url = data.profile_picture_url, + civilian_address_line_2 = data.address_line_2, + civilian_postal_code = data.postal_code, + civilian_license_pilot = data.license_pilot, + civilian_occupation = data.occupation, + civilian_nationality = data.nationality, + civilian_address_line_1 = data.address_line_1, + civilian_license_truck = data.license_truck, + civilian_gender = data.gender, + civilian_last_name = data.last_name, + civilian_first_name = data.first_name, + civilian_email = data.email, + civilian_license_car = data.license_car, + civilian_country = data.country, + civilian_state = data.state, + civilian_city = data.city, + civilian_phone_number = data.phone_number, + civilian_license_bike = data.license_bike, + civilian_license_boat = data.license_boat, + civilian_id = tonumber(data.id) + } + + -- Further processing or actions with the registryData can be added here + + -- Example: Printing the registryData table + -- for key, value in pairs(registryData) do + -- print(key, value) + -- end +end + +function OnPlayerCalledEmergencyServices(data) + local callRegistryData = { + emergency_call_emergency_type = data.emergency_type, + emergency_call_police_required = data.police_required, + emergency_call_ambulance_required = data.ambulance_required, + emergency_call_fire_required = data.fire_required, + emergency_call_tow_required = data.tow_required, + emergency_call_description = data.description, + emergency_call_caller_civ_id = data.caller_civ_id, + emergency_call_area = data.area, + emergency_call_postal = data.postal, + emergency_call_street = data.street, + emergency_call_contact_details = data.contact_details, + emergency_call_callername = data.callername, + emergency_call_calltrackedby = data.calltrackedby, -- Array of callsigns + emergency_call_call_coords_x = data.call_coords_x, + emergency_call_call_coords_y = data.call_coords_y, + emergency_call_call_coords_z = data.call_coords_z, + emergency_call_archived_call = data.archived_call, + emergency_call_call_time = data.call_time, + emergency_call_id = tonumber(data.id) + } + + -- Further processing or actions with the callRegistryData can be added here + + -- Example: Printing the callRegistryData table + -- for key, value in pairs(callRegistryData) do + -- print(key, value) + -- end +end + +--============ POSTAL CODE INTEGRATION ============-- + +local raw = nil +local postals = nil +local nearestCalloutPostal = nil + +if Config.Enable_Nearest_Postal then + -- Use this, or adjust this to your postal system as an integration + raw = LoadResourceFile("nearest-postal", GetResourceMetadata("nearest-postal", 'postal_file')) + if raw == nil then + print("^1ERROR^7 Postal resource 'nearest-postal' file does not exist (is not installed or is renamed) or failed to load. Check https://docs.nights-software.com for installation support.") + else + postals = json.decode(raw) + end +end + +function getPostal(x, y) + if Config.Enable_Nearest_Postal then + local theCalloutPostal = nil + if postals ~= nil then + local ndm = -1 -- nearest distance magnitude + local ni = -1 -- nearest index + for i, p in ipairs(postals) do + local dm = (x - p.x) ^ 2 + (y - p.y) ^ 2 -- distance magnitude + if ndm == -1 or dm < ndm then + ni = i + ndm = dm + end + end + --setting the nearest + if ni ~= -1 then + local nd = math.sqrt(ndm) -- nearest distance + nearestCalloutPostal = {i = ni, d = nd} + end + + local text = postals[nearestCalloutPostal.i].code, nearestCalloutPostal.d + theCalloutPostal = text + else + return "Unknown postal" + end + return theCalloutPostal + else + return "Unknown postal" + end +end + +--============ Discord Webhooks ============-- + +RegisterServerEvent("night_shifts:sendDiscordEmbedMessage") +AddEventHandler("night_shifts:sendDiscordEmbedMessage", function(data) + local src = source + SendDiscordEmbedMessage(src, data) +end) + +function SendDiscordEmbedMessage(src, data) + if Config.Enable_Discord_Webhooks then + local webhookURL + local webhooKType = data.discordwebhookurltype + if webhooKType == nil then webhooKType = '' end + if webhooKType == 'shift' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + elseif webhooKType == 'panic' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + elseif webhooKType == 'status' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + elseif webhooKType == 'incomingcall' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + elseif webhooKType == 'trackcall' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + elseif webhooKType == 'backup' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + elseif webhooKType == 'sightedperson' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + elseif webhooKType == 'sightedvehicle' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + elseif webhooKType == 'anprhit' then + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + else + webhookURL = "https://discord.com/api/webhooks/964210045220958251/2qzKEBdUceFxJ1Wt3OhmL6WbqP9AUJqrJjbtd0U31MFV8l9uOODvn7mfmsm5I3wxzE1d" + end + + local embed = { + { + ["title"] = "**"..data.title.."**" or "", + ["description"] = data.description or "", + ["color"] = data.color or 16767002, + ["author"] = { + ["name"] = data.authorname or "", + ["icon_url"] = data.authoravatarurl or "" + }, + ["fields"] = { + { + ["name"] = data.sender or "", + ["value"] = "<@"..data.senderdiscordid..">" or "Unknown", + ["inline"] = true + }, + { + ["name"] = data.subjecttitle or "", + ["value"] = data.subjectdescription or "", + ["inline"] = true + } + }, + ["footer"] = { + ["text"] = data.footer or "".." "..os.date("%Y").." | "..os.date("%d-%m-%Y at %H:%M:%S"), + ["icon_url"] = data.footericon or "https://assets.ea-rp.com/ns_logo_placeholder.png" + }, + ["thumbnail"] = { + ["url"] = data.thumbnail or "https://assets.ea-rp.com/img/ns_logo_round_placeholder.png", + }, + ["image"] = { + ["url"] = data.image or "" -- No url is no image, which is fine as well + }, + ["timestamp"] = os.date("!%Y-%m-%dT%H:%M:%SZ") -- UTC timestamp + } + } + PerformHttpRequest(webhookURL, function(err, text, headers) end, 'POST', json.encode({data.systemname or "NS - MDT System", embeds = embed}), { ['Content-Type'] = 'application/json' }) + end +end + +-- Usage Example Server Side +-- exports['night_shifts']:SendDiscordEmbedMessage(source, messageData) + +exports('SendDiscordEmbedMessage', SendDiscordEmbedMessage) \ No newline at end of file diff --git a/resources/night_shifts/server/server.lua b/resources/night_shifts/server/server.lua new file mode 100644 index 000000000..3e5c4dcc4 Binary files /dev/null and b/resources/night_shifts/server/server.lua differ diff --git a/resources/night_shifts/server/server_connect.lua b/resources/night_shifts/server/server_connect.lua new file mode 100644 index 000000000..ba81f88d7 Binary files /dev/null and b/resources/night_shifts/server/server_connect.lua differ diff --git a/resources/night_shifts/server/server_disconnect.lua b/resources/night_shifts/server/server_disconnect.lua new file mode 100644 index 000000000..170fd1c08 Binary files /dev/null and b/resources/night_shifts/server/server_disconnect.lua differ diff --git a/resources/night_shifts/server/server_exports.lua b/resources/night_shifts/server/server_exports.lua new file mode 100644 index 000000000..332f16e1c --- /dev/null +++ b/resources/night_shifts/server/server_exports.lua @@ -0,0 +1,35 @@ +--============ EXPORTS ============-- + +function CreateEmergencyCallViaServer(isEmergency, isPoliceRequired, isAmbulanceRequired, isFireRequired, isTowRequired, description, street_name, zone_name, caller_name, coordinates, contact_details) + local postal = getPostal(coordinates.x, coordinates.y) or Config.Messages[Config.Language].Unknown + + local data = { + emergency_type = isEmergency or false, + police_required = isPoliceRequired or false, + ambulance_required = isAmbulanceRequired or false, + fire_required = isFireRequired or false, + tow_required = isTowRequired or false, + description = description or Config.Messages[Config.Language].Unknown, + area = zone_name or Config.Messages[Config.Language].Unknown, + postal = postal or Config.Messages[Config.Language].Unknown, + street = street_name or Config.Messages[Config.Language].Unknown, + contact_details = contact_details or Config.Messages[Config.Language].Unknown, + callername = caller_name or Config.Messages[Config.Language].Unknown, + calltrackedby = json.encode({}), -- Emtpy, because it's a new call. + call_coords_x = coordinates.x or 0.0, + call_coords_y = coordinates.y or 0.0, + call_coords_z = coordinates.z or 0.0, + archived_call = false, + is_silent = false + } + + EmergencyCallViaServer(data) +end + +exports('CreateEmergencyCallViaServer', CreateEmergencyCallViaServer) + +-- Usage example: +-- exports.night_shifts:CreateEmergencyCallViaServer(true --[[isEmergency]], true --[[isPoliceRequired]], true --[[isAmbulanceRequired]], true --[[isFireRequired]], true --[[isTowRequired]], description --[[string]], street_name --[[string]], zone_name --[[string]], caller_name --[[string]], coordinates --[[vector3]], contact_details --[[string]]) + + + diff --git a/resources/night_shifts/server/server_identifiers.lua b/resources/night_shifts/server/server_identifiers.lua new file mode 100644 index 000000000..254c2df14 Binary files /dev/null and b/resources/night_shifts/server/server_identifiers.lua differ diff --git a/resources/night_shifts/server/timezone_api.lua b/resources/night_shifts/server/timezone_api.lua new file mode 100644 index 000000000..ca38a4846 Binary files /dev/null and b/resources/night_shifts/server/timezone_api.lua differ diff --git a/resources/replace1/stream/biff+hi.ytd b/resources/replace1/stream/biff+hi.ytd new file mode 100644 index 000000000..e81820de6 --- /dev/null +++ b/resources/replace1/stream/biff+hi.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b38ad28d04d87aeadb9941db071c271799c1539903a874cc1911856cfd4afde +size 193119 diff --git a/resources/replace1/stream/biff.yft b/resources/replace1/stream/biff.yft new file mode 100644 index 000000000..71d675371 --- /dev/null +++ b/resources/replace1/stream/biff.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83c0053670fbaebd28b6e88dd11d4eefbe9fabf07b33cea72c625a3561deff41 +size 2447827 diff --git a/resources/replace1/stream/biff.ytd b/resources/replace1/stream/biff.ytd new file mode 100644 index 000000000..f5501293b --- /dev/null +++ b/resources/replace1/stream/biff.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bbb3364898f32fc290640bc99b2a6bb2bb61097305b13cc301340896b09eecd +size 7125804 diff --git a/resources/replace1/stream/biff_hi.yft b/resources/replace1/stream/biff_hi.yft new file mode 100644 index 000000000..9f05ff248 --- /dev/null +++ b/resources/replace1/stream/biff_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:796e8fcbcc122fb6e080a5253466d63c8add7f2ba5a9c666691db69fdefc5a30 +size 1329808 diff --git a/resources/replace1/stream/bj_bumper_mod.yft b/resources/replace1/stream/bj_bumper_mod.yft new file mode 100644 index 000000000..57fdc933d --- /dev/null +++ b/resources/replace1/stream/bj_bumper_mod.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1849c88645607a2bf28394e6ec2e17eed1ab05d678c5b861211c6ee0d5437dae +size 101763 diff --git a/resources/replace1/stream/bj_roof_mod.yft b/resources/replace1/stream/bj_roof_mod.yft new file mode 100644 index 000000000..4d415feaf --- /dev/null +++ b/resources/replace1/stream/bj_roof_mod.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65f4b4c61278d91da2c0e6d9c11a32e98a04ceeb0e96c729451e547759dd52d3 +size 517700 diff --git a/resources/replace1/stream/bj_skirts.yft b/resources/replace1/stream/bj_skirts.yft new file mode 100644 index 000000000..da92f6b9a --- /dev/null +++ b/resources/replace1/stream/bj_skirts.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:622e05b91883a7d2fc364df31e9e8ae76464612a1640ccea75974df08bf443f2 +size 144585 diff --git a/resources/replace1/stream/bjxl.yft b/resources/replace1/stream/bjxl.yft new file mode 100644 index 000000000..77d41357d --- /dev/null +++ b/resources/replace1/stream/bjxl.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74bf0dcdeaba7eb5de1f2fc63cba8b4679417e2eaabded195f571cc75d2b6987 +size 1757010 diff --git a/resources/replace1/stream/bjxl.ytd b/resources/replace1/stream/bjxl.ytd new file mode 100644 index 000000000..78791ef38 --- /dev/null +++ b/resources/replace1/stream/bjxl.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8de8862abaf6cca9ef6a2815fbc3e84997bc13d27d7bebee8d45d554a7308e5 +size 13199793 diff --git a/resources/replace1/stream/bjxl_hi.yft b/resources/replace1/stream/bjxl_hi.yft new file mode 100644 index 000000000..98df19b01 --- /dev/null +++ b/resources/replace1/stream/bjxl_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6ffd15c69b68e65211caa718171c829bca192234ce75a081296440b738e58e8 +size 6462710 diff --git a/resources/replace1/stream/carbonizzare+hi.ytd b/resources/replace1/stream/carbonizzare+hi.ytd new file mode 100644 index 000000000..19211e014 --- /dev/null +++ b/resources/replace1/stream/carbonizzare+hi.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87db7b4b412c75dd8fb94a30255be864f3d7607b7444af84a15b3ced06edc184 +size 61 diff --git a/resources/replace1/stream/carbonizzare.yft b/resources/replace1/stream/carbonizzare.yft new file mode 100644 index 000000000..5099e501e --- /dev/null +++ b/resources/replace1/stream/carbonizzare.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34c3717f1d0d0e7d0ad9340c43c8e5c7281800075998ab0bda77f1591942482f +size 18621643 diff --git a/resources/replace1/stream/carbonizzare.ytd b/resources/replace1/stream/carbonizzare.ytd new file mode 100644 index 000000000..7ad9f3e6c --- /dev/null +++ b/resources/replace1/stream/carbonizzare.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9709a9187148de688f3399ea5f5ac57c123ecaa97d27d2a38453cb16a5125bd7 +size 18748412 diff --git a/resources/replace1/stream/carbonizzare_hi.yft b/resources/replace1/stream/carbonizzare_hi.yft new file mode 100644 index 000000000..5099e501e --- /dev/null +++ b/resources/replace1/stream/carbonizzare_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34c3717f1d0d0e7d0ad9340c43c8e5c7281800075998ab0bda77f1591942482f +size 18621643 diff --git a/resources/replace1/stream/cavalcade.yft b/resources/replace1/stream/cavalcade.yft new file mode 100644 index 000000000..17a8392eb --- /dev/null +++ b/resources/replace1/stream/cavalcade.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0e2e4dc6cf4ea55a4d52ac83afcda3ec6571ce095c3c8040a4c6753a118e4ee +size 2465053 diff --git a/resources/replace1/stream/cavalcade.ytd b/resources/replace1/stream/cavalcade.ytd new file mode 100644 index 000000000..a148044ef --- /dev/null +++ b/resources/replace1/stream/cavalcade.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46f60661fb014b1877837886492e01ab8fa21960a6de9f7348b59bb7b538261e +size 7703989 diff --git a/resources/replace1/stream/cavalcade_hi.yft b/resources/replace1/stream/cavalcade_hi.yft new file mode 100644 index 000000000..7dacc2f75 --- /dev/null +++ b/resources/replace1/stream/cavalcade_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:244bc2fd826aa4d887c3a0374a816fd899d8bd88727b0c37040831a986558a7b +size 3433719 diff --git a/resources/replace1/stream/contender.yft b/resources/replace1/stream/contender.yft new file mode 100644 index 000000000..49b7837fd --- /dev/null +++ b/resources/replace1/stream/contender.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44425ba36f17c32731a0826d0cae670be0dcc3aa692ac7814a0edc63b65ded50 +size 10144769 diff --git a/resources/replace1/stream/contender.ytd b/resources/replace1/stream/contender.ytd new file mode 100644 index 000000000..5e08cb994 --- /dev/null +++ b/resources/replace1/stream/contender.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23e56f5824792ae697eea148c6d0555aa14de82a3d71810b7779561c6fd888c7 +size 5534242 diff --git a/resources/replace1/stream/contender_hi.yft b/resources/replace1/stream/contender_hi.yft new file mode 100644 index 000000000..ba12821e1 --- /dev/null +++ b/resources/replace1/stream/contender_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5f980cd9d334d5fd7c8d378c11c7824091e24ffad4ccc9871218e35cf4df83e +size 10144569 diff --git a/resources/replace1/stream/dominator.yft b/resources/replace1/stream/dominator.yft new file mode 100644 index 000000000..471da5314 --- /dev/null +++ b/resources/replace1/stream/dominator.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bb7a5220759eaf75268fbdeccf9540d4b77d67a3a1453e765fdba130b2bf075 +size 1753031 diff --git a/resources/replace1/stream/dominator.ytd b/resources/replace1/stream/dominator.ytd new file mode 100644 index 000000000..cc923d34a --- /dev/null +++ b/resources/replace1/stream/dominator.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b19fbde346514124b3e970ff4f5f63b20442a9be1f9ae59c00679ff0dc82b971 +size 7426723 diff --git a/resources/replace1/stream/dominator_hi.yft b/resources/replace1/stream/dominator_hi.yft new file mode 100644 index 000000000..0413292fc --- /dev/null +++ b/resources/replace1/stream/dominator_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51f2b5f9d28b589e871759d4860fdf30af52f157cc1de4addddf56dc9e786ab1 +size 7433774 diff --git a/resources/replace1/stream/dubsta.yft b/resources/replace1/stream/dubsta.yft new file mode 100644 index 000000000..f66b0ef2f --- /dev/null +++ b/resources/replace1/stream/dubsta.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a14c6c8ac95732b8735a63c07413b03d4916762c336dd72e281ad746db58dc04 +size 5920799 diff --git a/resources/replace1/stream/dubsta.ytd b/resources/replace1/stream/dubsta.ytd new file mode 100644 index 000000000..d83e81b73 --- /dev/null +++ b/resources/replace1/stream/dubsta.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1653e673366cfcba6540076495cfe6d12563ed8e5d51103b2d644f7919fef481 +size 3438771 diff --git a/resources/replace1/stream/dubsta_hi.yft b/resources/replace1/stream/dubsta_hi.yft new file mode 100644 index 000000000..f66b0ef2f --- /dev/null +++ b/resources/replace1/stream/dubsta_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a14c6c8ac95732b8735a63c07413b03d4916762c336dd72e281ad746db58dc04 +size 5920799 diff --git a/resources/replace1/stream/elegy2.yft b/resources/replace1/stream/elegy2.yft new file mode 100644 index 000000000..2a2b96435 --- /dev/null +++ b/resources/replace1/stream/elegy2.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:871f7b259d3743d8467810350446540a63ffc46793f4b878f7d8c7017bd03a59 +size 4123799 diff --git a/resources/replace1/stream/elegy2.ytd b/resources/replace1/stream/elegy2.ytd new file mode 100644 index 000000000..1c9fb9517 --- /dev/null +++ b/resources/replace1/stream/elegy2.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2eb7500b7c64ae43a6e0c890d5a3007681e08a4808ef39bab9d30b88b31ffeca +size 7710527 diff --git a/resources/replace1/stream/elegy2_hi.yft b/resources/replace1/stream/elegy2_hi.yft new file mode 100644 index 000000000..45c5fa4b8 --- /dev/null +++ b/resources/replace1/stream/elegy2_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9055b6f9af03ab154fdf1d0a6e23cb9eabb960c7b313bb14454e46b1a97f648 +size 4096268 diff --git a/resources/replace1/stream/granger.yft b/resources/replace1/stream/granger.yft new file mode 100644 index 000000000..87a755ed3 --- /dev/null +++ b/resources/replace1/stream/granger.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:beacad21e6d4bc91b21e1fd65f765340743d51c77aa7bc60767e91720963ec4d +size 2900895 diff --git a/resources/replace1/stream/granger.ytd b/resources/replace1/stream/granger.ytd new file mode 100644 index 000000000..21b341868 --- /dev/null +++ b/resources/replace1/stream/granger.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:889a476a535f3d17c6c670d692b02f8c4ea2cc27c980bad18f34428a7484505d +size 2335366 diff --git a/resources/replace1/stream/granger_hi.yft b/resources/replace1/stream/granger_hi.yft new file mode 100644 index 000000000..87a755ed3 --- /dev/null +++ b/resources/replace1/stream/granger_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:beacad21e6d4bc91b21e1fd65f765340743d51c77aa7bc60767e91720963ec4d +size 2900895 diff --git a/resources/replace1/stream/jackal.yft b/resources/replace1/stream/jackal.yft new file mode 100644 index 000000000..c23d4bb36 --- /dev/null +++ b/resources/replace1/stream/jackal.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3dd1945df03c7d4b4ada67cd1a28576296f69927d8c82ed3b83da926de622726 +size 5686091 diff --git a/resources/replace1/stream/jackal.ytd b/resources/replace1/stream/jackal.ytd new file mode 100644 index 000000000..cb298a74e --- /dev/null +++ b/resources/replace1/stream/jackal.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36d6791f28eabce9492f665522d50e35fe49ce86eb887c0787ddb46feba7ba7e +size 3065787 diff --git a/resources/replace1/stream/jackal_hi.yft b/resources/replace1/stream/jackal_hi.yft new file mode 100644 index 000000000..871b7e0e3 --- /dev/null +++ b/resources/replace1/stream/jackal_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7da2c133538241ea664874334591a1782ff88f3a48a568fbc4118d317c279cdc +size 5686204 diff --git a/resources/replace1/stream/minivan.yft b/resources/replace1/stream/minivan.yft new file mode 100644 index 000000000..cb80128d3 --- /dev/null +++ b/resources/replace1/stream/minivan.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92d653cfb666e9e067a5784537759dcecc1fe7f3b6fe6a4e33203b947df09567 +size 7272513 diff --git a/resources/replace1/stream/minivan.ytd b/resources/replace1/stream/minivan.ytd new file mode 100644 index 000000000..044fc03d3 --- /dev/null +++ b/resources/replace1/stream/minivan.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9af4ff3e9cc20834b4c0a43a931966b297e9a8a2931c5266a58f1827f7e3f3ee +size 1478911 diff --git a/resources/replace1/stream/minivan_hi.yft b/resources/replace1/stream/minivan_hi.yft new file mode 100644 index 000000000..f4590f561 --- /dev/null +++ b/resources/replace1/stream/minivan_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:098cd1622aaeef6ae26569bec1373408088352e262d127311a68083c28e406a0 +size 6213181 diff --git a/resources/replace1/stream/mule2.yft b/resources/replace1/stream/mule2.yft new file mode 100644 index 000000000..cbc409b94 --- /dev/null +++ b/resources/replace1/stream/mule2.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c651a93fea8015be5460c9922fcc0dddd3f5e18a2a3f2009844bf5907d3e032 +size 1022840 diff --git a/resources/replace1/stream/mule2.ytd b/resources/replace1/stream/mule2.ytd new file mode 100644 index 000000000..836aec9e1 --- /dev/null +++ b/resources/replace1/stream/mule2.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e619260c7fa95a164a790dba9dbb39200b3491dd08c7ee40abe01f3377a31210 +size 9594709 diff --git a/resources/replace1/stream/mule2_hi.yft b/resources/replace1/stream/mule2_hi.yft new file mode 100644 index 000000000..cbc409b94 --- /dev/null +++ b/resources/replace1/stream/mule2_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c651a93fea8015be5460c9922fcc0dddd3f5e18a2a3f2009844bf5907d3e032 +size 1022840 diff --git a/resources/replace1/stream/oracle2.yft b/resources/replace1/stream/oracle2.yft new file mode 100644 index 000000000..0d08d8557 --- /dev/null +++ b/resources/replace1/stream/oracle2.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9df17968315aaa8a236ff428e62f2debc4a3816df4cd5254606ffacc5812e603 +size 18777980 diff --git a/resources/replace1/stream/oracle2.ytd b/resources/replace1/stream/oracle2.ytd new file mode 100644 index 000000000..be4f54b97 --- /dev/null +++ b/resources/replace1/stream/oracle2.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba1ce3b185442fa80deb31d899bd6376d61a6ef3604ff0139c04bf54a21cd710 +size 6080017 diff --git a/resources/replace1/stream/oracle2_hi.yft b/resources/replace1/stream/oracle2_hi.yft new file mode 100644 index 000000000..517a4979d --- /dev/null +++ b/resources/replace1/stream/oracle2_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b969bde6107b98bc9f93943177e636b21b3e54038eb552e03cca520514171c63 +size 18790817 diff --git a/resources/replace1/stream/rancherxl.yft b/resources/replace1/stream/rancherxl.yft new file mode 100644 index 000000000..c07f410e3 --- /dev/null +++ b/resources/replace1/stream/rancherxl.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fabc2c6601458eb48c1b385b8e7d08b16bff1affd198d09d4e5d2b93bd8f9bc +size 3832032 diff --git a/resources/replace1/stream/rancherxl.ytd b/resources/replace1/stream/rancherxl.ytd new file mode 100644 index 000000000..2f2def2f9 --- /dev/null +++ b/resources/replace1/stream/rancherxl.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbf39954012aad6110ea72e8e77e85381610f6df4e8cd0ecbfde663baa86ae7b +size 5904499 diff --git a/resources/replace1/stream/rancherxl_hi.yft b/resources/replace1/stream/rancherxl_hi.yft new file mode 100644 index 000000000..50900c555 --- /dev/null +++ b/resources/replace1/stream/rancherxl_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5603a12c8707f890cbdc3a0354f8d75169ea90b21cadff6bbfc4f4604458467 +size 4249765 diff --git a/resources/replace1/stream/baller2.yft b/resources/replace1/stream/schafter2.yft similarity index 100% rename from resources/replace1/stream/baller2.yft rename to resources/replace1/stream/schafter2.yft diff --git a/resources/replace1/stream/baller2.ytd b/resources/replace1/stream/schafter2.ytd similarity index 100% rename from resources/replace1/stream/baller2.ytd rename to resources/replace1/stream/schafter2.ytd diff --git a/resources/replace1/stream/baller2_hi.yft b/resources/replace1/stream/schafter2_hi.yft similarity index 100% rename from resources/replace1/stream/baller2_hi.yft rename to resources/replace1/stream/schafter2_hi.yft diff --git a/resources/replace1/stream/schafter3.yft b/resources/replace1/stream/schafter3.yft new file mode 100644 index 000000000..817de69e9 --- /dev/null +++ b/resources/replace1/stream/schafter3.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00c5ec1639fbb8549e8555599196984bdabaf4399567c5eaeb88590e3974af63 +size 11903334 diff --git a/resources/replace1/stream/schafter3.ytd b/resources/replace1/stream/schafter3.ytd new file mode 100644 index 000000000..d6711f8b0 --- /dev/null +++ b/resources/replace1/stream/schafter3.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db3fd9d14e39f2fe9a7a19057b2064e5f8b1ff688d483fc98982750baad7e244 +size 4246769 diff --git a/resources/replace1/stream/schafter3_hi.yft b/resources/replace1/stream/schafter3_hi.yft new file mode 100644 index 000000000..2f44d62c5 --- /dev/null +++ b/resources/replace1/stream/schafter3_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c4cb62dbdf0b37d4042e530a45a8576ae83ef93c40cc37940871e7eab8bd91b +size 11902845 diff --git a/resources/replace1/stream/superd.yft b/resources/replace1/stream/superd.yft new file mode 100644 index 000000000..26d8d2477 --- /dev/null +++ b/resources/replace1/stream/superd.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:add90584441207d0e5448a6c9f5bd7bfc338253f58efd975f424220f1cf8d3e8 +size 8239137 diff --git a/resources/replace1/stream/superd.ytd b/resources/replace1/stream/superd.ytd new file mode 100644 index 000000000..a5009db37 --- /dev/null +++ b/resources/replace1/stream/superd.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4af656f4f8aeef078d1efd486cdc4778dc7e634fb5b0b48ff5128f140cfc2cbb +size 3164962 diff --git a/resources/replace1/stream/superd_hi.yft b/resources/replace1/stream/superd_hi.yft new file mode 100644 index 000000000..26d8d2477 --- /dev/null +++ b/resources/replace1/stream/superd_hi.yft @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:add90584441207d0e5448a6c9f5bd7bfc338253f58efd975f424220f1cf8d3e8 +size 8239137 diff --git a/server.cfg b/server.cfg index bbf7c7c22..d917fc860 100644 --- a/server.cfg +++ b/server.cfg @@ -69,6 +69,7 @@ ensure vMenu ensure Delete-Vehicle ensure night_subtitles ensure night_ers +ensure night_shifts ensure SmartHoseLite ensure SmartFiresLite ensure SmartFiresLite @@ -243,7 +244,7 @@ ensure helicam ensure BigDaddy-Airbags ensure BigDaddy-RadioAnimation ensure BigDaddy-VehicleDamage -ensure +ensure BigDaddy-VendingMachines ensure ensure ensure