> For the complete documentation index, see [llms.txt](https://docs.otherplanet.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.otherplanet.dev/scripts/op-missions-creator/exports/server-side.md).

# Server Side

### Exports & Events

{% hint style="warning" %}
If you're looking for other data than listed here - feel free to contact us on our [Discord Server](https://discord.gg/otherplanet)!
{% endhint %}

#### StartMission

Starts a mission for a player. Soft gates (cooldown / requirements) are skipped via `forced = true`, but `exclusive` / `maxPlayers` are still enforced.

**Returns:** `ok, reason`

```lua
local ok, reason = exports['op-missioncreator']:StartMission(src, missionId, opts)
```

```lua
-- Example
local ok, err = exports['op-missioncreator']:StartMission(source, 'my_heist', {
    startStepId = 'step_1', -- optional
})
```

***

#### StartMissionWithLobby

Creates a co-op lobby with a fixed host + member roster and starts the mission immediately (no invite UI). The host is always included - `members` is a list of additional player server ids.

**Returns:** `ok, lobbyId` on success, `false, reason` on failure.

`opts.forced` defaults to `true`. `opts.startStepId` is optional.

```lua
local ok, lobbyId = exports['op-missioncreator']:StartMissionWithLobby(host, missionId, members, opts)
```

```lua
-- Example
local ok, result = exports['op-missioncreator']:StartMissionWithLobby(
    1,                -- host server id
    'my_heist',
    { 2, 3 },         -- additional members
    { startStepId = 'step_1' }
)
```

***

#### StopMission

Stops the player's current mission and clears the server registry slot.

```lua
exports['op-missioncreator']:StopMission(src, reason)
```

```lua
-- Example
exports['op-missioncreator']:StopMission(source, 'admin')
```

***

#### CanStartMission

Dry-run of the start gate. Checks requirements / cooldown / exclusive / queue / etc. without consuming items or starting anything.

**Returns:** `ok, reason`

```lua
local ok, reason = exports['op-missioncreator']:CanStartMission(src, missionId)
```

***

#### GetMissionRegistry

Returns all registered mission definitions (`{ [missionId] = def, ... }`).

```lua
local missions = exports['op-missioncreator']:GetMissionRegistry()
```

***

#### BroadcastMissionEvent

Sends a named event into the player's running mission runtime (received as a mission event on the client).

```lua
exports['op-missioncreator']:BroadcastMissionEvent(src, name, data)
```

```lua
-- Example
exports['op-missioncreator']:BroadcastMissionEvent(source, 'policeAlert', {
    zone = 'docks',
})
```

***

#### OpCrimeStart

op-crime tablet entry point. Routes by mission settings:

* queue enabled -> queue join
* coop allowed -> client invite / lobby flow
* otherwise -> direct start (requirements consumed)

**Returns:** `ok, 'started'|'queued'|'invite_pending'` or `false, reason`

```lua
local ok, status = exports['op-missioncreator']:OpCrimeStart(src, missionId)
```

***

#### GetOpCrimeMissions

Returns missions marked as exposed to op-crime, shaped for op-crime `Config.Missions`.

```lua
local missions = exports['op-missioncreator']:GetOpCrimeMissions()
```

***

#### IsOpCrimeIntegrationActive

Returns a `boolean` - whether the op-crime integration is currently active.

```lua
local active = exports['op-missioncreator']:IsOpCrimeIntegrationActive()
```

### Server Events

#### op-missioncreator:server:missionStarted

Fired after a mission successfully starts for a player.

```lua
AddEventHandler('op-missioncreator:server:missionStarted', function(src, missionId, runId, opts)
    -- opts may include: lobbyHost, lobbyMember, lobbyId, forced, startStepId, runId, …
end)
```

***

#### op-missioncreator:server:missionEnded

Fired when a mission ends for a player.

`status` is one of: `'completed'` | `'failed'` | `'aborted'` | `'queue_left'` | `'lobby_closed'`

```lua
AddEventHandler('op-missioncreator:server:missionEnded', function(src, missionId, status, payload)
    -- Your Code
end)
```
