--[[ m-banking — config.lua Everything a server owner is expected to tune lives here. Anything that touches *other resources* (notifications, sounds, progress bars, webhooks) lives in customize_me.lua instead. ]] Config = {} -- ───────────────────────────────────────────────────────────────────────────── -- General -- ───────────────────────────────────────────────────────────────────────────── -- true = interact through ox_target -- false = interact through ox_lib text UI + [E] Config.UseTarget = true -- Key used when Config.UseTarget = false (38 = E) Config.InteractKey = 38 -- ESX account names. Change these ONLY if your server runs a modified account -- system (e.g. 'checking' instead of 'bank'). Config.CashAccount = 'money' Config.BankAccount = 'bank' -- Distance the server allows between the player and the bank/ATM they claim to -- be using. Anything further away is treated as an exploit attempt. Config.MaxInteractDistance = 4.0 -- How long an open banking session stays valid without activity (seconds). Config.SessionTimeout = 300 -- Print transaction info to the server console (useful while testing). Config.Debug = false -- ───────────────────────────────────────────────────────────────────────────── -- IBAN -- ───────────────────────────────────────────────────────────────────────────── -- Country/bank prefix. Slovenian IBANs start with SI56. Config.IBANPrefix = 'SI56' -- Digit groups generated after the prefix. {4, 4, 4, 3} => SI56 1234 5678 9012 345 Config.IBANGroups = { 4, 4, 4, 3 } -- Separator used when the IBAN is displayed. Stored value keeps the separator, -- but lookups are whitespace-insensitive. Config.IBANSeparator = ' ' -- Cost of manually changing your IBAN (taken from the bank balance). Config.IBANChangeCost = 2500 -- Keep the previous IBAN in bank_iban_history for audit / old transfer lookups. Config.IBANKeepHistory = true -- ───────────────────────────────────────────────────────────────────────────── -- Limits & fees -- ───────────────────────────────────────────────────────────────────────────── Config.MinDeposit = 1 Config.MaxDeposit = 1000000 Config.MinWithdraw = 1 Config.MaxWithdrawPerTransaction = 25000 Config.DailyWithdrawLimit = 100000 -- set to 0 to disable -- ATMs can be stricter than the teller. Config.ATMMaxWithdrawPerTransaction = 5000 Config.MinTransfer = 10 Config.MaxTransfer = 250000 -- Transfer fee. type = 'flat' | 'percent' Config.TransferFee = { type = 'percent', value = 1.0, -- 1% when 'percent', or a fixed amount when 'flat' min = 5, -- floor for percentage fees (ignored when 0) max = 500 -- ceiling for percentage fees (ignored when 0) } -- Anti-spam. Player may do at most `max` transfers per `window` seconds, -- and must wait `cooldown` seconds between any two transfers. Config.TransferRateLimit = { max = 5, window = 60, cooldown = 3 } -- Generic cooldown (seconds) applied to deposit/withdraw events. Config.ActionCooldown = 1 -- How many rows the Transactions tab pulls. Config.HistoryLimit = 50 -- ───────────────────────────────────────────────────────────────────────────── -- ATM cards & PIN -- ───────────────────────────────────────────────────────────────────────────── -- ox_inventory item name for the bank card. Must match data/items.lua. Config.CardItem = 'creditcard' Config.PinLength = 4 Config.ATMMaxPinAttempts = 3 Config.ATMLockoutTime = 900 -- seconds the account is locked after too many failures -- Confiscate (remove) the card from the inventory once the account locks out. Config.ConfiscateCardOnLockout = false -- Cost of buying a card at the teller. New characters start with NO card and -- must buy one before any ATM will work for them. Config.NewCardCost = 500 -- buying a card (first one included) Config.ReplaceCardCost = 750 -- reporting a card lost/stolen + reissue -- ───────────────────────────────────────────────────────────────────────────── -- Animations -- ───────────────────────────────────────────────────────────────────────────── --[[ Two supported formats per context: Scenario: { type = 'scenario', scenario = 'PROP_HUMAN_ATM' } Anim dict: { type = 'anim', dict = '...', name = '...', flag = 49 } `type` may be omitted — an entry with a `scenario` field is treated as a scenario, one with a `dict` as an animation. ]] Config.Animations = { bank = { type = 'anim', dict = 'anim@amb@prop_human_atm@male@enter', name = 'enter', flag = 49 }, atm = { type = 'scenario', scenario = 'PROP_HUMAN_ATM' } } -- Backwards-compatible aliases (some spec configs reference these directly). Config.AnimationDict = Config.Animations.bank.dict Config.AnimationName = Config.Animations.bank.name -- ───────────────────────────────────────────────────────────────────────────── -- Locations -- ───────────────────────────────────────────────────────────────────────────── -- Blips on the map for each bank zone. Config.ShowBlips = false Config.Blip = { sprite = 108, colour = 2, scale = 0.7 } -- Default zone shape, used for any bank location that doesn't override it. -- size = vec3(width, depth, height) of the interaction box -- rotation = heading of the box in degrees Config.ZoneDefaults = { size = vec3(1.6, 1.6, 2.2), rotation = 0.0, distance = 2.0 -- how close the player must be for the option to appear } -- Set `debug = true` on a location (or flip Config.Debug) to draw the box in -- game while you position it. --[[ Bank teller zones — pure coordinates, no NPC involved. To add your own: stand where the teller should be, run /coords (ox_lib) or any coordinate script, and paste the vec3 below. Only `coords` is required. { coords = vec3(0.0, 0.0, 0.0), -- required, centre of the zone size = vec3(2.0, 1.0, 2.0), -- optional, overrides Config.ZoneDefaults rotation = 45.0, -- optional, box heading distance = 2.5, -- optional, interaction range label = 'Fleeca Legion', -- optional, overrides the target label blip = false, -- optional, set false to hide this blip debug = true -- optional, draw the box in game } ]] Config.BankLocations = { { coords = vec3(149.11, -1040.60, 29.37), rotation = 340.0, label = 'Dostopaj do banko' }, { coords = vec3(-1212.33, -330.50, 37.79), rotation = 24.0, label = 'Dostopaj do banko' }, { coords = vec3(-351.09, -49.61, 49.04), rotation = 340.0, label = 'Dostopaj do banko' }, { coords = vec3(314.19, -278.72, 54.17), rotation = 340.0, label = 'Dostopaj do banko' }, { coords = vec3(-2962.61, 482.35, 15.70), rotation = 88.0, label = 'Dostopaj do banko' }, { coords = vec3(1175.06, 2706.71, 38.09), rotation = 180.0, label = 'Dostopaj do banko' }, { coords = vec3(-112.20, 6470.05, 31.63), rotation = 132.0, label = 'Dostopaj do banko' }, { coords = vec3(241.73, 225.30, 106.29), rotation = 160.0, label = 'Dostopaj do banko' } } -- ATM props. Interaction is bound to these models wherever they exist in the -- world, so no coordinates are needed. Add custom ATM props here. Config.ATMModels = { `prop_atm_01`, `prop_atm_02`, `prop_atm_03`, `prop_fleeca_atm` }