AFU.Status เป็นระบบจัดการสถานะของผู้เล่น เช่น ความหิว ความกระหาย ความเครียด หรือค่าอื่นๆ ที่ต้องการติดตาม โดยมีประสิทธิภาพสูงและปรับแต่งได้ตามต้องการ
Performance (ประสิทธิภาพ):
Client: 0.00 ~ 0.01 ms
(หากเปิดใช้ UI จะเป็น 0.00 ~ 0.06 ms
)
ความสามารถหลัก (Core Features)
🔄 ระบบสถานะแบบไดนามิก (Dynamic Status System)
กำหนดสถานะได้ไม่จำกัด - สามารถเพิ่มสถานะใหม่ได้ง่ายๆ เช่น ความหิว, ความกระหาย, ความเครียด, ความสุข ฯลฯ
ลดค่าตามเวลา - สถานะแต่ละประเภทจะลดลงอัตโนมัติตามเวลาที่กำหนด
บันทึกค่าอัตโนมัติ - บันทึกสถานะทั้งหมดลงฐานข้อมูลเมื่อผู้เล่นออกจากเซิร์ฟเวอร์
กำหนดเงื่อนไขผลกระทบ - เช่น เมื่อความหิวน้อยกว่า 20% จะเริ่มลดเลือด
🍔 ระบบอาหารและเครื่องดื่ม (Food and Drink System)
กำหนดไอเทมอาหารหลากหลาย - สามารถเพิ่มอาหารและเครื่องดื่มได้ไม่จำกัด
ผลกระทบหลายสถานะ - อาหาร 1 ชิ้นสามารถมีผลกระทบกับหลายสถานะพร้อมกัน
แอนิเมชันแบบกำหนดเอง - แอนิเมชันการกินอาหารแต่ละประเภทแตกต่างกัน
พร็อพประกอบการกิน - แสดงโมเดลอาหารในมือขณะกิน
กำหนดพื้นที่สำหรับกินอาหาร - อาหารบางชนิดกินได้เฉพาะในพื้นที่ที่กำหนด
จำกัดอาชีพการกินอาหาร - อาหารบางประเภทให้เฉพาะอาชีพที่กำหนด
🌈 ระบบ Free Zone (Free Zone System)
โซนพิเศษไม่มีผลกระทบ - กำหนดพื้นที่พิเศษที่สถานะต่างๆ จะไม่มีผลกระทบต่อผู้เล่น
กำหนดสถานะอิสระได้ - เลือกได้ว่าสถานะใดบ้างที่จะไม่ส่งผลกระทบในโซนนี้ เช่น ไม่หิว ไม่เครียด
รองรับหลายโซน - สามารถกำหนดได้หลายโซนในแผนที่
ระบบการตรวจจับอัตโนมัติ - ระบบจะตรวจจับเมื่อผู้เล่นเข้า-ออกพื้นที่ Free Zone โดยอัตโนมัติ
โหมดดีบัก - มีโหมดดีบักแสดงขอบเขตของ Free Zone เพื่อช่วยในการตั้งค่า
👑 ระบบสิทธิพิเศษ (Privilege System)
สิทธิพิเศษแอดมิน - แอดมินมีสิทธิ์พิเศษสามารถกินอาหารได้ทุกประเภท ไม่ลดค่าสถานะ
สิทธิพิเศษ VIP - ผู้เล่น VIP ได้รับสิทธิประโยชน์บางอย่าง เช่น สถานะลดช้ากว่าผู้เล่นทั่วไป
ระบบตรวจสอบสิทธิ์ - ตรวจสอบสิทธิ์ผู้เล่นแต่ละประเภทอัตโนมัติ
🛡️ ระบบความปลอดภัย (Security System)
ตรวจสอบการโกง - ป้องกันการโกงด้วยระบบตรวจสอบระยะเวลาในการกินอาหาร
บันทึกกิจกรรมผู้เล่น - บันทึกประวัติการใช้อาหารและการเปลี่ยนแปลงสถานะ
ตรวจสอบค่าผิดปกติ - ระบบตรวจสอบค่าสถานะที่ผิดปกติ
🖥️ ระบบ UI (User Interface)
UI แบบติดตัว - แสดงค่าสถานะแบบบาร์ด้านข้างหน้าจอ
ปรับแต่งได้ - สามารถเปิด/ปิด UI หรือใช้ UI ของตัวเองได้ โดยนำ exports ไปใช้งาน
การแจ้งเตือน - แจ้งเตือนเมื่อค่าสถานะเปลี่ยนแปลงผ่าน AFU.Notify
ดึงข้อมูลสำหรับ UI แบบกำหนดเอง - สามารถใช้ exports["AFU.Status"]:getSharedObject() เพื่อดึงข้อมูลสำหรับสร้าง UI แบบกำหนดเอง
ตัวอย่างการใช้ getSharedObject สำหรับ UI แบบกำหนดเอง
Copy -- ดึงข้อมูล Object หลักของระบบสถานะ
local afuStatus = exports["AFU.Status"]:getSharedObject()
-- ตัวอย่างการนำไปใช้สร้าง UI แบบกำหนดเอง
Citizen.CreateThread(function()
while true do
Citizen.Wait(500) -- อัพเดททุก 500ms
-- ดึงข้อมูลสถานะปัจจุบัน
local hungerStatus = afuStatus.GetPlayerStatus("hunger")
local happinessStatus = afuStatus.GetPlayerStatus("happiness")
if hungerStatus and happinessStatus then
-- คำนวณเปอร์เซ็นต์
local hungerPercent = hungerStatus.getPercent()
local happinessPercent = happinessStatus.getPercent()
-- ส่งข้อมูลไปยัง NUI (UI ที่สร้างเอง)
SendNUIMessage({
type = "updateStatus",
hunger = hungerPercent,
happiness = happinessPercent,
hungerLabel = hungerStatus.label,
happinessLabel = happinessStatus.label
})
end
end
end)
🔧 การปรับแต่ง (Advanced Customization)
API ครบถ้วน - มี API สำหรับดึงข้อมูลสถานะและจัดการค่าต่างๆ
เหตุการณ์ (Events) - รองรับ Events ต่างๆ เมื่อค่าสถานะเปลี่ยนแปลง
กำหนด Callback - สามารถกำหนดฟังก์ชันที่จะทำงานเมื่อสถานะถึงค่าที่กำหนด
ตัวอย่างการใช้งาน (Usage Examples)
การเพิ่มสถานะใหม่ (Adding New Status)
เพิ่มสถานะใหม่ได้ง่ายๆ ผ่านไฟล์ config/core/status.lua
ตัวอย่างเช่น:
Copy {
Name = "energy",
Label = "พลังงาน",
Icon = 'assets/EnergyIcon.svg',
Default = 500,
Max = 1000,
Tick = {
Every = 2 * Time.Minute,
Value = -25,
onTick = function(status)
if status.value <= 100 then
-- แสดงเอฟเฟกต์เมื่อพลังงานต่ำ
end
end
}
}
การเพิ่มอาหารใหม่ (Adding New Food)
เพิ่มอาหารหรือเครื่องดื่มใหม่ได้ผ่านไฟล์ config/core/foods.lua
:
Copy ["coffee"] = {
status = {
{
name = "energy",
value = 150
},
{
name = "thirst",
value = -50
}
},
restrictJobs = {},
anim = {
flag = 49,
dict = 'mp_player_intdrink',
clip = 'loop_bottle',
duration = 4 * Time.Second
},
prop = {
model = "p_amb_coffeecup_01",
bone = 18905,
pos = vector3(0.13, 0.02, 0.08),
rot = vector3(270.0, 0.0, 0.0)
}
}
การตั้งค่าสิทธิพิเศษ (Options Usage)
ระบบสิทธิพิเศษช่วยให้คุณสามารถกำหนดสิทธิ์พิเศษให้กับผู้เล่นบางประเภท เช่น แอดมิน หรือ VIP ได้ผ่านไฟล์ config/core/options.lua
ตัวอย่างที่ 1: การกำหนดสิทธิพิเศษใหม่
คุณสามารถเพิ่มประเภทสิทธิพิเศษใหม่ เช่น สิทธิพิเศษสำหรับตำรวจ:
Copy OptionsEnum = {
ByPassAdmin = 1,
ByPassVIP = 2,
ByPassPolice = 3, -- เพิ่มสิทธิพิเศษสำหรับตำรวจ
}
OptionPresets = {
-- การตั้งค่าที่มีอยู่...
[OptionsEnum.ByPassPolice] = {
Options = {
["IgnoreEatRestrictArea"] = true, -- ตำรวจสามารถกินอาหารได้ทุกที่
["IgnoreJobEatFood"] = false, -- ตำรวจไม่สามารถกินอาหารที่จำกัดสำหรับอาชีพอื่น
["Immortality"] = false, -- ตำรวจไม่เป็นอมตะ
},
GetDefaultTickValueUpdate = function(source)
return -30 -- ลดค่าสถานะช้ากว่าปกติ 30%
end,
CheckAllow = function(source)
local xPlayer = ESX.GetPlayerFromId(source)
if not xPlayer then return false end
return xPlayer.job.name == 'police' -- ตรวจสอบว่าเป็นตำรวจหรือไม่
end
}
}
ตัวอย่างที่ 2: การใช้สิทธิพิเศษกับสถานะ
สามารถกำหนดสิทธิพิเศษใดบ้างที่จะมีผลกับสถานะแต่ละประเภท:
Copy -- ในไฟล์ config/core/status.lua
{
Name = "stress",
Label = "ความเครียด",
Icon = 'assets/StressIcon.svg',
Default = 0,
Max = 1000,
Tick = {
Every = 30 * Time.Second,
Value = 10, -- เพิ่มความเครียดขึ้นเรื่อยๆ
onTick = function(status)
-- โค้ดเมื่อมีการอัพเดทค่า
end
},
UseOptionPresets = {
OptionsEnum.ByPassAdmin, -- แอดมินไม่มีความเครียด
OptionsEnum.ByPassPolice, -- ตำรวจมีความเครียดน้อยกว่าปกติ
}
}
ตัวอย่างที่ 3: การตรวจสอบไอเทม VIP
สามารถกำหนดไอเทมพิเศษที่ใช้ตรวจสอบสถานะ VIP:
Copy [OptionsEnum.ByPassVIP] = {
Options = {
["IgnoreEatRestrictArea"] = true,
["IgnoreJobEatFood"] = false,
["Immortality"] = false,
},
GetDefaultTickValueUpdate = function(source)
return -50
end,
CheckAllow = function(source)
local xPlayer = ESX.GetPlayerFromId(source)
if not xPlayer then return false end
-- ตรวจสอบหลายไอเทม VIP
local vipItems = {'vip_card', 'premium_card', 'gold_membership'}
for _, itemName in ipairs(vipItems) do
local item = xPlayer.getInventoryItem(itemName)
if item and item.count > 0 then
return true
end
end
return false
end
}
ตัวอย่างที่ 4: การปรับแต่งตัวเลือกพิเศษ
คุณสามารถเพิ่มตัวเลือกพิเศษใหม่ได้:
Copy [OptionsEnum.ByPassAdmin] = {
Options = {
["IgnoreEatRestrictArea"] = true, -- อนุญาติให้กินอาหารที่ไหนก็ได้ (Allow eating food anywhere)
["IgnoreJobEatFood"] = true, -- อนุญาติให้กินอาหารได้หมดไม่สนตั้งค่าอาชีพ (Allow eating any food regardless of job restrictions)
["Immortality"] = true, -- เป็นพระเจ้าค่าสถานะไม่ลดเลย (God mode - status values never decrease)
},
-- ส่วนอื่นๆ...
}
ตัวอย่างที่ 5: การใช้ตรวจสอบในโค้ด
ตัวอย่างการตรวจสอบสิทธิพิเศษในโค้ด:
Copy -- ตรวจสอบว่าผู้เล่นมีสิทธิพิเศษ VIP หรือไม่
-- Server
local serverHasVIPPrivilege = exports['AFU.Status']:hasOption(source, OptionsEnum.ByPassVIP)
-- Client
local hasVIPPrivilege = exports['AFU.Status']:hasOption(OptionsEnum.ByPassVIP)
-- ตรวจสอบสิทธิพิเศษเฉพาะอย่าง
-- Server
local sourceIsImmortal = exports['AFU.Status']:hasSpecificOption(source, "Immortality")
-- Client
local isImmortal = exports['AFU.Status']:hasSpecificOption("Immortality")
-- ตัวอย่างการใช้ในเงื่อนไข
if isImmortal then
-- ผู้เล่นเป็นอมตะ ไม่ต้องเสียเลือด
else
-- ผู้เล่นไม่มีสิทธิพิเศษ ใช้กฎปกติ
-- Server
TriggerClientEvent('esx:showNotification', source, 'คุณไม่มีสิทธิพิเศษนี้')
-- Client
TriggerEvent('esx:showNotification', 'คุณไม่มีสิทธิพิเศษนี้')
end