Extending Framework

ภาพรวมแนวทางขยาย NC Core ด้วย Player Class Functions, Modules และ Functions พร้อมลิงก์ไปยังหน้ารายละเอียด

Extending Framework

NC Core รองรับการขยายความสามารถแบบ “เพิ่มไฟล์ใหม่” โดยไม่แก้ไฟล์หลัก

แนวทางนี้ช่วยลดความเสี่ยงเวลาต้องอัปเดต Framework และทำให้ดูแลโค้ดง่ายขึ้น

circle-check

เลือกแนวทางให้เหมาะกับงาน

Player Class Functions

เพิ่ม Method ให้ xPlayer เช่น xPlayer.addExperience() ใช้ได้เฉพาะฝั่ง Server และ โหลดอัตโนมัติ (ไม่ต้องเปิดใน config)

Modules

ฟังก์ชันเสริมที่แยกตามฝั่ง client/server/shared เปิด/ปิดได้ใน config/config.modules.lua

Functions

ฟังก์ชันส่วนกลางของ Framework (ESX.*) เปิด/ปิดได้ใน config/config.functions.lua

โครงสร้างโฟลเดอร์

  • Player Class Functions: server/classes/player/functions/

  • Modules: modules/client/, modules/server/, modules/shared/

  • Functions: functions/client/, functions/server/, functions/shared/

Quick start

1

เลือกประเภทการขยาย

  • ถ้าต้องการเรียกผ่าน xPlayer.* ให้ใช้ Player Class Functions

  • ถ้าต้องการเรียกผ่าน ESX.* ให้ใช้ Modules หรือ Functions

2

สร้างไฟล์ และตั้งชื่อให้ตรงกับสิ่งที่จะเรียก

  • Player Class Functions: ชื่อไฟล์ = ชื่อ Method (เช่น addExperience.lua)

  • Modules/Functions: ชื่อไฟล์ PascalCase (เช่น ShowCustomNotification.lua)

3

เปิดใช้งาน และทดสอบ

  • Player Class Functions: ทดสอบได้ทันทีหลัง restart resource

  • Modules: เพิ่มรายการใน config/config.modules.lua

  • Functions: เพิ่มรายการใน config/config.functions.lua

อ่านต่อ (หน้ารายละเอียด)

หัวข้อที่มักใช้ร่วมกัน

chevron-rightChecklist (สรุป)hashtag

Player Class Functions

Modules

Functions

chevron-rightเนื้อหาเพิ่มเติม (ตัวอย่างและรายละเอียดแบบเต็ม)hashtag

เกี่ยวกับ Player Class Functions

Player Class Functions คือฟังก์ชันที่ทำงานกับ xPlayer object โดยตรง ใช้งานเฉพาะฝั่ง Server-side เท่านั้น

  • 📁 ตำแหน่ง: server/classes/player/functions/

  • ⚙️ Config: ไม่ต้องระบุใน config (โหลดอัตโนมัติ)

  • 🎯 จุดประสงค์: เพิ่มฟังก์ชันใหม่ให้ xPlayer object

โครงสร้างพื้นฐาน

ตัวอย่างที่ 1: ฟังก์ชันเพิ่มแต้มประสบการณ์

ไฟล์: server/classes/player/functions/addExperience.lua

วิธีเรียกใช้งาน:

ตัวอย่างที่ 2: ฟังก์ชันตรวจสอบระยะห่าง

ไฟล์: server/classes/player/functions/isNearPlayer.lua

วิธีเรียกใช้งาน:

ตัวอย่างที่ 3: ฟังก์ชันจัดการสกิล

ไฟล์: server/classes/player/functions/addSkillExp.lua

ไฟล์: server/classes/player/functions/getSkillLevel.lua

วิธีเรียกใช้งาน:


2. Modules (โมดูลเสริม)

เกี่ยวกับ Modules

Modules คือฟังก์ชันเสริมที่ทำงานอิสระ สามารถสร้างได้ทั้งฝั่ง Client และ Server

  • 📁 ตำแหน่ง: modules/client/ หรือ modules/server/ หรือ modules/shared/

  • ⚙️ Config: ต้องระบุใน config/config.modules.lua

  • 🎯 จุดประสงค์: เพิ่มฟังก์ชันเสริมที่ใช้งานทั่วไป

โครงสร้างพื้นฐาน

ขั้นตอนการเพิ่ม Module

circle-info

ตัวอย่างที่อัปเดตและอ่านง่ายกว่าอยู่ในหน้า Extending Modules


ตัวอย่าง Server Module

ไฟล์: modules/server/BroadcastToJob.lua

เพิ่มใน Config:

วิธีใช้งาน:


ตัวอย่าง Shared Module

ไฟล์: modules/shared/CalculateDistance3D.lua

เพิ่มใน Config:

วิธีใช้งาน:


3. Functions (ฟังก์ชันหลัก)

เกี่ยวกับ Functions

Functions คือฟังก์ชันหลักของ NC Core ที่ใช้งานทั่วไป แยกตามฝั่ง Client, Server และ Shared

  • 📁 ตำแหน่ง: functions/client/ หรือ functions/server/ หรือ functions/shared/

  • ⚙️ Config: ต้องระบุใน config/config.functions.lua

  • 🎯 จุดประสงค์: ฟังก์ชันหลักที่ใช้บ่อย

circle-info

ความแตกต่างระหว่าง Modules และ Functions:

  • Modules = ฟังก์ชันเสริมเพิ่มเติม

  • Functions = ฟังก์ชันหลักของ Framework

ในทางปฏิบัติ ทั้งสองทำงานคล้ายกัน แต่แยกเพื่อความเป็นระเบียบ

ขั้นตอนการเพิ่ม Function

ตัวอย่าง Client Function

ไฟล์: functions/client/PlayAnimationSync.lua

เพิ่มใน Config:

วิธีใช้งาน:


ตัวอย่าง Server Function

ไฟล์: functions/server/GetPlayersInRadius.lua

เพิ่มใน Config:

วิธีใช้งาน:


สรุปและ Best Practices

ตารางเปรียบเทียบ

ประเภท
ตำแหน่ง
Config
Object Context
Use Case

Player Class

server/classes/player/functions/

❌ ไม่ต้อง

player (xPlayer)

ฟังก์ชันเฉพาะผู้เล่น

Modules

modules/*/

config.modules.lua

ไม่มี

ฟังก์ชันเสริมทั่วไป

Functions

functions/*/

config.functions.lua

ไม่มี

ฟังก์ชันหลักของ Framework

คำแนะนำการเลือกใช้

ใช้ Player Class Functions เมื่อ:

  • ✅ ต้องการเพิ่มฟังก์ชันให้ xPlayer object

  • ✅ ทำงานเฉพาะผู้เล่นคนหนึ่ง

  • ✅ ต้องการเรียกผ่าน xPlayer.yourFunction()

ใช้ Modules เมื่อ:

  • ✅ ฟังก์ชันเสริมที่ไม่เกี่ยวกับผู้เล่นโดยตรง

  • ✅ เป็นเครื่องมือหรือ utility ทั่วไป

  • ✅ ต้องการเปิด/ปิดได้ผ่าน config

ใช้ Functions เมื่อ:

  • ✅ เป็นฟังก์ชันหลักที่สำคัญต่อ Framework

  • ✅ ใช้งานบ่อยมากและทั่วทั้งระบบ

  • ✅ เป็นส่วนขยายของ Framework หลัก

การตั้งชื่อ

การเขียน Comment

การ Return ค่า

การตรวจสอบ Parameters


4. Transaction System

เกี่ยวกับ Transaction

Transaction คือระบบที่ใช้ในการทำหลายๆ การเปลี่ยนแปลง (เงิน/Item/อาวุธ) พร้อมกันในครั้งเดียว แทนการเรียกฟังก์ชันทีละตัว

circle-check

เปรียบเทียบวิธีการ

❌ แบบเดิม (ไม่แนะนำ)

✅ แบบใหม่ (แนะนำ) - Transaction


xPlayer.transaction() - Player Transaction

ใช้สำหรับทำหลายๆ การเปลี่ยนแปลงกับผู้เล่น 1 คน พร้อมกัน

Syntax:

Parameters:

  • transactions (table): Array ของ transaction objects

    • name (string): ชื่อฟังก์ชัน (addMoney, removeMoney, addInventoryItem, etc.)

    • values (table): Array ของ parameters

ฟังก์ชันที่รองรับ:

  • addMoney / removeMoney

  • addAccountMoney / removeAccountMoney

  • addInventoryItem / removeInventoryItem

  • addWeapon / removeWeapon

  • setJob / setJob2

  • setMeta


ตัวอย่างที่ 1: ระบบให้รางวัลภารกิจ (แบบง่าย)


ESX.Transaction() - Multi-Player Transaction

ใช้สำหรับทำการเปลี่ยนแปลงกับ หลายคน พร้อมกัน

Syntax:

Parameters:

  • playerTransactions (table): Object ที่มี key เป็น source/identifier ของผู้เล่น


ตัวอย่างที่ 5: ระบบแลกเปลี่ยนระหว่างผู้เล่น


สรุปความแตกต่าง

Feature
xPlayer.transaction()
ESX.Transaction()

ผู้เล่น

1 คน

หลายคน

Use Case

ให้รางวัล, ซื้อของ, คราฟ

แลกเปลี่ยน, แจกของหลายคน

Performance

⚡ เร็ว (save 1 คน)

⚡⚡ เร็วมาก (save หลายคนพร้อมกัน)

Rollback

✅ ถ้าล้มเหลว rollback

✅ ถ้าล้มเหลว rollback ทุกคน

circle-exclamation

5. Performance Optimization - เรียกค่าโดยตรง

ปัญหา: เรียกฟังก์ชัน Reference ซ้ำซ้อน

triangle-exclamation

Auto-Filter จาก imports.lua

เมื่อใช้งาน NC Core มี 2 รูปแบบ:

1. ใช้ imports.lua (แนะนำ) - มี Auto-Filter

ไฟล์: fxmanifest.lua

ผลลัพธ์: เมื่อใช้ imports.lua จะส่งข้อมูลพื้นฐานของ xPlayer และโหลดฟังก์ชันตามที่เรียกใช้จริง (Auto-Filter)

circle-check

2. ไม่ใช้ imports.lua - ไม่มี Auto-Filter

ถ้าไม่ใส่ @es_extended/imports.lua ใน fxmanifest จะได้ xPlayer ที่มี function references ทั้งหมด ส่งผลให้ข้อมูลใหญ่และช้าลง

circle-exclamation

เปรียบเทียบการเข้าถึงข้อมูล

ข้อมูล
❌ ช้า (เรียก Function)
✅ เร็ว (เข้าถึงโดยตรง)

ชื่อ

xPlayer.getName()

xPlayer.name

อาชีพ

xPlayer.getJob()

xPlayer.job

เงิน

xPlayer.getAccount('bank').money

xPlayer.accounts.bank

Item

xPlayer.getInventoryItem('bread').count

xPlayer.inventory.bread


ตัวอย่างการ Optimize

❌ แบบเดิม (ช้า - เรียก function ซ้ำซ้อน)

✅ แบบใหม่ (เร็ว - เข้าถึงโดยตรง)


รายการ Properties ที่เข้าถึงได้โดยตรง


Best Practices

  • เข้าถึงโดยตรงเสมอ (ถ้าเป็นไปได้)

  • Cache ค่าที่ใช้ซ้ำๆ

  • ใช้ @es_extended/imports.lua เสมอ

  • ถ้าไม่ใช้ imports.lua ให้สร้าง object ใหม่ที่มีเฉพาะข้อมูลที่ต้องการส่งไป client

circle-check

6. Status System (Client-Side)

เกี่ยวกับ Status System

Status System คือระบบจัดการสถานะต่างๆ ของผู้เล่น เช่น ความหิว (hunger) และ ความเครียด (stress) ที่มีการอัพเดตแบบ Real-time

circle-info

Status System ทำงานเฉพาะฝั่ง Client เท่านั้น เพื่อประสิทธิภาพและความลื่นไหล

  • ✅ อัพเดตทุกๆ วินาที (ตาม config.status.lua)

  • ✅ Sync กับ Server เมื่อมีการเปลี่ยนแปลงสำคัญ

  • ✅ รองรับการ Freeze/Unfreeze


รายละเอียดของ Status System, ฟังก์ชันหลัก, ตัวอย่างการใช้งาน (ดึงข้อมูล, HUD, Event, Freeze, ส่งข้อมูลไป Server) และ Config (config.status.lua) ถูกระบุไว้ในเนื้อหาเดิมด้านล่าง ซึ่งคุณสามารถคัดลอกไปใช้ได้ตามต้องการ (เนื้อหาเต็มประกอบด้วยตัวอย่างโค้ดและ Best Practices สำหรับการใช้งาน status system แบบ client-side)

circle-check

7. Event System (Client-Side)

เกี่ยวกับ Event System

Event System คือระบบ Listener ที่ ฟังการเปลี่ยนแปลง ของค่าต่างๆ ใน NC Core โดยอัตโนมัติ โดยไม่ต้องใช้ Loop ตรวจสอบ

circle-info

ข้อดีของ Event System:

  • ประหยัด Performance - ไม่ต้อง Loop ตรวจสอบทุกวินาที

  • 🎯 ทำงานทันที - เมื่อมีการเปลี่ยนแปลงเท่านั้น

  • 🔄 ทำงานเมื่อรีสคริปต์ - เหมาะสำหรับ Development

  • เรียกครั้งแรกเสมอ - ไม่ต้องกังวลว่าพลาด


เนื้อหาเกี่ยวกับการใช้งาน ESX.on, ตัวอย่างการใช้ ESX.on('PlayerLoaded') และ ESX.on('PlayerReady'), ตัวอย่าง Initialize HUD/Blips/Markers, Resource Start/Restart, Debug & Logging, เปรียบเทียบ PlayerLoaded vs PlayerReady และ Best Practices ถูกจัดวางเป็นตัวอย่างโค้ดและคำอธิบายในเนื้อหาต้นฉบับที่ส่งมา คุณสามารถนำโค้ดตัวอย่างเหล่านั้นไปใช้หรือปรับแต่งตามความต้องการได้

circle-check

Checklist การเพิ่มฟังก์ชัน (ซ้ำ)

Player Class Functions

Modules

Functions


circle-check

Last updated