# From QBCore

This guide helps you migrate your server from QBCore to NOVA Framework.

## Quick Comparison

| QBCore                                         | NOVA                                   |
| ---------------------------------------------- | -------------------------------------- |
| `QBCore.Functions.GetPlayer(source)`           | `Nova.Functions.GetPlayer(source)`     |
| `Player.Functions.GetMoney('cash')`            | `player:GetMoney()`                    |
| `Player.Functions.AddMoney('cash', amount)`    | `player:AddMoney(amount)`              |
| `Player.Functions.RemoveMoney('cash', amount)` | `player:RemoveMoney(amount)`           |
| `Player.Functions.GetMoney('bank')`            | `player:GetBank()`                     |
| `Player.PlayerData.job`                        | `player:GetJob()`                      |
| `Player.Functions.SetJob(name, grade)`         | `player:SetJob(name, grade)`           |
| `Player.Functions.AddItem(item, count)`        | `player:AddItem(item, count)`          |
| `Player.Functions.RemoveItem(item, count)`     | `player:RemoveItem(item, count)`       |
| `Player.Functions.HasItem(item)`               | `player:HasItem(item)`                 |
| `QBCore.Functions.CreateCallback`              | `Nova.Functions.CreateCallback`        |
| `QBCore.Functions.TriggerCallback`             | `exports['nova_core']:TriggerCallback` |

## Step-by-Step Migration

### 1. Getting the Core Object

```lua
-- QBCore (before)
local QBCore = exports['qb-core']:GetCoreObject()

-- NOVA (after)
-- Not needed! Use Nova directly or exports
local player = exports['nova_core']:GetPlayer(source)
```

### 2. Player Functions

```lua
-- QBCore
local Player = QBCore.Functions.GetPlayer(source)
local cash = Player.Functions.GetMoney('cash')
local bank = Player.Functions.GetMoney('bank')
Player.Functions.AddMoney('cash', 500, 'salary')
Player.Functions.RemoveMoney('cash', 200, 'purchase')
Player.Functions.SetJob('police', 2)

-- NOVA
local player = Nova.Functions.GetPlayer(source)
local cash = player:GetMoney()
local bank = player:GetBank()
player:AddMoney(500)
player:RemoveMoney(200)
player:SetJob('police', 2)
```

### 3. Inventory

```lua
-- QBCore
local Player = QBCore.Functions.GetPlayer(source)
Player.Functions.AddItem('bread', 5)
Player.Functions.RemoveItem('bread', 2)
local hasItem = Player.Functions.HasItem('bread')

-- NOVA
local player = Nova.Functions.GetPlayer(source)
player:AddItem('bread', 5)
player:RemoveItem('bread', 2)
local hasItem = player:HasItem('bread')
```

### 4. Callbacks

```lua
-- QBCore (Server)
QBCore.Functions.CreateCallback('shop:getItems', function(source, cb)
    cb(items)
end)

-- NOVA (Server)
Nova.Functions.CreateCallback('shop:getItems', function(source, cb)
    cb(items)
end)

-- QBCore (Client)
QBCore.Functions.TriggerCallback('shop:getItems', function(items)
    -- use items
end)

-- NOVA (Client)
exports['nova_core']:TriggerCallback('shop:getItems', function(items)
    -- use items
end)
```

### 5. Events

```lua
-- QBCore
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
    -- player loaded
end)

-- NOVA
AddEventHandler('Nova:PlayerLoaded', function(playerData)
    -- player loaded
end)
```

## Using nova\_bridge

Set `Config.Framework = 'qb'` in nova\_bridge to run QBCore scripts on NOVA without modification:

```cfg
ensure nova_core
ensure nova_bridge  # QBCore compatibility layer
ensure your_qb_script  # Works without modification!
```

## Key Differences

1. **Money types**: QBCore has `'cash'`, `'bank'`, `'crypto'`. NOVA has separate methods: `GetMoney()`, `GetBank()`
2. **Player data**: QBCore uses `Player.PlayerData.X`. NOVA uses `player.X` or `player:GetX()`
3. **Metadata**: QBCore has `GetMetaData`/`SetMetaData`. NOVA uses direct properties
