Сервер браузерной Lineage 2 на Node.js: как ужать мир в 17 байт и выдержать "5000" онлайна
Документация
Все знают, что делать MMORPG в одиночку — верный способ сойти с ума, и прослыть дибилом. Это честный девлог о том, как мой сервер чуть не захлебнулся от JSON, почему толпа на спавне сломала сетку мира и как ужать расчеты в 17 байт на игрока.
Проблема №1: Клиент — это враг
В обычной игре клиенту можно доверить базовые вещи: например, расчет анимации или координаты. В браузере доверия нет вообще. Ноль. Любой игрок может открыть DevTools (F12), написать в консоли player.speed = 99999 или отправить поддельный пакет «я убил босса». Поэтому сервер спроектирован по принципу Zero-Trust (нулевое доверие): Клиент не знает своих координат. Он отправляет только намерение: «Я зажал клавишу W, хочу бежать вперед». Сервер сам считает скорость, проверяет геодату рельефа, смотрит, нет ли перед носом стены, делает шаг и подтверждает точку. Урон, заточка, выпадение дропа, радиус каста клиент вообще не имеет к этому доступа. И всё это сервер должен рассчитывать 10 раз в секунду для каждого моба и игрока.
Проблема №2: Смерть от мусора и 42 мегабайта в секунду
Первый сетевой протокол ИИ написал на старом добром JSON. Сервер слал клиенту строчки с ID, координатами X/Y и жизнями. Красиво и удобно. Ровно до первого стресс-теста на 2 000 игроков и 1 500 мобов.Когда каждый видит вокруг хотя бы 30–40 соседей, сервер генерирует под 50 000 обновлений в секунду.И тут начался кошмар:1. Трафик: 42.5 МБ в секунду! Нужен гигабитный канал ради сотни тестеров.2. Мусор в памяти: Создание сотен тысяч временных JSON-строк мгновенно забивало оперативку. Сборщик мусора Node.js врубал экстренную очистку (Stop-the-World).3. Весь мир замирал на 200–300 мс каждые пару секунд. Мобы телепортировались, удары не проходили.Спасение: диета до 17 байтМы выбросили JSON из симуляции навсегда. Вместо текста упаковали всю информацию об игроке или мобе в 17 сырых бинарных байт:— 2 байта на ID;— по 2 байта на координаты X, Y, Z (квантование до сантиметра);— 1 байт на угол поворота;— 2 байта на процент жизней;— 2 байта на маску состояний (бежит, атакует, кастует, мертв).Итог: сетевой трафик рухнул с 42.5 МБ/с до 2.2 МБ/с при "5 000" онлайна. Падение в 19 раз! Сервер вздохнул свободно, а мир перестал заикаться.
Проблема №3: Проклятие Городской Площади
Чтобы сервер не проверял расстояние между каждым игроком и каждым мобом, мир нарезается на сетку — Spatial Grid с клетками по 108 метров. Ты опрашиваешь только свою клетку и 8 соседних. В поле это работает идеально.А потом зашли живые игроки. Они толпой пришли на центральную площадь: торговать, орать в чат и собирать группы.В одну несчастную клетку набилось 400 человек. И вся оптимизация мгновенно выродилась обратно в жуткие тормоза: сервер снова начал считать расстояние каждого ко всем.Как решили:Написали адаптивное дробление. Как только в клетке собирается больше 100 сущностей, она прямо на лету делится на 16 мелких зон по 27 метров. Игроки в толпе получают обновления только о тех, кто рядом, а дальние персонажи обновляются реже. Сервер даже не заметил нагрузки.
Проблема №4: «Проклятие одной монетки»
Еще одна ошибка новичка — писать данные в базу при каждом чихе игрока. Моб умер -> упала шестеренка -> игрок подобрал -> пишем в базу. Когда тысячи игроков месят мобов, диск захлебывается за секунды. Игра виснет.Решение: игра живет только в оперативной памяти.База данных вообще не знает, что вы бегаете по острову. Сервер просто ставит флаг «персонаж изменен». Раз в 15 секунд фоновый процесс пачкой сбрасывает всех изменившихся игроков в базу за один быстрый запрос. Никаких лагов и никаких откатов инвентаря при рестарте.
Миллиард токенов и 320 часов марафона: сколько стоит разработка с ИИ
Пишу этот проект один вместе с Gemini 3.8 Flash )) Когда люди слышат «делает игру с нейросетью», они представляют кнопку «сделай шедевр». В реальности это был 29-дневный марафон по 11–12 часов в день. Сложнейшие сессии отладки длились по 40 шагов, где на каждом шаге в модель скармливался контекст по 150 000 – 180 000 токенов: монолит сервера на 5 300 строк, таблицы боевой математики, геодата и сырые дампы сетевых пакетов.
442 миллиона токенов только на серверную часть
суммарно весь проект (Three.js клиент и сервер) сожрал 1.265 МИЛЛИАРДА токенов!
Сколько это стоило в деньгах?
Aelvorne Chronicles - Дневник Разработчика #2
Привет, Пикабу.
Продолжаю разработку своей браузерной текстовой MMORPG Aelvorne Chronicles
Добавилось 2 новых класса - Обвинитель (Accuser) для темных эльфов и Менестрель (Minstrel) для светлых
У всех классов стало как минимум 10 перков (пассивных свойств или навыков) для изучения - есть чем заняться вплоть до 45 уровня. В будущем планирую довести их количество последовательно до 12, 15, 18 и 20 - появится вариативность прокачки, т.к. не на все перки хватит очков даже на максимальном уровне и со всеми бонусными очками с квестов
Переделана механика AoE умений, в первую очередь касается класса Чародей (Sorcerer) - применение умений по нескольким целям стало проще и более контролируемо
Глобальная карта пополнилась 3 новыми локациями: Кратер, Зачарованная долина и Равнины Буйволов, каждая со своими особенностями в поведении монстров: некоторые монстры теперь перемещаются между локациями большими и маленькими группами, добавились социальные монстры, у некоторых монстров появились активные навыки развеивания усилений (Cancel) или случайной телепортации за пределы локации :)
Добавился арт для локаций и NPC
Бонусом баланс и фиксы
Делаю MMORPG с помощью нейросетей: 2.5D-мир, террейн и восстание машин
Продолжаю делиться разработкой своей браузерной RPG. Проект обрастает контентом, и сейчас я перешел к созданию визуала и к наполнению мира.
Как собирается мир
Террейн острова: Сначала нейросеть сгенерировала общие очертания карты. Затем я загрузил её в Blender и вручную вылепил весь террейн с помощью скульптинга, формируя холмы, равнины и береговую зону под игровой процесс.



Смесь 3D и 2D: Окружение в игре трехмерное, а вот монстры и NPC — плоские 2D-спрайты. Это экономит огромное количество полигонов и снимает избыточную нагрузку на рендер в браузере, создавая ретро-стилистику.



Генерация контента: Весь контент делаю в нейросетях, tripo, gemine, nano banana и т.д
Что уже работает:
Разметка карты: Остров поделен на сектора с мобами с 1 по 20 уровень.
Инвентарь: Оружие можно брать в руки, менять и убирать обратно. Слоты под броню готовы, параллельно чинятся мелкие интерфейсные баги.
3. Скиллы: Внедрил первый паровой удар, сейчас довожу до ума применение умений по противникам.



Базы данных: Полностью готовы таблицы по характеристикам экипировки, параметрам мобов, луту и вероятностям дропа.
Боссы: Поставил первого крупного босса зоны и заложил механику скрытых энкаунтеров с редкими плюшками.
Пишите в комментариях, как вам идея мобов и визуальное решение с 2D-спрайтами в трехмерном мире.
Небольшая коллекция фигурок по Lineage 2, Overlord и Black Lagoon
Собираю давно, но потихоньку.В основном собираю по старой игре Lineage 2. Много в неё играл в своё время как на фришках так и на оффе.
Плюс собираю overlord, black lagoon, по бензопиле и так по мелочи.
А игр консолей предпочитаю ps2 и Нинтендо свич 2.
Такая моя коллекция)
Пост в ВК Коллекционеры видеоигр
👆 Публикуй свою коллекцию! Подключайся к сообществу и хвастай, чем новым пополнился ;)
Aelvorne Chronicles - Дневник Разработчика #1
Привет, Пикабу.
Продолжаю разработку своей браузерной текстовой MMORPG Aelvorne Chronicles
Ряд классов пополнился новым классом "Старейшина" / "Elder" (раса: эльф) - классический целитель, имеющий в наборе лечение, контроль, восполнение маны и специализированное умение на урон по нежити и демонам (соответствующие особенности монстров также добавлены и отображаются в игре)
Добавлена новая локация "Каменный Сад Чудовищ" и соответствующий ей квест "Осколки Тьмы" на добычу нового материала для крафта с 43 уровня
Добавлен квест "Охота за медом" с 28 уровня на скоростной фарм (с таймером) монстров в локации "Ульи", с шансом получить свитки мастерства (для улучшения умений) и экипировку вплоть до редкой
Закончена замена старого страшного арта для всех монстров
бонусом баланс некоторых умений, оптимизация и фиксы
В работе расширение карты мира еще 4 локациями с новыми механиками и очередной класс, теперь для тёмных эльфов.
Ошибка 302
Ошибка 302
А годы-тихая вода-
Точили камень,гасли свечи.
Вот дрогнул чат в последний раз,
Умолкло эхо старой брани,
И чей-то профиль в поздний час
Погас,не попрощавшись с нами.
Древнейший воин не зайдёт,
Уже десятый год в молчании
Его герой напрасно ждёт
У входа,в вечном ожидании
Но там,в глубинах серверов,
Где код сплетается в тумане,
Стоят герои,как во сне,
В двоичном цифровом капкане.
Они не ведают про старость,
Им снится вечный,зыбкий сон:
Кого-то ждёт былая ярость,
Кого-то дом,что не спасён.
Их очи сомкнуты навеки,
И руки замерли в броне,
Как будто спят при лунном свете
Все те, кто дорог был и мне.
Там босс в пещере,век сырой,
Один скучает в тёмном зале,
Его не вызовут на бой,
Герои биться перестали.
Но близок час,рубильник вниз
Опустит жёсткая рука,
И этот призрачный круиз
Прервётся раз и навсегда.
Погаснет пиксельный рассвет,
Растает замок в облаках,
И то,что жило много лет,
Останется лишь в дневниках.
Спасибо всем за этот путь,
Прощай,братишка,Буду ждать...
Секунды тают,не вернуть,
Миры готовы угасать
Мигнет экран,и пустота.
Исчезнет код,замрет поток.
Строка-Ошибка 302.
Последний выдох и итог.


























