From 53756690f9733bfce18ea07922de69dda02bbbe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Wed, 2 Aug 2017 11:00:05 +0200 Subject: [PATCH 01/85] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..77fea26d --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# fxserver-esx_society +FXServer ESX Society From 6d7bfa56d332e9eadf58dcd360311d387d5f9861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Wed, 2 Aug 2017 11:05:57 +0200 Subject: [PATCH 02/85] Update README.md --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index 77fea26d..bf16a874 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,35 @@ # fxserver-esx_society FXServer ESX Society + +[REQUIREMENTS] + +- cron => https://github.com/FXServer-ESX/fxserver-cron +- esx_addonaccount => https://github.com/FXServer-ESX/fxserver-esx_addonaccount + +[INSTALLATION] + +1) CD in your resources/[esx] folder +2) Clone the repository +``` +git clone https://github.com/FXServer-ESX/fxserver-esx_society esx_society +``` +3) Import esx_society.sql in your database +4) Add this in your server.cfg : + +``` +start esx_society +``` +[EXPLANATION] + +ESX Society works with addon accounts named 'society_xxx' like 'society_taxi' or 'society_realestateagnt'. +If you job grade is 'boss', you will see the society_xxx money of your job showed in the HUD. + +[USAGE] +``` +local society = 'taxi' +local amount = 100 + +TriggerServerEvent('esx_society:withdrawMoney', society, amount) +TriggerServerEvent('esx_society:depositMoney', society, amount) +TriggerServerEvent('esx_society:washMoney', society, amount) +``` From 4992d2e458162335bed30408af97e2c09f726906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Wed, 2 Aug 2017 11:06:58 +0200 Subject: [PATCH 03/85] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bf16a874..46c786af 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ start esx_society ``` [EXPLANATION] -ESX Society works with addon accounts named 'society_xxx' like 'society_taxi' or 'society_realestateagnt'. +ESX Society works with addon accounts named 'society_xxx' like 'society_taxi' or 'society_realestateagent'. If you job grade is 'boss', you will see the society_xxx money of your job showed in the HUD. [USAGE] From 7abb2575872074b5151c852603c1f64c560a9f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Wed, 2 Aug 2017 11:08:21 +0200 Subject: [PATCH 04/85] Add files --- __resource.lua | 12 +++++ client/main.lua | 79 ++++++++++++++++++++++++++++++ esx_society.sql | 9 ++++ server/main.lua | 124 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 224 insertions(+) create mode 100644 __resource.lua create mode 100644 client/main.lua create mode 100644 esx_society.sql create mode 100644 server/main.lua diff --git a/__resource.lua b/__resource.lua new file mode 100644 index 00000000..9287ed13 --- /dev/null +++ b/__resource.lua @@ -0,0 +1,12 @@ +resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' + +description 'ESX Society' + +server_scripts { + '@mysql-async/lib/MySQL.lua', + 'server/main.lua' +} + +client_scripts { + 'client/main.lua' +} diff --git a/client/main.lua b/client/main.lua new file mode 100644 index 00000000..8ac18b75 --- /dev/null +++ b/client/main.lua @@ -0,0 +1,79 @@ +ESX = nil +local PlayerData = {} +local base64MoneyIcon = 'data:image/png;base64,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/GMzLdsAADhgaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6MDk6MTUgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0xMC0wOVQyMDoxNDo0NyswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMTAtMDlUMjA6MTQ6NDcrMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NmZkNGVlNjgtOWU3Mi1jYTQxLTg5NjMtMWRjMmI2M2EzYWExPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2ZmQ0ZWU2OC05ZTcyLWNhNDEtODk2My0xZGMyYjYzYTNhYTE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj45NjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTgwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjE4MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg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' + +Citizen.CreateThread(function() + while ESX == nil do + TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + Citizen.Wait(0) + end +end) + +function EnableSocietyMoneyHUDElement() + + local societyMoneyHUDElementTpl = '
 {{money}}
' + + ESX.UI.HUD.RegisterElement('society_money', 3, 0, societyMoneyHUDElementTpl, { + money = 0 + }) + +end + +function DisableSocietyMoneyHUDElement() + ESX.UI.HUD.RemoveElement('society_money') +end + +function UpdateSocietyMoneyHUDElement(money) + + ESX.UI.HUD.UpdateElement('society_money', { + money = money + }) + +end + +RegisterNetEvent('esx:playerLoaded') +AddEventHandler('esx:playerLoaded', function(xPlayer) + + PlayerData = xPlayer + + DisableSocietyMoneyHUDElement() + + if PlayerData.job.grade_name == 'boss' then + + EnableSocietyMoneyHUDElement() + + ESX.TriggerServerCallback('esx_society:getAccountMoney', function(money) + UpdateSocietyMoneyHUDElement(money) + end, 'society_' .. PlayerData.job.name) + + end + +end) + +RegisterNetEvent('esx:setJob') +AddEventHandler('esx:setJob', function(job) + + PlayerData.job = job + + DisableSocietyMoneyHUDElement() + + if PlayerData.job.grade_name == 'boss' then + + EnableSocietyMoneyHUDElement() + + ESX.TriggerServerCallback('esx_society:getAccountMoney', function(money) + UpdateSocietyMoneyHUDElement(money) + end, 'society_' .. PlayerData.job.name) + + end + +end) + +RegisterNetEvent('esx_addonAccount:setMoney') +AddEventHandler('esx_addonAccount:setMoney', function(name, money) + + if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == name then + UpdateSocietyMoneyHUDElement(money) + end + +end) \ No newline at end of file diff --git a/esx_society.sql b/esx_society.sql new file mode 100644 index 00000000..cb097561 --- /dev/null +++ b/esx_society.sql @@ -0,0 +1,9 @@ +CREATE TABLE `society_moneywash` ( + + `id` int(11) NOT NULL AUTO_INCREMENT, + `identifier` varchar(60) NOT NULL, + `society` varchar(60) NOT NULL, + `amount` int(11) NOT NULL, + + PRIMARY KEY (`id`) +); \ No newline at end of file diff --git a/server/main.lua b/server/main.lua new file mode 100644 index 00000000..0e30cf2e --- /dev/null +++ b/server/main.lua @@ -0,0 +1,124 @@ +ESX = nil + +TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + +RegisterServerEvent('esx_society:withdrawMoney') +AddEventHandler('esx_society:withdrawMoney', function(society, amount) + + local xPlayer = ESX.GetPlayerFromId(source) + + TriggerEvent('esx_addonaccount:getSharedAccount', 'society_' .. society, function(account) + + if amount > 0 and account.money >= amount then + + account.removeMoney(amount) + xPlayer.addMoney(amount) + + TriggerClientEvent('esx:showNotification', xPlayer.source, 'Vous avez retiré ~g~$' .. amount) + + else + TriggerClientEvent('esx:showNotification', xPlayer.source, 'Montant invalide') + end + + end) + +end) + +RegisterServerEvent('esx_society:depositMoney') +AddEventHandler('esx_society:depositMoney', function(society, amount) + + local xPlayer = ESX.GetPlayerFromId(source) + + if amount > 0 and xPlayer.get('money') >= amount then + + TriggerEvent('esx_addonaccount:getSharedAccount', 'society_' .. society, function(account) + xPlayer.removeMoney(amount) + account.addMoney(amount) + end) + + TriggerClientEvent('esx:showNotification', xPlayer.source, 'Vous avez déposé ~r~$' .. amount) + + else + TriggerClientEvent('esx:showNotification', xPlayer.source, 'Montant invalide') + end + +end) + +RegisterServerEvent('esx_society:washMoney') +AddEventHandler('esx_society:washMoney', function(society, amount) + + local xPlayer = ESX.GetPlayerFromId(source) + local account = xPlayer.getAccount('black_money') + + if amount > 0 and account.money >= amount then + + xPlayer.removeAccountMoney('black_money', amount) + + MySQL.Async.execute( + 'INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', + { + ['@identifier'] = xPlayer.identifier, + ['@society'] = society, + ['@amount'] = amount + }, + function(rowsChanged) + TriggerClientEvent('esx:showNotification', xPlayer.source, 'Vous avez ~g~$' .. amount .. '~s~ en attente de ~r~blanchiement~s~ (24h)') + end + ) + + else + TriggerClientEvent('esx:showNotification', xPlayer.source, 'Montant invalide') + end + +end) + +ESX.RegisterServerCallback('esx_society:getAccountMoney', function(source, cb, account) + TriggerEvent('esx_addonaccount:getSharedAccount', account, function(account) + cb(account.money) + end) +end) + +function WashMoneyCRON(d, h, m) + + MySQL.Async.fetchAll( + 'SELECT * FROM society_moneywash', + {}, + function(result) + + local xPlayers = ESX.GetPlayers() + + for i=1, #result, 1 do + + local foundPlayer = false + local xPlayer = nil + + for k,v in pairs(xPlayers) do + if v.identifier == result[i].identifier then + foundPlayer = true + xPlayer = v + end + end + + TriggerEvent('esx_addonaccount:getSharedAccount', 'society_' .. result[i].society, function(account) + account.addMoney(result[i].amount) + end) + + if foundPlayer then + TriggerClientEvent('esx:showNotification', xPlayer.source, 'Vous avez ~r~blanchi~s~ votre argent : ~g~$' .. result[i].amount) + end + + MySQL.Async.execute( + 'DELETE FROM society_moneywash WHERE id = @id', + { + ['@id'] = result[i].id + } + ) + + end + + end + ) + +end + +TriggerEvent('cron:runAt', 3, 0, WashMoneyCRON) \ No newline at end of file From cc1329470efb7248340119f979e355e03574e73f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Mon, 7 Aug 2017 12:19:53 +0200 Subject: [PATCH 05/85] Update esx_society.sql --- esx_society.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esx_society.sql b/esx_society.sql index cb097561..6f2594d9 100644 --- a/esx_society.sql +++ b/esx_society.sql @@ -1,3 +1,5 @@ +USE `essentialmode`; + CREATE TABLE `society_moneywash` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -6,4 +8,4 @@ CREATE TABLE `society_moneywash` ( `amount` int(11) NOT NULL, PRIMARY KEY (`id`) -); \ No newline at end of file +); From dd5f4f64ab0ce9a9d3833df1b62461f0886a8e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Wed, 9 Aug 2017 14:15:33 +0200 Subject: [PATCH 06/85] Add LICENSE.txt --- LICENSE.txt | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..30ace6a8 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file From cdab4fb686cd757af6583444a546d198aa92e078 Mon Sep 17 00:00:00 2001 From: nearbyplayer Date: Wed, 16 Aug 2017 20:50:15 -0400 Subject: [PATCH 07/85] Multi-language support --- __resource.lua | 8 ++++++++ config.lua | 2 ++ locales/en.lua | 9 +++++++++ locales/fr.lua | 9 +++++++++ server/main.lua | 16 ++++++++-------- 5 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 config.lua create mode 100644 locales/en.lua create mode 100644 locales/fr.lua diff --git a/__resource.lua b/__resource.lua index 9287ed13..bf87ae44 100644 --- a/__resource.lua +++ b/__resource.lua @@ -4,9 +4,17 @@ description 'ESX Society' server_scripts { '@mysql-async/lib/MySQL.lua', + '@es_extended/locale.lua', + 'locales/en.lua', + 'locales/fr.lua', + 'config.lua', 'server/main.lua' } client_scripts { + '@es_extended/locale.lua', + 'locales/en.lua', + 'locales/fr.lua', + 'config.lua', 'client/main.lua' } diff --git a/config.lua b/config.lua new file mode 100644 index 00000000..56a8b5e9 --- /dev/null +++ b/config.lua @@ -0,0 +1,2 @@ +Config = {} +Config.Locale = 'fr' diff --git a/locales/en.lua b/locales/en.lua new file mode 100644 index 00000000..90ecab88 --- /dev/null +++ b/locales/en.lua @@ -0,0 +1,9 @@ +Locales['en'] = { + + ['have_withdrawn'] = 'you have withdrawn ~g~$', + ['invalid_amount'] = 'invalid amount', + ['have_deposited'] = 'you have deposited ~r~$', + ['you_have'] = 'you have ~g~$', + ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', + +} diff --git a/locales/fr.lua b/locales/fr.lua new file mode 100644 index 00000000..6004ee9b --- /dev/null +++ b/locales/fr.lua @@ -0,0 +1,9 @@ +Locales['fr'] = { + + ['have_withdrawn'] = 'vous avez retiré ~g~$', + ['invalid_amount'] = 'montant invalide', + ['have_deposited'] = 'vous avez déposé ~r~$', + ['you_have'] = 'vous avez ~g~$', + ['you_have_laundered'] = 'Vous avez ~r~blanchi~s~ votre argent : ~g~$', + +} diff --git a/server/main.lua b/server/main.lua index 0e30cf2e..29726b19 100644 --- a/server/main.lua +++ b/server/main.lua @@ -14,10 +14,10 @@ AddEventHandler('esx_society:withdrawMoney', function(society, amount) account.removeMoney(amount) xPlayer.addMoney(amount) - TriggerClientEvent('esx:showNotification', xPlayer.source, 'Vous avez retiré ~g~$' .. amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn') .. amount) else - TriggerClientEvent('esx:showNotification', xPlayer.source, 'Montant invalide') + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) end end) @@ -36,10 +36,10 @@ AddEventHandler('esx_society:depositMoney', function(society, amount) account.addMoney(amount) end) - TriggerClientEvent('esx:showNotification', xPlayer.source, 'Vous avez déposé ~r~$' .. amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited') .. amount) else - TriggerClientEvent('esx:showNotification', xPlayer.source, 'Montant invalide') + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) end end) @@ -62,12 +62,12 @@ AddEventHandler('esx_society:washMoney', function(society, amount) ['@amount'] = amount }, function(rowsChanged) - TriggerClientEvent('esx:showNotification', xPlayer.source, 'Vous avez ~g~$' .. amount .. '~s~ en attente de ~r~blanchiement~s~ (24h)') + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have') .. amount .. '~s~ en attente de ~r~blanchiement~s~ (24h)') end ) else - TriggerClientEvent('esx:showNotification', xPlayer.source, 'Montant invalide') + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) end end) @@ -104,7 +104,7 @@ function WashMoneyCRON(d, h, m) end) if foundPlayer then - TriggerClientEvent('esx:showNotification', xPlayer.source, 'Vous avez ~r~blanchi~s~ votre argent : ~g~$' .. result[i].amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered') .. result[i].amount) end MySQL.Async.execute( @@ -121,4 +121,4 @@ function WashMoneyCRON(d, h, m) end -TriggerEvent('cron:runAt', 3, 0, WashMoneyCRON) \ No newline at end of file +TriggerEvent('cron:runAt', 3, 0, WashMoneyCRON) From d210c5ef4ad15bd383611ac7f3d38a58b6571cfb Mon Sep 17 00:00:00 2001 From: TakumiBR <31086346+TakumiBR@users.noreply.github.com> Date: Thu, 17 Aug 2017 09:17:25 -0700 Subject: [PATCH 08/85] Multi-language support Brazilian Portuguese translation. --- __resource.lua | 2 ++ locales/br.lua | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 locales/br.lua diff --git a/__resource.lua b/__resource.lua index bf87ae44..ec0d70a4 100644 --- a/__resource.lua +++ b/__resource.lua @@ -5,6 +5,7 @@ description 'ESX Society' server_scripts { '@mysql-async/lib/MySQL.lua', '@es_extended/locale.lua', + 'locales/br.lua', 'locales/en.lua', 'locales/fr.lua', 'config.lua', @@ -13,6 +14,7 @@ server_scripts { client_scripts { '@es_extended/locale.lua', + 'locales/br.lua', 'locales/en.lua', 'locales/fr.lua', 'config.lua', diff --git a/locales/br.lua b/locales/br.lua new file mode 100644 index 00000000..db67419b --- /dev/null +++ b/locales/br.lua @@ -0,0 +1,9 @@ +Locales['br'] = { + + ['have_withdrawn'] = 'Você sacou ~g~$', + ['invalid_amount'] = 'Quantidade inválida', + ['have_deposited'] = 'Você depositou ~r~$', + ['you_have'] = 'Você tem ~g~$', + ['you_have_laundered'] = 'Você ~r~lavou~s~ seu dinheiro: ~g~$', + +} From 2b40d5116e4b13a30c3b9502317f48dc163e6ba7 Mon Sep 17 00:00:00 2001 From: renaiku Date: Mon, 21 Aug 2017 21:02:01 +0200 Subject: [PATCH 09/85] update getplayers --- server/main.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server/main.lua b/server/main.lua index 29726b19..d59a8cee 100644 --- a/server/main.lua +++ b/server/main.lua @@ -92,10 +92,11 @@ function WashMoneyCRON(d, h, m) local foundPlayer = false local xPlayer = nil - for k,v in pairs(xPlayers) do - if v.identifier == result[i].identifier then + for i=1, #xPlayers, 1 do + local xPlayer2 = ESX.GetPlayerFromId(xPlayers[i]) + if xPlayer2.identifier == result[i].identifier then foundPlayer = true - xPlayer = v + xPlayer = xPlayer2 end end From 1e7a4bc9e2fa31e56e97051f6c5df996809f1b14 Mon Sep 17 00:00:00 2001 From: ultratm Date: Sat, 26 Aug 2017 12:57:49 +0200 Subject: [PATCH 10/85] Add German Language --- __resource.lua | 2 ++ locales/de.lua | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 locales/de.lua diff --git a/__resource.lua b/__resource.lua index ec0d70a4..78593c6c 100644 --- a/__resource.lua +++ b/__resource.lua @@ -5,6 +5,7 @@ description 'ESX Society' server_scripts { '@mysql-async/lib/MySQL.lua', '@es_extended/locale.lua', + 'locales/de.lua', 'locales/br.lua', 'locales/en.lua', 'locales/fr.lua', @@ -14,6 +15,7 @@ server_scripts { client_scripts { '@es_extended/locale.lua', + 'locales/de.lua', 'locales/br.lua', 'locales/en.lua', 'locales/fr.lua', diff --git a/locales/de.lua b/locales/de.lua new file mode 100644 index 00000000..e5e45b05 --- /dev/null +++ b/locales/de.lua @@ -0,0 +1,9 @@ +Locales['de'] = { + + ['have_withdrawn'] = 'abgehoben ~g~$', + ['invalid_amount'] = 'ungültiger Betrag', + ['have_deposited'] = 'eingezahlt ~r~$', + ['you_have'] = 'du hast ~g~$', + ['you_have_laundered'] = 'du hast dein Geld ~r~gewaschen~s~: ~g~$', + +} From fefb4301495827376d7eda7efde796c29f47b52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Sun, 3 Sep 2017 11:53:07 +0200 Subject: [PATCH 11/85] Fix typo + Add complete boss menu --- client/main.lua | 384 +++++++++++++++++++++++++++++++++++++++++++++++- locales/br.lua | 31 +++- locales/en.lua | 31 +++- locales/fr.lua | 31 +++- server/main.lua | 151 ++++++++++++++++++- 5 files changed, 609 insertions(+), 19 deletions(-) diff --git a/client/main.lua b/client/main.lua index 8ac18b75..5dfa393a 100644 --- a/client/main.lua +++ b/client/main.lua @@ -31,6 +31,380 @@ function UpdateSocietyMoneyHUDElement(money) end +function OpenBossMenu(society, close, options) + + local options = options or {} + local elements = {} + + local defaultOptions = { + withdraw = true, + deposit = true, + wash = true, + employees = true, + grades = true + } + + for k,v in pairs(defaultOptions) do + if options[k] == nil then + options[k] = v + end + end + + if options.withdraw then + table.insert(elements, {label = _U('withdraw_society_money'), value = 'withdraw_society_money'}) + end + + if options.deposit then + table.insert(elements, {label = _U('deposit_society_money'), value = 'deposit_money'}) + end + + if options.wash then + table.insert(elements, {label = _U('wash_money'), value = 'wash_money'}) + end + + if options.employees then + table.insert(elements, {label = _U('employee_management'), value = 'manage_employees'}) + end + + if options.grades then + table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) + end + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'boss_actions_' .. society, + { + title = 'Patron', + elements = elements + }, + function(data, menu) + + if data.current.value == 'withdraw_society_money' then + + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, + { + title = _U('withdraw_amount') + }, + function(data, menu) + + local amount = tonumber(data.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:withdrawMoney', society, amount) + end + + end, + function(data, menu) + menu.close() + end + ) + + end + + if data.current.value == 'deposit_money' then + + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, + { + title = _U('deposit_amount') + }, + function(data, menu) + + local amount = tonumber(data.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:depositMoney', society, amount) + end + + end, + function(data, menu) + menu.close() + end + ) + + end + + if data.current.value == 'wash_money' then + + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, + { + title = _U('wash_money_amount') + }, + function(data, menu) + + local amount = tonumber(data.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:washMoney', society, amount) + end + + end, + function(data, menu) + menu.close() + end + ) + + end + + if data.current.value == 'manage_employees' then + OpenManageEmployeesMenu(society) + end + + if data.current.value == 'manage_grades' then + OpenManageGradesMenu(society) + end + + end, + function(data, menu) + + if close then + close(data, menu) + end + + end + ) + +end + +function OpenManageEmployeesMenu(society) + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'manage_employees_' .. society, + { + title = _U('employee_management'), + elements = { + {label = _U('employee_list'), value = 'employee_list'}, + {label = _U('recruit'), value = 'recruit'}, + } + }, + function(data, menu) + + if data.current.value == 'employee_list' then + OpenEmployeeList(society) + end + + if data.current.value == 'recruit' then + OpenRecruitMenu(society) + end + + end, + function(data, menu) + menu.close() + end + ) + +end + +function OpenEmployeeList(society) + + ESX.TriggerServerCallback('esx_society:getEmployees', function(employees) + + local elements = { + head = {_U('employee'), _U('grade'), _U('actions')}, + rows = {} + } + + for i=1, #employees, 1 do + + local gradeLabel = (employees[i].job.grade_label == '' and employees[i].job.label or employees[i].job.grade_label) + + table.insert(elements.rows, { + data = employees[i], + cols = { + employees[i].name, + gradeLabel, + '{{' .. _U('promote') .. '|promote}} {{' .. _U('fire') .. '|fire}}' + } + }) + end + + ESX.UI.Menu.Open( + 'list', GetCurrentResourceName(), 'employee_list_' .. society, + elements, + function(data, menu) + + local employee = data.data + + if data.value == 'promote' then + menu.close() + OpenPromoteMenu(society, employee) + end + + if data.value == 'fire' then + + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenEmployeeList(society) + end, employee.identifier, 'unemployed', 0) + + end + + end, + function(data, menu) + menu.close() + OpenManageEmployeesMenu(society) + end + ) + + end, society) + +end + +function OpenRecruitMenu(society) + + ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players) + + local elements = {} + + for i=1, #players, 1 do + if players[i].job.name ~= society then + table.insert(elements, {label = players[i].name, value = players[i].source, name = players[i].name, identifier = players[i].identifier}) + end + end + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'recruit_' .. society, + { + title = _U('recruiting'), + elements = elements + }, + function(data, menu) + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'recruit_confirm_' .. society, + { + title = _U('do_you_want_to_recruit', data.current.name), + elements = { + {label = _U('yes'), value = 'no'}, + {label = _U('no'), value = 'yes'}, + } + }, + function(data2, menu2) + + menu2.close() + + if data2.current.value == 'yes' then + + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenRecruitMenu(society) + end, data.current.identifier, society, 0) + + end + + end, + function(data2, menu2) + menu2.close() + end + ) + + end, + function(data, menu) + menu.close() + end + ) + + end) + +end + +function OpenPromoteMenu(society, employee) + + ESX.TriggerServerCallback('esx_society:getJob', function(job) + + local elements = {} + + for i=1, #job.grades, 1 do + local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, {label = gradeLabel, value = job.grades[i].grade, selected = (employee.job.grade == job.grades[i].grade)}) + end + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'promote_employee_' .. society, + { + title = _U('promote_employee', employee.name), + elements = elements + }, + function(data, menu) + menu.close() + + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenEmployeeList(society) + end, employee.identifier, society, data.current.value) + + end, + function(data, menu) + menu.close() + OpenEmployeeList(society) + end + ) + + end, society) + +end + +function OpenManageGradesMenu(society) + + ESX.TriggerServerCallback('esx_society:getJob', function(job) + + local elements = {} + + for i=1, #job.grades, 1 do + local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, {label = gradeLabel .. ' $' .. job.grades[i].salary, value = job.grades[i].grade}) + end + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'manage_grades_' .. society, + { + title = _U('salary_management'), + elements = elements + }, + function(data, menu) + + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, + { + title = _U('salary_amount') + }, + function(data2, menu2) + + local amount = tonumber(data2.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu2.close() + + ESX.TriggerServerCallback('esx_society:setJobSalary', function() + OpenManageGradesMenu(society) + end, society, data.current.value, amount) + end + + end, + function(data2, menu2) + menu2.close() + end + ) + + end, + function(data, menu) + menu.close() + end + ) + + end, society) + +end + RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(xPlayer) @@ -69,11 +443,15 @@ AddEventHandler('esx:setJob', function(job) end) -RegisterNetEvent('esx_addonAccount:setMoney') -AddEventHandler('esx_addonAccount:setMoney', function(name, money) +RegisterNetEvent('esx_addonaccount:setMoney') +AddEventHandler('esx_addonaccount:setMoney', function(society, money) - if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == name then + if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == society then UpdateSocietyMoneyHUDElement(money) end +end) + +AddEventHandler('esx_society:openBossMenu', function(society, close, options) + OpenBossMenu(society, close, options) end) \ No newline at end of file diff --git a/locales/br.lua b/locales/br.lua index db67419b..3eace68c 100644 --- a/locales/br.lua +++ b/locales/br.lua @@ -1,9 +1,30 @@ Locales['br'] = { - ['have_withdrawn'] = 'Você sacou ~g~$', - ['invalid_amount'] = 'Quantidade inválida', - ['have_deposited'] = 'Você depositou ~r~$', - ['you_have'] = 'Você tem ~g~$', - ['you_have_laundered'] = 'Você ~r~lavou~s~ seu dinheiro: ~g~$', + ['actions'] = 'actions', + ['deposit_amount'] = 'deposit amount', + ['deposit_society_money'] = 'deposit society money', + ['employee'] = 'employee', + ['employee_list'] = 'employee list', + ['employee_management'] = 'employee management', + ['fire'] = 'fire', + ['grade'] = 'grade', + ['have_deposited'] = 'Você depositou ~r~$', + ['have_withdrawn'] = 'Você sacou ~g~$', + ['invalid_amount'] = 'invalid amount', + ['invalid_amount'] = 'Quantidade inválida', + ['no'] = 'no', + ['promote'] = 'promote', + ['promote_employee'] = 'promote %s', + ['recruit'] = 'recruit', + ['recruiting'] = 'recruiting', + ['salary_amount'] = 'salary amount', + ['salary_management'] = 'salary management', + ['wash_money'] = 'wash money', + ['wash_money_amount'] = 'amount to wash', + ['withdraw_amount'] = 'witdraw amount', + ['withdraw_society_money'] = 'withdraw society money', + ['yes'] = 'yes', + ['you_have'] = 'Você tem ~g~$', + ['you_have_laundered'] = 'Você ~r~lavou~s~ seu dinheiro: ~g~$', } diff --git a/locales/en.lua b/locales/en.lua index 90ecab88..d60fd62c 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,9 +1,30 @@ Locales['en'] = { - ['have_withdrawn'] = 'you have withdrawn ~g~$', - ['invalid_amount'] = 'invalid amount', - ['have_deposited'] = 'you have deposited ~r~$', - ['you_have'] = 'you have ~g~$', - ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', + ['actions'] = 'actions', + ['deposit_amount'] = 'deposit amount', + ['deposit_society_money'] = 'deposit society money', + ['employee'] = 'employee', + ['employee_list'] = 'employee list', + ['employee_management'] = 'employee management', + ['fire'] = 'fire', + ['grade'] = 'grade', + ['have_deposited'] = 'you have deposited ~r~$', + ['have_withdrawn'] = 'you have withdrawn ~g~$', + ['invalid_amount'] = 'invalid amount', + ['invalid_amount'] = 'invalid amount', + ['no'] = 'no', + ['promote'] = 'promote', + ['promote_employee'] = 'promote %s', + ['recruit'] = 'recruit', + ['recruiting'] = 'recruiting', + ['salary_amount'] = 'salary amount', + ['salary_management'] = 'salary management', + ['wash_money'] = 'wash money', + ['wash_money_amount'] = 'amount to wash', + ['withdraw_amount'] = 'witdraw amount', + ['withdraw_society_money'] = 'withdraw society money', + ['yes'] = 'yes', + ['you_have'] = 'you have ~g~$', + ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', } diff --git a/locales/fr.lua b/locales/fr.lua index 6004ee9b..fb3f07a1 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -1,9 +1,30 @@ Locales['fr'] = { - ['have_withdrawn'] = 'vous avez retiré ~g~$', - ['invalid_amount'] = 'montant invalide', - ['have_deposited'] = 'vous avez déposé ~r~$', - ['you_have'] = 'vous avez ~g~$', - ['you_have_laundered'] = 'Vous avez ~r~blanchi~s~ votre argent : ~g~$', + ['actions'] = 'actions', + ['deposit_amount'] = 'montant du dépôt', + ['deposit_society_money'] = 'déposer argent société', + ['employee'] = 'employé', + ['employee_list'] = 'liste des employés', + ['employee_management'] = 'gestion employés', + ['fire'] = 'licencier', + ['grade'] = 'grade', + ['have_deposited'] = 'vous avez déposé ~r~$', + ['have_withdrawn'] = 'vous avez retiré ~g~$', + ['invalid_amount'] = 'montant invalide', + ['invalid_amount'] = 'montant invalide', + ['no'] = 'non', + ['promote'] = 'promouvoir', + ['promote_employee'] = 'promouvoir %s', + ['recruit'] = 'recruter', + ['recruiting'] = 'recrutement', + ['salary_amount'] = 'montant du salaire', + ['salary_management'] = 'gestion salaires', + ['wash_money'] = 'blanchir argent', + ['wash_money_amount'] = 'montant à blanchir', + ['withdraw_amount'] = 'montant du retrait', + ['withdraw_society_money'] = 'retirer argent société', + ['yes'] = 'oui', + ['you_have'] = 'vous avez ~g~$', + ['you_have_laundered'] = 'vous avez ~r~blanchi~s~ votre argent : ~g~$', } diff --git a/server/main.lua b/server/main.lua index d59a8cee..3376af76 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,7 +1,25 @@ -ESX = nil +ESX = nil +Jobs = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) +AddEventHandler('onMySQLReady', function() + + local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) + + for i=1, #result, 1 do + Jobs[result[i].name] = result[i] + Jobs[result[i].name].grades = {} + end + + local result2 = MySQL.Sync.fetchAll('SELECT * FROM job_grades', {}) + + for i=1, #result2, 1 do + Jobs[result2[i].job_name].grades[tostring(result2[i].grade)] = result2[i] + end + +end) + RegisterServerEvent('esx_society:withdrawMoney') AddEventHandler('esx_society:withdrawMoney', function(society, amount) @@ -78,6 +96,137 @@ ESX.RegisterServerCallback('esx_society:getAccountMoney', function(source, cb, a end) end) +ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) + + MySQL.Async.fetchAll( + 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', + { + ['@job'] = society + }, + function(result) + + local employees = {} + + for i=1, #result, 1 do + + table.insert(employees, { + name = result[i].name, + identifier = result[i].identifier, + job = { + name = result[i].job, + label = Jobs[result[i].job].label, + grade = result[i].job_grade, + grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, + grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, + } + }) + end + + cb(employees) + + end + ) + +end) + +ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) + + local job = json.decode(json.encode(Jobs[society])) + local grades = {} + + for k,v in pairs(job.grades) do + table.insert(grades, v) + end + + table.sort(grades, function(a, b) + return a.grade < b.grade + end) + + job.grades = grades + + cb(job) + +end) + + +ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade) + + local xPlayer = ESX.GetPlayerFromIdentifier(identifier) + + if xPlayer == nil then + + MySQL.Async.execute( + 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', + { + ['@job'] = job, + ['@job_grade'] = grade, + ['@identifier'] = identifier + }, + function(rowsChanged) + cb() + end + ) + + else + xPlayer.setJob(job, grade) + cb() + end + +end) + +ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) + + MySQL.Async.execute( + 'UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', + { + ['@salary'] = salary, + ['@job_name'] = job, + ['@grade'] = grade + }, + function(rowsChanged) + + Jobs[job].grades[tostring(grade)].salary = salary + + local xPlayers = ESX.GetPlayers() + + for i=1, #xPlayers, 1 do + + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + + if xPlayer.job.name == job and xPlayer.job.grade == grade then + xPlayer.setJob(job, grade) + end + + end + + cb() + end + ) + +end) + +ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) + + local xPlayers = ESX.GetPlayers() + local players = {} + + for i=1, #xPlayers, 1 do + + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + + table.insert(players, { + source = xPlayer.source, + identifier = xPlayer.identifier, + name = xPlayer.name, + job = xPlayer.job + }) + + end + + cb(players) + +end) + function WashMoneyCRON(d, h, m) MySQL.Async.fetchAll( From 7740735bfe3a988f6df7593f95b90c20ee3185a6 Mon Sep 17 00:00:00 2001 From: Romain Lanz Date: Sun, 3 Sep 2017 13:46:22 +0200 Subject: [PATCH 12/85] fix(menu): fix the new boss Menu --- client/main.lua | 4 ++-- locales/fr.lua | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/client/main.lua b/client/main.lua index 5dfa393a..ae3cf641 100644 --- a/client/main.lua +++ b/client/main.lua @@ -284,8 +284,8 @@ function OpenRecruitMenu(society) { title = _U('do_you_want_to_recruit', data.current.name), elements = { - {label = _U('yes'), value = 'no'}, - {label = _U('no'), value = 'yes'}, + {label = _U('yes'), value = 'yes'}, + {label = _U('no'), value = 'no'}, } }, function(data2, menu2) diff --git a/locales/fr.lua b/locales/fr.lua index fb3f07a1..6b388e3e 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -3,6 +3,7 @@ Locales['fr'] = { ['actions'] = 'actions', ['deposit_amount'] = 'montant du dépôt', ['deposit_society_money'] = 'déposer argent société', + ['do_you_want_to_recruit'] = 'Voulez-vous recruter ~g~ ?', ['employee'] = 'employé', ['employee_list'] = 'liste des employés', ['employee_management'] = 'gestion employés', From b92f0ffebd38a6a9c382b1651dd642e412a8e535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Sun, 3 Sep 2017 13:54:36 +0200 Subject: [PATCH 13/85] Fix translation + fix setJob --- locales/fr.lua | 2 +- server/main.lua | 29 +++++++++++++---------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/locales/fr.lua b/locales/fr.lua index 6b388e3e..1ab0af24 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -3,7 +3,7 @@ Locales['fr'] = { ['actions'] = 'actions', ['deposit_amount'] = 'montant du dépôt', ['deposit_society_money'] = 'déposer argent société', - ['do_you_want_to_recruit'] = 'Voulez-vous recruter ~g~ ?', + ['do_you_want_to_recruit'] = 'Voulez-vous recruter %s ?', ['employee'] = 'employé', ['employee_list'] = 'liste des employés', ['employee_management'] = 'gestion employés', diff --git a/server/main.lua b/server/main.lua index 3376af76..8ff83079 100644 --- a/server/main.lua +++ b/server/main.lua @@ -153,25 +153,22 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier local xPlayer = ESX.GetPlayerFromIdentifier(identifier) - if xPlayer == nil then - - MySQL.Async.execute( - 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', - { - ['@job'] = job, - ['@job_grade'] = grade, - ['@identifier'] = identifier - }, - function(rowsChanged) - cb() - end - ) - - else + if xPlayer ~= nil then xPlayer.setJob(job, grade) - cb() end + MySQL.Async.execute( + 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', + { + ['@job'] = job, + ['@job_grade'] = grade, + ['@identifier'] = identifier + }, + function(rowsChanged) + cb() + end + ) + end) ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) From 0442ee2c55a802b53edfd4fe168a38cd636d2a78 Mon Sep 17 00:00:00 2001 From: Romain Lanz Date: Sun, 3 Sep 2017 15:46:40 +0200 Subject: [PATCH 14/85] chore(ux): add some notifications --- client/main.lua | 12 +++++++++--- locales/fr.lua | 6 ++++++ server/main.lua | 10 +++++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/client/main.lua b/client/main.lua index ae3cf641..e45ab7d0 100644 --- a/client/main.lua +++ b/client/main.lua @@ -242,9 +242,11 @@ function OpenEmployeeList(society) if data.value == 'fire' then + TriggerEvent('esx:showNotification', _U('you_have_fired', employee.name)) + ESX.TriggerServerCallback('esx_society:setJob', function() OpenEmployeeList(society) - end, employee.identifier, 'unemployed', 0) + end, employee.identifier, 'unemployed', 0, 'fire') end @@ -294,9 +296,11 @@ function OpenRecruitMenu(society) if data2.current.value == 'yes' then + TriggerEvent('esx:showNotification', _U('you_have_hired', data.current.name)) + ESX.TriggerServerCallback('esx_society:setJob', function() OpenRecruitMenu(society) - end, data.current.identifier, society, 0) + end, data.current.identifier, society, 0, 'hire') end @@ -336,9 +340,11 @@ function OpenPromoteMenu(society, employee) function(data, menu) menu.close() + TriggerEvent('esx:showNotification', _U('you_have_promoted', employee.name, data.current.label)) + ESX.TriggerServerCallback('esx_society:setJob', function() OpenEmployeeList(society) - end, employee.identifier, society, data.current.value) + end, employee.identifier, society, data.current.value, promote) end, function(data, menu) diff --git a/locales/fr.lua b/locales/fr.lua index 1ab0af24..d017ad05 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -27,5 +27,11 @@ Locales['fr'] = { ['yes'] = 'oui', ['you_have'] = 'vous avez ~g~$', ['you_have_laundered'] = 'vous avez ~r~blanchi~s~ votre argent : ~g~$', + ['you_have_hired'] = 'Vous avez recruté %s', + ['you_have_been_hired'] = 'Vous avez été recruté dans la société %s', + ['you_have_fired'] = 'Vous avez viré %s', + ['you_have_been_fired'] = 'Vous avez été viré de la société %s', + ['you_have_promoted'] = 'Vous avez promu %s en tant que %s', + ['you_have_been_promoted'] = 'Vous avez été promu', } diff --git a/server/main.lua b/server/main.lua index 8ff83079..9460a9a0 100644 --- a/server/main.lua +++ b/server/main.lua @@ -149,10 +149,18 @@ ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) end) -ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade) +ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade, type) local xPlayer = ESX.GetPlayerFromIdentifier(identifier) + if type == 'hire' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_hired', job)) + elseif type == 'promote' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_promoted')) + elseif type == 'fire' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_fired', xPlayer.getJob().label)) + end + if xPlayer ~= nil then xPlayer.setJob(job, grade) end From 8ce41bf33acddb0087b852a01f5eea17e8388ab4 Mon Sep 17 00:00:00 2001 From: nearbyplayer Date: Sun, 3 Sep 2017 16:21:16 -0400 Subject: [PATCH 15/85] Update multi-language support Update multi-language support --- locales/en.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/locales/en.lua b/locales/en.lua index d60fd62c..f24eb7e3 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -3,6 +3,7 @@ Locales['en'] = { ['actions'] = 'actions', ['deposit_amount'] = 'deposit amount', ['deposit_society_money'] = 'deposit society money', + ['do_you_want_to_recruit'] = 'do you want to recruit %s?', ['employee'] = 'employee', ['employee_list'] = 'employee list', ['employee_management'] = 'employee management', @@ -26,5 +27,11 @@ Locales['en'] = { ['yes'] = 'yes', ['you_have'] = 'you have ~g~$', ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', + ['you_have_hired'] = 'you have recruited %s', + ['you_have_been_hired'] = 'you have been hired by %s', + ['you_have_fired'] = 'you have fired %s', + ['you_have_been_fired'] = 'you have been fired from %s', + ['you_have_promoted'] = 'you have promoted %s as %s', + ['you_have_been_promoted'] = 'you have been promoted', } From c8e4d47bf2ef4cc6557586e50e9efbe44632ce79 Mon Sep 17 00:00:00 2001 From: Romain Lanz Date: Mon, 4 Sep 2017 10:25:51 +0200 Subject: [PATCH 16/85] fix(notification):parameter should be a string --- client/main.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/main.lua b/client/main.lua index e45ab7d0..d74b79b2 100644 --- a/client/main.lua +++ b/client/main.lua @@ -344,7 +344,7 @@ function OpenPromoteMenu(society, employee) ESX.TriggerServerCallback('esx_society:setJob', function() OpenEmployeeList(society) - end, employee.identifier, society, data.current.value, promote) + end, employee.identifier, society, data.current.value, 'promote') end, function(data, menu) @@ -460,4 +460,4 @@ end) AddEventHandler('esx_society:openBossMenu', function(society, close, options) OpenBossMenu(society, close, options) -end) \ No newline at end of file +end) From f01d89abf2a5dc3315703a5c7002a90b95757a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Sat, 9 Sep 2017 16:33:23 +0200 Subject: [PATCH 17/85] Add per-society garage support --- server/main.lua | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/server/main.lua b/server/main.lua index 9460a9a0..e8e47b71 100644 --- a/server/main.lua +++ b/server/main.lua @@ -3,6 +3,18 @@ Jobs = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) +function stringsplit(inputstr, sep) + if sep == nil then + sep = "%s" + end + local t={} ; i=1 + for str in string.gmatch(inputstr, "([^"..sep.."]+)") do + t[i] = str + i = i + 1 + end + return t +end + AddEventHandler('onMySQLReady', function() local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) @@ -20,6 +32,35 @@ AddEventHandler('onMySQLReady', function() end) +AddEventHandler('esx_society:getSocieties', function(cb) + + MySQL.Async.fetchAll( + 'SELECT * FROM addon_account WHERE name LIKE "%society_%"', + {}, + function(results) + + local societies = {} + + for i=1, #results, 1 do + + local buff = stringsplit(results[i].name, '_') + local society = buff[2] + + table.insert(societies, { + name = society, + label = results[i].label + }) + + end + + cb(societies) + + end + ) + +end) + + RegisterServerEvent('esx_society:withdrawMoney') AddEventHandler('esx_society:withdrawMoney', function(society, amount) @@ -90,6 +131,37 @@ AddEventHandler('esx_society:washMoney', function(society, amount) end) +RegisterServerEvent('esx_society:putVehicleInGarage') +AddEventHandler('esx_society:putVehicleInGarage', function(society, vehicle) + + TriggerEvent('esx_datastore:getSharedDataStore', 'society_' .. society, function(store) + local garage = store.get('garage') or {} + table.insert(garage, vehicle) + store.set('garage', garage) + end) + +end) + +RegisterServerEvent('esx_society:removeVehicleFromGarage') +AddEventHandler('esx_society:removeVehicleFromGarage', function(society, vehicle) + + TriggerEvent('esx_datastore:getSharedDataStore', 'society_' .. society, function(store) + + local garage = store.get('garage') or {} + + for i=1, #garage, 1 do + if garage[i].plate == vehicle.plate then + table.remove(garage, i) + break + end + end + + store.set('garage', garage) + + end) + +end) + ESX.RegisterServerCallback('esx_society:getAccountMoney', function(source, cb, account) TriggerEvent('esx_addonaccount:getSharedAccount', account, function(account) cb(account.money) @@ -232,6 +304,15 @@ ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) end) +ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, cb, society) + + TriggerEvent('esx_datastore:getSharedDataStore', 'society_' .. society, function(store) + local garage = store.get('garage') or {} + cb(garage) + end) + +end) + function WashMoneyCRON(d, h, m) MySQL.Async.fetchAll( From f82cf6bb228e8e23a8e5e236acb623e13ad84d61 Mon Sep 17 00:00:00 2001 From: renaiku Date: Sat, 9 Sep 2017 19:35:45 +0200 Subject: [PATCH 18/85] bugfix --- server/main.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/main.lua b/server/main.lua index e8e47b71..13b89523 100644 --- a/server/main.lua +++ b/server/main.lua @@ -327,8 +327,8 @@ function WashMoneyCRON(d, h, m) local foundPlayer = false local xPlayer = nil - for i=1, #xPlayers, 1 do - local xPlayer2 = ESX.GetPlayerFromId(xPlayers[i]) + for j=1, #xPlayers, 1 do + local xPlayer2 = ESX.GetPlayerFromId(xPlayers[j]) if xPlayer2.identifier == result[i].identifier then foundPlayer = true xPlayer = xPlayer2 From de6e240e3304a95d45db6c6ff984d3a7c66b8cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Wed, 13 Sep 2017 14:40:43 +0200 Subject: [PATCH 19/85] Add registerSociety event --- client/main.lua | 8 ++-- server/main.lua | 106 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 74 insertions(+), 40 deletions(-) diff --git a/client/main.lua b/client/main.lua index d74b79b2..cdf957ee 100644 --- a/client/main.lua +++ b/client/main.lua @@ -422,9 +422,9 @@ AddEventHandler('esx:playerLoaded', function(xPlayer) EnableSocietyMoneyHUDElement() - ESX.TriggerServerCallback('esx_society:getAccountMoney', function(money) + ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) UpdateSocietyMoneyHUDElement(money) - end, 'society_' .. PlayerData.job.name) + end, PlayerData.job.name) end @@ -441,9 +441,9 @@ AddEventHandler('esx:setJob', function(job) EnableSocietyMoneyHUDElement() - ESX.TriggerServerCallback('esx_society:getAccountMoney', function(money) + ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) UpdateSocietyMoneyHUDElement(money) - end, 'society_' .. PlayerData.job.name) + end, PlayerData.job.name) end diff --git a/server/main.lua b/server/main.lua index 13b89523..7c80a08f 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,5 +1,6 @@ -ESX = nil -Jobs = {} +ESX = nil +Jobs = {} +RegisteredSocieties = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) @@ -15,6 +16,14 @@ function stringsplit(inputstr, sep) return t end +function GetSociety(name) + for i=1, #RegisteredSocieties, 1 do + if RegisteredSocieties[i].name == name then + return RegisteredSocieties[i] + end + end +end + AddEventHandler('onMySQLReady', function() local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) @@ -32,41 +41,48 @@ AddEventHandler('onMySQLReady', function() end) -AddEventHandler('esx_society:getSocieties', function(cb) +AddEventHandler('esx_society:registerSociety', function(name, label, account, datastore, inventory, data) - MySQL.Async.fetchAll( - 'SELECT * FROM addon_account WHERE name LIKE "%society_%"', - {}, - function(results) + local found = false - local societies = {} - - for i=1, #results, 1 do - - local buff = stringsplit(results[i].name, '_') - local society = buff[2] - - table.insert(societies, { - name = society, - label = results[i].label - }) - - end - - cb(societies) + local society = { + name = name, + label = label, + account = account, + datastore = datastore, + inventory = inventory, + data = data, + } + for i=1, #RegisteredSocieties, 1 do + if RegisteredSocieties[i].name == name then + found = true + RegisteredSocieties[i] = society + break end - ) + end + + if not found then + table.insert(RegisteredSocieties, society) + end end) +AddEventHandler('esx_society:getSocieties', function(cb) + cb(RegisteredSocieties) +end) + +AddEventHandler('esx_society:getSociety', function(name, cb) + cb(GetSociety(name)) +end) RegisterServerEvent('esx_society:withdrawMoney') AddEventHandler('esx_society:withdrawMoney', function(society, amount) local xPlayer = ESX.GetPlayerFromId(source) + local society = GetSociety(society) - TriggerEvent('esx_addonaccount:getSharedAccount', 'society_' .. society, function(account) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) if amount > 0 and account.money >= amount then @@ -87,10 +103,11 @@ RegisterServerEvent('esx_society:depositMoney') AddEventHandler('esx_society:depositMoney', function(society, amount) local xPlayer = ESX.GetPlayerFromId(source) + local society = GetSociety(society) if amount > 0 and xPlayer.get('money') >= amount then - TriggerEvent('esx_addonaccount:getSharedAccount', 'society_' .. society, function(account) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) xPlayer.removeMoney(amount) account.addMoney(amount) end) @@ -132,9 +149,11 @@ AddEventHandler('esx_society:washMoney', function(society, amount) end) RegisterServerEvent('esx_society:putVehicleInGarage') -AddEventHandler('esx_society:putVehicleInGarage', function(society, vehicle) +AddEventHandler('esx_society:putVehicleInGarage', function(societyName, vehicle) - TriggerEvent('esx_datastore:getSharedDataStore', 'society_' .. society, function(store) + local society = GetSociety(societyName) + + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} table.insert(garage, vehicle) store.set('garage', garage) @@ -143,9 +162,11 @@ AddEventHandler('esx_society:putVehicleInGarage', function(society, vehicle) end) RegisterServerEvent('esx_society:removeVehicleFromGarage') -AddEventHandler('esx_society:removeVehicleFromGarage', function(society, vehicle) +AddEventHandler('esx_society:removeVehicleFromGarage', function(societyName, vehicle) - TriggerEvent('esx_datastore:getSharedDataStore', 'society_' .. society, function(store) + local society = GetSociety(societyName) + + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} @@ -162,10 +183,20 @@ AddEventHandler('esx_society:removeVehicleFromGarage', function(society, vehicle end) -ESX.RegisterServerCallback('esx_society:getAccountMoney', function(source, cb, account) - TriggerEvent('esx_addonaccount:getSharedAccount', account, function(account) - cb(account.money) - end) +ESX.RegisterServerCallback('esx_society:getSocietyMoney', function(source, cb, societyName) + + local society = GetSociety(societyName) + + if society ~= nil then + + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + cb(account.money) + end) + + else + cb(0) + end + end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) @@ -304,9 +335,11 @@ ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) end) -ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, cb, society) +ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, cb, societyName) - TriggerEvent('esx_datastore:getSharedDataStore', 'society_' .. society, function(store) + local society = GetSociety(societyName) + + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} cb(garage) end) @@ -326,6 +359,7 @@ function WashMoneyCRON(d, h, m) local foundPlayer = false local xPlayer = nil + local society = GetSociety(result[i].society) for j=1, #xPlayers, 1 do local xPlayer2 = ESX.GetPlayerFromId(xPlayers[j]) @@ -335,7 +369,7 @@ function WashMoneyCRON(d, h, m) end end - TriggerEvent('esx_addonaccount:getSharedAccount', 'society_' .. result[i].society, function(account) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) account.addMoney(result[i].amount) end) From 2fa1ff9ff487ca5ec0d84ed88d0c8a18115de007 Mon Sep 17 00:00:00 2001 From: Romain Lanz Date: Thu, 14 Sep 2017 21:21:24 +0200 Subject: [PATCH 20/85] chore(coding-style): correct indentation --- __resource.lua | 30 +-- client/main.lua | 616 ++++++++++++++++++++++++------------------------ locales/br.lua | 54 ++--- locales/de.lua | 12 +- locales/en.lua | 68 +++--- locales/fr.lua | 58 +++-- server/main.lua | 446 +++++++++++++++++------------------ 7 files changed, 638 insertions(+), 646 deletions(-) diff --git a/__resource.lua b/__resource.lua index 78593c6c..baa68b62 100644 --- a/__resource.lua +++ b/__resource.lua @@ -3,22 +3,22 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX Society' server_scripts { - '@mysql-async/lib/MySQL.lua', - '@es_extended/locale.lua', - 'locales/de.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fr.lua', - 'config.lua', - 'server/main.lua' + '@mysql-async/lib/MySQL.lua', + '@es_extended/locale.lua', + 'locales/de.lua', + 'locales/br.lua', + 'locales/en.lua', + 'locales/fr.lua', + 'config.lua', + 'server/main.lua' } client_scripts { - '@es_extended/locale.lua', - 'locales/de.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fr.lua', - 'config.lua', - 'client/main.lua' + '@es_extended/locale.lua', + 'locales/de.lua', + 'locales/br.lua', + 'locales/en.lua', + 'locales/fr.lua', + 'config.lua', + 'client/main.lua' } diff --git a/client/main.lua b/client/main.lua index cdf957ee..5a39d5c5 100644 --- a/client/main.lua +++ b/client/main.lua @@ -3,461 +3,461 @@ local PlayerData = {} local base64MoneyIcon = 'data:image/png;base64,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/GMzLdsAADhgaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6MDk6MTUgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0xMC0wOVQyMDoxNDo0NyswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMTAtMDlUMjA6MTQ6NDcrMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NmZkNGVlNjgtOWU3Mi1jYTQxLTg5NjMtMWRjMmI2M2EzYWExPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2ZmQ0ZWU2OC05ZTcyLWNhNDEtODk2My0xZGMyYjYzYTNhYTE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj45NjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTgwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjE4MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg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' Citizen.CreateThread(function() - while ESX == nil do - TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) - Citizen.Wait(0) - end + while ESX == nil do + TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + Citizen.Wait(0) + end end) function EnableSocietyMoneyHUDElement() - local societyMoneyHUDElementTpl = '
 {{money}}
' + local societyMoneyHUDElementTpl = '
 {{money}}
' - ESX.UI.HUD.RegisterElement('society_money', 3, 0, societyMoneyHUDElementTpl, { - money = 0 - }) + ESX.UI.HUD.RegisterElement('society_money', 3, 0, societyMoneyHUDElementTpl, { + money = 0 + }) end function DisableSocietyMoneyHUDElement() - ESX.UI.HUD.RemoveElement('society_money') + ESX.UI.HUD.RemoveElement('society_money') end function UpdateSocietyMoneyHUDElement(money) - ESX.UI.HUD.UpdateElement('society_money', { - money = money - }) + ESX.UI.HUD.UpdateElement('society_money', { + money = money + }) end function OpenBossMenu(society, close, options) - local options = options or {} - local elements = {} + local options = options or {} + local elements = {} - local defaultOptions = { - withdraw = true, - deposit = true, - wash = true, - employees = true, - grades = true - } + local defaultOptions = { + withdraw = true, + deposit = true, + wash = true, + employees = true, + grades = true + } - for k,v in pairs(defaultOptions) do - if options[k] == nil then - options[k] = v - end - end + for k,v in pairs(defaultOptions) do + if options[k] == nil then + options[k] = v + end + end - if options.withdraw then - table.insert(elements, {label = _U('withdraw_society_money'), value = 'withdraw_society_money'}) - end + if options.withdraw then + table.insert(elements, {label = _U('withdraw_society_money'), value = 'withdraw_society_money'}) + end - if options.deposit then - table.insert(elements, {label = _U('deposit_society_money'), value = 'deposit_money'}) - end + if options.deposit then + table.insert(elements, {label = _U('deposit_society_money'), value = 'deposit_money'}) + end - if options.wash then - table.insert(elements, {label = _U('wash_money'), value = 'wash_money'}) - end + if options.wash then + table.insert(elements, {label = _U('wash_money'), value = 'wash_money'}) + end - if options.employees then - table.insert(elements, {label = _U('employee_management'), value = 'manage_employees'}) - end + if options.employees then + table.insert(elements, {label = _U('employee_management'), value = 'manage_employees'}) + end - if options.grades then - table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) - end + if options.grades then + table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'boss_actions_' .. society, - { - title = 'Patron', - elements = elements - }, - function(data, menu) + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'boss_actions_' .. society, + { + title = 'Patron', + elements = elements + }, + function(data, menu) - if data.current.value == 'withdraw_society_money' then + if data.current.value == 'withdraw_society_money' then - ESX.UI.Menu.Open( - 'dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, - { - title = _U('withdraw_amount') - }, - function(data, menu) + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, + { + title = _U('withdraw_amount') + }, + function(data, menu) - local amount = tonumber(data.value) + local amount = tonumber(data.value) - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:withdrawMoney', society, amount) - end + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:withdrawMoney', society, amount) + end - end, - function(data, menu) - menu.close() - end - ) + end, + function(data, menu) + menu.close() + end + ) - end + end - if data.current.value == 'deposit_money' then + if data.current.value == 'deposit_money' then - ESX.UI.Menu.Open( - 'dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, - { - title = _U('deposit_amount') - }, - function(data, menu) + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, + { + title = _U('deposit_amount') + }, + function(data, menu) - local amount = tonumber(data.value) + local amount = tonumber(data.value) - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:depositMoney', society, amount) - end + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:depositMoney', society, amount) + end - end, - function(data, menu) - menu.close() - end - ) + end, + function(data, menu) + menu.close() + end + ) - end + end - if data.current.value == 'wash_money' then + if data.current.value == 'wash_money' then - ESX.UI.Menu.Open( - 'dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, - { - title = _U('wash_money_amount') - }, - function(data, menu) + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, + { + title = _U('wash_money_amount') + }, + function(data, menu) - local amount = tonumber(data.value) + local amount = tonumber(data.value) - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:washMoney', society, amount) - end + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:washMoney', society, amount) + end - end, - function(data, menu) - menu.close() - end - ) + end, + function(data, menu) + menu.close() + end + ) - end + end - if data.current.value == 'manage_employees' then - OpenManageEmployeesMenu(society) - end + if data.current.value == 'manage_employees' then + OpenManageEmployeesMenu(society) + end - if data.current.value == 'manage_grades' then - OpenManageGradesMenu(society) - end + if data.current.value == 'manage_grades' then + OpenManageGradesMenu(society) + end - end, - function(data, menu) + end, + function(data, menu) - if close then - close(data, menu) - end + if close then + close(data, menu) + end - end - ) + end + ) end function OpenManageEmployeesMenu(society) - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'manage_employees_' .. society, - { - title = _U('employee_management'), - elements = { - {label = _U('employee_list'), value = 'employee_list'}, - {label = _U('recruit'), value = 'recruit'}, - } - }, - function(data, menu) + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'manage_employees_' .. society, + { + title = _U('employee_management'), + elements = { + {label = _U('employee_list'), value = 'employee_list'}, + {label = _U('recruit'), value = 'recruit'}, + } + }, + function(data, menu) - if data.current.value == 'employee_list' then - OpenEmployeeList(society) - end + if data.current.value == 'employee_list' then + OpenEmployeeList(society) + end - if data.current.value == 'recruit' then - OpenRecruitMenu(society) - end + if data.current.value == 'recruit' then + OpenRecruitMenu(society) + end - end, - function(data, menu) - menu.close() - end - ) + end, + function(data, menu) + menu.close() + end + ) end function OpenEmployeeList(society) - ESX.TriggerServerCallback('esx_society:getEmployees', function(employees) + ESX.TriggerServerCallback('esx_society:getEmployees', function(employees) - local elements = { - head = {_U('employee'), _U('grade'), _U('actions')}, - rows = {} - } + local elements = { + head = {_U('employee'), _U('grade'), _U('actions')}, + rows = {} + } - for i=1, #employees, 1 do + for i=1, #employees, 1 do - local gradeLabel = (employees[i].job.grade_label == '' and employees[i].job.label or employees[i].job.grade_label) + local gradeLabel = (employees[i].job.grade_label == '' and employees[i].job.label or employees[i].job.grade_label) - table.insert(elements.rows, { - data = employees[i], - cols = { - employees[i].name, - gradeLabel, - '{{' .. _U('promote') .. '|promote}} {{' .. _U('fire') .. '|fire}}' - } - }) - end + table.insert(elements.rows, { + data = employees[i], + cols = { + employees[i].name, + gradeLabel, + '{{' .. _U('promote') .. '|promote}} {{' .. _U('fire') .. '|fire}}' + } + }) + end - ESX.UI.Menu.Open( - 'list', GetCurrentResourceName(), 'employee_list_' .. society, - elements, - function(data, menu) + ESX.UI.Menu.Open( + 'list', GetCurrentResourceName(), 'employee_list_' .. society, + elements, + function(data, menu) - local employee = data.data + local employee = data.data - if data.value == 'promote' then - menu.close() - OpenPromoteMenu(society, employee) - end + if data.value == 'promote' then + menu.close() + OpenPromoteMenu(society, employee) + end - if data.value == 'fire' then + if data.value == 'fire' then TriggerEvent('esx:showNotification', _U('you_have_fired', employee.name)) - ESX.TriggerServerCallback('esx_society:setJob', function() - OpenEmployeeList(society) - end, employee.identifier, 'unemployed', 0, 'fire') + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenEmployeeList(society) + end, employee.identifier, 'unemployed', 0, 'fire') - end + end - end, - function(data, menu) - menu.close() - OpenManageEmployeesMenu(society) - end - ) + end, + function(data, menu) + menu.close() + OpenManageEmployeesMenu(society) + end + ) - end, society) + end, society) end function OpenRecruitMenu(society) - ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players) + ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players) - local elements = {} + local elements = {} - for i=1, #players, 1 do - if players[i].job.name ~= society then - table.insert(elements, {label = players[i].name, value = players[i].source, name = players[i].name, identifier = players[i].identifier}) - end - end + for i=1, #players, 1 do + if players[i].job.name ~= society then + table.insert(elements, {label = players[i].name, value = players[i].source, name = players[i].name, identifier = players[i].identifier}) + end + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'recruit_' .. society, - { - title = _U('recruiting'), - elements = elements - }, - function(data, menu) + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'recruit_' .. society, + { + title = _U('recruiting'), + elements = elements + }, + function(data, menu) - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'recruit_confirm_' .. society, - { - title = _U('do_you_want_to_recruit', data.current.name), - elements = { - {label = _U('yes'), value = 'yes'}, - {label = _U('no'), value = 'no'}, - } - }, - function(data2, menu2) + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'recruit_confirm_' .. society, + { + title = _U('do_you_want_to_recruit', data.current.name), + elements = { + {label = _U('yes'), value = 'yes'}, + {label = _U('no'), value = 'no'}, + } + }, + function(data2, menu2) - menu2.close() + menu2.close() - if data2.current.value == 'yes' then + if data2.current.value == 'yes' then TriggerEvent('esx:showNotification', _U('you_have_hired', data.current.name)) - ESX.TriggerServerCallback('esx_society:setJob', function() - OpenRecruitMenu(society) - end, data.current.identifier, society, 0, 'hire') + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenRecruitMenu(society) + end, data.current.identifier, society, 0, 'hire') - end + end - end, - function(data2, menu2) - menu2.close() - end - ) + end, + function(data2, menu2) + menu2.close() + end + ) - end, - function(data, menu) - menu.close() - end - ) + end, + function(data, menu) + menu.close() + end + ) - end) + end) end function OpenPromoteMenu(society, employee) - ESX.TriggerServerCallback('esx_society:getJob', function(job) + ESX.TriggerServerCallback('esx_society:getJob', function(job) - local elements = {} + local elements = {} - for i=1, #job.grades, 1 do - local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) - table.insert(elements, {label = gradeLabel, value = job.grades[i].grade, selected = (employee.job.grade == job.grades[i].grade)}) - end + for i=1, #job.grades, 1 do + local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, {label = gradeLabel, value = job.grades[i].grade, selected = (employee.job.grade == job.grades[i].grade)}) + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'promote_employee_' .. society, - { - title = _U('promote_employee', employee.name), - elements = elements - }, - function(data, menu) - menu.close() + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'promote_employee_' .. society, + { + title = _U('promote_employee', employee.name), + elements = elements + }, + function(data, menu) + menu.close() TriggerEvent('esx:showNotification', _U('you_have_promoted', employee.name, data.current.label)) - ESX.TriggerServerCallback('esx_society:setJob', function() - OpenEmployeeList(society) - end, employee.identifier, society, data.current.value, 'promote') + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenEmployeeList(society) + end, employee.identifier, society, data.current.value, 'promote') - end, - function(data, menu) - menu.close() - OpenEmployeeList(society) - end - ) + end, + function(data, menu) + menu.close() + OpenEmployeeList(society) + end + ) - end, society) + end, society) end function OpenManageGradesMenu(society) - ESX.TriggerServerCallback('esx_society:getJob', function(job) + ESX.TriggerServerCallback('esx_society:getJob', function(job) - local elements = {} + local elements = {} - for i=1, #job.grades, 1 do - local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) - table.insert(elements, {label = gradeLabel .. ' $' .. job.grades[i].salary, value = job.grades[i].grade}) - end + for i=1, #job.grades, 1 do + local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, {label = gradeLabel .. ' $' .. job.grades[i].salary, value = job.grades[i].grade}) + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'manage_grades_' .. society, - { - title = _U('salary_management'), - elements = elements - }, - function(data, menu) + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'manage_grades_' .. society, + { + title = _U('salary_management'), + elements = elements + }, + function(data, menu) - ESX.UI.Menu.Open( - 'dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, - { - title = _U('salary_amount') - }, - function(data2, menu2) + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, + { + title = _U('salary_amount') + }, + function(data2, menu2) - local amount = tonumber(data2.value) + local amount = tonumber(data2.value) - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu2.close() + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu2.close() - ESX.TriggerServerCallback('esx_society:setJobSalary', function() - OpenManageGradesMenu(society) - end, society, data.current.value, amount) - end + ESX.TriggerServerCallback('esx_society:setJobSalary', function() + OpenManageGradesMenu(society) + end, society, data.current.value, amount) + end - end, - function(data2, menu2) - menu2.close() - end - ) + end, + function(data2, menu2) + menu2.close() + end + ) - end, - function(data, menu) - menu.close() - end - ) + end, + function(data, menu) + menu.close() + end + ) - end, society) + end, society) end RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(xPlayer) - - PlayerData = xPlayer + + PlayerData = xPlayer - DisableSocietyMoneyHUDElement() + DisableSocietyMoneyHUDElement() - if PlayerData.job.grade_name == 'boss' then - - EnableSocietyMoneyHUDElement() - - ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) - UpdateSocietyMoneyHUDElement(money) - end, PlayerData.job.name) + if PlayerData.job.grade_name == 'boss' then + + EnableSocietyMoneyHUDElement() + + ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) + UpdateSocietyMoneyHUDElement(money) + end, PlayerData.job.name) - end + end end) RegisterNetEvent('esx:setJob') AddEventHandler('esx:setJob', function(job) - PlayerData.job = job + PlayerData.job = job - DisableSocietyMoneyHUDElement() + DisableSocietyMoneyHUDElement() - if PlayerData.job.grade_name == 'boss' then - - EnableSocietyMoneyHUDElement() - - ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) - UpdateSocietyMoneyHUDElement(money) - end, PlayerData.job.name) + if PlayerData.job.grade_name == 'boss' then + + EnableSocietyMoneyHUDElement() + + ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) + UpdateSocietyMoneyHUDElement(money) + end, PlayerData.job.name) - end + end end) RegisterNetEvent('esx_addonaccount:setMoney') AddEventHandler('esx_addonaccount:setMoney', function(society, money) - if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == society then - UpdateSocietyMoneyHUDElement(money) - end + if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == society then + UpdateSocietyMoneyHUDElement(money) + end end) AddEventHandler('esx_society:openBossMenu', function(society, close, options) - OpenBossMenu(society, close, options) + OpenBossMenu(society, close, options) end) diff --git a/locales/br.lua b/locales/br.lua index 3eace68c..558fb502 100644 --- a/locales/br.lua +++ b/locales/br.lua @@ -1,30 +1,28 @@ Locales['br'] = { - - ['actions'] = 'actions', - ['deposit_amount'] = 'deposit amount', - ['deposit_society_money'] = 'deposit society money', - ['employee'] = 'employee', - ['employee_list'] = 'employee list', - ['employee_management'] = 'employee management', - ['fire'] = 'fire', - ['grade'] = 'grade', - ['have_deposited'] = 'Você depositou ~r~$', - ['have_withdrawn'] = 'Você sacou ~g~$', - ['invalid_amount'] = 'invalid amount', - ['invalid_amount'] = 'Quantidade inválida', - ['no'] = 'no', - ['promote'] = 'promote', - ['promote_employee'] = 'promote %s', - ['recruit'] = 'recruit', - ['recruiting'] = 'recruiting', - ['salary_amount'] = 'salary amount', - ['salary_management'] = 'salary management', - ['wash_money'] = 'wash money', - ['wash_money_amount'] = 'amount to wash', - ['withdraw_amount'] = 'witdraw amount', - ['withdraw_society_money'] = 'withdraw society money', - ['yes'] = 'yes', - ['you_have'] = 'Você tem ~g~$', - ['you_have_laundered'] = 'Você ~r~lavou~s~ seu dinheiro: ~g~$', - + ['actions'] = 'actions', + ['deposit_amount'] = 'deposit amount', + ['deposit_society_money'] = 'deposit society money', + ['employee'] = 'employee', + ['employee_list'] = 'employee list', + ['employee_management'] = 'employee management', + ['fire'] = 'fire', + ['grade'] = 'grade', + ['have_deposited'] = 'Você depositou ~r~$', + ['have_withdrawn'] = 'Você sacou ~g~$', + ['invalid_amount'] = 'invalid amount', + ['invalid_amount'] = 'Quantidade inválida', + ['no'] = 'no', + ['promote'] = 'promote', + ['promote_employee'] = 'promote %s', + ['recruit'] = 'recruit', + ['recruiting'] = 'recruiting', + ['salary_amount'] = 'salary amount', + ['salary_management'] = 'salary management', + ['wash_money'] = 'wash money', + ['wash_money_amount'] = 'amount to wash', + ['withdraw_amount'] = 'witdraw amount', + ['withdraw_society_money'] = 'withdraw society money', + ['yes'] = 'yes', + ['you_have'] = 'Você tem ~g~$', + ['you_have_laundered'] = 'Você ~r~lavou~s~ seu dinheiro: ~g~$', } diff --git a/locales/de.lua b/locales/de.lua index e5e45b05..baf2f5c7 100644 --- a/locales/de.lua +++ b/locales/de.lua @@ -1,9 +1,7 @@ Locales['de'] = { - - ['have_withdrawn'] = 'abgehoben ~g~$', - ['invalid_amount'] = 'ungültiger Betrag', - ['have_deposited'] = 'eingezahlt ~r~$', - ['you_have'] = 'du hast ~g~$', - ['you_have_laundered'] = 'du hast dein Geld ~r~gewaschen~s~: ~g~$', - + ['have_withdrawn'] = 'abgehoben ~g~$', + ['invalid_amount'] = 'ungültiger Betrag', + ['have_deposited'] = 'eingezahlt ~r~$', + ['you_have'] = 'du hast ~g~$', + ['you_have_laundered'] = 'du hast dein Geld ~r~gewaschen~s~: ~g~$', } diff --git a/locales/en.lua b/locales/en.lua index f24eb7e3..a2c446dc 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,37 +1,35 @@ Locales['en'] = { - - ['actions'] = 'actions', - ['deposit_amount'] = 'deposit amount', - ['deposit_society_money'] = 'deposit society money', - ['do_you_want_to_recruit'] = 'do you want to recruit %s?', - ['employee'] = 'employee', - ['employee_list'] = 'employee list', - ['employee_management'] = 'employee management', - ['fire'] = 'fire', - ['grade'] = 'grade', - ['have_deposited'] = 'you have deposited ~r~$', - ['have_withdrawn'] = 'you have withdrawn ~g~$', - ['invalid_amount'] = 'invalid amount', - ['invalid_amount'] = 'invalid amount', - ['no'] = 'no', - ['promote'] = 'promote', - ['promote_employee'] = 'promote %s', - ['recruit'] = 'recruit', - ['recruiting'] = 'recruiting', - ['salary_amount'] = 'salary amount', - ['salary_management'] = 'salary management', - ['wash_money'] = 'wash money', - ['wash_money_amount'] = 'amount to wash', - ['withdraw_amount'] = 'witdraw amount', - ['withdraw_society_money'] = 'withdraw society money', - ['yes'] = 'yes', - ['you_have'] = 'you have ~g~$', - ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', - ['you_have_hired'] = 'you have recruited %s', - ['you_have_been_hired'] = 'you have been hired by %s', - ['you_have_fired'] = 'you have fired %s', - ['you_have_been_fired'] = 'you have been fired from %s', - ['you_have_promoted'] = 'you have promoted %s as %s', - ['you_have_been_promoted'] = 'you have been promoted', - + ['actions'] = 'actions', + ['deposit_amount'] = 'deposit amount', + ['deposit_society_money'] = 'deposit society money', + ['do_you_want_to_recruit'] = 'do you want to recruit %s?', + ['employee'] = 'employee', + ['employee_list'] = 'employee list', + ['employee_management'] = 'employee management', + ['fire'] = 'fire', + ['grade'] = 'grade', + ['have_deposited'] = 'you have deposited ~r~$', + ['have_withdrawn'] = 'you have withdrawn ~g~$', + ['invalid_amount'] = 'invalid amount', + ['invalid_amount'] = 'invalid amount', + ['no'] = 'no', + ['promote'] = 'promote', + ['promote_employee'] = 'promote %s', + ['recruit'] = 'recruit', + ['recruiting'] = 'recruiting', + ['salary_amount'] = 'salary amount', + ['salary_management'] = 'salary management', + ['wash_money'] = 'wash money', + ['wash_money_amount'] = 'amount to wash', + ['withdraw_amount'] = 'witdraw amount', + ['withdraw_society_money'] = 'withdraw society money', + ['yes'] = 'yes', + ['you_have'] = 'you have ~g~$', + ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', + ['you_have_hired'] = 'you have recruited %s', + ['you_have_been_hired'] = 'you have been hired by %s', + ['you_have_fired'] = 'you have fired %s', + ['you_have_been_fired'] = 'you have been fired from %s', + ['you_have_promoted'] = 'you have promoted %s as %s', + ['you_have_been_promoted'] = 'you have been promoted', } diff --git a/locales/fr.lua b/locales/fr.lua index d017ad05..b3e9a2ab 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -1,37 +1,35 @@ Locales['fr'] = { - - ['actions'] = 'actions', - ['deposit_amount'] = 'montant du dépôt', - ['deposit_society_money'] = 'déposer argent société', - ['do_you_want_to_recruit'] = 'Voulez-vous recruter %s ?', - ['employee'] = 'employé', - ['employee_list'] = 'liste des employés', - ['employee_management'] = 'gestion employés', - ['fire'] = 'licencier', - ['grade'] = 'grade', - ['have_deposited'] = 'vous avez déposé ~r~$', - ['have_withdrawn'] = 'vous avez retiré ~g~$', - ['invalid_amount'] = 'montant invalide', - ['invalid_amount'] = 'montant invalide', - ['no'] = 'non', - ['promote'] = 'promouvoir', - ['promote_employee'] = 'promouvoir %s', - ['recruit'] = 'recruter', - ['recruiting'] = 'recrutement', - ['salary_amount'] = 'montant du salaire', - ['salary_management'] = 'gestion salaires', - ['wash_money'] = 'blanchir argent', - ['wash_money_amount'] = 'montant à blanchir', - ['withdraw_amount'] = 'montant du retrait', - ['withdraw_society_money'] = 'retirer argent société', - ['yes'] = 'oui', - ['you_have'] = 'vous avez ~g~$', - ['you_have_laundered'] = 'vous avez ~r~blanchi~s~ votre argent : ~g~$', - ['you_have_hired'] = 'Vous avez recruté %s', + ['actions'] = 'actions', + ['deposit_amount'] = 'montant du dépôt', + ['deposit_society_money'] = 'déposer argent société', + ['do_you_want_to_recruit'] = 'Voulez-vous recruter %s ?', + ['employee'] = 'employé', + ['employee_list'] = 'liste des employés', + ['employee_management'] = 'gestion employés', + ['fire'] = 'licencier', + ['grade'] = 'grade', + ['have_deposited'] = 'vous avez déposé ~r~$', + ['have_withdrawn'] = 'vous avez retiré ~g~$', + ['invalid_amount'] = 'montant invalide', + ['invalid_amount'] = 'montant invalide', + ['no'] = 'non', + ['promote'] = 'promouvoir', + ['promote_employee'] = 'promouvoir %s', + ['recruit'] = 'recruter', + ['recruiting'] = 'recrutement', + ['salary_amount'] = 'montant du salaire', + ['salary_management'] = 'gestion salaires', + ['wash_money'] = 'blanchir argent', + ['wash_money_amount'] = 'montant à blanchir', + ['withdraw_amount'] = 'montant du retrait', + ['withdraw_society_money'] = 'retirer argent société', + ['yes'] = 'oui', + ['you_have'] = 'vous avez ~g~$', + ['you_have_laundered'] = 'vous avez ~r~blanchi~s~ votre argent : ~g~$', + ['you_have_hired'] = 'Vous avez recruté %s', ['you_have_been_hired'] = 'Vous avez été recruté dans la société %s', ['you_have_fired'] = 'Vous avez viré %s', ['you_have_been_fired'] = 'Vous avez été viré de la société %s', ['you_have_promoted'] = 'Vous avez promu %s en tant que %s', ['you_have_been_promoted'] = 'Vous avez été promu', - } diff --git a/server/main.lua b/server/main.lua index 7c80a08f..59e8f8a2 100644 --- a/server/main.lua +++ b/server/main.lua @@ -17,377 +17,377 @@ function stringsplit(inputstr, sep) end function GetSociety(name) - for i=1, #RegisteredSocieties, 1 do - if RegisteredSocieties[i].name == name then - return RegisteredSocieties[i] - end - end + for i=1, #RegisteredSocieties, 1 do + if RegisteredSocieties[i].name == name then + return RegisteredSocieties[i] + end + end end AddEventHandler('onMySQLReady', function() - local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) + local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) - for i=1, #result, 1 do - Jobs[result[i].name] = result[i] - Jobs[result[i].name].grades = {} - end + for i=1, #result, 1 do + Jobs[result[i].name] = result[i] + Jobs[result[i].name].grades = {} + end - local result2 = MySQL.Sync.fetchAll('SELECT * FROM job_grades', {}) + local result2 = MySQL.Sync.fetchAll('SELECT * FROM job_grades', {}) - for i=1, #result2, 1 do - Jobs[result2[i].job_name].grades[tostring(result2[i].grade)] = result2[i] - end + for i=1, #result2, 1 do + Jobs[result2[i].job_name].grades[tostring(result2[i].grade)] = result2[i] + end end) AddEventHandler('esx_society:registerSociety', function(name, label, account, datastore, inventory, data) - local found = false + local found = false - local society = { - name = name, - label = label, - account = account, - datastore = datastore, - inventory = inventory, - data = data, - } + local society = { + name = name, + label = label, + account = account, + datastore = datastore, + inventory = inventory, + data = data, + } - for i=1, #RegisteredSocieties, 1 do - if RegisteredSocieties[i].name == name then - found = true - RegisteredSocieties[i] = society - break - end - end + for i=1, #RegisteredSocieties, 1 do + if RegisteredSocieties[i].name == name then + found = true + RegisteredSocieties[i] = society + break + end + end - if not found then - table.insert(RegisteredSocieties, society) - end + if not found then + table.insert(RegisteredSocieties, society) + end end) AddEventHandler('esx_society:getSocieties', function(cb) - cb(RegisteredSocieties) + cb(RegisteredSocieties) end) AddEventHandler('esx_society:getSociety', function(name, cb) - cb(GetSociety(name)) + cb(GetSociety(name)) end) RegisterServerEvent('esx_society:withdrawMoney') AddEventHandler('esx_society:withdrawMoney', function(society, amount) - local xPlayer = ESX.GetPlayerFromId(source) - local society = GetSociety(society) + local xPlayer = ESX.GetPlayerFromId(source) + local society = GetSociety(society) - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - if amount > 0 and account.money >= amount then + if amount > 0 and account.money >= amount then - account.removeMoney(amount) - xPlayer.addMoney(amount) + account.removeMoney(amount) + xPlayer.addMoney(amount) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn') .. amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn') .. amount) - else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) - end + else + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + end - end) + end) end) RegisterServerEvent('esx_society:depositMoney') AddEventHandler('esx_society:depositMoney', function(society, amount) - local xPlayer = ESX.GetPlayerFromId(source) - local society = GetSociety(society) + local xPlayer = ESX.GetPlayerFromId(source) + local society = GetSociety(society) - if amount > 0 and xPlayer.get('money') >= amount then + if amount > 0 and xPlayer.get('money') >= amount then - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - xPlayer.removeMoney(amount) - account.addMoney(amount) - end) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + xPlayer.removeMoney(amount) + account.addMoney(amount) + end) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited') .. amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited') .. amount) - else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) - end + else + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + end end) RegisterServerEvent('esx_society:washMoney') AddEventHandler('esx_society:washMoney', function(society, amount) - local xPlayer = ESX.GetPlayerFromId(source) - local account = xPlayer.getAccount('black_money') + local xPlayer = ESX.GetPlayerFromId(source) + local account = xPlayer.getAccount('black_money') - if amount > 0 and account.money >= amount then + if amount > 0 and account.money >= amount then - xPlayer.removeAccountMoney('black_money', amount) + xPlayer.removeAccountMoney('black_money', amount) - MySQL.Async.execute( - 'INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', - { - ['@identifier'] = xPlayer.identifier, - ['@society'] = society, - ['@amount'] = amount - }, - function(rowsChanged) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have') .. amount .. '~s~ en attente de ~r~blanchiement~s~ (24h)') - end - ) + MySQL.Async.execute( + 'INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', + { + ['@identifier'] = xPlayer.identifier, + ['@society'] = society, + ['@amount'] = amount + }, + function(rowsChanged) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have') .. amount .. '~s~ en attente de ~r~blanchiement~s~ (24h)') + end + ) - else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) - end + else + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + end end) RegisterServerEvent('esx_society:putVehicleInGarage') AddEventHandler('esx_society:putVehicleInGarage', function(societyName, vehicle) - local society = GetSociety(societyName) + local society = GetSociety(societyName) - TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) - local garage = store.get('garage') or {} - table.insert(garage, vehicle) - store.set('garage', garage) - end) + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) + local garage = store.get('garage') or {} + table.insert(garage, vehicle) + store.set('garage', garage) + end) end) RegisterServerEvent('esx_society:removeVehicleFromGarage') AddEventHandler('esx_society:removeVehicleFromGarage', function(societyName, vehicle) - local society = GetSociety(societyName) + local society = GetSociety(societyName) - TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) - - local garage = store.get('garage') or {} + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) + + local garage = store.get('garage') or {} - for i=1, #garage, 1 do - if garage[i].plate == vehicle.plate then - table.remove(garage, i) - break - end - end + for i=1, #garage, 1 do + if garage[i].plate == vehicle.plate then + table.remove(garage, i) + break + end + end - store.set('garage', garage) + store.set('garage', garage) - end) + end) end) ESX.RegisterServerCallback('esx_society:getSocietyMoney', function(source, cb, societyName) - local society = GetSociety(societyName) + local society = GetSociety(societyName) - if society ~= nil then + if society ~= nil then - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - cb(account.money) - end) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + cb(account.money) + end) - else - cb(0) - end + else + cb(0) + end end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) - MySQL.Async.fetchAll( - 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', - { - ['@job'] = society - }, - function(result) + MySQL.Async.fetchAll( + 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', + { + ['@job'] = society + }, + function(result) - local employees = {} + local employees = {} - for i=1, #result, 1 do + for i=1, #result, 1 do - table.insert(employees, { - name = result[i].name, - identifier = result[i].identifier, - job = { - name = result[i].job, - label = Jobs[result[i].job].label, - grade = result[i].job_grade, - grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, - grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, - } - }) - end + table.insert(employees, { + name = result[i].name, + identifier = result[i].identifier, + job = { + name = result[i].job, + label = Jobs[result[i].job].label, + grade = result[i].job_grade, + grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, + grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, + } + }) + end - cb(employees) + cb(employees) - end - ) + end + ) end) ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) - local job = json.decode(json.encode(Jobs[society])) - local grades = {} + local job = json.decode(json.encode(Jobs[society])) + local grades = {} - for k,v in pairs(job.grades) do - table.insert(grades, v) - end + for k,v in pairs(job.grades) do + table.insert(grades, v) + end - table.sort(grades, function(a, b) - return a.grade < b.grade - end) + table.sort(grades, function(a, b) + return a.grade < b.grade + end) - job.grades = grades + job.grades = grades - cb(job) + cb(job) end) ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade, type) - local xPlayer = ESX.GetPlayerFromIdentifier(identifier) + local xPlayer = ESX.GetPlayerFromIdentifier(identifier) - if type == 'hire' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_hired', job)) - elseif type == 'promote' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_promoted')) - elseif type == 'fire' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_fired', xPlayer.getJob().label)) - end + if type == 'hire' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_hired', job)) + elseif type == 'promote' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_promoted')) + elseif type == 'fire' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_fired', xPlayer.getJob().label)) + end - if xPlayer ~= nil then - xPlayer.setJob(job, grade) - end + if xPlayer ~= nil then + xPlayer.setJob(job, grade) + end - MySQL.Async.execute( - 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', - { - ['@job'] = job, - ['@job_grade'] = grade, - ['@identifier'] = identifier - }, - function(rowsChanged) - cb() - end - ) + MySQL.Async.execute( + 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', + { + ['@job'] = job, + ['@job_grade'] = grade, + ['@identifier'] = identifier + }, + function(rowsChanged) + cb() + end + ) end) ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) - MySQL.Async.execute( - 'UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', - { - ['@salary'] = salary, - ['@job_name'] = job, - ['@grade'] = grade - }, - function(rowsChanged) + MySQL.Async.execute( + 'UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', + { + ['@salary'] = salary, + ['@job_name'] = job, + ['@grade'] = grade + }, + function(rowsChanged) - Jobs[job].grades[tostring(grade)].salary = salary + Jobs[job].grades[tostring(grade)].salary = salary - local xPlayers = ESX.GetPlayers() + local xPlayers = ESX.GetPlayers() - for i=1, #xPlayers, 1 do + for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) - if xPlayer.job.name == job and xPlayer.job.grade == grade then - xPlayer.setJob(job, grade) - end + if xPlayer.job.name == job and xPlayer.job.grade == grade then + xPlayer.setJob(job, grade) + end - end + end - cb() - end - ) + cb() + end + ) end) ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) - local xPlayers = ESX.GetPlayers() - local players = {} + local xPlayers = ESX.GetPlayers() + local players = {} - for i=1, #xPlayers, 1 do + for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) - table.insert(players, { - source = xPlayer.source, - identifier = xPlayer.identifier, - name = xPlayer.name, - job = xPlayer.job - }) + table.insert(players, { + source = xPlayer.source, + identifier = xPlayer.identifier, + name = xPlayer.name, + job = xPlayer.job + }) - end + end - cb(players) + cb(players) end) ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, cb, societyName) - local society = GetSociety(societyName) + local society = GetSociety(societyName) - TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) - local garage = store.get('garage') or {} - cb(garage) - end) + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) + local garage = store.get('garage') or {} + cb(garage) + end) end) function WashMoneyCRON(d, h, m) - MySQL.Async.fetchAll( - 'SELECT * FROM society_moneywash', - {}, - function(result) + MySQL.Async.fetchAll( + 'SELECT * FROM society_moneywash', + {}, + function(result) - local xPlayers = ESX.GetPlayers() + local xPlayers = ESX.GetPlayers() - for i=1, #result, 1 do + for i=1, #result, 1 do - local foundPlayer = false - local xPlayer = nil - local society = GetSociety(result[i].society) + local foundPlayer = false + local xPlayer = nil + local society = GetSociety(result[i].society) - for j=1, #xPlayers, 1 do - local xPlayer2 = ESX.GetPlayerFromId(xPlayers[j]) - if xPlayer2.identifier == result[i].identifier then - foundPlayer = true - xPlayer = xPlayer2 - end - end + for j=1, #xPlayers, 1 do + local xPlayer2 = ESX.GetPlayerFromId(xPlayers[j]) + if xPlayer2.identifier == result[i].identifier then + foundPlayer = true + xPlayer = xPlayer2 + end + end - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - account.addMoney(result[i].amount) - end) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + account.addMoney(result[i].amount) + end) - if foundPlayer then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered') .. result[i].amount) - end + if foundPlayer then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered') .. result[i].amount) + end - MySQL.Async.execute( - 'DELETE FROM society_moneywash WHERE id = @id', - { - ['@id'] = result[i].id - } - ) + MySQL.Async.execute( + 'DELETE FROM society_moneywash WHERE id = @id', + { + ['@id'] = result[i].id + } + ) - end + end - end - ) + end + ) end From fc2ae2a0b3485c71c7e99455906eea1eadf1d3d5 Mon Sep 17 00:00:00 2001 From: Romain Lanz Date: Thu, 14 Sep 2017 22:15:29 +0200 Subject: [PATCH 21/85] feat(identity): add identity support for employees' list --- config.lua | 5 ++-- server/main.lua | 68 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/config.lua b/config.lua index 56a8b5e9..2b025ec1 100644 --- a/config.lua +++ b/config.lua @@ -1,2 +1,3 @@ -Config = {} -Config.Locale = 'fr' +Config = {} +Config.Locale = 'fr' +Config.EnableESXIdentity = true diff --git a/server/main.lua b/server/main.lua index 59e8f8a2..578f7c70 100644 --- a/server/main.lua +++ b/server/main.lua @@ -201,35 +201,55 @@ end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) - MySQL.Async.fetchAll( - 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', - { - ['@job'] = society - }, - function(result) + if Config.EnableESXIdentity then + MySQL.Async.fetchAll( + 'SELECT characters.*, users.job, users.job_grade FROM characters JOIN users ON characters.identifier = users.identifier WHERE users.job = @job ORDER BY users.job_grade DESC', + { ['@job'] = society }, + function (results) + local employees = {} - local employees = {} + for i=1, #results, 1 do + table.insert(employees, { + name = results[i].firstname .. ' ' .. results[i].lastname, + identifier = results[i].identifier, + job = { + name = results[i].job, + label = Jobs[results[i].job].label, + grade = results[i].job_grade, + grade_name = Jobs[results[i].job].grades[tostring(results[i].job_grade)].name, + grade_label = Jobs[results[i].job].grades[tostring(results[i].job_grade)].label, + } + }) + end - for i=1, #result, 1 do - - table.insert(employees, { - name = result[i].name, - identifier = result[i].identifier, - job = { - name = result[i].job, - label = Jobs[result[i].job].label, - grade = result[i].job_grade, - grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, - grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, - } - }) + cb(employees) end + ) + else + MySQL.Async.fetchAll( + 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', + { ['@job'] = society }, + function (result) + local employees = {} - cb(employees) - - end - ) + for i=1, #result, 1 do + table.insert(employees, { + name = result[i].name, + identifier = result[i].identifier, + job = { + name = result[i].job, + label = Jobs[result[i].job].label, + grade = result[i].job_grade, + grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, + grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, + } + }) + end + cb(employees) + end + ) + end end) ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) From d90f5334878f6b73f380e69aae3f6ebc9ef1d912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Thu, 14 Sep 2017 23:18:41 +0200 Subject: [PATCH 22/85] Update LICENSE.txt --- LICENSE.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 30ace6a8..d215c267 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} + fxserver-esx_society + Copyright (C) 2015 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - {project} Copyright (C) {year} {fullname} + fxserver-esx_society Copyright (C) 2015 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. From a135475fbd73f9ee90d2a008dbb8766667c6dd19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Fri, 15 Sep 2017 15:23:02 +0200 Subject: [PATCH 23/85] chore(resource): Add version --- __resource.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/__resource.lua b/__resource.lua index baa68b62..d38c622a 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,6 +2,8 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX Society' +version '1.0.0' + server_scripts { '@mysql-async/lib/MySQL.lua', '@es_extended/locale.lua', From e9ef81d1d1a54b01b336e41133015be3918d1b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Tue, 19 Sep 2017 11:46:28 +0200 Subject: [PATCH 24/85] chore(config): Set Config.EnableESXIdentity to false --- __resource.lua | 2 +- config.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/__resource.lua b/__resource.lua index d38c622a..568f4562 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,7 +2,7 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX Society' -version '1.0.0' +version '1.0.1' server_scripts { '@mysql-async/lib/MySQL.lua', diff --git a/config.lua b/config.lua index 2b025ec1..4a91aa4a 100644 --- a/config.lua +++ b/config.lua @@ -1,3 +1,3 @@ Config = {} Config.Locale = 'fr' -Config.EnableESXIdentity = true +Config.EnableESXIdentity = false From 8b33477a2781b118c5a31342dc66c2cbefd6788c Mon Sep 17 00:00:00 2001 From: ArkSeyonet <31637812+ArkSeyonet@users.noreply.github.com> Date: Tue, 19 Sep 2017 12:33:47 -0500 Subject: [PATCH 25/85] Update main.lua --- server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/main.lua b/server/main.lua index 578f7c70..b0290e2b 100644 --- a/server/main.lua +++ b/server/main.lua @@ -203,7 +203,7 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci if Config.EnableESXIdentity then MySQL.Async.fetchAll( - 'SELECT characters.*, users.job, users.job_grade FROM characters JOIN users ON characters.identifier = users.identifier WHERE users.job = @job ORDER BY users.job_grade DESC', + 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', { ['@job'] = society }, function (results) local employees = {} From deb262cb1235c151b3677797b56c0ebbe8f3c49e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Tue, 19 Sep 2017 20:19:49 +0200 Subject: [PATCH 26/85] chore(version): Increment version --- __resource.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__resource.lua b/__resource.lua index 568f4562..9907c2b5 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,7 +2,7 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX Society' -version '1.0.1' +version '1.0.2' server_scripts { '@mysql-async/lib/MySQL.lua', From fa7623acd66ac50c50b19b9e5692fa935b5a305d Mon Sep 17 00:00:00 2001 From: n3x503 Date: Sat, 23 Dec 2017 13:24:01 +0100 Subject: [PATCH 27/85] Update main.lua Money Gitch Patched (line 388 ) Added Fix for salary, this patch fix the issue that the boss can change his salary to 100000000 or any other emplyee and actually get the money when the paycheck is given , now the limit is 3000 (max salary input) but you can always change it at the line 390. Dont forget to add in locals folder at your language a new line , that translate : invalid_amount_max . --- client/main.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/main.lua b/client/main.lua index 5a39d5c5..39590244 100644 --- a/client/main.lua +++ b/client/main.lua @@ -387,6 +387,8 @@ function OpenManageGradesMenu(society) if amount == nil then ESX.ShowNotification(_U('invalid_amount')) + elseif amount >= 3001 then + ESX.ShowNotification(_U('invalid_amount_max')) else menu2.close() From 7da05ca293c336a20b2b33084c524fa811b01553 Mon Sep 17 00:00:00 2001 From: Charly Date: Tue, 26 Dec 2017 00:11:58 +0100 Subject: [PATCH 28/85] Add Config.MaxSalary --- client/main.lua | 2 +- config.lua | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index 39590244..bc8228ba 100644 --- a/client/main.lua +++ b/client/main.lua @@ -387,7 +387,7 @@ function OpenManageGradesMenu(society) if amount == nil then ESX.ShowNotification(_U('invalid_amount')) - elseif amount >= 3001 then + elseif amount >= Config.MaxSalary then ESX.ShowNotification(_U('invalid_amount_max')) else menu2.close() diff --git a/config.lua b/config.lua index 4a91aa4a..48f54761 100644 --- a/config.lua +++ b/config.lua @@ -1,3 +1,4 @@ Config = {} Config.Locale = 'fr' Config.EnableESXIdentity = false +Config.MaxSalary = 3500 From b4b463b0a64ef2f4045a7d65a75a878068ed27d7 Mon Sep 17 00:00:00 2001 From: Don <30905704+ddh3@users.noreply.github.com> Date: Thu, 28 Dec 2017 08:58:10 -0800 Subject: [PATCH 29/85] chore(version): Increment version --- __resource.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__resource.lua b/__resource.lua index 9907c2b5..d22536d2 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,7 +2,7 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX Society' -version '1.0.2' +version '1.0.3' server_scripts { '@mysql-async/lib/MySQL.lua', From cafe006b708a0e8e118a10be1ac94b2867dc1f09 Mon Sep 17 00:00:00 2001 From: Vanheden <33155577+Vanheden@users.noreply.github.com> Date: Wed, 7 Mar 2018 14:56:22 +0100 Subject: [PATCH 30/85] Create sv.lua --- locales/sv.lua | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 locales/sv.lua diff --git a/locales/sv.lua b/locales/sv.lua new file mode 100644 index 00000000..ce351789 --- /dev/null +++ b/locales/sv.lua @@ -0,0 +1,35 @@ +Locales['sv'] = { + ['actions'] = 'handlingar ', + ['deposit_amount'] = 'insättningsbelopp', + ['deposit_society_money'] = 'insätt samhälls pengar', + ['do_you_want_to_recruit'] = 'Vill du anlita %s?', + ['employee'] = 'anställd', + ['employee_list'] = 'anställningslista', + ['employee_management'] = 'medarbetarhantering', + ['fire'] = 'sparka', + ['grade'] = 'grade', + ['have_deposited'] = 'du har satt in ~r~$', + ['have_withdrawn'] = 'du har tagit ut ~g~$', + ['invalid_amount'] = 'Ogiltigt belopp', + ['invalid_amount'] = 'Ogiltigt belopp', + ['no'] = 'nej', + ['promote'] = 'befodra', + ['promote_employee'] = 'befodra %s', + ['recruit'] = 'rekrytera', + ['recruiting'] = 'rekrytering', + ['salary_amount'] = 'lön belopp', + ['salary_management'] = 'lönhantering', + ['wash_money'] = 'tvätta pengar', + ['wash_money_amount'] = 'belopp att tvätta', + ['withdraw_amount'] = 'Ta ut summan', + ['withdraw_society_money'] = 'ta ut samhällspengar', + ['yes'] = 'ja', + ['you_have'] = 'du har ~g~$', + ['you_have_laundered'] = 'du har ~r~tvättat~s~ dina pengar: ~g~$', + ['you_have_hired'] = 'du har anställt %s', + ['you_have_been_hired'] = 'du har blivit anställd utav %s', + ['you_have_fired'] = 'du har blivit sparkad %s', + ['you_have_been_fired'] = 'du har blivit sparkad utav %s', + ['you_have_promoted'] = 'du har blivit befodrad %s som %s', + ['you_have_been_promoted'] = 'du har blivit befodrad', +} From 4961dba3f50a2b995a61b86457bc2fb4a5f05763 Mon Sep 17 00:00:00 2001 From: Vanheden <33155577+Vanheden@users.noreply.github.com> Date: Wed, 7 Mar 2018 14:56:51 +0100 Subject: [PATCH 31/85] Update __resource.lua --- __resource.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/__resource.lua b/__resource.lua index d22536d2..027124db 100644 --- a/__resource.lua +++ b/__resource.lua @@ -11,6 +11,7 @@ server_scripts { 'locales/br.lua', 'locales/en.lua', 'locales/fr.lua', + 'locales/sv.lua' 'config.lua', 'server/main.lua' } @@ -21,6 +22,7 @@ client_scripts { 'locales/br.lua', 'locales/en.lua', 'locales/fr.lua', + 'locales/sv.lua', 'config.lua', 'client/main.lua' } From ca895c4f09ae60d9ea8d320180088e98dd163a94 Mon Sep 17 00:00:00 2001 From: Vanheden <33155577+Vanheden@users.noreply.github.com> Date: Wed, 7 Mar 2018 14:57:42 +0100 Subject: [PATCH 32/85] Update __resource.lua --- __resource.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__resource.lua b/__resource.lua index 027124db..c89ac6cc 100644 --- a/__resource.lua +++ b/__resource.lua @@ -11,7 +11,7 @@ server_scripts { 'locales/br.lua', 'locales/en.lua', 'locales/fr.lua', - 'locales/sv.lua' + 'locales/sv.lua', 'config.lua', 'server/main.lua' } From 2a60ff3f1fb56fea1204ca61deb7cc4992cbc00c Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 8 Apr 2018 23:51:21 +0200 Subject: [PATCH 33/85] Fixed sending message to offline player (desc) - Fixed sending a message to offline players when they get promoted, fired or whatever. - Improved translation - fixed hardcoded message - improved translation with the usage of formatting --- config.lua | 2 +- locales/en.lua | 8 +++---- locales/fr.lua | 10 ++++----- locales/sv.lua | 18 ++++++++-------- server/main.lua | 56 ++++++++++++++++++++++++------------------------- 5 files changed, 47 insertions(+), 47 deletions(-) diff --git a/config.lua b/config.lua index 48f54761..2eb622be 100644 --- a/config.lua +++ b/config.lua @@ -1,4 +1,4 @@ Config = {} Config.Locale = 'fr' Config.EnableESXIdentity = false -Config.MaxSalary = 3500 +Config.MaxSalary = 3500 diff --git a/locales/en.lua b/locales/en.lua index a2c446dc..efd0157f 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -8,8 +8,8 @@ Locales['en'] = { ['employee_management'] = 'employee management', ['fire'] = 'fire', ['grade'] = 'grade', - ['have_deposited'] = 'you have deposited ~r~$', - ['have_withdrawn'] = 'you have withdrawn ~g~$', + ['have_deposited'] = 'you have deposited ~r~$%s~s~', + ['have_withdrawn'] = 'you have withdrawn ~g~$%s~s~', ['invalid_amount'] = 'invalid amount', ['invalid_amount'] = 'invalid amount', ['no'] = 'no', @@ -24,8 +24,8 @@ Locales['en'] = { ['withdraw_amount'] = 'witdraw amount', ['withdraw_society_money'] = 'withdraw society money', ['yes'] = 'yes', - ['you_have'] = 'you have ~g~$', - ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', + ['you_have'] = 'you have ~g~%s$~s~ waiting in ~y~money laundering~s~ (24h).', + ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$%s~s~', ['you_have_hired'] = 'you have recruited %s', ['you_have_been_hired'] = 'you have been hired by %s', ['you_have_fired'] = 'you have fired %s', diff --git a/locales/fr.lua b/locales/fr.lua index b3e9a2ab..1a77e30e 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -2,14 +2,14 @@ Locales['fr'] = { ['actions'] = 'actions', ['deposit_amount'] = 'montant du dépôt', ['deposit_society_money'] = 'déposer argent société', - ['do_you_want_to_recruit'] = 'Voulez-vous recruter %s ?', + ['do_you_want_to_recruit'] = 'Voulez-vous recruter %s?', ['employee'] = 'employé', ['employee_list'] = 'liste des employés', ['employee_management'] = 'gestion employés', ['fire'] = 'licencier', ['grade'] = 'grade', - ['have_deposited'] = 'vous avez déposé ~r~$', - ['have_withdrawn'] = 'vous avez retiré ~g~$', + ['have_deposited'] = 'vous avez déposé ~r~$%s~s~', + ['have_withdrawn'] = 'vous avez retiré ~g~$%s~s~', ['invalid_amount'] = 'montant invalide', ['invalid_amount'] = 'montant invalide', ['no'] = 'non', @@ -24,8 +24,8 @@ Locales['fr'] = { ['withdraw_amount'] = 'montant du retrait', ['withdraw_society_money'] = 'retirer argent société', ['yes'] = 'oui', - ['you_have'] = 'vous avez ~g~$', - ['you_have_laundered'] = 'vous avez ~r~blanchi~s~ votre argent : ~g~$', + ['you_have'] = 'vous avez ~g~$%s~s~ en attente de ~r~blanchiement~s~ (24h).', + ['you_have_laundered'] = 'vous avez ~r~blanchi~s~ votre argent : ~g~$%s~s~', ['you_have_hired'] = 'Vous avez recruté %s', ['you_have_been_hired'] = 'Vous avez été recruté dans la société %s', ['you_have_fired'] = 'Vous avez viré %s', diff --git a/locales/sv.lua b/locales/sv.lua index ce351789..f33b3792 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -8,8 +8,8 @@ Locales['sv'] = { ['employee_management'] = 'medarbetarhantering', ['fire'] = 'sparka', ['grade'] = 'grade', - ['have_deposited'] = 'du har satt in ~r~$', - ['have_withdrawn'] = 'du har tagit ut ~g~$', + ['have_deposited'] = 'du har satt in ~r~$%s~s~', + ['have_withdrawn'] = 'du har tagit ut ~g~$%s~s~', ['invalid_amount'] = 'Ogiltigt belopp', ['invalid_amount'] = 'Ogiltigt belopp', ['no'] = 'nej', @@ -24,12 +24,12 @@ Locales['sv'] = { ['withdraw_amount'] = 'Ta ut summan', ['withdraw_society_money'] = 'ta ut samhällspengar', ['yes'] = 'ja', - ['you_have'] = 'du har ~g~$', - ['you_have_laundered'] = 'du har ~r~tvättat~s~ dina pengar: ~g~$', - ['you_have_hired'] = 'du har anställt %s', + ['you_have'] = 'du har ~g~%s$~s~ som väntar på ~y~pengartvätt~s~ (24h).', + ['you_have_laundered'] = 'du har ~r~tvättat~s~ dina pengar: ~g~$%s~s~', + ['you_have_hired'] = 'du har anställt ~y~%s~s~', ['you_have_been_hired'] = 'du har blivit anställd utav %s', - ['you_have_fired'] = 'du har blivit sparkad %s', - ['you_have_been_fired'] = 'du har blivit sparkad utav %s', - ['you_have_promoted'] = 'du har blivit befodrad %s som %s', - ['you_have_been_promoted'] = 'du har blivit befodrad', + ['you_have_fired'] = 'du har ~r~sparkat~s~ ~y~%s~s~', + ['you_have_been_fired'] = 'du har blivit ~r~sparkad~s~ utav ~y~%s~s~', + ['you_have_promoted'] = 'du har befodrat ~y~%s~s~ till ~b~%s~s~', + ['you_have_been_promoted'] = 'du har blivit ~b~befodrad~s~', } diff --git a/server/main.lua b/server/main.lua index b0290e2b..85c5cf77 100644 --- a/server/main.lua +++ b/server/main.lua @@ -89,7 +89,7 @@ AddEventHandler('esx_society:withdrawMoney', function(society, amount) account.removeMoney(amount) xPlayer.addMoney(amount) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn') .. amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn', amount)) else TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) @@ -112,7 +112,7 @@ AddEventHandler('esx_society:depositMoney', function(society, amount) account.addMoney(amount) end) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited') .. amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited', amount)) else TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) @@ -138,7 +138,7 @@ AddEventHandler('esx_society:washMoney', function(society, amount) ['@amount'] = amount }, function(rowsChanged) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have') .. amount .. '~s~ en attente de ~r~blanchiement~s~ (24h)') + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have', amount)) end ) @@ -210,7 +210,7 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci for i=1, #results, 1 do table.insert(employees, { - name = results[i].firstname .. ' ' .. results[i].lastname, + name = results[i].firstname .. ' ' .. results[i].lastname, identifier = results[i].identifier, job = { name = results[i].job, @@ -274,31 +274,31 @@ end) ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade, type) - local xPlayer = ESX.GetPlayerFromIdentifier(identifier) + local xPlayer = ESX.GetPlayerFromIdentifier(identifier) - if type == 'hire' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_hired', job)) - elseif type == 'promote' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_promoted')) - elseif type == 'fire' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_fired', xPlayer.getJob().label)) - end + if xPlayer ~= nil then + xPlayer.setJob(job, grade) + + if type == 'hire' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_hired', job)) + elseif type == 'promote' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_promoted')) + elseif type == 'fire' then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_fired', xPlayer.getJob().label)) + end + end - if xPlayer ~= nil then - xPlayer.setJob(job, grade) - end - - MySQL.Async.execute( - 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', - { - ['@job'] = job, - ['@job_grade'] = grade, - ['@identifier'] = identifier - }, - function(rowsChanged) - cb() - end - ) + MySQL.Async.execute( + 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', + { + ['@job'] = job, + ['@job_grade'] = grade, + ['@identifier'] = identifier + }, + function(rowsChanged) + cb() + end + ) end) @@ -394,7 +394,7 @@ function WashMoneyCRON(d, h, m) end) if foundPlayer then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered') .. result[i].amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered', result[i].amount)) end MySQL.Async.execute( From 73f0a7cb1021c1222569c4d5e3be657f72ff965b Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 30 Apr 2018 22:50:02 +0200 Subject: [PATCH 34/85] Fixed aligment --- client/main.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/main.lua b/client/main.lua index bc8228ba..3bb622e2 100644 --- a/client/main.lua +++ b/client/main.lua @@ -74,6 +74,7 @@ function OpenBossMenu(society, close, options) 'default', GetCurrentResourceName(), 'boss_actions_' .. society, { title = 'Patron', + align = 'top-left', elements = elements }, function(data, menu) @@ -182,6 +183,7 @@ function OpenManageEmployeesMenu(society) 'default', GetCurrentResourceName(), 'manage_employees_' .. society, { title = _U('employee_management'), + align = 'top-left', elements = { {label = _U('employee_list'), value = 'employee_list'}, {label = _U('recruit'), value = 'recruit'}, @@ -277,6 +279,7 @@ function OpenRecruitMenu(society) 'default', GetCurrentResourceName(), 'recruit_' .. society, { title = _U('recruiting'), + align = 'top-left', elements = elements }, function(data, menu) @@ -285,6 +288,7 @@ function OpenRecruitMenu(society) 'default', GetCurrentResourceName(), 'recruit_confirm_' .. society, { title = _U('do_you_want_to_recruit', data.current.name), + align = 'top-left', elements = { {label = _U('yes'), value = 'yes'}, {label = _U('no'), value = 'no'}, @@ -335,6 +339,7 @@ function OpenPromoteMenu(society, employee) 'default', GetCurrentResourceName(), 'promote_employee_' .. society, { title = _U('promote_employee', employee.name), + align = 'top-left', elements = elements }, function(data, menu) @@ -372,6 +377,7 @@ function OpenManageGradesMenu(society) 'default', GetCurrentResourceName(), 'manage_grades_' .. society, { title = _U('salary_management'), + align = 'top-left', elements = elements }, function(data, menu) From fce1da377e335d5a6bac0d6fb987c3de44c7bb25 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 7 May 2018 22:14:59 +0200 Subject: [PATCH 35/85] Improved washing money code, README cleanup --- README.md | 53 ++++++++++++++++++++++++++++-------------- __resource.lua | 2 +- esx_society.sql | 13 +++++------ server/main.lua | 61 +++++++++++++++++-------------------------------- 4 files changed, 64 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 46c786af..b7e0f68f 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,38 @@ -# fxserver-esx_society -FXServer ESX Society +# esx_society -[REQUIREMENTS] +## Requirements +- [cron](https://github.com/ESX-Org/cron) +- [esx_addonaccount](https://github.com/ESX-Org/esx_addonaccount) -- cron => https://github.com/FXServer-ESX/fxserver-cron -- esx_addonaccount => https://github.com/FXServer-ESX/fxserver-esx_addonaccount +## Download & Installation -[INSTALLATION] - -1) CD in your resources/[esx] folder -2) Clone the repository +### Using [fvm](https://github.com/qlaffont/fvm-installer) ``` -git clone https://github.com/FXServer-ESX/fxserver-esx_society esx_society +fvm install --save --folder=esx esx-org/esx_society ``` -3) Import esx_society.sql in your database -4) Add this in your server.cfg : + +### Using Git +``` +cd resources +git clone https://github.com/ESX-Org/esx_society [esx]/esx_society +``` + +### Manually +- Download https://github.com/ESX-Org/esx_society/archive/master.zip +- Put it in the `[esx]` directory + +- Import `esx_society.sql` in your database +- Add this in your `server.cfg`: ``` start esx_society ``` -[EXPLANATION] -ESX Society works with addon accounts named 'society_xxx' like 'society_taxi' or 'society_realestateagent'. -If you job grade is 'boss', you will see the society_xxx money of your job showed in the HUD. +## Explanation +ESX Society works with addon accounts named 'society_xxx', for example 'society_taxi' or 'society_realestateagent'. If you job grade is 'boss' the society money will be displayed in your hud. -[USAGE] -``` +## Usage +```lua local society = 'taxi' local amount = 100 @@ -33,3 +40,15 @@ TriggerServerEvent('esx_society:withdrawMoney', society, amount) TriggerServerEvent('esx_society:depositMoney', society, amount) TriggerServerEvent('esx_society:washMoney', society, amount) ``` + +# Legal +### License +esx_society - societies for ESX + +Copyright (C) 2015-2018 Jérémie N'gadi + +This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. + +This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details. + +You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/. \ No newline at end of file diff --git a/__resource.lua b/__resource.lua index c89ac6cc..e1569c35 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,7 +2,7 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX Society' -version '1.0.3' +version '1.0.4' server_scripts { '@mysql-async/lib/MySQL.lua', diff --git a/esx_society.sql b/esx_society.sql index 6f2594d9..0e34e3ec 100644 --- a/esx_society.sql +++ b/esx_society.sql @@ -1,11 +1,10 @@ USE `essentialmode`; CREATE TABLE `society_moneywash` ( - - `id` int(11) NOT NULL AUTO_INCREMENT, - `identifier` varchar(60) NOT NULL, - `society` varchar(60) NOT NULL, - `amount` int(11) NOT NULL, - - PRIMARY KEY (`id`) + `id` int(11) NOT NULL AUTO_INCREMENT, + `identifier` varchar(60) NOT NULL, + `society` varchar(60) NOT NULL, + `amount` int(11) NOT NULL, + + PRIMARY KEY (`id`) ); diff --git a/server/main.lua b/server/main.lua index 85c5cf77..2fefcd13 100644 --- a/server/main.lua +++ b/server/main.lua @@ -366,49 +366,30 @@ ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, c end) -function WashMoneyCRON(d, h, m) +function WashMoneyCRON() + MySQL.Async.fetchAll( + 'SELECT * FROM society_moneywash', {}, + function(result) + for i=1, #result, 1 do - MySQL.Async.fetchAll( - 'SELECT * FROM society_moneywash', - {}, - function(result) + -- add society money + local society = GetSociety(result[i].society) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + account.addMoney(result[i].amount) + end) - local xPlayers = ESX.GetPlayers() - - for i=1, #result, 1 do - - local foundPlayer = false - local xPlayer = nil - local society = GetSociety(result[i].society) - - for j=1, #xPlayers, 1 do - local xPlayer2 = ESX.GetPlayerFromId(xPlayers[j]) - if xPlayer2.identifier == result[i].identifier then - foundPlayer = true - xPlayer = xPlayer2 - end - end - - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - account.addMoney(result[i].amount) - end) - - if foundPlayer then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered', result[i].amount)) - end - - MySQL.Async.execute( - 'DELETE FROM society_moneywash WHERE id = @id', - { - ['@id'] = result[i].id - } - ) - - end - - end - ) + -- send notification if player is online + local xPlayer = ESX.GetPlayerFromIdentifier(result[i].identifier) + if xPlayer ~= nil then + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered', result[i].amount)) + end + MySQL.Async.execute('DELETE FROM society_moneywash WHERE id = @id', + { + ['@id'] = result[i].id + }) + end + end) end TriggerEvent('cron:runAt', 3, 0, WashMoneyCRON) From 4dd3312d981d8f8da259cb16816c581ab9803e04 Mon Sep 17 00:00:00 2001 From: AdrineX Date: Tue, 12 Jun 2018 21:59:22 +0300 Subject: [PATCH 36/85] Add Finnish lang... --- __resource.lua | 2 ++ locales/fi.lua | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 locales/fi.lua diff --git a/__resource.lua b/__resource.lua index e1569c35..fd142eff 100644 --- a/__resource.lua +++ b/__resource.lua @@ -10,6 +10,7 @@ server_scripts { 'locales/de.lua', 'locales/br.lua', 'locales/en.lua', + 'locales/fi.lua', 'locales/fr.lua', 'locales/sv.lua', 'config.lua', @@ -21,6 +22,7 @@ client_scripts { 'locales/de.lua', 'locales/br.lua', 'locales/en.lua', + 'locales/fi.lua', 'locales/fr.lua', 'locales/sv.lua', 'config.lua', diff --git a/locales/fi.lua b/locales/fi.lua new file mode 100644 index 00000000..ecc9cdf7 --- /dev/null +++ b/locales/fi.lua @@ -0,0 +1,34 @@ +Locales['fi'] = { + ['actions'] = 'toiminnot', + ['deposit_amount'] = 'talletus summa', + ['deposit_society_money'] = 'talleta yritykselle rahaa', + ['employee'] = 'työntekijä', + ['employee_list'] = 'työntekijä lista', + ['employee_management'] = 'työntekijöiden hallinta', + ['fire'] = 'anna potkut', + ['grade'] = 'taso', + ['have_deposited'] = 'sinä talletit ~r~€', + ['have_withdrawn'] = 'sinä nostit ~g~€', + ['invalid_amount'] = 'virheellinen summa', + ['invalid_amount'] = 'virheellinen summa', + ['no'] = 'ei', + ['promote'] = 'ylennä', + ['promote_employee'] = 'ylennä henkilö %s', + ['recruit'] = 'rekrytoi', + ['recruiting'] = 'rekrytointi', + ['salary_amount'] = 'palkan määrä', + ['salary_management'] = 'palkan hallinta', + ['wash_money'] = 'pese rahaa', + ['wash_money_amount'] = 'pestävä määrä', + ['withdraw_amount'] = 'nostettava määrä', + ['withdraw_society_money'] = 'nosta yrityksen rahoja', + ['yes'] = 'kyllä', + ['you_have'] = 'sinulla on ~g~€', + ['you_have_laundered'] = 'olet ~r~pessyt~s~ rahojasi: ~g~€', + ['you_have_hired'] = 'sinä palkkasit henkilön %s', + ['you_have_been_hired'] = 'sinut on palkattu pelaajan %s toimesta', + ['you_have_fired'] = 'sinä annoit potkut pelaajalle %s', + ['you_have_been_fired'] = 'sinulle annettiin potkut työstä %s', + ['you_have_promoted'] = 'sinä ylensit henkilön %s arvolle %s', + ['you_have_been_promoted'] = 'sinut ylennettiin', +} From c33e755357f1692d96960c0439dcbb9cadf5ce65 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sat, 23 Jun 2018 01:42:26 +0200 Subject: [PATCH 37/85] Updated readme, closes #34 --- README.md | 6 ++++++ __resource.lua | 40 +++++++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index b7e0f68f..f5160a8f 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ git clone https://github.com/ESX-Org/esx_society [esx]/esx_society - Download https://github.com/ESX-Org/esx_society/archive/master.zip - Put it in the `[esx]` directory +## Installation - Import `esx_society.sql` in your database - Add this in your `server.cfg`: @@ -39,6 +40,11 @@ local amount = 100 TriggerServerEvent('esx_society:withdrawMoney', society, amount) TriggerServerEvent('esx_society:depositMoney', society, amount) TriggerServerEvent('esx_society:washMoney', society, amount) + + +TriggerEvent('esx_society:openBossMenu', society, function (data, menu) + menu.close() +end, {wash = false}) -- set custom options, e.g disable washing ``` # Legal diff --git a/__resource.lua b/__resource.lua index e1569c35..72bdf596 100644 --- a/__resource.lua +++ b/__resource.lua @@ -5,24 +5,30 @@ description 'ESX Society' version '1.0.4' server_scripts { - '@mysql-async/lib/MySQL.lua', - '@es_extended/locale.lua', - 'locales/de.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fr.lua', - 'locales/sv.lua', - 'config.lua', - 'server/main.lua' + '@mysql-async/lib/MySQL.lua', + '@es_extended/locale.lua', + 'locales/de.lua', + 'locales/br.lua', + 'locales/en.lua', + 'locales/fr.lua', + 'locales/sv.lua', + 'config.lua', + 'server/main.lua' } client_scripts { - '@es_extended/locale.lua', - 'locales/de.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fr.lua', - 'locales/sv.lua', - 'config.lua', - 'client/main.lua' + '@es_extended/locale.lua', + 'locales/de.lua', + 'locales/br.lua', + 'locales/en.lua', + 'locales/fr.lua', + 'locales/sv.lua', + 'config.lua', + 'client/main.lua' +} + +dependencies { + 'es_extended', + 'cron', + 'esx_addonaccount' } From 2bfb9ca3cfe869c87a8e4b32d977bd201e4f2f31 Mon Sep 17 00:00:00 2001 From: MajorMarcin Date: Thu, 28 Jun 2018 20:18:30 +0200 Subject: [PATCH 38/85] added Polish language --- locales/pl.lua | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 locales/pl.lua diff --git a/locales/pl.lua b/locales/pl.lua new file mode 100644 index 00000000..04b9c3f4 --- /dev/null +++ b/locales/pl.lua @@ -0,0 +1,34 @@ +Locales['pl'] = { + ['actions'] = 'Akcje', + ['deposit_amount'] = 'Ilość depozytu', + ['deposit_society_money'] = 'Zdeponuj społeczne pieniądze', + ['do_you_want_to_recruit'] = 'Czy chcesz zrekrutować %s?', + ['employee'] = 'Pracownik', + ['employee_list'] = 'Lista pracowników', + ['employee_management'] = 'Zarządzanie pracownikami', + ['fire'] = 'Zwolnij', + ['grade'] = 'Stopień', + ['have_deposited'] = 'Zdeponowałeś ~r~$%s~s~', + ['have_withdrawn'] = 'Wypłaciłeś ~g~$%s~s~', + ['invalid_amount'] = 'Nieprawidłowa wartość', + ['no'] = 'Nie', + ['promote'] = 'Awansuj', + ['promote_employee'] = 'Awansuj %s', + ['recruit'] = 'Zrekrutuj', + ['recruiting'] = 'Rekrutacja', + ['salary_amount'] = 'Wartość wynagrodzenia', + ['salary_management'] = 'Zarządzaj wynagrodzeniem', + ['wash_money'] = 'Wypierz pieniądze', + ['wash_money_amount'] = 'Wartość do wyprania', + ['withdraw_amount'] = 'Wartość wypłaty', + ['withdraw_society_money'] = 'Wypłać społeczne pieniądze', + ['yes'] = 'Tak', + ['you_have'] = '~g~%s$~s~ Czekasz ~y~w pralni pieniędzmi~s~ (24h).', + ['you_have_laundered'] = '~r~Wyprałeś~s~ Twoje pieniądze: ~g~$%s~s~', + ['you_have_hired'] = 'Zatrudniłeś %s', + ['you_have_been_hired'] = 'Zostałeś zatrudniony przez %s', + ['you_have_fired'] = 'Zwolniłeś %s', + ['you_have_been_fired'] = 'Zostałeś zwolniony %s', + ['you_have_promoted'] = 'Awansowałeś %s z %s', + ['you_have_been_promoted'] = 'Zostałeś awansowany', +} From a082854c9546de00f766956b9c6c301cea5d5c13 Mon Sep 17 00:00:00 2001 From: MajorMarcin Date: Thu, 28 Jun 2018 20:19:27 +0200 Subject: [PATCH 39/85] repeats removed in language files --- locales/en.lua | 1 - locales/fi.lua | 1 - locales/fr.lua | 1 - locales/sv.lua | 1 - 4 files changed, 4 deletions(-) diff --git a/locales/en.lua b/locales/en.lua index efd0157f..cf7cd373 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -11,7 +11,6 @@ Locales['en'] = { ['have_deposited'] = 'you have deposited ~r~$%s~s~', ['have_withdrawn'] = 'you have withdrawn ~g~$%s~s~', ['invalid_amount'] = 'invalid amount', - ['invalid_amount'] = 'invalid amount', ['no'] = 'no', ['promote'] = 'promote', ['promote_employee'] = 'promote %s', diff --git a/locales/fi.lua b/locales/fi.lua index ecc9cdf7..6be3b31b 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -10,7 +10,6 @@ Locales['fi'] = { ['have_deposited'] = 'sinä talletit ~r~€', ['have_withdrawn'] = 'sinä nostit ~g~€', ['invalid_amount'] = 'virheellinen summa', - ['invalid_amount'] = 'virheellinen summa', ['no'] = 'ei', ['promote'] = 'ylennä', ['promote_employee'] = 'ylennä henkilö %s', diff --git a/locales/fr.lua b/locales/fr.lua index 1a77e30e..b01d80de 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -11,7 +11,6 @@ Locales['fr'] = { ['have_deposited'] = 'vous avez déposé ~r~$%s~s~', ['have_withdrawn'] = 'vous avez retiré ~g~$%s~s~', ['invalid_amount'] = 'montant invalide', - ['invalid_amount'] = 'montant invalide', ['no'] = 'non', ['promote'] = 'promouvoir', ['promote_employee'] = 'promouvoir %s', diff --git a/locales/sv.lua b/locales/sv.lua index f33b3792..6a0c4d9b 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -11,7 +11,6 @@ Locales['sv'] = { ['have_deposited'] = 'du har satt in ~r~$%s~s~', ['have_withdrawn'] = 'du har tagit ut ~g~$%s~s~', ['invalid_amount'] = 'Ogiltigt belopp', - ['invalid_amount'] = 'Ogiltigt belopp', ['no'] = 'nej', ['promote'] = 'befodra', ['promote_employee'] = 'befodra %s', From 7b5e02f5b071d39fb6101ac5d21a0cc6ee86800c Mon Sep 17 00:00:00 2001 From: MajorMarcin Date: Sat, 30 Jun 2018 19:03:40 +0200 Subject: [PATCH 40/85] fix lowercase --- locales/pl.lua | 64 +++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/locales/pl.lua b/locales/pl.lua index 04b9c3f4..34223dc0 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -1,34 +1,34 @@ Locales['pl'] = { - ['actions'] = 'Akcje', - ['deposit_amount'] = 'Ilość depozytu', - ['deposit_society_money'] = 'Zdeponuj społeczne pieniądze', - ['do_you_want_to_recruit'] = 'Czy chcesz zrekrutować %s?', - ['employee'] = 'Pracownik', - ['employee_list'] = 'Lista pracowników', - ['employee_management'] = 'Zarządzanie pracownikami', - ['fire'] = 'Zwolnij', - ['grade'] = 'Stopień', - ['have_deposited'] = 'Zdeponowałeś ~r~$%s~s~', - ['have_withdrawn'] = 'Wypłaciłeś ~g~$%s~s~', - ['invalid_amount'] = 'Nieprawidłowa wartość', - ['no'] = 'Nie', - ['promote'] = 'Awansuj', - ['promote_employee'] = 'Awansuj %s', - ['recruit'] = 'Zrekrutuj', - ['recruiting'] = 'Rekrutacja', - ['salary_amount'] = 'Wartość wynagrodzenia', - ['salary_management'] = 'Zarządzaj wynagrodzeniem', - ['wash_money'] = 'Wypierz pieniądze', - ['wash_money_amount'] = 'Wartość do wyprania', - ['withdraw_amount'] = 'Wartość wypłaty', - ['withdraw_society_money'] = 'Wypłać społeczne pieniądze', - ['yes'] = 'Tak', - ['you_have'] = '~g~%s$~s~ Czekasz ~y~w pralni pieniędzmi~s~ (24h).', - ['you_have_laundered'] = '~r~Wyprałeś~s~ Twoje pieniądze: ~g~$%s~s~', - ['you_have_hired'] = 'Zatrudniłeś %s', - ['you_have_been_hired'] = 'Zostałeś zatrudniony przez %s', - ['you_have_fired'] = 'Zwolniłeś %s', - ['you_have_been_fired'] = 'Zostałeś zwolniony %s', - ['you_have_promoted'] = 'Awansowałeś %s z %s', - ['you_have_been_promoted'] = 'Zostałeś awansowany', + ['actions'] = 'akcje', + ['deposit_amount'] = 'ilość depozytu', + ['deposit_society_money'] = 'zdeponuj społeczne pieniądze', + ['do_you_want_to_recruit'] = 'czy chcesz zrekrutować %s?', + ['employee'] = 'pracownik', + ['employee_list'] = 'lista pracowników', + ['employee_management'] = 'zarządzanie pracownikami', + ['fire'] = 'zwolnij', + ['grade'] = 'stopień', + ['have_deposited'] = 'zdeponowałeś ~r~$%s~s~', + ['have_withdrawn'] = 'wypłaciłeś ~g~$%s~s~', + ['invalid_amount'] = 'nieprawidłowa wartość', + ['no'] = 'nie', + ['promote'] = 'awansuj', + ['promote_employee'] = 'awansuj %s', + ['recruit'] = 'zrekrutuj', + ['recruiting'] = 'rekrutacja', + ['salary_amount'] = 'wartość wynagrodzenia', + ['salary_management'] = 'zarządzaj wynagrodzeniem', + ['wash_money'] = 'wypierz pieniądze', + ['wash_money_amount'] = 'wartość do wyprania', + ['withdraw_amount'] = 'wartość wypłaty', + ['withdraw_society_money'] = 'wypłać społeczne pieniądze', + ['yes'] = 'tak', + ['you_have'] = '~g~%s$~s~ czekasz ~y~w pralni pieniędzmi~s~ (24h).', + ['you_have_laundered'] = '~r~wyprałeś~s~ twoje pieniądze: ~g~$%s~s~', + ['you_have_hired'] = 'zatrudniłeś %s', + ['you_have_been_hired'] = 'zostałeś zatrudniony przez %s', + ['you_have_fired'] = 'zwolniłeś %s', + ['you_have_been_fired'] = 'zostałeś zwolniony %s', + ['you_have_promoted'] = 'awansowałeś %s z %s', + ['you_have_been_promoted'] = 'zostałeś awansowany', } From e181830d6cfa67da44a68be355917557c176b474 Mon Sep 17 00:00:00 2001 From: MajorMarcin Date: Thu, 5 Jul 2018 18:19:01 +0200 Subject: [PATCH 41/85] polish translation --- locales/pl.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/pl.lua b/locales/pl.lua index 34223dc0..c1bc69c2 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -23,12 +23,12 @@ Locales['pl'] = { ['withdraw_amount'] = 'wartość wypłaty', ['withdraw_society_money'] = 'wypłać społeczne pieniądze', ['yes'] = 'tak', - ['you_have'] = '~g~%s$~s~ czekasz ~y~w pralni pieniędzmi~s~ (24h).', - ['you_have_laundered'] = '~r~wyprałeś~s~ twoje pieniądze: ~g~$%s~s~', + ['you_have'] = 'masz~g~%s$~s~ czekanie ~y~w pralni pieniędzmi~s~ (24h).', + ['you_have_laundered'] = '~r~Wyprałeś~s~ twoje pieniądze: ~g~$%s~s~', ['you_have_hired'] = 'zatrudniłeś %s', ['you_have_been_hired'] = 'zostałeś zatrudniony przez %s', ['you_have_fired'] = 'zwolniłeś %s', ['you_have_been_fired'] = 'zostałeś zwolniony %s', - ['you_have_promoted'] = 'awansowałeś %s z %s', + ['you_have_promoted'] = 'awansowałeś %s na %s', ['you_have_been_promoted'] = 'zostałeś awansowany', } From 905552ec2d5afe664a8b355cc738d9a0d0fd5726 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Fri, 13 Jul 2018 23:04:46 +0200 Subject: [PATCH 42/85] Removed incomplete locales --- __resource.lua | 4 ---- locales/br.lua | 28 ---------------------------- locales/de.lua | 7 ------- locales/fi.lua | 13 +++++++------ locales/pl.lua | 2 +- locales/sv.lua | 4 ++-- server/main.lua | 12 ------------ 7 files changed, 10 insertions(+), 60 deletions(-) delete mode 100644 locales/br.lua delete mode 100644 locales/de.lua diff --git a/__resource.lua b/__resource.lua index 03c18778..b317999e 100644 --- a/__resource.lua +++ b/__resource.lua @@ -7,8 +7,6 @@ version '1.0.4' server_scripts { '@mysql-async/lib/MySQL.lua', '@es_extended/locale.lua', - 'locales/de.lua', - 'locales/br.lua', 'locales/en.lua', 'locales/fi.lua', 'locales/fr.lua', @@ -19,8 +17,6 @@ server_scripts { client_scripts { '@es_extended/locale.lua', - 'locales/de.lua', - 'locales/br.lua', 'locales/en.lua', 'locales/fi.lua', 'locales/fr.lua', diff --git a/locales/br.lua b/locales/br.lua deleted file mode 100644 index 558fb502..00000000 --- a/locales/br.lua +++ /dev/null @@ -1,28 +0,0 @@ -Locales['br'] = { - ['actions'] = 'actions', - ['deposit_amount'] = 'deposit amount', - ['deposit_society_money'] = 'deposit society money', - ['employee'] = 'employee', - ['employee_list'] = 'employee list', - ['employee_management'] = 'employee management', - ['fire'] = 'fire', - ['grade'] = 'grade', - ['have_deposited'] = 'Você depositou ~r~$', - ['have_withdrawn'] = 'Você sacou ~g~$', - ['invalid_amount'] = 'invalid amount', - ['invalid_amount'] = 'Quantidade inválida', - ['no'] = 'no', - ['promote'] = 'promote', - ['promote_employee'] = 'promote %s', - ['recruit'] = 'recruit', - ['recruiting'] = 'recruiting', - ['salary_amount'] = 'salary amount', - ['salary_management'] = 'salary management', - ['wash_money'] = 'wash money', - ['wash_money_amount'] = 'amount to wash', - ['withdraw_amount'] = 'witdraw amount', - ['withdraw_society_money'] = 'withdraw society money', - ['yes'] = 'yes', - ['you_have'] = 'Você tem ~g~$', - ['you_have_laundered'] = 'Você ~r~lavou~s~ seu dinheiro: ~g~$', -} diff --git a/locales/de.lua b/locales/de.lua deleted file mode 100644 index baf2f5c7..00000000 --- a/locales/de.lua +++ /dev/null @@ -1,7 +0,0 @@ -Locales['de'] = { - ['have_withdrawn'] = 'abgehoben ~g~$', - ['invalid_amount'] = 'ungültiger Betrag', - ['have_deposited'] = 'eingezahlt ~r~$', - ['you_have'] = 'du hast ~g~$', - ['you_have_laundered'] = 'du hast dein Geld ~r~gewaschen~s~: ~g~$', -} diff --git a/locales/fi.lua b/locales/fi.lua index 6be3b31b..30b3854e 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -2,6 +2,7 @@ Locales['fi'] = { ['actions'] = 'toiminnot', ['deposit_amount'] = 'talletus summa', ['deposit_society_money'] = 'talleta yritykselle rahaa', + ['do_you_want_to_recruit'] = 'do you want to recruit %s?', ['employee'] = 'työntekijä', ['employee_list'] = 'työntekijä lista', ['employee_management'] = 'työntekijöiden hallinta', @@ -24,10 +25,10 @@ Locales['fi'] = { ['yes'] = 'kyllä', ['you_have'] = 'sinulla on ~g~€', ['you_have_laundered'] = 'olet ~r~pessyt~s~ rahojasi: ~g~€', - ['you_have_hired'] = 'sinä palkkasit henkilön %s', - ['you_have_been_hired'] = 'sinut on palkattu pelaajan %s toimesta', - ['you_have_fired'] = 'sinä annoit potkut pelaajalle %s', - ['you_have_been_fired'] = 'sinulle annettiin potkut työstä %s', - ['you_have_promoted'] = 'sinä ylensit henkilön %s arvolle %s', - ['you_have_been_promoted'] = 'sinut ylennettiin', + ['you_have_hired'] = 'sinä palkkasit henkilön %s', + ['you_have_been_hired'] = 'sinut on palkattu pelaajan %s toimesta', + ['you_have_fired'] = 'sinä annoit potkut pelaajalle %s', + ['you_have_been_fired'] = 'sinulle annettiin potkut työstä %s', + ['you_have_promoted'] = 'sinä ylensit henkilön %s arvolle %s', + ['you_have_been_promoted'] = 'sinut ylennettiin', } diff --git a/locales/pl.lua b/locales/pl.lua index c1bc69c2..fa571f34 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -23,7 +23,7 @@ Locales['pl'] = { ['withdraw_amount'] = 'wartość wypłaty', ['withdraw_society_money'] = 'wypłać społeczne pieniądze', ['yes'] = 'tak', - ['you_have'] = 'masz~g~%s$~s~ czekanie ~y~w pralni pieniędzmi~s~ (24h).', + ['you_have'] = 'masz ~g~%s$~s~ czekanie ~y~w pralni pieniędzmi~s~ (24h).', ['you_have_laundered'] = '~r~Wyprałeś~s~ twoje pieniądze: ~g~$%s~s~', ['you_have_hired'] = 'zatrudniłeś %s', ['you_have_been_hired'] = 'zostałeś zatrudniony przez %s', diff --git a/locales/sv.lua b/locales/sv.lua index 6a0c4d9b..a94513ff 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -2,7 +2,7 @@ Locales['sv'] = { ['actions'] = 'handlingar ', ['deposit_amount'] = 'insättningsbelopp', ['deposit_society_money'] = 'insätt samhälls pengar', - ['do_you_want_to_recruit'] = 'Vill du anlita %s?', + ['do_you_want_to_recruit'] = 'vill du anlita %s?', ['employee'] = 'anställd', ['employee_list'] = 'anställningslista', ['employee_management'] = 'medarbetarhantering', @@ -10,7 +10,7 @@ Locales['sv'] = { ['grade'] = 'grade', ['have_deposited'] = 'du har satt in ~r~$%s~s~', ['have_withdrawn'] = 'du har tagit ut ~g~$%s~s~', - ['invalid_amount'] = 'Ogiltigt belopp', + ['invalid_amount'] = 'ogiltigt belopp', ['no'] = 'nej', ['promote'] = 'befodra', ['promote_employee'] = 'befodra %s', diff --git a/server/main.lua b/server/main.lua index 2fefcd13..d61f5963 100644 --- a/server/main.lua +++ b/server/main.lua @@ -4,18 +4,6 @@ RegisteredSocieties = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) -function stringsplit(inputstr, sep) - if sep == nil then - sep = "%s" - end - local t={} ; i=1 - for str in string.gmatch(inputstr, "([^"..sep.."]+)") do - t[i] = str - i = i + 1 - end - return t -end - function GetSociety(name) for i=1, #RegisteredSocieties, 1 do if RegisteredSocieties[i].name == name then From 4f15bbd59dc64aaf87a0b5d727f9a1e2752117c0 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 14 Jul 2018 01:59:21 +0200 Subject: [PATCH 43/85] add pl to __resource --- __resource.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/__resource.lua b/__resource.lua index b317999e..69f31ce0 100644 --- a/__resource.lua +++ b/__resource.lua @@ -11,6 +11,7 @@ server_scripts { 'locales/fi.lua', 'locales/fr.lua', 'locales/sv.lua', + 'locales/pl.lua', 'config.lua', 'server/main.lua' } @@ -21,6 +22,7 @@ client_scripts { 'locales/fi.lua', 'locales/fr.lua', 'locales/sv.lua', + 'locales/pl.lua', 'config.lua', 'client/main.lua' } From 79a7e95bbd061cf5d2c455ece3ca9fe57845c989 Mon Sep 17 00:00:00 2001 From: nearbyplayer Date: Fri, 10 Aug 2018 00:55:52 -0400 Subject: [PATCH 44/85] Repo Update --- .editorconfig | 9 +++++++++ LICENSE.txt => LICENSE | 0 2 files changed, 9 insertions(+) create mode 100644 .editorconfig rename LICENSE.txt => LICENSE (100%) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..9b425256 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_size = 4 +indent_style = tab +end_of_line = crlf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE From 8dbdaec0631bd648d3c894d9038455d3a082b8ae Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 12 Aug 2018 15:02:21 +0200 Subject: [PATCH 45/85] Minor locale improvements --- client/main.lua | 81 +++++++++++++++++++++++-------------------------- locales/en.lua | 15 ++++----- locales/fi.lua | 9 +++--- locales/fr.lua | 1 + locales/pl.lua | 13 ++++---- locales/sv.lua | 21 +++++++------ 6 files changed, 70 insertions(+), 70 deletions(-) diff --git a/client/main.lua b/client/main.lua index 3bb622e2..415bab23 100644 --- a/client/main.lua +++ b/client/main.lua @@ -290,8 +290,8 @@ function OpenRecruitMenu(society) title = _U('do_you_want_to_recruit', data.current.name), align = 'top-left', elements = { - {label = _U('yes'), value = 'yes'}, {label = _U('no'), value = 'no'}, + {label = _U('yes'), value = 'yes'} } }, function(data2, menu2) @@ -364,58 +364,53 @@ end function OpenManageGradesMenu(society) - ESX.TriggerServerCallback('esx_society:getJob', function(job) + ESX.TriggerServerCallback('esx_society:getJob', function(job) - local elements = {} + local elements = {} - for i=1, #job.grades, 1 do - local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) - table.insert(elements, {label = gradeLabel .. ' $' .. job.grades[i].salary, value = job.grades[i].grade}) - end + for i=1, #job.grades, 1 do + local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, { + label = (string.format ('%s - $%i', gradeLabel, job.grades[i].salary)), + value = job.grades[i].grade + }) + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'manage_grades_' .. society, - { - title = _U('salary_management'), - align = 'top-left', - elements = elements - }, - function(data, menu) + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'manage_grades_' .. society, + { + title = _U('salary_management'), + align = 'top-left', + elements = elements + }, function(data, menu) - ESX.UI.Menu.Open( - 'dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, - { - title = _U('salary_amount') - }, - function(data2, menu2) + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, + { + title = _U('salary_amount') + }, function(data2, menu2) - local amount = tonumber(data2.value) + local amount = tonumber(data2.value) - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - elseif amount >= Config.MaxSalary then - ESX.ShowNotification(_U('invalid_amount_max')) - else - menu2.close() + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + elseif amount >= Config.MaxSalary then + ESX.ShowNotification(_U('invalid_amount_max')) + else + menu2.close() - ESX.TriggerServerCallback('esx_society:setJobSalary', function() - OpenManageGradesMenu(society) - end, society, data.current.value, amount) - end + ESX.TriggerServerCallback('esx_society:setJobSalary', function() + OpenManageGradesMenu(society) + end, society, data.current.value, amount) + end - end, - function(data2, menu2) - menu2.close() - end - ) + end, function(data2, menu2) + menu2.close() + end) - end, - function(data, menu) - menu.close() - end - ) + end, function(data, menu) + menu.close() + end) - end, society) + end, society) end diff --git a/locales/en.lua b/locales/en.lua index cf7cd373..ec2d5c69 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -11,6 +11,7 @@ Locales['en'] = { ['have_deposited'] = 'you have deposited ~r~$%s~s~', ['have_withdrawn'] = 'you have withdrawn ~g~$%s~s~', ['invalid_amount'] = 'invalid amount', + ['invalid_amount_max'] = 'that salary is not allowed', ['no'] = 'no', ['promote'] = 'promote', ['promote_employee'] = 'promote %s', @@ -23,12 +24,12 @@ Locales['en'] = { ['withdraw_amount'] = 'witdraw amount', ['withdraw_society_money'] = 'withdraw society money', ['yes'] = 'yes', - ['you_have'] = 'you have ~g~%s$~s~ waiting in ~y~money laundering~s~ (24h).', + ['you_have'] = 'you have ~g~$%s~s~ waiting in ~y~money laundering~s~ (24h).', ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$%s~s~', - ['you_have_hired'] = 'you have recruited %s', - ['you_have_been_hired'] = 'you have been hired by %s', - ['you_have_fired'] = 'you have fired %s', - ['you_have_been_fired'] = 'you have been fired from %s', - ['you_have_promoted'] = 'you have promoted %s as %s', - ['you_have_been_promoted'] = 'you have been promoted', + ['you_have_hired'] = 'you have recruited %s', + ['you_have_been_hired'] = 'you have been hired by %s', + ['you_have_fired'] = 'you have fired %s', + ['you_have_been_fired'] = 'you have been fired from %s', + ['you_have_promoted'] = 'you have promoted %s as %s', + ['you_have_been_promoted'] = 'you have been ~b~promoted~s~!', } diff --git a/locales/fi.lua b/locales/fi.lua index 30b3854e..b63be18c 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -8,9 +8,10 @@ Locales['fi'] = { ['employee_management'] = 'työntekijöiden hallinta', ['fire'] = 'anna potkut', ['grade'] = 'taso', - ['have_deposited'] = 'sinä talletit ~r~€', - ['have_withdrawn'] = 'sinä nostit ~g~€', + ['have_deposited'] = 'sinä talletit ~r~€%s~s~', + ['have_withdrawn'] = 'sinä nostit ~g~€%s~s~', ['invalid_amount'] = 'virheellinen summa', + ['invalid_amount_max'] = 'that salary is not allowed', ['no'] = 'ei', ['promote'] = 'ylennä', ['promote_employee'] = 'ylennä henkilö %s', @@ -23,8 +24,8 @@ Locales['fi'] = { ['withdraw_amount'] = 'nostettava määrä', ['withdraw_society_money'] = 'nosta yrityksen rahoja', ['yes'] = 'kyllä', - ['you_have'] = 'sinulla on ~g~€', - ['you_have_laundered'] = 'olet ~r~pessyt~s~ rahojasi: ~g~€', + ['you_have'] = 'you have ~g~$%s~s~ waiting in ~y~money laundering~s~ (24h).', + ['you_have_laundered'] = 'olet ~r~pessyt~s~ rahojasi: ~g~€%s~s~', ['you_have_hired'] = 'sinä palkkasit henkilön %s', ['you_have_been_hired'] = 'sinut on palkattu pelaajan %s toimesta', ['you_have_fired'] = 'sinä annoit potkut pelaajalle %s', diff --git a/locales/fr.lua b/locales/fr.lua index b01d80de..d26cd220 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -11,6 +11,7 @@ Locales['fr'] = { ['have_deposited'] = 'vous avez déposé ~r~$%s~s~', ['have_withdrawn'] = 'vous avez retiré ~g~$%s~s~', ['invalid_amount'] = 'montant invalide', + ['invalid_amount_max'] = 'that salary is not allowed', ['no'] = 'non', ['promote'] = 'promouvoir', ['promote_employee'] = 'promouvoir %s', diff --git a/locales/pl.lua b/locales/pl.lua index fa571f34..8acc20be 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -11,6 +11,7 @@ Locales['pl'] = { ['have_deposited'] = 'zdeponowałeś ~r~$%s~s~', ['have_withdrawn'] = 'wypłaciłeś ~g~$%s~s~', ['invalid_amount'] = 'nieprawidłowa wartość', + ['invalid_amount_max'] = 'that salary is not allowed', ['no'] = 'nie', ['promote'] = 'awansuj', ['promote_employee'] = 'awansuj %s', @@ -25,10 +26,10 @@ Locales['pl'] = { ['yes'] = 'tak', ['you_have'] = 'masz ~g~%s$~s~ czekanie ~y~w pralni pieniędzmi~s~ (24h).', ['you_have_laundered'] = '~r~Wyprałeś~s~ twoje pieniądze: ~g~$%s~s~', - ['you_have_hired'] = 'zatrudniłeś %s', - ['you_have_been_hired'] = 'zostałeś zatrudniony przez %s', - ['you_have_fired'] = 'zwolniłeś %s', - ['you_have_been_fired'] = 'zostałeś zwolniony %s', - ['you_have_promoted'] = 'awansowałeś %s na %s', - ['you_have_been_promoted'] = 'zostałeś awansowany', + ['you_have_hired'] = 'zatrudniłeś %s', + ['you_have_been_hired'] = 'zostałeś zatrudniony przez %s', + ['you_have_fired'] = 'zwolniłeś %s', + ['you_have_been_fired'] = 'zostałeś zwolniony %s', + ['you_have_promoted'] = 'awansowałeś %s na %s', + ['you_have_been_promoted'] = 'zostałeś awansowany', } diff --git a/locales/sv.lua b/locales/sv.lua index a94513ff..f39b1488 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -8,9 +8,10 @@ Locales['sv'] = { ['employee_management'] = 'medarbetarhantering', ['fire'] = 'sparka', ['grade'] = 'grade', - ['have_deposited'] = 'du har satt in ~r~$%s~s~', - ['have_withdrawn'] = 'du har tagit ut ~g~$%s~s~', + ['have_deposited'] = 'du har satt in ~r~%s SEK~s~', + ['have_withdrawn'] = 'du har tagit ut ~g~%s SEK~s~', ['invalid_amount'] = 'ogiltigt belopp', + ['invalid_amount_max'] = 'den lönen är inte tillåten', ['no'] = 'nej', ['promote'] = 'befodra', ['promote_employee'] = 'befodra %s', @@ -23,12 +24,12 @@ Locales['sv'] = { ['withdraw_amount'] = 'Ta ut summan', ['withdraw_society_money'] = 'ta ut samhällspengar', ['yes'] = 'ja', - ['you_have'] = 'du har ~g~%s$~s~ som väntar på ~y~pengartvätt~s~ (24h).', - ['you_have_laundered'] = 'du har ~r~tvättat~s~ dina pengar: ~g~$%s~s~', - ['you_have_hired'] = 'du har anställt ~y~%s~s~', - ['you_have_been_hired'] = 'du har blivit anställd utav %s', - ['you_have_fired'] = 'du har ~r~sparkat~s~ ~y~%s~s~', - ['you_have_been_fired'] = 'du har blivit ~r~sparkad~s~ utav ~y~%s~s~', - ['you_have_promoted'] = 'du har befodrat ~y~%s~s~ till ~b~%s~s~', - ['you_have_been_promoted'] = 'du har blivit ~b~befodrad~s~', + ['you_have'] = 'du har ~g~%s SEK~s~ som väntar på ~y~pengartvätt~s~ (24h).', + ['you_have_laundered'] = 'du har ~r~tvättat~s~ dina pengar: ~g~%s SEK~s~', + ['you_have_hired'] = 'du har anställt ~y~%s~s~', + ['you_have_been_hired'] = 'du har blivit anställd utav %s', + ['you_have_fired'] = 'du har ~r~sparkat~s~ ~y~%s~s~', + ['you_have_been_fired'] = 'du har blivit ~r~sparkad~s~ utav ~y~%s~s~', + ['you_have_promoted'] = 'du har befodrat ~y~%s~s~ till ~b~%s~s~', + ['you_have_been_promoted'] = 'du har blivit ~b~befodrad~s~', } From 003d604739d4875be5b2bab0f7a166d09d66b7e1 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Fri, 17 Aug 2018 01:08:44 +0200 Subject: [PATCH 46/85] Added important readme note --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f5160a8f..258d20ed 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # esx_society +Society management for ESX. Adds employee management (hire, fire, promote / demote, change salary), society bank accounts and money washing. It's crucial that this script gets started before all resources that utilize societies do, or else many things will go wrong. ## Requirements - [cron](https://github.com/ESX-Org/cron) From b4ce61a75c14982c35212b4d043369a3c521f698 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sat, 25 Aug 2018 14:48:45 +0200 Subject: [PATCH 47/85] Fixed lua executing boss menu, tab indent --- client/main.lua | 508 ++++++++++++++++++++++-------------------------- locales/en.lua | 1 + locales/fi.lua | 1 + locales/fr.lua | 1 + locales/pl.lua | 1 + locales/sv.lua | 5 +- server/main.lua | 438 +++++++++++++++++++---------------------- 7 files changed, 440 insertions(+), 515 deletions(-) diff --git a/client/main.lua b/client/main.lua index 415bab23..7b70a5cf 100644 --- a/client/main.lua +++ b/client/main.lua @@ -32,333 +32,296 @@ function UpdateSocietyMoneyHUDElement(money) end function OpenBossMenu(society, close, options) + local isBoss = nil + local options = options or {} + local elements = {} - local options = options or {} - local elements = {} + ESX.TriggerServerCallback('esx_society:isBoss', function(result) + isBoss = result + end, society) - local defaultOptions = { - withdraw = true, - deposit = true, - wash = true, - employees = true, - grades = true - } + while isBoss == nil do + Citizen.Wait(100) + end - for k,v in pairs(defaultOptions) do - if options[k] == nil then - options[k] = v - end - end + if not isBoss then + return + end - if options.withdraw then - table.insert(elements, {label = _U('withdraw_society_money'), value = 'withdraw_society_money'}) - end + local defaultOptions = { + withdraw = true, + deposit = true, + wash = true, + employees = true, + grades = true + } - if options.deposit then - table.insert(elements, {label = _U('deposit_society_money'), value = 'deposit_money'}) - end + for k,v in pairs(defaultOptions) do + if options[k] == nil then + options[k] = v + end + end - if options.wash then - table.insert(elements, {label = _U('wash_money'), value = 'wash_money'}) - end + if options.withdraw then + table.insert(elements, {label = _U('withdraw_society_money'), value = 'withdraw_society_money'}) + end - if options.employees then - table.insert(elements, {label = _U('employee_management'), value = 'manage_employees'}) - end + if options.deposit then + table.insert(elements, {label = _U('deposit_society_money'), value = 'deposit_money'}) + end - if options.grades then - table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) - end + if options.wash then + table.insert(elements, {label = _U('wash_money'), value = 'wash_money'}) + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'boss_actions_' .. society, - { - title = 'Patron', - align = 'top-left', - elements = elements - }, - function(data, menu) + if options.employees then + table.insert(elements, {label = _U('employee_management'), value = 'manage_employees'}) + end - if data.current.value == 'withdraw_society_money' then + if options.grades then + table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) + end - ESX.UI.Menu.Open( - 'dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, - { - title = _U('withdraw_amount') - }, - function(data, menu) + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'boss_actions_' .. society, + { + title = _U('boss_menu'), + align = 'top-left', + elements = elements + }, function(data, menu) - local amount = tonumber(data.value) + if data.current.value == 'withdraw_society_money' then - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:withdrawMoney', society, amount) - end + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, + { + title = _U('withdraw_amount') + }, function(data, menu) - end, - function(data, menu) - menu.close() - end - ) + local amount = tonumber(data.value) - end + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:withdrawMoney', society, amount) + end - if data.current.value == 'deposit_money' then + end, function(data, menu) + menu.close() + end) - ESX.UI.Menu.Open( - 'dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, - { - title = _U('deposit_amount') - }, - function(data, menu) + elseif data.current.value == 'deposit_money' then - local amount = tonumber(data.value) + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, + { + title = _U('deposit_amount') + }, function(data, menu) - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:depositMoney', society, amount) - end + local amount = tonumber(data.value) - end, - function(data, menu) - menu.close() - end - ) + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:depositMoney', society, amount) + end - end + end, function(data, menu) + menu.close() + end) - if data.current.value == 'wash_money' then + elseif data.current.value == 'wash_money' then - ESX.UI.Menu.Open( - 'dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, - { - title = _U('wash_money_amount') - }, - function(data, menu) + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, + { + title = _U('wash_money_amount') + }, function(data, menu) - local amount = tonumber(data.value) + local amount = tonumber(data.value) - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:washMoney', society, amount) - end + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:washMoney', society, amount) + end - end, - function(data, menu) - menu.close() - end - ) + end, function(data, menu) + menu.close() + end) - end + elseif data.current.value == 'manage_employees' then + OpenManageEmployeesMenu(society) + elseif data.current.value == 'manage_grades' then + OpenManageGradesMenu(society) + end - if data.current.value == 'manage_employees' then - OpenManageEmployeesMenu(society) - end - - if data.current.value == 'manage_grades' then - OpenManageGradesMenu(society) - end - - end, - function(data, menu) - - if close then - close(data, menu) - end - - end - ) + end, function(data, menu) + if close then + close(data, menu) + end + end) end function OpenManageEmployeesMenu(society) - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'manage_employees_' .. society, - { - title = _U('employee_management'), - align = 'top-left', - elements = { - {label = _U('employee_list'), value = 'employee_list'}, - {label = _U('recruit'), value = 'recruit'}, - } - }, - function(data, menu) + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'manage_employees_' .. society, + { + title = _U('employee_management'), + align = 'top-left', + elements = { + {label = _U('employee_list'), value = 'employee_list'}, + {label = _U('recruit'), value = 'recruit'}, + } + }, function(data, menu) - if data.current.value == 'employee_list' then - OpenEmployeeList(society) - end + if data.current.value == 'employee_list' then + OpenEmployeeList(society) + end - if data.current.value == 'recruit' then - OpenRecruitMenu(society) - end - - end, - function(data, menu) - menu.close() - end - ) + if data.current.value == 'recruit' then + OpenRecruitMenu(society) + end + end, function(data, menu) + menu.close() + end) end function OpenEmployeeList(society) - ESX.TriggerServerCallback('esx_society:getEmployees', function(employees) + ESX.TriggerServerCallback('esx_society:getEmployees', function(employees) - local elements = { - head = {_U('employee'), _U('grade'), _U('actions')}, - rows = {} - } + local elements = { + head = {_U('employee'), _U('grade'), _U('actions')}, + rows = {} + } - for i=1, #employees, 1 do + for i=1, #employees, 1 do - local gradeLabel = (employees[i].job.grade_label == '' and employees[i].job.label or employees[i].job.grade_label) + local gradeLabel = (employees[i].job.grade_label == '' and employees[i].job.label or employees[i].job.grade_label) - table.insert(elements.rows, { - data = employees[i], - cols = { - employees[i].name, - gradeLabel, - '{{' .. _U('promote') .. '|promote}} {{' .. _U('fire') .. '|fire}}' - } - }) - end + table.insert(elements.rows, { + data = employees[i], + cols = { + employees[i].name, + gradeLabel, + '{{' .. _U('promote') .. '|promote}} {{' .. _U('fire') .. '|fire}}' + } + }) + end - ESX.UI.Menu.Open( - 'list', GetCurrentResourceName(), 'employee_list_' .. society, - elements, - function(data, menu) + ESX.UI.Menu.Open('list', GetCurrentResourceName(), 'employee_list_' .. society, elements, function(data, menu) + local employee = data.data - local employee = data.data + if data.value == 'promote' then + menu.close() + OpenPromoteMenu(society, employee) + end - if data.value == 'promote' then - menu.close() - OpenPromoteMenu(society, employee) - end + if data.value == 'fire' then - if data.value == 'fire' then + TriggerEvent('esx:showNotification', _U('you_have_fired', employee.name)) - TriggerEvent('esx:showNotification', _U('you_have_fired', employee.name)) + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenEmployeeList(society) + end, employee.identifier, 'unemployed', 0, 'fire') - ESX.TriggerServerCallback('esx_society:setJob', function() - OpenEmployeeList(society) - end, employee.identifier, 'unemployed', 0, 'fire') + end - end + end, function(data, menu) + menu.close() + OpenManageEmployeesMenu(society) + end) - end, - function(data, menu) - menu.close() - OpenManageEmployeesMenu(society) - end - ) - - end, society) + end, society) end function OpenRecruitMenu(society) - ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players) + ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players) - local elements = {} + local elements = {} - for i=1, #players, 1 do - if players[i].job.name ~= society then - table.insert(elements, {label = players[i].name, value = players[i].source, name = players[i].name, identifier = players[i].identifier}) - end - end + for i=1, #players, 1 do + if players[i].job.name ~= society then + table.insert(elements, {label = players[i].name, value = players[i].source, name = players[i].name, identifier = players[i].identifier}) + end + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'recruit_' .. society, - { - title = _U('recruiting'), - align = 'top-left', - elements = elements - }, - function(data, menu) + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'recruit_' .. society, + { + title = _U('recruiting'), + align = 'top-left', + elements = elements + }, function(data, menu) - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'recruit_confirm_' .. society, - { - title = _U('do_you_want_to_recruit', data.current.name), - align = 'top-left', - elements = { - {label = _U('no'), value = 'no'}, - {label = _U('yes'), value = 'yes'} - } - }, - function(data2, menu2) + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'recruit_confirm_' .. society, + { + title = _U('do_you_want_to_recruit', data.current.name), + align = 'top-left', + elements = { + {label = _U('no'), value = 'no'}, + {label = _U('yes'), value = 'yes'} + } + }, function(data2, menu2) - menu2.close() + menu2.close() - if data2.current.value == 'yes' then + if data2.current.value == 'yes' then - TriggerEvent('esx:showNotification', _U('you_have_hired', data.current.name)) + TriggerEvent('esx:showNotification', _U('you_have_hired', data.current.name)) - ESX.TriggerServerCallback('esx_society:setJob', function() - OpenRecruitMenu(society) - end, data.current.identifier, society, 0, 'hire') + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenRecruitMenu(society) + end, data.current.identifier, society, 0, 'hire') - end + end - end, - function(data2, menu2) - menu2.close() - end - ) + end, function(data2, menu2) + menu2.close() + end) - end, - function(data, menu) - menu.close() - end - ) + end, function(data, menu) + menu.close() + end) - end) + end) end function OpenPromoteMenu(society, employee) - ESX.TriggerServerCallback('esx_society:getJob', function(job) + ESX.TriggerServerCallback('esx_society:getJob', function(job) - local elements = {} + local elements = {} - for i=1, #job.grades, 1 do - local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) - table.insert(elements, {label = gradeLabel, value = job.grades[i].grade, selected = (employee.job.grade == job.grades[i].grade)}) - end + for i=1, #job.grades, 1 do + local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, {label = gradeLabel, value = job.grades[i].grade, selected = (employee.job.grade == job.grades[i].grade)}) + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'promote_employee_' .. society, - { - title = _U('promote_employee', employee.name), - align = 'top-left', - elements = elements - }, - function(data, menu) - menu.close() + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'promote_employee_' .. society, + { + title = _U('promote_employee', employee.name), + align = 'top-left', + elements = elements + }, function(data, menu) + menu.close() - TriggerEvent('esx:showNotification', _U('you_have_promoted', employee.name, data.current.label)) + TriggerEvent('esx:showNotification', _U('you_have_promoted', employee.name, data.current.label)) - ESX.TriggerServerCallback('esx_society:setJob', function() - OpenEmployeeList(society) - end, employee.identifier, society, data.current.value, 'promote') + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenEmployeeList(society) + end, employee.identifier, society, data.current.value, 'promote') - end, - function(data, menu) - menu.close() - OpenEmployeeList(society) - end - ) + end, function(data, menu) + menu.close() + OpenEmployeeList(society) + end) - end, society) + end, society) end @@ -392,7 +355,7 @@ function OpenManageGradesMenu(society) if amount == nil then ESX.ShowNotification(_U('invalid_amount')) - elseif amount >= Config.MaxSalary then + elseif amount > Config.MaxSalary then ESX.ShowNotification(_U('invalid_amount_max')) else menu2.close() @@ -416,51 +379,44 @@ end RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(xPlayer) - - PlayerData = xPlayer + PlayerData = xPlayer - DisableSocietyMoneyHUDElement() + DisableSocietyMoneyHUDElement() - if PlayerData.job.grade_name == 'boss' then - - EnableSocietyMoneyHUDElement() - - ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) - UpdateSocietyMoneyHUDElement(money) - end, PlayerData.job.name) - - end + if PlayerData.job.grade_name == 'boss' then + EnableSocietyMoneyHUDElement() + + ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) + UpdateSocietyMoneyHUDElement(money) + end, PlayerData.job.name) + end end) RegisterNetEvent('esx:setJob') AddEventHandler('esx:setJob', function(job) + PlayerData.job = job - PlayerData.job = job + DisableSocietyMoneyHUDElement() - DisableSocietyMoneyHUDElement() + if PlayerData.job.grade_name == 'boss' then + EnableSocietyMoneyHUDElement() + + ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) + UpdateSocietyMoneyHUDElement(money) + end, PlayerData.job.name) - if PlayerData.job.grade_name == 'boss' then - - EnableSocietyMoneyHUDElement() - - ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) - UpdateSocietyMoneyHUDElement(money) - end, PlayerData.job.name) - - end + end end) RegisterNetEvent('esx_addonaccount:setMoney') AddEventHandler('esx_addonaccount:setMoney', function(society, money) - - if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == society then - UpdateSocietyMoneyHUDElement(money) - end - + if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == society then + UpdateSocietyMoneyHUDElement(money) + end end) AddEventHandler('esx_society:openBossMenu', function(society, close, options) - OpenBossMenu(society, close, options) + OpenBossMenu(society, close, options) end) diff --git a/locales/en.lua b/locales/en.lua index ec2d5c69..7e846366 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,5 +1,6 @@ Locales['en'] = { ['actions'] = 'actions', + ['boss_menu'] = 'boss menu', ['deposit_amount'] = 'deposit amount', ['deposit_society_money'] = 'deposit society money', ['do_you_want_to_recruit'] = 'do you want to recruit %s?', diff --git a/locales/fi.lua b/locales/fi.lua index b63be18c..a940e5b5 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -1,5 +1,6 @@ Locales['fi'] = { ['actions'] = 'toiminnot', + ['boss_menu'] = 'boss menu', ['deposit_amount'] = 'talletus summa', ['deposit_society_money'] = 'talleta yritykselle rahaa', ['do_you_want_to_recruit'] = 'do you want to recruit %s?', diff --git a/locales/fr.lua b/locales/fr.lua index d26cd220..00145fd8 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -1,5 +1,6 @@ Locales['fr'] = { ['actions'] = 'actions', + ['boss_menu'] = 'patron', ['deposit_amount'] = 'montant du dépôt', ['deposit_society_money'] = 'déposer argent société', ['do_you_want_to_recruit'] = 'Voulez-vous recruter %s?', diff --git a/locales/pl.lua b/locales/pl.lua index 8acc20be..3eb2883b 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -1,5 +1,6 @@ Locales['pl'] = { ['actions'] = 'akcje', + ['boss_menu'] = 'boss menu', ['deposit_amount'] = 'ilość depozytu', ['deposit_society_money'] = 'zdeponuj społeczne pieniądze', ['do_you_want_to_recruit'] = 'czy chcesz zrekrutować %s?', diff --git a/locales/sv.lua b/locales/sv.lua index f39b1488..a68653f3 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -1,8 +1,9 @@ Locales['sv'] = { - ['actions'] = 'handlingar ', + ['actions'] = 'handlingar', + ['boss_menu'] = 'chefmeny', ['deposit_amount'] = 'insättningsbelopp', ['deposit_society_money'] = 'insätt samhälls pengar', - ['do_you_want_to_recruit'] = 'vill du anlita %s?', + ['do_you_want_to_recruit'] = 'vill du anställa %s?', ['employee'] = 'anställd', ['employee_list'] = 'anställningslista', ['employee_management'] = 'medarbetarhantering', diff --git a/server/main.lua b/server/main.lua index d61f5963..f9496e1d 100644 --- a/server/main.lua +++ b/server/main.lua @@ -5,258 +5,227 @@ RegisteredSocieties = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) function GetSociety(name) - for i=1, #RegisteredSocieties, 1 do - if RegisteredSocieties[i].name == name then - return RegisteredSocieties[i] - end - end + for i=1, #RegisteredSocieties, 1 do + if RegisteredSocieties[i].name == name then + return RegisteredSocieties[i] + end + end end AddEventHandler('onMySQLReady', function() + local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) - local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) + for i=1, #result, 1 do + Jobs[result[i].name] = result[i] + Jobs[result[i].name].grades = {} + end - for i=1, #result, 1 do - Jobs[result[i].name] = result[i] - Jobs[result[i].name].grades = {} - end - - local result2 = MySQL.Sync.fetchAll('SELECT * FROM job_grades', {}) - - for i=1, #result2, 1 do - Jobs[result2[i].job_name].grades[tostring(result2[i].grade)] = result2[i] - end + local result2 = MySQL.Sync.fetchAll('SELECT * FROM job_grades', {}) + for i=1, #result2, 1 do + Jobs[result2[i].job_name].grades[tostring(result2[i].grade)] = result2[i] + end end) AddEventHandler('esx_society:registerSociety', function(name, label, account, datastore, inventory, data) + local found = false - local found = false + local society = { + name = name, + label = label, + account = account, + datastore = datastore, + inventory = inventory, + data = data, + } - local society = { - name = name, - label = label, - account = account, - datastore = datastore, - inventory = inventory, - data = data, - } - - for i=1, #RegisteredSocieties, 1 do - if RegisteredSocieties[i].name == name then - found = true - RegisteredSocieties[i] = society - break - end - end - - if not found then - table.insert(RegisteredSocieties, society) - end + for i=1, #RegisteredSocieties, 1 do + if RegisteredSocieties[i].name == name then + found = true + RegisteredSocieties[i] = society + break + end + end + if not found then + table.insert(RegisteredSocieties, society) + end end) AddEventHandler('esx_society:getSocieties', function(cb) - cb(RegisteredSocieties) + cb(RegisteredSocieties) end) AddEventHandler('esx_society:getSociety', function(name, cb) - cb(GetSociety(name)) + cb(GetSociety(name)) end) RegisterServerEvent('esx_society:withdrawMoney') AddEventHandler('esx_society:withdrawMoney', function(society, amount) + local xPlayer = ESX.GetPlayerFromId(source) + local society = GetSociety(society) - local xPlayer = ESX.GetPlayerFromId(source) - local society = GetSociety(society) - - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - - if amount > 0 and account.money >= amount then - - account.removeMoney(amount) - xPlayer.addMoney(amount) - - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn', amount)) - - else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) - end - - end) + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + if amount > 0 and account.money >= amount then + account.removeMoney(amount) + xPlayer.addMoney(amount) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn', amount)) + else + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + end + end) end) RegisterServerEvent('esx_society:depositMoney') AddEventHandler('esx_society:depositMoney', function(society, amount) + local xPlayer = ESX.GetPlayerFromId(source) + local society = GetSociety(society) - local xPlayer = ESX.GetPlayerFromId(source) - local society = GetSociety(society) + if amount > 0 and xPlayer.get('money') >= amount then - if amount > 0 and xPlayer.get('money') >= amount then + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + xPlayer.removeMoney(amount) + account.addMoney(amount) + end) - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - xPlayer.removeMoney(amount) - account.addMoney(amount) - end) - - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited', amount)) - - else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) - end + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited', amount)) + else + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + end end) RegisterServerEvent('esx_society:washMoney') AddEventHandler('esx_society:washMoney', function(society, amount) + local xPlayer = ESX.GetPlayerFromId(source) + local account = xPlayer.getAccount('black_money') + amount = tonumber(amount) + if amount and amount > 0 and account.money >= amount then - local xPlayer = ESX.GetPlayerFromId(source) - local account = xPlayer.getAccount('black_money') + xPlayer.removeAccountMoney('black_money', amount) - if amount > 0 and account.money >= amount then + MySQL.Async.execute('INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', + { + ['@identifier'] = xPlayer.identifier, + ['@society'] = society, + ['@amount'] = amount + }, function(rowsChanged) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have', amount)) + end) - xPlayer.removeAccountMoney('black_money', amount) - - MySQL.Async.execute( - 'INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', - { - ['@identifier'] = xPlayer.identifier, - ['@society'] = society, - ['@amount'] = amount - }, - function(rowsChanged) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have', amount)) - end - ) - - else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) - end + else + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + end end) RegisterServerEvent('esx_society:putVehicleInGarage') AddEventHandler('esx_society:putVehicleInGarage', function(societyName, vehicle) + local society = GetSociety(societyName) - local society = GetSociety(societyName) - - TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) - local garage = store.get('garage') or {} - table.insert(garage, vehicle) - store.set('garage', garage) - end) - + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) + local garage = store.get('garage') or {} + table.insert(garage, vehicle) + store.set('garage', garage) + end) end) RegisterServerEvent('esx_society:removeVehicleFromGarage') AddEventHandler('esx_society:removeVehicleFromGarage', function(societyName, vehicle) + local society = GetSociety(societyName) - local society = GetSociety(societyName) + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) + local garage = store.get('garage') or {} - TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) - - local garage = store.get('garage') or {} - - for i=1, #garage, 1 do - if garage[i].plate == vehicle.plate then - table.remove(garage, i) - break - end - end - - store.set('garage', garage) - - end) + for i=1, #garage, 1 do + if garage[i].plate == vehicle.plate then + table.remove(garage, i) + break + end + end + store.set('garage', garage) + end) end) ESX.RegisterServerCallback('esx_society:getSocietyMoney', function(source, cb, societyName) + local society = GetSociety(societyName) - local society = GetSociety(societyName) + if society ~= nil then - if society ~= nil then - - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - cb(account.money) - end) - - else - cb(0) - end + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + cb(account.money) + end) + else + cb(0) + end end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) + if Config.EnableESXIdentity then - if Config.EnableESXIdentity then - MySQL.Async.fetchAll( - 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', - { ['@job'] = society }, - function (results) - local employees = {} + MySQL.Async.fetchAll('SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', { + ['@job'] = society + }, function (results) + local employees = {} - for i=1, #results, 1 do - table.insert(employees, { - name = results[i].firstname .. ' ' .. results[i].lastname, - identifier = results[i].identifier, - job = { - name = results[i].job, - label = Jobs[results[i].job].label, - grade = results[i].job_grade, - grade_name = Jobs[results[i].job].grades[tostring(results[i].job_grade)].name, - grade_label = Jobs[results[i].job].grades[tostring(results[i].job_grade)].label, - } - }) - end + for i=1, #results, 1 do + table.insert(employees, { + name = results[i].firstname .. ' ' .. results[i].lastname, + identifier = results[i].identifier, + job = { + name = results[i].job, + label = Jobs[results[i].job].label, + grade = results[i].job_grade, + grade_name = Jobs[results[i].job].grades[tostring(results[i].job_grade)].name, + grade_label = Jobs[results[i].job].grades[tostring(results[i].job_grade)].label, + } + }) + end - cb(employees) - end - ) - else - MySQL.Async.fetchAll( - 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', - { ['@job'] = society }, - function (result) - local employees = {} + cb(employees) + end) + else + MySQL.Async.fetchAll('SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', { + ['@job'] = society + }, function (result) + local employees = {} - for i=1, #result, 1 do - table.insert(employees, { - name = result[i].name, - identifier = result[i].identifier, - job = { - name = result[i].job, - label = Jobs[result[i].job].label, - grade = result[i].job_grade, - grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, - grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, - } - }) - end + for i=1, #result, 1 do + table.insert(employees, { + name = result[i].name, + identifier = result[i].identifier, + job = { + name = result[i].job, + label = Jobs[result[i].job].label, + grade = result[i].job_grade, + grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, + grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, + } + }) + end - cb(employees) - end - ) - end + cb(employees) + end) + end end) ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) + local job = json.decode(json.encode(Jobs[society])) + local grades = {} - local job = json.decode(json.encode(Jobs[society])) - local grades = {} + for k,v in pairs(job.grades) do + table.insert(grades, v) + end - for k,v in pairs(job.grades) do - table.insert(grades, v) - end - - table.sort(grades, function(a, b) - return a.grade < b.grade - end) - - job.grades = grades - - cb(job) + table.sort(grades, function(a, b) + return a.grade < b.grade + end) + job.grades = grades + cb(job) end) @@ -274,90 +243,85 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier elseif type == 'fire' then TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_fired', xPlayer.getJob().label)) end - end + else - MySQL.Async.execute( - 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', + MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', { ['@job'] = job, ['@job_grade'] = grade, ['@identifier'] = identifier - }, - function(rowsChanged) + }, function(rowsChanged) cb() - end - ) + end) + + end end) ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) - MySQL.Async.execute( - 'UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', - { - ['@salary'] = salary, - ['@job_name'] = job, - ['@grade'] = grade - }, - function(rowsChanged) + MySQL.Async.execute('UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', + { + ['@salary'] = salary, + ['@job_name'] = job, + ['@grade'] = grade + }, function(rowsChanged) - Jobs[job].grades[tostring(grade)].salary = salary + Jobs[job].grades[tostring(grade)].salary = salary + local xPlayers = ESX.GetPlayers() - local xPlayers = ESX.GetPlayers() + for i=1, #xPlayers, 1 do - for i=1, #xPlayers, 1 do + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + if xPlayer.job.name == job and xPlayer.job.grade == grade then + xPlayer.setJob(job, grade) + end - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + end - if xPlayer.job.name == job and xPlayer.job.grade == grade then - xPlayer.setJob(job, grade) - end - - end - - cb() - end - ) + cb() + end) end) ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) + local xPlayers = ESX.GetPlayers() + local players = {} - local xPlayers = ESX.GetPlayers() - local players = {} - - for i=1, #xPlayers, 1 do - - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) - - table.insert(players, { - source = xPlayer.source, - identifier = xPlayer.identifier, - name = xPlayer.name, - job = xPlayer.job - }) - - end - - cb(players) + for i=1, #xPlayers, 1 do + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + table.insert(players, { + source = xPlayer.source, + identifier = xPlayer.identifier, + name = xPlayer.name, + job = xPlayer.job + }) + end + cb(players) end) ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, cb, societyName) - - local society = GetSociety(societyName) - - TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) - local garage = store.get('garage') or {} - cb(garage) - end) - + local society = GetSociety(societyName) + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) + local garage = store.get('garage') or {} + cb(garage) + end) end) -function WashMoneyCRON() - MySQL.Async.fetchAll( - 'SELECT * FROM society_moneywash', {}, - function(result) +ESX.RegisterServerCallback('esx_society:isBoss', function(source, cb, jobName) + local xPlayer = ESX.GetPlayerFromId(source) + + if xPlayer.job.name == jobName and xPlayer.job.grade_name == 'boss' then + cb(true) + else + print(('esx_society: %s attempted open a society boss menu!'):format(xPlayer.identifier)) + cb(false) + end +end) + +function WashMoneyCRON(d, h, m) + MySQL.Async.fetchAll('SELECT * FROM society_moneywash', {}, function(result) for i=1, #result, 1 do -- add society money From 043c9b7d3c5d824a4bcdf97c797c0092b15a9937 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sat, 25 Aug 2018 15:26:15 +0200 Subject: [PATCH 48/85] Forgotten tab indents --- client/main.lua | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/client/main.lua b/client/main.lua index 7b70a5cf..2a87d683 100644 --- a/client/main.lua +++ b/client/main.lua @@ -3,32 +3,28 @@ local PlayerData = {} local base64MoneyIcon = 'data:image/png;base64,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/GMzLdsAADhgaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6MDk6MTUgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0xMC0wOVQyMDoxNDo0NyswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMTAtMDlUMjA6MTQ6NDcrMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NmZkNGVlNjgtOWU3Mi1jYTQxLTg5NjMtMWRjMmI2M2EzYWExPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2ZmQ0ZWU2OC05ZTcyLWNhNDEtODk2My0xZGMyYjYzYTNhYTE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj45NjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTgwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjE4MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg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' Citizen.CreateThread(function() - while ESX == nil do - TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) - Citizen.Wait(0) - end + while ESX == nil do + TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + Citizen.Wait(0) + end end) function EnableSocietyMoneyHUDElement() + local societyMoneyHUDElementTpl = '
 {{money}}
' - local societyMoneyHUDElementTpl = '
 {{money}}
' - - ESX.UI.HUD.RegisterElement('society_money', 3, 0, societyMoneyHUDElementTpl, { - money = 0 - }) - + ESX.UI.HUD.RegisterElement('society_money', 3, 0, societyMoneyHUDElementTpl, { + money = 0 + }) end function DisableSocietyMoneyHUDElement() - ESX.UI.HUD.RemoveElement('society_money') + ESX.UI.HUD.RemoveElement('society_money') end function UpdateSocietyMoneyHUDElement(money) - - ESX.UI.HUD.UpdateElement('society_money', { - money = money - }) - + ESX.UI.HUD.UpdateElement('society_money', { + money = money + }) end function OpenBossMenu(society, close, options) From 81ea781e77ad4f8473c9421da4e226e197a45556 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sat, 25 Aug 2018 18:22:11 +0200 Subject: [PATCH 49/85] Protect esx_society:setJob from lua executors --- server/main.lua | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/server/main.lua b/server/main.lua index f9496e1d..873db1a2 100644 --- a/server/main.lua +++ b/server/main.lua @@ -231,18 +231,25 @@ end) ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade, type) - local xPlayer = ESX.GetPlayerFromIdentifier(identifier) + local xPlayer = ESX.GetPlayerFromId(source) + local xTarget = ESX.GetPlayerFromIdentifier(identifier) - if xPlayer ~= nil then - xPlayer.setJob(job, grade) + if xPlayer.job.name ~= job or xPlayer.job.grade_name ~= 'boss' then + print(('esx_society: %s attempted to set job!'):format(xPlayer.identifier)) + break + end + + if xTarget ~= nil then + xTarget.setJob(job, grade) if type == 'hire' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_hired', job)) + TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_hired', job)) elseif type == 'promote' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_promoted')) + TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_promoted')) elseif type == 'fire' then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_been_fired', xPlayer.getJob().label)) + TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_fired', xTarget.getJob().label)) end + else MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', From 61395ada2ef50325f45ea59356fd20cfc3733a74 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sat, 25 Aug 2018 20:51:18 +0200 Subject: [PATCH 50/85] Fixed broken script --- server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/main.lua b/server/main.lua index 873db1a2..701154d8 100644 --- a/server/main.lua +++ b/server/main.lua @@ -236,7 +236,7 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier if xPlayer.job.name ~= job or xPlayer.job.grade_name ~= 'boss' then print(('esx_society: %s attempted to set job!'):format(xPlayer.identifier)) - break + return end if xTarget ~= nil then From 8a7768e719225c5200ca5d5a76b4dc6c35a09bb5 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 27 Aug 2018 11:58:47 +0200 Subject: [PATCH 51/85] Fixed missing callback --- server/main.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/main.lua b/server/main.lua index 701154d8..7b424986 100644 --- a/server/main.lua +++ b/server/main.lua @@ -250,6 +250,8 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_fired', xTarget.getJob().label)) end + cb() + else MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', From 5b142f2bb283144b697df8395a3c6ddcd06acae6 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Wed, 5 Sep 2018 20:16:18 +0200 Subject: [PATCH 52/85] Removed broken check --- server/main.lua | 8 -------- 1 file changed, 8 deletions(-) diff --git a/server/main.lua b/server/main.lua index 7b424986..4419fbd8 100644 --- a/server/main.lua +++ b/server/main.lua @@ -234,11 +234,6 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier local xPlayer = ESX.GetPlayerFromId(source) local xTarget = ESX.GetPlayerFromIdentifier(identifier) - if xPlayer.job.name ~= job or xPlayer.job.grade_name ~= 'boss' then - print(('esx_society: %s attempted to set job!'):format(xPlayer.identifier)) - return - end - if xTarget ~= nil then xTarget.setJob(job, grade) @@ -251,9 +246,7 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier end cb() - else - MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', { ['@job'] = job, @@ -262,7 +255,6 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier }, function(rowsChanged) cb() end) - end end) From f44e0c0e4f44aa85fe09cb51a0475f3e9178b74c Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 23 Sep 2018 21:59:06 +0200 Subject: [PATCH 53/85] mysql-async v3.0.1 support --- server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/main.lua b/server/main.lua index 4419fbd8..227b9e2d 100644 --- a/server/main.lua +++ b/server/main.lua @@ -12,7 +12,7 @@ function GetSociety(name) end end -AddEventHandler('onMySQLReady', function() +MySQL.ready(function() local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) for i=1, #result, 1 do From 3cfae095036b97f0c668b1762b02e93a7dddb935 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 25 Nov 2018 16:02:22 +0100 Subject: [PATCH 54/85] Fixed hardcoded dollar sign, group money --- client/main.lua | 24 +++++++++++++++++------- locales/en.lua | 1 + locales/fi.lua | 3 ++- locales/fr.lua | 1 + locales/pl.lua | 1 + locales/sv.lua | 1 + server/main.lua | 13 ++++++------- 7 files changed, 29 insertions(+), 15 deletions(-) diff --git a/client/main.lua b/client/main.lua index 2a87d683..45cd67c2 100644 --- a/client/main.lua +++ b/client/main.lua @@ -23,7 +23,7 @@ end function UpdateSocietyMoneyHUDElement(money) ESX.UI.HUD.UpdateElement('society_money', { - money = money + money = ESX.Math.GroupDigits(money) }) end @@ -87,8 +87,7 @@ function OpenBossMenu(society, close, options) if data.current.value == 'withdraw_society_money' then - ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, - { + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, { title = _U('withdraw_amount') }, function(data, menu) @@ -167,7 +166,7 @@ function OpenManageEmployeesMenu(society) align = 'top-left', elements = { {label = _U('employee_list'), value = 'employee_list'}, - {label = _U('recruit'), value = 'recruit'}, + {label = _U('recruit'), value = 'recruit'} } }, function(data, menu) @@ -242,7 +241,12 @@ function OpenRecruitMenu(society) for i=1, #players, 1 do if players[i].job.name ~= society then - table.insert(elements, {label = players[i].name, value = players[i].source, name = players[i].name, identifier = players[i].identifier}) + table.insert(elements, { + label = players[i].name, + value = players[i].source, + name = players[i].name, + identifier = players[i].identifier + }) end end @@ -295,7 +299,12 @@ function OpenPromoteMenu(society, employee) for i=1, #job.grades, 1 do local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) - table.insert(elements, {label = gradeLabel, value = job.grades[i].grade, selected = (employee.job.grade == job.grades[i].grade)}) + + table.insert(elements, { + label = gradeLabel, + value = job.grades[i].grade, + selected = (employee.job.grade == job.grades[i].grade) + }) end ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'promote_employee_' .. society, @@ -329,8 +338,9 @@ function OpenManageGradesMenu(society) for i=1, #job.grades, 1 do local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, { - label = (string.format ('%s - $%i', gradeLabel, job.grades[i].salary)), + label = ('%s - %s'):format(gradeLabel, _U('money_generic', ESX.Math.GroupDigits(job.grades[i].salary))), value = job.grades[i].grade }) end diff --git a/locales/en.lua b/locales/en.lua index 7e846366..bcba597f 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,6 +1,7 @@ Locales['en'] = { ['actions'] = 'actions', ['boss_menu'] = 'boss menu', + ['money_generic'] = '$%s', ['deposit_amount'] = 'deposit amount', ['deposit_society_money'] = 'deposit society money', ['do_you_want_to_recruit'] = 'do you want to recruit %s?', diff --git a/locales/fi.lua b/locales/fi.lua index a940e5b5..d5283c27 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -1,6 +1,7 @@ Locales['fi'] = { ['actions'] = 'toiminnot', ['boss_menu'] = 'boss menu', + ['money_generic'] = '€%s', ['deposit_amount'] = 'talletus summa', ['deposit_society_money'] = 'talleta yritykselle rahaa', ['do_you_want_to_recruit'] = 'do you want to recruit %s?', @@ -25,7 +26,7 @@ Locales['fi'] = { ['withdraw_amount'] = 'nostettava määrä', ['withdraw_society_money'] = 'nosta yrityksen rahoja', ['yes'] = 'kyllä', - ['you_have'] = 'you have ~g~$%s~s~ waiting in ~y~money laundering~s~ (24h).', + ['you_have'] = 'you have ~g~€%s~s~ waiting in ~y~money laundering~s~ (24h).', ['you_have_laundered'] = 'olet ~r~pessyt~s~ rahojasi: ~g~€%s~s~', ['you_have_hired'] = 'sinä palkkasit henkilön %s', ['you_have_been_hired'] = 'sinut on palkattu pelaajan %s toimesta', diff --git a/locales/fr.lua b/locales/fr.lua index 00145fd8..ad90c3a8 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -1,6 +1,7 @@ Locales['fr'] = { ['actions'] = 'actions', ['boss_menu'] = 'patron', + ['money_generic'] = '$%s', ['deposit_amount'] = 'montant du dépôt', ['deposit_society_money'] = 'déposer argent société', ['do_you_want_to_recruit'] = 'Voulez-vous recruter %s?', diff --git a/locales/pl.lua b/locales/pl.lua index 3eb2883b..f314b4b3 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -1,6 +1,7 @@ Locales['pl'] = { ['actions'] = 'akcje', ['boss_menu'] = 'boss menu', + ['money_generic'] = '$%s', ['deposit_amount'] = 'ilość depozytu', ['deposit_society_money'] = 'zdeponuj społeczne pieniądze', ['do_you_want_to_recruit'] = 'czy chcesz zrekrutować %s?', diff --git a/locales/sv.lua b/locales/sv.lua index a68653f3..42faccb1 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -1,6 +1,7 @@ Locales['sv'] = { ['actions'] = 'handlingar', ['boss_menu'] = 'chefmeny', + ['money_generic'] = '%s SEK', ['deposit_amount'] = 'insättningsbelopp', ['deposit_society_money'] = 'insätt samhälls pengar', ['do_you_want_to_recruit'] = 'vill du anställa %s?', diff --git a/server/main.lua b/server/main.lua index 227b9e2d..0bcad877 100644 --- a/server/main.lua +++ b/server/main.lua @@ -70,7 +70,7 @@ AddEventHandler('esx_society:withdrawMoney', function(society, amount) account.removeMoney(amount) xPlayer.addMoney(amount) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn', amount)) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn', ESX.Math.GroupDigits(amount))) else TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) end @@ -89,7 +89,7 @@ AddEventHandler('esx_society:depositMoney', function(society, amount) account.addMoney(amount) end) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited', amount)) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited', ESX.Math.GroupDigits(amount))) else TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) @@ -111,7 +111,7 @@ AddEventHandler('esx_society:washMoney', function(society, amount) ['@society'] = society, ['@amount'] = amount }, function(rowsChanged) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have', amount)) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have', ESX.Math.GroupDigits(amount))) end) else @@ -236,7 +236,7 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier if xTarget ~= nil then xTarget.setJob(job, grade) - + if type == 'hire' then TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_hired', job)) elseif type == 'promote' then @@ -334,11 +334,10 @@ function WashMoneyCRON(d, h, m) -- send notification if player is online local xPlayer = ESX.GetPlayerFromIdentifier(result[i].identifier) if xPlayer ~= nil then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered', result[i].amount)) + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered', ESX.Math.GroupDigits(result[i].amount))) end - MySQL.Async.execute('DELETE FROM society_moneywash WHERE id = @id', - { + MySQL.Async.execute('DELETE FROM society_moneywash WHERE id = @id', { ['@id'] = result[i].id }) end From 835fc6527160eda7a917287398db03556dd6042a Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 10 Dec 2018 22:45:03 +0100 Subject: [PATCH 55/85] Mysql dont select everything --- client/main.lua | 3 +-- server/main.lua | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/client/main.lua b/client/main.lua index 45cd67c2..b3d80f06 100644 --- a/client/main.lua +++ b/client/main.lua @@ -352,8 +352,7 @@ function OpenManageGradesMenu(society) elements = elements }, function(data, menu) - ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, - { + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, { title = _U('salary_amount') }, function(data2, menu2) diff --git a/server/main.lua b/server/main.lua index 0bcad877..3441788e 100644 --- a/server/main.lua +++ b/server/main.lua @@ -166,7 +166,7 @@ end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) if Config.EnableESXIdentity then - MySQL.Async.fetchAll('SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', { + MySQL.Async.fetchAll('SELECT firstname, lastname, identifier, job, job_grade FROM users WHERE job = @job ORDER BY job_grade DESC', { ['@job'] = society }, function (results) local employees = {} @@ -180,7 +180,7 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci label = Jobs[results[i].job].label, grade = results[i].job_grade, grade_name = Jobs[results[i].job].grades[tostring(results[i].job_grade)].name, - grade_label = Jobs[results[i].job].grades[tostring(results[i].job_grade)].label, + grade_label = Jobs[results[i].job].grades[tostring(results[i].job_grade)].label } }) end @@ -188,7 +188,7 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci cb(employees) end) else - MySQL.Async.fetchAll('SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', { + MySQL.Async.fetchAll('SELECT name, identifier, job, job_grade FROM users WHERE job = @job ORDER BY job_grade DESC', { ['@job'] = society }, function (result) local employees = {} @@ -202,7 +202,7 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci label = Jobs[result[i].job].label, grade = result[i].job_grade, grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, - grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, + grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label } }) end From 70dc22a2f6b99b6030c4676974efb936e29f29f7 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 31 Dec 2018 14:13:41 +0100 Subject: [PATCH 56/85] Respect EnableHud in ESX --- client/main.lua | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/client/main.lua b/client/main.lua index b3d80f06..32481688 100644 --- a/client/main.lua +++ b/client/main.lua @@ -12,19 +12,25 @@ end) function EnableSocietyMoneyHUDElement() local societyMoneyHUDElementTpl = '
 {{money}}
' - ESX.UI.HUD.RegisterElement('society_money', 3, 0, societyMoneyHUDElementTpl, { - money = 0 - }) + if ESX.GetConfig().EnableHud then + ESX.UI.HUD.RegisterElement('society_money', 3, 0, societyMoneyHUDElementTpl, { + money = 0 + }) + end end function DisableSocietyMoneyHUDElement() - ESX.UI.HUD.RemoveElement('society_money') + if ESX.GetConfig().EnableHud then + ESX.UI.HUD.RemoveElement('society_money') + end end function UpdateSocietyMoneyHUDElement(money) - ESX.UI.HUD.UpdateElement('society_money', { - money = ESX.Math.GroupDigits(money) - }) + if ESX.GetConfig().EnableHud then + ESX.UI.HUD.UpdateElement('society_money', { + money = ESX.Math.GroupDigits(money) + }) + end end function OpenBossMenu(society, close, options) From 2ab948f54715430f049d5b445ff3f3abe1b77329 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 13 Jan 2019 12:25:53 +0100 Subject: [PATCH 57/85] Added setSocietyMoney and toggleSocietyHud events --- client/main.lua | 81 ++++++++++++++++++++++++------------------------- config.lua | 9 +++--- server/main.lua | 34 +++++++++------------ 3 files changed, 59 insertions(+), 65 deletions(-) diff --git a/client/main.lua b/client/main.lua index 32481688..503d69a2 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,5 +1,5 @@ ESX = nil -local PlayerData = {} + local base64MoneyIcon = 'data:image/png;base64,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/GMzLdsAADhgaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6MDk6MTUgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0xMC0wOVQyMDoxNDo0NyswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMTAtMDlUMjA6MTQ6NDcrMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NmZkNGVlNjgtOWU3Mi1jYTQxLTg5NjMtMWRjMmI2M2EzYWExPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2ZmQ0ZWU2OC05ZTcyLWNhNDEtODk2My0xZGMyYjYzYTNhYTE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj45NjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTgwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjE4MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg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' Citizen.CreateThread(function() @@ -7,6 +7,39 @@ Citizen.CreateThread(function() TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) Citizen.Wait(0) end + + while ESX.GetPlayerData().job == nil do + Citizen.Wait(10) + end + + ESX.PlayerData = ESX.GetPlayerData() + + RefreshBussHUD() +end) + +RegisterNetEvent('esx:setJob') +AddEventHandler('esx:setJob', function(job) + ESX.PlayerData.job = job + RefreshBussHUD() +end) + +function RefreshBussHUD() + DisableSocietyMoneyHUDElement() + + if ESX.PlayerData.job.grade_name == 'boss' then + EnableSocietyMoneyHUDElement() + + ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) + UpdateSocietyMoneyHUDElement(money) + end, ESX.PlayerData.job.name) + end +end + +RegisterNetEvent('esx_addonaccount:setMoney') +AddEventHandler('esx_addonaccount:setMoney', function(society, money) + if ESX.PlayerData.job and ESX.PlayerData.job.grade_name == 'boss' and 'society_' .. ESX.PlayerData.job.name == society then + UpdateSocietyMoneyHUDElement(money) + end end) function EnableSocietyMoneyHUDElement() @@ -17,12 +50,16 @@ function EnableSocietyMoneyHUDElement() money = 0 }) end + + TriggerEvent('esx_society:toggleSocietyHud', true) end function DisableSocietyMoneyHUDElement() if ESX.GetConfig().EnableHud then ESX.UI.HUD.RemoveElement('society_money') end + + TriggerEvent('esx_society:toggleSocietyHud', false) end function UpdateSocietyMoneyHUDElement(money) @@ -31,6 +68,8 @@ function UpdateSocietyMoneyHUDElement(money) money = ESX.Math.GroupDigits(money) }) end + + TriggerEvent('esx_society:setSocietyMoney', money) end function OpenBossMenu(society, close, options) @@ -388,46 +427,6 @@ function OpenManageGradesMenu(society) end -RegisterNetEvent('esx:playerLoaded') -AddEventHandler('esx:playerLoaded', function(xPlayer) - PlayerData = xPlayer - - DisableSocietyMoneyHUDElement() - - if PlayerData.job.grade_name == 'boss' then - EnableSocietyMoneyHUDElement() - - ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) - UpdateSocietyMoneyHUDElement(money) - end, PlayerData.job.name) - - end -end) - -RegisterNetEvent('esx:setJob') -AddEventHandler('esx:setJob', function(job) - PlayerData.job = job - - DisableSocietyMoneyHUDElement() - - if PlayerData.job.grade_name == 'boss' then - EnableSocietyMoneyHUDElement() - - ESX.TriggerServerCallback('esx_society:getSocietyMoney', function(money) - UpdateSocietyMoneyHUDElement(money) - end, PlayerData.job.name) - - end - -end) - -RegisterNetEvent('esx_addonaccount:setMoney') -AddEventHandler('esx_addonaccount:setMoney', function(society, money) - if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == society then - UpdateSocietyMoneyHUDElement(money) - end -end) - AddEventHandler('esx_society:openBossMenu', function(society, close, options) OpenBossMenu(society, close, options) end) diff --git a/config.lua b/config.lua index 2eb622be..f2327406 100644 --- a/config.lua +++ b/config.lua @@ -1,4 +1,5 @@ -Config = {} -Config.Locale = 'fr' -Config.EnableESXIdentity = false -Config.MaxSalary = 3500 +Config = {} + +Config.Locale = 'fr' +Config.EnableESXIdentity = false +Config.MaxSalary = 3500 diff --git a/server/main.lua b/server/main.lua index 3441788e..37aebd48 100644 --- a/server/main.lua +++ b/server/main.lua @@ -41,7 +41,7 @@ AddEventHandler('esx_society:registerSociety', function(name, label, account, da for i=1, #RegisteredSocieties, 1 do if RegisteredSocieties[i].name == name then - found = true + found = true RegisteredSocieties[i] = society break end @@ -82,7 +82,7 @@ AddEventHandler('esx_society:depositMoney', function(society, amount) local xPlayer = ESX.GetPlayerFromId(source) local society = GetSociety(society) - if amount > 0 and xPlayer.get('money') >= amount then + if amount > 0 and xPlayer.getMoney() >= amount then TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) xPlayer.removeMoney(amount) @@ -105,8 +105,7 @@ AddEventHandler('esx_society:washMoney', function(society, amount) xPlayer.removeAccountMoney('black_money', amount) - MySQL.Async.execute('INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', - { + MySQL.Async.execute('INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', { ['@identifier'] = xPlayer.identifier, ['@society'] = society, ['@amount'] = amount @@ -126,6 +125,7 @@ AddEventHandler('esx_society:putVehicleInGarage', function(societyName, vehicle) TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} + table.insert(garage, vehicle) store.set('garage', garage) end) @@ -152,7 +152,7 @@ end) ESX.RegisterServerCallback('esx_society:getSocietyMoney', function(source, cb, societyName) local society = GetSociety(societyName) - if society ~= nil then + if society then TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) cb(account.money) @@ -225,16 +225,16 @@ ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) end) job.grades = grades + cb(job) end) ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade, type) - local xPlayer = ESX.GetPlayerFromId(source) local xTarget = ESX.GetPlayerFromIdentifier(identifier) - if xTarget ~= nil then + if xTarget then xTarget.setJob(job, grade) if type == 'hire' then @@ -247,8 +247,7 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier cb() else - MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', - { + MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', { ['@job'] = job, ['@job_grade'] = grade, ['@identifier'] = identifier @@ -256,33 +255,27 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier cb() end) end - end) ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) - - MySQL.Async.execute('UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', - { + MySQL.Async.execute('UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', { ['@salary'] = salary, ['@job_name'] = job, ['@grade'] = grade }, function(rowsChanged) - Jobs[job].grades[tostring(grade)].salary = salary local xPlayers = ESX.GetPlayers() for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + if xPlayer.job.name == job and xPlayer.job.grade == grade then xPlayer.setJob(job, grade) end - end cb() end) - end) ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) @@ -304,6 +297,7 @@ end) ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, cb, societyName) local society = GetSociety(societyName) + TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} cb(garage) @@ -324,16 +318,16 @@ end) function WashMoneyCRON(d, h, m) MySQL.Async.fetchAll('SELECT * FROM society_moneywash', {}, function(result) for i=1, #result, 1 do + local society = GetSociety(result[i].society) + local xPlayer = ESX.GetPlayerFromIdentifier(result[i].identifier) -- add society money - local society = GetSociety(result[i].society) TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) account.addMoney(result[i].amount) end) -- send notification if player is online - local xPlayer = ESX.GetPlayerFromIdentifier(result[i].identifier) - if xPlayer ~= nil then + if xPlayer then TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered', ESX.Math.GroupDigits(result[i].amount))) end From 87d55985783dbf128aaa95958ea1be3c699cdd22 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Thu, 28 Feb 2019 11:52:10 +0100 Subject: [PATCH 58/85] Security improvements --- server/main.lua | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/server/main.lua b/server/main.lua index 37aebd48..5a9f9bac 100644 --- a/server/main.lua +++ b/server/main.lua @@ -64,6 +64,12 @@ RegisterServerEvent('esx_society:withdrawMoney') AddEventHandler('esx_society:withdrawMoney', function(society, amount) local xPlayer = ESX.GetPlayerFromId(source) local society = GetSociety(society) + amount = ESX.Math.Round(tonumber(amount)) + + if xPlayer.job.name ~= society then + print(('esx_society: %s attempted to call withdrawMoney!'):format(xPlayer.identifier)) + return + end TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) if amount > 0 and account.money >= amount then @@ -81,6 +87,12 @@ RegisterServerEvent('esx_society:depositMoney') AddEventHandler('esx_society:depositMoney', function(society, amount) local xPlayer = ESX.GetPlayerFromId(source) local society = GetSociety(society) + amount = ESX.Math.Round(tonumber(amount)) + + if xPlayer.job.name ~= society then + print(('esx_society: %s attempted to call depositMoney!'):format(xPlayer.identifier)) + return + end if amount > 0 and xPlayer.getMoney() >= amount then @@ -100,9 +112,14 @@ RegisterServerEvent('esx_society:washMoney') AddEventHandler('esx_society:washMoney', function(society, amount) local xPlayer = ESX.GetPlayerFromId(source) local account = xPlayer.getAccount('black_money') - amount = tonumber(amount) - if amount and amount > 0 and account.money >= amount then + amount = ESX.Math.Round(tonumber(amount)) + if xPlayer.job.name ~= society then + print(('esx_society: %s attempted to call washMoney!'):format(xPlayer.identifier)) + return + end + + if amount and amount > 0 and account.money >= amount then xPlayer.removeAccountMoney('black_money', amount) MySQL.Async.execute('INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', { @@ -112,7 +129,6 @@ AddEventHandler('esx_society:washMoney', function(society, amount) }, function(rowsChanged) TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have', ESX.Math.GroupDigits(amount))) end) - else TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) end @@ -153,11 +169,9 @@ ESX.RegisterServerCallback('esx_society:getSocietyMoney', function(source, cb, s local society = GetSociety(societyName) if society then - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) cb(account.money) end) - else cb(0) end @@ -304,16 +318,20 @@ ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, c end) end) -ESX.RegisterServerCallback('esx_society:isBoss', function(source, cb, jobName) +ESX.RegisterServerCallback('esx_society:isBoss', function(source, cb, job) + cb(isPlayerBoss(source, job)) +end) + +function isPlayerBoss(playerId, job) local xPlayer = ESX.GetPlayerFromId(source) - if xPlayer.job.name == jobName and xPlayer.job.grade_name == 'boss' then - cb(true) + if xPlayer.job.name == job and xPlayer.job.grade_name == 'boss' then + return true else print(('esx_society: %s attempted open a society boss menu!'):format(xPlayer.identifier)) - cb(false) + return false end -end) +end function WashMoneyCRON(d, h, m) MySQL.Async.fetchAll('SELECT * FROM society_moneywash', {}, function(result) From 7ac374439434a9cdcc1abcf022567704114733c9 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Thu, 28 Feb 2019 12:01:09 +0100 Subject: [PATCH 59/85] Fixed security mistakes --- server/main.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/main.lua b/server/main.lua index 5a9f9bac..290fe905 100644 --- a/server/main.lua +++ b/server/main.lua @@ -66,7 +66,7 @@ AddEventHandler('esx_society:withdrawMoney', function(society, amount) local society = GetSociety(society) amount = ESX.Math.Round(tonumber(amount)) - if xPlayer.job.name ~= society then + if xPlayer.job.name ~= society.name then print(('esx_society: %s attempted to call withdrawMoney!'):format(xPlayer.identifier)) return end @@ -89,7 +89,7 @@ AddEventHandler('esx_society:depositMoney', function(society, amount) local society = GetSociety(society) amount = ESX.Math.Round(tonumber(amount)) - if xPlayer.job.name ~= society then + if xPlayer.job.name ~= society.name then print(('esx_society: %s attempted to call depositMoney!'):format(xPlayer.identifier)) return end @@ -114,7 +114,7 @@ AddEventHandler('esx_society:washMoney', function(society, amount) local account = xPlayer.getAccount('black_money') amount = ESX.Math.Round(tonumber(amount)) - if xPlayer.job.name ~= society then + if xPlayer.job.name ~= society.name then print(('esx_society: %s attempted to call washMoney!'):format(xPlayer.identifier)) return end @@ -323,7 +323,7 @@ ESX.RegisterServerCallback('esx_society:isBoss', function(source, cb, job) end) function isPlayerBoss(playerId, job) - local xPlayer = ESX.GetPlayerFromId(source) + local xPlayer = ESX.GetPlayerFromId(playerId) if xPlayer.job.name == job and xPlayer.job.grade_name == 'boss' then return true From b3e7209f019e277584d43cfbd1de4a26c7c80dd1 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Tue, 2 Apr 2019 22:36:25 +0200 Subject: [PATCH 60/85] Fixed society vulnerabilities --- client/main.lua | 46 +++++++------------------ config.lua | 6 ++-- server/main.lua | 92 +++++++++++++++++++++++++++++-------------------- 3 files changed, 71 insertions(+), 73 deletions(-) diff --git a/client/main.lua b/client/main.lua index 503d69a2..27685af5 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,4 +1,4 @@ -ESX = nil +ESX = nil local base64MoneyIcon = 'data:image/png;base64,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/GMzLdsAADhgaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6MDk6MTUgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0xMC0wOVQyMDoxNDo0NyswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMTAtMDlUMjA6MTQ6NDcrMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NmZkNGVlNjgtOWU3Mi1jYTQxLTg5NjMtMWRjMmI2M2EzYWExPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2ZmQ0ZWU2OC05ZTcyLWNhNDEtODk2My0xZGMyYjYzYTNhYTE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj45NjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTgwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjE4MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg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' @@ -123,8 +123,7 @@ function OpenBossMenu(society, close, options) table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) end - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'boss_actions_' .. society, - { + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'boss_actions_' .. society, { title = _U('boss_menu'), align = 'top-left', elements = elements @@ -151,8 +150,7 @@ function OpenBossMenu(society, close, options) elseif data.current.value == 'deposit_money' then - ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, - { + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, { title = _U('deposit_amount') }, function(data, menu) @@ -171,8 +169,7 @@ function OpenBossMenu(society, close, options) elseif data.current.value == 'wash_money' then - ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, - { + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, { title = _U('wash_money_amount') }, function(data, menu) @@ -205,8 +202,7 @@ end function OpenManageEmployeesMenu(society) - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'manage_employees_' .. society, - { + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'manage_employees_' .. society, { title = _U('employee_management'), align = 'top-left', elements = { @@ -238,7 +234,6 @@ function OpenEmployeeList(society) } for i=1, #employees, 1 do - local gradeLabel = (employees[i].job.grade_label == '' and employees[i].job.label or employees[i].job.grade_label) table.insert(elements.rows, { @@ -257,18 +252,13 @@ function OpenEmployeeList(society) if data.value == 'promote' then menu.close() OpenPromoteMenu(society, employee) - end - - if data.value == 'fire' then - - TriggerEvent('esx:showNotification', _U('you_have_fired', employee.name)) + elseif data.value == 'fire' then + ESX.ShowNotification(_U('you_have_fired', employee.name)) ESX.TriggerServerCallback('esx_society:setJob', function() OpenEmployeeList(society) end, employee.identifier, 'unemployed', 0, 'fire') - end - end, function(data, menu) menu.close() OpenManageEmployeesMenu(society) @@ -295,15 +285,13 @@ function OpenRecruitMenu(society) end end - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'recruit_' .. society, - { + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'recruit_' .. society, { title = _U('recruiting'), align = 'top-left', elements = elements }, function(data, menu) - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'recruit_confirm_' .. society, - { + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'recruit_confirm_' .. society, { title = _U('do_you_want_to_recruit', data.current.name), align = 'top-left', elements = { @@ -311,19 +299,15 @@ function OpenRecruitMenu(society) {label = _U('yes'), value = 'yes'} } }, function(data2, menu2) - menu2.close() if data2.current.value == 'yes' then - - TriggerEvent('esx:showNotification', _U('you_have_hired', data.current.name)) + ESX.ShowNotification(_U('you_have_hired', data.current.name)) ESX.TriggerServerCallback('esx_society:setJob', function() OpenRecruitMenu(society) end, data.current.identifier, society, 0, 'hire') - end - end, function(data2, menu2) menu2.close() end) @@ -352,20 +336,17 @@ function OpenPromoteMenu(society, employee) }) end - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'promote_employee_' .. society, - { + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'promote_employee_' .. society, { title = _U('promote_employee', employee.name), align = 'top-left', elements = elements }, function(data, menu) menu.close() - - TriggerEvent('esx:showNotification', _U('you_have_promoted', employee.name, data.current.label)) + ESX.ShowNotification(_U('you_have_promoted', employee.name, data.current.label)) ESX.TriggerServerCallback('esx_society:setJob', function() OpenEmployeeList(society) end, employee.identifier, society, data.current.value, 'promote') - end, function(data, menu) menu.close() OpenEmployeeList(society) @@ -390,8 +371,7 @@ function OpenManageGradesMenu(society) }) end - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'manage_grades_' .. society, - { + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'manage_grades_' .. society, { title = _U('salary_management'), align = 'top-left', elements = elements diff --git a/config.lua b/config.lua index f2327406..cb4eb304 100644 --- a/config.lua +++ b/config.lua @@ -1,5 +1,5 @@ -Config = {} +Config = {} -Config.Locale = 'fr' +Config.Locale = 'fr' Config.EnableESXIdentity = false -Config.MaxSalary = 3500 +Config.MaxSalary = 3500 diff --git a/server/main.lua b/server/main.lua index 290fe905..ce4bd4d3 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,6 +1,6 @@ -ESX = nil -Jobs = {} -RegisteredSocieties = {} +ESX = nil +local Jobs = {} +local RegisteredSocieties = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) @@ -95,14 +95,12 @@ AddEventHandler('esx_society:depositMoney', function(society, amount) end if amount > 0 and xPlayer.getMoney() >= amount then - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) xPlayer.removeMoney(amount) account.addMoney(amount) end) TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited', ESX.Math.GroupDigits(amount))) - else TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) end @@ -246,50 +244,70 @@ end) ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade, type) local xPlayer = ESX.GetPlayerFromId(source) - local xTarget = ESX.GetPlayerFromIdentifier(identifier) + local isBoss = xPlayer.job.grade_name == 'boss' - if xTarget then - xTarget.setJob(job, grade) + if isBoss then + local xTarget = ESX.GetPlayerFromIdentifier(identifier) - if type == 'hire' then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_hired', job)) - elseif type == 'promote' then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_promoted')) - elseif type == 'fire' then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_fired', xTarget.getJob().label)) - end + if xTarget then + xTarget.setJob(job, grade) + + if type == 'hire' then + TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_hired', job)) + elseif type == 'promote' then + TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_promoted')) + elseif type == 'fire' then + TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_fired', xTarget.getJob().label)) + end - cb() - else - MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', { - ['@job'] = job, - ['@job_grade'] = grade, - ['@identifier'] = identifier - }, function(rowsChanged) cb() - end) + else + MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', { + ['@job'] = job, + ['@job_grade'] = grade, + ['@identifier'] = identifier + }, function(rowsChanged) + cb() + end) + end + else + print(('esx_society: %s attempted to setJob'):format(xPlayer.identifier)) + cb() end end) ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) - MySQL.Async.execute('UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', { - ['@salary'] = salary, - ['@job_name'] = job, - ['@grade'] = grade - }, function(rowsChanged) - Jobs[job].grades[tostring(grade)].salary = salary - local xPlayers = ESX.GetPlayers() + local isBoss = isPlayerBoss(source, job) + local identifier = GetPlayerIdentifier(source, 0) - for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + if isBoss then + if salary <= Config.MaxSalary then + MySQL.Async.execute('UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', { + ['@salary'] = salary, + ['@job_name'] = job, + ['@grade'] = grade + }, function(rowsChanged) + Jobs[job].grades[tostring(grade)].salary = salary + local xPlayers = ESX.GetPlayers() - if xPlayer.job.name == job and xPlayer.job.grade == grade then - xPlayer.setJob(job, grade) - end + for i=1, #xPlayers, 1 do + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + + if xPlayer.job.name == job and xPlayer.job.grade == grade then + xPlayer.setJob(job, grade) + end + end + + cb() + end) + else + print(('esx_society: %s attempted to setJobSalary over config limit!'):format(identifier)) + cb() end - + else + print(('esx_society: %s attempted to setJobSalary'):format(identifier)) cb() - end) + end end) ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) From 1729bc5b48d823741d31fa1eb8f74a716545d9de Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 22 Apr 2019 12:08:10 +0200 Subject: [PATCH 61/85] Fixed washing money, closes #77 --- server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/main.lua b/server/main.lua index ce4bd4d3..ad8b4f1a 100644 --- a/server/main.lua +++ b/server/main.lua @@ -112,7 +112,7 @@ AddEventHandler('esx_society:washMoney', function(society, amount) local account = xPlayer.getAccount('black_money') amount = ESX.Math.Round(tonumber(amount)) - if xPlayer.job.name ~= society.name then + if xPlayer.job.name ~= society then print(('esx_society: %s attempted to call washMoney!'):format(xPlayer.identifier)) return end From 3ea931b940c1be5cc399fd61e51dbe7a0f92ff0e Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 20 May 2019 23:13:41 +0200 Subject: [PATCH 62/85] Resized base64 image --- client/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index 27685af5..e6ede08b 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,6 +1,6 @@ ESX = nil -local base64MoneyIcon = 'data:image/png;base64,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/GMzLdsAADhgaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6MDk6MTUgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0xMC0wOVQyMDoxNDo0NyswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMTAtMDlUMjA6MTQ6NDcrMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NmZkNGVlNjgtOWU3Mi1jYTQxLTg5NjMtMWRjMmI2M2EzYWExPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjZmZDRlZTY4LTllNzItY2E0MS04OTYzLTFkYzJiNjNhM2FhMTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2ZmQ0ZWU2OC05ZTcyLWNhNDEtODk2My0xZGMyYjYzYTNhYTE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMTAtMDlUMjA6MTM6MTYrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj45NjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTgwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjE4MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg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' +local base64MoneyIcon = 'iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQAAACmvPCmwPCuwPiywPi2wPy6xQC6xQS+yQTCxQTCyQTCyQjGyQzKyRDOzRTSzRTSzRjW0RjW0Rza0SDe0STi0STm1Sjq1Szq2Szu2TDy2TDy2TT22Tj63Tz+3UEC4UEG4UUG4UkK4U0O5VES5VEW6VUa6Vke6V0i7WEm7WUu8Wku8W0y8W028XE29XU++XlC9X1C+X1G+YFK+YVO/YlW/ZFXAZFfAZVfAZljBZlnBZ1rBaVvCaVvCalzDal7CbF/DbV/EbWHEbmLEb2LEcGTFcWfGdGjHdWrHd2vId2vIeGzIeW3JenHKfXLKfnPLf3TLgHXLgXXMgHXMgXbMgnjNg3nMhHrNhnrOhnzOiH7PiYLQjYPRjoTRjoTRj4XRkIXSkIfSkojSk4rUlYzUlo7VmJDWmpHWm5LXnJTXnZTXnpXYnpbYn5nZopzapJ3bpZ7bpp7bp6DcqKLcqqPcq6Tcq6TdrKberqjfr6jfsKnfsavgs6zgs6zgtK7hta/htrDit7LiuLLiubPjurTjurXju7bkvLbkvbnlv7rlwLrmwLzmwr3nw77nxMDnxcLox8PpyMTpycXpysXqysbqy8fqzMnrzcrrz8vsz8vs0Mzs0c3t0tHu1dHu1tPv19Tv2NXv2dXw2dbw2tfw29jw3Nnx3drx3t7z4d/z4uD04+H05OP15eP15uT15uT15+X16OX26Of26en36+r37Ov37er47Ov47ez47e347u347+758PD58fD68fD68vL69PT79fX79vb79/b89vb89/f8+Pj9+fn9+vr9+/v++/v+/Pz+/P3+/f3+/v7//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALfZHJgAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGHRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4xLjb9TgnoAAAGdUlEQVRoQ7WZ93sURRiAFZO76O1eklt215OgBwqJgmgCRhAhRrAAiogBK4gBJEFEgWAEYiGIYEGp1kjXQECkiF0OWyjJ/k34zcy3db7Zu8fHe3/KTXnzPbPT56orRTEYAhMLUFgNKkeiGH8BNaV1KWSPVXveU9s3LW9pvhdoblm+afspTHZi5Wo1BnzpaOfcnFmWSBv29YBtpBNlZm5u59FLPDsmdJUaxQeXNugZw5IwMnrD0oO8iFKuUHNx/+bGZLWNMgm7Otm4uZ/LsVIEUs3F+Y5a3USNAlOv7cgr5ZSamQffyOnKgH1sPdfFi2PVILKaReEcmKwVIWbY2uQDvApW95HULIb+Ng0rFoXWxppcCjyqZuZjk4oNWWBrk44R7oiamXdkC3w9GTO7Q3aH1cy8OkWFnHtitstM4j/bqdWSO6Rm5nYdS4e5FbKQwxlMC6G3Q1bIHVQz8+IKLBphJLdydlRjWpiKxZAXdAfUPOak4gOO4FZOdxWmhbGTkbh9NTOvoVsDuGmAaxkdlZgWRV8Dub7bV0PyzhQWkqk5z7WMdjpqILUTslEXUEPQJ7Lq7pz9WXiBZ4iZUGBnTwTCdtVgvjgxpj+b3vTvTEteq5KbEy/6blcNVZapR3cmdc9Z4QV6Pnxzdr1GF9aWQQFUohqCPqQc3ZV17X3C6tP31kyL+Jy2dsgLW6jBPDgVc6OkR3XxCV/i9IqRRFedylxc6qk30L3DNF7ikz1Jft0oLOaT2hBSg/l8jmwOo24/amimYzkfOwfdlLtdNT1YjIaf0EFzgGhuNnB8teNcqCWDvs3vzSSLqC9Ze0F0EqaGoDeSQWt7UaHgXA0WDKFvFGEzNRS6mxot6VZhUNJNdm7zbsgSagj6UAKTQ5hnhEHJffRISIi+LdRLyNn9cTSoOExP3FZmiat2nIF66t9Xb0GFz8Df+AenVTEF2vUwAzM1BN1LfsTkcVS4bJs+fnRj84z3joqf+eFYUELvZWFzdSfZHjeeEwqXl6/myWaZ0bSVDf3uJP9NkOn01HPISXIMTJAB/hiB6WBPN+xxBpvxl4wxR6ihll8pSL1QupwLLhR22YL9ysVGrKRcfZJeAu4QSo+1yWA3rla2NGCeZGpoj13lmBJm1F/odDm+fv68phorU0l+miDlu6BFmLqbHDCWdhqVQQb/zPesW1inqxdoRqIb1SvSmBJG+wR1BF+/NkmLWUnTK1DdQq+i5gvoIbn85QPqtdRoQfU0TIgy4h/UKOi+gZ5DgGmonqIoob2CDhXHblE0ij2lgNo2YMcSy7fkhF2E2rIm/IoOFV/Q+78i1JkJheJ+jOzjnlr1GRk18swa4iC9t3U/o6LzCVLTP4dlVM14LBfC63yKIYOYeuMqcRoneZFqEW/IKAY6Q8xumla3YP2+PNnNt1Jqb6Arpifg5kXuHjNTaVi1s5/eJs0r+6gFUkxP6kkV2mKBs8UMZSYMdmAJcpxqTTGpqpcCEO1znCMTwlPFNbuF0uUs1UVwKYAWoRcwGDHsbNS/algwu+J1bvToI9TuAgZqetm1roPVk/FDazbhjaryr0SiSw/R1oFll94sWNnfsLrzS1eTkawyjKrE6HcwyeVtIix3s6Dc4ljzsTbnx74P1na83+uf8ZBn5cb0tjgsbHJjlvoMa8dxWT4XBDZmoCa3k7eH9yE0u4l9jr+dZN2P2ASnVorK8TwoVwxsglnYxNY9852oHMseogMEt+4QtnzgGDoTa8eRH4ulA4QOHCxs6ZhUBdNAIS7NIjp1+JgEaulwZzwsnXCjDDxPzB+Rwx1zS0fSoVZb/Mp4/lFqQxk5kjI1cZDWa179HTUEe8eRW9XoQZq5qeN/5fCFigWmd14VNRXLx3/et8lLC7N8XNtH0VP6mXfvV+z4iEsLFrbqqkXXho2Z8dynwgo8NdZK0SXpqxbmjrsgquhCsXrhgOYgL4h4k8Rca5VvFV7gTkySUVxrsbBjLuOGfMy1jCZFa6gv47hbeYU4ZA/XMmbRy13MFaJwqy4+Ez1cy3iSVsddfGLcdJvo33Ato5VcSeOva4WbvmQ2v+daxkrqfqXQJbNwk1fj9kOPuNwlZxdxNS7c5IW+MdRFMhd3oS/cpXmG4EOnRI8nAAt8sKsETz4AK1yahyqAy0vxvAaU7lEQcJ8yj9BPmUf+81MmR8iB//kBllOyZ2NOqR67XUAVABNjuXLlX2rCcoFjOcGoAAAAAElFTkSuQmCC' Citizen.CreateThread(function() while ESX == nil do From 2c5f4e1ba60a833cb74bdc474f146719e3fcf8eb Mon Sep 17 00:00:00 2001 From: depp <50743267+Zeedfy@users.noreply.github.com> Date: Fri, 14 Jun 2019 17:20:59 +0700 Subject: [PATCH 63/85] Update main.lua --- client/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index e6ede08b..e1d55c6b 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,6 +1,6 @@ ESX = nil -local base64MoneyIcon = 'iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQAAACmvPCmwPCuwPiywPi2wPy6xQC6xQS+yQTCxQTCyQTCyQjGyQzKyRDOzRTSzRTSzRjW0RjW0Rza0SDe0STi0STm1Sjq1Szq2Szu2TDy2TDy2TT22Tj63Tz+3UEC4UEG4UUG4UkK4U0O5VES5VEW6VUa6Vke6V0i7WEm7WUu8Wku8W0y8W028XE29XU++XlC9X1C+X1G+YFK+YVO/YlW/ZFXAZFfAZVfAZljBZlnBZ1rBaVvCaVvCalzDal7CbF/DbV/EbWHEbmLEb2LEcGTFcWfGdGjHdWrHd2vId2vIeGzIeW3JenHKfXLKfnPLf3TLgHXLgXXMgHXMgXbMgnjNg3nMhHrNhnrOhnzOiH7PiYLQjYPRjoTRjoTRj4XRkIXSkIfSkojSk4rUlYzUlo7VmJDWmpHWm5LXnJTXnZTXnpXYnpbYn5nZopzapJ3bpZ7bpp7bp6DcqKLcqqPcq6Tcq6TdrKberqjfr6jfsKnfsavgs6zgs6zgtK7hta/htrDit7LiuLLiubPjurTjurXju7bkvLbkvbnlv7rlwLrmwLzmwr3nw77nxMDnxcLox8PpyMTpycXpysXqysbqy8fqzMnrzcrrz8vsz8vs0Mzs0c3t0tHu1dHu1tPv19Tv2NXv2dXw2dbw2tfw29jw3Nnx3drx3t7z4d/z4uD04+H05OP15eP15uT15uT15+X16OX26Of26en36+r37Ov37er47Ov47ez47e347u347+758PD58fD68fD68vL69PT79fX79vb79/b89vb89/f8+Pj9+fn9+vr9+/v++/v+/Pz+/P3+/f3+/v7//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALfZHJgAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGHRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4xLjb9TgnoAAAGdUlEQVRoQ7WZ93sURRiAFZO76O1eklt215OgBwqJgmgCRhAhRrAAiogBK4gBJEFEgWAEYiGIYEGp1kjXQECkiF0OWyjJ/k34zcy3db7Zu8fHe3/KTXnzPbPT56orRTEYAhMLUFgNKkeiGH8BNaV1KWSPVXveU9s3LW9pvhdoblm+afspTHZi5Wo1BnzpaOfcnFmWSBv29YBtpBNlZm5u59FLPDsmdJUaxQeXNugZw5IwMnrD0oO8iFKuUHNx/+bGZLWNMgm7Otm4uZ/LsVIEUs3F+Y5a3USNAlOv7cgr5ZSamQffyOnKgH1sPdfFi2PVILKaReEcmKwVIWbY2uQDvApW95HULIb+Ng0rFoXWxppcCjyqZuZjk4oNWWBrk44R7oiamXdkC3w9GTO7Q3aH1cy8OkWFnHtitstM4j/bqdWSO6Rm5nYdS4e5FbKQwxlMC6G3Q1bIHVQz8+IKLBphJLdydlRjWpiKxZAXdAfUPOak4gOO4FZOdxWmhbGTkbh9NTOvoVsDuGmAaxkdlZgWRV8Dub7bV0PyzhQWkqk5z7WMdjpqILUTslEXUEPQJ7Lq7pz9WXiBZ4iZUGBnTwTCdtVgvjgxpj+b3vTvTEteq5KbEy/6blcNVZapR3cmdc9Z4QV6Pnxzdr1GF9aWQQFUohqCPqQc3ZV17X3C6tP31kyL+Jy2dsgLW6jBPDgVc6OkR3XxCV/i9IqRRFedylxc6qk30L3DNF7ikz1Jft0oLOaT2hBSg/l8jmwOo24/amimYzkfOwfdlLtdNT1YjIaf0EFzgGhuNnB8teNcqCWDvs3vzSSLqC9Ze0F0EqaGoDeSQWt7UaHgXA0WDKFvFGEzNRS6mxot6VZhUNJNdm7zbsgSagj6UAKTQ5hnhEHJffRISIi+LdRLyNn9cTSoOExP3FZmiat2nIF66t9Xb0GFz8Df+AenVTEF2vUwAzM1BN1LfsTkcVS4bJs+fnRj84z3joqf+eFYUELvZWFzdSfZHjeeEwqXl6/myWaZ0bSVDf3uJP9NkOn01HPISXIMTJAB/hiB6WBPN+xxBpvxl4wxR6ihll8pSL1QupwLLhR22YL9ysVGrKRcfZJeAu4QSo+1yWA3rla2NGCeZGpoj13lmBJm1F/odDm+fv68phorU0l+miDlu6BFmLqbHDCWdhqVQQb/zPesW1inqxdoRqIb1SvSmBJG+wR1BF+/NkmLWUnTK1DdQq+i5gvoIbn85QPqtdRoQfU0TIgy4h/UKOi+gZ5DgGmonqIoob2CDhXHblE0ij2lgNo2YMcSy7fkhF2E2rIm/IoOFV/Q+78i1JkJheJ+jOzjnlr1GRk18swa4iC9t3U/o6LzCVLTP4dlVM14LBfC63yKIYOYeuMqcRoneZFqEW/IKAY6Q8xumla3YP2+PNnNt1Jqb6Arpifg5kXuHjNTaVi1s5/eJs0r+6gFUkxP6kkV2mKBs8UMZSYMdmAJcpxqTTGpqpcCEO1znCMTwlPFNbuF0uUs1UVwKYAWoRcwGDHsbNS/algwu+J1bvToI9TuAgZqetm1roPVk/FDazbhjaryr0SiSw/R1oFll94sWNnfsLrzS1eTkawyjKrE6HcwyeVtIix3s6Dc4ljzsTbnx74P1na83+uf8ZBn5cb0tjgsbHJjlvoMa8dxWT4XBDZmoCa3k7eH9yE0u4l9jr+dZN2P2ASnVorK8TwoVwxsglnYxNY9852oHMseogMEt+4QtnzgGDoTa8eRH4ulA4QOHCxs6ZhUBdNAIS7NIjp1+JgEaulwZzwsnXCjDDxPzB+Rwx1zS0fSoVZb/Mp4/lFqQxk5kjI1cZDWa179HTUEe8eRW9XoQZq5qeN/5fCFigWmd14VNRXLx3/et8lLC7N8XNtH0VP6mXfvV+z4iEsLFrbqqkXXho2Z8dynwgo8NdZK0SXpqxbmjrsgquhCsXrhgOYgL4h4k8Rca5VvFV7gTkySUVxrsbBjLuOGfMy1jCZFa6gv47hbeYU4ZA/XMmbRy13MFaJwqy4+Ez1cy3iSVsddfGLcdJvo33Ato5VcSeOva4WbvmQ2v+daxkrqfqXQJbNwk1fj9kOPuNwlZxdxNS7c5IW+MdRFMhd3oS/cpXmG4EOnRI8nAAt8sKsETz4AK1yahyqAy0vxvAaU7lEQcJ8yj9BPmUf+81MmR8iB//kBllOyZ2NOqR67XUAVABNjuXLlX2rCcoFjOcGoAAAAAElFTkSuQmCC' +local base64MoneyIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQAAACmvPCmwPCuwPiywPi2wPy6xQC6xQS+yQTCxQTCyQTCyQjGyQzKyRDOzRTSzRTSzRjW0RjW0Rza0SDe0STi0STm1Sjq1Szq2Szu2TDy2TDy2TT22Tj63Tz+3UEC4UEG4UUG4UkK4U0O5VES5VEW6VUa6Vke6V0i7WEm7WUu8Wku8W0y8W028XE29XU++XlC9X1C+X1G+YFK+YVO/YlW/ZFXAZFfAZVfAZljBZlnBZ1rBaVvCaVvCalzDal7CbF/DbV/EbWHEbmLEb2LEcGTFcWfGdGjHdWrHd2vId2vIeGzIeW3JenHKfXLKfnPLf3TLgHXLgXXMgHXMgXbMgnjNg3nMhHrNhnrOhnzOiH7PiYLQjYPRjoTRjoTRj4XRkIXSkIfSkojSk4rUlYzUlo7VmJDWmpHWm5LXnJTXnZTXnpXYnpbYn5nZopzapJ3bpZ7bpp7bp6DcqKLcqqPcq6Tcq6TdrKberqjfr6jfsKnfsavgs6zgs6zgtK7hta/htrDit7LiuLLiubPjurTjurXju7bkvLbkvbnlv7rlwLrmwLzmwr3nw77nxMDnxcLox8PpyMTpycXpysXqysbqy8fqzMnrzcrrz8vsz8vs0Mzs0c3t0tHu1dHu1tPv19Tv2NXv2dXw2dbw2tfw29jw3Nnx3drx3t7z4d/z4uD04+H05OP15eP15uT15uT15+X16OX26Of26en36+r37Ov37er47Ov47ez47e347u347+758PD58fD68fD68vL69PT79fX79vb79/b89vb89/f8+Pj9+fn9+vr9+/v++/v+/Pz+/P3+/f3+/v7//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALfZHJgAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGHRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4xLjb9TgnoAAAGdUlEQVRoQ7WZ93sURRiAFZO76O1eklt215OgBwqJgmgCRhAhRrAAiogBK4gBJEFEgWAEYiGIYEGp1kjXQECkiF0OWyjJ/k34zcy3db7Zu8fHe3/KTXnzPbPT56orRTEYAhMLUFgNKkeiGH8BNaV1KWSPVXveU9s3LW9pvhdoblm+afspTHZi5Wo1BnzpaOfcnFmWSBv29YBtpBNlZm5u59FLPDsmdJUaxQeXNugZw5IwMnrD0oO8iFKuUHNx/+bGZLWNMgm7Otm4uZ/LsVIEUs3F+Y5a3USNAlOv7cgr5ZSamQffyOnKgH1sPdfFi2PVILKaReEcmKwVIWbY2uQDvApW95HULIb+Ng0rFoXWxppcCjyqZuZjk4oNWWBrk44R7oiamXdkC3w9GTO7Q3aH1cy8OkWFnHtitstM4j/bqdWSO6Rm5nYdS4e5FbKQwxlMC6G3Q1bIHVQz8+IKLBphJLdydlRjWpiKxZAXdAfUPOak4gOO4FZOdxWmhbGTkbh9NTOvoVsDuGmAaxkdlZgWRV8Dub7bV0PyzhQWkqk5z7WMdjpqILUTslEXUEPQJ7Lq7pz9WXiBZ4iZUGBnTwTCdtVgvjgxpj+b3vTvTEteq5KbEy/6blcNVZapR3cmdc9Z4QV6Pnxzdr1GF9aWQQFUohqCPqQc3ZV17X3C6tP31kyL+Jy2dsgLW6jBPDgVc6OkR3XxCV/i9IqRRFedylxc6qk30L3DNF7ikz1Jft0oLOaT2hBSg/l8jmwOo24/amimYzkfOwfdlLtdNT1YjIaf0EFzgGhuNnB8teNcqCWDvs3vzSSLqC9Ze0F0EqaGoDeSQWt7UaHgXA0WDKFvFGEzNRS6mxot6VZhUNJNdm7zbsgSagj6UAKTQ5hnhEHJffRISIi+LdRLyNn9cTSoOExP3FZmiat2nIF66t9Xb0GFz8Df+AenVTEF2vUwAzM1BN1LfsTkcVS4bJs+fnRj84z3joqf+eFYUELvZWFzdSfZHjeeEwqXl6/myWaZ0bSVDf3uJP9NkOn01HPISXIMTJAB/hiB6WBPN+xxBpvxl4wxR6ihll8pSL1QupwLLhR22YL9ysVGrKRcfZJeAu4QSo+1yWA3rla2NGCeZGpoj13lmBJm1F/odDm+fv68phorU0l+miDlu6BFmLqbHDCWdhqVQQb/zPesW1inqxdoRqIb1SvSmBJG+wR1BF+/NkmLWUnTK1DdQq+i5gvoIbn85QPqtdRoQfU0TIgy4h/UKOi+gZ5DgGmonqIoob2CDhXHblE0ij2lgNo2YMcSy7fkhF2E2rIm/IoOFV/Q+78i1JkJheJ+jOzjnlr1GRk18swa4iC9t3U/o6LzCVLTP4dlVM14LBfC63yKIYOYeuMqcRoneZFqEW/IKAY6Q8xumla3YP2+PNnNt1Jqb6Arpifg5kXuHjNTaVi1s5/eJs0r+6gFUkxP6kkV2mKBs8UMZSYMdmAJcpxqTTGpqpcCEO1znCMTwlPFNbuF0uUs1UVwKYAWoRcwGDHsbNS/algwu+J1bvToI9TuAgZqetm1roPVk/FDazbhjaryr0SiSw/R1oFll94sWNnfsLrzS1eTkawyjKrE6HcwyeVtIix3s6Dc4ljzsTbnx74P1na83+uf8ZBn5cb0tjgsbHJjlvoMa8dxWT4XBDZmoCa3k7eH9yE0u4l9jr+dZN2P2ASnVorK8TwoVwxsglnYxNY9852oHMseogMEt+4QtnzgGDoTa8eRH4ulA4QOHCxs6ZhUBdNAIS7NIjp1+JgEaulwZzwsnXCjDDxPzB+Rwx1zS0fSoVZb/Mp4/lFqQxk5kjI1cZDWa179HTUEe8eRW9XoQZq5qeN/5fCFigWmd14VNRXLx3/et8lLC7N8XNtH0VP6mXfvV+z4iEsLFrbqqkXXho2Z8dynwgo8NdZK0SXpqxbmjrsgquhCsXrhgOYgL4h4k8Rca5VvFV7gTkySUVxrsbBjLuOGfMy1jCZFa6gv47hbeYU4ZA/XMmbRy13MFaJwqy4+Ez1cy3iSVsddfGLcdJvo33Ato5VcSeOva4WbvmQ2v+daxkrqfqXQJbNwk1fj9kOPuNwlZxdxNS7c5IW+MdRFMhd3oS/cpXmG4EOnRI8nAAt8sKsETz4AK1yahyqAy0vxvAaU7lEQcJ8yj9BPmUf+81MmR8iB//kBllOyZ2NOqR67XUAVABNjuXLlX2rCcoFjOcGoAAAAAElFTkSuQmCC' Citizen.CreateThread(function() while ESX == nil do From 0d4833d1d772c25acf21d2e05452c9f698e6fdf1 Mon Sep 17 00:00:00 2001 From: rex2630 Date: Wed, 13 Nov 2019 16:52:17 +0100 Subject: [PATCH 64/85] Support for new ESX --- server/main.lua | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/server/main.lua b/server/main.lua index ad8b4f1a..62ec3046 100644 --- a/server/main.lua +++ b/server/main.lua @@ -76,9 +76,9 @@ AddEventHandler('esx_society:withdrawMoney', function(society, amount) account.removeMoney(amount) xPlayer.addMoney(amount) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_withdrawn', ESX.Math.GroupDigits(amount))) + xPlayer.showNotification(_U('have_withdrawn', ESX.Math.GroupDigits(amount))) else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + xPlayer.showNotification(_U('invalid_amount')) end end) end) @@ -100,9 +100,9 @@ AddEventHandler('esx_society:depositMoney', function(society, amount) account.addMoney(amount) end) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('have_deposited', ESX.Math.GroupDigits(amount))) + xPlayer.showNotification(_U('have_deposited', ESX.Math.GroupDigits(amount))) else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + xPlayer.showNotification(_U('invalid_amount')) end end) @@ -125,10 +125,10 @@ AddEventHandler('esx_society:washMoney', function(society, amount) ['@society'] = society, ['@amount'] = amount }, function(rowsChanged) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have', ESX.Math.GroupDigits(amount))) + xPlayer.showNotification(_U('you_have', ESX.Math.GroupDigits(amount))) end) else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('invalid_amount')) + xPlayer.showNotification(_U('invalid_amount')) end end) @@ -253,11 +253,11 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier xTarget.setJob(job, grade) if type == 'hire' then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_hired', job)) + xPlayer.showNotification(_U('you_have_been_hired', job)) elseif type == 'promote' then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_promoted')) + xPlayer.showNotification(_U('you_have_been_promoted')) elseif type == 'fire' then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('you_have_been_fired', xTarget.getJob().label)) + xPlayer.showNotification(_U('you_have_been_fired', xTarget.getJob().label)) end cb() @@ -364,7 +364,7 @@ function WashMoneyCRON(d, h, m) -- send notification if player is online if xPlayer then - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('you_have_laundered', ESX.Math.GroupDigits(result[i].amount))) + xPlayer.showNotification(_U('you_have_laundered', ESX.Math.GroupDigits(result[i].amount))) end MySQL.Async.execute('DELETE FROM society_moneywash WHERE id = @id', { From 0e5497b91483373174be401874b0950dc73ca687 Mon Sep 17 00:00:00 2001 From: rex2630 Date: Wed, 13 Nov 2019 21:31:49 +0100 Subject: [PATCH 65/85] Added Czech locale (#83) * Czech file lang added * Added czech language * Fix --- __resource.lua | 2 ++ locales/cs.lua | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 locales/cs.lua diff --git a/__resource.lua b/__resource.lua index 69f31ce0..a0ea656d 100644 --- a/__resource.lua +++ b/__resource.lua @@ -12,6 +12,7 @@ server_scripts { 'locales/fr.lua', 'locales/sv.lua', 'locales/pl.lua', + 'locales/cs.lua', 'config.lua', 'server/main.lua' } @@ -23,6 +24,7 @@ client_scripts { 'locales/fr.lua', 'locales/sv.lua', 'locales/pl.lua', + 'locales/cs.lua', 'config.lua', 'client/main.lua' } diff --git a/locales/cs.lua b/locales/cs.lua new file mode 100644 index 00000000..46eb10a9 --- /dev/null +++ b/locales/cs.lua @@ -0,0 +1,37 @@ +Locales['cs'] = { + ['actions'] = 'akce', + ['boss_menu'] = 'akce šéfa', + ['money_generic'] = '$%s', + ['deposit_amount'] = 'množství vkladu', + ['deposit_society_money'] = 'vložit peníze do společnosti', + ['do_you_want_to_recruit'] = 'chceš najmout %s?', + ['employee'] = 'zaměstnanec', + ['employee_list'] = 'seznam zaměstnanců', + ['employee_management'] = 'správa zaměstnanců', + ['fire'] = 'vyhodit', + ['grade'] = 'povýšit', + ['have_deposited'] = 'vložil jsi ~r~$%s~s~', + ['have_withdrawn'] = 'vybral jsi ~g~$%s~s~', + ['invalid_amount'] = 'neplatná částka', + ['invalid_amount_max'] = 'tento plat není povolen', + ['no'] = 'ne', + ['promote'] = 'povýšit', + ['promote_employee'] = 'povýšit %s', + ['recruit'] = 'najmout', + ['recruiting'] = 'najímání', + ['salary_amount'] = 'váše platu', + ['salary_management'] = 'správa platů', + ['wash_money'] = 'vyprat peníze', + ['wash_money_amount'] = 'množství na vyprání', + ['withdraw_amount'] = 'výběr peněz', + ['withdraw_society_money'] = 'vybrat peníze společnosti', + ['yes'] = 'ano', + ['you_have'] = 'máš ~g~$%s~s~ čekajících na vyprání~s~ (24h).', + ['you_have_laundered'] = '~r~Vypral jsi~s~ tvé peníze: ~g~$%s~s~', + ['you_have_hired'] = 'najmul jsi %s', + ['you_have_been_hired'] = 'byl jsi najmut hráčem %s', + ['you_have_fired'] = 'vyhodil jsi %s', + ['you_have_been_fired'] = 'byl jsi vyhozen hráčem %s', + ['you_have_promoted'] = 'byl jsi povýšen hráčem %s na %s', + ['you_have_been_promoted'] = 'byl jsi ~b~povýšen~s~!', +} From 08000e4afbe41cbbd691b2fd061accde466af46a Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Wed, 13 Nov 2019 21:40:49 +0100 Subject: [PATCH 66/85] Fixed xPlayer notification mistake, rewrote statements --- server/main.lua | 87 +++++++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 46 deletions(-) diff --git a/server/main.lua b/server/main.lua index 62ec3046..4cb443e4 100644 --- a/server/main.lua +++ b/server/main.lua @@ -36,7 +36,7 @@ AddEventHandler('esx_society:registerSociety', function(name, label, account, da account = account, datastore = datastore, inventory = inventory, - data = data, + data = data } for i=1, #RegisteredSocieties, 1 do @@ -66,21 +66,20 @@ AddEventHandler('esx_society:withdrawMoney', function(society, amount) local society = GetSociety(society) amount = ESX.Math.Round(tonumber(amount)) - if xPlayer.job.name ~= society.name then + if xPlayer.job.name == society.name then + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + if amount > 0 and account.money >= amount then + account.removeMoney(amount) + xPlayer.addMoney(amount) + + xPlayer.showNotification(_U('have_withdrawn', ESX.Math.GroupDigits(amount))) + else + xPlayer.showNotification(_U('invalid_amount')) + end + end) + else print(('esx_society: %s attempted to call withdrawMoney!'):format(xPlayer.identifier)) - return end - - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - if amount > 0 and account.money >= amount then - account.removeMoney(amount) - xPlayer.addMoney(amount) - - xPlayer.showNotification(_U('have_withdrawn', ESX.Math.GroupDigits(amount))) - else - xPlayer.showNotification(_U('invalid_amount')) - end - end) end) RegisterServerEvent('esx_society:depositMoney') @@ -89,20 +88,19 @@ AddEventHandler('esx_society:depositMoney', function(society, amount) local society = GetSociety(society) amount = ESX.Math.Round(tonumber(amount)) - if xPlayer.job.name ~= society.name then - print(('esx_society: %s attempted to call depositMoney!'):format(xPlayer.identifier)) - return - end + if xPlayer.job.name == society.name then + if amount > 0 and xPlayer.getMoney() >= amount then + TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) + xPlayer.removeMoney(amount) + account.addMoney(amount) + end) - if amount > 0 and xPlayer.getMoney() >= amount then - TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) - xPlayer.removeMoney(amount) - account.addMoney(amount) - end) - - xPlayer.showNotification(_U('have_deposited', ESX.Math.GroupDigits(amount))) + xPlayer.showNotification(_U('have_deposited', ESX.Math.GroupDigits(amount))) + else + xPlayer.showNotification(_U('invalid_amount')) + end else - xPlayer.showNotification(_U('invalid_amount')) + print(('esx_society: %s attempted to call depositMoney!'):format(xPlayer.identifier)) end end) @@ -112,25 +110,23 @@ AddEventHandler('esx_society:washMoney', function(society, amount) local account = xPlayer.getAccount('black_money') amount = ESX.Math.Round(tonumber(amount)) - if xPlayer.job.name ~= society then - print(('esx_society: %s attempted to call washMoney!'):format(xPlayer.identifier)) - return - end + if xPlayer.job.name == society then + if amount and amount > 0 and account.money >= amount then + xPlayer.removeAccountMoney('black_money', amount) - if amount and amount > 0 and account.money >= amount then - xPlayer.removeAccountMoney('black_money', amount) - - MySQL.Async.execute('INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', { - ['@identifier'] = xPlayer.identifier, - ['@society'] = society, - ['@amount'] = amount - }, function(rowsChanged) - xPlayer.showNotification(_U('you_have', ESX.Math.GroupDigits(amount))) - end) + MySQL.Async.execute('INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', { + ['@identifier'] = xPlayer.identifier, + ['@society'] = society, + ['@amount'] = amount + }, function(rowsChanged) + xPlayer.showNotification(_U('you_have', ESX.Math.GroupDigits(amount))) + end) + else + xPlayer.showNotification(_U('invalid_amount')) + end else - xPlayer.showNotification(_U('invalid_amount')) + print(('esx_society: %s attempted to call washMoney!'):format(xPlayer.identifier)) end - end) RegisterServerEvent('esx_society:putVehicleInGarage') @@ -241,7 +237,6 @@ ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) cb(job) end) - ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade, type) local xPlayer = ESX.GetPlayerFromId(source) local isBoss = xPlayer.job.grade_name == 'boss' @@ -253,11 +248,11 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier xTarget.setJob(job, grade) if type == 'hire' then - xPlayer.showNotification(_U('you_have_been_hired', job)) + xTarget.showNotification(_U('you_have_been_hired', job)) elseif type == 'promote' then - xPlayer.showNotification(_U('you_have_been_promoted')) + xTarget.showNotification(_U('you_have_been_promoted')) elseif type == 'fire' then - xPlayer.showNotification(_U('you_have_been_fired', xTarget.getJob().label)) + xTarget.showNotification(_U('you_have_been_fired', xTarget.getJob().label)) end cb() From f646acc89fe2d83d7e3afb5b7766304921336361 Mon Sep 17 00:00:00 2001 From: Michael Douglas Date: Fri, 17 Jan 2020 12:51:02 -0300 Subject: [PATCH 67/85] Added Portuguese locale (#84) * Correcting and improving translation * Update br.lua * Update __resource.lua --- __resource.lua | 2 ++ locales/br.lua | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 locales/br.lua diff --git a/__resource.lua b/__resource.lua index a0ea656d..c83faa79 100644 --- a/__resource.lua +++ b/__resource.lua @@ -7,6 +7,7 @@ version '1.0.4' server_scripts { '@mysql-async/lib/MySQL.lua', '@es_extended/locale.lua', + 'locales/br.lua', 'locales/en.lua', 'locales/fi.lua', 'locales/fr.lua', @@ -19,6 +20,7 @@ server_scripts { client_scripts { '@es_extended/locale.lua', + 'locales/br.lua', 'locales/en.lua', 'locales/fi.lua', 'locales/fr.lua', diff --git a/locales/br.lua b/locales/br.lua new file mode 100644 index 00000000..70d5606a --- /dev/null +++ b/locales/br.lua @@ -0,0 +1,38 @@ +Locales['br'] = { + ['actions'] = 'ações', + ['boss_menu'] = 'menu chefe', + ['money_generic'] = '$%s', + ['deposit_amount'] = 'valor do depósito', + ['deposit_society_money'] = 'depositar dinheiro da sociedade', + ['do_you_want_to_recruit'] = 'você quer recrutar %s?', + ['employee'] = 'empregado', + ['employee_list'] = 'lista de empregados', + ['employee_management'] = 'gestão de funcionários', + ['fire'] = 'fogo', + ['grade'] = 'grau(escolaridade)', + ['have_deposited'] = 'você depositou ~r~$%s~s~', + ['have_withdrawn'] = 'você retirou ~g~$%s~s~', + ['invalid_amount'] = 'montante inválido', + ['invalid_amount_max'] = 'esse salário não é permitido', + ['no'] = 'não', + ['promote'] = 'promover', + ['promote_employee'] = 'promover %s', + ['recruit'] = 'recrutar', + ['recruiting'] = 'recrutamento', + ['salary_amount'] = 'valor do salário', + ['salary_management'] = 'gestão salarial', + ['wash_money'] = 'lavar dinheiro', + ['wash_money_amount'] = 'quantidade a lavar', + ['withdraw_amount'] = 'retirar montante', + ['withdraw_society_money'] = 'retirar dinheiro da sociedade', + ['yes'] = 'sim', + ['you_have'] = 'você tem ~g~$%s~s~ esperando lavagem de dinheiro (24h).', + ['you_have_laundered'] = 'você lavou ~g~$%s~s~ do seu dinheiro ', + ['you_have_hired'] = 'você recrutou %s', + ['you_have_been_hired'] = 'você foi contratado por %s', + ['you_have_fired'] = 'você demitiu %s', + ['you_have_been_fired'] = 'você foi demitido de %s', + ['you_have_promoted'] = 'você promoveu %s a %s', + ['you_have_been_promoted'] = 'você foi promovido ~b~promoted~s~!', +} + From 535a03de98b259129497c35cc8e8ed7e6377b8f9 Mon Sep 17 00:00:00 2001 From: Willem Dekker <16556575+Willem-Dekker@users.noreply.github.com> Date: Sun, 19 Jan 2020 15:58:37 +0100 Subject: [PATCH 68/85] Added Dutch translation (#80) * added dutch translations EN->NL * Update nl.lua updated indenting Co-authored-by: Samuel --- __resource.lua | 2 ++ locales/nl.lua | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 locales/nl.lua diff --git a/__resource.lua b/__resource.lua index c83faa79..96ac4d28 100644 --- a/__resource.lua +++ b/__resource.lua @@ -13,6 +13,7 @@ server_scripts { 'locales/fr.lua', 'locales/sv.lua', 'locales/pl.lua', + 'locales/nl.lua', 'locales/cs.lua', 'config.lua', 'server/main.lua' @@ -26,6 +27,7 @@ client_scripts { 'locales/fr.lua', 'locales/sv.lua', 'locales/pl.lua', + 'locales/nl.lua', 'locales/cs.lua', 'config.lua', 'client/main.lua' diff --git a/locales/nl.lua b/locales/nl.lua new file mode 100644 index 00000000..c5aa6011 --- /dev/null +++ b/locales/nl.lua @@ -0,0 +1,38 @@ +Locales['nl'] = { + ['actions'] = 'acties', + ['boss_menu'] = 'baas menu', + ['money_generic'] = '€%s', + ['deposit_amount'] = 'stort hoeveelheid', + ['deposit_society_money'] = 'stort maatschappij geld', + ['do_you_want_to_recruit'] = 'Wil je %s aannemen?', + ['employee'] = 'werknemer', + ['employee_list'] = 'werknemer lijst', + ['employee_management'] = 'werknemer beheer', + ['fire'] = 'ontslaan', + ['grade'] = 'schaal', + ['have_deposited'] = 'je hebt gestort ~r~$%s~s~', + ['have_withdrawn'] = 'je hebt opgenomen ~g~$%s~s~', + ['invalid_amount'] = 'ongeldige hoeveelheid', + ['invalid_amount_max'] = 'dit salaris is niet toegestaan', + ['no'] = 'nee', + ['promote'] = 'promoveer', + ['promote_employee'] = 'promoveer %s', + ['recruit'] = 'werv', + ['recruiting'] = 'werven', + ['salary_amount'] = 'salaris hoeveelheid', + ['salary_management'] = 'salaris beheer', + ['wash_money'] = 'witwas geld', + ['wash_money_amount'] = 'hoeveelheid om wit te wassen', + ['withdraw_amount'] = 'opneem hoeveelheid', + ['withdraw_society_money'] = 'neem maatschappelijk geld op', + ['yes'] = 'ja', + ['you_have'] = 'je hebt ~g~€%s~s~ staan in ~y~geld witwassen~s~ (24h).', + ['you_have_laundered'] = 'je hebt je geld: ~g~€%s~s~ ~r~witgewassen~s~ ', + ['you_have_hired'] = 'je bent gevraagt %s', + ['you_have_been_hired'] = 'je bent aangenomen door %s', + ['you_have_fired'] = 'je bent ontslagen %s', + ['you_have_been_fired'] = 'je bent ondslagen van %s', + ['you_have_promoted'] = 'je hebt gepromoveerd %s naar %s', + ['you_have_been_promoted'] = 'je bent ~b~gepromoveerd~s~!', +} + From c64b2b078f0d438bcf595281cddd973f6d93412c Mon Sep 17 00:00:00 2001 From: rex2630 Date: Sun, 19 Jan 2020 17:00:24 +0100 Subject: [PATCH 69/85] Replace __resource.lua with fxmanifest.lua --- __resource.lua => fxmanifest.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename __resource.lua => fxmanifest.lua (90%) diff --git a/__resource.lua b/fxmanifest.lua similarity index 90% rename from __resource.lua rename to fxmanifest.lua index 96ac4d28..640e4723 100644 --- a/__resource.lua +++ b/fxmanifest.lua @@ -1,4 +1,6 @@ -resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' +fx_version 'adamant' + +game 'gta5' description 'ESX Society' From 135e5ee8d228c8a882ecf9ab74484b1248dcbdbd Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 17 Feb 2020 23:29:11 +0100 Subject: [PATCH 70/85] Fix for latest esx --- README.md | 3 ++- server/main.lua | 15 +++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 258d20ed..983abdd2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # esx_society + Society management for ESX. Adds employee management (hire, fire, promote / demote, change salary), society bank accounts and money washing. It's crucial that this script gets started before all resources that utilize societies do, or else many things will go wrong. ## Requirements @@ -52,7 +53,7 @@ end, {wash = false}) -- set custom options, e.g disable washing ### License esx_society - societies for ESX -Copyright (C) 2015-2018 Jérémie N'gadi +Copyright (C) 2015-2020 Jérémie N'gadi This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/server/main.lua b/server/main.lua index 4cb443e4..9960b071 100644 --- a/server/main.lua +++ b/server/main.lua @@ -272,10 +272,9 @@ ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier end) ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) - local isBoss = isPlayerBoss(source, job) - local identifier = GetPlayerIdentifier(source, 0) + local xPlayer = ESX.GetPlayerFromId(source) - if isBoss then + if xPlayer.job.name == job and xPlayer.job.grade_name == 'boss' then if salary <= Config.MaxSalary then MySQL.Async.execute('UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', { ['@salary'] = salary, @@ -286,21 +285,21 @@ ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, local xPlayers = ESX.GetPlayers() for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + local xTarget = ESX.GetPlayerFromId(xPlayers[i]) - if xPlayer.job.name == job and xPlayer.job.grade == grade then - xPlayer.setJob(job, grade) + if xTarget.job.name == job and xTarget.job.grade == grade then + xTarget.setJob(job, grade) end end cb() end) else - print(('esx_society: %s attempted to setJobSalary over config limit!'):format(identifier)) + print(('esx_society: %s attempted to setJobSalary over config limit!'):format(xPlayer.identifier)) cb() end else - print(('esx_society: %s attempted to setJobSalary'):format(identifier)) + print(('esx_society: %s attempted to setJobSalary'):format(xPlayer.identifier)) cb() end end) From fe1f55f268b395553b50707d73972003e5d60b3e Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Tue, 14 Apr 2020 16:53:06 +0200 Subject: [PATCH 71/85] Update esx_society.sql --- esx_society.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_society.sql b/esx_society.sql index 0e34e3ec..163ce9f6 100644 --- a/esx_society.sql +++ b/esx_society.sql @@ -1,4 +1,4 @@ -USE `essentialmode`; +USE `es_extended`; CREATE TABLE `society_moneywash` ( `id` int(11) NOT NULL AUTO_INCREMENT, From 083dcddfe27c7dd6f17850e6a28e3b3299cba95c Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 19 Apr 2020 20:02:06 +0200 Subject: [PATCH 72/85] Code cleanup, fixed cases of shadowing upvalue --- client/main.lua | 257 +++++++++++++++++++----------------------------- server/main.lua | 40 ++++---- 2 files changed, 121 insertions(+), 176 deletions(-) diff --git a/client/main.lua b/client/main.lua index e1d55c6b..f5deb025 100644 --- a/client/main.lua +++ b/client/main.lua @@ -73,159 +73,128 @@ function UpdateSocietyMoneyHUDElement(money) end function OpenBossMenu(society, close, options) - local isBoss = nil - local options = options or {} + options = options or {} local elements = {} - ESX.TriggerServerCallback('esx_society:isBoss', function(result) - isBoss = result + ESX.TriggerServerCallback('esx_society:isBoss', function(isBoss) + if isBoss then + local defaultOptions = { + withdraw = true, + deposit = true, + wash = true, + employees = true, + grades = true + } + + for k,v in pairs(defaultOptions) do + if options[k] == nil then + options[k] = v + end + end + + if options.withdraw then + table.insert(elements, {label = _U('withdraw_society_money'), value = 'withdraw_society_money'}) + end + + if options.deposit then + table.insert(elements, {label = _U('deposit_society_money'), value = 'deposit_money'}) + end + + if options.wash then + table.insert(elements, {label = _U('wash_money'), value = 'wash_money'}) + end + + if options.employees then + table.insert(elements, {label = _U('employee_management'), value = 'manage_employees'}) + end + + if options.grades then + table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) + end + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'boss_actions_' .. society, { + title = _U('boss_menu'), + align = 'top-left', + elements = elements + }, function(data, menu) + if data.current.value == 'withdraw_society_money' then + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, { + title = _U('withdraw_amount') + }, function(data2, menu2) + local amount = tonumber(data2.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu2.close() + TriggerServerEvent('esx_society:withdrawMoney', society, amount) + end + end, function(data2, menu2) + menu2.close() + end) + elseif data.current.value == 'deposit_money' then + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, { + title = _U('deposit_amount') + }, function(data2, menu2) + local amount = tonumber(data2.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu2.close() + TriggerServerEvent('esx_society:depositMoney', society, amount) + end + end, function(data2, menu2) + menu2.close() + end) + elseif data.current.value == 'wash_money' then + ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, { + title = _U('wash_money_amount') + }, function(data2, menu2) + local amount = tonumber(data2.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu2.close() + TriggerServerEvent('esx_society:washMoney', society, amount) + end + end, function(data2, menu2) + menu2.close() + end) + elseif data.current.value == 'manage_employees' then + OpenManageEmployeesMenu(society) + elseif data.current.value == 'manage_grades' then + OpenManageGradesMenu(society) + end + end, function(data, menu) + if close then + close(data, menu) + end + end) + end end, society) - - while isBoss == nil do - Citizen.Wait(100) - end - - if not isBoss then - return - end - - local defaultOptions = { - withdraw = true, - deposit = true, - wash = true, - employees = true, - grades = true - } - - for k,v in pairs(defaultOptions) do - if options[k] == nil then - options[k] = v - end - end - - if options.withdraw then - table.insert(elements, {label = _U('withdraw_society_money'), value = 'withdraw_society_money'}) - end - - if options.deposit then - table.insert(elements, {label = _U('deposit_society_money'), value = 'deposit_money'}) - end - - if options.wash then - table.insert(elements, {label = _U('wash_money'), value = 'wash_money'}) - end - - if options.employees then - table.insert(elements, {label = _U('employee_management'), value = 'manage_employees'}) - end - - if options.grades then - table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) - end - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'boss_actions_' .. society, { - title = _U('boss_menu'), - align = 'top-left', - elements = elements - }, function(data, menu) - - if data.current.value == 'withdraw_society_money' then - - ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, { - title = _U('withdraw_amount') - }, function(data, menu) - - local amount = tonumber(data.value) - - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:withdrawMoney', society, amount) - end - - end, function(data, menu) - menu.close() - end) - - elseif data.current.value == 'deposit_money' then - - ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, { - title = _U('deposit_amount') - }, function(data, menu) - - local amount = tonumber(data.value) - - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:depositMoney', society, amount) - end - - end, function(data, menu) - menu.close() - end) - - elseif data.current.value == 'wash_money' then - - ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, { - title = _U('wash_money_amount') - }, function(data, menu) - - local amount = tonumber(data.value) - - if amount == nil then - ESX.ShowNotification(_U('invalid_amount')) - else - menu.close() - TriggerServerEvent('esx_society:washMoney', society, amount) - end - - end, function(data, menu) - menu.close() - end) - - elseif data.current.value == 'manage_employees' then - OpenManageEmployeesMenu(society) - elseif data.current.value == 'manage_grades' then - OpenManageGradesMenu(society) - end - - end, function(data, menu) - if close then - close(data, menu) - end - end) - end function OpenManageEmployeesMenu(society) - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'manage_employees_' .. society, { title = _U('employee_management'), align = 'top-left', elements = { {label = _U('employee_list'), value = 'employee_list'}, - {label = _U('recruit'), value = 'recruit'} - } - }, function(data, menu) - + {label = _U('recruit'), value = 'recruit'} + }}, function(data, menu) if data.current.value == 'employee_list' then OpenEmployeeList(society) - end - - if data.current.value == 'recruit' then + elseif data.current.value == 'recruit' then OpenRecruitMenu(society) end - end, function(data, menu) menu.close() end) end function OpenEmployeeList(society) - ESX.TriggerServerCallback('esx_society:getEmployees', function(employees) local elements = { @@ -263,15 +232,11 @@ function OpenEmployeeList(society) menu.close() OpenManageEmployeesMenu(society) end) - end, society) - end function OpenRecruitMenu(society) - ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players) - local elements = {} for i=1, #players, 1 do @@ -290,15 +255,13 @@ function OpenRecruitMenu(society) align = 'top-left', elements = elements }, function(data, menu) - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'recruit_confirm_' .. society, { title = _U('do_you_want_to_recruit', data.current.name), align = 'top-left', elements = { - {label = _U('no'), value = 'no'}, + {label = _U('no'), value = 'no'}, {label = _U('yes'), value = 'yes'} - } - }, function(data2, menu2) + }}, function(data2, menu2) menu2.close() if data2.current.value == 'yes' then @@ -311,19 +274,14 @@ function OpenRecruitMenu(society) end, function(data2, menu2) menu2.close() end) - end, function(data, menu) menu.close() end) - end) - end function OpenPromoteMenu(society, employee) - ESX.TriggerServerCallback('esx_society:getJob', function(job) - local elements = {} for i=1, #job.grades, 1 do @@ -351,15 +309,11 @@ function OpenPromoteMenu(society, employee) menu.close() OpenEmployeeList(society) end) - end, society) - end function OpenManageGradesMenu(society) - ESX.TriggerServerCallback('esx_society:getJob', function(job) - local elements = {} for i=1, #job.grades, 1 do @@ -376,7 +330,6 @@ function OpenManageGradesMenu(society) align = 'top-left', elements = elements }, function(data, menu) - ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, { title = _U('salary_amount') }, function(data2, menu2) @@ -394,17 +347,13 @@ function OpenManageGradesMenu(society) OpenManageGradesMenu(society) end, society, data.current.value, amount) end - end, function(data2, menu2) menu2.close() end) - end, function(data, menu) menu.close() end) - end, society) - end AddEventHandler('esx_society:openBossMenu', function(society, close, options) diff --git a/server/main.lua b/server/main.lua index 9960b071..66dad770 100644 --- a/server/main.lua +++ b/server/main.lua @@ -16,7 +16,7 @@ MySQL.ready(function() local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) for i=1, #result, 1 do - Jobs[result[i].name] = result[i] + Jobs[result[i].name] = result[i] Jobs[result[i].name].grades = {} end @@ -31,18 +31,17 @@ AddEventHandler('esx_society:registerSociety', function(name, label, account, da local found = false local society = { - name = name, - label = label, - account = account, + name = name, + label = label, + account = account, datastore = datastore, inventory = inventory, - data = data + data = data } for i=1, #RegisteredSocieties, 1 do if RegisteredSocieties[i].name == name then - found = true - RegisteredSocieties[i] = society + found, RegisteredSocieties[i] = true, society break end end @@ -61,9 +60,9 @@ AddEventHandler('esx_society:getSociety', function(name, cb) end) RegisterServerEvent('esx_society:withdrawMoney') -AddEventHandler('esx_society:withdrawMoney', function(society, amount) +AddEventHandler('esx_society:withdrawMoney', function(societyName, amount) local xPlayer = ESX.GetPlayerFromId(source) - local society = GetSociety(society) + local society = GetSociety(societyName) amount = ESX.Math.Round(tonumber(amount)) if xPlayer.job.name == society.name then @@ -71,7 +70,6 @@ AddEventHandler('esx_society:withdrawMoney', function(society, amount) if amount > 0 and account.money >= amount then account.removeMoney(amount) xPlayer.addMoney(amount) - xPlayer.showNotification(_U('have_withdrawn', ESX.Math.GroupDigits(amount))) else xPlayer.showNotification(_U('invalid_amount')) @@ -83,19 +81,18 @@ AddEventHandler('esx_society:withdrawMoney', function(society, amount) end) RegisterServerEvent('esx_society:depositMoney') -AddEventHandler('esx_society:depositMoney', function(society, amount) +AddEventHandler('esx_society:depositMoney', function(societyName, amount) local xPlayer = ESX.GetPlayerFromId(source) - local society = GetSociety(society) + local society = GetSociety(societyName) amount = ESX.Math.Round(tonumber(amount)) if xPlayer.job.name == society.name then if amount > 0 and xPlayer.getMoney() >= amount then TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) xPlayer.removeMoney(amount) + xPlayer.showNotification(_U('have_deposited', ESX.Math.GroupDigits(amount))) account.addMoney(amount) end) - - xPlayer.showNotification(_U('have_deposited', ESX.Math.GroupDigits(amount))) else xPlayer.showNotification(_U('invalid_amount')) end @@ -116,8 +113,8 @@ AddEventHandler('esx_society:washMoney', function(society, amount) MySQL.Async.execute('INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', { ['@identifier'] = xPlayer.identifier, - ['@society'] = society, - ['@amount'] = amount + ['@society'] = society, + ['@amount'] = amount }, function(rowsChanged) xPlayer.showNotification(_U('you_have', ESX.Math.GroupDigits(amount))) end) @@ -135,7 +132,6 @@ AddEventHandler('esx_society:putVehicleInGarage', function(societyName, vehicle) TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} - table.insert(garage, vehicle) store.set('garage', garage) end) @@ -221,7 +217,7 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci end) ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) - local job = json.decode(json.encode(Jobs[society])) + local job = json.decode(json.encode(Jobs[society])) local grades = {} for k,v in pairs(job.grades) do @@ -306,15 +302,15 @@ end) ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) local xPlayers = ESX.GetPlayers() - local players = {} + local players = {} for i=1, #xPlayers, 1 do local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) table.insert(players, { - source = xPlayer.source, + source = xPlayer.source, identifier = xPlayer.identifier, - name = xPlayer.name, - job = xPlayer.job + name = xPlayer.name, + job = xPlayer.job }) end From 6cda7ed2f5e58966c09c13c87026a7ab8840a385 Mon Sep 17 00:00:00 2001 From: shortybsd Date: Sat, 16 May 2020 18:51:19 -0500 Subject: [PATCH 73/85] Update esx_society.sql int - Integer display width is deprecated and will be removed in a future release. --- esx_society.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esx_society.sql b/esx_society.sql index 163ce9f6..a0191019 100644 --- a/esx_society.sql +++ b/esx_society.sql @@ -1,10 +1,10 @@ USE `es_extended`; CREATE TABLE `society_moneywash` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `identifier` varchar(60) NOT NULL, `society` varchar(60) NOT NULL, - `amount` int(11) NOT NULL, + `amount` int NOT NULL, PRIMARY KEY (`id`) ); From b0b7a8157f04107ac38b2b6005c37e73efc8e1f3 Mon Sep 17 00:00:00 2001 From: Jougito - Kheros Date: Sun, 19 Jul 2020 13:00:48 +0200 Subject: [PATCH 74/85] Spanish translation implemented (#90) --- fxmanifest.lua | 54 ++++++++++++++++++++++++++------------------------ locales/es.lua | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 26 deletions(-) create mode 100644 locales/es.lua diff --git a/fxmanifest.lua b/fxmanifest.lua index 640e4723..95bb099f 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -7,36 +7,38 @@ description 'ESX Society' version '1.0.4' server_scripts { - '@mysql-async/lib/MySQL.lua', - '@es_extended/locale.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/sv.lua', - 'locales/pl.lua', - 'locales/nl.lua', - 'locales/cs.lua', - 'config.lua', - 'server/main.lua' + '@mysql-async/lib/MySQL.lua', + '@es_extended/locale.lua', + 'locales/br.lua', + 'locales/en.lua', + 'locales/es.lua', + 'locales/fi.lua', + 'locales/fr.lua', + 'locales/sv.lua', + 'locales/pl.lua', + 'locales/nl.lua', + 'locales/cs.lua', + 'config.lua', + 'server/main.lua' } client_scripts { - '@es_extended/locale.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/sv.lua', - 'locales/pl.lua', - 'locales/nl.lua', - 'locales/cs.lua', - 'config.lua', - 'client/main.lua' + '@es_extended/locale.lua', + 'locales/br.lua', + 'locales/en.lua', + 'locales/es.lua', + 'locales/fi.lua', + 'locales/fr.lua', + 'locales/sv.lua', + 'locales/pl.lua', + 'locales/nl.lua', + 'locales/cs.lua', + 'config.lua', + 'client/main.lua' } dependencies { - 'es_extended', - 'cron', - 'esx_addonaccount' + 'es_extended', + 'cron', + 'esx_addonaccount' } diff --git a/locales/es.lua b/locales/es.lua new file mode 100644 index 00000000..a643e8e1 --- /dev/null +++ b/locales/es.lua @@ -0,0 +1,37 @@ +Locales['es'] = { + ['actions'] = 'Acciones', + ['boss_menu'] = 'Menú de jefe', + ['money_generic'] = '%s$', + ['deposit_amount'] = 'Depositar cantidad', + ['deposit_society_money'] = 'Depositar dinero en la sociedad', + ['do_you_want_to_recruit'] = '¿Quieres contratar a %s?', + ['employee'] = 'Empleado', + ['employee_list'] = 'Lista de empleados', + ['employee_management'] = 'Gestión de empleados', + ['fire'] = 'Despedir', + ['grade'] = 'Cargo', + ['have_deposited'] = 'Has depositado ~r~%s$~s~', + ['have_withdrawn'] = 'Has retirado ~g~%s$~s~', + ['invalid_amount'] = 'Cantidad inválida', + ['invalid_amount_max'] = 'Ese salario no está permitido', + ['no'] = 'No', + ['promote'] = 'Ascender', + ['promote_employee'] = 'Ascender %s', + ['recruit'] = 'Contratar', + ['recruiting'] = 'Contratando', + ['salary_amount'] = 'Cantidad de salario', + ['salary_management'] = 'Gestión de salario', + ['wash_money'] = 'Limpiar dinero', + ['wash_money_amount'] = 'Cantidad para limpiar', + ['withdraw_amount'] = 'Retirar cantidad', + ['withdraw_society_money'] = 'Retirar dinero de la sociedad', + ['yes'] = 'Si', + ['you_have'] = 'you have ~g~$%s~s~ waiting in ~y~money laundering~s~ (24h).', + ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$%s~s~', + ['you_have_hired'] = 'Has contratado a %s', + ['you_have_been_hired'] = 'Has sido contratado por %s', + ['you_have_fired'] = 'Has despedido a %s', + ['you_have_been_fired'] = 'Has sido despedido de %s', + ['you_have_promoted'] = 'Has ascendido a %s a %s', + ['you_have_been_promoted'] = '¡Has sido ~b~ascendido~s~!', +} From ca38c6c16f5bda6c011cb29f177bd73496f5d651 Mon Sep 17 00:00:00 2001 From: Yulian Ivanov <67766145+BrakingESX247@users.noreply.github.com> Date: Sun, 19 Jul 2020 12:31:42 +0100 Subject: [PATCH 75/85] Latest ESX code. Prior versions of ESX when essentialmode was a requirement had a `name` column in the `users` table, which is now outdated. --- server/main.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/main.lua b/server/main.lua index 66dad770..1383cd72 100644 --- a/server/main.lua +++ b/server/main.lua @@ -192,14 +192,14 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci cb(employees) end) else - MySQL.Async.fetchAll('SELECT name, identifier, job, job_grade FROM users WHERE job = @job ORDER BY job_grade DESC', { + MySQL.Async.fetchAll('SELECT identifier, job, job_grade FROM users WHERE job = @job ORDER BY job_grade DESC', { ['@job'] = society }, function (result) local employees = {} for i=1, #result, 1 do table.insert(employees, { - name = result[i].name, + name = GetPlayerName(source), identifier = result[i].identifier, job = { name = result[i].job, From 5ffedb47aa3cb5dcac1c228b488d2baa8bacce18 Mon Sep 17 00:00:00 2001 From: SEOAlexRamon <37023161+seoalexramon@users.noreply.github.com> Date: Thu, 29 Oct 2020 18:33:36 +0100 Subject: [PATCH 76/85] fix: es.lua --- locales/es.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/es.lua b/locales/es.lua index a643e8e1..9c70ac9d 100644 --- a/locales/es.lua +++ b/locales/es.lua @@ -26,8 +26,8 @@ Locales['es'] = { ['withdraw_amount'] = 'Retirar cantidad', ['withdraw_society_money'] = 'Retirar dinero de la sociedad', ['yes'] = 'Si', - ['you_have'] = 'you have ~g~$%s~s~ waiting in ~y~money laundering~s~ (24h).', - ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$%s~s~', + ['you_have'] = 'tienes ~g~$%s~s~ esperando en el ~y~lavado de dinero~s~ (24h).', + ['you_have_laundered'] = 'has ~r~lavado~s~ tu dinero: ~g~$%s~s~', ['you_have_hired'] = 'Has contratado a %s', ['you_have_been_hired'] = 'Has sido contratado por %s', ['you_have_fired'] = 'Has despedido a %s', From 81aa4728e2f11c190ff22488410df1376918b2c5 Mon Sep 17 00:00:00 2001 From: HypeLevels <61633775+HypeLevels@users.noreply.github.com> Date: Sat, 28 Nov 2020 22:27:05 +0000 Subject: [PATCH 77/85] Update config.lua Changed the default language to be English as it is the universal language. --- config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.lua b/config.lua index cb4eb304..e5c831b1 100644 --- a/config.lua +++ b/config.lua @@ -1,5 +1,5 @@ Config = {} -Config.Locale = 'fr' +Config.Locale = 'en' Config.EnableESXIdentity = false Config.MaxSalary = 3500 From 863976852b624fd1ab7a1c110f2fe4d8d2d4da4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=BCrkay=20Tanr=C4=B1kulu?= Date: Sun, 20 Dec 2020 06:52:50 +0300 Subject: [PATCH 78/85] Turkish translation implemented --- fxmanifest.lua | 2 ++ locales/tr.lua | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 locales/tr.lua diff --git a/fxmanifest.lua b/fxmanifest.lua index 95bb099f..57346a16 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -18,6 +18,7 @@ server_scripts { 'locales/pl.lua', 'locales/nl.lua', 'locales/cs.lua', + 'locales/tr.lua', 'config.lua', 'server/main.lua' } @@ -33,6 +34,7 @@ client_scripts { 'locales/pl.lua', 'locales/nl.lua', 'locales/cs.lua', + 'locales/tr.lua', 'config.lua', 'client/main.lua' } diff --git a/locales/tr.lua b/locales/tr.lua new file mode 100644 index 00000000..4dd19d00 --- /dev/null +++ b/locales/tr.lua @@ -0,0 +1,37 @@ +Locales['tr'] = { + ['actions'] = 'eylemler', + ['boss_menu'] = 'patron menüsü', + ['money_generic'] = '%s TL', + ['deposit_amount'] = 'yatırılacak miktar', + ['deposit_society_money'] = 'şirkete para yatır', + ['do_you_want_to_recruit'] = '%s adlı kişiyi işe almak istiyor musun?', + ['employee'] = 'işçi', + ['employee_list'] = 'işçi listesi', + ['employee_management'] = 'işçi yönetimi', + ['fire'] = 'kov', + ['grade'] = 'kıdem ver', + ['have_deposited'] = '~r~%s~s~ lira yatırdın', + ['have_withdrawn'] = '~g~$%s~s~ lira çektin', + ['invalid_amount'] = 'miktar hatalı', + ['invalid_amount_max'] = 'bu maaşa izin verilmiyor', + ['no'] = 'hayır', + ['promote'] = 'yükseltme', + ['promote_employee'] = 'yükselt %s', + ['recruit'] = 'işe al', + ['recruiting'] = 'işe alım', + ['salary_amount'] = 'maaş miktarı', + ['salary_management'] = 'maaş yönetimi', + ['wash_money'] = 'para akla', + ['wash_money_amount'] = 'aklanacak miktar', + ['withdraw_amount'] = 'çekilecek miktar', + ['withdraw_society_money'] = 'çekilecek şirket parası', + ['yes'] = 'evet', + ['you_have'] = '~g~%s Lira~s~ para zaten ~y~aklanmayı~s~ bekliyor (24s).', + ['you_have_laundered'] = '~g~%s Lira~s~ para ~r~akladın~s~', + ['you_have_hired'] = '%s adlı kişiyi işe aldın', + ['you_have_been_hired'] = '%s tarafından işe alındın', + ['you_have_fired'] = '%s adlı kişi kovuldu', + ['you_have_been_fired'] = '%s tarafından kovuldun', + ['you_have_promoted'] = '%s olan kıdemin, %s yükseltildi', + ['you_have_been_promoted'] = '~b~Kıdem~s~ aldın!', +} From ebe0f66d81e4edd1272eb29855ff55c9f059135d Mon Sep 17 00:00:00 2001 From: Loffes <43013032+Loffes@users.noreply.github.com> Date: Tue, 22 Dec 2020 02:01:19 +0100 Subject: [PATCH 79/85] fix getEmployees Fixes an issue with the "getEmployees" callback where it wouldn't return people who were recently hired (since ESX doesn't update the database straight away). --- server/main.lua | 101 ++++++++++++++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/server/main.lua b/server/main.lua index 1383cd72..f06865c3 100644 --- a/server/main.lua +++ b/server/main.lua @@ -168,52 +168,69 @@ ESX.RegisterServerCallback('esx_society:getSocietyMoney', function(source, cb, s end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) - if Config.EnableESXIdentity then + local employees = {} - MySQL.Async.fetchAll('SELECT firstname, lastname, identifier, job, job_grade FROM users WHERE job = @job ORDER BY job_grade DESC', { - ['@job'] = society - }, function (results) - local employees = {} + local xPlayers = ESX.GetPlayers() + for k, v in pairs(xPlayers) do + local xPlayer = ESX.GetPlayerFromId(v) - for i=1, #results, 1 do - table.insert(employees, { - name = results[i].firstname .. ' ' .. results[i].lastname, - identifier = results[i].identifier, - job = { - name = results[i].job, - label = Jobs[results[i].job].label, - grade = results[i].job_grade, - grade_name = Jobs[results[i].job].grades[tostring(results[i].job_grade)].name, - grade_label = Jobs[results[i].job].grades[tostring(results[i].job_grade)].label - } - }) - end + local name = GetPlayerName(xPlayer.source) + if Config.EnableESXIdentity then + name = xPlayer.get('firstName') .. ' ' .. xPlayer.get('lastName') + end - cb(employees) - end) - else - MySQL.Async.fetchAll('SELECT identifier, job, job_grade FROM users WHERE job = @job ORDER BY job_grade DESC', { - ['@job'] = society - }, function (result) - local employees = {} - - for i=1, #result, 1 do - table.insert(employees, { - name = GetPlayerName(source), - identifier = result[i].identifier, - job = { - name = result[i].job, - label = Jobs[result[i].job].label, - grade = result[i].job_grade, - grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, - grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label - } - }) - end - - cb(employees) - end) + if xPlayer.getJob().name == society then + table.insert(employees, { + name = name, + identifier = xPlayer.identifier, + job = { + name = society, + label = xPlayer.getJob().label, + grade = xPlayer.getJob().grade, + grade_name = xPlayer.getJob().grade_name, + grade_label = xPlayer.getJob().grade_label + } + }) + end end + + MySQL.Async.fetchAll('SELECT * FROM `users` WHERE `job`=@job ORDER BY job_grade DESC', { + ['@job'] = society + }, function(result) + for k, row in pairs(result) do + local alreadyInTable + local identifier = row.identifier + + for k, v in pairs(employees) do + if v.identifier == identifier then + alreadyInTable = true + end + end + + if not alreadyInTable then + local name = "Name not found." -- maybe this should be a locale instead ¯\_(ツ)_/¯ + + if Config.EnableESXIdentity then + name = row.firstname .. ' ' .. row.lastname + end + + table.insert(employees, { + name = name, + identifier = identifier, + job = { + name = society, + label = Jobs[society].label, + grade = row.job_grade, + grade_name = Jobs[society].grades[tostring(row.job_grade)].name, + grade_label = Jobs[society].grades[tostring(row.job_grade)].label + } + }) + end + end + + cb(employees) + end) + end) ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) From dee1238459c9b12097ce965d4c6a63cf0a156432 Mon Sep 17 00:00:00 2001 From: Loffes <43013032+Loffes@users.noreply.github.com> Date: Tue, 22 Dec 2020 14:34:06 +0100 Subject: [PATCH 80/85] better sql performance no longer selecting every column --- server/main.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/main.lua b/server/main.lua index f06865c3..ee367819 100644 --- a/server/main.lua +++ b/server/main.lua @@ -193,8 +193,14 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci }) end end + + local query = "SELECT identifier, job_grade FROM `users` WHERE `job`=@job ORDER BY job_grade DESC" - MySQL.Async.fetchAll('SELECT * FROM `users` WHERE `job`=@job ORDER BY job_grade DESC', { + if Config.EnableESXIdentity then + query = "SELECT identifier, job_grade, firstname, lastname FROM `users` WHERE `job`=@job ORDER BY job_grade DESC" + end + + MySQL.Async.fetchAll(query, { ['@job'] = society }, function(result) for k, row in pairs(result) do From 7e0cb29d804934492dcf87c83ba6dc3912c8ec81 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Thu, 3 Jun 2021 07:29:20 +1000 Subject: [PATCH 81/85] improvement(server/main): Add support for ESX.GetExtendedPlayers() if using ESX Legacy --- server/main.lua | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/server/main.lua b/server/main.lua index ee367819..92ad374e 100644 --- a/server/main.lua +++ b/server/main.lua @@ -170,9 +170,15 @@ end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) local employees = {} - local xPlayers = ESX.GetPlayers() - for k, v in pairs(xPlayers) do - local xPlayer = ESX.GetPlayerFromId(v) + local xPlayers + if ESX.GetExtendedPlayers then + xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) + else + xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) + end + + for k,v in pairs(xPlayers) do + local xPlayer = type(v) ~= 'table' and v or ESX.GetPlayerFromId(k) local name = GetPlayerName(xPlayer.source) if Config.EnableESXIdentity then @@ -301,10 +307,16 @@ ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, ['@grade'] = grade }, function(rowsChanged) Jobs[job].grades[tostring(grade)].salary = salary - local xPlayers = ESX.GetPlayers() - for i=1, #xPlayers, 1 do - local xTarget = ESX.GetPlayerFromId(xPlayers[i]) + local xPlayers + if ESX.GetExtendedPlayers then + xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) + else + xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) + end + + for k,v in pairs(xPlayers) do + local xTarget = type(v) ~= 'table' and v or ESX.GetPlayerFromId(k) if xTarget.job.name == job and xTarget.job.grade == grade then xTarget.setJob(job, grade) @@ -324,11 +336,17 @@ ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, end) ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) - local xPlayers = ESX.GetPlayers() local players = {} - for i=1, #xPlayers, 1 do - local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + local xPlayers + if ESX.GetExtendedPlayers then + xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) + else + xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) + end + + for k,v in pairs(xPlayers) do + local xPlayer = type(v) ~= 'table' and v or ESX.GetPlayerFromId(k) table.insert(players, { source = xPlayer.source, identifier = xPlayer.identifier, From 653613d55b371ed240b8854df241a549a5e14701 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Thu, 3 Jun 2021 07:37:51 +1000 Subject: [PATCH 82/85] fix(server/main): Left incorrect values from testing (type should equal table) --- server/main.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/main.lua b/server/main.lua index 92ad374e..bf76ac7d 100644 --- a/server/main.lua +++ b/server/main.lua @@ -178,7 +178,7 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci end for k,v in pairs(xPlayers) do - local xPlayer = type(v) ~= 'table' and v or ESX.GetPlayerFromId(k) + local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(k) local name = GetPlayerName(xPlayer.source) if Config.EnableESXIdentity then @@ -316,7 +316,7 @@ ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, end for k,v in pairs(xPlayers) do - local xTarget = type(v) ~= 'table' and v or ESX.GetPlayerFromId(k) + local xTarget = type(v) == 'table' and v or ESX.GetPlayerFromId(k) if xTarget.job.name == job and xTarget.job.grade == grade then xTarget.setJob(job, grade) @@ -346,7 +346,7 @@ ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) end for k,v in pairs(xPlayers) do - local xPlayer = type(v) ~= 'table' and v or ESX.GetPlayerFromId(k) + local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(k) table.insert(players, { source = xPlayer.source, identifier = xPlayer.identifier, From fd44718c1965466939d1dc26a4e8a464a98f175c Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Thu, 3 Jun 2021 07:55:36 +1000 Subject: [PATCH 83/85] fix(server/main): ESX.GetPlayerFromId needs to check the value, not index --- server/main.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server/main.lua b/server/main.lua index bf76ac7d..65753726 100644 --- a/server/main.lua +++ b/server/main.lua @@ -178,7 +178,7 @@ ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, soci end for k,v in pairs(xPlayers) do - local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(k) + local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(v) local name = GetPlayerName(xPlayer.source) if Config.EnableESXIdentity then @@ -316,7 +316,7 @@ ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, end for k,v in pairs(xPlayers) do - local xTarget = type(v) == 'table' and v or ESX.GetPlayerFromId(k) + local xTarget = type(v) == 'table' and v or ESX.GetPlayerFromId(v) if xTarget.job.name == job and xTarget.job.grade == grade then xTarget.setJob(job, grade) @@ -346,7 +346,8 @@ ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) end for k,v in pairs(xPlayers) do - local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(k) + local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(v) + table.insert(players, { source = xPlayer.source, identifier = xPlayer.identifier, From 88e97e2270d15be00942775d768a72461c9e5e3f Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Thu, 3 Jun 2021 11:31:17 +1000 Subject: [PATCH 84/85] improvement(server/main): Prevent multiple xPlayer loops from running when running `getOnlinePlayers` --- server/main.lua | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/server/main.lua b/server/main.lua index 65753726..f8293b82 100644 --- a/server/main.lua +++ b/server/main.lua @@ -335,28 +335,33 @@ ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, end end) +local getOnlinePlayers = false +local onlinePlayers = {} + ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) - local players = {} + if getOnlinePlayers == false and next(onlinePlayers) == nil then -- Prevent multiple xPlayer loops from running in quick succession + getOnlinePlayers, onlinePlayers = true, {} + local xPlayers + if not ESX.GetExtendedPlayers then + xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) + else + xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) + end - local xPlayers - if ESX.GetExtendedPlayers then - xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) - else - xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) + for k,v in pairs(xPlayers) do + local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(v) + + table.insert(onlinePlayers, { + source = xPlayer.source, + identifier = xPlayer.identifier, + name = xPlayer.name, + job = xPlayer.job + }) + end + getOnlinePlayers = false end - - for k,v in pairs(xPlayers) do - local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(v) - - table.insert(players, { - source = xPlayer.source, - identifier = xPlayer.identifier, - name = xPlayer.name, - job = xPlayer.job - }) - end - - cb(players) + while getOnlinePlayers do Citizen.Wait(50) end -- Wait for the xPlayer loop to finish + cb(onlinePlayers) end) ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, cb, societyName) From 7c9818dbdc54a68412ae259d04f3524a08d9f123 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 5 Jun 2021 12:32:24 +1000 Subject: [PATCH 85/85] refactor(server/main): Cache if `ESX.GetExtendedPlayers()` exists; use short-circuit evaluation to define xPlayers --- server/main.lua | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/server/main.lua b/server/main.lua index f8293b82..7a8bb583 100644 --- a/server/main.lua +++ b/server/main.lua @@ -3,6 +3,7 @@ local Jobs = {} local RegisteredSocieties = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) +local isLegacy = not not ESX.GetExtendedPlayers function GetSociety(name) for i=1, #RegisteredSocieties, 1 do @@ -170,13 +171,7 @@ end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) local employees = {} - local xPlayers - if ESX.GetExtendedPlayers then - xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) - else - xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) - end - + local xPlayers = isLegacy and ESX.GetExtendedPlayers() or ESX.GetPlayers() for k,v in pairs(xPlayers) do local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(v) @@ -308,13 +303,7 @@ ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, }, function(rowsChanged) Jobs[job].grades[tostring(grade)].salary = salary - local xPlayers - if ESX.GetExtendedPlayers then - xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) - else - xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) - end - + local xPlayers = isLegacy and ESX.GetExtendedPlayers() or ESX.GetPlayers() for k,v in pairs(xPlayers) do local xTarget = type(v) == 'table' and v or ESX.GetPlayerFromId(v) @@ -341,13 +330,8 @@ local onlinePlayers = {} ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) if getOnlinePlayers == false and next(onlinePlayers) == nil then -- Prevent multiple xPlayer loops from running in quick succession getOnlinePlayers, onlinePlayers = true, {} - local xPlayers - if not ESX.GetExtendedPlayers then - xPlayers = ESX.GetExtendedPlayers() -- Retrieve all xPlayer data directly (ESX Legacy) - else - xPlayers = ESX.GetPlayers() -- Retrieves player ids and gets xPlayer data one-by-one (ESX 1.2 support) - end - + + local xPlayers = isLegacy and ESX.GetExtendedPlayers() or ESX.GetPlayers() for k,v in pairs(xPlayers) do local xPlayer = type(v) == 'table' and v or ESX.GetPlayerFromId(v)