Управление вещами реального мира из виртуального мира Minecraft (перевод)

перевод
ageyev 24 ноября 2015 в 06:36 34,2k
Оригинал: giannoug
Недавно я снова начал играть в 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 подключение открывается, когда программа запускается. Просто и работает!

Ссылки:
Проголосовать:
+28
Сохранить: