VS Code Setup for QBCore Development
Visual Studio Code is the recommended IDE for QBCore development. This guide will help you set up an optimal development environment with the right extensions, settings, and configurations.
Prerequisites
- Visual Studio Code installed
- Git installed
- Node.js (for some extensions)
- Basic knowledge of Lua and JavaScript
Essential Extensions
Lua Development
1. Lua Language Server (sumneko.lua)
Most important extension for Lua development
"luau-lsp.require.mode": "relativeToFile",
"luau-lsp.require.directoryAliases": {
"@": "src"
}
Features:
- Intelligent code completion
- Error detection
- Function signatures
- Hover documentation
- Go to definition
2. Lua (keyring.Lua)
Basic Lua syntax highlighting and snippets.
3. FiveM Development Tools
Custom extension for FiveM/QBCore:
- Natives autocompletion
- Resource template generation
- Built-in documentation
Web Development (for NUI)
4. HTML/CSS/JavaScript Extensions
- HTML CSS Support
- Auto Rename Tag
- Live Server
- Prettier - Code formatter
- ESLint
Git Integration
5. GitLens
Supercharge Git in VS Code
- Inline git blame
- Repository insights
- Commit history
- Branch comparisons
6. Git Graph
Visual git repository management.
Productivity Extensions
7. Better Comments
Enhanced comment highlighting.
8. Bracket Pair Colorizer 2
Matching bracket highlighting.
9. File Utils
Create, duplicate, move files easily.
10. Path Intellisense
Autocomplete for file paths.
VS Code Configuration
User Settings (settings.json)
Create or modify your VS Code settings:
{
// Lua Configuration
"lua.diagnostics.globals": [
"exports",
"source",
"GetPlayerPed",
"GetEntityCoords",
"CreateThread",
"Wait",
"AddEventHandler",
"RegisterNetEvent",
"TriggerEvent",
"TriggerClientEvent",
"TriggerServerEvent",
"GetPlayerName",
"GetPlayers",
"MySQL",
"json",
"QBCore",
"Config",
"GetCurrentResourceName",
"GetResourcePath",
"LoadResourceFile",
"SaveResourceFile"
],
"lua.workspace.checkThirdParty": false,
"lua.telemetry.enable": false,
"lua.diagnostics.disable": [
"lowercase-global"
],
"lua.workspace.library": {
"[path-to-your-server]/resources/[qb]/qb-core": true
},
// General Editor Settings
"editor.insertSpaces": true,
"editor.tabSize": 4,
"editor.detectIndentation": true,
"editor.wordWrap": "on",
"editor.minimap.enabled": true,
"editor.fontSize": 14,
"editor.fontFamily": "'Fira Code', 'Courier New', monospace",
"editor.fontLigatures": true,
// File Associations
"files.associations": {
"*.lua": "lua",
"fxmanifest.lua": "lua",
"*.meta": "xml"
},
// Auto Save
"files.autoSave": "onFocusChange",
// Terminal
"terminal.integrated.defaultProfile.windows": "PowerShell",
"terminal.integrated.fontSize": 12,
// Git
"git.enableSmartCommit": true,
"git.autofetch": true,
// Formatting
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
// Theme
"workbench.colorTheme": "Dark+ (default dark)",
"workbench.iconTheme": "material-icon-theme"
}
Workspace Settings
For project-specific settings, create .vscode/settings.json
in your resource folder:
{
"lua.workspace.library": {
"../qb-core": true,
"../qb-menu": true,
"../qb-input": true
},
"files.exclude": {
"**/node_modules": true,
"**/.git": true,
"**/stream": false
}
}
Code Snippets
Create custom Lua snippets for QBCore development:
File: .vscode/lua.json
{
"QBCore GetCoreObject": {
"prefix": "qbcore",
"body": [
"local QBCore = exports['qb-core']:GetCoreObject()"
],
"description": "Get QBCore object"
},
"Register Net Event": {
"prefix": "rne",
"body": [
"RegisterNetEvent('$1', function($2)",
" local src = source",
" $0",
"end)"
],
"description": "Register a net event"
},
"Get Player": {
"prefix": "getplayer",
"body": [
"local Player = QBCore.Functions.GetPlayer($1)",
"if not Player then return end",
"$0"
],
"description": "Get player with validation"
},
"Add Event Handler": {
"prefix": "aeh",
"body": [
"AddEventHandler('$1', function($2)",
" $0",
"end)"
],
"description": "Add event handler"
},
"Create Thread": {
"prefix": "thread",
"body": [
"CreateThread(function()",
" while true do",
" Wait($1)",
" $0",
" end",
"end)"
],
"description": "Create a thread with loop"
},
"QBCore Command": {
"prefix": "qbcommand",
"body": [
"QBCore.Commands.Add('$1', '$2', {}, false, function(source, args)",
" local src = source",
" local Player = QBCore.Functions.GetPlayer(src)",
" if not Player then return end",
" ",
" $0",
"end, '$3')"
],
"description": "QBCore command template"
},
"MySQL Execute": {
"prefix": "mysql",
"body": [
"MySQL.Async.execute('$1', {",
" $2",
"}, function(affectedRows)",
" $0",
"end)"
],
"description": "MySQL execute query"
},
"MySQL Fetch": {
"prefix": "mysqlfetch",
"body": [
"MySQL.Async.fetchAll('$1', {",
" $2",
"}, function(result)",
" if result[1] then",
" $0",
" end",
"end)"
],
"description": "MySQL fetch query"
}
}
FiveM Natives IntelliSense
Setup Natives Autocompletion
- Download the latest natives file from FiveM Docs
- Create a folder structure in your workspace:
workspace/
├── .vscode/
│ └── settings.json
├── typings/
│ └── natives.lua
└── resources/
└── [qb]/
- Add to workspace settings:
{
"lua.workspace.library": {
"./typings": true
}
}
Create Custom Types
Create typings/qbcore.lua
for QBCore-specific types:
---@class QBCore
---@field Functions table
---@field Players table
---@field Shared table
---@field Config table
---@field Commands table
QBCore = {}
---@class Player
---@field PlayerData table
---@field Functions table
Player = {}
---@param source number
---@return Player|nil
function QBCore.Functions.GetPlayer(source) end
---@param citizenid string
---@return Player|nil
function QBCore.Functions.GetPlayerByCitizenId(citizenid) end
---@return table
function QBCore.Functions.GetPlayers() end
-- Add more type definitions as needed
Project Structure
Recommended Folder Structure
my-qbcore-resource/
├── .vscode/
│ ├── settings.json
│ ├── tasks.json
│ └── launch.json
├── client/
│ ├── main.lua
│ └── functions.lua
├── server/
│ ├── main.lua
│ └── callbacks.lua
├── shared/
│ └── config.lua
├── html/
│ ├── index.html
│ ├── style.css
│ └── script.js
├── locales/
│ ├── en.lua
│ └── es.lua
├── sql/
│ └── install.sql
├── fxmanifest.lua
└── README.md
VS Code Tasks
Create .vscode/tasks.json
for common tasks:
{
"version": "2.0.0",
"tasks": [
{
"label": "Restart Resource",
"type": "shell",
"command": "echo",
"args": ["restart ${workspaceFolderBasename}"],
"group": "build",
"presentation": {
"echo": true,
"reveal": "silent",
"focus": false,
"panel": "shared"
}
},
{
"label": "Start Resource",
"type": "shell",
"command": "echo",
"args": ["start ${workspaceFolderBasename}"],
"group": "build"
},
{
"label": "Stop Resource",
"type": "shell",
"command": "echo",
"args": ["stop ${workspaceFolderBasename}"],
"group": "build"
}
]
}
Debugging Setup
Launch Configuration
Create .vscode/launch.json
for debugging:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Lua",
"type": "lua",
"request": "launch",
"program": "${file}",
"cwd": "${workspaceFolder}",
"stopOnEntry": false
}
]
}
Live Server for NUI
For NUI development, use the Live Server extension:
- Right-click on
html/index.html
- Select “Open with Live Server”
- Test your UI at
http://localhost:5500
Git Integration
.gitignore Template
Create a .gitignore
file:
# VS Code
.vscode/settings.json
!.vscode/settings.example.json
# Logs
*.log
# Runtime files
stream/
cache/
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Node modules (if using)
node_modules/
# Environment files
.env
# Temporary files
*.tmp
*.temp
Useful Keyboard Shortcuts
Default VS Code Shortcuts
Ctrl+Shift+P
- Command PaletteCtrl+P
- Quick OpenCtrl+Shift+E
- ExplorerCtrl+Shift+F
- SearchCtrl+Shift+G
- Git- `Ctrl+“ - Terminal
F12
- Go to DefinitionShift+F12
- Find References
Custom Shortcuts
Add to keybindings.json
:
[
{
"key": "ctrl+r",
"command": "workbench.action.tasks.runTask",
"args": "Restart Resource"
},
{
"key": "f5",
"command": "workbench.action.tasks.runTask",
"args": "Start Resource"
}
]
File Templates
Basic Resource Template
Create file templates for quick resource creation:
fxmanifest.lua template:
fx_version 'cerulean'
game 'gta5'
description 'My QBCore Resource'
author 'Your Name'
version '1.0.0'
shared_scripts {
'shared/config.lua'
}
client_scripts {
'client/main.lua'
}
server_scripts {
'server/main.lua'
}
dependencies {
'qb-core'
}
server/main.lua template:
local QBCore = exports['qb-core']:GetCoreObject()
-- Resource started
AddEventHandler('onResourceStart', function(resourceName)
if GetCurrentResourceName() ~= resourceName then return end
print('Resource ' .. resourceName .. ' started')
end)
-- Player loaded
AddEventHandler('QBCore:Server:PlayerLoaded', function(source)
local Player = QBCore.Functions.GetPlayer(source)
if Player then
-- Player loaded logic
end
end)
Productivity Tips
1. Use Multi-Cursor Editing
Alt+Click
- Add cursorCtrl+Alt+Down
- Add cursor belowCtrl+Shift+L
- Select all occurrences
2. Quick File Navigation
Ctrl+P
then type filenameCtrl+Shift+O
- Go to symbolCtrl+G
- Go to line
3. Code Folding
Ctrl+Shift+[
- Fold regionCtrl+Shift+]
- Unfold region
4. Split Editor
Ctrl+\
- Split editorCtrl+1/2/3
- Focus editor group
5. Zen Mode
Ctrl+K Z
- Enter Zen mode (distraction-free)
Troubleshooting
Common Issues
Lua Language Server not working:
- Check if extension is installed
- Verify workspace library paths
- Restart VS Code
- Check output panel for errors
Autocompletion not working:
- Ensure correct file associations
- Check global variables in settings
- Verify workspace configuration
Git integration issues:
- Ensure Git is installed and in PATH
- Check repository initialization
- Verify credentials
Next Steps
With VS Code properly configured:
This setup will provide you with a powerful development environment for creating QBCore resources efficiently.