# Callbacks

## Register (Server)

### `Nova.Functions.CreateCallback(name, handler)`

```lua
Nova.Functions.CreateCallback('callbackName', function(source, cb, ...)
    -- source: player server ID
    -- cb: function to send response back
    -- ...: extra arguments from client
    
    cb(responseData)
end)
```

## Trigger (Client)

### `exports['nova_core']:TriggerCallback(name, callback, ...)`

```lua
exports['nova_core']:TriggerCallback('callbackName', function(response)
    -- response: data sent by server via cb()
end, arg1, arg2)
```

## Complete Example

```lua
-- SERVER: Register callback
Nova.Functions.CreateCallback('inventory:canCarry', function(source, cb, itemName, count)
    local player = Nova.Functions.GetPlayer(source)
    if not player then
        cb(false)
        return
    end
    
    local currentWeight = calculateWeight(player:GetInventory())
    local itemWeight = Config.Items[itemName] and Config.Items[itemName].weight or 0
    local wouldAdd = itemWeight * count
    
    cb(currentWeight + wouldAdd <= Config.MaxWeight)
end)

-- CLIENT: Trigger callback
exports['nova_core']:TriggerCallback('inventory:canCarry', function(canCarry)
    if canCarry then
        TriggerServerEvent('inventory:pickup', itemName, count)
    else
        exports['nova_notify']:ShowNotification('Inventory full!', 'error')
    end
end, 'bread', 10)
```

## Guidelines

* Use `scriptName:actionName` naming convention
* Always check if player exists on server side
* Always handle `nil` responses on client side
* Don't use callbacks for one-way communication (use events)
