# Holster and draw animations for FiveM roleplay

> Add weapon draw and holster animations in FiveM: detect weapon switches, play the intimidation clips, block firing mid-draw and handle police holsters.

Source: https://fam-tools.com/guides/fivem-holster-draw-animation · FAM Tools · published 2026-09-11 · updated 2026-09-11 · about 10 min

**Short answer.** Watch the selected weapon in a client loop; when it changes from unarmed to a sidearm, play a draw animation (the classic choice is `reaction@intimidation@1h` with the `intro` clip) and block firing until it ends; when it changes back, play the `outro` clip. Only react to the weapons that should be holstered, and sleep the loop when nothing changes.

## Key points

- Detect switches by comparing the weapon each tick with the previous one.
- Load the animation dictionary before playing it (`RequestAnimDict`).
- Disable firing controls during the draw so it cannot be skipped.
- Use different timings or clips for police and civilians.
- Clothing-based holsters swap a drawable to show the gun on the belt.

In vanilla GTA V a pistol appears in your hand instantly. On a roleplay server that removes a whole beat from every tense scene: the moment a hand goes to the waistband. A holster script adds that beat — a short draw animation when a weapon is pulled and a holster animation when it is put away — and can make it faster for trained police than for a nervous civilian.

## What a holster script does

1. Notice the player switched to a holstered weapon (for example a pistol).
2. Play a draw animation and keep the player from firing until it finishes.
3. When they switch away, play a holster animation.
4. Optionally update clothing so the holster looks full or empty.

## A minimal draw/holster script

*client.lua*

```lua
local HOLSTERED = {
    [`WEAPON_PISTOL`] = true, [`WEAPON_COMBATPISTOL`] = true,
    [`WEAPON_PISTOL_MK2`] = true, [`WEAPON_STUNGUN`] = true,
}
local DICT = 'reaction@intimidation@1h'

local function loadDict(dict)
    RequestAnimDict(dict)
    while not HasAnimDictLoaded(dict) do Wait(0) end
end

local function playBlocking(clip, ms)
    local ped = PlayerPedId()
    loadDict(DICT)
    TaskPlayAnim(ped, DICT, clip, 8.0, -8.0, ms, 48, 0.0, false, false, false)
    local untilTime = GetGameTimer() + ms
    while GetGameTimer() < untilTime do
        DisablePlayerFiring(PlayerId(), true)
        DisableControlAction(0, 25, true) -- aim
        Wait(0)
    end
    RemoveAnimDict(DICT)
end

CreateThread(function()
    local last = `WEAPON_UNARMED`
    while true do
        local _, current = GetCurrentPedWeapon(PlayerPedId(), true)
        if current ~= last then
            if HOLSTERED[current] and last == `WEAPON_UNARMED` then
                playBlocking('intro', 1200)  -- draw
            elseif HOLSTERED[last] and current == `WEAPON_UNARMED` then
                playBlocking('outro', 900)   -- holster
            end
            last = current
        end
        Wait(100)
    end
end)
```

Flag `48` plays the animation on the upper body only, so the player can still walk. The loop checks ten times a second, which is responsive and cheap. Timings are a starting point; watch the animation in game and match the blocking time to it.

## Police versus civilians

A common roleplay touch: officers draw from a duty holster faster and with a different, more practised clip, while civilians pull from the waistband. Read the job from your framework and choose the timing accordingly. Keep it short either way — a draw longer than about one and a half seconds feels like lag rather than realism.

## Clothing-based holsters

Many police clothing packs include two versions of the duty belt: holster with a pistol and holster empty. A holster script can switch between them with `SetPedComponentVariation` when the weapon is drawn and put away, so the belt matches what is in the officer’s hand. The drawable numbers depend on your clothing pack.

## Built-in unholster clips

GTA V already plays short unholster clips defined in pedpersonality.meta (the `UNHOLSTER_*` groups). A script-driven draw replaces the feel of those with a longer, visible motion. If an addon weapon’s built-in unholster looks wrong, check its entries there — see [weaponanimations.meta](https://fam-tools.com/guides/fivem-weaponanimations-meta).

## Questions

### How do I add a holster animation in FiveM?

Detect when the player switches from unarmed to a sidearm, play a draw animation such as `reaction@intimidation@1h` / `intro`, and block firing until it ends.

### Can players skip the draw animation?

Not if the script disables firing and aiming during it. Without that, they can shoot immediately.

### Does a holster script cost performance?

Very little if it checks the weapon about ten times a second and only runs per-frame code during the animation itself.

### Can the belt show the gun holstered?

Yes, with clothing packs that include full and empty holster drawables, switched with `SetPedComponentVariation`.

## Related

- https://fam-tools.com/guides/fivem-weaponanimations-meta
- https://fam-tools.com/guides/fivem-recoil-script
- https://fam-tools.com/guides/fivem-police-armory-setup
- https://fam-tools.com/guides/fivem-weapon-balance-roleplay
