# RustNotMC — данные оригинала, решения и план работ Файл для перечитывания: после сброса контекста, при передаче работы другому агенту или при возврате к проекту через месяц. Здесь лежит всё, что нужно знать, чтобы продолжить, не выясняя заново. Порядок работы: сначала этот файл, потом код. --- ## 0. Где мы сейчас | модуль | что в нём | состояние | |---|---|---| | `rsx-protocol` | формат провода: кадрирование, буфер, рукопожатие, игровые пакеты | рабочий, 24 теста | | `rsx-auth` | свои аккаунты сервера (PBKDF2, токены, троттлинг) | рабочий, используется только когда лаунчер не настроен | | `rsx-server-core` | тик-луп, мир (чанки, генерация, сохранение), сессии, вход через лаунчер, инвентарь | рабочий, 57 тестов | | `rsx-client` | загрузчик модов, API модов, хуки в клиент | рабочий, 128 тестов | | `game-fork` | форк Minecraft 1.12.2: свой сетевой слой, свой экран входа, свой HUD | собирается чисто, 3275 классов | | `tools` | извлечение ассетов ремейка: `extract-rustex-assets.py`, `extract-items.py`, `extract-sounds.py` | рабочий, ассеты выгружены (1.65 ГБ) | | `assets/rustex` | ассеты ремейка: модели, текстуры, звуки, иконки, база предметов, карты | выгружено, **временная база** | Уже работает целиком: клиент заходит на сервер по токену лаунчера → сервер спрашивает лаунчер «этот ваш?» → клиент получает мир → чанки приходят и рисуются → игрок ходит и ломает блоки → сервер выдаёт камень в руку (инвентарь есть). Не сделано: клиентский рендер своих предметов, крафт, верстаки, исследование (стол + тех-дерево), узлы-ресурсы (деревья/камни/руда как разрушаемые объекты), мусорка и дороги, постройка баз, нормальная генерация мира, транспорт на NIO, дальний вид (DistantView). **Данные оригинала** — раздел 1: срез Rust на **06.11.2025** («Pivot Or Die»). Упрощения проекта поверх оригинала: **без автоматизации** (Industrial Crafter), **без биомов и джунглей** (значит, без лозы), **стартовые предметы не исследуются**. **Баланс берём из ремейка**, а не из вики (п. 1.1) — там есть все 218 предметов с характеристиками. Все числа раздела 1 помечены: ✅ подтверждено · 🟡 косвенно · ❌ не подтверждено. --- ## 1. Данные оригинала (Rust) — срез на 06.11.2025 **Какая версия игры.** Rust на **6 ноября 2025** — обновление **«Pivot Or Die»** (06 Nov 2025). Это уже после: - **«Tech Tree Update»** (03.12.2020) — в верстаке появилось тех-дерево, а заодно приехала большая ребалансировка («over 300 balance changes, touching nearly every item»: переписаны времена крафта, HP, стоимости, Holosight переехал на T2, из ящиков перестали падать чертежи); - **«Meta Shift»** (02.10.2025) — фрагменты чертежей в рецептах верстаков 2 и 3, скрап из рецептов верстаков убран. И **до** обновлений 2026 года (апгрейд верстака на месте 07.05.2026, Livestock 01.10.2026) — их не берём. **Что это меняет в цифрах:** | механика | состояние на 06.11.2025 | |---|---| | цена исследования (стол) | **15 / 30 / 60 / 120** скрапа по редкости (Common / Uncommon / Rare / Very Rare). До 06.11.2025 было 20 / 75 / 125 / 500 | | тех-дерево верстака | есть; цена разблокировки — те же 15/30/60/120 по редкости (колонка «125/250/500» в вике — **устаревшая**) | | рецепты верстаков | L1: 500 дерева + 100 металла, **без скрапа**; L2: 500 металла + 20 ХМ + **5 Basic Blueprint Fragment**; L3: 1000 металла + 100 ХМ + **5 Advanced Blueprint Fragment** | | скрап | в рецепты верстаков **больше не входит**; тратится только на исследование и разблокировку | **Что из этого мы НЕ делаем** (решения проекта, см. п. 5): - **стартовые предметы не исследуются**: то, что игрок получает в самом начале, и всё «известное по умолчанию» — без чертежей и без скрапа; - **тех-дерево верстака** — оверхед (отдельный UI с деревом и ветками): знания берём только со стола исследований; цифры на случай, если решим иначе, — в п. 1.3; - **автоматизация** (Industrial Crafter, индустриальный крафт, Research Paper для него) — оверхед; - **биомы и джунгли** (Jungle Crate и прочее) — мир один, без биомов; - **обновления после 06.11.2025** — не берём. **Как доставать данные этой эпохи.** У вики Facepunch есть история правок: `https://wiki.facepunch.com/rust/item/~history` (список ревизий) и `~diff:` (изменения), плюс `~edit` (текущий wikitext). Отсюда берётся состояние страницы на дату. Для более старой эпохи (до 03.12.2020) — MediaWiki API fandom: `…/api.php?action=query&prop=revisions&titles=&rvlimit=1 &rvstart=<дата>&rvdir=older&rvprop=content&format=json`. Значки: ✅ подтверждено на 06.11.2025 · 🟡 косвенный источник · ❌ не подтверждено. ### 1.1 Камень (Rock) — стартовый предмет > «the most basic resource gathering and fighting tool» — инструмент сбора и оружие. - **Крафт:** 10 Stones, **верстак не нужен**, время 5 с (на верстаке 1 — 2 с, на 2/3 — 1 с). ✅ О - **Знание по умолчанию:** рецепт открыт с начала игры, исследовать не нужно. Цена **физического чертежа** — 120 скрапа; платится только ради бумажки (например, для Industrial Crafter). Формулировка вики: *«This blueprint is known by default. Research is only needed to obtain a physical blueprint for the Industrial Crafter.»* ✅ О - **Стартовый набор:** по гайдам 2023–2025 игрок спавнится с камнем и фонарём. ❌ На официальной вике **не документировано** — для нас это не факт, а решение проекта (выдаём камень в первый слот хотбара). - **Боевая статистика:** урон 10, множитель в голову ×2 (голова 20, торс 10), темп удара 0.8 с, дальность 1.2, радиус удара 0.2. ✅ О Руки/ноги — 8 (только С, и это **частный случай**: единого правила «руки/ноги = 0.8» в Rust нет — у разного оружия доли рук 0.63–1.0, ног 0.48–0.9). 🟡 - **Сбор:** за удар инструмент берёт из узла столько, сколько у него в таблице (у камня 50 дерева и 35 руды, у каменного топора 80 дерева, у топора 85 дерева, у каменной кирки 80 руды, у ледяной кирки 100 руды) — п. 1.6. ✅ (ремейк, `stacks.json`, у нас `rsx-protocol/.../items/items.csv`) - **Прочность:** шкала 0…100 у камня, 160 у каменных инструментов, 300 у топора, 400 у молотка, 1500 у ледяной кирки. ✅ (ремейк) - **Урон по постройкам:** считаем от HP постройки и урона оружия (п. 5.1). Числа «9 / 0.2 / 0.1» из старой версии плана — **неверны** (см. 1.9). **Сколько ударов на ресурс:** Узел — это запас (HP) ресурса. За удар инструмент забирает своё число из таблицы п. 1.6; последний удар отдаёт остаток узла, поэтому дерево всегда даёт ровно свой запас. **Метка** (светящийся «крестик» на дереве, «горячая точка» на руде) увеличивает урон за удар: по дереву до ×2, по руде до ×3, по серии ударов по метке бонус растёт. С меткой ударов примерно на треть меньше — «7 идеальных» против «10 обычных» у топора по берёзе. | узел | запас | камень | каменная кирка | топор | ледяная кирка | |---|---|---|---|---|---| | дерево (нищий дуб) | 500 дерева | 10 | — | 6 | — | | дерево (берёза) | 750 дерева | 15 | — | 9 | — | | дерево (мёртвое) | 1000 дерева | 20 | — | 12 | — | | узел камня | 750 Stones | 21 | 9 | — | 8 | | узел металла | 500 Metal Ore | 14 | 6 | — | 5 | | узел серы | 200 Sulfur Ore | 6 | 3 | — | 2 | ✅ (запасы узлов — официальная вики и rustpedia; урон за удар — ремейк) ⚠️ Официальная вика даёт другие числа сбора (камень по дереву 10, руда 5) — это баланс оригинального Rust. **Мы берём баланс ремейка**: он совпадает с ощущением «7–10 ударов на дерево», и по нему у нас есть все 218 предметов с точными характеристиками (п. 1.6). ### 1.2 Верстак (Workbench) — 3 уровня **Разворачиваемый предмет:** ставится на землю, нужно **стоять рядом**, чтобы крафтить. **Верстак — станция крафта с требованием уровня.** Уровень верстака = минимальный уровень, на котором рецепт доступен: предмет уровня 1 крафтится на верстаке 1 (и на любом более высоком), уровня 2 — только на верстаке 2 и выше, и так далее. Знание рецепта добывается отдельно — столом исследований (п. 1.3) **или** тех-деревом верстака (в оригинале есть, **у нас делаем** — п. 1.3). | уровень | рецепт | где крафтится | время крафта | |---|---|---|---| | **L1** | 500 Wood + 100 Metal Fragments | без верстака | 30 с / 15 с (L1) / 7 с (L2, L3) | | **L2** | 500 Metal Fragments + 20 High Quality Metal + **5 Basic Blueprint Fragment** | верстак 1 | 45 с (L1) / 22 с (L2) / 11 с (L3) | | **L3** | 1000 Metal Fragments + 100 High Quality Metal + **5 Advanced Blueprint Fragment** | верстак 2 | 60 с (L2) / 30 с (L3) | ✅ Скрапа в рецептах **нет** (убрали 06.11.2025), вместо него у T2/T3 **фрагменты чертежей** (02.10.2025). **Фрагменты чертежей** (для T2/T3): - **Basic**: всегда в зелёных головоломках (x1) и в синих головоломках рядом с красным ключом (x2), на всех средних и крупных монументах, в аирдропах; шанс — военный ящик, большой подводный ящик, мусорные учёные, металлоискание у дороги; - **Advanced**: гарантированно в хакбоксах, 1 шанс из 10 в элитных ящиках, всегда парами; Launch Site, Military Tunnels, Nuclear Missile Silo, Underwater Labs, Small/Large Oilrigs, Cargoship, CH47-дроп; - конвертация: **20 Basic → 1 Advanced**. ✅ (10.2025) Для нас это **гейт прогрессии T2/T3**: решение — повторяем (нужны «монолиты» с лутом) или заменяем скрапом — в п. 5. **Время крафта:** *«Using a higher tier Workbench than required results in a shortened crafting time of 50% less for the immediate next tier and caps at 75% less for the second tier above»* — **+1 уровень → −50 %, +2 уровня → −75 %** (дальше потолок), отсчёт от **требуемого** уровня. Чтобы разгонка действовала на всю очередь, надо **оставаться в радиусе** верстака. ✅ **Формула для реализации** (проверена на 589 предметах, 0 расхождений): ``` craftTime(tier) = max( floor( base × 0.5 ^ min( max(tier − requiredTier, 0), 2 ) ), 1 ) ``` `base` — время на **требуемом** уровне верстака. Три уровня выше не дают ничего: T3 не быстрее T2 для предметов, требующих не выше L1. **Кто что открывает** — по каждому предмету указано в п. 1.7 (уровень верстака). ### 1.3 Исследование: стол и тех-дерево (версия после 2020) **Два пути, оба рабочие:** 1. **Стол исследований (Research Table)** — «исследовать сразу», но нужен сам предмет. 2. **Тех-дерево верстака** — «пройти ветку до нужного предмета, тратя скрап». **Сам стол:** 200 Metal Fragments + 20 Scrap, крафтится **на верстаке 1**, время 30 с (L1) / 15 с (L2) / 7 с (L3). ✅ **Путь 1 — стол.** Кладёшь **один** нужный предмет в верхний слот → показывается требуемый скрап (в нижний слот) → кнопка «Research» → **10 секунд** → **предмет превращается в чертёж** (в инвентаре: текстура чертежа, а поверх неё — сам исследуемый предмет) и **уничтожается как предмет**. Предмет должен **быть у тебя** — буквально разобрать, чтобы понять, из чего он сделан. 🟡 _(механика — по community-вики; официальная вики подтверждает итог: «Blueprints can be used to learn how to craft an item… obtained by using a research table with scrap and the item you want to research»)_ **Путь 2 — тех-дерево верстака.** У каждого уровня верстака **своё дерево**: ветки, в вершинах — предметы. Чтобы открыть предмет, заплати скрап и пройди по ветке до него (предки сначала). Разблокировка **личная и непередаваемая**. | верстак | цена узла | что открывает | |---|---|---| | L1 | **125** скрапа | каменные → металлические инструменты, меч, тесак | | L2 | **250** скрапа | salvage-топор, ледяная кирка, металлический клинок, гаражные ворота, большая печь, автотурель | | L3 | **500** скрапа | шестерни, металлическая труба, бронедверь, C4, взрывчатка | | Engineering | **250** скрапа | промышленный крафтер, автотурель, телефон | ✅ (официальная вики: у каждого предмета в блоке Research **две** строки — «Research Table» со своей ценой и «Workbench Level N – Tech Tree» со своей) - Прочность предмета на результат не влияет (если предмет не сломана — иначе не работает). 🟡 - Исследование **продолжается**, если закрыть интерфейс стола. 🟡 - Звук слышно рядом. 🟡 - Скрапа тратится ровно нужное количество, остаток остаётся в нижнем слоте. 🟡 **Результат — физический чертёж** (предмет Research Paper / Blueprint): его можно **изучить** (чертёж уничтожается, рецепт открывается навсегда) или **отдать / продать** другому игроку; выученные чертежи переживают смерть и вайп. 🟡 Официальная вики подтверждает косвенно: предмет `researchpaper` — *«Use this item in a Research Bench to create blueprints of items»*. ✅ **Результат в тех-дереве** — не чертёж, а **открытый рецепт**: предмет можно сразу крафтить. Физический чертёж (для промышленного крафтера) получают через стол. **Известен по умолчанию** — рецепт открыт с начала игры: ни стола, ни скрапа не нужно. У камня, каменных инструментов, молота, строительного плана, верстаков 1–3, стола исследований, дверей и замков — пометка «known by default» в официальной вики. **Цена стола** — по редкости предмета (после «Pivot Or Die», 06.11.2025): | редкость | скрап | сколько предметов | |---|---|---| | Common | **15** | 144 | | Uncommon | **30** | 133 | | Rare | **60** | 96 | | Very Rare | **120** | 212 | ✅ О (разобран весь реестр, 585 исследовабельных предметов) До 06.11.2025 шкала была **20 / 75 / 125 / 500** — это и есть цифры из прошлой версии плана; они устарели на одно обновление. Шкалы «по тирам предмета» в Rust **нет**: цена привязана к редкости, а не к уровню верстака. **Цена тех-дерева — своя у каждого уровня верстака** (125 / 250 / 500 / 250, см. выше). Это **отдельная плата** от цены стола: предмет можно получить и через стол (дёшево, но нужен найденный предмет), и через дерево (дороже, но предмет не нужен — нужен только скрап и время). Официальная вики даёт обе цены рядом: | предмет | стол | тех-дерево | |---|---|---| | Топор (Hatchet) | 30 | L1 — 125 | | Кирка (Pickaxe) | 30 | L1 — 125 | | Меч (Salvaged Sword) | 15 | L1 — 125 | | Верстак 1 / 2 / 3 | 60 / 30 / 30 | — | | Промышленный крафтер | 30 | Engineering — 250 | | Автотурель | 120 | Engineering — 250 | | Телефон | 30 | Engineering — 125 | ⚠️ Утверждение прошлой версии плана («тех-дерево бесплатно с 06.11.2025, колонка 125 / 250 / 500 устарела») — **неверно**: это данные community-вики. Официальная вики показывает обе цены и сейчас. **Делаем как в оригинале: два пути.** **Монументы:** официально задокументирован только **Outpost** (Workbench L1 + Research Table). По community-вике столы есть также на аэродроме, электростанции, спутниковой тарелке, в супермаркете, в Military Tunnel и на Launch Site. 🟡 Разницы в поведении (стоимость, длительность) **нигде не задокументировано** — считать такую же. ❌ **Кому что передаётся:** физический чертёж — передаваемый предмет; разблокировка из тех-дерева — **личная, не передаётся**. ✅ О + С **Эксперимент на верстаке** (75 / 300 / 1000 скрапа → случайный чертёж) — механика 2017–2020 годов, заменена тех-деревом в декабре 2020. **Не реализуем.** ❌ ### 1.4 Скрап (Scrap) - **Не из построек.** Скрап выпадает из **ящиков и бочек**, аирдропов, учёных и андроидов; разрушение построек скрапа **не даёт**. ✅ О (раздел Loot Sources) - **Не крафтится** (Craftable: False). ✅ О - **В рецептах верстаков скрапа нет** (убрали 06.11.2025). Тратится на исследование (15/30/60/120) и на разблокировку в тех-дереве (125/250/500). ✅ О - Основные источники (О): базовый ящик 3, синий и жёлтый бочонок 2, военный ящик 8, элитный 25, аирдроп 140–160, учёный 8–24. - **Первый источник в нашей игре — мусорка на дороге** (§1.11): серая бочка даёт до 15 скрапа. Лутбоксы (монументы) отложены — фундамента для них ещё нет, а прогрессию исследования скрап должен закрывать уже сейчас. - Косвенно: в Outpost можно обменять металл на скрап (1 скрап = 20 металла). 🟡 - Фрагменты чертежей скрап **не заменяют** — это отдельная валюта (п. 1.2). ### 1.5 Постройка баз (Rust) **Как ставится.** Строительный план (Building Plan, **20 дерева**, крафт 15 с) — разворачиваемый предмет: кладёшь в хотбар, ПКМ открывает колесо конструкций, выбираешь объект, видишь «призрак»; **ПКМ + движение мышью** перебирает варианты, **ЛКМ** ставит. ✅ План ставит **деревянный** уровень; все старшие уровни получаются **улучшением молотком**. ✅ **Два слоя объектов:** - **Строительные**: квадратный и треугольный фундамент, ступени на фундаменте, квадратный и треугольный пол, рамка пола, стена, полустена, низкая стена, **малый дверной проём**, **большой проём (wall frame)**, окно, крыша, лестница, рампы. - **Внутренние**: двери, верстаки, печи, сундуки, торговый автомат, шкаф, инструментальный шкаф, замки. > ❌ **Столбов (колонн) в Rust нет** — их убрали в обновлении 196 (01.02.2018). Правила > «столбы ставят до стен», «под столбом должен быть фундамент», «на втором этаже столбы > должны быть снизу» — **мёртвые**, из плана выкидываем. **HP по уровням** — одинаково для всех деталей уровня: 🟡 (игровые зеркала, официальной вики по базовым блокам нет вовсе) | уровень | HP | |---|---| | Wood (дерево) | **250** | | Stone (камни) | **500** | | Sheet Metal (лист) | **1000** | | Armored (броня) | **2000** | ❌ **Уровня «лоза» (twig) у нас нет:** в Rust лоза — из джунглей, джунглей в нашем мире нет (п. 5.1), поэтому её выкидываем отовсюду: из HP-таблицы, из цен, из таймеров гниения и из правил шкафа. **Стоимость детали по уровням.** **Улучшение молотком стоит как целевой уровень** (дерево→камень = столько же камней, сколько металл→камень); понизить уровень нельзя. | деталь | Wood (дерево) | Stone (камни) | Sheet Metal (металл) | Armored (ХМ) | |---|---|---|---|---| | стена, фундамент, полустена, лестница | 200 | 300 | 200 | 25 | | треугольный фундамент, ступени, пол, рамка пола, треугольный пол, рамка треугольного пола, низкая стена, большой проём, крыша, рампы | 100 | 150 | 100 | 13 | | малый дверной проём, окно | 140 | 210 | 140 | 18 | Скрап и ХМ в постройке не участвуют (кроме армированного уровня — там ХМ). **Двери и замки:** | предмет | HP | крафт | верстак | цена физического чертежа | |---|---|---|---|---| | деревянная дверь | **200** | 300 дерева | — | 120, известен по умолчанию | | деревянная двойная | **200** | 350 дерева | — | 60, известен по умолчанию | | листовая дверь | **250** | 150 металла | — | 60, известен по умолчанию | | листовая двойная | **250** | 200 металла | — | 120, известен по умолчанию | | **бронедверь** | **1000** | 20 ХМ + 5 шестерён | **L3** | 120, нужен чертёж | | бронедвойная | **1000** | 25 ХМ + 5 шестерён | **L3** | 120, нужен чертёж | | гаражные ворота | **600** | 300 металла + 2 шестерни | **L2** | 30, нужен чертёж | ⚠️ Есть конфликт источников: fandom даёт бронедверь 800 HP, игровые зеркала — **1000**. Берём 1000. - **Мешковый баррикад (Sandbag):** 200 HP, 100 камней + 10 ткани, верстак 1, стек 10. ✅ (на 06.11.2025; в 10.2026 его переделали — за пределами нашего среза) - **Кодовый замок:** 100 металла, 4 цифры, 30 с, без верстака, известен по умолчанию. ✅ (в плане было верно) Неверный код даёт урон током; 10⁴ комбинаций; снять нельзя. - **Ключевой замок:** 75 дерева, 15 с, без верстака, известен по умолчанию. Ключ не крафтится — выдаётся замком. - Оба замка ставятся на: одиночные и двойные двери, гаражные ворота, витрины, люки, сундуки, инструментальный шкаф, ворота клетки, сетка-фенси, внешние ворота. ✅ **Инструментальный шкаф (Tool Cupboard):** 1000 дерева, 30 с, без верстака, HP 100. Разблокирует постройку в радиусе: **официальная вика — 50 м** («only you can build in a 50 meter radius of it»), радиус «проецируется фундаментами», а не точкой шкафа. ⚠️ **Конфликт**: вики 2020 г. в статье Building даёт **16 м от фундамента** и прямо называет «50 meter radius» в инфобоксе **долгой ошибкой вики**. Берём 50 м (официальная вика), но помечаем как спорное. ✅/⚠️ Блокирует и постройку, и предметы (спальники, сундуки) внутри. Аптейп — **доля от стоимости постройки**, списывается раз в **24 ч**; уничтоженный шкаф съедает до 24 ч аптейпа. ✅ Неавторизованные не могут ставить **ничего** — всё «BUILDING BLOCKED» (исключение про лозовые полы выкинуто вместе с лозой). ✅ (в плане было верно) **Гниение (decay):** когда аптейп кончился: дерево **3 ч**, камень **5 ч**, лист **8 ч**, броня **12 ч**. Внутри здания — **в 10 раз дольше** (деревянная дверь 30 ч, листовая 80 ч, бронедверь 120 ч). Открытие/закрытие двери с замком сбрасывает таймер. 🟡 ⚠️ В вики 2020 г. эти же числа стояли как **1 / 2 / 4 / 8 / 12 ч** — таймеры дерева и камня перенастроили позже; берём современные (1/3/5/8/12), старые — как след истории изменений. **Прочность конструкции (stability):** при наведении с молотком виден процент стабильности; если он упал в ноль, деталь ломается сразу при установке. Точные правила поддержки второго этажа **официально не задокументированы**. ❌ **Куда можно строить:** почти везде; крутые склоны и неровная земля мешают, фундамент ставят и под водой. 🟡 ### 1.6 Инструменты: сбор, урон, износ **Откуда цифры.** Основной источник — **база предметов ремейка** (`rsx-protocol/src/main/resources/items/items.csv`, выгружена из `models/stacks.json`): там у каждого предмета урон, дальность, темп, прочность, сколько ресурса он берёт за удар и из чего сделан. Официальная вики даёт **другой** баланс (оригинальный Rust) — см. предупреждение в п. 1.1. ✅ (ремейк, 218 предметов) **За удар инструмент берёт** из дерева `rwood`, из руды `rore`, из плоти — свой урон. **Темп** — `rcooldown` в тиках (20 тиков = 1 с). **Прочность** — `rdurability`. | инструмент | урон | дальность | темп (тики / с) | прочность | дерево за удар | руда за удар | |---|---|---|---|---|---|---| | **Камень** | 10 | 2 | 40 / 2.0 | 100 | 50 | 35 | | **Каменный топор** | 15 | 3 | 32 / 1.6 | 160 | 80 | — | | **Каменная кирка** | 17 | 3 | 32 / 1.6 | 160 | — | 80 | | **Топор (Hatchet)** | 25 | 3 | 31 / 1.55 | 300 | 85 | — | | **Кирка (Pickaxe)** | 30 | 3 | 32 / 1.6 | 300 | — | 100 | | **Молот** | 0 | 3 | 32 / 1.6 | 300 | — | — | | **Salvaged Hammer** | 30 | 3 | 19 / 0.95 | 400 | 40 | 59 | | **Salvaged Axe** | 40 | 3 | 28 / 1.4 | 1500 | 100 | — | | **Salvaged Icepick** | 40 | 3 | 28 / 1.4 | 1500 | — | 100 | | **Salvaged Sword** | 50 | 3 | 25 / 1.25 | 300 | — | — | | **Salvaged Cleaver** | 60 | 3 | 35 / 1.75 | 400 | — | — | | **Дубинка (Bone Club)** | 16 | 3 | 16 / 0.8 | 300 | 60 | 44 | | **Нож (костяной)** | 16 | 3 | 16 / 0.8 | 250 | — | — | | **Нож (боевой)** | 35 | 3 | 16 / 0.8 | 250 | — | — | | **Мачете** | 35 | 3 | 20 / 1.0 | 300 | — | — | | **Булава (Mace)** | 60 | 3 | 35 / 1.75 | 300 | — | — | | **Длинный меч** | 75 | 3 | 35 / 1.75 | 400 | — | — | | **Копьё (каменное)** | 35 | 5 | 32 / 1.6 | 400 | — | — | | **Копьё (деревянное)** | 25 | 4 | 32 / 1.6 | 250 | — | — | ⚠️ Поле `skinning` (0.45…1) в базе есть, но смысл его не разобран — **пока не применяем**. Поле `rmaterial` (stone / metalwood / metalmediumrattley / gun / cloth / leather …) — «материал» предмета: по нему считается цена ремонта и уровень брони. **Для сравнения — баланс оригинального Rust** (официальная вики, Gather Rates): камень 10 дерева / 5 руды, каменный топор 20, каменная кирка 16, топор 30, кирка 30, Salvaged Axe 50, Icepick 50, Hammer 15. **Не берём** — у нас баланс ремейка (п. 1.1). **Урон по частям тела** (вики 2020 г., проверено современной вики по базовому урону): камень **20/10/8/8**, каменный топор **27/15/12/12**, каменная кирка **35/17/13/13**. Универсального правила **нет**: доли рук у разного оружия 0.63–1.0, ног 0.48–0.9. Для нашей модели достаточно «голова ×2, торс ×1, руки/ноги — общая доля», но в Rust это не так. 🟡 **Прочность:** в ремейке у каждого предмета своё число (камень 100, каменные инструменты 160, топор 300, молот 400, ледяная кирка 1500). Износ за удар считаем пропорционально износу вики (0.3 за удар по дереву и руде, 1.0 по плоти). ✅/С **Сколько ударов на ресурс** — таблица в п. 1.1 (запасы узлов: 500/750/1000 дерева, 750 камней, 500 металла, 200 серы; урон за удар — из п. 1.6). **Урон по постройкам:** официальной вики **нет** данных «урон инструмента по уровню постройки». Есть HP блоков (п. 1.5) и расчёт «сколько инструментов надо взять» из игровых зеркал: камнем — **37 камней** на дерево, **74** на камень, **295** на лист, **589** на броню. Таблица «лоза 9, дерево 0.2, металл 0.1» — из экспериментальной вики 2015–16, **не использовать**. ❌ ⚠️ Логическая нестыковка: 250 HP / 10 урона = 25 ударов, а зеркала дают 37 — значит у оружия есть множитель урона по постройкам, который **нигде не опубликован**. Для нас: взять HP по п. 1.5 и решить модель урона самим (п. 5). **Кого чем:** топоры и камень бьют по дереву, кирки — по руде, камень умеет и то и другое, Salvaged Hammer — и дерево и руду. Мечи и тесаки — только по плоти: у них в базе ремейка нет ни дерева, ни руды. ✅ **Броня** (официальная вика, таблица Protection). Слои: голова/торс/ноги — по 2 слота (L1 — одежда, L2 — броня), руки и ступни — по одному; **оба слота дают защиту**. | предмет | пули | ближний бой | укус | радиация | холод | взрыв | |---|---|---|---|---|---|---| | футболка | 10–15 % ⚠ | 10–15 % ⚠ | 4–5 % ⚠ | 3 % | 4–6 % ⚠ | — | | рубашка, штаны | 15 % | 15 % | 3 % | 5 % | 8 % | — | | hoodie | 20 % | 15 % | 23 % | 5 % | 34 % | — | | bucket helmet | **20 %** | 50 % | 8 % | 4 % | 6 % | **8 %** | | riot helmet | 25 % | 80 % | 13 % | 5 % | 6 % | **8 %** | | костяной шлем / костяная броня | 25 % | 40 % | **13 %** | 4 % | — | **7 %** | | heavy plate helmet | 90 % | 80 % | 13 % | 7 % | −17 % | ❓ | | heavy plate jacket / pants | 75 % | 70 % | 12 % | 7 % | −17 % | ❓ | | hazmat suit | 30 % | 30 % | 50 % | 50 % | 50 % | **30 %** | | ninja suit | 25 % | 30 % | 50 % | 15 % | 50 % | 30 % | | jumpsuit | 25 % | 40 % | 67 % | 4 % | — | 40 % | ⚠️ **В официальной вики колонка «взрыв» у брони содержит ошибки**: Bucket Helmet 50 % (в игре 8 %), Riot Helmet 50 % (8 %), Bone Armor 40 % (7 %), Heavy Plate 100 % (17 %), и «укус» у Bone Armor 67 % вместо 13 %. Верен только взрыв у Hazmat Suit (30 %). ❓ Heavy Plate: взрыв — fandom 8/12/12 %, rustclash 17/17/17 %, вики 100 % — **не подтверждено**, брать 17 % как среднее или 12 % по fandom. ⚠️ Футболка: датированная вики (2018) даёт 10/10, современные источники — 15/15. 📅 Данные приведены на **06.11.2025**; 06.08.2026 bucket helmet бафнули (20 → 25 % пули, 8 → 13 % укус, крафт 35 → 20 металла) — это уже за пределами нашего среза. Перекрёстная проверка (вики 2020 г.) сходится по существу: riot helmet 80 % ближний бой, heavy plate helmet 90 % пули, hazmat 30/30; по футболке источники расходятся (10 % против 15 %). ### 1.7 Таблица: предмет → верстак → чертёж **`bench`** — минимальный уровень верстака для крафта: 0 = крафтится без верстака, 1 / 2 / 3 = нужен верстак соответствующего уровня. **«По умолчанию»** — рецепт открыт с начала игры (знать не нужно, чертёж не нужен). **Стол** — цена физического чертежа на столе исследований (если рецепт не открыт по умолчанию): 15 / 30 / 60 / 120 скрапа по редкости. **Дерево** — путь через тех-дерево верстака: уровень верстака и цена узла (125 / 250 / 500 / 250). `—` = пути нет (рецепт по умолчанию или предмет не в дереве). | предмет | bench | крафт | время | стол | дерево | по умолчанию | |---|---|---|---|---|---|---| | Камень (Rock) | 0 | 10 камня | 5 с | 120 | — | **да** | | Каменный топор | 0 | 200 дерева + 100 камня | 15 с | 120 | — | **да** | | Каменная кирка | 0 | 200 дерева + 100 камня | 15 с | 120 | — | **да** | | Каменное копьё | 0 | 1 деревянное копьё + 20 камня | 10 с | 120 | — | **да** | | Строительный план | 0 | 20 дерева | 15 с | 120 | — | **да** | | Молот | 0 | 100 дерева | 15 с | — | — | да | | **Верстак 1** | 0 | 500 дерева + 100 металла | 30 с | 60 | — | **да** | | **Верстак 2** | 1 | 500 металла + 20 ХМ + **5 Basic Fragment** | 45 с | 30 | — | **да** | | **Верстак 3** | 2 | 1000 металла + 100 ХМ + **5 Advanced Fragment** | 60 с | 30 | — | **да** | | Стол исследований | 1 | 200 металла + 20 скрапа | 30 с | 60 | — | **да** | | Инструментальный шкаф | 0 | 1000 дерева | 30 с | 120 | — | **да** | | Верстак для ремонта | 1 | 125 металла | 30 с | 120 | — | **да** | | Деревянная дверь | 0 | 300 дерева | 30 с | 120 | — | **да** | | Двойная деревянная дверь | 0 | 350 дерева | 30 с | 60 | — | **да** | | Листовая дверь | 0 | 150 металла | 30 с | 60 | — | **да** | | Двойная листовая дверь | 0 | 200 металла | 30 с | 120 | — | **да** | | Кодовый замок | 0 | 100 металла | 30 с | 120 | — | **да** | | Ключевой замок | 0 | 75 дерева | 15 с | 120 | — | **да** | | Топор (Hatchet) | 1 | 100 дерева + 75 металла | 30 с | 30 | L1 — 125 | нет | | Кирка (Pickaxe) | 1 | 100 дерева + 125 металла | 30 с | 30 | L1 — 125 | нет | | **Salvaged Hammer** | 1 | 1 металл. труба + 50 металла | 30 с | 30 | L1 — 125 | нет | | **Salvaged Sword** | 1 | 1 металл. клинок + 15 металла | 30 с | 15 | L1 — 125 | нет | | **Salvaged Cleaver** | 1 | 1 дорожный знак + 50 металла | 30 с | 30 | L1 — 125 | нет | | **Salvaged Axe** | 2 | 1 металл. труба + 5 металл. клинков | 30 с | 60 | L2 — 250 | нет | | **Salvaged Icepick** | 2 | 1 металл. труба + 5 металл. клинков | 30 с | 60 | L2 — 250 | нет | | Металлический клинок | 2 | — | 1 с | 30 | L2 — 250 | нет | | Шестерни | 3 | — | 1 с | 60 | L3 — 500 | нет | | Металлическая труба | 3 | — | 1 с | 60 | L3 — 500 | нет | | Металлическая пружина | 3 | — | 1 с | 60 | L3 — 500 | нет | | Большая печь | 2 | 600 дерева + 500 камня + 75 топлива | 40 с | 60 | L2 — 250 | нет | | Гаражные ворота | 2 | 300 металла + 2 шестерни | 30 с | 30 | L2 — 250 | нет | | Автотурель | 2 | — | 45 с | 120 | L2 — 250 | нет | | **Бронедверь** | 3 | 20 ХМ + 5 шестерён | 30 с | 120 | L3 — 500 | нет | | **Бронедвойная дверь** | 3 | 25 ХМ + 5 шестерён | 30 с | 120 | L3 — 500 | нет | | **Взрывчатка** (Explosives) | 3 | — | 5 с | 120 | L3 — 500 | нет | | **Timed Explosive Charge** (C4) | 3 | — | 30 с | 120 | L3 — 500 | нет | ✅ (вики на 11.2025). «По умолчанию» = рецепт открыт без чертежа — **для нас это значит «не исследуется»** (см. правило в шапке раздела). **Ветки наших тех-деревьев** (предок → потомок; цена узла одна на уровень верстака): | верстак | ветка | |---|---| | L1 (125) | молот → топор → кирка → меч → тесак | | L2 (250) | salvage-топор → ледяная кирка; металлический клинок; большая печь; гаражные ворота; автотурель | | L3 (500) | шестерни → металлическая труба → бронедверь; C4; взрывчатка | **Что НЕ существует** (в плане раньше было — убрано): `Salvaged Hatchet`, `Salvaged Pick Axe`, `M16` (есть LR-300), `Doorway (small)` как предмет, `Oil Refinery` (есть только Small Oil Refinery), `Refrigerator` (есть Fridge), `Metal Gear` (есть Gears), `Shooting Range` (есть Reactive Target). **Ресурсы** (дерево, камни, металл, ХМ, сера, скрап, ткань, кожа) не крафтятся, а собираются — рецепта нет вовсе. **Полный список предметов с характеристиками** — в `rsx-protocol/src/main/resources/items/items.csv` (218 шт, выгружено из ремейка, п. 1.6). Названия и описания — в `rsx-protocol/src/main/resources/items/item-texts.json` (543 шт). Огнестрел — в `weapons.csv` (23 ствола: урон, темп, магазин, разброс, отдача, патрон, верстак, цены исследования). ### 1.8 Строительные объекты и сокеты **Объекты** (набор одинаков для всех уровней): квадратный фундамент, треугольный фундамент, ступени на фундаменте, квадратный пол, треугольный пол, рамка пола, стена, полустена, низкая стена, **малый дверной проём (Doorway)**, **большой проём (Wall Frame)**, окно, крыша, лестница, рампы. Столбов нет (п. 1.5). **Сокеты** — что к чему присоединяется (из игровых данных, rusthelp): ✅ | сокет | что в него входит | |---|---| | **Малый дверной проём** (Doorway) | одиночная дверь (деревянная / листовая / бронедверь), торговый автомат | | **Большой проём** (Wall Frame) | двойные двери (деревянные / листовые / броневые), гаражные ворота, сетка-фенси, ворота клетки, стена клетки, витрина, металлическая витрина, сетка (netting) | | **Окно** | оконные решётки (дерево / металл / усиленные), укреплённое и закалённое стекло, ставни, бойницы (горизонтальные и вертикальные) | | **Рамка пола** (Floor Frame) | решётка пола, люк (Ladder Hatch), бронированный люк | **Проёмы двух видов:** малый (Doorway) — влезает **только одиночная** дверь; большой (Wall Frame) — влезают **двойные двери и гаражные**, но **не одиночные**. ✅ (в плане было верно) **Снаппинг строительных деталей** (общее правило из вики): стены ставятся к **краю фундамента**, полы — к **верхней кромке стены**, двери — **внутрь дверного проёма**. Правило из вики дословно: *«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.»* 🟡 **Свободное размещение:** строительные детали садятся **по сетке** (фундамент 3×3), привязка есть только у внутренних блоков — к уже поставленным строительным. ❌ Старая формулировка плана «ставятся свободно, не по сетке мира» — неверна. ### 1.9 Сверка данных (что сошлось и что не сошлось) **Сошлось:** | проверка | результат | |---|---| | сумма цен исследования по редкости | 144 + 133 + 96 + 212 = **585** исследовабельных предметов — совпадает с разобранным реестром ✅ | | сумма тех-дерева | 87 + 78 + 20 (верстаки) + 39 + 47 + 7 (Eng-верстак) = **278** ✅ | | сумма уровней верстаков | 269 + 167 + 131 + 27 = **594** крафтбельных с указанным уровнем ✅ | | **удары по узлу (наши цифры)** | камень 750 ÷ 35 за удар = **21 удар**; ÷ 80 (каменная кирка) = **9**; ÷ 100 (кирка) = **8** ✅ | | **удары по дереву (наши цифры)** | 500 ÷ 50 (камень) = **10**; ÷ 85 (топор) = **6**; 750 ÷ 85 = **9**; 1000 ÷ 85 = **12** ✅ | | **ощущение «7–10 ударов»** | топор по берёзе (750) — 9 ударов, с меткой ≈ 6–7 ✅ совпадает с ожиданием игрока | | **расход прочности** | камень: 21 удар по узлу × 0.3 = 6.3 прочности (шкала 100 → ~16 узлов на камень) ✅ | | прогрессия уровней постройки | HP 250 → 500 → 1000 → 2000 при цене 200 → 300 → 200 → 25 — растёт по HP, стоимость листа дешевле камня (но нужна переплавка) ✅ | | двери | дерево 200 HP / 300 дерева, лист 250 / 150 металла, броня 1000 / 20 ХМ ✅ | | формула времени крафта | 589 предметов, 0 расхождений с формулой п. 1.2 ✅ | | **база ремейка против наших таблиц** | 218 предметов в `items.csv`; все наши числа (урон, темп, прочность, добыча) взяты оттуда ✅ | **Не сошлось (требует решения проекта, п. 5):** | расхождение | цифры | |---|---| | урон по постройкам | 250 HP ÷ 10 урона = 25 ударов, а калькулятор рейда даёт 37 → есть ненулевой множитель урона по постройкам, который не опубликован | | радиус шкафа | 50 м (официальная вика) против 16 м (старая вики) | | HP броневой двери | 1000 (зеркала) против 800 (fandom, 2020) | | таймеры гниения | 1/3/5/8/12 ч против 1/2/4/8/12 ч (2020) | | таблица «урон по постройкам» 2018 г. | лоза 9 / дерево 0.2 / металл 0.1 — не публикуется современной викой и не сходится с калькулятором; лозы у нас нет | | скрап на исследование | вики до 06.11.2025 давала плоские 20/75/125/500; после обновления — 15/30/60/120 **по редкости**, а не по уровню верстака. У нас нет ни ящиков с лутом по тирам, ни «редкости» предмета — тиры придётся задавать вручную | | **баланс вики против баланса ремейка** | вики: камень 10 дерева / 5 руды; ремейк: 50 / 35. Берём **ремейк** (п. 1.1) — под него и под «7–10 ударов» подобраны все числа | | **огнестрел: урон/отдача/спрей** | в базе ремейка только магазин, тип патрона, ADS-зум, прочность, reach. Остальное — серверные данные; ищем в коде (п. 5.2 п. 5) | **Как перепроверять:** страница предмета `wiki.facepunch.com/rust/item/` даёт блоки **Craft** (рецепт, требование верстака, «Craft Time by Workbench»), **Research** (цена физического чертежа + приписка «known by default»), **Weapon Stats** и **Gather Rates**. Состояние страницы на дату — через `~history` / `~diff:`; для эпохи до 03.12.2020 — через MediaWiki API fandom с `rvstart`/`rvdir=older`; резерв — Wayback. ### 1.10 Мусорка (Roadside Junk Pile) — первый источник скрапа **Что это.** Небольшой макро-монумент на дороге: брошенная машина / куча мусора. В Rust это «Roadside Junk Pile»: спавнится **только на дороге**, внутри **1–4 бочки** и изредка один ящик еды, обновляется примерно раз в 20 минут. 🟡 У нас — своя версия: **2–4 бочки + 0–2 ящика еды**. **Состав и лут:** | бочка | что даёт | примечание | |---|---|---| | **серая** | скрап **1–15** + один случайный предмет-мусор | мусор логичный: дорожные знаки, ящики, пустая банка, рваная одежда, гитара, бочка для воды | | **синяя** | один случайный **компонент**: электропредохранитель, шестерни, металлическая труба, металлическая пружина, дорожные знаки, лист металла, **корпус полу-автомата** | корпуса SMG и винтовки **не выпадают** (как в оригинале: только из «технических» ящиков) | | **красная** | **сырая нефть 10–20** + **топливо низкого качества 5–15** | топливная бочка | **Ящики с едой** (1–2 слота): еда (фрукты, ягоды, консервы, шоколад, картошка) и вода — вода необязательна, второй слот может быть тоже едой. **Как это работает у нас:** - бочки **разрушаемые** (HP 35 обычная / 50 топливная) — при разрушении выпадает лут; - ящики с едой — обычный контейнер, его обыскивают; - когда всё опустошено, мусорка **пропадает через 60–180 с** (случайно) и **появляется на другом участке дороги**, preferably рядом с игроками (но не на глазах); - сервер сам решает точки спавна по сегментам дороги (п. 1.11). ✅ О (официальные вики-страницы контейнеров: yellow barrel, blue barrel, oil barrel, tech parts 1, food box) + 🟡 (roadside junk pile — community-вики) + С (наши решения: 3–4 бочки, время жизни, выбор точки). **Модели и звуки — из ремейка**: `nextgen/models/barrel_blue`, `barrel_red`, `barrel_white`, `crate`, `foodcrate`, `dieselbarrelloot`, `primitivecrate`, `lockcrate`, `medicalcrate`; звуки бочки/ящика — из `sounds.csv`. ### 1.11 Дороги **Сеть дорог** — сетка из 3–4 пересекающихся дорог через остров **плюс кольцо** вдоль берега. Ширина — 6–8 блоков, покрытие — свой блок «асфальт» (новый id в общем словаре блоков). **Генерация:** дорога выравнивает рельеф (по своей линии, со скруглением на поворотах) и кладёт покрытие; пересечения сливаются в площади. Кольцо идёт по берегу, вдоль линии прилива. **Точки спавна мусорки** (п. 1.10) — дискретные **сегменты** дороги: сервер держит список точек вдоль всех дорог, из них выбирает свободную ближе к игрокам. **Слой дорог — часть генератора мира** (Шаг D), но нужен раньше мусорки, поэтому генерацию дорог тянем в Шаг C. ## 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**, **знание по умолчанию**, **цена исследования**, **ветка тех-дерева**, **тег `admin`**. - `bench` — **минимальный уровень верстака**, на котором рецепт доступен (0 = крафтится без верстака, 1/2/3 = нужен верстак этого уровня или выше). Это **гейт крафта, а не знания** — в Rust это разные вещи. - `knownByDefault` — рецепт открыт с начала игры: **не исследуется, скрап не нужен** (по вики такую пометку имеют 97 предметов из 380 с указанным уровнем верстака). - `researchScrap` — цена физического чертежа на столе (0 = не исследуется). - `techTreeBench` + `techTreeScrap` + `techTreeParent` — верстак, цена узла и **предок** в тех-дереве (0 = предка нет, узел — корень ветки). - `admin` — **тег блока/предмета**: без тега может всё, с тегом — только админы сервера; **креатив прав не даёт** (п. 2.2). - Знание рецепта — **состояние игрока** (`knownRecipes`), а не свойство предмета. - У предмета есть **класс инструмента** (NONE / PICKAXE / AXE / SWORD / …) и **класс ресурса**, который он добывает. - Все числа берём из п. 1.6–1.7, **источник — база ремейка** (`rsx-protocol/src/main/resources/items/items.csv`, 218 предметов), ничего не выдумываем. ### 2.5 Крафт - Как в Rust (после 2020): **верстаки трёх уровней** (разворачиваемый предмет, надо стоять рядом) и **два пути исследования** (п. 1.3): - **стол**: нужен найденный предмет + скрап → получается **физический чертёж**, который изучается и открывает рецепт; - **тех-дерево верстака**: платишь скрап и открываешь узел, рецепт становится доступен; разблокировка личная, чертёж не выдаётся. - **Эксперимент на верстаке** (75 / 300 / 1000 скрапа → случайный чертёж) — механика 2017–2020, **не реализуем**. - Знание рецепта — **состояние игрока**, а не свойство предмета. - Время крафта, множитель от уровня верстака, цены скрапа — как в Rust. - То, что игрок получает **на старте**, не исследуется вообще. ### 2.6 Структуры вместо блоков мира Руда, деревья и камни — **не блоки мира, а разрушаемые объекты** (как узлы в Rust): у них есть **HP**, **запас ресурса** и **метка** («крестик» на дереве, «горячая точка» на руде), они бьются инструментом и дают дроп. Последний удар отдаёт остаток запаса. Мир меняют только админы. - **Руда** — своя 3D-модель (в ремейке есть `ore/stone`, `ore/metal`, `ore/sulfur`) + свой AABB; **деревья** — пока обычные блоки мира, у которых сервер держит HP и запас узла. - **Мусорка** (п. 1.10) — тоже структура: бочки и ящики, у неё есть состояние (что опустошено) и таймер исчезновения. ### 2.7 Текстуры - Текстуры предметов пока **временные**, взяты из ремейка как заглушки: иконки — из атласа `assets/rustex/gamejar/assets/rustex/icons/atlas.png` (MTSDF, 2048×2048, тайлы 64×64) по именам `rusticon` из базы предметов. - **Пометка: заменить на свои** (см. п. 6). ### 2.8 Игрок: полу-кастомный объект Игрок — **ванильный, но с нашими числами движения**. Класс `RsxPlayer extends EntityPlayerSP` (в `src-overlay`), рядом `RsxMovementInput extends MovementInputFromOptions` и `RsxPlayerTuning` с числами. | что | ванильно | у нас | как считается | |---|---|---|---| | скорость подкрадывания | ~1.30 блока/с (множитель 0.3) | **1.5 блока/с** | множитель 0.34746; ванильный 0.3 отменяется, ставится наш (×1.158) | | высота прыжка с места | 1.25 блока (импульс 0.42) | **1.5 блока** (0.46341) | высота в конфиге класса игрока, импульс обратным счётом по физике | | высота прыжка в движении | 1.25 блока | **1.25 блока** (ванильная) | ходьба и бег не меняются, спринт-толчок ванильный | | высота при подкрадывании | 1.65 блока | **1.45 блока** | проходит в щель 1.5 блока | | высота глаз в подкрадывании | 1.54 | **1.37** | иначе глаза выше головы | - Скорость прыжка считается обратным счётом по физике ваниллы (гравитация 0.08, сопротивление 0.98): формула `v = 0.42·√(h/1.25)` давала 1.48 вместо 1.5. - Значения живут в `RsxPlayerTuning` — это и есть «конфиг игрока»: переписали код игрока — поменяли числа. Переопределение из командной строки: `-Drsx.sneakSpeed=`, `-Drsx.jumpHeight=`, `-Drsx.jumpHeightStanding=`, `-Drsx.crouchHeight=`. - Мобы прыгают как в ванилле: переопределение живёт в `RsxPlayer`, а не в `EntityLivingBase`. - Патчи в ванильное дерево — три строки: `PlayerControllerMP` создаёт `RsxPlayer`, `Minecraft` создаёт `RsxMovementInput`, `EntityPlayer.updateSize` берёт высоту подкрадывания из нашего класса. Вся логика — в нашем коде. ### 2.9 Броня: семь мест и три зоны урона **Семь мест**, как в базе ремейка (без пояса): | слот | слои | предметы ремейка | |---|---|---| | голова | 1 | `helmet` (13) | | лицо | 1 | `hat` — повязка (1) | | грудь | 2 | `plate` (одежда, 9) + `jacket` (броня, 6) | | ноги | 2 | `pants` (одежда, 6) + `kilt` (броня, 2) | | руки | 1 | `gloves` (5) | | стопы | 1 | `boots` (3) | | полный костюм | 1 | `suit` (1) — хазмат, заменяет остальные | - Данные 46 предметов одежды выгружены в `items.csv` (слот, слой, какие части тела закрывает, сколько снимает из каждого вида вреда) и заведены в реестр. - **Три зоны урона**: голова (верхние 0.4 высоты) **×2** (так в Rust), тело **×1**, ноги (нижние 0.4) **×0.75** (наше правило; в Rust не документировано). - Одежда снимает вред **только там, где закрывает**: маска не спасает от удара в грудь. - Удар приходит пакетом `Attack` (цель, точка попадания, рука) — в ванильном `CPacketUseEntity` точка есть, в нашем протоколе добавили. ### 2.10 AABB: редактор хитбоксов - **Данные** (`rsx-protocol`): `Hitbox` (имя, зона, min/max, поворот) и наборы по моделям; пакеты `Hitboxes` (определения), `HitboxInstances` (где стоят модели), `HitboxesReload` (клиент просит перечитать файл). - **Сервер**: `HitboxRegistry` читает JSON (по умолчанию `world/hitboxes.json`, можно указать `--hitboxes`), перечитывает по запросу и шлёт наборы игрокам. Сломанный файл не стирает рабочие коробки, а объясняет причину. - **Клиент**: `RsxHitboxDebug` рисует коробки через `RenderGlobal.drawBoundingBox` с подписями `DebugRenderer`, красит зоны (голова красная, тело жёлтое, ноги синие). Команды: `/rsx hitboxes on|off|reload|list|show NAME`. - **API**: `rsx-plugin-api` (новый модуль) — интерфейс `Hitboxes`: плагин регистрирует свои коробки. - Область: наши структуры (узлы, мусорка, постройки) и игроки с зонами. ### 2.11 Вход без пароля (сделано) **Схема пользователя — её нельзя менять:** > 1. Лаунчер при заходе предлагает войти. Он обращается к **AUTH-серверу**: есть ли > доступ к игре у этого пользователя. Нет — идёт нахер. Да — пропускает. > 2. При запуске игры лаунчер передаёт игре **токен** и **uuid (без ника)**; ник игра > получает из токена+uuid. > 3. Игра интерпретирует и проверяет токен, и при заходе на сервер передаёт **наш > uuid и личный токен** (полученный **только для этого сервера**). > 4. Сервер проверяет валидность uuid+личного токена **сам** и, если ок, пускает в игру. > **Сервер лаунчер не спрашивает. Ролей от лаунчера не получаем.** > 5. **Внутри игры пароля нет и логин-окна быть не должно.** > 6. Если сессия просрочилась в игре — **reload-token** продлевает сессию на час, сам > reload-token живёт 1.5 часа. Он **только внутри игры** и не влияет на reload-token > аккаунта (чтобы не логиниться в лаунчер каждый раз). **Что сделано у нас:** - **Токен**: `base64url(payload).base64url(HMAC-SHA256(payload))`, payload = `{uuid, nick, aud, exp, jti, typ}`; `typ` = `session` | `reload`. Ключ — в конфиге сервера (`--token-key`), общий с auth-сервером. Класс `rsx-auth/GameToken`. - **Сессия**: 1 час. **Reload-токен**: 1.5 часа, выдаётся вместе с сессией; пакет `SessionReload` → продление на час + новый reload-токен. - **Сервер** проверяет подпись, аудиенс (свой сервер), срок и совпадение uuid — сам, без обращения к лаунчеру. HTTP-запрос `/auth/validate` из сервера убран. - **Клиент**: окно ввода пароля **убрано совсем** (нет ни полей, ни кнопки Connect); ник берётся из токена; клиент сам перезапрашивает сессию за 5 минут до конца. - **Для локальной разработки**: сервер с `--dev-token <аккаунт>` выдаёт свой токен и пишет его в `/dev-token.txt`; клиент берёт токен оттуда. ### 2.12 Права админа и F3+B (сделано) - **Список — свой, у сервера**: `/admins.txt` (по строке на аккаунт), перечитывается каждые 5 секунд → **права снимаются на лету**. Лаунчер про роли ничего не сообщает. - Пакет `AdminState` — сервер шлёт при входе и при каждом изменении. - **Ванильные блоки мира ломает только админ** (режим игры прав не даёт) — правило п. 2.3. - **F3+B — только для админов.** Без прав показывается «only an administrator may look at the boxes». Наш отладочный рендер (`/rsx hitboxes`) включается тем же F3+B. Права сняли посреди просмотра → и ванильные хитбоксы, и наш рендер гаснут сразу. - Отладочный рендер показывает и коробки структур, и зоны игрока (голова красная, тело жёлтое, ноги синие), и области LOD. ### 2.13 Декомпил ремейка лежит на диске `G:\src-decoded` (5207 файлов, строки расшифрованы), также `G:\src`, `G:\builds\v31\src{,-decoded}` и `G:\decompiled-rustex`. Это **исходники клиента ремейка** — читаемый Java. Значит, поведение клиента можно смотреть, а не угадывать: конфиг оружия с отдачей (`recoilYawMin`, `recoilPitchMax`, `ADSScale`, `movementPenalty`, `shotsUntilMax`, `aimconeCurve`), схема viewmodel (`sway`, `bob`, `crouch`, `lower`, `freeLook`), формат данных — Unity-подобные ключи (`m_Name`, `MonoBehaviour`), читаются через `ctkmb`. **Важно:** сами **значения** приходят с сервера (Unity-ассеты), в клиенте есть только схема и значения по умолчанию. Урон, отдача и спрей огнестрела — серверные данные; в клиенте только магазин, тип патрона, зум ADS, прочность и reach. --- ### 2.14 Интерфейс в стиле ремейка Интерфейс должен быть не ванильным, а в стиле ремейка: его панели, его иконки, его шрифт. Ассеты лежат в `assets/rustex/` (вне git, 1.65 ГБ). **Что есть у ремейка:** - **Атлас иконок интерфейса**: `gamejar/assets/rustex/icons/atlas.png` (2048x2048, плитка 64x64, формат MTSDF) и `atlas.json` с UV каждой иконки. В атласе 100 иконок, из них нужные нам: `heart`, `heart-outline`, `lungs`, `oxygen`, `radiation`, `metabolism-eat`, `metabolism-health`, `metabolism-water`, `hot`, `cold`, `bleeding`, `bite`, `shield-alert`, `inventory`, `craft`, `store`, `trash`, `grid`, `lock`, `check`, `plus`, `minus`, `filter-remove`, `search`, `person`, `chat`, `dollar`, `star_circle`. - **Иконки предметов**: `legacy/minecraft/textures/models/misc/*.png` — 133 штуки, каждая 4x4 и это SDF-маска (значение расстояния в альфе), поэтому рисуется своим шейдером и остаётся резкой на любом размере. Имена у ремейка нынешние: `stone_axe`, `metal_pickaxe`, `sulphur_ore`, `hqm_ore`, `scrap`, `wood`, `rock`, `blue_barrel` и так далее. - **Скины игрока**: `gamejar/assets/rustex/textures/player/player.png` и `teammate.png`; `legacy/minecraft/textures/models/misc/` — тоже варианты. - **Шрифт**: `gamejar/assets/rustex/font/`. - **Панели**: `gamejar/assets/rustex/textures/other/rulespanel.png`. **Главная сложность — иконки предметов.** Вся наша таблица предметов (`items.csv`) взята из `legacy/minecraft/models/stacks.json`, то есть из версии ремейка 2017-2020, а нынешний ремейк (тот, что в `gamejar/`) показывает предметы **трёхмерными моделями** (`nextgen/models/`, 91 штука), и обычных иконок у него почти нет: в `gamejar/assets/rustex/textures/items/` их всего 13. Старые иконки лежат в `legacy/minecraft/textures/models/misc/` (133 штуки), но это **SDF-маски 4x4** — расстояние до края в альфе, их рисуют своим шейдером и они остаются резкими на любом размере, но в 4x4 пикселях подробностей мало. И ещё: имя файла иконки не совпадает со старым `rusticon` из таблицы (`hatchet` против `metal_axe`), совпадают только 9 из 218 — нужен свой список соответствия «предмет -> иконка». **Вывод:** сначала рисуем HUD (полоски жизни/сытости/воды и значки состояний) — там иконки есть и в нынешнем виде, из атласа. Иконки предметов в инвентаре потом: либо свой список соответствия плюс SDF-шейдер на масках 4x4, либо рендер трёхмерной модели предмета, как это делает ремейк (у нас уже есть свои модели `.obj` и загрузчик к ним — см. 2.15). **Что делать по шагам:** 1. Скрипт `tools/prepare-ui-assets.py`: копирует атлас, `atlas.json` и иконки предметов в `game-fork/assets/rustex/` (вне git) и пишет список соответствия «предмет -> иконка» в `rsx-protocol/src/main/resources/items/`. 2. Клиент: `RsxIcons` — грузит атлас и иконки, отдаёт UV и текстуру; `RsxSdfIcon` — шейдер, который превращает SDF-маску в картинку. 3. Хотбар и инвентарь: свои экраны в стиле ремейка, 7 мест брони по два слоя, полоски жизни/сытости/воды на иконках атласа. 4. Крафт -> дерево верстака -> исследование -> колесо построек. Сейчас в клиенте пакета `INVENTORY` нет вовсе: инвентарь не показывается. --- ## 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. Фундамент предметов и инвентаря (следующий) - [x] **База предметов выгружена из ремейка**: `rsx-protocol/src/main/resources/items/items.csv` (218 предметов) + `sounds.csv` (505 событий) + описания в `assets/rustex/data/item-texts.json`. Инструменты: `tools/extract-rustex-assets.py`, `tools/extract-items.py`, `tools/extract-sounds.py`. - [ ] `ItemType`: id, имя, класс инструмента, класс ресурса, прочность, урон по частям тела, скорость сбора, `bench`, `knownByDefault`, `researchScrap`, `techTreeBench`, `techTreeScrap`, `techTreeParent`, `admin`, рецепт. - [ ] **Данные предметов — из п. 1.6/1.7** (база ремейка): держать таблицей, чтобы числа не расходились с планом. - [ ] Модель знания: `knownByDefault` у типа + `knownRecipes` у игрока; стол исследований выдаёт физический чертёж, изучение открывает рецепт навсегда (п. 1.3); тех-дерево открывает рецепт лично и бесплатно после оплаты скрапа. - [ ] `ItemStack`: тип + количество + прочность + `ItemData` (свой ключ→значение). - [ ] `Inventory`: слоты, хотбар, что в руках. **Сервер — источник истины.** - [ ] Реестр предметов + протокол `Inventory` / `InventorySlot`. - [ ] Клиент: свой реестр + свои текстуры + свой рендер предмета в руке и в слоте (наши предметы не ванильные `IItem`). - [ ] **Текстуры предметов — временные** (взяты из ремейка как заглушки, иконки из атласа `icons/atlas.png`). **ПОМЕТКА: заменить на свои.** - [ ] Стартовый набор: **камень** — решение проекта (в Rust официально не документировано, п. 1.1); выдаём в первый слот хотбара, отдельным флагом конфига. Критерий готовности: игрок заходит, получает камень в руку, видит его в хотбаре и в руке; сервер знает, что у него в руках. ### Шаг 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`. Деревья/камни/руда — **узлы**, не блоки мира. - [ ] `ResourceNode`: класс ресурса, **HP = запас**, **метка** (дерево ×1→×2, руда ×1→×3), дроп. Запасы: дерево 500/750/1000, камень 750, металл 500, сера 200; урон за удар — п. 1.6; последний удар отдаёт остаток. - [ ] Сбор: попадание инструментом → урон по классу ресурса × метка → разрушение → дроп. - [ ] **Дороги** (п. 1.11): сетка 3–4 полос + кольцо, выравнивание рельефа, покрытие, список сегментов для спавна. - [ ] **Мусорка** (п. 1.10): 2–4 бочки (серая/синяя/красная) + 0–2 ящика еды; лут-таблицы; разрушаемые бочки; после опустошения исчезновение через 60–180 с и респавн на другом участке дороги ближе к игрокам. - [ ] **Крафт и исследование** (п. 1.3): `CraftingStation` (поставленный верстак), проверка рецепта (уровень верстака + знание + ингредиенты), `ResearchTable` (предмет + скрап → 10 с → **чертёж**), разблокировка в тех-дереве. - [ ] Постройка: игрок ставит **наши** кастомные предметы-конструкции (не блоки мира). Снаппинг и сокеты — п. 1.5 и 1.8; HP и цены по уровням — п. 1.5; аптейп инструментального шкафа и гниение — п. 1.5. - [ ] Растительность и руда в генерации — через шаблоны структур. - [ ] Модель урона по постройкам — **своя**: ударов = HP постройки ÷ урон оружия (п. 5.1). - [ ] Клиент: модель рудного узла (3D + AABB), метки (крестик / горячая точка). Критерий готовности: игрок рубит дерево (7 ударов по метке, 9 без), ломает узел камня за 9 ударов каменной киркой, разбирает мусорку и получает скрап, крафтит верстак 1, исследует предмет на столе и получает чертёж, строит стену. ### Шаг 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. Открытые вопросы ### 5.1 Решено (не обсуждаем заново) | вопрос | решение | |---|---| | **Роли: из лаунчера или свои на сервере?** | **Свои на сервере.** Лаунчер может подсказать роль, но решение — за сервером: админ это свойство конкретного сервера, а не проекта | | **Урон по частям тела** | По таблице п. 1.6: голова ×2, торс ×1, руки/ноги — своей долей у оружия. Общего «общего урона» не вводим | | **Множитель урона по постройкам** | **Своя модель: ударов = HP постройки ÷ урон оружия.** Без скрытого множителя. Дерево (250) от камня (10 урона) — 25, камень (500) — 50, лист (1000) — 100, броня (2000) — 200. Зеркальные 37/74/295/589 — не воспроизводим, но и не мешают: считаем от HP | | **Бронедверь** | **1000 HP** (игровые зеркала; fandom 800 — устарело) | | **Прочность инструментов** | **Из базы ремейка**: камень 100, каменные 160, топор 300, молот 400, ледяная кирка 1500. Ремонт = 20 % рецепта | | **Джунгли, лоза, биомы** | **Не делаем.** Мир один, джунглей нет → **лозы (twig) у нас тоже нет**: выкинута из HP-таблицы, цен, таймеров гниения и правил шкафа | | **Строительные детали и сетка** | Не «свободно и без сетки»: **сетка мира не важна**, но есть **строительная сетка** (фундамент 3×3) и привязка внутренних блоков к уже поставленным строительным. Слова «не привязываясь к сетке мира» — про сетку мира, не про строительную | | **Исследования** | **Версия после 2020**: два пути — стол (предмет + скрап → чертёж) и тех-дерево верстака (125/250/500, ветки с предками, разблокировка личная) | | **Тех-дерево** | **Делаем**, с ветками и предками (не плоский список) | | **Баланс предметов** | **Из ремейка** (`items.csv`, 218 шт), а не из вики: у нас есть все характеристики, и цифры совпадают с ощущением «7–10 ударов на дерево». Вика — только для сверки | | **Скрап на первом срезе** | Даёт **мусорка на дороге** (серая бочка, 1–15 скрапа) — лутбоксы отложены, а прогрессия исследования скрап закрывать должна уже сейчас | | **Дороги** | **Сетка 3–4 полос + кольцо** по берегу; сегменты дороги — точки спавна мусорки | | **Вид узлов** | **Руда** — своя 3D-модель + AABB (модели `ore/*` из ремейка); **деревья** — пока блоки мира, у которых сервер держит HP и запас | | **Ассеты** | Временная база из ремейка: `assets/rustex/` (1.65 ГБ), иконки из атласа, звуки из реестра. **ПОМЕТКА: заменить на свои** | ### 5.2 Нужно решение (блокирует реализацию) 1. ~~**Крафт упирается в лутбоксы.**~~ **Снято:** источник скрапа на первом срезе — **мусорка на дороге** (п. 1.10). Лутбоксы (монументы) остаются на потом. 2. **Фрагменты чертежей для верстаков 2 и 3** (5 Basic / 5 Advanced) — они тоже из лутбоксов. Повторяем или заменяем скрапом, как до 02.10.2025? Пока лутбоксов нет — вопрос отложен. 3. **Скрап как валюта** — цена стола 15–120, цена дерева 125–500. Скрапа с мусорки (1–15 за бочку) хватает, но как быстро — решаем по факту. 4. **Стоимость и время каждого рецепта**, который будем реализовывать — в п. 1.7 есть только по ключевым. Долить по мере надобности. 5. **Огнестрел: урон, отдача, спрей, темп** — в клиенте ремейка этих чисел нет (это серверные данные в Rust-подобных играх), в базе предметов есть только магазин, тип патрона, ADS-зум и прочность. Ищем таблицу по `rweaponid` в коде ремейка (1–21); пока не нашли — берём с официальной вики как страховку. --- ## 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** — сделано: поля исследования и дерева в `ItemType`, числа из таблицы ремейка (`ItemData`), `NodeType`, `TechTree`, 218 предметов в реестре. Не сделано: **клиентский рендер своих предметов** (хотбар и рука) и иконки из атласа. 2. **Шаг B** — сделано: `Dig`/`BreakProgress` в протоколе, проверка досягаемости на сервере, тег `admin` в типах предметов, пакет `Attack` с точкой попадания, клиент шлёт удар (патч `PlayerControllerMP`). Не сделано: узлы в мире (шаг C), трещины на клиенте, серверный боевой код (жизнь, смерть, респавн). 3. **Шаг C** — сделано: `ResourceNode` (HP, запас, метка), `JunkPile` (бочки, ящик с едой, таймер исчезновения), `RoadNetwork` + дороги в генераторе (сетка и кольцо, ровная по ширине), `Knowledge`, `Crafter`, `ResearchTable`, семь слотов брони с данными ремейка, три зоны урона, редактор хитбоксов. Не сделано: мусорка в мире (спавн и респавн у дороги — сам класс `JunkPile` есть, но он не ставится в мир), станции крафта (верстак в мире), постройка по сокетам, клиентский рендер брони. 4. **Шаг D** — сделано: мир-остров 4000×4000 (круг радиусом 1400, море, песок, дороги), спавн на суше, барьер по краю мира. Мир считается один раз и держится на диске; при перезапуске он не пересчитывается. 5. **Шаг E** — транспорт на NIO. 6. **Шаг F** — сделано наполовину: серверный `LodGenerator` (сетка высот и цветов, проба раз в 4 блока, кэш на диске `/lod/`), пакет `LodRegion`, клиентский рендер своим шейдером (`#version 330`) до обычных чанков. Не сделано: Hi-Z и квадродерево (отсечение того, что за спиной), `uCamOffset` (перенос начала координат в камеру), отсечение по пирамиде видимости. 7. **REA** — код ремейка прочитать нельзя без взлома загрузчика (классы помечены `DEADC0DE`), и урон/отдача/спрей огнестрела в клиенте всё равно серверные. Числа взяты с вики (`weapons.csv`). Если формулы понадобятся — импортировать распакованные классы в Ghidra headless и искать дешифратор. ### 6.4 Мелочи, которые легко упустить - **Ассеты ремейка обфусцированы:** каждый файл **XOR-ится одним байтом**, ключ восстанавливается по сигнатуре формата: PNG — `b[0] ^ 0x89`, OGG — `b[0] ^ 0x4F`, JSON — `b[0] ^ 0x7B`. Уже декодировано: `assets/rustex/` (1.65 ГБ, 19 тыс. файлов). Скрипты: `tools/extract-rustex-assets.py`, `tools/extract-items.py`, `tools/extract-sounds.py`, `tools/catalog-remake.py`. **Каталог всего, что есть у ремейка:** `assets/rustex/CATALOG.md` + `catalog.json` (218 предметов, 91 объект nextgen, 553 модели `.obj` (384 оружия, 128 постройки, 36 мебели, 4 руды), 133 иконки, 2004 звука, текстуры монументов и животных, скины игрока в `assets/rustex/player/`). - ⚠️ **Классы ремейка прочитать нельзя без взлома загрузчика.** Классы в `game.jar` помечены `DE AD C0 DE` и зашифрованы своим форматом (не однобайтовым XOR, как ассеты). **Но декомпил лежит на диске** — `G:\src-decoded` (п. 2.9): читать поведение клиента можно, REA не нужен. - **Текстуры предметов — временные** (взяты из ремейка как заглушки, иконки из `assets/rustex/gamejar/assets/rustex/icons/atlas.png`). **ПОМЕТКА: заменить на свои.** - **База предметов** — `rsx-protocol/src/main/resources/items/items.csv` (218 шт, из `models/stacks.json`), описания — `assets/rustex/data/item-texts.json` (543 шт), звуки — `rsx-protocol/src/main/resources/items/sounds.csv` (505 событий). - **Огнестрел** — `rsx-protocol/src/main/resources/items/weapons.csv` (23 ствола): урон, множитель в голову, темп, магазин, перезарядка, разброс (конус прицела), отдача, тип патрона, верстак, цены исследования. Собрано с официальной вики и community-вики; расхождения помечены в колонке `source`. - ⚠️ **Код ремейка прочитать нельзя без взлома.** Классы в `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 даст формулы, а не числа. Числа — из вики. - Пути: `G:\RustNotMC` (репозиторий), `G:\decompiled-rustex` (референс, только читать), `G:\rustexremake` (ремейк: `gamefiles\res`, `gamefiles\game.jar`, `working_dir`). - ⚠️ **`G:\decompiled-rustex` — НЕ источник фактов.** Он копиял community-вику 2017–2020 (отсюда шкала скрапа 20/75/125/500, «урон по постройкам» 9/0.2/0.1, списки верстаков с перемешанными уровнями). Проверять числа по официальной вики Facepunch, по базе ремейка и по истории правок вики (рецепт запроса — в шапке раздела 1). - Скрипты — **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 Дописать в этот файл - [x] Полные таблицы предмет→верстак (п. 1.2, 1.7) и предмет→скрап/чертёж (п. 1.3, 1.7). - [x] Таблица сбора по классам ресурсов (п. 1.6) — **из базы ремейка**. - [x] Список строительных объектов с сокетами (п. 1.8) — пересобран по игровым данным. - [x] Мусорка (п. 1.10) и дороги (п. 1.11). - [x] Что решили по ролям: свои на сервере (п. 2.1, 5.1). - [ ] Стоимость и время каждого рецепта, который будем реализовывать (пока есть по ключевым предметам, п. 1.7). - [ ] Завести в репозитории выгрузку данных оригинала **на дату 06.11.2025** (страницы вики + история правок), чтобы цифры не разъезжались при перечитывании. - [ ] Таблица оружия по `rweaponid` из кода ремейка (REA) — урон, отдача, спрей, темп. - [ ] Модель урона по постройкам — своя: ударов = HP ÷ урон оружия (п. 5.1). --- ## Приложение. История правок этого файла Отдельный разбор: что в прошлой версии плана было неверно и как это проверено. Сохранено, чтобы правки не откатились и чтобы было видно, чему здесь верить. ### П.1 Разбор: что в прошлой версии этого файла было неверно Сверка с эпохой **06.11.2025**. | было в плане | как на самом деле | метка | |---|---|---| | Камень выдаётся первым в хотбаре при спавне | официально **не документировано**; по гайдам 2023–2025 — камень и фонарь. В вики 2020 г. Rock есть и он «Basic» | ❌ | | Камень «не исследуется» | по сути **верно**: рецепт известен по умолчанию. Но цена физического чертежа — **120 скрапа** | ✅ | | Урон по постройкам: лоза 9, дерево 0.2, металл 0.1, броня 0.1 | эти числа взяты **из вики 2018–2020 гг.** (страница Rock), ремейк их скопировал; современная вика их **не публикует**, и с игровым калькулятором рейда они не сходятся. Камнем лозу — **1 удар**, дерево — 37 камней | ⚠️ | | Камень рубит дерево за 2 удара | **~50–70 ударов** (10 дерева за удар) | ✅ | | Кирка копает руду за ~7 ударов | **~47 ударов** (16 руды за удар, 750 камней в узле) | ✅ | | Кирка рубит дерево за 3 удара | в вики 2020 г. — 5 дерева за удар, это **~60–120 ударов** | ✅ | | Дальность камня 1.25 | **1.2** | ✅ | | Скрап по тирам 20 / 75 / 125 / 500 | на 06.11.2025 — **15 / 30 / 60 / 120** по редкости (редкость Common→Very Rare) | ✅ | | «высокоскоростная стрела — 0 скрапа» | **15 скрапа** | ✅ | | «Укреплённое стекло — 50» | Strengthened Glass Window — **30**, Reinforced Glass Window — **60** | ✅ | | Скрап выпадает из построек | **нет**: только ящики, бочки, аирдропы, учёные | ✅ | | Верстак 1: +50 скрапа в рецепте | **без скрапа** (убрали 06.11.2025) | ✅ | | Верстак 2/3: 500 / 1250 скрапа | **фрагменты чертежей**: 5 Basic / 5 Advanced | ✅ | | Всё крафтится 60 с | у каждого предмета **своё** базовое время; правило «+1 уровень → −50 %, +2 → −75 %» **верно** | ✅ | | Верстаки надо исследовать | рецепты верстаков **известны по умолчанию** | ✅ | | Эксперимент на верстаке 75 / 300 / 1000 | механика **2017–2020**, заменена тех-деревом 03.12.2020 | ❌ | | Тех-дерево верстака (в плане отсутствовало) | в оригинале **есть** с 03.12.2020; у нас сознательно **не делаем** (оверхед) | ✅ | | Salvaged Hatchet, Salvaged Pick Axe | таких предметов **нет** ни в 2020, ни сейчас | ❌ | | M16 | M16 в Rust нет; ближайшее — **LR-300** | ❌ | | «Холодильник», «шестерни», «мишень», «нефтезаводка» | **Fridge**, **Gears**, **Reactive Target**, **Small Oil Refinery** | ✅ | | Лист (Sheet Metal) — без HP | **1000 HP** | 🟡 | | Бронедверь 800 HP | **1000 HP** по игровым зеркалам; fandom даёт 800 | 🟡 | | Дверь листовая 250 HP | **250** — подтверждено | ✅ | | Кодовый замок: 100 металла, 4 цифры | **верно** | ✅ | | Гниение: «лоза/дерево — часы, камень/металл — дни» | точные числа: лоза **1 ч**, дерево **3 ч**, камень **5 ч**, лист **8 ч**, броня **12 ч**; внутри здания ×10 | 🟡 | | Столбы и правила про них | **столбов в Rust нет** с 01.02.2018 (обновление 196) | ✅ | | «Ставятся свободно, не по сетке мира» | детали садятся **по сетке** (фундамент 3×3) | 🟡 | | Инструменты L1: «Salvaged Hammer, Salvaged Hatchet, Pick Axe» | это **Salvaged Hammer + Hatchet + Pick Axe** (металлические) — ошибка разбора списка | ✅ | | Списки «что открывает уровень» | L1/L2/L3 были перемешаны (M16, огнемёт, F1, 8-кратник — это L2/L3) | ✅ | | Джунгли | биом появился **01.05.2025** («Jungle Update»); в проекте не делаем | ✅ | | Тех-дерево: разблокировка за скрап | на 06.11.2025 «tech tree tax» **убран** — в верстаке разблокировка бесплатна; 15/30/60/120 — цена чертежа на столе | ✅ О-нов | | Броня: взрыв 50–100 % у шлемов | вики ошибается: Bucket 8 %, Riot 8 %, Bone 7 %, Heavy Plate — не подтверждено | ⚠️ | ### П.2 Спорные и неподтверждённые места (см. п. 5) 1. **Прочность инструментов (HP).** В вики нет такого поля ни у одного предмета; шкала 0…100 — вывод из цены ремонта. Если нужна точность — брать из игровых данных. 2. **Механика исследования** (10 с, уничтожение предмета, продолжение при закрытом интерфейсе, звук) — **только community-вика**, официальной нет. Если это основа проекта — проверить в живой игре. 3. **Множитель урона оружия по постройкам** — не опубликован нигде: 250 HP / 10 урона = 25 ударов, а игровые зеркала дают 37. Старая вики (2018–2020) давала «лоза 9, дерево 0.2, металл 0.1» — но с калькулятором рейда она тоже не сходится. Нужна своя модель. 4. **HP броневой двери** — 1000 (игровые зеркала) против 800 (fandom; так же и в 2020). 5. **HP базовых блоков** — в официальной вики по ним страниц нет вообще, числа взяты из игровых зеркал (rusthelp / rustclash), которые сходятся. 6. **Радиус инструментального шкафа** — 50 м (официальная вика) против 16 м (старая вики, статья Building); «50 meter radius» в инфобоксе вики сама вики называет своей ошибкой — но оно же стоит на официальной странице предмета. 7. **Таймеры гниения** — 1/3/5/8/12 ч (официальная вика, современные гайды) против 1/2/4/8/12 ч (вики 2020 г.): похоже, дерево и камень перенастраивали после 2020. 8. **Стартовый набор** (камень и фонарь) — официально не документирован; в вики 2018 г. у Rock написано *«Every time you spawn this item will be present as the first item in your toolbar»*, но это может быть остаток Legacy-описания. 9. **Порядок и ветки тех-дерева** — цены есть, структура только community. 10. **Столы исследований на монументах** — список и разница в поведении только community; список может быть устаревшим. 11. **Правила стабильности второго этажа** — ни один доступный источник не описывает. 12. **Сброс таймера гниения** (открытие двери с замком) — только community, радиус эффекта неизвестен. 13. **rust.wiki.gg недоступна** для автоматической проверки (401 на все запросы) — часть спорных мест может ею опровергаться; при сомнениях проверять руками. 14. **Обновления после 06.11.2025** (апгрейд верстака 07.05.2026, Livestock 01.10.2026) по условию задачи не проверялись. 15. **Вики Facepunch — снимок от 19–20.02.2026.** Данные предметов там сгенерированы массово в феврале 2026 (до них страницы велись вручную и были местами протухшие). То есть «текущая вика» = игра на ~февраль 2026, а не сегодня. Для нашего среза (11.2025) это удачный факт: почти все числа совпадают. 16. **Страницы вики на 06.11.2025 местами показывали протухшее** (например, верстак 1 ещё со «50 Scrap», хотя скрап убрали в тот же день). Поэтому «что вики говорила тогда» ≠ «что было в игре тогда»; верить надо девблогам и ченджлистам. 17. **Колонка «взрыв» в таблице Protection вики — с ошибками** (см. п. 1.6): верны только 8 % / 8 % / 7 % для Bucket / Riot / Bone Armor и 30 % для Hazmat. 18. **HP деревянной двойной двери** — подтверждён только игровыми зеркалами (200); датированной вики нет (на странице в 2017 г. стоял текст «has X health»). 19. **Взрыв у Heavy Plate** (8/12/12 % против 17/17/17 % против 100 %) — не подтверждён. ### П.3 Правки 21.10.2026 (база из ремейка) Что поменялось после того, как выгрузили ассеты и базу предметов ремейка. | было в плане | как на самом деле | метка | |---|---|---| | Сбор по вики: камень 10 дерева / 5 руды, топор 30, кирка 30; узлы 750/500/200 | **База ремейка**: камень 50 дерева / 35 руды, каменный топор 80, топор 85, каменная кирка 80, кирка 100. Удары: дерево 750 ÷ 85 = **9** (с меткой ≈ 6–7) — ровно «7–10 ударов», которые и ждал игрок | ✅ | | «Тех-дерево не делаем, оно бесплатно с 06.11.2025, колонка 125/250/500 устарела» | **Официальная вики показывает обе цены**: «Research Table» (15/30/60/120) и «Workbench Level N – Tech Tree» (125/250/500). Это community-вика была неправа | ✅ | | Исследование только через стол | **Два пути**: стол (нужен сам предмет → чертёж) и тех-дерево (только скрап, личная разблокировка) | ✅ | | В мире есть лоза (twig): HP 10, цены, гниение 1 ч, «лозовые полы» | **Лозы у нас нет** — она из джунглей, а джунглей нет. Выкинута отовсюду | ✅ | | Скрап только из лутбоксов; прогрессия не запускается | **Мусорка на дороге** даёт скрап (серая бочка, 1–15), компоненты (синяя) и топливо (красная) | С | | Узлы-руда — как в Rust | Руда — **3D-модель + AABB** (модели `ore/*` из ремейка), деревья — пока блоки мира с серверным HP | С | | Дорог в мире нет | **Сетка 3–4 дорог + кольцо** по берегу; сегменты дороги — точки спавна мусорки | С | **Что выгружено из ремейка** (инструменты в `tools/`, результат в `assets/rustex/`): 1.65 ГБ, 19 тыс. файлов. Ассеты зашифрованы одним байтом (ключ по сигнатуре формата), декод делает `extract-rustex-assets.py`. Не прочитались 553 `.obj`, 106 `.rrs`, 113 `.nbt` — у них другой шифр, нужен разбор кода (REA). **Что теперь не подтверждено:** урон/отдача/спрей/темп огнестрела — в клиенте ремейка этих чисел нет (серверные данные), есть только магазин, тип патрона, ADS-зум, прочность, reach и `rweaponid` (1–21). Ищем таблицу в коде; до этого — цифры с официальной вики.