OneSync และ Entity System — FiveM Large Server Guide
OneSync และ Entity System
OneSync คือ networking technology ของ FiveM ที่ทำให้ server รองรับผู้เล่นได้มากกว่า 32 คน (ถึง 1024 คน) โดยใช้ server-side entity management
OneSync คืออะไร?
ในโหมดปกติ GTA V sync entities ผ่าน peer-to-peer OneSync เปลี่ยนมาใช้ server เป็นศูนย์กลาง:
ปกติ: Player A <--> Player B (peer-to-peer)
OneSync: Player A --> Server --> Player B
เปิด OneSync
# server.cfg
set onesync on
# หรือ
set onesync legacy # สำหรับ compatibility mode
Entity Ownership
ใน OneSync ทุก entity (vehicle, ped, object) มี owner — client ที่ควบคุม entity นั้น
-- ตรวจสอบว่าเราเป็น owner ของ entity ไหม
local function IsEntityOwner(entity)
return NetworkGetEntityOwner(entity) == PlayerId()
end
-- รอให้ ownership transfer มาก่อนทำอะไร
local function WaitForOwnership(entity, timeout)
local start = GetGameTimer()
while NetworkGetEntityOwner(entity) ~= PlayerId() do
if GetGameTimer() - start > (timeout or 5000) then
return false
end
Citizen.Wait(100)
end
return true
end
State Bags — Share Data ระหว่าง Clients
State Bags คือ feature ที่ทำให้ entity/player มี shared state ที่ทุกคนเห็นได้
-- กำหนด state ให้ entity
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
Entity(vehicle).state.fuel = 80.0
Entity(vehicle).state.locked = false
Entity(vehicle).state.ownerName = 'M2Dev'
-- อ่าน state
local fuel = Entity(vehicle).state.fuel
local isLocked = Entity(vehicle).state.locked
-- State ของ player
LocalPlayer.state.isOnDuty = true
LocalPlayer.state.job = 'police'
-- อ่าน state ของ player อื่น
local targetState = Player(targetPlayerId).state
print(targetState.job)
State Bag Change Handler
-- ตรวจจับเมื่อ state เปลี่ยน
AddStateBagChangeHandler('fuel', nil, function(bagName, key, value, reserved, replicated)
-- bagName = 'entity:N' หรือ 'player:N'
print(bagName .. ' fuel changed to: ' .. tostring(value))
end)
-- เฉพาะ entity
AddStateBagChangeHandler('locked', 'entity:' .. NetworkGetNetworkIdFromEntity(myVehicle),
function(bagName, key, value)
if value then
LockVehicle()
else
UnlockVehicle()
end
end
)
Server-Side Entity Creation
ใน OneSync แนะนำให้สร้าง entities ฝั่ง server:
-- server.lua
local function CreateServerVehicle(model, coords, heading)
local vehicle = CreateVehicle(
GetHashKey(model),
coords.x, coords.y, coords.z,
heading,
true, -- network
false -- thisScriptCheck
)
-- ตั้ง state
Entity(vehicle).state.fuel = 100.0
Entity(vehicle).state.serverCreated = true
return vehicle
end
Network Events กับ OneSync
-- ส่ง event ไปหาทุกคนใน radius
local function TriggerEventInRadius(eventName, coords, radius, ...)
for _, playerId in ipairs(GetPlayers()) do
local src = tonumber(playerId)
local ped = GetPlayerPed(tostring(src))
local playerCoords = GetEntityCoords(ped)
if GetDistanceBetweenCoords(coords, playerCoords, true) <= radius then
TriggerClientEvent(eventName, src, ...)
end
end
end
สรุป
OneSync เปิดโอกาสให้ server รองรับผู้เล่นจำนวนมาก แต่ต้องเข้าใจ entity ownership และ state bags เพื่อเขียน script ที่ทำงานถูกต้อง
Related Articles
Breaking: GTA Online อัพเดท "Money Fronts" — FiveM Server Owners ต้องทำอะไร?
Rockstar ปล่อย GTA Online อัพเดท Money Fronts มีผลกระทบต่อ FiveM servers บางส่วน นี่คือสิ่งที่ต้องทำทันทีหลังอัพเดท
Community Spotlight: Script และ Projects ที่น่าสนใจจาก FiveM Community
รวม scripts, tools และ projects ที่โดดเด่นจาก FiveM community ในช่วงที่ผ่านมา ตั้งแต่ free resources ถึง open-source projects
txAdmin อัพเดทใหม่ — Dashboard, Diagnostics และ Ban System ที่ดีขึ้น
txAdmin ซึ่งตอนนี้เป็นส่วนหนึ่งของ Cfx.re อย่างเป็นทางการ ได้รับการอัพเดทครั้งใหญ่ มี features ใหม่ที่ทำให้ Server Management ง่ายขึ้นมาก