> ## Documentation Index
> Fetch the complete documentation index at: https://cs-lua.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# ents — Объект сущности

> Сущности: дропы, точки интереса, зоны, маркеры

# Объект сущности

<h2 id="index">
  e.index
</h2>

Индекс edict'а.

```lua theme={null}
e.index
```

### Возвращает

| тип      |                           |
| -------- | ------------------------- |
| `number` | индекс в таблице edict'ов |

Поле, а не метод. Годится ключом в своих таблицах.

<h2 id="origin">
  e:origin
</h2>

Читает или задаёт позицию сущности.

```lua theme={null}
e:origin([x, y, z])
```

### Аргументы

| # | имя       | тип    |                                     |
| - | --------- | ------ | ----------------------------------- |
| 1 | `x, y, z` | number | новая позиция; без них метод читает |

### Возвращает

| тип                      |            |
| ------------------------ | ---------- |
| `number, number, number` | координаты |

Запись идёт через движок и перелинковывает сущность в мире; присваивание `pev->origin` напрямую оставило бы её сталкиваться там, где она была.

<Warning>
  Объект от удалённой сущности — или переживший `changelevel` —
  бросает `entity #N is gone`. Проверяй [`e:valid()`](entity.md#valid).
</Warning>

<h2 id="angles">
  e:angles
</h2>

Читает или задаёт поворот сущности.

```lua theme={null}
e:angles([x, y, z])
```

### Аргументы

| # | имя       | тип    |                                  |
| - | --------- | ------ | -------------------------------- |
| 1 | `x, y, z` | number | новые углы; без них метод читает |

### Возвращает

| тип                      |      |
| ------------------------ | ---- |
| `number, number, number` | углы |

<Warning>
  Объект от удалённой сущности — или переживший `changelevel` —
  бросает `entity #N is gone`. Проверяй [`e:valid()`](entity.md#valid).
</Warning>

<h2 id="model">
  e:model
</h2>

Читает или задаёт модель сущности.

```lua theme={null}
e:model([path])
```

### Аргументы

| # | имя    | тип           |                                      |
| - | ------ | ------------- | ------------------------------------ |
| 1 | `path` | string \| nil | путь к модели; без него метод читает |

### Возвращает

| тип      |                |
| -------- | -------------- |
| `string` | текущая модель |

<Warning>
  Модель обязана быть предкэширована через
  [`res.model`](../res/index.md#model). Не предкэшированная стоит серверу
  ошибки, а сущность рисуется ничем.
</Warning>

<Warning>
  Объект от удалённой сущности — или переживший `changelevel` —
  бросает `entity #N is gone`. Проверяй [`e:valid()`](entity.md#valid).
</Warning>

<h2 id="classname">
  e:classname
</h2>

Classname сущности.

```lua theme={null}
e:classname()
```

### Возвращает

| тип      |           |
| -------- | --------- |
| `string` | classname |

<Warning>
  Объект от удалённой сущности — или переживший `changelevel` —
  бросает `entity #N is gone`. Проверяй [`e:valid()`](entity.md#valid).
</Warning>

<h2 id="valid">
  e:valid
</h2>

Жива ли сущность.

```lua theme={null}
e:valid()
```

### Возвращает

| тип       |                                                             |
| --------- | ----------------------------------------------------------- |
| `boolean` | `false`, если сущность удалена или осталась с прошлой карты |

### Пример

```lua theme={null}
if e:valid() then
	e:remove()
end
```

Единственный метод, который отвечает, а не бросает ошибку. Всё, что переживает раунд или смену карты, проверяй им.

<h2 id="spawn">
  e:spawn
</h2>

Запускает `Spawn` сущности.

```lua theme={null}
e:spawn()
```

### Возвращает

Ничего.

Именно это превращает голый edict в объект с хитбоксом и think-функцией. Вызывать после того, как выставлены модель и позиция.

<Warning>
  Объект от удалённой сущности — или переживший `changelevel` —
  бросает `entity #N is gone`. Проверяй [`e:valid()`](entity.md#valid).
</Warning>

<h2 id="remove">
  e:remove
</h2>

Убирает сущность из мира.

```lua theme={null}
e:remove()
```

### Возвращает

Ничего.

На уже удалённой сущности ошибкой не является и ничего не делает.

<h2 id="detonate_on_touch">
  e:detonate\_on\_touch
</h2>

Следующее касание сразу запускает think сущности.

```lua theme={null}
e:detonate_on_touch()
```

### Возвращает

Ничего.

### Пример

```lua theme={null}
hook.add("grenade:thrown", "myplugin.instant", function(e)
	if e.entity then
		e.entity:detonate_on_touch()
	end
end)
```

Одноразово: при первом касании чего угодно — стены, пола, игрока — движок
на следующем кадре сам вызовет think сущности, вместо того чтобы ждать её
обычный таймер. Для брошенной гранаты это и есть «взрыв при попадании»:
`ExplodeHeGrenade`/`ExplodeSmokeGrenade` — это и есть её think, только
случившийся сразу, а не через несколько секунд.

Не колбэк: Lua не узнаёт, что было касание, и не может решить, стоило ли
его ловить — только форсирует то, что сущность и так должна была сделать
рано или поздно. Для гранаты это ровно то, что нужно; для чего-то с другим
think эффект будет другим.

<Warning>
  Объект от удалённой сущности — или переживший `changelevel` —
  бросает `entity #N is gone`. Проверяй [`e:valid()`](entity.md#valid).
</Warning>

### Смотри также

* [grenade:thrown](../hook/gameplay.md#grenade_thrown)
* [grenade:explode](../hook/gameplay.md#grenade_explode)

<h2 id="keyvalue">
  e:keyvalue
</h2>

Задаёт keyvalue — то же, что делает карта.

```lua theme={null}
e:keyvalue(key, value)
```

### Аргументы

| # | имя     | тип    |                            |
| - | ------- | ------ | -------------------------- |
| 1 | `key`   | string | имя, например `targetname` |
| 2 | `value` | string | значение                   |

### Возвращает

| тип       |                          |
| --------- | ------------------------ |
| `boolean` | приняла ли игра это поле |

### Пример

```lua theme={null}
e:keyvalue("targetname", "door1")
```

Всё, что дизайнер уровня выставляет на сущности в редакторе, доступно отсюда.

<Warning>
  Только до [`e:spawn()`](entity.md#spawn): значения читает именно Spawn.
</Warning>

<h2 id="solid">
  e:solid
</h2>

Читает или задаёт тип столкновений.

```lua theme={null}
e:solid([value])
```

### Аргументы

| # | имя     | тип           |                       |
| - | ------- | ------------- | --------------------- |
| 1 | `value` | number \| nil | без него метод читает |

### Возвращает

| тип      |                  |
| -------- | ---------------- |
| `number` | текущее значение |

<h3 id="solid-значения">
  Значения
</h3>

| поле | тип    |                                               |
| ---- | ------ | --------------------------------------------- |
| `0`  | number | не сталкивается ни с чем                      |
| `1`  | number | триггер: срабатывает на касание, но не мешает |
| `2`  | number | ограничивающий параллелепипед                 |
| `3`  | number | skid box, как у игрока                        |
| `4`  | number | brush-модель из карты                         |

<Note>
  `e:spawn()` может выставить своё значение: у многих classname
  Spawn задаёт solid сам. Ставь после спавна, если важно.
</Note>

<h2 id="movetype">
  e:movetype
</h2>

Читает или задаёт, как движок двигает сущность.

```lua theme={null}
e:movetype([value])
```

### Аргументы

| # | имя     | тип           |                       |
| - | ------- | ------------- | --------------------- |
| 1 | `value` | number \| nil | без него метод читает |

### Возвращает

| тип      |                  |
| -------- | ---------------- |
| `number` | текущее значение |

<h3 id="movetype-частые-значения">
  Частые значения
</h3>

| поле | тип    |                                |
| ---- | ------ | ------------------------------ |
| `0`  | number | не двигается                   |
| `4`  | number | летит, гравитации нет          |
| `5`  | number | падает и лежит — дроп предмета |
| `6`  | number | толкает, как дверь             |
| `8`  | number | отскакивает, как граната       |
| `10` | number | следует за другой сущностью    |

<h2 id="size">
  e:size
</h2>

Читает или задаёт ограничивающий объём.

```lua theme={null}
e:size([minx, miny, minz, maxx, maxy, maxz])
```

### Аргументы

| # | имя          | тип    |                                   |
| - | ------------ | ------ | --------------------------------- |
| 1 | `minx..maxz` | number | углы объёма; без них метод читает |

### Возвращает

| тип          |          |
| ------------ | -------- |
| `number × 6` | два угла |

### Пример

```lua theme={null}
e:size(-16, -16, 0, 16, 16, 72)
```

Из этого и `e:solid(1)` получается зона-триггер. Запись идёт через движок и перелинковывает сущность: присваивание напрямую оставило бы её со старым объёмом.

<h2 id="render">
  e:render
</h2>

Читает или задаёт прозрачность и свечение.

```lua theme={null}
e:render([opts])
```

### Аргументы

| # | имя    | тип          |                       |
| - | ------ | ------------ | --------------------- |
| 1 | `opts` | table \| nil | без него метод читает |

### Возвращает

| тип     |                                       |
| ------- | ------------------------------------- |
| `table` | `{ mode =, amount =, color =, fx = }` |

<h3 id="render-опции">
  Опции
</h3>

| поле     | тип    |                                                       |
| -------- | ------ | ----------------------------------------------------- |
| `mode`   | number | `0` обычно, `2` прозрачность по amount, `5` аддитивно |
| `amount` | number | `0..255`, насколько видно                             |
| `color`  | table  | `{ r, g, b }`                                         |
| `fx`     | number | эффект: пульсация, мерцание                           |

### Пример

```lua theme={null}
e:render({ mode = 2, amount = 128, color = { 255, 0, 0 } })
```

Таблица опций, а не пять чисел подряд: который из них renderfx, никто не помнит.

<h2 id="render_for">
  e:render\_for
</h2>

То же самое, что `e:render()`, но только для одного игрока — остальные видят сущность как обычно.

```lua theme={null}
e:render_for(player[, opts])
```

### Аргументы

| # | имя      | тип              |                       |
| - | -------- | ---------------- | --------------------- |
| 1 | `player` | player \| number | кому                  |
| 2 | `opts`   | table \| nil     | без него метод читает |

### Возвращает

| тип            |                                                                              |
| -------------- | ---------------------------------------------------------------------------- |
| `table \| nil` | `{ mode =, amount =, color =, fx = }`, `nil` — нет override для этого игрока |

<h3 id="render_for-опции">
  Опции
</h3>

| поле     | тип    |                    |
| -------- | ------ | ------------------ |
| `mode`   | number | как у `e:render()` |
| `amount` | number | `0..255`           |
| `color`  | table  | `{ r, g, b }`      |
| `fx`     | number | эффект             |

### Пример

```lua theme={null}
-- невидим для конкретного зрителя, для остальных — как обычно
e:render_for(hunter, { mode = 4, amount = 0 })
```

Поле, которого нет в `opts`, остаётся тем, что уже было в этом override — а при первой установке берётся из обычного `e:render()` сущности. Работает только через `pfnAddToFullPack` — движок собирает копию сущности отдельно на каждого клиента, и только тут возможна разница между зрителями. Обычные `entvars` (то, что меняет `e:render()`) — одно значение на сущность, разлетается всем одинаково.

### Смотри также

* [e:render](entity.md#render)
* [e:clear\_render\_for](entity.md#clear_render_for)
* [e:visible\_to](entity.md#visible_to)

<h2 id="clear_render_for">
  e:clear\_render\_for
</h2>

Убирает override, поставленный `e:render_for()`/`e:visible_to()`.

```lua theme={null}
e:clear_render_for(player)
```

### Аргументы

| # | имя      | тип              |      |
| - | -------- | ---------------- | ---- |
| 1 | `player` | player \| number | кому |

### Возвращает

Ничего.

Игрок снова видит сущность как обычно.

### Смотри также

* [e:render\_for](entity.md#render_for)

<h2 id="visible_to">
  e:visible\_to
</h2>

Делает сущность видимой или невидимой для одного игрока.

```lua theme={null}
e:visible_to(player, visible)
```

### Аргументы

| # | имя       | тип              |                    |
| - | --------- | ---------------- | ------------------ |
| 1 | `player`  | player \| number | кому               |
| 2 | `visible` | boolean          | `false` — спрятать |

### Возвращает

Ничего.

### Пример

```lua theme={null}
hook.add("round:start", "furrien.hide", function()
	for _, hunter in ipairs(players.list{ team = "ct" }) do
		for _, prey in ipairs(players.list{ team = "t" }) do
			-- hunter не видит prey, все остальные видят как обычно
			prey:visible_to(hunter, false)
		end
	end
end)
```

Частый случай `e:render_for()`: `visible_to(p, false)` то же самое, что `render_for(p, { mode = 4, amount = 0 })`; `visible_to(p, true)` то же самое, что `clear_render_for(p)`.

### Смотри также

* [e:render\_for](entity.md#render_for)

<h2 id="pev">
  e:pev
</h2>

Читает или задаёт произвольное поле `entvars_t` по имени — то, для чего нет
готового метода вроде `e:origin()` или `e:solid()`.

```lua theme={null}
e:pev(name[, v...])
```

### Аргументы

| # | имя    | тип                               |                                                               |
| - | ------ | --------------------------------- | ------------------------------------------------------------- |
| 1 | `name` | string                            | имя поля, как в `entvars_t`: `health`, `v_angle`, `iuser1`, … |
| 2 | `v...` | number \| string \| entity \| nil | новое значение; без него метод читает                         |

### Возвращает

| тип                                  |                     |
| ------------------------------------ | ------------------- |
| `число (int/float)`                  | одно число          |
| `вектор`                             | три числа `x, y, z` |
| `строка`                             | строка              |
| `сущность (owner, aiment, enemy, …)` | `entity \| nil`     |

### Пример

```lua theme={null}
e:pev("health", 1)                -- то же, что и любой другой setter
local x, y, z = e:pev("origin")   -- то же, что e:origin()
e:pev("owner", other_entity)
e:pev("owner", nil)               -- снимает владельца
```

Имена — буквально из `entvars_t` (`progdefs.h`), без переименований: плагин,
портируемый с fakemeta, не требует таблицы соответствий. Полей нет для
`controller`/`blending` (байтовые массивы) — если понадобятся, это будет
отдельным методом.

Неизвестное имя поля бросает ошибку, а не возвращает `nil` — опечатка в
имени поля ловится сразу, а не где-то в логике плагина.

<Warning>
  Объект от удалённой сущности — или переживший `changelevel` —
  бросает `entity #N is gone`. Проверяй [`e:valid()`](entity.md#valid).
</Warning>

### Смотри также

* [p:pev](../players/state.md#pev)
