> ## 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.

# hook — Движок и ReHLDS

> В отличие от «Геймплея» эти события не требуют ReGameDLL — работают и на ванильном `mp.dll`. Три из них (отмечены отдельно) требуют ReHLDS

# Движок и ReHLDS

В отличие от «Геймплея» эти события не требуют ReGameDLL — работают и на ванильном `mp.dll`. Три из них (отмечены отдельно) требуют ReHLDS.

<h2 id="player_use">
  player:use
</h2>

Игрок нажал +use на чём-то с обработчиком Use — кнопке, рычаге, multi\_manager.

```lua theme={null}
hook.add("player:use", id, function(e)
	...
end)
```

<h3 id="player_use-поля-события">
  Поля события
</h3>

| поле       | тип           |                                               |
| ---------- | ------------- | --------------------------------------------- |
| `e.player` | player        | кого касается событие                         |
| `e.entity` | entity \| nil | что использовали; `nil`, если оно уже пропало |

Не отменяемое: к моменту события движковый `DispatchUse` уже отработал.

<h2 id="player_suicide">
  player:suicide
</h2>

Игрок вот-вот покончит с собой командой `kill` из консоли.

```lua theme={null}
hook.add("player:suicide", id, function(e)
	...
end)
```

<h3 id="player_suicide-поля-события">
  Поля события
</h3>

| поле       | тип    |                       |
| ---------- | ------ | --------------------- |
| `e.player` | player | кого касается событие |

**Отмена.** `e:cancel()` — команда не срабатывает вообще, даже таймер повторного `kill` не сдвигается.

<h2 id="should_collide">
  ents:should\_collide
</h2>

Движок решает, должны ли две сущности физически сталкиваться.

```lua theme={null}
hook.add("ents:should_collide", id, function(e)
	...
end)
```

<h3 id="should_collide-поля-события">
  Поля события
</h3>

| поле        | тип           |                                              |
| ----------- | ------------- | -------------------------------------------- |
| `e.entity`  | entity \| nil | первая сущность                              |
| `e.other`   | entity \| nil | вторая сущность                              |
| `e.collide` | boolean       | запись: сталкиваются ли; по умолчанию `true` |

Не через `e:cancel()` — здесь нет «отмены», это гейт с записываемым результатом: последний обработчик, тронувший `e.collide`, и решает. Молчание любого обработчика оставляет `true` — обычную физику.

Единственная реализация этого хука в принципе: ReGameDLL сам его не предоставляет, так что тут нечего «оборачивать» — какой ответ дашь, такой и будет.

<h2 id="ents_free">
  ents:free
</h2>

Сущность вот-вот уничтожат — последняя точка, где её ещё можно прочитать.

```lua theme={null}
hook.add("ents:free", id, function(e)
	...
end)
```

<h3 id="ents_free-поля-события">
  Поля события
</h3>

| поле       | тип           |                                       |
| ---------- | ------------- | ------------------------------------- |
| `e.entity` | entity \| nil | сущность, ещё живая на момент события |

Не отменяемое: держать сущность после этого события всё равно нельзя, движок продолжит её разрушать сразу после.

<h2 id="player_cvar_value">
  player:cvar\_value
</h2>

Клиент ответил на запрос значения cvar — старый вариант API, без имени cvar и без id запроса.

```lua theme={null}
hook.add("player:cvar_value", id, function(e)
	...
end)
```

<h3 id="player_cvar_value-поля-события">
  Поля события
</h3>

| поле       | тип    |                                  |
| ---------- | ------ | -------------------------------- |
| `e.player` | player | кого касается событие            |
| `e.value`  | string | значение, которое прислал клиент |

Плагин, который запрашивал значение, обязан сам помнить, о каком cvar шла речь — движок это не передаёт.

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

* [player:cvar\_value2](engine.md#player_cvar_value2)

<h2 id="player_cvar_value2">
  player:cvar\_value2
</h2>

То же самое, но новый вариант API: с именем cvar и id запроса, чтобы сверить ответ с тем, что спрашивали.

```lua theme={null}
hook.add("player:cvar_value2", id, function(e)
	...
end)
```

<h3 id="player_cvar_value2-поля-события">
  Поля события
</h3>

| поле           | тип    |                                     |
| -------------- | ------ | ----------------------------------- |
| `e.player`     | player | кого касается событие               |
| `e.request_id` | number | id, который был передан при запросе |
| `e.cvar`       | string | имя cvar, про который спросили      |
| `e.value`      | string | значение, которое прислал клиент    |

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

* [player:cvar\_value](engine.md#player_cvar_value)

<h2 id="server_cvar_change">
  server:cvar\_change
</h2>

Любой cvar вот-вот изменится — движковый, чужого плагина, свой.

```lua theme={null}
hook.add("server:cvar_change", id, function(e)
	...
end)
```

<h3 id="server_cvar_change-поля-события">
  Поля события
</h3>

| поле      | тип    |                |
| --------- | ------ | -------------- |
| `e.name`  | string | имя cvar       |
| `e.value` | string | новое значение |

**Отмена.** `e:cancel()` — cvar остаётся со старым значением.

Обработчик, который сам меняет cvar изнутри этого события, войдёт в него снова — не меняй здесь тот же cvar безусловно, иначе рекурсия не остановится.

<Warning>
  Событие требует ReHLDS. На движке без него — тихо никогда не
  срабатывает, без ошибок и предупреждений.
</Warning>

<h2 id="server_precache_generic">
  server:precache\_generic
</h2>

Прекеширован generic-ресурс (не модель и не звук) — движком, игрой, другим плагином.

```lua theme={null}
hook.add("server:precache_generic", id, function(e)
	...
end)
```

<h3 id="server_precache_generic-поля-события">
  Поля события
</h3>

| поле      | тип    |              |
| --------- | ------ | ------------ |
| `e.name`  | string | путь ресурса |
| `e.index` | number | слот прекеша |

<Warning>
  Событие требует ReHLDS. На движке без него — тихо никогда не
  срабатывает, без ошибок и предупреждений.
</Warning>

<h2 id="bot_created">
  client:bot\_created
</h2>

Подключился бот (fake client).

```lua theme={null}
hook.add("client:bot_created", id, function(e)
	...
end)
```

<h3 id="bot_created-поля-события">
  Поля события
</h3>

| поле       | тип    |                       |
| ---------- | ------ | --------------------- |
| `e.player` | player | кого касается событие |

<Warning>
  Событие требует ReHLDS. На движке без него — тихо никогда не
  срабатывает, без ошибок и предупреждений.
</Warning>
