- StatusSession: ответ на ванильный статус на том же порту.
Первый байт потока различает наш протокол и гостей: R - наш кадр,
иначе старый пинг (FE) или новый handshake + request + ping.
Логин в старом стиле получает вежливый отказ словами.
- Reader: первый байт, уже прочитанный вручную, теперь правильно
исключается из головы - раньше счётчик дважды пропускал его.
- TokenAuth: точные причины отказа (не подписано, другой сервер,
не тот вид, истёк, не тот игрок) и Verdict для каждой сессии.
- ClientSession: первое чтение смотрит на байт и отдаёт гостей статусу;
остальное идёт через прежнее расщепление.
- StatusTest: 5 проверок (json, modern, pong, legacy, отказ). Легаси-пинг
читался как знаковый байт; исправлено на беззнаковый.
- StatusRouteTest: 3 проверки через настоящий сервер и настоящие порты.
- watch-game.ps1: удаляет устаревший dev-token перед стартом сервера.
- В реестр заведены 46 предметов одежды ремейка: слот, слой, какие части тела
закрывает и сколько снимает из каждого вида вреда. Данные выгружены в items.csv
(extract-items.py), в коде у каждого предмета armor(...).
- Семь мест: голова, лицо, грудь (2 слоя), ноги (2 слоя), руки, стопы, полный
костюм. Пояс не делали - в ремейке его нет, есть только быстрая панель.
- Inventory сервера: семь мест по два слоя, вещи надеваются и снимаются.
- Damage: зона урона по точке попадания (голова верхние 0.4, ноги нижние 0.4),
множители голова 2, тело 1, ноги 0.75; одежда снимает вред только там, где
закрывает.
- Пакет Attack (цель, точка попадания, рука) и клиентский патч, который его
шлёт. У игрока появилась жизнь.
- В items.csv добавлены колонки armor_slot, armor_layer, armor_zones.
Тесты: протокол 24 + 10, сервер 85. Форк собирается чисто, 3279 классов.
Игрок:
- RsxPlayer extends EntityPlayerSP: наш игрок с нашими числами движения.
- RsxMovementInput extends MovementInputFromOptions: отменяет ванильный
множитель подкрадывания 0.3 и ставит наш.
- RsxPlayerTuning: подкрадывание 1.5 блока/с (было ~1.3), прыжок 1.35 блока
(было 1.25). Прыжок считается по высоте: v = 0.42 * sqrt(h / 1.25) = 0.43713.
Правило пользователя: значение меньше заданного не принимается, остаётся 1.5.
Переопределяется из командной строки: -Drsx.sneakSpeed, -Drsx.jumpHeight.
- Мобы прыгают как в ванилле: переопределение в RsxPlayer, а не в
EntityLivingBase.
- Три строки патчей в ванильное дерево: PlayerControllerMP создаёт RsxPlayer,
Minecraft создаёт RsxMovementInput. Вся логика в нашем коде.
- Форк собирается чисто, 3278 классов.
Каталог:
- tools/catalog-remake.py собирает assets/rustex/CATALOG.md и catalog.json.
- Что нашли у ремейка: 218 предметов (46 одежды, 44 ресурса, 33 оружия, 31
медицина, 21 инструмент, 17 построек, 11 боеприпасов, 11 разных, 4 ловушки),
91 объект nextgen (бочки, ящики, двери, верстаки, печи, руда, модели
монументов), 553 модели .obj (384 оружия с перезарядкой, 128 деталей постройки,
36 мебели, 4 руды), 133 иконки предметов, 2004 звука, текстуры монументов и
животных, скины игрока (9 файлов 256x256 плюс 9 с моргающими глазами) в
assets/rustex/player/.
- Скины игрока - текстуры ремейка, модель тела ванильная.
Декомпил ремейка лежит на диске: G:\src-decoded (5207 файлов, строки
расшифрованы). Поведение клиента можно читать, а не угадывать: конфиг оружия с
отдачей, схема viewmodel, формат данных. Значения же приходят с сервера, в
клиенте только схема и значения по умолчанию.
План дополнен разделами 2.8 (игрок) и 2.9 (декомпил).
- weapons.csv: 23 ствола с уроном, множителем в голову, темпом, магазином,
перезарядкой, разбросом (конус прицела), отдачей, типом патрона, верстаком и
ценами исследования. Источники - официальная вики и community-вики, расхождения
помечены в колонке source. Не хватает цены (2 из 23) и дальности (18 из 23).
Границы реверса ремейка, чтобы не тратить на них время снова:
- классы в game.jar помечены DE AD C0 DE и зашифрованы своим форматом, не
однобайтовым XOR как ассеты; единственный незашифрованный класс - точка входа
net/minecraft/client/main/RustexMain, в ней видны два статических дешифратора
строк (qnbt.super и vyuhke.super), а сами классы зашифрованы;
- REA не берет .class как цель (только архивы), Ghidra 12.1.4 стоит в
D:\ghidra-tools и через analyzeHeadless импортирует распакованные классы;
- главное: урона, отдачи и спрея огнестрела в клиенте нет вообще, это серверные
данные. Клиент знает только магазин, тип патрона, зум ADS, прочность и reach.
REA даст формулы, а не числа, поэтому числа берём с вики.
Инструменты в tools/: inspect-constants.py (разбор constant pool класса) и
find-decryptor.py (поиск маркера и слов дешифратора).
План дополнен этими находками.
Выгрузили из ремейка Rustex всё, на чём будем работать, и переписали план
под реальные цифры.
Ассеты:
- tools/extract-rustex-assets.py распаковывает res/ и game.jar и декодирует
однобайтовый XOR (ключ по сигнатуре: PNG ^0x89, OGG ^0x4F, JSON ^0x7B).
Итог: assets/rustex, 1.65 ГБ, 19 тыс. файлов. В репозиторий не кладём.
- Не прочитались 553 .obj, 106 .rrs, 113 .nbt: у них другой шифр, нужен
разбор кода (REA).
Таблицы (в репозитории):
- items.csv: 218 предметов с уроном, дальностью, темпом, прочностью, добычей
за удар, материалом, иконкой и моделью;
- sounds.csv: 505 звуковых событий с файлами;
- item-texts.json: 543 названия и описания предметов.
План (PLAN.md):
- Сбор теперь по балансу ремейка: камень берёт 50 дерева и 35 руды, топор 85
дерева, каменная кирка 80 руды. Дерево 750 топором рубится за 9 ударов, с
меткой за 6-7 - ровно те 7-10 ударов, которых ждали.
- Исследования - версия после 2020: два пути. Стол (15/30/60/120, нужен сам
предмет, превращается в чертёж) и тех-дерево верстака (125/250/500, ветки с
предками, разблокировка личная). Утверждение "тех-дерево бесплатно" было
ошибкой community-вики.
- Лозы больше нет: она из джунглей, а джунглей нет. Выкинута из HP-таблицы,
цен, таймеров гниения и правил шкафа.
- Новые разделы 1.10 (мусорка на дороге: серая бочка - скрап, синяя -
компоненты, красная - нефть и топливо, плюс ящики с едой) и 1.11 (дороги:
сетка 3-4 полос плюс кольцо, сегменты - точки спавна мусорки).
- Первый источник скрапа - мусорка, лутбоксы отложены: вопрос о прогрессии
крафта снят.
- Узлы: руда - своя 3D-модель с AABB, деревья - пока блоки мира.