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

  • oxmysql Start

  • ox_lib Start

  • Versions ผ่าน Requirement

  • OneSync พร้อม

  • FXServer Build ผ่าน

Framework

  • Framework Start

  • inventory:framework ถูก

  • Qbox ใช้ qbx

  • ESX ใช้ esx

Target

ถ้าเปิด Target

  • ox_target Start ก่อน

  • 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 resourcePath/Folderวาง Resource ให้ถูกแล้ว refresh
ox_lib requiredox_lib ไม่พร้อมStart/Update ox_lib
oxmysql version erroroxmysql เก่าUpdate Dependency
UI has not been builtWeb Build หายใช้ Release หรือ Build Source
ox_target not loadedStart OrderStart 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 ErrorInventory เก่าชนAudit Weapon Scripts
SQL unknown tableFramework 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

Popular posts from this blog

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

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

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