Suty
Player Carry System

Configuration

Configuration

config/carry.lua at the resource root. Unencrypted and freely editable.

Notification + command

Config.NotificationSystem = "qb"            -- "qb" | "esx" | "ox_lib" | "mythic" | "okokNotify" | "custom"
Config.CarryCommand       = "carry"         -- /carry — open the carry request

Config.MaxCarryDistance         = 3.0
Config.MovementSpeedReduction   = 0.7       -- 70% of normal speed
Config.DisableSprintWhileCarrying = true
Config.DisableJumpWhileCarrying   = true

Config.AnimationCheckInterval = 1000        -- ms between animation health checks

Animation backend

Config.AnimationType = "custom"             -- "custom" (streamed dicts) | "default" (GTA defaults)
  • "custom" uses the high-quality animation dicts streamed with the resource (default).
  • "default" falls back to vanilla GTA animation dicts — no custom assets needed.

The script auto-picks Config.CarryStyles based on this flag:

Config.CarryStyles = Config.AnimationType == "custom"
    and Config.CustomCarryStyles
    or  Config.DefaultCarryStyles

Carry styles

Each entry under Config.CustomCarryStyles (or Config.DefaultCarryStyles) is a named style with two pose definitions:

arms = {
    label = "Arms Carry",
    icon  = "👐",
    personCarrying = {
        animDict = "pcarryd1@animations",
        anim     = "pcarryd1clip",
        flag     = 49,                      -- looping animation flag
    },
    personCarried = {
        animDict = "pcarryd2@animations",
        anim     = "pcarryd2clip",
        attachX = -0.120, attachY = -0.150, attachZ = -0.050,
        rotX = 0.0, rotY = 0.0, rotZ = -3.0,
        boneIndex = 24818,                  -- spine bone for custom animations
        flag = 33,
    },
},

Three styles ship by default:

Style Use case
arms Standard arms-around carry
fireman Shoulder carry (over the shoulder)
brazos Baby-cradle (locked to qbx_peds toddler models — restrictToQbxPeds = true)

Permissions / job restrictions (optional)

Config.UsePermissions = false               -- master toggle for the below
Config.RestrictedJobs = {}                  -- jobs that CAN'T carry (e.g. { "prisoner" })
Config.RequireJob     = false               -- true = only allowed jobs can carry
Config.AllowedJobs    = { "police", "ambulance" }  -- only used when RequireJob = true

Messages

Config.Messages = {
    noOneNearby      = "No hay nadie cerca para cargar!",
    carryRequest     = "Alguien quiere cargarte. Aceptar?",
    requestSent      = "Solicitud de carga enviada...",
    requestDenied    = "La solicitud fue rechazada",
    requestAccepted  = "Solicitud aceptada!",
    tooFarAway       = "El objetivo esta muy lejos!",
    stoppedCarrying  = "Dejaste de cargar",
    beingCarried     = "Te estan cargando",
    carrying         = "Estas cargando a alguien",
    cantDoThat       = "No puedes hacer eso mientras cargas a alguien!",
}