【Python, C#】Minecraft自動化 #1 環境構築とコマンド操作

はじめに

このシリーズはdocker環境ではなく、jarファイルで起動したforgeサーバを用います。また、サーバの環境構築はできていて、遊べる状態を前提としています。

Minecraft自動化ですが、「自動化」というと「自動収穫」や「経験値トラップ」を思い浮かべるかもしれませんが、残念ながら違います。本ブログでは自動化は「プログラミング」による自動化を意味します。

私自身、プログラミングによってどこまで操作できるのかが把握できていないので、真面目に遊びながら検証していきたいと思います。

動作環境

今回以降、このシリーズはこの環境で進めていきます。

  • Windows10 Pro 1803 (Build 17134.950)
  • Minecraft ランチャ― 2.1.5964
  • Minecraft 1.7.10
  • Forge 10.13.4.1614 + LiteLoader 1.7.10
  • 各種MOD (IC2 Ex, Build Craft, 豆腐など)

お品書き

  1. サーバ情報の編集
  2. Python を使ったコマンド操作
  3. C# を使ったコマンド操作

1. サーバ情報の編集

サーバの jar ファイルが置いてあるディレクトリにて "server.properties" ファイルを開いて編集します。色々書いてありますが、次の3行を末尾でもいいので、追記してください。

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

これらはRCON関係を有効にする設定です。RCONはマイクラをリモートからコマンド操作するために必要なツ―ルです。

追記できたら保存してサーバを起動しておきます。

サーバを起動できたら、遊びたいサーバのサーバアドレスに"localhost"と設定しておいてください。

環境構築はたったこれだけです。

2. Python を使ったコマンド操作

Pythonの環境を整えておいてください。環境ができている人は、pipコマンドを用いてMCRCONパッケージをダウンロードします。

私は VScode を使って環境を整えていきます。

pip install MCRCON

f:id:takunology:20190823174302p:plain

こんな感じに導入できました。

あとはプログラムを書くだけですが、参考になる動画があります。この "くらでべ" の動画を参考にしながら進めていきます。

www.youtube.com

私はこのように書いてみました。

server_address = "localhost"
server_pass = "minecraft"

from mcrcon import MCRcon

with MCRcon(server_address, server_pass, 25575)as mcr:
    mcr.command("/time set 0")
    mcr.command("/weather clear")

アドレスは遊びたいサーバのサーバアドレス、パスワードとポート番号(25575) は "server.properties" ファイルに記述した設定どおりです。

早速実行してみます。

f:id:takunology:20190824055812p:plain

ログを見ると、[RCON Client #2/INFO] の記述があるのでRCONを通してマイクラに反映されました。朝になっていますね。

3. C# を使ったコマンド操作

C#ではCoreRCONをNugetからインポートして記述します。

www.nuget.org

まず、Visual StudioC# コンソールアプリのプロジェクトを立ち上げます。 Visual Studio のパッケージマネージャコンソールにて次のようなコマンドを入力して上記のものをインポートします。

Install-Package CoreRCON -Version 3.0.0

あとはC#の書き方に沿って書くだけですね。注意する点は、IPアドレスをそのまま代入できないので、IPAddress型に変換する必要があります。

using CoreRCON;
using System;
using System.Net;
using System.Threading.Tasks;
using System.Windows;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Now Starting...");
            await minecraft();
        }

        static async Task minecraft()
        {
            var serveraddress = IPAddress.Parse("127.0.0.1"); //IPアドレスとして扱うための変換
            var serverpass = "minecraft"; //RCONでログインするためのパスワード
            ushort port = 25575; //サーバのポート番号

            var command = "/time set 0"; // コマンド

            //CoreRCONを使ってMinecraftへ接続
            try
            {
                //var connection = new RCON(serveraddress, port, serverpass);
                var connection = new RCON(serveraddress, port, serverpass);
                //コマンドの送信
                var result = await connection.SendCommandAsync(command);
                //コマンドの受信
                Console.WriteLine(result);
            }
            catch(Exception e)
            {
                
                Console.WriteLine(e);
                MessageBox.Show(e.ToString());
                return;
            }
        }
    }
}

あとは非同期処理を用いてアプリが止まらないようにしています。 実行してみるとこんな感じです。

f:id:takunology:20190824061040p:plain

コンソールとログに Set the time to 0 と書かれているので成功です。このようにして外部からマイクラを操作していきます。参考までにPythonC#で動かしてみたものを載せます。

www.youtube.com

おわりに

今回はコマンド操作をしただけですので、次回から沸きつぶしなどを実装していけたらと思います。あとはWPFとかでアプリ化してみても面白そうです。

参考にさせていただいたサイト

ありがとうございます。

blog.xin9le.net

作成したコード

ぜひ参考にしてください。

github.com