Crossplay SMP: один сервер для Java и Bedrock через Geyser и Floodgate

Crossplay SMP: один сервер для Java и Bedrock через Geyser и Floodgate

Если на сервер хотят зайти и друзья с ПК, и кузен с телефона, разделять их на два разных сервера нет смысла. Geyser плюс Floodgate превращают обычный Paper в кросс-платформенный SMP, где Java и Bedrock игроки бегают по одному миру. В этом гайде разбираем как поставить связку, как Floodgate авторизует Bedrock без Java-аккаунта, какие подводные камни ждут на префиксах, ресурс-паках и анти-чите, и чем такой сервер отличается от голого Bedrock-сервера.

Зачем вообще объединять Java и Bedrock

Два мира разделены протоколом и платформой. Java Edition говорит на своём TCP-протоколе и просит Mojang-логин. Bedrock Edition (мобилки, Switch, Xbox, PlayStation, Windows 10) использует RakNet поверх UDP и привязан к Xbox Live. На голом ванильном сервере они не пересекаются.

Geyser ставится плагином или прокси и переводит RakNet-пакеты Bedrock-клиента в Java-пакеты, которые понимает Paper. Floodgate решает вторую задачу: пускает Bedrock-игрока без Java-аккаунта, генерируя для него детерминированный UUID и имя на основе Xbox Live ID.

В результате один Paper держит и тех, и других, мир общий, чат общий, прогрессия общая. На практике это самый дешёвый способ собрать SMP на 30-50 человек смешанной аудитории.

Что выбрать: Geyser-Spigot или Geyser-Standalone

У Geyser несколько форм-факторов, и для SMP важно сразу выбрать правильную:

  • Geyser-Spigot - jar в plugins/ обычного Paper/Purpur. Работает в одном процессе с сервером. Это рекомендуемый вариант для одиночного SMP.
  • Geyser-Standalone - отдельный процесс, слушает порт и форвардит на Java-сервер. Полезно когда вы не контролируете сервер, например играете на чужом хостинге.
  • Geyser-Velocity / Geyser-BungeeCord - если у вас прокси-сеть. Тогда плагин ставится на прокси.
  • Geyser-Fabric / Geyser-NeoForge - для модовых серверов на Fabric или NeoForge.

Для классического Paper-SMP берём Geyser-Spigot.jar и floodgate-spigot.jar. Оба под одну версию Minecraft, обе с GeyserMC GitHub Releases и Floodgate Releases.

Установка на Paper или Purpur

Версии Minecraft, которые сейчас уверенно поддерживаются: 1.20.x и 1.21.x. На 1.19 и ниже Geyser ещё работает, но обновлений уже нет.

Шаги короткие:

  1. Останавливаем сервер.
  2. Кладём Geyser-Spigot.jar и floodgate-spigot.jar в plugins/.
  3. Запускаем сервер. Плагины создадут plugins/Geyser-Spigot/config.yml и plugins/floodgate/config.yml.
  4. Останавливаем, правим конфиги, запускаем снова.

Минимальный plugins/Geyser-Spigot/config.yml:

bedrock:
  address: 0.0.0.0
  port: 19132
  clone-remote-port: false
  motd1: "Crossplay SMP"
  motd2: "Java + Bedrock"
  server-name: "Crossplay SMP"

remote:
  address: auto
  port: auto
  auth-type: floodgate

passthrough-motd: true
passthrough-player-counts: true
allow-third-party-capes: true
allow-third-party-ears: false
show-cooldown: title
show-coordinates: true

auth-type: floodgate говорит Geyser передавать авторизацию Bedrock-игроков плагину Floodgate. Без этого Geyser попробует попросить у клиента Java-аккаунт, что не сработает на консолях и телефонах.

Минимальный plugins/floodgate/config.yml:

key-file-name: key.pem
username-prefix: "."
replace-spaces: true
disable-firstjoin-message: false
disable-leave-message: false
default-locale: system

Файл key.pem Floodgate генерит при первом запуске. Если вы используете Geyser-Standalone отдельно, этот же файл нужно скопировать туда.

Порты и фаервол

Бедрок ходит по UDP, не TCP. Это путает многих, потому что для Java сервера привычно открывать только 25565/tcp.

Открыть нужно:

  • 25565/tcp для Java-клиентов (стандартный порт сервера)
  • 19132/udp для Bedrock-клиентов (стандартный порт Geyser)

В iptables это выглядит так:

iptables -A INPUT -p tcp --dport 25565 -j ACCEPT
iptables -A INPUT -p udp --dport 19132 -j ACCEPT

Если вы за DDoS-защитой, провайдеру нужно явно сказать что 19132/udp тоже надо проксировать как игровой порт. Для DDoS у Bedrock есть свои особенности: RakNet любит спам-флуд unconnected ping-пакетов, и без UDP-фильтра сервер быстро ложится. Готовые решения вроде MineGuard ловят это на уровне фильтра.

Floodgate префикс и почему имена начинаются с точки

По умолчанию Floodgate ставит префикс . перед именем Bedrock-игрока. Если в Xbox Live у человека ник SteveBE, на сервере он появится как .SteveBE.

Зачем это нужно. У Java и Bedrock разные ограничения на ники. Java запрещает спецсимволы и пробелы, Bedrock разрешает многое включая пробелы и эмодзи. Если Java-игрок зарегистрировался как SteveBE, а потом приходит Bedrock-аккаунт с тем же ником, конфликт. Префикс точкой решает это: точка в Java-нике невалидна, значит Java-аккаунта .SteveBE существовать не может.

replace-spaces: true дополнительно меняет пробелы в Bedrock-нике на _, иначе плагины которые парсят аргументы в командах ломаются.

Менять префикс на пустой можно, но тогда все коллизии ложатся на вас. Я обычно оставляю точку: гости видят .Username и сразу понимают, что человек с телефона.

UUID Bedrock-игроков

Floodgate не выдаёт случайный UUID. Он берёт Xbox Live ID игрока и через UUID v3 (имя-в-пространстве) считает детерминированный UUID, всегда один и тот же для конкретного аккаунта. Это важно, потому что весь инвентарь и прогресс в Minecraft привязан к UUID.

Практический вывод: если вы переносите игрока между серверами с одинаковым Floodgate, инвентарь и LuckPerms-привилегии совпадут по UUID. Если же сменить Floodgate-логику или мигрировать с другого решения (например, GeyserConnect), UUID может поплыть и Bedrock-игроки потеряют прогресс.

В большинстве случаев это разовая боль при миграции. Внутри одного сервера UUID стабилен.

Ресурс-паки и текстуры

Geyser умеет конвертировать Java ресурс-паки в Bedrock-формат на лету, но не любой пак переживёт конвертацию. Что работает хорошо:

  • Замена текстур блоков и предметов
  • Замена звуков
  • Кастомные модели через CustomModelData (с оговоркой, см. ниже)

Что плохо или совсем не работает:

  • OptiFine CIT (Connected Item Textures) - частично через Geyser, но не всё
  • OptiFine CEM (Custom Entity Models) - не поддерживается на Bedrock
  • Шейдеры - вообще не относятся к ресурс-пакам, у Bedrock своя система RenderDragon

CustomModelData. Java-плагины вроде ItemsAdder, MMOItems или Oraxen используют CMD для кастомных предметов. На Bedrock это работает только если пак для Bedrock собран отдельно. ItemsAdder из коробки умеет делать Bedrock-вариант пака; Oraxen имеет встроенный Geyser-bridge через Oraxen-Geyser-Mappings или плагин-мост; MMOItems сложнее, обычно нужен ручной Bedrock-пак.

В Geyser-Spigot/config.yml включается опция:

load-resource-packs: true

После этого все паки из plugins/Geyser-Spigot/packs/ уйдут на Bedrock-клиент.

UI и интерфейсы: что глючит на Bedrock

Bedrock рендерит большинство Java-интерфейсов через нативный UI, и не всё переезжает чисто.

  • Редактирование табличек - на Bedrock открывается своя клавиатура, работает. Цветовые коды через & могут не пройти.
  • Анвил - переименование работает с ограничением длины. Длинные имена обрезаются.
  • Книжки - редактирование работает, но без форматирования.
  • Командные блоки - открываются как текстовые поля, работают.
  • Кастомные GUI на инвентаре (например, плагин-меню через chest GUI) - работают почти всегда, но Bedrock-игроки не видят анимаций тика и иногда промахиваются при клике в первые секунды открытия.
  • Форм-меню Geyser - есть API для открытия нативных Bedrock-форм со стороны плагина. Это лучший способ делать админ-панели для Bedrock игроков, чем chest GUI.

Перед запуском пройдитесь по всем основным сценариям с Bedrock-устройства. Лучше один раз поймать косяк локально, чем разбираться когда придут реальные игроки.

Что не работает или работает иначе на Bedrock

Это вечная головная боль кросс-плея. Пара ключевых штук:

  • Redstone-автоматизация. Базовые схемы работают одинаково, но тонкие тики (BUD, мгновенные репитеры на пределах) Bedrock считает иначе. Java-схема может не сработать в Bedrock-варианте мира, но мы тут на Java-сервере, так что Java-логика. Bedrock-игрок просто видит результат, физику не считает локально.
  • Полёт через элитру. Работает, но управление чувствительностью отличается на консолях, особенно с геймпадом.
  • F3-меню, Pie chart, лаг-графики. На Bedrock этого нет. Диагностика производительности только со стороны Java.
  • Команды. Bedrock рисует свой UI для команд (выпадашки, кнопки), но кастомные плагин-команды без аргумент-провайдера Brigadier выглядят как голый текст. Решается оборачиванием через Geyser API в форму.

Анти-чит и Bedrock

Тонкое место. Анти-читы вроде GrimAC и Vulcan написаны под Java-движок и считают физику исходя из Java-формул. Bedrock считает физику чуть иначе, и без exemptions Bedrock-игроки получают false-positive за MovementY или KnockbackUtil уже на первой минуте.

GrimAC начиная с 2.3.x официально поддерживает Floodgate и сам проставляет exempt при коннекте. Vulcan тоже умеет, но конфиг придётся править руками. Минимальный пример для Vulcan:

checks:
  movement:
    enabled: true
    exempt-floodgate: true
  combat:
    reach:
      exempt-floodgate: true

Совсем выключать анти-чит для Bedrock не надо: они всё равно могут читерить через сторонние клиенты вроде Horion или ToolBox. Но базовые movement-проверки придётся ослабить.

Префиксы в чате и LuckPerms

Чтобы Java и Bedrock было видно в чате, обычно вешают тег. Через LuckPerms это делается одной командой:

lp creategroup bedrock
lp group bedrock meta setprefix 10 "&e[B] "
lp creategroup java
lp group java meta setprefix 10 "&a[J] "
lp group default parent add java

Floodgate автоматически кидает Bedrock-игроков в группу bedrock, если в plugins/floodgate/config.yml включить default-group: bedrock (опция появляется через дополнения Floodgate, проверяйте версию). Альтернативно используйте плагин FloodgateExtras или slash-команду в EssentialsX:

# в EssentialsX-Discord или через скрипт на onJoin
on player_join:
  if player has permission "floodgate.player":
    add player to lp group "bedrock"

После этого в чате Bedrock-игроки выглядят как [B] .Steve и Java как [J] Alex. Удобно для модерации.

Производительность

Geyser сам по себе ест мало, в районе 10-30 МБ ОЗУ на запущенный плагин и микроскопическую долю CPU на трансляцию протокола. Floodgate ещё легче, его задача только проверить хэндшейк и сгенерировать UUID.

Основная нагрузка остаётся на Paper и мире. Bedrock-игроки шлют чанк-реквесты ровно так же как Java, и каждый чанк сервер обрабатывает один раз. Если у вас 8 ГБ ОЗУ хватало на 30 Java-игроков, вместе с Bedrock-аудиторией хватит на те же 30 человек суммарно, не больше. Geyser не магия, он не уменьшает реальную нагрузку.

Что стоит включить:

  • view-distance: 8 в server.properties. Bedrock на телефонах всё равно не отрисует больше восьми чанков плавно.
  • network-compression-threshold: 256 для Java-клиентов, на Bedrock этот параметр не влияет.
  • Pre-generation мира через Chunky до запуска SMP. Bedrock-клиенты на мобильной связи особенно чувствительны к лагам генерации.

FAQ

Geyser и Floodgate - в чём разница?

Geyser переводит протокол: пакеты Bedrock-клиента превращает в Java-пакеты, понятные серверу. Floodgate отвечает за авторизацию: Bedrock-игроку не нужен Java-аккаунт, Floodgate сам проверяет Xbox Live токен и пускает на сервер. Их ставят в паре. Без Floodgate Bedrock-клиент сможет подключиться к Geyser, но сервер его не пустит без Java-логина.

Можно ли сделать crossplay на Vanilla сервере?

На голом vanilla.jar нельзя, ни Geyser, ни Floodgate туда не ставится. Минимум нужен Paper, Purpur или Spigot, потому что плагин системы у Vanilla нет. Если вы хотите остаться "ванильным" по геймплею, поставьте Paper и просто не ставьте никаких других плагинов кроме Geyser и Floodgate. По механикам Paper очень близок к Vanilla.

Как зарегистрировать Bedrock игрока без Java-аккаунта?

Никак не нужно регистрировать вручную. Floodgate принимает Xbox Live токен с устройства игрока и сам генерирует UUID на основе xboxId. При первом заходе игрок просто появляется на сервере, у него уже есть свой UUID и имя с префиксом .. Если у вас включён AuthMe или другой плагин логина, его обычно отключают для Floodgate-игроков через auto-login: true или exempt по permission floodgate.player.

Bedrock players видят Java skins?

Зависит от пака. Java-скины это PNG 64x64, Bedrock использует свой формат скинов. Geyser конвертирует Java-скин в Bedrock-скин на лету, и Bedrock-клиенты видят примерно то же самое. Опция allow-third-party-capes: true в конфиге Geyser включает плащи. Один нюанс: 4D-модели и анимированные Bedrock-скины Java не показывает. Java увидит только текстуру тела, без частиц и анимаций.

Можно ли пускать Bedrock на тот же 25565?

Нет. Bedrock работает по UDP и RakNet, Java по TCP. Это разные транспорты, и слушать их одним сокетом нельзя. Geyser держит отдельный UDP-порт (по умолчанию 19132). Если хочется привычный 25565 для Bedrock, можно изменить bedrock.port на любой UDP-порт, но клиентам Bedrock придётся вводить порт вручную, а в Featured Servers списке UDP/19132 стандарт.

Что делать если плагины ломаются на Bedrock?

Сначала проверить, есть ли у плагина Bedrock-совместимая версия или Geyser-bridge. Для популярных вещей (ItemsAdder, Citizens, ProtocolLib) такие версии есть. Для редких плагинов проще обернуть UI через Geyser Form API: Bedrock игрокам показывается нативная форма, Java остаётся со старым chest GUI. Это разовая работа на стороне сервера.

Что дальше

Связку Geyser плюс Floodgate можно ставить на любой Paper-SMP за полчаса. Главное не забыть про UDP-порт в фаерволе, exempt в анти-чите и проверку основных GUI с Bedrock-устройства.

Дальше имеет смысл прокачать три вещи. Первое: настроить групповые префиксы в LuckPerms, чтобы модерация видела платформу. Второе: собрать общий ресурс-пак, протестировать его на телефоне отдельно и убедиться, что CMD-предметы видны обеим платформам. Третье: подложить под UDP-порт хоть какую-то DDoS-защиту, потому что Bedrock-сервер на голом IP это магнит для RakNet-флуда.


Protégez votre serveur contre les attaques DDoS

Protection gratuite avec configuration en 5 minutes. 1 To de bande passante inclus.

Essayer gratuitement


Articles connexes