[{"data":1,"prerenderedAt":92},["ShallowReactive",2],{"site":3,"config-slug-site":15,"config-product-en-x3d-weaponskins":21,"config-public-x3d-weaponskins":84},{"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":53,"latest_released_at":54,"published_at":55,"has_docs":56,"config":57,"rent_price_satang":58,"description_md":59,"docs_md":60,"seo_title":61,"seo_description":62,"media":63,"versions":73},"58697b89-cbe5-4b1f-8a29-c5289727202e","x3d-weaponskins","X3D Weapon Skins","Free collectible ESX weapon skins: each skin is an add-on weapon tied to its base gun. Unlock with an item, same damage, tradable, held-weapon effects.",0,"none","public\u002Fproducts\u002Fx3d-weaponskins\u002Fcover\u002F25e3c37b23545ec8.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-weaponskins\u002Fcover\u002F25e3c37b23545ec8.jpg",[31,32],"gameplay","inventory",[34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"weapon skins","สกินอาวุธ","สกินอาวุธ fivem","สกินปืน","gun skin","weapon skin fivem","คลังสกิน","เทรดสกิน","skin collection","x3d_inventory","esx","ฟรี","free","ปลดล็อกสกิน","สกินสะสม","เอฟเฟกต์อาวุธ","ความหายากสกิน","สกิน add-on","แปลงสกินเป็นไอเทม","1.1.2","2026-10-12T17:13:35.599698Z","2026-10-10T11:46:16.716284Z",true,"public",null,"# Collectible weapon skins, unlocked by items, worn in a click\n\nA weapon skin system for ESX Legacy: a skin item unlocks a skin into the player's permanent collection, equip it on the weapon any time, damage always equals the base weapon.\n\n---\n\n## Features\n\n- [+] Easy to set up: tune everything in config, or edit it from the web builder\n- [+] Each skin is an add-on weapon tied to a base weapon, damage always equals the base\n- [+] A skin item unlocks the skin into a permanent collection, equip or unequip any time\n- [+] Ammo, attachments and tint follow the weapon when you change skin\n- [+] Collection screen with progress per weapon and a reward card on unlock\n- [+] Skin rarity 0-5 shown as a frame colour\n- [+] Tradable skins turn back into items, or bind forever with tradable = false\n- [+] Optional effect while a skin is held, set per skin\n- [+] A skin held by someone who never unlocked it becomes the normal weapon\n- [+] Open with \u002Fskins, a hotkey, an item or the ox_lib radial menu\n- [+] Tie as many skins as you like to base weapons in config, using your own models\n- [+] Connect other scripts through addons\u002F\n\n---\n\n## Each skin is an add-on of its base weapon\n\nEvery skin is an add-on weapon tied to a base weapon, for example `WEAPON_GOLDPOOLCUE` as a skin of `WEAPON_POOLCUE`. The model is streamed in as a new weapon and never overwrites the original weapon files (it is not a replace), so players without the skin still see and use the normal gun.\n\nEquipping a skin swaps the weapon in hand for that add-on weapon, carrying ammo, attachments and tint across. Unequipping swaps back to the base weapon.\n\nNo skin models ship with the script. Use your city's own add-on weapon models and tie as many as you like to their base weapons in `config\u002Fskins.lua`.\n\n## A collection players want to fill\n\nThe collection screen shows the selected skin large, with a choice strip below and per-weapon collection progress on the left. Unlocking a skin plays a reward card with a warm glow and sparks.\n\n## Tradable, or bound forever\n\nHold the button on a tradable skin to turn it back into an item and sell it. Skins set to `tradable = false` stay in the collection forever. A skin is never lost with the weapon.\n\n## Server-side checks\n\n- Every unlock, equip and convert is checked on the server, with a per-player lock — no duplicates\n- A skin that reaches a player who never unlocked it (given, dropped, stored) turns back into the normal weapon\n- Attachments and tint are never stripped by a skin change\n\n## Works with your scripts\n\nPlugs into X3D Inventory (right-click → change skin, skin tag on the slot) and X3D Damage (damage follows the base weapon), or open it with `\u002Fskins` alongside any other inventory.\n\n**Free** · edit the code as you like · just don't resell it or re-upload it under your name\n","## Installation\n\n1. Drop `x3d_weaponskins` into `resources\u002F` and run `install.sql` (creates the `x3d_weaponskins` table).\n2. Add `ensure x3d_weaponskins` after `es_extended` (and after your inventory).\n3. Add your skins (below) and restart the server. Players reconnect once to load new weapon models.\n\n## Keys and commands\n\n| | |\n|---|---|\n| `\u002Fskins` | Open the skin collection (`Config.Command`, empty = off) |\n| `Config.Key` | Optional default key for the same command (players can rebind) |\n| `Config.OpenItem` | Item that opens the collection when used (not consumed). Works with any inventory that supports ESX usable items (NC, ox, qs…) |\n| `Config.Radial` | `true` = \"Weapon skins\" entry in the ox_lib radial menu |\n| Skin item | Use it from the bag: the skin unlocks and the unlock card shows |\n\n## Config (`config.lua`)\n\n| Option | What it does |\n|---|---|\n| `Config.Locale` | `th` or `en` |\n| `Config.ImagePath` | Skin picture path, `%s` = lowercase weapon name. With X3D Inventory: `nui:\u002F\u002Fx3d_inventory\u002Fweb\u002Fbuild\u002Fimg\u002Fitems\u002F%s.png` |\n| `Config.WeaponNames` | Optional names for base weapons (else the ESX label) |\n| `Config.SweepIntervalMs` | How often skins held without an unlock turn back into the base weapon (`0` = on join only) |\n| `Config.CloseEvents` \u002F `Config.RestartLockState` | Close the screen on your events \u002F block actions during a restart lock |\n\n## Skins (`config\u002Fskins.lua`, key = UPPERCASE ESX weapon name)\n\nEach skin is an add-on weapon (not a replace) tied to its base weapon through `base`. The original gun is never overwritten. No models ship with the script; stream your own add-on weapon models.\n\n| Field | What it does |\n|---|---|\n| `base` | Base weapon: damage, weight and ammo come from it |\n| `item` | Unlock item |\n| `label` | `{ th = ..., en = ... }` |\n| `rarity` | 0-5 frame colour |\n| `tradable` | `false` = bound forever once used |\n| `vfx` | Effect while held (omit = none): `dict`, `name`, `color`, `scale`, `alpha`, `viewDistance`, `points` |\n\nNew skin: stream the add-on weapon model yourself (`weapons.meta` etc.), add the weapon to es_extended `Config.Weapons` (copy the base's `components`\u002F`tints`, or a weapon with attachments cannot take the skin), add the item to the `items` table, put a picture `weapon_\u003Cname>.png` where `Config.ImagePath` points, add a row in `config\u002Fskins.lua`, restart the server.\n\n`config\u002Fskins.lua` ships one live example entry, `WEAPON_GOLDPOOLCUE` (Gold Pool Cue), as a template. If your server does not have that model and item yet, delete or comment the entry out.\n\n## Open from your own menu\n\nAny menu can open the screen (F-menu, esx_context, ox_lib context, radial):\n\n```lua\nexports.x3d_weaponskins:Open()                  -- all weapons\nexports.x3d_weaponskins:Open('WEAPON_POOLCUE')  -- straight to one weapon\n-- or: TriggerEvent('x3d_weaponskins:open')\n```\n\nox_lib context example:\n\n```lua\n{ title = 'Weapon skins', icon = 'gun', onSelect = function() exports.x3d_weaponskins:Open() end }\n```\n\n## Hooks (`addons\u002Fhooks\u002F`)\n\n`Hooks.BeforeFocus()` (client): runs before the collection or unlock card takes the mouse. Close your inventory or menu here (X3D Inventory closes itself), e.g. `TriggerEvent('your_inventory:close')`.\n\nServer: `Hooks.CanCarry(xPlayer, item, count)`: can the bag take the skin item back. Default: ESX `canCarryItem`. With X3D Inventory: `return exports.x3d_inventory:CanCarryItemSrc(xPlayer.source, item, count)`.\n\n## For other scripts\n\n- `GlobalState.x3dWeaponBase` = `{ [SKIN] = BASE }`: treat a skin as its base (X3D Damage does this automatically).\n- `GlobalState.x3dWeaponSkins` = `{ [SKIN] = { base, label, rarity } }`: for inventories to show skins.\n- Client events: `TriggerEvent('x3d_weaponskins:open', base)` opens the screen; `x3d_weaponskins:focus` fires before it takes focus (close your panel); `x3d_weaponskins:swapped` (from, to) after a swap.\n- Client export: `exports.x3d_weaponskins:Open(base)`.\n","Free FiveM ESX weapon skins — collection, tradable","Free FiveM ESX weapon skins: unlock with items into a permanent collection, same damage as the base weapon, tradable or bound forever.",[64,67,69,71],{"kind":65,"url":66},"image","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-weaponskins\u002Fmedia\u002F73e1fb673f7be54c.png",{"kind":65,"url":68},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-weaponskins\u002Fmedia\u002F527df4be48ad2bb8.png",{"kind":65,"url":70},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-weaponskins\u002Fmedia\u002F76c411a7d0726416.png",{"kind":65,"url":72},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-weaponskins\u002Fmedia\u002Fddad633a3c5d2d80.png",[74,76,80],{"version":53,"released_at":54,"changelog_md":75},"### Added\n\n- `config\u002Fskins.lua` ships one live example skin (`WEAPON_GOLDPOOLCUE`) as the template for new entries; remove it if your server lacks that model and item\n\n### Changed\n\n- Store images now carry English captions for the English store page",{"version":77,"released_at":78,"changelog_md":79},"1.1.0","2026-10-10T12:58:51.670267Z","### Added\r\n- `Config.OpenItem`: an item that opens the collection, so inventories without a skin button (NC, ox, qs…) can open it\r\n- `Config.Radial`: \"Weapon skins\" entry in the ox_lib radial menu (no hard ox_lib dependency)\r\n- `Hooks.BeforeFocus` (client): close your own inventory or menu before the screen takes the mouse\r\n- Docs: open the screen from any menu with `exports.x3d_weaponskins:Open()`",{"version":81,"released_at":82,"changelog_md":83},"1.0.0","2026-10-10T11:46:16.709075Z","### Added\n- First release: collectible weapon skins for ESX Legacy\n- Skin items unlock a skin into the player's collection (`x3d_weaponskins` table); bound skins (`tradable = false`) stay forever\n- Collection screen (`\u002Fskins`, optional key, or from X3D Inventory's right-click): large preview, choice strip, collection progress per weapon\n- Equip keeps ammo, attachments and tint; refused when the skin's ESX weapon row cannot hold them\n- Hold to turn a tradable skin back into an item; a skin is never lost with the weapon\n- Unlock card with a warm glow and rising sparks; optional held-weapon particle effect seen by nearby players\n- Skins held by a player who never unlocked them (given, dropped, stored) turn back into the base weapon\n- `GlobalState.x3dWeaponBase` + `x3dWeaponSkins` for damage and inventory scripts; client events `x3d_weaponskins:open`, `:focus`, `:swapped`\n- Thai and English (`Config.Locale`)",{"slug":23,"version":53,"latest_version":53,"files":85,"options":58},[86,89],{"path":87,"content":88},"config.lua","-- ═══════════════════════════════════════════════════════════════\n--  x3d_weaponskins — ตั้งค่า \u002F settings\n--  สกินอาวุธแบบสะสม: ใช้ไอเทมปลดล็อกเข้าคลัง ใส่\u002Fถอด\u002Fแปลงกลับเป็นไอเทม\n--  Collectible weapon skins: an item unlocks a skin into the collection; equip, default look, back to item\n-- ═══════════════════════════════════════════════════════════════\nConfig = Config or {}\n\n-- ===== ทั่วไป \u002F General =====\n\n-- ภาษา 'th' | 'en' (ข้อความหน้าจออยู่ใน web\u002Fapp\u002Fi18n)\n-- Language 'th' | 'en' (screen text lives in web\u002Fapp\u002Fi18n)\nConfig.Locale = 'th'\n\n-- ===== วิธีเปิดคลัง \u002F Ways to open =====\n\n-- คำสั่งเปิดคลังสกิน ('' = ไม่มีคำสั่ง)\n-- Command that opens the skin collection ('' = no command)\nConfig.Command = 'skins'\n\n-- ปุ่มลัดเปิดคลังสกิน ('' = ไม่ผูกปุ่ม · ผู้เล่นเปลี่ยนได้ใน Settings > Key Bindings)\n-- Default key for the collection ('' = unbound · players can rebind in Settings > Key Bindings)\nConfig.Key = ''\n\n-- ไอเทมที่ใช้แล้วเปิดคลังสกิน ไม่หักไอเทม ('' = ไม่ใช้ · ต้องเพิ่มไอเทมในตาราง items เอง)\n-- Item that opens the collection when used, not consumed ('' = off · add the item to your items table)\nConfig.OpenItem = ''\n\n-- เพิ่มปุ่ม \"คลังสกิน\" ในเมนูวงกลม ox_lib (ต้องเปิด ox_lib ไว้ ไม่มี = ข้าม)\n-- Add a \"Weapon skins\" entry to the ox_lib radial menu (needs ox_lib started, skipped otherwise)\nConfig.Radial = false\n\n-- เปิดจากเมนูอื่น (F-menu, esx_context, ox_lib context…): เรียก exports.x3d_weaponskins:Open() หรือ TriggerEvent('x3d_weaponskins:open')\n-- ปิดกระเป๋า\u002Fเมนูของคุณก่อนเปิด: addons\u002Fhooks\u002Fclient.lua → Hooks.BeforeFocus\n-- Open from any other menu (F-menu, esx_context, ox_lib context…): call exports.x3d_weaponskins:Open() or TriggerEvent('x3d_weaponskins:open')\n-- Close your inventory\u002Fmenu first: addons\u002Fhooks\u002Fclient.lua → Hooks.BeforeFocus\n\n-- ===== รูปและชื่อ \u002F Pictures and names =====\n\n-- ที่อยู่รูปสกิน %s = ชื่ออาวุธตัวเล็ก (เช่น weapon_goldpoolcue) · ใช้รูปของกระเป๋าได้ เช่น 'nui:\u002F\u002Fx3d_inventory\u002Fweb\u002Fbuild\u002Fimg\u002Fitems\u002F%s.png'\n-- Skin picture path, %s = lowercase weapon name · may point at your inventory's pictures, e.g. 'nui:\u002F\u002Fx3d_inventory\u002Fweb\u002Fbuild\u002Fimg\u002Fitems\u002F%s.png'\nConfig.ImagePath = 'nui:\u002F\u002Fx3d_weaponskins\u002Fweb\u002Fbuild\u002Fimg\u002F%s.png'\n\n-- ชื่ออาวุธหลักที่ผู้เล่นเห็น (ไม่ใส่ = ใช้ชื่อจาก ESX) เช่น { WEAPON_POOLCUE = 'ไม้คิว' }\n-- Player-facing base weapon names (omit = the ESX label), e.g. { WEAPON_POOLCUE = 'Pool cue' }\nConfig.WeaponNames = {}\n\n-- ===== ความปลอดภัยและการปิดหน้าจอ \u002F Safety and closing =====\n\n-- ทุกกี่ ms ตรวจว่าใครถือสกินที่ไม่ได้ปลดล็อก (ได้จากการส่ง\u002Fทิ้ง\u002Fตู้) แล้วเปลี่ยนเป็นอาวุธปกติ (0 = ตรวจตอนเข้าเกมเท่านั้น)\n-- How often (ms) to turn skins held without an unlock (given, dropped, stored) back into the base weapon (0 = on join only)\nConfig.SweepIntervalMs = 10000\n\n-- event ฝั่ง client ที่ปิดหน้าจอนี้ (เช่น ตอนตาย \u002F ล็อกรีสตาร์ท) · esx:onPlayerDeath ปิดให้เสมอ\n-- Client events that close this screen (death, restart lock…) · esx:onPlayerDeath always closes it\nConfig.CloseEvents = {}\n\n-- ชื่อ GlobalState ที่บอกว่ากำลังล็อกรีสตาร์ท ({ lock = true }) · nil = ไม่ใช้\n-- GlobalState key that signals a restart lock ({ lock = true }) · nil = not used\nConfig.RestartLockState = nil\n",{"path":90,"content":91},"config\u002Fskins.lua","-- ═══════════════════════════════════════════════════════════════\n--  x3d_weaponskins — สกินอาวุธ \u002F weapon skins\n--  สกิน = อาวุธ add-on อีกตัวที่ใช้ดาเมจของอาวุธหลัก ใช้ไอเทมเพื่อปลดล็อกเข้าคลังสกินของผู้เล่น\n--  A skin = an add-on weapon that uses its base weapon's damage; using its item unlocks it into the player's collection\n--  คีย์ = ชื่ออาวุธ ESX ตัวพิมพ์ใหญ่ ต้องมีใน es_extended Config.Weapons และสตรีมโมเดลเอง\n--  Key = UPPERCASE ESX weapon name; it must exist in es_extended Config.Weapons and you stream the model yourself\n-- ═══════════════════════════════════════════════════════════════\n-- ===== รายการสกิน \u002F Skin list =====\n\n-- เช่น \u002F e.g. WEAPON_GOLDPOOLCUE = { base = 'WEAPON_POOLCUE', item = 'skin_goldpoolcue', label = { th = 'ไม้คิวทองคำ', en = 'Gold Pool Cue' }, rarity = 4, tradable = true }\n-- ตัวอย่างเต็มอยู่ในรายการแรกด้านล่าง \u002F full example in the first entry below\nConfig.Skins = {\n    -- ตัวอย่างจริง 1 รายการ: ต้องมี WEAPON_GOLDPOOLCUE ใน es_extended Config.Weapons + สตรีมโมเดล + ไอเทม skin_goldpoolcue\n    -- ไม่มีของพวกนี้ ลบหรือคอมเมนต์รายการนี้ออก (เป็นแม่แบบให้ปุ่ม \"+ เพิ่มรายการ\" บนเว็บ)\n    -- One real entry: needs WEAPON_GOLDPOOLCUE in es_extended Config.Weapons + a streamed model + the skin_goldpoolcue item\n    -- Without those, delete or comment it out (it is the template for the web builder's \"+ add row\")\n    WEAPON_GOLDPOOLCUE = {\n        base = 'WEAPON_POOLCUE',                 -- อาวุธหลัก (ดาเมจมาจากตัวนี้) \u002F base weapon (damage comes from it)\n        item = 'skin_goldpoolcue',               -- ไอเทมปลดล็อก \u002F unlock item\n        label = { th = 'ไม้คิวทองคำ', en = 'Gold Pool Cue' },\n        rarity = 4,                              -- 0–5 สีกรอบ \u002F frame colour\n        tradable = true,                         -- false = ใช้แล้วผูกถาวร \u002F false = bound forever once used\n        -- เอฟเฟกต์ตอนถือ (ไม่ใส่ = ไม่มี) · points = จุดบนตัวอาวุธ (x, y, z)\n        -- Effect while held (omit = none) · points = spots on the weapon (x, y, z)\n        vfx = { dict = 'core', name = 'ent_amb_sparking_wires', color = { 1.0, 0.65, 0.03 },\n                scale = 0.12, alpha = 0.85, viewDistance = 60.0,\n                points = { { 0, 0, 0.12 }, { 0, 0, 0.34 }, { 0, 0, 0.57 } } },\n    },\n}\n",1792316314889]