เอกสาร

X3D Phone (โทรศัพท์)

โทรศัพท์มือถือฟรีสำหรับ ESX: โทรผ่าน pma-voice, SMS แชร์ตำแหน่ง, ธนาคารมือถือ, กล้องถ่ายรูปเก็บในเซิร์ฟเอง, Buzz และ Dark Chat

ซื้อ / รับฟรีตั้งค่า config

การติดตั้ง

  1. แตกไฟล์ วางโฟลเดอร์ x3d_phone ไว้ใน resources/ ห้ามเปลี่ยนชื่อโฟลเดอร์ เพราะ export และ event ทุกตัวใช้ชื่อนี้
  2. รัน install.sql บนฐานข้อมูลของเซิร์ฟ (รันซ้ำได้ ข้อมูลเดิมไม่หาย)
  3. ถ้าเซิร์ฟยังไม่มีไอเทม phone ให้รัน optional/phone_item.sql (ถ้าใช้ ox_inventory ให้เพิ่มใน ox_inventory/data/items.lua แทน มีตัวอย่างอยู่ในไฟล์นั้น)
  4. ถ้าเซิร์ฟยังไม่มี screenshot-basic ให้ย้าย optional/screenshot-basic/ ออกไปไว้ใน resources/ (ไม่ลงก็ได้ แค่ใช้กล้องไม่ได้)
  5. เพิ่มใน server.cfg ตามลำดับนี้:
ensure oxmysql
ensure es_extended
ensure pma-voice
ensure screenshot-basic
ensure x3d_phone

ผู้เล่นเปิดโทรศัพท์ด้วย F1, คำสั่ง /openphone หรือกดใช้ไอเทม phone ระหว่างเปิดโทรศัพท์ กด Alt เพื่อสลับไปบังคับตัวละคร แล้วกดอีกครั้งเพื่อกลับมาใช้เมาส์

ต้องมี

resource จำเป็นไหม ใช้ทำอะไร
es_extended ไม่บังคับ ESX Legacy ถ้าไม่มีจะรันแบบ standalone ซึ่งต้องต่อบัญชีธนาคารและระบบบิลเองที่ addons/ (ดู Config.Framework)
oxmysql จำเป็น ฐานข้อมูล
pma-voice ไม่บังคับ เสียงตอนโทร ถ้าไม่มี สายยังต่อติดแต่ไม่มีเสียง
screenshot-basic ไม่บังคับ กล้องถ่ายรูป มีแนบมาให้ใน optional/
chat (ของ FiveM) ไม่บังคับ การ์ดโพสต์ในแชท

ไม่ต้องสมัครเว็บฝากรูป ไม่ต้องใช้ API key และไม่ต้องลงโปรแกรมอื่นเพิ่ม


ตั้งค่าทั้งหมด: config/config.lua

ทั่วไป

ค่า ค่าเริ่มต้น ความหมาย
Config.Locale 'th' ภาษาในโทรศัพท์และข้อความแจ้งเตือน: 'th' หรือ 'en'
Config.Framework 'auto' 'auto' (มี ESX ใช้ ESX ไม่มีเป็น standalone) | 'esx' | 'standalone'
Config.Debug false true = พิมพ์ log ลง console ของเซิร์ฟ
Config.OpenKey 'F1' ปุ่มเปิดโทรศัพท์ ผู้เล่นเปลี่ยนเองได้ใน Settings > Key Bindings > FiveM (ค่านี้มีผลกับผู้เล่นที่เข้าเซิร์ฟครั้งแรกเท่านั้น)
Config.DefaultContacts {} รายชื่อที่ใส่ให้ทุกเบอร์ใหม่ เช่น { phone = '911', name = 'Police' }

ไอเทมโทรศัพท์

ค่า ค่าเริ่มต้น ความหมาย
Config.UseItem true ต้องมีไอเทมในกระเป๋าถึงจะเปิดโทรศัพท์, โทรออก, รับสาย และได้แจ้งเตือน SMS
Config.PhoneItem 'phone' ชื่อไอเทม ใช้ชื่อที่เซิร์ฟมีอยู่แล้วได้ เช่น 'iphone'

เมื่อเปิด UseItem:

  • ไม่มีไอเทม = เปิดโทรศัพท์ไม่ได้ ทุก callback ฝั่งเซิร์ฟเวอร์ปฏิเสธ (ยิง event เองก็ไม่ผ่าน)
  • คนที่ไม่มีไอเทมจะไม่ได้รับสาย ฝั่งคนโทรเห็นว่าติดต่อไม่ได้ และระบบบันทึกเป็นสายที่ไม่ได้รับ
  • SMS ยังเก็บไว้ให้ แต่จะไม่เด้งแจ้งเตือนจนกว่าจะมีไอเทม
  • ถ้าไอเทมหายระหว่างเปิดอยู่ (ทิ้ง / โดนยึด) โทรศัพท์จะปิดและตัดสายทันที

การโทร

ค่า ค่าเริ่มต้น ความหมาย
Config.UseVoice true ใช้ pma-voice เป็นเสียงตอนโทร
Config.CallChannelStart 1000 เลขช่องเสียงของ pma-voice ที่เริ่มใช้สำหรับการโทร เปลี่ยนเฉพาะเมื่อชนกับสคริปต์อื่น
Config.CallTimeout 30 กี่วินาทีที่ไม่มีคนรับแล้วตัดสาย
Config.Ringtones 5 เสียง เสียงเรียกเข้า แต่ละตัวชี้ไปที่เสียงในเกม GTA V
Config.NotificationSounds 3 เสียง เสียงแจ้งเตือนข้อความ
Config.RingtonePreviewMs 3000 ความยาวเสียงตอนพิมพ์ /testringtone และ /testdialtone

Config.Ringtones, Config.NotificationSounds และ Config.Wallpapers เป็นรายการที่เซิร์ฟเวอร์ใช้ตรวจค่าที่ผู้เล่นเลือก ถ้าจะลบตัวเลือก ให้ลบจาก config ได้เลย แต่ถ้าจะเพิ่มตัวเลือกใหม่ ต้องแก้หน้าเว็บของโทรศัพท์ด้วย

ข้อความ

พิมพ์ emoji ได้ทุกช่อง (SMS, Buzz, Dark Chat) มีแผงเลือก emoji ครบทุกตัว แบ่งหมวดและค้นหาได้ ความยาวข้อความนับตามตัวอักษรจริง ภาษาไทยและ emoji จึงไม่ถูกนับเกิน

ค่า ค่าเริ่มต้น ความหมาย
Config.MaxMessageLength 500 ความยาวสูงสุดของ SMS และข้อความ Dark Chat

Buzz และสกินการ์ดโพสต์

ค่า ค่าเริ่มต้น ความหมาย
Config.Buzz.ToChat true โพสต์ใหม่เด้งขึ้นในแชทเกมของทุกคน
Config.Buzz.Themes ทั้ง 5 แบบ สกินที่เปิดให้ใช้: default, halloween, christmas, songkran, night
Config.Buzz.DefaultTheme 'default' สกินของคนที่ยังไม่ได้เลือก
Config.Buzz.PlayerTheme true true = ผู้เล่นเลือกสกินเองในแอปตั้งค่า · false = ทุกคนใช้ DefaultTheme

ตัวอย่าง: ล็อกทั้งเซิร์ฟเป็นฮาโลวีนช่วงเทศกาล:

Config.Buzz = {
    ToChat = true,
    Themes = { 'halloween' },
    DefaultTheme = 'halloween',
    PlayerTheme = false,
}

การ์ดโพสต์ใช้ chat มาตรฐานของ FiveM โดย x3d_phone โหลดสไตล์ของตัวเองเข้าไปผ่าน chat_theme แบบไม่ทับธีมแชทที่เซิร์ฟใช้อยู่ ข้อความในโพสต์ถูก escape ทุกครั้ง ผู้เล่นจึงแทรก HTML ลงในแชทไม่ได้

เบอร์หน่วยงาน (ตำรวจ / หมอ / ช่าง) และสคริปต์อาชีพ

ค่า ค่าเริ่มต้น ความหมาย
Config.Dispatch.Numbers police, ambulance, mechanic เบอร์หน่วยงาน: เบอร์ = { label = 'ชื่อที่แสดง', jobs = { 'อาชีพ' }, coords = true }
Config.Dispatch.OnDutyOnly false true = ส่งถึงเฉพาะคนที่เข้าเวรอยู่ (job.onDuty ของ ESX Legacy)
  • เบอร์หน่วยงานขึ้นเป็นรายชื่อพิเศษในแอปรายชื่อของทุกคน แก้ไขและลบไม่ได้
  • ส่ง SMS เข้าเบอร์ police = ทุกคนที่มีอาชีพใน jobs (ออนไลน์และมีโทรศัพท์) ได้รับข้อความ [ตำรวจ] ... จากเบอร์ของผู้ส่งพร้อมพิกัด แตะพิกัดเพื่อปักหมุด GPS แล้วตอบกลับหาผู้ส่งได้ในแชทนั้นเลย
  • พิกัดมาจากตำแหน่งตัวละครฝั่งเซิร์ฟเวอร์ ปลอมไม่ได้ และส่งเข้าเบอร์หน่วยงานเดียวกันได้ 1 ครั้งทุก 20 วินาที
  • ถ้าไม่มีเจ้าหน้าที่ออนไลน์ ผู้ส่งจะได้แจ้งเตือน

เชื่อมกับสคริปต์อาชีพ: เบอร์ police, ambulance และ mechanic มีอยู่ใน config แล้ว สคริปต์อาชีพของคุณเพิ่มหรือลบเบอร์เองได้ด้วย event เหล่านี้

event ทำอะไร
TriggerEvent('x3d_phone:registerNumber', number, label, isDispatch, hasCoords) (server) เพิ่มเบอร์หน่วยงานจากสคริปต์อาชีพ (ถ้ามีเบอร์นี้แล้วจะไม่ทับ)
TriggerEvent('x3d_phone:removeNumber', number) (server) ลบเบอร์ที่ลงทะเบียนไว้ (เบอร์ใน config ลบไม่ได้)
TriggerServerEvent('x3d_phone:send', number, message, anonymous) สคริปต์ที่แจ้งตำรวจอัตโนมัติ (เช่น ระบบปล้น) ส่งข้อความเข้าเบอร์หน่วยงาน ถ้า anonymous = true จะขึ้นเป็นข้อความจากเบอร์หน่วยงานแทนเบอร์ผู้เล่น

สคริปต์อาชีพที่เรียก event ชื่อเดิมของ esx_phone (esx_phone:*) จะไม่ทำงานกับ x3d_phone ต้องเปลี่ยนไปเรียก event ข้างบน

แจ้งเหตุ (แอป Dispatch)

เจ้าหน้าที่ (คนที่มีอาชีพใน jobs) จะเห็นแอป แจ้งเหตุ ในโทรศัพท์ ทุกเคสมีหัวข้อ ข้อความ ระยะทาง เวลา และเบอร์ผู้แจ้ง พร้อมจุดกะพริบบนแผนที่ แจ้งเตือน และเสียง

  • รับเคส → ปักหมุด GPS ให้ ผู้แจ้งได้แจ้งเตือนว่า "หมอ X รับเคสแล้ว กำลังไปหาคุณ" และเจ้าหน้าที่คนอื่นเห็นว่ามีคนรับแล้ว
  • ปิดเคส → เคสหายจากทุกเครื่องและแผนที่ เคสที่ไม่มีใครปิดจะหายเองหลัง AlertSeconds
  • เคสเกิดจาก SMS ถึงเบอร์หน่วยงาน หรือจากสคริปต์อื่นเรียกหน่วยงาน
ค่า ค่าเริ่มต้น ความหมาย
Config.Dispatch.AlertSeconds 600 เคสค้างในแอปกี่วินาที
Config.Dispatch.CallNeedsPhone false คนที่กดเรียกต้องมีไอเทมโทรศัพท์ไหม (ปุ่มเรียกหมอตอนล้มไม่ควรต้องมี)
Numbers.<เบอร์>.request หัวข้อเคสเวลามีคนกดเรียก เช่น 'มีผู้บาดเจ็บ ต้องการหมอ'
Numbers.<เบอร์>.blip { sprite, color } ของจุดบนแผนที่เจ้าหน้าที่

ให้สคริปต์อื่นเรียกหน่วยงาน (เช่นปุ่ม "เรียกหมอ" ตอนล้ม):

-- client
exports['x3d_phone']:RequestService('ambulance', 'หมดสติกลางถนน')
-- หรือ
TriggerServerEvent('x3d_phone:requestService', 'ambulance', 'หมดสติกลางถนน')

-- server (กำหนดหัวข้อ/พิกัดเองได้)
exports['x3d_phone']:SendAlert('police', { source = src, title = 'ปล้นธนาคาร', message = 'Pacific Standard' })
exports['x3d_phone']:SendAlert('police', { coords = vector3(x, y, z), title = 'สัญญาณกันขโมยดัง' })

พิกัดของ RequestService อ่านจากตัวละครฝั่งเซิร์ฟเวอร์ ปลอมไม่ได้ และเรียกหน่วยงานเดียวกันได้ 1 ครั้งทุก 60 วินาที

แอปบิล

ค่า ค่าเริ่มต้น ความหมาย
Config.Billing.Enabled true แสดงแอปบิล
Config.Billing.AllowPersonal true ออกบิลส่วนตัวได้ เงินเข้าบัญชีธนาคารของคนออกบิล (ออฟไลน์อยู่ก็เข้า)
Config.Billing.AllowDecline true ผู้รับกดปฏิเสธบิลได้ ถ้า false ต้องจ่ายอย่างเดียว (คนออกบิลยังยกเลิกได้)
Config.Billing.MinAmount / MaxAmount 1 / 1000000 ยอดบิลต่ำสุด / สูงสุด
Config.Billing.MaxOpenPerTarget 10 บิลค้างสูงสุดจากคนออกบิลหนึ่งคนถึงเบอร์เดียว (กันสแปม)
Config.Billing.PayFrom 'bank' จ่ายจากบัญชีไหนของผู้จ่าย: 'bank' หรือ 'money'
Config.Billing.UsersTable 'users' ตารางผู้เล่นของ ESX ใช้ตอนเงินเข้าบัญชีคนออกบิลที่ออฟไลน์
Config.Billing.Jobs police, ambulance, mechanic, taxi อาชีพที่ออกบิลในนามหน่วยงานได้: ชื่ออาชีพ = { label = 'ชื่อที่แสดง', minGrade = 0, locked = true } · locked = true = คนออกบิลยกเลิกไม่ได้ ผู้รับปฏิเสธไม่ได้ ต้องจ่าย หรือแอดมินยกเลิกจากแผง x3d_adminpanel (ค่าเริ่มต้น: ตำรวจ หมอ)
Config.Billing.Admin { enabled = true, label = 'แอดมิน', groups = { 'admin', 'superadmin' }, locked = true } แอดมินออกบิลในนาม "แอดมิน" ได้ (เช่น ค่าปรับ) เงินส่งไป Billing.PayAdmin ที่ท้าย addons/billing/server.lua ค่าเริ่มต้นไม่เข้าบัญชีใคร

บิลในนามหน่วยงาน: ค่าเริ่มต้นไม่มีบัญชีหน่วยงานให้ (Billing.PaySociety คืน false) ผู้จ่ายจึงไม่ถูกหักเงิน และบิลค้างอยู่เหมือนเดิม ต่อบัญชีหน่วยงานของเซิร์ฟ (เช่น esx_addonaccount) ที่ addons/billing/server.lua ก่อนเปิดใช้บิลหน่วยงาน

  • ผู้รับได้แจ้งเตือนทันทีถ้าออนไลน์อยู่ ถ้าออฟไลน์ บิลรอในแอปจนกว่าจะเข้าเกม
  • จ่ายบิลได้ครั้งเดียว กดรัว ๆ ก็ไม่หักเงินซ้ำ
  • บิลที่ล็อกไว้ ยกเลิกได้ที่แผง x3d_adminpanel > โทรศัพท์ > บิลค้างจ่าย เท่านั้น (ค้นหาด้วยเบอร์หรือรายละเอียด กดค้างเพื่อยกเลิก มีประวัติการยกเลิก)
  • ออกบิลได้ 1 ครั้งทุก 5 วินาที รายละเอียดบิลผ่าน FilterMessage เหมือนข้อความอื่น

ให้สคริปต์อื่นออกบิล (server):

local ok, idOrError = exports['x3d_phone']:CreateBill(source, '48213', 500, 'ค่าปรับจอดในที่ห้าม', 'police')
-- issuer: 'personal', ชื่ออาชีพใน Config.Billing.Jobs (ผู้ออกบิลต้องมีอาชีพนั้นจริง) หรือ 'admin' (ต้องเป็นแอดมินตาม Config.Billing.Admin.groups)

รูปภาพ: กล้อง อัปโหลด และลิงก์จากภายนอก

ค่า ค่าเริ่มต้น ความหมาย
Config.Uploads.Enabled true เปิดกล้องและการอัปโหลดวอลเปเปอร์จากคอมพิวเตอร์
Config.Uploads.BaseUrl '' เว้นว่างได้ ดูคำอธิบายด้านล่าง
Config.Uploads.MaxBytes 3 MB ขนาดไฟล์สูงสุดต่อรูป (เพดานในตัวคือ 8 MB)
Config.Uploads.PerPlayerPerHour 30 ผู้เล่นหนึ่งคนอัปโหลดได้กี่รูปต่อชั่วโมง
Config.Uploads.Keep 1000 เก็บรูปล่าสุดกี่รูป เกินแล้ววนทับรูปเก่าที่สุด ลิงก์ของรูปที่ถูกทับจะเปิดไม่ได้
Config.Uploads.Quality 0.85 คุณภาพ JPG ตอนถ่ายรูป (0–1)
Config.ImageHosts imgur, ibb เว็บภายนอกที่ผู้เล่นวางลิงก์รูปได้ (ในแชท โพสต์ และวอลเปเปอร์) ใส่ {} เพื่อปิดลิงก์ภายนอก
Config.AnyImageHost false true = รับลิงก์ https จากทุกเว็บ

รูปเก็บไว้ที่ไหน: ที่ x3d_phone/data/uploads/ ในเครื่องเซิร์ฟ แล้วเปิดผ่านพอร์ตเกมของ FXServer เอง (30120) ไม่มีบริการภายนอก ประมาณการพื้นที่สูงสุดคือ Keep × MaxBytes (ค่าเริ่มต้นประมาณ 3 GB แต่รูปจากกล้องปกติไม่เกิน 400 KB)

BaseUrl: ถ้าเว้นว่าง ลิงก์รูปถูกเก็บเป็น /i/<token>.jpg แล้วเครื่องของผู้เล่นแต่ละคนเติมที่อยู่เซิร์ฟที่ตัวเองต่ออยู่ให้เอง ใช้ได้ทันทีโดยไม่ต้องตั้งอะไร ให้ตั้ง BaseUrl เฉพาะเมื่อ:

  • มีโดเมน https ชี้มาที่เซิร์ฟ (เช่นผ่าน reverse proxy) และอยากให้รูปที่ถ่ายขึ้นในการ์ดโพสต์ในแชทด้วย
  • ตัวอย่าง: BaseUrl = 'https://img.myserver.com/x3d_phone'

ทำไมไม่ใส่ cdn.discordapp.com เป็นค่าเริ่มต้น: ลิงก์ไฟล์ของ Discord หมดอายุภายในประมาณ 24 ชั่วโมงถ้าเปิดจากนอก Discord รูปจะหายไปในวันถัดไป

⚠️ AnyImageHost = true: เจ้าของเว็บรูปจะเห็น IP ของผู้เล่นทุกคนที่เปิดดูรูปนั้น และคุณคุมไม่ได้ว่ารูปที่ขึ้นคืออะไร แนะนำให้ใส่เฉพาะเว็บที่ไว้ใจใน ImageHosts แทน

ธนาคารมือถือ

ค่า ค่าเริ่มต้น ความหมาย
Config.Banking.Enabled true แสดงแอปธนาคาร
Config.Banking.MinTransfer 1 ยอดโอนต่ำสุด
Config.Banking.MaxTransfer 1000000 ยอดโอนสูงสุดต่อครั้ง

โอนได้เฉพาะเข้าเบอร์ของผู้เล่นที่ออนไลน์อยู่ ใช้บัญชี bank ของ ESX และเก็บประวัติในตาราง x3d_phone_bank_history ระบบกันกดโอนซ้อน (ขณะกำลังโอนอยู่จะโอนรายการใหม่ไม่ได้) และโอนได้ 1 ครั้งทุก 3 วินาที


ส่งสำเนาเข้า Discord

ใส่ใน server.cfg ลิงก์ webhook อยู่ฝั่งเซิร์ฟเวอร์เท่านั้น ผู้เล่นไม่เห็น

set x3d_phone_upload_webhook "https://discord.com/api/webhooks/..."
set x3d_phone_log_webhook    "https://discord.com/api/webhooks/..."
convar ส่งอะไร
x3d_phone_upload_webhook สำเนาทุกรูปที่ผู้เล่นถ่าย/อัปโหลด พร้อมชื่อ, server id, identifier และประเภท (messages / twitter / wallpaper)
x3d_phone_log_webhook log SMS, โพสต์, Dark Chat และการโอนเงิน (ไม่บังคับ)
  • ปิดการ @mention ทุกข้อความ ผู้เล่นที่ตั้งชื่อเป็น @everyone จะไม่ ping ห้อง
  • ส่งเป็นคิว 1 รายการทุก 1.5 วินาที เพื่อไม่ให้โดน Discord จำกัดความถี่ ถ้าค้างเกิน 20 รายการจะข้ามรายการใหม่
  • รูปจริงยังเก็บในเซิร์ฟ ลิงก์ในเกมจึงไม่หมดอายุ
  • รับเฉพาะลิงก์ที่หน้าตาเป็น webhook ของ Discord จริง

ปรับให้เข้ากับเซิร์ฟ: addons/

ไฟล์ในนี้แก้ได้อิสระ แต่ละไฟล์ทำงานได้ทันทีด้วยค่าเริ่มต้น

ไฟล์ ฟังก์ชัน ค่าเริ่มต้น
addons/notify/client.lua Notify(message, kind) esx_notify → ox_lib → ESX.ShowNotification
addons/voice/client.lua Voice.Enabled(), Voice.SetCallChannel(ch), Voice.SetMuted(bool) pma-voice (มีตัวอย่าง mumble-voip)
addons/upload/client.lua Upload.Screenshot(kind, cb), Upload.Target(kind, cb) screenshot-basic → เก็บในเซิร์ฟ
addons/framework/server.lua / client.lua ตัวเชื่อมเฟรมเวิร์ก (Framework.*) เหมือนกันทุกสินค้า X3D ESX ถ้ามี ไม่มีเป็น standalone
addons/billing/server.lua Billing.Charge, Billing.Refund, Billing.PaySociety, Billing.PayPerson, Billing.PayAdmin หัก/คืนเงินและเข้าบัญชีธนาคารคนออกบิลผ่าน Framework.* · PaySociety คืน false ต้องต่อเอง
addons/banking/server.lua Banking.GetBalances, Banking.Transfer, Banking.History บัญชี bank ของ ESX
addons/filter/server.lua FilterMessage(src, kind, message) บล็อกคำใน Config.BannedWords
addons/log/server.lua PhoneLog(src, kind, data), UploadCopy(p, file) Discord webhook จาก convar
addons/locale/shared.lua T(th, en) ตาม Config.Locale

ตัวอย่าง: ต่อกับระบบธนาคารของตัวเอง ให้แก้ Banking.Transfer ให้เรียกระบบนั้นแล้วคืนค่า true หรือ false, 'ข้อความ error' เซิร์ฟเวอร์ตรวจจำนวนเงิน ผู้รับ และความถี่ให้ก่อนแล้ว

ตัวอย่าง: ใส่คำต้องห้าม:

Config.BannedWords = { 'คำหยาบ1', 'badword' }

Exports (client)

exports['x3d_phone']:OpenPhone()
exports['x3d_phone']:ClosePhone()
exports['x3d_phone']:IsPhoneOpen()     --> boolean
exports['x3d_phone']:GetPhoneNumber()  --> string | nil
exports['x3d_phone']:IsInCall()        --> boolean
exports['x3d_phone']:GetCallData()     --> { phoneNumber, displayName, isOutgoing } | nil

คำสั่ง

คำสั่ง ทำอะไร
/openphone เปิด/ปิดโทรศัพท์
/testringtone ฟังเสียงเรียกเข้าที่เลือกไว้
/testnotification ฟังเสียงแจ้งเตือนที่เลือกไว้
/testdialtone ฟังเสียงรอสายตอนโทรออก

ปัญหาที่พบบ่อย

อาการ สาเหตุ / วิธีแก้
กด F1 แล้วขึ้นว่า "คุณไม่มีโทรศัพท์" Config.UseItem = true แต่ไม่มีไอเทมในกระเป๋า ให้ไอเทม phone หรือตั้ง UseItem = false
ไม่มีปุ่มกล้อง ยังไม่ได้ ensure screenshot-basic หรือ Config.Uploads.Enabled = false
ถ่ายรูปแล้วขึ้น upload_failed เช็ค console ถ้ามีข้อความ cannot write data/uploads/ ให้สร้างโฟลเดอร์ data/uploads/ ใน resource
โทรติดแต่ไม่มีเสียง ยังไม่ได้ลง pma-voice หรือ ensure หลัง x3d_phone
โพสต์ไม่ขึ้นในแชท Config.Buzz.ToChat = false หรือเซิร์ฟไม่ได้ใช้ resource chat ของ FiveM
วางลิงก์รูปแล้วส่งไม่ได้ เว็บนั้นไม่ได้อยู่ใน Config.ImageHosts หรือลิงก์ไม่ได้ขึ้นต้นด้วย https
ดูหน้าสินค้า