โครงสร้าง 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 ใช้ cerulean

  • Resource ทำงานกับ 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 Manifest

  • client.lua — Logic ฝั่งผู้เล่น

  • server.lua — Logic ฝั่ง Server

  • config.lua — ค่าตั้งของ Script

  • shared.lua — ข้อมูลหรือ Logic ที่ใช้ร่วมกัน

  • client/ — รวม Client Scripts

  • server/ — รวม Server Scripts

  • shared/ — รวม Shared Scripts

  • html/, web/, dist/ — Interface/NUI

  • locales/ — ระบบภาษา

  • 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

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด