07/10/2026 · Updated 11/10/2026

Free FiveM minigame scripts: lockpick and safe cracking in one export call, plus rewards cheaters can't fake

Free FiveM minigame scripts from X3D: X3D Lockpick (WASD pin finding), X3D Safe Cracking (GTA-style dial with no dependencies, not even ESX) and X3D House Robbery, which uses both. One blocking export call, difficulty you set, other keys blocked while playing, and server-side code that stops players from simply reporting a win.

Minigames give city jobs a rhythm: picking a door, cracking a safe, robbing a house. Most minigame scripts share the same problems, though. They need several layers of callbacks, they don't block other keys while running, and worst of all they pay out whenever the player's PC says it passed, which a cheat menu can claim every second.

This post rounds up X3D's free minigames and how to wire them into your scripts safely.

Related scripts

Free minigames ready to use

Script How it plays Call Needs
X3D Lockpick find the pin with WASD, close or far, ESC to give up exports['x3d_lockpick']:miniGameLockPick(4) no framework
X3D Safe Cracking turn the dial with A/D, the light comes on at the notch, press E exports['x3d_safe']:createSafe(4) no dependencies at all, not even ESX
X3D House Robbery pick the door, search the rooms, crack the safe, walk out uses both minigames above (separate install) or ox_lib ESX / standalone

All three are free, in Thai and English.

X3D Lockpick: pick anything

local ok = exports['x3d_lockpick']:miniGameLockPick(4)
if ok then
    -- open the door, start the car, open the locker
end
  • Difficulty is the pin count. 3–6 is the useful range: a house door 3, a safe 5, a storeroom 6
  • One blocking call hands you the result; no callbacks or events to chase
  • Dying mid-attempt, or the resource stopping, closes the minigame and returns false, so nobody gets stuck on screen

X3D Safe Cracking: a GTA-style safe

local ok = exports['x3d_safe']:createSafe(4)
if ok then
    -- hand over what was inside
end
  • Difficulty is the lock count: a house safe 3, a shop safe 4, a bank safe 6
  • Uses the game's own dial texture and turning sounds (MPSafeCracking, SAFE_CRACK), so not a byte of streamed content
  • No dependencies: works on ESX, QBCore or standalone

Blocking other keys while it runs

Both set a state bag any script can read:

if LocalPlayer.state.minigame then return end

Put that line in your inventory, menu or phone key handler and players can't open a second UI mid-pick, which is both a dupe route and an FPS drain. X3D Progress Bar uses the same state bag. If you'd rather drive a HUD yourself, listen to x3d_lockpick:active or x3d_safe:active.

Paying out without getting cheated

The minigame always runs on the player's PC, so its "passed" result can't be trusted on its own: a cheater can fire your reward event without playing at all. The rule is that the server opens the attempt and the server decides whether that attempt pays:

-- server
local attempts = {}

RegisterNetEvent('myrob:start', function(spotId)
    local src = source
    if not nearSpot(src, spotId) or onCooldown(spotId) then return end
    attempts[src] = { spot = spotId, at = os.time() }
    TriggerClientEvent('myrob:play', src, spotId)
end)

RegisterNetEvent('myrob:finish', function(ok)
    local src = source
    local a = attempts[src]
    attempts[src] = nil
    if not a or not ok then return end
    if os.time() - a.at < MIN_SECONDS then return end
    if not nearSpot(src, a.spot) then return end
    startCooldown(a.spot)
    giveLoot(src, a.spot)
end)

AddEventHandler('playerDropped', function()
    attempts[source] = nil
end)
-- client
RegisterNetEvent('myrob:play', function()
    local ok = exports['x3d_lockpick']:miniGameLockPick(4)
    TriggerServerEvent('myrob:finish', ok)
end)

nearSpot, onCooldown, startCooldown, giveLoot and MIN_SECONDS are your own script's functions and value. What this closes:

  • Sending finish(true) alone does nothing: the server must have opened an attempt first, and each attempt pays once
  • Finishing faster than a real player could earns nothing
  • The player must still be at the spot when finishing, not open an attempt and teleport away
  • Loot and cooldowns live on the server; the client never picks them

The same rules apply to every script that moves money or items; the full version is in basic FiveM server security without an anticheat.

A finished example: X3D House Robbery

If you'd rather not build it, X3D House Robbery is a complete house robbery loop on top of both minigames: walk up to a house that hasn't been hit, press E, pick the door, search the rooms for randomised loot, crack the safe for the better haul, and walk out. A robbed house goes on cooldown and its label turns red. Floor and safe loot have separate tables, and everything is set in config.lua.

Install: since 1.2.0 the minigames are no longer inside the House Robbery zip. Download X3D Lockpick and X3D Safe Cracking separately (free), put them in resources/ and ensure them first. Without them it falls back to the ox_lib skill check (Config.Minigame = 'auto'):

ensure x3d_lockpick
ensure x3d_safe
ensure x3d_houserobbery

(The minigames are separate resources because FiveM allows one ui_page per resource and each minigame has its own screen.)

FAQ

Does it work with QBCore? — X3D Lockpick and X3D Safe Cracking are framework-free; call the export from any script. X3D House Robbery runs on ESX or standalone.

How do I change the difficulty? — Pass the number to the export: pins for the lockpick, locks for the safe.

Does a player get stuck if they die mid-game? — No. The minigame closes and returns false.

Is there a shop robbery? — Right now there is the house robbery (X3D House Robbery). To build a shop robbery yourself, combine the lockpick and safe with the server code above, or talk to the team about custom work through a Discord ticket.

The other free scripts are in free FiveM scripts.

Related scripts