11 Commits

Author SHA1 Message Date
sasheg dev 4392533cd0 План: уточнил, откуда иконки предметов 2026-10-22 10:36:05 +03:00
sasheg dev a1b3fb0868 План: интерфейс в стиле ремейка 2026-10-22 10:34:12 +03:00
sasheg dev d2a0a7a93b Вход без пароля, права админа и F3+B
Аутентификация переделана по схеме пользователя: лаунчер — единственный
источник токена, сервер проверяет его сам и лаунчера не спрашивает.

- rsx-auth/GameToken: токен это base64url(payload) + "." + base64url(HMAC-SHA256),
  payload {uuid, nick, aud, exp, jti, typ}, typ = session или reload.
- Сессия живёт час, reload-токен полтора часа и только внутри игры. Пакет
  SessionReload продлевает сессию и выдаёт новый reload-токен.
- Сервер проверяет подпись, аудиенс, срок и совпадение uuid. HTTP-запрос к
  лаунчеру из сервера убран.
- Клиент: окно пароля убрано совсем, ник берётся из токена, клиент сам
  продлевает сессию за 5 минут до конца.
- Для локальной разработки сервер с --dev-token пишет свой токен в
  world/dev-token.txt, клиент берёт токен оттуда.
- Права админа: свой список world/admins.txt, перечитывается раз в 5 секунд,
  поэтому право снимается на лету. Пакет AdminState.
- Ванильные блоки мира ломает только админ, режим игры прав не даёт.
- F3+B только для админов: без прав показываем отказ, с правом включаются и
  ванильные хитбоксы, и наш отладочный рендер. Права сняли посреди просмотра —
  гаснут сразу.
- run-game.ps1 умеет -Token.

Проверено на живом сервере: own session ok, player in, rights of Player given.
Тесты: протокол 34, сервер 88, форк собирается чисто.
2026-10-22 08:51:27 +03:00
sasheg dev 7505ddd84e Броня в семи местах и три зоны урона
- В реестр заведены 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 классов.
2026-10-21 22:43:52 +03:00
sasheg dev a6587d55ce Полу-кастомный игрок и каталог объектов ремейка
Игрок:
- 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 (декомпил).
2026-10-21 21:02:46 +03:00
sasheg dev c472bd4a8c Огнестрел: таблица стволов с вики и границы реверса
- 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 (поиск маркера и слов дешифратора).

План дополнен этими находками.
2026-10-21 20:17:55 +03:00
sasheg dev cda7198c76 Модель предметов по базе ремейка: узлы, деревья, знание
Протокол:
- ItemData читает таблицу items/items.csv (218 предметов ремейка) и отдает
  числа: урон, дальность, темп, прочность, сколько ресурса за удар.
- ItemType: поля rid, researchScrap, techTreeBench, techTreeScrap,
  techTreeParent, admin. Урон по частям тела делится как в ремейке: голова
  вдвое, руки и ноги четыре пятых. Число в исходнике главнее таблицы.
- ItemRegistry: 218 предметов с рецептами, ценой исследования и веткой
  дерева. Новые вещи: salvage-тесак, бронедвери, гаражи, взрывчатка,
  компоненты, еда, мусор, верстаки и печи.
- NodeType: узлы с запасом (дерево 500/750/1000, камень 750, металл 500,
  сера 200) и меткой: крестик на дереве до двух, горячая точка на руде до
  трех.
- TechTree: ветки верстаков с предками, 125/250/500 скрапа.
- Новые пакеты: Dig, BreakProgress, CraftStart, CraftUpdate, ResearchStart,
  ResearchUpdate, TechTreeUnlock, KnownRecipes, TechTreeState, ContainerOpen,
  ContainerTake, LearnBlueprint.

Сервер:
- Knowledge: что игрок знает - рецепты и открытые узлы деревьев.
- Crafter: проверка рецепта, уровня верстака и ингредиентов; время крафта
  по формуле плана.
- ResearchTable: предмет плюс скрап, десять секунд, предмет превращается в
  чертёж; чертёж изучается и открывает рецепт.
- ResourceNode: запас, метка, последний удар отдает остаток.
- JunkPile: две-четыре бочки (серая - скрап и мусор, синяя - компонент,
  красная - нефть и топливо) и ящик с едой; пустая мусорка исчезает через
  60-180 секунд.
- RoadNetwork: сетка дорог и кольцо, точки спавна мусорки; генератор кладет
  асфальт и ровняет дорогу по ширине.
- Проверка досягаемости вынесена из changeBlock, игрок получил benchLevel.
- Сессия отвечает на новые пакеты, при входе шлет известные рецепты и
  открытые узлы.

Тесты: протокол 24 + 10, сервер 74 (было 57). Форк собирается чисто.
2026-10-21 19:54:22 +03:00
sasheg dev 27047e8071 База из ремейка: ассеты, предметы, звуки и правки плана
Выгрузили из ремейка 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, деревья - пока блоки мира.
2026-10-21 19:31:51 +03:00
sasheg dev 56f0341373 PLAN: данные оригинала пересобраны под срез 11.2025
Файл на VPS пересобрал глубже, чем был: он сошёлся с официальной викой
Facepunch на дату 06.11.2025 и с логикой самой игры, а не с вики 2018-2020,
из которой брались прошлые числа.

Что изменилось по существу:

- Сбор ресурсов пересчитан. Узел - это запас (750 камней, 500 металла,
  200 серы), а удар снимает часть: камнем 10 дерева или 5 руды, киркой 16
  руды. Отсюда 47-75 ударов на узел, а не "2 удара" из старой вики.
- Появился "Gather Rates" по официальной вике: Gather Damage, Bonus,
  Condition Loss по каждой паре "инструмент - ресурс", плюс боевая статистика
  (урон, голова x2, темп, дальность) и таблица брони.
- Скрап и чертежи: цена 15/30/60/120 по редкости (не 20/75/125/500 по
  уровню), верстак 1 больше не требует скрапа, тех-дерево верстака и
  эксперимент на верстаке - механика 2017-2020, убрана.
- Сокеты построек расписаны конкретно: малый проём (Doorway) - одиночная
  дверь и торговый автомат, большой (Wall Frame) - двойные двери, гаражные
  ворота, сетка-фенси, ворота и стена клетки, витрины; окно - решётки,
  стёкла, ставни, бойницы; рамка пола - решётка, люки.
- Добавлены разбор по пунктам, что было неверно и почему, и сверка данных
  (суммы цен исследования, тех-дерева, уровней верстаков, ударов) - сведено.

Поправлено: G:\decompiled-rustex - НЕ источник фактов, он копировал
community-вику 2017-2020. Именно оттуда пришли неверные числа.

Решения по проекту сохранены, открытые вопросы разделены на решённые и те,
что блокируют реализацию.
2026-10-21 17:28:26 +03:00
sasheg dev 077269b9c9 PLAN: таблицы инструментов, верстаков, скрапа и сокетов постройки 2026-10-20 23:01:36 +03:00
sasheg dev 1861aaa408 PLAN: данные оригинала, решения и план работ 2026-10-20 22:58:21 +03:00