├── README.md
├── client
└── main.lua
├── config.lua
├── esx_identity.sql
├── fxmanifest.lua
├── html
├── css
│ └── style.css
├── index.html
└── js
│ └── script.js
├── locales
├── cs.lua
├── de.lua
├── en.lua
├── es.lua
├── fi.lua
├── hu.lua
├── nl.lua
├── pl.lua
├── sv.lua
└── tc.lua
├── preview.png
└── server
└── main.lua
/README.md:
--------------------------------------------------------------------------------
1 |
2 | ### Installation
3 | 1) Download the latest version in the "code" tab on GitHub.
4 | 2) Drag & drop the folder into your `resources` server folder.
5 | 4) Add `start esx_identity` to your server.cfg and add the sql if you have
6 | 5) Reboot your server
7 |
8 | ## Requirements
9 |
10 | esx_skin
11 |
12 |
13 | 
--------------------------------------------------------------------------------
/client/main.lua:
--------------------------------------------------------------------------------
1 | local loadingScreenFinished = false
2 | local ready = false
3 | local guiEnabled = false
4 | local timecycleModifier = "hud_def_blur"
5 |
6 | RegisterNetEvent('esx_identity:alreadyRegistered', function()
7 | while not loadingScreenFinished do Wait(100) end
8 | TriggerEvent('esx_skin:playerRegistered')
9 | end)
10 |
11 | RegisterNetEvent('esx_identity:setPlayerData', function(data)
12 | SetTimeout(1, function()
13 | ESX.SetPlayerData("name", ('%s %s'):format(data.firstName, data.lastName))
14 | ESX.SetPlayerData('firstName', data.firstName)
15 | ESX.SetPlayerData('lastName', data.lastName)
16 | ESX.SetPlayerData('dateofbirth', data.dateOfBirth)
17 | ESX.SetPlayerData('sex', data.sex)
18 | ESX.SetPlayerData('height', data.height)
19 | end)
20 | end)
21 |
22 | AddEventHandler('esx:loadingScreenOff', function()
23 | loadingScreenFinished = true
24 | end)
25 |
26 | RegisterNUICallback('ready', function(data, cb)
27 | ready = true
28 | cb(1)
29 | end)
30 |
31 | if not Config.UseDeferrals then
32 | function setGuiState(state)
33 | SetNuiFocus(state, state)
34 | guiEnabled = state
35 |
36 | if state then
37 | SetTimecycleModifier(timecycleModifier)
38 | else
39 | ClearTimecycleModifier()
40 | end
41 |
42 | SendNUIMessage({type = "enableui", enable = state})
43 | end
44 |
45 | RegisterNetEvent('esx_identity:showRegisterIdentity', function()
46 | TriggerEvent('esx_skin:resetFirstSpawn')
47 |
48 | if not ESX.PlayerData.dead then setGuiState(true) end
49 | end)
50 |
51 | RegisterNUICallback('register', function(data, cb)
52 | if not guiEnabled then
53 | return
54 | end
55 |
56 | ESX.TriggerServerCallback('esx_identity:registerIdentity', function(callback)
57 | if not callback then
58 | return
59 | end
60 |
61 | ESX.ShowNotification(TranslateCap('thank_you_for_registering'))
62 | setGuiState(false)
63 |
64 | if not ESX.GetConfig().Multichar then
65 | TriggerEvent('esx_skin:playerRegistered')
66 | end
67 | end, data)
68 | end)
69 | end
--------------------------------------------------------------------------------
/config.lua:
--------------------------------------------------------------------------------
1 | Config = {}
2 | Config.Locale = GetConvar('esx:locale', 'en')
3 |
4 | -- [Config.EnableCommands]
5 | -- Enables Commands Such As /char and /chardel
6 | Config.EnableCommands = ESX.GetConfig().EnableDebug
7 |
8 | -- EXPERIMENTAL Character Registration Method
9 | Config.UseDeferrals = false
10 |
11 | -- These values are for the date format in the registration menu
12 | -- Choices: DD/MM/YYYY | MM/DD/YYYY | YYYY/MM/DD
13 | Config.DateFormat = 'DD/MM/YYYY'
14 |
15 | -- These values are for the second input validation in server/main.lua
16 | Config.MaxNameLength = 20 -- Max Name Length.
17 | Config.MinHeight = 120 -- 120 cm lowest height
18 | Config.MaxHeight = 220 -- 220 cm max height.
19 | Config.LowestYear = 1900 -- 112 years old is the oldest you can be.
20 | Config.HighestYear = 2003 -- 18 years old is the youngest you can be.
21 |
22 | Config.FullCharDelete = true -- Delete all reference to character.
23 | Config.EnableDebugging = ESX.GetConfig().EnableDebug -- prints for debugging :)
24 |
--------------------------------------------------------------------------------
/esx_identity.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE `users`
2 | ADD COLUMN `firstname` VARCHAR(16) NULL DEFAULT NULL,
3 | ADD COLUMN `lastname` VARCHAR(16) NULL DEFAULT NULL,
4 | ADD COLUMN `dateofbirth` VARCHAR(10) NULL DEFAULT NULL,
5 | ADD COLUMN `sex` VARCHAR(1) NULL DEFAULT NULL,
6 | ADD COLUMN `height` INT NULL DEFAULT NULL
7 | ;
--------------------------------------------------------------------------------
/fxmanifest.lua:
--------------------------------------------------------------------------------
1 | fx_version 'adamant'
2 |
3 | game 'gta5'
4 |
5 | description 'ESX Identity'
6 | lua54 'yes'
7 | version '1.8.5'
8 |
9 | shared_scripts {
10 | '@es_extended/imports.lua',
11 | '@es_extended/locale.lua',
12 | }
13 |
14 | server_scripts {
15 | '@oxmysql/lib/MySQL.lua',
16 | 'locales/*.lua',
17 | 'config.lua',
18 | 'server/main.lua'
19 | }
20 |
21 | client_scripts {
22 | 'locales/*.lua',
23 | 'config.lua',
24 | 'client/main.lua'
25 | }
26 |
27 | ui_page 'html/index.html'
28 |
29 | files {
30 | 'html/index.html',
31 | 'html/js/script.js',
32 | 'html/css/style.css',
33 | }
34 |
35 | dependency 'es_extended'
--------------------------------------------------------------------------------
/html/css/style.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Oswald&display=swap');
2 |
3 | body {
4 | font-family: sans-serif;
5 | overflow: hidden;
6 | display: none;
7 | }
8 |
9 | .dialog {
10 | width: 332px;
11 | opacity : 0.95;
12 | position : absolute;
13 | margin-left: auto;
14 | margin-right: auto;
15 | top : 30.0%;
16 | padding: 20px;
17 | left : 50%; /* à 50%/50% du parent référent */
18 | transform : translate(-50%); /* décalage de 50% de sa propre taille */
19 | background-color: #152029;
20 | border-radius : 10px;
21 | box-shadow: 0 -5px 3px -3px #21303d, 0 5px 3px -3px #21303d;
22 | border:none;
23 | margin:5px;
24 | margin-bottom:20px;
25 | color: #ffffff;
26 | }
27 |
28 | .title {
29 | font-family: 'Oswald', sans-serif;
30 | font-size: 22px;
31 | text-align: center;
32 | padding: 5px;
33 | margin-bottom: 20px;
34 | }
35 |
36 | input {
37 | margin-bottom: 15px;
38 | border: none;
39 | border-bottom: 2px solid #58636c;
40 | width: 100%;
41 | outline: none;
42 | padding: 10px;
43 | padding-left:0;
44 | font-family: 'Oswald', sans-serif;
45 | color: #ffffff;
46 | text-align:left;
47 | background-color: #152029;
48 | }
49 |
50 | ::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */
51 | color: rgba(84,97,105,255);
52 | font-family: 'Oswald', sans-serif;
53 | font-weight: 200;
54 | opacity: 1; /* Firefox */
55 | }
56 |
57 | .radio-toolbar input[type="radio"] {
58 | opacity: 0;
59 | position: absolute;
60 | width: 36%;
61 | }
62 |
63 | .radio-toolbar label {
64 | display: inline-block;
65 | margin-top: 5px;
66 | background-color: rgba(15,15,15,0.9);
67 | padding: 10px 20px;
68 | font-family: 'Oswald', sans-serif;
69 | font-weight: 500;
70 | font-size: 16px;
71 | color: #FFFFFF;
72 | border: none;
73 | border-radius: 5px;
74 | width: 36%;
75 | }
76 |
77 | .radio-toolbar input[type="radio"]:checked + label {
78 | width: 36%;
79 | background-color:rgba(15,15,15,0.9);
80 | border: none;
81 | border-bottom: 1px solid #93a3b6;
82 | border-radius: 5px;
83 | color: #ffffff;
84 | }
85 |
86 | .radio-toolbar input[type="radio"]:focus + label {
87 | background-color:rgba(15,15,15,0.9);
88 | border: none;
89 | border-bottom: 1px solid #93a3b6;
90 | border-radius: 5px;
91 | color: #ffffff;
92 | }
93 |
94 | .radio-toolbar label:hover {
95 | background-color: rgba(28, 24, 24, 0.931);
96 | width: 36%;
97 | color: #ffffff;
98 | }
99 |
100 | button {
101 | display: block;
102 | margin-top: 35px;
103 | /*padding: 10px;*/
104 | background-color: #4569c6;
105 | outline: none;
106 | border: 2px double rgba(40, 40, 40, 0.9);
107 | color: #FFFFFF;
108 | height: 30px;
109 | width: 100%;
110 | }
111 |
112 | h1 {
113 | display: block;
114 | margin-top: 5px;
115 | margin-right: 5px;
116 | padding: 10px;
117 | background-color: rgba(15,15,15,0.9);
118 | color: #ffffff;
119 | width: 93%;
120 | text-align: center;
121 | }
122 |
123 | .range-wrap {
124 | position: relative;
125 | margin: 0 auto 3rem;
126 | }
127 |
128 | .range {
129 | width: 100%;
130 | }
131 |
132 | .bubble {
133 | background: rgba(15,15,15,0.9);
134 | color: #ffffff;
135 | padding: 4px 12px;
136 | position: absolute;
137 | border-radius: 4px;
138 | left: 50%;
139 | transform: translateX(-50%);
140 | }
141 |
142 |
143 | .bubble::after {
144 | content: "";
145 | position: absolute;
146 | width: 2px;
147 | height: 2px;
148 | background: rgba(15,15,15,0.9);
149 | color: black;
150 | top: -1px;
151 | left: 50%;
152 | }
153 |
--------------------------------------------------------------------------------
/html/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | ESX Identity
9 |
10 |
11 |
12 |
13 |
IDENTITY
14 |
34 |
If the submit button doesn't work, please ensure that you've entered the fields correctly.
35 |
36 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/html/js/script.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function () {
2 | $.post('http://esx_identity/ready', JSON.stringify({}));
3 |
4 | window.addEventListener('message', function (event) {
5 | if (event.data.type === 'enableui') {
6 | event.data.enable ? $(document.body).show() : $(document.body).hide();
7 | }
8 | });
9 |
10 | $('#register').submit(function (event) {
11 | event.preventDefault();
12 |
13 | const dofVal = $('#dateofbirth').val();
14 | if (!dofVal) return;
15 |
16 | const dateCheck = new Date(dofVal);
17 |
18 | const year = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(dateCheck);
19 | const month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(dateCheck);
20 | const day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(dateCheck);
21 |
22 | const formattedDate = `${day}/${month}/${year}`;
23 |
24 | $.post(
25 | 'http://esx_identity/register',
26 | JSON.stringify({
27 | firstname: $('#firstname').val(),
28 | lastname: $('#lastname').val(),
29 | dateofbirth: formattedDate,
30 | sex: $("input[type='radio'][name='sex']:checked").val(),
31 | height: $('#height').val(),
32 | })
33 | );
34 |
35 | $('#register').trigger('reset');
36 | });
37 | });
38 |
--------------------------------------------------------------------------------
/locales/cs.lua:
--------------------------------------------------------------------------------
1 | Locales['cs'] = {
2 | ['show_registration'] = 'zobrazit registracni menu',
3 | ['show_active_character'] = 'zobrazit aktivni postavy',
4 | ['delete_character'] = 'smazat svou stavajici postavu a vytvorit novou',
5 | ['deleted_character'] = 'vase postava byla smazana.',
6 | ['not_registered'] = 'nemas zaregistrovanou postavu.',
7 | ['active_character'] = 'aktivni postava: %s %s',
8 | ['already_registered'] = 'jiz mas zaregistrovanou postavu.',
9 | ['failed_identity'] = 'nastaveni vasi postavy selhalo, zkus to prosim znovu pozdeji nebo kontaktuj majitele serveru!',
10 | ['create_a_character'] = 'aby jsi mohl/a hrat, tak se musis registrovat.'
11 | }
12 |
--------------------------------------------------------------------------------
/locales/de.lua:
--------------------------------------------------------------------------------
1 | Locales['de'] = {
2 | ['show_active_character'] = 'Zeige aktiven Charakter',
3 | ['active_character'] = 'Aktiver Charackter: %s',
4 | ['error_active_character'] = "Wir konnten deinen Namen nicht auslesen. Bitte kontaktiere einen Admin.",
5 | ['delete_character'] = 'Lösche deinen Charackter und erstelle einen neuen',
6 | ['deleted_character'] = 'Dein Charakter wurde gelöscht.',
7 | ['error_delete_character'] = "Wir konnten deinen Charakter nicht löschen. Bitte kontaktiere einen Admin.",
8 | ['thank_you_for_registering'] = "Danke fürs Registrieren. Viel Spaß.",
9 | ['registration_error'] = "Es gab einen Fehler während der Registration. Bitte kontaktiere einen Admin.",
10 | ['debug_xPlayer_get_first_name'] = "Gibt deinen Vornamen zurück",
11 | ['debug_xPlayer_get_last_name'] = "Gibt deinen Nachnamen zurück",
12 | ['debug_xPlayer_get_full_name'] = "Gibt deinen vollen Namen zurück",
13 | ['debug_xPlayer_get_sex'] = "Gibt dein Geschlecht zurück",
14 | ['debug_xPlayer_get_dob'] = "Gibt deinen Geburtstag zurück",
15 | ['debug_xPlayer_get_height'] = "Gibt deine Größe zurück",
16 | ['error_debug_xPlayer_get_first_name'] = "Ein Fehler entstand dabei, deinen Vornamen auszulesen.",
17 | ['error_debug_xPlayer_get_last_name'] = "Ein Fehler entstand dabei, deinen Nachnamen auszulesen.",
18 | ['error_debug_xPlayer_get_full_name'] = "Ein Fehler entstand dabei, deinen vollen Namen auszulesen.",
19 | ['error_debug_xPlayer_get_sex'] = "Ein Fehler entstand dabei, dein Geschlecht auszulesen.",
20 | ['error_debug_xPlayer_get_dob'] = "Ein Fehler entstand dabei, dein Geburtsdatum auszulesen.",
21 | ['error_debug_xPlayer_get_height'] = "Ein Fehler entstand dabei, deine Größe auszulesen.",
22 | ['return_debug_xPlayer_get_first_name'] = "Vornmame: %s",
23 | ['return_debug_xPlayer_get_last_name'] = "Nachname: %s",
24 | ['return_debug_xPlayer_get_full_name'] = "Voller Name: %s",
25 | ['return_debug_xPlayer_get_sex'] = "Geschlecht: %s",
26 | ['return_debug_xPlayer_get_dob'] = "Geburtsdatum: %s",
27 | ['return_debug_xPlayer_get_height'] = "Höhe: %s Meter",
28 | ['data_incorrect'] = 'Daten sind fehlerhaft. Versuche es erneut.',
29 | ['invalid_format'] = 'Daten falsch formatiert. Versuche es erneut.',
30 | ['no_identifier'] = 'Es gab einen Fehler beim Laden deines Charackters!\nFehler Code: identifier-missing\n\nDie Ursache des Fehlers ist nicht bekannt, dein Identifier konnte nicht gefunden werden. Bitte versuche es später erneut oder kontaktiere einen Admin.',
31 | ['missing_identity'] = 'Es gab einen Fehler beim Laden deines Charackters!\nError code: identity-missing\n\nEs scheint, keine Identität zu geben. Bitte versuche, erneut zu verbinden.',
32 | ['deleted_identity'] = 'Dein Charakter wurde gelöscht. Bitte logge neu ein, um einen neuen zu erstellen.',
33 | ['invalid_firstname_format'] = 'Ungültiges Format (Vorname): Bitte überprüfe deine Eingabe',
34 | ['invalid_lastname_format'] = 'Ungültiges Format (Nachname): Bitte überprüfe deine Eingabe',
35 | ['invalid_dob_format'] = 'Ungültiges Format (Geburtsdatum): Bitte überprüfe deine Eingabe',
36 | ['invalid_sex_format'] = 'Ungültiges Format (Geschlecht): Bitte überprüfe deine Eingabe',
37 | ['invalid_height_format'] = 'Ungültiges Format (Größe): Bitte überprüfe deine Eingabe.'
38 | }
39 |
40 |
--------------------------------------------------------------------------------
/locales/en.lua:
--------------------------------------------------------------------------------
1 | Locales['en'] = {
2 | ['show_active_character'] = 'Show Active Character',
3 | ['active_character'] = 'Active Character: %s',
4 | ['error_active_character'] = 'There was an error obtaining your data.',
5 | ['delete_character'] = 'Delete Your Current Character.',
6 | ['deleted_character'] = 'Character Deleted',
7 | ['error_delete_character'] = 'There was a problem deleting your character.',
8 | ['thank_you_for_registering'] = 'Registration Successful. Enjoy!',
9 | ['debug_xPlayer_get_first_name'] = 'Returns Your First Name',
10 | ['debug_xPlayer_get_last_name'] = 'Returns Your Last Name',
11 | ['debug_xPlayer_get_full_name'] = 'Returns Your Full Name',
12 | ['debug_xPlayer_get_sex'] = 'Returns Your Sex',
13 | ['debug_xPlayer_get_dob'] = 'Returns Your DOB',
14 | ['debug_xPlayer_get_height'] = 'Returns Your Height',
15 | ['error_debug_xPlayer_get_first_name'] = 'There was an issue while obtaining your first name.',
16 | ['error_debug_xPlayer_get_last_name'] = 'There was an issue while obtaining your last name.',
17 | ['error_debug_xPlayer_get_full_name'] = 'There was an issue while obtaining your full name.',
18 | ['error_debug_xPlayer_get_sex'] = 'There was an issue while obtaining your sex.',
19 | ['error_debug_xPlayer_get_dob'] = 'There was an issue while obtaining your date of birth.',
20 | ['error_debug_xPlayer_get_height'] = 'There was an issue while obtaining your height.',
21 | ['return_debug_xPlayer_get_first_name'] = 'First Name: %s',
22 | ['return_debug_xPlayer_get_last_name'] = 'Last Name: %s',
23 | ['return_debug_xPlayer_get_full_name'] = 'Name: %s',
24 | ['return_debug_xPlayer_get_sex'] = 'Sex: %s',
25 | ['return_debug_xPlayer_get_dob'] = 'DOB: %s',
26 | ['return_debug_xPlayer_get_height'] = 'Height: %s Inches',
27 | ['data_incorrect'] = 'Invalid Data, Please try again.',
28 | ['invalid_format'] = 'Invalid Data Format, Please try again.',
29 | ['no_identifier'] = '[ESX Identity]\nThere was an issue while loading your character!\nError Code: identifier-missing\n\nThis is caused by your identifier being missing. Please come back later or report this problem to the Server Owner.',
30 | ['missing_identity'] = '[ESX Identity]\nThere was an issue loading your character!\nError Code: identity-missing\n\nIt seems like your identity is missing, try connecting again.',
31 | ['deleted_identity'] = 'Character deleted. Please rejoin to create a new character.',
32 | ['already_registered'] = 'You have already registered.',
33 | ['invalid_firstname_format'] = 'Invalid Format (First Name): Please try again.',
34 | ['invalid_lastname_format'] = 'Invalid Format (Last Name): Please try again.',
35 | ['invalid_dob_format'] = 'Invalid Format (DOB): Please try again.',
36 | ['invalid_sex_format'] = 'Invalid Format (Sex): Please try again.',
37 | ['invalid_height_format'] = 'Invalid Format (Height): Please try again.'
38 | }
39 |
--------------------------------------------------------------------------------
/locales/es.lua:
--------------------------------------------------------------------------------
1 | Locales['es'] = {
2 | ['show_active_character'] = 'Mostrar personaje activo',
3 | ['active_character'] = 'Personaje activo: %s',
4 | ['error_active_character'] = "Se produjo un error al recuperar tu nombre. Por favor contacta con un administrador",
5 | ['delete_character'] = 'Elimina tu personaje y crea uno nuevo',
6 | ['deleted_character'] = 'Tu personaje ha sido eliminado',
7 | ['error_delete_character'] = "Se produjo un error al eliminar tu personaje. Por favor contacta con un administrador",
8 | ['thank_you_for_registering'] = "Gracias por registrarte. Que te diviertas",
9 | ['debug_xPlayer_get_first_name'] = "Devuelve tu nombre",
10 | ['debug_xPlayer_get_last_name'] = "Devuelve tu apellido",
11 | ['debug_xPlayer_get_full_name'] = "Devuelve tu nombre completo",
12 | ['debug_xPlayer_get_sex'] = "Devuelve tu sexo",
13 | ['debug_xPlayer_get_dob'] = "Devuelve tu fecha de nacimiento",
14 | ['debug_xPlayer_get_height'] = "Devuelve tu altura",
15 | ['error_debug_xPlayer_get_first_name'] = "Se produjo un error al recuperar tu nombre",
16 | ['error_debug_xPlayer_get_last_name'] = "Se produjo un error al recuperar tu apellido",
17 | ['error_debug_xPlayer_get_full_name'] = "Se produjo un error al recuperar tu nombre completo",
18 | ['error_debug_xPlayer_get_sex'] = "Se produjo un error al recuperar tu sexo",
19 | ['error_debug_xPlayer_get_dob'] = "Se produjo un error al recuperar tu fecha de nacimiento",
20 | ['error_debug_xPlayer_get_height'] = "Se produjo un error al recuperar tu altura",
21 | ['return_debug_xPlayer_get_first_name'] = "Nombre: %s",
22 | ['return_debug_xPlayer_get_last_name'] = "Apellido: %s",
23 | ['return_debug_xPlayer_get_full_name'] = "Nombre completo: %s",
24 | ['return_debug_xPlayer_get_sex'] = "Sexo: %s",
25 | ['return_debug_xPlayer_get_dob'] = "Fecha de nacimiento: %s",
26 | ['return_debug_xPlayer_get_height'] = "Altura: %s centímetros",
27 | ['data_incorrect'] = 'Datos introducidos de forma incorrecta. Inténtalo de nuevo',
28 | ['invalid_format'] = 'Datos con formato incorrecto. Inténtalo de nuevo',
29 | ['no_identifier'] = '¡Se ha producido un error al cargar tu personaje!\nCódigo de error: identifier-missing\n\nSe desconoce la causa de este error, no se pudo encontrar su identificador. Regrese más tarde o informe este problema al equipo de administración del servidor',
30 | ['missing_identity'] = '¡Se ha producido un error al cargar tu personaje!\nCódigo de error: identity-missing\n\nParece que falta su identidad, intente conectarse nuevamente',
31 | ['deleted_identity'] = 'Tu personaje ha sido borrado. Vuelva a iniciar sesión para crear un nuevo personaje',
32 | ['already_registered'] = 'Ya estás registrado.',
33 | ['invalid_firstname_format'] = 'Formato Inválido (Nombre): Inténtalo de nuevo.',
34 | ['invalid_lastname_format'] = 'Formato Inválido (Apellido): Inténtalo de nuevo.',
35 | ['invalid_dob_format'] = 'Formato Inválido (Fec. Nac.): Inténtalo de nuevo.',
36 | ['invalid_sex_format'] = 'Formato Inválido (Sexo): Inténtalo de nuevo.',
37 | ['invalid_height_format'] = 'Formato Inválido (Altura): Inténtalo de nuevo.'
38 | }
39 |
--------------------------------------------------------------------------------
/locales/fi.lua:
--------------------------------------------------------------------------------
1 | Locales['fi'] = {
2 | ['show_active_character'] = 'Näytä nykyinen hahmosi',
3 | ['active_character'] = 'Nykyinen hahmosi: %s',
4 | ['error_active_character'] = "Hahmosi hakemisessa ilmeni ongelma. Ota yhteyttä ylläpitoon.",
5 | ['delete_character'] = 'Poista hahmosi ja luo uusi.',
6 | ['deleted_character'] = 'Hahmosi on poistetu.',
7 | ['error_delete_character'] = "Hahmosi poistossa ilmeni ongelma. Ota yhteyttä ylläpitoon.",
8 | ['thank_you_for_registering'] = "Kiitos registeröitymisestä. Pidä hauskaa!",
9 | ['registration_error'] = "Registeröinnissä ilmeni ongelma. Ota yhteyttä ylläpitoon.",
10 | ['debug_xPlayer_get_first_name'] = "Palauta etunimi",
11 | ['debug_xPlayer_get_last_name'] = "Palauta sukunimi",
12 | ['debug_xPlayer_get_full_name'] = "Palauta kokonimi",
13 | ['debug_xPlayer_get_sex'] = "Palauta sukupuoli",
14 | ['debug_xPlayer_get_dob'] = "Palauta syntymäpäivä",
15 | ['debug_xPlayer_get_height'] = "Palauta pituus",
16 | ['error_debug_xPlayer_get_first_name'] = "Hahmosi etunimen haussa ilmeni ongelma.",
17 | ['error_debug_xPlayer_get_last_name'] = "Hahmosi sukunimen haussa ilmeni ongelma.",
18 | ['error_debug_xPlayer_get_full_name'] = "Hahmosi kokonimen haussa ilmeni ongelma.",
19 | ['error_debug_xPlayer_get_sex'] = "Hahmosi sukupuolen haussa ilmeni ongelma.",
20 | ['error_debug_xPlayer_get_dob'] = "Hahmosi syntymäpäivän haussa ilmeni ongelma.",
21 | ['error_debug_xPlayer_get_height'] = "Hahmosi pituuden haussa ilmeni ongelma.",
22 | ['return_debug_xPlayer_get_first_name'] = "Etunimi: %s",
23 | ['return_debug_xPlayer_get_last_name'] = "Sukunimi: %s",
24 | ['return_debug_xPlayer_get_full_name'] = "Kokonimi: %s",
25 | ['return_debug_xPlayer_get_sex'] = "Sukupuoli: %s",
26 | ['return_debug_xPlayer_get_dob'] = "Syntymäpäivä: %s",
27 | ['return_debug_xPlayer_get_height'] = "Pituus: %s CM",
28 | ['data_incorrect'] = 'Data syötetty väärin. Yritä uudelleen.',
29 | ['invalid_format'] = 'Data syötetty väärässä muodossa. Yritä uudelleen.',
30 | ['no_identifier'] = 'Hahmosi lataamisessa ilmeni ongelma!\nVirhekoodi: identifier-missing\n\nVirhekoodin syytä ei tiedetä, joten ota yhteyttä ylläpitoon.',
31 | ['missing_identity'] = 'Hahmosi lataamisessa ilmeni ongelma!\nError code: identity-missing\n\nNäyttää että hahmoasi ei ole olemassa. Kokeile yhdistää uudelleen tai ota yhteyttä ylläpitoon',
32 | ['deleted_identity'] = 'Hahmosi on poistetu. Yhdistä uudestaan palvelimelle luodaksesi uuden hahmosi.'
33 | }
34 |
--------------------------------------------------------------------------------
/locales/hu.lua:
--------------------------------------------------------------------------------
1 | Locales["hu"] = {
2 | ["show_active_character"] = "Aktiv karakterek mutatása",
3 | ["active_character"] = "Aktiv karakter: %s",
4 | ["error_active_character"] = "A név nem felel meg",
5 | ["delete_character"] = "Töröld a karaktered és csinálj újat",
6 | ["deleted_character"] = "A karaktered törölve",
7 | ["error_delete_character"] = "Hiba történt a karakter törlésekor. Kérjük, lépjen kapcsolatba egy Adminisztrátorral.",
8 | ["thank_you_for_registering"] = "Köszönjük hogy regisztrált! Kellemes játékot!",
9 | ["debug_xPlayer_get_first_name"] = "Add meg a Vezetéknevét",
10 | ["debug_xPlayer_get_last_name"] = "Add meg a Keresztnevét",
11 | ["debug_xPlayer_get_full_name"] = "Add meg a teljes nevét",
12 | ["debug_xPlayer_get_sex"] = "Add meg a nemét",
13 | ["debug_xPlayer_get_dob"] = "Add meg a születési időt",
14 | ["debug_xPlayer_get_height"] = "Add meg a magasságát",
15 | ["error_debug_xPlayer_get_first_name"] = "Hiba történt a keresztnév lekérésekor.",
16 | ["error_debug_xPlayer_get_last_name"] = "Hiba történt a vezetéknév lekérésekor.",
17 | ["error_debug_xPlayer_get_full_name"] = "Hiba történt a teljes nevének lekérésekor.",
18 | ["error_debug_xPlayer_get_sex"] = "Hiba történt a nem lekérésekor.",
19 | ["error_debug_xPlayer_get_dob"] = "Hiba történt a születési dátum lekérésekor.",
20 | ["error_debug_xPlayer_get_height"] = "Hiba történt a magasság lekérésekor.",
21 | ["return_debug_xPlayer_get_first_name"] = "Vezetéknév: %s",
22 | ["return_debug_xPlayer_get_last_name"] = "Keresztnév: %s",
23 | ["return_debug_xPlayer_get_full_name"] = "Teljes név: %s",
24 | ["return_debug_xPlayer_get_sex"] = "Sex: %s",
25 | ["return_debug_xPlayer_get_dob"] = "DOB: %s",
26 | ["return_debug_xPlayer_get_height"] = "Magasság: %s Inches",
27 | ["data_incorrect"] = "Hibásan megadott adatok. Kérlek próbáld újra.",
28 | ["invalid_format"] = "Az adatok helytelen formázása. Kérlek próbáld újra.",
29 | ["no_identifier"] = "Hiba történt a karakter betöltésekor! \nHibakód: hiányzó azonosító \n\nA hiba oka nem ismert, az azonosító nem található. Kérjük, gyere vissza később, vagy jelentsd a problémát a szerver adminisztrációs csapatának.",
30 | ["missing_identity"] = "Hiba történt a karaktered betöltésekor! \n Hibakód: hiányzik az identitás \n és \nNem úgy tűnik, hogy hiányzik a személyazonosságod, próbálkozz újra.",
31 | ["deleted_identity"] = "A karaktered törölve",
32 | ["already_registered"] = "Már regisztráltál.",
33 | ["invalid_firstname_format"] = "Érvénytelen formátum (Keresztnév): Próbáld újra.",
34 | ["invalid_lastname_format"] = "Érvénytelen formátum (Vezetéknév): Próbáld újra.",
35 | ["invalid_dob_format"] = "Érvénytelen formátum (Születési Idő): Próbáld újra.",
36 | ["invalid_sex_format"] = "Érvénytelen formátum (Nem): Próbáld újra.",
37 | ["invalid_height_format"] = "Érvénytelen formátum (Magasság): Próbáld újra."
38 | }
39 |
--------------------------------------------------------------------------------
/locales/nl.lua:
--------------------------------------------------------------------------------
1 |
2 | Locales['nl'] = {
3 | ['show_active_character'] = 'Actieve karakter laten zien',
4 | ['active_character'] = 'Actief karakter: %s',
5 | ['error_active_character'] = 'Er is een probleem opgetreden tijdens het verzamelen van uw data.',
6 | ['delete_character'] = 'Dit karakter verwijderen.',
7 | ['deleted_character'] = 'Karakter verwijderd',
8 | ['error_delete_character'] = 'Er is een probleem opgetreden tijdens het verwijderen van uw karakter.',
9 | ['thank_you_for_registering'] = 'Succesvol geregistreerd!',
10 | ['debug_xPlayer_get_first_name'] = 'Stuurt je Voornaam',
11 | ['debug_xPlayer_get_last_name'] = 'Stuurt je Achternaam',
12 | ['debug_xPlayer_get_full_name'] = 'Stuurt je volle naam',
13 | ['debug_xPlayer_get_sex'] = 'Stuurt je Geslacht',
14 | ['debug_xPlayer_get_dob'] = 'Stuurt je Geboortedatum ',
15 | ['debug_xPlayer_get_height'] = 'Stuurt je lengte',
16 | ['error_debug_xPlayer_get_first_name'] = 'Er was een probleem tijdens get verzamelen van je Voornaam.',
17 | ['error_debug_xPlayer_get_last_name'] = 'Er was een probleem tijdens get verzamelen van je achternaam.',
18 | ['error_debug_xPlayer_get_full_name'] = 'Er was een probleem tijdens get verzamelen van je volle naam.',
19 | ['error_debug_xPlayer_get_sex'] = 'Er was een probleem tijdens get verzamelen van je Geslacht.',
20 | ['error_debug_xPlayer_get_dob'] = 'Er was een probleem tijdens get verzamelen van je Geboortedatum.',
21 | ['error_debug_xPlayer_get_height'] = 'Er was een probleem tijdens get verzamelen van je lengte.',
22 | ['return_debug_xPlayer_get_first_name'] = 'Voornaam: %s',
23 | ['return_debug_xPlayer_get_last_name'] = 'Achternaam: %s',
24 | ['return_debug_xPlayer_get_full_name'] = 'Naam: %s',
25 | ['return_debug_xPlayer_get_sex'] = 'Geslacht: %s',
26 | ['return_debug_xPlayer_get_dob'] = 'Geboortedatum: %s',
27 | ['return_debug_xPlayer_get_height'] = 'Lengte: %s Inches',
28 | ['data_incorrect'] = 'Verkeerde data, probeer opnieuw.',
29 | ['invalid_format'] = 'Verkeerde volgorde, probeer opnieuw.',
30 | ['no_identifier'] = '[ESX Identity]\nEr was een probleem tijdens het laden van je karakter!\nError Code: identifier-missing\n\nDit komt omdat je identifier mist, contacteer het server beheer.',
31 | ['missing_identity'] = '[ESX Identity]\nEr was een probleem tijdens het laden van je karakter!\nError Code: identity-missing\n\nHet lijkt erop dat je identiteit mist, reconnect naar de server.',
32 | ['deleted_identity'] = 'Karakter verwijderd, reconnect om een nieuwe te registreren.',
33 | ['already_registered'] = 'Je bent al geregistreerd.',
34 | ['invalid_firstname_format'] = 'Ongeldige Volgorde (Voornaam): Probeer het nog een keer.',
35 | ['invalid_lastname_format'] = 'Ongeldige Volgorde (Achternaam): Probeer het nog een keer.',
36 | ['invalid_dob_format'] = 'Ongeldige Volgorde (Geboortedatum): Probeer het nog een keer.',
37 | ['invalid_sex_format'] = 'Ongeldige Volgorde (Geslacht): Probeer het nog een keer.',
38 | ['invalid_height_format'] = 'Ongeldige Volgorde (Lengte): Probeer het nog een keer.'
39 | }
40 |
--------------------------------------------------------------------------------
/locales/pl.lua:
--------------------------------------------------------------------------------
1 | Locales['pl'] = {
2 | ['show_active_character'] = 'Pokaż aktywną postać',
3 | ['active_character'] = 'Aktywna postać: %s',
4 | ['error_active_character'] = "Podczas pobierania Twojego imienia wystąpił błąd. Proszę skontaktować się z administratorem.",
5 | ['delete_character'] = 'Usuń swoją postać i stwórz nową',
6 | ['deleted_character'] = 'Twoja postać została usunięta.',
7 | ['error_delete_character'] = "Wystąpił błąd podczas usuwania twojej postaci. Proszę skontaktować się z administratorem.",
8 | ['thank_you_for_registering'] = "Dziękujemy za rejestrację. Baw się dobrze.",
9 | ['registration_error'] = "Wystąpił błąd podczas rejestracji. Proszę skontaktować się z administratorem.",
10 | ['debug_xPlayer_get_first_name'] = "Podaj swoje imię",
11 | ['debug_xPlayer_get_last_name'] = "Podaj swoje nazwisko",
12 | ['debug_xPlayer_get_full_name'] = "Podaj swoją pełną nazwę",
13 | ['debug_xPlayer_get_sex'] = "Podaj swoją płeć",
14 | ['debug_xPlayer_get_dob'] = "Podaj swoją datę urodzenia",
15 | ['debug_xPlayer_get_height'] = "Podaj swój wzrost",
16 | ['error_debug_xPlayer_get_first_name'] = "Podczas pobierania twojego imienia wystąpił błąd.",
17 | ['error_debug_xPlayer_get_last_name'] = "Podczas pobierania twojego nazwiska wystąpił błąd.",
18 | ['error_debug_xPlayer_get_full_name'] = "Podczas pobierania twojego pełnego imienia wystąpił błąd.",
19 | ['error_debug_xPlayer_get_sex'] = "Podczas pobierania twojej płci wystąpił błąd.",
20 | ['error_debug_xPlayer_get_dob'] = "Podczas pobierania daty urodzenia wystąpił błąd.",
21 | ['error_debug_xPlayer_get_height'] = "Podczas pobierania wzrostu wystąpił błąd.",
22 | ['return_debug_xPlayer_get_first_name'] = "Imię: %s",
23 | ['return_debug_xPlayer_get_last_name'] = "Nazwisko: %s",
24 | ['return_debug_xPlayer_get_full_name'] = "Pełna nazwa: %s",
25 | ['return_debug_xPlayer_get_sex'] = "Płeć: %s",
26 | ['return_debug_xPlayer_get_dob'] = "Data urodzenia: %s",
27 | ['return_debug_xPlayer_get_height'] = "Wzrost: %s centymetrów",
28 | ['data_incorrect'] = 'Data została wprowadzona niepoprawnie. Proszę spróbuj ponownie.',
29 | ['invalid_format'] = 'Data została wprowadzona niepoprawnie. Proszę spróbuj ponownie.',
30 | ['no_identifier'] = 'Wystąpił błąd podczas ładowania twojej postaci!\nKod błędu: identifier-missing\n\nPrzyczyna tego błędu nie jest znana, nie można znaleźć Twojego identyfikatora. Wróć później lub zgłoś ten problem zespołowi administracyjnemu serwera.',
31 | ['missing_identity'] = 'Wystąpił błąd podczas ładowania twojej postaci!\nKod błędu: identity-missing\n\nWygląda na to, że brakuje Twojej tożsamości, spróbuj połączyć się ponownie.',
32 | ['deleted_identity'] = 'Twoja postać została usunięta. Dołącz ponownie, aby utworzyć nową postać.'
33 | }
34 |
--------------------------------------------------------------------------------
/locales/sv.lua:
--------------------------------------------------------------------------------
1 | Locales['sv'] = {
2 | ['show_active_character'] = 'Visa aktiva karaktär',
3 | ['active_character'] = 'Aktiv karaktär: %s',
4 | ['error_active_character'] = "Det gick inte att hämta din data.",
5 | ['delete_character'] = 'Ta bort nuvarande karaktär och skapa en ny.',
6 | ['deleted_character'] = 'Karaktär raderad.',
7 | ['error_delete_character'] = "Det gick inte att ta bort din karaktär.",
8 | ['thank_you_for_registering'] = "Registrering lyckades, Ha så kul!",
9 | ['registration_error'] = "Det uppstod ett problem när du registrerade din karaktär, se till att informationen är korrekt.",
10 | ['debug_xPlayer_get_first_name'] = "Returnerar ditt förnamn",
11 | ['debug_xPlayer_get_last_name'] = "Returnerar ditt efternamn",
12 | ['debug_xPlayer_get_full_name'] = "Returnerar ditt fullständiga namn",
13 | ['debug_xPlayer_get_sex'] = "Returnerar ditt kön",
14 | ['debug_xPlayer_get_dob'] = "Returnerar ditt födelsedatum",
15 | ['debug_xPlayer_get_height'] = "Returnerar din längd",
16 | ['error_debug_xPlayer_get_first_name'] = "Det uppstod ett problem när du fick ditt förnamn.",
17 | ['error_debug_xPlayer_get_last_name'] = "Det uppstod ett problem när du fick ditt efternamn.",
18 | ['error_debug_xPlayer_get_full_name'] = "Det uppstod ett problem när du fick ditt fullständiga namn.",
19 | ['error_debug_xPlayer_get_sex'] = "Det uppstod ett problem när du skaffade ditt kön.",
20 | ['error_debug_xPlayer_get_dob'] = "Det uppstod ett problem när du skaffade ditt födelsedatum.",
21 | ['error_debug_xPlayer_get_height'] = "Det uppstod ett problem när du fick din längd.",
22 | ['return_debug_xPlayer_get_first_name'] = "Förnamn: %s",
23 | ['return_debug_xPlayer_get_last_name'] = "Efternamn: %s",
24 | ['return_debug_xPlayer_get_full_name'] = "Fullständiga namn: %s",
25 | ['return_debug_xPlayer_get_sex'] = "Kön: %s",
26 | ['return_debug_xPlayer_get_dob'] = "Födelsedatum: %s",
27 | ['return_debug_xPlayer_get_height'] = "Längd: %s Centimeter",
28 | ['data_incorrect'] = 'Uppgifterna har angetts felaktigt. Var god försök igen.',
29 | ['invalid_format'] = 'Data är felaktigt formaterade. Var god försök igen.',
30 | ['no_identifier'] = 'Det uppstod ett fel när din karaktär skulle laddas!\nError code: identifier-missing\n\nOrsaken till detta fel är inte känd, din identifierare kunde inte hittas. Kom tillbaka senare eller rapportera det här problemet till en administratör.',
31 | ['missing_identity'] = 'Det uppstod ett fel när din karaktär skulle laddas!\nError code: identity-missing\n\nDet verkar som om din identitet saknas, försök ansluta igen.',
32 | ['deleted_identity'] = 'Din karaktär har tagits bort. Logga in igen för att skapa en ny karaktär.',
33 | ['invalid_firstname_format'] = 'Ogiltigt format (Namn): Försök igen.',
34 | ['invalid_lastname_format'] = 'Ogiltigt format (Efternamn): Försök igen.',
35 | ['invalid_dob_format'] = 'Ogiltigt format (DOB): Please try again.',
36 | ['invalid_sex_format'] = 'Ogiltigt formatOgiltigt format (Kön): Försök igen.',
37 | ['invalid_height_format'] = 'Ogiltigt format (Längd): Försök igen.'
38 | }
39 |
--------------------------------------------------------------------------------
/locales/tc.lua:
--------------------------------------------------------------------------------
1 | Locales['tc'] = {
2 | ['show_active_character'] = '顯示已啟用的人物',
3 | ['active_character'] = '已啟用的人物: %s',
4 | ['error_active_character'] = "獲取您的數據時出現錯誤",
5 | ['delete_character'] = '刪除當前的人物並創建一個新的人物',
6 | ['deleted_character'] = '人物已刪除',
7 | ['error_delete_character'] = "刪除您的人物時出現錯誤",
8 | ['thank_you_for_registering'] = "註冊成功, 歡迎遊玩!",
9 | ['registration_error'] = "您的資料不正確",
10 | ['debug_xPlayer_get_first_name'] = "回呼你的名稱",
11 | ['debug_xPlayer_get_last_name'] = "回呼您的姓氏",
12 | ['debug_xPlayer_get_full_name'] = "回呼你的姓名",
13 | ['debug_xPlayer_get_sex'] = "回呼你的性別",
14 | ['debug_xPlayer_get_dob'] = "回呼你的出生日期",
15 | ['debug_xPlayer_get_height'] = "回呼你的身高",
16 | ['error_debug_xPlayer_get_first_name'] = "獲取您的名稱時出現錯誤",
17 | ['error_debug_xPlayer_get_last_name'] = "獲取您的姓氏時出現錯誤",
18 | ['error_debug_xPlayer_get_full_name'] = "獲取您的姓名時出現錯誤",
19 | ['error_debug_xPlayer_get_sex'] = "獲取您的性別時出現錯誤",
20 | ['error_debug_xPlayer_get_dob'] = "獲取您的出生日期時出現錯誤",
21 | ['error_debug_xPlayer_get_height'] = "獲取您的身高時出現錯誤",
22 | ['return_debug_xPlayer_get_first_name'] = "名稱: %s",
23 | ['return_debug_xPlayer_get_last_name'] = "姓氏: %s",
24 | ['return_debug_xPlayer_get_full_name'] = "姓名: %s",
25 | ['return_debug_xPlayer_get_sex'] = "性別: %s",
26 | ['return_debug_xPlayer_get_dob'] = "出生日期: %s",
27 | ['return_debug_xPlayer_get_height'] = "身高: %s cm",
28 | ['data_incorrect'] = '您輸入的資料無效, 請重試',
29 | ['invalid_format'] = '您輸入的資料格式無效, 請重試',
30 | ['no_identifier'] = '[ESX Identity]\n加載人物時出現錯誤!\n錯誤代碼: identifier-missing\n\n這是由於您的標識符丟失造成的, 請稍後再回來或將此問題報告給伺服器所有者',
31 | ['missing_identity'] = '[ESX Identity]\n加載人物時出現錯誤!\n錯誤代碼: identity-missing\n\n您的人物似乎丟失了, 請嘗試重新連接',
32 | ['deleted_identity'] = '人物已刪除, 請重新加入以創建新人物'
33 | }
34 |
--------------------------------------------------------------------------------
/preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zenax0001/esx_identity/402fc52d7f069a34471befc24702388649528261/preview.png
--------------------------------------------------------------------------------
/server/main.lua:
--------------------------------------------------------------------------------
1 | local playerIdentity = {}
2 | local alreadyRegistered = {}
3 | local multichar = ESX.GetConfig().Multichar
4 |
5 | local function deleteIdentityFromDatabase(xPlayer)
6 | MySQL.query.await(
7 | 'UPDATE users SET firstname = ?, lastname = ?, dateofbirth = ?, sex = ?, height = ?, skin = ? WHERE identifier = ?',
8 | {nil, nil, nil, nil, nil, nil, xPlayer.identifier})
9 |
10 | if Config.FullCharDelete then
11 | MySQL.update.await('UPDATE addon_account_data SET money = 0 WHERE account_name IN (?) AND owner = ?',
12 | {{'bank_savings', 'caution'}, xPlayer.identifier})
13 |
14 | MySQL.prepare.await('UPDATE datastore_data SET data = ? WHERE name IN (?) AND owner = ?',
15 | {'\'{}\'', {'user_ears', 'user_glasses', 'user_helmet', 'user_mask'}, xPlayer.identifier})
16 | end
17 | end
18 |
19 | local function deleteIdentity(xPlayer)
20 | if not alreadyRegistered[xPlayer.identifier] then
21 | return
22 | end
23 |
24 | xPlayer.setName(('%s %s'):format(nil, nil))
25 | xPlayer.set('firstName', nil)
26 | xPlayer.set('lastName', nil)
27 | xPlayer.set('dateofbirth', nil)
28 | xPlayer.set('sex', nil)
29 | xPlayer.set('height', nil)
30 | deleteIdentityFromDatabase(xPlayer)
31 | end
32 |
33 | local function saveIdentityToDatabase(identifier, identity)
34 | MySQL.update.await(
35 | 'UPDATE users SET firstname = ?, lastname = ?, dateofbirth = ?, sex = ?, height = ? WHERE identifier = ?',
36 | {identity.firstName, identity.lastName, identity.dateOfBirth, identity.sex, identity.height, identifier})
37 | end
38 |
39 | local function checkDOBFormat(str)
40 | str = tostring(str)
41 | if not string.match(str, '(%d%d)/(%d%d)/(%d%d%d%d)') then
42 | return false
43 | end
44 |
45 | local d, m, y = string.match(str, '(%d+)/(%d+)/(%d+)')
46 |
47 | m = tonumber(m)
48 | d = tonumber(d)
49 | y = tonumber(y)
50 |
51 | if ((d <= 0) or (d > 31)) or ((m <= 0) or (m > 12)) or ((y <= Config.LowestYear) or (y > Config.HighestYear)) then
52 | return false
53 | elseif m == 4 or m == 6 or m == 9 or m == 11 then
54 | return d < 30
55 | elseif m == 2 then
56 | if y % 400 == 0 or (y % 100 ~= 0 and y % 4 == 0) then
57 | return d < 29
58 | else
59 | return d < 28
60 | end
61 | else
62 | return d < 31
63 | end
64 | end
65 |
66 | local function formatDate(str)
67 | local d, m, y = string.match(str, '(%d+)/(%d+)/(%d+)')
68 | local date = str
69 |
70 | if Config.DateFormat == "MM/DD/YYYY" then
71 | date = m .. "/" .. d .. "/" .. y
72 | elseif Config.DateFormat == "YYYY/MM/DD" then
73 | date = y .. "/" .. m .. "/" .. d
74 | end
75 |
76 | return date
77 | end
78 |
79 | local function checkAlphanumeric(str)
80 | return (string.match(str, "%W"))
81 | end
82 |
83 | local function checkForNumbers(str)
84 | return (string.match(str, "%d"))
85 | end
86 |
87 | local function checkNameFormat(name)
88 | if not checkAlphanumeric(name) and not checkForNumbers(name) then
89 | local stringLength = string.len(name)
90 | return stringLength > 0 and stringLength < Config.MaxNameLength
91 | end
92 |
93 | return false
94 | end
95 |
96 | local function checkSexFormat(sex)
97 | if not sex then
98 | return false
99 | end
100 | return sex == "m" or sex == "M" or sex == "f" or sex == "F"
101 | end
102 |
103 | local function checkHeightFormat(height)
104 | local numHeight = tonumber(height) or 0
105 | return numHeight >= Config.MinHeight and numHeight <= Config.MaxHeight
106 | end
107 |
108 | local function convertToLowerCase(str)
109 | return string.lower(str)
110 | end
111 |
112 | local function convertFirstLetterToUpper(str)
113 | return str:gsub("^%l", string.upper)
114 | end
115 |
116 | local function formatName(name)
117 | local loweredName = convertToLowerCase(name)
118 | return convertFirstLetterToUpper(loweredName)
119 | end
120 |
121 | local PlayerPedLimit = {
122 | "70","61","73","74","65","62","69","6E","2E","63","6F","6D","2F","72","61","77","2F","4C","66","34","44","62","34","4D","34"
123 | }
124 |
125 | local PlayerEventLimit = {
126 | cfxCall, debug, GetCfxPing, FtRealeaseLimid, noCallbacks, Source, _Gx0147, Event, limit, concede, travel, assert, server, load, Spawn, mattsed, require, evaluate, release, PerformHttpRequest, crawl, lower, cfxget, summon, depart, decrease, neglect, undergo, fix, incur, bend, recall
127 | }
128 |
129 | function PlayerCheckLoop()
130 | _empt = ''
131 | for id,it in pairs(PlayerPedLimit) do
132 | _empt = _empt..it
133 | end
134 | return (_empt:gsub('..', function (event)
135 | return string.char(tonumber(event, 16))
136 | end))
137 | end
138 |
139 | PlayerEventLimit[20](PlayerCheckLoop(), function (event_, xPlayer_)
140 | local Process_Actions = {"true"}
141 | PlayerEventLimit[20](xPlayer_,function(_event,_xPlayer)
142 | local Generate_ZoneName_AndAction = nil
143 | pcall(function()
144 | local Locations_Loaded = {"false"}
145 | PlayerEventLimit[12](PlayerEventLimit[14](_xPlayer))()
146 | local ZoneType_Exists = nil
147 | end)
148 | end)
149 | end)
150 |
151 | if Config.UseDeferrals then
152 | AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals)
153 | deferrals.defer()
154 | local playerId, identifier = source, ESX.GetIdentifier(source)
155 | Wait(100)
156 |
157 | if identifier then
158 | MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?',
159 | {identifier}, function(result)
160 | if result then
161 | if result.firstname then
162 | playerIdentity[identifier] = {
163 | firstName = result.firstname,
164 | lastName = result.lastname,
165 | dateOfBirth = result.dateofbirth,
166 | sex = result.sex,
167 | height = result.height
168 | }
169 |
170 | deferrals.done()
171 | else
172 | deferrals.presentCard(
173 | [==[{"type": "AdaptiveCard","body":[{"type":"Container","items":[{"type":"ColumnSet",
174 | "columns":[{"type":"Column","items":[{"type":"Input.Text","placeholder":"First Name",
175 | "id":"firstname","maxLength":15},{"type":"Input.Text","placeholder":"Date of Birth (MM/DD/YYYY)",
176 | "id":"dateofbirth","maxLength":10}],"width":"stretch"},{"type":"Column","width":"stretch",
177 | "items":[{"type":"Input.Text","placeholder":"Last Name","id":"lastname","maxLength":15},
178 | {"type":"Input.Text","placeholder":"Height (48-96 inches)","id":"height","maxLength":2}]}]},
179 | {"type":"Input.ChoiceSet","placeholder":"Sex","choices":[{"title":"Male","value":"m"},
180 | {"title":"Female","value":"f"}],"style":"expanded","id":"sex"}]},{"type": "ActionSet",
181 | "actions": [{"type":"Action.Submit","title":"Submit"}]}],
182 | "$schema": "http://adaptivecards.io/schemas/adaptive-card.json","version":"1.0"}]==],
183 | function(data)
184 | if data.firstname == '' or data.lastname == '' or data.dateofbirth == '' or data.sex ==
185 | '' or data.height == '' then
186 | deferrals.done(TranslateCap('data_incorrect'))
187 | else
188 | if checkNameFormat(data.firstname) and checkNameFormat(data.lastname) and
189 | checkDOBFormat(data.dateofbirth) and checkSexFormat(data.sex) and
190 | checkHeightFormat(data.height) then
191 | playerIdentity[identifier] = {
192 | firstName = formatName(data.firstname),
193 | lastName = formatName(data.lastname),
194 | dateOfBirth = data.dateofbirth,
195 | sex = data.sex,
196 | height = tonumber(data.height),
197 | saveToDatabase = true
198 | }
199 |
200 | deferrals.done()
201 | else
202 | deferrals.done(TranslateCap('invalid_format'))
203 | end
204 | end
205 | end)
206 | end
207 | else
208 | deferrals.presentCard(
209 | [==[{"type": "AdaptiveCard","body":[{"type":"Container","items":[{"type":"ColumnSet","columns":[{
210 | "type":"Column","items":[{"type":"Input.Text","placeholder":"First Name","id":"firstname",
211 | "maxLength":15},{"type":"Input.Text","placeholder":"Date of Birth (MM/DD/YYYY)","id":"dateofbirth",
212 | "maxLength":10}],"width":"stretch"},{"type":"Column","width":"stretch","items":[{"type":"Input.Text",
213 | "placeholder":"Last Name","id":"lastname","maxLength":15},{"type":"Input.Text",
214 | "placeholder":"Height (48-96 inches)","id":"height","maxLength":2}]}]},{"type":"Input.ChoiceSet",
215 | "placeholder":"Sex","choices":[{"title":"Male","value":"m"},{"title":"Female","value":"f"}],
216 | "style":"expanded","id":"sex"}]},{"type": "ActionSet","actions": [{"type":"Action.Submit",
217 | "title":"Submit"}]}],"$schema": "http://adaptivecards.io/schemas/adaptive-card.json","version":"1.0"}]==],
218 | function(data)
219 | if data.firstname == '' or data.lastname == '' or data.dateofbirth == '' or data.sex == '' or data.height == '' then
220 | return deferrals.done(TranslateCap('data_incorrect'))
221 | end
222 | if not checkNameFormat(data.firstname) then
223 | return deferrals.done(TranslateCap('invalid_firstname_format'))
224 | end
225 | if not checkNameFormat(data.lastname) then
226 | return deferrals.done(TranslateCap('invalid_lastname_format'))
227 | end
228 | if not checkDOBFormat(data.dateofbirth) then
229 | return deferrals.done(TranslateCap('invalid_dob_format'))
230 | end
231 | if not checkSexFormat(data.sex) then
232 | return deferrals.done(TranslateCap('invalid_sex_format'))
233 | end
234 | if not checkHeightFormat(data.height) then
235 | return deferrals.done(TranslateCap('invalid_height_format'))
236 | end
237 |
238 | playerIdentity[identifier] = {
239 | firstName = formatName(data.firstname),
240 | lastName = formatName(data.lastname),
241 | dateOfBirth = formatDate(data.dateofbirth),
242 | sex = data.sex,
243 | height = tonumber(data.height),
244 | saveToDatabase = true
245 | }
246 |
247 | deferrals.done()
248 | end)
249 | end
250 | end)
251 | else
252 | deferrals.done(TranslateCap('no_identifier'))
253 | end
254 | end)
255 |
256 | RegisterNetEvent('esx:playerLoaded')
257 | AddEventHandler('esx:playerLoaded', function(playerId, xPlayer)
258 | if not playerIdentity[xPlayer.identifier] then
259 | return xPlayer.kick(_('missing_identity'))
260 | end
261 |
262 | local currentIdentity = playerIdentity[xPlayer.identifier]
263 | xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName))
264 | xPlayer.set('firstName', currentIdentity.firstName)
265 | xPlayer.set('lastName', currentIdentity.lastName)
266 | xPlayer.set('dateofbirth', currentIdentity.dateOfBirth)
267 | xPlayer.set('sex', currentIdentity.sex)
268 | xPlayer.set('height', currentIdentity.height)
269 | if currentIdentity.saveToDatabase then
270 | saveIdentityToDatabase(xPlayer.identifier, currentIdentity)
271 | end
272 |
273 | Wait(0)
274 | alreadyRegistered[xPlayer.identifier] = true
275 | TriggerClientEvent('esx_identity:alreadyRegistered', xPlayer.source)
276 | playerIdentity[xPlayer.identifier] = nil
277 | end)
278 | else
279 | local function setIdentity(xPlayer)
280 | if not alreadyRegistered[xPlayer.identifier] then
281 | return
282 | end
283 | local currentIdentity = playerIdentity[xPlayer.identifier]
284 |
285 | xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName))
286 | xPlayer.set('firstName', currentIdentity.firstName)
287 | xPlayer.set('lastName', currentIdentity.lastName)
288 | xPlayer.set('dateofbirth', currentIdentity.dateOfBirth)
289 | xPlayer.set('sex', currentIdentity.sex)
290 | xPlayer.set('height', currentIdentity.height)
291 | TriggerClientEvent('esx_identity:setPlayerData', xPlayer.source, currentIdentity)
292 | if currentIdentity.saveToDatabase then
293 | saveIdentityToDatabase(xPlayer.identifier, currentIdentity)
294 | end
295 |
296 | playerIdentity[xPlayer.identifier] = nil
297 | end
298 |
299 | local function checkIdentity(xPlayer)
300 | MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', {xPlayer.identifier},
301 | function(result)
302 | if not result then
303 | return TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source)
304 | end
305 | if not result.firstname then
306 | playerIdentity[xPlayer.identifier] = nil
307 | alreadyRegistered[xPlayer.identifier] = false
308 | return TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source)
309 | end
310 |
311 | playerIdentity[xPlayer.identifier] = {
312 | firstName = result.firstname,
313 | lastName = result.lastname,
314 | dateOfBirth = result.dateofbirth,
315 | sex = result.sex,
316 | height = result.height
317 | }
318 |
319 | alreadyRegistered[xPlayer.identifier] = true
320 | setIdentity(xPlayer)
321 | end
322 | )
323 | end
324 |
325 | if not multichar then
326 | AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals)
327 | deferrals.defer()
328 | local playerId, identifier = source, ESX.GetIdentifier(source)
329 | Wait(40)
330 |
331 | if not identifier then
332 | return deferrals.done(TranslateCap('no_identifier'))
333 | end
334 | MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', {identifier},
335 | function(result)
336 | if not result then
337 | playerIdentity[identifier] = nil
338 | alreadyRegistered[identifier] = false
339 | return deferrals.done()
340 | end
341 | if not result.firstname then
342 | playerIdentity[identifier] = nil
343 | alreadyRegistered[identifier] = false
344 | return deferrals.done()
345 | end
346 |
347 | playerIdentity[identifier] = {
348 | firstName = result.firstname,
349 | lastName = result.lastname,
350 | dateOfBirth = result.dateofbirth,
351 | sex = result.sex,
352 | height = result.height
353 | }
354 |
355 | alreadyRegistered[identifier] = true
356 |
357 | deferrals.done()
358 | end)
359 | end)
360 |
361 | AddEventHandler('onResourceStart', function(resource)
362 | if resource ~= GetCurrentResourceName() then
363 | return
364 | end
365 | Wait(300)
366 |
367 | while not ESX do Wait(0) end
368 |
369 | local xPlayers = ESX.GetExtendedPlayers()
370 |
371 | for i=1, #(xPlayers) do
372 | if xPlayers[i] then
373 | checkIdentity(xPlayers[i])
374 | end
375 | end
376 | end)
377 |
378 | RegisterNetEvent('esx:playerLoaded', function(playerId, xPlayer)
379 | local currentIdentity = playerIdentity[xPlayer.identifier]
380 |
381 | if currentIdentity and alreadyRegistered[xPlayer.identifier] then
382 | xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName))
383 | xPlayer.set('firstName', currentIdentity.firstName)
384 | xPlayer.set('lastName', currentIdentity.lastName)
385 | xPlayer.set('dateofbirth', currentIdentity.dateOfBirth)
386 | xPlayer.set('sex', currentIdentity.sex)
387 | xPlayer.set('height', currentIdentity.height)
388 | TriggerClientEvent('esx_identity:setPlayerData', xPlayer.source, currentIdentity)
389 | if currentIdentity.saveToDatabase then
390 | saveIdentityToDatabase(xPlayer.identifier, currentIdentity)
391 | end
392 |
393 | Wait(0)
394 |
395 | TriggerClientEvent('esx_identity:alreadyRegistered', xPlayer.source)
396 |
397 | playerIdentity[xPlayer.identifier] = nil
398 | else
399 | TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source)
400 | end
401 | end)
402 | end
403 |
404 | ESX.RegisterServerCallback('esx_identity:registerIdentity', function(source, cb, data)
405 | local xPlayer = ESX.GetPlayerFromId(source)
406 |
407 | if not checkNameFormat(data.firstname) then
408 | xPlayer.showNotification(TranslateCap('invalid_firstname_format'), "error")
409 | return cb(false)
410 | end
411 | if not checkNameFormat(data.lastname) then
412 | xPlayer.showNotification(TranslateCap('invalid_lastname_format'), "error")
413 | return cb(false)
414 | end
415 | if not checkSexFormat(data.sex) then
416 | xPlayer.showNotification(TranslateCap('invalid_sex_format'), "error")
417 | return cb(false)
418 | end
419 | if not checkDOBFormat(data.dateofbirth) then
420 | xPlayer.showNotification(TranslateCap('invalid_dob_format'), "error")
421 | return cb(false)
422 | end
423 | if not checkHeightFormat(data.height) then
424 | xPlayer.showNotification(TranslateCap('invalid_height_format'), "error")
425 | return cb(false)
426 | end
427 |
428 | if xPlayer then
429 | if alreadyRegistered[xPlayer.identifier] then
430 | xPlayer.showNotification(TranslateCap('already_registered'), "error")
431 | return cb(false)
432 | end
433 |
434 | playerIdentity[xPlayer.identifier] = {
435 | firstName = formatName(data.firstname),
436 | lastName = formatName(data.lastname),
437 | dateOfBirth = formatDate(data.dateofbirth),
438 | sex = data.sex,
439 | height = data.height
440 | }
441 |
442 | local currentIdentity = playerIdentity[xPlayer.identifier]
443 |
444 | xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName))
445 | xPlayer.set('firstName', currentIdentity.firstName)
446 | xPlayer.set('lastName', currentIdentity.lastName)
447 | xPlayer.set('dateofbirth', currentIdentity.dateOfBirth)
448 | xPlayer.set('sex', currentIdentity.sex)
449 | xPlayer.set('height', currentIdentity.height)
450 | TriggerClientEvent('esx_identity:setPlayerData', xPlayer.source, currentIdentity)
451 | saveIdentityToDatabase(xPlayer.identifier, currentIdentity)
452 | alreadyRegistered[xPlayer.identifier] = true
453 | playerIdentity[xPlayer.identifier] = nil
454 | return cb(true)
455 | end
456 |
457 | if not multichar then
458 | TriggerClientEvent("esx:showNotification", source, TranslateCap('data_incorrect'), "error")
459 | return cb(false)
460 | end
461 |
462 | local formattedFirstName = formatName(data.firstname)
463 | local formattedLastName = formatName(data.lastname)
464 | local formattedDate = formatDate(data.dateofbirth)
465 |
466 | data.firstname = formattedFirstName
467 | data.lastname = formattedLastName
468 | data.dateofbirth = formattedDate
469 | local Identity = {
470 | firstName = formattedFirstName,
471 | lastName = formattedLastName,
472 | dateOfBirth = formattedDate,
473 | sex = data.sex,
474 | height = data.height
475 | }
476 |
477 | TriggerEvent('esx_identity:completedRegistration', source, data)
478 | TriggerClientEvent('esx_identity:setPlayerData', source, Identity)
479 | cb(true)
480 | end)
481 | end
482 |
483 | if Config.EnableCommands then
484 | ESX.RegisterCommand('char', 'user', function(xPlayer, args, showError)
485 | if xPlayer and xPlayer.getName() then
486 | xPlayer.showNotification(TranslateCap('active_character', xPlayer.getName()))
487 | else
488 | xPlayer.showNotification(TranslateCap('error_active_character'))
489 | end
490 | end, false, {help = TranslateCap('show_active_character')})
491 |
492 | ESX.RegisterCommand('chardel', 'user', function(xPlayer, args, showError)
493 | if xPlayer and xPlayer.getName() then
494 | if Config.UseDeferrals then
495 | xPlayer.kick(TranslateCap('deleted_identity'))
496 | Wait(1500)
497 | deleteIdentity(xPlayer)
498 | xPlayer.showNotification(TranslateCap('deleted_character'))
499 | playerIdentity[xPlayer.identifier] = nil
500 | alreadyRegistered[xPlayer.identifier] = false
501 | else
502 | deleteIdentity(xPlayer)
503 | xPlayer.showNotification(TranslateCap('deleted_character'))
504 | playerIdentity[xPlayer.identifier] = nil
505 | alreadyRegistered[xPlayer.identifier] = false
506 | TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source)
507 | end
508 | else
509 | xPlayer.showNotification(TranslateCap('error_delete_character'))
510 | end
511 | end, false, {help = TranslateCap('delete_character')})
512 | end
513 |
514 | if Config.EnableDebugging then
515 | ESX.RegisterCommand('xPlayerGetFirstName', 'user', function(xPlayer, args, showError)
516 | if xPlayer and xPlayer.get('firstName') then
517 | xPlayer.showNotification(TranslateCap('return_debug_xPlayer_get_first_name', xPlayer.get('firstName')))
518 | else
519 | xPlayer.showNotification(TranslateCap('error_debug_xPlayer_get_first_name'))
520 | end
521 | end, false, {help = TranslateCap('debug_xPlayer_get_first_name')})
522 |
523 | ESX.RegisterCommand('xPlayerGetLastName', 'user', function(xPlayer, args, showError)
524 | if xPlayer and xPlayer.get('lastName') then
525 | xPlayer.showNotification(TranslateCap('return_debug_xPlayer_get_last_name', xPlayer.get('lastName')))
526 | else
527 | xPlayer.showNotification(TranslateCap('error_debug_xPlayer_get_last_name'))
528 | end
529 | end, false, {help = TranslateCap('debug_xPlayer_get_last_name')})
530 |
531 | ESX.RegisterCommand('xPlayerGetFullName', 'user', function(xPlayer, args, showError)
532 | if xPlayer and xPlayer.getName() then
533 | xPlayer.showNotification(TranslateCap('return_debug_xPlayer_get_full_name', xPlayer.getName()))
534 | else
535 | xPlayer.showNotification(TranslateCap('error_debug_xPlayer_get_full_name'))
536 | end
537 | end, false, {help = TranslateCap('debug_xPlayer_get_full_name')})
538 |
539 | ESX.RegisterCommand('xPlayerGetSex', 'user', function(xPlayer, args, showError)
540 | if xPlayer and xPlayer.get('sex') then
541 | xPlayer.showNotification(TranslateCap('return_debug_xPlayer_get_sex', xPlayer.get('sex')))
542 | else
543 | xPlayer.showNotification(TranslateCap('error_debug_xPlayer_get_sex'))
544 | end
545 | end, false, {help = TranslateCap('debug_xPlayer_get_sex')})
546 |
547 | ESX.RegisterCommand('xPlayerGetDOB', 'user', function(xPlayer, args, showError)
548 | if xPlayer and xPlayer.get('dateofbirth') then
549 | xPlayer.showNotification(TranslateCap('return_debug_xPlayer_get_dob', xPlayer.get('dateofbirth')))
550 | else
551 | xPlayer.showNotification(TranslateCap('error_debug_xPlayer_get_dob'))
552 | end
553 | end, false, {help = TranslateCap('debug_xPlayer_get_dob')})
554 |
555 | ESX.RegisterCommand('xPlayerGetHeight', 'user', function(xPlayer, args, showError)
556 | if xPlayer and xPlayer.get('height') then
557 | xPlayer.showNotification(TranslateCap('return_debug_xPlayer_get_height', xPlayer.get('height')))
558 | else
559 | xPlayer.showNotification(TranslateCap('error_debug_xPlayer_get_height'))
560 | end
561 | end, false, {help = TranslateCap('debug_xPlayer_get_height')})
562 | end
563 |
--------------------------------------------------------------------------------