【C#, Minecraft】書き初め

あけましておめでとうございます。2021年もよろしくお願いします。

さて、お正月と言えば 書き初め ですね。ということで、新年初めての書き初め(と書いてプログラミングと読む)をしていきます。

実行環境

  • Minecraft 1.16.3 (バニラ版, RCON設定済みサーバ)

お題

Minecraft で "Happy New Year!" を表示させるプログラムを書きます。

実装

イクラの画面全体に文字を表示させるには /title コマンドを使用します。サブタイトルも追加することもできますが、タイトルを表示する前に設定する必要があります。

/title <プレイヤー名など> subtitle "サブタイトル"
/title <プレイヤー名など> title "タイトル"

これを RCON 経由で投げれば良いので簡単に実装できます。

class Program
{
    static RCON rcon = new RCON(IPAddress.Parse("127.0.0.1"), 25575, "minecraft");

    static void Main(string[] args)
    {
        Task.Run(async () => {
            await HNY();
        }).GetAwaiter().GetResult();
    }

    static async Task HNY()
    {
        string title = "Happy New Year!";
        string sub = "- 2021 -";

        await rcon.ConnectAsync();
        await rcon.SendCommandAsync($"/title @a subtitle \"{sub}\" ");
        await rcon.SendCommandAsync($"/title @a title \"{title}\" ");
    }
}

実行結果

Happy New Year!

f:id:takunology:20210101144021p:plain

実装その2

これだけだと面白くないので、花火も打ち上げていきましょう。

コマンドが複雑すぎて難しいので、花火を打ち上げるコマンドを生成するサイトにお世話になります。

www.digminecraft.com

ここで注意点が1つ。Minecraft 1.13 以降ではコマンドの送信座標が初期座標になるので、プレイヤーの目の前で花火を打ち上げる場合は F3 キーで座標を確認した後、~(チルダ) 部分をその座標に置き換えてください。時間調整も Delay メソッドでできるので、いい感じに合わせたりしてみてください。

class Program
{
    static RCON rcon = new RCON(IPAddress.Parse("127.0.0.1"), 25575, "minecraft");

    static void Main(string[] args)
    {
        Task.Run(async () => {
            await HNY();
            await Fireworks();
        }).GetAwaiter().GetResult();
    }

//HNY() メソッド

    static async Task Fireworks()
    {
        List<string> firework = new List<string>
        {
            "/summon firework_rocket 380 100 718 {LifeTime:15,FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Flight:2,Explosions:[{Type:1,Flicker:0,Trail:0,Colors:[I;3887386],FadeColors:[I;11743532]}]}}}}",
            "/summon firework_rocket 380 99 723 {LifeTime:15,FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Flight:2,Explosions:[{Type:1,Flicker:0,Trail:0,Colors:[I;11743532,3887386],FadeColors:[I;11743532,4408131]}]}}}}",
            "/summon firework_rocket 380 99 713 {LifeTime:15,FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Flight:2,Explosions:[{Type:1,Flicker:0,Trail:0,Colors:[I;2437522],FadeColors:[I;4312372]}]}}}}",
            "/summon firework_rocket 380 98 728 {LifeTime:15,FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Flight:2,Explosions:[{Type:1,Flicker:0,Trail:0,Colors:[I;15790320],FadeColors:[I;14602026]}]}}}}",
            "/summon firework_rocket 380 100 708 {LifeTime:15,FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Flight:2,Explosions:[{Type:1,Flicker:0,Trail:0,Colors:[I;15435844],FadeColors:[I;15790320]}]}}}}"
        };

        await rcon.ConnectAsync();

        for (int i = 0; i < 3; i++)
        {
            foreach (var item in firework)
            {
                await rcon.SendCommandAsync(item);
                await Task.Delay(100);
            }
            await Task.Delay(1000);
        }
    }
}

実行結果その2

Happy New Year! (ヒューパァンパァン) (喜びの舞)

f:id:takunology:20210101160527g:plain

今回作ったコード

参考にどうぞ。

github.com