Недавно я снова начал играть в Minecraft. Ванильный Minecraft несколько скучен, как по мне, и я всегда ищу модпаки (пакеты дополнений). В поисках новых модпаков я наткнулся на FTB Horizons: Daybreaker. Из списка содержащихся в нем модов мое внимание привлек мод OpenComputers.
Как можно предположить из названия, модуль OpenComputers добавляет в Minecraft компьютеры. Настоящие компьютеры! При этом они тоже модульные. Вы можете добавлять периферию: от мониторов до клавиатур и карт расширения, которые добавляют возможности такие как графика и сеть. И эти компьютеры могут быть запрограммированы на языке Lua, прямо в игре. И существует такой вид карт, как Интернет-карта, которая можете себе представить, может подключаться к Интернету реального мира. Неплохо.
Итак, что мы можем сделать примерно в один час свободного времени?
У меня была парочка лампочек с 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 мониторов которые составляют один большой монитор, жесткий диск и редстоуновский рычаг подключенный справа линией «красной пыли»:
Соединяем это все вместе
Итак, у нас есть компьютер, способ управлять компьютером и входящими сигналами. Мы также имеем путь и протокол для коммуникации с лампочкой. Последний элемент паззла — программа которая запуститься на компьютере и оживит всю систему. Прежде всего я заспавнил в 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». Первое имеет место, когда нажимается клавиша во время работы программы, и последнее — когда получен редстоун-сигнал.
Теперь у нас есть главный цикл событий, и можно было реализовать простую логику.
Прежде всего, если нажата клавиша ‘q’ — программа завершается. Когда получен сигнал редстоуна, программа преобразует положение рычага в ‘0x00’ либо ‘0xFF’, что означает включение и выключение wifi-лампы. Пакеты передаются по каналу и лампа реагирует соответственно. Наконец, TCP подключение открывается, когда программа запускается. Просто и работает!
Ссылки:
- Четвёртая стена (термин)
- оригинал статьи
- использовавшаяся автором модель WiFi лампочки на dx.com
- Обсуждение на Hacker News
- OpenComputers на GitHub
- OpenComputers на Minecraft Forum
ссылка на оригинал статьи http://habrahabr.ru/post/271527/
Добавить комментарий