ESX Script ไม่ทำงาน แก้อย่างไร
ESX Script ไม่ทำงานอาจเกิดได้ตั้งแต่ Resource ไม่ Start, es_extended ไม่พร้อม, Dependency ขาด, Start Order ผิด, Script ใช้ API ของ ESX รุ่นเก่า, Database เชื่อมไม่ได้ ไปจนถึง Inventory หรือ Callback คนละ Version
อาการที่พบได้บ่อย เช่น
Script Start แต่ใช้งานไม่ได้
ESX = nil
No such export
attempt to index a nil value
Missing dependency
Callback ไม่ตอบ
Menu ไม่เปิด
Job ไม่ทำงาน
Item ไม่เข้า
เงินไม่เพิ่ม
Database Error
วิธีแก้ที่ถูกต้องไม่ใช่ลบ Cache หรือ Reinstall Server ทันที แต่ควรหาให้ได้ก่อนว่าปัญหาอยู่ Layer ไหน
ลำดับตรวจที่แนะนำคือ
es_extended
↓
Database
↓
Dependency
↓
Start Order
↓
ESX Integration
↓
Client / Server Error
↓
Inventory / Target
↓
Script Version
ถ้าไล่ตามลำดับนี้ ปัญหา ESX Script ส่วนใหญ่จะหา Root Cause ได้เร็วขึ้นมาก
① เช็กก่อนว่า es_extended ทำงานหรือไม่
ESX Script จำนวนมากพึ่ง
es_extended
ดังนั้นเริ่มจาก Server Console แล้วตรวจว่า Resource นี้ Start สำเร็จ
สามารถลอง
ensure es_extended
หากมี Error ให้แก้ es_extended ก่อน Script ลูก
เพราะ Architecture คือ
es_extended
↓
ESX Script A
ESX Script B
ESX Script C
ถ้า Core ไม่พร้อม Scripts ที่พึ่ง Core ก็อาจ Error พร้อมกันหลายตัว
② ดูข้อความ ESX initialized
Current ESX Core จะทำงานกับ Database ก่อน Initialisation เสร็จ
เมื่อ Database พร้อม Core จะ Refresh Items/Jobs และแสดงข้อความเกี่ยวกับ ESX Legacy Initialized
ดังนั้นถ้า Server Startup หยุดก่อน Framework Initialisation ให้ตรวจ Error ที่เกิดก่อนหน้า
โดยเฉพาะ
oxmysql
Database Connection
SQL
esx_lib
es_extended
อย่าเริ่ม Debug Job Script ก่อนพิสูจน์ว่า Core พร้อมแล้ว
③ ตรวจ oxmysql ก่อน
Current ESX Legacy ใช้ oxmysql เป็น Database Dependency
ใน fxmanifest.lua ของ es_extended ปัจจุบันมี
oxmysql
เป็น Dependency และโหลด
@oxmysql/lib/MySQL.lua
ฝั่ง Server
ดังนั้นถ้า oxmysql ไม่ทำงาน ESX อาจโหลด Player, Jobs หรือข้อมูล Database ไม่สำเร็จ
ตรวจ
ensure oxmysql
และดู Console ว่ามี Connection Error หรือไม่
④ ตรวจ mysql_connection_string
ใน server.cfg จะมีค่าประมาณ
set mysql_connection_string "mysql://user:password@localhost/es_extended?charset=utf8mb4"
ต้องตรวจ
Username
Password
Hostname
Database Name
Port
ให้ถูกต้อง
ถ้า Database Connection ผิด คุณอาจเห็น Script ลูก Error จำนวนมาก ทั้งที่ Root Cause มีเพียง Database จุดเดียว
⑤ Start Order ต้องถูก
Official ESX Recipe ปัจจุบันจัดลำดับประมาณ
ensure oxmysql
ensure esx_lib
ensure es_extended
ensure [core]
ensure [standalone]
ensure [esx_addons]
ดังนั้น Custom ESX Script ควร Start หลัง Core และ Dependencies ที่มันต้องใช้
ตัวอย่าง
ensure oxmysql
ensure esx_lib
ensure es_extended
ensure my_esx_job
ไม่ควรเป็น
ensure my_esx_job
ensure es_extended
หาก Script เรียก ESX ตั้งแต่ตอน Resource Start
⑥ Script ใช้ได้หลัง restart แต่ตอน Boot ใช้ไม่ได้
อาการนี้ชี้ไปที่ Start Order หรือ Initialization Timing ได้มาก
ตัวอย่าง
Boot Server
↓
my_job Start
↓
ESX ยังไม่พร้อม
↓
Error
แต่หลัง Server เปิดครบแล้วสั่ง
restart my_job
กลับใช้งานได้
กรณีนี้อย่าแก้ด้วย
Wait(10000)
แบบสุ่มเป็นวิธีหลัก
ควรแก้ Dependency และ Start Order ให้ถูกต้อง
⑦ ตรวจ fxmanifest.lua ของ Script
เปิด
my-script/fxmanifest.lua
แล้วตรวจว่า Script ระบุ Client/Server Files และ Dependencies ครบหรือไม่
ตัวอย่าง
fx_version 'cerulean'
game 'gta5'
shared_script '@es_extended/imports.lua'
client_script 'client.lua'
server_script 'server.lua'
dependency 'es_extended'
นี่เป็นเพียงตัวอย่างโครงสร้าง ไม่ใช่ Template ที่ต้อง Copy ให้ทุก Script
Resource แต่ละตัวอาจใช้ Integration ต่างกัน
⑧ ESX = nil เกิดจากอะไร
Error เช่น
attempt to index a nil value (global 'ESX')
มักหมายความว่า Script พยายามใช้
ESX.SomeFunction()
ก่อนที่ตัวแปร ESX จะถูก Initialised
สาเหตุอาจเป็น
ไม่ Import ESX
ใช้ Integration รุ่นเก่า
es_extendedไม่ StartStart Order ผิด
Script Version ไม่รองรับ Current ESX
fxmanifest.luaโหลดไฟล์ผิด
ต้องดูโครงสร้าง Script ก่อนแก้
⑨ วิธีดึง ESX Shared Object แบบปัจจุบัน
Current ESX Core มี
ESX = exports["es_extended"]:getSharedObject()
ใน imports.lua
และ Resource ปัจจุบันจำนวนมากสามารถใช้
local ESX = exports['es_extended']:getSharedObject()
ได้
หรือ Import
shared_script '@es_extended/imports.lua'
ตาม Architecture ของ Resource
แต่ไม่ควรเพิ่มทั้งสองแบบซ้ำโดยไม่จำเป็น
⑩ Script เก่าใช้ esx:getSharedObject ต้องระวัง
ESX Script รุ่นเก่ามากอาจมี
TriggerEvent('esx:getSharedObject', function(obj)
ESX = obj
end)
Current ESX Core มีประวัติการยกเลิก Shared Object Event แบบเก่า และสามารถแจ้ง Error กับ Resource ที่ยังใช้ Pattern นี้
ดังนั้นถ้า Console ระบุประมาณ
Used the getSharedObject Event
this event no longer exists
ให้ถือว่า Script เก่าและต้อง Migration Integration
ไม่ใช่ติดตั้ง Event กลับเข้า Framework เพื่อให้ Script เก่าทำงานแบบฝืน ๆ
⑪ วิธีแก้ Script เก่าที่ใช้ Shared Object Event
เริ่มจากตรวจว่า Developer มี Version ใหม่หรือไม่
ถ้าไม่มีและ Source เปิดแก้ได้ อาจต้อง Migration จากแนวคิด
TriggerEvent('esx:getSharedObject', ...)
เป็น Integration ปัจจุบัน เช่น
local ESX = exports['es_extended']:getSharedObject()
หรือใช้
shared_script '@es_extended/imports.lua'
ถ้าเหมาะกับโครงสร้าง Resource
แต่ต้องตรวจ Script ทั้งตัว เพราะ Resource เก่าอาจมีปัญหาอื่นอีก เช่น
mysql-async
Old Inventory
Old Callbacks
Old Weapon System
⑫ อย่าแก้ ESX nil ด้วยการ Copy Code มั่ว
บนอินเทอร์เน็ตมีวิธีแก้จำนวนมาก เช่น
while ESX == nil do
TriggerEvent(...)
Wait(0)
end
Code เหล่านี้อาจมาจาก ESX คนละยุค
ก่อน Copy ให้ดู
ESX Version
วันที่ Tutorial
Resource Version
Current fxmanifest.lua
เพราะการแก้ nil ด้วย API ที่ Deprecated อาจสร้างปัญหาเพิ่ม
⑬ No such export in resource es_extended คืออะไร
ตัวอย่าง
No such export getSomething in resource es_extended
หมายความว่า Script พยายามเรียก Export ที่ Current es_extended ไม่มี
สาเหตุหลัก เช่น
Export Name ผิด
Script เก่า
ESX Version ไม่ตรง
Resource Name ถูกเปลี่ยน
Core ไม่พร้อม
ให้ Search Export Name ใน Current Core/Documentation ก่อนแก้
อย่าสร้าง Export ปลอมเพียงเพื่อให้ Error หาย
⑭ เปลี่ยนชื่อ es_extended ได้ไหม
ไม่ควร
Script จำนวนมากอ้าง Resource โดยตรงว่า
es_extended
ตัวอย่าง
exports['es_extended']:getSharedObject()
หรือ
shared_script '@es_extended/imports.lua'
ถ้า Rename Folder เป็น
my_esx
Integration เหล่านี้จะพัง
ดังนั้น Core Resource ควรใช้ชื่อ Original
⑮ Script Started แต่ Menu ไม่เปิด
ถ้า Console แสดง
Started resource my_script
แต่ Menu ไม่เปิด อย่าเพิ่งสรุปว่า Server Script พัง
ตรวจ F8 ฝั่ง Client
อาจเกิด
Client SCRIPT ERROR
NUI Error
Missing Export
Missing Config
Target Error
Resource Started เพียงบอกว่า Resource ถูก Start ไม่ได้หมายความว่าทุก Client Function ทำงานแล้ว
⑯ ดู F8 เมื่อ Client Feature ไม่ทำงาน
อาการที่ควรดู F8 เช่น
Menu ไม่เปิด
Marker ไม่ขึ้น
NPC ไม่ Spawn
Target ไม่ขึ้น
Notification ไม่แสดง
UI จอดำ
กด
F8
แล้ว Trigger Feature อีกครั้ง
หาบรรทัด Error แรก เช่น
@my_script/client/main.lua:55
ตรงนี้จะบอกได้ว่าปัญหาอยู่ Resource และบรรทัดไหน
⑰ ดู Server Console เมื่อ Money/Item/Database ไม่ทำงาน
ปัญหาเหล่านี้มักเกี่ยวกับ Server-side
เงินไม่เข้า
Item ไม่เข้า
Job ไม่เปลี่ยน
Database ไม่ Save
Callback ไม่ตอบ
Permission ไม่ผ่าน
ให้ดู Server Console
Error อาจเป็น
SQL Error
xPlayer nil
No such export
attempt to index nil
Unknown column
Table doesn't exist
แก้ Error แรกก่อน Error ที่ตามมา
⑱ xPlayer nil คืออะไร
ESX Server Scripts มักใช้ Player Object หรือ xPlayer
ถ้า Scriptหา Player ไม่ได้อาจเจอ
xPlayer is nil
สาเหตุได้แก่
Player ยัง Load ไม่เสร็จ
source ไม่ถูก
Player Disconnect แล้ว
Scriptเรียก API ผิด Version
Callback/Event ถูกเรียกใน Timing ไม่เหมาะสม
อย่าแก้ด้วยการสร้าง Fake Player Object
ต้องหาว่าทำไม Frameworkหา Player จริงไม่เจอ
⑲ Current ESX มี ESX.Player
Current imports.lua ฝั่ง Server มี API แนวคิด
ESX.Player(source)
ซึ่งคืน Static Player Interface เมื่อ Player Loaded
และ Current Official ESX Resources ก็มีการใช้ เช่น
local xPlayer = ESX.Player(source)
ดังนั้นเวลาอ่าน Script รุ่นใหม่อาจเห็น Pattern นี้แทน API แบบเก่าในหลายจุด
ต้องใช้ API ให้ตรง Current ESX Version
⑳ ตรวจ Player Loaded ก่อนใช้ Player Data
ฝั่ง Client ESX จะมี State เกี่ยวกับ Player Loaded และ ESX.PlayerData
ถ้า Script ทำงานทันทีตอน Resource Start และเรียก
ESX.PlayerData.job.name
ก่อน Player Data พร้อม ก็อาจเจอ nil
Architecture ที่ดีควรทำงานหลัง Player Data พร้อม หรือรองรับกรณีข้อมูลยังไม่โหลด
ตัวอย่าง Flow
Resource Start
↓
รอ ESX Player Loaded
↓
อ่าน PlayerData
↓
เปิด Feature
㉑ Script ใช้ Job ไม่ได้
ตรวจ
Player โหลดหรือยัง
Job มีใน Database หรือไม่
job_grades มีหรือไม่
Job Name ตรงไหม
PlayerData อัปเดตหรือไม่
ตัวอย่าง Config
Config.Job = 'police'
แต่ Database ใช้
policejob
Script ก็จะไม่ผ่าน Condition
Job Name ต้องตรงกันแบบที่ Script คาดหวัง
㉒ Job Grade ผิดทำให้ Feature ไม่เปิด
บาง Script ตรวจทั้ง
Job
+
Grade
ตัวอย่าง
police
Grade >= 3
ถ้า Player เป็น police จริงแต่ Grade เพียง 1 Boss Menu ก็อาจไม่เปิด
จึงต้องตรวจ Config และ Player Job Data ก่อนสรุปว่า Script เสีย
㉓ เปลี่ยน Job แล้ว Script ไม่อัปเดต
Script ที่เขียนดีควรรับ Player Data/Job Update จาก Framework
แต่ Script เก่าอาจ Cache Job ตอน Resource Start แล้วไม่ Update
อาการคือ
เข้า Server ตอนเป็น unemployed
↓
เปลี่ยนเป็น police
↓
Script ยังคิดว่า unemployed
ลอง Reconnect แล้วใช้ได้ แปลว่า Script อาจไม่ Handle Job Update
กรณีนี้ต้องแก้ Event/Player Data Update ของ Script
㉔ Callback ไม่ทำงาน
ESX มี Server Callback System และ Current Official ESX Resources ยังใช้
ESX.RegisterServerCallback
ใน Server Code
ถ้า Client Callback ไม่ตอบ ให้ตรวจ
Callback Name
Server Callback Register แล้วหรือไม่
Resource Started หรือไม่
Server Error ก่อน cb()
Player Object มีหรือไม่
Database Query สำเร็จหรือไม่
Callback ชื่อผิดเพียงตัวเดียวก็ทำให้ Flow ไม่ทำงาน
㉕ Callback ทำงานแต่ได้ nil
ตัวอย่าง
Client ขอ Player Skin
↓
Server Callback
↓
Database
↓
return nil
ต้องตรวจว่า nil เป็น Response ที่ถูกต้องหรือเกิดจาก Error
ดู
SQL Result
Player Identifier
Callback Arguments
Database Row
ก่อนเพิ่ม Default Value เพื่อซ่อนปัญหา
㉖ Event ไม่ทำงาน
ตรวจ Event Name ให้ตรง
Client
TriggerServerEvent('myjob:server:start')
Server ต้องรับชื่อเดียวกัน
RegisterNetEvent('myjob:server:start', function()
ถ้าเป็น
myjob:server:start
กับ
myjob:server:Start
ก็เป็นคนละชื่อ
จากนั้นตรวจ Client F8 และ Server Console เพื่อดูว่า Event ไปถึงฝั่งไหนแล้ว
㉗ Script ใช้ mysql-async แต่ Server ใช้ oxmysql
นี่เป็นปัญหา Resource เก่าที่พบบ่อย
Current ESX ใช้ oxmysql
แต่ Script รุ่นเก่าอาจโหลด
@mysql-async/lib/MySQL.lua
หรือมี Dependency
mysql-async
อย่ารีบติดตั้ง Database Library เก่าเพิ่มเข้า Server โดยไม่จำเป็น
ควรหา Current Version ของ Script หรือ Migration สำหรับ oxmysql
Stack ที่สะอาดจะดูแลง่ายกว่า
㉘ Table doesn't exist แก้อย่างไร
ถ้า Error เช่น
Table 'esx.my_job' doesn't exist
แสดงว่า Script Query Table ที่ Database ไม่มี
ตรวจ Package ว่ามี
install.sql
database.sql
migration.sql
หรือไม่
Import SQL ให้ตรงกับ Script Version
อย่าสร้าง Table จากชื่อ Error อย่างเดียว เพราะอาจขาด Columns/Indexes ที่ Script ต้องใช้
㉙ Unknown column แก้อย่างไร
ตัวอย่าง
Unknown column 'something'
หมายถึง Scriptคาดหวัง Database Schema ที่ต่างจากฐานข้อมูลจริง
อาจเกิดจาก
Script Update แล้วไม่ได้ Migration SQL
Database เก่า
Script คนละ Version
Column ถูก Rename
ตรวจ Migration/Changelog ของ Script
อย่าเพิ่ม Column แบบเดาโดยไม่รู้ Data Type และ Default ที่ Resource ต้องการ
㉚ Duplicate column หลัง Import SQL
มักเกิดจาก Import SQL ซ้ำ
ตัวอย่าง
Column already exists
แปลว่า Database มี Column นั้นอยู่แล้ว
ก่อน Import Migration ให้ตรวจ Schema ปัจจุบัน
สำหรับ Production ควร Backup Database ก่อนแก้ Structure ทุกครั้ง
㉛ Script ใช้ Inventory ไม่ตรงกับ Server
ESX Script อาจรองรับ
Default ESX Inventory
ox_inventory
Custom Inventory
ต่างกัน
ถ้า Script Config ตั้ง
Config.Inventory = 'ox'
แต่ Server ไม่มี ox_inventory
ระบบ Item อาจไม่ทำงาน
ในทางกลับกัน Script ที่เขียนสำหรับ Default ESX Inventory อาจใช้ API ไม่ตรงกับ External Inventory
จึงต้องตรวจ Inventory Support ทุกครั้ง
㉜ ESX มี CustomInventory Configuration
Current ESX Core มี Logic แยกกรณี
CustomInventory
หากเปิด External Inventory Behavior บางส่วนของ Core จะแตกต่างจาก Default Inventory
ดังนั้นเวลาติดตั้ง Job/Shop Script ต้องรู้ว่า Server ใช้ Inventory Mode ไหน
ไม่ใช่ดูเฉพาะว่า Server ใช้ ESX
㉝ AddItem ไม่ทำงาน
ถ้า Script ทำงานถึงจุดให้ Item แต่ Player ไม่ได้รับ ให้ตรวจ
Inventory System
Item มีในระบบหรือไม่
Item Name ตรงไหม
Max Weight
Slot/Capacity
Server Error
Inventory Export/API
ตัวอย่าง Config
water_bottle
แต่ Item จริงชื่อ
water
ก็ไม่ใช่ Item เดียวกัน
㉞ RemoveItem ไม่ทำงาน
หลักเดียวกัน
ตรวจว่า Player มี Item จริงและ Script ใช้ API ของ Inventory ที่ถูกต้อง
อย่าให้ Client บอก Server ว่า Item ถูก Remove แล้วโดยไม่มี Server Validation
ระบบ Inventory สำคัญควรให้ Server เป็น Authority
㉟ เงินไม่เพิ่มหรือไม่ลด
ตรวจว่า Script ใช้ Account Type ถูก
เช่น
money
bank
และใช้ ESX API ที่ตรง Version
นอกจากนี้ต้องตรวจ
Player Object
Amount
Account Name
Server Event
หาก Script รับจำนวนเงินจาก Client โดยตรง ต้องตรวจ Security เพิ่มด้วย
㊱ Shop Script เปิดได้แต่ซื้อไม่ได้
Flow มักเป็น
Client Menu
↓
Server Event/Callback
↓
ตรวจ Player
↓
ตรวจ Money
↓
Inventory
ถ้า Menu เปิดได้แสดงว่า Client Layer ใช้งานได้
ให้ Debug Server Layer ต่อ
เช่น
xPlayer nil?
Account Name ผิด?
Item ไม่มี?
Inventory API ผิด?
SQL Error?
ช่วยลดพื้นที่การค้นหาได้มาก
㊲ Script ใช้ ox_lib แต่ไม่มี ox_lib
แม้เป็น ESX Script ก็สามารถพึ่ง ox_lib ได้
ตรวจ fxmanifest.lua
ตัวอย่าง
shared_script '@ox_lib/init.lua'
หรือ
dependency 'ox_lib'
ถ้าไม่มี ox_lib Resource อาจ Start ไม่ครบหรือ Error ตอน Runtime
ESX Support ไม่ได้หมายความว่าไม่มี Dependency อื่น
㊳ ox_target หรือ qb-target ผิดตัว
ESX Script หลายตัวรองรับ Target หลายระบบ
เช่น
ox_target
qb-target
custom
ถ้า Config เลือกผิด
Config.Target = 'ox_target'
แต่ Server ใช้ระบบอื่น Interaction อาจไม่ขึ้นเลย
ตรวจ
Target Config
Resource Name
Exports
Version
ก่อนแก้ Client Code
㊴ Notification ไม่ขึ้นแต่ Script ทำงาน
บางครั้งระบบหลักทำงานแล้ว แต่ Notification Integration ผิด
ตัวอย่าง
ซื้อ Item สำเร็จ
เงินถูกหัก
Item เข้า
แต่ไม่มีข้อความ
กรณีนี้ไม่ควรสรุปว่า Shop Script ทั้งตัวเสีย
ให้ตรวจ Notification Bridge หรือ ESX Notify Resource
Debug ทีละ Layer
㊵ Resource Name ถูกเปลี่ยนทำให้ Script พัง
ตัวอย่าง Script เรียก
exports['ox_inventory']:...
แต่คุณ Rename เป็น
inventory
หรือ Scriptใช้
exports['es_extended']
แต่ Core ถูก Rename
จะเกิด Integration Error
Core/Dependency Resources ควรใช้ชื่อ Original ที่ Developer ระบุ เว้นแต่รู้ว่า Code ทั้งระบบรองรับการเปลี่ยนชื่อ
㊶ Folder ซ้อนหลังแตก ZIP
ตัวอย่างผิด
resources/
└── my_job/
└── my_job/
├── fxmanifest.lua
└── client.lua
FiveM อาจมอง Resource ชั้นนอกไม่ถูกต้อง
ควรเป็น
resources/
└── my_job/
├── fxmanifest.lua
├── client.lua
└── server.lua
ก่อน Debug ESX ให้ตรวจโครงสร้าง Resource พื้นฐานด้วย
㊷ Script เก่ามี __resource.lua
นี่เป็นสัญญาณว่า Resource อาจมีอายุพอสมควร
ไม่ได้หมายความว่าใช้ไม่ได้ 100%
แต่ควรตรวจต่อว่า Script มี
mysql-async
esx:getSharedObject
EssentialMode
Old Inventory APIs
หรือไม่
ถ้ามีหลายอย่างพร้อมกัน การหา Resource เวอร์ชันใหม่อาจคุ้มกว่าปะ Script เดิมทีละส่วน
㊸ lua54 'yes' เป็นวิธีแก้ไหม
ไม่ใช่คำตอบทั่วไป
FiveM ปัจจุบันใช้ Lua 5.4 แล้ว และ lua54 Directive ถูก Deprecated
ดังนั้น Script Error ไม่ควรถูกแก้ด้วยการใส่
lua54 'yes'
แบบอัตโนมัติ
ให้อ่าน Error จริงก่อน
㊹ Script ใช้ได้บน ESX Server อื่นแต่ของเราไม่ได้
อย่าเทียบเพียงคำว่า
ESX
ต้องเทียบ
ESX Version
Inventory
Target
ox_lib
oxmysql
Server Artifact
Database Schema
Script Version
Config
Server สองเครื่องที่บอกว่า “ใช้ ESX เหมือนกัน” อาจมี Stack ต่างกันมาก
㊺ Update ESX แล้ว Script พัง
ถ้า Script ใช้ได้ก่อน Update Core แต่พังทันทีหลัง Update ให้ตรวจ
Breaking Changes
Exports
Callbacks
Events
Player APIs
Database Changes
จากนั้นลอง Version เดิมบน Test Server เพื่อยืนยัน Root Cause
อย่าแก้ Scripts หลายสิบตัวก่อนพิสูจน์ว่า Core Update เป็นสาเหตุจริง
㊻ Update Script แล้วพัง
กลับกัน หาก ESX ไม่ได้เปลี่ยน แต่ Script ถูก Update
ให้ตรวจ
New Dependencies
New SQL
New Config
Framework Version Requirement
Inventory Changes
ปัญหายอดนิยมคือใช้ Config เก่าทับ Script รุ่นใหม่ ทำให้ Option ใหม่หาย
㊼ อย่า Copy config.lua เก่าทับ Version ใหม่ทั้งหมด
ตัวอย่าง
Script v1
มี Config 30 ค่า
Script v2
มี Config 45 ค่า
ถ้าเอา config.lua v1 ไปทับ v2
15 ค่าใหม่หาย
Script อาจ Error ว่า
attempt to index nil
ควร Merge เฉพาะค่าที่ Custom
ไม่ใช่ Replace Config ทั้งไฟล์
㊽ Paid Escrow ESX Script ไม่ทำงาน
ถ้า Source หลักถูกปกป้อง ให้ตรวจสิ่งที่แก้ได้ก่อน
Config
Bridge
Framework Setting
Inventory Setting
SQL
Dependencies
Entitlement
หาก Error อยู่ใน Protected Core ให้เก็บ
Error เต็ม
Script Version
ESX Version
Inventory
Server Artifact
ขั้นตอนทำให้ Error เกิด
แล้วติดต่อ Developer
อย่าพยายาม Bypass Protection
㊾ Script ขึ้น You Lack the Required Entitlement
นี่ไม่ใช่ ESX Error
ถ้า Console ขึ้น
You lack the required entitlement
ให้แก้
Cfx Account
Server Registration Key
Asset Ownership
ไม่ใช่เปลี่ยน ESX Framework
แยกประเภท Error ให้ถูกก่อนเสมอ
㊿ Script Resmon สูงแต่ใช้งานได้
นี่เป็น Performance Problem ไม่ใช่ Functional Error
ใช้
resmon true
ฝั่ง Client และ Profiler เพื่อดู Resource
อย่าเปลี่ยน Framework เพียงเพราะ Custom Script ตัวเดียวใช้ CPU สูง
Framework กับ Performance ของ Resource ลูกเป็นคนละชั้นของปัญหา
51. วิธี Debug ESX Script ด้วย print
สามารถใส่ Log ชั่วคราว
Client
print('client loaded')
Server
print('server loaded')
แล้วเพิ่มทีละจุด
Resource Loaded
↓
ESX Loaded
↓
Player Found
↓
Event Received
↓
Database Result
↓
Action Complete
จะช่วยรู้ว่า Flow หยุดตรงไหน
หลัง Debug เสร็จควรลบหรือปิด Debug Logs ที่ไม่จำเป็น
52. อย่า print ใน Loop ทุก Frame
ตัวอย่างที่ไม่ควรทำ
while true do
Wait(0)
print(ESX.PlayerData.job.name)
end
นอกจาก Console Spam ยังเพิ่มภาระ Client
ใช้ Log เฉพาะเวลาที่ State เปลี่ยนหรือ Action ถูกเรียก
53. วิธีแยกว่าเป็นปัญหา ESX Core หรือ Script
ทดสอบ Scripts Official/Core อื่น
ถ้า
Character
Job
Money
Official ESX Resources
ทำงานปกติ แต่ Custom Garage ไม่ทำงาน
มีโอกาสสูงว่าปัญหาอยู่ Garage หรือ Integration ของมัน
ถ้า Scripts ESX หลายตัวพังพร้อมกัน ให้ตรวจ Core/Database/Dependencies ก่อน
นี่เป็นวิธี Root Cause Analysis ที่เร็วมาก
54. ปิด Script ตัวอื่นเพื่อทดสอบได้ไหม
บน Test Server ทำได้
หากสงสัย Conflict ระหว่าง Resources ให้หยุด Script ที่เกี่ยวข้องชั่วคราว
เช่น
Inventory A
Inventory B
หรือ
Target A
Target B
เพื่อดูว่าอาการหายหรือไม่
แต่ไม่ควรหยุด
es_extended
oxmysql
บน Production แบบสุ่ม เพราะ Resource ลูกจำนวนมากพึ่งมัน
55. Script ESX สองตัวทำงานซ้ำกัน
ตัวอย่าง
Garage A
Garage B
ทั้งคู่ Register Commands, Events หรือ Zones คล้ายกัน
อาจเกิด
Menu ซ้อน
Vehicle ถูกจัดการสองครั้ง
Event ทำงานสองรอบ
ก่อนติดตั้ง Script ใหม่ควรตรวจว่า Base ESX มี Feature ที่ทำหน้าที่เดียวกันอยู่แล้วหรือไม่
อย่าลง Resource ซ้ำเพียงเพราะชื่อไม่เหมือนกัน
56. ล้าง Cache ช่วย ESX Script ไม่ทำงานไหม
ไม่ควรเป็นวิธีแรก
ถ้า Error คือ
SQL Table missing
No such export
ESX nil
Missing dependency
Old Shared Object Event
ล้าง Cache ไม่ได้แก้ Root Cause เหล่านี้
ใช้ Cache troubleshooting เมื่อมีเหตุผลว่าปัญหาเป็น Client Resource Cache จริง ไม่ใช่คำตอบสำหรับทุก Error
57. Reinstall ESX ช่วยไหม
ถ้า Core ทำงานปกติและ Custom Script ตัวเดียวพัง การ Reinstall ESX ทั้ง Framework มักไม่คุ้ม
ควรตรวจ Script ตัวนั้นก่อน
Reinstall Core เหมาะเมื่อพิสูจน์ได้ว่า Core Files
หาย
ถูกแก้เสีย
Version ปะปน
Deployment ไม่สมบูรณ์
จริง
อย่าทำลาย Base Server ที่ดีเพื่อแก้ Resource ตัวเดียว
58. วิธีแก้ ESX Script แบบเร็วที่สุด
ทำตาม Workflow นี้
① ดู Error แรกใน Server Console
② ดู F8
③ เช็ก es_extended
④ เช็ก oxmysql
⑤ เช็ก Start Order
⑥ เปิด fxmanifest.lua ของ Script
⑦ ตรวจ ESX Integration
⑧ ตรวจ Dependency
⑨ ตรวจ Inventory / Target
⑩ ตรวจ SQL
⑪ ตรวจ Script Version
⑫ ทดสอบใหม่
ถ้า Error เปลี่ยนหลังแก้ข้อหนึ่ง แสดงว่าคุณกำลังผ่านไปยัง Layer ถัดไป
อย่าย้อนกลับไปแก้เรื่องเดิมโดยไม่มีเหตุผล
59. ตารางอาการกับจุดที่ควรตรวจ
| อาการ | ตรวจอันดับแรก |
|---|---|
| ESX = nil | ESX Integration / Start Order |
| No such export | Export / Resource Version |
| Table doesn't exist | SQL Installation |
| Unknown column | Database Migration |
| Job ไม่ทำงาน | PlayerData / Job Name / Grade |
| Item ไม่เข้า | Inventory Integration |
| Money ไม่เข้า | xPlayer / Account / Server Event |
| Menu ไม่เปิด | Client F8 / NUI |
| Callback ไม่ตอบ | Register Callback / Server Error |
| ใช้ได้หลัง restart | Start Order / Initialization |
| หลาย ESX Script พัง | Core / Database |
| Script เดียวพัง | Script Compatibility |
ตารางนี้ช่วยลดเวลา Debug ได้มาก
60. Checklist ESX Script ไม่ทำงาน
ESX Core
es_extendedStart แล้วไม่มี Core Error
Player เข้า Server ได้
Player Data โหลด
Job/Money ทำงาน
Database
oxmysqlStartConnection สำเร็จ
Tables ครบ
SQL Migration ตรง Version
ไม่มี Unknown Column
Script
fxmanifest.luaถูกResource Folder ถูก
ไม่มี Folder ซ้อน
Client/Server Files ครบ
Framework Config = ESX
Integration
ใช้ Current ESX API
ไม่พึ่ง
esx:getSharedObjectแบบเก่าโดยไม่รองรับExport Name ถูก
Callback Name ถูก
Event Name ถูก
Dependencies
ox_libInventory
Target
Voice
Resource อื่นครบ
Debug
อ่าน Server Console
อ่าน F8
แก้ Error แรก
Test หลังแก้ทีละจุด
สรุป ESX Script ไม่ทำงาน แก้อย่างไร
ถ้า ESX Script ไม่ทำงาน อย่าเริ่มจาก Reinstall Server หรือ Clear Cache
ให้ตรวจจาก Core ลงมาหา Resource ตามลำดับ
oxmysql
↓
es_extended
↓
Player Data
↓
Script Dependency
↓
ESX Integration
↓
Inventory / Target
↓
Database
↓
Client / Server Logic
Current ESX Legacy ใช้ oxmysql เป็น Dependency ของ es_extended และ Current Core มี Integration ผ่าน exports["es_extended"]:getSharedObject()/imports.lua ดังนั้น Script เก่าที่ใช้ Shared Object Event รุ่นเดิมอาจต้อง Migration ก่อนใช้งานกับ ESX ปัจจุบัน
อีกหลักที่สำคัญคือ ถ้า ESX Scripts หลายตัวพังพร้อมกัน ให้ตรวจ Core และ Database ก่อน แต่ถ้า Base ESX ทุกอย่างทำงานและมีเพียง Script เดียวเสีย ให้โฟกัสที่ Version, Dependencies และ Integration ของ Script ตัวนั้น
แนวทางของ comsiam คืออ่าน Error แรกจาก Console หรือ F8 แล้วแก้ทีละ Layer เพราะ Error ชุดใหญ่หลายสิบบรรทัดมักเกิดจาก Root Cause เพียงจุดเดียว เช่น oxmysql ไม่เชื่อม, ESX ไม่พร้อม หรือ Dependency ตัวหนึ่งไม่ Start
สำหรับ Production Server comsiam แนะนำให้เก็บ Clean ESX Base และ Test Server ไว้เสมอ เมื่อ Script ใหม่มีปัญหาจะสามารถทดสอบบน Base ที่รู้ว่าใช้งานได้ ทำให้แยกได้ทันทีว่าปัญหาเกิดจาก ESX Core หรือ Resource ที่เพิ่งติดตั้ง
Comments
Post a Comment