QBCore Framework Development This skill provides guidelines and patterns for developing resources using the QBCore Framework . 1. Core Object Retrieval To interact with QBCore, you must retrieve the Core Object. Always cache this in a local variable at the top of your scripts. Client & Server: 2. Key Concepts Player Data (Server-side) - Identify players by Source temporarily, but use CitizenID for database persistence. - QBCore.Functions.GetPlayer(source) : Returns the Player object with all data. - Player.PlayerData : Contains , , , , , etc. Callbacks (Server - Client Data) - Use QBCore.Func…

..amount..' to '..Player.PlayerData.charinfo.firstname, 'success')\n TriggerClientEvent('QBCore:Notify', target, 'You received

QBCore Framework Development This skill provides guidelines and patterns for developing resources using the QBCore Framework . 1. Core Object Retrieval To interact with QBCore, you must retrieve the Core Object. Always cache this in a local variable at the top of your scripts. Client & Server: 2. Key Concepts Player Data (Server-side) - Identify players by Source temporarily, but use CitizenID for database persistence. - QBCore.Functions.GetPlayer(source) : Returns the Player object with all data. - Player.PlayerData : Contains , , , , , etc. Callbacks (Server - Client Data) - Use QBCore.Func…

..amount, 'success')\n else\n TriggerClientEvent('QBCore:Notify', source, 'Player not found', 'error')\n end\nend, 'admin')\n```\n\n## 3. Server Callback (Fetch Data)\n\n### Server-side\n```lua\nQBCore.Functions.CreateCallback('my-resource:server:GetBalance', function(source, cb)\n local Player = QBCore.Functions.GetPlayer(source)\n if Player then\n cb(Player.PlayerData.money.bank)\n else\n cb(0)\n end\nend)\n```\n\n### Client-side\n```lua\nRegisterKeyMapping('checkbalance', 'Check Bank Balance', 'keyboard', 'B')\n\nRegisterCommand('checkbalance', function()\n QBCore.Functions.TriggerCallback('my-resource:server:GetBalance', function(balance)\n QBCore.Functions.Notify('Bank Balance:

QBCore Framework Development This skill provides guidelines and patterns for developing resources using the QBCore Framework . 1. Core Object Retrieval To interact with QBCore, you must retrieve the Core Object. Always cache this in a local variable at the top of your scripts. Client & Server: 2. Key Concepts Player Data (Server-side) - Identify players by Source temporarily, but use CitizenID for database persistence. - QBCore.Functions.GetPlayer(source) : Returns the Player object with all data. - Player.PlayerData : Contains , , , , , etc. Callbacks (Server - Client Data) - Use QBCore.Func…

..balance, 'primary')\n end)\nend)\n```\n\n## 4. Useable Item (Server-side)\n\n```lua\nQBCore.Functions.CreateUseableItem('bandage', function(source, item)\n local Player = QBCore.Functions.GetPlayer(source)\n if Player.Functions.RemoveItem('bandage', 1) then\n TriggerClientEvent('hospital:client:Heal', source)\n TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['bandage'], 'remove')\n end\nend)\n```\n\n## 5. Job Loop (Marker Interaction)\n\n### client/main.lua\n```lua\nlocal QBCore = exports['qb-core']:GetCoreObject()\nlocal PlayerJob = {}\n\nAddEventHandler('onResourceStart', function(resourceName)\n if GetCurrentResourceName() ~= resourceName then return end\n local PlayerData = QBCore.Functions.GetPlayerData()\n PlayerJob = PlayerData.job\nend)\n\nRegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()\n local PlayerData = QBCore.Functions.GetPlayerData()\n PlayerJob = PlayerData.job\nend)\n\nRegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)\n PlayerJob = JobInfo\nend)\n\nCreateThread(function()\n while true do\n local sleep = 1000\n if LocalPlayer.state.isLoggedIn and PlayerJob.name == 'police' then\n local ped = PlayerPedId()\n local pos = GetEntityCoords(ped)\n local dist = #(pos - vector3(441.0, -981.0, 30.0)) -- Police Station\n\n if dist \u003c 10.0 then\n sleep = 0\n DrawMarker(2, 441.0, -981.0, 30.0, 0, 0, 0, 0, 0, 0, 0.3, 0.3, 0.2, 0, 0, 255, 200, false, false, 2, true, nil, nil, false)\n if dist \u003c 1.5 then\n QBCore.Functions.DrawText3D(441.0, -981.0, 30.5, '[E] Open Menu')\n if IsControlJustPressed(0, 38) then -- E key\n TriggerEvent('police:client:OpenMenu')\n end\n end\n end\n end\n Wait(sleep)\n end\nend)\n```\n\n## 6. Database Operations (oxmysql)\n\n### Insert Data\n```lua\nlocal success = MySQL.insert.await('INSERT INTO `player_vehicles` (license, citizenid, vehicle, hash) VALUES (?, ?, ?, ?)', {\n Player.PlayerData.license,\n Player.PlayerData.citizenid,\n 'adder',\n GetHashKey('adder')\n})\nif success then\n print('Vehicle added to DB')\nend\n```\n\n### Fetch Data\n```lua\nlocal result = MySQL.query.await('SELECT * FROM `player_vehicles` WHERE citizenid = ?', { Player.PlayerData.citizenid })\nif result and #result > 0 then\n for _, v in pairs(result) do\n print('Vehicle Plate:', v.plate)\n end\nend\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4676,"content_sha256":"de475eadc14a812f3f03973bb96af1d0f82e75248cf0d86c817077b2efd31f80"},{"filename":"reference.md","content":"# QBCore Framework Reference\n\n## Framework Structure\n\nStandard QBCore resource structure:\n\n```\nmy-resource/\n├── fxmanifest.lua\n├── config.lua # Configuration\n├── client/\n│ ├── main.lua # Client-side logic\n│ └── events.lua # Client events (optional)\n├── server/\n│ ├── main.lua # Server-side logic\n│ └── callbacks.lua # Server callbacks (optional)\n├── locale/ # Optional Translations\n│ └── en.lua\n└── html/ # NUI (optional)\n ├── index.html\n └── script.js\n```\n\n## Core Object Retrieval\n\nTo interact with the framework, **always** retrieve the Core Object at the start of your script.\n\n```lua\nlocal QBCore = exports['qb-core']:GetCoreObject()\n```\n\n## Player Functions (Server-side)\n\n### Get Player Object\n```lua\nlocal Player = QBCore.Functions.GetPlayer(source)\n-- Returns: Player (table) or nil\n```\n\n### Get Player by CitizenID\n```lua\nlocal Player = QBCore.Functions.GetPlayerByCitizenId(citizenid)\n-- Returns: Player (table) or nil\n```\n\n### Player Methods (Player.*)\nOnce you have the `Player` object:\n\n| Function | Example | Description |\n|----------|---------|-------------|\n| **AddMoney** | `Player.Functions.AddMoney('cash', 100)` | Add money (cash/bank/crypto) |\n| **RemoveMoney** | `Player.Functions.RemoveMoney('bank', 50)` | Remove money |\n| **SetJob** | `Player.Functions.SetJob('police', 1)` | Set job and grade |\n| **SetGang** | `Player.Functions.SetGang('ballas', 2)` | Set gang and grade |\n| **AddItem** | `Player.Functions.AddItem('water', 1)` | Add item to inventory |\n| **RemoveItem** | `Player.Functions.RemoveItem('bread', 1)` | Remove item |\n| **GetItemByName** | `Player.Functions.GetItemByName('phone')` | Check if player has item |\n| **SetMetaData** | `Player.Functions.SetMetaData('hunger', 100)` | Update metadata |\n\n## Database (oxmysql)\n\nQBCore uses `oxmysql` for database operations.\n\n```lua\n-- Fetch (SELECT)\nlocal result = MySQL.query.await('SELECT * FROM players WHERE citizenid = ?', { citizenid })\n\n-- Insert\nlocal id = MySQL.insert.await('INSERT INTO vehicles (plate, citizenid) VALUES (?, ?)', { plate, citizenid })\n\n-- Update\nlocal affectedRows = MySQL.update.await('UPDATE players SET money = ? WHERE citizenid = ?', { json.encode(money), citizenid })\n\n-- Scalar (Single value)\nlocal count = MySQL.scalar.await('SELECT COUNT(*) FROM players', {})\n```\n\n## Callbacks (Data Fetching)\n\nCallbacks allow the server to send data back to the client request.\n\n### Server-side (Create)\n```lua\nQBCore.Functions.CreateCallback('my-resource:server:GetData', function(source, cb, args)\n local Player = QBCore.Functions.GetPlayer(source)\n if Player then\n cb(Player.PlayerData.money.cash)\n else\n cb(nil)\n end\nend)\n```\n\n### Client-side (Trigger)\n```lua\nQBCore.Functions.TriggerCallback('my-resource:server:GetData', function(cash)\n if cash then\n print('My cash:', cash)\n end\nend, optionalArgs)\n```\n\n## Items (Useable)\n\nRegister items that execute code when used.\n\n### Server-side\n```lua\nQBCore.Functions.CreateUseableItem('medkit', function(source, item)\n local Player = QBCore.Functions.GetPlayer(source)\n if Player.Functions.RemoveItem('medkit', 1) then\n TriggerClientEvent('hospital:client:Heal', source)\n end\nend)\n```\n\n## Commands\n\nUse QBCore command system instead of native `RegisterCommand` for better integration (permissions, help text).\n\n### Server-side\n```lua\nQBCore.Commands.Add('heal', 'Heal a player (Admin Only)', {{name='id', help='Player ID'}}, false, function(source, args)\n local target = tonumber(args[1])\n if target then\n TriggerClientEvent('hospital:client:Heal', target)\n else\n TriggerClientEvent('hospital:client:Heal', source)\n end\nend, 'admin') -- Permission group\n```\n\n## Key Events\n\n### Client\n- `QBCore:Client:OnPlayerLoaded`: Triggered when player spawns and data is loaded. Use this to initialize data.\n- `QBCore:Client:OnJobUpdate`: Triggered when job changes. Update UI/Permissions.\n- `QBCore:Notify`: Use `QBCore.Functions.Notify('Message', 'type')` instead of triggering directly if possible.\n\n### Server\n- `QBCore:Server:PlayerLoaded`: Triggered when a player fully joins.\n\n## Notification Types\n\n- `success`: Green checkmark.\n- `error`: Red cross.\n- `primary`: Blue info.\n- `police`: Police theme.\n\n```lua\nQBCore.Functions.Notify('Job Done!', 'success', 5000)\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4452,"content_sha256":"f07cdfb7a581c0eb26e4719e6704b701a282f6940fc9d51036822cf23d33754b"},{"filename":"templates.md","content":"# QBCore Resource Templates\n\n## 1. Basic Resource (fxmanifest + client + server)\n\n### fxmanifest.lua\n```lua\nfx_version 'cerulean'\ngame 'gta5'\n\nlua54 'yes'\n\nshared_scripts {\n '@qb-core/shared/locale.lua',\n 'locales/en.lua',\n 'config.lua'\n}\n\nclient_scripts {\n 'client/main.lua'\n}\n\nserver_scripts {\n 'server/main.lua'\n}\n```\n\n### config.lua\n```lua\nConfig = {}\n\nConfig.Debug = false\n```\n\n### client/main.lua\n```lua\nlocal QBCore = exports['qb-core']:GetCoreObject()\n\nRegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()\n -- Init logic\nend)\n```\n\n### server/main.lua\n```lua\nlocal QBCore = exports['qb-core']:GetCoreObject()\n\n-- Server logic\n```\n\n## 2. Callback Pattern (Server-side Logic)\n\n### client/main.lua\n```lua\nlocal QBCore = exports['qb-core']:GetCoreObject()\n\nRegisterCommand('testcallback', function()\n QBCore.Functions.TriggerCallback('my-resource:server:GetData', function(data)\n if data then\n print('Received:', data)\n else\n QBCore.Functions.Notify('No data found', 'error')\n end\n end)\nend)\n```\n\n### server/main.lua\n```lua\nlocal QBCore = exports['qb-core']:GetCoreObject()\n\nQBCore.Functions.CreateCallback('my-resource:server:GetData', function(source, cb)\n local Player = QBCore.Functions.GetPlayer(source)\n \n if Player then\n local data = {\n name = Player.PlayerData.charinfo.firstname,\n cash = Player.PlayerData.money.cash\n }\n cb(data)\n else\n cb(nil)\n end\nend)\n```\n\n## 3. NUI Integration (React/HTML)\n\n### fxmanifest.lua\n```lua\n-- Add ui_page\nui_page 'html/index.html'\n\nfiles {\n 'html/index.html',\n 'html/style.css',\n 'html/script.js'\n}\n```\n\n### client/main.lua (NUI Callbacks)\n```lua\nRegisterNUICallback('close', function(data, cb)\n SetNuiFocus(false, false)\n cb('ok')\nend)\n\nRegisterCommand('opennui', function()\n SetNuiFocus(true, true)\n SendNUIMessage({\n action = 'open',\n data = { title = 'Hello QBCore' }\n })\nend)\n```\n\n### html/script.js\n```javascript\nwindow.addEventListener('message', function(event) {\n if (event.data.action === 'open') {\n document.body.style.display = 'block';\n // Handle data\n }\n});\n\n// Close with ESC\ndocument.onkeyup = function(data) {\n if (data.which == 27) {\n fetch(`https://${GetParentResourceName()}/close`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json; charset=UTF-8', },\n body: JSON.stringify({})\n });\n document.body.style.display = 'none';\n }\n};\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2569,"content_sha256":"1038098c02a0d226aca86367b77d4d8e645d003aa1080920d8ac2d7308f58500"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"QBCore Framework Development","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill provides guidelines and patterns for developing resources using the ","type":"text"},{"text":"QBCore Framework","type":"text","marks":[{"type":"strong"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"1. Core Object Retrieval","type":"text"}]},{"type":"paragraph","content":[{"text":"To interact with QBCore, you must retrieve the Core Object. Always cache this in a local variable at the top of your scripts.","type":"text"}]},{"type":"paragraph","content":[{"text":"Client & Server:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"lua"},"content":[{"text":"local QBCore = exports['qb-core']:GetCoreObject()","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"2. Key Concepts","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Player Data (Server-side)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify players by ","type":"text"},{"text":"Source","type":"text","marks":[{"type":"strong"}]},{"text":" temporarily, but use ","type":"text"},{"text":"CitizenID","type":"text","marks":[{"type":"strong"}]},{"text":" for database persistence.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"QBCore.Functions.GetPlayer(source)","type":"text","marks":[{"type":"strong"}]},{"text":": Returns the Player object with all data.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Player.PlayerData","type":"text","marks":[{"type":"strong"}]},{"text":": Contains ","type":"text"},{"text":"job","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"gang","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"money","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"items","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"metadata","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Callbacks (Server -> Client Data)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"QBCore.Functions.CreateCallback","type":"text","marks":[{"type":"strong"}]},{"text":" (Server) to send data to client.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"QBCore.Functions.TriggerCallback","type":"text","marks":[{"type":"strong"}]},{"text":" (Client) to request data from server.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rule:","type":"text","marks":[{"type":"strong"}]},{"text":" Never trust client data blindly in callbacks. Always validate on server.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Items","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"QBCore.Functions.CreateUseableItem","type":"text","marks":[{"type":"strong"}]},{"text":" (Server) to register items.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Items are defined in ","type":"text"},{"text":"qb-core/shared/items.lua","type":"text","marks":[{"type":"code_inline"}]},{"text":" (or ","type":"text"},{"text":"qb-inventory","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Database","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"QBCore uses ","type":"text"},{"text":"oxmysql","type":"text","marks":[{"type":"strong"}]},{"text":" by default.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"MySQL.query","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"MySQL.insert","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"MySQL.update","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"MySQL.scalar","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"3. Standard Resource Structure","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"my-resource/\n├── fxmanifest.lua\n├── config.lua\n├── client/\n│ └── main.lua\n└── server/\n └── main.lua","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"4. Best Practices","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Cache Core Object:","type":"text","marks":[{"type":"strong"}]},{"text":" Do not call ","type":"text"},{"text":"exports['qb-core']:GetCoreObject()","type":"text","marks":[{"type":"code_inline"}]},{"text":" inside loops.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use Callbacks for Data:","type":"text","marks":[{"type":"strong"}]},{"text":" Avoid ","type":"text"},{"text":"TriggerClientEvent","type":"text","marks":[{"type":"code_inline"}]},{"text":" for data retrieval if a callback is cleaner.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate Inputs:","type":"text","marks":[{"type":"strong"}]},{"text":" Client can send any data. Verify job, money, and ownership on server.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optimized Loops:","type":"text","marks":[{"type":"strong"}]},{"text":" Use dynamic sleep (Wait) based on distance.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Localization:","type":"text","marks":[{"type":"strong"}]},{"text":" Use ","type":"text"},{"text":"qb-core/shared/locale.lua","type":"text","marks":[{"type":"code_inline"}]},{"text":" or standard ","type":"text"},{"text":"Lang","type":"text","marks":[{"type":"code_inline"}]},{"text":" object if available.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"5. Documentation","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Official Docs: https://docs.qbcore.org/","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Github: https://github.com/qbcore-framework/qb-core","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"qbcore-framework","author":"@skillopedia","source":{"stars":4,"repo_name":"fivem-skill","origin_url":"https://github.com/proelias7/fivem-skill/blob/HEAD/skills/qbcore-framework/SKILL.md","repo_owner":"proelias7","body_sha256":"76a1e3663f02b3fbbcb54a6c958ea839e108864cd3bb4fb18c3b88b28e246ec9","cluster_key":"bd046c83badf5ee7c2666bad1e9885ea5944624cc183c22932be66ddb7e4299c","clean_bundle":{"format":"clean-skill-bundle-v1","source":"proelias7/fivem-skill/skills/qbcore-framework/SKILL.md","attachments":[{"id":"0000d081-5e2d-5b22-9057-4f536ca74077","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0000d081-5e2d-5b22-9057-4f536ca74077/attachment.md","path":"best-practices.md","size":3318,"sha256":"34d12df07a376cef8ca3b63a3bf351208c4d56909e61d2560dce238162bc8cbc","contentType":"text/markdown; charset=utf-8"},{"id":"44a7e67b-397c-5b3c-ae23-6d760f8c3c9f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/44a7e67b-397c-5b3c-ae23-6d760f8c3c9f/attachment.md","path":"examples.md","size":4676,"sha256":"de475eadc14a812f3f03973bb96af1d0f82e75248cf0d86c817077b2efd31f80","contentType":"text/markdown; charset=utf-8"},{"id":"655494d5-c0f6-50cb-be29-ee709097b23d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/655494d5-c0f6-50cb-be29-ee709097b23d/attachment.md","path":"reference.md","size":4452,"sha256":"f07cdfb7a581c0eb26e4719e6704b701a282f6940fc9d51036822cf23d33754b","contentType":"text/markdown; charset=utf-8"},{"id":"19b9933a-0baa-5577-bf1b-d924e6b7e451","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/19b9933a-0baa-5577-bf1b-d924e6b7e451/attachment.md","path":"templates.md","size":2569,"sha256":"1038098c02a0d226aca86367b77d4d8e645d003aa1080920d8ac2d7308f58500","contentType":"text/markdown; charset=utf-8"}],"bundle_sha256":"49fd3be6682b0abef235e5dabea200b4bb9fb3c7ef8d4939a0d174598c68ad6f","attachment_count":4,"text_attachments":4,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/qbcore-framework/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"data-analytics","category_label":"Data"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"data-analytics","import_tag":"clean-skills-v1","description":"Develops resources for FiveM using the QBCore Framework. Covers resource creation, Core Object usage, Player management, Callbacks, Events, Items, Jobs, Gangs, Database (oxmysql), and best practices. Use when the user works with FiveM, QBCore, Lua scripts for QBCore servers, or mentions `QBCore.Functions`, `GetCoreObject`, `CitizenID`, or any system of the QBCore Framework."}},"renderedAt":1782986568419}

QBCore Framework Development This skill provides guidelines and patterns for developing resources using the QBCore Framework . 1. Core Object Retrieval To interact with QBCore, you must retrieve the Core Object. Always cache this in a local variable at the top of your scripts. Client & Server: 2. Key Concepts Player Data (Server-side) - Identify players by Source temporarily, but use CitizenID for database persistence. - QBCore.Functions.GetPlayer(source) : Returns the Player object with all data. - Player.PlayerData : Contains , , , , , etc. Callbacks (Server - Client Data) - Use QBCore.Func…