├── logo.png ├── newb.png ├── .gitattributes ├── [INSTALL] └── itemimages │ └── customizableplate.png ├── src ├── open │ └── server │ │ └── ox_exclusive.lua ├── shared │ ├── config.lua │ └── init.lua ├── server │ └── main.lua └── client │ └── main.lua ├── fxmanifest.lua ├── locales ├── zh-cn.json ├── zh-hk.json ├── zh-tw.json ├── zh.json ├── ja.json ├── ko.json ├── th.json ├── en.json ├── hr.json ├── tr.json ├── cs.json ├── ar.json ├── no.json ├── fi.json ├── pl.json ├── hi.json ├── hu.json ├── nl.json ├── ru.json ├── it.json ├── da.json ├── pt.json ├── ro.json ├── af.json ├── es.json ├── el.json ├── de.json ├── fr.json └── sv.json └── README.md /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrNewb/MrNewbCustomPlates/HEAD/logo.png -------------------------------------------------------------------------------- /newb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrNewb/MrNewbCustomPlates/HEAD/newb.png -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /[INSTALL]/itemimages/customizableplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrNewb/MrNewbCustomPlates/HEAD/[INSTALL]/itemimages/customizableplate.png -------------------------------------------------------------------------------- /src/open/server/ox_exclusive.lua: -------------------------------------------------------------------------------- 1 | if not Config.EnableOxExclusive then return end 2 | if GetResourceState('ox_inventory') ~= 'started' then return end 3 | 4 | local hookId = exports.ox_inventory:registerHook('swapItems', function(payload) 5 | if payload.fromType == "player" and payload.toType == "player" then 6 | return false 7 | else 8 | return true 9 | end 10 | end, { 11 | itemFilter = { 12 | [Config.PlateItemName] = true, 13 | }, 14 | }) -------------------------------------------------------------------------------- /fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'cerulean' 2 | game 'gta5' 3 | lua54 'yes' 4 | name "MrNewbCustomPlatesV2" 5 | author "MrNewb" 6 | version "2.1.1" 7 | description "Custom Plates for FiveM with support for multiple frameworks and community bridge." 8 | 9 | shared_scripts { 10 | 'src/shared/config.lua', 11 | 'src/shared/init.lua', 12 | } 13 | 14 | client_scripts { 15 | 'src/client/*.lua', 16 | } 17 | 18 | server_scripts { 19 | '@oxmysql/lib/MySQL.lua', 20 | 'src/server/*.lua', 21 | } 22 | 23 | files { 24 | 'locales/*.json', 25 | } 26 | 27 | dependencies { 28 | '/server:6116', 29 | '/onesync', 30 | 'oxmysql', 31 | 'community_bridge', 32 | } 33 | 34 | escrow_ignore { 35 | 'src/**/*.lua', 36 | } -------------------------------------------------------------------------------- /locales/zh-cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "车牌定制", 4 | "Submit": "提交", 5 | "Description": "请输入您想要的车牌文字" 6 | }, 7 | "Checks": { 8 | "NoInput": "未提交车牌文字", 9 | "NotLongEnough": "车牌文字不够长", 10 | "TooLong": "车牌文字太长", 11 | "MustBeNetworked": "车辆必须联网", 12 | "NoVehicle": "没有足够近的车辆", 13 | "LetterNumber": "必须只能是字母或数字", 14 | "PlateTaken": "已存在使用此车牌的车辆", 15 | "NotVehicleOwner": "您不拥有车牌为 %s 的车辆", 16 | "BadWord": "您不能使用不当词汇", 17 | "InsideVehicle": "您必须在车辆外进行此操作" 18 | }, 19 | "Success": { 20 | "PlateSet": "车辆车牌已从 %s 更新为 %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "设置车牌中" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/zh-hk.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "車牌客製化", 4 | "Submit": "提交", 5 | "Description": "請輸入您想要的車牌文字" 6 | }, 7 | "Checks": { 8 | "NoInput": "未提交車牌文字", 9 | "NotLongEnough": "車牌文字不夠長", 10 | "TooLong": "車牌文字太長", 11 | "MustBeNetworked": "車輛必須聯網", 12 | "NoVehicle": "沒有足夠近的車輛", 13 | "LetterNumber": "必須只能是字母或數字", 14 | "PlateTaken": "已存在使用此車牌的車輛", 15 | "NotVehicleOwner": "您不擁有車牌為 %s 的車輛", 16 | "BadWord": "您不能使用不當詞彙", 17 | "InsideVehicle": "您必須在車輛外進行此操作" 18 | }, 19 | "Success": { 20 | "PlateSet": "車輛車牌已從 %s 更新為 %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "設置車牌中" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/zh-tw.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "車牌客製化", 4 | "Submit": "提交", 5 | "Description": "請輸入您想要的車牌文字" 6 | }, 7 | "Checks": { 8 | "NoInput": "未提交車牌文字", 9 | "NotLongEnough": "車牌文字不夠長", 10 | "TooLong": "車牌文字太長", 11 | "MustBeNetworked": "車輛必須聯網", 12 | "NoVehicle": "沒有足夠近的車輛", 13 | "LetterNumber": "必須只能是字母或數字", 14 | "PlateTaken": "已存在使用此車牌的車輛", 15 | "NotVehicleOwner": "您不擁有車牌為 %s 的車輛", 16 | "BadWord": "您不能使用不當詞彙", 17 | "InsideVehicle": "您必須在車輛外進行此操作" 18 | }, 19 | "Success": { 20 | "PlateSet": "車輛車牌已從 %s 更新為 %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "設置車牌中" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/zh.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "车牌定制", 4 | "Submit": "提交", 5 | "Description": "请输入您想要的车牌文字" 6 | }, 7 | "Checks": { 8 | "NoInput": "未提交车牌文字", 9 | "NotLongEnough": "车牌文字不够长", 10 | "TooLong": "车牌文字太长", 11 | "MustBeNetworked": "车辆必须联网", 12 | "NoVehicle": "没有足够近的车辆", 13 | "LetterNumber": "必须只能是字母或数字", 14 | "PlateTaken": "已存在使用此车牌的车辆", 15 | "NotVehicleOwner": "您不拥有车牌为 %s 的车辆", 16 | "BadWord": "您不能使用不当词汇", 17 | "InsideVehicle": "您必须在车辆外进行此操作" 18 | }, 19 | "Success": { 20 | "PlateSet": "车辆车牌已从 %s 更新为 %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "设置车牌中" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "プレートカスタマイズ", 4 | "Submit": "送信", 5 | "Description": "希望するプレートテキストを入力してください" 6 | }, 7 | "Checks": { 8 | "NoInput": "プレートテキストが送信されていません", 9 | "NotLongEnough": "プレートテキストが短すぎます", 10 | "TooLong": "プレートテキストが長すぎます", 11 | "MustBeNetworked": "車両はネットワーク化されている必要があります", 12 | "NoVehicle": "十分近くに車両がありません", 13 | "LetterNumber": "文字または数字のみである必要があります", 14 | "PlateTaken": "このプレートの車両は既に存在します", 15 | "NotVehicleOwner": "プレート %s の車両を所有していません", 16 | "BadWord": "不適切な言葉は使用できません", 17 | "InsideVehicle": "車両の外で行う必要があります" 18 | }, 19 | "Success": { 20 | "PlateSet": "車両プレートが %s から %s に更新されました" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "プレート設定中" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "번호판 커스터마이징", 4 | "Submit": "제출", 5 | "Description": "원하는 번호판 텍스트를 입력하세요" 6 | }, 7 | "Checks": { 8 | "NoInput": "번호판 텍스트가 제출되지 않았습니다", 9 | "NotLongEnough": "번호판 텍스트가 충분히 길지 않습니다", 10 | "TooLong": "번호판 텍스트가 너무 깁니다", 11 | "MustBeNetworked": "차량이 네트워크화되어 있어야 합니다", 12 | "NoVehicle": "충분히 가까운 차량이 없습니다", 13 | "LetterNumber": "문자 또는 숫자만 가능합니다", 14 | "PlateTaken": "이 번호판을 가진 차량이 이미 존재합니다", 15 | "NotVehicleOwner": "번호판 %s인 차량을 소유하고 있지 않습니다", 16 | "BadWord": "부적절한 단어를 사용할 수 없습니다", 17 | "InsideVehicle": "차량 밖에서 해야 합니다" 18 | }, 19 | "Success": { 20 | "PlateSet": "차량 번호판이 %s에서 %s로 업데이트되었습니다" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "번호판 설정 중" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/shared/config.lua: -------------------------------------------------------------------------------- 1 | -- ___ ___ _ _ _ _____ _ _ 2 | -- | \/ | | \ | | | | / ___| (_) | | 3 | -- | . . | _ __ | \| | ___ __ __| |__ \ `--. ___ _ __ _ _ __ | |_ ___ 4 | -- | |\/| || '__|| . ` | / _ \\ \ /\ / /| '_ \ `--. \ / __|| '__|| || '_ \ | __|/ __| 5 | -- | | | || | | |\ || __/ \ V V / | |_) |/\__/ /| (__ | | | || |_) || |_ \__ \ 6 | -- \_| |_/|_| \_| \_/ \___| \_/\_/ |_.__/ \____/ \___||_| |_|| .__/ \__||___/ 7 | -- | | 8 | -- |_| 9 | -- Need support? Join our Discord server for help: https://discord.gg/mrnewbscripts 10 | Config = {} 11 | 12 | Config.PlateItemName = "customizableplate" 13 | 14 | Config.EnableOxExclusive = false 15 | 16 | Config.ProgressBarEnabled = true 17 | 18 | Config.FilteredWords = { "badword", "fuck", "asshole", } 19 | 20 | Config.Settings = { 21 | MinCharacters = 1, 22 | MaxCharacters = 8, 23 | } -------------------------------------------------------------------------------- /locales/th.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "การปรับแต่งป้ายทะเบียน", 4 | "Submit": "ส่ง", 5 | "Description": "กรุณากรอกข้อความป้ายทะเบียนที่คุณต้องการ" 6 | }, 7 | "Checks": { 8 | "NoInput": "ไม่ได้ส่งข้อความป้ายทะเบียน", 9 | "NotLongEnough": "ข้อความป้ายทะเบียนไม่ยาวพอ", 10 | "TooLong": "ข้อความป้ายทะเบียนยาวเกินไป", 11 | "MustBeNetworked": "รถต้องเชื่อมต่อเครือข่าย", 12 | "NoVehicle": "ไม่มีรถใกล้พอ", 13 | "LetterNumber": "ต้องเป็นตัวอักษรหรือตัวเลขเท่านั้น", 14 | "PlateTaken": "มีรถที่มีป้ายทะเบียนนี้อยู่แล้ว", 15 | "NotVehicleOwner": "คุณไม่ได้เป็นเจ้าของรถป้ายทะเบียน %s", 16 | "BadWord": "คุณไม่สามารถใช้คำไม่เหมาะสมได้", 17 | "InsideVehicle": "คุณต้องทำสิ่งนี้นอกรถ" 18 | }, 19 | "Success": { 20 | "PlateSet": "ป้ายทะเบียนรถได้รับการอัปเดตจาก %s เป็น %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "กำลังตั้งค่าป้ายทะเบียน" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Plate Customization", 4 | "Submit": "Submit", 5 | "Description": "Please enter the plate text you want" 6 | }, 7 | "Checks": { 8 | "NoInput": "No plate text submitted", 9 | "NotLongEnough": "Plate text is not long enough", 10 | "TooLong": "Plate text is too long", 11 | "MustBeNetworked": "The vehicle must be networked", 12 | "NoVehicle": "No vehicle close enough", 13 | "LetterNumber": "Must be letters or numbers only", 14 | "PlateTaken": "A vehicle with this plate already exists", 15 | "NotVehicleOwner": "You do not own the vehicle with plate %s", 16 | "BadWord": "You cannot use inappropriate words", 17 | "InsideVehicle": "You must do this outside the vehicle" 18 | }, 19 | "Success": { 20 | "PlateSet": "Vehicle plate updated from %s to %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Setting Plate" 24 | } 25 | } -------------------------------------------------------------------------------- /locales/hr.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Prilagodba tablice", 4 | "Submit": "Pošalji", 5 | "Description": "Unesite tekst tablice koji želite" 6 | }, 7 | "Checks": { 8 | "NoInput": "Nije unesen tekst tablice", 9 | "NotLongEnough": "Tekst tablice nije dovoljno dug", 10 | "TooLong": "Tekst tablice je predug", 11 | "MustBeNetworked": "Vozilo mora biti umreženo", 12 | "NoVehicle": "Nema vozila dovoljno blizu", 13 | "LetterNumber": "Dozvoljena su samo slova ili brojevi", 14 | "PlateTaken": "Vozilo s ovom tablicom već postoji", 15 | "NotVehicleOwner": "Niste vlasnik vozila s tablicom %s", 16 | "BadWord": "Ne možete koristiti neprikladne riječi", 17 | "InsideVehicle": "Morate biti izvan vozila" 18 | }, 19 | "Success": { 20 | "PlateSet": "Tablica vozila promijenjena s %s na %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Postavljanje tablice" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Plaka Özelleştirme", 4 | "Submit": "Gönder", 5 | "Description": "Lütfen istediğiniz plaka metnini girin" 6 | }, 7 | "Checks": { 8 | "NoInput": "Plaka metni gönderilmedi", 9 | "NotLongEnough": "Plaka metni yeterince uzun değil", 10 | "TooLong": "Plaka metni çok uzun", 11 | "MustBeNetworked": "Araç ağa bağlı olmalı", 12 | "NoVehicle": "Yeterince yakın araç yok", 13 | "LetterNumber": "Sadece harf veya rakam olmalı", 14 | "PlateTaken": "Bu plakaya sahip bir araç zaten mevcut", 15 | "NotVehicleOwner": "%s plakasına sahip aracın sahibi değilsiniz", 16 | "BadWord": "Uygunsuz kelimeler kullanamazsınız", 17 | "InsideVehicle": "Bunu araç dışında yapmalısınız" 18 | }, 19 | "Success": { 20 | "PlateSet": "Araç plakası %s'den %s'e güncellendi" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Plaka Ayarlanıyor" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Přizpůsobení Značky", 4 | "Submit": "Odeslat", 5 | "Description": "Prosím zadejte text značky, který chcete" 6 | }, 7 | "Checks": { 8 | "NoInput": "Nebyl odeslán text značky", 9 | "NotLongEnough": "Text značky není dostatečně dlouhý", 10 | "TooLong": "Text značky je příliš dlouhý", 11 | "MustBeNetworked": "Vozidlo musí být v síti", 12 | "NoVehicle": "Žádné vozidlo dostatečně blízko", 13 | "LetterNumber": "Musí být pouze písmena nebo čísla", 14 | "PlateTaken": "Vozidlo s touto značkou již existuje", 15 | "NotVehicleOwner": "Nevlastníte vozidlo se značkou %s", 16 | "BadWord": "Nemůžete používat nevhodná slova", 17 | "InsideVehicle": "Musíte to udělat mimo vozidlo" 18 | }, 19 | "Success": { 20 | "PlateSet": "Značka vozidla aktualizována z %s na %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Nastavování Značky" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "تخصيص لوحة الأرقام", 4 | "Submit": "إرسال", 5 | "Description": "يرجى إدخال نص لوحة الأرقام التي تريدها" 6 | }, 7 | "Checks": { 8 | "NoInput": "لم يتم إرسال نص لوحة الأرقام", 9 | "NotLongEnough": "نص لوحة الأرقام ليس طويلاً بما فيه الكفاية", 10 | "TooLong": "نص لوحة الأرقام طويل جداً", 11 | "MustBeNetworked": "يجب أن تكون المركبة متصلة بالشبكة", 12 | "NoVehicle": "لا توجد مركبة قريبة بما فيه الكفاية", 13 | "LetterNumber": "يجب أن تكون أحرف أو أرقام فقط", 14 | "PlateTaken": "مركبة بهذه اللوحة موجودة بالفعل", 15 | "NotVehicleOwner": "أنت لا تملك المركبة ذات اللوحة %s", 16 | "BadWord": "لا يمكنك استخدام كلمات غير مناسبة", 17 | "InsideVehicle": "يجب أن تفعل ذلك خارج المركبة" 18 | }, 19 | "Success": { 20 | "PlateSet": "تم تحديث لوحة أرقام المركبة من %s إلى %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "تعيين لوحة الأرقام" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/no.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Skiltpersonalisering", 4 | "Submit": "Send Inn", 5 | "Description": "Vennligst skriv inn skiltteksten du ønsker" 6 | }, 7 | "Checks": { 8 | "NoInput": "Ingen skilttekst sendt inn", 9 | "NotLongEnough": "Skiltteksten er ikke lang nok", 10 | "TooLong": "Skiltteksten er for lang", 11 | "MustBeNetworked": "Kjøretøyet må være nettverket", 12 | "NoVehicle": "Ingen kjøretøy nært nok", 13 | "LetterNumber": "Må bare være bokstaver eller tall", 14 | "PlateTaken": "Et kjøretøy med dette skiltet eksisterer allerede", 15 | "NotVehicleOwner": "Du eier ikke kjøretøyet med skilt %s", 16 | "BadWord": "Du kan ikke bruke upassende ord", 17 | "InsideVehicle": "Du må gjøre dette utenfor kjøretøyet" 18 | }, 19 | "Success": { 20 | "PlateSet": "Kjøretøyskilt oppdatert fra %s til %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Setter Skilt" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Kilven Muokkaus", 4 | "Submit": "Lähetä", 5 | "Description": "Syötä haluamasi kilven teksti" 6 | }, 7 | "Checks": { 8 | "NoInput": "Kilven tekstiä ei lähetetty", 9 | "NotLongEnough": "Kilven teksti ei ole tarpeeksi pitkä", 10 | "TooLong": "Kilven teksti on liian pitkä", 11 | "MustBeNetworked": "Ajoneuvon täytyy olla verkossa", 12 | "NoVehicle": "Ei ajoneuvoa tarpeeksi lähellä", 13 | "LetterNumber": "Täytyy olla vain kirjaimia tai numeroita", 14 | "PlateTaken": "Ajoneuvo tällä kilvellä on jo olemassa", 15 | "NotVehicleOwner": "Et omista ajoneuvoa kilvellä %s", 16 | "BadWord": "Et voi käyttää sopimatonta kieltä", 17 | "InsideVehicle": "Sinun täytyy tehdä tämä ajoneuvon ulkopuolella" 18 | }, 19 | "Success": { 20 | "PlateSet": "Ajoneuvon kilpi päivitetty %s:sta %s:aan" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Asetetaan Kilpeä" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Dostosowanie Tablicy", 4 | "Submit": "Wyślij", 5 | "Description": "Proszę wprowadzić tekst tablicy, który chcesz" 6 | }, 7 | "Checks": { 8 | "NoInput": "Nie przesłano tekstu tablicy", 9 | "NotLongEnough": "Tekst tablicy nie jest wystarczająco długi", 10 | "TooLong": "Tekst tablicy jest za długi", 11 | "MustBeNetworked": "Pojazd musi być w sieci", 12 | "NoVehicle": "Brak pojazdu wystarczająco blisko", 13 | "LetterNumber": "Musi być tylko literami lub cyframi", 14 | "PlateTaken": "Pojazd z tą tablicą już istnieje", 15 | "NotVehicleOwner": "Nie posiadasz pojazdu z tablicą %s", 16 | "BadWord": "Nie możesz używać nieodpowiednich słów", 17 | "InsideVehicle": "Musisz to zrobić poza pojazdem" 18 | }, 19 | "Success": { 20 | "PlateSet": "Tablica pojazdu zaktualizowana z %s na %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Ustawianie Tablicy" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/hi.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "प्लेट कस्टमाइज़ेशन", 4 | "Submit": "जमा करें", 5 | "Description": "कृपया वह प्लेट टेक्स्ट डालें जो आप चाहते हैं" 6 | }, 7 | "Checks": { 8 | "NoInput": "कोई प्लेट टेक्स्ट जमा नहीं किया गया", 9 | "NotLongEnough": "प्लेट टेक्स्ट पर्याप्त लंबा नहीं है", 10 | "TooLong": "प्लेट टेक्स्ट बहुत लंबा है", 11 | "MustBeNetworked": "वाहन नेटवर्क से जुड़ा होना चाहिए", 12 | "NoVehicle": "पर्याप्त पास कोई वाहन नहीं", 13 | "LetterNumber": "केवल अक्षर या संख्या होनी चाहिए", 14 | "PlateTaken": "इस प्लेट वाला वाहन पहले से मौजूद है", 15 | "NotVehicleOwner": "आप प्लेट %s वाले वाहन के मालिक नहीं हैं", 16 | "BadWord": "आप अनुचित शब्दों का उपयोग नहीं कर सकते", 17 | "InsideVehicle": "आपको यह वाहन के बाहर करना होगा" 18 | }, 19 | "Success": { 20 | "PlateSet": "वाहन प्लेट %s से %s में अपडेट किया गया" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "प्लेट सेट कर रहे हैं" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Rendszám Testreszabás", 4 | "Submit": "Elküld", 5 | "Description": "Kérjük, adja meg a kívánt rendszám szöveget" 6 | }, 7 | "Checks": { 8 | "NoInput": "Nem lett rendszám szöveg elküldve", 9 | "NotLongEnough": "A rendszám szöveg nem elég hosszú", 10 | "TooLong": "A rendszám szöveg túl hosszú", 11 | "MustBeNetworked": "A járműnek hálózatban kell lennie", 12 | "NoVehicle": "Nincs elég közel jármű", 13 | "LetterNumber": "Csak betűk vagy számok lehetnek", 14 | "PlateTaken": "Egy jármű ezzel a rendszámmal már létezik", 15 | "NotVehicleOwner": "Nem birtokolja a %s rendszámú járművet", 16 | "BadWord": "Nem használhat helytelen szavakat", 17 | "InsideVehicle": "Ezt a járművön kívül kell megtennie" 18 | }, 19 | "Success": { 20 | "PlateSet": "Jármű rendszám frissítve %s-ról %s-ra" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Rendszám Beállítása" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Kenteken Aanpassing", 4 | "Submit": "Verzenden", 5 | "Description": "Voer de kentekentekst in die je wilt" 6 | }, 7 | "Checks": { 8 | "NoInput": "Geen kentekentekst ingediend", 9 | "NotLongEnough": "Kentekentekst is niet lang genoeg", 10 | "TooLong": "Kentekentekst is te lang", 11 | "MustBeNetworked": "Het voertuig moet netwerk zijn", 12 | "NoVehicle": "Geen voertuig dichtbij genoeg", 13 | "LetterNumber": "Moet alleen letters of cijfers zijn", 14 | "PlateTaken": "Een voertuig met dit kenteken bestaat al", 15 | "NotVehicleOwner": "Je bezit het voertuig met kenteken %s niet", 16 | "BadWord": "Je kunt geen ongepaste woorden gebruiken", 17 | "InsideVehicle": "Je moet dit buiten het voertuig doen" 18 | }, 19 | "Success": { 20 | "PlateSet": "Voertuigkenteken bijgewerkt van %s naar %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Kenteken Instellen" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Настройка Номера", 4 | "Submit": "Отправить", 5 | "Description": "Пожалуйста, введите текст номера, который вы хотите" 6 | }, 7 | "Checks": { 8 | "NoInput": "Текст номера не отправлен", 9 | "NotLongEnough": "Текст номера недостаточно длинный", 10 | "TooLong": "Текст номера слишком длинный", 11 | "MustBeNetworked": "Транспорт должен быть в сети", 12 | "NoVehicle": "Нет транспорта достаточно близко", 13 | "LetterNumber": "Должны быть только буквы или цифры", 14 | "PlateTaken": "Транспорт с таким номером уже существует", 15 | "NotVehicleOwner": "Вы не владеете транспортом с номером %s", 16 | "BadWord": "Вы не можете использовать неподходящие слова", 17 | "InsideVehicle": "Вы должны делать это вне транспорта" 18 | }, 19 | "Success": { 20 | "PlateSet": "Номер транспорта обновлен с %s на %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Установка Номера" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Personalizzazione Targa", 4 | "Submit": "Invia", 5 | "Description": "Per favore inserisci il testo della targa che vuoi" 6 | }, 7 | "Checks": { 8 | "NoInput": "Nessun testo targa inviato", 9 | "NotLongEnough": "Il testo della targa non è abbastanza lungo", 10 | "TooLong": "Il testo della targa è troppo lungo", 11 | "MustBeNetworked": "Il veicolo deve essere in rete", 12 | "NoVehicle": "Nessun veicolo abbastanza vicino", 13 | "LetterNumber": "Deve essere solo lettere o numeri", 14 | "PlateTaken": "Un veicolo con questa targa esiste già", 15 | "NotVehicleOwner": "Non possiedi il veicolo con targa %s", 16 | "BadWord": "Non puoi usare parole inappropriate", 17 | "InsideVehicle": "Devi farlo fuori dal veicolo" 18 | }, 19 | "Success": { 20 | "PlateSet": "Targa del veicolo aggiornata da %s a %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Impostazione Targa" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/da.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Nummerplade Tilpasning", 4 | "Submit": "Indsend", 5 | "Description": "Indtast venligst den nummerpladetekst du ønsker" 6 | }, 7 | "Checks": { 8 | "NoInput": "Ingen nummerpladetekst indsendt", 9 | "NotLongEnough": "Nummerpladetekst er ikke lang nok", 10 | "TooLong": "Nummerpladetekst er for lang", 11 | "MustBeNetworked": "Køretøjet skal være netværket", 12 | "NoVehicle": "Intet køretøj tæt nok på", 13 | "LetterNumber": "Skal kun være bogstaver eller tal", 14 | "PlateTaken": "Et køretøj med denne nummerplade eksisterer allerede", 15 | "NotVehicleOwner": "Du ejer ikke køretøjet med nummerplade %s", 16 | "BadWord": "Du kan ikke bruge upassende ord", 17 | "InsideVehicle": "Du skal gøre dette uden for køretøjet" 18 | }, 19 | "Success": { 20 | "PlateSet": "Køretøjsnummerplade opdateret fra %s til %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Indstiller Nummerplade" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Personalização de Placa", 4 | "Submit": "Enviar", 5 | "Description": "Por favor digite o texto da placa que você quer" 6 | }, 7 | "Checks": { 8 | "NoInput": "Nenhum texto de placa enviado", 9 | "NotLongEnough": "O texto da placa não é longo o suficiente", 10 | "TooLong": "O texto da placa é muito longo", 11 | "MustBeNetworked": "O veículo deve estar em rede", 12 | "NoVehicle": "Nenhum veículo próximo o suficiente", 13 | "LetterNumber": "Deve ser apenas letras ou números", 14 | "PlateTaken": "Um veículo com esta placa já existe", 15 | "NotVehicleOwner": "Você não possui o veículo com placa %s", 16 | "BadWord": "Você não pode usar palavras inapropriadas", 17 | "InsideVehicle": "Você deve fazer isso fora do veículo" 18 | }, 19 | "Success": { 20 | "PlateSet": "Placa do veículo atualizada de %s para %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Definindo Placa" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/ro.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Personalizare Placă", 4 | "Submit": "Trimite", 5 | "Description": "Te rog introdu textul plăcii pe care îl dorești" 6 | }, 7 | "Checks": { 8 | "NoInput": "Nu a fost trimis text pentru placă", 9 | "NotLongEnough": "Textul plăcii nu este suficient de lung", 10 | "TooLong": "Textul plăcii este prea lung", 11 | "MustBeNetworked": "Vehiculul trebuie să fie în rețea", 12 | "NoVehicle": "Niciun vehicul suficient de aproape", 13 | "LetterNumber": "Trebuie să fie doar litere sau cifre", 14 | "PlateTaken": "Un vehicul cu această placă există deja", 15 | "NotVehicleOwner": "Nu dețineți vehiculul cu placa %s", 16 | "BadWord": "Nu puteți folosi cuvinte nepotrivite", 17 | "InsideVehicle": "Trebuie să faceți asta în afara vehiculului" 18 | }, 19 | "Success": { 20 | "PlateSet": "Placa vehiculului actualizată de la %s la %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Setare Placă" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/af.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Nommerbord Aanpassing", 4 | "Submit": "Stuur", 5 | "Description": "Voer asseblief die nommerbord teks in wat jy wil hê" 6 | }, 7 | "Checks": { 8 | "NoInput": "Geen nommerbord teks ingestuur nie", 9 | "NotLongEnough": "Nommerbord teks is nie lank genoeg nie", 10 | "TooLong": "Nommerbord teks is te lank", 11 | "MustBeNetworked": "Die voertuig moet genewerk wees", 12 | "NoVehicle": "Geen voertuig naby genoeg nie", 13 | "LetterNumber": "Moet net letters of nommers wees", 14 | "PlateTaken": "'n Voertuig met hierdie nommerbord bestaan reeds", 15 | "NotVehicleOwner": "Jy besit nie die voertuig met nommerbord %s nie", 16 | "BadWord": "Jy kan nie ongepaste woorde gebruik nie", 17 | "InsideVehicle": "Jy moet dit buite die voertuig doen" 18 | }, 19 | "Success": { 20 | "PlateSet": "Voertuig nommerbord opgedateer van %s na %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Stel Nommerbord" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Personalización de Placa", 4 | "Submit": "Enviar", 5 | "Description": "Por favor ingrese el texto de placa que desea" 6 | }, 7 | "Checks": { 8 | "NoInput": "No se envió texto de placa", 9 | "NotLongEnough": "El texto de la placa no es lo suficientemente largo", 10 | "TooLong": "El texto de la placa es demasiado largo", 11 | "MustBeNetworked": "El vehículo debe estar en red", 12 | "NoVehicle": "No hay vehículo lo suficientemente cerca", 13 | "LetterNumber": "Debe ser solo letras o números", 14 | "PlateTaken": "Ya existe un vehículo con esta placa", 15 | "NotVehicleOwner": "No eres dueño del vehículo con placa %s", 16 | "BadWord": "No puedes usar palabras inapropiadas", 17 | "InsideVehicle": "Debes hacer esto fuera del vehículo" 18 | }, 19 | "Success": { 20 | "PlateSet": "Placa del vehículo actualizada de %s a %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Configurando Placa" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/el.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Προσαρμογή Πινακίδας", 4 | "Submit": "Υποβολή", 5 | "Description": "Παρακαλώ εισάγετε το κείμενο πινακίδας που θέλετε" 6 | }, 7 | "Checks": { 8 | "NoInput": "Δεν υποβλήθηκε κείμενο πινακίδας", 9 | "NotLongEnough": "Το κείμενο της πινακίδας δεν είναι αρκετά μεγάλο", 10 | "TooLong": "Το κείμενο της πινακίδας είναι πολύ μεγάλο", 11 | "MustBeNetworked": "Το όχημα πρέπει να είναι δικτυωμένο", 12 | "NoVehicle": "Κανένα όχημα αρκετά κοντά", 13 | "LetterNumber": "Πρέπει να είναι μόνο γράμματα ή αριθμοί", 14 | "PlateTaken": "Ένα όχημα με αυτή την πινακίδα υπάρχει ήδη", 15 | "NotVehicleOwner": "Δεν κατέχετε το όχημα με πινακίδα %s", 16 | "BadWord": "Δεν μπορείτε να χρησιμοποιήσετε ακατάλληλες λέξεις", 17 | "InsideVehicle": "Πρέπει να το κάνετε έξω από το όχημα" 18 | }, 19 | "Success": { 20 | "PlateSet": "Η πινακίδα του οχήματος ενημερώθηκε από %s σε %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Ρύθμιση Πινακίδας" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Kennzeichen Anpassung", 4 | "Submit": "Senden", 5 | "Description": "Bitte geben Sie den gewünschten Kennzeichentext ein" 6 | }, 7 | "Checks": { 8 | "NoInput": "Kein Kennzeichentext eingereicht", 9 | "NotLongEnough": "Der Kennzeichentext ist nicht lang genug", 10 | "TooLong": "Der Kennzeichentext ist zu lang", 11 | "MustBeNetworked": "Das Fahrzeug muss vernetzt sein", 12 | "NoVehicle": "Kein Fahrzeug nah genug", 13 | "LetterNumber": "Muss nur Buchstaben oder Zahlen sein", 14 | "PlateTaken": "Ein Fahrzeug mit diesem Kennzeichen existiert bereits", 15 | "NotVehicleOwner": "Sie besitzen das Fahrzeug mit Kennzeichen %s nicht", 16 | "BadWord": "Sie können keine unangemessenen Wörter verwenden", 17 | "InsideVehicle": "Sie müssen dies außerhalb des Fahrzeugs tun" 18 | }, 19 | "Success": { 20 | "PlateSet": "Fahrzeugkennzeichen aktualisiert von %s zu %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Kennzeichen Setzen" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Personnalisation de Plaque", 4 | "Submit": "Soumettre", 5 | "Description": "Veuillez entrer le texte de plaque que vous voulez" 6 | }, 7 | "Checks": { 8 | "NoInput": "Aucun texte de plaque soumis", 9 | "NotLongEnough": "Le texte de la plaque n'est pas assez long", 10 | "TooLong": "Le texte de la plaque est trop long", 11 | "MustBeNetworked": "Le véhicule doit être en réseau", 12 | "NoVehicle": "Aucun véhicule assez proche", 13 | "LetterNumber": "Doit être uniquement des lettres ou des chiffres", 14 | "PlateTaken": "Un véhicule avec cette plaque existe déjà", 15 | "NotVehicleOwner": "Vous ne possédez pas le véhicule avec la plaque %s", 16 | "BadWord": "Vous ne pouvez pas utiliser de mots inappropriés", 17 | "InsideVehicle": "Vous devez faire ceci à l'extérieur du véhicule" 18 | }, 19 | "Success": { 20 | "PlateSet": "Plaque du véhicule mise à jour de %s à %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Configuration de la Plaque" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /locales/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "PlateCustomize": { 3 | "Title": "Registreringsskylt Anpassning", 4 | "Submit": "Skicka", 5 | "Description": "Vänligen ange den registreringsskylttext du vill ha" 6 | }, 7 | "Checks": { 8 | "NoInput": "Ingen registreringsskylttext skickad", 9 | "NotLongEnough": "Registreringsskylttext är inte tillräckligt lång", 10 | "TooLong": "Registreringsskylttext är för lång", 11 | "MustBeNetworked": "Fordonet måste vara nätverkat", 12 | "NoVehicle": "Inget fordon tillräckligt nära", 13 | "LetterNumber": "Måste bara vara bokstäver eller siffror", 14 | "PlateTaken": "Ett fordon med denna registreringsskylt existerar redan", 15 | "NotVehicleOwner": "Du äger inte fordonet med registreringsskylt %s", 16 | "BadWord": "Du kan inte använda olämpliga ord", 17 | "InsideVehicle": "Du måste göra detta utanför fordonet" 18 | }, 19 | "Success": { 20 | "PlateSet": "Fordonsregistreringsskylt uppdaterad från %s till %s" 21 | }, 22 | "Progressbar": { 23 | "ProgressText": "Ställer In Registreringsskylt" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/shared/init.lua: -------------------------------------------------------------------------------- 1 | Bridge = exports.community_bridge:Bridge() 2 | 3 | function locale(message, ...) 4 | return Bridge.Language.Locale(message, ...) 5 | end 6 | 7 | function DoDebugPrint(message) 8 | if not Config.Utility.Debug then return end 9 | return Bridge.Prints.Debug(message) 10 | end 11 | 12 | function GenerateRandomString() 13 | return Bridge.Ids.RandomLower(nil, 8) 14 | end 15 | 16 | function TrimString(plate) 17 | local stringIfy = tostring(plate) 18 | return stringIfy:match("^%s*(.-)%s*$"):upper() 19 | end 20 | 21 | function CheckLetterNumber(data, _type) 22 | if _type == "ALPHANUMERICAL" then return data:match("^%w+$") ~= nil end 23 | end 24 | 25 | function RunBadWordFilter(data) 26 | for _, blacklisted in pairs(Config.FilteredWords) do 27 | if string.find(data:lower(), blacklisted:lower()) then return false end 28 | end 29 | return data 30 | end 31 | 32 | if not IsDuplicityVersion() then 33 | NotifyPlayer = Bridge.Notify.SendNotify 34 | 35 | OpenInput = Bridge.Input.Open 36 | 37 | function GetClosestVehicle(coords, distance, includePlayerVeh) 38 | local vehicleEntity, vehicleCoords, _vehicleNetID = Bridge.Utility.GetClosestVehicle(coords, distance, includePlayerVeh) 39 | return vehicleEntity, vehicleCoords 40 | end 41 | end 42 | 43 | if not IsDuplicityVersion() then return end 44 | 45 | RemoveItem = Bridge.Inventory.RemoveItem 46 | 47 | UpdateInventoryPlate = Bridge.Inventory.UpdatePlate 48 | 49 | NotifyPlayer = Bridge.Notify.SendNotify 50 | 51 | Bridge.Framework.RegisterUsableItem(Config.PlateItemName, function(src, itemData) 52 | local data = Bridge.Callback.Trigger("MrNewbCustomPlates:Callback:SetPlate", src) 53 | if not data or not data.plate or not data.netId then return end 54 | RunPlateChecks(src, data, itemData.slot) 55 | end) 56 | 57 | AddEventHandler('onResourceStart', function(resource) 58 | if resource ~= GetCurrentResourceName() then return end 59 | Bridge.Version.AdvancedVersionChecker("MrNewb/patchnotes", resource) 60 | end) -------------------------------------------------------------------------------- /src/server/main.lua: -------------------------------------------------------------------------------- 1 | function VerifyVehicleOwnerShip(src, plate) 2 | local myVehicles = Bridge.Framework.GetOwnedVehicles(src) 3 | for _, vehicle in pairs(myVehicles) do 4 | local trimmedString = TrimString(vehicle.plate) 5 | if trimmedString == plate then return true end 6 | end 7 | return false 8 | end 9 | 10 | function UpdateFrameworkPlate(src, newplate, oldplate) 11 | local framework = Bridge.Framework.GetFrameworkName() 12 | if framework == "qbx_core" or framework == "qb-core" then 13 | local result = MySQL.query.await('SELECT * FROM player_vehicles WHERE plate = ?;', { newplate }) 14 | if result and #result > 0 and result[1].plate == newplate then return false, NotifyPlayer(src, locale("Checks.PlateTaken"), "error", 5000) end 15 | MySQL.update.await('UPDATE player_vehicles SET plate = ?, mods = REPLACE(mods, ?, ?) WHERE plate = ?', { newplate, oldplate, newplate, oldplate }) 16 | elseif framework == "es_extended" then 17 | local result = MySQL.query.await('SELECT * FROM owned_vehicles WHERE plate = ?;', { newplate }) 18 | if result and #result > 0 and result[1].plate == newplate then return false, NotifyPlayer(src, locale("Checks.PlateTaken"), "error", 5000) end 19 | MySQL.update.await('UPDATE owned_vehicles SET plate = ? WHERE plate = ?', { newplate, oldplate }) 20 | else 21 | return false, NotifyPlayer(src, "FRAMEWORK NOT SUPPORTED", "error", 5000) 22 | end 23 | return true 24 | end 25 | 26 | function RunPlateChecks(src, data, slot) 27 | local netId = data.netId 28 | local newPlate = data.plate 29 | local vehicle = NetworkGetEntityFromNetworkId(netId) 30 | local plate = GetVehicleNumberPlateText(vehicle) 31 | local trimmedString = TrimString(plate) 32 | newPlate = string.upper(newPlate) 33 | if not RunBadWordFilter(newPlate) then return end 34 | local owner = VerifyVehicleOwnerShip(src, trimmedString) 35 | if not owner then return NotifyPlayer(src, locale("Checks.NotVehicleOwner", trimmedString), "error", 5000) end 36 | if not UpdateFrameworkPlate(src, newPlate, trimmedString) then return end 37 | UpdateInventoryPlate(trimmedString, newPlate) 38 | RemoveItem(src, Config.PlateItemName, 1, slot, nil) 39 | SetVehicleNumberPlateText(vehicle, newPlate) 40 | NotifyPlayer(src, locale("Success.PlateSet", trimmedString, newPlate), "success", 5000) 41 | Wait(250) 42 | TriggerClientEvent("MrNewbCustomPlates:Client:UpdatePlate", src, newPlate, trimmedString, netId) 43 | TriggerClientEvent("MrNewbCustomPlates:Client:UpdatePlateText", -1, newPlate, netId) 44 | local vehicleState = Entity(vehicle).state 45 | vehicleState:set('plate', newPlate, true) 46 | end -------------------------------------------------------------------------------- /src/client/main.lua: -------------------------------------------------------------------------------- 1 | Bridge.Callback.Register('MrNewbCustomPlates:Callback:SetPlate', function() 2 | return GetPlayerVehicleData() 3 | end) 4 | 5 | function CreateInputMenu() 6 | local data = { 7 | { 8 | type = 'input', 9 | label = locale("PlateCustomize.Title"), 10 | description = locale("PlateCustomize.Description"), 11 | placeholder = 'MrNewb', 12 | required = true, 13 | min = Config.Settings.MinCharacters, 14 | max = Config.Settings.MaxCharacters, 15 | }, 16 | } 17 | local inputData = OpenInput(locale("PlateCustomize.Title"), data, false, locale("PlateCustomize.Submit")) 18 | return VerifyInputChecks(inputData) 19 | end 20 | 21 | function VerifyInputChecks(inputData) 22 | if not inputData or not inputData[1] then return false, NotifyPlayer(locale("Checks.NoInput"), "error", 5000) end 23 | 24 | local renamedData = inputData[1] 25 | local length = string.len(renamedData) 26 | if length < Config.Settings.MinCharacters or length > Config.Settings.MaxCharacters then 27 | local message = length < Config.Settings.MinCharacters and "Checks.NotLongEnough" or "Checks.TooLong" 28 | return false, NotifyPlayer(locale(message), "error", 5000) 29 | end 30 | 31 | if not CheckLetterNumber(renamedData, "ALPHANUMERICAL") then return false, NotifyPlayer(locale("Checks.LetterNumber"), "error", 5000) end 32 | if not RunBadWordFilter(renamedData) then return false, NotifyPlayer(locale("Checks.BadWord"), "error", 5000) end 33 | return renamedData 34 | end 35 | 36 | function BeginProgressBar() 37 | if not Config.ProgressBarEnabled then return end 38 | local success = Bridge.ProgressBar.Open({ 39 | duration = 5000, 40 | label = locale("Progressbar.ProgressText"), 41 | disable = { move = true, combat = true }, 42 | anim = { dict = "amb@prop_human_parking_meter@female@base", clip = "base_female", }, 43 | flag = 49, 44 | canCancel = true, 45 | }) 46 | return success 47 | end 48 | 49 | function GetPlayerVehicleData() 50 | local ped = PlayerPedId() 51 | local inVehicle = IsPedSittingInAnyVehicle(ped) 52 | if inVehicle then return false, NotifyPlayer(locale("Checks.InsideVehicle"), "error", 5000) end 53 | local vehicle, vehCoords = GetClosestVehicle(GetEntityCoords(ped), 10, false) 54 | if not vehicle or not vehCoords then return false, NotifyPlayer(locale("Checks.NoVehicle"), "error", 5000) end 55 | if not NetworkGetEntityIsNetworked(vehicle) then return false, NotifyPlayer(locale("Checks.MustBeNetworked"), "error", 5000) end 56 | TaskTurnPedToFaceCoord(ped, vehCoords.x, vehCoords.y, vehCoords.z, 1.0) 57 | Wait(500) 58 | BeginProgressBar() 59 | ClearPedTasks(ped) 60 | local inputStatus = CreateInputMenu() 61 | if not inputStatus then return false end 62 | 63 | return {netId = NetworkGetNetworkIdFromEntity(vehicle), plate = inputStatus } 64 | end 65 | 66 | RegisterNetEvent("MrNewbCustomPlates:Client:UpdatePlate", function(newplate, oldplate, netid) 67 | if not NetworkDoesNetworkIdExist(netid) then return end 68 | local vehicle = NetworkGetEntityFromNetworkId(netid) 69 | SetVehicleNumberPlateText(vehicle, newplate) 70 | Bridge.VehicleKey.RemoveKeys(vehicle, oldplate) 71 | Wait(500) 72 | Bridge.VehicleKey.GiveKeys(vehicle, newplate) 73 | end) 74 | 75 | RegisterNetEvent("MrNewbCustomPlates:Client:UpdatePlateText", function(newplate, netid) 76 | if not NetworkDoesNetworkIdExist(netid) then return end 77 | local vehicle = NetworkGetEntityFromNetworkId(netid) 78 | if not DoesEntityExist(vehicle) then return end 79 | SetVehicleNumberPlateText(vehicle, newplate) 80 | end) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![MrNewbsCustomPlate](https://i.imgur.com/UPyWXAs.png)](https://i.imgur.com/UPyWXAs.png) 2 | 3 | # MrNewbsCustomPlates 4 | docs available at https://mrnewbs-scrips.gitbook.io/guide 5 | 6 | [![GitHub](https://img.shields.io/badge/GitHub-Repository-181717?style=for-the-badge&logo=github)](https://github.com/mrnewb) 7 | [![Discord](https://img.shields.io/badge/Discord-Community-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/mrnewbscripts) 8 | [![FiveM](https://img.shields.io/badge/FiveM-Resource-F40552?style=for-the-badge&logo=fivem)](https://fivem.net/) 9 | [![Views](https://img.shields.io/badge/Views-1.2K+-brightgreen?style=for-the-badge&logo=eye)](https://github.com/mrnewb) 10 | [![License](https://img.shields.io/badge/License-Custom-blue?style=for-the-badge)](#license) 11 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/R5R76BIM9) 12 | 13 | > **A comprehensive custom license plate system for FiveM servers with extensive inventory bridge support** 14 | 15 | ## 📋 Features 16 | 17 | - 🎨 **Custom License Plates**: Create and manage personalized license plates 18 | - 🔗 **Multi-Inventory Support**: Compatible with various inventory systems through Community Bridge 19 | - ⚡ **Performance Optimized**: Lightweight and efficient resource design 20 | - 🛠️ **Highly Configurable**: Extensive customization options 21 | - 🔄 **Regular Updates**: Continuous improvements and feature additions 22 | 23 | ## 📦 Dependencies 24 | 25 | ### Required Dependencies 26 | - **[Community Bridge](https://github.com/TheOrderFivem/community_bridge/tree/main)** - Essential for inventory system compatibility 27 | - **[ox_lib](https://github.com/overextended/ox_lib)** - Modern library for FiveM resources 28 | - **FiveM Server** - Latest recommended version 29 | 30 | ### Supported Inventory Systems (via Community Bridge) 31 | - QB-Core Inventory 32 | - ESX Inventory 33 | - Origin Inventory 34 | - OX Inventory 35 | - And many more through the bridge system 36 | 37 | ## 🚀 Installation Guide 38 | 39 | 1. **Download Community Bridge** from the [official repository](https://github.com/The-Order-Of-The-Sacred-Framework/community_bridge) 40 | 2. **Install Community Bridge** following their documentation 41 | 3. **Download MrNewbsCustomPlates** and place it in your resources folder 42 | 4. **Add to server.cfg**: 43 | ```cfg 44 | ensure community_bridge 45 | ensure MrNewbCustomPlates 46 | ``` 47 | 5. **Restart your server** 48 | 49 | 📚 **Detailed Documentation**: Available at [https://mrnewbs-scrips.gitbook.io/guide](https://mrnewbs-scrips.gitbook.io/guide) 50 | 51 | ## 🎯 Resource Support 52 | 53 | The Community Bridge integration provides unprecedented compatibility across multiple inventory systems. This means: 54 | 55 | - ✅ **Universal Compatibility**: Works with virtually any supported inventory system 56 | - ✅ **Origin Integration**: Full support for Origin and other popular frameworks 57 | - ✅ **Future-Proof**: Automatic compatibility with new inventory systems added to the bridge 58 | - ✅ **Seamless Migration**: Easy switching between different inventory systems 59 | 60 | ## 🙏 Acknowledgments 61 | 62 | Special thanks to **Decay Studios** for creating the stunning inventory icons used in this release. 63 | Join their community: [Decay Studios Discord](https://discord.gg/yDXZwZPjdN) 64 | 65 | [![Decay Studios](https://i.imgur.com/a6n1J4u.png)](https://i.imgur.com/a6n1J4u.png) 66 | 67 | ## 💬 Community & Support 68 | 69 | - **Discord Community**: [Join our growing community](https://discord.gg/mrnewbscripts) 70 | - **Documentation**: [Complete guide and tutorials](https://mrnewbs-scrips.gitbook.io/guide) 71 | - **Issues & Suggestions**: Use Discord for the fastest response 72 | - **Updates**: Follow our Discord for the latest announcements 73 | 74 | ## 📄 License 75 | 76 | This resource is provided under a custom license. Please respect the terms of use and do not redistribute without permission. 77 | 78 | ## ☕ Support the Developer 79 | 80 | If you enjoy this resource and want to support continued development: 81 | 82 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/R5R76BIM9) 83 | 84 | ## ❓ Frequently Asked Questions 85 | 86 |
87 | 🔧 Installation & Setup 88 | 89 | ### Q: Do I need Community Bridge to use this resource? 90 | **A:** Yes, Community Bridge is a required dependency. This resource will not function without it. 91 | 92 | ### Q: Which inventory systems are supported? 93 | **A:** Through Community Bridge, we support QB-Core, ESX, Origin, OX Inventory, and many others. The bridge handles compatibility automatically. 94 | 95 | ### Q: The resource isn't working after installation. What should I do? 96 | **A:** Make sure you have: 97 | 1. Installed Community Bridge first 98 | 2. Added both resources to your server.cfg in the correct order 99 | 3. Restarted your server completely 100 | 4. Check the console for any error messages 101 | 102 |
103 | 104 |
105 | 💬 Support & Community 106 | 107 | ### Q: Where can I get help if I have issues? 108 | **A:** Join our Discord community for the fastest support. We have dedicated channels for troubleshooting. 109 | 110 | ### Q: Can I request new features? 111 | **A:** Absolutely! Join our Discord and share your ideas in the suggestions channel. 112 | 113 | ### Q: Is this resource free? 114 | **A:** Yes, this resource is free to use. If you enjoy it, consider supporting the developer through Ko-fi. 115 | 116 |
117 | 118 | 119 |
120 | SEO Keywords & Search Optimization 121 | 122 | **FiveM Scripts:** FiveM scripts • FiveM resources • FiveM development • FiveM server scripts • Custom FiveM scripts • Professional FiveM scripts • FiveM script developer • FiveM lua scripts • Best FiveM scripts • Free FiveM scripts • Quality FiveM scripts • Custom plate scripts 123 | 124 | **Custom License Plates:** FiveM custom plates • License plate FiveM • Custom license plates • Personalized plates • Vehicle customization • Plate customization • Custom vehicle plates • License plate system • Vehicle registration • Plate designer • Custom car plates • Unique license plates 125 | 126 | **Vehicle Systems:** Vehicle customization • Car modification • Vehicle accessories • Automotive scripts • Vehicle enhancement • Car personalization • Vehicle identity • Registration systems • Vehicle branding • Automotive roleplay 127 | 128 | **Framework Compatibility:** ESX scripts • QBCore scripts • Qbox scripts • QBX scripts • QB-Core resources • Multi-framework scripts • ESX resources • QBCore resources • Framework compatibility • Universal FiveM scripts • Cross-framework development • ESX QBCore Qbox compatibility 129 | 130 | **Plate Management:** Plate creation • License management • Vehicle plates • Plate templates • Custom designs • Plate editor • Registration plates • Personalized registration • Vehicle identification • Plate workshop 131 | 132 | **Free Resources:** Free FiveM scripts • Open source FiveM • Community FiveM scripts • No escrow FiveM • Unencrypted scripts • Community resources • Free roleplay scripts • Open source roleplay • Community driven development 133 | 134 | **Roleplay Enhancement:** GTA V roleplay • GTA RP scripts • Roleplay server scripts • RP server resources • Immersive roleplay • Professional roleplay scripts • Roleplay enhancement tools • Vehicle roleplay • Automotive roleplay 135 | 136 | **Multi-Location Systems:** Multiple shops • Multi-location scripts • Shop networks • Business chains • Location management • Map integration • Blip systems • Multi-point systems 137 | 138 | **Time-Based Features:** Scheduled operations • Time-based scripts • Business hours • Operating schedules • Timed availability • Schedule management • Time controls 139 | 140 | **Technical Features:** Lua programming • Lua scripting • FiveM development • Lightweight scripts • Performance optimization • Community Bridge integration • Ox Library integration • Modern framework support 141 | 142 | **Search Tags:** `fivem-scripts` `custom-plates` `license-plates` `vehicle-customization` `esx-scripts` `qbcore-scripts` `qbox-scripts` `qbx-scripts` `vehicle-scripts` `plate-system` `car-modification` `automotive-scripts` `free-fivem` `lua-programming` `gta5-roleplay` `roleplay-scripts` `vehicle-system` `customization-system` `fivem-resources` `open-source` `multi-framework` `professional-scripts` `community-bridge` `ox-lib` `qb-core` `qbox` `qbx` `free` `script` `mrnewb` `community_bridge` `platechanger` `plate` 143 | 144 |
145 | 146 | --- 147 | 148 | *Made with ❤️ by MrNewb | © 2025 - All Rights Reserved* 149 | --------------------------------------------------------------------------------