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

生活サーバーや経済サーバーを立てる

2016年7月1日(金)
ecolight

前回まで2回にわたって、様々なサーバーで使用されるメジャーなプラグインを中心に紹介しました。今回は生活サーバーや経済サーバーなどの常設サーバーの運用についてノウハウを紹介したいと思います。

生活/経済サーバーに必要な機能を考える

生活サーバーや経済サーバーを24時間常設で設置すると、様々な問題が見えてきます。例えば、以下のような感じです。

  • ワールドが広がり過ぎてデータサイズが無駄に増える
  • ワールドが手狭になった、長距離移動が面倒くさい
  • チャット人数が多すぎて話が流れる、または聞きたくない会話が聞こえる
  • サーバー荒らしへの対応が追い付かない
  • 長時間のサーバー稼働によりサーバー本体やプラグインの不具合でメモリが枯渇する
  • サーバー負荷により動作が遅くなる
  • 経済概念の導入でゲームバランスが崩れた

これらはあくまで一例ですが、こういった問題への対応を様々な観点から提案してみたいと思います。Minecraftのサーバー運営においては発想力も大切なので、ここで解説しない解決案を考案し、他のサーバーと差別化を図る事も踏まえて参考にしてください。

ワールドが広がり過ぎてデータサイズが無駄に増える

Minecraftの売りのひとつでもあるワールドサイズですが、その広さは1ワールドあたり4,096,000,000km2まで広げる事ができると言われています(1ブロックの一辺が1m)。

これは実に地球の表面積の約8倍とも言えるサイズですが、人が立ち入らない領域はチャンク(ワールドを構成する16×16ブロックの単位)データが生成されないため、普段はデータ容量を圧迫する事は少ないと思います。

ただし、ワールドの遠方に行くことで新しい地形や建物が生成されるため、そこで手に入る新しい素材を求めてワールドをどんどん広げる人が必ずと言ってよいほど発生します。

この事から、ほとんどの場合でワールドサイズをある程度制限することは必須であり、悪意を持ってマップサイズの肥大化を行う荒らしにも対応できません。

ワールドサイズの制限方法

ワールドサイズの制限方法には色々とありますが、ここでは2つの方法を紹介します。

1. 標準のコマンドで制限する

Minecraftサーバーの標準機能として実装されている/worldborderコマンドにより、視認可能な世界の境界(壁)を設定できます。この境界は通過できないだけでなく、境界を越えてブロックに干渉することもできません(図1)。

Worldborderコマンドで作成された境界(壁)の例

図1:Worldborderコマンドで作成された境界(壁)の例

worldborderコマンドの詳細については、公式wikiなどの解説を参考にしてください。基本的にはcenterオプションで中心地点を設定し、setオプションで直径を設定します。setオプションには直径の変更に掛ける時間も指定でき、徐々に境界のサイズを変更するといった設定もできます。

なお、本コマンドの実装当時は、境界の設定時に他のワールドにいる場合も境界外を示すエフェクトが適用されるなどのバグが発生していましたが、少なくともspigot 1.10及びMinecraft 1.10の組み合わせでは特に問題はありませんでした。

2. WorldBorderプラグインで制限する

マップの大きさを制限できる「WorldBorder」プラグインを使用します。Minecraft Japan Wiki(http://www26.atwiki.jp/minecraft/pages/1061.html)の一覧にも記載されています(図2)。

WorldBorderプラグイン

図2:WorldBorderプラグイン

Minecraftサーバーにworldborderコマンドが実装されて以降は本プラグインの需要は減っていますが、円形の境界を設定したり、境界の外側にあるワールドデータを破棄したり、境界の内側のチャンクを予め全て生成させておくことができたりと、多くのメリットがあります。

例えば、新しく生成したワールドを多くのプレイヤーが探索する際にチャンクの新規生成でワールドが重くなる事を懸念する場合は、本プラグインで予めチャンクを生成しておくといった使い方ができます。

なお、本プラグインは「境界が視認できず分かりづらい」という特徴がありますが、境界を越えた時は「数ブロック前にテレポートさせる+ブロックがある場合はブロックがない位置までY座標が補正される」仕様のため、本来の用途とは少し異なりますがちょっとしたエレベータが作れたりもします(境界を変更する可能性を考えると多用すべきではない)。

また、サーバーの地図をWebサービスとして提供する「dynmap」プラグインに境界を描画させることもできるので、そういった点でも公式のコマンドより有用かもしれません。

ワールドの資源採集/建設範囲について

前述の方法で制限したワールドサイズは資源の採集範囲にも影響します。また、建設を行うワールドでむやみに資源採集を行うと景観を損ねる可能性があることや、建築物の上空や地下にいつの間にか他人の建築物ができてしまうといった事もしばしば発生します。

有効な対策手段としては、移動できるワールドを追加する事でしょう。ワールドの操作やワールド間を行き来する方法については次項で説明します。

ワールドが手狭になった、長距離移動が面倒くさい

「ワールドが手狭になってきた」「長距離移動が面倒くさい」という話は一見すると無関係のようにも思えますが、似た技術で解決可能です。こういったケースでは、一般的にマルチサーバーに「ワールド」と新しいワールドとの行き来を可能にする「ゲート(「ポータル」など色々名称がある)」を追加します。

ゲートは同じワールド内も繋ぐことができるので、遠方と往来しやすくすることで開発を促進する効果が狙えたりします。他にも関連する仕組みがありますので、併せて紹介したいと思います。

ワールドとゲートの追加

生活サーバーでは建築を行うワールドで資源採集を行うと様々な問題が発生することから、資源採集用のワールドを追加し、定期的に資源用ワールドのみ再生成する取り組みが多くのサーバーで行われています。

かつては、そのための有名なプラグインがいくつかありましたが、直近である程度メンテナンスされているものとして「Multiverse」プラグイン(図3)があります。導入する際は「Multiverse-Core」と「Multiverse-Portals」という2つのプラグインを合わせて導入します。

Multiverseプラグインを導入してみる

図3:Multiverseプラグインを導入してみる

なお、コマンドの使用方法といった詳細は配布元のWikiなどにチュートリアルがありますので、そちらを確認してください。簡単にまとめると、以下のようにコマンドを使用します。

  • /mvコマンドのcreateオプションで新しいワールドを作成、あるいはimportオプションで既存ワールドの取り込み
  • /mvコマンドのtpオプションでワールド間の直接移動
  • /mvpコマンドのcreateオプションでゲートを作成/接続、またはmodifyで接続の変更など

これらのコマンドにより、新規ワールドを作成して任意の場所にゲートを設置できます。同じワールド内の遠距離を繋ぐゲートにも応用できるでしょう。他にもオプションが多数ありますので、配布元の解説を参照して色々と試してみてください。

ホームコマンドの追加

生活サーバーの場合は長距離移動が非常に困難な規模になることもあり、ホームコマンドを採用するサーバーが多いかもしれません。この機能を実装するプラグインも非常に多くの種類がありますが、Minecraft Japan Wikiに掲載されているプラグインでは「MyHome」プラグイン(図4)が該当します。

MyHomeプラグインを導入してみる

図4:MyHomeプラグインを導入してみる

コマンドの詳細は配布元を参照いただくとして簡単に機能を説明すると、/home setコマンドで設定した地点に/home コマンドで瞬時にテレポートできる、といった機能をもつプラグインです。いくつでも設定できると任意の場所にいつでもどこでも行ける事になってしまうため、導入するにしても1か所のみ設定可能なプラグインを導入すべきでしょう。

このようなプラグインをどのように利用者に利用してもらうかは管理者の手腕による所ですが、テレポート機能を充実させ過ぎるとサーバー内におけるトロッコ交通網の発展を阻害する原因にもなり、本来のMinecraftらしさが失われてしまうでしょう。とは言えトロッコの移動にも時間が掛かるので、あまりに遠い場所はゲートがあっても良さそうです。そのあたりは実際に運営しながら感覚を掴んでいきましょう。

チャット人数が多すぎて話が流れる、または聞きたくない会話が聞こえる

マルチサーバーには参加者間のチャット機能がありますが、デフォルトのチャット機能は全員の会話が全員に到達する広域チャットが実装されています。極小規模のサーバーであればあまり不便を感じないかも知れませんが、ある程度の人数が出入りするようになると問題が多々発生します。

例えば、「単純なスパム行為」と呼ばれるチャットへの連続投稿、誹謗中傷や卑猥な発言といった荒らし行為が行なわれることもあります。またインターネットのマナーを知らない利用者によりチャットが意図しない使われ方をする可能性もあるでしょう。

また、広域チャットではなく単純に小規模のメンバーで会話したい、といった問題も発生するかと思います。そのような場合はチャンネルチャット機能を持ったプラグインを導入すると良いでしょう。

Minecraft Japan Wikiで紹介されているものでは「LunaChat」プラグイン(図5)などがあります。

LunaChatプラグインを導入してみる

図5:LunaChatプラグインを導入してみる

なお、チャンネルチャット機能は用途が非常に多くここでは紹介しきれませんが、チャットの不満を解消する目的で利用するのが一番効果的かもしれません。

例えば、初めてサーバーに入ってきた人が参加するデフォルトのチャンネルとは別に通常会話を行うチャンネルを用意することで、スパムやマナー違反におけるチャットの荒らし発言を比較的隔離しやすくなります。チャンネルチャット機能を実装するプラグインによってはプレイヤー個別のNG利用者機能で特定プレイヤーの発言を非表示にできるため、概ね多数の利用者の快適なプレイ環境が保たれるでしょう。

他にも、サーバー内のイベント開催時に参加者のみ特定のチャンネルに参加してもらう事で円滑に進行できたり、サーバー内に町ができた場合、その区域の自治メンバー間で独自のチャンネルを設けたりといった使用方法もできるでしょう。

サーバー荒らしへの対応が追い付かない

マルチサーバーに人が多く来るようになると、1人ないし少人数の管理者では荒らしへの対応が遅れたり見逃したりしてしまう事も多くなってきます。対処法としてログや荒らし対策プラグインなどの強化も検討要素の1つですが、信頼できる人に権限を委譲(「モデレータ」と呼ぶ)した上で管理体制を敷くといった方法も重要でしょう。

権限の貸与について十分注意する

モデレーターを採用する場合、採用側にもある程度の任命責任があると考えて十分にリスク対応を検証すべきです。例えば、簡単にOP権限を渡してしまえばサーバーの停止コマンドはおろかワールドデータを破壊するコマンドも使用可能になるため、悪意のある利用者をモデレーターにしてしまうと取り返しがつかなくなります。これは色々なMinecraftのサーバー運用で頻繁に発生しており、最も注意すべき事項の1つです。

筆者としては赤の他人をモデレーターにするのはもっての外と考えていますが、少なくとも管理者自身が「この人は安心して任せられる」と思った人以外にはモデレーター権限を与えるべきではないでしょう。また、与える権限についても後から管理者が操作を取り消しできるコマンドのみに制限する事も大切です。

BAN対応などは厳密に基準の認識を合わせる

モデレーターによってBAN基準が大きく異なると利用者の不満を招きます。予め話し合い、認識を合わせておくことが重要です。BANに至るまでの調査手順や判断基準をある程度マニュアル化しておくのも有用でしょう。そういった意味ではモデレーターが増えればそれだけ情報伝達に係る労力が増えるため、逆に管理者だけが重要な判断を行う体制にするのも方法のひとつです。いずれにせよ、モデレーターの不祥事などは管理人やサーバー自体の評判に関わるため慎重に推し進めるべき事柄です。

他にも色々とありますが、複数人で1つの目的に沿って組織的に活動する事を考えると、一般的なプロジェクトマネジメント能力が求められると考えられます。本項の内容については主にリスクマネジメントの分野になると思いますが、そういった知識も動員してサーバーのリスク管理や危機管理の意識も持つと良いでしょう。

長時間のサーバー稼働によりサーバー本体やプラグインの不具合でメモリが枯渇する

特にマルチサーバーにプラグインなどを導入した場合は、サーバー本体やプラグインのメモリリークによりメモリ消費が増大するケースがあります。「Javaならガベージコレクションで適切にメモリが開放されるのでは?」と思われるかもしれませんが、単純にキューにオブジェクトを積んだまま取り出し忘れるようなケースではメモリが開放されないため、プラグインの作りによってはメモリリークが発生します。こういったケースへの対処法としてサーバーを定期的に再起動するのも1つの手でしょう。そこで一例ですが、サーバー再起動のスケジューリングについて紹介します。

サーバー停止後に自動的に再起動する

単純な話、サーバーが不慮の事故などで停止しても、自動的に再起動するようにしておけばダウンタイムを減らすことができます。例えばBATファイルであればgoto文でサーバーの起動前に戻す、シェルスクリプトであればサーバーを起動する実行文をwhileで括ってやれば即時に再起動できます。

■BATファイルの例

:restart
java.exe -Xms1G -Xmx4G -jar spigot-1.10.jar –nojline
goto restart

■シェルスクリプトの例

while : ; do java.exe -Xms1G -Xmx4G -jar spigot-1.10.jar –nojline; done

サーバーマシンの装置を含めて再起動する

サーバーマシンのメモリをクリアするため装置ごと再起動したいケースもあると思います。このような場合は、サーバーを再起動するコマンドに加え、サーバー起動後に自動的にMinecraftサーバーを実行させる仕組みを作る必要があります。

・BATファイルの場合

  1. 「shutdown.exe /r /t 0」などのコマンドで再起動する
  2. スタートアップ時にタスクスケジューラでサーバー起動用BATファイルを実行させる

・シェルスクリプトの場合

  1. 「shutdown -r now」などのコマンドで再起動する
  2. /etc/rc.d/init.d配下にMinecraftサーバーの起動スクリプトを作成し、再起動時に自動実行させる

詳細な記述法は調べれば簡単に見つかると思いますので、説明は省きます。

指定時刻にMinecraftサーバー停止させる

サーバーを計画的に停止したい場合は、任意の時間にサーバーの停止コマンドを実行するよう設定します。

・Windows環境の場合

非公式フォーラムに同様の話題があります。詳細はこちらの内容を参照してください。

・Linux等の場合

screenなどで仮想端末を作成した上でMinecraftサーバーを起動し、cronから該当端末にstopコマンドを送出する、といった方法などがあります。

・その他

指定時刻にstopコマンドを実行できるプラグインを導入するのが手っ取り早いかもしれません。あまり難しい機能ではないので、試しに作ってみるのも良いでしょう。

サーバー負荷により動作が遅くなる

サーバーに負荷が掛かるケースは色々な原因があり、その究明は困難を極めます。サーバーの物理構成やソフトウェア構成、プラグイン構成などにも関わるため一概には言えませんが、参考程度に懸念される問題点と対策案などを紹介します。なお、ここで紹介する事案や検討事項はあくまで被疑箇所の一例であることに留意ください。

一部プレイヤーの切断を伴うケース

プレイヤーの切断を伴う場合はネットワーク周りが疑わしいかも知れません。特にルーターが貧弱だとセッションを維持できずパケットを破棄してしまうケースもあります。そのような場合にはプレイヤーが切断されます。

慢性的にトロッコや動物、アイテムなどサーバー側管理のエンティティ移動が遅延する

次項にも関連しますが、サーバーサイドの処理が全体的に遅延する場合、その時点でロード中のチャンクが原因の可能性があります。過去には、額縁に地図を貼り付けるとサーバー処理が極端に重くなったり、LWCプラグインで保護された古いホッパーがパフォーマンスに影響を与えたりという事例がありました。具体的な原因までは究明できませんでしたが、そのような事案も念頭に対応を検討すると良いでしょう。

なお、検証方法には色々とありますが、単純にチャンクのロード範囲を少しずつ変えて原因のあるチャンクを特定し、そのチャンク内の怪しいものを1つ1つ撤去して再設置する等で原因が分かるかも知れません。

また、単純に「導入したプラグインが多すぎる」という問題もあるかもしれません。Minecraftサーバーは20tick/秒(tickは全体の処理1回分の単位)で動作しており、これにはプラグインの動作も含まれます。したがって、特定のプラグインの動作が重いと1秒間に処理できるtickの回数(TPS ※Tick Per Second)が減り、パフォーマンス低下が体感できるようになります。

理想は全てのプラグインおよびサーバー本体の処理時間を合わせて50ミリ秒以内に抑えることですが、事実としてある程度のサーバー規模で人数も増えると50ミリ秒以内の維持は難しくなり、プラグインの選定やチューニングが重要になってくるでしょう。

特定のコマンド実行でサーバー応答が遅延する

レアケースかもしれませんが、特定のコマンド実行によりサーバー処理が重くなるケースもあります。単純にそのコマンドが原因と考えられるため、代替コマンドに置き換える方法で回避できます。仮にそれが自分で作成したプラグインの場合は、コマンド処理を分割して非同期に実行し、後から結果をコマンド実行者に送信するような仕組みにするとサーバーのレスポンス低下を防ぐことができます。

定期的にサーバーの処理が遅延する

これも確実な事は言えませんが、Java仮想マシンのメモリ管理がボトルネックになっているケースがあります。この場合はJavaのGC(ガーベジコレクタ)の動作オプションを見直す必要があるかもしれません。

JavaのGCはシリアルGC・パラレルGC・CMS GC・G1GCなどいくつか種類があり、どのGCを利用するか、どのようなパラメータを与えるかでパフォーマンスが大きく変わります。Minecraftでベンチマークを取得していないため詳細は紹介できませんが、負荷発生時にはこれらを検証して最適に設定する必要があるでしょう。

経済概念の導入でゲームバランスが崩れた

プラグインで経済概念を導入する方法は色々とあります。例えば「iConomy」や「Essentials」などのプラグインが代表的です。このようなプラグインでは利用者間の物々交換や仮想通貨を介した取引、参加者と管理者間の取引など色々な事を行なえます。

取引以外にも、経済概念の延長線上に職業概念を追加して一定の行動に応じた仮想通貨が手に入る仕組みなどもあり、想像以上に複雑性は高いです。通常Minecraftは自分で採掘や伐採、建設するプレイがスタンダードですが、経済が発展すると取引で物が手に入るため、採掘しなくてもダイヤモンドが手に入ったり、伐採しなくても木材で家を建てられたりとプレイの幅が大きく広がります。

一方で、例えば管理者が仮想通貨でアイテムを販売する事で、本来は採掘しないと手に入らないアイテムが伐採だけで手に入ったり、敵を倒して仮想通貨を得るだけで手に入ったりすることもあります。最悪の場合、サーバーで採掘する人がいなくなるかもしれません。このような現象は「Minecraftの一要素を楽しんでくれる人が居なくなる」という意味でサーバー管理者としては嬉しくない出来事ではないでしょうか。

通貨の価値を考える

通貨にどれだけ重要度を持たせるかでプレイヤーの行動指針も変わってきます。その点でプレイヤーへの求心力や経済格差に対応していく事も可能でしょう。例えば管理者がプレイヤーに物を販売する場合、貴重なアイテムやブロックを安価で大量に放出するとプレイヤー間の経済活動が低調になる可能性もあります。そういった意味では、管理者の手腕によりサーバーの面白さがかなり変わってくるので、より慎重に検討すべきでしょう。調整は難しくなるかも知れませんが、職業概念を組み合わせてより広いゲーム性を持たせるのも大きな求心力となると考えられます。

インフレやデフレの概念

現実世界と異なり、Minecraftの世界を自由に行動できる場合は通貨の入手経路が多々あるため、通貨の流通量を大きくコントロールできないと考えられます。また、管理者が用意したショップ等で無限にアイテムを放出する場合にも物資量に制限がないと言えます。このような点で物が溢れるケースやお金が有り余るようなケースが発生する可能性があるでしょう。ゲームとしてアンバランスな事象に管理者がどうやって介入しバランスを調整していくかが経済サーバーの要となるのではないでしょうか。

今回は、生活サーバーを中心に経済サーバーについても少し触れました。経済サーバーについてはあまり解説できる部分はありませんが、生活サーバーでも物々交換により経済概念が発生する場合があります。経済プラグインを導入すれば手軽に経済活動をゲームに組み込むことができますが、バニラベースのMinecraftで物々交換による経済活動が発展するのもMinecraftの魅力であると言えるでしょう。

サーバーにどのようなゲーム性を持たせるかは管理者の手腕による所なので、「サーバーを立ち上げたい」という人は是非独自のコンテンツを考案し発展させていってください。

次回も特定用途のMinecraftサーバーについて紹介したいと思います。

本連載について

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

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

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

連載バックナンバー

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

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

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

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