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'