[{"data":1,"prerenderedAt":111},["ShallowReactive",2],{"site":3,"config-slug-site":15,"config-product-th-x3d-inventory":21,"config-public-x3d-inventory":94},{"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":33,"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},"d76ff7ae-ded6-4f39-b63f-734181952698","x3d-inventory","X3D Inventory (กระเป๋า)","กระเป๋าไอเทม ESX ฟรี ตัวหนังสือไทยใหญ่ ช่องลัด 1–9 บันทึกกับตัวละคร ความจุขยายด้วยคูปอง ต่อตู้เซฟ\u002Fท้ายรถได้ทุกสคริปต์",0,"none","public\u002Fproducts\u002Fx3d-inventory\u002Fcover\u002Ffc3857e556cf31f3.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-inventory\u002Fcover\u002Ffc3857e556cf31f3.jpg",[31,32],"inventory","hud",[31,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"กระเป๋า","กระเป๋า fivem","ui กระเป๋า","esx inventory","inventory fivem","ช่องลัด","hotbar","ไอเทม","nui","esx","ฟรี","free","คูปองขยายช่อง","คูปองน้ำหนัก","ความหายากไอเทม","ค้นกระเป๋า","จำกัดน้ำหนัก","1.1.4","2026-10-12T17:16:22.733967Z","2026-10-05T04:10:14.693356Z",true,"public",null,"# กระเป๋าไอเทม ESX ที่อ่านง่าย ลื่น และต่อกับระบบอื่นได้ทันที\n\nกระเป๋าไอเทมสำหรับ ESX Legacy หน้าจอ Nuxt 4 ตัวหนังสือไทยใหญ่ชัด ไอคอนไอเทมใหญ่ มีกรอบสีตามความหายาก ลากวาง แยกกอง ช่องลัด 1–9 พร้อมใช้ตั้งแต่ติดตั้ง\n\n---\n\n## ฟีเจอร์\n\n- [+] ตั้งค่าง่าย ปรับได้หมดใน config หรือตั้งผ่านเว็บได้เลย\n- [+] ช่องลัด 1–9 บันทึกกับตัวละคร เลือกตำแหน่งแถบช่องลัดได้\n- [+] ตั้งช่องและน้ำหนักเริ่มต้นเอง ขยายถาวรด้วยคูปองช่อง\u002Fน้ำหนัก\n- [+] Value Pack ห่อสารพัดประโยชน์ เพิ่มช่องและน้ำหนักชั่วคราวตามจำนวนวัน\n- [+] กรอบสีตามความหายากของไอเทม ตั้งระดับรายไอเทมได้\n- [+] ตั้งจำนวนต่อช่อง (กอง) แยกรายไอเทมได้\n- [+] คูลดาวน์ใช้ไอเทมรายชิ้น ลดตามอาชีพได้\n- [+] เปิดปิดทีละระบบ ความทนทาน น้ำหนัก จำนวนช่อง จำกัดกอง\n- [+] ตั้งว่าเงินเขียว เงินแดง ธนาคาร จะโชว์เป็นช่องในกระเป๋าหรือไม่\n- [+] ตำรวจและแอดมินค้นกระเป๋าผู้เล่นได้ ตั้งอาชีพและกลุ่มเอง\n- [+] ต่อตู้เซฟ ท้ายรถ คลังของสคริปต์อื่นได้ผ่าน 3 export\n- [+] เขียนเชื่อมกับสคริปต์อื่นได้ที่ addons\u002F\n\n---\n\n## ช่องลัด 1–9 ที่ไม่หาย\n\nลากไอเทมไปวางที่แถบล่าง กดเลขใช้ได้ทันที ช่องลัดบันทึกกับตัวละครในฐานข้อมูล เปลี่ยนเครื่องหรือล้างแคชก็ยังอยู่\n\n## ความจุที่ขยายได้\n\nช่องและน้ำหนักเริ่มต้นตั้งเองได้ ขยายถาวรด้วยคูปองช่อง\u002Fคูปองน้ำหนัก หรือเพิ่มชั่วคราวด้วยห่อสารพัดประโยชน์ (Value Pack) — ไอเทมพร้อมรูปมาใน `install.sql` แล้ว\n\n## ปลอดภัยฝั่งเซิร์ฟเวอร์\n\n- ทุกการใช้ ส่ง ทิ้ง และค้นกระเป๋า ตรวจที่เซิร์ฟเวอร์ ทั้งจำนวน ระยะ และสิทธิ์\n- ล็อกกันกดส่งของซ้อน และคูลดาวน์การใช้ไอเทมรายชิ้น\n- ปิดระบบได้ทีละส่วน: ความทนทาน น้ำหนัก จำนวนช่อง จำกัดกอง\n\n## ต่อกับสคริปต์อื่นได้ง่าย\n\n- ตู้เซฟ ท้ายรถ หรือคลังของสคริปต์ไหนก็ได้ ใช้หน้าคลังเดียวกันผ่าน 3 export\n- `RegisterDurabilityProvider` ให้สคริปต์อาชีพโชว์แถบความทนทานบนช่องไอเทม\n- สกินอาวุธกับ [X3D Weapon Skins](\u002Fth\u002Fproducts\u002Fx3d-weaponskins\u002F) เปลี่ยนสกินจากเมนูคลิกขวา ช่องปืนขึ้นป้ายสกินและ tooltip ไม่ต้องตั้งค่าเพิ่ม\n- hook ปุ่มขาย ปุ่มคู่มือ และกุญแจรถ ปล่อยว่าง = ซ่อนปุ่มนั้น\n\n## สองภาษา\n\nเลือก `Config.Locale = 'th'` หรือ `'en'` คำอธิบายไอเทมใส่ได้ทั้งสองภาษา\n\n**ฟรี** · แก้โค้ดได้ตามใจ · ขอแค่อย่านำไปขายต่อและอย่าอัปโหลดใหม่ในชื่อตัวเอง\n\nของที่ทิ้งบนพื้นมีป้าย 3D อ่านง่าย ชื่อไอเทมภาษาไทยแสดงถูกต้อง และบรรทัดเก็บของเปลี่ยนตามภาษาที่ตั้ง (`[E] เก็บของ` \u002F `[E] Pick up`)\n","## การติดตั้ง\n\nต้องมี `es_extended` (ESX Legacy) และ `oxmysql` · ไม่บังคับ: `esx_notify`\n\n1. แตกไฟล์ วางโฟลเดอร์ `x3d_inventory` ใน `resources\u002F` (ห้ามเปลี่ยนชื่อโฟลเดอร์ — รูปไอเทมและ export อ้างชื่อนี้)\n2. รัน `install.sql` บนฐานข้อมูล ESX — สร้างตารางช่องลัด และเพิ่มไอเทมตัวอย่าง (ไม่ทับไอเทมที่มีอยู่แล้ว)\n3. เพิ่มใน `server.cfg` ต่อจาก `es_extended`:\n\n```\nensure x3d_inventory\n```\n\n4. ปิดสคริปต์กระเป๋าตัวเดิมของเซิร์ฟเวอร์ให้เหลือตัวเดียว\n\n## ปุ่มและคำสั่ง\n\n| ปุ่ม \u002F คำสั่ง | ทำอะไร |\n|---|---|\n| `T` | เปิด\u002Fปิดกระเป๋า (`Config.OpenKey`) — ผู้เล่นเปลี่ยนเองได้ในเมนูปุ่มลัด FiveM |\n| `1`–`9` | ใช้ไอเทมในช่องลัด |\n| ดับเบิลคลิก \u002F คลิกขวา | ใช้ไอเทม \u002F เมนูไอเทม |\n| `\u002Fclosebag` | ปิดกระเป๋าเผื่อหน้าจอค้าง (`Config.CloseCommand`) |\n| `\u002Fx3dinv \u003Cid>` | แอดมินค้นกระเป๋าผู้เล่นอื่น (`Config.AdminSearchCommand`, กลุ่มใน `Config.SearchGroups`) |\n\n## ไฟล์ตั้งค่า\n\n| ไฟล์ | เรื่อง |\n|---|---|\n| `config.lua` | ภาษา, ปุ่ม\u002Fคำสั่ง, เปิด-ปิดระบบ (ความทนทาน, น้ำหนัก, จำนวนช่อง, จำกัดกอง), การส่ง\u002Fทิ้ง\u002Fค้น, เงิน, ช่องลัด, คูลดาวน์ |\n| `config\u002Fcatalog.lua` | ไอเทม: ความหายาก, จำนวนต่อช่อง, กฎใช้\u002Fทิ้ง\u002Fมอบ, คำอธิบาย |\n| `config\u002Fweapons.lua` | ชื่ออาวุธภาษาไทย, ความหายาก\u002Fน้ำหนักอาวุธ, ท่าหยิบ-เก็บ |\n| `config\u002Fcapacity.lua` | ช่อง\u002Fน้ำหนักเริ่มต้น, คูปองขยาย, Value Pack |\n| `config\u002Fheldobjects.lua` | วัตถุในมือตอน ส่ง\u002Fรับ\u002Fเก็บ\u002Fทิ้ง |\n| `addons\u002Fhooks\u002F*.lua` | ต่อกับสคริปต์อื่น (ปุ่มขาย, ปุ่มคู่มือ, กุญแจรถ) |\n\n## เพิ่มไอเทมของเซิร์ฟเวอร์\n\n1. เพิ่มไอเทมในตาราง `items` ของ ESX\n2. วางรูป PNG ชื่อเดียวกับไอเทม (ตัวพิมพ์เล็ก) ที่ `web\u002Fbuild\u002Fimg\u002Fitems\u002F\u003Cชื่อไอเทม>.png` แนะนำ 92×92 พื้นใส\n3. (ไม่บังคับ) ใส่ความหายากและคำอธิบายใน `config\u002Fcatalog.lua`:\n\n```lua\nConfig.ItemRarity = { ['my_item'] = 2 }\nConfig.Descriptions = { item = { ['my_item'] = { th = 'ไอเทมของฉัน', en = 'My item' } } }\n```\n\n## ตู้เซฟ \u002F ท้ายรถ \u002F คลังของสคริปต์อื่น\n\nสคริปต์คลังเรียก 3 export ฝั่ง client แล้วกระเป๋าจะยิงอีเวนต์ฝั่งเซิร์ฟเวอร์ที่ตั้งชื่อไว้ตอนลากของเข้า\u002Fออก\u002Fปิด การเก็บข้อมูลและตรวจสิทธิ์เป็นหน้าที่ของสคริปต์คลัง:\n\n```lua\nexports.x3d_inventory:SetCurrentVaultData({\n    events = { store = 'myvault:store', take = 'myvault:take', close = 'myvault:close' },\n    args = { vaultId },\n})\nexports.x3d_inventory:UpdateStorageData({ inventory = items, label = 'ตู้เซฟ', weight = 10, maxWeight = 100 })\nexports.x3d_inventory:OpenStorage()\n```\n\nฝั่งเซิร์ฟเวอร์ได้รับ `(...args, { name, label, count, weight })` · ไม่ใส่ `events` = กระเป๋าไม่ยอมให้ลาก (ของไม่หาย)\n\n## ความทนทานจากสคริปต์อื่น\n\n```lua\nexports.x3d_inventory:RegisterDurabilityProvider('pickaxe', function(proxy, raw)\n    return { dur = 70, max = 100 }   -- หรือคืนเลข 0–100\nend)\n```\n\n## สกินอาวุธ (X3D Weapon Skins)\n\nเปิด [X3D Weapon Skins](\u002Fth\u002Fproducts\u002Fx3d-weaponskins\u002F) ไว้ กระเป๋าจะรองรับสกินเองโดยไม่ต้องตั้งค่า (อ่าน `GlobalState.x3dWeaponSkins` ไม่ผูก dependency):\n\n- คลิกขวาที่ปืนมีเมนู \"เปลี่ยนสกิน\" และมีปุ่ม \"สกิน\" ที่หัวกระเป๋า\n- ช่องปืนขึ้นป้ายสกิน tooltip บอกว่าเป็นสกินของปืนอะไร ดาเมจเท่าไหร่\n- เปลี่ยนสกินแล้วปืนยังอยู่ในมือ ช่องลัดตามไปด้วย\n\nฝั่ง X3D Weapon Skins ตั้ง `Config.ImagePath` เป็น `nui:\u002F\u002Fx3d_inventory\u002Fweb\u002Fbuild\u002Fimg\u002Fitems\u002F%s.png` และ `Hooks.CanCarry` ให้เรียก `exports.x3d_inventory:CanCarryItemSrc`\n\n## Exports\n\nฝั่ง client: `OpenInventory` `CloseInventory` `IsInventoryOpen` `OpenStorage` `CloseStorage` `SetCurrentVaultData` `UpdateStorageData` `HideQuickSlots` `ShowQuickSlots` `Notify`\n\nฝั่ง server: `GetPlayerInventory` `CanCarryItem` `GetFreeSlots` `CheckItemFit` `GetCapacity` `AddSlots` `AddWeight` `GrantValuePack` `HasValuePack` `RegisterDurabilityProvider`\n","สคริปต์กระเป๋า ESX FiveM ฟรี ช่องลัด 1-9","สคริปต์กระเป๋าไอเทม FiveM ESX ฟรี หน้าจอไทยอ่านง่าย ช่องลัด 1–9 ไม่หาย ขยายช่องด้วยคูปอง ตรวจทุกอย่างฝั่งเซิร์ฟเวอร์ รองรับไทยและอังกฤษ",[62,65,67,69,71,73],{"kind":63,"url":64},"image","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-inventory\u002Fmedia\u002Fe69ea70e81e7ba0d.png",{"kind":63,"url":66},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-inventory\u002Fmedia\u002F205aa6c1deaa3417.png",{"kind":63,"url":68},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-inventory\u002Fmedia\u002F7961287898741eba.png",{"kind":63,"url":70},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-inventory\u002Fmedia\u002Fb8da680936dfc566.png",{"kind":63,"url":72},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-inventory\u002Fmedia\u002F69cd7c93e1ee5ae2.png",{"kind":63,"url":74},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-inventory\u002Fmedia\u002F85359e7579aac422.png",[76,78,82,86,90],{"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.1.2","2026-10-12T03:22:26.726847Z","### Changed\n\n- New store images",{"version":83,"released_at":84,"changelog_md":85},"1.1.1","2026-10-11T09:17:12.89037Z","### Changed\n\n- Ground-drop labels use the X3D 3D-text standard; Thai item names no longer render as broken glyphs, and the pick-up line is localized (`[E] เก็บของ` \u002F `[E] Pick up`)",{"version":87,"released_at":88,"changelog_md":89},"1.1.0","2026-10-10T11:46:35.452391Z","### Added\r\n- Works with X3D Weapon Skins (optional): \"Change skin\" right-click entry, \"Skins\" header button, skin tag and \"skin of \u002F damage\" tooltip rows on skinned weapons; the weapon stays in hand and hotkeys follow after a skin change (reads `GlobalState.x3dWeaponSkins`, no dependency)\r\n### Changed\r\n- One font for Thai and English (Kanit), self-hosted\r\n### Fixed\r\n- The Thai font never loaded in game: the build wrote `format(woff2)` unquoted, which FiveM's Chromium 103 rejects, so text fell back to the system font",{"version":91,"released_at":92,"changelog_md":93},"1.0.0","2026-10-05T04:10:06.72292Z","### Added\n- First store release: ESX Legacy inventory with a Nuxt 4 screen, drag and drop, stack split, search, category filters and rarity colours\n- Hotkeys 1–9 saved per character in `x3d_inventory_quickslots`; a new PC or a cleared cache restores them\n- Bag capacity in slots and weight, raised by slot\u002Fweight coupons and Value Packs (`config\u002Fcapacity.lua`)\n- Feature switches for durability, weight, slot count and stack limit\n- Storage panel for any vault or trunk script (`SetCurrentVaultData`, `UpdateStorageData`, `OpenStorage`)\n- `RegisterDurabilityProvider` for other scripts to show a durability bar on a slot\n- Hooks for a sell button, a guide button, an open callback, emote cancel and vehicle keys\n- Thai and English (`Config.Locale`), item descriptions in both languages\n- `install.sql` with the hotkey table and example items that never overwrite existing ones",{"slug":23,"version":51,"latest_version":51,"files":95,"options":56},[96,99,102,105,108],{"path":97,"content":98},"config.lua","-- ═══════════════════════════════════════════════════════════════\n--  x3d_inventory — ตั้งค่าหลัก \u002F main settings\n--  X3D-Developer · https:\u002F\u002Fx3d-developer.com\n--  ไอเทม (ความหายาก, จำนวนต่อช่อง, คำอธิบาย) อยู่ที่ config\u002Fcatalog.lua\n--  Item data (rarity, stack size, descriptions) lives in config\u002Fcatalog.lua\n-- ═══════════════════════════════════════════════════════════════\n\nConfig = {}\n\n-- ===== ทั่วไป \u002F General =====\n\n-- ภาษาของหน้าจอและข้อความแจ้งเตือน: 'th' | 'en'\n-- Language of the screens and messages: 'th' | 'en'\nConfig.Locale = 'th'\n\n-- พิมพ์ log ดีบักลง console (ปิดไว้ตอนเปิดเซิร์ฟจริง)\n-- Print debug logs to the console (keep off on a live server)\nConfig.Debug = false\n\n-- ===== ปุ่มและคำสั่ง \u002F Keys and commands =====\n\n-- ปุ่มเปิด\u002Fปิดกระเป๋า (ผู้เล่นเปลี่ยนเองได้ใน ตั้งค่า > ปุ่มลัด > FiveM)\n-- Bag toggle key (players can rebind it in Settings > Key Bindings > FiveM)\nConfig.OpenKey = 't'\n\n-- คำสั่งปิดกระเป๋า (เผื่อหน้าจอค้าง)\n-- Command that force-closes the bag (in case the screen gets stuck)\nConfig.CloseCommand = 'closebag'\n\n-- คำสั่งแอดมินค้นกระเป๋าผู้เล่นอื่น: \u002Fx3dinv \u003Cid>\n-- Admin command to search another player's bag: \u002Fx3dinv \u003Cid>\nConfig.AdminSearchCommand = 'x3dinv'\n\n-- ===== เปิด\u002Fปิดระบบ \u002F Feature switches =====\n\n-- ความทนทาน: false = ไม่โชว์แถบทนทานเลย แม้สคริปต์อื่นลงทะเบียนไว้ (RegisterDurabilityProvider)\n-- Durability: false = no durability bar at all, even when other scripts register providers\nConfig.Durability = { enabled = true }\n\n-- จำกัดจำนวนต่อช่อง: false = ซ้อนได้ไม่จำกัด\n-- Stack limit per slot: false = unlimited stacking\nConfig.StackLimit = { enabled = true }\n\n-- น้ำหนัก: false = ไม่คิดน้ำหนักและซ่อนแถบน้ำหนัก · max_weight = เพดานสำรองเมื่อไม่มีข้อมูลความจุ\n-- Weight: false = no weight and the weight bar is hidden · max_weight = fallback cap when no capacity data exists\nConfig.Weight = { enabled = true, max_weight = 20000 }\n\n-- จำนวนช่อง: false = ไม่จำกัดช่องและซ่อนตัวนับ · max_slots = ค่าสำรองเมื่อไม่มีข้อมูลความจุ\n-- Slot count: false = unlimited slots and the counter is hidden · max_slots = fallback when no capacity data exists\nConfig.SlotLimit = { enabled = true, max_slots = 34 }\n\n-- เสียงคลิกของเกมตอนกดใช้ไอเทม\n-- Play the game's click sound when an item is used\nConfig.Sounds = true\n\n-- เบลอฉากหลังตอนเปิดกระเป๋า\n-- Blur the game behind the open bag\nConfig.Blur = false\n\n-- เปิดกระเป๋าได้ระหว่างตาย\n-- Allow opening the bag while dead\nConfig.OpenWhileDead = false\n\n-- ห้ามเปิดกระเป๋าระหว่างอยู่ในรถ\n-- Block opening the bag while in a vehicle\nConfig.BlockInVehicle = true\n\n-- ===== ส่ง ทิ้ง ค้น \u002F Give, drop, search =====\n\n-- ระยะส่งของให้ผู้เล่นอื่น (เมตร) — เซิร์ฟเวอร์ตรวจซ้ำ\n-- Give distance in metres — re-checked by the server\nConfig.GiveDistance = 3.0\n\n-- ลากไปถังขยะ = ลบไอเทมทิ้ง\n-- Dragging onto the trash deletes the item\nConfig.DropToTrash = true\n\n-- true = ทิ้งลงพื้นให้คนอื่นเก็บได้ แทนการลบ (ทับ DropToTrash)\n-- true = drop onto the ground for others to pick up instead of deleting (overrides DropToTrash)\nConfig.DropToGround = false\n\n-- ของบนพื้นหายไปหลังกี่วินาที\n-- Seconds before a ground drop disappears\nConfig.GroundDropLifetime = 300\n\n-- ระยะค้นกระเป๋าผู้เล่นอื่น (เมตร) — เซิร์ฟเวอร์ตรวจซ้ำ\n-- Bag search distance in metres — re-checked by the server\nConfig.SearchDistance = 3.0\n\n-- กลุ่มแอดมิน (xPlayer.getGroup()) ที่ค้นกระเป๋าผู้อื่นได้\n-- Admin groups (xPlayer.getGroup()) allowed to search other bags\nConfig.SearchGroups = { admin = true, superadmin = true }\n\n-- อาชีพที่ค้นกระเป๋าผู้อื่นได้\n-- Jobs allowed to search other bags\nConfig.SearchJobs = { police = true }\n\n-- ===== เงินในกระเป๋า \u002F Money in the bag =====\n\n-- บัญชีที่โชว์เป็นช่องในกระเป๋า (bank โชว์ที่กล่องเงินด้านบนเสมอ)\n-- Accounts shown as bag slots (bank always shows in the money box at the top)\nConfig.AccountSlots = { money = true, bank = false, black_money = true }\n\n-- ชื่อบัญชีที่โชว์ (ทับชื่อจาก ESX ซึ่งเป็นภาษาอังกฤษ) \u002F account names shown (override the English ESX labels)\nConfig.AccountLabels = {\n\tmoney = { th = 'เงินสด', en = 'Cash' },\n\tblack_money = { th = 'เงินผิดกฎหมาย', en = 'Dirty Money' },\n\tbank = { th = 'ธนาคาร', en = 'Bank' },\n}\n\n-- น้ำหนักต่อ $1 ของแต่ละบัญชี (ไม่ใส่ = 0)\n-- Weight per $1 for each account (unset = 0)\n-- เช่น \u002F e.g. Config.AccountWeight = { black_money = 0.001 }\nConfig.AccountWeight = {}\n\n-- ความหายากของช่องเงิน 0–4 (ไม่ใส่ = 0)\n-- Rarity of the money slots 0–4 (unset = 0)\nConfig.AccountRarity = { money = 4 }\n\n-- บัญชีที่ห้ามทิ้ง \u002F ห้ามมอบ\n-- Accounts that can't be dropped \u002F given\nConfig.AccountRules = {\n\tdrop = { type = 'block', list = { 'bank' } },\n\tgive = { type = 'block', list = { 'bank' } },\n}\n\n-- ลำดับการเรียงในกระเป๋า (เลขน้อยขึ้นก่อน)\n-- Sort order in the bag (lower number first)\nConfig.SortOrder = { account = 1, personal = 2, house_key = 3, vehicle_key = 4, accessory = 5, item = 6, weapon = 7 }\n\n-- ===== ช่องลัด 1–9 \u002F Hotkeys 1–9 =====\n\n-- alwaysShow = แถบช่องลัดโชว์ตลอดเวลา · showOnKeyPress = โชว์ตอนกดเลข · defaultCooldown = ms ระหว่างการใช้\n-- alwaysShow = hotkey bar always visible · showOnKeyPress = show it when a number is pressed · defaultCooldown = ms between uses\nConfig.QuickSlots = {\n\tenabled = true,\n\talwaysShow = true,\n\tshowOnKeyPress = true,\n\tposition = 'bottom',\t-- 'bottom' | 'bottom-left' | 'bottom-right'\n\tslots = 9,\n\tdefaultCooldown = 3000,\n}\n\n-- คูลดาวน์เฉพาะไอเทม (ms) — 0 \u002F false = ไม่มีคูลดาวน์\n-- Per-item cooldown in ms — 0 \u002F false = none\nConfig.ItemCooldowns = {\n\t-- ['bandage'] = 5000,\n\t-- ['medkit'] = 10000,\n\t['vest'] = 5000,\n\t['vest_training'] = 5000,\n\t['helmet'] = 3000,\n}\n\n-- ไอเทมที่ใช้ได้ทันทีไม่มีคูลดาวน์\n-- Items with no cooldown at all\nConfig.NoCooldownItems = {\n\t-- 'phone',\n\t-- 'radio',\n}\n\n-- ตัวคูณคูลดาวน์ตามอาชีพ (0.5 = เร็วขึ้นครึ่งหนึ่ง)\n-- Cooldown multiplier per job (0.5 = twice as fast)\nConfig.JobCooldownModifiers = {\n\t['ambulance'] = { items = { ['bandage'] = 0.5, ['medkit'] = 0.5 } },\n}\n\n-- ลดคูลดาวน์เพิ่มตามระดับอาชีพ: ตัวคูณ - (grade × gradeReduction) แต่ไม่ต่ำกว่า minModifier\n-- Extra cooldown cut by job grade: multiplier - (grade × gradeReduction), never below minModifier\nConfig.JobGradeCooldownReduction = { enabled = false, gradeReduction = 0.05, minModifier = 0.5 }\n\n-- ===== ต่อกับสคริปต์อื่น \u002F Other scripts =====\n\n-- อีเวนต์ฝั่ง client ที่สั่งปิดกระเป๋าทันที เช่น { 'myserver:restartLock' }\n-- Client events that close the bag at once, e.g. { 'myserver:restartLock' }\nConfig.CloseEvents = {}\n\n-- อีเวนต์ชุบชีวิตที่ไม่ยิง playerSpawned (คืนสถานะอาวุธ) เช่น { 'myrespawn:revived' }\n-- Revive events that never fire playerSpawned (restores weapon state), e.g. { 'myrespawn:revived' }\nConfig.ReviveEvents = {}\n\n-- ชื่อ GlobalState ที่บอกว่าเซิร์ฟเวอร์ล็อกก่อนรีสตาร์ท (ค่า { lock = true }) — nil = ไม่ใช้\n-- GlobalState key marking the pre-restart lock (value { lock = true }) — nil = not used\n-- เช่น \u002F e.g. Config.RestartLockState = 'restartlock'\nConfig.RestartLockState = nil\n\nfunction printDebug(message)\n\tif Config.Debug then print(message) end\nend\n",{"path":100,"content":101},"config\u002Fcapacity.lua","-- ===== ความจุ \u002F Capacity =====\n\n-- ความจุกระเป๋า (ช่อง + น้ำหนัก) ที่ขยายได้ด้วยคูปองและห่อสารพัดประโยชน์\n-- Bag capacity (slots + weight) that grows with coupons and Value Packs\nConfig.Capacity = {\n    -- ช่องเริ่มต้นของผู้เล่นใหม่ \u002F starting slots for a new player\n    baseSlots     = 34,\n    -- เพดานช่องสูงสุด ขยายเท่าไรก็เกินนี้ไม่ได้ \u002F slot cap, no upgrade goes past it\n    hardMaxSlots  = 189,\n    -- น้ำหนักเริ่มต้นของผู้เล่นใหม่ \u002F starting weight for a new player\n    baseWeight    = 3000,\n    -- เพดานน้ำหนักสูงสุด ขยายเท่าไรก็เกินนี้ไม่ได้ \u002F weight cap, no upgrade goes past it\n    hardMaxWeight = 20000,\n    vpSlots       = 16,    -- โบนัสช่องจาก Value Pack ขณะออกฤทธิ์ \u002F slot bonus while a Value Pack is active\n    vpWeight      = 1000,  -- โบนัสน้ำหนักจาก Value Pack ขณะออกฤทธิ์ \u002F weight bonus while a Value Pack is active\n}\n\n-- ===== คูปองขยายช่อง \u002F Slot coupons =====\n\n-- ไอเทมคูปองขยายช่อง (ถาวร) -> จำนวนช่องที่เพิ่ม\n-- Slot coupon items (permanent) -> slots added\n-- เช่น \u002F e.g. ['slot_coupon_1'] = 1\nConfig.SlotCoupons = {\n    ['slot_coupon_1']  = 1,\n    ['slot_coupon_4']  = 4,\n    ['slot_coupon_8']  = 8,\n    ['slot_coupon_16'] = 16,\n}\n\n-- ===== คูปองขยายน้ำหนัก \u002F Weight coupons =====\n\n-- ไอเทมคูปองขยายน้ำหนัก (ถาวร) -> น้ำหนักที่เพิ่ม (LT)\n-- Weight coupon items (permanent) -> weight added (LT)\n-- เช่น \u002F e.g. ['weight_coupon_50'] = 50\nConfig.WeightCoupons = {\n    ['weight_coupon_50']  = 50,\n    ['weight_coupon_100'] = 100,\n    ['weight_coupon_200'] = 200,\n    ['weight_coupon_500'] = 500,\n}\n\n-- ===== ห่อสารพัดประโยชน์ \u002F Value Pack =====\n\n-- ห่อสารพัดประโยชน์ (Value Pack) -> จำนวนวันที่ออกฤทธิ์\n-- Value Pack items -> days of effect\n-- เช่น \u002F e.g. ['valuepack_7'] = 7\nConfig.ValuePacks = {\n    ['valuepack_7']  = 7,\n    ['valuepack_15'] = 15,\n    ['valuepack_30'] = 30,\n}\n",{"path":103,"content":104},"config\u002Fcatalog.lua","-- ═══════════════════════════════════════════════════════════════\n--  x3d_inventory — ข้อมูลไอเทม \u002F item data\n--  ตัวอย่างตรงกับไอเทมใน install.sql — เพิ่มไอเทมของเซิร์ฟเวอร์คุณได้เลย\n--  The examples match the items in install.sql — add your server's own items\n--  รูปไอเทม: web\u002Fbuild\u002Fimg\u002Fitems\u002F\u003Cชื่อไอเทม>.png  ·  item pictures: web\u002Fbuild\u002Fimg\u002Fitems\u002F\u003Citem>.png\n-- ═══════════════════════════════════════════════════════════════\n\n-- ===== รูปไอเทม \u002F Item pictures =====\n\n-- นามสกุลรูปไอเทม และรายการที่ใช้นามสกุลอื่น\n-- Item picture extension, and items that use a different one\nConfig.ImageExtension = 'png'\nConfig.ImageExtensionFor = {\n\t-- ['my_item'] = 'webp',\n}\n\n-- ===== จำนวนต่อช่อง \u002F Stack sizes =====\n\n-- จำนวนสูงสุดต่อช่องของไอเทมที่ไม่ได้ระบุ \u002F max stack for items not listed below\nConfig.DefaultStackSize = 100\n\n-- จำนวนสูงสุดต่อช่องรายไอเทม \u002F max stack per item\nConfig.StackSize = {\n\t['food_lunchbox'] = 10,\n\t['drink_water'] = 10,\n\t['medkit'] = 5,\n\t['aed'] = 1,\n}\n\n-- ===== ความหายาก \u002F Rarity =====\n\n-- ความหายาก 0–4 (สามัญ → ตำนาน) · ไม่ใส่ = ใช้คอลัมน์ rare ในตาราง items\n-- Rarity 0–4 (common → legendary) · unset = the `rare` column of the items table\nConfig.ItemRarity = {\n\t['food_lunchbox'] = 0,\n\t['drink_water'] = 0,\n\t['milk'] = 0,\n\t['bandage'] = 0,\n\t['painkiller'] = 1,\n\t['medkit'] = 1,\n\t['adrenaline'] = 2,\n\t['aed'] = 3,\n\t['lockpick'] = 1,\n\t['toolkit'] = 1,\n\t['fixkit'] = 2,\n\t['radio'] = 1,\n\t['phone'] = 1,\n\t['gadget_parachute'] = 1,\n\t['slot_coupon_1'] = 1,\n\t['slot_coupon_4'] = 2,\n\t['slot_coupon_8'] = 3,\n\t['slot_coupon_16'] = 4,\n\t['weight_coupon_50'] = 1,\n\t['weight_coupon_100'] = 2,\n\t['weight_coupon_200'] = 3,\n\t['weight_coupon_500'] = 4,\n\t['valuepack_7'] = 2,\n\t['valuepack_15'] = 3,\n\t['valuepack_30'] = 4,\n}\n\n-- ===== กฎการใช้ \u002F Use rules =====\n\n-- ไอเทมที่ปิดกระเป๋าทันทีหลังกดใช้ (เช่น ของที่มีแอนิเมชัน)\n-- Items that close the bag right after use (e.g. ones that play an animation)\nConfig.CloseOnUseItems = {\n\t['painkiller'] = true,\n\t['bandage'] = true,\n\t['aed'] = true,\n\t['fixkit'] = true,\n}\n\n-- เช่น \u002F e.g. use = { type = 'block', list = { 'lockpick' } }\n-- กฎการใช้ \u002F ทิ้ง \u002F มอบ: type 'block' = ห้ามเฉพาะในรายการ · 'allow' = อนุญาตเฉพาะในรายการ\n-- Use \u002F drop \u002F give rules: type 'block' = block only the listed items · 'allow' = allow only the listed items\nConfig.ItemRules = {\n\tuse = { type = 'block', list = {} },\n\tdrop = { type = 'block', list = {} },\n\tgive = { type = 'block', list = {} },\n}\n\n-- ===== คำอธิบายไอเทม \u002F Item descriptions =====\n-- ทุกข้อความใส่ได้ทั้ง 'ข้อความเดียว' หรือ { th = '...', en = '...' } (เลือกตาม Config.Locale)\n-- Every text accepts a plain 'string' or { th = '...', en = '...' } (picked by Config.Locale)\n\n-- โชว์คำอธิบายในกล่องข้อมูลไอเทม \u002F show descriptions in the item tooltip\nConfig.ShowDescriptions = true\n\n-- คำอธิบายเริ่มต้นตามชนิด \u002F default text per type\nConfig.DescriptionDefaults = {\n\titem = { th = 'สิ่งของทั่วไปภายในเมือง', en = 'A general item used around the city.' },\n\tweapon = { th = 'อาวุธสำหรับป้องกันตัว โปรดใช้ตามกฎของเมือง', en = 'A weapon for self-defence. Follow your server rules.' },\n}\n\n-- คำอธิบายตามคำนำหน้าชื่อไอเทม (คำนำหน้ายาวกว่าชนะ) \u002F text by item-name prefix (the longest prefix wins)\nConfig.DescriptionPrefixes = {\n\t['slot_coupon_'] = { th = 'คูปองเพิ่มช่องกระเป๋าถาวร ใช้แล้วหายไป', en = 'Adds bag slots permanently. Consumed on use.' },\n\t['weight_coupon_'] = { th = 'คูปองเพิ่มน้ำหนักกระเป๋าถาวร ใช้แล้วหายไป', en = 'Adds bag weight permanently. Consumed on use.' },\n\t['valuepack_'] = { th = 'ห่อสารพัดประโยชน์ เพิ่มช่องและน้ำหนักกระเป๋าตามจำนวนวัน', en = 'Value Pack: extra bag slots and weight for a number of days.' },\n\t['weapon_'] = { th = 'อาวุธในรูปแบบไอเทม ใช้งานเพื่อหยิบออกมาถือ', en = 'A weapon stored as an item. Use it to equip.' },\n}\n\n-- คำอธิบายรายไอเทม (ทับคำนำหน้า) \u002F per-item text (overrides the prefix)\nConfig.Descriptions = {\n\titem = {\n\t\t['food_lunchbox'] = { th = 'ข้าวกล่อง กินเพื่อเติมหลอดอาหาร', en = 'A lunchbox. Eat it to fill your hunger bar.' },\n\t\t['drink_water'] = { th = 'น้ำดื่มสะอาด ดื่มเพื่อเติมหลอดน้ำ', en = 'Clean drinking water. Fills your thirst bar.' },\n\t\t['milk'] = { th = 'นมพร้อมดื่ม เติมหลอดอาหารและน้ำเล็กน้อย', en = 'Ready-to-drink milk. Fills a little hunger and thirst.' },\n\t\t['bandage'] = { th = 'ผ้าพันแผล ฟื้นฟูเลือดเล็กน้อย', en = 'A bandage. Restores a little health.' },\n\t\t['painkiller'] = { th = 'ยาแก้ปวด ฟื้นฟูเลือดปานกลาง', en = 'Painkillers. Restore some health.' },\n\t\t['medkit'] = { th = 'ชุดปฐมพยาบาล ฟื้นฟูเลือดจำนวนมาก', en = 'A medkit. Restores a lot of health.' },\n\t\t['adrenaline'] = { th = 'อะดรีนาลีน กระตุ้นร่างกายให้ฟื้นตัวทันที', en = 'Adrenaline. An instant recovery boost.' },\n\t\t['aed'] = { th = 'เครื่องกระตุกหัวใจ ใช้ช่วยผู้เล่นที่สลบ', en = 'A defibrillator. Revives a downed player.' },\n\t\t['lockpick'] = { th = 'อุปกรณ์สะเดาะกุญแจ', en = 'A lockpick.' },\n\t\t['toolkit'] = { th = 'ชุดเครื่องมือช่าง ใช้ในงานซ่อมบำรุง', en = 'A toolkit for repair jobs.' },\n\t\t['fixkit'] = { th = 'ชุดซ่อมรถ ใช้ซ่อมเครื่องยนต์', en = 'A repair kit. Fixes a vehicle engine.' },\n\t\t['radio'] = { th = 'วิทยุสื่อสาร พูดคุยตามช่องความถี่', en = 'A radio. Talk on a frequency.' },\n\t\t['phone'] = { th = 'โทรศัพท์มือถือ', en = 'A mobile phone.' },\n\t\t['gadget_parachute'] = { th = 'ร่มชูชีพ ใช้กางกลางอากาศ', en = 'A parachute. Deploy it in the air.' },\n\t},\n\taccount = {\n\t\t['money'] = { th = 'เงินสดที่ใช้จ่ายภายในเมือง', en = 'Cash to spend around the city.' },\n\t\t['black_money'] = { th = 'เงินผิดกฎหมาย ระวังการตรวจค้น', en = 'Dirty money. Watch out for searches.' },\n\t},\n\tkey = {\n\t\t['vehicle_key'] = { th = 'กุญแจสำหรับยานพาหนะส่วนตัว ใช้ล็อคและปลดล็อครถ', en = 'A key for your own vehicle. Locks and unlocks it.' },\n\t},\n}\n",{"path":106,"content":107},"config\u002Fheldobjects.lua","-- ===== วัตถุในมือ \u002F Held objects =====\n-- แสดงวัตถุ\u002Fรูปไอเทมในมือตอน ส่ง-รับ-เก็บ-ทิ้ง ไอเทม\n-- Shows the item (prop or picture) in the hand on give \u002F receive \u002F pick up \u002F drop\n-- ไอเทมที่ไม่มี model ในตาราง จะแสดงรูปไอเทมจากกระเป๋า (web\u002Fbuild\u002Fimg\u002Fitems) แทน\n-- Items with no model entry show the bag picture instead (web\u002Fbuild\u002Fimg\u002Fitems)\n\nConfig.HeldObjects = {\n    -- เปิด\u002Fปิดระบบวัตถุในมือ \u002F turn held objects on or off\n    Enable = true,\n\n    -- ไอเทมที่ไม่ต้องแสดงวัตถุ\u002Fรูปภาพ (ยังเล่นท่าทางตามปกติ) เช่น { black_money = true }\n    -- Items that show no object or picture (the animation still plays), e.g. { black_money = true }\n    Blacklist = {},\n\n    -- true = แสดงรูปไอเทมจากกระเป๋าเสมอ (ไม่ใช้โมเดล prop ในตาราง Items\u002FPrefix)\n    -- true = always show the bag picture (ignore the prop models in Items\u002FPrefix)\n    ImageOnly = true,\n\n    -- รูปไอเทมในมือ: Bone = กระดูกที่ติด, Width = ขนาด, Distance = ระยะที่มองเห็น (เมตร)\n    -- Picture in hand: Bone = attach bone, Width = size, Distance = visible range (meters)\n    Image = {\n        Enable = true,\n        Bone = 28422,\n        Width = 0.09,\n        Distance = 25.0,\n    },\n\n    -- เสียงตอนรับของ\u002Fเก็บของ \u002F sound when receiving or picking up\n    Sound = { name = 'PICK_UP', set = 'HUD_FRONTEND_DEFAULT_SOUNDSET' },\n\n    -- ผู้เล่นหันมองหน้ากันตอนส่ง\u002Fรับ \u002F players look at each other while giving and receiving\n    Stare = true,\n\n    -- ท่าของแต่ละการกระทำ: show\u002Fhide = ms ที่วัตถุปรากฏ\u002Fหาย, steps = ท่าต่อเนื่อง\n    -- Animation per action: show\u002Fhide = ms when the object appears\u002Fdisappears, steps = chained animations\n    Anims = {\n        give = {\n            show = 400,\n            steps = {\n                { dict = 'reaction@intimidation@1h', anim = 'intro', ms = 900, flag = 48 },\n                { dict = 'mp_common', anim = 'givetake1_a', ms = 1200, flag = 48 },\n            },\n        },\n        receive = {\n            delay = 1100,\n            show = 300,\n            sound = true,\n            steps = {\n                { dict = 'mp_common', anim = 'givetake1_b', ms = 1200, flag = 48 },\n                { dict = 'reaction@intimidation@1h', anim = 'outro', ms = 900, flag = 48 },\n            },\n        },\n        pickup = {\n            show = 500,\n            sound = true,\n            steps = {\n                { dict = 'pickup_object', anim = 'pickup_low', ms = 900, flag = 0 },\n                { dict = 'reaction@intimidation@1h', anim = 'outro', ms = 900, flag = 48 },\n            },\n        },\n        drop = {\n            show = 400,\n            hide = 1500,\n            steps = {\n                { dict = 'reaction@intimidation@1h', anim = 'intro', ms = 900, flag = 48 },\n                { dict = 'pickup_object', anim = 'putdown_low', ms = 900, flag = 0 },\n            },\n        },\n    },\n\n    -- ตำแหน่งวัตถุที่มือเมื่อไม่ได้ระบุ (กระดูก ตำแหน่ง หมุน)\n    -- Default hand placement when not given (bone, position, rotation)\n    DefaultBone = 57005,\n    DefaultPos = vector3(0.10, 0.02, -0.02),\n    DefaultRot = vector3(0.0, 0.0, 0.0),\n\n    -- ตรวจตามลำดับ (prefix ยาวไว้ก่อน) — { prefix, { model, bone?, pos?, rot? } }\n    -- Checked in order (longest prefix first) — { prefix, { model, bone?, pos?, rot? } }\n    Prefix = {\n        { 'drug_meth', { model = 'prop_meth_bag_01' } },\n        { 'drug_weed', { model = 'prop_weed_bottle', bone = 28422 } },\n        { 'drug_', { model = 'prop_mp_drug_package' } },\n        { 'pickaxe_', { model = 'prop_tool_pickaxe', pos = vector3(0.09, 0.0, 0.0), rot = vector3(0.0, 90.0, 0.0) } },\n        { 'axe_', { model = 'prop_tool_fireaxe', pos = vector3(0.09, 0.0, 0.0), rot = vector3(0.0, 90.0, 0.0) } },\n        { 'hoe_', { model = 'prop_tool_rake', pos = vector3(0.09, 0.0, 0.0), rot = vector3(0.0, 90.0, 0.0) } },\n        { 'sickle_', { model = 'w_me_machette_lr', bone = 28422, pos = vector3(0.0, 0.0, 0.0) } },\n        { 'huntknife_', { model = 'w_me_knife_01', bone = 28422, pos = vector3(0.0, 0.0, 0.0) } },\n        { 'livestock_', { model = 'prop_bucket_01a' } },\n        { 'rod_', { model = 'prop_fishing_rod_01', bone = 28422, pos = vector3(0.0, 0.0, 0.0) } },\n        { 'trade_crate_', { model = 'prop_cs_cardbox_01', pos = vector3(0.0, 0.0, -0.12) } },\n        { 'box_', { model = 'prop_cs_package_01' } },\n        { 'gacha_', { model = 'prop_cs_package_01' } },\n        { 'dish_', { model = 'prop_cs_bowl_01b', bone = 28422 } },\n        { 'meal_', { model = 'prop_paper_bag_small' } },\n        { 'meat_', { model = 'prop_cs_steak', bone = 28422 } },\n        { 'keycard_', { model = 'prop_cs_swipe_card', bone = 28422, pos = vector3(0.02, 0.0, 0.0) } },\n        { 'card_', { model = 'prop_cs_credit_card', bone = 28422, pos = vector3(0.02, 0.0, 0.0) } },\n    },\n\n    -- โมเดลรายไอเทม (ทับ Prefix) เช่น medkit = { model = 'prop_ld_health_pack' }\n    -- Per-item models (override Prefix), e.g. medkit = { model = 'prop_ld_health_pack' }\n    Items = {\n        medkit = { model = 'prop_ld_health_pack' },\n        painkiller = { model = 'prop_cs_pills', bone = 28422 },\n        drink_water = { model = 'prop_ld_flow_bottle', bone = 28422 },\n        milk = { model = 'prop_ld_flow_bottle', bone = 28422 },\n        milk_raw = { model = 'prop_ld_flow_bottle', bone = 28422 },\n        gold_bar = { model = 'prop_gold_bar', bone = 28422 },\n        ingot_gold = { model = 'prop_gold_bar', bone = 28422 },\n        gem_diamond = { model = 'h4_prop_h4_diamond_01a', bone = 28422 },\n        gem_ruby = { model = 'prop_jewel_04b', bone = 28422 },\n        gem_crystal = { model = 'prop_jewel_02b', bone = 28422 },\n        phone = { model = 'prop_npc_phone_02', bone = 28422, pos = vector3(0.0, 0.0, 0.0) },\n        radio = { model = 'prop_cs_hand_radio', bone = 28422, pos = vector3(0.0, 0.0, 0.0) },\n        megaphone = { model = 'prop_megaphone_01' },\n        lockpick = { model = 'prop_tool_screwdvr01', bone = 28422 },\n        screwdriver = { model = 'prop_tool_screwdvr01', bone = 28422 },\n        screwdriver_broken = { model = 'prop_tool_screwdvr01', bone = 28422 },\n        fixkit = { model = 'prop_tool_wrench', bone = 28422 },\n        tool_repair_kit = { model = 'prop_tool_wrench', bone = 28422 },\n        work_kit = { model = 'prop_tool_hammer', bone = 28422 },\n        toolkit = { model = 'prop_toolchest_01', pos = vector3(0.05, 0.0, -0.1) },\n        vehicle_key = { model = 'p_car_keys_01', bone = 28422, pos = vector3(0.0, 0.0, 0.0) },\n        key_gang = { model = 'prop_cs_keys_01', bone = 28422, pos = vector3(0.0, 0.0, 0.0) },\n        license_gun = { model = 'prop_cs_documents_01', bone = 28422 },\n        maid_contract = { model = 'prop_cs_documents_01', bone = 28422 },\n        ammo_box = { model = 'prop_box_ammo03a' },\n        bullet = { model = 'prop_ld_ammo_pack_01', bone = 28422 },\n        gadget_parachute = { model = 'p_parachute_s', pos = vector3(0.05, 0.0, -0.15) },\n        scuba = { model = 'p_s_scuba_mask_s', bone = 28422 },\n        vest = { model = 'prop_bodyarmour_03', pos = vector3(0.05, 0.0, -0.1) },\n        vest_training = { model = 'prop_bodyarmour_03', pos = vector3(0.05, 0.0, -0.1) },\n        player_mask = { model = 'prop_mask_specops', bone = 28422 },\n        narcotics_brick = { model = 'prop_mp_drug_package' },\n        food_lunchbox = { model = 'prop_paper_bag_small' },\n        cement = { model = 'prop_cs_fertilizer', pos = vector3(0.05, 0.0, -0.1) },\n    },\n}\n",{"path":109,"content":110},"config\u002Fweapons.lua","-- ═══════════════════════════════════════════════════════════════\n--  x3d_inventory — อาวุธ \u002F weapons\n-- ═══════════════════════════════════════════════════════════════\n\n-- ===== ชื่ออาวุธ \u002F Weapon names =====\n\n-- ชื่ออาวุธภาษาไทย (ใช้เมื่อ Config.Locale = 'th' · ภาษาอังกฤษใช้ชื่อจาก ESX) — ไม่ใส่ = ใช้ชื่อจาก ESX\n-- Thai weapon names (used when Config.Locale = 'th' · English keeps the ESX labels) — unset = the ESX label\nConfig.WeaponNames = {\n\t-- ระยะประชิด \u002F melee\n\t['WEAPON_BAT'] = 'ไม้เบสบอล',\n\t['WEAPON_BATTLEAXE'] = 'ขวานศึก',\n\t['WEAPON_BOTTLE'] = 'ขวดแก้วแตก',\n\t['WEAPON_CANDYCANE'] = 'ไม้เท้าลูกกวาด',\n\t['WEAPON_CROWBAR'] = 'ชะแลง',\n\t['WEAPON_DAGGER'] = 'กริชโบราณ',\n\t['WEAPON_FLASHLIGHT'] = 'ไฟฉาย',\n\t['WEAPON_GOLFCLUB'] = 'ไม้ตีกอล์ฟ',\n\t['WEAPON_HAMMER'] = 'ค้อน',\n\t['WEAPON_HATCHET'] = 'ขวานเล็ก',\n\t['WEAPON_KNIFE'] = 'มีดพก',\n\t['WEAPON_KNUCKLE'] = 'สนับมือเหล็ก',\n\t['WEAPON_MACHETE'] = 'มีดดาบ',\n\t['WEAPON_NIGHTSTICK'] = 'กระบองตำรวจ',\n\t['WEAPON_POOLCUE'] = 'ไม้คิวสนุ้ก',\n\t['WEAPON_STONE_HATCHET'] = 'ขวานหิน',\n\t['WEAPON_SWITCHBLADE'] = 'มีดสปริง',\n\t['WEAPON_WRENCH'] = 'ประแจเลื่อน',\n\n\t-- ปืนสั้น \u002F handguns\n\t['WEAPON_APPISTOL'] = 'ปืนพกยิงรัว AP',\n\t['WEAPON_CERAMICPISTOL'] = 'ปืนพกโครงเซรามิก',\n\t['WEAPON_COMBATPISTOL'] = 'ปืนพกคอมแบท',\n\t['WEAPON_DOUBLEACTION'] = 'ลูกโม่ดับเบิลแอ็กชัน',\n\t['WEAPON_FLAREGUN'] = 'ปืนยิงพลุ',\n\t['WEAPON_GADGETPISTOL'] = 'ปืนพกเพอริโก',\n\t['WEAPON_HEAVYPISTOL'] = 'ปืนพกขนาดหนัก',\n\t['WEAPON_MARKSMANPISTOL'] = 'ปืนพกนัดเดียวแม่นยำ',\n\t['WEAPON_NAVYREVOLVER'] = 'ลูกโม่ทหารเรือ',\n\t['WEAPON_PISTOL'] = 'ปืนพกมาตรฐาน',\n\t['WEAPON_PISTOL50'] = 'ปืนพกลำกล้อง .50',\n\t['WEAPON_PISTOL_MK2'] = 'ปืนพกมาตรฐาน Mk II',\n\t['WEAPON_PISTOLXM3'] = 'ปืนพก WM 29',\n\t['WEAPON_RAYPISTOL'] = 'ปืนเลเซอร์อัพ-แอนด์-แอทอมไมเซอร์',\n\t['WEAPON_REVOLVER'] = 'ลูกโม่ขนาดหนัก',\n\t['WEAPON_REVOLVER_MK2'] = 'ลูกโม่ขนาดหนัก Mk II',\n\t['WEAPON_SNSPISTOL'] = 'ปืนพกจิ๋ว SNS',\n\t['WEAPON_SNSPISTOL_MK2'] = 'ปืนพกจิ๋ว SNS Mk II',\n\t['WEAPON_STUNGUN'] = 'ปืนช็อตไฟฟ้า',\n\t['WEAPON_STUNROD'] = 'กระบองช็อตไฟฟ้า',\n\t['WEAPON_VINTAGEPISTOL'] = 'ปืนพกรุ่นคลาสสิก',\n\n\t-- ปืนกลมือ \u002F SMGs\n\t['WEAPON_ASSAULTSMG'] = 'ปืนกลมือจู่โจม',\n\t['WEAPON_COMBATPDW'] = 'ปืนกลมือ PDW',\n\t['WEAPON_MACHINEPISTOL'] = 'ปืนพกกล',\n\t['WEAPON_MICROSMG'] = 'ปืนกลมือขนาดเล็ก',\n\t['WEAPON_MINISMG'] = 'ปืนกลมือมินิ',\n\t['WEAPON_RAYCARBINE'] = 'ปืนกลเลเซอร์ Unholy Hellbringer',\n\t['WEAPON_SMG'] = 'ปืนกลมือ',\n\t['WEAPON_SMG_MK2'] = 'ปืนกลมือ Mk II',\n\t['WEAPON_TECPISTOL'] = 'ปืนกลมือแท็กติคอล',\n\n\t-- ลูกซอง \u002F shotguns\n\t['WEAPON_ASSAULTSHOTGUN'] = 'ลูกซองจู่โจม',\n\t['WEAPON_AUTOSHOTGUN'] = 'ลูกซองกึ่งอัตโนมัติ Sweeper',\n\t['WEAPON_BULLPUPSHOTGUN'] = 'ลูกซองบูลพัพ',\n\t['WEAPON_COMBATSHOTGUN'] = 'ลูกซองคอมแบท',\n\t['WEAPON_DBSHOTGUN'] = 'ลูกซองสองลำกล้อง',\n\t['WEAPON_HEAVYSHOTGUN'] = 'ลูกซองขนาดหนัก',\n\t['WEAPON_MUSKET'] = 'ปืนคาบศิลา',\n\t['WEAPON_PUMPSHOTGUN'] = 'ลูกซองปั๊ม',\n\t['WEAPON_PUMPSHOTGUN_MK2'] = 'ลูกซองปั๊ม Mk II',\n\t['WEAPON_SAWNOFFSHOTGUN'] = 'ลูกซองตัดสั้น',\n\n\t-- ไรเฟิล \u002F rifles\n\t['WEAPON_ADVANCEDRIFLE'] = 'ไรเฟิลรุ่นสูง',\n\t['WEAPON_ASSAULTRIFLE'] = 'ไรเฟิลจู่โจม',\n\t['WEAPON_ASSAULTRIFLE_MK2'] = 'ไรเฟิลจู่โจม Mk II',\n\t['WEAPON_BATTLERIFLE'] = 'ไรเฟิลสนามรบ',\n\t['WEAPON_BULLPUPRIFLE'] = 'ไรเฟิลบูลพัพ',\n\t['WEAPON_BULLPUPRIFLE_MK2'] = 'ไรเฟิลบูลพัพ Mk II',\n\t['WEAPON_CARBINERIFLE'] = 'คาร์บิน',\n\t['WEAPON_CARBINERIFLE_MK2'] = 'คาร์บิน Mk II',\n\t['WEAPON_COMPACTRIFLE'] = 'ไรเฟิลพานท้ายสั้น',\n\t['WEAPON_HEAVYRIFLE'] = 'ไรเฟิลขนาดหนัก',\n\t['WEAPON_MILITARYRIFLE'] = 'ไรเฟิลทหาร',\n\t['WEAPON_SPECIALCARBINE'] = 'คาร์บินพิเศษ',\n\t['WEAPON_SPECIALCARBINE_MK2'] = 'คาร์บินพิเศษ Mk II',\n\t['WEAPON_TACTICALRIFLE'] = 'ไรเฟิลยุทธวิธี',\n\n\t-- ปืนกล \u002F machine guns\n\t['WEAPON_COMBATMG'] = 'ปืนกลคอมแบท',\n\t['WEAPON_COMBATMG_MK2'] = 'ปืนกลคอมแบท Mk II',\n\t['WEAPON_GUSENBERG'] = 'ปืนกลกูเซนเบิร์ก',\n\t['WEAPON_MG'] = 'ปืนกลเบา',\n\n\t-- ปืนซุ่มยิง \u002F snipers\n\t['WEAPON_HEAVYSNIPER'] = 'ปืนซุ่มยิงขนาดหนัก',\n\t['WEAPON_HEAVYSNIPER_MK2'] = 'ปืนซุ่มยิงขนาดหนัก Mk II',\n\t['WEAPON_MARKSMANRIFLE'] = 'ไรเฟิลพลแม่นปืน',\n\t['WEAPON_MARKSMANRIFLE_MK2'] = 'ไรเฟิลพลแม่นปืน Mk II',\n\t['WEAPON_PRECISIONRIFLE'] = 'ไรเฟิลความแม่นยำสูง',\n\t['WEAPON_SNIPERRIFLE'] = 'ปืนซุ่มยิง',\n\n\t-- อาวุธหนัก \u002F heavy\n\t['WEAPON_COMPACTLAUNCHER'] = 'เครื่องยิงลูกระเบิดขนาดพกพา',\n\t['WEAPON_FIREWORK'] = 'เครื่องยิงพลุดอกไม้ไฟ',\n\t['WEAPON_GRENADELAUNCHER'] = 'เครื่องยิงลูกระเบิด',\n\t['WEAPON_HOMINGLAUNCHER'] = 'เครื่องยิงจรวดนำวิถี',\n\t['WEAPON_MINIGUN'] = 'ปืนกลหมุนมินิกัน',\n\t['WEAPON_RAILGUN'] = 'ปืนเรลกัน',\n\t['WEAPON_RAILGUNXM3'] = 'ปืนเรลกัน XM3',\n\t['WEAPON_RAYMINIGUN'] = 'มินิกันเลเซอร์ Widowmaker',\n\t['WEAPON_RPG'] = 'เครื่องยิงจรวด RPG',\n\t['WEAPON_SNOWLAUNCHER'] = 'เครื่องยิงก้อนหิมะ',\n\n\t-- ขว้าง \u002F throwables\n\t['WEAPON_ACIDPACKAGE'] = 'ถุงกรด',\n\t['WEAPON_BALL'] = 'ลูกบอล',\n\t['WEAPON_BZGAS'] = 'แก๊สน้ำตา BZ',\n\t['WEAPON_FLARE'] = 'พลุสัญญาณมือ',\n\t['WEAPON_GRENADE'] = 'ระเบิดมือ',\n\t['WEAPON_MOLOTOV'] = 'ระเบิดขวดน้ำมัน',\n\t['WEAPON_PIPEBOMB'] = 'ระเบิดท่อเหล็ก',\n\t['WEAPON_PROXMINE'] = 'กับระเบิดตรวจจับระยะ',\n\t['WEAPON_SMOKEGRENADE'] = 'ระเบิดควัน',\n\t['WEAPON_SNOWBALL'] = 'ก้อนหิมะ',\n\t['WEAPON_STICKYBOMB'] = 'ระเบิดติดผนัง',\n\n\t-- อุปกรณ์ \u002F gear\n\t['GADGET_PARACHUTE'] = 'ร่มชูชีพ',\n\t['WEAPON_DIGISCANNER'] = 'เครื่องสแกนดิจิทัล',\n\t['WEAPON_FIREEXTINGUISHER'] = 'ถังดับเพลิง',\n\t['WEAPON_HACKINGDEVICE'] = 'อุปกรณ์เจาะระบบ',\n\t['WEAPON_HAZARDCAN'] = 'ถังสารอันตราย',\n\t['WEAPON_METALDETECTOR'] = 'เครื่องหาโลหะ',\n\t['WEAPON_PETROLCAN'] = 'ถังน้ำมัน',\n}\nif Config.Locale == 'en' then Config.WeaponNames = {} end\n\n-- ===== ความหายากและน้ำหนัก \u002F Rarity and weight =====\n\n-- ความหายากของอาวุธ 0–4 · ไม่ใส่ = DefaultWeaponTier\n-- Weapon rarity 0–4 · unset = DefaultWeaponTier\nConfig.DefaultWeaponTier = 0\nConfig.WeaponRarity = {\n\t['WEAPON_PISTOL50'] = 2,\n\t['WEAPON_HEAVYSNIPER'] = 3,\n\t['WEAPON_RPG'] = 4,\n}\n\n-- น้ำหนักต่ออาวุธ 1 ชิ้น (ไม่ใส่ = 0) \u002F weight per weapon (unset = 0)\nConfig.WeaponWeight = {\n\t-- ['WEAPON_BAT'] = 1000,\n}\n\n-- ===== กฎการใช้ \u002F Use rules =====\n\n-- อาวุธที่ปิดกระเป๋าทันทีหลังหยิบ\u002Fเก็บ \u002F weapons that close the bag after equip\u002Fholster\nConfig.CloseOnUseWeapons = {\n\t-- 'WEAPON_BAT',\n}\n\n-- กฎการใช้อาวุธ (type 'block' = ห้ามที่อยู่ในรายการ · 'allow' = ใช้ได้เฉพาะในรายการ)\n-- Weapon use rule (type 'block' = block the listed ones · 'allow' = allow only the listed ones)\nConfig.WeaponRules = {\n\tuse = { type = 'block', list = { 'GADGET_PARACHUTE' } },\n}\n\n-- ===== กระสุนและท่าทาง \u002F Ammo and animations =====\n\n-- อาวุธที่ไม่มีกระสุน (ไม่โชว์จำนวนกระสุน) \u002F weapons without ammo (no ammo count shown)\nConfig.WeaponsWithoutAmmo = {\n\t'GADGET_PARACHUTE',\n\t'WEAPON_BAT', 'WEAPON_BATTLEAXE', 'WEAPON_BOTTLE', 'WEAPON_CANDYCANE', 'WEAPON_CROWBAR',\n\t'WEAPON_DAGGER', 'WEAPON_FLASHLIGHT', 'WEAPON_GOLFCLUB', 'WEAPON_HAMMER', 'WEAPON_HATCHET',\n\t'WEAPON_KNIFE', 'WEAPON_KNUCKLE', 'WEAPON_MACHETE', 'WEAPON_NIGHTSTICK', 'WEAPON_POOLCUE',\n\t'WEAPON_STONE_HATCHET', 'WEAPON_STUNGUN', 'WEAPON_STUNGUN_MP', 'WEAPON_SWITCHBLADE', 'WEAPON_WRENCH',\n}\n\n-- ท่าหยิบ\u002Fเก็บอาวุธ · SkipWeaponAnimation = ข้ามท่าทุกอาวุธ · SkipWeaponAnimationFor = ข้ามเฉพาะในรายการ\n-- Equip\u002Fholster animation · SkipWeaponAnimation = skip for every weapon · SkipWeaponAnimationFor = skip only the listed ones\nConfig.SkipWeaponAnimation = false\nConfig.SkipWeaponAnimationFor = {\n\t-- 'WEAPON_BAT',\n}\n\n-- swapAt = ms ที่อาวุธปรากฏ\u002Fหายในมือ · duration = ความยาวท่า (ms) · customs = ท่าเฉพาะอาวุธ\n-- swapAt = ms when the weapon appears\u002Fdisappears · duration = animation length in ms · customs = per-weapon animations\nConfig.WeaponHolsterAnims = {\n\tdefault = {\n\t\tholster = { enable = true, dict = 'reaction@intimidation@1h', anim = 'outro', flag = 50, swapAt = 1800, duration = 1900 },\n\t\tdraw = { enable = true, dict = 'reaction@intimidation@1h', anim = 'intro', flag = 50, swapAt = 800, duration = 2600 },\n\t},\n\tcustoms = {\n\t\t['WEAPON_SWITCHBLADE'] = {\n\t\t\tholster = { enable = true, dict = 'anim@melee@switchblade@holster', anim = 'holster', flag = 50, swapAt = 1400, duration = 1900 },\n\t\t\tdraw = { enable = true, dict = 'anim@melee@switchblade@holster', anim = 'unholster', flag = 50, swapAt = 200, duration = 2000 },\n\t\t},\n\t},\n}\n",1792316307252]