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)
Событие создает проходящее в области видимости датчика живое существо. Последний параметр — ник игрока или название существа.