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 falseModel Name/Asset
IsModelInCdimage falseResource/Streaming Asset
HasModelLoaded falseRequest/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

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด