├── 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 | ![Preview](./preview.png) -------------------------------------------------------------------------------- /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 |
15 |
First Name
16 |
17 |
Last Name
18 |
19 |
Date of Birth (MM/DD/YYYY)
20 |
21 |
Height
22 |
23 |
24 |
25 | 26 | 27 | 28 | 29 | 30 |
31 |
32 | 33 |
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 | --------------------------------------------------------------------------------