~/docs/interaction/configuration/public-api
interaction docs›
Interaction
Public API
-- 2 code blocks · 1 min read
All exports are client-side. Each registration call returns an id you can reuse to remove or update the interaction.
pedRegister(cfg)
Spawn a streamed NPC at coords (must be a vec4, the w is the heading) and attach an interaction. Peds despawn automatically when the player walks out of Config.Ped.spawnRange.
exports["core_interact"]:pedRegister({
coords = vec4(-33.41, -1099.95, 25.41, 70.86),
model = "mp_m_weapexp_01",
animDict = "amb@world_human_stand_mobile@male@text@base",
animName = "base",
hintIcon = "talk",
blips = { sprite = 119, color = 50, text = "Foreman" },
dialogue = { name = "Paul", tag = "Lumberjack", startMsg = "Hi!", elements = { ... } },
})
positionRegister(cfg)
Static interaction at world coordinates (no NPC, no streaming). The coords field must be a vec3 — pass a vec4 and the call is ignored (use pedRegister for those).
entityRegister(cfg)
Bind an interaction to an existing entity handle. Optional bone field attaches the hint to a specific bone for moving entities.
exports["core_interact"]:entityRegister({
entity = vehicleHandle,
bone = "boot",
hintIcon = "interact",
message = "Open trunk",
onInteract = function(id, ent, spec) end,
})
entityRegisterByHash(hash, cfg)
Bind an interaction to every spawned instance of a model hash. A single shared scanner thread polls GetGamePool("CObject") every Config.HashScanInterval ms — adding 1 or 100 watchers has the same cost.
interactCreate(cfg) → id / interactRemove(id)
Dynamically add and remove an interaction at runtime — useful for quest-driven points that should appear, then disappear.
Lower-level
HandleHoldTextUI(id, data),RemoveHoldTextUI(id),CloseHoldTextUI(id),RemoveHoldTextUIs()— direct access to the hold panel system.HandleTextUI(id, data),CloseTextUI(id),RemoveTextUI(id),RemoveTextUIs()— the simpler TextUI variant (no hold/hint).Draw3DSprite({ duiHandler, coords, maxDistance, hintOnly })— render a DUI as a 3D world-space sprite (called internally on every tick).IsDuiVisible() → boolean— true while at least one panel is on screen.unlockLastInteract()— re-arm the most recently locked interaction (after an async action finishes, for example).