# llSensor

*LSL function*

```lsl
void llSensor(string name, key id, integer type, float radius, float arc);
```

- `string name`: Specific object or avatar name to filter for (or empty string for no filter).
- `key id`: UUID of the group, avatar, or object to filter by (or NULL_KEY for no filter).
- `integer type`: Integer bitfield type mask containing AGENT, AGENT_BY_LEGACY_NAME, AGENT_BY_USERNAME, ACTIVE, PASSIVE, or SCRIPTED (0 for no filter).
- `float radius`: Maximum distance in meters to scan (range [0.0, 96.0]).
- `float arc`: Maximum angle in radians relative to the local X-axis to scan (range [0.0, PI]).

- Energy: 10

Performs a single scan for **name** and **id** with **type** within **radius** meters and **arc** radians of forward vector.

Script execution continues immediately. When the scan is completed, a [sensor](/events/sensor/) or [no_sensor](/events/no_sensor/) event is put in the event queue.

If **name** and/or **id** are empty, they are ignored.

If **id** is an invalid key or [NULL_KEY](/constants/NULL_KEY/) it is treated as empty.

Depending upon which AGENT\* flag is used determines the format requirements for **name**

See: [llSensor](https://web.archive.org/web/20150426032518/http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSensor) for an excellent explanation of **arc**.

```lsl title="How to use" frame="terminal"
llSensor("", NULL_KEY, 0, 0.0, 0.0);
```

## Caveats

- AGENT, PASSIVE and ACTIVE behave inclusively. SCRIPTED is **not** inclusive and will exclude non-scripted targets (like avatars) from the detected set.
- Objects do not detect themselves, and attachments cannot detect their wearers (this includes HUD attachments).
- Attachments cannot be detected by `llSensor`.
- For an object to be detected, the center of its root prim (the same point it would report with [llGetRootPosition](/functions/llGetRootPosition/)) must be within the sensor beam.
- For an agent to be detected, a point near the pelvis must be inside the sensor beam (the same as [llGetRootPosition](/functions/llGetRootPosition/) would report in a script attached to that avatar). This point is indicated by red crosshairs when Advanced>Character>Display Agent Target is turned on.
- If the agent is sitting on an object, the root prim of the sat upon object becomes a second sensor target for the agent (but not if the avatar is outside the sensor **arc**, see [SVC-5145](https://jira.secondlife.com/browse/SVC-5145)).
- Sensors placed in the root prim of attachments will use the direction the avatar is facing as their forward vector. In mouselook, this means that it will be wherever the avatar is looking, while out of mouselook, this means whichever way the avatar is pointing. This does not include where the avatar's head is pointing, or what animation the avatar is doing, just the direction the avatar would move in if you walked forward. This is the case, regardless of where the object is attached.
- Sensors placed in prims other than the root prim of an attachment will have their forward direction offset relative to the root prim's forward direction, e.g. a sensor in a prim whose +X direction is the reverse of the root +X will look backward.
- `llSensor` does not detect objects or agents across region boundaries
- If **type** is zero, the sensor will silently fail, neither [sensor](/events/sensor/) or [no_sensor](/events/no_sensor/) will be triggered.
- Only 32 objects will be scanned each time. (Increased from 16 with Release 2024-03-18.8333615376 on Tuesday, March 19, 2024)
- DAMAGEABLE is a filter flag; it cannot be used on its own. It must be combined with at least one other flag. For example, AGENT | ACTIVE | PASSIVE | DAMAGEABLE will return all damageable agents and objects, whether physical or not.

## Examples

<details open>
<summary>This sensor scans a 45 degree cone about the x-axis ([PI](/constants/PI/)/2 or [PI_BY_TWO](/constants/PI_BY_TWO/) scans a hemisphere; [PI](/constants/PI/) is a spherical scan). Also it will only match an agent with the [legacy name](https://wiki.secondlife.com/wiki/Category:LSL_Avatar/Name) "Governor Linden".</summary>

```lsl
llSensor( "Governor Linden", NULL_KEY, AGENT_BY_LEGACY_NAME, 96.0, PI/4 );
```

</details>

<details>
<summary>This sensor detects all prims and agents with a given name within 15m of the sensor. (AGENT, PASSIVE and ACTIVE behave inclusively. SCRIPTED is not inclusive and will exclude non-scripted targets (like avatars) from the detected set.)</summary>

```lsl
llSensor( "", NULL_KEY, ( AGENT | PASSIVE | ACTIVE ), 15.0, PI );
```

</details>

<details>
<summary>Basic example script that when touched executes a sensor scan of agents. When the sensor event is processed it spits out messages to the owner of each detected agents' name.</summary>

```lsl
default
{
    touch_start(integer total_number)
    {
        llSensor("", NULL_KEY, AGENT, 30.0, PI);
    }

    sensor( integer detected )
    {
        while(detected--)
        {
            llOwnerSay(llDetectedName(detected));
        }
    }
}
```

</details>

## Notes

:::note
You might want to use [llGetAgentList](/functions/llGetAgentList/) instead of using sensors to get a list of all avatars within the same parcel or region.
:::

#### Loops & Repetition

Using [llSensor](/functions/llSensor/) in a [for](https://wiki.secondlife.com/wiki/For) loop is a beginners mistake, as events will not interrupt each other (the sensor event will not interrupt whatever event is currently being executed). To perform repeat sensor sweeps, [llSensorRepeat](/functions/llSensorRepeat/) is the better solution. While it is possible to call `llSensor` from a [timer](/events/timer/) event, it is less efficient to do so; there is a limit to the number of events that can be processed in a second and using the timer just to call `llSensor` will result in your script getting less timeslice.

### Gallery

## See also

### Functions

- [llSensorRepeat](/functions/llSensorRepeat/) — Runs a sensor on a timer
- [llSensorRemove](/functions/llSensorRemove/) — Stops the [llSensorRepeat](/functions/llSensorRepeat/) timer

### Events

- [sensor](/events/sensor/) — Triggered when a sensor detects something
- [no_sensor](/events/no_sensor/) — Triggered when a sensor detects nothing

---

*Source: [LlSensor](https://wiki.secondlife.com/wiki/LlSensor) on the Second Life Wiki. Content from the Second Life Wiki articles LlSensor (revision 1218577, 2026-01-04), Template:LSL Function/uuid (revision 1195911, 2015-03-21) and Template:LSL Constants/Sensing (revision 1177960, 2013-04-23), CC BY-SA 3.0.*

---

From lsl.dev: https://lsl.dev/functions/llSensor/
