マイクラ統合版とJava版の完全なクロスプレイを実現する方法

マイクラ統合版とJava版の完全なクロスプレイを実現する方法

【改造なし】Xbox One、スイッチ、PS4で特集サーバー以外に接続する方法」が、数日前に投稿したにもかかわらず閲覧数が多かったんですよね(笑)
なので、それに近い内容(?)を今回は書いていこうと思います。

今回はタイトル通り、マイクラの統合版とJava版でクロスプレイできるようにしていこうと思います。
では、早速やっていきましょう!

前書き

※筆者のどうでもいい話が書いています。
 暇な方だけ読んでください(笑)

冒頭のリンクの記事でも少し書いたように、BetterTogetherアップデートによってスイッチ、Windows10版、PS4、スマホなどでクロスプレイができるようになりました(統合版)。
ですが、Java版だけは対象外で、クロスプレイとか言っときながらJava版と統合版ではクロスプレイができません。

スイッチ版の発売によって統合版ユーザーが急激に増えたので、いやらしい筆者は統合版ユーザーを狙ってサーバーを建てようと思ったんですが、公式サーバーソフトウェア(DedicatedBedrockServer)はまだ不安定だし、統合版サーバーを立てたら自鯖のオペレーターさんのU氏が入れなくなるからなー…って悩んでました。

で、何とか統合版とJava版のマルチプレイをする方法はないかなーって調べてたわけです。
「そんなのあるわけwwwww」って思ってたんですけど、ありました。
興奮して鼻血出ました(大嘘

私が見つけたのは、DragonProxy、ProtocolSupportPE、Geyserの三つで、全部を試してみました。
どうやらProtocolSupportPEは更新が止まっていました。
DragonProxyとGeyserは、両方とも使えたのですが、Geyserのほうが安定していました。
なので、今回はGeyserを使う方法を紹介します。

JEとBEのクロスプレイを実現するGeyserの仕組みは?

前章で書いた通り、今回はGeyserを使った方法で実現します。
概ねの仕組みはこんな感じです。

公式Webサイトから引用

このようにサーバーとして動くのではなく、統合版のパケットをJava版のパケットに変換するミドルウェアとして動きます
統合版ユーザーがJava版サーバーに接続する形になるので、ゲームの仕様はJava版に統一されます。

統合版ユーザーの認証
Java版のアカウントが無くても、今記事で紹介するfloodgateを同時に導入すれば、サーバーのonline-mode(正規ユーザー認証)を有効にしたまま統合版のみ認証なしで接続できます。

サーバーに導入する

今記事では、「統合版ユーザー → Geyser → Spigot」というような構造にします。
ちなみにBungeeCordを挟む方法もありますが(筆者のサーバーがそうです)、記事が膨大な量になってしまうので割愛します(リクエストが多ければ多分書きます)(2020/11/28追記)書きました

Spigotのセットアップについてはネット上に膨大な量の記事があるので割愛します。
セットアップ済みであるとして話を進めます。

https://ci.nukkitx.com/job/GeyserMC/job/Floodgate/job/master/から、floodgate-spigot.jarをダウンロードします。
このプラグインを使うことで、統合版ユーザーだけJava版のアカウント無しでサーバーに接続できます。

https://ci.nukkitx.com/job/GeyserMC/job/Geyser/job/master/から、Geyser-Bukkit.jarをダウンロードします。
(8/20追記 : 7/8からGeyser-BukkitからGeyser-Spigotに名前が変わったようです)
このプラグインはクロスプレイを可能にする核の部分です。

③二つのファイルをspigotのpluginsフォルダにぶち込みます。

④一度サーバーを起動して、起動完了したらサーバーを停止します。
 これで設定ファイルが生成されます。

config.ymlの設定

次に設定をしていきましょう。

①pluginsフォルダ内のfloodgate-bukkitフォルダを開いてpublic-key.pemをコピーします。(コピーですよ!)

②コピーしたファイルをpluginsフォルダ内のGeyser-Bukkitフォルダに貼り付けます。

(8/27追記 : 現在は同じspigot上にfloodgateを入れると、自動でfloodgateの設定をしてくれるので、①②の操作は不要です)

③plugins→Geyser-Spigotフォルダ内のconfig.ymlを編集します。
(2021/02/18追記)公式サイトで「Config Editor」というものができていたので、それを利用すればより簡単にconfigを編集できます

bedrock:
  # 接続を待機するアドレス(変更しない)
  address: 0.0.0.0
  # 接続を待機するポート番号(このポート番号で統合版から接続する。普通は変更しなくてOK)
  port: 19132
  # 統合版のポート番号をJava版と同じにする(通常は変更しない)
  # trueにすると同じポート番号で両方のエディションから接続できる
  clone-remote-port: false
  # motdを設定する(passthrough-motdがtrueの場合は関係ない)
  # 今回はpassthrough-motd(Java版サーバーと同じmotdにする)をtrueにするのでそのままにする
  motd1: "Geyser"
  motd2: "Another Geyser server."
  # サーバー名を設定する(ポーズ画面を開いたときに表示される)
  server-name: "MyServer"
  # Bedrockユーザーへのデータをどれだけ圧縮するか
  # 数値が高いほど圧縮されるが、その分CPU使用率が高くなる
  # -1で無効
  compression-level: 6
  # クライアントに対してproxyプロトコルを有効にするか?
  # UDPリバースプロキシを使う場合はtrue
  # falseでいいと思います
  enable-proxy-protocol: false
  # enable-proxy-protocolがtrueに場合のみ有効
  # これもよくわからない
  #proxy-protocol-whitelisted-ips: [ "127.0.0.1", "172.18.0.0/16" ]
remote:
  # Java版のサーバー(spigot)のアドレスを指定する
  # autoにすると、Geyserプラグインが入っているサーバーのアドレスに、自動的に設定してくれる
  # 通常はauto
  address: auto
  # Java版のサーバー(spigot)のポート番号を指定する
  # 25565で開いていない場合は、変更する
  # address: autoの場合、自動で設定される
  port: 25565
  # spigotサーバーに接続するときの認証タイプ
  # spigotのonline-modeがfalseならoffline
  # 接続にJava版のアカウントを必要とする場合はonline
  # spigotのonline-modeをtrueにしながら、統合版はJava版のアカウントを必要とせずに接続できるようにするにはfloodgate
  # 今回はfloodgateを使うのでfloodgateを指定する
  auth-type: online
  # 
  allow-password-authentication: true
  # BungeeCordにこのプラグインを導入した場合はtrue
  use-proxy-protocol: false
  # Forward the hostname that the Bedrock client used to connect over to the Java server
  # This is designed to be used for forced hosts on proxies
  forward-hostname: false

# trueで統合版ユーザーの建築可能高度を y=-64~319まで拡張する
# バグる可能性がある
extended-world-height: false

# floodgateのキーファイル名
# これはfloodgateが自動で設定してくれるのでそのままにする
floodgate-key-file: public-key.pem

# チャットで/だけを打った時、コマンドの一覧を表示する
# 表示数が多いので、もしチャットがフリーズするようならfalse推奨
command-suggestions: true

# motdをJava版サーバーと同じにする
passthrough-motd: true
# プロトコル名をJavaバージョンと同じにする
# 見た目上は何も変わりないのでそのままにする
passthrough-protocol-name: false
# 最大プレイヤー数と現在ログイン中のプレイヤー数情報をJava版サーバーと同じにする
passthrough-player-counts: true
# 古いpingパススルー機能を使う
# 一般人が使う分には必要ない
legacy-ping-passthrough: false
# Java版サーバーにpingを送信する間隔(秒)(legacy-ping-passthroughがfalseの場合またはStandaloneバージョンでは関係ない)
# 関係ないのでそのままにする
ping-passthrough-interval: 3
# trueプレイヤーのpingをサーバーに転送する
# サーバーでpingを測るコマンドを実行したときに、正確な値が出る
# タイムアウトしやすくなる
forward-player-ping: false

# 統合版ユーザーとしてログインできる最大人数を設定する(見た目だけ)
# spigotサーバーが満員の場合はログインできない
max-players: 20

# デバッグメッセージを表示する
# 一般人には必要ない
debug-mode: false

# スレッドプールサイズ
# よくわからないのでそのままにする
general-thread-pool: 32

# Optifineマントなどを有効にする
allow-third-party-capes: true

# MinecraftCapeの耳を表示する
# よくわからないのでそのままにする
allow-third-party-ears: false

# Java版に存在するクールダウンタイムのチャージメーターを統合版でも擬似表示する
# titleまたはactionbarに表示する
# falseで無効
show-cooldown: title

# 座標を表示するかどうか
show-coordinates: true

# エモート時の動作とオフハンドの切り替え(Java版でHキーを入力したときの動作)を設定します
# disabled - デフォルトの動作
# no-emotes - エモートを非表示にして、オフハンドの切り替えのみ行います
# emotes-and-offhand - エモートがほかの統合版ユーザーにも表示され、オフハンドが切り替わります
emote-offhand-workaround: "disabled"

# クライアントが要求した言語が無い場合に設定する言語
# 設定する必要はない
# default-locale: en_us

# 画像をキャッシュする時間を指定する
# 0で無効になる
# 意味が分からないのでそのままにする
cache-images: 0

# カスタム生首を表示する
allow-custom-skulls: true

# かまど付きトロッコを分割されたアイテムとして扱うか
# わからないのでデフォルトのtrue
add-non-bedrock-items: true

# 統合版ではY127以上にブロックを建築できないので、ディメンションIDをエンドIDにすることによってY127以上に建築できるようにする
# 空の見た目が変わるだけなので、ネザーは通常空が見えないので、見た目的にはあまり変わりない
# スポーンするmobも変わりない
# Y127以上に行くことがないのでfalseのままにする
above-bedrock-nether-building: false

# 統合版向けリソースパックの適用を強制する
force-resource-packs: true

# trueでXboxの実績解除を出来るようにします
# trueの場合、統合版からはコマンドが使えなくなります
xbox-achievements-enabled: false

# 統計の設定
# uuidは絶対にいじらない
# 統計が集められて恥ずかしい場合は、false
metrics:
  enabled: true
  uuid: 29b59910-1b9a-4d03-bc52-b6de1f1deb2e

# これより下は高度な設定なので、いじらない

# Geyser updates the Scoreboard after every Scoreboard packet, but when Geyser tries to handle
# a lot of scoreboard packets per second can cause serious lag.
# This option allows you to specify after how many Scoreboard packets per seconds
# the Scoreboard updates will be limited to four updates per second.
scoreboard-packet-threshold: 20

# Allow connections from ProxyPass and Waterdog.
# See https://www.spigotmc.org/wiki/firewall-guide/ for assistance - use UDP instead of TCP.
enable-proxy-connections: false

# The internet supports a maximum MTU of 1492 but could cause issues with packet fragmentation.
# 1400 is the default.
mtu: 1400

# Whether to connect directly into the Java server without creating a TCP connection.
# This should only be disabled if a plugin that interfaces with packets or the network does not work correctly with Geyser.
# If enabled on plugin versions, the remote address and port sections are ignored
# If disabled on plugin versions, expect performance decrease and latency increase
use-direct-connection: true

config-version: 4

motdは下の画像の赤で囲んだ部分の文字のことです。

カスタム生首とは、マイクラにデフォルトで用意されていない生首です
(Java版ではコマンドで出します)

④floodgate内のconfig.ymlを編集します

# 秘密鍵のファイル名(そのままにする)
key-file-name: key.pem

# Java版ユーザーと統合版ユーザーの名前がかぶらないようにするために、統合版の名前の先頭に接頭辞をつける
username-prefix: "."

# 統合版の名前の空白を_に置き換える
# 名前の空白をうまく処理できないので、trueにする
replace-spaces: true

disconnect:
  # 鯖主がセットアップしたGeyser以外でログインしようとしたときに表示するメッセージ
  # 普通は表示されないのでそのままにする
  invalid-key: Please connect through the official Geyser
  # プラグインのアップデート等によって通信の仕組みが変わったときに、表示するログインエラーメッセージ
  # 普通は表示されないのでそのままにする
  # 表示された場合はGeyserとFloodgateが両方とも最新であるか確認する
  invalid-arguments-length: Expected {0} arguments, got {1}. Is Geyser up-to-date?

# プレイヤーリンク機能
player-link:
  # Java版アカウントと統合版アカウントの紐づけ機能を使用する
  # この機能を使用すると、同じユーザーがJava版と統合版で入ったときに同じプレイヤーとして扱われる
  # 必要ないのでfalse
  enable: false

  # サーバーの参加にJava版のアカウントを強制する
  require-link: false

  # データベース拡張プラグインを導入している場合のみ有効
  # 導入してないのでfalse
  #enable-own-linking: true

  # enable-own-linkingがtrueの時のみ下の3つの設定が使える

  # /linkaccount /unlinkaccount コマンドを有効にするか
  # floodgate.command.linkaccount floodgate.command.unlinkaccount 権限でも制御できる
  allowed: true
  # リンクコードの有効期限を設定する(秒)
  link-code-timeout: 300
  # どのデータベースを使用するか
  type: sqlite

  # グローバルリンク機能を有効にするか
  # この機能を利用することで、GeyserMCが導入されているサーバーごとに毎回リンクする必要が無くなる
  # 詳細はhttps://link.geysermc.org/
  enable-global-linking: true

# Do not change this
config-version: 2

⑤サーバーを起動します

統合版で入ってみる

※MinecraftWindows10Editionを使っていて、サーバーを建てたPCでログインする場合、以下のコマンドをPowerShellで実行する必要があります。

CheckNetIsolation LoopbackExempt -a -n="Microsoft.MinecraftUWP_8wekyb3d8bbwe"

※スイッチ/PS4/Xbox Oneを使っている方は通常特集サーバー以外には入れません。
それらのデバイスでログインする方法はhttps://novablog.work/be-join-any-server/に書いてあります。
尚、筆者はWindows10Editionでしか検証していないので、ほかのデバイスではどのような挙動になるかは分かりません。

もし、統合版で友達などに入ってもらう場合は、configのbedrock→portで設定したポート忘れずに開きましょう。
TCPではなくUDPで開くんですよ!!
ポート開放に関する質問は、この記事では受け付けません。

これで統合版とJava版がクロスプレイできるようになりました!

(2021/10/24追記)質問集

頂いた質問をまとめておきます

0.0.0.0で接続できない

0.0.0.0はconfigで設定する特殊なアドレスで、サーバーへの接続には使えません。

自分で建てたサーバーであればローカルIPアドレス(localhostや192.168.x.x)、ほかの人に入ってもらう場合はグローバルIPアドレスを入力します。

リソースパックの適用方法

plugins→Geyser-Spigot→packsフォルダにmcpackファイルを入れます。

アドレスは合ってるのに接続できない

マイクラが更新されて数日間は、プラグインが最新版でも対応してない場合があります。
対応バージョンは「公式Githubリポジトリ」に記載されています。

また、Geyserが対応しているのはJava版最新バージョンなので、大型アップデートが入ったときはSpigotもアップデートする必要があります。
古いSpigotサーバーでGeyserを使いたい場合は、ViaVersion等のプラグインを導入してください

(2020/11/28追記)BungeeCordに導入する

「BungeeCordへの導入方法を教えてほしい!」というリクエストがあったので、BungeeCordでの導入方法を書いていきます

BungeeCordサーバー及びその管理下のサーバーの両方がセットアップ済みであるとして話を進めます

https://ci.nukkitx.com/job/GeyserMC/job/Floodgate/job/master/から、floodgate-bungee.jarをダウンロードします。
Spigot版と役割は同じで、統合版ユーザーがJava版のアカウント無しで接続できるようにするためのものです

https://ci.nukkitx.com/job/GeyserMC/job/Geyser/job/master/から、Geyser-BungeeCord.jarをダウンロードします。

③二つのファイルをbungeecordのpluginsフォルダにぶち込みます(bungeecord管理下のspigotサーバーには何も入れなくて大丈夫です)

④一度サーバーを起動して、起動完了したらサーバーを停止します。

⑤設定ファイルが生成されるので、https://novablog.work/minecraft-crossplay/#toc_id_4 と同じように設定します

/*YouTube jQuery(".youtube").each(function() { if(jQuery(this).attr("data-src")){ var iframe = jQuery("