FiveM Ped ไม่โหลดหรือมองไม่เห็น แก้อย่างไร
ปัญหา FiveM Ped ไม่โหลด Ped ไม่ขึ้น Custom Ped มองไม่เห็น NPC หาย หรือ CreatePed แล้วไม่มีตัวละครปรากฏ อาจเกิดได้ตั้งแต่ Model ไม่ถูกต้อง, Resource ไม่ Start, REQUEST_MODEL โหลดไม่สำเร็จ, CREATE_PED ไม่ได้ Entity ที่ใช้งานได้, พิกัดผิด ไปจนถึง Network ID และ Routing Bucket ไม่ตรงกัน
FiveM มี Native สำหรับตรวจ Model โดยตรง เช่น IS_MODEL_IN_CDIMAGE, IS_MODEL_VALID และ HAS_MODEL_LOADED รวมถึง DOES_ENTITY_EXIST สำหรับตรวจว่า Ped Entity ถูกสร้างและยังมีอยู่ในโลกเกมจริงหรือไม่.
บทความนี้จาก comsiam จะพาไล่ตรวจปัญหาอย่างเป็นขั้นตอน เพื่อแยกให้ได้ว่า Ped ไม่ขึ้นเพราะ Model, Resource, Script, Coordinates, Network หรือ Visibility
① FiveM Ped ไม่โหลดมีอาการแบบไหน
อาการที่พบได้ เช่น
CreatePed แล้วไม่เห็นอะไร
Custom Ped ไม่ขึ้น
NPC ไม่เกิด
Ped เกิดแล้วหาย
Ped เห็นเฉพาะบางคน
Ped เห็นเฉพาะคนสร้าง
Ped อยู่ใต้พื้น
Ped อยู่คนละ Instance
Model โหลดไม่เสร็จ
Resource Start แต่ Ped ไม่ขึ้น
Restart Resource แล้ว NPC หาย
แต่ละอาการควรตรวจต่างกัน
② เริ่มจากแยกว่า Model ไม่โหลดหรือ Ped ไม่ถูกสร้าง
นี่เป็นจุดสำคัญที่สุด
แบ่งเป็น
Model Loading Problem
กับ
Entity Creation Problem
ถ้า HAS_MODEL_LOADED ยังเป็น false การไปตรวจ AI, Animation หรือ Network ของ Ped ยังเร็วเกินไป เพราะ Model ยังไม่พร้อมสร้าง Entity.
③ ตรวจ Model Name ก่อน
Custom Ped มักถูกเรียกด้วย Model Name เช่น
local model = `my_custom_ped`
ถ้าชื่อใน Script ไม่ตรงกับ Model ที่ Resource Stream อยู่ Model อาจไม่สามารถโหลดได้
ดังนั้นตรวจ
Config Model Name
=
ชื่อ Model Asset จริง
ก่อนแก้ส่วนอื่น
④ ใช้ IS_MODEL_IN_CDIMAGE ตรวจ Model
FiveM มี
IsModelInCdimage(model)
สำหรับตรวจว่า Model อยู่ใน Game Content/Loaded Asset Set ที่สามารถค้นหาได้หรือไม่.
ตัวอย่าง
local model = `my_custom_ped`
print("in cdimage:", IsModelInCdimage(model))
ถ้าเป็น false ควรกลับไปตรวจ Resource และ Model Asset
⑤ ใช้ IS_MODEL_VALID เพิ่มอีกชั้น
FiveM มี
IsModelValid(model)
ซึ่งคืนว่ามี Model ที่ระบุอยู่ในเกมหรือไม่.
ตัวอย่างการตรวจแบบพื้นฐาน
local model = `my_custom_ped`
if not IsModelInCdimage(model) then
print("Model not in CD image")
return
end
if not IsModelValid(model) then
print("Model invalid")
return
end
ช่วยหยุด Script ก่อนเข้าสู่ Loop รอ Model ที่ไม่มีอยู่จริง
⑥ อย่า Request Model ที่ผิดแล้วรอไม่จบ
Code แบบนี้
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
ทำงานได้เมื่อ Model ถูกต้อง แต่ถ้า Model Name ผิด Script อาจติดอยู่ในขั้นรอนานกว่าที่ตั้งใจ
Cfx.re Tutorial ใช้ REQUEST_MODEL และวนตรวจ HAS_MODEL_LOADED พร้อม Wait เพื่อให้ Game มีเวลาประมวลผล Streaming.
⑦ ใส่ Timeout ตอนโหลด Model
สำหรับ Production Script ควรมี Timeout
ตัวอย่าง
local model = `my_custom_ped`
if not IsModelInCdimage(model) or not IsModelValid(model) then
print("Invalid ped model:", model)
return
end
RequestModel(model)
local timeout = GetGameTimer() + 10000
while not HasModelLoaded(model) do
Wait(0)
if GetGameTimer() > timeout then
print("Model loading timed out")
return
end
end
ข้อดีคือถ้า Asset มีปัญหา Script จะไม่วนรอโดยไม่มีจุดจบ
⑧ HAS_MODEL_LOADED คืออะไร
Native
HAS_MODEL_LOADED
ใช้ตรวจว่า Model/Archetype ที่ระบุถูกโหลดอยู่ใน Memory แล้วหรือไม่.
ก่อน CreatePed ควรรอให้ค่านี้เป็น true
⑨ Wait(0) ใน Loop สำคัญไหม
สำคัญ
Cfx.re อธิบายว่า Loop รอ Model ต้อง Yield ให้ Game ทำงานด้วย ไม่เช่นนั้น Model อาจไม่มีโอกาสโหลดและ Game อาจ Freeze ได้.
ดังนั้นไม่ควรเขียน
while not HasModelLoaded(model) do
end
ควรมี
Wait(0)
ภายใน Loop
⑩ Model โหลดแล้วจึง CreatePed
ลำดับพื้นฐานควรเป็น
ตรวจ Model
↓
REQUEST_MODEL
↓
HAS_MODEL_LOADED
↓
CREATE_PED
ไม่ควร Create Ped ก่อน Model พร้อม
⑪ ตัวอย่าง CreatePed แบบมีการตรวจ
local model = `a_m_m_business_01`
if not IsModelInCdimage(model) or not IsModelValid(model) then
print("Invalid model")
return
end
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
local ped = CreatePed(
4,
model,
215.0,
-810.0,
30.0,
180.0,
false,
false
)
print("Ped:", ped)
หลักสำคัญคือให้พิสูจน์ Model Loading ก่อนวิเคราะห์ Ped Behavior
⑫ CreatePed แล้วต้องตรวจ Entity ด้วย
หลัง Create Ped อย่าเพิ่งสมมติว่าสร้างสำเร็จ
ใช้
DoesEntityExist(ped)
FiveM ระบุว่า DOES_ENTITY_EXIST ใช้ตรวจว่า Entity นั้นมีอยู่ใน Game World หรือไม่.
ตัวอย่าง
if not DoesEntityExist(ped) then
print("Ped creation failed")
return
end
⑬ Ped Handle เป็น 0 ต้องทำอย่างไร
ถ้า Handle ที่ได้ไม่ใช่ Entity ที่ใช้งานได้ ให้ย้อนตรวจ
Model
Model Loaded
Coordinates
CreatePed Parameters
Client Error
ก่อนส่ง Handle นี้ไปใช้กับ Native อื่น
เพราะจะทำให้ Error ต่อเนื่องหลายจุดและหาต้นเหตุยากขึ้น
⑭ Ped ถูกสร้างแต่ไม่เห็น อาจอยู่ผิดพิกัด
ตรวจ
X
Y
Z
Heading
โดยเฉพาะ Z
ตัวอย่างผิด
x = 200
y = -800
z = -50
Ped อาจอยู่ใต้พื้นจนผู้เล่นมองไม่เห็น
⑮ Ped อยู่ใต้ Map
หาก DoesEntityExist(ped) เป็น true แต่ไม่เห็น Ped ให้ตรวจ Coordinates
อาการคลาสสิกคือ
Entity มีจริง
+
Model โหลดแล้ว
+
Ped ไม่เห็น
แต่ Ped อยู่ใต้พื้น
ให้ Log Coordinates ของ Ped ออกมาด้วย
⑯ ตรวจพิกัดจริงของ Ped
หลัง Create สามารถตรวจ Entity Coordinates ผ่าน Native ที่เกี่ยวข้องกับ Entity แล้วเปรียบเทียบกับจุดที่ผู้เล่นยืน
ถ้าพิกัดต่างจากที่คิดมาก แสดงว่า Problem อยู่ที่ Spawn Location/Script Data มากกว่า Model
⑰ MLO ทำให้ Ped ดูเหมือนหายได้ไหม
ได้ในเชิง Position/World Setup
เช่น Ped ถูก Spawn
ชั้นล่าง
แต่ผู้เล่นอยู่
ชั้นบน
หรือ Z Coordinate ของ Interior ไม่ตรง
ดังนั้นใน MLO ควรตรวจพิกัดจริง ไม่ใช้ Coordinates ของ Map ภายนอกโดยเดา
⑱ Collision ยังโหลดไม่ทันทำให้ Ped ตกได้ไหม
หาก Spawn Ped บนพื้นที่ Custom Map ที่ Collision ยังไม่พร้อม Ped อาจตกหรืออยู่ในตำแหน่งผิดได้
ดังนั้นถ้าปัญหาเกิดเฉพาะ Custom MLO/Map แต่ Spawn บน Vanilla Map ปกติ ควรตรวจ Map/Collision Streaming เพิ่ม
⑲ ทดสอบด้วย Vanilla Ped ก่อน
นี่เป็นวิธีแยกปัญหาที่เร็วมาก
เปลี่ยนจาก
local model = `my_custom_ped`
เป็น Vanilla Model ที่รู้ว่าใช้ได้
ถ้า Vanilla Ped ขึ้น
Script Logic
Coordinates
CreatePed
มีแนวโน้มปกติ
แล้วค่อยกลับไปตรวจ Custom Ped Asset
⑳ Vanilla Ped ก็ไม่ขึ้น
ถ้า Vanilla Ped ยังไม่ขึ้นด้วย ให้เน้น
Script ไม่ทำงาน
Resource ไม่ Start
Coordinates ผิด
CreatePed ไม่ถูกเรียก
Client Error
แทน Custom Asset
㉑ ตรวจว่า Resource ทำงานหรือไม่
FiveM โหลด Scripts และ Assets ผ่านระบบ Resources และ fxmanifest.lua เป็น Resource Manifest หลักที่ใช้กำหนด Resource Content.
ถ้า Ped Spawner Resource ไม่ Start Code ของคุณจะไม่ทำงาน
㉒ เพิ่งเพิ่ม Resource ใช้ refresh
หากเพิ่ง Copy Resource เข้า Server ขณะ Server เปิดอยู่ ใช้
refresh
Cfx.re ระบุว่า refresh จะ Rescan Resources Folder และโหลด Resource Manifests ทำให้ Resource ใหม่พร้อมสำหรับการ Start.
㉓ จากนั้นใช้ ensure
ตัวอย่าง
ensure custom_peds
FiveM ใช้ ensure เป็นคำสั่งสำหรับทำให้ Resource อยู่ในสถานะ Started และตัวอย่าง Server Configuration ของ Cfx.re ก็ใช้ ensure resourceName สำหรับ Startup Resources.
㉔ Resource Start แต่ Script ไม่ทำงาน
ให้ใส่ Debug Log ที่จุดเริ่มต้น
print("ped spawner loaded")
แล้วดู F8/Console
ถ้าไม่มีข้อความเลย ให้ตรวจ
fxmanifest.lua
client_script
ชื่อไฟล์
Resource Start
Script Error
ก่อนตรวจ Ped Model
㉕ F8 ใช้ตรวจ Error ได้ไหม
ได้
Cfx.re ระบุว่า FiveM Client Console เปิดด้วย F8 และใช้สำหรับพัฒนา Server/Debug Resource Issues ได้.
ดู Error เช่น
nil value
invalid model
attempt to call
resource error
ก่อนแก้ Asset แบบสุ่ม
㉖ Log ทุกขั้นตอนช่วยได้มาก
ตัวอย่าง
print("1 model:", model)
RequestModel(model)
print("2 requested")
while not HasModelLoaded(model) do
Wait(0)
end
print("3 model loaded")
local ped = CreatePed(...)
print("4 ped:", ped)
print("5 exists:", DoesEntityExist(ped))
จาก Log นี้จะรู้ทันทีว่า Script หยุดอยู่ขั้นไหน
㉗ Custom Ped Resource ไม่ Start
ตรวจ
Resource Root
fxmanifest.lua
Folder ซ้อน
Resource Name
Dependencies
Console Error
ถ้า Asset Resource ยังไม่ Start การ RequestModel ด้วย Custom Model Name ก็ไม่ควรถูกคาดหวังว่าจะสำเร็จ
㉘ Folder ซ้อนเป็นปัญหายอดนิยม
ตัวอย่าง
custom_ped/
└── custom_ped/
├── fxmanifest.lua
└── stream/
แต่คุณ ensure custom_ped ชั้นนอก
ต้องหา Folder ที่เป็น Resource Root จริง
㉙ Ped เกิดแต่หายทันที
ถ้า Ped ขึ้นแวบเดียวแล้วหาย ให้ตรวจ
มี DeleteEntity หรือไม่
Cleanup Thread
Resource Stop
Distance Cleanup
Mission Logic
Population Logic
FiveM มี DELETE_ENTITY สำหรับลบ Entity และเอกสารยังแนะนำให้ตรวจ DOES_ENTITY_EXIST ก่อนจัดการ Entity.
㉚ Search Code หา DeleteEntity
ค้นหาใน Resource
DeleteEntity
DeletePed
รวมถึง Function Cleanup ที่ถูกเรียกเมื่อ
ผู้เล่นออกระยะ
Resource Restart
Mission End
Zone Exit
Ped อาจถูกสร้างถูกต้อง แต่ถูกระบบ Cleanup ลบทิ้งทันที
㉛ Resource Restart แล้ว Ped หายเป็นเรื่องปกติไหม
ขึ้นอยู่กับ Architecture
หาก Resource เป็นผู้สร้าง Ped เมื่อ Resource Restart State ของ Script จะถูกสร้างใหม่และ Ped Lifecycle ต้องถูกจัดการอีกครั้ง
Resource Events มีทั้ง Start และ Stop Events ที่สามารถใช้จัดการ Creation/Cleanup Logic.
ดังนั้นควรกำหนดให้ชัดว่า
on resource start
→ create
on resource stop
→ cleanup
㉜ Restart แล้ว Ped ไม่กลับมา
ถ้า Cleanup ทำงานแต่ Create Logic ไม่ทำงานหลัง Restart ให้ตรวจ Resource Start Event หรือ Spawn Thread
อย่าแก้ Custom Model ก่อน
เพราะ Ped เคยทำงานก่อน Restart อยู่แล้ว
㉝ Ped ซ้ำหลัง Restart
เป็นด้านตรงข้าม
ถ้า Ped เดิมยังอยู่แต่ Resource Start สร้างใหม่อีกตัว จะเกิด
Ped A
+
Ped B
ควรตรวจว่า Existing Entity ยังมีอยู่หรือไม่ก่อน Create ใหม่
ใช้ DOES_ENTITY_EXIST ได้เพื่อช่วยตรวจ Runtime Entity.
㉞ Ped เห็นเฉพาะคนสร้าง
นี่เป็นสัญญาณสำคัญของ
Local Ped
vs
Networked Ped
ถ้าแต่ละ Client Create Ped แบบ Local ผู้เล่นอื่นไม่จำเป็นต้องเห็น Entity เดียวกัน
㉟ Entity Handle ใช้ข้าม Client ไม่ได้
Cfx.re ระบุว่า Entity Handles เป็น Local Identifiers และไม่ได้ Synchronize ระหว่าง Client กับ Server โดยตรง.
ดังนั้นอย่าส่ง
pedHandle = 123
จาก Client A ไป Client B แล้วคิดว่าเป็น Ped ตัวเดียวกัน
㊱ ต้องใช้ Network ID เมื่ออ้างข้ามเครื่อง
Cfx.re ระบุว่า Network ID ใช้ระบุ Networked Entity ระหว่าง Clients และสามารถแปลงกลับเป็น Local Entity Handle ในแต่ละ Client ได้.
แนวคิดคือ
Entity Handle
↓
Network ID
↓
ส่งข้าม Network
↓
Network ID
↓
Local Handle ของ Client ปลายทาง
㊲ แปลง Ped เป็น Network ID อย่างไร
FiveM มี Native
NETWORK_GET_NETWORK_ID_FROM_ENTITY
และ Cfx.re ระบุว่า Network ID เป็น Handle ที่ Shared ระหว่าง Clients สำหรับ Networked Entity.
จากนั้น Client อื่นสามารถใช้ Network ID เพื่อหา Local Entity Handle ของตัวเอง
㊳ Network ID มี แต่ Client ยังไม่เห็น Ped
Network ID อย่างเดียวไม่ได้รับประกันว่า Entity อยู่ใน Scope ของ Client ณ ขณะนั้น
Cfx.re อธิบายว่า Networked Entities มี Local Handle เฉพาะเมื่อ Entity นั้นถูกสร้าง/มีอยู่ใน Context ของ Client นั้น และ Network ID สามารถถูกแปลงเป็น Entity Handle เมื่อเกี่ยวข้อง.
ดังนั้นควรตรวจ Network Scope/Entity Existence ด้วย
㊴ Ped อยู่คนละ Routing Bucket
นี่เป็นอีกสาเหตุสำคัญของ
Player A เห็น
Player B ไม่เห็น
FiveM มี Routing Buckets สำหรับแยก Game State และมี Natives สำหรับกำหนด Routing Bucket ของทั้ง Players และ Entities.
ถ้า Ped อยู่ Bucket 2 แต่ Player อยู่ Bucket 0 พวกเขาอาจไม่ได้อยู่ใน Game State เดียวกัน
㊵ ตรวจ Entity Routing Bucket
FiveM มี
GET_ENTITY_ROUTING_BUCKET
สำหรับดู Bucket ของ Entity.
ถ้าใช้ Instance System ให้ Log ค่า
Player Bucket
Ped Bucket
และตรวจว่าตรงตาม Design หรือไม่
㊶ ตั้ง Routing Bucket ของ Ped
FiveM มี
SET_ENTITY_ROUTING_BUCKET
ฝั่ง Server สำหรับกำหนด Bucket ของ Entity.
ตัวอย่างแนวคิด
SetEntityRoutingBucket(ped, bucketId)
ควรใช้ตาม Instance Architecture ของ Server ไม่ใช่ตั้งทุก Ped เป็น Bucket 0 แบบสุ่ม
㊷ Lobby/Instance ทำให้ NPC หายได้ไหม
ได้
Server ที่ใช้
Character Selection
Apartments
Lobby
Mission Instance
Match Instance
อาจย้าย Player ระหว่าง Routing Buckets
ถ้า Player ถูกย้ายแต่ Ped ไม่ถูกย้ายตาม Ped จะดูเหมือนหายทั้งที่ Entity ยังมีอยู่
㊸ OneSync เกี่ยวข้องกับ Ped Visibility ไหม
เกี่ยวข้องกับ Networked Entity Architecture
Cfx.re ระบุว่า OneSync เพิ่มระบบ Server-side Synchronization States สำหรับ Entities และใช้ในการจัดการ Networked World State.
สำหรับ Shared NPC ที่ผู้เล่นหลายคนต้องเห็น ควรออกแบบ Entity Ownership/Creation ให้สอดคล้องกับ OneSync
㊹ ทุก Client ไม่ควร Create Shared Ped ซ้ำ
ตัวอย่าง Architecture ที่เสี่ยง
Client A joins → CreatePed
Client B joins → CreatePed
Client C joins → CreatePed
ผลอาจได้ NPC 3 ตัวแทน NPC เดียว
ต้องกำหนดว่า Ped นี้เป็น
Local Visual Ped
หรือ
Shared Networked Ped
ให้ชัดตั้งแต่แรก
㊺ Ped Spawn เฉพาะเมื่อเข้าใกล้แล้วหายเมื่อออกระยะ
ถ้า Script ตั้งใจทำ Distance-based Spawn นี่อาจเป็น Behavior ปกติ
ตรวจ Logic เช่น
distance < 50
→ Create Ped
distance > 70
→ Delete Ped
แต่ถ้า Threshold ผิด Ped อาจเด้งเข้าออกเมื่อผู้เล่นยืนตรงขอบ Zone
㊻ ใช้สองระยะช่วยลด Spawn/Despawn กระพริบ
ตัวอย่างแนวคิด
Spawn < 50m
Delete > 80m
ดีกว่า
Spawn < 50m
Delete > 50m
เพราะผู้เล่นเดินเข้าออกระยะเพียงเล็กน้อยจะไม่ทำให้ Ped ถูกสร้าง/ลบตลอดเวลา
นี่เป็นหลักการออกแบบ Script ไม่ใช่ Native Requirement
㊼ CreatePed ทุก Frame เป็นข้อผิดพลาด
อย่าทำ
while true do
Wait(0)
CreatePed(...)
end
เพราะจะพยายามสร้าง Entities ซ้ำอย่างต่อเนื่อง
ควรมี State เช่น
if not pedCreated then
-- create once
end
แล้วเก็บ Ped Handle ไว้
㊽ Ped Handle เก่าหลัง Entity ถูกลบ
ถ้า Script เก็บ Handle แต่ Ped ถูกลบแล้ว ค่าเดิมไม่ควรถูกสมมติว่ายังใช้งานได้
ใช้
DoesEntityExist(ped)
ตรวจทุกครั้งเมื่อ Entity อาจถูก Cleanup.
㊾ Custom Ped หาย แต่ Vanilla Ped ขึ้น
Pattern นี้ชี้ไปที่
Custom Model Resource
Model Name
Asset Streaming
Asset Compatibility
มากกว่า CreatePed
ให้หยุดแก้ Spawn Script ชั่วคราวและกลับไปตรวจ Custom Asset
㊿ Custom Ped Resource Started แต่ IsModelValid เป็น false
ให้ตรวจ
Model Name
Asset Naming
Resource Files
Resource Structure
Streaming
เพราะ IS_MODEL_VALID ใช้ตรวจว่า Model ที่ระบุมีอยู่ใน Game Environment หรือไม่.
หากยังเป็น false Problem อยู่ก่อนขั้น Create Ped
51. IsModelInCdimage เป็น false
กรณีนี้ยิ่งควรกลับไปตรวจ Asset Resource
IS_MODEL_IN_CDIMAGE ใช้ตรวจว่า Model อยู่ใน CD image/RPF content ที่ Game รู้จักหรือไม่.
อย่าแก้ Coordinates หรือ Heading ในขั้นนี้
52. IsModelValid true แต่ HasModelLoaded false
แสดงว่า Model มีอยู่ แต่ยังไม่ได้โหลดพร้อมสำหรับ Script
ตรวจ
RequestModel ถูกเรียก?
Loop มี Wait?
Streaming มีปัญหา?
Cfx.re แนะนำ Pattern REQUEST_MODEL → HAS_MODEL_LOADED โดยให้ Loop Yield ด้วย Wait.
53. HasModelLoaded true แต่ DoesEntityExist false
ตอนนี้ Model Loading ผ่านแล้ว
ให้เน้น
CreatePed Parameters
Return Value
Script Flow
มากกว่า Custom Asset
เป็นวิธีตัดปัญหาออกทีละ Layer ที่แม่นกว่าการแก้ทุกอย่างพร้อมกัน
54. DoesEntityExist true แต่ยังมองไม่เห็น
ตรวจ
Coordinates
Routing Bucket
Network Scope
Visibility State
Interior/Instance
ในลำดับนี้
เพราะคุณพิสูจน์แล้วว่า Entity มีอยู่จริง
55. ตรวจ Ped Model หลังสร้าง
หากต้องการ Debug เพิ่ม สามารถอ่าน Model ของ Entity แล้วเทียบกับ Model ที่ Script ต้องการ
ถ้า Ped Entity มีจริงแต่ใช้ Model คนละตัว แสดงว่าอาจมี Resource อื่นสร้าง/เปลี่ยน Entity หรือ Config Model ไม่ตรง
56. Custom Ped Model ถูก Suppress ได้ไหม
GTA/FiveM มี Ped Model-related APIs หลายตัว รวมถึงการควบคุม Model ใน Population Context
แต่สำหรับ Script-created Ped อย่าเริ่มจากสมมติว่า Model ถูก Suppress
ตรวจ Model Validity, Loading และ Entity Creation ก่อน เพราะเป็นสาเหตุที่ตรงกว่า
57. Population Ped กับ Script Ped ต้องแยกกัน
FiveM มี Event populationPedCreating ซึ่งทำงานก่อน Population Ped ถูกสร้าง และสามารถเปลี่ยน Model/Position หรือ Cancel Population Ped ได้.
แต่ Ped ที่ Resource สร้างเองด้วย CreatePed เป็นอีก Flow
ดังนั้น Script ที่ Cancel Population ไม่ได้หมายความว่าจะลบ Custom CreatePed ทุกตัวโดยอัตโนมัติ
58. Ped ไม่ขึ้นเฉพาะพื้นที่หนึ่ง
ตรวจ
Routing Bucket
MLO/Interior
Coordinates
Distance Spawn Zone
Collision
Cleanup Zone
ถ้า Model เดียวกันขึ้นปกติที่ Vanilla Location แต่ไม่ขึ้นในพื้นที่ Custom Map ปัญหาอาจไม่ได้อยู่ที่ Model
59. Ped ไม่ขึ้นหลังเปลี่ยน Config Coordinates
ให้ Log Coordinates
บางครั้ง Config อ่าน String หรือ Table ผิดจนเกิด
x = nil
y = nil
z = nil
หรือ Script ใช้ Index ผิด
F8/Client Console จะช่วยให้เห็น Script Error ได้.
60. Ped Spawn แล้วหันผิดทางไม่ใช่ปัญหาโหลด
หาก Ped ขึ้นแล้วแต่หันผิด ให้แก้ Heading
อย่าเสียเวลาแก้ Model Resource
นี่เป็นคนละ Layer กับ “Ped ไม่โหลด”
61. Ped Spawn แต่ตัวโปร่งหรือ Texture หาย
แสดงว่า Entity Creation ผ่านแล้ว
ให้ตรวจต่อ
Custom Ped Asset
Texture
Material
Streaming
ไม่ใช่ CreatePed
หลัก Debug คือเมื่อขั้นหนึ่งพิสูจน์ว่าทำงานแล้ว อย่าย้อนแก้ขั้นนั้นโดยไม่มีหลักฐาน
62. ใช้ strdbg ตรวจ Streaming ได้ไหม
FiveM Client Console มี Developer Commands สำหรับ Debug Streaming โดย strdbg ใช้ดูสิ่งที่ GTA Streamer กำลังโหลดและมีประโยชน์เมื่อ World/Assets มีปัญหาการโหลด.
ตัวอย่าง
strdbg true
เหมาะเมื่อ Model Asset มีอยู่แต่ Streaming Behavior ผิดปกติ
63. ใช้ strlist ได้ไหม
FiveM Client Console มี strlist สำหรับดูรายการ Entries ที่ลงทะเบียนอยู่กับ GTA Streamer และสถานะของแต่ละรายการ.
ใช้ช่วยแยก
Asset ไม่ถูก Register
ออกจาก
Script ไม่ได้ Create Ped
64. ใช้ strmem ได้ไหม
strmem ใช้ดู Streaming Memory ของ Assets และภาพรวม Streaming Memory.
ถ้า Server มี
Custom Peds
Custom Clothes
Cars
Maps
MLO
จำนวนมาก เครื่องมือนี้ช่วยประเมินว่า Client กำลังมี Asset Pressure หรือไม่
65. Developer Commands ใช้ไม่ได้
คำสั่ง Developer บางตัวต้องใช้งานใน Environment/Mode ที่ FiveM อนุญาตสำหรับ Development
ถ้าคำสั่งถูกปฏิเสธ อย่าสรุปว่า Model ไม่มีอยู่
ยังสามารถตรวจ Script Log, Model State และ Entity State ได้ตามปกติ
66. Ped ไม่เห็นเฉพาะผู้เล่นบางคน
ใช้ Checklist นี้
Ped เป็น Networked หรือ Local?
↓
Network ID มีหรือไม่?
↓
Entity อยู่ใน Scope หรือไม่?
↓
Player อยู่ Routing Bucket ไหน?
↓
Ped อยู่ Routing Bucket ไหน?
FiveM แยก Local Entity Handles และ Network IDs ชัดเจน และ Routing Buckets สามารถแยก Entity/Player ออกจาก Game State กันได้.
67. Ped ทุกคนเห็นแต่คนหนึ่งไม่เห็น
อาจเป็น Client/Scope/Instance-specific Problem
อย่า Restart Server ทั้งระบบทันที
เปรียบเทียบ
Player Bucket
Network State
Client Errors
Position
ของคนที่มีปัญหากับคนที่เห็น Ped ปกติ
68. Network ID ไม่ควรเก็บเป็น ID ถาวร
Cfx.re ระบุว่า Network IDs มีขนาดจำกัดและสามารถถูกนำกลับมาใช้กับ Entity อื่นได้หลัง Entity เดิมหายไป.
ดังนั้นสำหรับ NPC ถาวรควรมี Logical ID เช่น
shopkeeper_01
dealer_01
hospital_npc_01
แล้ว Mapping ไป Runtime Network ID
69. Entity Handle ไม่ควรเก็บใน Database
ด้วยเหตุผลเดียวกัน Local Entity Handle เป็น Runtime Identifier ของ Client Context
Cfx.re ระบุว่า Handles ไม่ Synchronize ระหว่าง Client/Server และ Entity เดียวกันสามารถมี Handle คนละค่าบนคนละเครื่องได้.
Database ควรเก็บ Logical State ไม่ใช่ Local Handle
70. วิธี Debug FiveM Ped ไม่โหลดแบบเร็วที่สุด
ใช้ลำดับนี้
ขั้นที่ 1 — ตรวจ Model
IsModelInCdimage(model)
IsModelValid(model)
FiveM มีทั้งสอง Native สำหรับตรวจ Model.
ขั้นที่ 2 — Request Model
RequestModel(model)
ขั้นที่ 3 — รอ Model
while not HasModelLoaded(model) do
Wait(0)
end
Cfx.re ใช้ Pattern นี้ใน Official Scripting Guide.
ขั้นที่ 4 — Create Ped
local ped = CreatePed(...)
ขั้นที่ 5 — ตรวจ Entity
DoesEntityExist(ped)
FiveM มี Native สำหรับตรวจว่า Entity มีอยู่ใน Game World จริงหรือไม่.
ขั้นที่ 6 — ตรวจ Coordinates
ถ้า Entity มีแต่ไม่เห็น
ขั้นที่ 7 — ตรวจ Network
ถ้าคนสร้างเห็นแต่คนอื่นไม่เห็น ให้ตรวจ Network ID.
ขั้นที่ 8 — ตรวจ Routing Bucket
ถ้า Player บางกลุ่มไม่เห็น ให้ตรวจ Entity/Player Bucket.
ขั้นที่ 9 — ตรวจ Resource Cleanup
ถ้า Ped ขึ้นแล้วหาย
ขั้นที่ 10 — ตรวจ Streaming
ถ้า Custom Asset โหลดผิดปกติ ใช้ Developer Streaming Tools.
ตารางสรุป FiveM Ped ไม่โหลดหรือมองไม่เห็น
| อาการ | จุดที่ควรตรวจ |
|---|---|
| Custom Ped ไม่โหลด | Model/Resource |
IsModelValid false | Model Name/Asset |
IsModelInCdimage false | Resource/Streaming Asset |
HasModelLoaded false | Request/Streaming |
| Model Loaded แต่ Create ไม่สำเร็จ | CreatePed |
| Entity ไม่มีจริง | DoesEntityExist |
| Entity มีแต่ไม่เห็น | Coordinates/Bucket |
| Ped อยู่ใต้พื้น | Z/Collision |
| Ped ขึ้นแล้วหาย | Cleanup Logic |
| Restart แล้ว Ped หาย | Resource Lifecycle |
| Restart แล้ว Ped ซ้ำ | Duplicate Spawn |
| คนสร้างเห็นคนเดียว | Local Ped |
| ผู้เล่นอื่นไม่เห็น | Networking/Scope |
| บาง Instance ไม่เห็น | Routing Bucket |
| Vanilla ขึ้น Custom ไม่ขึ้น | Custom Asset |
| ทุก Model ไม่ขึ้น | Script/Resource |
| Ped ขึ้นแต่ Texture เสีย | Custom Asset Texture |
| Ped ขึ้นแต่ Animation บิด | Rig/Skeleton |
| Custom Assets เยอะแล้วโหลดช้า | Streaming/Memory |
Checklist FiveM Ped ไม่ขึ้น
ตรวจให้ครบ
☐ Model Name ถูก
☐ IsModelInCdimage = true
☐ IsModelValid = true
☐ RequestModel ถูกเรียก
☐ HasModelLoaded = true
☐ Loop มี Wait
☐ CreatePed ถูกเรียก
☐ Ped Handle ใช้งานได้
☐ DoesEntityExist = true
☐ Coordinates ถูก
☐ Z ถูก
☐ Resource Started
☐ F8 ไม่มี Script Error
☐ ไม่มี Cleanup ลบทันที
☐ Local/Networked ถูกตาม Design
☐ Network ID ถูก
☐ Routing Bucket ถูก
☐ ไม่มี Duplicate Spawn
Code ตัวอย่าง Debug Ped แบบครบพื้นฐาน
local function spawnDebugPed(modelName, coords, heading)
local model = joaat(modelName)
print("Ped model:", modelName)
print("In CD image:", IsModelInCdimage(model))
print("Model valid:", IsModelValid(model))
if not IsModelInCdimage(model) or not IsModelValid(model) then
print("ERROR: Invalid ped model")
return nil
end
RequestModel(model)
local deadline = GetGameTimer() + 10000
while not HasModelLoaded(model) do
Wait(0)
if GetGameTimer() >= deadline then
print("ERROR: Model load timeout")
return nil
end
end
print("Model loaded")
local ped = CreatePed(
4,
model,
coords.x,
coords.y,
coords.z,
heading,
false,
false
)
if not DoesEntityExist(ped) then
print("ERROR: Ped was not created")
return nil
end
print("Ped created:", ped)
SetModelAsNoLongerNeeded(model)
return ped
end
โครงสร้างนี้เน้นตรวจ Model → โหลด Model → Create Entity → Validate Entity แยกทีละขั้น ซึ่งสอดคล้องกับ Native และ Model-loading workflow ของ FiveM.
อย่าใช้ Wait คงที่แทน HasModelLoaded
วิธีเช่น
RequestModel(model)
Wait(2000)
CreatePed(...)
ไม่ดีเท่า
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
เพราะเวลา Streaming แตกต่างกันตาม Client และ Asset
Cfx.re Official Scripting Guide ใช้การตรวจ HAS_MODEL_LOADED แทนการเดาว่า Model จะโหลดเสร็จภายในกี่วินาที.
อย่าล้าง Cache เป็นคำตอบแรก
ถ้า
ทุกคนไม่เห็น Ped
+
Model Valid = false
Cache ไม่ใช่สิ่งแรกที่ควรแก้
ให้ตรวจ Model Resource ก่อน
หรือถ้า
Ped มีจริง
+
ผู้เล่น Bucket 2
+
Ped Bucket 0
การล้าง Cache ก็ไม่แก้ Routing Architecture
อย่า Reinstall FiveM ก่อนตรวจ Script
หาก Ped ตัวเดียวไม่ขึ้นใน Server ของคุณ แต่ FiveM ทำงานด้านอื่นปกติ ควรตรวจ Resource/Model/Script ก่อน
โดยเฉพาะเมื่อ Official Natives มีเครื่องมือให้ตรวจได้ตรง ๆ ว่า
Model มีไหม
Model โหลดไหม
Entity มีไหม
Entity อยู่ Bucket ไหน
จึงไม่จำเป็นต้องเดา
สูตรจำง่ายสำหรับแก้ Ped ไม่ขึ้น
จำขั้นตอนนี้
MODEL
↓
LOAD
↓
CREATE
↓
EXIST
↓
POSITION
↓
NETWORK
↓
BUCKET
ถ้าไม่ผ่านขั้นไหน ให้หยุดแก้ที่ขั้นนั้นก่อน
สรุป FiveM Ped ไม่โหลดหรือมองไม่เห็น แก้อย่างไร
ถ้า FiveM Ped ไม่โหลดหรือมองไม่เห็น ให้เริ่มจากตรวจ Model ก่อนเสมอ
ใช้
IS_MODEL_IN_CDIMAGE
IS_MODEL_VALID
เพื่อดูว่า Model มีอยู่และใช้ได้ จากนั้น
REQUEST_MODEL
↓
HAS_MODEL_LOADED
เพื่อรอให้ Model พร้อมใช้งาน.
หลัง CREATE_PED ให้ตรวจ
DOES_ENTITY_EXIST
เพื่อพิสูจน์ว่า Ped Entity ถูกสร้างจริง.
ถ้า Model โหลดแล้วแต่ Entity ไม่มี ให้ตรวจ CreatePed
ถ้า Entity มีแต่ไม่เห็น ให้ตรวจ Coordinates และ Z
ถ้า คนสร้างเห็นแต่ผู้เล่นอื่นไม่เห็น ให้ตรวจ Local Ped กับ Networked Ped เพราะ Cfx.re ระบุว่า Entity Handles เป็น Local Identifiers ขณะที่ Network IDs ใช้อ้าง Networked Entities ระหว่าง Clients.
ถ้า ผู้เล่นบาง Instance มองไม่เห็น Ped ให้ตรวจ Routing Bucket ของทั้ง Player และ Entity เพราะ FiveM สามารถแยก Game State ด้วย Routing Buckets ได้.
ถ้า เพิ่งเพิ่ม Custom Ped Resource ให้ตรวจ Resource Root และ Manifest จากนั้นใช้ refresh เพื่อ Rescan Resources และ Start Resource ให้ถูกต้อง.
และถ้า Ped ขึ้นแล้วหายหลัง Restart หรือเดินออกระยะ ให้ตรวจ Resource Lifecycle และ Cleanup Logic แทนการโทษ Model
แนวทางของ comsiam คือ Debug Ped ตามลำดับ Model → Loading → Entity → Position → Networking → Routing Bucket เพราะถ้าพิสูจน์แต่ละ Layer ได้ชัด ปัญหา Ped ที่ดูซับซ้อนส่วนใหญ่จะถูกจำกัดเหลือเพียงจุดเดียวโดยไม่ต้องลบ Resource หรือติดตั้ง Server ใหม่ทั้งหมด
Comments
Post a Comment