1359 lines
120 KiB
Markdown
1359 lines
120 KiB
Markdown
# 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). Ищем таблицу в коде; до этого — цифры с официальной вики.
|
||
|