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

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

Наш сервер работает на мощном оборудовании, чтобы обеспечить стабильную производительность даже при большом количестве игроков (за сезон нас посетило более 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="https://1639357051-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Md61sIy9355-Dt4QFTm%2Fuploads%2FKQCsirha2UkoCDfR4dLN%2Fimage.png?alt=media&#x26;token=f631d4b6-a2be-4dc9-af7a-3694c6a966a8" 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 для максимальной эффективности.
* **Фермы в Нижнем мире**: располагайте под крышей Нижнего мира, чтобы минимизировать спавн мобов вне платформы.
