Files
RustNotMC/PLAN.md
T

1359 lines
120 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/<id>~history` (список ревизий) и
`~diff:<revision>` (изменения), плюс `~edit` (текущий wikitext). Отсюда берётся
состояние страницы на дату. Для более старой эпохи (до 03.12.2020) — MediaWiki API
fandom: `…/api.php?action=query&prop=revisions&titles=<Page>&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/<id>` даёт блоки
**Craft** (рецепт, требование верстака, «Craft Time by Workbench»), **Research** (цена
физического чертежа + приписка «known by default»), **Weapon Stats** и **Gather Rates**.
Состояние страницы на дату — через `~history` / `~diff:<revision>`; для эпохи до
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 <аккаунт>` выдаёт свой токен и
пишет его в `<world>/dev-token.txt`; клиент берёт токен оттуда.
### 2.12 Права админа и F3+B (сделано)
- **Список — свой, у сервера**: `<world>/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 блока, кэш на диске `<world>/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). Ищем таблицу в коде; до этого — цифры с официальной вики.