чат лог майнкрафт где
Делаем лог-систему для Minecraft
Сегодня речь пойдет о мире, о который большинство из вас не знает, но при этом там крутятся многие отличные инженеры-разработчики и большие деньги. Да, как ни странно, речь пойдет о Minecraft.
Minecraft — игра-песочница и на мультиплеер-серверах остро стоит проблема гриферства (от англ. griefing — вредительство), когда игроки рушат чужие постройки. На серверах с этой проблемой справляются по-разному. На публичных используют плагин на ‘приват’, на остальных же все строится на доверии.
Еще один из способов предотвратить гриферство — бан всех гриферов. И для того чтобы вычислить их, приходиться логгировать установку и удаление блоков. Собственно, о процессе создания такой лог-системы и пойдет речь дальше.
Выбор базы данных
Итак, вот у нас массив данных и хорошо бы его куда-то сохранять. Умные люди давно придумали БД. Лично у меня требования к БД были такие:
Последний пункт появился из-за того, что не на всех хостингах есть возможность получить root-доступ или установить какой-либо пакет. К тому же, не хотелось усложнять процедуру установки, а остановиться на «Кинул и забыл».
Базы данных, которые удовлетворяли бы всем критериям я не нашел, поэтому решил сделать свою мини-БД на Java.
Оптимизация места на жёстком диске
Основная проблема игры, как считают многие, — все её вычисления происходят в одном потоке. Это настоящая боль держателей серверов. Распараллелить изначально однопоточную архитектуру — надо постараться.
Поэтому само логгирование пришлось вынести в отдельный поток. А чтобы система не захлебнулась от Event’ов в очереди, добавить поддержку воркеров. Количество воркеров настраеваемое.
В итоге получилось так, что само событие перехватывается в главном тике, потом отправляется в поток, который занят тем, что распределяет задачи между воркерами. Там мы получаем файл, в который надо занести наше событие и передаем уже воркеру, который прикреплен к этому файлу. И сама операция IO происходит в воркере.
Оптимизация места на жёстком диске
Большое количество событий может привести к тому, что логи будут весить больше, чем сам мир. Этого нам допустить нельзя, поэтому будем думать.
Изначально строчка в логфайле выглядела так:
[2001-07-04T12:08:56.235-0700]Player PLACE to 128,128,128
При беглом взгляде можно заметить, что 2001-07-04T12:08:56.235-0700 можно сократить до Timestamp, а PLACE или REMOVE на символ ‘+’ и ‘-‘ соответственно. Ну и уберем нафиг ‘to’:
Не сложно заметить, что в логе будет часто повторятся nickname и blockid. Соответсвенно, их можно вынести в отдельный файл, а в лог писать только id
[123454678]1 + 1 128,128,128
В итоге я пришел к тому, что в строчке лога остались только числа и один символ. Мы сэкономим много места, если уберем разделители (пробелы) и числа будем записывать как байты, а не как символы. Сообственно, это привело меня к решению использовать байтовые логи.
Сама байтовая строка теперь выглядит так:
Name | posX | posY | posZ | typeaction | playerid | blockid | timestamp |
---|---|---|---|---|---|---|---|
Field Length (bytes) | 4 byte | 4 byte | 4 byte | 1 byte (‘0’ for Remove, ‘1’ for Insert) | 4 byte | 8 byte | 8 byte |
Итого мы имеем 35 байтов на строку фиксированно (1 байт для разделения строк).
Вначале был соблазн оставить 34 байта, но так как запись ведется в один файл, то в случае с фиксированной длинной, если побьется одна строка, весь файл станет нечитаемым.
Структура строки для blockname to id:
Name | id | blockname |
---|---|---|
Field Length (bytes) | 8 byte | 1 byte per symbols |
21 байтов на блок
Имя файла: blockmap.bytelog
Структура строки для nickname to id:
Name | id | nickname |
---|---|---|
Field Length (bytes) | 4 byte | 1 byte per symbols |
10 байтов на игрока
Имя файла: nickmap.bytelog
Оптимизация памяти
Чтобы быстро маппить blockname и nickname в id пришлось держать содержимое обоих файлов в памяти. Java не может в HashMap хранить примитивные типы, поэтому каждый Integer будет стоить нам
50 байт в памяти, что очень много.
Решить эту проблему нам поможет библиотека trove.
Но каждый символ у нас занимает примерно 2 байта. Мы можем снизить потребления памяти с помощью самописного файла ASCIString, в котором символы хранятся в byte[], а не в char[].
Тестирование
В тестировании байтовой сериализации и десериализации ничего необычного нет, а вот для тестирования компонентов, к которым требовался многопоточный доступ пришлось использовать фреймворк от гугла Thread Weaver. Обычный тест с использованием этого фреймворка выглядит так:
Фреймворк стучит из обоих потоков с разным порядком, что позволяет выловить самые противные баги в асинхронном коде.
Заключение
Пока по количеству скачиваний будет понятно стоит ли развивать дальше этот мод и идею. Из примерных планов на будущее:
Данный плагин упростит уход за вашим сервером. С его помощью, вы сможете узнать, кто и когда поставил, разрушил тот или иной блок, откатить действия игроков и многое другое. Проще говоря, он позволит просматривать логи и возвращать состояние блоков, территории, или всего вашего сервера к нужному вам промежутку времени.
Он не требует настроек, сразу же после установки его можно использовать.
Нажатие ЛКМ по верхней части блока, выведет информацию в чат, о том, кем и когда был разрушен блок, который находился над данным. Установив любой блок, вы узнаете информацию о всех блоках, находившиеся ранее на этих координатах.
П ри нажатии ПКМ на любое устройство (кнопка, рычаг, дверь и т.п.) вы узнаете ник игрока, последний использовавший его. Повторный ввод команды /co inspect заканчивает работу с данным плагином.
Команда для отката изменения блоков: /co rollback u: t: b: e: r:
— u: ник игрока, относительно действий которого, произойдет откат
— b: блок, при указании ID откат затронет только эти блоки
— e: исключение, при указании ID, блок останется нетронутым
— r: радиус, относительно вашего положения, в котором произойдет откат
Другие команды плагина :
/co lookup u: t: b: e: r: — просмотр логов по параметрам
/co purge — очистить информацию о блоках за один или несколько месяцев.
Чат на серверах Майнкрафт
Чат на серверах Майнкрафт используется по двум причинам:
Эта статья поможет разобраться, чем отличается команда от сообщения, как писать в чат и как выполнять команды через чат на Майнкрафт сервере.
Как открыть чат в Майнкрафт?
Чат и на сервере и в одиночной игре открывается при помощи клавиши T на клавиатуре, (в одиночной игре чат для общения использовать не придется, только для прописывания команд). И не имеет значения, дело происходит на стационарном компьютере или на ноутбуке.
Если игроку нужно ввести команду в чате, то можно сразу использовать клавишу / (слэш) на клавиатуре, тогда не придется перед командой вводить слеш.
Как отправить сообщение в чат?
Для отправки сообщения в чат на Майнкрафт сервере необходимо:
После отправки сообщения в чат его уже нельзя будет отредактировать или удалить, оно запишется у всех игроков в логах клиента, а также сохранится и в логах на сервере.
Как выполнить команду?
Аналогично сообщению, только перед командой ставится слеш (например: /home ).
Как отключить чат на сервере?
Иногда общение других игроков на сервере может мешать и отвлекать от игрового процесса, для этого на некоторых Майнкрафт серверах предусмотрена специальная команда (везде она разная) для отключения возможности видеть как все сообщения разом, так и сообщения отдельных игроков.
Бывают ли Майнкрафт сервера с голосовым чатом?
Сервера Майнкрафт с голосовым чатом встречаются, но не очень часто, так как технология общения в реальном времени через игровой клиент Майнкрафт требует как дополнительных серверных мощностей, так и наличия собственного игрового лаунчера.
Зачастую для общения голосом используются различные сервисы для голосового общения, такие как Discord или Teamspeak.