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 ไม่ Start

  • Start 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 = nilESX Integration / Start Order
No such exportExport / Resource Version
Table doesn't existSQL Installation
Unknown columnDatabase Migration
Job ไม่ทำงานPlayerData / Job Name / Grade
Item ไม่เข้าInventory Integration
Money ไม่เข้าxPlayer / Account / Server Event
Menu ไม่เปิดClient F8 / NUI
Callback ไม่ตอบRegister Callback / Server Error
ใช้ได้หลัง restartStart Order / Initialization
หลาย ESX Script พังCore / Database
Script เดียวพังScript Compatibility

ตารางนี้ช่วยลดเวลา Debug ได้มาก

60. Checklist ESX Script ไม่ทำงาน

ESX Core

  • es_extended Start แล้ว

  • ไม่มี Core Error

  • Player เข้า Server ได้

  • Player Data โหลด

  • Job/Money ทำงาน

Database

  • oxmysql Start

  • Connection สำเร็จ

  • 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_lib

  • Inventory

  • 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

Popular posts from this blog

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

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

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