Недавно я снова начал играть в Майнкрафт. Обычный Майнкрафт кажется мне скучноватым, поэтому я всегда обращаюсь к наборам модов — модпакам. После поиска новых модпаков, я наткнулся на FT Horizons: Daybreaker. Взглянув на список модов, входящих в набор, я сразу обратил внимание на OpenComputers.
Как следует из названия, OpenComputers добавляет в Майнкрафт компьютеры. Настоящие компьютеры! И кучу модулей к ним. Можно добавлять периферийные устройства от мониторов и клавиатур, до карт расширения, таких как графические и сетевые карты. А ещё они могут выполнять, прямо в игре, программы написанные на языке Lua. Одна из карт расширения — это Internet-карта, которая, как Вы могли догадаться, может осуществлять связь с настоящим интернетом. Восхитительно.
Чего же мы можем сделать приблизительно за один час свободного времени? У меня есть пара WiFi-ламп, разве было бы плохо получить возможность управлять ими через Minecraft? Мои WiFi-лампы — это неизвестные устройства, купленные на eBay, которые используют для управления отвратительное мобильное приложение. Мой друг Томас разобрался с тем как они работают, и я получил возможность управлять их цветом и состоянием по протоколу TCP через порт 5577. У меня есть всё, что мне нужно и… что дальше?
Не бойтесь запачкать руки
В первую очередь я запустил Майнкрафт. Потом я создал новый мир и вошёл в игру. Переключившись в творческий режим, что означает что я могу создавать в игре любой предмет или блок, который мне нужен, я построил компьютер из мода OpenComputers. По этому поводу есть много обучалок, так что пришлось потратить время на изучение того, как оно работает. После нескольких неудач я смог установить TCP-соединение с реальным миром!
Протокол, используемый лампами очень простой. Один байт заголовка, три дополнительных байта, определяющих RGB-цвет и байт, описывающий яркость белого (это RGBW-лампа), один байт описывающий переключение между RGB и белым, а также заключительный байт. Действительно просто!
1 |
0x56 RED GREEN BLUE WHITE MODE 0xAA |
В обычном Майнкрафте есть редстоун, своеобразный аналог электричества в нашем мире. По умолчанию, поддерживаются различные блоки, такие как: рычаги, поршни, компараторы и т.п. С их помощью можно создавать по-настоящему сложные схемы, такие как процессоры. Компьютеры из OpenComputers работают при помощи RedStone, так что мы можем очень просто считывать двоичное состояние обычного Майнкрафт-рычага — включен/выключен для того чтобы включать или выключать WiFi-лампу.
Вот какой компьютер, я построил в игре. У него шестиблочный монитор, дисковый накопитель и рычаг, присоединённый к нему при помощи красной пыли.
Собираем всё вместе
Итак, у нас есть компьютер, способ управлять им и входные сигналы. А ещё у нас есть способ и протокол для общения с лампой. Последняя часть головоломки — это программа, которую надо запустить на компьютере и осуществить задуманное. В первую очередь, я создал диск в Майнкрафте. Когда этот диск вставляется в дисковод, OpenComputers создает папку с уникальным идентификатором среди игровых файлов. Таким образом я получил возможность добавлять, редактировать и удалять файлы из моего компьютера на компьютере в майнкрафте. Я использую редактор Sublime и мне показалось очень утомительным использование внутри-игрового компьютера для написания кода. После ряда попыток у меня получился вот такой скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
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 привязана к двум событиям: key_up и redstone_changed. Первое событие инициируется при запуске программы, а второе когда происходит изменение состояние редстоуна подключенного к компьютеру. Теперь я получил основные циклы событий и смог реализовать простейшую логику.
В результате получилась программа, которая прекращает работу когда нажата кнопка q. При инициации редстоун-события программа, на основании состояния рычага, отправляет значение 0x00 или 0xFF для WiFi-лампы. Пакет данных отправляется и лампа регирует соответственно. В заключении, отмечу что TCP-соединение открывается при запуске программы.
Всё легко и просто! И это работает!
Breaking the fourth wall with Minecraft
Видел статью на одном портале о том, как синхронизировать воемя майнкрафта со светодиодами: чтобы они принимали нужный цвет в зависимости от времени в игре. Тоже на таком моде. =)
Егор, класно! Я вообще когда переводил, задумался чего бы тоже такого сообразить. Пока ничего не придумал ;)
Igor, ну насколко я помню, там все было сделано на Arduino(платы такие), но могу ошибаться
Егор, про Arduino, знаю. Всё никак не обзаведусь :) Надо как-то собраться :)
Igor, в принципе применению данной технологии с ОС много, вплоть до полного управления дома прямиком из майнкрафта, но это нужно быть самым настоящим мазохистом :D
Егор, ну почему. Если у тебя дом, управляется с телефона и т.п. (я знаю примеры), то почему бы не сделать дублирующее управление из майнкрафт ;)
Такой дополнительный забавный бонус
Igor, ну в принципе да, как паралельное управление неплохо. Возможно, если найду тему по синхронизации времени с лампой — скину ссылку в лс
Буду благодарен :)