__resource.lua กับ fxmanifest.lua ต่างกันอย่างไร? วิธีอัปเดต FiveM Resource รุ่นเก่าให้เป็นปัจจุบัน
__resource.lua กับ fxmanifest.lua เป็นไฟล์ Resource Manifest ของ FiveM เหมือนกัน แต่ __resource.lua เป็นรูปแบบเก่า ส่วน fxmanifest.lua คือรูปแบบปัจจุบันที่ Cfx.re แนะนำให้ใช้สำหรับ FiveM Resource
ถ้าคุณดาวน์โหลด Script FiveM รุ่นเก่ามาแล้วพบ
__resource.lua
แทน
fxmanifest.lua
ไม่ได้หมายความว่า Script นั้นเสียทันที แต่เป็นสัญญาณว่า Resource ถูกสร้างตามระบบ Manifest รุ่นเก่า
ตัวอย่างเก่า
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
client_script 'client.lua'
server_script 'server.lua'
รูปแบบใหม่ควรเปลี่ยนเป็น
fx_version 'cerulean'
game 'gta5'
client_script 'client.lua'
server_script 'server.lua'
ดังนั้นหัวใจของการ Migration คือ
__resource.lua
↓
fxmanifest.lua
และ
resource_manifest_version GUID
↓
fx_version 'cerulean'
พร้อมตรวจว่า Resource ต้องเพิ่มหรือแก้ Directive อื่นตามระบบ FiveM ปัจจุบันหรือไม่
① __resource.lua คืออะไร
__resource.lua คือชื่อ Resource Manifest ที่ FiveM ใช้ในระบบรุ่นเก่า
Resource เก่าอาจมีโครงสร้าง
old_resource/
├── __resource.lua
├── client.lua
└── server.lua
ภายในอาจเขียน
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
client_script 'client.lua'
server_script 'server.lua'
Resource ลักษณะนี้ยังพบจำนวนมากใน Script FiveM รุ่นเก่าบน GitHub, Forums หรือ Script Packs
② fxmanifest.lua คืออะไร
fxmanifest.lua คือ Resource Manifest รูปแบบปัจจุบัน
ตัวอย่าง
new_resource/
├── fxmanifest.lua
├── client.lua
└── server.lua
Manifest
fx_version 'cerulean'
game 'gta5'
client_script 'client.lua'
server_script 'server.lua'
Cfx.re ระบุชัดเจนว่า Resource ปัจจุบันควรใช้ fxmanifest.lua
③ ทั้งสองทำหน้าที่เหมือนกันไหม
ในระดับ Concept ใช่
ทั้งสองมีหน้าที่บอก FiveM ว่า Resource มีอะไร เช่น
Client Scripts
Server Scripts
Files
Dependencies
Exports
Metadata
แต่ต่างกันที่ระบบ Manifest Version และ Feature Set
__resource.lua
→ Manifest รุ่นเก่า
fxmanifest.lua
→ FXv2 Manifest รุ่นปัจจุบัน
④ Cfx.re ยังรองรับ __resource.lua ไหม
เอกสาร Cfx.re ปัจจุบันยังกล่าวถึง Resource เก่าที่ใช้ __resource.lua
แต่ระบุว่าเป็นรูปแบบเดิมและ Server สามารถแสดง Warning ว่าไฟล์นี้ Deprecated
ดังนั้น Resource ใหม่ไม่ควรเริ่มจาก __resource.lua
ให้ใช้
fxmanifest.lua
ตั้งแต่ต้น
⑤ ถ้า __resource.lua ยังทำงานอยู่ จำเป็นต้องเปลี่ยนไหม
ถ้าเป็น Resource เก่าที่ Production ใช้อยู่และไม่มีปัญหา ไม่ควรแก้แบบไม่ทดสอบ
แต่ระยะยาวควร Migration เพราะ
fxmanifest.lua
คือระบบปัจจุบันและรองรับ Features/Requirements รุ่นใหม่ได้ชัดเจนกว่า
แนวทางที่เหมาะคือ
Backup
↓
Migration
↓
Test
↓
ตรวจ Console/F8
↓
Production
ไม่ควรแก้ Production สด ๆ โดยไม่มี Test
⑥ ความแตกต่างหลักที่สุดคืออะไร
Manifest เก่าใช้
resource_manifest_version
พร้อม GUID
Manifest ใหม่ใช้
fx_version
พร้อมชื่อ Version
เช่น
fx_version 'cerulean'
อ่านง่ายกว่ามาก
⑦ resource_manifest_version คืออะไร
Resource รุ่นเก่าอาจใช้
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
GUID นี้ใช้กำหนด Manifest Feature Level ของระบบเก่า
แต่ Cfx.re ระบุ resource_manifest_version เป็น Deprecated
และแนะนำให้ใช้
fxmanifest.lua
กับ
fx_version
แทน
⑧ GUID แบบเก่าจำเป็นต้องจำไหม
ไม่
สำหรับ Resource ใหม่ไม่ควรเสียเวลา Memorize GUID เช่น
77731fab-63ca-442c-a67b-abc70f28dfa5
f15e72ec-3972-4fe4-9c7d-afc5394ae207
44febabe-d386-4d18-afbe-5e627f4af937
ให้ใช้
fx_version 'cerulean'
ซึ่งอ่านและ Maintain ง่ายกว่า
⑨ fx_version คืออะไร
fx_version เป็นระบบ Versioning ของ FXv2 Resource Manifest
ตัวอย่าง
fx_version 'cerulean'
Cfx.re ระบุว่า cerulean เป็น Current FXv2 Resource Version ใน Documentation ปัจจุบัน
จึงเหมาะสำหรับ Resource ใหม่ทั่วไป
⑩ Migration ขั้นต่ำทำอย่างไร
สมมติ Resource เก่า
my_resource/
├── __resource.lua
├── client.lua
└── server.lua
ขั้นแรกเปลี่ยนชื่อ
__resource.lua
เป็น
fxmanifest.lua
จากนั้นแก้ Contents
⑪ ตัวอย่างก่อน Migration
__resource.lua
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
client_script 'client.lua'
server_script 'server.lua'
⑫ ตัวอย่างหลัง Migration
fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
client_script 'client.lua'
server_script 'server.lua'
นี่คือ Conversion พื้นฐานที่สุด
⑬ ทำไมต้องเพิ่ม game 'gta5'
FXv2 Manifest รุ่นปัจจุบันต้องระบุ Game API Set
สำหรับ FiveM ใช้
game 'gta5'
ดังนั้น Resource ใหม่ทั่วไปควรเริ่ม
fx_version 'cerulean'
game 'gta5'
อย่าลืม game ตอนแปลง Resource เก่า
⑭ ถ้าเป็น RedM ใช้อะไร
RedM ใช้
game 'rdr3'
แต่โปรเจกต์ FiveM ใช้
game 'gta5'
อย่า Copy Manifest จาก RedM มาแล้วลืมเปลี่ยน Game API Set
⑮ client_script ต้องเปลี่ยนไหม
โดยทั่วไป Directive
client_script 'client.lua'
ยังใช้ได้ใน fxmanifest.lua
ดังนั้น Migration ไม่ได้หมายความว่าต้องเปลี่ยนทุกบรรทัด
ตัวอย่างเก่า
client_script 'client.lua'
ใหม่ก็ยังสามารถเป็น
client_script 'client.lua'
ได้
⑯ server_script ต้องเปลี่ยนไหม
โดยทั่วไปไม่
server_script 'server.lua'
ยังเป็น Directive ปัจจุบัน
เช่นเดียวกับ
server_scripts {
'server/main.lua',
'server/database.lua'
}
⑰ client_scripts แบบหลายไฟล์ใช้ต่อได้ไหม
ได้
client_scripts {
'client/main.lua',
'client/menu.lua',
'client/vehicle.lua'
}
fxmanifest.lua รองรับรูปแบบนี้ตามปกติ
⑱ shared_script ใช้ได้ไหม
ได้
shared_script 'config.lua'
หรือ
shared_scripts {
'shared/config.lua',
'shared/constants.lua'
}
เหมาะกับ Configuration และ Code ที่โหลดทั้ง Client/Server
⑲ files ยังใช้เหมือนเดิมไหม
Directive
files {
'html/index.html',
'html/style.css',
'html/app.js'
}
ยังใช้ใน fxmanifest.lua
โดยเฉพาะ NUI และ Client Assets
สิ่งสำคัญคือเช็กว่า Paths ยังตรงกับ Files จริง
⑳ ui_page ยังใช้ได้ไหม
ได้
เช่น
ui_page 'html/index.html'
files {
'html/index.html',
'html/style.css',
'html/app.js'
}
แต่การ Migration มา cerulean มีรายละเอียดสำคัญเกี่ยวกับ NUI Callback ที่ต้องตรวจเพิ่มเติม
㉑ จุดสำคัญที่สุดของ NUI ตอน Migration คืออะไร
cerulean โหลด NUI Resource ใน Secure Context
ดังนั้น Resource เก่าที่ใช้ Callback แบบ
fetch(
'http://my_resource/close'
)
ควรตรวจและปรับเป็น
fetch(
'https://my_resource/close'
)
นี่เป็นหนึ่งในจุดที่อาจทำให้ Migration ดูเหมือน Manifest ใช้ได้ แต่ UI Callback กลับเสีย
㉒ วิธีเขียน NUI Callback ที่ดีกว่า
อย่า Hardcode Resource Name
ใช้
const resourceName =
GetParentResourceName()
แล้ว
fetch(
`https://${resourceName}/close`,
{
method: 'POST',
body: JSON.stringify({})
}
)
ทำให้ Resource เปลี่ยนชื่อ Folder ได้ง่ายขึ้น
㉓ ทำไมแค่ Rename File อาจไม่พอ
Cfx.re ระบุว่า Resource เก่าสามารถเปลี่ยนชื่อ Manifest และปรับโครงสร้างภายในเพื่อ Compatibility ได้
คำว่า ปรับโครงสร้างภายใน สำคัญ
เพราะ Resource เก่าอาจมี
Manifest GUID เก่า
NUI HTTP callbacks
Deprecated directives
Old Lua assumptions
Old dependencies
Old APIs
ดังนั้น Migration ที่ดีต้อง Audit ทั้ง Resource ไม่ใช่แค่ Rename File
㉔ lua54 'yes' ต้องเพิ่มไหม
ไม่
ถ้า Resource เก่าถูก Migration ปัจจุบันไม่ต้องเพิ่ม
lua54 'yes'
Cfx.re ระบุ Directive นี้เป็น Deprecated แล้ว
ตั้งแต่เดือนมิถุนายน 2025 Lua 5.3 ถูก Deprecated และ Lua Scripts ใช้ Lua 5.4
㉕ ถ้า Resource เก่ามี lua54 'yes' อยู่แล้วล่ะ
สามารถนำออกได้ตาม Documentation ปัจจุบัน
จาก
fx_version 'cerulean'
game 'gta5'
lua54 'yes'
เป็น
fx_version 'cerulean'
game 'gta5'
แต่การนำ Directive ออกไม่ได้หมายความว่า Lua Code เก่าจะ Compatible กับ Lua 5.4 ทุกส่วนโดยอัตโนมัติ
ต้อง Test Code ด้วย
㉖ Resource เก่ามากอาจมีปัญหา Lua หรือไม่
ได้
Resource เก่าหลายปีอาจใช้
Deprecated Lua Behavior
Old Framework API
Old Database Library
Old FiveM Natives
ดังนั้นถ้าเปลี่ยน Manifest แล้ว Error อย่ารีบสรุปว่า fxmanifest.lua เป็นสาเหตุ
อาจเป็น Application Code รุ่นเก่า
㉗ export ใน Manifest ยังใช้ได้ไหม
ได้
เช่น
export 'GetVehicle'
หรือ
server_export 'GetPlayer'
แต่ Cfx.re แนะนำสำหรับ Code ใหม่ให้พิจารณา Runtime Exports
exports(
'GetVehicle',
function(id)
-- ...
end
)
แทน Explicit Manifest Export ในหลายกรณี
㉘ ต้อง Migration export พร้อมกันไหม
ไม่จำเป็นต้องทำทั้งหมดในครั้งเดียว
ถ้า Resource เก่าใช้ Manifest Export และยังทำงาน สามารถ Migration Manifest ก่อนแล้ว Test
จากนั้นค่อย Refactor Export Architecture แยกอีกขั้น
ลดจำนวน Changes ในแต่ละรอบ
㉙ dependency ใช้ใน fxmanifest ได้ไหม
ได้
dependency 'ox_lib'
หรือ
dependencies {
'ox_lib',
'oxmysql'
}
การ Migration เป็นโอกาสดีในการเพิ่ม Dependencies ที่ Resource ต้องใช้จริงให้ชัดเจน
㉚ Resource เก่าไม่มี dependency ต้องเพิ่มไหม
ถ้ามันพึ่ง Resource อื่นจริง แนะนำให้ประกาศ
สมมติ Resource ใช้
exports.oxmysql:query(...)
ควรมี
dependency 'oxmysql'
หรือรายการ Dependencies ที่เกี่ยวข้อง
ไม่ควรแก้ Start Order ด้วย Wait(5000) อย่างเดียว
㉛ fxmanifest รองรับ OneSync Requirement ไหม
ได้
dependency '/onesync'
ถ้า Resource จำเป็นต้องใช้ State Awareness
เช่น Resource ใช้
Routing Buckets
Server-side Entity APIs
State Bags
อย่างจริงจัง
ก็สามารถประกาศ Requirement ให้ชัด
㉜ /onesync เปิด OneSync ให้ไหม
ไม่
dependency '/onesync'
เป็น Requirement เท่านั้น
Server ยังต้องเปิด OneSync ตาม FXServer Configuration
Manifest ไม่ได้เปิด OneSync ให้เอง
㉝ กำหนด Minimum Server Build ได้ไหม
ได้ เช่น
dependency '/server:4500'
หรือ
dependencies {
'/onesync',
'/server:4500'
}
เหมาะเมื่อ Resource ใช้ Feature ที่ต้องการ Server Artifact ขั้นต่ำ
㉞ __resource.lua รองรับ Feature ใหม่เท่ากันไหม
นี่เป็นอีกเหตุผลที่ควร Migration
ระบบ FXv2 fxmanifest.lua มี Resource Metadata และ Runtime Constraints ที่ชัดเจนกว่า และเป็นระบบที่ Documentation ปัจจุบันอ้างอิง
ดังนั้น Resource ใหม่ไม่ควรเลือก Manifest รุ่นเก่าเพียงเพราะ Script ตัวอย่างเก่าใช้
㉟ fxmanifest.lua เป็น Lua File จริงไหม
ใช่
แต่ Cfx.re ระบุว่า Manifest ถูก Run ใน Runtime แยกจาก Lua Scripts ภายใน Resource
ดังนั้น
local Config = {
price = 500
}
ใน fxmanifest.lua
ไม่ได้ทำให้ client.lua มี Config ตัวนั้น
Manifest ไม่ควรถูกใช้แทน config.lua
㊱ Application Config ควรไปไหน
ถ้าทั้ง Client และ Server ใช้
shared/config.lua
แล้ว Manifest
shared_script 'shared/config.lua'
ถ้า Server ใช้ฝ่ายเดียว ให้เป็น Server Script
อย่าเอา Application Configuration ไปยัดใน Manifest เพียงเพราะ Manifest เขียน Lua ได้
㊲ Secrets ควรอยู่ใน Manifest ไหม
ไม่ควร
โดยเฉพาะ Manifest Metadata หรือ Shared Files
ไม่ควร Hardcode
Database password
API secret
Private token
Admin credential
ไว้ใน File ที่อาจถูกแจกหรือ Client ดาวน์โหลด
ใช้ Server-side Configuration ที่เหมาะสม
㊳ Map Resource ต้อง Migration ไหม
ได้
ตัวอย่างเก่าอาจเป็น
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
this_is_a_map 'yes'
Migration
fx_version 'cerulean'
game 'gta5'
this_is_a_map 'yes'
จากนั้นตรวจ Streaming/Data Files เพิ่มตาม Resource จริง
㊴ Vehicle Resource ต้อง Migration อย่างไร
ตัวอย่างเก่า
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
files {
'vehicles.meta',
'handling.meta'
}
data_file 'VEHICLE_METADATA_FILE'
'vehicles.meta'
data_file 'HANDLING_FILE'
'handling.meta'
ใหม่
fx_version 'cerulean'
game 'gta5'
files {
'vehicles.meta',
'handling.meta'
}
data_file 'VEHICLE_METADATA_FILE'
'vehicles.meta'
data_file 'HANDLING_FILE'
'handling.meta'
ส่วน files และ data_file หลายส่วนยังคงแนวคิดเดิม
㊵ NUI Resource ต้อง Migration อย่างไร
เก่า
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
ui_page 'html/index.html'
files {
'html/index.html',
'html/app.js'
}
client_script 'client.lua'
ใหม่
fx_version 'cerulean'
game 'gta5'
ui_page 'html/index.html'
files {
'html/index.html',
'html/app.js'
}
client_script 'client.lua'
จากนั้นต้องตรวจ JavaScript Callbacks เพิ่มอีกขั้น
㊶ NUI JavaScript เก่าต้องหาอะไร
Search ทั้ง Resource ด้วยคำว่า
http://
โดยเฉพาะ
$.post(
'http://resource/action'
)
หรือ
fetch(
'http://resource/action'
)
แล้วตรวจว่าจะต้องเปลี่ยนเป็น Secure NUI Callback Pattern หรือไม่
㊷ jQuery $.post เก่าเปลี่ยนอย่างไร
ตัวอย่างเก่า
$.post(
'http://my_resource/close',
JSON.stringify({})
)
สามารถเปลี่ยนเป็น
$.post(
`https://${GetParentResourceName()}/close`,
JSON.stringify({})
)
หรือปรับไปใช้ fetch
fetch(
`https://${GetParentResourceName()}/close`,
{
method: 'POST',
headers: {
'Content-Type':
'application/json'
},
body:
JSON.stringify({})
}
)
㊸ RegisterNUICallback ฝั่ง Lua ต้องเปลี่ยนไหม
ตัวอย่าง
RegisterNUICallback(
'close',
function(data, cb)
SetNuiFocus(
false,
false
)
cb({
ok = true
})
end
)
ระบบ Callback ฝั่ง Lua ยังคงใช้แนวคิดนี้
ส่วนที่มักต้องเปลี่ยนจาก Resource เก่าคือ Browser Request URL
㊹ อย่าลืมเรียก cb ใน NUI Callback
ถึงแม้หัวข้อนี้เป็นเรื่อง Manifest แต่ตอน Migration NUI ควรตรวจด้วยว่า Handler ตอบกลับ
cb({
ok = true
})
เพื่อป้องกัน Browser Request ค้างตาม NUI Callback Architecture
㊺ JavaScript Resource ต้องเปลี่ยน Manifest ไหม
หลักเดียวกัน
เก่า
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
client_script 'client.js'
server_script 'server.js'
ใหม่
fx_version 'cerulean'
game 'gta5'
client_script 'client.js'
server_script 'server.js'
จากนั้นตรวจ Runtime Compatibility ของ JavaScript Code แยกต่างหาก
㊻ C# Resource ต้องเปลี่ยนไหม
ใช่ Resource Manifest ก็ Migration ได้เช่นเดียวกัน
แม้ Code เป็น C#
fxmanifest.lua
ก็ยังเป็น Manifest ของ Resource
และ bodacious/cerulean มี Compatibility Behavior บางอย่างที่เกี่ยวกับ CLR ตาม Version Inheritance
จึงควร Test C# Resource หลัง Migration
㊼ เปลี่ยน Manifest แล้ว Script Logic จะเปลี่ยนไหม
ตัว Manifest ไม่ได้ Rewrite Application Code ให้อัตโนมัติ
แต่ Version Behavior บางอย่างอาจเปลี่ยน Environment เช่น NUI Secure Context
ดังนั้น Resource ที่ไม่มี NUI และใช้ APIs ปัจจุบันอาจ Migration ง่ายมาก
ขณะที่ Resource เก่าที่มี UI หรือ Libraries เก่าอาจต้องแก้เพิ่ม
㊽ ต้องเปลี่ยนชื่อ Resource Folder ไหม
ไม่จำเป็น
ถ้าเดิมคือ
old_garage/
สามารถเปลี่ยนเพียง
__resource.lua
→ fxmanifest.lua
โดยไม่ต้อง Rename Folder
และควรหลีกเลี่ยง Rename Folder ถ้ามี Resource อื่นอ้าง Exports/Dependencies ด้วยชื่อเดิม
㊾ ต้องลบ __resource.lua หลังสร้าง fxmanifest.lua ไหม
ควรเหลือ Manifest ที่ต้องการใช้ให้ชัดเจนเพียงระบบเดียว
อย่าปล่อยไฟล์ Manifest เก่าและใหม่ไว้ด้วยความคิดว่า “เผื่อไว้”
หลัง Migration และ Test ผ่าน ให้เก็บ Backup แยกออกจาก Resource Production
ตัว Resource ควรสะอาดและไม่สร้างความสับสน
㊿ Backup แบบไหนดี
ก่อน Migration
my_resource/
เก็บ Copy เช่น
my_resource_backup/
นอก Active Resource Path หรือใช้ Git
วิธีที่ดีกว่าคือ Version Control
Commit ก่อน Migration
↓
แก้ Manifest
↓
Test
↓
Commit Migration
หากพังสามารถ Rollback ได้ง่าย
51 Resource ไม่ Start หลัง Migration ทำอย่างไร
ตรวจ Server Console ก่อน
ปัญหาพบบ่อย:
fxmanifest.lua Syntax Error
ลืม game 'gta5'
File Path ผิด
Dependency หาย
Directive รุ่นเก่า
File ไม่มีจริง
Case-sensitive Path ผิด
Server Build ไม่รองรับ
อย่า Restart ซ้ำสิบครั้งโดยไม่อ่าน Error
52 Resource Start แต่ NUI ใช้ไม่ได้
ตรวจ
ui_page
files
HTML path
JS path
F8 errors
http:// callback
https:// callback
GetParentResourceName()
RegisterNUICallback
cb()
ถ้า Manifest ถูก Migration เป็น cerulean แต่ JS ยังใช้ Callback Pattern เก่า นี่เป็นจุดแรก ๆ ที่ควรตรวจ
53 Resource Start แต่ Database Error
อาจไม่เกี่ยวกับ Manifest Version โดยตรง
ตรวจ
Database Resource
Dependency
Connection String
oxmysql/mysql-async
SQL
Framework Version
การ Migration Manifest ไม่ได้ Migration Database Library ให้อัตโนมัติ
54 mysql-async เก่าต้องเปลี่ยนเป็น oxmysql เพราะ fxmanifest ไหม
ไม่จำเป็นเพราะ Manifest อย่างเดียว
นี่เป็นคนละ Migration
คุณสามารถ
Manifest Migration
กับ
Database Library Migration
แยกเป็นคนละงาน
ควรลดจำนวนตัวแปรเมื่อ Debug
55 ESX/QBCore Resource เก่าต้องทำอะไรเพิ่ม
นอกจาก Manifest ต้องตรวจ
Framework API Version
Exports
Events
Database
Player Data
Deprecated Functions
Resource เก่าหลายปีอาจมีปัญหาที่ไม่เกี่ยวกับ __resource.lua เลย
Manifest เป็นเพียงชั้นแรกของ Compatibility
56 ตารางเปรียบเทียบ __resource.lua กับ fxmanifest.lua
| เรื่อง | __resource.lua | fxmanifest.lua |
|---|---|---|
| สถานะ | รูปแบบเก่า | รูปแบบปัจจุบัน |
| Version | GUID ผ่าน resource_manifest_version | ชื่อผ่าน fx_version |
| Resource ใหม่ | ไม่แนะนำ | แนะนำ |
| FiveM Game Declaration | ระบบเก่าแตกต่างตาม Version | ใช้ game 'gta5' |
| Current docs | กล่าวถึงเพื่อ Compatibility | เป็นรูปแบบหลัก |
| Runtime Constraints | จำกัดกว่า/ระบบเก่า | รองรับ /onesync, /server, /gameBuild, /native |
| NUI cerulean | ไม่มี Feature Set cerulean | Secure-context NUI |
| Maintenance | Legacy | เหมาะกับ Resource ปัจจุบัน |
57 ตัวอย่าง Migration Resource ทั่วไปฉบับเต็ม
ก่อน
__resource.lua
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
client_scripts {
'config.lua',
'client/main.lua',
'client/menu.lua'
}
server_scripts {
'config.lua',
'server/main.lua'
}
ปัญหาหนึ่งคือ config.lua ถูกประกาศซ้ำทั้ง Client และ Server
สามารถใช้โอกาส Migration จัดให้สะอาดขึ้น
หลัง
fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
author 'Your Name'
description 'Updated FiveM resource'
version '2.0.0'
shared_script 'config.lua'
client_scripts {
'client/main.lua',
'client/menu.lua'
}
server_script 'server/main.lua'
อ่านง่ายขึ้นและบอกเจตนาชัดขึ้น
58 ตัวอย่าง Migration NUI Resource
ก่อน
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
ui_page 'html/index.html'
files {
'html/index.html',
'html/style.css',
'html/app.js'
}
client_script 'client.lua'
JavaScript:
$.post(
'http://old_menu/close',
JSON.stringify({})
)
หลัง
fx_version 'cerulean'
game 'gta5'
ui_page 'html/index.html'
files {
'html/index.html',
'html/style.css',
'html/app.js'
}
client_script 'client.lua'
JavaScript:
fetch(
`https://${GetParentResourceName()}/close`,
{
method: 'POST',
headers: {
'Content-Type':
'application/json'
},
body:
JSON.stringify({})
}
)
นี่คือตัวอย่างที่แสดงว่าการ Migration อาจไม่ได้จบแค่ Manifest
59 Checklist Migration __resource.lua ไป fxmanifest.lua
ตรวจทีละข้อ
① Backup Resource แล้วหรือยัง?
② ใช้ Git/Version Control หรือไม่?
③ เปลี่ยน __resource.lua เป็น fxmanifest.lua แล้วหรือยัง?
④ ลบ resource_manifest_version GUID หรือยัง?
⑤ เพิ่ม fx_version 'cerulean' หรือยัง?
⑥ เพิ่ม game 'gta5' หรือยัง?
⑦ Client Script Paths ถูกไหม?
⑧ Server Script Paths ถูกไหม?
⑨ Shared Files ควรใช้ shared_script หรือไม่?
⑩ Files ที่ประกาศมีอยู่จริงหรือไม่?
⑪ Path ตัวพิมพ์ใหญ่เล็กตรงไหม?
⑫ ui_page ถูกหรือไม่?
⑬ NUI Assets อยู่ใน files ครบไหม?
⑭ NUI ยังใช้ http:// หรือไม่?
⑮ NUI เปลี่ยนเป็น https:// แล้วหรือไม่?
⑯ ใช้ GetParentResourceName ได้หรือไม่?
⑰ lua54 'yes' ยังอยู่หรือไม่?
⑱ Deprecated directives อื่นมีหรือไม่?
⑲ Dependencies ถูกประกาศหรือไม่?
⑳ Resource ต้องใช้ /onesync หรือไม่?
㉑ ต้อง Require Server Build หรือไม่?
㉒ Export เก่ายังทำงานหรือไม่?
㉓ Framework API ยัง Compatible หรือไม่?
㉔ Database Library ยัง Compatible หรือไม่?
㉕ Server Console มี Error หรือ Warning หรือไม่?
㉖ Client F8 มี Error หรือไม่?
㉗ NUI เปิด/ปิดได้หรือไม่?
㉘ Resource Restart ได้หรือไม่?
㉙ Resource Stop แล้ว Cleanup ถูกหรือไม่?
㉚ ทดสอบก่อนขึ้น Production แล้วหรือยัง?
⑥⓪ วิธี Migration ที่ปลอดภัยที่สุด
ถ้ามี Resource เก่าจริง ให้ทำตามลำดับนี้
ขั้นที่ 1 — Backup
เก็บ Resource เวอร์ชันเดิมก่อน
old_resource
↓
backup / git commit
ขั้นที่ 2 — Rename Manifest
__resource.lua
↓
fxmanifest.lua
ขั้นที่ 3 — เปลี่ยน Version Header
ลบ
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
แล้วใช้
fx_version 'cerulean'
game 'gta5'
ขั้นที่ 4 — เก็บ Directives ที่ยังถูกต้อง
เช่น
client_scripts {
'client/main.lua'
}
server_scripts {
'server/main.lua'
}
ไม่ต้อง Rewrite ทุกอย่างโดยไม่มีเหตุผล
ขั้นที่ 5 — จัด Shared Files
ถ้า Config ถูกโหลดทั้งสองฝั่ง
จาก
client_script 'config.lua'
server_script 'config.lua'
พิจารณาเปลี่ยนเป็น
shared_script 'config.lua'
ถ้า File นั้นเหมาะกับ Shared Context จริง
ขั้นที่ 6 — ตรวจ NUI
Search
http://
และปรับ CFX NUI Callback ที่เกี่ยวข้องเป็น Secure Pattern
https://
ขั้นที่ 7 — ลบ Deprecated Configuration
เช่นปัจจุบันไม่ต้องใช้
lua54 'yes'
ขั้นที่ 8 — เพิ่ม Dependencies ที่ Resource ต้องใช้จริง
เช่น
dependencies {
'ox_lib',
'oxmysql'
}
หรือ
dependency '/onesync'
เมื่อเป็น Requirement จริง
ขั้นที่ 9 — Refresh และ Start
ถ้า Server กำลังทำงาน
refresh
ensure resource_name
แล้วอ่าน Server Console
ขั้นที่ 10 — Test Function จริง
อย่าตรวจแค่ว่า Resource ขึ้นคำว่า Started
ทดสอบ
Commands
Events
NUI
Database
Vehicle/Ped/Object
Exports
Callbacks
Framework
Resource Restart
ทุก Function สำคัญ
คำถามที่พบบ่อยเกี่ยวกับ __resource.lua และ fxmanifest.lua
__resource.lua คืออะไร
คือชื่อ Resource Manifest รูปแบบเก่าของ FiveM
fxmanifest.lua คืออะไร
คือ Resource Manifest รูปแบบปัจจุบันของ FiveM
__resource.lua ยังใช้ได้ไหม
Resource เก่ายังอาจถูก Parse ได้ แต่ Cfx.re ระบุว่าเป็นรูปแบบ Deprecated และควรเปลี่ยนมาใช้ fxmanifest.lua
Resource ใหม่ควรใช้อะไร
ใช้
fxmanifest.lua
เปลี่ยนชื่อไฟล์อย่างเดียวพอไหม
ไม่เสมอ ต้องปรับ Contents และตรวจ Compatibility โดยเฉพาะ Manifest Version, game และ NUI
resource_manifest_version ยังควรใช้ไหม
ไม่ Cfx.re ระบุว่า Deprecated
ใช้อะไรแทน
fx_version 'cerulean'
ต้องเพิ่ม game ไหม
สำหรับ FiveM Resource ใช้
game 'gta5'
cerulean คืออะไร
คือ Current FXv2 Resource Version ตาม Documentation ปัจจุบัน
lua54 'yes' ต้องใส่ไหม
ไม่ ปัจจุบัน Deprecated แล้ว
client_script ต้องเปลี่ยนไหม
ไม่โดยทั่วไป Directive นี้ยังใช้ได้
server_script ต้องเปลี่ยนไหม
ไม่โดยทั่วไป
shared_script ใช้ได้ไหม
ได้
files ใช้ได้ไหม
ได้
ui_page ใช้ได้ไหม
ได้
NUI ต้องแก้อะไรเมื่อใช้ cerulean
ตรวจ Callback จาก http:// เป็น https://
Exports แบบ Manifest ยังใช้ได้ไหม
ได้ แต่ Runtime Exports เป็นอีกทางเลือกที่ Cfx.re แนะนำสำหรับ Code ใหม่
fxmanifest รองรับ OneSync Requirement ไหม
ได้
dependency '/onesync'
fxmanifest รองรับ Server Build Requirement ไหม
ได้ เช่น
dependency '/server:4500'
เปลี่ยน Manifest แล้ว ESX จะอัปเดตไหม
ไม่ Framework Compatibility เป็นอีกเรื่องหนึ่ง
เปลี่ยน Manifest แล้ว Database Library จะอัปเดตไหม
ไม่
Resource เก่าควรเปลี่ยนทุกอย่างพร้อมกันไหม
ไม่แนะนำ ควรเปลี่ยนทีละ Layer และทดสอบเพื่อลดความยากในการหาสาเหตุเมื่อเกิด Error
สรุป __resource.lua กับ fxmanifest.lua ต่างกันอย่างไร
คำตอบสั้นที่สุดคือ
__resource.lua
→ FiveM Resource Manifest รุ่นเก่า
ส่วน
fxmanifest.lua
→ Resource Manifest รุ่นปัจจุบัน
Manifest เก่ามักใช้
resource_manifest_version
'44febabe-d386-4d18-afbe-5e627f4af937'
Resource ปัจจุบันควรใช้
fx_version 'cerulean'
game 'gta5'
ดังนั้นการ Migration ขั้นพื้นฐานคือ
__resource.lua
↓
fxmanifest.lua
และ
GUID Manifest Version
↓
cerulean
แต่ Resource ที่มี NUI ต้องตรวจเพิ่ม เพราะ cerulean ใช้ Secure-context NUI และ Callback ต้องเป็น
https://
แทน Pattern
http://
ที่พบใน Script เก่า
อีกเรื่องคืออย่าเพิ่ม
lua54 'yes'
เข้า Manifest ใหม่ เพราะ Documentation ปัจจุบันระบุว่า Deprecated แล้วและ Lua Scripts ใช้ Lua 5.4 อยู่แล้ว
สำหรับคนที่พัฒนา FiveM กับ comsiam วิธีที่ปลอดภัยที่สุดคืออย่าเปิด Resource เก่าแล้วลบทุกอย่างเพื่อเขียน Manifest ใหม่จากศูนย์ทันที แต่ให้ Migration Header ก่อน รักษา Directives ที่ยังถูกต้อง แล้ว Test ทีละระบบ
หลักสำคัญจาก comsiam คือ การเปลี่ยน __resource.lua เป็น fxmanifest.lua ไม่ใช่แค่เปลี่ยนชื่อไฟล์ แต่เป็นโอกาสตรวจว่า Resource เก่ายังใช้ Manifest, NUI, Dependencies และ Runtime Assumptions ที่เข้ากับ FiveM ปัจจุบันหรือไม่
หัวข้อถัดไปคือ วิธีสร้าง Resource FiveM ตัวแรก ซึ่งจะเริ่มจาก Folder ว่างทั้งหมด สร้าง fxmanifest.lua, client.lua, server.lua, Command และ Client↔Server Event จนสามารถ ensure Resource และทดสอบใน Server ได้จริง
Comments
Post a Comment