Configuration — ns-animpos
Everything lives in config.lua (and the pose list in data/animations.lua). Both stay readable with escrow.
General
| Key | Default | Meaning |
|---|
Config.Framework | 'auto' | 'auto', 'qbox', 'qbcore', 'esx', 'standalone' |
Config.Locale | 'tr' | 'en' or 'tr' (add locales/<code>.lua for more) |
Config.Debug | false | debug logs; Config.DebugCategories = { session = true } limits them |
Config.Command | 'animpos' | the main command |
Config.PickerArgument | 'list' | /animpos list opens the pose picker |
Config.Live.enabled | true | /animpos with no scully emote: live mode (the gizmo moves your own character, any animation). false: the picker |
Config.ZonesCommand | 'animposzones' | admin: show blocked zones, print your position |
Config.ExitKey | 'X' | default key to leave a pose. Players rebind it in Settings > Key Bindings > FiveM |
Config.EmoteMenu | 'auto' | 'auto' / 'scully': /animpos places the playing scully emote · 'none': library only |
Config.Admin.ace | 'ns-animpos.admin' | ACE for admin tools; useFrameworkAdmin = true also accepts framework admins |
Library
| Key | Default | Meaning |
|---|
Config.Library.enabled | true | the picker and /animpos <id>; false = emote menu only |
Config.Library.maxFavourites | 30 | favourites per player (saved on their PC) |
Limits (checked by the server)
| Key | Default | Meaning |
|---|
Config.Limits.maxDistance | 3.0 | metres, horizontal, from where you started |
Config.Limits.maxUp / maxDown | 1.5 / 1.5 | metres above / below the start |
Config.Limits.tolerance | 0.25 | server only: extra metres for position sync drift |
Adjusting a pose measures from the first start again. Raising the limits makes wall-climbing easier: keep them small.
Live checks (client)
| Key | Default | Meaning |
|---|
Config.Checks.lineOfSight | true | no walls, windows or closed doors between you and the ghost |
Config.Checks.sameInterior | true | the ghost must be in the same interior as you (or both outside) |
Config.Checks.interval | 100 | ms between two checks while the ghost moves (Enter always checks again) |
Editor
| Key | Default | Meaning |
|---|
Config.Editor.timeout | 120 | seconds to confirm (server enforced) |
Config.Editor.ghostAlpha | 170 | ghost transparency, 0-255 |
Config.Editor.nudgeSpeed | 0.6 | m/s with the arrow keys / PgUp / PgDn |
Config.Editor.rotateSpeed | 70.0 | deg/s with ← → in rotate mode |
Config.Editor.fineFactor | 0.2 | speed factor while Shift is held |
Config.Editor.markers | true | limit circle, line and ring under the ghost |
Config.Editor.camera | see file | distance, minDistance, maxDistance, zoomStep, pitch, orbitSpeed, fov |
Pose
| Key | Default | Meaning |
|---|
Config.Pose.returnToStart | true | leaving puts you back at the start (server-recorded) |
Config.Pose.exitOnMove | true | W / A / S / D / Space leave the pose |
Config.Pose.exitOnDamage | true | damage ends the pose (you stay where you are) |
Config.Pose.returnOnAnimEnd | true | when your emote is cancelled and nothing plays any more, back to the start |
Config.Pose.animEndGrace | 1000 | ms without any animation before that (switching emotes takes less) |
Config.Pose.watchInterval | 200 | ms between two checks of the pose |
Restrictions (checked by the server on every request)
| Key | Default | Meaning |
|---|
Config.Restrictions.inVehicle | true | refuse in a vehicle |
Config.Restrictions.dead | true | refuse dead / last stand (Qbox / QBCore metadata; ped health otherwise) |
Config.Restrictions.cuffed | true | refuse cuffed (Qbox / QBCore ishandcuffed; IsPedCuffed on the client) |
Config.Restrictions.maxStartSpeed | 1.0 | m/s: you must stand still to start |
Config.Restrictions.custom | nil result | server function `(src) -> localeKey |
Example: block players in jail with your jail script's export:
Config.Restrictions.custom = function(src)
if exports['my-jail']:IsJailed(src) then return 'err_invalid_state' end
end
Blocked zones
Config.BlockedZones = {
{ label = 'Pacific vault', coords = vector3(254.0, 225.5, 101.9), radius = 8.0 },
}
Spheres. A start or target inside one is refused. /animposzones shows them and prints your position.
Pose library (data/animations.lua)
{ id = 'sit_bench', cat = 'sit', dict = 'timetable@ron@ig_5_p3', name = 'ig_5_p3_base' },
{ id = 'vip_lounge', cat = 'lie', dict = 'anim@amb@nightclub@lazlow@lo_sofa@', name = 'lowsofa_base_laz',
label = 'VIP lounge', ace = 'ns-animpos.vip' },
| Field | Meaning |
|---|
id | unique, letters / digits / underscore (max 32). /animpos <id> starts it |
cat | 'sit', 'lean', 'lie', 'stand', 'other' |
dict / name | animation dictionary and name |
flag | 1 loop (default) or 2 hold the last frame. Other flags are ignored |
label | fixed text; without it the locale key anim_<id> is used (add it to both locales) |
ace | permission needed (add_ace group.vip ns-animpos.vip allow); admins always pass |
Invalid or duplicate entries are skipped with a warning in the console.