Параметры событий
Каждый callback(event) получает общий envelope:
| Поле | Тип | Значение |
|---|---|---|
name | string | Точное имя. |
sequence | integer | Монотонный номер доставки. |
timestamp | integer | Монотонное время в мс, не календарное. |
sessionId | integer | Связанная сессия. |
playerGeneration | integer | Связанное поколение игрока. |
Table действует только во время callback. Изменения немаркированных полей не влияют на host.
Lifecycle, frame и UI
| Событие | Дополнительные поля |
|---|---|
plugin.loaded, session.started, session.ended, game.ready, server.connected, server.disconnected, player.spawned, player.died | Нет. |
game.frame | deltaSeconds: number. |
draw.hud | deltaSeconds, screenWidth, screenHeight: number. |
ui.menu_opened, ui.menu_closed | Нет; требуется ui.menu. |
ui.control_changed | pluginId, pageId, controlId; value: boolean для switch, number для slider, string для choice/text input и "click" для button. |
На player.spawned заново получайте Handles и leases.
Игрок
| Событие | Разрешение | Payload |
|---|---|---|
player.health_changed | game.player.read | previousHealth, health: number. |
player.vehicle_entered, player.vehicle_left | game.vehicle.read | vehicleId: integer, passenger: boolean. |
player.interior_changed | game.state.read | previousInterior, interior: integer. |
player.damage_before требует game.player.write: damage — изменяемое конечное число 0..100000; 0 подавляет урон. Также доступны weaponType, bodyPart, sourceType="player"|"actor"|"entity" и условные sourcePlayerId/sourceActorId. Обработчики видят результат предыдущих; некорректная замена игнорируется; yield запрещён.
Чат
| Событие | Payload |
|---|---|
chat.message_received | playerId, playerName, message, localPlayer; требует chat.read. |
chat.server_message_received | message, color ARGB; требует chat.read. |
chat.bubble_received | playerId, message, color, drawDistance, durationMs; требует chat.read. |
chat.message_sending (chat.intercept) позволяет менять message и cancelled; строка UTF-8, 1–4096 байт, без NUL/CR/LF и не начинается с /. command.executing (command.intercept) позволяет менять command и cancelled; команда начинается с /, имеет символ после него и те же лимиты. Отмена sticky: true нельзя вернуть в false. Yield запрещён.
Checkpoint и сущности
checkpoint.entered/checkpoint.left требуют game.state.read и содержат kind="normal"|"race", position: Vector3, а также либо size: Vector3, либо radius: number и raceType: integer.
entity.streamed_in/entity.streamed_out требуют game.entity.read и содержат entityType, entityId, streamGeneration. После streamed_out старый Handle недействителен.
Dialog
dialog.shown требует dialog.read: dialogId (0..32767), styleId (0..5), style (message, input, list, password, tablist, tablist_headers), title, message, primaryButton, secondaryButton. Все строки UTF-8; title и каждая кнопка — до 1024 байт, message — до 16 КиБ.
dialog.responding требует dialog.intercept. Изменяемы accepted: boolean, listItem: integer (-1..65534), input: string (UTF-8, до 4096 байт, без NUL/CR/LF) и cancelled; dialogId только для чтения. Отмена sticky, yield запрещён.
TextDraw
Идентичность: textdrawId (0..3071) плюс положительный textdrawGeneration.
| Событие | Разрешение | Payload |
|---|---|---|
textdraw.shown | textdraw.read | identity, styleId, text, selectable, x, y. |
textdraw.hidden | textdraw.read | identity. |
textdraw.text_changed | textdraw.read | identity, text. |
textdraw.clicking | textdraw.intercept | identity, изменяемый cancelled. |
Text до 4096 байт. Отмена клика sticky, yield запрещён.