# Конфигурация сервера

### Конфигурация сервера

Наш сервер работает на мощном оборудовании, чтобы обеспечить стабильную производительность даже при большом количестве игроков (за сезон нас посетило более 3500 человек!).

* **Процессор**: AMD Ryzen 9 9950X, разогнан до 5.7 ГГц с водяным охлаждением.
* **Оперативная память**: 64 ГБ.
* **Хранилище**: 1 ТБ NVMe SSD от Samsung.
* **Операционная система**: Debian 11.
* **Местоположение**: Россия, Москва.

### Ядро сервера

Мы используем **Purpur** — оптимизированное ядро, которое сочетает производительность и ванильное поведение Minecraft. Настройки ядра в этой документации относятся только к **миру построек**. В **мире ферм** изменений не проводилось.

### Ограничения по мобам

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

* **Мирные мобы**: до 25.
* **Монстры**: до 25.
* **Жители**: до 25.

Эти лимиты помогают избежать лагов и вылетов. Если вы строите фермы или механизмы, следите за количеством мобов в чанке, чтобы не превышать указанные значения.

#### Особенности работы с жителями

Жители могут создавать нагрузку на сервер, особенно при их большом количестве. Чтобы минимизировать это, в ядре Purpur используется функция **lobotomize**, которая "лоботомирует" жителей, если они не могут двигаться (например, застряли в блоках или узких пространствах). Лоботомированный житель теряет профессию (VillagerProfession.NONE), но сохраняет возможность торговли.

**Код функции lobotomize:**

```java
if (!this.isAlive() || !this.world.isClient) {
    // Lobotomize the villager if it cannot move
    this.setVillagerData(this.getVillagerData().withProfession(VillagerProfession.NONE));
}
```

**Как избежать лоботомии жителей:**

1. Обеспечьте жителям достаточно пространства для передвижения (не менее 2x2 блоков).
2. Избегайте узких проходов и тесных помещений.
3. Если житель уже лоботомирован, переместите его в просторное место. Если это не помогает, замените его на нового жителя с той же профессией.

**Почему мы используем лоботомию?**

Лоботомия снижает нагрузку на сервер, сохраняя возможность использовать жителей без жестких ограничений их количества. Это компромисс между производительностью и свободой игроков.

### Конфигурация сервера

Ниже приведены основные настройки из конфигурационных файлов сервера. Они определяют спавн, деспавн и поведение мобов, а также другие технические параметры.

#### bukkit.yml

[Подробное описание параметров](https://bukkit.fandom.com/wiki/Bukkit.yml/ru)

```yaml
spawn-limits: # Количество мобов на игрока
  monsters: 20
  animals: 5
  water-animals: 2
  water-ambient: 2
  water-underground-creature: 3
  axolotls: 3
  ambient: 1
ticks-per: # Количество тиков на спавн мобов
  animal-spawns: 400 # 20 сек
  monster-spawns: 10 # 0.5 сек
  water-spawns: 100 # 5 сек
  water-ambient-spawns: 400 # 20 сек
  water-underground-creature-spawns: 400 # 20 сек
  axolotl-spawns: 400 # 20 сек
  ambient-spawns: 400 # 20 сек
```

#### spigot.yml

[Подробное описание параметров](https://www.spigotmc.org/wiki/spigot-configuration/)

```yaml
world-settings:
  default:
    hanging-tick-frequency: 200 # Проверка декоративных сущностей
    arrow-despawn-rate: 300 # 15 сек
    trident-despawn-rate: 1200 # 60 сек
    mob-spawn-range: 3 # Радиус спавна мобов (в чанках)
    entity-activation-range: # Радиус активации сущностей
      animals: 24
      monsters: 24
      raiders: 48
      misc: 8
      water: 8
      villagers: 20
      flying-monsters: 48
    tick-inactive-villagers: false # Инактивные жители не тикают
    entity-tracking-range: # Радиус видимости сущностей
      players: 128
      animals: 48
      monsters: 48
      misc: 32
      other: 64
```

#### paper-global.yml

[Подробное описание параметров](https://docs.papermc.io/paper/reference/global-configuration)

```yaml
item-validation:
  book-size:
    page-max: 1280 # Ограничение размера книг (в байтах)
unsupported-settings:
  allow-headless-pistons: true
  allow-permanent-block-break-exploits: true
  allow-piston-duplication: true
  perform-username-validation: true
```

#### paper-world-defaults.yml

[Подробное описание параметров](https://docs.papermc.io/paper/reference/world-configuration)

```yaml
chunks:
  auto-save-interval: 6000 # Автосохранение чанков
  delay-chunk-unloads-by: 10s # Задержка выгрузки чанков
  entity-per-chunk-save-limit:
    area_effect_cloud: 8
    arrow: 16
    dragon_fireball: 3
    egg: 8
    ender_pearl: 8
    experience_bottle: 3
    experience_orb: 16
    eye_of_ender: 8
    fireball: 8
    firework_rocket: 8
    llama_spit: 3
    potion: 8
    shulker_bullet: 8
    small_fireball: 8
    snowball: 8
    spectral_arrow: 16
    trident: 16
    wither_skull: 4
  max-auto-save-chunks-per-tick: 8
  prevent-moving-into-unloaded-chunks: true
collisions:
  max-entity-collisions: 4 # Лимит столкновений сущностей
entities:
  behavior:
    pillager-patrols:
      disable: true
  spawning:
    creative-arrow-despawn-rate: 400
    despawn-ranges:
      ambient: { hard: 54, soft: 32 }
      axolotls: { hard: 54, soft: 32 }
      creature: { hard: 54, soft: 32 }
      misc: { hard: 54, soft: 32 }
      monster: { hard: 54, soft: 32 }
      underground_water_creature: { hard: 54, soft: 32 }
      water_ambient: { hard: 54, soft: 32 }
      water_creature: { hard: 54, soft: 32 }
    duplicate-uuid:
      mode: SAFE_REGEN
      safe-regen-delete-range: 32
    iron-golems-can-spawn-in-air: false
    non-player-arrow-despawn-rate: 400
    per-player-mob-spawns: true
fixes:
  disable-unloaded-chunk-enderpearl-exploit: true
  fix-curing-zombie-villager-discount-exploit: true
hopper:
  cooldown-when-full: true
misc:
  redstone-implementation: ALTERNATE_CURRENT
  update-pathfinding-on-block-update: false
spawn:
  keep-spawn-loaded: false # Спавн-чанки не прогружаются 24/7
tick-rates:
  behavior:
    villager:
      validatenearbypoi: -1
  container-update: 1
  grass-spread: 4
  mob-spawner: 2
  sensor:
    villager:
      secondarypoisensor: 40
unsupported-settings:
  fix-invulnerable-end-crystal-exploit: true
```

#### pufferfish.yml

[Подробное описание параметров](https://docs.pufferfish.host/setup/pufferfish-fork-configuration/)

```yaml
enable-suffocation-optimization: true
enable-async-mob-spawning: true
projectile:
  max-loads-per-tick: 10
  max-loads-per-projectile: 8
dab:
  enabled: true
  start-distance: 12
  max-tick-freq: 20
  activation-dist-mod: 7
  blacklisted-entities:
    - VILLAGER
inactive-goal-selector-throttle: true
misc:
  disable-method-profiler: true
  disable-out-of-order-chat: false
enable-async-entity-tracker: true
enable-async-pathfinding: true
```

### Механика спавна и деспавна мобов

Мы используем ванильную механику спавна мобов с одним изменением: значение **Hard Despawn** уменьшено с 128 до 54 блоков. Это снижает нагрузку на сервер и улучшает производительность.

#### Как работает спавн мобов:

* **Красная сфера** (24–54 блока от игрока): зона появления мобов.
* **Зеленая сфера** (до 24 блоков): безопасная зона, мобы не появляются.
* **Цилиндр** (до 32 блоков): мобы активны и взаимодействуют с миром.
* **32–54 блока**: мобы тикают медленнее.
* **За пределами 54 блоков**: мобы мгновенно исчезают.

<figure><img src="/files/R8OEexeoiizYOgPTs1Fm" alt=""><figcaption></figcaption></figure>

#### Почему фермы из старых версий работают медленнее?

После обновления до версии 1.19 высота мира изменилась (с Y0–Y265 на Y-64–Y320). Это повлияло на спавн мобов, так как игра теперь проверяет больше блоков для спавна. Фермы, построенные на высоте Y0, стали менее эффективными из-за дополнительных 64 блоков ниже.

**Решения проблемы:**

1. **Перестройте ферму** на высоте Y-64 (самый низкий уровень мира).
2. **Очистите периметр** от Y-64 до Y0, оставив только воздух.
3. Примите, что спавн мобов на многопользовательских серверах менее эффективен из-за механики **per-player-mob-spawns**.

**Рекомендации для ферм:**

* **Большой периметр**: очищайте все возможные места спавна вокруг фермы.
* **Фермы эндерменов**: стройте на Y-64 для максимальной эффективности.
* **Фермы в Нижнем мире**: располагайте под крышей Нижнего мира, чтобы минимизировать спавн мобов вне платформы.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.vanillasquad.com/drugoe/konfiguraciya-servera.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
