Vault. Docs / Dead Man’s Deal Buy Now

Documentation

Dead Man’s Deal

A liar’s bar card game settled with a revolver.

Installing

  1. Drop vault_deadmansdeal into your resources folder.
  2. Add ensure vault_deadmansdeal to server.cfg.
  3. Start the server and read the one line it prints.

Do step three. The boot line checks every prop, animation and model the script wants against the game build you are actually running, and names anything missing — before a player finds it for you.

What it needs

RequiredNotes
NothingNo hard dependencies. It runs on a bare server.
OptionalNotes
FrameworkQBox, QB-Core or ESX. Detected automatically.
ox_libUsed for notifications if it is running. Probed at runtime.
ox_inventoryOnly if you want the buy-in taken from inventory money.
ox_targetOff by default. The built-in E prompt needs nothing.

With no framework at all it runs standalone and keeps its own wallet in data/wallets.json. That is a working mode, not a stub — delete the file to reset every balance.

Placing a table

One demo table, behind one switch. It is there so the first thing you can do after starting the server is walk up to a table and press E — which is the only way to tell "installed correctly" from "installed and broken". Set Config.demoTable = false once you have your own. There is nothing to hunt down and delete.

Stand where you want the middle of the table, facing the way you want it to face, and run /dmdhere. A real table and three chairs appear around you, and a panel on the left shows the live centre, the heading and every key:

KeyWhat it does
Arrow keysMove it. Hold SHIFT for coarse steps.
[ and ]Turn it.
Page Up / DownRaise and lower it.
PFurniture on or off.
RBring it back to where you are standing.
EnterPrint a Config.tables block to F8.
BackspaceRemove the preview.

Paste the block into Config.tables and restart the resource. What you are nudging is the real furniture, placed by the same code that places it for players — so what lines up in the preview is what they walk up to.

The block carries a centre, a heading and auto = true. Everything else — where the three chairs sit, which way they face, how far back from the seat they are — comes from Config.placement, so it is right for every table at once and there is nothing to measure per table.

A table with no furniture

If your map or MLO already has a card table in it, you do not want a second one growing out of the middle of it. props = false places nothing at all — no table, no chairs — while the seats, the prompts and the E stay exactly as they are. Press P in /dmdhere and that is the block it prints.

There are two smaller switches for the common half-way case, a map that carries the table but not the chairs: Config.placement.spawnTable and Config.placement.spawnChairs. A map almost never has a chair standing exactly where a seat was captured, so chairs default to on even when the table is off.

Write seats or props onto a table by hand and they win: auto is a default, not a cage. That is how you get four chairs, or your own dressing, on a table that wants something other than the standard layout.

With props, or without

The section above is per table. This is the whole server, and it goes further: Dead Man's Deal will run with nothing in the world at all. No table, no chairs, no bodies in the seats, no camera move — you walk to a point, press E, and play the game in the interface.

One line does all of it: Config.world = false.

Or pick what you keep. Each of the four is independent, and each is a piece of the scene rather than a piece of the game:

SwitchWhat turning it off removes
Config.world.furnitureThe table and the chairs. The seats, the prompt and the E stay.
Config.world.pedsThe bodies. AI players still take their seats, hold cards and bluff — they just have nothing standing there.
Config.world.seatingYour ped sitting down, the seated animations and the table camera. You stay where you are and the game opens.
Config.world.handPropsCards in hands, and the revolver. Both are in the interface anyway.
Config.world.ambientPedsAI players at tables you are not sitting at. The one to turn off on a busy server: an AI player is a local ped, so this is the only setting that costs more the more tables you run.

Nothing about the game changes. Same twenty-card deck, same odds, same six chambers that never reset, same money, and a live round still does exactly what Config.server.killPlayer says it does. The scene is what you are switching off, not the stakes.

A prop a switch has turned off is never asked for, so it can never be reported missing — a card model that does not exist is not a problem on a server that was never going to spawn one.

What you can change

The money, the tables, the look, the timings, the animations, the AI players and the notifications are all yours. So are the locales — seven languages ship and both config.lua and locales/ are excluded from escrow.

The rules of the game are fixed. The twenty-card deck, the five-card hand, the one-to-three play, the six chambers and what a timeout does are balanced against each other and are not a tuning surface. Dead Man's Deal is one game, and a config that can quietly turn it into a different one is a config that generates support tickets about a game nobody shipped.

Three switches exist for fitting it to your server rather than changing the game, in Config.server: whether a fatal pull really kills the ped, what health a non-fatal one leaves, and whether the script drives facial animation.

Money

The host names the wager when they sit down first, inside the range you set in Config.money.stakeRange. The server clamps to that range and refuses anything outside it, so the limits are real limits rather than a suggestion in the interface.

The buy-in is taken when a player sits down, not when the match starts, and standing up before the cards come out refunds it in full. That means the pot shown on the table is always money that has actually been committed.

houseCut takes a percentage for the house. Set houseAccount to send it somewhere, or leave it nil and the cut simply leaves the economy.

The revolver

Six chambers, one round, and it does not reset between pulls. Surviving is not good news: the next pull is one in five, then one in four. That escalation is the reason a match ends.

The odds ride with a player for the whole match. This is fixed — it is the tension curve the game is built around, and it is not a setting. See What you can change below.

AI players

A host can call an AI player into any empty chair. They hold cards, take turns, bluff, call, and pick up the gun like anybody else.

They are not a substitute for a busy table so much as a way of never needing one. Fill all the empty seats and play alone, fill none and play three real players, or fill one and play two — a table can be any mix, and an AI player leaves the moment a real one takes the chair.

Config.bots.difficulty runs 1 to 3: loose and challenges on a hunch, normal, or counting what it holds and reading the odds. Set adminOnly if you would rather they were a testing tool than a game mode.

They are optional in both directions. Leave the seats empty and the table waits for real players; call one in and it plays until somebody wants the chair. With Config.world.peds = false they have no body at all — the seat, the cards and the bluff are the same, and there is nothing standing in your map.

Changing the words

Every string is in locales/en.lua — 118 of them, and none hardcoded anywhere else. Copy the file, translate it, and point Config.locale at it.

The file sits outside escrow, so it stays editable after purchase. Ship a new one and point Config.locale at it rather than editing en.lua — an update will overwrite the English file and leave a copy alone.

Every config table

The whole surface, in the order it appears in the file. Each one has a comment block above it explaining what the default is for and why.

TableWhat it controls
Config.localeWhich file in locales/ to load.
Config.framework'auto', or force 'qbx', 'qb', 'esx', 'standalone'.
Config.standaloneStarting balance and the JSON wallet path used with no framework.
Config.moneyAccount, default buy-in, confirm prompt, who sets the stake, the stake range, house cut and account, disconnect forfeit.
Config.revolverChamber count, bullets or chamber mode, when the cylinder resets, whether it respins each pull.
Config.botsWhether AI players can be called in, admin-only, difficulty 1–3, think time, how they stake, their names and ped models.
Config.timingsThirteen values in milliseconds: lobby countdown, turn timer, deal, play beat, reveal flip and hold, the revolver raise, spin, strike and result, elimination hold, round break, victory hold.
Config.interactionPrompt distance, render distance, the key and its label, whether to use ox_target, the prompt panel and the world marker.
Config.animSitting, holding cards, playing them, accusing, and the gun. Each a dictionary and clip.
Config.propsCard, revolver and stake models. Each is a candidate list — the first one your build has is used.
Config.effectsBlood and its settling, camera shake and how hard, and how far away the shot is audible.
Config.cameraThe over-shoulder shot: seat-relative offset, what it looks at and at what height, FOV, ease in and out, and the idle breathe.
Config.hudHiding the game HUD and radar while seated, which controls stay live, whether ESC leaves, camera lock, and the exports and events fired for other resources.
Config.tauntsOn or off, cooldown, whether the dead may taunt, how long the plate stays, and the eight gestures with their animation candidates.
Config.themeEvery colour the interface uses, the corner radius, whether the odds show, dimming on other turns, the logo, the title and subtitle, the result art.
Config.notifyNotification style and how long one stays.
Config.soundMaster switch, volume, every game cue and the gunshot.
Config.worldHow much of the scene exists: furniture, AI player bodies, your own ped sitting down, and props in hands. Config.world = false turns off all four and the game runs in the interface alone.
Config.placementThe shape of a table: the three seat offsets, seat drop, chair model, set-back and yaw, and whether any of it is placed at all. Used by /dmdhere and at runtime, so one change moves every table.
Config.demoTablefalse and the one table shipped in Config.tables never loads.
Config.tablesWhere the tables are. Each entry is a centre, a heading and auto = true, printed by /dmdhere.
Config.adminThe ace, which framework groups also pass, and the name of all ten commands.

Hooking other resources in

Config.hud.exports and Config.hud.events decide what this script announces to the rest of your server. Turn them on and you can hang your own logic off a match starting, a player being sent to the gun, or a table paying out — a stat tracker, a battlepass, an achievement, a Discord webhook.

Nothing else in the script depends on them, so leaving them off costs nothing.

Commands

CommandWhat it does
/dmdvalidateAudits every prop, animation and model against your gamebuild and names which candidate won for each. The boot line already says this; run it when you want the whole list.
/dmdhereBuilds a table where you stand: a live preview you nudge into place, and a panel listing every key. Enter prints the config block.
/dmdresetClears a stuck table and refunds it. No argument resets all of them.
/dmdstatsWhat every table is doing right now. Works from the server console.

If something is wrong

Peds standing in the floor. Almost always a seat coordinate somewhere other than where the chair is. Re-build the table with /dmdhere and use what it prints — the preview is the real furniture, so a seat that is wrong is visible before you commit it. /dmdseat tunes the height without a rebuild.

Props floating or missing. Check the server console on start. A model your build does not have is skipped rather than breaking the table, and the boot line names the one it settled on for every prop — so the console says which, before a player finds it for you.

Nothing happens at the table. Check the server console on start: if the framework probe failed it says so in one line, and the fix is usually setting Config.framework by hand instead of leaving it on auto.

Questions go to the Discord — somebody will read it and reply.