OpenComputers/Сигналы

**Сигналы** — это сообщения, которые посылаются компьютеру внешними источниками. Они используются во многих ситуациях.


Сигнал всегда содержит название. Кроме него он может содержать некоторое количество простых параметров.


Сигнал можно получить и обработать функцией `computer.pullSignal()`

(Computer API), или, что более удобно, функцией `event.pull()`

(Event API). Вторая функция *предпочтительней*, так как сигналы также распространяются как события (events), с которыми работают многие системные функции (поиск «главного» компонента, например).



### Пример

Эта программа принимает сообщение модема:

local event = require("event") local _, localNetworkCard, remoteAddress, port, distance, payload = event.pull("modem_message") print("Received data '" .. tostring(payload) .. "' from address " .. remoteAddress .. " on network card " .. localNetworkCard .. " on port " .. port .. ".") if distance > 0 then print("Message was sent from " .. distance .. " blocks away.") end



## Сигналы различных компонентов

Сигналы описаны в формате `name(arg: type, ...)`

. Это означает, что вы должны принимать их так: `local name, arg, ... = event.pull()`

.



### Компьютер

`component_added(address: string, componentType: string)`


Сигнал посылает компьютер или робот, когда к нему присоединяется новый компонент.

`address`

— адрес нового компонента.


`componentType`

— тип нового компонента. (Например,`redstone`

или`gpu`

.)


* Примечание*: не используйте это событие, если возможно. Обрабатывайте сигнал

`component_available`

. Этот сигнал используется библиотекой Component API при добавлении «основного» компонента, или при переназначении «основного» компонента.


`component_removed(address: string, componentType: string)`


Сигнал посылает компьютер или робот, когда какой-либо компонент отсоединен.

`address`

— адрес нового компонента.


`componentType`

— тип удаленного компонента. (Например,`redstone`

или`gpu`

.)


* Примечание*: не используйте это событие, если возможно. Обрабатывайте сигнал

`component_unavailable`

. Этот сигнал используется библиотекой Component API при удалении «основного» компонента.


`component_available(componentType: string)`


Этот сигнал посылает библиотека компонентов, когда добавлен или изменён «главный» компонент. Используйте его вместо `component_added`

, чтобы избежать конфликтов с библиотекой компонентов.



`component_unavailable(componentType: string)`


Этот сигнал посылает библиотека компонентов, когда отсоединен или удален «главный» компонент. Используйте его вместо `component_removed`

, чтобы избежать конфликтов с библиотекой компонентов.



`term_available()`


Сигнал посылает библиотека терминала, когда становятся доступны видеокарта и монитор. Удобно использовать для того, чтобы определить когда становится возможно вывести текст на экран.



`term_unavailable()`


Сигнал посылает библиотека терминала, когда становятся недоступны видеокарта или монитор. Удобно использовать для того, чтобы определить когда становится невозможно вывести текст на экран.



### Монитор

`screen_resize(screenAddress: string, newWidth: number, newHeight: number)`


Сигнал посылает монитор, когда меняется его разрешение. Например, когда его вручную изменили при помощи GPU API.

`address`

— адрес монитора, который послал сигнал.




`touch(screenAddress: string, x: number, y: number, button: number, playerName: string)`


Сигнал посылается мониторами второго или третьего уровней, когда пользователь щелкает мышью по экрану. Это означает левый щелчок мыши когда открыт интерфейс экрана (когда к нему присоединена клавиатура) или правый щелчок мыши на мониторе из игрового мира (когда клавиатура не присоединена).

`address`

— адрес монитора, который послал сигнал.


`x`

и`y`

— координаты точки щелчка в экранных координатах (которые используются функциями`term.setCursor`

или`gpu.set`

).


`playerName`

— имя пользователя, который сделал щелчок.


*Примечание*: в будущем возможно появится функция, которая позволит отключить распознавание пользователя (если вы считаете, что это слишком… не реалистично). Однако это удобно при создания программ для большого количества пользователей.

* Важно*: этот сигнал посылается только пользователями, которые зарегистрированы на компьютере (см. Computer API). Или тогда, когда ни одного пользователя не зарегистрировано (когда все пользователи имеют доступ к компьютеру).



`drag(screenAddress: string, x: number, y: number, button: number, playerName: string)`


Этот сигнал практически эквивалентен сигналу `touch`

. Различие в том, что сигнал `drag`

«принадлежит» сигналу `touch`

, посланному до этого. То есть он регистрирует продолжающееся движение мышки с нажатой кнопкой.



`drop(screenAddress: string, x: number, y: number, button: number, playerName: string)`


Этот сигнал будет послан только в том случае, если перед ним был послан сигнал `drag`

. Сигнал обозначает, что пользователь отпустил кнопку мыши.



`scroll(screenAddress: string, x: number, y: number, direction: number, playerName: string)`


Этот сигнал посылают мониторы второго и третьего уровня, когда игрок использует колесико мыши в интерфейсе монитора.

`address`

— адрес монитора, который послал сигнал.


`x`

и`y`

— экранные координаты (как и в событии`touch`

) в которых находился курсор мыши.


`direction`

— направление «скролла». Положительное значение означает «вверх», а отрицательное — «вниз». (Эти значения могут поменяться, в зависимости от операционной системы и настроек драйверов мыши).


`playerName`

— имя пользователя, который вызвал событие.




`walk(screenAddress: string, x: number, y: number[, playerName: string])`


Сигнал посылают мониторы второго и третьего уровня, когда по ним ходит игрок или другое существо.

`address`

— адрес монитора, который послал сигнал.


`x`

и`y`

— координаты блока в мультиблочном мониторе. Учтите, что в отличие от`touch`

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


`playerName`

— имя пользователя, который вызвал событие.




### Клавиатура

`key_down(keyboardAddress: string, char: number, code: number, playerName: string)`


Сигнал посылает клавиатура, когда пользователь *нажимает* кнопку в интерфейсе монитора. Сигнал может повторяться, если пользователь не отпускает её.

* Важно*: этот сигнал посылается только пользователями, которые зарегистрированы на компьютере (см. Computer API). Или тогда, когда ни одного пользователя не зарегистрировано (когда все пользователи имеют доступ к компьютеру).



`key_up(keyboardAddress: string, char: number, code: number, playerName: string)`


Этот сигнал посылает клавиатура, когда пользователь *отпустил* кнопку в интерфейсе монитора.

*Примечание*: несмотря на то, что все ситуации, когда пользователь отходит от монитора, не отпустив зажатую кнопку, *отслеживаются* модификацией, могут возникнуть уникальные ситуации, когда это событие не будет послано.

* Важно*: этот сигнал посылается только пользователями, которые зарегистрированы на компьютере (см. Computer API). Или тогда, когда ни одного пользователя не зарегистрировано (когда все пользователи имеют доступ к компьютеру).



`clipboard(keyboardAddress: string, value: string, playerName: string)`


Это событие посылает клавиатура, когда пользователь вставляет текст из буфера обмена (`⇧ Shift`+`Insert` или серединная кнопка мыши). Учтите, что максимальная длина вставляемого текста ограничена (см. файл конфигурации).

* Важно*: этот сигнал посылается только пользователями, которые зарегистрированы на компьютере (см. Computer API). Или тогда, когда ни одного пользователя не зарегистрировано (когда все пользователи имеют доступ к компьютеру).



### Красный контроллер и Красная плата

`redstone_changed(name: string, address: string, side: number, power1: number, power2: number)`


Сигнал посылается компонентом, который работает с красным камнем, когда входящий сигнал красного камня изменяется.

`name`

— имя сигнала -`redstone_changed`


`address`

— адрес красного контроллера, или компьютера с красной платой, который послал сигнал.

`side`

— константа, которая обозначает сторону (см. Sides API), принимающую изменившийся сигнал. Для контроллера это абсолютная сторона (относительно игрового мира), для компьютера — сторона относительно его передней панели`power1`

— сила красного сигнала (0-15), которая была до изменения`power1`

— сила красного сигнала (0-15), которая стала после изменения



### Сетевая плата или Беспроводная сетевая плата

`modem_message(receiverAddress: string, senderAddress: string, port: number, distance: number, ...)`


Сигнал посылает сетевая плата (включая беспроводные), при получении пакета на открытый порт.

`receiverAddress`

— адрес сетевой платы, которая приняла сообщение.


`senderAddress`

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


*Примечание*: адрес отправителя может не совпадать с адресом сетевой платы, которая его отправила, если по пути пакет прошел через один или несколько роутеров (коммутатор или точку доступа).

`port`

— порт на который было принято сообщение.


`distance`

— расстояние до беспроводной платы, которая отправила сообщение. Для проводных плат расстояние всегда равно нулю.


Остальные параметры — это собственно данные пакета, отправленного функцией `modem.send()`

или `modem.broadcast()`

.



### Робот

`inventory_changed(slot: number)`


Сигнал отправляет робот, при изменении состояния инвентаря. Сигнал посылается, когда предмет кладется в слот, или удаляется из него. Сигнал не будет послан, при изменении числа предметов в слоте.

Если пользователь вручную заменяет содержимое ячейки (например, палки на факелы), будет послано два сигнала — один, когда старый предмет был удален из слота, второй — когда новый предмет бы положен в слот.

Если робот меняет местами содержимое двух слотов командой `robot.transferTo()`

, будет послано *четыре* сигнала. По два сигнала на каждый слот.

Этот сигнал работает только непосредственно с инвентарем. Он не учитывает слоты для инструмента, карты, дискеты и апгрейда.



### Датчик движения

`motion(address: string, x: number, y:number, z:number, player: string)`


Событие создает проходящее в области видимости датчика живое существо. Последний параметр — ник игрока или название существа.