> ## Documentation Index
> Fetch the complete documentation index at: https://rust-co.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Настройка

> Всё, что можно поменять в config/config.lua, простыми словами.

Все настройки лежат в одном файле: `rco-gym/config/config.lua`. Откройте его любым текстовым редактором (подойдёт Блокнот, в VS Code удобнее).

> [!TIP]
>
> Меняйте только то, что идёт после знака `=`. Оставляйте кавычки `'...'`, запятые и скобки точно как есть. После сохранения перезапустите сервер.

## Основное

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Config.Locale` | Язык текстов на экране: `'en'` или `'pt-br'` | `'en'` |
| `Config.Framework` | Оставьте `'auto'`. Пишите `'rsg'` или `'vorp'`, только если скрипт ошибается | `'auto'` |
| `Config.Debug` | Пишет в консоль F8, что делает скрипт, для настройки. Выключите перед открытием для игроков | `false` |
| `Config.UseDistance` | На каком расстоянии (метры) игрок должен стоять от снаряда, чтобы увидеть клавиши | `1.2` |
| `Config.ShowDistance` | В пределах этого расстояния (метры) от середины зала ставятся его снаряды и видно, как тренируются другие | `60.0` |

### Другой язык

Скопируйте `locales/en.json`, переведите текст справа в каждой строке, сохраните, например, как `locales/ru.json` и поставьте `Config.Locale = 'ru'`. Всё непереведённое показывается на английском.

## Залы

`Config.Gyms` — список всех залов вашего сервера. Зал в Страуберри уже готов и идёт первым, со всеми 16 местами. Можно добавить сколько угодно залов в любом месте карты и ставить каждое место отдельно.

```lua theme={"dark"}
Config.Gyms = {
    {   -- зал в Страуберри (уже готов)
        name = nil,
        blip = { coords = vector3(-1836.6, -407.0, 162.39), sprite = 'blip_shop_market_stall' },
        building = 'strawberry',
        stations = {
            { type = 'supino', coords = vector4(-1835.6349, -404.0478, 162.3875, -125.0) },  -- Жим лёжа
            -- ... остальные 15 мест
        },
        board = vector4(-1836.59, -402.61, 162.39, 55.0),
    },
    {   -- ваш собственный зал
        name = 'Saint Denis Gymnasium',
        blip = { sprite = 'blip_shop_market_stall' },
        building = 'props',
        stations = {
            { type = 'supino', coords = vector4(x, y, z, heading) },
            { type = 'halteres', coords = vector4(x, y, z, heading) },
            { type = 'tapete', coords = vector4(x, y, z, heading) },
        },
        board = vector4(x, y, z, heading),
    },
}
```

| Параметр | Что делает |
| - | - |
| `name` | Название значка зала. `nil`: «Спортзал» на языке игрока |
| `blip` | `{ coords = vector3(...), sprite = '...' }`: где стоит значок и какой он (имя из значков игры). Без `coords` значок ставится в середину зала. `false`: без значка |
| `building` | `'strawberry'`: здание зала, которое идёт с ресурсом, снаряды уже внутри. `'props'`: скрипт сам ставит снаряды, твёрдые, туда, где вы поставили места (на улице, в здании, в другом MLO) |
| `stations` | Места для тренировки, у каждого свой `type` и свои `coords` |
| `board` | Доска рекордов: где игрок стоит, чтобы её читать, лицом к ней. Доска вешается на стену в 1 м перед ним. Без этой строки доски нет |

### Собрать зал по частям

1. Скопируйте запись Страуберри, дайте копии `name` и поставьте `building = 'props'`.
2. Оставьте только строки нужных мест. Скопируйте строку, чтобы одно место было дважды (две скамьи: две строки `supino`).
3. Для каждого места встаньте туда, где игрок будет им пользоваться, лицом туда, куда он должен смотреть, и возьмите свою позицию и направление инструментом координат, которым уже пользуется ваш сервер. Запишите как `vector4(x, y, z, heading)`.
4. Перезапустите сервер.

Координаты — это позиция самого игрока, стоящего на полу: берите их пешком, не на лошади и не в транспорте.

### Типы мест

| Тип | Место | Нужная площадь (метры, ширина × длина в направлении взгляда игрока) |
| - | - | - |
| `supino` | Жим лёжа | 1,9 × 2,7, скамья позади места игрока |
| `agachamento` | Стойка для приседаний | 1,9 × 1,6 |
| `halteres` | Стойка с гантелями (сгибания и жим) | 3,7 × 1,3, стойка в 0,4 м впереди |
| `tapete` | Коврик (отжимания, пресс, приседания) | 1,1 × 1,9 |
| `barra_fixa` | Турник | 2,0 × 2,3, высота 2,6 м: потолок от 2,7 м |
| `paralelas` | Брусья | 0,9 × 2,5, высота 1,15 м |
| `escada` | Горизонтальная лестница | 1,5 × 3,2 (от 0,5 м позади места до 2,7 м впереди), высота 2,3 м: потолок 2,6 м |
| `argolas` | Кольца | 1,2 × 1,2. Висят на точке в 4,0 м над полом |
| `corda` | Канат | 1,0 × 1,2. Канат висит на точке в 4,0 м над полом, подъём доходит до 3 м |
| `saco` | Боксёрский мешок | 1,2 × 1,6. Висит на точке в 4,0 м над полом |
| `bola` | Пневмогруша | 1,0 × 1,3. Её платформа крепится к стене в 0,95 м перед игроком (на высоте 1,4–1,9 м) |
| `polias` | Блочный тренажёр (тяга сверху, тяга к поясу, грудь) | 1,0 × 1,6, две стойки в 0,75 м перед игроком и позади него, высота 2,1 м |
| `barra_no_chao` | Штанга на полу (взятие и жим, сгибания со штангой) | 1,9 × 1,6 |
| `medicine_ball` | Медбол вдвоём | 0,8 × 4,0: партнёр ловит в 3 м впереди |
| `corda_de_pular` | Скакалка | 1,4 × 1,5 |

> [!TIP]
>
> Оставляйте около 0,7 м между местами. У каждого упражнения своя камера в 1,5–3,5 м от места, обычно спереди и сбоку: стена в этом месте ставит камеру за стену. Кольца, канат и боксёрский мешок лучше смотрятся под балкой или потолком на высоте около 4 м.

> [!NOTE]
>
> `cam = 2` в строке скамьи включает другую камеру скамьи, с другой стороны. Её использует вторая скамья зала в Страуберри.

### Убрать зал в Страуберри

Удалите (или закомментируйте) его запись в `Config.Gyms`: его места и значок пропадут. Здание в Страуберри входит в файлы ресурса (папки `stream/mlo` и `stream/placas`), и никакая настройка не отключает его загрузку. Чтобы вернуть дом к исходному виду игры, удалите и эти две папки.

## Клавиши

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Config.ExerciseKeys` | Одна клавиша на каждое упражнение снаряда, по порядку | **E**, **G**, **F** |
| `Config.RepKey` | Главная клавиша мини-игр и старт в выборе веса | **ПРОБЕЛ** |
| `Config.GameKeys` | Остальные клавиши мини-игр: влево, вправо, вверх, вниз. Влево и вправо также выбирают вес и листают доску рекордов | **A**, **D**, **W**, **S** |
| `Config.LeaveKey` | Заканчивает подход и уходит со снаряда, закрывает выбор веса и доску рекордов | **X** |

> [!NOTE]
>
> Клавиши записываются как хэши управления игры (например, `0xCEFD9220`), а не буквами: хэш каждой клавиши есть на странице [Клавиши](https://rust-co.mintlify.site/ru/keys.md). В выборе веса и на доске рекордов работают также стрелки и **Esc**.

## Мини-игры

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Reps` | Повторений в подходе. Подход заканчивается сам после них | `10` |
| `Ease` | Каждое окно времени и зона попадания умножаются на это: `1.3` легче, `0.8` сложнее | `1.0` |
| `Pause` | Секунды, которые результат держится на экране до следующего раунда | `0.7` |
| `KeyLag` | Секунды, за которые нажатие доходит до экрана. Время судится на столько раньше | `0.035` |
| `HeavyLoad` | С максимальным весом игрока окна уже на эту долю (начиная с половины максимального веса) | `0.2` (20%) |
| `Tired` | С полностью уставшей группой мышц окна уже на эту долю | `0.15` (15%) |
| `LightLoad` | Лёгкий подход (половина максимального веса или меньше — разминка) во столько раз легче | `1.15` |

Всё это внутри `Config.Minigame = { ... }`.

## Сила

Внутри `Config.Progression = { ... }`:

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `MaxLevel` | Максимальный уровень каждой группы мышц | `50` |
| `XpForMax` | Опыт, нужный группе для максимального уровня (примерно 50 часов тренировки этой группы) | `17500` |
| `Curve` | Насколько каждый уровень тяжелее предыдущего. `1` = все уровни одинаковые | `1.5` |
| `XpPerRep` | Опыт за одно хорошее повторение с хорошим весом | `1.0` |
| `SecondaryShare` | Доля, которую получают другие группы упражнения | `0.33` |
| `PartnerShare` | Доля, которую получает страхующий или партнёр по медболу за каждое хорошее повторение тренирующегося | `0.5` |
| `RecordXp` | Бонус за то, что побил свой рекорд в упражнении | `25` |
| `MinRepGap` | Секунды: повторения быстрее этого не засчитываются | `1.2` |
| `MinReps` | Хороших повторений нужно, чтобы подход засчитался. Подход, брошенный раньше, ничего не даёт: ни опыта, ни рекорда, ни усталости | `5` |
| `EasyShare` | Доля опыта у самых лёгких упражнений (`1` = весь): горизонтальная лестница (`escada`, переход стоит 8 повторений, значит 2) и лазание по канату (`corda`) | `{ escada = 0.25, corda = 0.5 }` |

### Титулы

`Config.Titles = { 5, 30, 70, 120, 180, 230 }`: сумма уровней пяти групп (от 5 до 250), с которой начинается каждый титул эпохи. Их названия в локалях (`title_1`…`title_6`): Weakling, Beginner, Amateur athlete, Athlete, Strongman / Strongwoman, Champion.

## Усталость, тренировки каждый день и страховка

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Config.Fatigue.PerRep` | Усталость (от 0 до 100), которую хорошее повторение добавляет главной группе. Примерно 7 подходов по 10 её исчерпывают | `1.5` |
| `Config.Fatigue.RestHours` | Часы, за которые полностью уставшая группа отдыхает целиком | `24` |
| `Config.Fatigue.TiredShare` | Опыт, который ещё получает полностью уставшая группа. `1` = усталость не важна | `0.25` |
| `Config.Fatigue.StaminaPerRep` | Стамина самой игры, которую тратит каждое хорошее повторение: после подхода игрок быстрее устаёт на бегу. `0` = выключено | `4.0` |
| `Config.Streak.PerDay` | Дополнительный опыт за каждый день подряд хотя бы с одним подходом | `0.03` (3%) |
| `Config.Streak.MaxDays` | День подряд, на котором бонус перестаёт расти (6-й день: +15%) | `6` |
| `Config.Spotter.Save` | Когда тот, кто на скамье, проваливает повторение, страхующий успевает нажать свою клавишу и спасти его | `true` |

## Разминка и травмы

Внутри `Config.Injury = { ... }`. Лёгкий подход (половина максимального веса или меньше, или упражнение без веса) из `WarmupReps` хороших повторений разогревает игрока на `WarmupMinutes`. Проваленное повторение с большим весом без разминки может потянуть группу мышц: подход заканчивается, и эту группу нельзя тренировать `StrainHours`.

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Enabled` | `false` выключает разминку и травмы | `true` |
| `WarmupReps` | Хорошие повторения лёгкого подхода, которые разогревают | `5` |
| `WarmupMinutes` | Сколько длится разминка | `20` |
| `HeavyShare` | Вес от этой доли максимального и больше считается тяжёлым | `0.85` (85%) |
| `Chance` | Шанс, что проваленное тяжёлое повторение без разминки потянет группу | `0.35` (35%) |
| `StrainHours` | Часы, которые потянутую группу нельзя тренировать | `6` |

## Веса

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Config.WeightUnit` | Как показываются веса: `'lb'` или `'kg'` | `'lb'` |
| `Config.BarWeight` | Пустой гриф. Блины по 5, 10 и 15 lb вешаются на него парами | `20` |

`Config.MaxLoad` задаёт максимальный вес каждого упражнения с инвентарём, в фунтах: первое число на 1-м уровне, второе на максимальном. Максимальный вес игрока растёт между ними с уровнем главной группы упражнения.

| Имя в конфиге | Упражнение | По умолчанию |
| - | - | - |
| `supino` | Жим лёжа | `{ 40, 220 }` |
| `agacha` | Приседания со штангой | `{ 40, 260 }` |
| `dbarra` | Взятие на грудь и жим | `{ 30, 150 }` |
| `rosca_barra` | Подъём штанги на бицепс | `{ 30, 110 }` |
| `rosca` | Подъём гантелей на бицепс (на стойке 5, 10, 15, 20, 25, 30, 40 и 50 lb) | `{ 5, 50 }` |
| `desenv` | Жим гантелей | `{ 5, 40 }` |
| `puxada` | Тяга верхнего блока (стопка грузов идёт шагом 10 lb) | `{ 30, 150 }` |
| `remada` | Тяга блока к поясу | `{ 30, 150 }` |
| `peito` | Сведение на блоке | `{ 20, 100 }` |

## Мышцы на теле

Внутри `Config.Muscle = { ... }`. Внешность остаётся от редактора: зал добавляет мышцы поверх каждый раз, когда редактор надевает тело, и никогда не меняет то, что редактор сохранил.

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Enabled` | `false`: сила всё равно растёт, тело не меняется | `true` |
| `GrowthPerDay` | Доля полного размера, на которую тело может вырасти (или уменьшиться) за день: сначала игрок становится сильным, тело догоняет | `0.2` |
| `Male` / `Female` | Насколько вырастает каждая часть на максимальном уровне (`arms`, `shoulders`, `backWidth`, `back`, `chest`, `thighs`, `calves`; ползунки тела от -1 до 1) | см. файл |
| `Decay` | Группа без тренировок дольше `GraceDays` теряет опыт каждый день, до нуля, и тело возвращается к созданному игроком | `true` |
| `GraceDays` | Дни, которые группа может отдыхать, прежде чем начнёт уменьшаться | `7` |
| `DecayPerDay` | Доля лучшего уровня группы, теряемая в день после дней отдыха (`0.02`: всё за 50 дней) | `0.02` |
| `Pump` | Сразу после подхода проработанная группа показывает эту долю полного размера сверх обычного | `0.25` |
| `PumpMinutes` | Минуты, за которые накачка проходит | `30` |

## За пределами зала

Внутри `Config.Benefits = { ... }`. Каждое выключается значением `0`.

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Melee` | Дополнительный урон кулаками и оружием ближнего боя на максимальном уровне рук, груди и плеч | `0.4` (+40%) |
| `StaminaRanks` | Ранги стамины самой игры, которые выносливость добавляет на своём максимальном уровне (выносливость дают канат, скакалка, мешки и медбол) | `3` |

## Звуки

| Настройка | Что делает | По умолчанию |
| - | - | - |
| `Config.Sound.Volume` | Снаряды, их слышат все рядом. `0` = выключено | `0.8` |
| `Config.Sound.UI` | Тики мини-игры и колокол в конце подхода, только для тренирующегося. `0` = выключено | `0.5` |
| `Config.Sound.Range` | Метры, на которые слышны снаряды | `20.0` |

## Для разработчиков

Другой ресурс может прочитать уровни игрока на сервере, например чтобы сильные персонажи носили больше:

```lua theme={"dark"}
local levels = exports['rco-gym']:GetLevels(source)
-- { chest = 12, back = 9, shoulders = 10, arms = 15, legs = 8, wind = 4 }, или nil, если у игрока не загружен персонаж
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.