เอกสาร

X3D Replay (ดูย้อนหลัง)

BETA ราคาพิเศษ · บันทึกผู้เล่นทุกคนอัตโนมัติ ดูย้อนหลังในเกมได้ทุกวินาที กล้อง 4 แบบ ไทม์ไลน์ยิง/ตาย ปุ่มที่กด สคริปต์ที่ใช้ จับ macro

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

การติดตั้ง

1. ฐานข้อมูล

รัน install.sql ที่แถมมาในโฟลเดอร์ กับฐานข้อมูลเดียวกับที่ oxmysql ใช้

mysql -u <user> -p <database> < install.sql

หรือวางทั้งไฟล์ลง HeidiSQL / phpMyAdmin / DBeaver แล้วรัน · รันซ้ำได้ ไม่ทับข้อมูลเดิม

2. วางไฟล์

วางโฟลเดอร์ x3d_replay ใน resources/ — ห้ามเปลี่ยนชื่อโฟลเดอร์ (สคริปต์อื่นอ้างชื่อนี้ตอนใส่ inject)

3. server.cfg

ensure หลัง oxmysql และ es_extended และ ก่อน สคริปต์ที่ใส่ inject

ensure oxmysql
ensure es_extended
ensure x3d_replay

set x3d_license_x3d-replay "X3D-XXXXX-XXXXX-XXXXX-XXXXX"

# ทางเลือก: ให้สิทธิ์ดูด้วย ACE แทนกลุ่ม ESX
add_ace group.admin x3d_replay.admin allow

คีย์ใส่ใน config/config.license.lua แทน convar ก็ได้

4. ตรวจว่าทำงาน

เข้าเกมด้วยบัญชีแอดมิน พิมพ์ /replay ต้องเปิดหน้ารายการ และเห็นชื่อตัวเองพร้อมเซสชันที่กำลังบันทึก (จุดเขียว = ออนไลน์)

5. อัปเดตสคริปต์

ไฟล์รีเพลย์อยู่ใน x3d_replay/data/ — ตอนอัปเดตห้ามลบโฟลเดอร์ data ไม่งั้นรีเพลย์เก่าหายหมด

วิธีดู

ทำอะไร ยังไง
เปิดหน้ารายการ /replay → เลือกผู้เล่น → วัน → เซสชัน → ใส่เวลาเริ่ม → ดูย้อนหลัง
เปิดตรง ๆ /replay <id เซสชัน | id ผู้เล่นออนไลน์ | ชื่อ> [นาที:วินาที]
ออก Esc หรือ /replay stop
สลับเมาส์ / หมุนกล้อง Alt
ติดตามคนอื่น คลิกชื่อในแผงผู้เล่นในฉาก หรือกด 1–9

คนดูถูกย้ายไป routing bucket ของตัวเอง (Config.Viewer.BucketBase + server id) ผู้เล่นในเมืองไม่เห็น ออกแล้วกลับที่เดิม ทุกครั้งที่เปิดดูถูกบันทึกลงตาราง TB_X3D_REPLAY_ACCESS (ใครดูเซสชันไหน เมื่อไร)

ตั้งค่า — config/config.general.lua

หัวข้อ แก้อะไร
Config.Record ความถี่บันทึก (Hz) · เก็บกี่วัน (RetentionDays) · เหตุการณ์ที่ทำให้เก็บถาวร (KeepKinds)
Config.Storage โฟลเดอร์เก็บไฟล์ (ว่าง = data/ ในสคริปต์)
Config.Client เปิด/ปิด: การยิง · ท่าทาง · ชุด/หน้าตา · ปุ่มที่กด
Config.Actions เงิน/ไอเทม/อาชีพจาก ESX · รับข้อมูลจาก inject · เก็บค่าที่ส่งมากับ event · ชื่อที่ไม่เก็บ · เกณฑ์ macro
Config.Detect ติดป้ายตีหัวด้วยอาวุธระยะประชิด · รายชื่ออาวุธระยะประชิด
Config.Viewer คำสั่ง · กลุ่มที่ดูได้ · รัศมีและจำนวนผู้เล่นรอบตัวที่โหลดมาด้วย · ความเร็วส่งไฟล์
Config.Consent 'card' การ์ดกดยอมรับ · 'notice' แจ้งเฉย ๆ · 'off' ไม่แจ้ง (แจ้งในกฎเซิร์ฟเอง) · ข้อความแก้ได้ที่ Text ({days} = จำนวนวันที่เก็บ) · เพิ่ม Version = ทุกคนกดใหม่
Config.Voice ยังอยู่ระหว่างทดสอบ ปล่อย Enabled = false ไว้

เก็บการใช้สคริปต์อื่น (inject)

ใส่เป็น บรรทัดแรก ของแต่ละ block ใน fxmanifest.lua ของสคริปต์ที่อยากเก็บ ไม่ต้องแก้โค้ดเดิม ไม่ต้องใส่ dependencies

client_scripts { '@x3d_replay/inject/client.lua', 'client/main.lua' }
server_scripts { '@x3d_replay/inject/server.lua', 'server/main.lua' }
  • client — คำสั่งที่พิมพ์/กดปุ่มลัด (ขึ้นเป็น [F9]) · ปุ่มใน NUI · event ที่ส่งไป server · ท่าที่สคริปต์สั่งตัวผู้เล่น (ตัวละครจำลองเล่นตาม)
  • server — ทุก net event ที่ผู้เล่นส่งเข้าสคริปต์นั้น
  • ไม่ได้เปิด x3d_replay = ไม่มีผลอะไร

หลังเพิ่ม inject ให้ restart x3d_replay ก่อน รอสักครู่ แล้วค่อย restart สคริปต์นั้น

ท่าทาง / อีโมท

GTA ไม่มีคำสั่งถามว่าตัวละครเล่นท่าอะไร สคริปต์อีโมทต้องบอกเอง วิธีต่อกับ dpemotes อยู่ใน addons/hooks/client.lua · สคริปต์อื่นเรียก

exports.x3d_replay:Anim(dict, name, flag)
exports.x3d_replay:AnimStop()

สคริปต์ที่ใส่ inject ฝั่ง client แล้วไม่ต้องเรียกเอง

จุดต่อ — addons/hooks/

ไฟล์ ฟังก์ชัน
server.lua Hooks.ShouldRecord(src) คืน false = ไม่บันทึกคนนี้ · Hooks.OnMark(src, kind, data) ทุกเหตุการณ์ที่ลงไฟล์ (ส่งต่อ log / Discord) · Hooks.CanView(src) (ไม่ใส่ก็ได้) คืน true/false แทนการเช็กกลุ่ม
client.lua Hooks.OnView(on) ซ่อน/แสดง HUD ของสคริปต์อื่นตอนเริ่ม/จบการดู

สคริปต์อื่นฟังได้เอง: AddEventHandler('x3d_replay:viewing', function(on) end) หรือ LocalPlayer.state.x3dReplay

Export (server)

exports.x3d_replay:Mark(src, 'report', { by = reporterSrc, text = '...' })   -- 'anticheat' / 'report' / 'bookmark' = เก็บถาวร
exports.x3d_replay:IsRecording(src)          -- true / false
exports.x3d_replay:GetSession(src)           -- { id, t } หรือ nil
exports.x3d_replay:Open(viewerSrc, target, 'mm:ss')   -- เปิดดู (target = id เซสชัน / id ผู้เล่น / ชื่อ)
exports.x3d_replay:OpenBrowser(viewerSrc, target)     -- เปิดหน้ารายการ (target ไม่ใส่ก็ได้)

X3D Admin Panel (ไม่บังคับ)

ถ้ามี X3D Admin Panel จะมีเมนูรีเพลย์: ตารางผู้เล่น → ปุ่มเปิดหน้ารายการของคนนั้น ปิดแล้วกลับแผง สิทธิ์ตั้งในแผง › บทบาท: mod.x3d_replay.players.view / mod.x3d_replay.players.action.browse

แก้ปัญหา

  • LICENSE CHECK FAILED — LICENSE_INVALID คีย์ไม่ตรงสินค้า · NETWORK ต่อเซิร์ฟเวอร์ไลเซนส์ไม่ได้ · LICENSE_IP_MISMATCH IP เปลี่ยน อัปเดตในหน้าบัญชี
  • ไม่มีสิทธิ์ดู — กลุ่ม ESX ไม่อยู่ใน Config.Viewer.Groups และไม่มี ACE x3d_replay.admin
  • Failed to load script @x3d_replay/inject/client.lua — x3d_replay ต้อง ensure ก่อนสคริปต์ที่ใส่ inject
  • ตัวละครจำลองไม่เล่นท่า — สคริปต์นั้นยังไม่ได้ใส่ inject ฝั่ง client หรือยังไม่ได้ต่อสคริปต์อีโมท
  • ไม่มีเงิน/ไอเทมในไทม์ไลน์ — ต้องเปิด Config.Actions.Framework และใช้ ESX
  • รีเพลย์เก่าหาย — โฟลเดอร์ data/ ถูกลบตอนอัปเดต หรือเกิน RetentionDays (เซสชันที่ติด keep ไม่ถูกลบ)
ดูหน้าสินค้า