MinecraftConnectionCore (prerelease) ライブラリを公開しました

C# から Minecraft にコマンドを投げるためには CoreRCON パッケージの導入が必要でした。また、コマンドを送信するためには非同期なメソッドにする必要があり、プログラミングを始めたばかりの方にはかなりハードルが高いように感じました。そこで、非同期処理を意識しなくても書けるようなライブラリを作成しました。それが MinecraftConnectionCore です。

f:id:takunology:20210305143631p:plain:w360

導入方法と使用方法は Github の README に書きましたが、このブログでも紹介します。

github.com

1. 動作環境

このライブラリは .NET Standard 2.0 で作成しており、最新版の .NET 環境であれば問題なく使用できると思います。ベースは CoreRCON なので、CoreRCON さえ動かすことができればどんな環境 (Xamarin, ASP.NET Core, Azure Funcitons) でも動かせます。これらは既に以前の記事に書いたように、すでに動作確認済みです。過去の記事が気になる方は以下からどうぞ。

blog.takunology.jp

blog.takunology.jp

blog.takunology.jp

また、Minecraft は 1.13 以降に対応しているはずですが、確認したのは 1.16.3 のみです。確実に動かしたい場合は 1.16.3 で動かすことをおススメします。

2. 導入方法

NuGet パッケージマネージャーから導入することができますが、パッケージは prerelease 版なので プレリリースを含める にチェックを入れないと表示されません。

f:id:takunology:20210305145343j:plain

パッケージマネージャ-コンソールで導入する場合は次のコマンドを使用します。

Install-Package MinecraftConnectionCore -Version 1.0.0-beta1

www.nuget.org

これで導入完了です。

2. Minecraft Server を起動する

プログラムを実行するには RCON 接続された Minecraft Server が必要です。サーバファイルのあるディレクトリで server.properties を探し、次のように編集します。(ポート番号とパスワードは使用する環境に合わせてください。)

rcon.port=25575
rcon.password=minecraft
enable-rcon=true

この設定でサーバを起動し、クライアント側のマイクラも起動します。(サーバだけでもコマンドは投げられますが、コンソール出力なので見ていても面白くないと思います。)

3. プログラム (C#) を書く

あとはプログラムを書くだけです。MinecraftConnectionCore には MinecraftCommands クラスがあり、サーバの IP アドレス、ポート番号、パスワードを引数にしてインスタンスを生成します。この中にコマンドを投げるためのメソッドがいくつか用意されているので、好きなものを呼び出して使用します。

例えば、Minecraft 内の時刻を 0 に設定するプログラムは次のように書きます。

using System.Net;
using MinecraftConnectionCore;

namespace ExampleApp
{
    class Program
    {
        private static IPAddress Address = IPAddress.Parse("127.0.0.1");
        private static ushort Port = 25575;
        private static string Pass = "minecraft";
        private static MinecraftCommands command = new MinecraftCommands(Address, Port, Pass);

        static void Main(string[] args)
        {
            command.SendCommand("/time set 0");
        }
    }
}

これが最低限動かすためのコードです。

4. 使用できるコマンド

現段階で実装しているメソッドを紹介します。

  • DisplayMessage (object Text) : チャットログにメッセージを表示します。
  • DisplayTitle (object Text) : 画面中央に大きく文字を表示します。
  • GiveEffect (string PlayerName, string EffectID, int Time) : プレイヤーにポーション効果を付与します。(時間指定あり)
  • GiveItem (string PlayerName, string ItemID, int Count) : プレイヤーにアイテムを与えます。(数量指定あり)
  • ItemClear (string PlayerName, string ItemID, int Count) : プレイヤーのアイテムを消去します。(数量指定あり)
  • SendCommand (string Command) : Minecraft に任意のコマンドを使用します。
  • SetBlock (int x, int y, int z, string BlockItemID) : 指定した座標 (x, y, z) にブロックを配置します。
  • Summon (int x, int y, int z, string EntityID) : 指定した座標 (x, y, z) に Mob を召喚します。

よく使うコマンドをメソッドに追加してありますが、コマンドを知っている方は SendCommand メソッド1つでも十分ですね。また、それぞれ返り値が string なので、実行結果が欲しい場合は適当な変数を用意して代入することもできます。

var result = SendCommand("/time set 0");
Console.WriteLine(result);

5. CoreRCON も使用できます

ベースが CoreRCON なだけあって、この機能も使用できます。C# プログラミングに慣れている方で、非同期で実行するようなロジックを組む場合は CoreRCON のインスタンスを生成してプログラムを書くことができます。ですが、その場合は MinecraftConnectionCore ではなく、CoreRCON のみを導入することをおススメします。

6. CoreRCON との違い

大きく違うのは次の2点です。

  • 非同期なメソッドを書かなくて良い
  • Minecraft コマンド用のメソッドが用意されている

これらのおかげで、非同期処理の実装方法を知らない人やマイクラのコマンドを知らない人にとって、プログラムが書きやすくなります。また、非同期な処理を書く必要がないのでプログラムが短く書けます。例えば、CoreRCON を用いた場合とMinecraftConnectionCore を用いた場合で比べるとこのようになります。

// CoreRCON の場合
using System.Net;
using System.Threading.Tasks;
using CoreRCON;

namespace SampleApp
{
    class Program
    {
        private static IPAddress Address = IPAddress.Parse("127.0.0.1");
        private static ushort Port = 25575;
        private static string Pass = "minecraft";
        private static RCON rcon = new CoreRCON.RCON(Address, Port, Pass);

        static void Main(string[] args)
        {
            Task.Run(async () => {
                await rcon.ConnectAsync();
                await rcon.SendCommandAsync("/time set 0");
            }).GetAwaiter().GetResult();
        }
    }
}
// MinecraftConnectionCore の場合
using System.Net;
using MinecraftConnectionCore;

namespace SampleApp
{
    class Program
    {
        private static IPAddress Address = IPAddress.Parse("127.0.0.1");
        private static ushort Port = 25575;
        private static string Pass = "minecraft";
        private static MinecraftCommands command = new MinecraftCommands(Address, Port, Pass);

        static void Main(string[] args)
        {
            command.SendCommand("/time set 0");
        }
    }
}

インスタンスを生成するまでは同じですが、非同期な処理を実装するか否かでかなり違います。また、ラムダ式を使わない場合は async Task のメソッドを作って実行する必要があり、少し面倒です。これが1行で済むのが大きな特徴と言えます。

7. MinecraftConnection との違い

以前から記事で小出しにしている MinecraftConnection というライブラリは MinecraftConnectionCore に加えてオリジナルのメソッドをいくつか追加したり、ポーション効果名やエンチャント名、NBT 変換など、様々なデータを扱えるようにしたものです。Core は純粋なマイクラのコマンド、まさに「コア」の部分だけを抽出して使えるようにしたライブラリです。規模としては MinecraftConnection のほうが大きいのですが、その分完成までに時間がかかってしまいます。もしかすると同じようなライブラリが出る可能性もあるので、先手を打って今回の形になりました。

MinecraftConnectionCore はある程度メソッドを追加しつつ、動作確認が終われば最終リリースになります。その後、MinecraftConnection へと引き継ぐ形になる予定です。

8. おわりに

これから プログラミングを始めたい方への1つの手段として、C# によるマインクラフトプログラミングを提供します。マイクラプログラミングと言えば、ビジュアルプログラミングや JavaScript, Python などが主流ですが、そこに C# も加わることができればいいなと思っています。学生の方は、Minecraft Education Edition で学習した内容を、Minecraft という環境を変えずにそのまま C# へ移行できるのも1つの強みです。

興味があればぜひ導入してやってみてください。