この連載が書籍になりました! 『マインクラフトでマルチサーバーを立てよう!』好評発売中です。

PvPサーバーや分散サーバーを立てる

2016年8月9日(火)
ecolight

前回はミニゲームサーバーや色々なMODを組み合わせて遊べるForgeサーバーなどを紹介しました。今回は色々な方が興味を持っていると思われるPvPサーバーについて紹介したいと思います。

PvPの仕組みを知る

まずはMinecraftにおける「PvP」とはどういったものかを説明しましょう。PvPは言わずもがな「Player vs Player」ですが、Minecraftにおいては主にプレイヤー同士でダメージを与えて戦う機能を指します。実際にはプレイヤー同士の攻撃を伴わないミニゲームなどもPvPに含まれる場合があります。

Minecraftの標準機能としてはサーバー構成ファイル「server.properties」で「pvp」の設定値を「true」に設定するとサーバー全体でプレイヤー間のダメージ判定を有効に、「false」に設定するとサーバー全体でプレイヤー間のダメージ判定を無効に設定できます。

さらにBukkit(またはspigot)のプラグインからはワールドごとにPvPの有効/無効が設定でき、PermissionsEx+ModifyWorldなどの権限設定プラグインではプレイヤー個々人間での攻撃有効無効や一方的な攻撃可否なども設定可能です。生活サーバーやPvPサーバーなどでPvPの可否を設定する場合は、PermissionsExやその他のプラグインでワールドごとにPvPの可否を設定すると良いでしょう。

例えば、サーバーに入ってすぐのエントランス用ワールド等ではダメージが通らないようにPvP設定を無効にしておくといった設定を行います。

他にもPvP用にプラグインを作成すれば、鬼ごっこをするようなプラグインであったり、イベント開催時のみ特定のワールドでプレイヤーの攻撃を有効にしたりといった特殊な制御も可能です(図1)。

図1:PvP権限のイメージ図

簡単なPvPサーバーを考える

PvPサーバーを作る場合、いくつかの手段が考えられます。例えば、以下のような形です。

  • 純粋にMinecraftのPvPモードをONにしてチャットでコミュニケーションを取りながら遊ぶ
  • 上記に加えて、Minecraftのスコアボード機能などを管理者コマンドで操作してPvPらしく見せる
  • コマンドブロックを用いて操作を自動化する
  • 上記のような機能をプラグインに任せる

他にも色々と考えられますが、主に上記のような方法が考えられるでしょう。ここでは、簡単にPvPの機能を揃えることを目的に、既存のプラグインを紹介します。

興味があれば、バニラのMinecraftサーバーの機能であるスコアボードコマンドの詳細やコマンドブロックでの制御方法などを検索サイトなどで調べてみてください。

今回、PvPの機能を構成するプラグインは「ColorTeaming」を使用します。

リンク先のトピックタイトルに、本稿の執筆時点ではBukkit 1.9.2まで対応する旨が記載されているので、今回はspigot 1.9.2でサーバーを構築していきます。spigot 1.9.2は「MODサーバーの立ち上げとプラグインによる機能追加」を参考に用意してください。また、以降のプラグインの設定は配布元で公開している紹介動画を参考に必要な部分のみ抜粋しています。

PvPのワールドを用意する

まずはPvPを遊ぶためのフィールドを用意してみましょう。今回は「青と赤で別れて戦う」ことを想定します。クリエイティブモードやWorldEditのModを導入したクライアント、プラグインとして導入したサーバーで適当に思うままに作ってみてください。ここでは、スーパーフラットに生成された村を借りてPvPをやってみます(図2)。

図2:PvPマップの一例

チームに所属していないプレイヤーの待機場所(白羊毛の床)と、チーム分けした際にテレポートする各チームの待機場所(白羊毛の床に隣接した赤と青の羊毛の床)を用意しました。

また、PvPが始まった後にそれぞれプレイヤーがテレポートする各陣営のテレポート先を村の両端に設置しています。

白羊毛の床に/setworldspawnコマンドでワールドの初期スポーン位置を設定しておきましょう。

プラグインでPvPができるようにする

前述のColorTeamingプラグインを導入したら、サーバーを止めてserver.propertiesファイルを見直し、PvPに沿った設定にしてください。

例えば、以下のように変更します。
spawn-npcs=false
spawn-animals=false
spawn-monsters=false
enable-command-block=true
difficulty=2
gamemode=0

上記はプレイヤー以外の余計なNPCや敵などが出現しないようにする設定です。また、プラグインなどの制御用にコマンドブロックを有効にしておきます。

難易度などは既にワールドデータへ設定されてしまっている場合もあるので、必要に応じてdifficultyコマンドなどで設定を変更してください。

他にはプラグインも設定します。plugins/ColorTeaming/config.yml を編集しますが、詳細は当該ファイルのコメントや配布元の説明を参考にしてください。

ここでは、以下のように変更します。

worldSpawn: true
colorRemoveOnDeath: true
colorRemoveOnQuit: true

これは、チーム無所属の人がサーバー参加した際にワールドの初期スポーンへテレポートする設定と、死んだ際やサーバーを離脱した際に一旦チームから抜ける設定です。

次に、各チームのスポーン地点を登録します(図3)。

図3:スポーン地点の登録(青チーム)

村の端にある青チームのスポーン地点に行き、以下のコマンドでスポーン地点を設定します。

/cspawn blue game1

反対側の端にある赤チームのスポーン地点でも同様に以下のコマンドでスポーン地点を設定します。

/cspawn red game1

最後にワールドの初期スポーン地点の両脇にある各チームの待機場所にテレポート地点を登録します(図4)。

図4:両チームの待機場所

青チームの待機場所に行き、以下のコマンドでテレポート地点を設定します。

/ctp set blue_point here

赤チームのスポーン地点でも同様に以下のコマンドでテレポート地点を設定します。

/ctp set red_point here

PvPの開始を制御する

後はこれを元に開始の操作を行うだけですが、コマンドを全て手打ちすると大変なので、コマンドブロックを使用してボタンで行えるようにします。

まず、以下のコマンドでコマンドブロックを入手します。

/give   command_block

図5のようにコマンドブロックを並べて、順番にコマンドを実行できるようにしましょう。レッドストーンの信号が複数のコマンドブロックに入らないように注意してください。

図5:コマンドを順次実行できるようにコマンドブロックを並べる

各コマンドブロックには、以下の6つのコマンドを1つずつ設定します。各コマンドの効果も示します。

  • rc
    「全てのサバイバルモードのプレイヤーをランダムにチームに所属させる」
  • ctp blue blue_point
    「青チームを待機場所にテレポートさせる」
  • ctp red red_point
    「赤チームを待機場所にテレポートさせる」
  • cclass all knight
    「職業を騎士にする(アイテムが自動配布されるなど)」(plugins/CelorTeaming/classes に各職業の設定がある)
  • cspawn switch game1
    「スポーン地点をgame1に設定する」
  • ctp all spawn
    「全参加者をスポーン地点に転送する」

これで、とりあえずPvPが行えるようになります。

なお、上記の手順では特に終了の制御などはありませんので、右端に表示されているスコアボードの表示を見て勝敗を決することになるでしょう。

図6:ひとまずPvPができる状態になった

再度プレイできるようにする

前述の状態ではPvPを行うためにオペレータが必要になり、常設サーバーとして放置できません。これらの操作を自動化するために「ExpTimer」というプラグインを使用します。

このプラグインを導入したうえで、plugins/ExpTimer/config.ymlの末尾に以下の設定を追加します。

pvp:
  seconds: 150
  readySeconds: 10
  commandsOnStart: ['say バトル開始!!']
  consoleCommandsOnStart: ['rc', 'cclass all knight', 'ctp all spawn']
  commandsOnEnd: ['say バトル終了!!']
  consoleCommandsOnEnd: ['clear @a', 'effect @a clear', 'ct removeall', 'tp @a -1471 7 583']
  countdownOnStart: 3
  countdownOnEnd: 5
  playSound: true
  useExpBar: true
  useTitle: true
  endWithCTTeamDefeat: true
  nextConfig: 'pvp'

設定を追加後、/timer reloadで設定ファイルを再読み込みし、サーバーコンソール上から/timer start pvpとコマンドを実行しておけば、延々とPvPの開始/終了の処理を行ってくれます。

ただ、これだけではいろいろと問題もあるため、両方のプラグインの設定を詰めていき自分の思った通りの動きをするように検討する必要があります。

例えば、筆者が試した際には以下のような問題がありました。

  1. プレイヤーの死後リスポーンボタンを押す前に次ゲームが始まると、プレイヤーの状態がおかしくなる
  2. プレイヤーが死んだ際にアイテムをばらまいてしまう
  3. ブロックを置けたり壊せたりしてしまう

他にもあるとは思いますが、こういった問題もひとつずつ解決策を考えていけば対応できるでしょう。

1は、ColorTeamingの設定ファイルで以下のオプションを設定しておけば回避できるでしょう。

skipGameover: true

2も上記の設定で回避できます。上記の設定値を用いない場合は/gamerule keepInventory trueコマンドなどで死んだときにアイテムをドロップしない等の方法を考える必要があります。

3はPermissionsExによる適切な権限の設定(当該ワールドのブロックの破壊設置権限を付与しない等)といった方法やWorldGuardで該当部分を保護してしまうなどの方法が考えられるでしょう。

サーバーを分割する

殆どのPvP主体のサーバーでは、1種類だけではなく複数のゲームルールで遊べるようになっていたり、ミニゲームのようなものを実装していたりすることが多いです。

通常、Minecraftのサーバーで複数のプラグインを動かしたりワールドを制御したりすると動作に非常に負荷がかかります。こういった多くの種類のゲームを提供しているサーバーでは、ゲームの種類ごとにサーバーを分けている事も多いのではないでしょうか。

ここでは複数のサーバーを束ねて、あたかも1つのサーバーであるかのように見せる方法を紹介したいと思います。

なお、本項で紹介する方法は「Minecraft Japan Wiki」にあるBungeeCordの解説を参考に要所のみを説明しています。詳細や補足事項などはWikiを参照してください。

サーバーとプラグインの準備

サーバーは単一のサーバー機上で複数のMinecraftサーバーを動作させることを想定します。用意するのは複数のspigotサーバーとBungeeCordというプロキシサーバーです。

本項ではspigotで説明しますが、バニラサーバーに「VanillaCode」というMOD適用したものでも代用が効くので、必要な場合には試してみてください。

BungeeCordはプロキシサーバーとしてプレイヤーの接続を仲介し、代理で各サーバーにアクセスすることでサーバー間を円滑に往来できるようになっています(図7)。

図7:MinecraftサーバーとBungeeCordサーバーの構成イメージ

まず、BungeeCordのWebサイトで「最新成功ビルドの成果物」から「BungeeCord.jar」をダウンロードします。

適当なディレクトリを用意し、BATファイルで以下のようにして起動します。

java -Xms512M -Xmx512M -jar BungeeCord.jar

一度起動すると同じディレクトリ内にconfig.ymlが生成されるので、テキストエディタで編集しましょう。主に以下を変更します。

ip_forward: true
host: 0.0.0.0:25565

ip_forwardはBungeeCord配下の各サーバーで正しいUUIDを使用させるための設定、hostはBungeeCordがクライアントのアクセスを待つポートの設定です。

加えて、自分のアカウントで管理者向けコマンドを使用できるように、以下の箇所を変更してください。

■変更前

groups:
  md_5:
  - admin

■変更後

groups:
  (自分のMinecraftID):
  - admin

これでadminコマンドが使用できるようになります。adminコマンドについてはconfig.yml内の「permissions」セクションを参照してください。

最後にサーバーとの接続設定を追加します。デフォルトで以下のようにサーバーが定義されています。

servers:
  lobby:
    address: localhost:25565
    restricted: false
    motd: '&1Just another BungeeCord - Forced Host'

これを自分のサーバー向けに変更します。今回はロビーサーバーとPvPサーバーを用意することにしましょう。以下のように変更してください。

servers:
  lobby:
    address: localhost:25566
    restricted: false
    motd: '&1Lobby server'
  pvp:
    address: localhost:25567
    restricted: false
    motd: '&1PvP server'

2つのサーバー定義ではポート番号が異なる点に注意してください。

ここで一旦BungeeCordの設定を終了します。保存して閉じておきましょう。次にspigotサーバーを2つ用意します。

spigotサーバーの用意は「MODサーバーの立ち上げとプラグインによる機能追加」を参考にしてください。

1つをロビーサーバー、もう1つをPvPサーバーとして用意し、ロビーサーバーの server.propertiesを以下のように変更します。

max-tick-time=-1
server-port=25566
online-mode=false

続いて、PvPサーバーのserver.propertiesを以下のように変更します。

max-tick-time=-1
server-port=25567
online-mode=false

さらに、両方のspigotサーバーのbukkit.ymlファイルを以下のように変更します。

connection-throttle: -1

サーバーの起動と動作確認

ここまでで一通り設定が終わったので、接続確認をしてみます。

BungeeCordサーバーとspigotサーバー2つをそれぞれ起動し、Minecraftのクライアントからlocalhostに接続します。その後、/serverコマンドで設定したサーバーが見えていることを確認しましょう(図8)。

図8:サーバーの一覧表示

/server pvpや/server lobbyコマンドで2つのサーバー間を移動できることを確認し、問題がなければとりあえずの構成は完了です。

サーバーを公開する際の注意

BungeeCordを使用する場合、配下のサーバーはonline-mode=falseで運用する必要があります。これはBungeeCordがプレイヤーの代理でサーバーへ接続する関係で、配下のサーバーでは認証ができないためです。代わりにBungeeCordで集中してonline-modeをチェックするため、BungeeCordのconfig.ymlでは必ずonline_modeをtrue設定にして運用してください。

上記の理由から、BungeeCord以外の個々のサーバーへの直接アクセスを抑止する必要もあります。ポートを開放する場合はBungeeCordのポート(今回は25565)のみを開放するように注意してください。online-mode=falseのサーバーに直接アクセスできる状況では不正アクセスを許してしまうため、例えばVPN等で遠隔地のサーバーをBungeeCord配下に置くなどした場合は注意しましょう。

サーバー間を看板で移動するようにしてみる

ここまでの説明でlobbyサーバーとPvPサーバーが起動できる状態になっていると思いますが、コマンドでいつでも2つのサーバー間を移動できると困る場合もあるでしょう。

そこで看板を右クリックすると、その看板に割り当てられたサーバーに移動できるようにしてみましょう。

spigotサーバー2つに「TeleportSigns」というプラグインを導入します。本稿執筆時点では正式リリース版が動作しなかったので、Githubから「2.0-RC2」をダウンロードして動作確認しました。

当該プラグインを導入したらplugins/TeleportSigns/config.ymlを開き、serversのセクションを以下のように編集します。

■lobbyサーバーの場合

servers:
  pvp:
    address: '127.0.0.1:25567'
    displayname: '&cPVP'

■PvPサーバーの場合

servers:
  lobby:
    address: '127.0.0.1:25566'
    displayname: '&cLobby'

さらにBungeeCordサーバーのconfig.ymlでpermissionsを編集し、「bungeecord.command.server」の権限をdefault節からadmin節に変更します。

permissions:
  default:
  - bungeecord.command.list
  admin:
  - bungeecord.command.server
  - bungeecord.command.alert
  - bungeecord.command.end
  - bungeecord.command.ip
  - bungeecord.command.reload

面倒でなければ、各spigotのserver.propertiesで「motd=」の値を分かりやすい文字列(サーバーの説明文)に変更しておきましょう。

最後に、全サーバーを再起動するなどして変更を反映させます。あとはサーバー内で実際に看板を設置しましょう。

Lobbyサーバーでは、PvPサーバーへ移動するための看板を以下のような記述で設置します。

1行目: [tsigns]
2行目: pvp
3行目: default

PvPサーバーでは、Lobbyサーバーへ移動するための看板を以下のような記述で設置します。

1行目: [tsigns]
2行目: lobby
3行目: default

上記の形式で看板を設置しようとすると(図9)、図10のように整形された看板が設置されます。

図9:サーバー移動用看板の記入例

図10:サーバー移動用看板の表示例

この場合、server.propertiesのmotdの説明文と当該サーバー内で遊んでいる人数、サーバーの接続状態などが表示されますが、defaultの部分の文字列を変えて他の形式で表示することもできます。plugins/TeleportSigns/config.ymlのlayouts節に設定可能な形式の定義があるので参考にしてください。

今回は、PvPサーバーの構成例やBungeeCordを使用して複数サーバーを接続する方法を紹介しました。複数サーバーを接続する方法は単純にMinecraftのサーバーを接続するだけでなく、複数の物理サーバーを接続する方法でもあります。サーバー構成の設計次第で柔軟に運用できる可能性を秘めているので、ぜひ色々なサーバー構成を考えてみてください。

次回は、全体的な運用保守に関わる作業について紹介したいと思います。

本連載について

Minecraftの公式記事ではありません。本連載の内容はMojangから承認されているわけではなく、Mojangとは関係ありません。

Minecraftの非公式日本ユーザーフォーラム管理人

同フォーラムに付帯する生活系マルチサーバーもMinecraft製品版発売以降個人運営を続けている。ご相談などありましたらフォーラム(http://forum.minecraftuser.jp/)やTwitter@ecolightまで。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています