[{"data":1,"prerenderedAt":100},["ShallowReactive",2],{"site":3,"config-slug-site":15,"config-product-th-x3d-phone":21,"config-public-x3d-phone":95},{"site":4,"contact":10,"seo":13,"payment":14},{"name":5,"host":6,"default_locale":7,"locales":8},"X3D Developer","fivem.x3d-developer.com","th",[7,9],"en",{"discord_invite":11,"email":12,"line":12},"https:\u002F\u002Fdiscord.gg\u002FNA5kPVynFv","",{"google_site_verification":12,"bing_site_verification":12},{"bank_name":12,"account_name":12,"account_no":12,"promptpay_id":12},{"site":16,"contact":18,"seo":19,"payment":20},{"name":5,"host":6,"default_locale":7,"locales":17},[7,9],{"discord_invite":11,"email":12,"line":12},{"google_site_verification":12,"bing_site_verification":12},{"bank_name":12,"account_name":12,"account_no":12,"promptpay_id":12},{"id":22,"slug":23,"name":24,"summary":25,"price_thb":26,"license_mode":27,"cover_key":28,"cover_url":29,"category_slugs":30,"tags":32,"latest_version":55,"latest_released_at":56,"published_at":57,"has_docs":58,"config":59,"rent_price_satang":60,"description_md":61,"docs_md":62,"seo_title":63,"seo_description":64,"media":65,"versions":81},"879a5a5d-5b22-4fb5-9274-6ac3ee631904","x3d-phone","X3D Phone (โทรศัพท์)","โทรศัพท์มือถือฟรีสำหรับ ESX: โทรผ่าน pma-voice, SMS แชร์ตำแหน่ง, ธนาคารมือถือ, กล้องถ่ายรูปเก็บในเซิร์ฟเอง, Buzz และ Dark Chat",0,"none","public\u002Fproducts\u002Fx3d-phone\u002Fcover\u002F9e0b9e2f9bc7352d.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fcover\u002F9e0b9e2f9bc7352d.jpg",[31],"hud",[33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54],"phone","โทรศัพท์","โทรศัพท์ fivem","esx phone","phone script","sms","pma-voice","dispatch","แจ้งเหตุ","ธนาคารมือถือ","buzz","dark chat","กล้อง","esx","ฟรี","free","เบอร์หน่วยงาน","ออกบิล","แชร์ตำแหน่ง","เรียกหมอ","กล้องโทรศัพท์","ไอเทมโทรศัพท์","1.1.3","2026-10-12T17:18:13.372348Z","2026-09-25T15:32:10.424119Z",true,"public",null,"โทรศัพท์มือถือสำหรับ ESX ใช้ฟรี ในเครื่องมีแอปโทรศัพท์, ข้อความ, รายชื่อ, ธนาคาร, บิล, Buzz, Dark Chat และตั้งค่า UI ทำด้วย Nuxt 4 ได้ทั้งเมาส์และคีย์บอร์ด เหมาะกับเมืองทุกแนว (school \u002F community \u002F RP)\n\n---\n\n## ฟีเจอร์\n\n- [+] ตั้งค่าง่าย ปรับได้หมดใน config หรือตั้งผ่านเว็บได้เลย\n- [+] โทรด้วยเสียงจริงผ่าน pma-voice กดปิดไมค์ได้ เสียงเรียกเข้า 5 แบบ\n- [+] SMS แยกห้องตามคนคุย แชร์ตำแหน่ง แตะแล้วปักหมุด GPS ได้\n- [+] เบอร์หน่วยงาน ตำรวจ หมอ ช่าง ส่งถึงทุกคนในอาชีพพร้อมพิกัด\n- [+] แจ้งเหตุ Dispatch เรียกหมอได้ หมอรับเคสแล้วปักหมุดให้\n- [+] ออกบิลให้เบอร์โทร บิลตำรวจ\u002Fหมอ\u002Fแอดมิน ล็อกไว้ ยกเลิกได้จากเมนูแอดมินเท่านั้น\n- [+] ธนาคารมือถือ โอนด้วยเบอร์โทร ตั้งยอดโอนต่ำสุด-สูงสุดเอง\n- [+] กล้องถ่ายรูป รูปเก็บในเซิร์ฟเอง ตั้งลิมิตรูปต่อชั่วโมงได้\n- [+] Buzz ฟีดทั้งเซิร์ฟ สกิน 5 แบบ แอดมินล็อกสกินได้\n- [+] Dark Chat ห้องนิรนาม ใช้ชื่อแฝง ตั้งรหัสห้องได้\n- [+] ต้องมีไอเทมโทรศัพท์ถึงใช้ได้ ตั้งชื่อไอเทมเอง หรือปิดก็ได้\n- [+] เขียนเชื่อมกับสคริปต์อื่นได้ที่ addons\u002F\n\n---\n\n## มีอะไรบ้าง\n\n- **โทรศัพท์**: มีแป้นกดเบอร์และประวัติการโทร ขึ้นตัวเลขแจ้งเตือนเมื่อมีสายที่ไม่ได้รับ โทรคุยกันด้วยเสียงจริงผ่าน **pma-voice** กดปิดไมค์ได้ และเลือกเสียงเรียกเข้าได้ 5 แบบ\n- **ข้อความ (SMS)**: แยกเป็นห้องตามคนคุย ขึ้นตัวเลขข้อความที่ยังไม่อ่าน **แชร์ตำแหน่งได้** คนที่ได้รับแตะแล้วปักหมุด GPS ไปที่นั่นทันที\n- **รายชื่อ**: ตั้งคนโปรดได้ ชื่อในรายชื่อไปขึ้นในประวัติการโทรและในแชทด้วย\n- **เบอร์หน่วยงาน**: ส่ง SMS หาตำรวจ หมอ หรือช่าง ทุกคนในอาชีพนั้นได้รับพร้อมพิกัดผู้ส่ง สคริปต์อาชีพเพิ่มหรือลบเบอร์เองได้ผ่าน event `x3d_phone:registerNumber` \u002F `x3d_phone:removeNumber`\n- **แจ้งเหตุ (Dispatch)**: ผู้เล่นกด \"เรียกหมอ\" แล้วหมอทุกคนได้เคสในโทรศัพท์พร้อมระยะทางและจุดบนแผนที่ กดรับเคสแล้วปักหมุด GPS ให้ ผู้เรียกได้รู้ว่าหมอกำลังไป สคริปต์อื่นเรียกใช้ได้ด้วย export เดียว\n- **บิล**: ออกบิลให้เบอร์โทรใดก็ได้ ทั้งแบบส่วนตัวและในนามหน่วยงาน (ตำรวจ หมอ ช่าง แท็กซี่ ตั้งเพิ่มได้) ผู้รับกดจ่ายหรือปฏิเสธในโทรศัพท์ (บิลของหน่วยงานที่ล็อกไว้ เช่น ตำรวจ หมอ แอดมิน ปฏิเสธและยกเลิกไม่ได้ ต้องให้แอดมินยกเลิกจากเมนูแอดมิน) กดจ่ายซ้ำไม่หักเงินซ้ำ บิลส่วนตัวเงินเข้าบัญชีธนาคารของคนออกบิล ส่วนบิลหน่วยงานต้องต่อบัญชีหน่วยงานของเซิร์ฟเองที่ `addons\u002Fbilling\u002Fserver.lua`\n- **emoji ครบทุกตัว**: แผงเลือก emoji แบ่งหมวดและค้นหาได้ ใช้ได้ทั้ง SMS, Buzz และ Dark Chat\n- **ธนาคารมือถือ**: ดูยอดเงินและประวัติ โอนเข้าบัญชีธนาคารด้วยเบอร์โทรของคนที่ออนไลน์อยู่ ใช้บัญชี `bank` ของ ESX หรือต่อกับระบบธนาคารอื่นได้\n- **กล้อง**: ถ่ายรูปในเกมแล้วส่งใน SMS โพสต์ ใช้เป็นรูปรายชื่อ รูปโปรไฟล์ หรือวอลเปเปอร์ได้ **รูปเก็บในเซิร์ฟเวอร์ของคุณเอง** ไม่ต้องสมัครเว็บฝากรูป ไม่ต้องใช้ API key\n- **Buzz**: ฟีดเดียวทั้งเซิร์ฟ โพสต์ ไลก์ และลบโพสต์ของตัวเองได้ โพสต์ใหม่เด้งขึ้นแชทในเกมเป็นการ์ด **มีสกิน 5 แบบ** (default, ฮาโลวีน, คริสต์มาส, สงกรานต์, กลางคืน) ผู้เล่นเลือกเองหรือแอดมินล็อกให้ทั้งเซิร์ฟ\n- **ไอเทมโทรศัพท์**: ค่าเริ่มต้นต้องมีไอเทม `phone` ถึงจะใช้ได้ ไม่มีโทรศัพท์ = โทรไม่ได้ รับสายไม่ได้ เซิร์ฟเวอร์เป็นคนตรวจ\n- **Dark Chat**: ห้องแชทนิรนาม ใช้ชื่อแฝง ตั้งรหัสผ่านห้องได้ คนอื่นไม่เห็นเบอร์จริงของคนส่ง\n- **ตั้งค่า**: เปลี่ยนวอลเปเปอร์ เสียงเรียกเข้า และเสียงแจ้งเตือนได้ มีโหมดใช้คีย์บอร์ดอย่างเดียว และกด **Alt** สลับไปบังคับตัวละครได้โดยไม่ต้องปิดโทรศัพท์\n\n---\n\n## ส่งสำเนาเข้า Discord\n\nใส่ webhook ใน `server.cfg` แล้วทุกรูปที่ผู้เล่นถ่ายจะส่งสำเนาเข้าห้อง Discord ของแอดมิน พร้อมชื่อผู้เล่นและ identifier รูปจริงยังเก็บในเซิร์ฟ ลิงก์ในเกมจึงไม่หมดอายุ แยก webhook สำหรับ log SMS โพสต์ และการโอนเงินได้\n\n---\n\n## ปลอดภัยฝั่งเซิร์ฟเวอร์\n\n- เซิร์ฟเวอร์ตรวจทุก callback ใหม่ทั้งหมด ไม่เชื่อค่าที่ client ส่งมา\n- จำกัดความถี่การส่ง SMS โพสต์ ไลก์ และการโทร\n- ลบรายชื่อ โพสต์ หรือประวัติได้เฉพาะของตัวเอง\n- ลิงก์รูปจากภายนอกรับเฉพาะเว็บที่ตั้งไว้ใน `Config.ImageHosts` (หรือเปิดให้รับทุกเว็บ https ได้)\n- อัปโหลดรูปใช้ token ที่ใช้ได้ครั้งเดียว มีจำกัดจำนวนต่อชั่วโมง และรับเฉพาะไฟล์ JPG\u002FPNG จริง\n- ลิงก์ webhook ไม่หลุดไปฝั่งผู้เล่น และข้อความเข้า Discord ไม่ ping ใคร\n\n---\n\n## แก้ให้เข้ากับเซิร์ฟตัวเอง\n\nทุกอย่างที่เซิร์ฟแต่ละที่ใช้ไม่เหมือนกันแยกไว้ในโฟลเดอร์ `addons\u002F` แก้ได้ทีละไฟล์\n\n| ไฟล์ | หน้าที่ |\n|---|---|\n| `addons\u002Fnotify\u002Fclient.lua` | แจ้งเตือน: ใช้ esx_notify หรือ ox_lib ถ้ามี ไม่มีก็ใช้ของ ESX |\n| `addons\u002Fvoice\u002Fclient.lua` | ระบบเสียง: ค่าเริ่มต้นคือ pma-voice |\n| `addons\u002Fbanking\u002Fserver.lua` | ธนาคาร: ค่าเริ่มต้นคือบัญชี `bank` ของ ESX |\n| `addons\u002Fbilling\u002Fserver.lua` | บิล: หักเงินผู้จ่าย และเงินเข้าคนออกบิล (บัญชีหน่วยงานต้องต่อเอง) |\n| `addons\u002Fframework\u002Fserver.lua` \u002F `client.lua` | ตัวเชื่อมเฟรมเวิร์ก: ค่าเริ่มต้นใช้ ESX ถ้าไม่มีเป็น standalone |\n| `addons\u002Fupload\u002Fclient.lua` | ที่เก็บรูป: ค่าเริ่มต้นคือเก็บในเซิร์ฟเวอร์เอง |\n| `addons\u002Ffilter\u002Fserver.lua` | กรองคำหยาบก่อนส่งข้อความ |\n| `addons\u002Flog\u002Fserver.lua` | เก็บ log SMS โพสต์ และ Dark Chat มีตัวอย่าง Discord webhook |\n\n---\n\n## ต้องมี\n\n- `oxmysql`\n- `es_extended` (ESX Legacy) ถ้าไม่มีจะรันแบบ standalone ซึ่งต้องต่อบัญชีธนาคารและระบบบิลเองที่ `addons\u002F`\n- `pma-voice` (ไม่บังคับ ถ้าไม่มีก็ยังโทรติด แต่ไม่มีเสียง)\n- `screenshot-basic` (ไม่บังคับ ใช้กับกล้อง มีแนบมาให้ในโฟลเดอร์ `optional\u002F`)\n","## การติดตั้ง\n\n1. แตกไฟล์ วางโฟลเดอร์ `x3d_phone` ไว้ใน `resources\u002F` **ห้ามเปลี่ยนชื่อโฟลเดอร์** เพราะ export และ event ทุกตัวใช้ชื่อนี้\n2. รัน `install.sql` บนฐานข้อมูลของเซิร์ฟ (รันซ้ำได้ ข้อมูลเดิมไม่หาย)\n3. ถ้าเซิร์ฟยังไม่มีไอเทม `phone` ให้รัน `optional\u002Fphone_item.sql` (ถ้าใช้ ox_inventory ให้เพิ่มใน `ox_inventory\u002Fdata\u002Fitems.lua` แทน มีตัวอย่างอยู่ในไฟล์นั้น)\n4. ถ้าเซิร์ฟยังไม่มี `screenshot-basic` ให้ย้าย `optional\u002Fscreenshot-basic\u002F` ออกไปไว้ใน `resources\u002F` (ไม่ลงก็ได้ แค่ใช้กล้องไม่ได้)\n5. เพิ่มใน `server.cfg` ตามลำดับนี้:\n\n```\nensure oxmysql\nensure es_extended\nensure pma-voice\nensure screenshot-basic\nensure x3d_phone\n```\n\nผู้เล่นเปิดโทรศัพท์ด้วย **F1**, คำสั่ง `\u002Fopenphone` หรือกดใช้ไอเทม `phone` ระหว่างเปิดโทรศัพท์ กด **Alt** เพื่อสลับไปบังคับตัวละคร แล้วกดอีกครั้งเพื่อกลับมาใช้เมาส์\n\n## ต้องมี\n\n| resource | จำเป็นไหม | ใช้ทำอะไร |\n|---|---|---|\n| `es_extended` | ไม่บังคับ | ESX Legacy ถ้าไม่มีจะรันแบบ standalone ซึ่งต้องต่อบัญชีธนาคารและระบบบิลเองที่ `addons\u002F` (ดู `Config.Framework`) |\n| `oxmysql` | จำเป็น | ฐานข้อมูล |\n| `pma-voice` | ไม่บังคับ | เสียงตอนโทร ถ้าไม่มี สายยังต่อติดแต่ไม่มีเสียง |\n| `screenshot-basic` | ไม่บังคับ | กล้องถ่ายรูป มีแนบมาให้ใน `optional\u002F` |\n| `chat` (ของ FiveM) | ไม่บังคับ | การ์ดโพสต์ในแชท |\n\nไม่ต้องสมัครเว็บฝากรูป ไม่ต้องใช้ API key และไม่ต้องลงโปรแกรมอื่นเพิ่ม\n\n---\n\n## ตั้งค่าทั้งหมด: `config\u002Fconfig.lua`\n\n### ทั่วไป\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.Locale` | `'th'` | ภาษาในโทรศัพท์และข้อความแจ้งเตือน: `'th'` หรือ `'en'` |\n| `Config.Framework` | `'auto'` | `'auto'` (มี ESX ใช้ ESX ไม่มีเป็น standalone) `\\| 'esx' \\| 'standalone'` |\n| `Config.Debug` | `false` | `true` = พิมพ์ log ลง console ของเซิร์ฟ |\n| `Config.OpenKey` | `'F1'` | ปุ่มเปิดโทรศัพท์ ผู้เล่นเปลี่ยนเองได้ใน Settings > Key Bindings > FiveM (ค่านี้มีผลกับผู้เล่นที่เข้าเซิร์ฟครั้งแรกเท่านั้น) |\n| `Config.DefaultContacts` | `{}` | รายชื่อที่ใส่ให้ทุกเบอร์ใหม่ เช่น `{ phone = '911', name = 'Police' }` |\n\n### ไอเทมโทรศัพท์\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.UseItem` | `true` | ต้องมีไอเทมในกระเป๋าถึงจะเปิดโทรศัพท์, โทรออก, รับสาย และได้แจ้งเตือน SMS |\n| `Config.PhoneItem` | `'phone'` | ชื่อไอเทม ใช้ชื่อที่เซิร์ฟมีอยู่แล้วได้ เช่น `'iphone'` |\n\nเมื่อเปิด `UseItem`:\n- ไม่มีไอเทม = เปิดโทรศัพท์ไม่ได้ ทุก callback ฝั่งเซิร์ฟเวอร์ปฏิเสธ (ยิง event เองก็ไม่ผ่าน)\n- คนที่ไม่มีไอเทมจะไม่ได้รับสาย ฝั่งคนโทรเห็นว่าติดต่อไม่ได้ และระบบบันทึกเป็นสายที่ไม่ได้รับ\n- SMS ยังเก็บไว้ให้ แต่จะไม่เด้งแจ้งเตือนจนกว่าจะมีไอเทม\n- ถ้าไอเทมหายระหว่างเปิดอยู่ (ทิ้ง \u002F โดนยึด) โทรศัพท์จะปิดและตัดสายทันที\n\n### การโทร\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.UseVoice` | `true` | ใช้ pma-voice เป็นเสียงตอนโทร |\n| `Config.CallChannelStart` | `1000` | เลขช่องเสียงของ pma-voice ที่เริ่มใช้สำหรับการโทร เปลี่ยนเฉพาะเมื่อชนกับสคริปต์อื่น |\n| `Config.CallTimeout` | `30` | กี่วินาทีที่ไม่มีคนรับแล้วตัดสาย |\n| `Config.Ringtones` | 5 เสียง | เสียงเรียกเข้า แต่ละตัวชี้ไปที่เสียงในเกม GTA V |\n| `Config.NotificationSounds` | 3 เสียง | เสียงแจ้งเตือนข้อความ |\n| `Config.RingtonePreviewMs` | `3000` | ความยาวเสียงตอนพิมพ์ `\u002Ftestringtone` และ `\u002Ftestdialtone` |\n\n> `Config.Ringtones`, `Config.NotificationSounds` และ `Config.Wallpapers` เป็นรายการที่เซิร์ฟเวอร์ใช้ตรวจค่าที่ผู้เล่นเลือก ถ้าจะลบตัวเลือก ให้ลบจาก config ได้เลย แต่ถ้าจะเพิ่มตัวเลือกใหม่ ต้องแก้หน้าเว็บของโทรศัพท์ด้วย\n\n### ข้อความ\n\nพิมพ์ emoji ได้ทุกช่อง (SMS, Buzz, Dark Chat) มีแผงเลือก emoji ครบทุกตัว แบ่งหมวดและค้นหาได้ ความยาวข้อความนับตามตัวอักษรจริง ภาษาไทยและ emoji จึงไม่ถูกนับเกิน\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.MaxMessageLength` | `500` | ความยาวสูงสุดของ SMS และข้อความ Dark Chat |\n\n### Buzz และสกินการ์ดโพสต์\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.Buzz.ToChat` | `true` | โพสต์ใหม่เด้งขึ้นในแชทเกมของทุกคน |\n| `Config.Buzz.Themes` | ทั้ง 5 แบบ | สกินที่เปิดให้ใช้: `default`, `halloween`, `christmas`, `songkran`, `night` |\n| `Config.Buzz.DefaultTheme` | `'default'` | สกินของคนที่ยังไม่ได้เลือก |\n| `Config.Buzz.PlayerTheme` | `true` | `true` = ผู้เล่นเลือกสกินเองในแอปตั้งค่า · `false` = ทุกคนใช้ `DefaultTheme` |\n\n**ตัวอย่าง:** ล็อกทั้งเซิร์ฟเป็นฮาโลวีนช่วงเทศกาล:\n\n```lua\nConfig.Buzz = {\n    ToChat = true,\n    Themes = { 'halloween' },\n    DefaultTheme = 'halloween',\n    PlayerTheme = false,\n}\n```\n\nการ์ดโพสต์ใช้ `chat` มาตรฐานของ FiveM โดย x3d_phone โหลดสไตล์ของตัวเองเข้าไปผ่าน `chat_theme` แบบไม่ทับธีมแชทที่เซิร์ฟใช้อยู่ ข้อความในโพสต์ถูก escape ทุกครั้ง ผู้เล่นจึงแทรก HTML ลงในแชทไม่ได้\n\n### เบอร์หน่วยงาน (ตำรวจ \u002F หมอ \u002F ช่าง) และสคริปต์อาชีพ\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.Dispatch.Numbers` | police, ambulance, mechanic | เบอร์หน่วยงาน: `เบอร์ = { label = 'ชื่อที่แสดง', jobs = { 'อาชีพ' }, coords = true }` |\n| `Config.Dispatch.OnDutyOnly` | `false` | `true` = ส่งถึงเฉพาะคนที่เข้าเวรอยู่ (`job.onDuty` ของ ESX Legacy) |\n\n- เบอร์หน่วยงานขึ้นเป็นรายชื่อพิเศษในแอปรายชื่อของทุกคน แก้ไขและลบไม่ได้\n- ส่ง SMS เข้าเบอร์ `police` = ทุกคนที่มีอาชีพใน `jobs` (ออนไลน์และมีโทรศัพท์) ได้รับข้อความ `[ตำรวจ] ...` จากเบอร์ของผู้ส่งพร้อมพิกัด แตะพิกัดเพื่อปักหมุด GPS แล้วตอบกลับหาผู้ส่งได้ในแชทนั้นเลย\n- พิกัดมาจากตำแหน่งตัวละครฝั่งเซิร์ฟเวอร์ ปลอมไม่ได้ และส่งเข้าเบอร์หน่วยงานเดียวกันได้ 1 ครั้งทุก 20 วินาที\n- ถ้าไม่มีเจ้าหน้าที่ออนไลน์ ผู้ส่งจะได้แจ้งเตือน\n\n**เชื่อมกับสคริปต์อาชีพ:** เบอร์ `police`, `ambulance` และ `mechanic` มีอยู่ใน config แล้ว สคริปต์อาชีพของคุณเพิ่มหรือลบเบอร์เองได้ด้วย event เหล่านี้\n\n| event | ทำอะไร |\n|---|---|\n| `TriggerEvent('x3d_phone:registerNumber', number, label, isDispatch, hasCoords)` (server) | เพิ่มเบอร์หน่วยงานจากสคริปต์อาชีพ (ถ้ามีเบอร์นี้แล้วจะไม่ทับ) |\n| `TriggerEvent('x3d_phone:removeNumber', number)` (server) | ลบเบอร์ที่ลงทะเบียนไว้ (เบอร์ใน config ลบไม่ได้) |\n| `TriggerServerEvent('x3d_phone:send', number, message, anonymous)` | สคริปต์ที่แจ้งตำรวจอัตโนมัติ (เช่น ระบบปล้น) ส่งข้อความเข้าเบอร์หน่วยงาน ถ้า `anonymous = true` จะขึ้นเป็นข้อความจากเบอร์หน่วยงานแทนเบอร์ผู้เล่น |\n\n> สคริปต์อาชีพที่เรียก event ชื่อเดิมของ `esx_phone` (`esx_phone:*`) จะไม่ทำงานกับ x3d_phone ต้องเปลี่ยนไปเรียก event ข้างบน\n\n#### แจ้งเหตุ (แอป Dispatch)\n\nเจ้าหน้าที่ (คนที่มีอาชีพใน `jobs`) จะเห็นแอป **แจ้งเหตุ** ในโทรศัพท์ ทุกเคสมีหัวข้อ ข้อความ ระยะทาง เวลา และเบอร์ผู้แจ้ง พร้อมจุดกะพริบบนแผนที่ แจ้งเตือน และเสียง\n- **รับเคส** → ปักหมุด GPS ให้ ผู้แจ้งได้แจ้งเตือนว่า \"หมอ X รับเคสแล้ว กำลังไปหาคุณ\" และเจ้าหน้าที่คนอื่นเห็นว่ามีคนรับแล้ว\n- **ปิดเคส** → เคสหายจากทุกเครื่องและแผนที่ เคสที่ไม่มีใครปิดจะหายเองหลัง `AlertSeconds`\n- เคสเกิดจาก SMS ถึงเบอร์หน่วยงาน หรือจากสคริปต์อื่นเรียกหน่วยงาน\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.Dispatch.AlertSeconds` | `600` | เคสค้างในแอปกี่วินาที |\n| `Config.Dispatch.CallNeedsPhone` | `false` | คนที่กดเรียกต้องมีไอเทมโทรศัพท์ไหม (ปุ่มเรียกหมอตอนล้มไม่ควรต้องมี) |\n| `Numbers.\u003Cเบอร์>.request` | | หัวข้อเคสเวลามีคนกดเรียก เช่น `'มีผู้บาดเจ็บ ต้องการหมอ'` |\n| `Numbers.\u003Cเบอร์>.blip` | | `{ sprite, color }` ของจุดบนแผนที่เจ้าหน้าที่ |\n\n**ให้สคริปต์อื่นเรียกหน่วยงาน (เช่นปุ่ม \"เรียกหมอ\" ตอนล้ม):**\n\n```lua\n-- client\nexports['x3d_phone']:RequestService('ambulance', 'หมดสติกลางถนน')\n-- หรือ\nTriggerServerEvent('x3d_phone:requestService', 'ambulance', 'หมดสติกลางถนน')\n\n-- server (กำหนดหัวข้อ\u002Fพิกัดเองได้)\nexports['x3d_phone']:SendAlert('police', { source = src, title = 'ปล้นธนาคาร', message = 'Pacific Standard' })\nexports['x3d_phone']:SendAlert('police', { coords = vector3(x, y, z), title = 'สัญญาณกันขโมยดัง' })\n```\n\nพิกัดของ `RequestService` อ่านจากตัวละครฝั่งเซิร์ฟเวอร์ ปลอมไม่ได้ และเรียกหน่วยงานเดียวกันได้ 1 ครั้งทุก 60 วินาที\n\n### แอปบิล\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.Billing.Enabled` | `true` | แสดงแอปบิล |\n| `Config.Billing.AllowPersonal` | `true` | ออกบิลส่วนตัวได้ เงินเข้าบัญชีธนาคารของคนออกบิล (ออฟไลน์อยู่ก็เข้า) |\n| `Config.Billing.AllowDecline` | `true` | ผู้รับกดปฏิเสธบิลได้ ถ้า `false` ต้องจ่ายอย่างเดียว (คนออกบิลยังยกเลิกได้) |\n| `Config.Billing.MinAmount` \u002F `MaxAmount` | `1` \u002F `1000000` | ยอดบิลต่ำสุด \u002F สูงสุด |\n| `Config.Billing.MaxOpenPerTarget` | `10` | บิลค้างสูงสุดจากคนออกบิลหนึ่งคนถึงเบอร์เดียว (กันสแปม) |\n| `Config.Billing.PayFrom` | `'bank'` | จ่ายจากบัญชีไหนของผู้จ่าย: `'bank'` หรือ `'money'` |\n| `Config.Billing.UsersTable` | `'users'` | ตารางผู้เล่นของ ESX ใช้ตอนเงินเข้าบัญชีคนออกบิลที่ออฟไลน์ |\n| `Config.Billing.Jobs` | police, ambulance, mechanic, taxi | อาชีพที่ออกบิลในนามหน่วยงานได้: `ชื่ออาชีพ = { label = 'ชื่อที่แสดง', minGrade = 0, locked = true }` · `locked = true` = คนออกบิลยกเลิกไม่ได้ ผู้รับปฏิเสธไม่ได้ ต้องจ่าย หรือแอดมินยกเลิกจากแผง x3d_adminpanel (ค่าเริ่มต้น: ตำรวจ หมอ) |\n| `Config.Billing.Admin` | `{ enabled = true, label = 'แอดมิน', groups = { 'admin', 'superadmin' }, locked = true }` | แอดมินออกบิลในนาม \"แอดมิน\" ได้ (เช่น ค่าปรับ) เงินส่งไป `Billing.PayAdmin` ที่ท้าย `addons\u002Fbilling\u002Fserver.lua` ค่าเริ่มต้นไม่เข้าบัญชีใคร |\n\nบิลในนามหน่วยงาน: ค่าเริ่มต้นไม่มีบัญชีหน่วยงานให้ (`Billing.PaySociety` คืน `false`) ผู้จ่ายจึงไม่ถูกหักเงิน และบิลค้างอยู่เหมือนเดิม ต่อบัญชีหน่วยงานของเซิร์ฟ (เช่น `esx_addonaccount`) ที่ `addons\u002Fbilling\u002Fserver.lua` ก่อนเปิดใช้บิลหน่วยงาน\n\n- ผู้รับได้แจ้งเตือนทันทีถ้าออนไลน์อยู่ ถ้าออฟไลน์ บิลรอในแอปจนกว่าจะเข้าเกม\n- จ่ายบิลได้ครั้งเดียว กดรัว ๆ ก็ไม่หักเงินซ้ำ\n- บิลที่ล็อกไว้ ยกเลิกได้ที่แผง x3d_adminpanel > โทรศัพท์ > บิลค้างจ่าย เท่านั้น (ค้นหาด้วยเบอร์หรือรายละเอียด กดค้างเพื่อยกเลิก มีประวัติการยกเลิก)\n- ออกบิลได้ 1 ครั้งทุก 5 วินาที รายละเอียดบิลผ่าน `FilterMessage` เหมือนข้อความอื่น\n\n**ให้สคริปต์อื่นออกบิล (server):**\n\n```lua\nlocal ok, idOrError = exports['x3d_phone']:CreateBill(source, '48213', 500, 'ค่าปรับจอดในที่ห้าม', 'police')\n-- issuer: 'personal', ชื่ออาชีพใน Config.Billing.Jobs (ผู้ออกบิลต้องมีอาชีพนั้นจริง) หรือ 'admin' (ต้องเป็นแอดมินตาม Config.Billing.Admin.groups)\n```\n\n### รูปภาพ: กล้อง อัปโหลด และลิงก์จากภายนอก\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.Uploads.Enabled` | `true` | เปิดกล้องและการอัปโหลดวอลเปเปอร์จากคอมพิวเตอร์ |\n| `Config.Uploads.BaseUrl` | `''` | เว้นว่างได้ ดูคำอธิบายด้านล่าง |\n| `Config.Uploads.MaxBytes` | 3 MB | ขนาดไฟล์สูงสุดต่อรูป (เพดานในตัวคือ 8 MB) |\n| `Config.Uploads.PerPlayerPerHour` | `30` | ผู้เล่นหนึ่งคนอัปโหลดได้กี่รูปต่อชั่วโมง |\n| `Config.Uploads.Keep` | `1000` | เก็บรูปล่าสุดกี่รูป เกินแล้ววนทับรูปเก่าที่สุด ลิงก์ของรูปที่ถูกทับจะเปิดไม่ได้ |\n| `Config.Uploads.Quality` | `0.85` | คุณภาพ JPG ตอนถ่ายรูป (0–1) |\n| `Config.ImageHosts` | imgur, ibb | เว็บภายนอกที่ผู้เล่นวางลิงก์รูปได้ (ในแชท โพสต์ และวอลเปเปอร์) ใส่ `{}` เพื่อปิดลิงก์ภายนอก |\n| `Config.AnyImageHost` | `false` | `true` = รับลิงก์ https จากทุกเว็บ |\n\n**รูปเก็บไว้ที่ไหน:** ที่ `x3d_phone\u002Fdata\u002Fuploads\u002F` ในเครื่องเซิร์ฟ แล้วเปิดผ่านพอร์ตเกมของ FXServer เอง (30120) ไม่มีบริการภายนอก ประมาณการพื้นที่สูงสุดคือ `Keep × MaxBytes` (ค่าเริ่มต้นประมาณ 3 GB แต่รูปจากกล้องปกติไม่เกิน 400 KB)\n\n**`BaseUrl`:** ถ้าเว้นว่าง ลิงก์รูปถูกเก็บเป็น `\u002Fi\u002F\u003Ctoken>.jpg` แล้วเครื่องของผู้เล่นแต่ละคนเติมที่อยู่เซิร์ฟที่ตัวเองต่ออยู่ให้เอง ใช้ได้ทันทีโดยไม่ต้องตั้งอะไร ให้ตั้ง `BaseUrl` เฉพาะเมื่อ:\n- มีโดเมน https ชี้มาที่เซิร์ฟ (เช่นผ่าน reverse proxy) และอยากให้รูปที่ถ่ายขึ้นในการ์ดโพสต์ในแชทด้วย\n- ตัวอย่าง: `BaseUrl = 'https:\u002F\u002Fimg.myserver.com\u002Fx3d_phone'`\n\n**ทำไมไม่ใส่ `cdn.discordapp.com` เป็นค่าเริ่มต้น:** ลิงก์ไฟล์ของ Discord หมดอายุภายในประมาณ 24 ชั่วโมงถ้าเปิดจากนอก Discord รูปจะหายไปในวันถัดไป\n\n> ⚠️ **`AnyImageHost = true`:** เจ้าของเว็บรูปจะเห็น IP ของผู้เล่นทุกคนที่เปิดดูรูปนั้น และคุณคุมไม่ได้ว่ารูปที่ขึ้นคืออะไร แนะนำให้ใส่เฉพาะเว็บที่ไว้ใจใน `ImageHosts` แทน\n\n### ธนาคารมือถือ\n\n| ค่า | ค่าเริ่มต้น | ความหมาย |\n|---|---|---|\n| `Config.Banking.Enabled` | `true` | แสดงแอปธนาคาร |\n| `Config.Banking.MinTransfer` | `1` | ยอดโอนต่ำสุด |\n| `Config.Banking.MaxTransfer` | `1000000` | ยอดโอนสูงสุดต่อครั้ง |\n\nโอนได้เฉพาะเข้าเบอร์ของผู้เล่นที่ออนไลน์อยู่ ใช้บัญชี `bank` ของ ESX และเก็บประวัติในตาราง `x3d_phone_bank_history` ระบบกันกดโอนซ้อน (ขณะกำลังโอนอยู่จะโอนรายการใหม่ไม่ได้) และโอนได้ 1 ครั้งทุก 3 วินาที\n\n---\n\n## ส่งสำเนาเข้า Discord\n\nใส่ใน `server.cfg` ลิงก์ webhook อยู่ฝั่งเซิร์ฟเวอร์เท่านั้น ผู้เล่นไม่เห็น\n\n```\nset x3d_phone_upload_webhook \"https:\u002F\u002Fdiscord.com\u002Fapi\u002Fwebhooks\u002F...\"\nset x3d_phone_log_webhook    \"https:\u002F\u002Fdiscord.com\u002Fapi\u002Fwebhooks\u002F...\"\n```\n\n| convar | ส่งอะไร |\n|---|---|\n| `x3d_phone_upload_webhook` | สำเนาทุกรูปที่ผู้เล่นถ่าย\u002Fอัปโหลด พร้อมชื่อ, server id, identifier และประเภท (messages \u002F twitter \u002F wallpaper) |\n| `x3d_phone_log_webhook` | log SMS, โพสต์, Dark Chat และการโอนเงิน (ไม่บังคับ) |\n\n- ปิดการ @mention ทุกข้อความ ผู้เล่นที่ตั้งชื่อเป็น `@everyone` จะไม่ ping ห้อง\n- ส่งเป็นคิว 1 รายการทุก 1.5 วินาที เพื่อไม่ให้โดน Discord จำกัดความถี่ ถ้าค้างเกิน 20 รายการจะข้ามรายการใหม่\n- รูปจริงยังเก็บในเซิร์ฟ ลิงก์ในเกมจึงไม่หมดอายุ\n- รับเฉพาะลิงก์ที่หน้าตาเป็น webhook ของ Discord จริง\n\n---\n\n## ปรับให้เข้ากับเซิร์ฟ: `addons\u002F`\n\nไฟล์ในนี้แก้ได้อิสระ แต่ละไฟล์ทำงานได้ทันทีด้วยค่าเริ่มต้น\n\n| ไฟล์ | ฟังก์ชัน | ค่าเริ่มต้น |\n|---|---|---|\n| `addons\u002Fnotify\u002Fclient.lua` | `Notify(message, kind)` | esx_notify → ox_lib → `ESX.ShowNotification` |\n| `addons\u002Fvoice\u002Fclient.lua` | `Voice.Enabled()`, `Voice.SetCallChannel(ch)`, `Voice.SetMuted(bool)` | pma-voice (มีตัวอย่าง mumble-voip) |\n| `addons\u002Fupload\u002Fclient.lua` | `Upload.Screenshot(kind, cb)`, `Upload.Target(kind, cb)` | screenshot-basic → เก็บในเซิร์ฟ |\n| `addons\u002Fframework\u002Fserver.lua` \u002F `client.lua` | ตัวเชื่อมเฟรมเวิร์ก (`Framework.*`) เหมือนกันทุกสินค้า X3D | ESX ถ้ามี ไม่มีเป็น standalone |\n| `addons\u002Fbilling\u002Fserver.lua` | `Billing.Charge`, `Billing.Refund`, `Billing.PaySociety`, `Billing.PayPerson`, `Billing.PayAdmin` | หัก\u002Fคืนเงินและเข้าบัญชีธนาคารคนออกบิลผ่าน `Framework.*` · `PaySociety` คืน `false` ต้องต่อเอง |\n| `addons\u002Fbanking\u002Fserver.lua` | `Banking.GetBalances`, `Banking.Transfer`, `Banking.History` | บัญชี `bank` ของ ESX |\n| `addons\u002Ffilter\u002Fserver.lua` | `FilterMessage(src, kind, message)` | บล็อกคำใน `Config.BannedWords` |\n| `addons\u002Flog\u002Fserver.lua` | `PhoneLog(src, kind, data)`, `UploadCopy(p, file)` | Discord webhook จาก convar |\n| `addons\u002Flocale\u002Fshared.lua` | `T(th, en)` | ตาม `Config.Locale` |\n\n**ตัวอย่าง:** ต่อกับระบบธนาคารของตัวเอง ให้แก้ `Banking.Transfer` ให้เรียกระบบนั้นแล้วคืนค่า `true` หรือ `false, 'ข้อความ error'` เซิร์ฟเวอร์ตรวจจำนวนเงิน ผู้รับ และความถี่ให้ก่อนแล้ว\n\n**ตัวอย่าง:** ใส่คำต้องห้าม:\n\n```lua\nConfig.BannedWords = { 'คำหยาบ1', 'badword' }\n```\n\n---\n\n## Exports (client)\n\n```lua\nexports['x3d_phone']:OpenPhone()\nexports['x3d_phone']:ClosePhone()\nexports['x3d_phone']:IsPhoneOpen()     --> boolean\nexports['x3d_phone']:GetPhoneNumber()  --> string | nil\nexports['x3d_phone']:IsInCall()        --> boolean\nexports['x3d_phone']:GetCallData()     --> { phoneNumber, displayName, isOutgoing } | nil\n```\n\n## คำสั่ง\n\n| คำสั่ง | ทำอะไร |\n|---|---|\n| `\u002Fopenphone` | เปิด\u002Fปิดโทรศัพท์ |\n| `\u002Ftestringtone` | ฟังเสียงเรียกเข้าที่เลือกไว้ |\n| `\u002Ftestnotification` | ฟังเสียงแจ้งเตือนที่เลือกไว้ |\n| `\u002Ftestdialtone` | ฟังเสียงรอสายตอนโทรออก |\n\n## ปัญหาที่พบบ่อย\n\n| อาการ | สาเหตุ \u002F วิธีแก้ |\n|---|---|\n| กด F1 แล้วขึ้นว่า \"คุณไม่มีโทรศัพท์\" | `Config.UseItem = true` แต่ไม่มีไอเทมในกระเป๋า ให้ไอเทม `phone` หรือตั้ง `UseItem = false` |\n| ไม่มีปุ่มกล้อง | ยังไม่ได้ `ensure screenshot-basic` หรือ `Config.Uploads.Enabled = false` |\n| ถ่ายรูปแล้วขึ้น `upload_failed` | เช็ค console ถ้ามีข้อความ `cannot write data\u002Fuploads\u002F` ให้สร้างโฟลเดอร์ `data\u002Fuploads\u002F` ใน resource |\n| โทรติดแต่ไม่มีเสียง | ยังไม่ได้ลง pma-voice หรือ `ensure` หลัง x3d_phone |\n| โพสต์ไม่ขึ้นในแชท | `Config.Buzz.ToChat = false` หรือเซิร์ฟไม่ได้ใช้ resource `chat` ของ FiveM |\n| วางลิงก์รูปแล้วส่งไม่ได้ | เว็บนั้นไม่ได้อยู่ใน `Config.ImageHosts` หรือลิงก์ไม่ได้ขึ้นต้นด้วย https |\n","สคริปต์โทรศัพท์ FiveM ESX ฟรี โทร SMS Buzz","สคริปต์โทรศัพท์ FiveM ฟรีสำหรับ ESX โทรด้วยเสียง pma-voice, SMS แชร์ตำแหน่ง, รายชื่อ, Buzz และ Dark Chat รองรับไทย\u002Fอังกฤษ ใช้ไอเทมได้",[66,69,71,73,75,77,79],{"kind":67,"url":68},"image","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fmedia\u002F8704c36bb000ed04.png",{"kind":67,"url":70},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fmedia\u002F8da2ccf3c9cb7166.png",{"kind":67,"url":72},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fmedia\u002F463104ac8d020f1b.png",{"kind":67,"url":74},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fmedia\u002F49fd564a93b137ce.png",{"kind":67,"url":76},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fmedia\u002F60eb9d61acfcc2ed.png",{"kind":67,"url":78},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fmedia\u002F7bfa7b032cc0179b.png",{"kind":67,"url":80},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fmedia\u002Faea505b6f18ed953.png",[82,84,88,91],{"version":55,"released_at":56,"changelog_md":83},"### Changed\n\n- Store images now carry English captions for the English store page",{"version":85,"released_at":86,"changelog_md":87},"1.1.1","2026-10-12T03:26:38.605628Z","### Changed\n\n- UI font is now Kanit (one family for Thai and English), bundled inside the script; the Thai font now really loads in game (FiveM's browser dropped the old font declaration and fell back to a system font)",{"version":89,"released_at":90,"changelog_md":12},"1.0.1","2026-09-26T12:42:43.462227Z",{"version":92,"released_at":93,"changelog_md":94},"1.0.0","2026-09-25T15:31:53.651524Z","First public release.\r\n\r\n### Added\r\n\r\n- Phone app: keypad, recent calls, missed-call badge, voice calls through pma-voice (mute, ringtone, dial tone).\r\n- Messages: SMS conversations, unread badges, location sharing that sets a GPS waypoint on tap.\r\n- Contacts with favourites and photos.\r\n- Mobile banking: balance, history and transfers to an online player's phone number (ESX `bank` account by default, swappable in `addons\u002Fbanking\u002Fserver.lua`).\r\n- Camera: take a photo in game with screenshot-basic for messages, posts, contacts, Buzz avatar and wallpaper. Photos are stored on your own server (`data\u002Fuploads\u002F`), no image host or API key needed.\r\n- Post card skins in the in-game chat: default, halloween, christmas, songkran, night. Players pick one in Settings, or the server locks one with `Config.Buzz`. Uses FiveM's standard chat through `chat_theme`.\r\n- Phone item required by default (`Config.UseItem = true`, `Config.PhoneItem = 'phone'`): gates opening, calling, answering and SMS alerts on the server; the phone closes when the item leaves the inventory. `optional\u002Fphone_item.sql` adds the item.\r\n- Service numbers (`Config.Dispatch`): texting `police` \u002F `ambulance` \u002F `mechanic` reaches every online member of that job with the sender's server-side location; answers the old `esx_phone` API (`registerNumber`, `removeNumber`, `cancelMessage`, `esx_phone:send`) so esx_policejob \u002F esx_ambulancejob \u002F esx_mechanicjob work unchanged.\r\n- Dispatch app for responders: calls with distance, map blip and sound; Respond sets a waypoint and tells the caller help is coming. Client export `RequestService` \u002F event `x3d_phone:requestService` (e.g. a death-screen \"call EMS\" button) and server export `SendAlert`.\r\n- Bills app: bill any phone number personally or on behalf of a job (`Config.Billing.Jobs`, paid into `society_\u003Cjob>`); the recipient pays or declines in the phone; paying twice is impossible and a failed payout refunds the payer. Server export `CreateBill`.\r\n- Full emoji picker (3,600+ emoji, 9 groups, search) in SMS, Buzz and Dark Chat; text limits count real characters so Thai and emoji are not over-counted.\r\n- Optional Discord copies: every photo is posted to `x3d_phone_upload_webhook`, and SMS \u002F post \u002F Dark Chat \u002F transfer logs to `x3d_phone_log_webhook`. Webhooks stay server-side, mentions are disabled, and posts are queued.\r\n- External image links in messages, posts and wallpaper from `Config.ImageHosts`, or from any https site with `Config.AnyImageHost`.\r\n- `optional\u002Fscreenshot-basic\u002F` bundled (MIT, CitizenFX) for servers that do not have it.\r\n- Alt switches between the phone cursor and game controls while the phone stays open.\r\n- Buzz: server-wide feed, likes, delete own posts, new posts posted to in-game chat (`Config.Buzz.ToChat`).\r\n- Dark Chat: anonymous channels with handles and optional password.\r\n- Settings: wallpapers (preset, photo, upload from PC or image link), ringtones, notification sounds, keyboard-only mode.\r\n- Optional phone item (`Config.UseItem`), Thai \u002F English (`Config.Locale`).\r\n- Editable adapters in `addons\u002F`: notify, voice, banking, upload, message filter, log.",{"slug":23,"version":55,"latest_version":55,"files":96,"options":60},[97],{"path":98,"content":99},"config\u002Fconfig.lua","Config = Config or {}\n\n-- ===== ทั่วไป \u002F General =====\n\n-- ภาษา: 'th' หรือ 'en' \u002F Language: 'th' or 'en'\nConfig.Locale = 'th'\n\n-- พิมพ์ log ลง console ของเซิร์ฟ \u002F Print logs to the server console\nConfig.Debug = false\n\n-- เฟรมเวิร์ก: 'auto' (ใช้ ESX ถ้ามี ไม่มีก็ standalone) · 'esx' · 'standalone' \u002F Framework: 'auto' (ESX if present, else standalone) · 'esx' · 'standalone'\nConfig.Framework = 'auto'\n\n-- ปุ่มเปิดโทรศัพท์ (ผู้เล่นเปลี่ยนเองได้ใน Settings > Key Bindings > FiveM) \u002F Key that opens the phone (players can rebind it in Settings > Key Bindings > FiveM)\nConfig.OpenKey = 'F1'\n\n-- ===== ไอเทมโทรศัพท์ \u002F Phone item =====\n\n-- true = ต้องมีไอเทมโทรศัพท์ในกระเป๋า: เปิดโทรศัพท์ โทร รับสาย รับแจ้งเตือน SMS\n-- (กดใช้ไอเทมก็เปิดได้ · ไม่มีไอเทมในเซิร์ฟ? รัน optional\u002Fphone_item.sql)\n-- true = a phone item is required in the inventory: to open the phone, call, answer and get SMS alerts\n-- (using the item opens it too · no item on your server? run optional\u002Fphone_item.sql)\nConfig.UseItem = true\n-- ชื่อไอเทมโทรศัพท์ \u002F Name of the phone item\nConfig.PhoneItem = 'phone'\n\n-- ===== การโทร \u002F Calls =====\n\n-- โทรด้วยเสียงผ่าน pma-voice (ไม่ได้ลง pma-voice = โทรติดแต่ไม่มีเสียง) \u002F Voice calls through pma-voice (without pma-voice calls connect but carry no audio)\nConfig.UseVoice = true\n-- เลขช่องเสียงแรกที่ใช้กับการโทร เปลี่ยนเมื่อชนกับสคริปต์อื่น \u002F First voice channel number used for calls, change it if it clashes with another script\nConfig.CallChannelStart = 1000\n\n-- วินาทีก่อนสายที่ไม่มีคนรับจะตัดเป็นสายที่ไม่ได้รับ \u002F Seconds before an unanswered call ends as a missed call\nConfig.CallTimeout = 30\n\n-- ===== ข้อความ \u002F Messages =====\n\n-- ความยาวสูงสุดของ SMS \u002F ข้อความ Dark Chat \u002F Longest SMS \u002F Dark Chat message\nConfig.MaxMessageLength = 500\n\n-- ===== Buzz และการ์ดโพสต์ \u002F Buzz and post cards =====\n\n-- Buzz (แอปโซเชียลฟีดทั้งเซิร์ฟ) และการ์ดโพสต์ในแชท \u002F Buzz (the server-wide social feed app) and its post cards in chat\nConfig.Buzz = {\n    -- โพสต์ใหม่เด้งขึ้นแชทในเกมของทุกคน (ใช้ chat มาตรฐานของ FiveM) \u002F New posts pop up in everyone's in-game chat (uses FiveM's standard chat)\n    ToChat = true,\n    -- สกินการ์ดโพสต์ที่เปิดให้ใช้: default, halloween, christmas, songkran, night \u002F Post card skins you allow: default, halloween, christmas, songkran, night\n    Themes = { 'default', 'halloween', 'christmas', 'songkran', 'night' },\n    -- สกินที่ใช้เมื่อผู้เล่นยังไม่ได้เลือก หรือเมื่อ PlayerTheme = false \u002F Skin used when a player has not chosen, or when PlayerTheme = false\n    DefaultTheme = 'default',\n    -- true = ผู้เล่นเลือกสกินเองได้ในแอปตั้งค่า · false = ทุกคนใช้ DefaultTheme (เช่น ช่วงเทศกาล) \u002F true = players pick their own skin in Settings · false = everyone uses DefaultTheme (e.g. during a festival)\n    PlayerTheme = true,\n}\n\n-- ===== รูปจากภายนอก \u002F External images =====\n\n-- ลิงก์รูปจากเว็บอื่นที่ผู้เล่นวางเองได้ (SMS, โพสต์ Buzz, วอลเปเปอร์) (รูปที่ถ่าย\u002Fอัปโหลดในเกมผ่านเสมอ) · ว่าง {} = ปิดลิงก์ภายนอก\n-- ลิงก์ cdn.discordapp.com หมดอายุภายในประมาณ 24 ชม. ถ้าเปิดจากนอก Discord จึงไม่ได้ใส่ไว้\n-- Image hosts players may paste links from (SMS, Buzz posts, wallpapers); photos taken or uploaded in game always pass · empty {} = external links off\n-- cdn.discordapp.com links expire in about 24 h when opened outside Discord, so it is not listed\n-- เช่น \u002F e.g. 'https:\u002F\u002Fi.imgur.com\u002F'\nConfig.ImageHosts = {\n    'https:\u002F\u002Fi.imgur.com\u002F',\n    'https:\u002F\u002Fi.ibb.co\u002F',\n}\n\n-- true = รับลิงก์ https จากเว็บไหนก็ได้\n-- คำเตือน: เจ้าของเว็บรูปจะเห็น IP ของทุกคนที่เปิดดูรูปนั้น และคุมรูปที่ขึ้นไม่ได้\n-- true = accept https links from any site\n-- Warning: the image host sees the IP of everyone who opens the image, and you cannot control what it shows\nConfig.AnyImageHost = false\n\n-- ===== ธนาคารมือถือ \u002F Mobile banking =====\n\n-- ธนาคารมือถือ: ดูยอดเงินและโอนเข้าบัญชีธนาคารของเจ้าของเบอร์ที่ออนไลน์อยู่\n-- ใช้ระบบธนาคารอื่น? แก้ addons\u002Fbanking\u002Fserver.lua\n-- Mobile banking: see the balance and transfer to the bank account of an online number's owner\n-- Using another banking system? Edit addons\u002Fbanking\u002Fserver.lua\nConfig.Banking = {\n    -- แสดงแอปธนาคาร \u002F Show the Banking app\n    Enabled = true,\n    -- ยอดโอนต่ำสุด \u002F Smallest transfer\n    MinTransfer = 1,\n    -- ยอดโอนสูงสุดต่อครั้ง \u002F Largest transfer\n    MaxTransfer = 1000000,\n}\n\n-- ===== เบอร์หน่วยงาน \u002F Service numbers =====\n\n-- เบอร์หน่วยงาน: ส่ง SMS เข้าเบอร์นี้ = ทุกคนที่มีอาชีพนั้น (ออนไลน์ + มีโทรศัพท์) ได้รับพร้อมพิกัดผู้ส่ง ตอบกลับหาผู้ส่งได้เลย\n-- ขึ้นเป็นรายชื่อพิเศษในแอปรายชื่อของทุกคน\n-- (สคริปต์อาชีพเพิ่ม\u002Fลบเบอร์เองได้ผ่าน event x3d_phone:registerNumber \u002F x3d_phone:removeNumber\n--  และ TriggerServerEvent('x3d_phone:send', ...) — ดู docs.th.md \u002F docs.en.md)\n-- Service numbers: a text to one of these reaches everyone with that job (online and with a phone), with the sender's location, and they can reply to the sender\n-- They show up as special contacts for everyone\n-- (job scripts can add \u002F remove numbers through the events x3d_phone:registerNumber \u002F x3d_phone:removeNumber\n--  and TriggerServerEvent('x3d_phone:send', ...) — see docs.th.md \u002F docs.en.md)\nConfig.Dispatch = {\n    -- true = ส่งถึงเฉพาะคนที่เข้าเวรอยู่ (job.onDuty ของ ESX Legacy) \u002F true = deliver only to players on duty (ESX Legacy job.onDuty)\n    OnDutyOnly = false,\n    -- แจ้งเหตุค้างในแอป Dispatch ได้กี่วินาที \u002F How many seconds a call stays in the Dispatch app\n    AlertSeconds = 600,\n    -- true = คนที่กดเรียก (เช่นปุ่มเรียกหมอตอนล้ม) ต้องมีไอเทมโทรศัพท์ด้วย \u002F true = the caller (e.g. a \"call EMS\" button when down) must also have the phone item\n    CallNeedsPhone = false,\n    -- request = หัวข้อแจ้งเหตุเวลามีคนกดเรียก · blip = { sprite, color } จุดบนแผนที่ของเจ้าหน้าที่\n    -- request = the call title when someone presses call · blip = { sprite, color } the responders' map blip\n    -- เช่น \u002F e.g. police = { label = 'ตำรวจ', jobs = { 'police' }, coords = true }\n    Numbers = {\n        police    = { label = 'ตำรวจ', jobs = { 'police' }, coords = true, request = 'ขอความช่วยเหลือจากตำรวจ', blip = { sprite = 60, color = 29 } },\n        ambulance = { label = 'โรงพยาบาล', jobs = { 'ambulance' }, coords = true, request = 'มีผู้บาดเจ็บ ต้องการหมอ', blip = { sprite = 153, color = 1 } },\n        mechanic  = { label = 'ช่างซ่อมรถ', jobs = { 'mechanic' }, coords = true, request = 'ขอช่างซ่อมรถ', blip = { sprite = 446, color = 47 } },\n    },\n}\n\n-- ===== แอปบิล \u002F Bills app =====\n\n-- แอปบิล: ออกบิลให้เบอร์โทร ผู้รับกดจ่ายในโทรศัพท์ \u002F Bills app: bill a phone number, the recipient pays in the phone\nConfig.Billing = {\n    -- แสดงแอปบิล \u002F Show the Bills app\n    Enabled = true,\n    -- ออกบิลส่วนตัวได้ไหม (เงินเข้าบัญชีธนาคารของคนออกบิล) \u002F Allow personal bills (the money goes to the biller's bank account)\n    AllowPersonal = true,\n    -- ผู้รับกดปฏิเสธบิลได้ไหม (false = ต้องจ่ายอย่างเดียว คนออกบิลยกเลิกได้) \u002F Can the recipient decline (false = pay only, the biller can still cancel)\n    AllowDecline = true,\n    -- ยอดบิลต่ำสุด \u002F Smallest bill\n    MinAmount = 1,\n    -- ยอดบิลสูงสุด \u002F Largest bill\n    MaxAmount = 1000000,\n    -- บิลค้างสูงสุดจากคนออกบิลหนึ่งคนถึงเบอร์เดียว (กันสแปม) \u002F Most open bills from one biller to one number (anti-spam)\n    MaxOpenPerTarget = 10,\n    -- จ่ายจากบัญชีไหนของผู้จ่าย: 'bank' หรือ 'money' \u002F Which account the payer pays from: 'bank' or 'money'\n    PayFrom = 'bank',\n    -- ตารางผู้เล่นของ ESX (ใช้ตอนเงินบิลส่วนตัวเข้าบัญชีคนออกบิลที่ออฟไลน์อยู่ โหมด esx เท่านั้น) \u002F ESX players table (used to credit an offline biller for personal bills, esx mode only)\n    UsersTable = 'users',\n    -- อาชีพที่ออกบิลในนามหน่วยงานได้ (ค่าเริ่มต้นไม่มีบัญชีหน่วยงานให้ — Billing.PaySociety คืน false เสมอ\n    -- ผู้จ่ายไม่ถูกหักเงิน บิลค้างเหมือนเดิม — ต่อระบบบัญชีหน่วยงานของคุณเองที่ addons\u002Fbilling\u002Fserver.lua)\n    -- Jobs that can bill on behalf of the business (no society account is provided by default — Billing.PaySociety always returns false,\n    -- so the payer is not charged and the bill stays unpaid — wire your own society account in addons\u002Fbilling\u002Fserver.lua)\n    -- locked = true: บิลในนามหน่วยงานนี้ คนออกบิลยกเลิกไม่ได้ ผู้รับปฏิเสธไม่ได้ ต้องจ่าย หรือให้แอดมินยกเลิกจากแผง x3d_adminpanel\n    -- locked = true: bills in this job's name cannot be cancelled by the biller or declined by the recipient; only an admin can cancel them in x3d_adminpanel\n    -- เช่น \u002F e.g. police = { label = 'ตำรวจ', minGrade = 0, locked = true }\n    Jobs = {\n        police    = { label = 'ตำรวจ', minGrade = 0, locked = true },\n        ambulance = { label = 'โรงพยาบาล', minGrade = 0, locked = true },\n        mechanic  = { label = 'อู่ซ่อมรถ', minGrade = 0 },\n        taxi      = { label = 'แท็กซี่', minGrade = 0 },\n    },\n    -- แอดมินออกบิลในนาม \"แอดมิน\" ได้ (เช่น ค่าปรับ) เงินที่จ่ายส่งไป Billing.PayAdmin ใน addons\u002Fbilling\u002Fserver.lua (ค่าเริ่มต้น: หายไปจากระบบ)\n    -- Admins can bill as \"admin\" (e.g. fines); the payment goes to Billing.PayAdmin in addons\u002Fbilling\u002Fserver.lua (default: removed from the economy)\n    -- groups = กลุ่มที่นับเป็นแอดมิน \u002F groups that count as admin · locked = เหมือนของหน่วยงาน \u002F same as the job flag above\n    Admin = { enabled = true, label = 'แอดมิน', groups = { 'admin', 'superadmin' }, locked = true },\n}\n\n-- ===== กล้องและอัปโหลดรูป \u002F Camera and photo uploads =====\n\n-- กล้องและอัปโหลดรูป: เก็บรูปไว้ในเซิร์ฟเวอร์เอง (โฟลเดอร์ data\u002Fuploads\u002F) ไม่ต้องใช้บริการฝากรูป\n-- กล้องต้องมี screenshot-basic · อัปโหลดจากคอมพิวเตอร์ (วอลเปเปอร์) ใช้ได้เลย\n-- Camera and photo uploads: photos are stored on your own server (the data\u002Fuploads\u002F folder), no image host needed\n-- The camera needs screenshot-basic · uploading from a computer (wallpapers) works as is\nConfig.Uploads = {\n    -- เปิดกล้องและการอัปโหลด \u002F Turn the camera and uploads on\n    Enabled = true,\n    -- ว่าง = ผู้เล่นแต่ละคนเปิดรูปผ่านที่อยู่เซิร์ฟที่ตัวเองต่ออยู่ ไม่ต้องตั้งอะไร\n    -- ตั้งเองเมื่ออยากได้ลิงก์ตายตัว เช่นมีโดเมน https: 'https:\u002F\u002Fimg.myserver.com\u002Fx3d_phone'\n    -- (รูปจะขึ้นในการ์ดทวีตในแชทได้เฉพาะเมื่อ BaseUrl เป็น https)\n    -- Empty = each player opens photos through the server address they connected to, nothing to set\n    -- Set it when you want a fixed link, e.g. with an https domain: 'https:\u002F\u002Fimg.myserver.com\u002Fx3d_phone'\n    -- (photos show in chat post cards only when BaseUrl is https)\n    BaseUrl = '',\n    -- ขนาดไฟล์สูงสุดต่อรูป (ไบต์) \u002F Largest file size per photo (bytes)\n    MaxBytes = 3 * 1024 * 1024,\n    -- ผู้เล่นหนึ่งคนอัปโหลดได้กี่รูปต่อชั่วโมง \u002F How many photos one player can upload per hour\n    PerPlayerPerHour = 30,\n    -- เก็บรูปล่าสุดกี่รูป เกินแล้ววนทับรูปเก่าสุด (ลิงก์รูปเก่านั้นจะเปิดไม่ได้) \u002F How many latest photos to keep; beyond that the oldest is overwritten (its link stops working)\n    Keep = 1000,\n    -- คุณภาพ JPG ตอนถ่ายรูป (0-1) \u002F JPG quality when taking a photo (0-1)\n    Quality = 0.85,\n}\n\n-- ===== วอลเปเปอร์ \u002F Wallpapers =====\n\n-- วอลเปเปอร์ที่ผู้เล่นเลือกได้ (เซิร์ฟเวอร์ใช้ตรวจค่าที่เลือก เพิ่มตัวเลือกใหม่ต้องแก้หน้าเว็บของโทรศัพท์ด้วย) \u002F Wallpapers players can pick (the server validates against this list; adding a new one also needs the phone web UI edited)\n-- เช่น \u002F e.g. { id = 'default', name = 'Default', file = 'default.jpg' }\nConfig.Wallpapers = {\n    { id = 'default', name = 'Default', file = 'default.jpg' },\n    { id = 'gradient-blue', name = 'Blue Gradient', file = 'gradient-blue.jpg' },\n    { id = 'gradient-purple', name = 'Purple Gradient', file = 'gradient-purple.jpg' },\n    { id = 'gradient-sunset', name = 'Sunset', file = 'gradient-sunset.jpg' },\n    { id = 'abstract-1', name = 'Abstract 1', file = 'abstract-1.jpg' },\n    { id = 'abstract-2', name = 'Abstract 2', file = 'abstract-2.jpg' },\n    { id = 'city-night', name = 'City Night', file = 'city-night.jpg' },\n    { id = 'nature-1', name = 'Nature', file = 'nature-1.jpg' },\n}\n\n-- ===== เสียง \u002F Sounds =====\n\n-- เสียงเรียกเข้า: แต่ละตัวชี้ไปที่เสียงในเกม GTA V \u002F Ringtones: each one points to a GTA V in-game sound\n-- เช่น \u002F e.g. { id = 'default', name = 'Default', nativeSound = 'Remote_Ring', nativeSoundset = 'Phone_SoundSet_Default' }\nConfig.Ringtones = {\n    { id = 'default', name = 'Default', nativeSound = 'Remote_Ring', nativeSoundset = 'Phone_SoundSet_Default' },\n    { id = 'classic', name = 'Classic', nativeSound = '5_Second_Timer', nativeSoundset = 'HUD_MINI_GAME_SOUNDSET' },\n    { id = 'modern', name = 'Modern', nativeSound = 'CONFIRM_BEEP', nativeSoundset = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },\n    { id = 'subtle', name = 'Subtle', nativeSound = 'Pre_Release_Tone', nativeSoundset = 'Phone_SoundSet_Default' },\n    { id = 'loud', name = 'Loud', nativeSound = 'Vibrate_Loop', nativeSoundset = 'Phone_SoundSet_Default' },\n}\n\n-- \u002Ftestringtone กับ \u002Ftestdialtone เล่นกี่มิลลิวินาทีก่อนหยุดเอง \u002F How many milliseconds \u002Ftestringtone and \u002Ftestdialtone play before stopping\nConfig.RingtonePreviewMs = 3000\n\n-- เสียงแจ้งเตือนข้อความ \u002F Message notification sounds\n-- เช่น \u002F e.g. { id = 'default', name = 'Default', nativeSound = 'Text_Arrive_Tone', nativeSoundset = 'Phone_SoundSet_Default' }\nConfig.NotificationSounds = {\n    { id = 'default', name = 'Default', nativeSound = 'Text_Arrive_Tone', nativeSoundset = 'Phone_SoundSet_Default' },\n    { id = 'chime', name = 'Chime', nativeSound = 'CHECKPOINT_PERFECT', nativeSoundset = 'HUD_MINI_GAME_SOUNDSET' },\n    { id = 'ding', name = 'Ding', nativeSound = 'SELECT', nativeSoundset = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },\n}\n\n-- ===== รายชื่อเริ่มต้น \u002F Default contacts =====\n\n-- รายชื่อที่ใส่ให้ทุกเบอร์ใหม่อัตโนมัติ \u002F Contacts added automatically to every new number\n-- เช่น \u002F e.g. { phone = '911', name = 'Police' }\nConfig.DefaultContacts = {\n    -- { phone = '911', name = 'Police' },\n}\n",1792316307832]