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

Popular posts from this blog

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

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

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