├── 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 | [](https://i.imgur.com/UPyWXAs.png)
2 |
3 | # MrNewbsCustomPlates
4 | docs available at https://mrnewbs-scrips.gitbook.io/guide
5 |
6 | [](https://github.com/mrnewb)
7 | [](https://discord.gg/mrnewbscripts)
8 | [](https://fivem.net/)
9 | [](https://github.com/mrnewb)
10 | [](#license)
11 | [](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 | [](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 | [](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 |
--------------------------------------------------------------------------------