# From ESX

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

## Quick Comparison

| ESX                                        | NOVA                                   |
| ------------------------------------------ | -------------------------------------- |
| `ESX.GetPlayerFromId(source)`              | `Nova.Functions.GetPlayer(source)`     |
| `xPlayer.getMoney()`                       | `player:GetMoney()`                    |
| `xPlayer.addMoney(amount)`                 | `player:AddMoney(amount)`              |
| `xPlayer.removeMoney(amount)`              | `player:RemoveMoney(amount)`           |
| `xPlayer.getJob()`                         | `player:GetJob()`                      |
| `xPlayer.setJob(name, grade)`              | `player:SetJob(name, grade)`           |
| `xPlayer.getGroup()`                       | `player:GetGroup()`                    |
| `xPlayer.addInventoryItem(item, count)`    | `player:AddItem(item, count)`          |
| `xPlayer.removeInventoryItem(item, count)` | `player:RemoveItem(item, count)`       |
| `ESX.RegisterServerCallback`               | `Nova.Functions.CreateCallback`        |
| `ESX.TriggerServerCallback`                | `exports['nova_core']:TriggerCallback` |
| `esx:playerLoaded`                         | `Nova:PlayerLoaded`                    |
| `esx:getSharedObject`                      | Not needed - use `Nova` directly       |

## Step-by-Step Migration

### 1. Getting the Framework Object

```lua
-- ESX (before)
ESX = nil
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)

-- NOVA (after)
-- Not needed! Nova is available globally in nova_core
-- From other scripts, use exports:
local player = exports['nova_core']:GetPlayer(source)
```

### 2. Player Functions

```lua
-- ESX
local xPlayer = ESX.GetPlayerFromId(source)
local money = xPlayer.getMoney()
xPlayer.addMoney(500)
xPlayer.removeMoney(200)
local job = xPlayer.getJob()

-- NOVA
local player = Nova.Functions.GetPlayer(source)
local money = player:GetMoney()
player:AddMoney(500)
player:RemoveMoney(200)
local job = player:GetJob()
```

### 3. Callbacks

```lua
-- ESX (Server)
ESX.RegisterServerCallback('shop:getItems', function(source, cb)
    cb(items)
end)

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

-- ESX (Client)
ESX.TriggerServerCallback('shop:getItems', function(items)
    -- use items
end)

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

### 4. Events

```lua
-- ESX
AddEventHandler('esx:playerLoaded', function(xPlayer)
    print(xPlayer.getName())
end)

-- NOVA
AddEventHandler('Nova:PlayerLoaded', function(source, player)
    print(player.fullname)
end)
```

### 5. Notifications

```lua
-- ESX
TriggerClientEvent('esx:showNotification', source, 'Hello!')

-- NOVA
Nova.Functions.Notify(source, 'Hello!', 'info')
```

## Using nova\_bridge (Gradual Migration)

Don't want to rewrite everything at once? Use `nova_bridge` to run ESX scripts on NOVA:

1. Install nova\_bridge alongside nova\_core
2. Set `Config.Framework = 'esx'` in bridge config
3. Existing ESX scripts will work automatically
4. Gradually convert scripts to native NOVA API

```cfg
ensure nova_core
ensure nova_bridge  # ESX compatibility layer
ensure your_esx_script  # Works without modification!
```

## Database Changes

The framework uses its own database tables. Run the provided SQL files during installation to create all required tables. Data from ESX tables may need to be migrated — refer to the included migration scripts.
