ox_inventory ไม่ทำงาน แก้อย่างไร รวมวิธีแก้ Inventory เปิดไม่ได้ Item หาย และ Error ใน FiveM
ปัญหา ox_inventory ไม่ทำงานใน FiveM สามารถเกิดได้ตั้งแต่ Resource ไม่ Start, Inventory เปิดไม่ได้, Item เพิ่มไม่ได้, Stash ไม่ทำงาน, Trunk หาย, Weapon Error ไปจนถึง Item หายหลังออกเข้า Server ใหม่
สาเหตุส่วนใหญ่มักอยู่ใน 7 กลุ่มหลัก
Dependencies
Framework
Start Order
Configuration
UI Build
Database
Script Compatibility
ดังนั้นอย่าเริ่มจากการล้าง Cache หรือ Reinstall Server ทั้งหมด
วิธีที่ถูกคือไล่ Dependency จากล่างขึ้นบน
① oxmysql
↓
② ox_lib
↓
③ Framework
↓
④ ox_target
↓
⑤ ox_inventory
↓
⑥ Custom Scripts
ถ้าชั้นล่างยัง Error การแก้ Script ชั้นบนแทบไม่มีประโยชน์
① ox_inventory ไม่ทำงานมีอาการอะไรบ้าง
อาการที่พบบ่อย ได้แก่
Couldn't find resource ox_inventory
ox_inventory won't start
ox_inventory requires ox_lib
Dependency version error
UI has not been built
Inventory เปิดไม่ได้
Inventory เปิดแล้วว่าง
Item เพิ่มไม่ได้
Item ใช้ไม่ได้
Stash เปิดไม่ได้
Shop ไม่ทำงาน
Trunk ไม่เปิด
Glovebox ไม่บันทึก
Weapon ใช้ไม่ได้
Item หายหลัง Reconnect
แต่ละอาการมี Root Cause ต่างกัน
จึงควรอ่าน Error จริงก่อนแก้
② ดู Error แรกก่อน Error ตามมา
สมมติ Console แสดง
ox_lib error
qbx_core error
ox_inventory error
policejob error
shop error
อย่าเริ่มจาก policejob
ควรแก้ Error แรกสุดก่อน
เพราะ Dependency Chain อาจเป็น
ox_lib พัง
↓
Framework ใช้งานไม่ครบ
↓
ox_inventory พัง
↓
Jobs พัง
แก้ Root Cause ตัวเดียวอาจทำให้ Errors ด้านล่างหายไปพร้อมกัน
③ ตรวจว่า Folder ox_inventory มีจริง
โครงสร้างควรประมาณ
resources/
└── [ox]/
└── ox_inventory/
├── fxmanifest.lua
├── init.lua
├── client.lua
├── server.lua
├── data/
├── modules/
└── web/
ถ้า FiveM หา Resource ไม่เจอ ให้ตรวจ Path เป็นอย่างแรก
④ Couldn't find resource ox_inventory
ถ้าขึ้น
Couldn't find resource ox_inventory
ตรวจ
ชื่อ Folder
ตำแหน่ง Folder
fxmanifest.lua
Folder ซ้อน
จากนั้นใช้
refresh
แล้ว
ensure ox_inventory
ใหม่
⑤ Folder ซ้อนทำให้ Resource ไม่ถูกพบ
ตัวอย่างผิด
resources/
└── ox_inventory/
└── ox_inventory/
└── fxmanifest.lua
ควรเป็น
resources/
└── ox_inventory/
└── fxmanifest.lua
Manifest ต้องอยู่ที่ Root ของ Resource
⑥ อย่า Rename ox_inventory
ควรรักษาชื่อ
ox_inventory
ไม่ควรเปลี่ยนเป็น
inventory
ox_inventory_new
oxinventory
my_inventory
เพราะ Scripts จำนวนมากเรียก
exports.ox_inventory
โดยอิง Resource Name นี้
Rename แล้ว Exports อาจหา Resource ไม่เจอทันที
⑦ ตรวจ fxmanifest.lua
Current Resource ใช้
fxmanifest.lua
และประกาศ Dependencies สำคัญ เช่น
oxmysql
ox_lib
OneSync
FXServer Build Requirement
ถ้า Server ไม่ผ่านข้อใดข้อหนึ่ง Inventory อาจไม่ Start
อย่าลบ Dependency จาก Manifest เพียงเพื่อให้ Error หาย
⑧ Current ox_inventory Version
Current Manifest ที่ตรวจสอบสำหรับบทความนี้ระบุ
2.47.9
แต่ Version นี้สามารถเปลี่ยนได้ในอนาคต
สิ่งที่สำคัญกว่าคือ
ox_inventory Version
+
ox_lib Version
+
oxmysql Version
+
Framework Version
ต้อง Compatible กัน
⑨ ox_inventory requires ox_lib แก้อย่างไร
ถ้าขึ้น
ox_inventory requires the ox_lib resource
แปลว่า Inventory ไม่พบ lib ตอน Initialization
ตรวจ
ox_lib มีไหม
ox_lib Start แล้วไหม
Start ก่อน ox_inventory หรือไม่
ox_lib มี Error หรือไม่
Start Order ต้องเป็น
ensure ox_lib
ensure ox_inventory
ไม่ใช่กลับกัน
⑩ ox_lib Version ต่ำเกินไป
Current ox_inventory Source ตรวจขั้นต่ำของ ox_lib
ใน Snapshot ปัจจุบันคือ
ox_lib >= 3.36.4
ถ้า Version ต่ำเกินไป Inventory จะหยุด Initialization
วิธีแก้คือ Update ox_lib เป็น Version ที่ Compatible
ไม่ควรลบ Version Check
⑪ oxmysql Version ต่ำเกินไป
Current Inventory ยังตรวจขั้นต่ำ
oxmysql >= 2.7.3
ถ้าใช้ oxmysql เก่าจาก Server Pack หลายปี อาจไม่ผ่าน
ให้
Backup
↓
Update oxmysql
↓
Test Database
↓
Test Inventory
อย่า Update Production โดยไม่มี Backup
⑫ Start Order พื้นฐาน
ใช้แนวคิด
ensure oxmysql
ensure ox_lib
ensure framework
ensure ox_target
ensure ox_inventory
คำว่า framework ต้องเปลี่ยนเป็น Framework จริง
เช่น
qbx_core
es_extended
ox_core
⑬ ตัวอย่าง Qbox Start Order
ensure oxmysql
ensure ox_lib
ensure qbx_core
ensure ox_target
ensure ox_inventory
และก่อน Start Resources ต้องมี
setr inventory:framework "qbx"
⑭ ตัวอย่าง ESX Start Order
setr inventory:framework "esx"
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure ox_target
ensure ox_inventory
ถ้าไม่ได้ใช้ Target สามารถปิด
setr inventory:target false
และไม่จำเป็นต้องให้ ox_target เป็นส่วนหนึ่งของ Inventory Interaction
⑮ Framework Config ผิดทำให้ Inventory พังได้
Current Configuration ใช้
setr inventory:framework "..."
Framework ที่รองรับ ได้แก่แนวทาง
ox
esx
qbx
nd
ถ้าเป็น Qbox แต่ตั้ง
setr inventory:framework "esx"
Inventory อาจโหลด Database Bridge ผิดชุด
⑯ ทำไม Framework Bridge ผิดถึงร้ายแรง
Current Database Module เลือก Tables ตาม Framework
ESX
Player table = users
Player ID = identifier
Vehicle table = owned_vehicles
Vehicle ID = plate
Qbox
Player table = players
Player ID = citizenid
ดังนั้นตั้ง Framework ผิดอาจทำให้เกิด
SQL Error
Inventory ไม่โหลด
Player Data ไม่พบ
Trunk ไม่บันทึก
⑰ Qbox ต้องตั้ง qbx ไม่ใช่ qb
สำหรับ Qbox ใช้
setr inventory:framework "qbx"
ไม่ใช่
setr inventory:framework "qb"
Current Official Integration แยก Qbox ไว้ชัดเจน
⑱ QBCore เดิมต้องระวัง
Current Official ox_inventory ไม่ได้ระบุ qb-core เป็น Native Supported Framework แบบ Qbox
ดังนั้น Existing QBCore Server ไม่ควรคิดว่า
หยุด qb-inventory
↓
ใส่ ox_inventory
↓
จบ
อาจต้องใช้ Bridge หรือ Migration Architecture ที่เหมาะสม
⑲ Qbox Dependency Version ต้องตรวจด้วย
Current Qbox Bridge ของ ox_inventory ตรวจขั้นต่ำ เช่น
qbx_core >= 1.18.1
qbx_vehicles >= 1.2.0
ใน Source Snapshot ที่ตรวจสอบ
ดังนั้นถ้า Qbox เก่ามาก อาจเจอ Dependency Assertion
แก้ด้วยการใช้ Stack ที่ Version Compatible กัน
⑳ ox_target not loaded แก้อย่างไร
ถ้าตั้ง
setr inventory:target true
แต่ ox_target ยังไม่ Start Inventory จะเตือนประมาณว่า
ox_target is not loaded
Current Source จะปิด Target Integration ให้อัตโนมัติในกรณีนี้
แก้ Start Order เป็น
ensure ox_target
ensure ox_inventory
㉑ ถ้าไม่ใช้ ox_target
ตั้ง
setr inventory:target false
ได้
อย่าติดตั้ง ox_target เพียงเพราะ Inventory มี Optional Integration หาก Server ไม่ได้ใช้ Feature นี้
Dependencies ที่ไม่จำเป็นเพิ่มภาระ Maintenance
㉒ UI has not been built แก้อย่างไร
Current ox_inventory ตรวจว่า
web/build/index.html
มีหรือไม่
ถ้าไม่มีจะขึ้นประมาณ
UI has not been built
สาเหตุที่พบบ่อยคือ Download Source Code ZIP แทน Release Build
㉓ วิธีแก้ UI has not been built
ทางง่ายที่สุดคือใช้
Official Release
ที่ Build UI มาแล้ว
หรือถ้าเป็น Developer สามารถ Build Source ตาม Workflow ของ Project
หลักคือ
Source Code
↓
Build Web UI
↓
web/build/index.html
ต้องมีจริงก่อนใช้งาน
㉔ Clear Cache ไม่ช่วย UI Build Missing
ถ้าไฟล์
web/build/index.html
ไม่มี
การ Clear
Client Cache
Server Cache
ไม่สามารถสร้างไฟล์ขึ้นมาได้
ดังนั้นแก้ Package ให้ถูกก่อน
㉕ Source ZIP กับ Release ต่างกัน
Source
เหมาะกับ Developer
อาจต้อง Build
Release
เหมาะกับ Server Owner
มี Production Build พร้อมมากกว่า
หากต้องการแค่ติดตั้ง Inventory ให้ใช้ Release เป็นตัวเลือกแรก
㉖ Inventory Started แต่กดเปิดไม่ได้
ถ้า Console มี
Started resource ox_inventory
แต่กดเปิด Inventory ไม่ขึ้น
ตรวจ
F8
Client Errors
Framework Player Loaded
UI
Keybind
Inventory State
คำว่า Started ไม่ได้แปลว่าระบบ Client/Framework พร้อมทุกส่วน
㉗ เปิด F8 ดู Error ฝั่ง Client
F8 เหมาะกับปัญหา
Inventory UI ไม่ขึ้น
NUI Error
Client Module Error
Keybind Error
lib Error
ถ้า Server Console ไม่มี Error แต่ UI ไม่ขึ้น ให้ดู Client F8 เสมอ
㉘ ตรวจ Server Console ด้วย
Server Console เหมาะกับ
Database
Framework Bridge
Dependency
Item
Player Data
Stash
Vehicle
Server Event
Inventory เป็นระบบ Client + Server
จึงต้องตรวจทั้งสองด้าน
㉙ Inventory เปิดแล้วว่าง
ถ้า UI เปิดแต่ Items หายทั้งหมด ให้แยกเป็นสองกรณี
Character ใหม่
อาจยังไม่มี Item
Existing Character
ถ้าเคยมี Item แล้วหาย ให้ตรวจ
Framework Bridge
Database Player Inventory
Identifier
Migration
Save/Load
อย่าโทษ NUI ก่อน เพราะ UI แสดงได้แล้ว
㉚ ตรวจ Player Identifier
Qbox ใช้แนวคิด
citizenid
ESX ใช้
identifier
หาก Framework Bridge อ่าน Identifier ไม่ตรงกับ Database Record
Inventory อาจสร้าง/โหลด State ผิด Character
นี่สำคัญมากใน Server ที่ผ่านการ Migration
㉛ Item เพิ่มไม่ได้
ถ้า
exports.ox_inventory:AddItem(...)
ไม่สำเร็จ ให้ตรวจอย่างน้อย
Item มี Definition ไหม
Inventory มี Slot ไหม
Weight เต็มไหม
Inventory ID ถูกไหม
Player Loaded แล้วไหม
อย่าคิดว่า AddItem สำเร็จทุกครั้ง
㉜ ตรวจ Return Value ของ AddItem
ตัวอย่าง
local success, response = exports.ox_inventory:AddItem(
source,
'water',
1
)
if not success then
print(response)
end
จะช่วยบอก Root Cause ได้ดีกว่าเรียก Export แล้วไม่ดูผล
㉝ Item ไม่มีใน Inventory
เปิด
ox_inventory/data/items.lua
แล้วตรวจว่า Item ถูก Define
เช่น
['water'] = {
label = 'Water',
weight = 500,
stack = true,
close = true
}
Script ต้องเรียก Item Name
water
ไม่ใช่ Label
Water
㉞ Item Name ตัวพิมพ์ผิด
สมมติ Definition คือ
lockpick
แต่ Script เรียก
lock_pick
Inventory จะถือเป็นคนละ Item
ก่อน Debug Inventory Core ให้ตรวจ Item Name ตัวอักษรต่ออักษร
㉟ Inventory เต็มทำให้ AddItem ไม่ได้
Player อาจมี Slot ว่าง แต่ Weight เต็ม
หรือ Weight เหลือแต่ไม่มี Slot
ต้องผ่านทั้ง
Slots
+
Weight
เช่น
Slots: เหลือ 10
Weight: เต็ม
ก็ Add Item ไม่ได้
㊱ Weight ตั้งผิดทำให้เหมือน Inventory เสีย
ตัวอย่าง
weight = 50000
หมายถึง Item หนึ่งชิ้นหนักประมาณ
50 kg
หาก Player Capacity คือ
setr inventory:weight 30000
Item นั้นจะหนักเกิน Player Capacity
ตรวจ Unit ให้ดี
㊲ Stack ผิดอาจทำให้ Item แยก Slots เยอะ
ถ้า Item ทั่วไปตั้ง
stack = false
Water 20 ขวดอาจใช้ 20 Slots
ทำให้ Inventory เต็มเร็วกว่าที่คิด
Item ทั่วไปมักใช้
stack = true
ส่วน Unique Metadata Items จึงค่อยพิจารณา false
㊳ Metadata ทำให้ Item ไม่ Stack ได้
แม้ Item ตั้ง Stack ได้ Metadata ที่แตกต่างกันอาจทำให้ Items แยกกัน
ตัวอย่าง
ID Card A
Name = Somchai
กับ
ID Card B
Name = Somsak
ไม่ควรถูกรวมเป็น Item เดียว
ดังนั้นอย่าคิดว่า Inventory Bug เพียงเพราะ Item Name เหมือนกันแต่แยก Slot
㊴ Item ใช้ไม่ได้
ถ้า Item อยู่ใน Inventory แต่กด Use ไม่ทำงาน ให้ตรวจ
Item Definition
Client/Server Export
Usable Item Logic
Framework Integration
Custom Resource
F8
Console
นี่อาจเป็น Script Integration Error ไม่ใช่ Inventory Core
㊵ Image Item ไม่ขึ้น
ถ้า Item ทำงานแต่รูปหาย ให้ตรวจ
web/images/
และชื่อ Image ที่ Item Definition ใช้
นี่เป็น UI Asset Problem
ไม่จำเป็นต้อง Reinstall Database หรือ Framework
㊶ Stash เปิดไม่ได้
ตรวจว่า Stash ถูก Register ก่อนหรือไม่
จากนั้นตรวจ
Stash ID
Owner
Groups
Coordinates
Slots
Weight
ถ้า Stash จำกัด Job ให้ตรวจ Player Group ด้วย
㊷ Stash ขึ้นว่า Inventory ไม่พบ
Resource อาจเรียกเปิด Stash ก่อน
RegisterStash
ทำงาน
Architecture ควรเป็น
Register Stash
↓
Player Interaction
↓
Open Stash
ไม่ใช่เปิด ID ที่ Inventory ไม่เคยรู้จัก
㊸ Personal Stash เห็นของคนอื่น
ถ้า Personal Stash ควรแยก Owner แต่ Player A เห็นของ Player B
ให้ตรวจ
owner parameter
character identifier
stash registration
โดยเฉพาะหลัง Migration Framework
อย่าใช้ Stash ID เดียวแบบ Shared หากต้องการ Personal Storage
㊹ Stash Item หายหลัง Restart
Current Database Module ใช้ Table
ox_inventory
สำหรับ Persistent Stashes
ถ้าของหายหลัง Restart ให้ตรวจ
Database Save Error
ox_inventory Table
owner
name
JSON Data
Console
ปัญหา Persistence อยู่ Server/Database Layer มากกว่า NUI
㊺ Shop เปิดไม่ได้
ตรวจ
Shop Registered?
Shop Type ถูก?
Location ถูก?
Target ทำงาน?
Group Requirement?
License Requirement?
ถ้ากด Target ไม่ขึ้นแต่เปิด Shop ผ่าน API ได้ ปัญหาอยู่ Target Layer
ไม่ใช่ Shop Core
㊻ ซื้อของไม่ได้
ตรวจ
เงินพอไหม
Currency ถูกไหม
Group ถูกไหม
License ถูกไหม
Inventory มีที่ไหม
Item Definition มีไหม
Server-side Validation ของ Inventory อาจปฏิเสธ Transaction ที่ไม่ผ่านเงื่อนไข
จึงควรอ่าน Response/Console
㊼ Crafting ไม่ทำงาน
ตรวจ
Ingredients ครบไหม
Recipe ถูกไหม
Group/Grade ผ่านไหม
Inventory มีที่ไหม
Item Output มี Definition ไหม
ถ้า Progress/Interaction ทำงานแต่ไม่ได้ Output ให้ดู Server Logic ต่อ
㊽ Trunk เปิดไม่ได้
Trunk เชื่อมกับ Vehicle Identity
Current Database Bridge ใช้ Vehicle Tables ต่างกันตาม Framework
ESX ตัวอย่าง
owned_vehicles
plate
Qbox ใช้ Vehicle Architecture ของ Qbox
ถ้า Framework/Vehicle Integration ไม่ตรง Trunk อาจหา Vehicle Record ไม่พบ
㊾ Trunk Item หายหลัง Restart
ให้ตรวจ
Vehicle มี Persistent Record ไหม
Vehicle ID/Plate ตรงไหม
Database Save สำเร็จไหม
Vehicle Table มี trunk column/data ตาม Integration ไหม
รถ Spawn แบบ Temporary อาจไม่เหมือน Owned Vehicle ที่มี Persistent Storage
㊿ Glovebox ไม่ทำงาน
หลักเดียวกับ Trunk
Current Database Module มี Query แยก
glovebox
trunk
ดังนั้นหาก Player Inventory ปกติ แต่ Vehicle Inventory พัง ให้สงสัย Vehicle Bridge/Schema ก่อน
ไม่ต้อง Reinstall Inventory ทั้งตัวทันที
51. Weapon หายหรือใช้ไม่ได้
ตรวจ
Weapons as Items
Item Definition
Metadata
Ammo
Durability
Weapon Components
Custom Weapon Scripts
ถ้า Server เคยมี Weapon System จาก Inventory เก่า Scripts อาจยังเรียก API เดิม
นี่เป็นปัญหาที่พบบ่อยตอน Migration
52. อย่ารัน Inventory สองระบบพร้อมกัน
ไม่ควรมี
qb-inventory
+
ox_inventory
หรือ Inventory หลักสองตัวทำงานพร้อมกันโดยไม่มี Architecture ที่ออกแบบมา
เพราะอาจเกิด
Player Item State สองชุด
Weapon State สองชุด
Stash สองชุด
Database Save สองระบบ
เลือก Inventory Source of Truth เพียงตัวเดียว
53. Existing Framework Inventory เป็นสาเหตุ Compatibility ใหญ่
Official Documentation เตือนว่าการ Replace Built-in Framework Inventory อาจทำให้เกิด Compatibility Errors
ตัวอย่าง Scripts อาจยังเรียก
Old AddItem
Old RemoveItem
Old Stash API
Old Weapon Functions
แม้ ox_inventory เอง Start สมบูรณ์
นี่ไม่ใช่ Bug ของ Inventory เสมอไป
54. วิธีหา Script ที่ยังเรียก Inventory เก่า
ค้นหาใน Source Resources ทั้ง Server
เช่นถ้าย้ายจาก QBCore หา
qb-inventory
และ Exports/Events เดิม
ถ้าย้าย ESX ให้หา Functions ที่อิง Inventory Architecture เก่า
จากนั้นจัดกลุ่ม
Compatible
ต้องเปลี่ยน Config
ต้อง Bridge
ต้อง Rewrite
55. Item หายหลัง Reconnect
นี่เป็นปัญหาที่ต้องให้ความสำคัญสูง
ทดสอบ
Add Item
↓
ตรวจ Inventory
↓
Disconnect
↓
Reconnect
ถ้าหาย ให้ตรวจ
Player Database
Identifier
Inventory Save
Framework Logout Event
Server Console
อย่าเปิด Production จน Persistence ผ่าน
56. Item อยู่หลัง Reconnect แต่หายหลัง Server Restart
แสดงว่า Runtime/Session Save บางส่วนอาจทำงาน แต่ Persistence ระยะยาวมีปัญหา
ตรวจ
Database Write
JSON Data
Resource Shutdown
Framework Save
Database Errors
แล้วทดสอบ Server Restart ซ้ำ
57. Database Connection มีผลโดยตรง
ถ้า oxmysql เชื่อมไม่ได้ Inventory Persistence จะมีปัญหา
Error ที่ควรหา เช่น
Access denied
Unknown database
Connection refused
SQL syntax
Unknown column
Unknown table
แก้ Database Layer ก่อน
อย่าเปลี่ยน Inventory UI เพื่อแก้ SQL Error
58. Unknown column แปลว่าอะไร
เช่น
Unknown column 'inventory'
อาจหมายถึง Database Schema ไม่ตรงกับ Framework/Bridge ที่ Inventory คาดหวัง
ถามตัวเองว่า
ใช้ Framework ไหน
DB Schema Version ไหน
เพิ่ง Migration หรือไม่
inventory:framework ตั้งถูกไหม
อย่าเพิ่ม Column แบบเดาสุ่มก่อนตรวจ Official Schema
59. Unknown table แปลว่าอะไร
ถ้า Inventory Query
users
แต่ Server เป็น Qbox
หรือ Query
players
แต่ Server เป็น ESX
มีโอกาส Framework Bridge ตั้งผิด
ตรวจ
setr inventory:framework
ก่อนสร้าง Table ใหม่มั่ว ๆ
60. ox_inventory Table ไม่มี
Persistent Stash Data ใช้ Database Table ของ Inventory
ถ้า Table ที่ Resource ต้องการไม่มี ให้ตรวจ Installation/Migration SQL ของ Release ที่ใช้อยู่
อย่าดาวน์โหลด SQL จาก Version คนละยุคมา Import โดยไม่ตรวจ
Core Code และ Schema ควรอยู่ Version Lineage เดียวกัน
61. JSON Error ใน Inventory
Inventory Data จำนวนมากถูกจัดเก็บในรูป JSON
ถ้ามีข้อมูลเสียอาจเจอ Decode/SQL Errors
ก่อนแก้ Database Record โดยตรง
Backup Database
ก่อนเสมอ
อย่าลบ Player Inventory ทั้งก้อนเพียงเพื่อทำให้ Player เข้า Server ได้ หากข้อมูลนั้นสำคัญ
62. Hooks สามารถทำให้ Item Move ไม่ได้
ox_inventory รองรับ Server Hooks เช่น
swapItems
openShop
createItem
buyItem
craftItem
usingItem
Custom Resource สามารถ Return false เพื่อ Block Action
ดังนั้นถ้า Item ย้ายไม่ได้เฉพาะบางประเภท ให้ตรวจ Custom Hooks ด้วย
ไม่ใช่ Inventory Core อย่างเดียว
63. วิธีหา Hook ที่ Block
ค้นหา
registerHook
ใน Custom Resources
แล้วดูว่า Resource ใด Hook
swapItems
buyItem
craftItem
อยู่
ปิด Resource นั้นบน Test Serverแล้วลองใหม่
หากปัญหาหาย Root Cause อยู่ Custom Hook
64. Custom Script AddItem ไม่ทำงาน
ถ้า Inventory ปกติ แต่ Job Script ตัวเดียว AddItem ไม่ได้
ให้ตรวจ Script นั้นก่อน
Flow ที่ดีคือ
Player Action
↓
Server Validation
↓
exports.ox_inventory:AddItem
↓
ตรวจ Return Value
อย่าแก้ ox_inventory Core เพื่อให้ Script หนึ่งตัวทำงาน
65. No such export AddItem
ตรวจว่าเรียกจาก Resource ที่ถูกต้อง
ตัวอย่าง
exports.ox_inventory:AddItem(...)
และ ox_inventory Start แล้ว
จากนั้นตรวจ Version/API
หาก Rename Resource การอ้าง exports.ox_inventory จะผิดทันที
66. No such export OpenInventory
openInventory เป็น Client-side Export
ถ้าเรียกจาก Context ผิด เช่น Server-side Code อาจเกิดปัญหา
ต้องตรวจ Documentation ว่า Function นั้นอยู่
Client
หรือ
Server
ก่อน
67. Client/Server API ใช้สลับกันไม่ได้
ตัวอย่างแนวคิด
Client
→ เปิด UI
Server
→ Add/Remove Items
→ Validate
อย่า Copy Code จาก Documentation แล้ววางฝั่งผิด
Error ประเภท Export/Function nil จำนวนมากเกิดจาก Client/Server Context ผิด
68. ox_inventory Start ช้ามาก
ถ้ามี Item จำนวนมากหรือ Database ช้า ให้ดู
Database latency
SQL errors
Item loading
Custom files
Server hardware
Current Item Module โหลด Item List ตอน Initialization แล้วตั้ง shared.ready
ถ้าขั้นตอนนี้ Error Inventory อาจไม่ Ready แม้ Resource เริ่มทำงานแล้ว
69. ดูข้อความ Inventory has loaded ... items
Current Item Module แสดงจำนวน Items ที่โหลดเมื่อ Initialization เสร็จ
ตัวอย่างแนวคิด
Inventory has loaded 250 items
ถ้าไม่เห็นข้อความ Load Complete แต่มี Error ก่อนหน้า ให้ไล่ Error นั้น
อย่าคิดว่า Item System พร้อมแล้ว
70. ESX มีการ Copy Items จาก Database
Current ox_inventory ESX Logic มี Compatibility Behavior ที่สามารถอ่าน Items จาก ESX Database และเพิ่ม Item ที่ขาดเข้า data/items.lua ในบางสถานการณ์
จากนั้นอาจแจ้งให้ Restart Resource เพื่อโหลด Items ใหม่
ดังนั้น ESX Server ควรอ่าน Console ตอน First Setup ให้ละเอียด
71. Items เพิ่มแล้วต้อง Restart หรือไม่
ถ้าแก้
data/items.lua
โดยตรง ปกติควร Restart ox_inventory เพื่อโหลด Definitions ใหม่อย่างถูกต้อง
Production ควรทำใน Maintenance Period เพราะ Inventory เป็น Core Resource ที่ผู้เล่นใช้งานอยู่
72. Restart ox_inventory ตอนมีผู้เล่นควรระวัง
ควรระวังมาก
เพราะ Inventory เกี่ยวข้องกับ
Player Items
Stashes
Weapons
Shops
Vehicles
การ Restart กลาง Session อาจทำให้ Resources ลูกหรือ Player State อยู่ในสภาวะไม่คาดคิด
ถ้าเป็น Production ให้หยุด Serverอย่างเป็นระบบเมื่อทำ Core Update
73. Clear Cache ควรใช้เมื่อไร
Cache อาจช่วยบางปัญหา Client Asset/NUI บางกรณี
แต่ไม่ใช่คำตอบแรกของ
Wrong Framework
Missing Dependency
Version Error
SQL Error
Missing Item
UI Build Missing
เพราะ Root Cause เหล่านี้ชัดเจนกว่า
แก้ตรงจุดก่อน
74. ล้าง Cache ไม่ช่วย Item หายจาก Database
ถ้า Item หายเพราะ
Database ไม่ Save
Identifier ผิด
SQL Error
การล้าง Client Cacheไม่ได้คืนข้อมูล
ดังนั้นอย่าใช้ Cache Fix กับปัญหา Persistence
75. Server Pack เก่ากับ ox_inventory ใหม่
ต้องระวังมาก
Server Pack อาจมี
Framework เก่า
ox_lib เก่า
oxmysql เก่า
Custom Fork
Inventory Bridge เก่า
แล้วนำ ox_inventory ใหม่สุดมาทับเพียงตัวเดียว
อาจเกิด Version/API Mismatch
ควรตรวจ Stack เป็นชุด
76. อย่าผสม Official กับ Fork แบบไม่รู้ตัว
ตัวอย่าง
ox_lib จาก Fork A
oxmysql จาก Pack B
ox_inventory Official
Framework เก่า
เมื่อ Error จะยากมากที่จะรู้ว่า API ชุดไหนถูกเปลี่ยน
Production Core Dependencies ควรมี
Repository
Version
วันที่ Update
บันทึกไว้ชัดเจน
77. Update แบบ Replace ทั้ง Resource
ถ้าจะ Update
ox_inventory
ไม่ควร Copy Files ใหม่ทับ Files เก่าแบบเหลือของเดิมบางส่วน
วิธีที่ปลอดภัยกว่า
Backup Custom Config/Data
↓
หยุด Server
↓
เปลี่ยน Resource Package ให้ครบชุด
↓
นำ Custom Changes กลับอย่างควบคุม
↓
Test
ดีที่สุดคือ Custom Logic อยู่นอก Core
78. อย่าแก้ init.lua เป็น Config
Current init.lua ระบุชัดว่าไม่ใช่ Config File
ควรตั้งผ่าน
Convars
เช่น
setr inventory:framework "qbx"
setr inventory:slots 50
setr inventory:weight 30000
setr inventory:target true
การแก้ Core โดยตรงทำให้ Update ยากและสร้าง Version Drift
79. ค่า inventory:slots ผิดมีผลอย่างไร
ตัวอย่าง
setr inventory:slots 5
Player จะมี Slots น้อยมากตามค่าพื้นฐาน
อาจทำให้ AddItem ล้มเหลวบ่อย
ตรวจค่า Convars ก่อนคิดว่า Inventory มี Bug
80. inventory:weight ผิดมีผลอย่างไร
เช่นตั้ง
setr inventory:weight 3000
เท่ากับประมาณ 3 kg
Player จึงอาจถือของได้น้อยมาก
ค่า Default Example ปัจจุบันใช้
setr inventory:weight 30000
แต่ควรปรับตาม Economy ของ Server
81. Police Stash ใช้ไม่ได้
ตรวจ
setr inventory:police '["police", "sheriff"]'
หรือ Groups ที่ Server กำหนด
ถ้า Framework Job Name จริงคือ
lspd
แต่ Config ใช้
police
สิทธิ์บางระบบอาจไม่ตรง
82. Job เปลี่ยนแล้ว Inventory Permission ไม่เปลี่ยน
ถ้าใช้ Framework Bridge อย่าง Qbox Current Bridge ฟัง Group Update Events เพื่อ Update Inventory Player Groups
หาก Job/Group Resource เปลี่ยนข้อมูลโดย Direct Database โดยไม่ผ่าน Framework API อาจไม่ Trigger State Update
จึงไม่ควรแก้ Core Player Groups ผ่าน SQL ขณะ Online
83. ใช้ Framework API สำหรับ Job/Groups
แนวคิดที่ถูก
Custom Job
↓
Framework API
↓
Framework State Update
↓
ox_inventory Bridge รับ Update
ดีกว่า
UPDATE players SET job = ...
ตรง ๆ
เพราะ Runtime State อาจไม่เปลี่ยนตาม Database ทันที
84. Debug ด้วย Clean Resource Stack
ถ้าปัญหาซับซ้อน ให้สร้าง Test Server ที่มีเพียง
oxmysql
ox_lib
Framework
ox_target
ox_inventory
จากนั้นทดสอบ Inventory
ถ้าทำงานดี แปลว่าปัญหามีโอกาสอยู่ Custom Resource หรือ Migration Data
85. เปิด Custom Scripts กลับทีละตัว
หลัง Base ทำงาน
เปิด Police
↓
Test
เปิด Phone
↓
Test
เปิด Housing
↓
Test
เปิด Jobs
↓
Test
เมื่อปัญหาเกิดหลังเปิด Resource ใด จะหาต้นเหตุได้ง่ายมาก
86. อย่าลง Scripts 100 ตัวแล้ว Debug พร้อมกัน
ถ้า Server มี
Core
+
Inventory
+
100 Scripts
แล้วเปิดครั้งแรกทั้งหมด คุณอาจเห็น Error หลายร้อยบรรทัด
Workflow ที่ดีกว่า
Base
↓
Test
↓
Resource A
↓
Test
↓
Resource B
↓
Test
ช่วยลดเวลาแก้ปัญหาระยะยาว
87. Checklist เมื่อ ox_inventory ไม่ทำงาน
Resource
Folder ชื่อ
ox_inventoryไม่มี Folder ซ้อน
fxmanifest.luaอยู่ Rootใช้ Release ที่ถูกต้อง
UI Build มีครบ
Dependencies
oxmysqlStartox_libStartVersions ผ่าน Requirement
OneSync พร้อม
FXServer Build ผ่าน
Framework
Framework Start
inventory:frameworkถูกQbox ใช้
qbxESX ใช้
esx
Target
ถ้าเปิด Target
ox_targetStart ก่อนinventory:target true
Database
Connection ปกติ
Tables/Columns ตรง Framework
ไม่มี SQL Error
Identifier ถูก
Items
Item Definition มี
Weight ถูก
Stack ถูก
Name ถูก
Persistence
Reconnect แล้ว Item ยังอยู่
Restart Server แล้ว Item ยังอยู่
Stash ยังอยู่
Trunk/Glovebox ยังอยู่
88. ตาราง Error และวิธีแก้
| อาการ | สาเหตุที่ควรตรวจ | วิธีแก้ |
|---|---|---|
| Couldn't find resource | Path/Folder | วาง Resource ให้ถูกแล้ว refresh |
| ox_lib required | ox_lib ไม่พร้อม | Start/Update ox_lib |
| oxmysql version error | oxmysql เก่า | Update Dependency |
| UI has not been built | Web Build หาย | ใช้ Release หรือ Build Source |
| ox_target not loaded | Start Order | Start ox_target ก่อน |
| Inventory เปิดไม่ได้ | Client/Bridge/UI | ตรวจ F8 + Console |
| Item เพิ่มไม่ได้ | Item/Slots/Weight | ตรวจ Definition และ Capacity |
| Item หายหลังเข้าใหม่ | Persistence | ตรวจ DB/Identifier |
| Stash หาย | Database/Owner | ตรวจ ox_inventory table |
| Trunk หาย | Vehicle Bridge | ตรวจ Vehicle ID/Schema |
| Shop ซื้อไม่ได้ | Validation | ตรวจเงิน/Item/Group/License |
| Weapon Error | Inventory เก่าชน | Audit Weapon Scripts |
| SQL unknown table | Framework Config | ตรวจ inventory:framework |
89. วิธีแก้แบบเร็วที่สุด
ใช้ลำดับนี้
① Stop Custom Scripts ที่พึ่ง Inventory
② ตรวจ Folder ox_inventory
③ ตรวจ fxmanifest.lua
④ ตรวจ web/build/index.html
⑤ Start oxmysql
⑥ Start ox_lib
⑦ Start Framework
⑧ ตั้ง inventory:framework ให้ถูก
⑨ Start ox_target ถ้าใช้
⑩ Start ox_inventory
⑪ อ่าน Server Console
⑫ เข้า Server
⑬ เปิด F8
⑭ ทดสอบ Player Inventory
⑮ AddItem 1 ชิ้น
⑯ RemoveItem
⑰ Reconnect
⑱ Test Stash
⑲ Test Shop
⑳ Test Trunk
㉑ Restart Server
㉒ ตรวจ Persistence
㉓ เปิด Custom Scripts กลับทีละตัว
90. ถ้าทุกอย่างพังหลัง Update ให้ทำอย่างไร
หาก Server ทำงานปกติก่อน Update และเสียทันทีหลังเปลี่ยน Version
ตรวจว่า Update อะไร
ox_inventory?
ox_lib?
oxmysql?
Framework?
ถ้ามี Working Backup และ Production กระทบหนัก การ Rollback ไป Version ที่รู้ว่าใช้ได้อาจเหมาะสมกว่าแก้สดโดยไม่มี Test
จากนั้นจำลอง Update บน Test Server
อย่าใช้ Production เป็น Test Server
โดยเฉพาะ Inventory
เพราะข้อมูลที่เสี่ยงมี
Weapons
Rare Items
Money Items
Stashes
Businesses
Vehicle Storage
Player Inventories
Error เพียงครั้งเดียวสามารถกระทบ Economy ทั้ง Server
ควร Clone Database ไป Test Environment ก่อนเปลี่ยนระบบใหญ่
สรุป ox_inventory ไม่ทำงาน แก้อย่างไร
การแก้ ox_inventory ควรเริ่มจาก Dependency Chain
oxmysql
↓
ox_lib
↓
Framework
↓
ox_target
↓
ox_inventory
↓
Custom Scripts
Current ox_inventory ตรวจ oxmysql และ ox_lib Versions ตั้งแต่ Initialization และตรวจว่า web/build/index.html มีอยู่ก่อนเปิดระบบ หาก Dependency หรือ UI Build ไม่ผ่าน Inventory จะหยุดทำงานตั้งแต่ต้น
ถ้าใช้ Qbox ต้องตั้ง
setr inventory:framework "qbx"
และ Current Qbox Bridge ยังตรวจ Minimum Versions ของ qbx_core และ qbx_vehicles
ถ้าใช้ ESX ต้องตั้ง
setr inventory:framework "esx"
เพราะ Database Bridge ของแต่ละ Framework ใช้ Tables/Identifiers ต่างกัน เช่น ESX ใช้ users/identifier ขณะที่ Qbox ใช้ players/citizenid
ถ้า Inventory เปิดได้แต่ Item หายหลัง Reconnect ปัญหานั้นไม่ใช่เพียง UI Error อีกต่อไป ต้องตรวจ Framework Identifier, Database Save และ Persistence ก่อนเปิด Production
แนวทางของ comsiam คือให้พิสูจน์ Clean Base ด้วย Add Item → Move Slot → Stash → Trunk → Reconnect → Restart Server ก่อนลง Phone, Housing และ Jobs เพราะการเปิด UI ได้เพียงอย่างเดียวยังไม่ยืนยันว่า Inventory System ทำงานครบ
สำหรับ Existing Server comsiam แนะนำอย่า Replace Inventory เดิมแบบทันที เพราะ Official Documentation ของ ox_inventory เองเตือนว่า Frameworks ที่มี Built-in Item, Inventory หรือ Weapon Systems มีโอกาสเกิด Compatibility Problems การ Audit Scripts ที่เรียก Inventory เดิมจึงเป็นขั้นตอนสำคัญพอ ๆ กับการติดตั้ง Resource
Comments
Post a Comment