目次


Minecraft とIBM Cloud, 第 2 回

Docker と Eclipse を使って Minecraft 用のプラグインを作成する

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Minecraft とIBM Cloud, 第 2 回

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Minecraft とIBM Cloud, 第 2 回

このシリーズの続きに乞うご期待。

In 第 1 回では、既製の (つまり、変更が加えられていない) Minecraft サーバーを Docker 内に構築する方法と、Spigot サーバーを Docker 内に構築する方法の両方を説明しました。これは、IBM の PaaS (Platform as a Service) 環境の IBM Cloud 上で提供される、Watson コグニティブ・サービスを含むさまざまなサービスを利用可能な、独自の Minecraft プラグインを作成するための最初のステップです。これらのサービスを利用することで、より洗練されていて、より楽しめるゲーム・エクスペリエンスが実現されます。

ただし、物事には順序があります。Watson サービスを利用可能なプラグインを作成するには、その前にいくつかのステップを完了する必要があります。この第 2 回では、次に踏むべきステップとして、ローカル開発環境を構築するために Eclipse をセットアップしてから、独自のサーバー・サイド Minecraft プラグインを開発、作成して、そのプラグインをローカル Docker イメージにエクスポートする方法を説明します。

今回の開発作業はすべて、Ecipse 統合開発環境 (IDE) で行います。Eclipse は無料のオープンソース開発環境であり、Java やその他いくつもの言語に対応しています。ほとんどどの Java IDE を選んでも、Minecraft プラグインを開発することはできますが、Minecraft 開発コミュニティーで IDE を使用している開発者の間で一般に使われているのは Eclipse です。

Ubuntu 内に Eclipse をセットアップする

Eclipse IDE を使用するには、まず Ubuntu Linux 環境に Java をインストールする必要があります。Eclipse は Java でプログラムを開発するための環境であるだけでなく、Eclipse 自体が Java プログラムです。Java をインストールするコマンドは、第 1 回の Dockerfile でも使用しているので見覚えがあると思いますが、今回はこのコマンドを Ubuntu Linux システムのコマンド・ラインで実行する必要があります。

sudo apt-get install -y default-jdk

JDK バージョン 7 のインストールが正常に完了した後は、以下のいずれかを選択します。

  • Ubuntu GUI を使い慣れている場合は、Eclipse ダウンロード・ページにアクセスして、Eclipse Mars リリースを選択してから Linux 用インストール・ファイルをダウンロードします。インストール・ファイルは gzip された tar ファイル形式となっています。Ubuntu ファイル・マネージャーで、この tar ファイルをダブルクリックすると、アーカイブ・マネージャーにファイルが開くので、このファイル・マネージャーを使用してファイルの中身を「eclipse」という名前のディレクトリーに解凍します。
  • コマンド・ラインを使い慣れている場合は、以下のコマンドを 1 つずつ実行します。

    wget
    "https://eclipse.org/downloads/download.php?file=
    /technology/epp/downloads/release/mars/R/eclipse-jee-mars-R-linux-gtk-x86_64.tar.gz&r=1"
    -O eclipse-jee-mars-R-linux-gtk-x86_64.tar.gz
    tar -xzf eclipse-jee-mars-R-linux-gtk-x86_64.tar.gz

Eclipse をどのようにダウンロードしてインストールしたかに関わらず、Eclipse を起動する方法は同じです。Eclipse がホーム・ディレクトリーにインストールされているという前提で、コマンド・ラインで以下のコマンドを実行すると、Eclipse が起動します。

./eclipse/eclipse

Eclipse が起動すると、新規デフォルト・ワークスペースを作成するか、既存のワークスペースを使用するかを尋ねられます。前者を選択し、デフォルト・ワークスペースを指定のディレクトリーに作成してください。

ワークスペース・ランチャーのスクリーンショット
ワークスペース・ランチャーのスクリーンショット

Eclipse のウェルカム画面で、右上隅にある「Workbench (ワークベンチ)」アイコンをクリックしてワークベンチを開きます。

Workbench icon

Eclipse ワークベンチが表示されます。

Eclipse ワークベンチのスクリーンショット
Eclipse ワークベンチのスクリーンショット

アーカイブ・ファイルをインポートする

Eclipse の「Project import (プロジェクトのインポート)」機能を使用して、サンプル・コードが含まれているプロジェクト・アーカイブ・ファイルをインポートします。Eclipse でのプロジェクトとは、ワークスペース・ディレクトリー内のディレクトリー構造に過ぎません。プロジェクト・アーカイブとは、Eclipse の特殊な zip ファイル形式で、完全に構成済みのプロジェクトを他者と共有するために使用することができます。プロジェクトを Eclipse に取り込んでから、サンプル・コードを見ていきます。アーカイブのインポート・ファイルは、第 1 回で GitHub から複製した minecraft-project ディレクトリーのルートにあります。そのため、いきなりこのチュートリアルから取り掛かろうとしていて、第 1 回のすべての例に従っていない場合は、第 1 回に戻って、その複製作業を行う必要があります。

  1. Eclipse ワークベンチの最上部にあるメニューから、「File (ファイル)」 > 「Import (インポート)」の順に選択します。
  2. 「General (一般)」 > 「Existing Project into Workspace (既存のプロジェクトをワークスペースへ)」を選択し、「Next (次へ)」をクリックします。 「Import (インポート)」ダイアログでインポート元を選択する画面のスクリーンショット
    「Import (インポート)」ダイアログでインポート元を選択する画面のスクリーンショット
  3. 「Select Archive File (アーカイブ・ファイルの選択)」を選択してから、「Browse (参照)」をクリックします。 「Import (インポート)」ダイアログでプロジェクトをインポートする画面のスクリーンショット
    「Import (インポート)」ダイアログでプロジェクトをインポートする画面のスクリーンショット
  4. 複製先のディレクトリーにナビゲートし (おそらくホーム・ディレクトリーですが、第 1 回で行った作業次第で場所は異なります)、minecraft-project ディレクトリーを開きます。「SpigotPlugin.zip」を選択して、「OK」をクリックします。 「Import (インポート)」ダイアログでアーカイブ・ファイルを選択する画面のスクリーンショット
    「Import (インポート)」ダイアログでアーカイブ・ファイルを選択する画面のスクリーンショット
  5. 「Finish (完了)」をクリックします。
  6. ワークスペースで、SpigotProject の横に赤い感嘆符 (!) が表示されているはずですが、これは問題ありません。これは単に、プラグインの Java コードをコンパイルするには、spigot-1.8.3.jar ファイルを指すようクラス・パスを修正する必要があると注意を促しているだけです (サンプル・コードは Spigot API に依存するため、これらの API をインポートする必要があります)。

    「Project (プロジェクト)」ペインで「SpigotPlugin.zip」を選択します。左クリックして (他のプラットフォームでは、Alt キーと Enter キーを同時に押すか、Ctrl キーを押しながらクリックします)、ポップアップ・メニューから「Properties (プロパティー)」「Java Build Path (Java ビルド・パス)」の順に選択します。「Libraries (ライブラリー)」タブを選択します。

    「Import (インポート)」ダイアログで「Libraries (ライブラリー)」タブを表示する画面のスクリーンショット
    「Import (インポート)」ダイアログで「Libraries (ライブラリー)」タブを表示する画面のスクリーンショット
  7. 「spigot-1.8.3.jar」を選択し、「Edit (編集)」をクリックします。 「Import (インポート)」ダイアログで JAR を編集する画面のスクリーンショット
    「Import (インポート)」ダイアログで JAR を編集する画面のスクリーンショット
  8. 「minecraft-project」をダブルクリックして、次のペインで「spigot-1.8.3.jar」を選択します。

    慎重に手順に従っているとしたら、この Spigot JAR ファイルは、前の例で作成した Spigot JAR ファイルのレベル (レベルは 1.11.2 でした) と一致しないことに不安を覚えるかもしれません。実際、この JAR ファイルはコードのコンパイルを可能にするためだけに使用するので、少し前のレベルでも問題ありません (API は、しばらく変更されていません)。皆さん独自のコードで、後になってレベルの違いが問題になってきた場合には、Spigot の BuildTools Wiki で説明されている手順に従って、新規 Spigot JAR ファイルをローカルで作成し、GitHub からダウンロードしたファイルの代わりとして置き換えてください。

  9. 「Apply (適用)」「OK」の順にクリックし、もう一度「OK」をクリックします。

この時点で、ワークスペースの SpigotPlugin プロジェクトの横には赤い感嘆符が表示されなくなっているはずです。つまり問題は解決されたので、サンプル・コードに取り組めます。

Minecraft 用プラグインを作成する

Spigot プラグイン API は、実際のところ、かなり単純なものです。サーブレットを作成するなど、他のタイプのサーバー・サイド・プログラミングで Java を使用したことがあるとすれば、同じ原則に従った単純な例であることがわかるはずです。この例で特定の JDK (Java 1.7) をインストールしている理由は、Minecraft のプラグイン (少なくとも、Bukkit API を使用するプラグイン) は、Java 1.7 で作成する必要があるためです。そうでないと、サーバー上で奇妙なクラス不一致のエラーが発生することになります。将来的には変更されるはずですが、今のところ、開発には Java 1.7 を堅持するのが最善です。

HelloWorld クラス

それでは、あらゆるプログラミング言語での Hello World プログラムに相当する、Minecraft 用の単純なプラグインを調べることから始めましょう。このプラグインのソース・コード・ファイルを使用して、Bukkit API の比較的単純な機能をいくつか見ていきます。

  1. 始めにプラグインのソース・コード・ファイルを表示するために、Eclipse ワークベンチのプロジェクト・ペインで「SpigotPlugin」をクリックして展開します。
  2. 「src」をクリックして展開し、続いて「com.ibm.minecraftplugin」ディレクトリーを展開します。
  3. 「HelloWorld.java」をクリックします。

HelloWorld.java ファイルの内容は以下のとおりです。

package com.ibm.minecraftplugin;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public class HelloWorld extends JavaPlugin {

    public void onEnable(){
        getLogger().info("Hello World!");
    }

    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
    {
    if (cmd.getName().equalsIgnoreCase("hello")) {
    sender.sendMessage("Hello Everybody!");
    }
    return false;
    }
}

このコードでは、2 つの単純な概念を理解する必要があります。1 つは、プラグインは JavaPlugin クラスを継承するだけで作成できることです。従って、作成するプラグインはいずれも JavaPlugin のサブクラスになります。もう 1 つは、プラグイン・クラスごとに以下の 2 つのメソッドを実装する必要があることです。

  • onEnable(): サーバーがプラグインをロードするときに呼び出されるイベント・ハンドラーです。クラスに必要なすべてのセットアップ (例えば、データベース接続のセットアップなど) は、このメソッドで行います。ここでは標準的なデバッグ・メソッドを適用して、ステータス情報がロガーに記録されるようにします。そのため、プラグインがロードされると、その結果をログ出力で確認することができます。
  • onCommand(): ユーザーが、/&COMMAND& で Minecraft コマンドを実行するたびに呼び出されるメソッドです。それぞれのプラグインは、自身がそのコマンドを処理できるかどうかを判断し (コマンドの名前を、プラグインが処理可能なコマンドの名前と比較するだけのことです)、その判断に基づいて必要なアクションを実行しなければなりません。

この例では、コマンドをプラグインで処理できることを確認した後、単純に「Hello Everybody!」メッセージをコマンドの送信側に送信します。これはありきたりな例ですが、この概念の仕組みを理解するにはこの例で十分です。お望みであれば、onEnable() メッセージが書き込むログ・メッセージを変更するか、コマンドがユーザーに送信するメッセージを変更するかのいずれかにより、プラグインをカスタマイズすることができます。

Plugin.yml ファイル

Bukkit プラグインを機能させるために必要な構成の最後のピースに、Plugin.yml ファイルが関わってきます。この構成ファイルは、フレームワークの残りの部分に対して、私たちが作成したプラグインを説明するものです。このチュートリアル・シリーズで取り上げる他の多くの構成ファイルと同じく、このファイルも YAML (Yet Another Markup Language) で記述します。YAML プラグイン・ファイルでは、タブを使用することはできないので、そのことを頭に入れておく必要があります。

plugin.yml ファイルを詳しく調べるには、SpigotPlugin プロジェクト内でこのファイルをダブルクリックします。ファイルの内容は以下のとおりです。

name: HelloWorld
main: com.ibm.minecraftplugin.HelloWorld
version: 1.0
commands:
  hello:
    description: A new command

ご覧のように、かなり単純な内容です。ファイルの先頭にプラグインの名前、メイン・クラス、バージョンを指定し、その次の commands: セクションに、クラスで処理するすべてのコマンドを (スペース 1 つでインデントして) リストアップします。上記の例には、コマンドの description セクションしか示されていませんが、Plugin YAML のドキュメントを調べると、他にも使用できるセクションがあることがわかります。

ローカルでテストする

ここまでで、初めてのプラグインのコードを作成できたので、そのコードをエクスポートして試してみる準備は整いました。

サンプルとして提供されている、事前に作成済みの HelloWorld.jar ファイルをそのまま使用する場合は、JAR ファイルのエクスポート手順を説明している次のセクションをスキップして構いません。コードにまったく変更を加えていない場合は、これが最も早い方法です。変更を加えた場合、新しいコードを試すには、次のセクションで説明する手順に従う必要があります。

JAR ファイルをエクスポートする

次の手順に従って、JAR ファイルをエクスポートします。

  1. ワークベンチで「SpigotPlugin」プロジェクトを選択し、左クリックして表示されるメニューから「Export (エクスポート)」を選択します。
  2. 「Export (エクスポート)」ダイアログで「Java」 > 「JAR file (JAR ファイル)」の順に選択し、「Next (次へ)」をクリックします。「Export (エクスポート)」ウィンドウのスクリーンショット
    「Export (エクスポート)」ウィンドウのスクリーンショット
  3. JAR ファイルを指定するダイアログ・ボックスで、「Browse (参照)」をクリックします。
  4. ファイルを選択するダイアログ・ボックスで、minecraft-project ディレクトリーの spigot-plugin サブディレクトリーへナビゲートし、「HelloWorld.jar」を選択してから「OK」をクリックします。 JAR ファイルを選択するダイアログ・ボックスのスクリーンショット
    JAR ファイルを選択するダイアログ・ボックスのスクリーンショット
  5. JAR ファイルを指定するダイアログ・ボックスで、「Overwrite existing files without warning (警告を出さずに既存ファイルを上書き)」をクリックして選択し、「Finish (完了)」をクリックします。 JAR ファイルを指定するダイアログ・ボックスのスクリーンショット
    JAR ファイルを指定するダイアログ・ボックスのスクリーンショット

以前の JAR ファイルが新規 JAR ファイルで置き換えられました。いよいよ、コードが正常に機能するかどうかを確かめます!

新規 Dockerfile

前の例と同じく、Docker イメージ内でサンプル・コードを作成する新しい Dockerfile を使用します。まず、Ubuntu 内で 2 つ目のターミナル・ウィンドウを開きます。こうすることで、Eclipse を実行したまま Docker コマンドを実行することができます。新しく開いたターミナル・ウィンドウで (カレント・ディレクトリーが、minecraft-project ディレクトリーを複製したホーム・ディレクトリーであることを前提とします)、以下の 2 つのコマンドを実行します。

cd minecraft-project/spigot-plugin
cat Dockerfile

これにより、以下に記載する、この例に応じた新規 Dockerfile が表示されます。時間をかけて新規 Dockerfile に目を通し、前のサンプル Dockerfile との違いを特定できるかどうか確かめてください。

# Version 0.0.3
# This version builds a spigot server
# using the recommended build strategy for spigot
# This is advantageous in that it’s better for plugin development
# and fits well with the Docker approach
# it also adds a first Minecraft plugin into the bare spigot server
#
FROM ubuntu:16.04
MAINTAINER Kyle Brown "brownkyl@us.ibm.com"
RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y default-jdk
RUN apt-get install -y wget
RUN mkdir minecraft
RUN wget "https://hub.spigotmc.org//jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar" -O minecraft/BuildTools.jar
RUN java -jar minecraft/BuildTools.jar –rev 1.12
RUN echo "eula=true" > eula.txt
RUN mkdir plugins
ADD HelloWorld.jar /plugins/HelloWorld.jar
CMD java -XX:MaxPermSize=128M -Xms512m -Xmx1024m -jar spigot-1.12.jar nogui
EXPOSE 25565

お気付きのように、このシリーズの第 1 回で見てきた 0.0.3 サンプル Dockerfile とよく似た内容になっていますが、いくつかの違いがあります。その 1 つは、この Dockerfile では「plugins」という名前の新しいディレクトリーを作成することです。もう 1 つは、これまで見たことがない新しいコマンド ADD を Docker 内で実行することです。

ADD コマンドによって、ローカル (ホスト) ディレクトリーのファイルが Docker ファイルにコピーされます。これは素晴らしいことです!これこそが、この例で目的としていたことです。つまり、他のものは何も変更せずに、プラグイン・ファイルだけを変更できるようにしたいのです。ただし、Docker の run で新規コンテナーを起動するたびに実行される CMD コマンドとは異なり、ADD コマンドが実行されるのは、Dokcer の build を実行するときだけです。つまり、プラグインに変更を加えた場合は、イメージを再作成しなければなりません。この例では、コマンド・ラインで以下のコマンドを入力して実行することで、初めての新規イメージを作成してみましょう。

sudo docker build -t="<directory>/spigot112-plugin" .

第 1 回で行ったように、<directory> は自分のログイン ID で置き換える必要があります。新規イメージを初めて作成する際には、Docker が新しいイメージの層をいくつか作成しなければならないため、2 回目以降に作成するときより時間がかかるかもしれません。

これで新規イメージを作成できたので、今度はこのイメージを実行してみます!それには、以下のコマンドを入力して実行します。

sudo docker run -i -t -p=25565:25565 <directory>/spigot112-plugin

Docker コンテナーを起動しているポートは前と同じなので、Minecraft クライアントの構成を変更する必要はありません。Minecraft サーバーの画面上のログで、プラグインが正常に機能していることを最初に示している、以下のような行を探します。

[14:22:50 INFO]: Done (12.942s)! For help, type "help" or "?"

サーバーが正常に起動したことを確認できたら、Minecraft クライアントを起動してサーバーに接続し、Minecraft 内で以下のコマンドを入力します。

/hello

すると、以下のような Minecraft コマンド画面が表示されるはずです。

Minecraft 画面のスクリーンショット
Minecraft 画面のスクリーンショット

「Hello Everybody」というメッセージ (または、メッセージを変更した場合は、そのメッセージ) が表示されたら、正常に機能しています。おめでとうございます!

まとめ

このチュートリアル・シリーズの第 2 回では、Eclipse を使用して単純なサーバー・サイドの Minecraft 用プラグインを作成する方法、そのプラグインを Docker 上で実行する方法を紹介しました。第 3 回では、プラグインを次のレベルへと拡張し、プラグインを IBM Cloud にデプロイして Web 上で実行します。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, Java technology, Cognitive computing
ArticleID=1025102
ArticleTitle=Minecraft とIBM Cloud, 第 2 回: Docker と Eclipse を使って Minecraft 用のプラグインを作成する
publish-date=03082018