Framework usage

วิธีนำ NC Core ไปใช้ใน resource ของคุณ พร้อมข้อควรระวังเรื่องลำดับ ensure และ performance

วิธีการใช้งาน Framework

หน้านี้อธิบายวิธีนำ NC Core ไปใช้งานในทรัพยากร (resource) ของคุณ

เนื้อหาเน้นการเรียกใช้ ESX ให้ถูกลำดับ และลดความเสี่ยงเรื่องการโหลดไม่ทัน

ข้อกำหนดด้านลำดับการโหลด

ต้อง ensure es_extended ก่อน resource ใด ๆ ที่เรียกใช้งาน Framework เสมอ

circle-exclamation

ตัวอย่างลำดับที่แนะนำใน server.cfg:

ensure es_extended

# resource อื่น ๆ ที่เรียกใช้งาน Framework ต้องอยู่หลังจากนี้
ensure my_resource
ensure my_resource_2

เลือกวิธีนำ Framework ไปใช้

  1. ใช้ @es_extended/imports.lua (แนะนำสำหรับ resource ใหม่)

  2. ใช้ TriggerEvent('esx:getSharedObject', ...) (รองรับ resource เก่า)

  3. ใช้ exports['es_extended']:getSharedObject() (รองรับ resource เก่า)

circle-info

หากเป้าหมายคือความเสถียรและประสิทธิภาพ ให้เริ่มจาก @es_extended/imports.lua

วิธีที่ 1: ใช้ @es_extended/imports.lua (แนะนำ)

ข้อดีของการใช้ imports.lua

1. แต่ละ Resource มี Instance ของตัวเอง

เมื่อใช้ @es_extended/imports.lua แต่ละ resource จะได้ ESX instance แยกกัน

ไม่เหมือนการใช้ TriggerEvent หรือ exports ที่ทุก resource ชี้ไปที่ instance เดียวกัน

2. ลดปัญหา "คอขวด" ที่ es_extended

การใช้ ESX.RegisterServerCallback และ ESX.TriggerClientCallback จากแต่ละ resource:

  • วิธีเดิม (TriggerEvent/exports): Callback ทุกตัวรวมศูนย์ที่ es_extended → เกิดคิวรอและ bottleneck

  • วิธีใหม่ (imports.lua): Callback แยกทำงานใน resource ของตัวเอง → ไม่มีการรอคิว ทำงานได้ทันที

3. ไม่ต้องเขียนโค้ดรอโหลด

ไม่ต้องมี while ESX == nil do Wait(0) end หรือ callback function

Framework พร้อมใช้ทันทีที่ resource เริ่มทำงาน

4. เหมาะกับ Server ที่มีผู้เล่นเยอะ

ยิ่ง resource มีการใช้ Callback บ่อย ยิ่งเห็นความแตกต่างชัดเจน

ระบบจะไม่ค้างหรือช้าเมื่อหลาย resource เรียก Callback พร้อมกัน

กรณีการใช้งาน

  • สร้าง resource ใหม่

  • ปรับปรุง (refactor) resource เดิม

  • ต้องการลดปัญหาเรื่องการโหลดไม่ทัน และลดโค้ดซ้ำซ้อน

ตั้งค่าใน fxmanifest.lua

เลือก 1 รูปแบบให้เหมาะกับ resource ของคุณ:

หรือแยกตามฝั่งที่ใช้งาน:

circle-info

แนะนำให้ระบุ imports.lua เฉพาะฝั่งที่มีการใช้งานจริง หาก resource ใช้งาน ESX ทั้ง Client และ Server ค่อยใช้ shared_script

การใช้งานตัวแปร NCCore/ESX หลังจาก import

เมื่อ import @es_extended/imports.lua แล้ว สามารถใช้งานตัวแปร NCCore หรือ ESX ได้ทันที

circle-info

ชื่อตัวแปรสามารถปรับเปลี่ยนได้ผ่าน Config ของ NC Core

ใช้งาน ESX.on สำหรับรอการโหลดผู้เล่น (Client)

NC Core มี ESX.on function ที่ช่วยลดโค้ดซ้ำซ้อนในการรอผู้เล่นโหลด

circle-check
chevron-rightตัวอย่าง (ขยายดู)hashtag

วิธีที่ 2: ใช้ TriggerEvent('esx:getSharedObject', ...)

กรณีการใช้งาน (วิธีที่ 2)

  • ต้องการคงโครงสร้าง resource เดิมเพื่อความเข้ากันได้

  • มีโค้ดเดิมที่อิงรูปแบบการดึง ESX ด้วย trigger

ตั้งค่าด้วย TriggerEvent

ฝั่ง Server:

ฝั่ง Client:

circle-exclamation
chevron-rightตัวอย่างการกำหนด filter (ขยายดู)hashtag

วิธีที่ 3: ใช้ exports['es_extended']:getSharedObject()

กรณีการใช้งาน (วิธีที่ 3)

  • ต้องการคงโครงสร้าง resource เดิม

  • ใช้ exports เป็นมาตรฐานภายในโปรเจกต์อยู่แล้ว

ตั้งค่าด้วย Exports

circle-exclamation
circle-exclamation

การกำหนด Filter สำหรับ ESX.GetPlayerFromId() (สำหรับวิธีที่ 2 และ 3)

การกำหนด filter คือการระบุ “คุณจะเรียก/แตะอะไรบน xPlayer บ้าง” ในแต่ละจุดที่เรียก ESX.GetPlayerFromId()

แนวทางนี้ช่วยลดภาระด้านหน่วยความจำ และทำให้พฤติกรรมของโค้ดชัดเจน

รายการ filter ที่ใช้บ่อย

circle-info

แนวทางที่แนะนำคือ “ใส่เท่าที่เรียกจริง” ตัวอย่าง: ระบบร้านค้าใส่แค่ getMoney/removeMoney/addInventoryItem

เปิด debug เพื่อช่วยตรวจการใช้งาน

chevron-rightภาคผนวก: ตัวอย่างเพิ่มเติม (ขยายดู)hashtag

ตัวอย่าง: filter สำหรับระบบร้านค้า

ตัวอย่าง: filter สำหรับตรวจสอบอาชีพ


Event Callbacks ของ NC Core

NC Core มี Event Callbacks ที่ช่วยให้ resource ของคุณรับรู้เมื่อมีการเปลี่ยนแปลงสำคัญ

OnPlayerData

เรียกเมื่อมีการเปลี่ยนแปลงค่าใน ESX.PlayerData (ฝั่ง Client)

OnUpdateOnlineCount

เรียกเมื่อจำนวนผู้เล่น Online เปลี่ยนแปลง (ทั้งฝั่ง Server และ Client)

OnUpdateJobCount

เรียกเมื่อจำนวนผู้เล่นในอาชีพเปลี่ยนแปลง (ทั้งฝั่ง Server และ Client)

OnUpdateGroupCount

เรียกเมื่อจำนวนผู้เล่นใน Permission Group เปลี่ยนแปลง (ทั้งฝั่ง Server และ Client)

circle-info

Event Callbacks เหล่านี้เหมาะสำหรับอัปเดต UI/HUD แบบ Real-time สำหรับการดึงข้อมูลแบบครั้งเดียว ใช้ ESX.CountOnline(), ESX.CountJob(), ESX.CountGroup() แทน

อ่านเพิ่มเติม: Common (Count Functions)

circle-exclamation

Support

ติดต่อทีมงานผ่าน Ticket บน Discord ทางการ

circle-info

เพื่อความเร็ว โปรดแนบรูปภาพ ตอนบูตเซิร์ฟเวอร์ + error ที่พบ (Server console/F8)

Last updated