RDR2 shopkeeper/NPC peds (s_m_m_*) spawn INVISIBLE with raw CreatePed — the fix is bScriptHostPed=true (CreatePed's 7th arg), which VORP's Peds:Create sets
Context
Spawning a standard RDR2 ped (e.g. s_m_m_unibutchers_01, a shopkeeper) with a plain CreatePed(...) call: the ped EXISTS (DoesEntityExist true, qtarget hits it, it has collision) but renders completely invisible — no mesh. Wasted a lot of time thinking it was a model-load or ped-variation issue.
CREATE_PED arg shape (0xD49F9B0955C367DE)
CreatePed(modelHash, x, y, z, heading, isNetwork, bScriptHostPed, p7, p8)
The 7th arg bScriptHostPed (registers the ped as pinned to the script host in the R* network model) is the one that matters. Passing false → invisible. Passing true → renders correctly.
The fix (two equivalent options)
- Pass
truefor bScriptHostPed:CreatePed(hash, x, y, z, heading, false /*isNetwork*/, true /*bScriptHostPed*/, false, false) - Better: use the framework helper that already does this. VORP's
vorp_utilsPedAPI:Create(exposed viaTriggerEvent("getUtils", ...)→utils.Peds:Create(...), or in the @pure/utils TS wrapperVorpUtils.createPed({...})) calls CreatePed with bScriptHostPed=true + a model-load + existence-wait. This is the path rn-butcher / ch-mail use, and why their peds render while a hand-rolled CreatePed doesn't.
Not the cause (ruled out)
This is a DIFFERENT issue from the re_* / mp_re_* random-encounter ped pools that spawn invisible without an outfit preset (those need _SET_RANDOM_OUTFIT_VARIATION + _UPDATE_PED_VARIATION). A standard s_m_* / a_c_* shopkeeper/ambient ped does NOT need the outfit trick — it just needs bScriptHostPed=true.
Also note: in CitizenFX TypeScript it's Citizen.invokeNative (lowercase i); the capital-I Lua spelling throws "is not a function". Named global wrappers (CreatePed, etc.) work fine.
Linked natives
CREATE_PED(0xD49F9B0955C367DE)
Tags: ped, createped, invisible, shopkeeper, vorp, spawn, rdr3
Category: natives
Source: scandi-hunting-build
Created: 2026-06-04T14:36:17.408Z