[{"data":1,"prerenderedAt":898},["ShallowReactive",2],{"site":3,"docs-slug-site":15,"docs-product-th-x3d-mailbox":21,"docs-products-th":90,"docs-html-th-x3d-mailbox":868},{"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":51,"latest_released_at":52,"published_at":53,"has_docs":54,"config":55,"rent_price_satang":56,"description_md":57,"docs_md":58,"seo_title":59,"seo_description":60,"media":61,"versions":75},"83c7d7cb-bde4-45e3-a552-d7e377e4dc5d","x3d-mailbox","X3D Mailbox (โค้ดรับของ)","กล่องจดหมายออฟไลน์พร้อมของแนบ + โค้ดรับของ \u002Fredeem ฟรี ไม่ต้องลงฐานข้อมูล — ส่งไอเทมและเงินให้ผู้เล่นที่ออฟไลน์ แยกแท็บจดหมาย\u002Fตู้นิรภัย ต่อได้ทุกเฟรมเวิร์ก",0,"none","public\u002Fproducts\u002Fx3d-mailbox\u002Fcover\u002F743a9e72c1ae8d6d.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-mailbox\u002Fcover\u002F743a9e72c1ae8d6d.jpg",[31],"gameplay",[33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"esx","free","mailbox","redeem code","standalone","กล่องจดหมาย","ของแนบ","ฟรี","รีดีมโค้ด","ส่งของออฟไลน์","โค้ดรับของ","กรอกโค้ดรับของ","จดหมายออฟไลน์","ส่งของให้คนออฟไลน์","โค้ดแจกของ","แจกของกิจกรรม","ของชดเชย","ไม่ต้องใช้ฐานข้อมูล","1.7.2","2026-10-12T17:22:30.892527Z","2026-09-19T19:05:39.140076Z",true,"public",null,"# กล่องจดหมายออฟไลน์ พร้อมของแนบ — ฟรี ไม่ต้องลงฐานข้อมูล\n\nผู้เล่นออกจากเกมไปแล้ว แต่ยังอยากได้ของรางวัลกิจกรรม ของชดเชย หรือข้อความจากแอดมิน — `x3d_mailbox` ให้ส่งจดหมายพร้อมของแนบรอไว้ได้ ผู้เล่นมาเปิดรับเองตอนไหนก็ได้ ผ่านแผง Nuxt 4 UI พร้อมใช้ ต่อกับเฟรมเวิร์กไหนก็ได้ผ่านไฟล์ adapter\n\n---\n\n## ฟีเจอร์\n\n- [+] ตั้งค่าง่าย ปรับได้หมดใน config หรือตั้งผ่านเว็บได้เลย\n- [+] ส่งจดหมายพร้อมของแนบให้คนออฟไลน์ หรือทุกคนในเมืองได้\n- [+] แนบไอเทมหลายชิ้น และเงินเขียว เงินแดง ธนาคาร ในฉบับเดียว\n- [+] ตั้งวันหมดอายุจดหมายได้ มีเตือนสีแดง ตั้งอายุเริ่มต้นเองได้\n- [+] แยกแท็บจดหมาย \u002F ตู้นิรภัย นับ unread แยกกัน\n- [+] โค้ดรับของ \u002Fredeem จำกัดจำนวนครั้ง คนละครั้ง ตั้งวันหมดอายุได้\n- [+] กระเป๋าเต็มของก็ไม่หาย เพราะไปรออยู่ในจดหมาย\n- [+] กดรับทั้งหมดในคลิกเดียว กันรับซ้ำ กันสแปมรับของ\n- [+] แจ้งจำนวนจดหมายค้างตอนเข้าเกม\n- [+] เก็บเป็นไฟล์ JSON ไม่ต้องลงฐานข้อมูล หรือสลับเป็น MySQL ได้\n- [+] ย้ายมาจากกล่องจดหมายเจ้าอื่นง่าย SendMail รับรูปแบบเดิม\n- [+] เขียนเชื่อมกับสคริปต์อื่นได้ที่ addons\u002F\n\n---\n\n## ส่งของแนบได้ทั้งไอเทมและเงิน\n\n`SendMail`\u002F`SendMailAll` แนบไอเทมหลายชิ้น เงินหลายบัญชี (`money`, `bank`, `black_money`, หรือบัญชีอื่นของเฟรมเวิร์กคุณ) ในจดหมายฉบับเดียวได้ ตั้งวันหมดอายุได้ ตั้งชื่อผู้ส่งเองได้\n\nย้ายมาจากกล่องจดหมายตัวอื่น? `SendMail` รับรูปแบบที่กล่องจดหมายเจ้าอื่นใช้ด้วย (`subject`, `cash`\u002F`bank`, `items = {{ name, count }}`, `expiresInDays`) แค่เปลี่ยนชื่อ export ก็ย้ายได้เลย\n\n## ต่อกับเฟรมเวิร์กไหนก็ได้\n\n4 ไฟล์ใน `addons\u002F` — framework, notify, reward, storage — ค่าเริ่มต้นทำงานกับ ESX ได้ทันที ไม่มี ESX ก็ยังทำงานแบบ standalone ได้ (ace เท่านั้น) มีตัวอย่าง QBCore \u002F ox_lib คอมเมนต์ไว้ให้คัดลอกทับ\n\n## ไม่ต้องลงฐานข้อมูล\n\nเก็บข้อมูลเป็นไฟล์ JSON ในตัว resource เอง โหลดครั้งเดียว flush ทุก 30 วินาทีและตอนผู้เล่นออก\u002Fresource หยุดแบบปกติ — เซิร์ฟเวอร์ล่มกลางคันตรง ๆ ไม่ได้เสียของแนบ ความเสี่ยงจริงคือตรงข้าม: จดหมายที่ถูกรับในช่วง flush ล่าสุดที่ยังไม่ทัน (≤30 วินาที) ของแนบจ่ายผ่านเฟรมเวิร์กไปแล้ว แต่ธง `claimed` บนดิสก์ยังตามไม่ทัน รีสตาร์ทแล้วจดหมายฉบับเดิมอาจถูกรับซ้ำจ่ายซ้ำได้ อยากได้ MySQL สำหรับเซิร์ฟเวอร์ใหญ่? ตั้ง `Config.Storage.Driver = 'oxmysql'` ก็เก็บลงตาราง `x3d_mailbox` ให้เอง สร้างตารางอัตโนมัติ ไม่ต้อง include `@oxmysql`\n\n## รับซ้ำไม่ได้ ของพังไม่ล็อกผู้เล่นค้าง\n\nธงรับของถูกเขียนลง storage ก่อนจ่ายของทุกครั้ง event รับซ้ำที่มาพร้อมกันไม่มีทางจ่ายสองรอบ ถ้าไอเทมพิมพ์ผิดจนจ่ายของพัง จดหมายก็ยังถูกทำเครื่องหมายว่ารับแล้ว ไม่ค้างให้กดซ้ำได้ไม่รู้จบ จำนวนของแนบถูกปัดเป็นจำนวนเต็มก่อนเสมอ เพดานจำนวนจดหมายไม่มีวันลบฉบับที่ยังไม่ได้รับของทิ้ง\n\n## โค้ดรับของ (Redeem Code) ในตัว\n\nแจกโค้ดต้อนรับ โค้ดกิจกรรม หรือโค้ดชดเชยได้เลยโดยไม่ต้องลงสคริปอื่น ผู้เล่นพิมพ์ `\u002Fredeem \u003Cโค้ด>` หรือกรอกโค้ดในช่องบนพาเนลกล่องจดหมาย ของรางวัลทั้งไอเทมและเงินจะ**ส่งเป็นจดหมาย**เข้ากล่อง กระเป๋าเต็มก็ไม่หาย และเลือกให้ส่งเข้าแท็บตู้นิรภัยแทนได้\n\n- ตั้งโค้ดถาวรใน `Config.Codes`: จำกัดจำนวนครั้งทั้งเซิร์ฟ (`maxUses`) หนึ่งครั้งต่อคน (`oncePerPlayer`) และวันหมดอายุ (`expires`)\n- สร้างโค้ดชั่วคราวจากสคริปอื่นผ่าน export (`AddCode`, `RemoveCode`, `GetCodeUsage`) เช่นโค้ดไลฟ์สตรีมหรือโค้ดอีเวนต์\n- ยอดใช้โค้ดอยู่ครบหลังรีสตาร์ท และ `\u002Fredeem` ใช้ throttle กับล็อกเดียวกับการกดรับของ สแปมรัว ๆ ก็ได้ของครั้งเดียว\n\n## ต้องมี\n\nไม่มี · ไม่ต้องใช้ฐานข้อมูล ไม่ต้องใช้เฟรมเวิร์ก ไม่มีไลเซนส์ · วางแล้ว `ensure` ได้เลย\n\n**ฟรี** · แก้โค้ดได้ตามใจ · ขอแค่อย่านำไปขายต่อและอย่าอัปโหลดใหม่ในชื่อตัวเอง\n","## การติดตั้ง\n\n1. แตกไฟล์แล้ว **เปลี่ยนชื่อโฟลเดอร์เป็น `x3d_mailbox`** (สคริปต์อื่นเรียก export ด้วยชื่อนี้)\n2. วางใน `resources\u002F`\n3. เพิ่มใน `server.cfg`:\n\n```\nensure x3d_mailbox\n```\n\nเสร็จแล้ว — เก็บข้อมูลเป็นไฟล์ `data\u002Fmailbox.json` ในตัว resource เอง ไม่ต้องรัน SQL ใด ๆ\n\nผู้เล่นเปิดกล่องจดหมายด้วย `\u002Fmailbox` หรือปุ่ม **F7** (`Config.Key`, ว่าง = ไม่ผูกปุ่ม)\n\nในพาเนล: สองแท็บ **จดหมาย** (หมดอายุได้) กับ **ตู้นิรภัย** (ช่องที่สอง แยกนับ unread\u002Fรับทั้งหมดกันคนละกล่อง — ใช้ส่งของจากโค้ดรับของได้), กดรับทีละฉบับหรือ **รับทั้งหมด** ในคลิกเดียว (เฉพาะแท็บที่เปิดอยู่), **ลบ** จดหมายที่รับของแล้ว, นับถอยหลังเวลาหมดอายุ, แลกโค้ดผ่านช่องกรอกในพาเนล และเด้งแจ้งเตือนทันทีถ้าผู้เล่นออนไลน์อยู่ตอนได้จดหมายใหม่\n\nไม่ต้องใช้ฐานข้อมูล ไม่ต้องใช้เฟรมเวิร์ก ไม่มีไลเซนส์ · ทำงานกับ ESX ได้ทันที และทำงานแบบ standalone ได้ถ้าไม่มีเฟรมเวิร์ก\n\n## ต่อกับเฟรมเวิร์ก — 4 adapter ใน `addons\u002F`\n\n| โฟลเดอร์ | หน้าที่ |\n|---|---|\n| `addons\u002Fframework\u002F` | `Framework.IsBusy()` (client) — เปิดกล่องจดหมายตอนนี้ไม่ได้ไหม (ตาย\u002Fpause menu); `Framework.Identifier(src)` \u002F `Framework.IsAdmin(src)` (server) — คีย์ถาวรของผู้เล่นและสิทธิ์แอดมิน |\n| `addons\u002Fnotify\u002F` | `Notify(message, kind)` (client) — การแจ้งเตือน |\n| `addons\u002Freward\u002F` | `Reward.CanCarry` \u002F `Reward.GiveItem` \u002F `Reward.GiveMoney` (server) — ระบบไอเทม\u002Fเงิน |\n| `addons\u002Fstorage\u002F` | `Storage.Get\u002FSet\u002FAll\u002FFlush` (server) — ที่เก็บข้อมูล (ดูหัวข้อถัดไป) |\n\nทุกไฟล์มีค่าเริ่มต้นที่ใช้กับ ESX ได้ทันที (เช็ก `GetResourceState('es_extended')` เอง) และมีตัวอย่าง QBCore \u002F ox_lib คอมเมนต์ไว้ท้ายไฟล์ให้คัดลอกทับ ไม่มีเฟรมเวิร์กเลยก็ยังเปิดกล่องจดหมายได้ แค่รับของแนบไม่ได้จนกว่าจะต่อ `Reward.GiveItem`\u002F`GiveMoney` เอง (มี `print` เตือนใน console ถ้ายังไม่ได้ต่อ)\n\n## เก็บข้อมูล — JSON ค่าเริ่มต้น หรือสลับเป็น MySQL\n\nค่าเริ่มต้น: ไฟล์ JSON เดี่ยว (`Config.Storage.File`, ค่าเริ่มต้น `data\u002Fmailbox.json`) โหลดครั้งเดียวตอน resource เริ่ม เขียนกลับทุก `Config.Storage.FlushSeconds` วินาที (ค่าเริ่มต้น 30) และตอนผู้เล่นออก\u002Fresource หยุด ไฟล์เสียอ่านไม่ได้ → ย้ายไปเก็บเป็น `data\u002Fmailbox.broken.json` แล้วเริ่มไฟล์ใหม่ ไม่ทับทิ้งของเดิม\n\nอยากใช้ MySQL แทน:\n\n1. ตั้ง `Config.Storage.Driver = 'oxmysql'` — ตาราง `x3d_mailbox` ถูกสร้างให้อัตโนมัติ ไม่ต้อง include `@oxmysql`\n2. รีสตาร์ท resource เป็นอันเสร็จ (จะแก้ 4 ฟังก์ชัน `Storage.*` ใน `addons\u002Fstorage\u002Fserver.lua` ก็ต่อเมื่อต้องการที่เก็บข้อมูลแบบเขียนเอง)\n\n## Exports\n\n```lua\n-- target = server id (number) หรือ identifier (string) ก็ได้\nexports['x3d_mailbox']:SendMail(target, {\n    title   = 'ของรางวัลกิจกรรม',\n    body    = 'ขอบคุณที่เข้าร่วม',\n    sender  = 'ทีมงาน',           -- ไม่ใส่ = ใช้ชื่อกล่องจดหมาย\n    box     = 'mail',             -- 'mail' (ค่าเริ่มต้น, หมดอายุได้) หรือ 'safe' (ตู้ที่สอง)\n    expires = os.time() + 86400,  -- unix timestamp, ไม่ใส่ = ไม่หมดอายุ\n    items   = { { item = 'bread', count = 5 } },\n    money   = { { account = 'money', amount = 500 } },\n})\n\nexports['x3d_mailbox']:SendMailAll({ title = 'ประกาศ', body = 'เซิร์ฟเวอร์จะปิดปรับปรุงคืนนี้' })\n\nexports['x3d_mailbox']:GetMails(src)         --> { {id, title, body, sender, at, expires, read, claimed, box, items, money}, ... }\nexports['x3d_mailbox']:GetUnread(src)        --> number (รวมทุกกล่อง)\nexports['x3d_mailbox']:GetUnread(src, 'safe') --> number (เฉพาะตู้นิรภัย — ใส่ 'mail'\u002F'safe' ได้)\n```\n\n`GetMails` กรองจดหมายที่หมดอายุออกให้อัตโนมัติ และแปะ `label` ภาษาไทยจาก `Config.ItemLabels`\u002F`Config.AccountLabels` ลงบนสำเนาที่ส่งออกไป (ไม่แตะของจริงใน storage) `GetUnread` นับเฉพาะฉบับที่ยังไม่อ่านและไม่หมดอายุ คืนกลับเป็นตัวเลขเท่านั้น ไม่มี label\n\n`SendMail` รับรูปแบบที่กล่องจดหมายเจ้าอื่นใช้ด้วย — `subject`, `cash`\u002F`bank`, `items = {{ name, count }}`, `expiresInDays` — ย้ายจากกล่องจดหมายเก่าแค่เปลี่ยนชื่อ export\n\n## Events — server-internal (ไม่ใช่ net event)\n\n```lua\nAddEventHandler('x3d_mailbox:onSend', function(identifier, mail) end)\nAddEventHandler('x3d_mailbox:onClaim', function(src, mail, ok) end)\n```\n\n`x3d_mailbox:onSend` ยิงทันทีที่จดหมายถูกสร้าง (ทั้งจาก export และคำสั่งแอดมิน)\n\n`x3d_mailbox:onClaim` ยิงหลังพยายามจ่ายของเสมอ — **`mail.claimed` เป็น `true` เสมอไม่ว่าจะสำเร็จหรือไม่** (ธงถูกปักไว้ก่อนจ่ายของโดยตั้งใจ กันรับซ้ำ) ต้องเช็กผลจริงที่ arg ที่ 3 — `ok` เป็น `true` เฉพาะตอนของแนบทุกชิ้นจ่ายสำเร็จไม่ throw:\n\n```lua\nAddEventHandler('x3d_mailbox:onClaim', function(src, mail, ok)\n    if not ok then print(('mail %s claimed by %s but a reward failed'):format(mail.id, src)) end\nend)\n```\n\n## คำสั่งแอดมิน\n\n`\u002Fmailsend \u003Cserver id หรือ identifier> \u003Cหัวข้อ> \u003Cเนื้อหา…>` และ `\u002Fmailsendall \u003Cหัวข้อ> \u003Cเนื้อหา…>` — เรียกจาก in-game console ได้เสมอ เรียกจากผู้เล่นในเกมต้องมี ace `Config.AdminAce` (ค่าเริ่มต้น `x3d_mailbox.admin`)\n\n## ความปลอดภัยที่ทดสอบไว้\n\n- **รับซ้ำไม่ได้** — ธง `claimed` ถูกเขียนลง storage ก่อนจ่ายของทุกครั้ง ไม่มี yield คั่นระหว่างเช็กกับปักธง บวกล็อก `InFlight[identifier]` กันสอง event ที่มาพร้อมกัน\n- **ของพังไม่ล็อกผู้เล่นค้าง** — การจ่ายของห่อด้วย `pcall` จดหมายยังถูกทำเครื่องหมายว่ารับแล้วแม้จ่ายพัง (item key พิมพ์ผิดจาก `\u002Fmailsend` ก็ไม่ทำให้ผู้เล่นกดรับซ้ำได้ไม่รู้จบ) — ได้ของบางส่วน (partial delivery) ผู้เล่นเห็นข้อความแจ้งแยกต่างหาก ไม่ถูกเงียบเป็น success และของที่จ่ายไปแล้วไม่ถูกย้อนคืน (กันจ่ายซ้ำ)\n- **จำนวนถูกปัดเป็นจำนวนเต็มก่อนเสมอ** — ของแนบที่เป็นเศษส่วนหรือติดลบเข้าไม่ถึงกระเป๋าผู้เล่น\n- **คีย์ผู้เล่นเป็น identifier ถาวรเสมอ** ไม่ใช่ server id\n- **เพดาน `Config.MaxMails` ไม่ลบจดหมายที่ยังไม่ได้รับของ** — ล้นแล้วทิ้งฉบับที่รับของไปแล้วหรือหมดอายุแล้วก่อน (เก่าสุดก่อน) ฉบับที่แค่อ่านแล้วแต่ยังไม่ได้รับของและยังไม่หมดอายุ ของแนบยังอยู่ ไม่ถูกลบ\n- **รับทั้งหมด = 1 action ไม่ใช่ N** — วนจ่ายด้วยตรรกะเดียวกับกดรับทีละฉบับ เฉพาะกล่องที่เปิดแท็บอยู่ (จดหมาย\u002Fตู้นิรภัยไม่ปนกัน) ฉบับที่กระเป๋าไม่พอถูกข้าม ยังอยู่ให้กดรับใหม่ทีหลัง ไม่มีฉบับไหนถูกจ่ายซ้ำ\n- **ลบได้เฉพาะจดหมายที่ไม่มีของค้างรับ** — ต้องรับของก่อน (หรือไม่มีของแนบตั้งแต่แรก) — ข้อยกเว้นคือจดหมายที่หมดอายุแล้ว ลบได้เสมอเพราะรับของไม่ได้อีกต่อไปแล้ว (ของตกเป็นโมฆะ) — mail id ที่ client ส่งมาถูกมองหาเฉพาะในลิสต์ของผู้เล่นคนนั้นเองเท่านั้น\n- **`\u002Fredeem` และ event รับโค้ดใช้ throttle + ล็อกเดียวกัน** — สแปมคำสั่งรัว ๆ ไม่ทำให้ได้ของหลายรอบ ฟังก์ชันรับโค้ดเองก็ single-flight ต่อคน กันสอง call ชนกันแม้สลับไปใช้ storage แบบ await\n- **คีย์ `Config.Codes` ถูกปรับให้ตรงรูปแบบอัตโนมัติตอนเริ่ม** — พิมพ์คีย์ตัวเล็กหรือผสมมาก็ไม่ตกหล่นเงียบ ๆ (มีคำเตือนใน console ถ้าต้องปรับ)\n- จำกัด 1 ครั้ง\u002Fวินาที\u002Fคนต่อ action (`open`\u002F`read`\u002F`claim`\u002F`claimAll`\u002F`delete`\u002F`redeem` แยก bucket)\n\n```bash\npip install lupa\npython tools\u002Flua-test\u002Fx3d_mailbox_check.py\n```\n\n## ตั้งค่า (`config.lua`)\n\n| ค่า | ทำอะไร |\n|---|---|\n| `Config.Command` \u002F `Config.Key` | คำสั่งเปิด (`\u002Fmailbox`) และปุ่มลัด (`F7`) |\n| `Config.MaxMails` | เก็บต่อคนได้กี่ฉบับ |\n| `Config.AdminAce` | ace ที่ใช้สั่ง `\u002Fmailsend` `\u002Fmailsendall` |\n| `Config.Storage.File` \u002F `.FlushSeconds` | ที่เก็บไฟล์ JSON และความถี่ flush |\n| `Config.ItemLabels` \u002F `Config.AccountLabels` | ชื่อไทยที่โชว์ในกล่องจดหมาย |\n| `Config.ItemImage` | path รูปไอเทมของ inventory ที่เซิร์ฟใช้ (`{item}` = ชื่อไอเทม), ว่าง = ไม่โชว์รูป |\n| `Config.ExpiryWarnHours` | จดหมายเหลือเวลาน้อยกว่านี้ (ชั่วโมง) โชว์นับถอยหลังสีแดงในพาเนล (ค่าเริ่มต้น 24) |\n| `Config.CanCarryExport` | export ของ inventory ที่เซิร์ฟใช้ สำหรับเช็กว่ากระเป๋ารับไหว — ว่าง = ใช้ ESX `canCarryItem` · **ขึ้น \"กระเป๋าเต็ม\" ทั้งที่ยังว่าง ให้ตั้งค่านี้** |\n\n- `Config.DefaultExpireDays` — จดหมายที่ส่งโดยไม่ระบุวันหมดอายุ จะหมดอายุเมื่อครบกี่วันที่ตั้งไว้ (ตู้นิรภัยไม่หมดอายุ)\n- `Config.CheckCarry` — `false` = รับของได้แม้กระเป๋าเต็ม\n- `Config.NotifyUnreadOnJoin` — แจ้งจำนวนจดหมายที่ยังไม่อ่านตอนผู้เล่นโหลดเข้าเกม\n- ชื่อไอเทมที่ไม่มีใน `Config.ItemLabels` จะใช้ชื่อจากเฟรมเวิร์กแทน\n\n## โค้ดรับของ (redeem code)\n\nผู้เล่นพิมพ์ `\u002Fredeem \u003Cโค้ด>` หรือกรอกโค้ดในช่องบนพาเนลกล่องจดหมายเลยก็ได้ แล้วของจะถูก **ส่งเป็นจดหมาย** เข้ากล่อง — กระเป๋าเต็มก็ไม่มีวันหาย เพราะไปรออยู่ในจดหมาย\n\nโค้ดถาวรใส่ใน `config.lua`:\n\n```lua\nConfig.Codes = {\n    WELCOME2026 = {\n        maxUses       = 0,        -- 0 = ไม่จำกัดจำนวนครั้งทั้งเซิร์ฟ\n        oncePerPlayer = true,     -- คนละครั้งเดียว (ค่าเริ่มต้น)\n        title         = 'ยินดีต้อนรับ',\n        items         = { { item = 'bread', count = 2 } },\n        money         = { { account = 'bank', amount = 1000 } },\n    },\n    EVENTONLY = {\n        maxUses = 100,            -- 100 คนแรกเท่านั้น\n        expires = 1790000000,     -- เวลา unix ที่โค้ดหมดอายุ\n        box     = 'safe',         -- ส่งเข้าตู้นิรภัยแทนกล่องจดหมาย (ไม่บังคับ, ค่าเริ่มต้น 'mail')\n        money   = { { account = 'money', amount = 5000 } },\n    },\n}\n```\n\nสร้างโค้ดตอนรัน (หายเมื่อรีสตาร์ท) จาก resource อื่น:\n\n```lua\nexports['x3d_mailbox']:AddCode('EVENT2026', { maxUses = 50, money = { { account = 'bank', amount = 2000 } } })\nexports['x3d_mailbox']:RemoveCode('EVENT2026')\nexports['x3d_mailbox']:GetCodeUsage('EVENT2026')   --> { uses = 12, by = { ['license:xxx'] = true } }\nexports['x3d_mailbox']:Redeem(src, 'EVENT2026')    --> ok, reason\n\nAddEventHandler('x3d_mailbox:onRedeem', function(src, code, def) end)\n```\n\nยอดใช้โค้ดเก็บอยู่ในที่เดียวกับจดหมาย (คีย์ระบบ `__redeem`) — อยู่ครบหลังรีสตาร์ท และคำสั่งกระจายจดหมายทั้งเซิร์ฟไม่แตะคีย์นี้\n\n## ช่วยเหลือ\n\nDiscord: discord.gg\u002Fx3d-developer · เว็บ: x3d-developer.com\n","สคริป FiveM กล่องจดหมาย + โค้ดรับของ (Redeem Code) ฟรี","สคริป FiveM ฟรี กล่องจดหมายออฟไลน์ + โค้ดรับของ \u002Fredeem ของรางวัลส่งเป็นจดหมาย กระเป๋าเต็มก็ไม่หาย จำกัดสิทธิ์ต่อคน ไม่ต้องลงฐานข้อมูล ใช้ได้ทุกเฟรมเวิร์ก",[62,65,67,69,71,73],{"kind":63,"url":64},"image","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-mailbox\u002Fmedia\u002F5f0e2bffeb5847dd.png",{"kind":63,"url":66},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-mailbox\u002Fmedia\u002Fecae52ada3262923.png",{"kind":63,"url":68},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-mailbox\u002Fmedia\u002Fdfbe3182ca82566c.png",{"kind":63,"url":70},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-mailbox\u002Fmedia\u002F3b10675e2258a5ab.png",{"kind":63,"url":72},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-mailbox\u002Fmedia\u002Fa1d612aa5b9a172d.png",{"kind":63,"url":74},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-mailbox\u002Fmedia\u002F2f18c7395c42734f.png",[76,78,82,86],{"version":51,"released_at":52,"changelog_md":77},"### Changed\n\n- Store images now carry English captions for the English store page",{"version":79,"released_at":80,"changelog_md":81},"1.7.0","2026-10-12T03:25:54.186504Z","### 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)\n### Added\n- `SendMail` also accepts the shape other mailboxes use (`subject`, `cash`\u002F`bank`, `items = {{ name, count }}`, `expiresInDays`) — moving off an old mailbox is a rename of the export\n- `Config.Storage.Driver = 'oxmysql'` keeps mail in table `x3d_mailbox` (created automatically; no `@oxmysql` include needed)\n- `Config.DefaultExpireDays` (mail without an expiry expires after N days; the safe never expires), `Config.CheckCarry` (false = claim even with a full bag), `Config.NotifyUnreadOnJoin` (unread count when a player loads in)\n### Fixed\n- Item names fall back to the framework's item label when `Config.ItemLabels` has no entry\n- Claims were refused on servers whose inventory replaces ESX's (ESX's stale weight vetoed every item); the carry check now asks `Config.CanCarryExport` first everywhere, including inside item delivery",{"version":83,"released_at":84,"changelog_md":85},"1.4.0","2026-09-20T10:38:20.840557Z","### Added\r\n- Safe box: a second mail channel (`box = 'safe'` on any mail, `SendMail`\u002Fredeem codes accept it, defaults to `'mail'`) with its own unread count, its own Receive All (never touches the other box), and its own tab + badge in the panel\r\n- `GetUnread(src, box)` accepts an optional box to scope the count; omitted, it still counts every box like before\r\n\r\n### Fixed\r\n- **Critical:** `\u002Fredeem` bypassed the rate limit entirely (only the net event was throttled) — same-tick command spam could drain a whole `maxUses` pool from one player; the command now shares `doRedeem`'s throttle with the net event, and `Mail.Redeem` itself is single-flight per identifier so a concurrent call (including a direct `exports.x3d_mailbox:Redeem` from another resource) can't race a still-in-flight redeem even once storage starts yielding\r\n- **Critical:** a `Config.Codes` key not already matching the case `\u002Fredeem` compares against (uppercase unless `caseSensitive = true`) was silently unredeemable — keys are now normalised once at boot, with a console warning naming any key that had to change\r\n- Delete now shares the same `InFlight` lock as claim\u002FclaimAll, closing a window where a delete and a claim on the same list could interleave under a storage adapter that doesn't cache in memory (e.g. the documented oxmysql swap)\r\n- A partial delivery (some attachments paid, some failed) now tells the player with its own message (`partial_delivery`) instead of staying silent — the mail is still never reverted, so what already landed is never paid twice\r\n- An expired mail with unclaimed attachments could never be deleted or trimmed by `Config.MaxMails` — its reward is already forfeit once it expires, so it's now deletable and gets reaped by the cap like a claimed mail\r\n- `x3d_mailbox:read` had no throttle bucket — it's rate-limited like every other action now\r\n- `Mail.Add` stored the caller's `items`\u002F`money` tables by reference — `SendMailAll` and a `Config.Codes` entry reused across redemptions could alias into storage; both are now copied on the way in",{"version":87,"released_at":88,"changelog_md":89},"1.0.0","2026-09-19T19:05:37.383308Z","### Added\n- Offline mailbox: mails with title, body, sender, optional expiry, item and money attachments\n- Exports `SendMail(target, mail)`, `SendMailAll(mail)`, `GetMails(src)`, `GetUnread(src)`\n- Server-internal events `x3d_mailbox:onSend(identifier, mail)` and `x3d_mailbox:onClaim(src, mail, ok)`\n- Nuxt 4 panel, `\u002Fmailbox` command and F7 keybind\n- Admin commands `\u002Fmailsend` and `\u002Fmailsendall`, gated by the `x3d_mailbox.admin` ace\n- Claim-once ordering: the claimed flag is written to storage before payout, with an `InFlight` per-identifier lock against simultaneous claims\n- Reward payout wrapped in `pcall` so a broken item\u002Faccount can't leave a player permanently unable to claim\n- Attachment counts floored to whole numbers before every capacity check and payout\n- JSON file storage by default, with a commented oxmysql swap and `install.sql`\n- Four `addons\u002F` adapter files (framework, notify, reward, storage) with ESX defaults and QBCore\u002Fox_lib examples\n- `Config.ItemLabels` \u002F `Config.AccountLabels` for Thai display names",{"items":91,"page":866,"size":867,"total":867},[92,128,149,178,200,229,262,287,314,344,369,395,423,450,478,506,530,550,573,600,630,655,679,703,724,752,777,798,821,824,845],{"id":93,"slug":94,"name":95,"summary":96,"price_thb":97,"license_mode":98,"cover_key":99,"cover_url":100,"category_slugs":101,"tags":104,"latest_version":123,"latest_released_at":124,"published_at":125,"has_docs":54,"config":126,"rent_price_satang":127},"6bdadea7-4316-4a4a-a38e-87c5e841077d","x3d-replay","X3D Replay (ดูย้อนหลัง)","BETA ราคาพิเศษ · บันทึกผู้เล่นทุกคนอัตโนมัติ ดูย้อนหลังในเกมได้ทุกวินาที กล้อง 4 แบบ ไทม์ไลน์ยิง\u002Fตาย ปุ่มที่กด สคริปต์ที่ใช้ จับ macro",59900,"shop_license","public\u002Fproducts\u002Fx3d-replay\u002Fcover.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-replay\u002Fcover.jpg",[102,103],"anticheat","admin",[33,105,106,107,108,109,110,111,112,113,114,115,116,117,102,118,119,120,121,122],"ESX Legacy","replay","fivem replay script","replay system","รีเพลย์","ดูย้อนหลัง","ย้อนดูผู้เล่น","บันทึกผู้เล่น","เคสรีพอร์ต","จับโกง","จับมาโคร","macro detection","กันโปร","แอดมิน","admin tool","demo recorder","spectate","BETA","1.0.2","2026-10-14T06:14:23.677549Z","2026-10-14T06:14:23.700289Z","owners",12000,{"id":129,"slug":130,"name":131,"summary":132,"price_thb":97,"license_mode":98,"cover_key":133,"cover_url":134,"category_slugs":135,"tags":136,"latest_version":87,"latest_released_at":147,"published_at":148,"has_docs":54,"config":126,"rent_price_satang":127},"ff948fa9-6fc5-410e-b952-ee88b15f0c9d","x3d-anticheat","X3D Anti-Cheat (กันโปร)","BETA ราคาพิเศษ ร่วมทดสอบได้ · แอนตี้โกงเก็บหลักฐานก่อนแบน: Discord + ภาพหน้าจอ + แบน HWID + ล็อกบัญชี Steam\u002FDiscord + กัน event spam ด้วย 2 บรรทัด","public\u002Fproducts\u002Fx3d-anticheat\u002Fcover\u002Fd90612eed4448164.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-anticheat\u002Fcover\u002Fd90612eed4448164.jpg",[102],[33,37,137,102,138,139,140,117,141,142,143,144,145,146],"แอนตี้โกง","ป้องกันแฮก","กันโกง","HWID ban","ภาพหลักฐาน","ล็อกบัญชี Steam Discord","แบนเครื่อง","คิวยศ Discord","กัน event สแปม","แอนตี้โกง ESX","2026-09-16T09:45:51.78533Z","2026-09-16T09:46:00.05928Z",{"id":150,"slug":151,"name":152,"summary":153,"price_thb":154,"license_mode":98,"cover_key":155,"cover_url":156,"category_slugs":157,"tags":161,"latest_version":174,"latest_released_at":175,"published_at":176,"has_docs":54,"config":126,"rent_price_satang":177},"47a33337-7dcf-4a78-b056-4b3e324a648d","x3d-slots","X3D สล็อต 1024 ทาง","สล็อตคาสเคด 1,024 ทาง สไตล์มาห์จอง RTP 97.5% คิดผลบนเซิร์ฟเวอร์ กันโกง พร้อมฟรีสปิน ตัวคูณ และซีนแจ็กพอต",250000,"public\u002Fproducts\u002Fx3d-slots\u002Fcover\u002Fd09c2066a6ea2968.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fcover\u002Fd09c2066a6ea2968.jpg",[158,159,160],"casino","economy","entertainment",[33,37,162,163,158,164,165,166,167,168,169,170,171,172,173],"คาสิโน","สล็อต","slot","มินิเกม","minigame","RTP 97.5%","มาห์จอง","คาสเคด","ฟรีสปิน","ตู้สล็อต","ซื้อฟีเจอร์","ปรับ RTP","1.1.4","2026-10-12T17:13:01.863556Z","2026-09-14T15:28:02.281478Z",50000,{"id":179,"slug":180,"name":181,"summary":182,"price_thb":26,"license_mode":27,"cover_key":183,"cover_url":184,"category_slugs":185,"tags":187,"latest_version":197,"latest_released_at":198,"published_at":199,"has_docs":54,"config":55,"rent_price_satang":56},"1fb91794-3e8b-4955-bc54-dc6b1491912e","x3d-mapevents","X3D Map Events (อีเวนต์บนแผนที่)","แผงอีเวนต์บนหน้าแผนที่ pause menu ฟรี: ชื่อ + เวลานับถอยหลัง คลิกเพื่อตั้งจุดนำทาง สคริปต์อื่นส่งอีเวนต์เข้ามาได้เหมือนส่งแจ้งเตือน แอดมินสร้างอีเวนต์เองได้","public\u002Fproducts\u002Fx3d-mapevents\u002Fcover\u002F8e738f2dfcf0ea2f.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-mapevents\u002Fcover\u002F8e738f2dfcf0ea2f.jpg",[186,31],"hud",[188,189,190,191,192,193,194,195,196,40,34],"อีเวนต์","อีเวนต์บนแผนที่","แผนที่","จุดนำทาง","นับถอยหลัง","pause menu","map events","event","waypoint","1.0.3","2026-10-12T17:13:20.327337Z","2026-10-12T04:21:56.480796Z",{"id":201,"slug":202,"name":203,"summary":204,"price_thb":26,"license_mode":27,"cover_key":205,"cover_url":206,"category_slugs":207,"tags":209,"latest_version":226,"latest_released_at":227,"published_at":228,"has_docs":54,"config":55,"rent_price_satang":56},"58697b89-cbe5-4b1f-8a29-c5289727202e","x3d-weaponskins","X3D Weapon Skins (สกินอาวุธ)","สกินอาวุธแบบสะสม ESX ฟรี สกินเป็นอาวุธ add-on ผูกกับปืนหลัก ใช้ไอเทมปลดล็อกเข้าคลัง ใส่\u002Fถอดได้ ดาเมจเท่าเดิม แปลงกลับเป็นไอเทมไปเทรดได้ มีเอฟเฟกต์ตอนถือ","public\u002Fproducts\u002Fx3d-weaponskins\u002Fcover\u002F25e3c37b23545ec8.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-weaponskins\u002Fcover\u002F25e3c37b23545ec8.jpg",[31,208],"inventory",[210,211,212,213,214,215,216,217,218,219,33,40,34,220,221,222,223,224,225],"weapon skins","สกินอาวุธ","สกินอาวุธ fivem","สกินปืน","gun skin","weapon skin fivem","คลังสกิน","เทรดสกิน","skin collection","x3d_inventory","ปลดล็อกสกิน","สกินสะสม","เอฟเฟกต์อาวุธ","ความหายากสกิน","สกิน add-on","แปลงสกินเป็นไอเทม","1.1.2","2026-10-12T17:13:35.599698Z","2026-10-10T11:46:16.716284Z",{"id":230,"slug":231,"name":232,"summary":233,"price_thb":26,"license_mode":27,"cover_key":234,"cover_url":235,"category_slugs":236,"tags":238,"latest_version":123,"latest_released_at":260,"published_at":261,"has_docs":54,"config":55,"rent_price_satang":56},"d82d8eb1-ed6a-43e3-86ef-24e45ae2b39d","x3d-damage","X3D Damage (ดาเมจอาวุธ)","ตั้งดาเมจอาวุธเองทุกชิ้น พร้อมเอฟเฟกต์ เลือดออก ช้า สตัน ล้ม ดูดเลือด รองรับสกินอาวุธ ใช้ได้ทั้ง ESX และ standalone","public\u002Fproducts\u002Fx3d-damage\u002Fcover\u002F8ce8864c16843fe6.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-damage\u002Fcover\u002F8ce8864c16843fe6.jpg",[31,237],"gangs",[239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,33,37,40,34,254,255,256,257,258,259],"weapon damage","ดาเมจอาวุธ","ดาเมจปืน","fivem weapon damage","damage script","headshot","headshot kill","เลือดออก","bleed","สตัน","stun","lifesteal","ดูดเลือด","เมืองปืน","pvp","ทะลุเกราะ","ดาเมจเสริม","ปิดท่าต่อยหนัก","ปรับดาเมจ","ทำให้ช้า","กันกระโดดหลบ","2026-10-12T17:14:19.289254Z","2026-10-10T11:45:52.279629Z",{"id":263,"slug":264,"name":265,"summary":266,"price_thb":26,"license_mode":27,"cover_key":267,"cover_url":268,"category_slugs":269,"tags":271,"latest_version":123,"latest_released_at":285,"published_at":286,"has_docs":54,"config":55,"rent_price_satang":56},"93def22a-9501-4b66-bdf0-158cc6a0093c","x3d-vehiclestorage","X3D Vehicle Storage (ท้ายรถ)","ท้ายรถสำหรับ ESX ใช้หน้าจอกระเป๋า x3d_inventory น้ำหนักตามประเภท\u002Fรุ่นรถ เฉพาะเจ้าของ รถงาน และแอดมินเปิดดูได้ ฟรี","public\u002Fproducts\u002Fx3d-vehiclestorage\u002Fcover\u002F2c2d97cb47678e1b.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-vehiclestorage\u002Fcover\u002F2c2d97cb47678e1b.jpg",[208,270],"garage",[272,273,274,275,276,277,278,219,33,40,34,279,280,281,282,283,284],"trunk","ท้ายรถ","ท้ายรถ fivem","vehicle storage","trunk inventory","esx trunk","เก็บของในรถ","ตู้ท้ายรถ","รถงาน","กล่องเก็บของหน้ารถ","น้ำหนักท้ายรถ","ล็อกรถ","เปิดท้ายรถ","2026-10-12T17:14:46.845123Z","2026-10-05T04:28:52.749188Z",{"id":288,"slug":289,"name":290,"summary":291,"price_thb":26,"license_mode":27,"cover_key":292,"cover_url":293,"category_slugs":294,"tags":296,"latest_version":123,"latest_released_at":312,"published_at":313,"has_docs":54,"config":55,"rent_price_satang":56},"b642bb91-9f6d-4c3c-8830-e594c2a92fcb","x3d-vault","X3D Vault (ตู้เซฟแก๊ง)","ตู้เซฟ ESX ใช้หน้าจอกระเป๋า x3d_inventory ตู้ส่วนตัวมีเลเวล แชร์ให้เพื่อน ตู้หน่วยงานตามอาชีพ ฟรี","public\u002Fproducts\u002Fx3d-vault\u002Fcover\u002F72ea3a88a64e0034.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-vault\u002Fcover\u002F72ea3a88a64e0034.jpg",[208,295],"jobs",[297,298,299,300,301,302,303,304,219,33,40,34,305,306,307,308,309,310,311],"vault","stash","ตู้เซฟ","ตู้เก็บของ","ตู้เซฟ fivem","esx stash","job vault","ตู้หน่วยงาน","ตู้เซฟแก๊ง","ตู้ส่วนตัว","แชร์ตู้","อัปเกรดตู้","ตู้เซฟตำรวจ","ตู้เซฟอาชีพ","ลิมิตตู้","2026-10-12T17:15:03.928293Z","2026-10-05T04:28:43.828514Z",{"id":315,"slug":316,"name":317,"summary":318,"price_thb":26,"license_mode":27,"cover_key":319,"cover_url":320,"category_slugs":321,"tags":322,"latest_version":341,"latest_released_at":342,"published_at":343,"has_docs":54,"config":55,"rent_price_satang":56},"70fa1474-294a-49ad-91cb-1de0ab4dc8d8","x3d-adminpanel","X3D Admin Panel (เมนูแอดมิน)","แผงแอดมิน FiveM ฟรี ครบในหน้าเดียว ผู้เล่น แบน\u002Fเตือน จับบัญชีสำรอง กระเป๋า ไอเทม รถ อากาศ บันทึกการใช้งาน และเมนูของสคริปต์ X3D","public\u002Fproducts\u002Fx3d-adminpanel\u002Fcover\u002F5cb8420f481eee28.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-adminpanel\u002Fcover\u002F5cb8420f481eee28.jpg",[103],[323,324,325,326,327,328,143,329,330,331,332,333,121,334,33,37,40,34,335,336,337,338,339,340],"admin panel","admin menu","แผงแอดมิน","เมนูแอดมิน","เมนูแอดมิน fivem","fivem admin menu","token ban","จับบัญชีสำรอง","alt detection","txadmin","noclip","log","แอดมินไทย","ยึดไอเทม","ประวัติแบน","โน้ตแอดมิน","นำเข้า txAdmin","บทบาทแอดมิน","1.0.5","2026-10-12T17:15:53.66615Z","2026-10-05T04:11:47.352812Z",{"id":345,"slug":346,"name":347,"summary":348,"price_thb":26,"license_mode":27,"cover_key":349,"cover_url":350,"category_slugs":351,"tags":352,"latest_version":174,"latest_released_at":367,"published_at":368,"has_docs":54,"config":55,"rent_price_satang":56},"d76ff7ae-ded6-4f39-b63f-734181952698","x3d-inventory","X3D Inventory (กระเป๋า)","กระเป๋าไอเทม ESX ฟรี ตัวหนังสือไทยใหญ่ ช่องลัด 1–9 บันทึกกับตัวละคร ความจุขยายด้วยคูปอง ต่อตู้เซฟ\u002Fท้ายรถได้ทุกสคริปต์","public\u002Fproducts\u002Fx3d-inventory\u002Fcover\u002Ffc3857e556cf31f3.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-inventory\u002Fcover\u002Ffc3857e556cf31f3.jpg",[208,186],[208,353,354,355,356,357,358,359,360,361,33,40,34,362,363,364,365,366],"กระเป๋า","กระเป๋า fivem","ui กระเป๋า","esx inventory","inventory fivem","ช่องลัด","hotbar","ไอเทม","nui","คูปองขยายช่อง","คูปองน้ำหนัก","ความหายากไอเทม","ค้นกระเป๋า","จำกัดน้ำหนัก","2026-10-12T17:16:22.733967Z","2026-10-05T04:10:14.693356Z",{"id":370,"slug":371,"name":372,"summary":373,"price_thb":26,"license_mode":27,"cover_key":374,"cover_url":375,"category_slugs":376,"tags":377,"latest_version":174,"latest_released_at":393,"published_at":394,"has_docs":54,"config":55,"rent_price_satang":56},"f782bbab-0321-4d3f-832f-797a2aa198f5","x3d-fortune","X3D Fortune (หมอดู)","หมอดูฟรีสำหรับ ESX: ดวงรายวัน ราศีจากวันเกิด เซียมซี 28 ใบ ไพ่ยิปซี 22 ใบ 9 หัวข้อ และดวงรายเดือนเปิดไพ่ 10 ใบ","public\u002Fproducts\u002Fx3d-fortune\u002Fcover\u002Fab130eeac9fbc029.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-fortune\u002Fcover\u002Fab130eeac9fbc029.jpg",[160],[378,379,380,381,382,383,384,385,386,33,40,34,387,388,389,390,391,392],"หมอดู","ดูดวง","เซียมซี","ไพ่ยิปซี","tarot","ราศี","ดวงรายวัน","fortune teller","npc","ดวงรายเดือน","ไพ่ทาโร่","เลขมงคล","สีมงคล","ไพ่กลับหัว","จุดหมอดู","2026-10-12T17:16:40.12128Z","2026-09-26T14:59:27.315955Z",{"id":396,"slug":397,"name":398,"summary":399,"price_thb":26,"license_mode":27,"cover_key":400,"cover_url":401,"category_slugs":402,"tags":403,"latest_version":420,"latest_released_at":421,"published_at":422,"has_docs":54,"config":55,"rent_price_satang":56},"9cb293aa-8b2c-447d-b810-3a7e385f6e81","x3d-banking","X3D Banking (ธนาคาร)","ธนาคารและตู้ ATM ฟรีสำหรับ ESX: ฝาก ถอน โอนด้วย ID ผู้เล่น ประวัติรายการ ใช้ได้ทุกตู้บนแผนที่ เซิร์ฟเวอร์เช็คทุกรายการ","public\u002Fproducts\u002Fx3d-banking\u002Fcover\u002Fe7e66ab29819a980.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-banking\u002Fcover\u002Fe7e66ab29819a980.jpg",[159],[404,405,406,407,408,409,410,411,412,413,33,40,34,414,415,416,417,418,419],"banking","ธนาคาร","ระบบธนาคาร","atm","ตู้ atm","โอนเงิน","โอนด้วยเบอร์โทร","esx banking","bank script","ประวัติรายการ","ถอนด่วน","วงเงินโอน","สาขาธนาคาร","ฝากเงิน","ถอนเงิน","เพิ่มตู้ ATM","1.1.8","2026-10-12T17:16:55.98941Z","2026-09-26T14:59:08.07128Z",{"id":424,"slug":425,"name":426,"summary":427,"price_thb":26,"license_mode":27,"cover_key":428,"cover_url":429,"category_slugs":430,"tags":431,"latest_version":174,"latest_released_at":448,"published_at":449,"has_docs":54,"config":55,"rent_price_satang":56},"c72d91e0-6bcd-4fae-bde9-0e140e02b0cb","x3d-music","X3D Music (ลำโพง)","ลำโพงบูมบ็อกซ์ฟรีสำหรับ ESX: วางบนพื้นหรือติดบนรถ เปิดเพลง YouTube คิวเพลงร่วมกัน เสียงเบาลงตามระยะ ลำโพงยังอยู่หลังรีสตาร์ท","public\u002Fproducts\u002Fx3d-music\u002Fcover\u002Fce445e0d251f7540.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-music\u002Fcover\u002Fce445e0d251f7540.jpg",[160],[432,433,434,435,436,437,438,439,440,441,33,40,34,442,443,444,445,446,447],"boombox","ลำโพง","ลำโพงเปิดเพลง","เปิดเพลง youtube","music script","fivem music","xsound","youtube","คิวเพลง","ติดบนรถ","ลำโพงติดรถ","เปิดเพลงในรถ","ฟังเพลงด้วยกัน","เพลงร่วมกัน","ลำโพงวางพื้น","จำกัดลำโพง","2026-10-12T17:17:14.482272Z","2026-09-26T14:56:09.091062Z",{"id":451,"slug":452,"name":453,"summary":454,"price_thb":26,"license_mode":27,"cover_key":455,"cover_url":456,"category_slugs":457,"tags":458,"latest_version":475,"latest_released_at":476,"published_at":477,"has_docs":54,"config":55,"rent_price_satang":56},"6125d85f-eaff-45cb-90cd-9db4d66e7954","x3d-respawn","X3D Respawn (หน้าจอตาย)","หน้าจอตายฟรี: ปุ่มเรียกหมอ หมอออนไลน์ต้องรอหมอ จุดเกิดใหม่ ชุบตัวเอง สรุปการตาย และเก็บสถานะตายตอนออกเกม","public\u002Fproducts\u002Fx3d-respawn\u002Fcover\u002F1af99658aa5089b2.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-respawn\u002Fcover\u002F1af99658aa5089b2.jpg",[186],[459,460,461,462,463,464,465,466,467,468,469,33,40,34,470,471,472,473,474],"respawn","หน้าจอตาย","death screen","เรียกหมอ","call ems","ambulance","esx_ambulancejob","ชุบตัวเอง","จุดเกิดใหม่","dispatch","สรุปการตาย","รอหมอ","กันหนีตาย","ปุ่มเรียกหมอ","เกิดใหม่เมือง","ชุดปฐมพยาบาล","1.1.3","2026-10-12T17:17:26.33517Z","2026-09-25T16:14:21.42282Z",{"id":479,"slug":480,"name":481,"summary":482,"price_thb":26,"license_mode":27,"cover_key":483,"cover_url":484,"category_slugs":485,"tags":486,"latest_version":475,"latest_released_at":504,"published_at":505,"has_docs":54,"config":55,"rent_price_satang":56},"879a5a5d-5b22-4fb5-9274-6ac3ee631904","x3d-phone","X3D Phone (โทรศัพท์)","โทรศัพท์มือถือฟรีสำหรับ ESX: โทรผ่าน pma-voice, SMS แชร์ตำแหน่ง, ธนาคารมือถือ, กล้องถ่ายรูปเก็บในเซิร์ฟเอง, Buzz และ Dark Chat","public\u002Fproducts\u002Fx3d-phone\u002Fcover\u002F9e0b9e2f9bc7352d.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-phone\u002Fcover\u002F9e0b9e2f9bc7352d.jpg",[186],[487,488,489,490,491,492,493,468,494,495,496,497,498,33,40,34,499,500,501,462,502,503],"phone","โทรศัพท์","โทรศัพท์ fivem","esx phone","phone script","sms","pma-voice","แจ้งเหตุ","ธนาคารมือถือ","buzz","dark chat","กล้อง","เบอร์หน่วยงาน","ออกบิล","แชร์ตำแหน่ง","กล้องโทรศัพท์","ไอเทมโทรศัพท์","2026-10-12T17:18:13.372348Z","2026-09-25T15:32:10.424119Z",{"id":507,"slug":508,"name":509,"summary":510,"price_thb":26,"license_mode":27,"cover_key":511,"cover_url":512,"category_slugs":513,"tags":514,"latest_version":475,"latest_released_at":527,"published_at":528,"has_docs":529,"config":27,"rent_price_satang":56},"6705aca9-39b7-48ad-a39b-0dc4a906dd70","x3d-safe","X3D Safe Cracking (เจาะตู้เซฟ)","มินิเกมหมุนเจาะตู้เซฟ หมุนหน้าปัดด้วย A\u002FD กด E ตอนตรงจุด เรียกด้วย export เดียว","public\u002Fproducts\u002Fx3d-safe\u002Fcover\u002F410a110f32490438.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-safe\u002Fcover\u002F410a110f32490438.jpg",[237,31],[515,516,299,517,165,166,518,519,37,520,40,34,521,522,523,524,525,526],"safe cracking","เจาะตู้เซฟ","หมุนตู้เซฟ","มินิเกม fivem","export","crime","หมุนหน้าปัด","ตู้เซฟธนาคาร","ตู้เซฟร้าน","ตู้เซฟบ้าน","ไม่ต้องใช้ ESX","มินิเกม A\u002FD","2026-10-12T17:18:34.435941Z","2026-09-24T03:53:28.3285Z",false,{"id":531,"slug":532,"name":533,"summary":534,"price_thb":26,"license_mode":27,"cover_key":535,"cover_url":536,"category_slugs":537,"tags":538,"latest_version":547,"latest_released_at":548,"published_at":549,"has_docs":529,"config":27,"rent_price_satang":56},"d5bcab3a-9189-4813-9b17-6b34f3a16584","x3d-lockpick","X3D Lockpick (งัดล็อก)","มินิเกมงัดล็อก หมุนหาจุดด้วย WASD เรียกด้วย export เดียว ใช้กับสคริปต์อะไรก็ได้","public\u002Fproducts\u002Fx3d-lockpick\u002Fcover\u002Fc36242cb20a32b3b.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-lockpick\u002Fcover\u002Fc36242cb20a32b3b.jpg",[237,31],[539,540,541,165,166,518,519,37,520,40,34,542,543,544,545,546],"lockpick","งัดล็อก","สะเดาะกุญแจ","งัดประตูบ้าน","งัดรถ","หมุดล็อก","มินิเกม WASD","ปรับความยาก","1.1.1","2026-10-12T17:18:46.115275Z","2026-09-24T03:53:14.231073Z",{"id":551,"slug":552,"name":553,"summary":554,"price_thb":26,"license_mode":27,"cover_key":555,"cover_url":556,"category_slugs":557,"tags":559,"latest_version":570,"latest_released_at":571,"published_at":572,"has_docs":54,"config":55,"rent_price_satang":56},"65d3b2da-6dba-4cd0-9907-06b8e6e54994","x3d-houserobbery","X3D House Robbery (งัดบ้าน)","งัดบ้าน — งัดประตู ค้นของตามพื้น เจาะตู้เซฟ มีคูลดาวน์ต่อหลัง แถมมินิเกมครบในซิปเดียว","public\u002Fproducts\u002Fx3d-houserobbery\u002Fcover\u002F73f596dab6db196a.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-houserobbery\u002Fcover\u002F73f596dab6db196a.jpg",[558,237],"housing",[560,561,562,563,564,299,539,165,237,565,558,520,33,40,34,566,516,567,568,569],"งัดบ้าน","ปล้นบ้าน","house robbery","robbery","ปล้น","แก๊ง","คีย์การ์ด","เงินแดง","จุดค้นของ","ปล้นบ้านคูลดาวน์","1.2.4","2026-10-12T17:19:03.056031Z","2026-09-24T03:48:06.633278Z",{"id":574,"slug":575,"name":576,"summary":577,"price_thb":26,"license_mode":27,"cover_key":578,"cover_url":579,"category_slugs":580,"tags":581,"latest_version":597,"latest_released_at":598,"published_at":599,"has_docs":54,"config":55,"rent_price_satang":56},"5532c49c-d819-4dda-b8a0-71514a14df31","x3d-selldrug","X3D Sell Drug (งานขายยา)","งานขายของผิดกฎหมาย ผู้รับซื้อลับสุ่มโผล่ตามแมพ มีเวลาจำกัด จ่ายเป็นเงินดำ มีระบบจุด10 ใช้ได้ทั้ง ESX และ standalone","public\u002Fproducts\u002Fx3d-selldrug\u002Fcover\u002F38844a64037d78d6.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-selldrug\u002Fcover\u002F38844a64037d78d6.jpg",[237,159],[582,583,584,585,586,587,588,589,237,565,520,33,40,34,590,591,592,593,594,595,567,596],"ขายยา","งานขายยา","sell drug","drug selling","ของผิดกฎหมาย","เงินดำ","black money","ผู้รับซื้อ","จุด10","จุดสิบ","จุดขายยา","ขายของจุด10","ขายของลับ","ฟอกเงิน","ผู้รับซื้อรายใหญ่","1.2.6","2026-10-12T17:19:19.018788Z","2026-09-24T03:39:03.703963Z",{"id":601,"slug":602,"name":603,"summary":604,"price_thb":26,"license_mode":27,"cover_key":605,"cover_url":606,"category_slugs":607,"tags":608,"latest_version":226,"latest_released_at":628,"published_at":629,"has_docs":529,"config":55,"rent_price_satang":56},"8e4dcdf4-7c70-4185-a3c9-15bb5328c457","x3d-useitem","X3D Use Item (ไอเทมใช้ได้)","ยา ผ้าพันแผล AED เกราะ หมวกกันน็อค ซ่อมรถ กระสุน กล่องสุ่ม อาหารพร้อมบัฟ — ไอเทมใช้ได้ครบชุด ต้องการแค่ ESX","public\u002Fproducts\u002Fx3d-useitem\u002Fcover\u002Fe007251b171e6791.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-useitem\u002Fcover\u002Fe007251b171e6791.jpg",[208,31],[609,610,611,612,613,614,615,616,617,618,619,620,621,33,40,34,622,623,624,625,626,627],"use item","ไอเทมใช้ได้","usable items","ยา","ผ้าพันแผล","aed","ชุบคนล้ม","ซ่อมรถ","กระสุน","กล่องสุ่ม","อาหาร","เสื้อเกราะ","หมวกกันน็อค","บัฟอาหาร","ชุดซ่อมรถ","เติมกระสุน","ยืมเสื้อเกราะ","ใช้ไอเทม","ไอเทมเติมเลือด","2026-10-12T17:19:33.653792Z","2026-09-24T02:05:34.038449Z",{"id":631,"slug":632,"name":633,"summary":634,"price_thb":26,"license_mode":27,"cover_key":635,"cover_url":636,"category_slugs":637,"tags":638,"latest_version":475,"latest_released_at":653,"published_at":654,"has_docs":529,"config":27,"rent_price_satang":56},"8c823bc1-1de6-41b6-bf82-146d5a55eeb5","x3d-progressbar","X3D Progress Bar (หลอดโหลด)","แถบความคืบหน้าธีมพีช ยกเลิกด้วย ESC นับเวลาถอยหลัง ล็อกปุ่มลัดให้อัตโนมัติ รองรับภาษาไทย","public\u002Fproducts\u002Fx3d-progressbar\u002Fcover\u002Ff6830df60f656452.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-progressbar\u002Fcover\u002Ff6830df60f656452.jpg",[186],[639,640,641,642,643,644,645,186,646,33,40,34,647,648,649,650,651,652],"progressbar","progress bar","แถบโหลด","แถบความคืบหน้า","esx_progressbar","esx progressbar","ui","ยกเลิก esc","หลอดโหลด","ฟอนต์ไทย","นับเวลาถอยหลัง","ล็อกปุ่มลัด","โปรเกรสบาร์","แทน esx_progressbar","2026-10-12T17:19:45.934106Z","2026-09-24T01:22:17.768991Z",{"id":656,"slug":657,"name":658,"summary":659,"price_thb":26,"license_mode":27,"cover_key":660,"cover_url":661,"category_slugs":662,"tags":663,"latest_version":226,"latest_released_at":677,"published_at":678,"has_docs":54,"config":55,"rent_price_satang":56},"63ce5efe-2f18-499e-a52b-8155a6cebb84","x3d-slide","X3D Slide (สไลด์)","สไลด์หลบไปข้างหน้าแบบเกมยิง กด Shift พร้อมปุ่มสไลด์ มีคูลดาวน์กันสแปม ตั้งค่าได้ใน config","public\u002Fproducts\u002Fx3d-slide\u002Fcover\u002F8c8383608791f58a.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slide\u002Fcover\u002F8c8383608791f58a.jpg",[31],[664,665,666,667,668,669,670,671,37,33,40,34,672,673,674,675,676],"slide","สไลด์","slide fivem","ท่าสไลด์","หลบ","dodge","ท่าทาง","คูลดาวน์","สไลด์แบบเกมยิง","Shift สไลด์","ท่าหลบเกมยิง","ปุ่มสไลด์","ปรับแรงสไลด์","2026-10-12T17:20:03.227099Z","2026-09-24T01:21:56.84494Z",{"id":680,"slug":681,"name":682,"summary":683,"price_thb":26,"license_mode":27,"cover_key":684,"cover_url":685,"category_slugs":686,"tags":687,"latest_version":174,"latest_released_at":701,"published_at":702,"has_docs":54,"config":55,"rent_price_satang":56},"9b62b8ed-5911-47a8-b695-3320a6183758","x3d-notify","X3D Notify (แจ้งเตือน)","การ์ดแจ้งเตือน 9 ตำแหน่ง ใส่ไอคอนไอเทมกับกรอบระดับความหายากได้ รองรับภาษาไทยเต็มรูปแบบ","public\u002Fproducts\u002Fx3d-notify\u002Fcover\u002F4a9cbdcedd86a149.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-notify\u002Fcover\u002F4a9cbdcedd86a149.jpg",[186],[688,689,690,691,692,693,645,186,648,694,33,40,34,695,696,697,698,699,700],"notify","notification","แจ้งเตือน","แจ้งเตือน fivem","esx_notify","esx notify","ไอคอนไอเทม","การ์ดแจ้งเตือน","กรอบความหายาก","แจ้งเตือน 9 ตำแหน่ง","สีในข้อความ","แทน esx_notify","แจ้งเตือนไอเทม","2026-10-12T17:20:21.047259Z","2026-09-24T01:21:40.547491Z",{"id":704,"slug":705,"name":706,"summary":707,"price_thb":26,"license_mode":27,"cover_key":708,"cover_url":709,"category_slugs":710,"tags":711,"latest_version":341,"latest_released_at":722,"published_at":723,"has_docs":54,"config":27,"rent_price_satang":56},"e6dc80f3-4f29-4d01-bffa-eba6829c6497","x3d-loadingscreen","X3D Loading Screen (หน้าโหลด)","หน้าโหลดสไตล์เทอร์มินัล มีปุ่ม ENTER WORLD ให้ผู้เล่นกดเองก่อนลงเมือง ไฟล์ HTML เดียว ไม่ต้อง build","public\u002Fproducts\u002Fx3d-loadingscreen\u002Fcover\u002F32f1538b8e18f4db.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-loadingscreen\u002Fcover\u002F32f1538b8e18f4db.jpg",[186],[712,713,714,715,716,717,645,37,33,40,34,718,719,647,720,721],"loading screen","หน้าโหลด","หน้าโหลด fivem","loadingscreen","esx_loadingscreen","enter world","ปุ่มเข้าเมือง","หน้าโหลดเทอร์มินัล","พื้นหลังวิดีโอ","เพลงหน้าโหลด","2026-10-12T17:20:39.269405Z","2026-09-24T00:50:19.336351Z",{"id":725,"slug":726,"name":727,"summary":728,"price_thb":26,"license_mode":27,"cover_key":729,"cover_url":730,"category_slugs":731,"tags":733,"latest_version":749,"latest_released_at":750,"published_at":751,"has_docs":54,"config":27,"rent_price_satang":56},"37f7d9db-f90d-4eed-861b-922da1072932","es-extended","ESX Legacy Core — X3D Build","es_extended ที่เร็วขึ้น กันข้อมูลผู้เล่นหาย และล็อกเศรษฐกิจก่อนรีสตาร์ท ลงทับตัวเดิมได้เลย ชื่อ resource เหมือนเดิมทุกอย่าง","public\u002Fproducts\u002Fes-extended\u002Fcover\u002Fa0b783dc4bf383e9.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fes-extended\u002Fcover\u002Fa0b783dc4bf383e9.jpg",[732],"optimization",[33,734,735,736,737,738,739,740,741,742,40,34,743,744,745,746,747,748],"es_extended","esx legacy","esx core","esx_core","framework","core","esx ฟรี","ดาวน์โหลด esx","esx legacy 1.13","กันข้อมูลหาย","กันดูป","audit log","เซฟผู้เล่น","esx fork","กันตกทะลุแมพ","1.13.6","2026-10-12T17:20:52.726747Z","2026-09-23T13:28:50.819982Z",{"id":753,"slug":754,"name":755,"summary":756,"price_thb":26,"license_mode":27,"cover_key":757,"cover_url":758,"category_slugs":759,"tags":760,"latest_version":774,"latest_released_at":775,"published_at":776,"has_docs":54,"config":55,"rent_price_satang":56},"7c86bf83-0df0-4e59-ab59-461ac4a2bff8","x3d-skin","X3D ตกแต่งตัวละคร","หน้าตกแต่งตัวละคร 77 ช่อง กล้องหมุนซูม ท่าโพส ไฟส่องหน้า ไม่ต้องลง skinchanger ไม่ต้องลงฐานข้อมูล ต่อกับเฟรมเวิร์กไหนก็ได้","public\u002Fproducts\u002Fx3d-skin\u002Fcover\u002Fdb520ac6e2e3d502.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-skin\u002Fcover\u002Fdb520ac6e2e3d502.jpg",[186],[33,37,761,762,763,764,765,766,767,40,34,768,769,770,771,772,773],"ตกแต่งตัวละคร","skin","character customization","skin creator","แต่งตัวละคร","ร้านเสื้อผ้า","ร้านตัดผม","ตู้เสื้อผ้า","ร้านเสริมสวย","ร้านหน้ากาก","ท่าโพส","แต่งหน้า","ไม่ต้องใช้ skinchanger","1.5.4","2026-10-12T17:21:14.159219Z","2026-09-22T04:02:41.988907Z",{"id":778,"slug":779,"name":780,"summary":781,"price_thb":26,"license_mode":27,"cover_key":782,"cover_url":783,"category_slugs":784,"tags":785,"latest_version":174,"latest_released_at":796,"published_at":797,"has_docs":54,"config":55,"rent_price_satang":56},"7337afbc-ca0d-4071-9de4-2cc04bd1b4e6","x3d-menu","X3D เมนูหลัก","เมนูหลักของเซิร์ฟ — การ์ดระบบ ประกาศ อีเวนต์มีช่วงเวลา คู่มือเมือง และหน้าตั้งค่าของผู้เล่น ไม่ต้องลงฐานข้อมูล ต่อกับเฟรมเวิร์กไหนก็ได้","public\u002Fproducts\u002Fx3d-menu\u002Fcover\u002F8a1dbb30861b0387.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-menu\u002Fcover\u002F8a1dbb30861b0387.jpg",[186],[33,37,786,787,788,789,188,790,40,34,791,792,793,794,795],"เมนูหลัก","main menu","menu","ประกาศ","คู่มือเมือง","เมนูเมือง","กฎเมือง","เมนู F4","ตั้งค่าผู้เล่น","แบนเนอร์อีเวนต์","2026-10-12T17:21:29.681926Z","2026-09-21T04:20:29.437521Z",{"id":799,"slug":800,"name":801,"summary":802,"price_thb":26,"license_mode":27,"cover_key":803,"cover_url":804,"category_slugs":805,"tags":806,"latest_version":818,"latest_released_at":819,"published_at":820,"has_docs":54,"config":55,"rent_price_satang":56},"7a9dd386-11c0-4f21-8c2e-cfa7dc24d15d","x3d-dailylogin","X3D Daily Login (เช็คอินรายวัน)","เช็คอินรายวัน สตรีค + ตารางรางวัลแก้เองได้ทั้งหมด ฟรี ไม่ต้องลงฐานข้อมูล กระเป๋าเต็มไม่เสียของ ต่อกับเฟรมเวิร์กไหนก็ได้","public\u002Fproducts\u002Fx3d-dailylogin\u002Fcover\u002Fffcad7901926aa67.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-dailylogin\u002Fcover\u002Fffcad7901926aa67.jpg",[31],[33,37,807,808,809,810,811,40,34,812,813,814,815,816,817,50],"เช็คอินรายวัน","daily login","daily reward","สตรีค","รางวัลรายวัน","ล็อคอินรายวัน","รางวัลค้างรับ","รับย้อนหลัง","โบนัสเวลาเล่น","รางวัลเข้าเกม","เช็คชื่อรายวัน","1.4.3","2026-10-12T17:21:47.885233Z","2026-09-20T10:37:48.155794Z",{"id":22,"slug":23,"name":24,"summary":25,"price_thb":26,"license_mode":27,"cover_key":28,"cover_url":29,"category_slugs":822,"tags":823,"latest_version":51,"latest_released_at":52,"published_at":53,"has_docs":54,"config":55,"rent_price_satang":56},[31],[33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],{"id":825,"slug":826,"name":827,"summary":828,"price_thb":26,"license_mode":27,"cover_key":829,"cover_url":830,"category_slugs":831,"tags":832,"latest_version":475,"latest_released_at":843,"published_at":844,"has_docs":54,"config":55,"rent_price_satang":56},"fd28d581-12ee-43b8-9dfb-aa18defe53be","x3d-carry","X3D Carry (อุ้มศพ)","ระบบอุ้มผู้เล่นฟรี — อุ้มศพ แย่งศพ อุ้มพาดบ่า ขี่หลัง ศพอุ้มได้ไม่ต้องขอ คนเป็นต้องขออนุญาตก่อน เซิร์ฟเวอร์ตัดสินทุกอย่าง UI ภาษาไทย","public\u002Fproducts\u002Fx3d-carry\u002Fcover\u002F133f7c2c2d80c8a5.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-carry\u002Fcover\u002F133f7c2c2d80c8a5.jpg",[31],[33,37,833,834,835,40,34,836,837,838,839,840,841,842],"อุ้มศพ","carry","อุ้มผู้เล่น","แย่งศพ","แบกผู้เล่น","ขี่หลัง","อุ้มพาดบ่า","ลากศพ","เมืองแก๊ง","อุ้มเพื่อน","2026-10-12T17:22:50.777785Z","2026-09-16T13:52:19.956202Z",{"id":846,"slug":847,"name":848,"summary":849,"price_thb":26,"license_mode":27,"cover_key":850,"cover_url":851,"category_slugs":852,"tags":853,"latest_version":123,"latest_released_at":864,"published_at":865,"has_docs":54,"config":55,"rent_price_satang":56},"12cb8b4e-b8db-4ad1-a8a2-bd0679aabec5","x3d-environment","X3D Environment (ล้างแมพ)","ล้างแมพให้สะอาด ฟรี ไฟล์เดียว — ปิด NPC รถ AI scenario กล้อง idle ล้างคราบเลือด ลอยยาง รอยกระสุน และรอยแผลบนตัวผู้เล่น","public\u002Fproducts\u002Fx3d-environment\u002Fcover\u002F7aa9b73e2efb1416.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-environment\u002Fcover\u002F7aa9b73e2efb1416.jpg",[732],[33,37,854,732,855,856,857,40,34,858,859,860,861,862,863],"ล้างแมพ","ลดแลค","เพิ่ม FPS","ปิด NPC","ปิดรถ AI","ล้างคราบเลือด","ลบลอยยาง","ปิดกล้อง idle","ลบ NPC","แมพโล่ง","2026-10-12T17:23:03.418375Z","2026-09-16T09:49:13.991696Z",1,31,{"html":869,"headings":870},"\u003Ch2 id=\"การติดตั้ง\">การติดตั้ง\u003C\u002Fh2>\n\u003Col>\n\u003Cli>แตกไฟล์แล้ว \u003Cstrong>เปลี่ยนชื่อโฟลเดอร์เป็น \u003Ccode>x3d_mailbox\u003C\u002Fcode>\u003C\u002Fstrong> (สคริปต์อื่นเรียก export ด้วยชื่อนี้)\u003C\u002Fli>\n\u003Cli>วางใน \u003Ccode>resources\u002F\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>เพิ่มใน \u003Ccode>server.cfg\u003C\u002Fcode>:\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cpre>\u003Ccode>ensure x3d_mailbox\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>เสร็จแล้ว — เก็บข้อมูลเป็นไฟล์ \u003Ccode>data\u002Fmailbox.json\u003C\u002Fcode> ในตัว resource เอง ไม่ต้องรัน SQL ใด ๆ\u003C\u002Fp>\n\u003Cp>ผู้เล่นเปิดกล่องจดหมายด้วย \u003Ccode>\u002Fmailbox\u003C\u002Fcode> หรือปุ่ม \u003Cstrong>F7\u003C\u002Fstrong> (\u003Ccode>Config.Key\u003C\u002Fcode>, ว่าง = ไม่ผูกปุ่ม)\u003C\u002Fp>\n\u003Cp>ในพาเนล: สองแท็บ \u003Cstrong>จดหมาย\u003C\u002Fstrong> (หมดอายุได้) กับ \u003Cstrong>ตู้นิรภัย\u003C\u002Fstrong> (ช่องที่สอง แยกนับ unread\u002Fรับทั้งหมดกันคนละกล่อง — ใช้ส่งของจากโค้ดรับของได้), กดรับทีละฉบับหรือ \u003Cstrong>รับทั้งหมด\u003C\u002Fstrong> ในคลิกเดียว (เฉพาะแท็บที่เปิดอยู่), \u003Cstrong>ลบ\u003C\u002Fstrong> จดหมายที่รับของแล้ว, นับถอยหลังเวลาหมดอายุ, แลกโค้ดผ่านช่องกรอกในพาเนล และเด้งแจ้งเตือนทันทีถ้าผู้เล่นออนไลน์อยู่ตอนได้จดหมายใหม่\u003C\u002Fp>\n\u003Cp>ไม่ต้องใช้ฐานข้อมูล ไม่ต้องใช้เฟรมเวิร์ก ไม่มีไลเซนส์ · ทำงานกับ ESX ได้ทันที และทำงานแบบ standalone ได้ถ้าไม่มีเฟรมเวิร์ก\u003C\u002Fp>\n\u003Ch2 id=\"ต่อกับเฟรมเวิร์ก-4-adapter-ใน-addons\">ต่อกับเฟรมเวิร์ก — 4 adapter ใน \u003Ccode>addons\u002F\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cdiv class=\"table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>โฟลเดอร์\u003C\u002Fth>\n\u003Cth>หน้าที่\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>addons\u002Fframework\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Framework.IsBusy()\u003C\u002Fcode> (client) — เปิดกล่องจดหมายตอนนี้ไม่ได้ไหม (ตาย\u002Fpause menu); \u003Ccode>Framework.Identifier(src)\u003C\u002Fcode> \u002F \u003Ccode>Framework.IsAdmin(src)\u003C\u002Fcode> (server) — คีย์ถาวรของผู้เล่นและสิทธิ์แอดมิน\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>addons\u002Fnotify\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Notify(message, kind)\u003C\u002Fcode> (client) — การแจ้งเตือน\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>addons\u002Freward\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Reward.CanCarry\u003C\u002Fcode> \u002F \u003Ccode>Reward.GiveItem\u003C\u002Fcode> \u002F \u003Ccode>Reward.GiveMoney\u003C\u002Fcode> (server) — ระบบไอเทม\u002Fเงิน\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>addons\u002Fstorage\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Storage.Get\u002FSet\u002FAll\u002FFlush\u003C\u002Fcode> (server) — ที่เก็บข้อมูล (ดูหัวข้อถัดไป)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>ทุกไฟล์มีค่าเริ่มต้นที่ใช้กับ ESX ได้ทันที (เช็ก \u003Ccode>GetResourceState('es_extended')\u003C\u002Fcode> เอง) และมีตัวอย่าง QBCore \u002F ox_lib คอมเมนต์ไว้ท้ายไฟล์ให้คัดลอกทับ ไม่มีเฟรมเวิร์กเลยก็ยังเปิดกล่องจดหมายได้ แค่รับของแนบไม่ได้จนกว่าจะต่อ \u003Ccode>Reward.GiveItem\u003C\u002Fcode>\u002F\u003Ccode>GiveMoney\u003C\u002Fcode> เอง (มี \u003Ccode>print\u003C\u002Fcode> เตือนใน console ถ้ายังไม่ได้ต่อ)\u003C\u002Fp>\n\u003Ch2 id=\"เก็บข้อมูล-json-ค่าเริ่มต้น-หรือสลับเป็น-mysql\">เก็บข้อมูล — JSON ค่าเริ่มต้น หรือสลับเป็น MySQL\u003C\u002Fh2>\n\u003Cp>ค่าเริ่มต้น: ไฟล์ JSON เดี่ยว (\u003Ccode>Config.Storage.File\u003C\u002Fcode>, ค่าเริ่มต้น \u003Ccode>data\u002Fmailbox.json\u003C\u002Fcode>) โหลดครั้งเดียวตอน resource เริ่ม เขียนกลับทุก \u003Ccode>Config.Storage.FlushSeconds\u003C\u002Fcode> วินาที (ค่าเริ่มต้น 30) และตอนผู้เล่นออก\u002Fresource หยุด ไฟล์เสียอ่านไม่ได้ → ย้ายไปเก็บเป็น \u003Ccode>data\u002Fmailbox.broken.json\u003C\u002Fcode> แล้วเริ่มไฟล์ใหม่ ไม่ทับทิ้งของเดิม\u003C\u002Fp>\n\u003Cp>อยากใช้ MySQL แทน:\u003C\u002Fp>\n\u003Col>\n\u003Cli>ตั้ง \u003Ccode>Config.Storage.Driver = 'oxmysql'\u003C\u002Fcode> — ตาราง \u003Ccode>x3d_mailbox\u003C\u002Fcode> ถูกสร้างให้อัตโนมัติ ไม่ต้อง include \u003Ccode>@oxmysql\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>รีสตาร์ท resource เป็นอันเสร็จ (จะแก้ 4 ฟังก์ชัน \u003Ccode>Storage.*\u003C\u002Fcode> ใน \u003Ccode>addons\u002Fstorage\u002Fserver.lua\u003C\u002Fcode> ก็ต่อเมื่อต้องการที่เก็บข้อมูลแบบเขียนเอง)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"exports\">Exports\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-lua\">-- target = server id (number) หรือ identifier (string) ก็ได้\nexports['x3d_mailbox']:SendMail(target, {\n    title   = 'ของรางวัลกิจกรรม',\n    body    = 'ขอบคุณที่เข้าร่วม',\n    sender  = 'ทีมงาน',           -- ไม่ใส่ = ใช้ชื่อกล่องจดหมาย\n    box     = 'mail',             -- 'mail' (ค่าเริ่มต้น, หมดอายุได้) หรือ 'safe' (ตู้ที่สอง)\n    expires = os.time() + 86400,  -- unix timestamp, ไม่ใส่ = ไม่หมดอายุ\n    items   = { { item = 'bread', count = 5 } },\n    money   = { { account = 'money', amount = 500 } },\n})\n\nexports['x3d_mailbox']:SendMailAll({ title = 'ประกาศ', body = 'เซิร์ฟเวอร์จะปิดปรับปรุงคืนนี้' })\n\nexports['x3d_mailbox']:GetMails(src)         --&gt; { {id, title, body, sender, at, expires, read, claimed, box, items, money}, ... }\nexports['x3d_mailbox']:GetUnread(src)        --&gt; number (รวมทุกกล่อง)\nexports['x3d_mailbox']:GetUnread(src, 'safe') --&gt; number (เฉพาะตู้นิรภัย — ใส่ 'mail'\u002F'safe' ได้)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>GetMails\u003C\u002Fcode> กรองจดหมายที่หมดอายุออกให้อัตโนมัติ และแปะ \u003Ccode>label\u003C\u002Fcode> ภาษาไทยจาก \u003Ccode>Config.ItemLabels\u003C\u002Fcode>\u002F\u003Ccode>Config.AccountLabels\u003C\u002Fcode> ลงบนสำเนาที่ส่งออกไป (ไม่แตะของจริงใน storage) \u003Ccode>GetUnread\u003C\u002Fcode> นับเฉพาะฉบับที่ยังไม่อ่านและไม่หมดอายุ คืนกลับเป็นตัวเลขเท่านั้น ไม่มี label\u003C\u002Fp>\n\u003Cp>\u003Ccode>SendMail\u003C\u002Fcode> รับรูปแบบที่กล่องจดหมายเจ้าอื่นใช้ด้วย — \u003Ccode>subject\u003C\u002Fcode>, \u003Ccode>cash\u003C\u002Fcode>\u002F\u003Ccode>bank\u003C\u002Fcode>, \u003Ccode>items = {{ name, count }}\u003C\u002Fcode>, \u003Ccode>expiresInDays\u003C\u002Fcode> — ย้ายจากกล่องจดหมายเก่าแค่เปลี่ยนชื่อ export\u003C\u002Fp>\n\u003Ch2 id=\"events-server-internal-ไม่ใช่-net-event\">Events — server-internal (ไม่ใช่ net event)\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-lua\">AddEventHandler('x3d_mailbox:onSend', function(identifier, mail) end)\nAddEventHandler('x3d_mailbox:onClaim', function(src, mail, ok) end)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>x3d_mailbox:onSend\u003C\u002Fcode> ยิงทันทีที่จดหมายถูกสร้าง (ทั้งจาก export และคำสั่งแอดมิน)\u003C\u002Fp>\n\u003Cp>\u003Ccode>x3d_mailbox:onClaim\u003C\u002Fcode> ยิงหลังพยายามจ่ายของเสมอ — \u003Cstrong>\u003Ccode>mail.claimed\u003C\u002Fcode> เป็น \u003Ccode>true\u003C\u002Fcode> เสมอไม่ว่าจะสำเร็จหรือไม่\u003C\u002Fstrong> (ธงถูกปักไว้ก่อนจ่ายของโดยตั้งใจ กันรับซ้ำ) ต้องเช็กผลจริงที่ arg ที่ 3 — \u003Ccode>ok\u003C\u002Fcode> เป็น \u003Ccode>true\u003C\u002Fcode> เฉพาะตอนของแนบทุกชิ้นจ่ายสำเร็จไม่ throw:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-lua\">AddEventHandler('x3d_mailbox:onClaim', function(src, mail, ok)\n    if not ok then print(('mail %s claimed by %s but a reward failed'):format(mail.id, src)) end\nend)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"คำสั่งแอดมิน\">คำสั่งแอดมิน\u003C\u002Fh2>\n\u003Cp>\u003Ccode>\u002Fmailsend &lt;server id หรือ identifier&gt; &lt;หัวข้อ&gt; &lt;เนื้อหา…&gt;\u003C\u002Fcode> และ \u003Ccode>\u002Fmailsendall &lt;หัวข้อ&gt; &lt;เนื้อหา…&gt;\u003C\u002Fcode> — เรียกจาก in-game console ได้เสมอ เรียกจากผู้เล่นในเกมต้องมี ace \u003Ccode>Config.AdminAce\u003C\u002Fcode> (ค่าเริ่มต้น \u003Ccode>x3d_mailbox.admin\u003C\u002Fcode>)\u003C\u002Fp>\n\u003Ch2 id=\"ความปลอดภัยที่ทดสอบไว้\">ความปลอดภัยที่ทดสอบไว้\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>รับซ้ำไม่ได้\u003C\u002Fstrong> — ธง \u003Ccode>claimed\u003C\u002Fcode> ถูกเขียนลง storage ก่อนจ่ายของทุกครั้ง ไม่มี yield คั่นระหว่างเช็กกับปักธง บวกล็อก \u003Ccode>InFlight[identifier]\u003C\u002Fcode> กันสอง event ที่มาพร้อมกัน\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ของพังไม่ล็อกผู้เล่นค้าง\u003C\u002Fstrong> — การจ่ายของห่อด้วย \u003Ccode>pcall\u003C\u002Fcode> จดหมายยังถูกทำเครื่องหมายว่ารับแล้วแม้จ่ายพัง (item key พิมพ์ผิดจาก \u003Ccode>\u002Fmailsend\u003C\u002Fcode> ก็ไม่ทำให้ผู้เล่นกดรับซ้ำได้ไม่รู้จบ) — ได้ของบางส่วน (partial delivery) ผู้เล่นเห็นข้อความแจ้งแยกต่างหาก ไม่ถูกเงียบเป็น success และของที่จ่ายไปแล้วไม่ถูกย้อนคืน (กันจ่ายซ้ำ)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>จำนวนถูกปัดเป็นจำนวนเต็มก่อนเสมอ\u003C\u002Fstrong> — ของแนบที่เป็นเศษส่วนหรือติดลบเข้าไม่ถึงกระเป๋าผู้เล่น\u003C\u002Fli>\n\u003Cli>\u003Cstrong>คีย์ผู้เล่นเป็น identifier ถาวรเสมอ\u003C\u002Fstrong> ไม่ใช่ server id\u003C\u002Fli>\n\u003Cli>\u003Cstrong>เพดาน \u003Ccode>Config.MaxMails\u003C\u002Fcode> ไม่ลบจดหมายที่ยังไม่ได้รับของ\u003C\u002Fstrong> — ล้นแล้วทิ้งฉบับที่รับของไปแล้วหรือหมดอายุแล้วก่อน (เก่าสุดก่อน) ฉบับที่แค่อ่านแล้วแต่ยังไม่ได้รับของและยังไม่หมดอายุ ของแนบยังอยู่ ไม่ถูกลบ\u003C\u002Fli>\n\u003Cli>\u003Cstrong>รับทั้งหมด = 1 action ไม่ใช่ N\u003C\u002Fstrong> — วนจ่ายด้วยตรรกะเดียวกับกดรับทีละฉบับ เฉพาะกล่องที่เปิดแท็บอยู่ (จดหมาย\u002Fตู้นิรภัยไม่ปนกัน) ฉบับที่กระเป๋าไม่พอถูกข้าม ยังอยู่ให้กดรับใหม่ทีหลัง ไม่มีฉบับไหนถูกจ่ายซ้ำ\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ลบได้เฉพาะจดหมายที่ไม่มีของค้างรับ\u003C\u002Fstrong> — ต้องรับของก่อน (หรือไม่มีของแนบตั้งแต่แรก) — ข้อยกเว้นคือจดหมายที่หมดอายุแล้ว ลบได้เสมอเพราะรับของไม่ได้อีกต่อไปแล้ว (ของตกเป็นโมฆะ) — mail id ที่ client ส่งมาถูกมองหาเฉพาะในลิสต์ของผู้เล่นคนนั้นเองเท่านั้น\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>\u002Fredeem\u003C\u002Fcode> และ event รับโค้ดใช้ throttle + ล็อกเดียวกัน\u003C\u002Fstrong> — สแปมคำสั่งรัว ๆ ไม่ทำให้ได้ของหลายรอบ ฟังก์ชันรับโค้ดเองก็ single-flight ต่อคน กันสอง call ชนกันแม้สลับไปใช้ storage แบบ await\u003C\u002Fli>\n\u003Cli>\u003Cstrong>คีย์ \u003Ccode>Config.Codes\u003C\u002Fcode> ถูกปรับให้ตรงรูปแบบอัตโนมัติตอนเริ่ม\u003C\u002Fstrong> — พิมพ์คีย์ตัวเล็กหรือผสมมาก็ไม่ตกหล่นเงียบ ๆ (มีคำเตือนใน console ถ้าต้องปรับ)\u003C\u002Fli>\n\u003Cli>จำกัด 1 ครั้ง\u002Fวินาที\u002Fคนต่อ action (\u003Ccode>open\u003C\u002Fcode>\u002F\u003Ccode>read\u003C\u002Fcode>\u002F\u003Ccode>claim\u003C\u002Fcode>\u002F\u003Ccode>claimAll\u003C\u002Fcode>\u002F\u003Ccode>delete\u003C\u002Fcode>\u002F\u003Ccode>redeem\u003C\u002Fcode> แยก bucket)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode class=\"language-bash\">pip install lupa\npython tools\u002Flua-test\u002Fx3d_mailbox_check.py\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"ตั้งค่า-config-lua\">ตั้งค่า (\u003Ccode>config.lua\u003C\u002Fcode>)\u003C\u002Fh2>\n\u003Cdiv class=\"table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>ค่า\u003C\u002Fth>\n\u003Cth>ทำอะไร\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Config.Command\u003C\u002Fcode> \u002F \u003Ccode>Config.Key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>คำสั่งเปิด (\u003Ccode>\u002Fmailbox\u003C\u002Fcode>) และปุ่มลัด (\u003Ccode>F7\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Config.MaxMails\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>เก็บต่อคนได้กี่ฉบับ\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Config.AdminAce\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>ace ที่ใช้สั่ง \u003Ccode>\u002Fmailsend\u003C\u002Fcode> \u003Ccode>\u002Fmailsendall\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Config.Storage.File\u003C\u002Fcode> \u002F \u003Ccode>.FlushSeconds\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>ที่เก็บไฟล์ JSON และความถี่ flush\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Config.ItemLabels\u003C\u002Fcode> \u002F \u003Ccode>Config.AccountLabels\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>ชื่อไทยที่โชว์ในกล่องจดหมาย\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Config.ItemImage\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>path รูปไอเทมของ inventory ที่เซิร์ฟใช้ (\u003Ccode>{item}\u003C\u002Fcode> = ชื่อไอเทม), ว่าง = ไม่โชว์รูป\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Config.ExpiryWarnHours\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>จดหมายเหลือเวลาน้อยกว่านี้ (ชั่วโมง) โชว์นับถอยหลังสีแดงในพาเนล (ค่าเริ่มต้น 24)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Config.CanCarryExport\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>export ของ inventory ที่เซิร์ฟใช้ สำหรับเช็กว่ากระเป๋ารับไหว — ว่าง = ใช้ ESX \u003Ccode>canCarryItem\u003C\u002Fcode> · \u003Cstrong>ขึ้น &quot;กระเป๋าเต็ม&quot; ทั้งที่ยังว่าง ให้ตั้งค่านี้\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Ccode>Config.DefaultExpireDays\u003C\u002Fcode> — จดหมายที่ส่งโดยไม่ระบุวันหมดอายุ จะหมดอายุเมื่อครบกี่วันที่ตั้งไว้ (ตู้นิรภัยไม่หมดอายุ)\u003C\u002Fli>\n\u003Cli>\u003Ccode>Config.CheckCarry\u003C\u002Fcode> — \u003Ccode>false\u003C\u002Fcode> = รับของได้แม้กระเป๋าเต็ม\u003C\u002Fli>\n\u003Cli>\u003Ccode>Config.NotifyUnreadOnJoin\u003C\u002Fcode> — แจ้งจำนวนจดหมายที่ยังไม่อ่านตอนผู้เล่นโหลดเข้าเกม\u003C\u002Fli>\n\u003Cli>ชื่อไอเทมที่ไม่มีใน \u003Ccode>Config.ItemLabels\u003C\u002Fcode> จะใช้ชื่อจากเฟรมเวิร์กแทน\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"โค้ดรับของ-redeem-code\">โค้ดรับของ (redeem code)\u003C\u002Fh2>\n\u003Cp>ผู้เล่นพิมพ์ \u003Ccode>\u002Fredeem &lt;โค้ด&gt;\u003C\u002Fcode> หรือกรอกโค้ดในช่องบนพาเนลกล่องจดหมายเลยก็ได้ แล้วของจะถูก \u003Cstrong>ส่งเป็นจดหมาย\u003C\u002Fstrong> เข้ากล่อง — กระเป๋าเต็มก็ไม่มีวันหาย เพราะไปรออยู่ในจดหมาย\u003C\u002Fp>\n\u003Cp>โค้ดถาวรใส่ใน \u003Ccode>config.lua\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-lua\">Config.Codes = {\n    WELCOME2026 = {\n        maxUses       = 0,        -- 0 = ไม่จำกัดจำนวนครั้งทั้งเซิร์ฟ\n        oncePerPlayer = true,     -- คนละครั้งเดียว (ค่าเริ่มต้น)\n        title         = 'ยินดีต้อนรับ',\n        items         = { { item = 'bread', count = 2 } },\n        money         = { { account = 'bank', amount = 1000 } },\n    },\n    EVENTONLY = {\n        maxUses = 100,            -- 100 คนแรกเท่านั้น\n        expires = 1790000000,     -- เวลา unix ที่โค้ดหมดอายุ\n        box     = 'safe',         -- ส่งเข้าตู้นิรภัยแทนกล่องจดหมาย (ไม่บังคับ, ค่าเริ่มต้น 'mail')\n        money   = { { account = 'money', amount = 5000 } },\n    },\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>สร้างโค้ดตอนรัน (หายเมื่อรีสตาร์ท) จาก resource อื่น:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-lua\">exports['x3d_mailbox']:AddCode('EVENT2026', { maxUses = 50, money = { { account = 'bank', amount = 2000 } } })\nexports['x3d_mailbox']:RemoveCode('EVENT2026')\nexports['x3d_mailbox']:GetCodeUsage('EVENT2026')   --&gt; { uses = 12, by = { ['license:xxx'] = true } }\nexports['x3d_mailbox']:Redeem(src, 'EVENT2026')    --&gt; ok, reason\n\nAddEventHandler('x3d_mailbox:onRedeem', function(src, code, def) end)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>ยอดใช้โค้ดเก็บอยู่ในที่เดียวกับจดหมาย (คีย์ระบบ \u003Ccode>__redeem\u003C\u002Fcode>) — อยู่ครบหลังรีสตาร์ท และคำสั่งกระจายจดหมายทั้งเซิร์ฟไม่แตะคีย์นี้\u003C\u002Fp>\n\u003Ch2 id=\"ช่วยเหลือ\">ช่วยเหลือ\u003C\u002Fh2>\n\u003Cp>Discord: discord.gg\u002Fx3d-developer · เว็บ: x3d-developer.com\u003C\u002Fp>\n",[871,874,877,880,883,886,888,890,893,896],{"id":872,"text":872,"level":873},"การติดตั้ง",2,{"id":875,"text":876,"level":873},"ต่อกับเฟรมเวิร์ก-4-adapter-ใน-addons","ต่อกับเฟรมเวิร์ก — 4 adapter ใน addons\u002F",{"id":878,"text":879,"level":873},"เก็บข้อมูล-json-ค่าเริ่มต้น-หรือสลับเป็น-mysql","เก็บข้อมูล — JSON ค่าเริ่มต้น หรือสลับเป็น MySQL",{"id":881,"text":882,"level":873},"exports","Exports",{"id":884,"text":885,"level":873},"events-server-internal-ไม่ใช่-net-event","Events — server-internal (ไม่ใช่ net event)",{"id":887,"text":887,"level":873},"คำสั่งแอดมิน",{"id":889,"text":889,"level":873},"ความปลอดภัยที่ทดสอบไว้",{"id":891,"text":892,"level":873},"ตั้งค่า-config-lua","ตั้งค่า (config.lua)",{"id":894,"text":895,"level":873},"โค้ดรับของ-redeem-code","โค้ดรับของ (redeem code)",{"id":897,"text":897,"level":873},"ช่วยเหลือ",1792316306469]