FiveM fxmanifest.lua คืออะไร? อธิบาย Resource Manifest ทุกส่วนที่ Developer ต้องรู้

 FiveM fxmanifest.lua คือไฟล์ Resource Manifest ที่บอก FXServer ว่า Resource หนึ่งประกอบด้วยอะไร ต้องโหลด Script ไฟล์ไหน ทำงานฝั่ง Client หรือ Server รองรับเกมอะไร มี NUI, Files, Dependencies หรือข้อกำหนดใดบ้าง

Resource FiveM ปัจจุบันโดยทั่วไปจะมีโครงสร้างประมาณนี้

my_resource/
├── fxmanifest.lua
├── client.lua
├── server.lua
└── config.lua

ตัวอย่าง fxmanifest.lua ขั้นพื้นฐาน

fx_version 'cerulean'
game 'gta5'

author 'comsiam'
description 'Example FiveM resource'
version '1.0.0'

shared_script 'config.lua'
client_script 'client.lua'
server_script 'server.lua'

FiveM จะอ่าน Manifest ก่อนเพื่อรู้ว่า Resource นี้ต้องโหลดอะไร

แนวคิดคือ

FXServer
↓
พบ Resource Folder
↓
อ่าน fxmanifest.lua
↓
ตรวจ Metadata / Requirements
↓
โหลด Shared Scripts
↓
โหลด Client / Server Scripts
↓
Resource ทำงาน

ดังนั้น fxmanifest.lua ถือเป็นหนึ่งในไฟล์พื้นฐานที่สุดที่ FiveM Developer ต้องเข้าใจ

① fxmanifest.lua คืออะไร

fxmanifest.lua คือ Manifest ของ FiveM Resource

หน้าที่หลักคือประกาศข้อมูล เช่น

FX Version
Game
Client Scripts
Server Scripts
Shared Scripts
Files
NUI
Dependencies
Metadata
Runtime Requirements

มันเปรียบเสมือนสารบัญและ Configuration ของ Resource

FiveM ใช้ข้อมูลเหล่านี้เพื่อเตรียม Resource ให้ทำงานอย่างถูกต้อง

② fxmanifest.lua ต้องอยู่ตรงไหน

ต้องอยู่ที่ Root ของ Resource

ตัวอย่างที่ถูกต้อง

resources/
└── [local]/
    └── my_resource/
        ├── fxmanifest.lua
        ├── client.lua
        └── server.lua

ไม่ควรวางเป็น

my_resource/
└── config/
    └── fxmanifest.lua

เพราะ Root Folder ของ Resource ต้องมี Manifest ที่ FiveM สามารถตรวจพบ

③ ถ้าไม่มี fxmanifest.lua จะเกิดอะไรขึ้น

FiveM อาจไม่สามารถ Parse Folder นั้นเป็น Resource ที่ถูกต้องได้ และ Server Console สามารถแจ้ง Warning เกี่ยวกับ Resource Manifest

หากสร้าง Resource ใหม่ ให้ตรวจว่าชื่อไฟล์เป็น

fxmanifest.lua

จริง ๆ

โดยเฉพาะ Windows ที่อาจซ่อน File Extension แล้วทำให้ไฟล์กลายเป็น

fxmanifest.lua.txt

โดยไม่รู้ตัว

④ fxmanifest.lua เป็น Lua หรือไม่

ใช่ ไฟล์ Manifest ใช้ Syntax แบบ Lua

แต่มีรายละเอียดสำคัญคือ Cfx.re ระบุว่า Manifest ถูก Run ใน Runtime แยกจาก Lua Scripts ของ Resource

ดังนั้น

local test = 100

ใน fxmanifest.lua

ไม่ได้แปลว่า client.lua สามารถอ่าน test ได้

Manifest มีหน้าที่ประกาศ Metadata มากกว่าจะเป็น Shared Application Code

⑤ ถ้า Script เขียน JavaScript ยังต้องมี fxmanifest.lua ไหม

ต้องมี

ตัวอย่าง Resource JavaScript

my_js_resource/
├── fxmanifest.lua
├── client.js
└── server.js

Manifest

fx_version 'cerulean'
game 'gta5'

client_script 'client.js'
server_script 'server.js'

แม้ Code หลักเป็น JavaScript ไฟล์ Manifest ยังคงเป็น fxmanifest.lua

⑥ ถ้าเขียน C# ล่ะ

ก็ยังใช้ fxmanifest.lua

ดังนั้น Manifest ไม่ได้ขึ้นอยู่กับภาษาที่ใช้เขียน Logic

Resource อาจใช้

Lua
JavaScript
C#

แต่ยังต้องมี Resource Manifest เพื่อบอก FiveM ว่า Files ไหนต้องถูกโหลด

⑦ บรรทัดแรกควรเป็นอะไร

Resource ปัจจุบันมักเริ่มด้วย

fx_version 'cerulean'

แล้ว

game 'gta5'

ตัวอย่าง

fx_version 'cerulean'
game 'gta5'

นี่คือโครงสร้างพื้นฐานที่ใช้กับ FiveM Resource สมัยใหม่

⑧ fx_version คืออะไร

fx_version กำหนด Feature Set ของ Resource Manifest

เช่น

fx_version 'cerulean'

Cfx.re ระบุว่า cerulean เป็น FXv2 Resource Version ปัจจุบันที่ใช้ทั่วไป

Resource Version รุ่นใหม่จะรวม Features ของ Version ก่อนหน้าไว้ตามกฎของ Manifest Versioning

⑨ cerulean คืออะไร

cerulean เป็น FX Version ที่ประกาศในเดือนพฤษภาคม 2020

หนึ่งในความเปลี่ยนแปลงสำคัญคือ NUI Resources ถูกโหลดใน Secure Context

จึงใช้ NUI Callback ผ่านรูปแบบ

https://

แทน Pattern เก่าที่อาจพบใน Tutorial รุ่นก่อน

หัวข้อ 444 — FiveM fx_version cerulean คืออะไร จะลงรายละเอียดเรื่องนี้อีกครั้ง

⑩ game 'gta5' คืออะไร

สำหรับ FiveM ใช้

game 'gta5'

เพื่อระบุว่า Resource ต้องใช้ GTA V API Set

Cfx.re ระบุ Game Types เช่น

gta5
→ FiveM

rdr3
→ RedM

common
→ ใช้เฉพาะ CitizenFX API ที่ไม่ขึ้นกับเกม

สำหรับ FiveM Resource ทั่วไปจึงใช้ gta5

⑪ games ใช้หลายเกมได้ไหม

ได้

ตัวอย่างจากเอกสาร

games {
    'gta5',
    'rdr3'
}

หมายถึง Resource ประกาศรองรับหลาย Game API Sets

แต่ Resource FiveM ปกติที่เขียนเฉพาะ GTA V สามารถใช้

game 'gta5'

แบบง่ายที่สุด

⑫ author คืออะไร

เป็น Metadata สำหรับระบุผู้พัฒนา

ตัวอย่าง

author 'comsiam'

หรือ

author 'John Doe'

ไม่ใช่ส่วนที่ทำให้ Script ทำงานหรือไม่ทำงาน แต่ช่วยระบุเจ้าของ/ผู้พัฒนา Resource

⑬ description คืออะไร

ใช้เขียนคำอธิบาย Resource

description 'Vehicle garage system'

เหมาะกับ Resource ที่ต้องแจกจ่ายหรือ Maintain หลายระบบ

Developer คนอื่นเปิด Manifest มาก็รู้ทันทีว่า Resource นี้ทำอะไร

⑭ version คืออะไร

ใช้กำหนด Version ของ Resource

version '1.0.0'

สามารถนำไปใช้กับ

  • Release Management

  • Debug

  • Compatibility

  • Update Checks

ได้

ตัวอย่าง

1.0.0
1.1.0
2.0.0

แต่ FiveM ไม่ได้ Update Resource ให้อัตโนมัติเพียงเพราะใส่ Version

⑮ Metadata จำเป็นทุกตัวไหม

ไม่

Resource ขั้นต่ำอาจมีเพียง

fx_version 'cerulean'
game 'gta5'

client_script 'client.lua'

ก็เพียงพอสำหรับ Client Resource ง่าย ๆ

แต่ Metadata เช่น

author
description
version

เป็น Good Practice สำหรับ Resource ที่ดูแลจริง

⑯ Manifest รองรับ Custom Metadata ไหม

รองรับ

Cfx.re ระบุว่า Metadata Keys สามารถเป็น Arbitrary Keys ได้

ตัวอย่าง Concept

my_metadata 'hello'

Resource Scripts สามารถอ่าน Resource Metadata ผ่าน APIs เช่น

GET_NUM_RESOURCE_METADATA
GET_RESOURCE_METADATA

ทำให้สามารถสร้างระบบ Configuration/Plugin Metadata ได้

⑰ client_script คืออะไร

ใช้ระบุ File ที่ต้องโหลดบน Client

client_script 'client.lua'

ตัวอย่าง

fx_version 'cerulean'
game 'gta5'

client_script 'client.lua'

FiveM จะส่ง File นี้ให้ Client และโหลดผ่าน Runtime ตาม File Extension

⑱ Client Lua ถูกโหลดอย่างไร

ถ้า File เป็น

.lua

FiveM ใช้ Lua Runtime

ตัวอย่าง

client_script 'client.lua'

client.lua

RegisterCommand(
    'hello',
    function()

        print(
            'Hello from client'
        )

    end,
    false
)

⑲ Client JavaScript ใช้อย่างไร

Manifest

client_script 'client.js'

Extension .js ทำให้ FiveM ใช้ JavaScript Client Runtime

ดังนั้น Manifest Entry เดิมสามารถรองรับหลายภาษาได้จาก Extension

⑳ client_scripts คืออะไร

ถ้ามีหลาย Files ใช้แบบ Table

client_scripts {
    'client/main.lua',
    'client/menu.lua',
    'client/vehicle.lua'
}

เหมาะกว่าเขียน

client_script 'client/main.lua'
client_script 'client/menu.lua'
client_script 'client/vehicle.lua'

ทั้งสอง Concept ใช้งานได้

㉑ server_script คืออะไร

ใช้ระบุ Script ฝั่ง FXServer

server_script 'server.lua'

ตัวอย่าง

RegisterNetEvent(
    'example:hello',
    function()

        print(
            'Player:',
            source
        )

    end
)

Logic สำคัญอย่าง Database, Permission และ Business Validation มักอยู่ Server

㉒ server_scripts คืออะไร

หลายไฟล์สามารถใช้

server_scripts {
    'server/main.lua',
    'server/database.lua',
    'server/commands.lua'
}

ช่วยแยก Code ตามหน้าที่

Resource ขนาดใหญ่ไม่ควรรวมทุกอย่างไว้ใน server.lua ไฟล์เดียวถ้าเริ่ม Maintain ยาก

㉓ shared_script คืออะไร

ใช้โหลด File ทั้ง Client และ Server

shared_script 'config.lua'

เช่น

Config = {}

Config.DrawDistance = 20.0
Config.JobName = 'police'

ทั้ง Client และ Server สามารถ Load Config ชุดนี้ได้

แต่ Runtime Memory ยังคงแยกกัน

㉔ shared_scripts คืออะไร

หลาย Shared Files ใช้

shared_scripts {
    'shared/config.lua',
    'shared/constants.lua',
    'shared/utils.lua'
}

เหมาะสำหรับ

Configuration
Constants
Pure Utility Functions
Shared Data Definitions

ที่ใช้ได้ทั้งสองฝั่ง

㉕ อย่าใส่ Secret ใน shared_script

เพราะ Shared Script ต้องถูกส่งไป Client

ไม่ควรใส่

Database Password
Private API Secret
Admin Secret
Security Token

ใน Shared Script

ข้อมูลที่ต้องเป็น Server-only ควรอยู่ Server Context

㉖ Globbing คืออะไร

Manifest Entries บางประเภท รองรับ Pattern Matching

เช่น

client_scripts {
    'client/*.lua'
}

จะ Match Lua Files ใน Folder ระดับนั้น

ตัวอย่าง

client/main.lua
client/menu.lua
client/hud.lua

สามารถถูกโหลดด้วย Pattern เดียว

㉗ Recursive Globbing ทำอย่างไร

สามารถใช้ Pattern เช่น

client_scripts {
    'client/**/*.lua'
}

เพื่อ Match Files ใน Subdirectories

ตัวอย่าง

client/core/main.lua
client/ui/menu.lua
client/vehicle/main.lua

มีประโยชน์กับ Resource ใหญ่

㉘ Globbing ใช้กับทุก Directive ไหม

ไม่ควรสมมติ

เอกสาร Resource Manifest ระบุว่าแต่ละ Entry Type จะบอกเองว่ารองรับ Globbing หรือไม่

client_script, server_script, shared_script รองรับ

แต่ต้องตรวจ Documentation ของ Directive อื่นก่อนใช้ Pattern

㉙ Load Order สำคัญไหม

สำคัญ

สมมติ

shared/config.lua
shared/functions.lua
client/main.lua

main.lua ต้องการ Function/Config จาก Files ก่อนหน้า

ควรจัด Manifest ให้ Dependencies ภายใน Resource ชัดเจน

ตัวอย่าง

shared_scripts {
    'shared/config.lua',
    'shared/functions.lua'
}

client_script 'client/main.lua'

อย่าให้ Resource ขึ้นกับ Load Order แบบคลุมเครือถ้าสามารถเขียนให้ชัดได้

㉚ files คืออะไร

files เพิ่ม Files เข้า Resource Packfile เพื่อให้ Client ดาวน์โหลดเมื่อโหลด Resource

ตัวอย่าง

files {
    'html/index.html',
    'html/style.css',
    'html/app.js'
}

มักใช้กับ

  • NUI

  • Images

  • JSON

  • Audio

  • Data Assets

㉛ file ต่างจาก files อย่างไร

ไฟล์เดียว

file 'html/index.html'

หลายไฟล์

files {
    'html/index.html',
    'html/app.js'
}

Concept เหมือนกับ client_script กับ client_scripts

㉜ ui_page คืออะไร

ใช้กำหนด Root Page ของ NUI

ตัวอย่าง

ui_page 'html/index.html'

แล้วต้องประกาศ Local UI Files ที่ Client ต้องดาวน์โหลดด้วย

files {
    'html/index.html',
    'html/style.css',
    'html/app.js'
}

㉝ ตัวอย่าง NUI Manifest

fx_version 'cerulean'
game 'gta5'

client_script 'client.lua'

ui_page 'html/index.html'

files {
    'html/index.html',
    'html/style.css',
    'html/app.js'
}

จากนั้น Client Script สามารถใช้

SendNUIMessage(...)
SetNuiFocus(...)

เพื่อทำงานกับ UI

㉞ ui_page ใช้ URL ภายนอกได้ไหม

ได้

เอกสาร Cfx.re รองรับ Absolute URL เช่น

ui_page 'https://ui.example.com/index.html'

แต่ถ้าใช้ Local Files ต้องเพิ่ม Dependencies ของหน้าเข้า files

Resource ส่วนใหญ่เลือก Local NUI เพื่อควบคุม Version และ Availability ได้ง่ายกว่า

㉟ cerulean มีผลกับ NUI อย่างไร

cerulean ใช้ Secure Context สำหรับ NUI

ดังนั้น NUI Callback ใช้

https://

ใน CFX NUI Context

นี่เป็นสาเหตุที่ Code จาก Tutorial รุ่นเก่าซึ่งใช้ HTTP Pattern อาจต้องปรับ

㊱ server_only คืออะไร

Manifest รองรับ

server_only 'yes'

Cfx.re ระบุว่า Resource ที่เป็น Server-only จะไม่ส่ง Resource Content ให้ Clients

เหมาะกับ Resource เช่น

Server Database Worker
Server Scheduler
Backend Service
Server Logging

ที่ไม่มี Client Components

㊲ server_only เหมาะกับอะไร

ตัวอย่าง

fx_version 'cerulean'
game 'gta5'

server_only 'yes'

server_script 'server.lua'

Resource นี้ไม่ต้องมี Client Script หรือ Client Assets

ช่วยลดสิ่งที่ Client ต้องดาวน์โหลด

㊳ server_only ใช้ซ่อน Password ได้ไหม

Server-only Resource ช่วยไม่ส่ง Content ให้ Client แต่ Security ที่ดีไม่ควรพึ่ง Directive นี้อย่างเดียว

Database Password ควรเก็บใน Server Configuration/Environment ที่เหมาะสม

และไม่ควร Hardcode Secrets ไว้ใน Resource ที่แจกจ่าย

㊴ dependency คืออะไร

ใช้ระบุว่า Resource นี้ต้องมี Resource อื่นก่อน

ตัวอย่าง

dependency 'ox_lib'

หมายความว่า Resource ox_lib ต้อง Load ก่อน Resource ปัจจุบัน

ถ้ามีหลาย Dependency

dependencies {
    'ox_lib',
    'oxmysql'
}

㊵ Dependencies ช่วย Start Order อย่างไร

สมมติ

my_garage
↓
ต้องใช้ oxmysql

Manifest

dependency 'oxmysql'

Server จะรู้ Requirement ว่า oxmysql ต้อง Load ก่อน my_garage

ช่วยลดการพึ่ง

Wait(5000)

เพื่อรอ Library แบบสุ่ม

㊶ Runtime Constraint คืออะไร

dependency ยังสามารถระบุ Requirement ที่ไม่ใช่ชื่อ Resource

เช่น

dependencies {
    '/onesync',
    '/server:4500'
}

หมายถึง Resource ต้องการ

OneSync State Awareness
+
Server build อย่างน้อย 4500

ถ้า Environment ไม่ตรง Resource จะไม่สามารถทำงานตาม Requirement ได้

㊷ /onesync คืออะไร

ใช้

dependency '/onesync'

เพื่อประกาศว่า Resource ต้องการ State Awareness

เหมาะกับ Resource ที่พึ่ง

  • Routing Buckets

  • State Bags

  • Server Entity State

  • OneSync Features

แต่ /onesync ไม่ได้เปิด OneSync เอง

Server ยังต้อง Configure OneSync ใน FXServer

㊸ /server:4500 คืออะไร

หมายถึง Require Server Build ขั้นต่ำ

dependency '/server:4500'

คือ

FXServer Build >= 4500

เหมาะกับ Resource ที่ใช้ Native หรือ Runtime Feature ใหม่

ไม่ต้องปล่อยให้ Resource Start แล้วพังภายหลังเพราะ Server เก่าเกินไป

㊹ /gameBuild คืออะไร

สามารถ Require Game Build

ตัวอย่างจากเอกสาร

dependency '/gameBuild:h4'

ใช้เมื่อ Resource ต้องการ Content/Natives ที่มีตั้งแต่ Game Build หนึ่งขึ้นไป

เหมาะกับ Map, Vehicles หรือ Gameplay ที่พึ่ง DLC Build

㊺ /native คืออะไร

สามารถ Require Server-side Native

เช่น

dependency '/native:0xE27C97A0'

เพื่อบอกว่า Server ต้องรองรับ Native Hash นั้น

เป็นวิธีตรวจ Compatibility ระดับ Resource ก่อน Runtime Logic ทำงาน

㊻ export ใน Manifest คืออะไร

Manifest รองรับ

export 'SayHello'

หรือ

exports {
    'SetValue',
    'GetValue'
}

เพื่อประกาศ Client-side Global Functions เป็น Exports

แต่เอกสารปัจจุบันแนะนำว่า Resource ใหม่ควรพิจารณา Runtime Export

exports(
    'SayHello',
    function(...)
    end
)

มากกว่า Manifest Export ในหลายกรณี

㊼ server_export คืออะไร

ใช้ประกาศ Global Function ฝั่ง Server เป็น Export

ตัวอย่าง

server_export 'GetPlayerData'

แต่เช่นเดียวกัน Runtime Exports มักเป็นแนวทางที่สะอาดกว่าสำหรับ Code ใหม่

Exports ถูกอธิบายเต็มในหัวข้อ 422 ไปแล้ว

㊽ Manifest Export มีข้อควรระวังอะไร

Cfx.re ระบุว่า Explicit Manifest Exports จะพร้อมหลัง Scheduler Tick แรก

ดังนั้น Resource ที่พึ่ง Export ตั้งแต่วินาทีแรกของ Initialization อาจต้องระวัง Lifecycle

Runtime Exports ทำให้ Public API อยู่ใกล้กับ Function Implementation มากกว่า

㊾ data_file คืออะไร

Resource ที่มี Game Data Files เช่น Vehicle หรือ Map สามารถใช้ data_file

ตัวอย่าง Concept

files {
    'handling.meta'
}

data_file 'HANDLING_FILE'
    'handling.meta'

ใช้บอกเกมว่า File นี้เป็น Data Type อะไร

พบมากใน

  • Vehicles

  • Weapons

  • Maps

  • Audio/Data Packs

Resource Scripts ทั่วไปอาจไม่ต้องใช้

㊿ stream Folder ต้องใส่ files ไหม

Streaming Assets บางประเภทใน stream/ ถูก Resource Streaming System ตรวจตามระบบ

แต่ Data Files ที่ต้อง Register เพิ่มมักต้องใช้ files และ data_file ตามประเภท

อย่า Copy Manifest ของ Vehicle หรือ Map จาก Resource อื่นทั้งชุดโดยไม่รู้ว่าแต่ละ .meta ทำอะไร

51 loadscreen คืออะไร

Manifest รองรับ

loadscreen 'html/loadscreen.html'

พร้อมเพิ่ม Files

files {
    'html/loadscreen.html',
    'html/style.css'
}

เพื่อสร้าง Loading Screen ของ Server/Resource

และยังมี Directive เกี่ยวกับ Manual Shutdown ตามระบบ NUI Loadscreen

52 escrow_ignore คืออะไร

ใช้ร่วมกับ Asset Escrow เพื่อระบุ Files ที่ไม่ต้องถูก Protect ด้วย Escrow

ตัวอย่าง

escrow_ignore {
    'config.lua',
    'editable/client.lua'
}

เหมาะกับ Paid Resource ที่ต้องการเปิด Config ให้ผู้ซื้อแก้ไขได้

ไม่เกี่ยวกับ Resource ฟรีทั่วไปหากไม่ได้ใช้ Asset Escrow

53 lua54 'yes' ยังต้องใช้ไหม

ไม่ต้องใช้แล้ว

เอกสาร Resource Manifest ปัจจุบันระบุว่า

lua54 'yes'

ถูก Deprecated

ตั้งแต่เดือนมิถุนายน 2025 Lua 5.3 ถูก Deprecated และ Lua Scripts ทั้งหมดใช้ Lua 5.4

ดังนั้น Resource ใหม่ไม่ควรใส่บรรทัดนี้เพียงเพราะเห็นจาก Manifest รุ่นเก่า

54 ตัวอย่าง Manifest เก่าที่ไม่จำเป็น

อาจพบ

fx_version 'cerulean'
game 'gta5'

lua54 'yes'

ปัจจุบันสามารถใช้

fx_version 'cerulean'
game 'gta5'

ได้

lua54 'yes' ไม่ได้ทำให้ Resource เร็วขึ้นหรือเปิด Feature พิเศษเพิ่มใน Runtime ปัจจุบัน

55 __resource.lua คืออะไร

ก่อน fxmanifest.lua FiveM ใช้

__resource.lua

เป็น Manifest รุ่นเก่า

Resource เก่าบน Internet จึงยังพบ

resource_manifest_version '...'

แทน

fx_version 'cerulean'

แต่ Resource ใหม่ควรใช้ fxmanifest.lua

หัวข้อ 445 จะเปรียบเทียบสองรูปแบบโดยตรง

56 Resource Manifest Version แบบ GUID ยังควรใช้ไหม

ไม่สำหรับ Resource ใหม่

Directive

resource_manifest_version

ถูกระบุเป็น Deprecated

ควรใช้

fx_version 'cerulean'

และ fxmanifest.lua

แทน

อย่านำ GUID Manifest เก่ามาใช้กับ Resource ใหม่โดยไม่มีเหตุผล

57 ตัวอย่าง fxmanifest.lua สำหรับ Resource Lua ทั่วไป

fx_version 'cerulean'
game 'gta5'

author 'comsiam'
description 'Garage resource'
version '1.0.0'

shared_scripts {
    'shared/config.lua'
}

client_scripts {
    'client/main.lua',
    'client/menu.lua'
}

server_scripts {
    'server/main.lua',
    'server/database.lua'
}

โครงสร้าง Folder

my_garage/
├── fxmanifest.lua
├── shared/
│   └── config.lua
├── client/
│   ├── main.lua
│   └── menu.lua
└── server/
    ├── main.lua
    └── database.lua

เป็น Pattern ที่อ่านง่ายและขยายต่อได้

58 ตัวอย่าง Manifest สำหรับ NUI Resource

fx_version 'cerulean'
game 'gta5'

author 'comsiam'
description 'Example NUI resource'
version '1.0.0'

client_script 'client.lua'

ui_page 'html/index.html'

files {
    'html/index.html',
    'html/style.css',
    'html/app.js',
    'html/images/*.png'
}

โครงสร้าง

my_ui/
├── fxmanifest.lua
├── client.lua
└── html/
    ├── index.html
    ├── style.css
    ├── app.js
    └── images/

เหมาะกับ HUD, Menu, Phone หรือ Inventory UI

59 Checklist ตรวจ fxmanifest.lua ก่อน Start Resource

ตรวจอย่างน้อย

① ไฟล์ชื่อ fxmanifest.lua ถูกต้องหรือไม่?
② อยู่ Root Resource หรือไม่?
③ ใช้ fx_version 'cerulean' หรือไม่?
④ game 'gta5' ถูกต้องหรือไม่?
⑤ Client Script Paths ถูกหรือไม่?
⑥ Server Script Paths ถูกหรือไม่?
⑦ Shared Scripts มี Secrets หรือไม่?
⑧ Load Order ถูกหรือไม่?
⑨ Wildcard Match Files ที่ต้องการจริงหรือไม่?
⑩ ui_page ถูกหรือไม่?
⑪ NUI Files อยู่ใน files หรือไม่?
⑫ Dependencies ถูกประกาศหรือไม่?
⑬ Resource ต้อง /onesync หรือไม่?
⑭ Server Build Requirement ต้องกำหนดหรือไม่?
⑮ Game Build Requirement มีหรือไม่?
⑯ server_only เหมาะหรือไม่?
⑰ data_file ถูกประเภทหรือไม่?
⑱ Manifest มี Directive Deprecated หรือไม่?
⑲ ยังใส่ lua54 'yes' โดยไม่จำเป็นหรือไม่?
⑳ ยังใช้ resource_manifest_version เก่าหรือไม่?
㉑ File Path ตัวพิมพ์ใหญ่เล็กตรงกันหรือไม่?
㉒ Server Console แจ้ง Manifest Error อะไร?

⑥⓪ ตัวอย่าง fxmanifest.lua แบบครบสำหรับ Resource จริง

สมมติสร้าง Resource ชื่อ

com_garage

โครงสร้าง

com_garage/
├── fxmanifest.lua
├── shared/
│   ├── config.lua
│   └── constants.lua
├── client/
│   ├── main.lua
│   └── ui.lua
├── server/
│   ├── main.lua
│   └── database.lua
└── html/
    ├── index.html
    ├── style.css
    └── app.js

Manifest

fx_version 'cerulean'
game 'gta5'

author 'comsiam'
description 'Garage system for FiveM'
version '1.0.0'

dependencies {
    '/onesync',
    'ox_lib',
    'oxmysql'
}

shared_scripts {
    'shared/config.lua',
    'shared/constants.lua'
}

client_scripts {
    'client/main.lua',
    'client/ui.lua'
}

server_scripts {
    'server/main.lua',
    'server/database.lua'
}

ui_page 'html/index.html'

files {
    'html/index.html',
    'html/style.css',
    'html/app.js'
}

เมื่อ FXServer ทำ

ensure ox_lib
ensure oxmysql
ensure com_garage

Flow จะเป็นประมาณ

FXServer
↓
พบ com_garage
↓
อ่าน fxmanifest.lua
↓
ตรวจ /onesync
↓
ตรวจ ox_lib
↓
ตรวจ oxmysql
↓
โหลด Shared Scripts
↓
โหลด Client Scripts
↓
โหลด Server Scripts
↓
เตรียม NUI Files
↓
Resource Running

Manifest จึงทำหน้าที่เหมือน Contract ของ Resource ว่า Resource ต้องการอะไรและประกอบด้วยอะไร

คำถามที่พบบ่อยเกี่ยวกับ FiveM fxmanifest.lua

FiveM fxmanifest.lua คืออะไร

คือ Resource Manifest ที่กำหนด Metadata, Scripts, Files และ Requirements ของ FiveM Resource

fxmanifest.lua ต้องอยู่ตรงไหน

อยู่ Root Folder ของ Resource

Resource ทุกตัวต้องมีไหม

Resource ปัจจุบันต้องมี Manifest เพื่อให้ FiveM Parse ได้อย่างถูกต้อง โดยใช้ fxmanifest.lua หรือรูปแบบเก่า __resource.lua ที่ถูก Deprecated แล้ว

fxmanifest.lua เป็น Lua ไหม

ใช้ Lua Syntax แต่ทำงานใน Runtime แยกจาก Resource Lua Scripts

FiveM Resource ใช้ fx_version อะไร

Resource ปัจจุบันทั่วไปใช้

fx_version 'cerulean'

FiveM ใช้ game อะไร

game 'gta5'

client_script คืออะไร

ระบุ Script ที่โหลดบน Client

server_script คืออะไร

ระบุ Script ที่โหลดบน FXServer

shared_script คืออะไร

ระบุ Script ที่โหลดทั้ง Client และ Server

shared_script แชร์ Variable เดียวกันไหม

ไม่ Client กับ Server ยังเป็นคนละ Runtime

files คืออะไร

เพิ่ม Files เข้า Resource Packfile สำหรับ Clients

ui_page คืออะไร

กำหนดหน้า Root ของ NUI

dependency คืออะไร

ระบุ Resource หรือ Runtime Requirement ที่ต้องมี

/onesync คืออะไร

Runtime Constraint ที่กำหนดว่า State Awareness ต้องไม่ถูก Disable

/onesync เปิด OneSync ให้ไหม

ไม่ เป็น Requirement เท่านั้น

Manifest ใช้ Wildcard ได้ไหม

Directives บางประเภท เช่น Client/Server/Shared Scripts รองรับ Globbing

JavaScript Resource ใช้ fxmanifest.lua ไหม

ใช้

C# Resource ใช้ fxmanifest.lua ไหม

ใช้

lua54 'yes' ยังต้องใส่ไหม

ไม่ ปัจจุบัน Deprecated แล้วและ Lua Scripts ใช้ Lua 5.4

resource_manifest_version ยังใช้ไหม

ถูก Deprecated ควรใช้ fx_version

__resource.lua ยังใช้ได้ไหม

ยังพบได้ใน Resource เก่า แต่ควร Migration มา fxmanifest.lua

Export ประกาศใน Manifest ได้ไหม

ได้ แต่ Cfx.re แนะนำ Runtime Export Functions สำหรับ Code ใหม่ในหลายกรณี

NUI Files ต้องใส่ใน files ไหม

Local NUI Page และ Dependencies ที่ Client ต้องใช้ต้องถูกเพิ่มเข้า Resource Packfile ผ่าน files

server_only คืออะไร

ทำให้ Resource เป็น Server-only และไม่ส่ง Content ของ Resource ให้ Client

Metadata อ่านจาก Script ได้ไหม

ได้ผ่าน Resource Metadata APIs

สรุป FiveM fxmanifest.lua คืออะไร

fxmanifest.lua คือหัวใจของ FiveM Resource เพราะเป็นไฟล์ที่บอก FXServer ว่า Resource นี้คืออะไร ต้องโหลดอะไร และต้องการ Environment แบบใด

Resource ขั้นพื้นฐานอาจมีเพียง

fx_version 'cerulean'
game 'gta5'

client_script 'client.lua'
server_script 'server.lua'

ถ้ามี Configuration ที่ใช้ทั้งสองฝั่ง

shared_script 'config.lua'

ถ้ามีหลาย Files

client_scripts {
    'client/main.lua',
    'client/menu.lua'
}

ถ้ามี NUI

ui_page 'html/index.html'

files {
    'html/index.html',
    'html/app.js',
    'html/style.css'
}

ถ้าต้องพึ่ง Resource อื่น

dependencies {
    'ox_lib',
    'oxmysql'
}

และถ้าต้องใช้ OneSync

dependency '/onesync'

Manifest จึงสามารถมองเป็น

Resource Identity
+
File Loader
+
Metadata
+
Dependency Contract
+
Runtime Requirements

รวมอยู่ในไฟล์เดียว

สิ่งที่ FiveM Developer ควรหลีกเลี่ยงคือ Copy fxmanifest.lua จาก Resource อื่นมาทั้งชุดแล้วไม่รู้ว่าแต่ละบรรทัดทำอะไร เพราะอาจมี

Deprecated Directives
Files ที่ไม่มีจริง
Dependencies ที่ไม่ใช้
Data Files ผิดประเภท
Game Build Requirements

ติดมาด้วย

สำหรับผู้ที่เรียน FiveM Developer กับ comsiam วิธีเขียน Manifest ที่ดีคือ ใส่เฉพาะสิ่งที่ Resource ใช้จริง และให้ Manifest อธิบาย Architecture ของ Resource ได้จากการเปิดดูเพียงไฟล์เดียว

อีกหลักสำคัญจาก comsiam คือ fxmanifest.lua ไม่ใช่ที่เก็บ Application Logic หรือ Secret Configuration แต่เป็น Manifest ที่ประกาศว่า Resource ต้องโหลดอะไรและต้องการ Environment แบบใด

หัวข้อถัดไปคือ วิธีเขียน fxmanifest.lua สำหรับ FiveM ซึ่งจะนำ Directive เหล่านี้มาสร้าง Manifest ตั้งแต่ Resource ง่าย ๆ, Resource มี ESX/QBCore, ox_lib/oxmysql, NUI, Streaming Assets ไปจนถึงการตรวจ Error จาก Manifest แบบใช้งานจริง

Comments

Popular posts from this blog

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

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

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