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_MISMATCHIP เปลี่ยน อัปเดตในหน้าบัญชี- ไม่มีสิทธิ์ดู — กลุ่ม ESX ไม่อยู่ใน
Config.Viewer.Groupsและไม่มี ACEx3d_replay.admin Failed to load script @x3d_replay/inject/client.lua—x3d_replayต้องensureก่อนสคริปต์ที่ใส่ inject- ตัวละครจำลองไม่เล่นท่า — สคริปต์นั้นยังไม่ได้ใส่ inject ฝั่ง client หรือยังไม่ได้ต่อสคริปต์อีโมท
- ไม่มีเงิน/ไอเทมในไทม์ไลน์ — ต้องเปิด
Config.Actions.Frameworkและใช้ ESX - รีเพลย์เก่าหาย — โฟลเดอร์
data/ถูกลบตอนอัปเดต หรือเกินRetentionDays(เซสชันที่ติด keep ไม่ถูกลบ)