FiveM Resource ไม่ Start แก้อย่างไร? รวมสาเหตุและวิธีแก้แบบไล่ทีละจุด
ปัญหา FiveM Resource ไม่ Start ควรเริ่มแก้จาก FXServer Console ก่อน เพราะสาเหตุมีตั้งแต่ Server หา Resource ไม่เจอ, ไม่มี fxmanifest.lua, Manifest เขียนผิด, File Path ผิด, Dependency ไม่พร้อม ไปจนถึง Script Runtime Error หลัง Resource เริ่มโหลด
ลำดับตรวจที่แนะนำคือ
Resource อยู่ถูก Folder?
↓
FXServer มองเห็น Resource?
↓
fxmanifest.lua ถูกต้อง?
↓
Dependencies พร้อม?
↓
Resource Start สำเร็จ?
↓
Server Scripts มี Error?
↓
Client Scripts มี Error?
↓
Feature ทำงานจริง?
อย่าเริ่มจาก
Restart FXServer
Restart อีกครั้ง
ลบ Cache
ลง FiveM ใหม่
โดยยังไม่ได้อ่านข้อความ Error เพราะปัญหา Resource ส่วนใหญ่สามารถระบุตำแหน่งได้จาก Console
① FiveM Resource ไม่ Start หมายถึงอะไร
ต้องแยกปัญหาออกเป็นหลายกรณี
① FXServer หา Resource ไม่เจอ
② FXServer พบ Resource แต่ Parse Manifest ไม่ได้
③ Manifest ผ่าน แต่ Dependency ไม่พร้อม
④ Resource Start แล้ว Server Script Error
⑤ Server ทำงาน แต่ Client Script Error
⑥ Resource Started แต่ Feature ใช้งานไม่ได้
แต่ละกรณีต้องแก้คนละจุด
ดังนั้นคำว่า
Resource ไม่ทำงาน
ยังไม่เพียงพอสำหรับการ Debug
ต้องดูว่ามันหยุดตรงขั้นตอนไหน
② สิ่งแรกที่ต้องดูคือ Server Console
เมื่อใช้
ensure my_resource
ให้ดูข้อความหลังจากนั้นทันที
ตัวอย่าง Error อาจเกี่ยวกับ
Couldn't find resource
resource manifest
dependency
SCRIPT ERROR
No such export
file not found
runtime error
บรรทัด Error แรกมักมีประโยชน์ที่สุด
อย่าอ่านเฉพาะ Error สุดท้าย เพราะ Error ด้านล่างอาจเป็นผลต่อเนื่องจากปัญหาต้นทาง
③ ตรวจว่า Resource อยู่ใน resources หรือไม่
FiveM โหลด Resource จาก Directory
resources/
ตัวอย่างที่ถูก
server-data/
└── resources/
└── [local]/
└── my_resource/
└── fxmanifest.lua
ถ้าเอา Resource ไปวางผิดที่ เช่น
server-data/
my_resource/
FXServer จะไม่ค้นพบใน Resource Directory ปกติ
④ ตรวจ Folder ซ้อนเกินไป
ปัญหาที่พบบ่อยหลังแตก ZIP คือ
resources/
└── my_resource/
└── my_resource/
├── fxmanifest.lua
└── client.lua
แต่ Admin สั่ง
ensure my_resource
ขณะที่ Folder ชั้นแรกไม่มี Manifest
ควรจัดเป็น
resources/
└── my_resource/
├── fxmanifest.lua
└── client.lua
ตรวจ Folder หลัง Extract ทุกครั้ง
⑤ Category Folder ใช้ได้
โครงสร้างนี้ถูกต้อง
resources/
└── [jobs]/
└── police_job/
├── fxmanifest.lua
├── client/
└── server/
Resource จริงคือ
police_job
ไม่ใช่
[jobs]/police_job
ดังนั้น Start ด้วย
ensure police_job
⑥ เพิ่งเพิ่ม Resource ใหม่ต้อง refresh
ถ้า FXServer เปิดอยู่ก่อนที่คุณจะ Copy Resource เข้า resources/
ให้ใช้
refresh
จากนั้น
ensure my_resource
เพราะ refresh จะ Rescan Resource Directory และ Manifests เพื่อให้ Resource ใหม่พร้อมถูก Start
⑦ ตัวอย่าง Workflow ที่ถูก
Copy Resource
resources/[local]/my_resource/
แล้ว Server Console
refresh
ensure my_resource
ไม่จำเป็นต้อง Restart FXServer ทั้งเครื่องทันที
⑧ ถ้ายัง Couldn't find resource
ตรวจ
① Folder อยู่ resources จริงไหม
② Folder ซ้อนหรือไม่
③ ชื่อ Resource ถูกหรือไม่
④ refresh แล้วหรือยัง
⑤ Resource มี Manifest หรือไม่
เช่น Folder จริงคือ
my-garage
แต่สั่ง
ensure my_garage
ถือว่าเป็นคนละชื่อ
⑨ ตรวจ fxmanifest.lua
Resource FiveM ปัจจุบันควรมี
fxmanifest.lua
อยู่ Root Resource
เช่น
my_resource/
├── fxmanifest.lua
├── client.lua
└── server.lua
Cfx.re ระบุว่า Resource Folder ต้องมี Resource Manifest จึงจะถูก Parse เป็น Resource อย่างถูกต้อง
⑩ ระวัง fxmanifest.lua.txt
Windows อาจซ่อน File Extensions
คุณเห็น
fxmanifest.lua
แต่ชื่อจริงอาจเป็น
fxmanifest.lua.txt
FiveM จะไม่มองเป็น Manifest ตามที่ต้องการ
เปิด
View
→ File name extensions
ใน Windows Explorer เพื่อตรวจชื่อจริง
⑪ Manifest ขั้นต่ำควรเป็นอย่างไร
สำหรับ FiveM
fx_version 'cerulean'
game 'gta5'
ถ้ามี Client Script
client_script 'client.lua'
ถ้ามี Server Script
server_script 'server.lua'
รวมเป็น
fx_version 'cerulean'
game 'gta5'
client_script 'client.lua'
server_script 'server.lua'
เริ่มจาก Manifest ง่าย ๆ ก่อน แล้วค่อยเพิ่ม Features
⑫ Manifest Syntax Error แก้อย่างไร
ตัวอย่างผิด
fx_version 'cerulean
game 'gta5'
ลืม '
หรือ
client_scripts {
'client.lua'
'menu.lua'
}
ลืม comma ระหว่าง Entries
ควรเป็น
client_scripts {
'client.lua',
'menu.lua'
}
อ่าน Error Line ที่ Console ระบุ
⑬ อย่าแก้ Manifest ทั้งไฟล์พร้อมกัน
ถ้า Manifest ยาวและ Resource ไม่ Start
ลองลดเหลือส่วนพื้นฐาน
fx_version 'cerulean'
game 'gta5'
client_script 'client.lua'
server_script 'server.lua'
ถ้า Start ได้
ค่อยเพิ่ม
Dependencies
NUI
Files
Data Files
Other directives
ทีละส่วน
นี่ช่วยหา Problem Line ได้เร็วกว่า
⑭ ตรวจ File Path ใน Manifest
สมมติ Manifest
client_script 'client/main.lua'
แต่ไฟล์จริง
client/client.lua
FiveM จะโหลด Path ที่คุณประกาศ
ต้องทำให้ตรงกัน
client_script 'client/client.lua'
หรือ Rename File ตาม Architecture
⑮ Linux ต้องระวังตัวพิมพ์ใหญ่เล็ก
ไฟล์จริง
Client/Main.lua
แต่ Manifest
client_script 'client/main.lua'
บนระบบที่ Case-sensitive อาจหาไฟล์ไม่ตรง
แนะนำตั้ง Folder และ Files เป็นตัวพิมพ์เล็กสม่ำเสมอ เช่น
client/main.lua
server/main.lua
shared/config.lua
⑯ ตรวจ client_scripts หลายไฟล์
เช่น
client_scripts {
'client/config.lua',
'client/main.lua',
'client/menu.lua'
}
ตรวจทุก File ว่ามีจริง
อย่า Copy Manifest จาก Resource อื่นแล้วเหลือ Path อย่าง
'client/vehicle.lua'
ทั้งที่ Resource ไม่มีไฟล์นี้
⑰ ตรวจ server_scripts เช่นกัน
server_scripts {
'server/database.lua',
'server/main.lua'
}
ถ้า Rename
database.lua
เป็น
db.lua
ต้องแก้ Manifest ด้วย
⑱ shared_script ผิด Path ก็มีผล
ตัวอย่าง
shared_script 'shared/config.lua'
แต่จริง
config/config.lua
Resource หรือ Script ที่พึ่ง Config อาจทำงานผิด
Manifest Path ต้องตรงกับโครงสร้างจริงทุกส่วน
⑲ ใช้ Wildcard แล้ว Resource พังได้ไหม
ตัวอย่าง
client_scripts {
'client/**/*.lua'
}
อาจโหลด Files ที่คุณไม่ตั้งใจ เช่น
client/test/old.lua
client/archive/debug.lua
ถ้า File เก่ามี Error Resource ก็อาจเกิด Script Errors ได้
Production Resource ไม่ควรเก็บ Test/Backup Lua ไว้ใน Path ที่ Wildcard โหลด
⑳ อย่าเก็บไฟล์ old.lua ใน Wildcard Folder
ตัวอย่าง
client/
├── main.lua
├── menu.lua
└── main_old.lua
Manifest
client_scripts {
'client/*.lua'
}
หมายความว่า main_old.lua ก็อาจถูกโหลดด้วย
ควรเอา Backup Files ออกจาก Active Script Path หรือใช้ Version Control แทน
㉑ Dependency หายทำให้ Resource Start ไม่ได้
สมมติ Manifest
dependencies {
'ox_lib',
'oxmysql'
}
แต่ Server ไม่มี
ox_lib
Resource Requirement ไม่ครบ
ต้องติดตั้ง/แก้ Dependency จริง
ไม่ใช่ลบชื่อออกจาก Manifestเพื่อให้ Start ผ่าน
㉒ ตรวจ Dependency จากล่างขึ้นบน
สมมติ
garage
↓
my_core
↓
oxmysql
ถ้า Garage ไม่ Start
ตรวจ
oxmysql
ก่อน
จากนั้น
my_core
สุดท้ายจึงกลับมา
garage
เพราะ Error ชั้นล่างสามารถทำให้ Resources ด้านบนเสียตามกัน
㉓ server.cfg ควรเรียง Dependency
ตัวอย่าง
# Libraries
ensure ox_lib
ensure oxmysql
# Core
ensure my_core
# Features
ensure my_inventory
ensure my_garage
อ่านง่ายกว่า
ensure my_garage
ensure my_inventory
ensure oxmysql
ensure my_core
ensure ox_lib
แม้ Manifest จะประกาศ Dependencies อยู่ ก็ควรจัด Configuration ให้เข้าใจง่าย
㉔ อย่าแก้ Dependency ด้วย Wait
ไม่ควร
CreateThread(function()
Wait(10000)
exports['my_core']:GetPlayer()
end)
เพียงเพื่อหวังว่า Core จะพร้อม
ถ้า Core Start ไม่สำเร็จ
Wait 10 วินาที
Wait 60 วินาที
ก็ไม่ช่วย
ต้องแก้ Resource Dependency หรือ Initialization Architecture
㉕ No such export คือ Resource ไม่ Start ไหม
ไม่เสมอไป
อาจเกิดหลัง Resource Start แล้ว
ตัวอย่าง
No such export GetPlayer
in resource my_core
แสดงว่า Consumer กำลังเรียก Export ที่ไม่พบใน Resource/Context ที่กำหนด
ต้องตรวจ API ไม่ใช่แค่ Start Order
㉖ วิธีแก้ No such export
ตรวจ
① Resource Name ถูกไหม
② Resource นั้น Started หรือยัง
③ Export Name ถูกไหม
④ ตัวพิมพ์ใหญ่เล็กถูกไหม
⑤ Export เป็น Client หรือ Server
⑥ API Version ตรงไหม
⑦ Resource ถูก Rename หรือไม่
อย่าเริ่มจากเพิ่ม Wait(5000)
㉗ ตัวอย่าง Export Name ผิด
Resource ให้
exports(
'GetPlayerData',
function(source)
-- ...
end
)
แต่ Consumer ใช้
exports['my_core']
:GetPlayer(source)
ผิดชื่อ
ต้องใช้
exports['my_core']
:GetPlayerData(source)
ตาม Public API จริง
㉘ Client กับ Server Export เป็นคนละ Context
ถ้า Export ถูกประกาศใน server.lua
Client Script ไม่สามารถถือว่า Export เดียวกันเป็น Local Client API ได้โดยอัตโนมัติ
ต้องตรวจว่า Documentation ของ Resource ระบุ
Client Export
หรือ
Server Export
ก่อนเรียก
㉙ Runtime Constraint ทำให้ Resource ไม่ Start ได้
Manifest อาจมี
dependencies {
'/onesync',
'/server:4500'
}
นั่นหมายถึง Resource มี Runtime Requirements เพิ่ม
ถ้า Environment ไม่ผ่าน Resource ก็ไม่ควรถูกคาดหวังให้ทำงานตามปกติ
㉚ /onesync มีผลอย่างไร
dependency '/onesync'
หมายถึง Resource ต้องการ State Awareness
ถ้า Resource ใช้
State Bags
Routing Buckets
Server-side Entity State
อาจมี Requirement นี้
แต่ /onesync ไม่ได้เปิด OneSync ให้ Server
㉛ Minimum Server Build อาจเป็นสาเหตุ
ตัวอย่าง
dependency '/server:7000'
ถ้า FXServer Artifact เก่ากว่า Requirement Resource จะไม่ผ่าน Constraint
อย่าแก้ด้วยการลบบรรทัด Requirement โดยไม่ตรวจว่า Resource ใช้ API ที่ต้องการ Build ใหม่จริงหรือไม่
วิธีที่ถูกต้องมักเป็น Update FXServer ตาม Compatibility ที่ Resource ต้องการ
㉜ Game Build Requirement ก็ต้องตรวจ
เช่น
dependency '/gameBuild:h4'
หมายถึง Resource ต้องการ Game Build ขั้นต่ำตาม Constraint
พบได้ใน Resources ที่ใช้ DLC Assets/Natives บางรุ่น
ต้องตรวจ Server Configuration และ Requirement ของ Resource
㉝ Resource Started แต่ Script Error ต่างจากไม่ Start
สมมติ Console มี
Started resource my_resource
แล้วตามด้วย
SCRIPT ERROR
หมายความว่า Resource Manager สามารถ Start Resource ได้แล้ว
แต่ Script Logic มี Runtime Error
นี่ไม่ใช่ Manifest Discovery Problem อีกต่อไป
ให้ตาม File/Line ที่ Error ระบุ
㉞ Lua nil Error แก้อย่างไร
ตัวอย่าง
attempt to index a nil value
ดู File และ Line
สมมติ
local player =
Players[source]
print(
player.name
)
ถ้า Players[source] == nil
player.name จะ Error
ต้องถามว่า
ทำไม player ไม่มี?
Initialization ยังไม่เกิด?
source ถูกไหม?
Database โหลดแล้วหรือยัง?
Framework API คืน nil หรือไม่?
แก้ Root Cause ไม่ใช่ใส่ if ทุกจุดโดยไม่เข้าใจ
㉟ attempt to call a nil value
ตัวอย่าง
attempt to call a nil value
อาจหมายถึง Function ยังไม่ได้ถูกประกาศหรือถูกโหลดตาม Order ที่คิด
เช่น
StartGarage()
แต่ StartGarage ยังไม่มีค่า
ตรวจ
Function Name
Load Order
Scope
File Path
Module
Framework Version
㊱ Load Order ภายใน Resource สำคัญ
ตัวอย่าง
server_scripts {
'server/main.lua',
'server/functions.lua'
}
แต่ main.lua เรียก Function ที่ประกาศใน functions.lua ทันทีตอนโหลด
อาจเกิดปัญหา
ลองจัด
server_scripts {
'server/functions.lua',
'server/main.lua'
}
หรือออกแบบ Initialization ไม่ให้พึ่ง Load Timing ที่เปราะบาง
㊲ Global กับ local Scope ต้องตรวจ
ตัวอย่าง
functions.lua
local function getPlayer()
end
แล้วคิดว่า main.lua จะเรียก
getPlayer()
ได้โดยอัตโนมัติ อาจไม่ตรงกับ Scope/Environment ที่ออกแบบไว้
ควรออกแบบ APIs/Modules ให้ชัด
ไม่ควรพึ่ง Global Variables กระจายทั่ว Resource
㊳ Client Script Error ดูที่ F8
Server Console อาจบอกว่า Resource Started ปกติ
แต่ Player กด Feature แล้วไม่ทำงาน
ให้เปิด
F8
ดู Client Console
ปัญหาอาจอยู่ใน
client.lua
NUI
Native
Client Export
JavaScript
ไม่ใช่ Server Resource Start
㊴ Resource ใช้ได้กับ Admin แต่ Player ใช้ไม่ได้
ตรวจ Client Runtime และ Permission
เช่น
Command Restricted
ACE Permission
Job Permission
Framework State
NUI
Client Event
อย่าสรุปว่า Resource ไม่ Start หากมันทำงานบางส่วนแล้ว
㊵ NUI Resource Started แต่ UI ไม่ขึ้น
ตรวจ Manifest
ui_page 'html/index.html'
files {
'html/index.html',
'html/style.css',
'html/app.js'
}
จากนั้นตรวจ
index.html มีจริง?
CSS/JS Path ถูก?
F8 มี NUI Error?
SendNUIMessage ถูกเรียก?
SetNuiFocus ถูก?
ปัญหานี้อยู่ Layer NUI ไม่ใช่ Resource Discovery
㊶ NUI Callback ไม่ทำงาน
สำหรับ cerulean ตรวจ Browser Callback ว่าใช้ Secure URL Pattern
เช่น
fetch(
`https://${GetParentResourceName()}/close`,
{
method: 'POST',
body: JSON.stringify({})
}
)
และ Client มี
RegisterNUICallback(
'close',
function(data, cb)
cb({
ok = true
})
end
)
㊷ อย่าลืม cb ใน NUI Callback
ถ้า Handler ไม่ตอบ
cb(...)
Browser Request อาจค้าง
ดังนั้น UI ดูเหมือนเสีย แม้ Resource Started ปกติ
แยก NUI Logic ออกจาก Resource Start Problem ให้ชัด
㊸ JavaScript Resource Error ต้องดู Runtime ด้วย
Resource JavaScript อาจ Start แต่ Server Script เกิด Error ภายหลัง
ตรวจ
Node runtime
Imports
Package build
dist files
thread affinity
โดยเฉพาะ Code ที่ Build จาก TypeScript ต้องตรวจว่า Output Files มีจริงตาม Manifest
㊹ TypeScript Source ไม่ใช่ Runtime Output โดยอัตโนมัติ
ถ้า Manifest เขียน
server_script 'dist/server.js'
แต่คุณยังไม่ได้ Build และไม่มี
dist/server.js
Resource จะไม่มี Script ที่ Manifest คาดหวัง
ก่อน Deploy ตรวจ Build Pipeline เสมอ
㊺ C# Resource ต้อง Build ก่อนหรือไม่
ขึ้นกับ Resource Architecture
หาก Manifest ชี้ไป Assembly ที่ Build แล้ว ต้องแน่ใจว่า
DLL/Assembly
มีจริงและตรง Version
Resource Folder ที่มี Source C# อย่างเดียวไม่ได้แปลว่า Runtime Binary พร้อมเสมอไป
㊻ SQL Error ทำให้ Resource ดูเหมือนไม่ทำงานได้
Resource อาจ Started แล้ว แต่ Initialization Database ล้มเหลว
เช่น
table doesn't exist
column doesn't exist
connection failed
SQL syntax error
ต้องแยกว่า
Resource Manager
→ Started
แต่
Application Initialization
→ Failed
หัวข้อ Database ต่อจากนี้จะลงรายละเอียดมากขึ้น
㊼ ตรวจ Connection String แยกจาก Resource
ถ้าหลาย Resource ที่ใช้ Database พังพร้อมกัน
อย่าแก้ Garage ทีละตัวก่อน
ตรวจ Database Dependency/Connection กลาง
เช่น
oxmysql
Connection String
MariaDB/MySQL
Database service
เพราะอาจเป็น Root Cause เดียว
㊽ Resource ถูก Block ตอนกำลัง Start ได้ไหม
ได้ใน Architecture ของ FiveM
Cfx.re มี Server Event
onResourceStarting
ซึ่งถูกเรียกก่อน Resource Start และ Event นี้สามารถถูก Cancel เพื่อป้องกัน Resource นั้นจากการ Start ได้
ดังนั้นในระบบ Custom Management ขั้นสูง Resource อื่นอาจมี Logic ที่ยกเลิก Startup
แม้จะพบไม่บ่อย แต่ควรรู้ไว้
㊾ ตัวอย่าง onResourceStarting
ตัวอย่างแนวคิด
AddEventHandler(
'onResourceStarting',
function(resourceName)
if resourceName ==
'blocked_resource' then
CancelEvent()
end
end
)
ถ้า Server มี Resource Management แบบ Custom ต้องตรวจ Logic ประเภทนี้ด้วย
㊿ ตรวจ onResourceStart เพื่อยืนยัน Initialization
ใน Resource ของเรา
AddEventHandler(
'onResourceStart',
function(resourceName)
if resourceName ~=
GetCurrentResourceName() then
return
end
print(
'[my_resource] started'
)
end
)
ถ้าข้อความนี้ออก แสดงว่า Server-side Lifecycle Event ของ Resource ถูกเรียกแล้ว
จากนั้น Debug Application Initialization ต่อ
51 Resource Start แต่ Client ไม่โหลดหลัง restart
Client Resource Lifecycle และ Streaming ต้องใช้เวลา/Context ของตัวเอง
ตรวจ
F8
client script errors
manifest client paths
files
NUI assets
และอย่าดูเฉพาะ Server Console
Server Started ไม่ได้การันตีว่า Client Feature ทุกอย่างทำงานถูก
52 อย่า Restart Dependencies ทั้งหมดแบบสุ่ม
ถ้า Garage Error
ไม่ควรทำทันที
restart oxmysql
restart ox_lib
restart core
restart inventory
restart garage
เพราะเพิ่มตัวแปรใหม่ในการ Debug และอาจทำ Resource อื่นได้รับผลกระทบ
Restart เฉพาะสิ่งที่เกี่ยวข้องจริง
53 ใช้ stop/start เพื่อ Isolation Test ได้
สมมติสงสัยว่า Resource A ชนกับ Resource B
ใน Development Environment สามารถทดสอบ
stop resource_b
restart resource_a
แล้วดู Behavior
ถ้าปัญหาหาย อาจมี
Event conflict
Export conflict
Global state conflict
Framework integration issue
แต่ Production ต้องระวังผลกระทบ
54 Resource Name มีอักขระแปลกควรเลี่ยง
แม้ FiveM รองรับชื่อ Resource หลากหลายรูปแบบ แต่ Resource Production ควรใช้ชื่อเรียบง่าย เช่น
my_garage
police_job
city_inventory
ช่วยลดปัญหา
Config
Exports
Dependencies
NUI
Shell scripts
Deployment
ที่ต้องอ้าง Resource Name
55 Rename Resource อาจทำให้ Script พัง
สมมติเดิมชื่อ
my_garage
NUI หรือ Script มี
exports['my_garage']
หรือ
dependency 'my_garage'
แล้ว Rename Folder เป็น
garage_new
References เดิมจะไม่เปลี่ยนให้อัตโนมัติ
ต้อง Audit ทุกจุด
56 Resource Download มาจากที่อื่นต้องอ่าน Requirement
Resource Community อาจต้องใช้
Framework
Database library
ox_lib
target
inventory
specific artifact
game build
ก่อนติดตั้ง
อย่า Copy Folder แล้ว ensure ทันทีโดยไม่อ่าน Requirements
Cfx.re เองเตือนว่า Resources บางตัวมี Dependencies และต้องตรวจให้ครบก่อนใช้งาน
57 Resource เก่ามากอาจต้อง Migration
ถ้าเจอ
__resource.lua
หรือ
resource_manifest_version
แสดงว่าเป็น Manifest Style รุ่นเก่า
Resource อาจยังใช้ได้ แต่ควรพิจารณา Migration เป็น
fxmanifest.lua
กับ
fx_version 'cerulean'
game 'gta5'
และตรวจ APIs รุ่นเก่าทั้ง Resource
58 ลำดับ Debug ที่เร็วที่สุด
เมื่อ Resource ไม่ Start ให้ทำตามนี้
1. อ่าน Console Error แรก
2. ตรวจชื่อ Resource
3. ตรวจ Folder
4. refresh
5. ตรวจ fxmanifest.lua
6. ตรวจ Manifest Syntax
7. ตรวจ Script Paths
8. ตรวจ Dependencies
9. ตรวจ Runtime Constraints
10. ensure Resource
11. ดู Server Script Error
12. ดู Client F8
13. ทดสอบ Feature จริง
อย่าเปลี่ยน 10 อย่างพร้อมกัน
แก้ทีละ Layer
59 Checklist FiveM Resource ไม่ Start
ตรวจให้ครบ
① Folder อยู่ใน resources หรือไม่?
② มี Folder ซ้อนจาก ZIP หรือไม่?
③ Resource Name ถูกหรือไม่?
④ refresh แล้วหรือยัง?
⑤ fxmanifest.lua มีจริงหรือไม่?
⑥ fxmanifest.lua.txt หรือไม่?
⑦ Manifest อยู่ Root หรือไม่?
⑧ fx_version ถูกหรือไม่?
⑨ game 'gta5' มีหรือไม่?
⑩ Manifest Syntax ถูกหรือไม่?
⑪ Client Paths ถูกหรือไม่?
⑫ Server Paths ถูกหรือไม่?
⑬ Shared Paths ถูกหรือไม่?
⑭ Path Case ตรงหรือไม่?
⑮ Wildcard โหลดไฟล์ Backup หรือไม่?
⑯ Dependency มีจริงหรือไม่?
⑰ Dependency Start สำเร็จหรือไม่?
⑱ Dependency Name ถูกหรือไม่?
⑲ มี Circular Dependency หรือไม่?
⑳ `/onesync` Requirement ผ่านหรือไม่?
㉑ Server Build Requirement ผ่านหรือไม่?
㉒ Game Build Requirement ผ่านหรือไม่?
㉓ Export มีจริงหรือไม่?
㉔ Export Name ถูกหรือไม่?
㉕ Client/Server Export Context ถูกหรือไม่?
㉖ Lua มี Syntax Error หรือไม่?
㉗ Runtime มี nil Error หรือไม่?
㉘ Load Order ถูกหรือไม่?
㉙ Database Initialization ผ่านหรือไม่?
㉚ NUI Files ครบหรือไม่?
㉛ Client F8 มี Error หรือไม่?
㉜ Server Console มี Error แรกตรงไหน?
㉝ Resource ถูก Cancel ตอน onResourceStarting หรือไม่?
㉞ Restart เฉพาะ Resource ที่เกี่ยวข้องหรือยัง?
㉟ Feature จริงถูกทดสอบหลัง Start หรือยัง?
⑥⓪ วิธีแก้ Resource ไม่ Start แบบเป็นระบบ
สมมติ Resource ชื่อ
com_garage
โครงสร้าง
resources/
└── [local]/
└── com_garage/
├── fxmanifest.lua
├── shared/
│ └── config.lua
├── client/
│ └── main.lua
└── server/
└── main.lua
fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
author 'comsiam'
description 'FiveM garage'
version '1.0.0'
shared_script 'shared/config.lua'
client_script 'client/main.lua'
server_script 'server/main.lua'
ขั้นที่ 1 — Refresh
refresh
ขั้นที่ 2 — Ensure
ensure com_garage
ขั้นที่ 3 — ดู Console
ถ้าเห็น Manifest Error
กลับไปแก้ fxmanifest.lua
ถ้าเจอ File Error
ตรวจ Path
ถ้าเจอ Dependency Error
แก้ Dependency ก่อน
ถ้าเห็น
Started resource com_garage
แต่มี SCRIPT ERROR ต่อ
Resource Manager ผ่าน
↓
Debug Application Code
ขั้นที่ 4 — เพิ่ม Startup Log
server/main.lua
AddEventHandler(
'onResourceStart',
function(resourceName)
if resourceName ~=
GetCurrentResourceName() then
return
end
print(
'[com_garage] server ready'
)
end
)
client/main.lua
AddEventHandler(
'onClientResourceStart',
function(resourceName)
if resourceName ~=
GetCurrentResourceName() then
return
end
print(
'[com_garage] client ready'
)
end
)
ตอนนี้สามารถแยกได้ว่า
Server Runtime พร้อมไหม?
Client Runtime พร้อมไหม?
ขั้นที่ 5 — เพิ่ม Dependency ทีละตัว
ถ้าต้องใช้ Database
dependency 'oxmysql'
แล้ว
ensure oxmysql
ensure com_garage
ทดสอบอีกครั้ง
หากต้อง OneSync จริงจึงเพิ่ม
dependency '/onesync'
อย่าใส่ Requirement ที่ Resource ไม่ต้องใช้
Resource Started ไม่ได้แปลว่า Resource สมบูรณ์
นี่คือจุดสำคัญมาก
สถานะอาจเป็น
FXServer
↓
Manifest ผ่าน
↓
Resource Started
↓
server.lua ทำงาน
↓
Database Query Error
↓
Garage ใช้ไม่ได้
ดังนั้นการ Debug ต้องไปไกลกว่า
Started resource xxx
ต้องทดสอบ Feature จริง
อย่าลบ Error เพื่อให้ Resource ขึ้น Started
ตัวอย่าง Manifest แจ้ง Dependency หาย
วิธีผิดคือ
ลบ dependency
↓
ensure ผ่าน
แต่ Code ยังใช้
exports.oxmysql:query(...)
เมื่อ Player ใช้งานจริงก็พังอยู่ดี
เป้าหมายไม่ใช่แค่ทำให้ Console แสดง
Started
แต่ต้องทำให้ Architecture ถูกต้อง
คำถามที่พบบ่อยเกี่ยวกับ FiveM Resource ไม่ Start
FiveM Couldn't find resource แก้อย่างไร
ตรวจชื่อ Folder, ตำแหน่งใน resources/, Manifest และใช้
refresh
ก่อน ensure หากเพิ่งเพิ่ม Resource
เพิ่ม Resource ใหม่แล้วไม่เห็นทำอย่างไร
ใช้
refresh
เพื่อ Rescan Resource Folder
Resource ต้องมี fxmanifest.lua ไหม
Resource ปัจจุบันควรมี fxmanifest.lua ที่ Root เพื่อให้ FiveM Parse Resource ได้ถูกต้อง
fxmanifest.lua.txt ใช้ได้ไหม
ไม่ใช่ชื่อ Manifest ที่ต้องการ ต้องตรวจ Extension จริง
Manifest พื้นฐานควรเป็นอย่างไร
fx_version 'cerulean'
game 'gta5'
แล้วเพิ่ม Scripts ตาม Resource
Resource Started แต่ไม่ทำงานทำไม
อาจมี Script Runtime Error, Database Error, Client Error หรือ Feature Initialization Error หลัง Start
SCRIPT ERROR ควรดูตรงไหน
ดู File และ Line ที่ Error ระบุ แล้วตาม Error แรกก่อน
Client Error ดูตรงไหน
FiveM F8 Console
Server Error ดูตรงไหน
FXServer หรือ txAdmin Console
No such export แก้อย่างไร
ตรวจ Resource Name, Export Name, Resource State, Client/Server Context และ API Version
เพิ่ม Wait แก้ No such export ได้ไหม
ไม่ควรเป็นวิธีหลัก ต้องแก้ Dependency/API Root Cause ก่อน
Missing Dependency แก้อย่างไร
ติดตั้งหรือ Start Dependency ที่ Resource ต้องใช้จริง แล้วตรวจชื่อ Resource ให้ตรง
ลบ dependency ออกจาก fxmanifest ได้ไหม
ไม่ควรทำหาก Resource ยังต้องใช้ Dependency นั้นจริง
/onesync ทำให้ Resource Start ไม่ได้ไหม
ได้หาก Resource กำหนด Runtime Requirement แต่ Environment ไม่ตรง
/onesync เปิด OneSync ไหม
ไม่ เป็น Constraint/Requirement เท่านั้น
Server Artifact เก่าเกินไปมีผลไหม
มีได้หาก Resource Require Minimum Server Build หรือใช้ APIs ที่ Artifact ปัจจุบันของคุณไม่รองรับ
Resource เก่าใช้ __resource.lua ทำอย่างไร
พิจารณา Migration เป็น fxmanifest.lua และทดสอบ Compatibility
Resource จาก Windows ไป Linux แล้วพังเพราะอะไร
หนึ่งในสาเหตุที่พบบ่อยคือ Path ตัวพิมพ์ใหญ่เล็กไม่ตรง
Wildcard ทำให้ Resource Error ได้ไหม
ได้หาก Pattern โหลด Lua Files เก่าหรือ Files ที่ไม่ควรถูก Execute
Resource Folder ซ้อนกันมีผลไหม
มี หาก Manifest ไม่ได้อยู่ Root Resource ที่ FXServer กำลัง Parse
ensure ต่างจาก start ไหม
ensure จะ Start หาก Resource ไม่ทำงาน และ Restart หากกำลัง Started อยู่
แก้ Script แล้วต้อง refresh ทุกครั้งไหม
Resource ที่ FXServer รู้จักอยู่แล้วโดยทั่วไปสามารถ Restart Resource เพื่อ Reload Code ได้ ส่วน refresh ใช้ Rescan Resources/Manifests โดยเฉพาะเมื่อเพิ่ม Resource ใหม่
Restart FXServer ทั้งเครื่องจำเป็นไหม
ไม่สำหรับปัญหา Resource ส่วนใหญ่ ควร Debug และ Restart เฉพาะ Resource ที่จำเป็นก่อน
Resource ถูกป้องกันไม่ให้ Start จาก Script อื่นได้ไหม
FiveM มี onResourceStarting ซึ่งสามารถถูก Cancel ได้ ดังนั้น Custom Resource Management สามารถป้องกัน Startup ได้
สรุป FiveM Resource ไม่ Start แก้อย่างไร
วิธีแก้ที่ถูกต้องไม่ใช่เดาสุ่ม แต่ให้ไล่ตาม Layer
① Resource Discovery
↓
② Manifest
↓
③ File Paths
↓
④ Dependencies
↓
⑤ Runtime Requirements
↓
⑥ Server Scripts
↓
⑦ Client Scripts
↓
⑧ Database/NUI/Framework
↓
⑨ Feature Test
ถ้าเพิ่งเพิ่ม Resource ใหม่
refresh
ensure my_resource
ถ้า FXServer หาไม่เจอ ให้ตรวจ
resources/
Folder name
Folder nesting
fxmanifest.lua
ถ้า Resource ถูกพบแต่ Start ไม่ผ่าน ให้ตรวจ
Manifest Syntax
Dependencies
Runtime Constraints
ถ้าเห็น
Started resource my_resource
แล้ว Feature ยังใช้ไม่ได้ ให้เปลี่ยนแนวคิดทันทีจาก
Resource ไม่ Start
เป็น
Resource Started
แต่ Application Logic Error
จากนั้นไปดู
Server Console
Client F8
Database
NUI
Exports
Events
ตามระบบ
สำหรับ Developer ที่เรียน FiveM กับ comsiam สิ่งที่ควรฝึกตั้งแต่แรกคืออ่าน Error ให้เป็น เพราะ Developer ที่แก้ Resource ได้เร็วไม่ใช่คนที่ Restart Server เร็วที่สุด แต่คือคนที่รู้ว่า Error อยู่ใน Layer ไหน
หลักสำคัญจาก comsiam คือ แก้ Error แรกก่อน Error ต่อ ๆ มา และเปลี่ยนทีละจุด เพราะ Error หนึ่งจาก Dependency หรือ Config สามารถสร้าง Error ตามมาอีกหลายสิบบรรทัด หากแก้ปลายเหตุพร้อมกันทั้งหมดจะยิ่งหาสาเหตุจริงยากขึ้น
หัวข้อถัดไปคือ FiveM Database คืออะไร ใช้ทำอะไรในเซิร์ฟเวอร์ ซึ่งจะเริ่มหมวด Database โดยอธิบายว่าทำไมข้อมูลอย่างเงิน, Inventory, รถ, บ้าน และตัวละครต้องมี Persistent Storage และ Database เกี่ยวข้องกับ FXServer อย่างไร
Comments
Post a Comment