2025年2月2日日曜日

forge Mod でチャット欄を使ったカスタムコマンドを実装する方法

forge Mod でチャット欄を使ったカスタムコマンドを実装する方法

概要

forge Mod でカスタムコマンドを作成する方法を紹介します

環境

  • macOS 15.2
  • Java 21.0.5
  • forrge MDK 1.20.6-50.1.32
  • minecraft 1.20.6

コマンドを管理するクラス

特に forge 側の機能を使わずマイクラですでに用意されているクラスを使います
コマンドを登録するためのメソッドと実際にコマンドが行う処理を実装します
今回はサーバ側に保存された CompoundTag の情報をクリアする処理にしています

  • vim src/main/java/com/example/examplemod/ResetKillCommand.java
package com.example.examplemod;

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.context.CommandContext;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player;

public class ResetKillCommand {
    private static String countKey = "laserGunKills"; // 討伐数をCompoundTagで管理するためのカウントのキー

    // コマンドを登録するメソッド
    public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
        dispatcher.register(
                Commands.literal("resetkills") // コマンド名
                        .requires(source -> source.hasPermission(1)) // 実行に必要な権限レベル (1 = プレイヤー権限)
                        .executes(ResetKillCommand::resetKills) // 実行する処理
                );
    }

    // 実行処理
    private static int resetKills(CommandContext<CommandSourceStack> context) {
        CommandSourceStack source = context.getSource();
        // 実行者がプレイヤーかどうか確認
        if (source.getEntity() instanceof Player player) {
            // プレイヤーのCompoundTagから討伐数をリセット
            player.getPersistentData().remove(countKey);
            // プレイヤーにメッセージを送信
            player.sendSystemMessage(Component.literal("Kill count has been reset."));
        } else {
            // コンソール実行時
            source.sendFailure(Component.literal("This command can only be executed by a player."));
        }
        return 1; // コマンドが成功した場合
    }
}

権限について

hasPermission で指定可能な権限は以下の通りです

説明
0 全プレイヤー: 権限に関係なく誰でも実行可能。
1 一般プレイヤー: コマンドブロックなどの基本操作が可能。
2 オペレーター (OP): サーバー管理者向けの基本コマンド権限。
3 高度なオペレーター: プレイヤー管理、サーバー設定変更など。
4 完全な管理者: サーバーの完全制御権限を持つ。

コマンドの登録

Mod のメイン側の onRegisterCommands イベントハンドラに今回追加したコマンドを登録するだけです

  • src/main/java/com/example/examplemod/ExampleMod.java
@SubscribeEvent
public void onRegisterCommands(RegisterCommandsEvent event) {
    // コマンドを登録
    ResetKillCommand.register(event.getDispatcher());
}

動作確認

  • ./gradlew clean && ./gradlew build && ./gradlew runData && ./gradlew runClient

実際にコマンドが使えることが確認できれば OK です

最後に

forge Mod でカスタムコマンドを作成してみました
サーバ側の裏側のデータやチートコマンドなどを実装するときに使います
ブロックやアイテム、ゲームイベントにするまでもないような処理をカスタムコマンドにしてしまうのもいいかなと思います

参考サイト

0 件のコメント:

コメントを投稿