блин ооо это же тыы тот самый
|
|
| Местоимения: | они/их |
| Семейное положение: | Всё сложно |
| Дата регистрации: | 13 января 2023 в 18:36 |
| Родной город: | Ревашоль |
| Полит. взгляды: | Коммунистические |
| День рождения: | 30 января 0006, 2019 лет |
| Интересы: | Служба в РГМ |
| Любимая музыка: | Говорят, что я любил диско |
| Любимые книги: | Краткое описание инфраматериализма |
| О себе: | Лейтенант, дважды Ефрейтор |
|
Идея создания Minecraft Classic сервера на Bash с GNU-утилитами, без использования какого либо языка программирования:
Сервер для классических версий, так просто меньше заморочек. Есть главная проблема: Bash не умеет работать с null-байтами в строках, они обрезают данные. Поэтому вся архитектура будет строиться вокруг непрерывной конвертации бинарного трафика в текст (hex) и обратно. Следующие утилиты пригодятся: Использование socat или xinetd для прослушивания порта 25565. При каждом входящем подключении socat запускает отдельный экземпляр bash-скрипта, пробрасывая сокет клиента в стандартные потоки stdin и stdout скрипта. Сырые байты из stdin немедленно пайпятся в "xxd -p", превращаясь в сплошную hex-строку (0x0...), которую bash может безопасно читать и сохранять в переменные. В самом скрипте формируется ответный пакет как текстовую hex-строку, прогоняет её через "xxd -r -p" для обратной конвертации в сырые байты и пишет в stdout (т.е. прямо в сокет клиента). Так как в классических версиях сервера пакеты имеют строгую длину, входящий hex-поток нарезается с помощью текстовых утилит cut, "head -c" или awk (чтение определенных символов строки). ID пакета (первые два hex-символа) передается в конструкцию скрипта "case ... esac", которая вызывает соответствующую функцию в bash (рукопожатие, авторизация, установка блока, движение). Мир будет хранится в "/dev/shm" (tmpfs), для повышения скрости. При старте/завершении работы мир загружать/выгружать. Сам мир будет небольшим, плоским, один слой какого-то блока. Запись будет в текстовом файле или через ассоциативные массивы bash, где блоки записаны в виде символов. При первом старте сервера утилита yes (да, тупо спамит какими-то символам) генерирует простой файл нужного размера. При входе игрока сервер не собирает чанки динамически, а просто читает файл плоского мира (через утилиту cat), оборачивает в заголовки пакетов и отправляет клиенту. Серверу также нужна многопоточность. Внутри обработчика клиента запускается фоновый процесс ("while true; do ... sleep 0.05; done &"), имитирующий 20 TPS. Изменения, как упоминал, пишутся в "/dev/shm", чтобы другие фоновые процессы могли их прочитать. Фоновый цикл регулярно формирует hex-пакет Keep-Alive и отправляет его через xxd, чтобы клиент не отвалился по таймауту. Показать больше |