Knowledge from the fieldRedM

No standing knife/axe sharpen anim — use lean-table dict; the obvious `world_human_knife_sharpen` dict is fake

learning:42

No standing knife/axe sharpen anim — use lean-table dict; the obvious world_human_knife_sharpen dict is fake

Trap

You need a standing "sharpen tool on whetstone" animation. You grep for sharpen in the in-game anim list (or you copy a snippet from an old paid script) and land on:

dict: amb_work@world_human_knife_sharpen@male_a@base
clip: base

The name reads perfectly, it's even what several public RedM scripts ship with — but RequestAnimDict never resolves it. HasAnimDictLoaded returns false indefinitely. There's no error printed; the script just silently skips TaskPlayAnim and the player stands still while your progress bar runs. If you also attached a whetstone prop to the hand it floats in mid-air — looks like the anim is "broken" but actually it never started.

Verified empirically (gameBuild 1491): dbg_playanim amb_work@world_human_knife_sharpen@male_a@base base

loaded=false waited=1500ms

The dict does not exist in the streaming archives. It's a phantom name that probably came from a GTA V cross-port assumption.

What actually works

Every sharpen_axe@* and sharpen_knife@* dict that DOES exist is bound to a seated scenario (seat_stump, seat_chair) — playing them standing leaves the ped floating with no chair under them. The one usable standing-friendly dict is:

dict: amb_rest_lean@world_human_lean@table@sharpen_knife@male_a@idle_a
clip: idle_a

It's the "lean on table sharpening knife" idle. Loads in ~50ms, plays standing without a table prop, reads clearly as a sharpening pose. Confirmed:

loaded=1 waited=50ms playing=1

Recipe

local dict = "amb_rest_lean@world_human_lean@table@sharpen_knife@male_a@idle_a"
RequestAnimDict(dict)
local t = 0
while not HasAnimDictLoaded(dict) and t < 20 do Wait(50); t = t + 1 end
if HasAnimDictLoaded(dict) then
    TaskPlayAnim(ped, dict, "idle_a", 8.0, -8.0, -1, 1, 0, false, false, false)
end

To sell it, attach the whetstone (p_sharpeningstone01x) to SKEL_L_Hand and the tool being sharpened (p_hatchet01x, p_pickaxe01x, …) to SKEL_R_Hand. The off-hand tool prop is what makes the generic "knife idle" read as a tool-sharpen.

If you need a sit-on-stump axe-sharpen specifically

Use TASK_START_SCENARIO_IN_PLACE_HASH(ped, GetHashKey("PROP_HUMAN_SEAT_STUMP_SHARPEN_AXE"), …) — but that needs a nearby stump scenario point to bind, so it only works in places where the game already has those points (camps).

Why this matters

Multiple production scripts (paid 556_lumberjack / 556_mining and their forks) shipped with the dead dict. The whetstone "worked" — durability restored server-side — but visually the player just stood there. Easy to miss in QA, baffling when reported, and the fix is one string.


Tags: animation, sharpen, whetstone, anim-dict, task-play-anim, tools
Category: discoveries
Source: scandi-rp
Created: 2026-05-26T13:39:30.100Z

Back to documentation