__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.luafxmanifest.lua
สถานะรูปแบบเก่ารูปแบบปัจจุบัน
VersionGUID ผ่าน 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 ceruleanSecure-context NUI
MaintenanceLegacyเหมาะกับ 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

Popular posts from this blog

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

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

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