【Minecraft】Spigot プラグインの開発【木こり】

当ページのリンクには広告が含まれています。
minecraft, trees, grass

こんにちは、ふじみやです。

IntelliJ IDEA をインストールして Minecraft のプラグインを開発する環境が整いましたので、早速 ChatGPT にサポートをしてもらいつつプラグイン開発をしてみましょう。

目次

作成するプラグイン

今回は、いわゆる「木こり MOD 」と呼ばれるプラグインを作成します。

VeinMiner など一括破壊を可能とするプラグインはありますが、破壊するブロックと異なる種類のブロックは破壊できないため葉ブロックの中に隠れている原木ブロックを破壊できず空中に残ってしまうということが起きてしまいます。

そこで、原木ブロックまたは葉ブロックを破壊すると、隣接する原木ブロックまたは葉ブロックは同種のものではなくても一括で破壊できるようにしていきます。

事前準備

IntelliJ IDEA に Minecraft Development プラグインをインストールしていない方は こちら の記事を参考にインストールをしてください。

プラグインの内容

上記にも記載をしましたが、今回は次のような要件を充足するプラグインにしていきます。

  • 一括破壊のトリガーはスニークをしながら対象のブロックを破壊すること
  • 対象のブロックは全ての原木ブロックまたは葉ブロックとする
  • 対象のブロックを破壊すると隣接する対象のブロックも破壊する
  • 隣接するブロックの種類は破壊したブロックと同一でなくとも一括破壊の対象とする

ただし、以下については考慮していませんので、今後アップデートしていきます。

  • コマンドよりプラグインのオン・オフを切り替え
  • 適正ツール(斧など)を手に持っている場合のみ一括破壊を行う
  • 一括破壊時にツールの耐久値を減少させる
  • 一括破壊によりドロップしたアイテムは全てプレイヤーの目の前に集める

コーディング

ChatGPT と対話を繰り返し、最終的に以下のコードで想定した通りの動きになりました。

なお、プラグイン名は「TimberCutter」としており、対応バージョンは 1.19.4 です。

import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class TimberCutter extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
    }

    @Override
    public void onDisable() {
    }

    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {

        Player player = event.getPlayer();
        Block block = event.getBlock();

        if (player.isSneaking() && isLogOrLeaves(block.getType())) {
                breakTimber(block, block.getType(), 0);
        }
    }

    public boolean isLogOrLeaves(Material type) {
        String name = type.name();
        return name.endsWith("_LOG") || name.endsWith("_LEAVES");
    }

    private static final int MAX_DEPTH = 128;

    private void breakTimber(Block block, Material type, int depth) {
        if (depth > MAX_DEPTH) {
            return;
        }

        if (!isLogOrLeaves(block.getType())) {
            return;
        }

        block.breakNaturally();

        for (int x = -1; x <= 1; x++) {
            for (int y = -1; y <= 1; y++) {
                for (int z = -1; z <= 1; z++) {
                    Block neighbour = block.getRelative(x, y, z);
                    if (isLogOrLeaves(neighbour.getType())) {
                        breakTimber(neighbour, type, depth + 1);
                    }
                }
            }
        }
    }
}

コーディングが完了したらビルドをしてください。

ビルドが完了すると TimberCutter のプロジェクト保存先フォルダ内にある build フォルダ内の libs 内に TimberCutter という名称のついた jar(Java Archive)ファイルが新しく作成されますので、存在を確認しておきましょう。

テスト

Minecraft の Spigot サーバー(または Paper サーバー)フォルダ内にある「plugins」フォルダの中に、先ほど確認した jar ファイルを移しましょう。jar ファイルが保存されたことを確認したらサーバーを起動してください。

Spigot サーバーや Paper サーバーを起動したことがない方は以下のリンクをご参考にしていただければと思います。

サーバーの起動が完了したら、Minecraft を起動しマルチプレイを選択。

接続先サーバーはご自身の PC の IP アドレスを入力しましょう。IP アドレスが分からない方は、コマンドプロンプトを開きipconfigと入力のうえ Enter キーを押下してください。

以下のように IPv4 アドレスが表示されますので、こちらを入力しましょう。

マルチプレイに接続できたら想定した通りの動きができているか試しに使ってみましょう。上記のコードでは何度も試しましたので大丈夫だと思いますが、もしちゃんと動かない場合には ChatGPT に聞くなりして修正をしてみてください。

それではまた。

minecraft, trees, grass

この記事が気に入ったら
フォローしてね!

コメント

コメントする

目次