Майнкрафт

Публикация № 1214867

Сообщество - Игры

игра майнкрафт minecraft формат NBT карт изображение карты

Не знаю, кто как расслабляется после работы, а я играю в Майнкрафт. Эта нелепая поначалу игра всё же затянула и меня полгода назад. И вот, результат игрищ программиста 1С в Майнкрафте.

Разбирался я в игре с нуля. Сначала я ютился на островке, куда попал после спавна. Отстроил домик, который постоянно сносили криперы, кое-как пережидал ночи, пока не обнаружил овец неподалёку на материке (для крафта кровати). Количество смертей шло на десятки...

Потом кое-как освоился, разработал сеть штреков, обнаружил пару каньонов. И стало мне тесновато на острове, решил посмотреть мир. Почитал про карты и пошёл по континенту, поплыл по морям-океанам. Повесил на стене составную карту мира, где флагами отмечал деревни. Много проблем было с вымиранием жителей в деревнях после их открытия. А деревни мне нравилось отстраивать, чтобы там куча жителей была, станков и живности. Стало проблематично учитывать, в какой деревне какие ресурсы, животные, где какие станки поставил, какие забыл. Начал на бумажке записывать. А, ещё давал деревням названия, правда, не сразу. И координаты стал записывать - ещё позже. Когда бумажек стало две и на них кроме точно обозначенных было с десяток анонимных деревень, я сказал "хватит это терпеть" и засел за конфигуратор.

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

  • Наименование
  • Координаты
  • Принадлежность к карте
  • Список станков
  • Список ресурсов
  • Список животных
  • Доп.реквизиты
  • Присоединяемые файлы

Конфигурация разработана на базе БСП 3.0.2 и включает в себя следующие подсистемы (не все, но что вспомню):

  • БазоваяФункциональность
  • Администрирование
  • ЗаметкиПользователя
  • Свойства
  • ВариантыОтчетов
  • Печать
  • ПодключаемыеКоманды
  • РаботаСФайлами

Хватит слов, сдёрнем уже покровы с шедевра:

Обращу внимание на принадлежность деревень картам. Карты идентифицируются по своему номеру и координатам. Это координаты от верхнего-левого угла составной карты мира. Зачем нужны координаты? Допустим, позвал нас дух приключений вверх (или влево) открывать новые миры. Присоединяем новые карты и что получается? Все номера остальных карт сдвинулись. Ну, тут или уходить в минусовые координаты относительно некоего центра, либо сделать функцию сдвига номеров всех карт вправо или вниз. Я выбрал второй вариант. Правда, я его ещё не реализовал. Ждите в следующих версиях.

Также, имеется отчёт с корректным расположением карт и списком деревень на них:

Проект выгодный и сулит массу дивидендов (нет), поэтому предлагаю всем неравнодушным присоединяться к нему на безвозмездной основе.

 
 Минутка серьёзности

Эта шутливая конфигурация распространяется без ограничений. Она может быть интересна учебным заведениям для демонстрации работы с БСП и применения механизмов платформы в понятной для детей/подростков форме (я надеюсь). После майского апдейта это пособие дополнилось целым спектром объектов и функций по работе с двоичными данными.
Высказывайте свои пожелания, я попробую их реализовать или готов смержить с вашими модификациями этой конфигурации.
Раздел "Администрирование" я не вычищал, там несколько битых ссылок на отсутствующую функциональность. Это поправлю в следующих версиях.

 

 
 Апдейт от 24.03.2020
 
 Апдейт от 26.03.2020
 
 Апдейт от 09.05.2020

Это будет эпичный рассказ!
У карт прошлого релиза было всего несколько реквизитов - код  и координаты на карте мира. Я задумался: наверняка карта, при открытии её в игре, не собирается по точкам по цвету чанков, а где-то хранится картинкой. Полез по папкам - нашёл в сетевой игре папку world\data и в ней кучу файлов с названиями вроде map_N.dat . Открыл - вроде бред внутри. Полез искать по интернетам "формат карт minecraft". Узнал, что карты хранятся в упакованном GZip виде. Изучил возможности платформы - на deflate они останавливались как лет 5 назад, так и до сих пор ситуация не улучшилась. Полез по публикациям Инфостарта, нашёл довольно древнюю публикацию, которую, внезапно оказалось, я уже скачивал когда-то. Скачал ещё раз, попробовал тестовой обработкой распаковать один из файлов - получил какие-то данные. Сохранил данные в файл и принялся рассматривать его HEX-редактором. Там встречались осмысленные строки - это были названия деревень (я в каждой деревне ставлю именованный флаг). Нашёл описание формата файла - NBT. Нашёл даже NBT Explorer, который натравил на карту и увидел дерево её данных.

Про потоки в 1С я уже давно в теме, поэтому засел писать парсер. Разгадка формата не давала заснуть раньше пяти утра. Я получил иерархическую структуру содержимого файла и сделал функцию загрузки данных из файлов. У карт появилась увесистая пачка реквизитов, включая мир, координаты центра, масштаб и много прочего.

В процессе разработки удалось значительно расширить свои знания по возможностям платформы в области чтения данных, потоков и различных преобразований с двоичными данными. Выяснилось, что ЧтениеДанных не имеет возможности считывания знаковых (signed) чисел, а только беззнаковых (unsigned), однако это решилось небольшой хитростью с вычитанием старшего бита (см.код). Вдобавок, оказалось, представление платформы 1С об UTF разительно отличается от принятого стандартом RFC 3629: она читает даже алфавитные символы английского алфавита по два байта (с кодировкой), хотя по стандарту они идут по одному байту. В результате считывание строк из потока с помощью ЧтениеДанных.ПрочитатьСимволы() приводило к считыванию лишних байтов в тех случаях, когда строка содержала символы разных кодировок (eng+rus). Решил данную проблему созданием отдельного потока ограниченной длины и скармливал его этому же методу - всё равно больше положенного уже не прочитает.

Итак, после преодоления всех препон я получил данные по картам в справочнике "Карты". Оставался какой-то тег colors объёмом ровно 16Кб. Надо отметить, что к тому времени я ещё не обнаружил на просторах интернета описание формата карт Майнкрафт. Если бы оное событие произошло пораньше, эта история была бы намного короче. Я получил содержимое тега и сразу заподозрил неладное: значения байтов были ограничены, явно из какого-то набора. Я зашёл в игру, заскринил карту, вырезал её в редакторе, посчитал количество точек: 128х128. Перемножение даёт как раз 16Кб. Я обратил внимание, что точки карты с одинаковым цветом примерно совпадали с байтами с одинаковыми значениями. Значит, точно существует некая таблица цветов! Тут уже я начал искать именно "таблицу цветов карт Майнкрафт" и нашёл её на том же сайте.

Возиться с алгоритмами упаковки графических форматов я не хотел и сразу зацепился за формат BMP - со школы известно, он без сжатия. Обнаружил описание формата - вариант с таблицей цветов (8 или 16 бит на пиксель) мне как раз подходил, попытался создать заголовок. В процессе осенило, что все изображения карт будут 128х128 и таблица цветов у них будет одинаковая. Создал произвольное изображение указанного размера, сохранил, проверил соответствие формату и отрезал от него заголовок. Для создания таблицы цветов сделал обработку, идентичную примеру на Java. Единственное, в примере используется таблица цветов старой версии, надо перебить с сайта актуальную. Записал бинарник таблицы цветов. Склеил в 1С с заголовком BMP и полученный бинарник сохранил в макет. Осталось только объединять это с данными тега colors...

Изображение очень напоминало оригинальное, но всё же отличалось гаммой и рельефом. Первое решилось, когда вспомнил про big-endian и переставил байты в таблице цветов с RGB на GRB. А вот с ландшафтом пришлось подумать. В формате BMP подразумевается массив байтов сверху-слева и далее построчно. В описании формата карт же говорится, что там идут строки снизу вверх. Получается, мне данные картинки нужно разрезать на части по 128 байт и склеить от последней к первой. Разработчики очень порадовали методом ЧтениеДанных.РазделитьНаЧастиПо(), который в одну строку делал операцию разделения. Склеил полученные части, соединил с заголовком и таблицей цветов - вуаля! Оставалось только немного разобраться с программным интерфейсом подсистемы присоединённых файлов БСП и функция загрузки данных карт пополнилась и загрузкой изображения карты.

Теперь мне не нравилась реализация загрузки: я создавал таблицу значений, куда закидывал прочитанные данные с указанием уровня вложенности. Это было некрасиво, т.к. приходилось вставлять куски кода адаптации под загрузку конкретно карт. Механизм становился не универсальным. Выходит, мне нужна сущность, которая бы хранила данные в объектном виде. Выбор сразу пал на XDTO. Сделал отдельный пакет, сделал в нём объект map с детальным описанием всех реквизитов. Оставалось только сделать механизм по его заполнению. Взял за основу предыдущую реализацию: заполнял в процедуре реквизиты объекта, вызывал её рекурсивно в случае чтения объекта, а когда встречал список, вызывал отдельную процедуру загрузки списка. Таким образом я на входе передаю тип объекта XDTO, который мне надо заполнить, и ЧтениеДанных, а на выходе получаю заполненный объект XDTO, из которого удобно производить заполнение сущностей 1С.

Для пытливых умов оставил в справочнике "Карты" две формы - первая была менее приспособлена к заполнению из неё объектов 1С, поэтому актуальной является вторая.

Теперь в планах сделать карту мира из присоединённых файлов карт.

*Маленькая хитрость: карты сокровищ тоже можно загружать, а это значит, что станут известны координаты центра - точки, где лежит сокровище.

 

Скачать файлы

Наименование Файл Версия Размер
Майнкрафт:

.cf 11,28Mb
23.03.20
45
.cf 11,28Mb 45 Скачать бесплатно

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. DoctorRoza 24.03.20 09:57 Сейчас в теме
"Мсье знает толк в извращениях!" ))
Chiponk; ssfedkin; user865537; Drivingblind; user660224_laa; bykov.vsl; Yashazz; anosin; for_sale; RailMen; narutouzumaki_13; sogesti; Il; Vyacheslide; +14 Ответить
4. FreeArcher 98 25.03.20 08:28 Сейчас в теме
(1) собственно к создателю майнкрафта тоже можно было применить такую фразу, когда он сидел после работы и извращался. А в итоге как выстрелило.

Автору плюс за креативность.

И вопрос, а распространяется база с уже внесенными данными, или они индивидуальны в каждом мире?
Думаю показать сыну.
6. PLAstic 257 25.03.20 09:12 Сейчас в теме
(4) Они уникальны для каждого мира. Кстати, отсюда приходят на ум сразу две новые идеи:
1) Я могу выложить свою конфу как демо-базу, потому что сид моего мира всё равно никто не знает.
2) Можно ввести такую сущность как мир в конфигурацию для тех, у кого больше одного сервера.
12. s_vidyakin 63 25.03.20 12:55 Сейчас в теме
(4) поизвращался тот швед и потом не знал куда девать падающие на него миллионы долларов ) В итоге Microsoft выкупила права за 2.5 миллиарда
2. Vyacheslide 9 24.03.20 13:23 Сейчас в теме
Просто +. Прикольный подход к "делу". Идея ничего так )))
3. kab_krk 24.03.20 14:28 Сейчас в теме
Ну не плохо, осталось настроить API и в путь, потом партировать платформу 1С в Maincraft и начать работать в виртуальном мире. :)
user865537; narutouzumaki_13; Il; +3 Ответить
5. Fril 25.03.20 09:12 Сейчас в теме
(3) Зачем самому? Надо чтобы нпс\персонажи\боты за тебя код\программы писали. Зашел в игру взял программу и в реальный мир вынес, продал за бешенные деньги... Как в фильме "13 этаж" ...
7. CyberCerber 621 25.03.20 10:53 Сейчас в теме
Скажите, а зачем делали на базе БСП? По описанию конфы, там все очень просто, ничего не надо. Просто для саморазвития? Какие функции из нее используете?
8. PLAstic 257 25.03.20 10:58 Сейчас в теме
(7) Для мня намного проще сделать конфу на БСП, чем писать самому доп.реквизиты, фотки (присоединённые файлы) объектов, заметки.
А что использую, так я в тексте указал подсистемы.
9. CyberCerber 621 25.03.20 11:01 Сейчас в теме
(8) Наверное, правильный подход. Но у меня наоборот: намного проще самому все это сделать и до конца понимать, нежели заниматься объединением с БСП
10. Yashazz 3409 25.03.20 12:30 Сейчас в теме
(8) Ага, ага. Натащить кучу ненужного, неиспользуемого, ресурсоёмкого, громоздкого барахла вместо того, чтобы чуток напрячься и сделать простой, быстрый и лёгкий механизм. Характерная примета нынешнего подхода к разработке. Точнее, "разработке". А потом все удивляются, чего оно глючит, тормозит, и допиливать любую мелочь полгода надо.
user865537; Synoecium; +2 4 Ответить
11. PLAstic 257 25.03.20 12:32 Сейчас в теме
(10) Персонально тебе предлагаю не пустозвонить, как в других темах, а предложить что-нибудь по теме, чтобы убедиться, что оно "глючит, тормозит и допиливать полгода надо".
jaroslav.h; Neuroproton; Kolobash95; +3 Ответить
13. Yashazz 3409 25.03.20 13:05 Сейчас в теме
(11) Если "по теме" это про всякие компьютерные игрульки, то я этим детсадом не увлекаюсь, время жалко, и перерос давно.

А если про БСП, то навскидку: получение сведений о клиенте через веб-сервис 1С, по ИНН. В БСП несколько модулей, куча процедур, вызов проходит через 20-30 разных блоков, некоторые ещё и с повторами (сначала "проверка возможности связи", потом "проверка связи", потом сама связь), прокси пересоздаётся, ws-определение пересоздаётся, и только в конце, погребённый этой грудой, вызов метода веб-сервиса. А потом ещё не менее адский разбор результата.
Притом, что пишется для 90% случаев это всё в 1-2 листинга за 10 минут.
14. Louxer 25.03.20 14:49 Сейчас в теме
Автору +

Делал похожее для EVE с помощью открытого API. Напилил отчет по динамике цен в торговых хабах, маршрут (в виде графика) прыжков по системам с указанием безопасности систем, список покупок, обработку для слежения за своими ордерами. Жаль недавно переустановил винду и забыл сохранить cf.

Спасибо, за мотивацию вернуться в еву...
user865537; PLAstic; +2 Ответить
15. sertak 246 09.04.20 13:05 Сейчас в теме
Я человек простой, вижу прикольную штуку на любимой платформе - ставлю плюс. А Майнкрафт дочка на планшете показывала, да. Там вроде домики можно строить и есть лошади. Плюс, короче ).
16. herfis 372 09.04.20 13:10 Сейчас в теме
Оставьте свое сообщение

См. также

Внешняя компонента для сжатия/распаковки файлов, двоичных данных и строк по алгоритму Zlib, Deflate и GZip

Разработка внешних компонент v8 v8::УФ 1cv8.cf Абонемент ($m)

Внешняя компонента для сжатия/распаковки файлов, двоичных данных и строк по алгоритму Zlib, Deflate и GZip.

1 стартмани

15.03.2016    31755    129    frkbvfnjh    102