# CyberM.doors — client runtime

Runs inside the game process. Reads and presentation are local; anything that changes shared state has to go through the server.

23 functions.

## aimed

```lua
CyberM.doors.aimed()
```

`GAME` — Requires a live game instance.

The streamed door currently under the crosshair.

Requires `world.doors`. The returned `id` is an opaque 64-bit REDengine identity encoded as a string; never convert it to a Lua number. A successful discovery also makes that door addressable by `state` and the command functions while it remains streamed.

Returns: `door snapshot, or nil`, `reason when the first is nil`

```lua
local door, reason = CyberM.doors.aimed()
if door then
    print(door.id, door.open, door.locked, door.distance)
end
```

Registered in `ResourceHost.cpp` (line 6647) as `LuaDoorAimed`.

## available

```lua
CyberM.doors.available()
```

`GAME` — Requires a live game instance.

Whether the client door backend is available.

This capability check does not discover or stream a door. Door operations require the `world.doors` permission.

Returns: `boolean`

Registered in `ResourceHost.cpp` (line 6646) as `LuaDoorsAvailable`.

## clearInteractionPolicy

```lua
CyberM.doors.clearInteractionPolicy(door)
```

`GAME` — Requires a live game instance.

Removes this resource's interaction policy for a door.

Requires `world.doors`. Other resources' policies are unaffected.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |

Returns: `true on success, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6676) as `LuaDoorPolicy`.

## close

```lua
CyberM.doors.close(door, [force])
```

`GAME` — Requires a live game instance.

Closes a door.

Alias of `setOpen(door, false, force)`. Requires `world.doors`; application is asynchronous.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6662) as `LuaDoorCommand`.

## closest

```lua
CyberM.doors.closest([radius])
```

`GAME` — Requires a live game instance.

The closest streamed door around the local player.

Requires `world.doors`. Uses the same 0.5 to 100 metre player-centered query as `near`.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `radius` | `number` | optional | `20` |

Returns: `door snapshot, or nil`, `reason when the first is nil`

Registered in `ResourceHost.cpp` (line 6649) as `LuaDoorClosest`.

## grantKey

```lua
CyberM.doors.grantKey(door, holder)
```

`GAME` — Requires a live game instance.

Grants an entity an opening token for a door.

Requires `world.doors`. Uses the door controller's native token mechanism rather than a parallel CyberM key list. This grants authorization but does not lock or deny an otherwise usable door; access enforcement belongs to `setInteractionAllowed`.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `holder` | `opaque entity id` | required | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6671) as `LuaDoorCommand`.

## hasKey

```lua
CyberM.doors.hasKey(door, holder)
```

`GAME` — Requires a live game instance.

Whether an entity holds an opening token for a door.

Requires `world.doors`.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `holder` | `opaque entity id` | required | — |

Returns: `boolean, or nil`, `reason when the first is nil`

Registered in `ResourceHost.cpp` (line 6652) as `LuaDoorHasKey`.

## holders

```lua
CyberM.doors.holders(door)
```

`GAME` — Requires a live game instance.

The entities holding an opening token for a door.

Requires `world.doors`. Holder IDs are opaque strings for the same precision reason as door IDs. Tokens are vanilla authorization data, not a global lock rule: an unlocked interactive door remains usable with no token. Combine `hasKey` with `setInteractionAllowed` when implementing an ox_doorlock-style policy.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |

Returns: `array of opaque entity ids, or nil`, `reason when the first is nil`

Registered in `ResourceHost.cpp` (line 6651) as `LuaDoorHolders`.

## lock

```lua
CyberM.doors.lock(door, [force])
```

`GAME` — Requires a live game instance.

Locks a door.

Alias of `setLocked(door, true, force)`.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6664) as `LuaDoorCommand`.

## near

```lua
CyberM.doors.near([radius])
```

`GAME` — Requires a live game instance.

All streamed doors around the local player.

Requires `world.doors`. The radius is centered on the player and must be between 0.5 and 100 metres. Results are sorted nearest first and register each door for later ID-based operations.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `radius` | `number` | optional | `20` |

Returns: `array of door snapshots, or nil`, `reason when the first is nil`

Registered in `ResourceHost.cpp` (line 6648) as `LuaDoorNear`.

## open

```lua
CyberM.doors.open(door, [force])
```

`GAME` — Requires a live game instance.

Opens a door.

Alias of `setOpen(door, true, force)`. Requires `world.doors`; application is asynchronous.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6661) as `LuaDoorCommand`.

## reset

```lua
CyberM.doors.reset(door)
```

`GAME` — Requires a live game instance.

Resets a door to its configured default state.

Requires `world.doors`; queues the vanilla `ResetDoorState` event.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6670) as `LuaDoorCommand`.

## revokeKey

```lua
CyberM.doors.revokeKey(door, holder)
```

`GAME` — Requires a live game instance.

Revokes an entity's opening token for a door.

Requires `world.doors`.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `holder` | `opaque entity id` | required | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6672) as `LuaDoorCommand`.

## seal

```lua
CyberM.doors.seal(door, [force])
```

`GAME` — Requires a live game instance.

Seals a door.

Alias of `setSealed(door, true, force)`.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6667) as `LuaDoorCommand`.

## setAutomaticClose

```lua
CyberM.doors.setAutomaticClose(door, enabled)
```

`GAME` — Requires a live game instance.

Enables or disables a door's automatic closing behavior.

Requires `world.doors`; queues the vanilla `SetCloseItself` event.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `enabled` | `boolean` | required | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6669) as `LuaDoorCommand`.

## setInteractionAllowed

```lua
CyberM.doors.setInteractionAllowed(door, allowed)
```

`GAME` — Requires a live game instance.

Pre-declares whether vanilla interaction may open a door.

Requires `world.doors`. The decision is synchronous when the game interacts with the door. Policies are owned by the resource, all active policies must allow, and they are removed automatically on stop/reload. `cyberm:doorInteract` is an observational event with `(doorId, activatorId, "true"|"false")`; it is too late to change that interaction.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `allowed` | `boolean` | required | — |

Returns: `true on success, otherwise false`, `reason for refusal`

```lua
CyberM.doors.setInteractionAllowed(doorId, playerHasAccess)
AddEventHandler("cyberm:doorInteract", function(door, activator, allowed)
    print(door, activator, allowed)
end)
```

Registered in `ResourceHost.cpp` (line 6674) as `LuaDoorPolicy`.

## setLocked

```lua
CyberM.doors.setLocked(door, locked, [force])
```

`GAME` — Requires a live game instance.

Sets whether a door is locked.

Requires `world.doors`. `force` uses the vanilla quest-authority action; application is asynchronous.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `locked` | `boolean` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6663) as `LuaDoorCommand`.

## setOpen

```lua
CyberM.doors.setOpen(door, open, [force])
```

`GAME` — Requires a live game instance.

Sets whether a door is open.

Requires `world.doors`. Success means the REDscript action was accepted; application is asynchronous and may take up to 200 ms. `force` uses the vanilla quest-authority action.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `open` | `boolean` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6660) as `LuaDoorCommand`.

## setSealed

```lua
CyberM.doors.setSealed(door, sealed, [force])
```

`GAME` — Requires a live game instance.

Sets whether a door is sealed.

Requires `world.doors`. Sealing is distinct from locking. `force` uses the vanilla quest-authority action.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `sealed` | `boolean` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6666) as `LuaDoorCommand`.

## setState

```lua
CyberM.doors.setState(door, state, [force])
```

`GAME` — Requires a live game instance.

Sets a door state by name.

Accepted states: `open`, `closed`, `locked`, `unlocked`, `sealed`, `unsealed`. Requires `world.doors`; `force` selects the quest-authority action.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `state` | `string` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6673) as `LuaDoorSetState`.

## state

```lua
CyberM.doors.state(door)
```

`GAME` — Requires a live game instance.

A live snapshot of a streamed door.

Requires `world.doors`. Reads the live `DoorControllerPS`, never a fabricated default from the save record. Returns `door_not_streamed` after the entity unloads. Snapshot fields include `id`, `class`, `name`, `position`, `distance`, `open`, `closed`, `locked`, `sealed`, `busy`, `playerAuthorised`, `automaticClose`, toggle capabilities, shutter/lift flags, type/sides and opening speed/time.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |

Returns: `door snapshot, or nil`, `reason when the first is nil`

Registered in `ResourceHost.cpp` (line 6650) as `LuaDoorState`.

## unlock

```lua
CyberM.doors.unlock(door, [force])
```

`GAME` — Requires a live game instance.

Unlocks a door.

Alias of `setLocked(door, false, force)`.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6665) as `LuaDoorCommand`.

## unseal

```lua
CyberM.doors.unseal(door, [force])
```

`GAME` — Requires a live game instance.

Unseals a door.

Alias of `setSealed(door, false, force)`.

| Parameter | Type | Required | Default |
|---|---|---|---|
| `door` | `opaque door id` | required | — |
| `force` | `boolean` | optional | — |

Returns: `true when accepted, otherwise false`, `reason for refusal`

Registered in `ResourceHost.cpp` (line 6668) as `LuaDoorCommand`.

