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

# msg — Отправка

> Отправка сырых сетевых сообщений движка — своих и стоковых

# Отправка

<h2 id="send">
  msg.send
</h2>

Собирает и отправляет одно сетевое сообщение.

```lua theme={null}
msg.send(dest, name, target, ...)
```

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

| # | имя      | тип                                 |                                         |
| - | -------- | ----------------------------------- | --------------------------------------- |
| 1 | `dest`   | string                              | куда слать — см. ниже                   |
| 2 | `name`   | string                              | имя сообщения                           |
| 3 | `target` | player \| entity \| table \| nil    | получатель или точка, зависит от `dest` |
| 4 | `...`    | поля из `msg.byte`/`msg.string`/... | данные сообщения, по порядку в проводе  |

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

| тип       |                                                                                                               |
| --------- | ------------------------------------------------------------------------------------------------------------- |
| `boolean` | `true` при успехе; при неверных аргументах — ошибка Lua, сообщение не уходит вообще (ни частично, ни целиком) |

### Пример

```lua theme={null}
hook.add("player:death", "myplugin.fade", function(e)
  msg.send("one", "ScreenFade", e.player,
    msg.short(1000),   -- duration
    msg.short(0),      -- hold
    msg.short(0),      -- flags
    msg.byte(0), msg.byte(0), msg.byte(0), msg.byte(200))
end)
```

## dest

| Значение           | Куда уходит                                 | `target`                                     |
| ------------------ | ------------------------------------------- | -------------------------------------------- |
| `"one"`            | Одному игроку, надёжно                      | игрок — обязателен                           |
| `"one_unreliable"` | Одному игроку, ненадёжно (может потеряться) | игрок — обязателен                           |
| `"all"`            | Всем подключённым                           | не используется, передавай `nil`             |
| `"pvs"`            | Всем, кто видит точку (PVS)                 | игрок, сущность или `{x, y, z}` — обязателен |
| `"pas"`            | Всем, кто слышит точку (PAS)                | игрок, сущность или `{x, y, z}` — обязателен |

Для `"pvs"`/`"pas"` игрок или сущность в `target` — просто источник точки:
берётся `origin` их `edict`, дальше это обычная рассылка по видимости/слышимости,
не «этому конкретному игроку».

## name

Имя сообщения ищется через движок (`RegUserMsg`), не через жёстко прошитый
список:

* Если сообщение с таким именем уже зарегистрировано игровой библиотекой
  (`TextMsg`, `ScreenFade`, `Damage`, `BarTime`, ...) — вернётся тот же id,
  и клиент обработает его штатно.
* Если имя никто ещё не занял — движок зарегистрирует новое сообщение под
  этим именем. Это годится только для клиента, который сам умеет его читать
  (свой клиентский мод); стоковый `hl.dll`/движок просто проигнорирует
  неизвестное имя.

Id резолвится один раз и кешируется — второй `msg.send` с тем же `name`
ничего не переспрашивает у движка.

## Поля

Порядок аргументов после `target` — это порядок байт в проводе. Он должен
совпадать с тем, что ждёт получатель (для стоковых сообщений — с тем, что
разбирает клиент; для своих — с тем, что разбирает твой клиентский код).
Типы полей — [`msg.byte` и соседние](fields.md).

<Warning>
  Если `dest` требует получателя/точку (`one`, `one_unreliable`, `pvs`, `pas`),
  а `target` не подходит — ошибка Lua до всякой отправки. Само сообщение при
  этом никогда не уходит наполовину: либо `MESSAGE_BEGIN`/`MESSAGE_END`
  отработали целиком, либо не начинались вовсе.
</Warning>
