# RustNotMC — данные оригинала, решения и план работ Файл для перечитывания: после сброса контекста, при передаче работы другому агенту или при возврате к проекту через месяц. Здесь лежит всё, что нужно знать, чтобы продолжить, не выясняя заново. Порядок работы: сначала этот файл, потом код. --- ## 0. Где мы сейчас | модуль | что в нём | состояние | |---|---|---| | `rsx-protocol` | формат провода: кадрирование, буфер, рукопожатие, игровые пакеты | рабочий, 22 теста | | `rsx-auth` | свои аккаунты сервера (PBKDF2, токены, троттлинг) | рабочий, используется только когда лаунчер не настроен | | `rsx-server-core` | тик-луп, мир (чанки, генерация, сохранение), сессии, вход через лаунчер | рабочий, 49 тестов | | `rsx-client` | загрузчик модов, API модов, хуки в клиент | рабочий, 128 тестов | | `game-fork` | форк Minecraft 1.12.2: свой сетевой слой, свой экран входа, свой HUD | собирается чисто, 3275 классов | Уже работает целиком: клиент заходит на сервер по токену лаунчера → сервер спрашивает лаунчер «этот ваш?» → клиент получает мир → чанки приходят и рисуются → игрок ходит и ломает блоки. Не сделано: предметы, инвентарь, крафт, верстаки, изучение чертежей, узлы-ресурсы (деревья/камни/руда как разрушаемые объекты), постройка баз, нормальная генерация мира, транспорт на NIO, дальний вид (DistantView). --- ## 1. Данные оригинала (Rust) Источники: вики Rust (rust.fandom.com), локальный референс `G:\decompiled-rustex` (Rust-клон на MC 1.8, обфусцирован), Paper API (jd.papermc.io). ### 1.1 Камень (Rock) — стартовый предмет > «the most basic resource gathering and fighting tool» — инструмент сбора и оружие. - Выдаётся **первым предметом в тулбаре** при спавне. Крафтится из 10 камня. - Прочность **ограниченная**, предмет изнашивается. - Собирает дерево и камень; ломает бочки; бьёт постройки. - **Урон по постройкам:** лоза (twig) — **9**, дерево/камень — **0.2**, металл — **0.1**, бронированные — **0.1**. То есть обычным камнем постройку не сносят. Таблица сбора (сколько снимает один удар, сколько нужно ударов, сколько урона): | ресурс | доля прочности за удар | ударов до разрушения | урон за удар | |---|---|---|---| | дерево | 0.3 | 2 | 10 | | руда | 0.3 | 2 | 5 | | животное | 0.0 | 2 | 10 | ### 1.2 Верстак (Workbench) — 3 уровня - Разворачиваемый **предмет**: надо **стоять рядом**, чтобы крафтить. - Открывает **тех-дерево**: рецепты своего уровня **и ниже**. - Уровень выше → время крафта короче: **−50%** на один уровень выше, максимум **−75%** на два уровня выше. - Рецепты, открытые верстаком, **нельзя передать** другому игроку (в отличие от чертежей со стола исследований). Стоимость и время изготовления: | уровень | ingredients | время | где крафтится | |---|---|---|---| | 1 | 500 дерева, 100 металла, 50 скрапа | 60 с | — | | 2 | 500 металла, 20 ХМ, 500 скрапа | 60 с | верстак 1 | | 3 | 1000 металла, 100 ХМ, 1250 скрапа | 60 с | верстак 2 | Что открывает каждый уровень (выборочно, полный список — в вики): - **L1:** постройки (пол, решётка, ворота, сетка-фенси, гаражные ворота, мешки с песком, бойницы, ставни, лестница, окна, калитка), предметы (торговый автомат, верстак для ремонта, кровать, лампа, стул, холодильник, мишень, **стол исследований**, **верстак 2**), ресурсы (порох), одежда (футболка, штаны, лонгслив, шахтёрская каска, куртка, рубашка, каска, ведро, резиновая каска), **инструменты: Salvaged Hammer, Hatchet, Pick Axe** (топор, кирка), оружие (пистолеты, револьвер, лом, гвоздомёт, дробовик, пистолет-пулемёт, M16, огнемёт, F1, гранната, мачете, глушитель, фонарь, прицел, коллиматор, 8-кратник), патроны (пистолетная, высокоскоростная стрела), ловушки (капкан, огнемёт, мина). - **L2:** бетонный баррикад, клетка, водосборник, металл-баррикад, люк; предметы (большая печь, дроп-бокс, шкаф, нефтезаводка, прожектор, **верстак 3**); одежда (тяжёлая броня); инструменты (Salvaged Axe, Salvaged Icepick); оружие (пистолет-пулемёт Python, огнемёт, дробовик, Thompson, тесак, дульный тормоз, глушитель, длинный меч), патроны (5.56, 12 калибра), ловушки (автотурель). - **L3:** каменные врата, бронированные двери, укреплённые окна; **взрывчатка**; тяжёлая броня; оружие (штурмовая винтовка, bolt action, rocket launcher, MP5A4); боеприпасы; детали (шестерни, труба, маслёнка, пружина, набор для шитья). ### 1.3 Стол исследований (Research Table) и чертежи (Blueprints) - «to create Blueprints by using Scrap and the item to make the blueprint of, **which means one has to find the desired item first**». - Процедура: кладёшь **один** нужный предмет в верхний слот → показывается требуемый скрап (в нижний слот) → кнопка «Research» → **10 секунд** → в верхнем слоте появляется **чертёж**, **предмет уничтожается**. - Прочность предмета на результат не влияет (если предмет не сломан — иначе не работает). - Исследование **продолжается**, если закрыть интерфейс стола. Звук слышно рядом. - Скрап: 20 / 75 / 125 / 500 по тирам предмета. - Сам стол: **200 металла + 20 скрапа**, крафтится **на верстаке 1**, 60 с. - Столы есть на **монументах** (аэродром, электростанция, спутниковая тарелка, супермаркет, аванпост) — то есть это вещь, за которой надо **сходить**. - **Эксперимент на верстаке:** ломаешь 75 / 300 / 1000 скрапа → получаешь **случайный ещё неизвестный** чертёж уровня этого верстака. Отличие от стола: случайный результат. ### 1.4 Скрап (Scrap) - Выпадает при разрушении **постройек** игроков, а не из ресурсных узлов. - Тратится на исследование и на крафт верстаков. ### 1.5 Постройка баз (Rust) **Как ставится.** Строительный план (Building Plan, 20 дерева) — **разворачиваемый предмет**: кладёшь в хотбар, выбираешь, видишь «призрак» объекта; **ПКМ + движение мышью** перебирает варианты объекта, **ЛКМ** ставит. **Два слоя объектов:** - **Строительные** (то, из чего база): фундамент (квадратный/треугольный), пол (квадратный/ треугольный), стена, полустена, низкая стена, **дверной проём**, окно, настенная рамка, рамка пола, лестница, крыша, столб. - **Внутренние** (то, что внутри): двери, верстаки, печи, сундуки, торговый автомат, шкаф, инструментальный шкаф, замки. **Ставятся свободно, не по сетке мира.** Снаппятся **внутренние** к уже поставленным строительным: стены — к **краю фундамента**, полы — к **верхней кромке стены**, двери — **внутрь дверного проёма**. Правило из вики дословно: «To place walls, select them and aim at the edge of a foundation. Floors must be placed at the top edge of a wall, and doors must be placed inside door frames.» **Проёмы двух видов:** - **малый** (дверной проём) — влезает **только одиночная** дверь; - **большой** — влезают **двойные двери и гаражные**, но **не одиночные**. **Уровни (tiers) и прочность:** | уровень | прочность | как получить | цена (пример) | |---|---|---|---| | Twig (лоза) | **10** | только строительным планом, напрямую | дерево: фундамент 50, стена 50, проём 35, окно 35, пол 25, рамка 25, лестница 50, крыша 50 | | Wood (дерево) | **250** | **улучшение** из лозы молотком | дерево ×4 | | Stone (камень) | **500** | улучшение молотком | камень | | Sheet Metal (лист) | — | улучшение молотком | металл (вдвое дешевле камня, но нужна переплавка) | | Armored (броня) | **2000** | улучшение молотком | High Quality Metal | Двери: деревянная 200 HP, листовая 250 HP, бронедверь 800 HP. Понизить уровень нельзя. **Куда можно строить:** почти везде; крутые склоны и неровная земля мешают, фундамент ставят и под водой. **Прочность конструкции (stability):** у постройки есть запас прочности; если он упал в ноль — объект ломается сразу при установке. Столбы ставят **до** стен, под столбом должен быть фундамент, и на втором этаже столбы должны быть и снизу. **Инструментальный шкаф (Tool Cupboard):** разблокирует постройку **в радиусе 50 м** от любого фундамента базы, в которой он стоит. «Twig floors can be built, regardless of the building privileges» — лозу строить можно всегда, улучшать — нельзя. **Замки:** ключевой (дерево) и кодовый (100 металла, 4 цифры). Ставятся на двери, на контейнеры (сундуки, торговый автомат) и на инструментальный шкаф. **Гниение (decay):** лоза и дерево теряют здоровье через несколько часов и разваливаются, камень/металл/броня — через дни. Открытие/закрытие двери с замком сбрасывает таймер гниения. ### 1.6 Инструменты: сбор, урон, износ У каждой пары «инструмент × класс ресурса» — три числа: **сколько прочности узла снимает удар**, **какую долю узла разрушает удар** и **сколько урона наносит**. | инструмент | ресурс | прочности за удар | доля разрушения | урон | |---|---|---|---|---| | **Камень** (rock) | дерево | 0.3 | 0.5 | 10 | | **Камень** | руда | 0.3 | 0.5 | 5 | | **Камень** | животное | 0 | 0.5 | 10 | | **Каменный топор** | дерево | ×2 от камня | ~0.33 | 10 | | **Каменная кирка** | руда | 0.3 | **0.15** | 16 | | **Каменная кирка** | дерево | 5.0 | 0.334 | 5 | | **Каменная кирка** | животное | 1.0 | 0.2 | 10 | Отсюда: камень рубит дерево **за 2 удара**, кирка копает руду **за ~7 ударов**, кирка рубит дерево **за 3 удара**. Топор «собирает вдвое больше камня, но бьёт чуть медленнее металлического топора». **Урон по постройкам** (по уровням постройки: лоза → дерево → камень → металл → броня): | инструмент | лоза | дерево | камень | металл | броня | |---|---|---|---|---|---| | Камень | **9** | 0.2 | 0.2 | 0.1 | 0.1 | | Каменный топор | 3.0 | 2.1 | 0.3 | 0.15 | 0.15 | | Каменная кирка | 3.4 | 1.14 | 0.64 | 0.27 | 0.27 | **Прочность (износ) инструмента:** у камня ограниченная, предмет изнашивается и ломается. Урон по частям тела (голова/грудь/руки/ноги): камень 20/10/8/8, каменный топор 27/15/12/12, каменная кирка 35/17/13/13. Дальность: камень 1.25, топор и кирка 1.5. ### 1.7 Таблица: предмет → верстак → скрап **`bench`** — уровень верстака, который открывает рецепт: 0 = крафтится сразу, 1 = нужен верстак 1, 2 = верстак 2, 3 = верстак 3. | предмет | bench | крафт | время | скрап на чертёж | |---|---|---|---|---| | Камень (rock) | 0 | 10 камня | 5 с | — (не исследуется) | | Каменный топор | 0 | 200 дерева + 100 камня | 30 с | 75 (hatchet) | | Каменная кирка | 0 | 200 дерева + 100 камня | 30 с | 125 (icepick) | | Строительный план | 0 | 20 дерева | — | 20 | | Верстак 1 | 0 | 500 дерева + 100 металла + 50 скрапа | 60 с | — | | Верстак 2 | 1 | 500 металла + 20 ХМ + 500 скрапа | 60 с | — | | Верстак 3 | 2 | 1000 металла + 100 ХМ + 1250 скрапа | 60 с | — | | Стол исследований | 1 | 200 металла + 20 скрапа | 60 с | — | | Salvaged Hammer | 1 | — | — | 75 | | Salvaged Hatchet | 1 | — | — | 75 | | Salvaged Pick Axe | 1 | — | — | 125 | | Salvaged Sword | 1 | — | — | 20 | | Salvaged Axe | 2 | — | — | 125 | | Salvaged Icepick | 2 | — | — | 125 | | Timed Explosive Charge | 3 | — | — | 500 | **Скрап на чертёж** по тирам предмета: **20 / 75 / 125 / 500**. Полные списки предметов с их скрапом — в вики (страница Research Table); исключения, которые важно помнить: - **высокоскоростная стрела — 0 скрапа** (единственная с нулём); - **Укреплённое стекло — 50** (между 20 и 75); - постройки: лоза/дерево/бетон/шторы/бойницы/малый водосбор — 20; гаражные ворота, колючая баррикада, большой водосбор, решётка пола, полка, кровать, дроп-бокс, шкаф — 75; сетка-фенси, ворота клетки, стена клетки, окна, калитка, лестница, люк, двойная дверь листа — 125; бронедверь, бронедвойная дверь, каменные врата — 500. **Ресурсы** (дерево, камень, металл, ХМ, сера, скрап) — не крафтятся, а собираются; у них рецепта нет вовсе. ### 1.8 Строительные объекты и сокеты **Объекты** (одинаковый набор на каждый уровень): квадратный фундамент, треугольный фундамент, лестница на фундаменте, квадратный пол, треугольный пол, стена, полустена, низкая стена, **малый дверной проём**, **большой проём**, окно, настенная рамка, рамка пола, лестница, крыша, столб. **Куда что снаппится** (это и есть «сокеты»): | объект | сокеты | |---|---| | Фундамент | 4 стороны → стена; верх → пол; низ → подвал/фундамент | | Стена | верх → пол или рамка пола; **проём под дверь**; сторона → соседняя стена | | Пол | верх → внутренние блоки (сундук, верстак, печь, шкаф); низ → потолок | | Крыша / потолок | **проём под дверь** (в потолке — для выхода наверх) | | Малый проём | только **одиночная** дверь | | Большой проём | **двойные двери** и **гаражные**; одиночные — нельзя | **Свободное размещение:** строительные объекты ставятся **как угодно**, без привязки к сетке мира; привязка есть только у внутренних блоков — к уже поставленным строительным. --- ## 2. Решения по проекту ### 2.1 Кто такой админ **Админ — свойство конкретного сервера, а не проекта.** Проект коммьюнити-френдли: в разных серверах разные роли и разные права. Роль приходит из лаунчера (у лаунчера есть `server/roles.py` и роли `ROLE_USER / ROLE_PASS_HOLDER / ROLE_MODERATOR / ROLE_ELDER / ROLE_CREATOR`). ### 2.2 Кто что может ставить и ломать Правило на **блоке/предмете** (тег `admin`): | тег `admin` | кто может ставить/ломать/менять | |---|---| | **нет** | **кто угодно**, включая обычных игроков | | **есть** | **только админы сервера** | - Тег `admin` есть, например, у «тестблока» и у всего, что не добавлено в крафт/изучение/дроп. - **Режим креатива не даёт прав.** Даже игрок в креативе без админки не может поставить или сломать блок с тегом `admin`. - Проверка — **на сервере**. Клиент только показывает или не показывает курсор. ### 2.3 Ванильные блоки игры Мир (карта, монолиты, рельеф) — **не ломается и не строится обычными игроками**: это работа админов. Игроки строят **нашими кастомными** предметами через наш API. ### 2.4 Предметы - Все предметы игрока — **кастомные, через наш код и наше API** (не ванильные `ItemStack`). - У предмета: **прочность**, **урон**, **значение bench**. - `bench = 0` — крафтится сразу. - `bench = 1` — **изначально недоступен для крафта**, его надо **изучить на верстаке** (или получить чертёж через стол исследований). - У предмета есть **класс инструмента** (NONE / PICKAXE / AXE / SWORD / …) и **класс ресурса**, который он добывает. ### 2.5 Крафт - Как в Rust: **верстаки трёх уровней** (разворачиваемый предмет, надо стоять рядом), **чертежи** (стол исследований: нужен найденный предмет + скрап), **эксперименты на верстаке** (случайный чертёж за скрап). - Знание рецепта — **состояние игрока**, а не свойство предмета. - Время крафта, множитель от уровня верстака, стоимость скрапа — как в Rust. ### 2.6 Структуры вместо блоков мира Руда, деревья и камни — **не блоки мира, а разрушаемые объекты** (как узлы в Rust): у них есть прочность, они бьются инструментом и дают дроп. Мир меняют только админы. ### 2.7 Текстуры - Текстуры предметов пока **временные**, взяты из ремейка как заглушки. - **Пометка: заменить на свои** (см. п. 6). --- ## 3. Архитектура ### 3.1 Модули | модуль | про что | лицензия | |---|---|---| | `rsx-client` | загрузчик модов, API модов, хуки в клиент | MIT | | `rsx-protocol` | формат провода, общий словарь (блоки, формат чанка) | MIT | | `rsx-plugin-api` | **API серверного контента**: события, реестр предметов, рецепты, роли | MIT (пустой, следующий) | | `rsx-server-core` | тик-луп, мир, сущности, масштабирование | proprietary | | `rsx-auth` | свои аккаунты сервера (когда лаунчер не настроен) | proprietary | ### 3.2 Провод - Кадр: `magic "RSX1"`, версия, id пакета, длина, тело. - Рукопожатие: `Hello → HelloAck → Auth|LauncherAuth → AuthAck → Login → LoginAck`. - **Вход через лаунчер:** клиент отдаёт токен лаунчера, сервер спрашивает лаунчер `POST /auth/validate` (у лаунчера такой эндпоинт есть, он же проверяет бан) → если «свой» — выдаёт свой игровой токен. - Игровая фаза: `JoinWorld → WorldJoin`, `ChunkData`, `BlockChange`, `PlayerMove`, `EntitySpawn/Move/Remove`, `BreakProgress`, `SetGameMode`, `Inventory`, `Ping/Pong`. ### 3.3 Мир - Чанк 16×16×256, **палитра по секциям** (4 бита на блок) — плоский массив не годится: 62 500 чанков × 64 КБ = 4 ГБ. - Лежат **регионами на диске** (32×32 чанка в файле), в памяти — LRU-кэш. - Генерация — чистая функция от зерна и координат (детерминизм обязателен: чанк может прийти через месяц после соседнего). - Сгенерированный чанк **не пишется на диск**: террейн восстанавливается генератором. На диск уходит только то, во что построили. ### 3.4 Что взято из Paper/Bukkit (как образец) | у Paper | зачем нам | у нас | |---|---|---| | `BlockBreakEvent` (cancellable, `setDropItems`) | сервер решает, ломается ли блок и что падает | `BreakEvent`: `cancelled`, `drops` | | `BlockPlaceEvent`, `PlayerInteractEvent` | кто что нажал | `InteractEvent` (левая/правая), `PlaceEvent` | | `ItemMeta` + `PersistentDataContainer` | свои данные на предмете | `ItemStack` + `ItemData` (ключ→значение) | | `PlayerInventory` / `InventoryClickEvent` | инвентарь, хотбар, защита от дюпа | свой `Inventory` + проверки на сервере | | `Permissible` / роли | «мир только для админов» | роли сервера, тег `admin` у блоков | | `ShapedRecipe` / `ShapelessRecipe` | рецепты | свой реестр **с гейтом по чертежу и верстаку** (в Paper такого нет) | Чего у Paper нет, а нужно нам: гейт крафта по изученности, прочность/урон/сбор по классам ресурсов, **структуры вместо блоков мира**. --- ## 4. План работ Каждый шаг — законченный кусок, который можно проверить. Порядок важен. ### Шаг A. Фундамент предметов и инвентаря (следующий) - [ ] `ItemType`: id, имя, класс инструмента, класс ресурса, прочность, урон по частям тела, скорость сбора, `bench`, рецепт. - [ ] `ItemStack`: тип + количество + прочность + `ItemData` (свой ключ→значение). - [ ] `Inventory`: слоты, хотбар, что в руках. **Сервер — источник истины.** - [ ] Реестр предметов + протокол `Inventory` / `InventorySlot`. - [ ] Клиент: свой реестр + свои текстуры + свой рендер предмета в руке и в слоте (наши предметы не ванильные `IItem`). - [ ] **Текстуры предметов — временные** (взяты из ремейка как заглушки). **ПОМЕТКА: заменить на свои.** - [ ] Стартовый набор: **камень** (как в Rust — выдаётся первым). Критерий готовности: игрок заходит, получает камень в руку, видит его в хотбаре и в руке; сервер знает, что у него в руках. ### Шаг B. Ломание и установка — решает сервер - [ ] Протокол: `Dig` (START/STOP, позиция, грань) **вместо** «клиент присылает результат»; `BreakProgress` (0..9) — трещины у всех. - [ ] Сервер: состояние ломания по образцу `PlayerInteractionManager` (`PlayerInteractionManager.java:79 updateBlockRemoving`, `:124 onBlockClicked`, `:216 tryHarvestBlock`): прогресс по твёрдости блока и скорости инструмента, рассылка прогресса, досягаемость, роль/тег `admin`. - [ ] Правило из ваниллы: **меч в креативе блок не ломает** (`PlayerInteractionManager.java:217`). - [ ] **Клиент ничего не решает:** 4 патча (`Minecraft.clickMouse` → свой `Dig`, `Minecraft.sendClickBlockToController` → состояние кнопки, `PlayerControllerMP.clickBlock` → клиент не ломает сам, `EntityRenderer.isDrawBlockOutline` → контур только там, где можно). Критерий готовности: зажатая кнопка ломает **один** блок; блок с тегом `admin` обычному игроку не ломается ни в выживании, ни в креативе; у остальных — ломается инструментом того класса, который нужен. ### Шаг C. Структуры, узлы, постройка - [ ] `StructureTemplate` (блоки + AABB + меш + HP + дроп), `StructureInstance`, `StructureWorld`. Деревья/камни/руда — **узлы**, не блоки мира. - [ ] Сбор: попадание инструментом → урон по классу ресурса → разрушение → дроп. - [ ] Постройка: игрок ставит **наши** кастомные предметы-конструкции (не блоки мира). Снаппинг — см. п. 1.5. - [ ] Растительность и руда в генерации — через шаблоны структур. ### Шаг D. Мир один раз, конфиг, барьер - [ ] Конфиг: `world.size` (сторона карты в блоках), `world.gamemode`, `world.seed`, `world.generate`, `barrier.distance`. - [ ] Мир генерится один раз и отдаётся; изменения игроков — отдельным слоем. - [ ] Барьер: сервер не пускает; клиент рисует (прозрачность → 0.5 у границы, блендинг с блоком под игроком в ±5 блоках, дальше размытие в невидимую стену). ### Шаг E. Транспорт на NIO (независим, можно раньше) - [ ] `Selector` + неблокирующие `SocketChannel`, `ClientSession` → конечный автомат, блокирующие места (HTTP к лаунчеру) — в пул потоков. - [ ] Проверка: 49 существующих тестов идут по сокету и должны пройти без правок; + 100 одновременных соединений. ### Шаг F. DistantView - [ ] Сервер шлёт LOD (высоты + цвет) по регионам; клиент кэширует **архивом** и досылает недостающее. - [ ] Рендер: квадродерево, **Hi-Z отсечение** (пирамида глубины), `uCamOffset` (float не хватает на ±2000), зажим UV по мипам, свой шейдер GLSL 330. --- ## 5. Открытые вопросы 1. **Роли приходят из лаунчера или живут на сервере?** Лаунчер знает роли (`ROLE_USER … ROLE_CREATOR`), но сервер может держать свои. 2. **Эксперимент на верстаке делаем?** (случайный чертёж за скрап) — в Rust есть. 3. **Урон по частям тела** (голова/грудь/руки/ноги) — сразу или один общий урон? --- ## 6. Как продолжить (для VPS и для другого агента) ### 6.1 Сборка и проверка ```powershell rsx-protocol\scripts\build.ps1 # и test.ps1 (22 проверки) rsx-server-core\scripts\build.ps1 # и test.ps1 (49 проверок) rsx-client\scripts\build.ps1 # и test.ps1 (128 проверок) game-fork\scripts\prepare-game.ps1 # пересобрать форк из ванильного jar (медленно) game-fork\scripts\compile-game.ps1 # только компиляция форка (быстро) ``` **Порядок важен:** `rsx-protocol` → потом `rsx-server-core` (он компилируется против `rsx-protocol\build\classes`) → потом `rsx-client` → потом форк. Форк компилируется против `rsx-client\dist\rsx-loader.jar` и `rsx-protocol\dist\rsx-protocol.jar` — если меняли протокол, пересобери его **до** форка, иначе форк соберётся против старого jar. ### 6.2 Запуск ```powershell rsx-server-core\scripts\run-server.ps1 -Port 25565 rsx-client\scripts\run-game.ps1 # клиент ``` Клиент для проверки: `--server 127.0.0.1 --port 25565` плюс токен лаунчера (`--accessToken`, `--uuid`, `--username`). ### 6.3 Что не сделано (по порядку) 1. **Шаг A** — предметы, инвентарь, реестр, протокол инвентаря, рендер предмета в руке и в слоте, стартовый камень. 2. **Шаг B** — `Dig`/`BreakProgress` в протоколе, состояние ломания на сервере, правила инструмента, тег `admin`, 4 клиентских патча. 3. **Шаг C** — структуры (узлы), сбор, постройка по сокетам. 4. **Шаг D** — конфиг, мир 4000×4000 один раз, барьер. 5. **Шаг E** — транспорт на NIO. 6. **Шаг F** — DistantView. ### 6.4 Мелочи, которые легко упустить - **Текстуры предметов — временные** (взяты из ремейка как заглушки). **ПОМЕТКА: заменить на свои.** Ассеты ремейка обфусцированы: каждый файл **XOR-ится одним байтом**, ключ = `файл[0] ^ 0x89` (у `rock.png` это 0x20). Декод: `key = b[0] ^ 0x89; for (i) b[i] ^= key;` - Пути: `G:\RustNotMC` (репозиторий), `G:\decompiled-rustex` (референс, только читать), `G:\rustexremake` (исходники ремейка с ассетами). - Скрипты — **ASCII без BOM** (PS 5.1 читает без BOM в ANSI и ломает парсер). - В PowerShell **нет heredoc**: сообщения коммитов пишем в файл и `git commit -F`. - Класс-паттерн SSH: `git config core.sshCommand "ssh -i C:/Users/User/.ssh/id_ed25519_zernmc -o IdentitiesOnly=yes"`. - Коммиты по-русски, комментарии в коде — по-английски. - Тесты: `scripts\test.ps1` у каждого модуля, всё на голом JDK, без фреймворков. ### 6.5 Дописать в этот файл - [ ] Полные таблицы предмет→верстак и предмет→скрап (из вики; основное уже в п. 1.7). - [ ] Таблица сбора по всем классам ресурсов (часть в п. 1.6). - [ ] Список строительных объектов с сокетами (основное в п. 1.8). - [ ] Что решили по ролям: из лаунчера или свои на сервере (вопрос в п. 5). - [ ] Стоимость и время каждого рецепта, который будем реализовывать.