Features
$50$25 Early Access | Purchase on Tebex
Detailed explanation of all nc-banking features.
NPC Banking
Dialog System
Players interact with bank teller NPCs through an immersive dialog interface:
- Camera animation focuses on the NPC
- Typewriter text effect for NPC responses
- Hierarchical menu tree (categories → sub-options)
- Configurable greeting and dialog options per location
8 Bank Locations (17 NPCs)
| Location | NPCs | Blip |
|---|---|---|
| Pacific Standard Bank | 2 tellers | sprite 108, color 2 |
| Fleeca Bank — Vespucci | 2 tellers | sprite 108, color 2 |
| Fleeca Bank — Great Ocean | 2 tellers | sprite 108, color 2 |
| Fleeca Bank — Paleto Bay | 1 teller | sprite 108, color 2 |
| Fleeca Bank — Route 68 | 2 tellers | sprite 108, color 2 |
| Maze Bank | 2 tellers | sprite 108, color 2 |
| Bank of Liberty | 2 tellers | sprite 108, color 2 |
| Maze Bank Tower HQ | 4 tellers | sprite 108, color 3, scale 1.2 |
Each NPC has configurable model, position, blip settings, and dialog text. Multiple tellers per branch share the same blip (only the first has blip.enabled = true).
NPC Locking
When Config.NPCExclusive = true, only one player can use each NPC at a time. Locks auto-expire after Config.NPCLockTimeout seconds.
ATM System
3D NUI Overlay
ATM buttons are rendered as NUI elements positioned over the in-game ATM screen:
- Left buttons: Balance, Deposit, Withdraw, Transfer
- Right buttons: PIN, History, Cancel
- PIN pad with model-specific layouts
Camera Presets
Each ATM model has calibrated camera settings:
- Distance, height, offset, FOV
- Depth of field (blur background)
- Smooth transition animation
ATM Calibration
Admin command /atmcalibrate allows fine-tuning NUI element positions per ATM model. Calibration data is saved to atm_coords.json.
Admin ATM Spawner
/atmspawn [model]— Enter keyboard-based placement mode/atmdelete— Delete nearest spawned ATM- ATMs saved to database, persist across restarts
- Requires
nc-banking.adminACE permission
Keyboard Controls
| Key | Action |
|---|---|
| Q | Move Up (+Z) |
| E | Move Down (-Z) |
| Z | Move Left (camera-relative) |
| C | Move Right (camera-relative) |
| F | Move Forward (camera direction) |
| G | Move Backward |
| Scroll | Rotate heading |
| Shift | Hold for 5x speed |
| Left Click | Snap to nearest wall |
| Enter | Confirm placement |
| Backspace | Cancel |
Wall Snap
Left-click casts 16-directional rays at 3 heights (48 total) to find the nearest wall within 3m. When a wall is found:
- ATM position snaps flush against the wall surface
- Heading auto-rotates to face outward (perpendicular to wall)
- Preview turns brighter green to indicate snap state
- Any movement/rotation key releases the snap for manual adjustment
Account Types
Account Number System
Every account (main, personal, savings, business, shared) is assigned a unique account number on creation.
- Format:
{BankName}-{12 digit number}→ e.g.NC-000000000001 - Configurable via
Config.BankName(prefix) andConfig.AccountNumberLength(digit count) - Existing accounts without numbers are auto-backfilled on server start via database migration
- Account numbers are displayed in the "View Account Numbers" menu (NPC) and "Account Info" (ATM)
Account-Number Based Transfers
Transfers use the recipient's account number instead of server ID:
- Enter the target account number (e.g.
NC-000000000001) - Enter the amount
- The system finds the account across all 5 types automatically
- Self-transfer detection with optional fee waiver (
Config.SelfTransferFee) - Offline player support — transfers to offline players are credited directly via database
Dual Transfer Mode
All transfer UIs (ATM, NPC, Billing App) support two transfer modes:
| Mode | Input | How It Works |
|---|---|---|
| Account Number | NC-000000000001 |
Directly resolves the target account across all 5 types |
| Server ID | 1, 5, 42 |
Resolves the player's citizenid → main account number, then transfers |
Users toggle between modes via tab buttons in the UI. Server ID mode requires the target player to be online and have a bank account.
Auto-Prefix
On ATM keypads (digits only), the bank prefix is automatically prepended. Entering 000000000001 on the ATM is equivalent to entering NC-000000000001. The server also auto-adds the prefix if the input contains no - character.
Transfer Security
| Feature | Config | Default | Description |
|---|---|---|---|
| Cooldown | Config.TransferCooldown |
5s | Minimum seconds between transfers |
| Brute-force Protection | Config.MaxAccountLookupFails |
5 | Failed lookups before temporary block |
| Block Duration | Config.AccountLookupBlockDuration |
60s | How long the block lasts |
| Offline → Main | Config.OfflineTransferMainAccount |
false | Allow transfers to offline player's main account |
| Offline → Sub | Config.OfflineTransferSubAccount |
true | Allow transfers to offline player's sub-accounts |
Business Account Auto-Create
When Config.BusinessAutoCreate = true, business accounts are automatically created for employed players on login (job must not be 'unemployed').
Auto Business Jobs (Server Start)
Configure Config.AutoBusinessJobs to automatically create business accounts for specific jobs when the server starts — no player login required:
Config.AutoBusinessJobs = {
{ job = 'police', label = 'Police Department' },
{ job = 'ambulance', label = 'EMS Department' },
{ job = 'mechanic', label = 'Mechanic Shop' },
}
When an isBoss player logs in, the account's owner_citizenid is automatically updated to that player.
Main Account
The framework's default bank account. Deposit, withdraw, transfer, view balance and history.
Personal Accounts
General-purpose sub-accounts without interest:
- Create up to
maxPersonalAccounts(default: 3) - Custom labels
- Independent balance from main account
Savings Accounts
Interest-bearing accounts:
- Automatic interest payouts at configurable intervals
- Savings goals with target amounts
- Interest history tracking
- Min deposit/withdraw amounts
Business Accounts
Job-linked accounts managed by bosses:
- One account per job
- Boss can create, withdraw, close
- All members can deposit (configurable)
- Linked to framework job system
Shared Accounts
Multi-user joint accounts:
- Owner creates and manages members
- Add/remove members by player ID
- Owner-only withdraw (configurable)
- Up to
maxSharedMembersper account
Loan System
Application
- Credit score determines eligibility and terms
Config.LoanBalanceMultiplierlimits max loan relative to total balance- Choose duration from predefined options (7, 14, 30 days)
Repayment
- Manual payments with minimum amount
- Auto-pay option (percentage-based recurring payments)
Grace Period & Penalties
- Grace period after due date before defaulting
- Late penalties: flat amount or percentage
- Defaulted loans severely impact credit score
Loan Calculator
Preview total cost, interest, and monthly payments before applying.
Credit Score System
Score range: 300 (worst) → 850 (best)
Positive Factors
- Deposits, withdrawals (account activity)
- Fully repaid loans
- Active savings accounts
- High savings balance
- Paid invoices
- Account age
Negative Factors
- Defaulted loans (-80 points each)
- Overdue active loans (-30 points)
- No recent transactions (-20 points)
Tiers
| Tier | Score | Max Loan | Interest Modifier |
|---|---|---|---|
| Poor | 300–449 | $5,000 | +5% |
| Fair | 450–549 | $25,000 | +2% |
| Good | 550–649 | $50,000 | base |
| Very Good | 650–749 | $75,000 | -2% |
| Excellent | 750–850 | $100,000 | -3% |
Invoice / Billing System
Invoices
- Send invoices to players (boss/job or any player)
- Pay from any account type (main, personal, savings, etc.)
- Decline invoices (configurable)
- Bulk pay all pending invoices
- Auto-expire after
InvoiceExpireDays
Job Billing → Business Account
When an invoice has a job field (e.g. sent by police or EMS), the payment is automatically deposited into that job's business account instead of the sender's personal bank account. If no business account exists for the job, payment falls back to the sender's personal account.
This enables realistic billing flows:
- Police fines → Police Department business account
- EMS bills → EMS Department business account
- Custom job bills → Respective business accounts
SendBill Export
For external scripts (police, EMS, mechanic, etc.), use the SendBill export which accepts server IDs instead of citizenids:
-- From any server script:
exports['nc-banking']:SendBill(fromSource, toSource, amount, reason, jobName)
-- Example: Police issuing a fine
exports['nc-banking']:SendBill(source, targetSource, 5000, 'Speeding ticket', 'police')
The jobName parameter ensures the payment goes to the correct business account.
Billing Phone App
Standalone NUI app for managing invoices and transfers:
- Open with F6 keybind or
/billingcommand - View pending, paid, sent invoices
- Send new invoices (by Server ID)
- Transfer money (dual mode: Server ID or Account Number)
- Account carousel for selecting source account
- Phone integration support (coming soon)
Bank Card System
Overview
Cards link to specific accounts and can optionally exist as inventory items.
Issuance Flow
- Player talks to NPC → "Card Services" → "Issue New Card"
- Server fetches player's account list (main, personal, savings, business, shared)
- Player selects an account
- Card is issued (item + DB or DB-only based on
useInventory)
Dual Tracking
- Inventory mode (
useInventory = true): Card exists as item with metadata (account_type, account_id, label, description) - DB mode (
useInventory = false): Card tracked only innc_banking_cardstable
ATM Card Check
When requireForATM = true, players must have at least one card to use ATMs.
Per-Account Uniqueness
Only one card can be issued per account. Duplicate cards for the same account are blocked.
PIN Security
- PINs stored as SHA-256 hashes (auto-migrated from plain text)
- Configurable attempt limit with timed lockout
- Separate toggle for ATM and NPC PIN requirements
- Default PIN auto-detection prompts change
Auto Systems (Server Timers)
| System | Interval | Description |
|---|---|---|
| Savings Interest | Configurable (default: 60min) | Auto-credit interest to all savings accounts |
| Loan Auto-Pay | 5 minutes | Process automatic loan payments |
| Loan Enforcement | 10 minutes | Check grace periods, apply penalties, default expired loans |
| Invoice Expiry | 10 minutes | Mark expired invoices |
External UI Toggle
Automatically hide other resource UIs when banking NUI opens:
- Export-based: call an export with show/hide arguments
- Event-based: trigger client events with arguments
- Configurable per-resource in
Config.ExternalUIToggle
Multi-Language (i18n)
nc-banking includes a full internationalization system covering both server-side messages and NUI text.
Supported Languages
| Code | Language | File |
|---|---|---|
en |
English | locales/en.lua |
de |
German | locales/de.lua |
es |
Spanish | locales/es.lua |
fr |
French | locales/fr.lua |
pt |
Portuguese | locales/pt.lua |
How It Works
- Server-side:
shared/locale.lualoads the selected locale file and providesL()function for translated strings - NUI-side:
web/src/utils/locale.jsreceives locale data from the server and providest()function in Vue components - All notification messages, error texts, dialog labels, and UI strings are translatable
- Set language via
Config.Locale = 'en'inconfig/config.lua
Adding a New Language
- Copy
locales/en.luatolocales/xx.lua(your language code) - Translate all string values
- Set
Config.Locale = 'xx'in config - Add the file to
fxmanifest.luafiles list (already useslocales/*.luaglob)
Modern NUI (Vue 3 + Vite)
The entire banking UI is built with Vue 3 Single File Components and bundled with Vite.
4 Modular Apps
| App | File | Purpose |
|---|---|---|
| DialogApp | web/src/apps/DialogApp.vue |
NPC bank teller dialog with typewriter effect |
| AtmApp | web/src/apps/AtmApp.vue |
3D ATM overlay with PIN pad and model presets |
| BankApp | web/src/apps/BankApp.vue |
Full banking interface (accounts, transfers, loans, etc.) |
| BillingApp | web/src/apps/BillingApp.vue |
Invoice management and transfer UI |
Architecture
web/src/main.js— Vue app entry point, mounts all 4 appsweb/src/utils/bridge.js— Lua ↔ NUI message router (handlespostMessageevents)web/src/utils/locale.js— NUI-side i18n witht()helperweb/src/styles/global.css— Shared CSS variables and base styles- Built output goes to
html/assets/via Vite
Development
cd web
npm install
npm run build # Production build → ../html/assets/
npm run dev # Dev server with HMR (for local development)
Multi-Framework Support
nc-banking auto-detects your framework at startup and loads the appropriate bridge:
| Framework | Detection | Bridge |
|---|---|---|
| QBCore | qb-core resource |
bridge/frameworks/qbcore.lua |
| QBox | qbx_core resource |
bridge/frameworks/qbox.lua |
| ESX | es_extended resource |
bridge/frameworks/esx.lua |
| OX Core | ox_core resource |
bridge/frameworks/ox.lua |
Each bridge provides a unified Bridge API used by the server and client code, so all features work identically regardless of framework.
Escrow-Free Bridge
All bridge files are included in escrow_ignore — you can freely edit them to customize framework integration:
escrow_ignore {
'config/config.lua',
'bridge/**/*',
'locales/**/*',
}