Недавно я снова начал играть в Minecraft. Ванильный Minecraft несколько скучен, как по мне, и я всегда ищу модпаки (пакеты дополнений). В поисках новых модпаков я наткнулся на FTB Horizons: Daybreaker. Из списка содержащихся в нем модов мое внимание привлек мод OpenComputers.

Как можно предположить из названия, модуль OpenComputers добавляет в Minecraft компьютеры. Настоящие компьютеры! При этом они тоже модульные. Вы можете добавлять периферию: от мониторов до клавиатур и карт расширения, которые добавляют возможности такие как графика и сеть. И эти компьютеры могут быть запрограммированы на языке Lua, прямо в игре. И существует такой вид карт, как Интернет-карта, которая можете себе представить, может подключаться к Интернету реального мира. Неплохо.

image

Итак, что мы можем сделать примерно в один час свободного времени?

У меня была парочка лампочек с WiFi, правда было бы неплохо управлять ними из Minecraft? Мои wifi-лампочки — это неизвестные девайсы, найденные на eBay, которые управлялись неуклюжим мобильным приложением. Друг мой Томас сделал реверс-инжиниринг протокола и я смог контролировать их цвет и состояние через TCP на порт 5577. Итак, у меня есть все что нужно, что дальше?

Начинаем мастерить


Прежде всего, я запустил Minecraft. Далее, я сотворил новый мир в Minecraft и вошел в игру. Переключился в творческий режим, что означает что я мог вносить в игру все что хочу, и построил OpenComputers компьютер. Имеется много инструкций на этот счет, но все же разобраться как работают такие компьютеры — это заняло некоторое время. После некоторых проб и ошибок у меня был работающий компьютер и я мог создать TCP соединение с реальным миром!

Протокол используемый лампочкой довольно прост, один байт заголовка (header byte), три дополнительных байта определяющих цвет в формате RGB, и байт определяющий яркость белого (лампочка RGBW), и один байт переключающий между режимом RGB и режимом белого, и замыкающий байт (footer byte). Достаточно просто!

0x56 RED GREEN BLUE WHITE MODE 0xAA

В ванильном Minecraft есть редстоун («красная пыль»), эквивалент электричеству в нашем мире. По умолчанию, поддерживаются различные блоки такие как рычаги, поршни, компараторы, и т.д. Люди создают реально сложные конструкции используя редстоун, такие как настоящий процессор. OpenComputers компьютеры работают от редстоуна, значит мы можем считывать бинарное значение состояния майнкрафтовского рычага: «включено» или «выключено» и переключать WHITE байт чтобы включить или выключать лампочку.

Это компьютер, который я построил в игре, у него есть 6 мониторов которые составляют один большой монитор, жесткий диск и редстоуновский рычаг подключенный справа линией «красной пыли»:

image

Соединяем это все вместе


Итак, у нас есть компьютер, способ управлять компьютером и входящими сигналами. Мы также имеем путь и протокол для коммуникации с лампочкой. Последний элемент паззла — программа которая запуститься на компьютере и оживит всю систему. Прежде всего я заспавнил в Minecraft жесткий диск. При записи информации на жесткий диск, OpenComputers компьютер создает директорию с уникальным идентификаторов в директории файлов Minecraft. Таким образом я могу добавлять, редактировать и удалять файлы из моего компьютера на компьютере в игре.

В качестве редактора я использовал Sublime Text, на мой взгляд писать код на компьютере в игре не слишком-то удобно. И вот после некоторых исследований и ошибок, я написал следующий скрипт:

local event = require('event')  
local net = require('internet')

local myEventHandlers = {}  
local running = true

local con = net.open('192.168.1.110', 5577)

function myEventHandlers.key_up(address, char, code, playerName)

  if (char == 'q') then
    running = false
    print('Goodbye ' .. playerName .. '!')
  end

end

function myEventHandlers.redstone_changed(_, address, side)

  local brightness = 0xff;

  if side > 0 then
    brightness = 0xff
  else
    brightness = 0x00
  end

  print('Sending ' .. brightness .. ' to lamp...')

  con:write(string.char(0x56))
  con:write(string.char(0x00))
  con:write(string.char(0x00))
  con:write(string.char(0x00))
  con:write(string.char(brightness))
  con:write(string.char(0x0f))
  con:write(string.char(0xaa))

  con:flush()

end

function handleEvent(eventID, ...)

  local event = myEventHandlers[eventID]

  if (event) then
    event(...)
  end

end

if con then  
  print('Connected to the bulb!')
end

while running do  
  handleEvent(event.pull())
end  

Программа на Lua при исполнении реагирует на два события (events): «key_up» и «redstone_changed». Первое имеет место, когда нажимается клавиша во время работы программы, и последнее — когда получен редстоун-сигнал.
Теперь у нас есть главный цикл событий, и можно было реализовать простую логику.

image

Прежде всего, если нажата клавиша 'q' — программа завершается. Когда получен сигнал редстоуна, программа преобразует положение рычага в '0x00' либо '0xFF', что означает включение и выключение wifi-лампы. Пакеты передаются по каналу и лампа реагирует соответственно. Наконец, TCP подключение открывается, когда программа запускается. Просто и работает!

Ссылки:

Комментарии (18)


  1. makcums
    24.11.2015 06:57

    Вот оно, будущее! Очень круто и футуристично!


  1. XogN
    24.11.2015 07:48
    +4

    Что вы наделали :) Я только попытался завязать с Майнкрафтом…


  1. Botkin
    24.11.2015 08:02
    +10


  1. meft
    24.11.2015 08:53
    -4

    Нет, ну я понимаю, круто и все такое но…
    Раньше старались придумать способ упростить работу:
    — костер
    — лампады
    — свечки
    — лампочки с выключателем
    Сейчас придумали способ включать/выключать свет через телефон.
    Вместо того чтобы встать и рукой стукнуть в стенку в оптимально расположенном месте на оптимальном уровне поднятой руки, утром, или даже ночью, нужно найти телефон, который может лежать где угодно (ребенок взял поиграть), найти там приложение, открыть, ткнуть в нужную кнопочку.
    Приведенный пример еще веселее. Встал я утром. Темно. Чтобы включить свет нужно включить компьютер…

    Я не говорю, что это плохо. Я хочу сказать, что найденный способ нужно доводить до ума, т.е. доводить до состояния, при котором текущие задачи станет проще выполнять.
    Например: свет по Wi-FI удобен только при условии, что включается он автоматически, а доступ по WiFi — это всего лишь упрощенный доступ к лампочке для автоматизации.

    А что на счет приведенного Вами примера про игрушку?
    Если Вы хотели рассказать про возможности самой игрушки, то зачем такое внимание коду (код не под спойлером). Если хотели показать, что свет можно включать из игрушки, то самый главный вопрос: Зачем?


    1. semenyakinVS
      24.11.2015 09:48
      +11

      Если хотели показать, что свет можно включать из игрушки, то самый главный вопрос: Зачем?


      Какой вы скучный… Это же просто прикольно!


    1. Botkin
      24.11.2015 09:58
      +5

      Потому что может.


    1. neit_kas
      24.11.2015 11:45

      Ну, зачем же только лампочкой ограничиваться? Лампочка — это, по сути, пример. Идею то можно и развить. Вот например:

      1. Ставим этот мод, Industrial Craft и Nuclear Control.
      2. Строим в майнкрафте атомный реактор и снабжаем его датчиком температуры.
      3. Берём arduino (или подобное) с WiFI/Ethernet и дисплеем.
      4. Подключаем и располагаем её где-нибудь возле компьютера.
      5. Далее пишем проги для arduino и майнкрафта, которые выведут информацию с датчика температуры (честно говоря, не помню, можно ли выводить само значение, но факт увелмчения температуры больше заданной константы точно можно).

      Итог: вы — маинкрафт-индустриализатор уровня «про», знакомые игроки — сгорают от зависти.
      Также, в плане реактора, можно развить идею на сигнализацию о перегреве. В общем, возможности ограничиваются только фантазией и возможностями плагинов (которые сейчас довольно велики).


    1. Ference
      24.11.2015 11:51

      Science is not about «why», it's about «why not?»
      — Cave Johnson. Portal 2


  1. vdovin_ds
    24.11.2015 09:08

    Это лучшее, что я видел в Майнкрафте :)


  1. semenyakinVS
    24.11.2015 09:50
    +9

    Круто! Даёшь открытое простое API для взаимодействие из майнкрафта с реальным миром!.. Ух, представил себе только! Можно же присобачить 3Д-принтер к игре и получать оттуда посылки!


    1. ageyev
      24.11.2015 10:37
      +5

      Даёшь открытое простое API для взаимодействия с реальным миром!

      That feeling that something was wrong with the world…

      Knock, knock, Neo.


  1. Hash
    24.11.2015 10:16

    Неплохо, но в Крыму не сработает


    1. Zenitchik
      24.11.2015 13:51
      -2

      А Вам не пофиг?


  1. EvilArcher
    24.11.2015 13:45
    +1

    Было бы круто увидеть такое в играх. Например, в игре взорвалось что-нибудь, а у тебя в квартире за спиной вспыхнули лампочки. Или, например, ослепили тебя в игре светом и тут же лампа светит тебе в твое реальное лицо.


    1. Dywar
      24.11.2015 20:16
      +1

      Лампочки на схеме, контроллер подключенный к ПК, служба висит и получает сигналы от игры и передает контроллеру а он меняет напряжение на лампочках. Добавить вентилятор, брызгалку воды, перчатку боксерскую для любителей активного спорта :)


  1. VokaMut
    25.11.2015 11:13

    «Мисье знает толк» или отличный способ заинтересовать ребёнка на его поле боя


  1. WebMonet
    26.11.2015 04:58
    +1

    И можно играть в майнкрафт, играя в майнкрафт…


    1. Disasm
      26.11.2015 19:44
      +1

      И рендерить картинку из другого майнкрафта с помощью aalib