VirtualHostCommandPlugin: маршрутизация игроков по доменам

VirtualHostCommandPlugin: виртуальные хосты для серверов Minecraft Когда один физический сервер Minecraft должен обслуживать несколько миров или режимов игры, администраторы часто сталкиваются с необходимостью гибкой маршрутизации игроков. Представьте: у вас есть хаб, PvP-арена и креативный мир н...

Скачать VirtualHostCommandPlugin для Minecraft 1.20.2, 1.20

Оригинальное название: VirtualHostCommandPlugin

Версии Minecraft: 1.20, 1.20.2

ФайлВерсияЗагрузчикРазмер
VirtualHostCommandPlugin-0.9.1.jar1.20—5 КБСкачать
VirtualHostCommandPlugin-0.9.2.jar1.20—6 КБСкачать
VirtualHostCommandPlugin-0.9.3.jar1.20.2—7 КБСкачать

VirtualHostCommandPlugin: виртуальные хосты для серверов Minecraft

Когда один физический сервер Minecraft должен обслуживать несколько миров или режимов игры, администраторы часто сталкиваются с необходимостью гибкой маршрутизации игроков. Представьте: у вас есть хаб, PvP-арена и креативный мир на одном сервере Bukkit с Multiverse. Как сделать так, чтобы игрок, подключающийся через домен hub.example.com, сразу попадал в хаб, а тот, кто использует pvp.example.com, оказывался на арене? Ответ — VirtualHostCommandPlugin, инструмент, работающий по принципу виртуальных хостов Apache, но адаптированный под Minecraft.

Что такое VirtualHostCommandPlugin?

VirtualHostCommandPlugin — это плагин для серверов на базе Bukkit (включая PaperMC и его форки), который анализирует имя хоста, использованное игроком при подключении. Он перехватывает CNAME-записи и на основе заданных правил выполняет команды, меняет MOTD или иконку сервера. По сути, вы получаете несколько «логических» серверов на одном физическом экземпляре Minecraft, каждый со своим уникальным поведением при входе.

Плагин особенно полезен для крупных сетевых проектов, где требуется разделение потоков игроков без развёртывания дополнительных серверных процессов. Он не создаёт отдельные миры автоматически, но отлично сочетается с Multiverse-Core или другими менеджерами миров, позволяя телепортировать пользователя в нужное измерение сразу после соединения.

Как работает плагин?

Механика VirtualHostCommandPlugin проста и элегантна. При подключении клиента сервер получает информацию о том, через какой адрес (домен или IP) произошло соединение. Плагин сопоставляет этот адрес с конфигурационным файлом, где для каждого виртуального хоста прописаны условия и команды. Сравнение происходит по принципу «начинается с» (starts-with), что позволяет использовать как полные домены, так и их части, включая порты.

После успешного совпадения плагин проверяет опциональные условия: находится ли игрок в определённом мире (ifInWorld) или, наоборот, не находится в нём (ifNotInWorld). Если условия соблюдены, выполняется список команд с поддержкой плейсхолдеров %player%, %hostname% и %port%. Таким образом, можно не только телепортировать игрока, но и отправить ему приветственное сообщение, сменить игровой режим или применить любые другие действия, доступные через консоль сервера.

Установка и настройка

Плагин распространяется в виде JAR-файла, который необходимо поместить в папку plugins вашего сервера Bukkit или PaperMC. Сборки доступны в директории dist репозитория mc-vhost на GitHub. После первого запуска сервера создаётся файл конфигурации config.yml внутри папки VirtualHostCommandPlugin. Именно здесь прописываются все виртуальные хосты и их поведение.

Структура конфигурации интуитивно понятна. Каждый хост задаётся отдельным блоком с уникальным ключом. Обязательное поле — hostname, куда вписывается домен или IP-адрес. Опционально можно указать ifInWorld, ifNotInWorld, motd и icon. MOTD и иконка сервера работают не на всех реализациях серверов, поскольку событие PingServerList не всегда передаёт имя хоста. Однако для PaperMC разработчики добавили обходное решение через рефлексию, что позволяет корректно отображать разные MOTD и иконки для разных виртуальных хостов.

Если вы хотите быстро протестировать этот плагин, удобно использовать лаунчер foxygame.net — он позволяет гибко управлять модами и сборками, а установка VirtualHostCommandPlugin через его меню займёт всего пару кликов. Такой подход экономит время и избавляет от ручного копирования файлов, особенно когда вы экспериментируете с конфигурациями на локальном сервере.

Примеры использования

Рассмотрим типичный сценарий. У вас есть сервер с Multiverse, где созданы миры world_hub и world_pvp. Вы хотите, чтобы игроки, подключающиеся через hub.example.com, попадали в хаб, а через pvp.example.com — на арену. Конфигурация будет выглядеть так:

vhosts:
  host_hub:
    hostname: hub.example.com
    ifNotInWorld: "^world_hub"
    commands:
      - gamemode %player% survival
      - msg %player% Добро пожаловать в хаб!
      - mv tp %player% world_hub
  host_pvp:
    hostname: pvp.example.com
    ifNotInWorld: "^world_pvp"
    commands:
      - gamemode %player% survival
      - msg %player% Вы на PvP-арене!
      - mv tp %player% world_pvp

Обратите внимание на регулярное выражение в ifNotInWorld: символ ^ означает начало строки, что гарантирует точное совпадение имени мира. Это предотвращает повторное выполнение команд, если игрок уже находится в нужном мире. Плейсхолдер %player% заменяется на никнейм вошедшего, а %hostname% — на использованный домен.

Другой пример — разделение по IP-адресам. Если у вас несколько сетевых интерфейсов, можно привязать команды к конкретному IP:

vhosts:
  host_ip:
    hostname: "123.45.67.89"
    commands:
      - msg %player% Вы подключились через IP %hostname%

Это удобно, когда DNS-имена не используются, а маршрутизация строится на уровне IP-адресов.

Ограничения и важные нюансы

Несмотря на гибкость, VirtualHostCommandPlugin имеет несколько критических особенностей, которые нужно учитывать. Во-первых, плагин полностью полагается на передачу имени хоста клиентом. При использовании Bedrock-прокси с Geyser имя хоста не передаётся при входе — только IP-адрес. Чтобы обойти это, необходимо в конфигурации Geyser включить опцию forward-hostname: true. Тогда прокси начнёт пробрасывать оригинальный домен, использованный Bedrock-клиентом, и плагин сможет корректно обрабатывать виртуальные хосты.

Во-вторых, MOTD и иконка сервера для каждого виртуального хоста работают нестабильно на некоторых серверных реализациях. Это связано с тем, что событие пинга не всегда содержит информацию о хосте. Разработчики добавили workaround для PaperMC, но на других форках Bukkit эта функция может быть недоступна. Рекомендуется тестировать поведение на целевом сервере перед развёртыванием в продакшене.

Также стоит помнить, что плагин не управляет мирами — он лишь выполняет команды. Поэтому для полноценной работы с несколькими мирами потребуется Multiverse или аналогичный плагин. Конфигурация должна быть тщательно выверена, чтобы избежать конфликтов: например, если условие ifInWorld и ifNotInWorld заданы одновременно, оба должны быть истинными для выполнения команд.

Заключение

VirtualHostCommandPlugin — это мощный и лёгкий инструмент для администраторов Minecraft-серверов, стремящихся оптимизировать инфраструктуру и улучшить пользовательский опыт. Он позволяет эмулировать несколько независимых серверов на одном экземпляре, гибко управляя поведением при подключении через разные домены или IP. Благодаря простой конфигурации и поддержке плейсхолдеров, плагин легко интегрируется в существующие сборки с Multiverse и другими дополнениями.

Исходный код проекта открыт и доступен на GitHub: github.com/cgaffga/mc-vhost. Там же можно найти документацию и примеры конфигураций. Плагин продолжает развиваться, а сообщество активно делится сценариями использования. Если вы хотите создать по-настоящему умный сервер с виртуальными хостами, VirtualHostCommandPlugin станет надёжным фундаментом для этой задачи.