POLICE+ คือ Editor สำหรับ Admin ใช้สร้าง Door Lock และ Jail Location จากในเกม โดยระบบทำงานเป็น Draft ก่อน จึงสามารถเลือก Object, ทดลองล็อก/ปลดล็อก และตรวจพื้นที่คุกก่อน Copy Config ไปใช้จริง
เปิดใช้งาน#
/police+เมื่อเปิด ระบบจะโหลด Config.DoorLock.Doors และ Config.Jail.DefaultLocations ปัจจุบันเข้ามาเป็น Draft ชั่วคราว โดยเริ่มที่ Door Mode
| ปุ่ม | ใช้ทำอะไร |
|---|---|
TAB | สลับ Door Mode / Jail Mode |
C | Copy Config ของโหมดปัจจุบัน |
BACKSPACE | ปิด Editor และยกเลิก Draft ที่ยังไม่ได้ Copy |
Door Mode — ประตู#
เล็ง Crosshair ไปที่ Object ประตูก่อนใช้คำสั่งเพิ่ม/รวมกลุ่ม ระบบจะพยายามเก็บตำแหน่งตอนประตูปิดจริงให้อัตโนมัติ รวมถึงประตูเลื่อนหรือ sensor door บางชนิด
| ปุ่ม | การทำงาน |
|---|---|
E | เพิ่มประตูเดี่ยวใหม่ หรือเลือกประตูเดิมที่เล็งอยู่ |
H | เพิ่มบานที่เล็งเข้า Door Group ที่เลือก ใช้กับประตูคู่/หลายบาน |
G | LIVE TEST ล็อก/ปลดล็อก Door Draft ที่เลือก |
← / → | เลือก Draft ก่อนหน้า/ถัดไป |
↑ / ↓ | เพิ่ม/ลด interactDistance ทีละ 0.25m |
SHIFT + ↑ / ↓ | เพิ่ม/ลด displayDistance ทีละ 0.5m |
DEL | ลบ Door Draft ที่เลือก |
C | Copy รายการประตูทั้งหมดใน Draft |
ประตูเดี่ยว#
- เปิด
/police+ - เล็งกลาง Object ประตู
- กด
E - รอ Toast ยืนยันการจับตำแหน่ง
- กด
Gทดลองล็อก/ปลดล็อก - ปรับระยะตามต้องการ
- กด
Cแล้ววาง Config ในconfig/data/doors.lua
ประตูคู่ / หลายบาน#
- เล็งบานแรกแล้วกด
Eเพื่อสร้างกลุ่ม - เล็งบานที่สองแล้วกด
H - เพิ่มบานอื่นด้วย
Hต่อได้ - กด
Gตรวจว่าทุกบานล็อก/ปลดล็อกพร้อมกัน
Internal Policy ปัจจุบันรองรับสูงสุด 8 leaves ต่อ Door Group และ 128 Door Drafts ต่อ session
Jail Mode — พื้นที่คุก#
กด TAB เพื่อเข้าสู่ Jail Mode จากนั้นยืนตามตำแหน่งจริงที่ต้องการบันทึก
| ปุ่ม | การทำงาน |
|---|---|
SHIFT + E | สร้าง Jail Draft ใหม่ ณ ตำแหน่งที่ยืน |
E | ตั้ง coords / ศูนย์กลางพื้นที่ที่เลือก |
H | ตั้ง death / จุดตายหรือวาร์ปกลับ |
G | ตั้ง exit / จุดออกหลังพ้นโทษ |
← / → | เลือกพื้นที่คุกก่อนหน้า/ถัดไป |
↑ / ↓ | เพิ่ม/ลด radius ทีละ 5m |
SHIFT + ↑ / ↓ | เพิ่ม/ลด radius ทีละ 25m |
DEL | ลบ Jail Draft ที่เลือก |
C | Copy Jail Location Config |
ขั้นตอนสร้าง Jail ใหม่#
- ไปยืนบริเวณศูนย์กลางคุก
- เปิด
/police+และกดTAB - กด
SHIFT + E - ใช้
Eตั้ง center - ไปจุด death แล้วกด
H - ไปจุด exit แล้วกด
G - ปรับ radius ด้วยลูกศรและดูวง Preview
- กด
Cแล้ววางในconfig/data/jail_locations.lua
Jail ใหม่เริ่มต้น radius 25m และได้ key/name ชั่วคราวแบบ jail_### / พื้นที่คุก ### ซึ่งแก้ให้สื่อความหมายหลัง Copy ได้
Copy Config ให้ถูกตำแหน่ง#
Door#
POLICE+ Copy เฉพาะรายการด้านใน ไม่รวม wrapper Doors = { ... } ให้วางภายใน:
-- config/data/doors.lua
Config.DoorLock.Doors = {
-- วางรายการที่ Copy ตรงนี้
}Jail#
เช่นเดียวกัน ให้เอารายการที่ Copy ไปวางด้านใน:
-- config/data/jail_locations.lua
Config.Jail.DefaultLocations = {
-- วางรายการที่ Copy ตรงนี้
}ทำให้ถาวร#
- กด
CCopy Draft - วางในไฟล์
config/data/doors.luaหรือconfig/data/jail_locations.lua - ตรวจ ID/key ไม่ซ้ำและแก้ label/name หากต้องการ
- บันทึกไฟล์
- restart
nX_police - ทดสอบอีกครั้งหลังโหลด Config จริง
การปิด Editor ก่อน Copy ไม่ถือเป็นการ Save และ Draft ชั่วคราวจะถูกยกเลิก
Internal Policy ที่ลูกค้าไม่ต้องตั้ง#
- Door raycast ภายในปัจจุบัน 15m
- Door Draft สูงสุด 128 กลุ่ม
- สูงสุด 8 leaves ต่อ Door Group
- Jail Draft สูงสุด 64 พื้นที่
- Preview sync, door close calibration, sensor-door capture, anti-spam และ server validation เป็น Internal Runtime
ตัวเลขเหล่านี้เป็น Internal Policy และอาจเปลี่ยนตาม Version ไม่ควรสร้าง Config.DoorLock.Editor เองใน Customer Config
Troubleshooting#
| อาการ | ตรวจอะไร |
|---|---|
/police+ บอกว่าใช้ได้เฉพาะ Admin | ตรวจ ESX group และ Config.General.AdminGroups |
| มี Admin คนอื่นกำลังใช้ Editor | Editor มี owner ได้คนเดียว ให้เจ้าของเดิมปิดก่อน |
| เล็งแล้ว E ไม่เจอประตู | เข้าใกล้ เล็งกลาง Object และตรวจว่าเป็น world entity จริง ไม่ใช่ geometry ที่รวมกับ map |
| ตำแหน่งปิดไม่ตรง | ให้ประตูอยู่ใกล้สถานะปิดแล้วเพิ่มใหม่ รอ calibration จบก่อนกดซ้ำ |
| LIVE TEST ผ่าน แต่ restart แล้วหาย | ยังไม่ได้ Copy/วาง Config จริง หรือยังไม่ได้ restart หลังบันทึกไฟล์ |
| Copy แล้ว Lua parse error | ตรวจ wrapper ซ้อน, comma และตำแหน่งที่วาง |
Checklist ก่อน Production#
- Door ID และ Jail key ไม่ซ้ำ
- ประตูคู่ LIVE TEST พร้อมกันถูกต้อง
- ระยะ interact/display เหมาะสม
- Jail center / death / exit ถูกจุด
- radius ครอบพื้นที่พอดี
- มี
isDefault = trueตามที่ต้องการ - Copy ไปไฟล์ data ถูกตำแหน่ง
- restart และทดสอบจาก Config จริงอีกครั้ง