Skip to content

Cards: config files ​

These files stay readable in every build (escrow too), so you can change them. Shown as shipped in version 1.1.0.

config.lua ​

lua
Config = {}

-- ════════════════════════════════════════════════════════════════════════════
--  Lumo Cards (Callbreak · Teen Patti · Rummy · Blackjack) — configuration
--  Everything a server owner normally changes is at the top.
-- ════════════════════════════════════════════════════════════════════════════

-- Framework is detected automatically: qbx_core, qb-core, es_extended, or none.
-- Force one with 'qbx' | 'qb' | 'esx' | 'standalone'.
Config.Framework = 'auto'
-- Target is detected automatically: qb-target first, then ox_target, else a built-in [E] prompt.
-- Force one with 'ox' | 'qb' | 'none'.
Config.Target = 'auto'

-- Developer commands and console output. Keep false on a live server.
Config.Debug = false

-- ── Players ─────────────────────────────────────────────────────────────────
Config.Command = { 'cards', 'callbreak' } -- opens the lobby while standing at a table
Config.LeaderboardCommand = 'callbreakboard' -- /callbreakboard [teenpatti|rummy|blackjack]
Config.UseCommandAnywhere = false       -- true = /cards works away from tables
Config.TableDistance = 1.6              -- metres from a table to play
Config.AllowSolo = true                 -- start a game against 3 AI players
Config.AllowSpectators = true

Config.Rounds = 5                       -- Callbreak deals per game (classic = 5)
Config.RoundSummarySeconds = 7
Config.GameOverSeconds = 12
-- Seconds a player has to act before the table moves for them (Callbreak:
-- best card, Teen Patti: pack, Rummy: draw + throw it back, Blackjack: stand
-- / minimum bet). 0 = wait forever.
Config.TurnSeconds = 30

-- ── Games ───────────────────────────────────────────────────────────────────
-- Every placed table is either locked to one game or set to "any" (the host
-- picks in the lobby). enabled = false hides a game everywhere.
-- Chip games (Teen Patti, Blackjack) give every player `buyIn` chips. With
-- Config.Bet.enabled the buy-in is real money, taken at the start and paid
-- back as chips at the end; otherwise the chips are just for fun. Tables with
-- bots never use real money.
Config.Games = {
    callbreak = { enabled = true, rounds = 5 },  -- stake: Config.Bet.amount
    teenpatti = {
        enabled = true,
        buyIn = 1000,
        boot = 10,          -- everyone pays this into the pot each hand
        maxStake = 160,     -- the blind stake stops doubling here (seen = 2x)
        potLimit = 1280,    -- the pot reaching this forces a showdown
        maxBlind = 4,       -- blind bets before you must look at your cards
        hands = 6,          -- hands per table
    },
    rummy = {
        enabled = true,
        rounds = 3,         -- deals per table; lowest total wins
        decks = 2,
        firstDrop = 20,     -- drop before your first discard
        middleDrop = 40,    -- drop later (and leaving mid-deal)
        -- stake = 250,     -- per player; defaults to Config.Bet.amount
    },
    blackjack = {
        enabled = true,
        buyIn = 1000,
        bets = { 25, 50, 100, 250 }, -- bet buttons; the first is the minimum
        rounds = 8,
        decks = 4,
        hitSoft17 = false,  -- true = dealer hits soft 17
        blackjackPays = 1.5,
    },
}

-- Challenge another player through the target eye (needs ox_target or qb-target).
Config.Challenge = {
    enabled = true,
    game = 'callbreak',    -- played at "any" tables (locked tables play their own game)
    tableDistance = 2.8,   -- both players must be this close to the same table
    playerDistance = 3.0,
    timeoutSeconds = 15,
}

-- Optional cash stake: each player pays `amount`, the winner takes the pot
-- (Callbreak, Rummy). Teen Patti / Blackjack use their buy-in instead.
-- Refunded if the game is abandoned. Ignored on standalone servers.
Config.Bet = {
    enabled = false,
    amount = 250,
    account = 'cash',   -- 'cash' or 'bank' (ESX 'money' is mapped automatically)
}

-- Chance the winner also receives an item. Item names must exist in your inventory.
Config.WinReward = {
    enabled = false,
    chance = 25,
    items = {
        { item = 'water_bottle', amount = 1 },
        { item = 'sandwich', amount = 1 },
    },
}

-- ── Admin table placement ───────────────────────────────────────────────────
-- /callbreaktables opens the admin panel. Place a table + 4 chairs with the fly
-- camera and the gizmo, pick models, save. Tables are stored in the database
-- (created automatically) and spawned for everyone within spawnDistance.
-- tableModel 'none' = play on an existing world/MLO table.
Config.Admin = {
    command = 'callbreaktables',
    permissions = { 'admin', 'god' }, -- QBCore/Qbox groups, ESX groups ('admin', 'superadmin')
    ace = 'command',                  -- or anyone allowed this ACE (txAdmin admins have it)
    maxPlaceDistance = 40.0,          -- admin must stand this close to what they save
    spawnDistance = 80.0,
    tableModels = {
        { model = 'apa_mp_h_din_table_04', label = 'Round dining table' },
        { model = 'hei_heist_din_table_07', label = 'Square dining table' },
        { model = 'ch_prop_casino_poker_01a', label = 'Casino card table' },
        { model = 'prop_chateau_table_01', label = 'Chateau table' },
        { model = 'prop_table_03', label = 'Café table' },
        { model = 'none', label = 'None (use a world table)' },
    },
    -- yaw: extra prop rotation; stock GTA chairs face -Y, hence 180.
    -- sitZ: lift the seated ped this many metres for that chair model.
    chairModels = {
        { model = 'apa_mp_h_din_chair_08', label = 'Dining chair', yaw = 180.0, sitZ = 0.47 },
        { model = 'ch_prop_casino_chair_01a', label = 'Casino chair', yaw = 180.0, sitZ = 0.08 },
        { model = 'bkr_prop_clubhouse_chair_01', label = 'Clubhouse chair', yaw = 180.0, sitZ = 0.08 },
        { model = 'prop_chair_01a', label = 'Plastic chair', yaw = 180.0, sitZ = 0.05 },
        { model = 'none', label = 'None (use world chairs)', yaw = 0.0 },
    },
    chairGap = 0.42,       -- auto-arrange: metres from the table edge to each chair
}

-- ── AI players ──────────────────────────────────────────────────────────────
-- NPCs seated in the bots' chairs (local peds; everyone sees the same person).
Config.BotPeds = {
    'a_m_y_business_02', 'a_f_y_business_02', 'a_m_m_indian_01', 'a_f_y_indian_01',
    'a_m_y_hipster_02', 'a_f_y_hipster_02', 'a_m_m_bevhills_02', 'a_f_m_bevhills_01',
    'a_m_y_vinewood_03', 'a_f_y_vinewood_02',
}
Config.BotSitZ = 0.0       -- extra lift for NPCs only (their sit clip differs slightly)

-- ── Seating ─────────────────────────────────────────────────────────────────
Config.SeatPlayers = true  -- sit players in their chair when a game starts
Config.SeatZOffset = 0.0   -- raise (+) / lower (-) every seated player, in metres

-- ── 3D table ────────────────────────────────────────────────────────────────
-- The game is played on real casino card props (nothing streamed): your hand
-- fans out in front of you, the others' hands are face-down piles, and a DUI
-- mat in the middle shows names, calls, tricks and the 1-13 call grid.
-- Mouse wheel / V switches between the close view and the whole-table view.
-- Backspace twice leaves. enabled = false falls back to the 2D NUI table.
Config.Table3D = {
    enabled = true,
    camHeight = 1.28,      -- close view: metres above the table top
    camBack = 1.0,         -- close view: pulled back over your chair
    camAim = 0.14,         -- close view: aim point offset towards you
    camFov = 46.0,
    overview = { height = 2.3, back = 2.1, aim = 0.0, fov = 52.0 },
    startView = 'focus',   -- 'focus' or 'overview' when you sit down
    lamp = { height = 1.0, range = 1.8, intensity = 0.35 }, -- soft light over the cards; nil = off
    camSway = false,
    defaultRadius = 0.45,  -- table radius when it can't be measured (world/MLO tables)
    surfaceOffset = 0.0,   -- nudge if cards sink into (-) or float above (+) the table
    fallbackHeight = 0.45, -- table height above coords.z if the surface ray misses
    faceUpRoll = 0.0,      -- 180.0 if played cards show their backs
    handYawOffset = 0.0,   -- 180.0 if your own cards read upside down
    trickScale = 1.6,      -- card size multiplier (your view only); 1.0 = life size
    handScale = 1.6,
    pileScale = 1.6,
    trickTilt = 18.0,      -- played cards lean towards you (degrees)
    trickFaceMe = true,    -- played cards turn upright for you
    handTilt = 30.0,       -- your hand leans back like cards on a stand
    handGap = 0.003,       -- metres between cards in your hand
    handFan = 0.0,
    handCurl = 0.0,
    trickJitter = 2.0,
    cardWidth = 0.063, cardLength = 0.088,
    matAlpha = 235,
    feltColour = { 14, 46, 32, 245 }, -- cloth under the cards (nil = bare table)
    feltScale = 0.94,
    hoverColour = { 182, 243, 106, 255 },
    dealMs = 260, dealStaggerMs = 40, playMs = 380, sweepMs = 420,
    leaveKey = 194,        -- Backspace; press twice within 3 s to leave
    debugCommand = 'cards3dtest', -- demo deal at the nearest table (Config.Debug only)
}

-- Fallback camera for the 2D table (Table3D.enabled = false).
Config.TopDownCamera = true
Config.CamHeight = 2.9
Config.CamBack = 0.9
Config.CamFov = 46.0
Config.CamSway = true
Config.CamHideHud = true   -- hide the minimap while the table camera is active

-- ── Fixed tables (optional) ─────────────────────────────────────────────────
-- Admin-placed tables are the normal way. To hard-code tables instead, set
-- UseConfigTables = true and add entries (chairs are vector4 with the sit heading):
-- {
--     coords = vector3(x, y, z), size = vec3(1.4, 1.4, 1.0), heading = 0.0, blip = true,
--     chairs = { vector4(...), vector4(...), vector4(...), vector4(...) },
-- },
Config.UseConfigTables = false
Config.Tables = {}
if not Config.UseConfigTables then Config.Tables = {} end

Config.ShowBlips = false
Config.ShowMarkers = false
Config.BlipSprite = 679
Config.BlipColour = 5
Config.BlipName = 'Card Table'

-- Spawn props at fixed Config.Tables (admin tables spawn their own).
Config.SpawnProps = false
Config.Prop = {
    tableModels = { 'prop_poker_table_01', 'ch_prop_casino_card_table_01a', 'prop_table_03' },
    chairModels = { 'prop_chair_01a', 'prop_chair_01b', 'v_ilev_chair01' },
    chairCount = 4,
    radius = 0.95,
    chairYaw = 0.0,
}

-- Config.Debug only: /cardtablehere prints your position for Config.Tables.
Config.DevPlaceCommand = 'cardtablehere'