โครงสร้าง Script FiveM มีไฟล์อะไรบ้าง
โครงสร้าง Script FiveM โดยทั่วไปจะประกอบด้วยไฟล์หลักอย่าง fxmanifest.lua, client.lua, server.lua, config.lua และอาจมีโฟลเดอร์เพิ่มเติม เช่น html, locales, stream, shared หรือไฟล์ SQL ขึ้นอยู่กับหน้าที่ของ Script แต่ละตัว
อย่างไรก็ตาม FiveM ไม่ได้กำหนดว่า Script ทุกตัวต้องมีไฟล์เหมือนกันทั้งหมด สิ่งที่สำคัญที่สุดคือ Resource ต้องมี Resource Manifest อย่าง fxmanifest.lua เพื่อบอก FiveM ว่าจะต้องโหลดไฟล์อะไรบ้าง
ตัวอย่าง Script ขนาดเล็กอาจมีเพียง
my-script/
├── fxmanifest.lua
└── client.lua
แต่ Script ระบบใหญ่ เช่น Inventory หรือ Phone อาจมีไฟล์และโฟลเดอร์จำนวนมาก
บทความนี้จะอธิบายว่าไฟล์แต่ละประเภทมีหน้าที่อะไร เพื่อให้คนเริ่มทำ FiveM Server สามารถเปิด Script ขึ้นมาแล้วพอเข้าใจได้ทันทีว่าควรแก้ไฟล์ไหนและไฟล์ไหนไม่ควรแตะโดยไม่จำเป็น
① โครงสร้าง Script FiveM พื้นฐานเป็นอย่างไร
ลองดูตัวอย่าง Resource หนึ่งตัว
my-script/
├── fxmanifest.lua
├── config.lua
├── client.lua
├── server.lua
├── shared.lua
├── locales/
│ ├── en.lua
│ └── th.lua
├── html/
│ ├── index.html
│ ├── style.css
│ └── script.js
└── stream/
นี่เป็นเพียงตัวอย่างเท่านั้น
Script จริงอาจจัดโครงสร้างเป็นแบบนี้ก็ได้
my-script/
├── fxmanifest.lua
├── client/
│ ├── main.lua
│ ├── menu.lua
│ └── vehicle.lua
├── server/
│ ├── main.lua
│ └── database.lua
├── shared/
│ └── config.lua
└── web/
└── build/
ทั้งสองรูปแบบสามารถใช้งานได้ เพราะ FiveM ไม่ได้ตัดสินจากชื่อไฟล์ว่าไฟล์นั้นทำงานอย่างไร แต่ดูจากสิ่งที่ถูกกำหนดไว้ใน fxmanifest.lua
② fxmanifest.lua คือไฟล์อะไร
fxmanifest.lua เป็นไฟล์สำคัญมากของ FiveM Resource เพราะใช้ประกาศข้อมูลและบอก FiveM ว่า Resource นี้ต้องโหลดอะไร
ตัวอย่างพื้นฐาน
fx_version 'cerulean'
game 'gta5'
author 'YourName'
description 'My FiveM Resource'
version '1.0.0'
client_script 'client.lua'
server_script 'server.lua'
จากตัวอย่างนี้ FiveM จะรู้ว่า
Resource ใช้
ceruleanResource ทำงานกับ GTA V
ต้องโหลด
client.luaต้องโหลด
server.lua
ถ้ามีหลายไฟล์ก็สามารถกำหนดได้ เช่น
client_scripts {
'client/main.lua',
'client/menu.lua'
}
server_scripts {
'server/main.lua',
'server/database.lua'
}
ดังนั้นเวลาต้องการรู้ว่า Script หนึ่งโหลดไฟล์อะไรบ้าง ควรเปิด fxmanifest.lua ดูเป็นไฟล์แรก ๆ
fxmanifest.lua จำเป็นหรือไม่
สำหรับ Resource ปัจจุบัน ควรมี fxmanifest.lua เพื่อให้ FiveM รู้จัก Resource และข้อมูลที่ต้องใช้
Script รุ่นเก่ามากอาจพบไฟล์
__resource.lua
ซึ่งเป็นระบบ Manifest รุ่นเก่า
หากกำลังสร้าง Resource ใหม่ ไม่ควรเริ่มต้นด้วยรูปแบบเก่านี้ แต่ควรใช้ fxmanifest.lua
③ client.lua คืออะไร
client.lua โดยทั่วไปหมายถึง Lua Script ที่ทำงานฝั่ง Client หรือเครื่องของผู้เล่น
งานที่มักอยู่ใน Client Script เช่น
ตรวจปุ่มที่ผู้เล่นกด
แสดง Marker
สร้าง NPC
เล่น Animation
เปิด Menu
เปิด UI
จัดการ Camera
ตรวจตำแหน่งผู้เล่น
จัดการ Vehicle บางส่วน
แสดงข้อความ
Interaction ภายในเกม
ตัวอย่างง่าย ๆ
RegisterCommand('hello', function()
print('Hello from client')
end)
แต่ชื่อไฟล์ไม่จำเป็นต้องเป็น client.lua เสมอไป
ผู้พัฒนาอาจตั้งชื่อว่า
main.lua
vehicle.lua
menu.lua
interaction.lua
ตราบใดที่ไฟล์นั้นถูกกำหนดเป็น Client Script ใน fxmanifest.lua
เช่น
client_scripts {
'client/main.lua',
'client/menu.lua'
}
ดังนั้น หน้าที่ของไฟล์ไม่ได้ตัดสินจากชื่อเพียงอย่างเดียว
④ server.lua คืออะไร
server.lua เป็นชื่อที่นิยมใช้สำหรับ Script ฝั่ง Server
งานประเภทนี้มักเกี่ยวข้องกับข้อมูลหรือ Logic ที่ควรควบคุมจาก Server เช่น
เงินของผู้เล่น
Job
Permission
Database
Item
Player Data
การตรวจสอบ Event
การบันทึกข้อมูล
การสื่อสารระหว่างผู้เล่น
ระบบ Admin
ตัวอย่าง
RegisterNetEvent('myScript:server:test', function()
local src = source
print('Player ID:', src)
end)
Server Script มีความสำคัญด้านความปลอดภัยมาก เพราะระบบที่เกี่ยวข้องกับเงิน Item หรือสิทธิ์ไม่ควรเชื่อข้อมูลจาก Client โดยตรง
ตัวอย่างเช่น ไม่ควรออกแบบระบบให้ Client สามารถส่งคำสั่งว่า
เพิ่มเงินให้ฉัน 1,000,000
แล้ว Server ทำตามทันทีโดยไม่มี Validation
ระบบสำคัญควรตรวจสอบเงื่อนไขฝั่ง Server เสมอ
⑤ config.lua คืออะไร
config.lua เป็นไฟล์สำหรับเก็บค่าตั้งของ Script
ตัวอย่าง
Config = {}
Config.JobName = 'police'
Config.Price = 500
Config.Debug = false
ข้อดีของการแยก Config ออกจาก Logic คือเจ้าของ Server สามารถปรับ Script ได้ง่ายโดยไม่ต้องเข้าไปแก้โค้ดหลักทุกครั้ง
ตัวอย่างค่าที่มักพบใน Config ได้แก่
ราคา
ตำแหน่ง
Job
Item
Language
Framework
Notification
Target
Inventory
Debug Mode
Cooldown
Permission
บาง Script อาจตั้งชื่อว่า
config.lua
settings.lua
shared_config.lua
config/
ขึ้นอยู่กับผู้พัฒนา
Config ควรแก้อะไรได้บ้าง
โดยทั่วไปสิ่งที่ Documentation ระบุว่าแก้ได้ใน Config สามารถปรับได้ตามความต้องการ
แต่ไม่ควรลบตัวแปรหรือเปลี่ยนโครงสร้างโดยไม่เข้าใจ เพราะ Script ส่วนอื่นอาจเรียกใช้ค่าดังกล่าว
⑥ shared.lua หรือ Shared Script คืออะไร
Shared Script คือไฟล์ที่ถูกโหลดได้ทั้งฝั่ง Client และ Server
ตัวอย่างใน fxmanifest.lua
shared_script 'shared.lua'
หรือ
shared_scripts {
'config.lua',
'shared/*.lua'
}
Shared Script มักใช้เก็บข้อมูลที่ทั้ง Client และ Server ต้องใช้ร่วมกัน เช่น
Config = {}
Config.JobName = 'mechanic'
Config.Locale = 'th'
อย่างไรก็ตาม มีข้อควรระวังสำคัญคือ ข้อมูลที่ถูกส่งไปฝั่ง Client ไม่ควรถูกมองว่าเป็นความลับ
จึงไม่ควรใส่ Password, Database Credential, API Secret หรือข้อมูลสำคัญอื่นในไฟล์ที่ Client สามารถเข้าถึงได้
⑦ โฟลเดอร์ client มีไว้ทำอะไร
Script ขนาดใหญ่ไม่จำเป็นต้องยัด Client Code ทั้งหมดไว้ใน client.lua ไฟล์เดียว
สามารถแบ่งออกเป็นหลายไฟล์ เช่น
client/
├── main.lua
├── menu.lua
├── target.lua
├── vehicle.lua
├── animation.lua
└── zones.lua
จากนั้นกำหนดใน Manifest
client_scripts {
'client/*.lua'
}
*.lua หมายถึงโหลดไฟล์ Lua ที่ตรงกับ Pattern ภายในโฟลเดอร์นั้น
การแยกไฟล์ลักษณะนี้ทำให้
อ่าน Code ง่าย
Debug ง่าย
แก้ระบบเฉพาะส่วนง่าย
ทำงานร่วมกับ Developer หลายคนง่าย
ลดไฟล์ขนาดใหญ่มากเกินไป
สำหรับ Server ขนาดใหญ่ การจัดโครงสร้าง Script ให้เป็นระเบียบมีผลต่อการดูแลระบบในระยะยาวมาก
⑧ โฟลเดอร์ server มีไว้ทำอะไร
ฝั่ง Server ก็สามารถแบ่งไฟล์ออกเป็นหลายส่วนได้
ตัวอย่าง
server/
├── main.lua
├── callbacks.lua
├── database.lua
├── commands.lua
└── permissions.lua
จากนั้นประกาศใน fxmanifest.lua
server_scripts {
'server/*.lua'
}
ตัวอย่างการแบ่งหน้าที่อาจเป็น
main.lua
Logic หลักของ Resource
database.lua
คำสั่งที่เกี่ยวข้องกับ Database
callbacks.lua
Callback สำหรับรับและส่งข้อมูล
commands.lua
Command ของ Resource
permissions.lua
ตรวจ Permission หรือสิทธิ์ผู้เล่น
การแยกไฟล์ตามหน้าที่ช่วยให้สามารถหาจุด Error ได้เร็วกว่าการรวม Code หลายพันบรรทัดไว้ไฟล์เดียว
⑨ HTML, CSS และ JavaScript อยู่ใน FiveM Script ทำไม
Script ที่มี Interface สวย ๆ มักใช้ระบบ NUI ของ FiveM
จึงอาจพบไฟล์อย่าง
html/
├── index.html
├── style.css
├── script.js
└── images/
หรือใน Script รุ่นใหม่อาจพบ
web/
src/
dist/
build/
เนื่องจาก Developer อาจใช้ Framework ฝั่ง Web เช่น React, Vue หรือเครื่องมือ Front-end อื่นในการสร้าง UI
ตัวอย่าง Resource ที่มี UI ได้แก่
Phone
Inventory
HUD
Banking
Garage
MDT
Character Creator
Admin Menu
Job Menu
ใน fxmanifest.lua อาจพบ
ui_page 'html/index.html'
files {
'html/index.html',
'html/style.css',
'html/script.js'
}
ui_page ใช้กำหนดหน้า UI หลัก ส่วน files ใช้ระบุไฟล์ที่ Resource ต้องรวมไว้ให้ Client ใช้งาน
⑩ stream คือโฟลเดอร์อะไร
โฟลเดอร์
stream/
มักพบใน Resource ที่มี Asset สำหรับ Stream เข้าเกม
เช่น
รถ
เสื้อผ้า
Object
Model
Texture
Map
MLO
Prop
ตัวอย่าง
my-car/
├── fxmanifest.lua
└── stream/
├── car.yft
├── car_hi.yft
└── car.ytd
FiveM สามารถ Stream Asset เหล่านี้ให้ผู้เล่นเมื่อ Resource ทำงาน
ดังนั้นถ้าเปิด Script แล้วพบ stream ไม่ได้หมายความว่าเป็น Lua Script เสมอไป แต่ Resource อาจใช้สำหรับ Asset ของเกม
⑪ ไฟล์ .meta คืออะไร
Vehicle Resource หรือ Resource บางประเภทอาจมีไฟล์ .meta
ตัวอย่าง
vehicles.meta
handling.meta
carcols.meta
carvariations.meta
ไฟล์เหล่านี้ใช้กำหนดข้อมูลของ GTA V บางประเภท
ตัวอย่าง Vehicle Resource
my-car/
├── fxmanifest.lua
├── data/
│ ├── vehicles.meta
│ ├── handling.meta
│ ├── carcols.meta
│ └── carvariations.meta
└── stream/
จากนั้น fxmanifest.lua จะกำหนด Data File ที่เกี่ยวข้อง
เพราะฉะนั้นเวลาเพิ่มรถ FiveM แล้วรถมี Handling ผิด เสียงผิด สีผิด หรือ Spawn แล้วมีปัญหา จุดที่ต้องตรวจอาจไม่ใช่ client.lua แต่เป็นไฟล์ .meta
⑫ locales คืออะไร
Script ที่รองรับหลายภาษามักมีระบบ Locale
ตัวอย่าง
locales/
├── en.lua
├── th.lua
├── de.lua
└── fr.lua
หรือบาง Script อาจใช้
locales/
├── en.json
└── th.json
ไฟล์เหล่านี้ใช้เก็บข้อความ เช่น
Open Garage
Vehicle Stored
Not Enough Money
You don't have permission
ข้อดีคือสามารถแปลภาษาได้โดยไม่ต้องค้นข้อความทั่วทั้ง Source Code
หากต้องการทำ Server ภาษาไทย จุดนี้เป็นจุดที่ควรตรวจสอบก่อน เพราะ Script จำนวนมากแยกระบบภาษาไว้เรียบร้อยแล้ว
⑬ ไฟล์ SQL คืออะไร
Script ที่ต้องบันทึกข้อมูลลง Database อาจมาพร้อมไฟล์ เช่น
install.sql
database.sql
script.sql
ภายในอาจมีคำสั่งสร้าง Table
ตัวอย่างเชิงโครงสร้าง
CREATE TABLE my_table (
id INT,
identifier VARCHAR(100)
);
ระบบที่มักต้องใช้ Database เช่น
Phone
Banking
Housing
Garage
Inventory
Jobs
Character
Billing
นี่เป็นเหตุผลที่บางครั้ง Resource Start สำเร็จ แต่ระบบใช้งานไม่ได้ เพราะผู้ดูแล Server ลืม Import SQL
ดังนั้นเมื่อติดตั้ง Script ใหม่ควรตรวจสอบว่าภายใน Package มี .sql หรือ Documentation ระบุให้สร้าง Database เพิ่มหรือไม่
⑭ README.md คืออะไร
ถ้าเห็นไฟล์
README.md
อย่ารีบมองข้าม
ไฟล์นี้มักเป็น Documentation ของ Developer และอาจระบุเรื่องสำคัญ เช่น
วิธีติดตั้ง
Dependency
Framework ที่รองรับ
Config
SQL
Export
Event
Update
Known Issues
ก่อนติดตั้ง Script ควรอ่าน README หรือ Documentation ก่อนทุกครั้ง
การ Copy Resource เข้า Server แล้วลอง ensure ทันทีโดยไม่อ่านคู่มือ เป็นหนึ่งในสาเหตุที่ทำให้เกิด Error ได้ง่ายที่สุด
⑮ LICENSE คืออะไร
Open-source Resource จำนวนมากจะมีไฟล์
LICENSE
ไฟล์นี้ใช้กำหนดเงื่อนไขในการนำ Source Code ไปใช้ แก้ไข หรือแจกจ่าย
อย่าเข้าใจว่า Script ที่ดาวน์โหลดฟรีสามารถนำไป
ขายต่อ
เปลี่ยนชื่อ
แจกใหม่
นำ Source ไปใช้เชิงพาณิชย์
ได้ทุกกรณี
ต้องดู License ของโปรเจกต์นั้นก่อน
Free ไม่ได้แปลว่าไม่มีเงื่อนไขการใช้งาน
⑯ package.json คืออะไร
ถ้า Script ใช้ JavaScript, Node.js หรือระบบ Front-end อาจพบไฟล์
package.json
ภายในจะเก็บข้อมูลเกี่ยวกับ Package และ Dependency ของระบบ JavaScript
นอกจากนี้อาจพบ
package-lock.json
yarn.lock
pnpm-lock.yaml
หาก Script มี Source Front-end เช่น React หรือ Vue ก็อาจจำเป็นต้อง Build ก่อนใช้งาน
แต่ Script ที่แจกพร้อม Production Build แล้วอาจมีโฟลเดอร์ dist หรือ build มาให้พร้อม และเจ้าของ Server ไม่จำเป็นต้อง Build เอง
ควรทำตาม Documentation ของ Script นั้นโดยตรง
⑰ Script FiveM ทุกตัวต้องมี client.lua และ server.lua หรือไม่
ไม่ต้องมีครบทั้งสองไฟล์
นี่เป็นเรื่องที่มือใหม่มักเข้าใจผิด
Resource บางตัวอาจมีเพียง Client Script เช่น
fxmanifest.lua
client.lua
บาง Resource อาจเน้น Server Script
บางตัวอาจเป็น Map Resource และแทบไม่มี Gameplay Script
บางตัวอาจเป็น Resource สำหรับ Asset
ดังนั้นไฟล์ที่ Resource ต้องมีจริง ๆ จะขึ้นอยู่กับประเภทและการออกแบบของ Resource
สิ่งที่ควรดูคือ fxmanifest.lua เพราะจะบอกได้ว่า Resource กำลังประกาศและโหลดอะไร
⑱ ทำไมชื่อไฟล์ของแต่ละ Script ไม่เหมือนกัน
ไม่มีข้อบังคับว่า Client Script ต้องชื่อ client.lua
Developer สามารถตั้งชื่อได้ เช่น
main.lua
cl_main.lua
client_main.lua
functions.lua
vehicle.lua
garage.lua
ฝั่ง Server ก็เช่นเดียวกัน
sv_main.lua
server_main.lua
database.lua
callbacks.lua
รูปแบบ Prefix ที่พบได้บ่อยคือ
cl_
sv_
sh_
ตัวอย่าง
cl_main.lua
sv_main.lua
sh_config.lua
โดยทั่วไปอาจหมายถึง
cl = Client
sv = Server
sh = Shared
แต่เป็นเพียง Convention ของ Developer ไม่ใช่กฎที่ FiveM บังคับ
⑲ วิธีดูว่าไฟล์ไหนถูกโหลดจริง
ถ้าต้องการรู้ว่า Resource โหลดไฟล์ใด อย่าเดาจากรายชื่อไฟล์ในโฟลเดอร์อย่างเดียว
ให้เปิด
fxmanifest.lua
แล้วตรวจรายการ เช่น
client_scripts {
'client/*.lua'
}
server_scripts {
'server/*.lua'
}
shared_scripts {
'shared/*.lua'
}
รวมถึง
files
ui_page
dependencies
data_file
เพราะไฟล์บางไฟล์อาจอยู่ใน Resource แต่ไม่ได้ถูกโหลดโดยตรง
ตัวอย่างเช่น Source สำหรับ Development อาจอยู่ในโฟลเดอร์เดียวกัน แต่ Runtime ใช้เฉพาะไฟล์ที่ Build แล้ว
นี่เป็นวิธีที่แม่นยำกว่าการเห็นไฟล์ .lua แล้วสรุปว่าทุกไฟล์กำลังทำงาน
⑳ มือใหม่ควรแก้ไฟล์ไหนก่อน
ถ้าเพิ่งเริ่มดูแล FiveM Server ไม่ควรเปิดทุกไฟล์แล้วแก้ทันที
เริ่มจากลำดับนี้ก่อน
README / Documentation
↓
config.lua
↓
fxmanifest.lua
↓
locales
↓
client / server
หากเพียงต้องการเปลี่ยนราคา ตำแหน่ง Job หรือภาษา ส่วนใหญ่ควรเริ่มจาก Config
ถ้า Script Start ไม่ได้ ให้ตรวจ fxmanifest.lua, Dependency และ Console
ถ้าระบบแสดงผลผิด ให้ดู Client หรือ NUI
ถ้าข้อมูลไม่บันทึก ให้ดู Server Script, Database และ SQL
ถ้ามี Error อย่าแก้ Code แบบสุ่ม ควรอ่านข้อความ Error และดูชื่อไฟล์กับเลขบรรทัดก่อน
แนวทางของ comsiam คือ Backup Script เดิมทุกครั้งก่อนแก้ไข โดยเฉพาะเมื่อกำลังแก้ Resource ที่ใช้งานอยู่บน Production Server
โครงสร้าง Script FiveM แบบไหนถือว่าดี
Script ที่จัดโครงสร้างดีไม่จำเป็นต้องมีโฟลเดอร์เยอะที่สุด แต่ควรแบ่งหน้าที่ชัดเจน
ตัวอย่าง
my-resource/
├── fxmanifest.lua
├── config/
├── client/
├── server/
├── shared/
├── locales/
└── web/
ทำให้ Developer มองแล้วรู้ว่าควรเข้าไปหาส่วนใด
ในทางกลับกัน หากมีไฟล์ Lua หลายสิบไฟล์กระจายอยู่โดยไม่มีรูปแบบ หรือรวม Code หลายพันบรรทัดไว้ไฟล์เดียว การดูแลและ Debug ในอนาคตจะยากขึ้น
สำหรับ Server ที่ตั้งใจใช้งานระยะยาว comsiam แนะนำให้เข้าใจโครงสร้าง Resource ก่อนเริ่มแก้ Script เพราะเพียงรู้ว่า Client, Server, Shared, Config และ Manifest ทำหน้าที่อะไร ก็สามารถลดความผิดพลาดจากการแก้ไฟล์ผิดส่วนได้มาก
สรุปโครงสร้าง Script FiveM มีไฟล์อะไรบ้าง
FiveM Script หรือ Resource แต่ละตัวอาจมีโครงสร้างแตกต่างกัน แต่ไฟล์และโฟลเดอร์ที่พบบ่อยประกอบด้วย
fxmanifest.lua— Resource Manifestclient.lua— Logic ฝั่งผู้เล่นserver.lua— Logic ฝั่ง Serverconfig.lua— ค่าตั้งของ Scriptshared.lua— ข้อมูลหรือ Logic ที่ใช้ร่วมกันclient/— รวม Client Scriptsserver/— รวม Server Scriptsshared/— รวม Shared Scriptshtml/,web/,dist/— Interface/NUIlocales/— ระบบภาษาstream/— Asset ที่ Stream เข้าเกม.meta— ข้อมูล Asset บางประเภท.sql— Database Schema หรือข้อมูลติดตั้งREADME.md— คู่มือLICENSE— เงื่อนไขการใช้งานpackage.json— Dependency หรือ Build System ของ JavaScript
สิ่งสำคัญที่สุดคือ อย่าตัดสินหน้าที่ของไฟล์จากชื่อเพียงอย่างเดียว ให้ตรวจ fxmanifest.lua และ Documentation ของ Resource ร่วมกัน
เมื่อเข้าใจโครงสร้างเหล่านี้แล้ว การติดตั้ง Script, ตรวจ Dependency, แก้ Error และพัฒนา FiveM Server จะง่ายขึ้นมาก และเป็นพื้นฐานก่อนเข้าสู่เรื่องการติดตั้ง Script FiveM แบบเต็มรูปแบบในหัวข้อถัดไป
Comments
Post a Comment