[{"data":1,"prerenderedAt":82},["ShallowReactive",2],{"site":3,"config-slug-site":15,"config-product-en-x3d-replay":21,"config-public-x3d-replay":81},{"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":78},"6bdadea7-4316-4a4a-a38e-87c5e841077d","x3d-replay","X3D Replay","BETA pricing. Records every player, every session. Watch it back in game: 4 cameras, kill\u002Fdeath timeline, pressed keys, script usage, macro flags.",59900,"shop_license","public\u002Fproducts\u002Fx3d-replay\u002Fcover.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-replay\u002Fcover.jpg",[31,32],"anticheat","admin",[34,35,36,37,38,39,40,41,42,43,44,45,46,47,31,48,49,50,51,52],"esx","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",true,"owners",12000,"# Watch any player back, every second — in game, no clips needed\n\nEvery player is recorded automatically from join to leave. Admins open the replay in game: stand-ins walk, shoot, drive and wear the same clothes as at the time, with the keys they pressed and the scripts they used. Settle reports from what really happened instead of waiting for player clips.\n\n---\n\n## Features\n\n- [+] Records every player, every session, automatically — nothing to start\n- [+] In-game playback with the same clothes, face and poses as at the time\n- [+] 4 cameras: chase \u002F player POV \u002F free cam \u002F map\n- [+] Event timeline for hits, kills and deaths — click to jump there\n- [+] Nearby players replay too, follow anyone, speed 0.25x–8x\n- [+] Pressed-key panel and fire-click timing\n- [+] Commands, hotkeys and events players used in other scripts — one fxmanifest line\n- [+] Macro flags from unnaturally even input timing, shown on the timeline\n- [+] Money, item and job changes logged from ESX automatically\n- [+] Anticheat, report and macro sessions are kept; the rest expire after N days\n- [+] Session browser: player → day → session, start at any time\n- [+] Join card where players accept recording, wording editable — or a notice, or off\n\n---\n\n## Special BETA pricing — help test and improve X3D\n\nX3D Replay is currently in **BETA**. We keep the price accessible so more customers can join testing across a wider range of servers. Report issues and share feedback through Discord to help us improve the system before the full release.\n\n## What you can use it for\n\n- **Settle reports** — shot after surrendering, random kills, hit-and-run: open that moment and watch\n- **Check cheats and macros** — compare pressed keys with what happened, spot clicks that are too even\n- **Debug scripts** — see which command and event a player sent before money or items changed\n- **Connect other scripts** — `exports.x3d_replay:Mark(src, 'report', {...})` puts an event on the timeline and keeps the session\n\n## Why X3D\n\n- **Real in-game playback**, not a text log — positions, poses, clothes and vehicles of everyone around\n- **Viewer is isolated** in its own routing bucket, invisible to the live city\n- **Files stay on your server** — no open ports, no third-party host, old files cleaned up for you\n- **Readable config** with Thai\u002FEnglish comments on every line, every part switchable\n- **Works with X3D Admin Panel** — adds a replay menu to the panel (optional)\n- **Frequent updates** — buy once, get every version · Discord support\n\n## Requirements\n\nESX Legacy · oxmysql\n","## Installation\n\n### 1. Database\n\nRun the bundled `install.sql` against the same database `oxmysql` uses.\n\n```\nmysql -u \u003Cuser> -p \u003Cdatabase> \u003C install.sql\n```\n\nOr paste the whole file into HeidiSQL \u002F phpMyAdmin \u002F DBeaver and run it · safe to run again, existing data is kept.\n\n### 2. Files\n\nPut the `x3d_replay` folder in `resources\u002F` — **do not rename it** (other scripts reference this name in the inject line).\n\n### 3. server.cfg\n\n`ensure` after oxmysql and es_extended, and **before** any script that uses the inject files.\n\n```cfg\nensure oxmysql\nensure es_extended\nensure x3d_replay\n\nset x3d_license_x3d-replay \"X3D-XXXXX-XXXXX-XXXXX-XXXXX\"\n\n# optional: grant viewing by ACE instead of ESX groups\nadd_ace group.admin x3d_replay.admin allow\n```\n\nYou can put the key in `config\u002Fconfig.license.lua` instead of the convar.\n\n### 4. Check it works\n\nJoin as an admin and type `\u002Freplay`. The browser opens with your own name and the session being recorded (green dot = online).\n\n### 5. Updating\n\nReplay files live in `x3d_replay\u002Fdata\u002F` — **keep the `data` folder when you update** or every old replay is lost.\n\n## Watching\n\n| Action | How |\n|---|---|\n| Open the browser | `\u002Freplay` → player → day → session → start time → watch |\n| Open directly | `\u002Freplay \u003Csession id \\| online player id \\| name> [mm:ss]` |\n| Exit | `Esc` or `\u002Freplay stop` |\n| Toggle mouse \u002F camera look | `Alt` |\n| Follow someone else | click a name in the players panel or press `1`–`9` |\n\nThe viewer is moved to their own routing bucket (`Config.Viewer.BucketBase` + server id), invisible to the live city, and returned to where they were on exit.\nEvery view is logged to `TB_X3D_REPLAY_ACCESS` (who watched which session, when).\n\n## Configuration — `config\u002Fconfig.general.lua`\n\n| Section | What it controls |\n|---|---|\n| `Config.Record` | Sample rate (`Hz`) · days to keep (`RetentionDays`) · events that keep a session forever (`KeepKinds`) |\n| `Config.Storage` | Storage folder (empty = `data\u002F` inside the script) |\n| `Config.Client` | On\u002Foff: shots · poses · clothes\u002Fface · pressed keys |\n| `Config.Actions` | ESX money\u002Fitems\u002Fjob · inject data · event argument summaries · ignored names · macro thresholds |\n| `Config.Detect` | Flag melee hits that land on the head · melee weapon list |\n| `Config.Viewer` | Command · groups allowed · radius and count of nearby players loaded · file send rate |\n| `Config.Consent` | `'card'` accept card · `'notice'` plain notice · `'off'` none (put it in your rules) · wording in `Text` (`{days}` = retention days) · bump `Version` = everyone accepts again |\n| `Config.Voice` | Still in testing — leave `Enabled = false` |\n\n## Script usage capture (inject)\n\nAdd as the **first line** of each block in the `fxmanifest.lua` of any script you want recorded. No code changes, no dependencies.\n\n```lua\nclient_scripts { '@x3d_replay\u002Finject\u002Fclient.lua', 'client\u002Fmain.lua' }\nserver_scripts { '@x3d_replay\u002Finject\u002Fserver.lua', 'server\u002Fmain.lua' }\n```\n\n- **client** — typed commands and hotkeys (shown as `[F9]`) · NUI buttons · events sent to the server · animations the script plays on the player (the stand-in plays them too)\n- **server** — every net event a player sends into that script\n- `x3d_replay` not running = no effect\n\nAfter adding the inject lines, restart `x3d_replay` first, wait a moment, then restart that script.\n\n## Animations \u002F emotes\n\nGTA cannot report which animation a ped plays, so the emote script has to tell us. The dpemotes wiring is in `addons\u002Fhooks\u002Fclient.lua` · from any other script:\n\n```lua\nexports.x3d_replay:Anim(dict, name, flag)\nexports.x3d_replay:AnimStop()\n```\n\nScripts with the client inject do this automatically.\n\n## Hooks — `addons\u002Fhooks\u002F`\n\n| File | Functions |\n|---|---|\n| `server.lua` | `Hooks.ShouldRecord(src)` return `false` = do not record this player · `Hooks.OnMark(src, kind, data)` every written event (forward to logs \u002F Discord) · `Hooks.CanView(src)` (optional) return `true`\u002F`false` instead of the group check |\n| `client.lua` | `Hooks.OnView(on)` hide\u002Fshow other scripts' HUD when a replay starts\u002Fends |\n\nOther scripts can listen: `AddEventHandler('x3d_replay:viewing', function(on) end)` or `LocalPlayer.state.x3dReplay`.\n\n## Exports (server)\n\n```lua\nexports.x3d_replay:Mark(src, 'report', { by = reporterSrc, text = '...' })   -- 'anticheat' \u002F 'report' \u002F 'bookmark' = keep forever\nexports.x3d_replay:IsRecording(src)          -- true \u002F false\nexports.x3d_replay:GetSession(src)           -- { id, t } or nil\nexports.x3d_replay:Open(viewerSrc, target, 'mm:ss')   -- watch (target = session id \u002F player id \u002F name)\nexports.x3d_replay:OpenBrowser(viewerSrc, target)     -- open the browser (target optional)\n```\n\n## X3D Admin Panel (optional)\n\nWith X3D Admin Panel installed you get a Replays menu: players table → open that player's browser, closing returns to the panel.\nPermissions live in the panel › roles: `mod.x3d_replay.players.view` \u002F `mod.x3d_replay.players.action.browse`.\n\n## Troubleshooting\n\n- **`LICENSE CHECK FAILED`** — `LICENSE_INVALID` key does not match the product · `NETWORK` license server unreachable · `LICENSE_IP_MISMATCH` IP changed, update it in your account page\n- **No permission** — the ESX group is not in `Config.Viewer.Groups` and there is no `x3d_replay.admin` ACE\n- **`Failed to load script @x3d_replay\u002Finject\u002Fclient.lua`** — `ensure x3d_replay` before the scripts that use the inject\n- **Stand-in does not play a pose** — that script has no client inject, or the emote script is not wired\n- **No money\u002Fitems on the timeline** — `Config.Actions.Framework` must be on, ESX required\n- **Old replays gone** — the `data\u002F` folder was deleted on update, or past `RetentionDays` (kept sessions are never deleted)\n","FiveM ESX Replay Script - Player Demo Recorder","FiveM ESX replay system: records every player automatically, watch back in game with pressed keys, script usage and macro flags as report evidence.",[64,67,70,72,74,76],{"kind":65,"url":66},"video_url","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=PpZ7Eb53Ajk",{"kind":68,"url":69},"image","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-replay\u002Fmedia\u002Fx3d-replay-fivem-browser.png",{"kind":68,"url":71},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-replay\u002Fmedia\u002Fx3d-replay-fivem-carry-timeline.png",{"kind":68,"url":73},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-replay\u002Fmedia\u002Fx3d-replay-fivem-switch-player.png",{"kind":68,"url":75},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-replay\u002Fmedia\u002Fx3d-replay-fivem-pov.png",{"kind":68,"url":77},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-replay\u002Fmedia\u002Fx3d-replay-fivem-map.png",[79],{"version":53,"released_at":54,"changelog_md":80},"### Changed\n- `core\u002Fserver\u002Fvoice.js` now ships obfuscated like the rest of `core\u002F`",null,1792316314682]