Недавно я снова начал играть в Майнкрафт. Обычный Майнкрафт кажется мне скучноватым, поэтому я всегда обращаюсь к наборам модов — модпакам. После поиска новых модпаков, я наткнулся на FT Horizons: Daybreaker. Взглянув на список модов, входящих в набор, я сразу обратил внимание на OpenComputers.

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

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

Не бойтесь запачкать руки

В первую очередь я запустил Майнкрафт. Потом я создал новый мир и вошёл в игру. Переключившись в творческий режим, что означает что я могу создавать в игре любой предмет или блок, который мне нужен, я построил компьютер из мода OpenComputers. По этому поводу есть много обучалок, так что пришлось потратить время на изучение того, как оно работает.  После нескольких неудач я смог установить TCP-соединение с реальным миром!

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

В обычном Майнкрафте есть редстоун, своеобразный аналог электричества в нашем мире. По умолчанию, поддерживаются различные блоки, такие как: рычаги, поршни, компараторы и т.п. С их помощью можно создавать по-настоящему сложные схемы, такие как процессоры. Компьютеры из OpenComputers работают при помощи RedStone, так что мы можем очень просто считывать двоичное состояние обычного Майнкрафт-рычага — включен/выключен для того чтобы включать или выключать WiFi-лампу.

Вот какой компьютер, я построил в игре. У него шестиблочный монитор, дисковый накопитель и рычаг, присоединённый к нему при помощи красной пыли.

breaking-the-4th-wall-with-minecraft

Собираем всё вместе

Итак, у нас есть компьютер, способ управлять им и входные сигналы. А ещё у нас есть способ и протокол для общения с лампой. Последняя часть головоломки — это программа, которую надо запустить на компьютере и осуществить задуманное. В первую очередь, я создал диск в Майнкрафте. Когда этот диск вставляется в дисковод, OpenComputers создает папку с уникальным идентификатором среди игровых файлов. Таким образом я получил возможность добавлять, редактировать и удалять файлы из моего компьютера на компьютере в майнкрафте. Я использую редактор Sublime и мне показалось очень утомительным использование внутри-игрового компьютера для написания кода. После ряда попыток у меня получился вот такой скрипт:

Программа на Lua привязана к двум событиям: key_up и redstone_changed. Первое событие инициируется при запуске программы, а второе когда происходит изменение состояние редстоуна подключенного к компьютеру. Теперь я получил основные циклы событий и смог реализовать простейшую логику.

light-the-lamp-from-minecraft

В результате получилась программа, которая прекращает работу когда нажата кнопка q. При инициации редстоун-события программа, на основании состояния рычага, отправляет значение 0x00 или 0xFF для WiFi-лампы. Пакет данных отправляется и лампа регирует соответственно. В заключении, отмечу что TCP-соединение открывается при запуске программы.

Всё легко и просто! И это работает!

Breaking the fourth wall with Minecraft

hashbang.gr