OpenComputers/Сигналы

Материал из Minecraft Wiki
Перейти к: навигация, поиск

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


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


Сигнал можно получить и обработать функцией 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(address: string, side: number)

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

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


Сетевая плата или Беспроводная сетевая плата[править | править код]

  • 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)

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