# Exports

## Exports - Client

**`addPoint`**- Creates a static 3D interactable prompt.&#x20;

```lua
exports.lunar_bridge:addPoint({
    coords = coords, -- vector3
    distance = 1.0, -- the distance at which the becomes interactable
    options = {
        {
            label = 'Open door',
            icon = 'door-open',
            onSelect = function(data)
                print('opened door')
                print('args: ' .. data)
            end,
            args = 6 -- you can define extra args
        },
        {
            label = 'Go into garage',
            icon = 'warehouse',
            onSelect = function()
                print('went into garage')
            end,
            canInteract = function()
                return true -- You can add your own condition here
            end
        },
    }
})
```

**`addLocalEntity`**- Attaches a 3D interactable prompt to a local entity.&#x20;

```lua
exports.lunar_bridge:addLocalEntity({
    entity = entity, -- number
    distance = 1.0, -- the distance at which the becomes interactable
    offset = vector3(0.0, 0.0, 0.0),
    options = {
        {
            label = 'Open door',
            icon = 'door-open',
            onSelect = function(data)
                print('opened door')
                print('args: ' .. data)
            end,
            args = 6 -- you can define extra args
        },
        {
            label = 'Go into garage',
            icon = 'warehouse',
            onSelect = function()
                print('went into garage')
            end,
            canInteract = function()
                return true -- You can add your own condition here
            end
        },
    }
})
```

`openPedInteractionMenu`- Opens conversation style menu.

```lua
exports.lunar_bridge:openPedInteractionMenu(
    ped, 
    { name = "Mike", specifier = "General Store Clerk" },
    {
        question = "Welcome to Mike's General Store! How can I help you today?",
        answers = {
            -- if there's a pos_ or neg_ prefix then it colors the option otherwise it's neutral
            -- you can add as many options as you wish
            { id = "pos_buy", label = "I'd like to buy something", icon = "basket-shopping" },
            { id = "neg_leave", label = "Just looking around", icon = "eye" }
        }
        -- Could alternatively use:
        -- answerItems = { { name = "item1", label = "Item 1", imageUrl = "url.png" }, ... }
        -- answerNumberInput = "Enter amount"
    }, 
    -- THE CALLBACK FUNCTION - THIS IS THE CORE OF THE CONVERSATION SYSTEM
    -- It receives the player's response data and returns the next question or nil
    -- This is what controls the entire conversation flow and branching logic
    function(answer)
        -- IMPORTANT: The conversation ends immediately when the callback returns nil
        -- This happens when player chooses to leave or if ESCAPE is pressed
        if not answer or answer.id == "leave" or answer.id == "cancel" then
            -- Returning nil terminates the conversation
            return nil
        end
        
        -- Player wants to buy something - return a new question object with items
        -- The callback uses the answer.id to determine which branch to take
        if answer.id == "buy" then
            return {
                question = "What would you like to purchase?",
                answerItems = {
                    { name = "bread", label = "Fresh Bread", imageUrl = "nui://ox_inventory/web/images/bread.png" },
                    { name = "milk", label = "Milk", imageUrl = "nui://ox_inventory/web/images/milk.png" },
                    { name = "apple", label = "Apples", imageUrl = "nui://ox_inventory/web/images/apple.png" }
                }
            }
        end
        
        -- Player selected an item to purchase
        -- The callback receives answer.itemName when the player selects an item
        if answer.itemName then
            -- Return a question that asks for a number input
            return {
                question = "How many would you like to purchase?",
                answerNumberInput = "Enter amount"
            }
        end
        
        -- Player entered a quantity
        -- The callback receives answer.value when player inputs a number
        if answer.value then
            local quantity = answer.value
            local totalPrice = quantity * 5 -- Example price calculation
            
            -- Continue the conversation with a confirmation question
            return {
                question = "That will be $" .. totalPrice .. ". Would you like to complete your purchase?",
                answers = {
                    { id = "pos_confirm", label = "Yes, I'll buy it", icon = "check" },
                    { id = "pos_cancel", label = "No, that's too expensive", icon = "xmark" }
                }
            }
        end
        
        -- Player confirmed purchase
        if answer.id == "confirm" then
            -- IMPORTANT: Returning nil ends conversation
            return nil
        end
        
        -- Fallback: If none of the expected conditions are met
        -- End the conversation by returning nil
        return nil
    end
)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lunar-scripts.gitbook.io/lunar-scripts/bridge-module/lunar_bridge/exports.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
