【Minecraft 26.3】Mod用にコマンドを登録する
この記事はMinecraft NeoForge 26.3に対応しています。
お疲れ様です。dnyrです。 MinecraftのMod開発では、コマンドがデバッグにもユーザー向けの機能にも役立ちます。そこで、必要なときに簡単に追加できるよう、コマンドを登録する方法をまとめます。
今回は、NeoForgeで自作Modのコマンドを登録してみます。
クラスを作成する まずは、コマンドの登録処理をまとめるクラスを作成します。インスタンスを作成する必要がないクラスなので、コンストラクタはprivateにしておきます。
public class CommandRegistrationHandler { private CommandRegistrationHandler() { } } 次に、作成したクラスに、コマンドの登録処理を呼び出すメソッドを用意します。追加するコマンドは、後述する各コマンドクラスのregisterメソッドから登録します。このメソッドは、メインクラスでNeoForgeのイベントリスナーとして登録します。 内容は次のとおりです。
public static void onRegisterCommand(RegisterCommandsEvent inEvent) { ModeCommand.register(inEvent.getDispatcher()); } 次のようにメインクラスでイベントリスナーを登録します。
NeoForge.EVENT_BUS.addListener(CommandRegistrationHandler::onRegisterCommand); コマンドを作成する では、実際にコマンドを作成してみます。 次に、〇〇Commandのようなクラスを作成します。〇〇の部分には、どのようなコマンドなのかが分かる名前を付けるとよいでしょう。例えば、プレイヤーのモードを変更するコマンドであれば、PlayerModeCommandなどです。 内容としては次のようになります。
public static void register(CommandDispatcher<CommandSourceStack> inDispatcher) { inDispatcher.register(Commands.literal(SampleMod.MODID) .then(Commands.literal("mode").requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)) .then(Commands.literal("get").executes(ModeCommand::getMode)) .then(Commands.literal("set") .then(Commands.literal("normal").executes(context -> setMode(context, Mode.NORMAL))) .then(Commands.literal("super").executes(context -> setMode(context, Mode.SUPER))) .then(Commands.literal("hyper").executes(context -> setMode(context, Mode.HYPER)))) .then(Commands.literal("toggle").executes(ModeCommand::toggleMode)) )); } このコードでは、then()を使うことでサブコマンドを階層的に追加しています。記述を組み合わせることで、より複雑なコマンドも作成できます。
【Minecraft 26.3】mod専用の情報をプレイヤーに持たせる
この記事はMinecraftVer 26.3 NeoForgeに対応しています。
お疲れ様です。dnyrです。最近、マインクラフトのMod製作に奮闘しています。 Mod界隈はAIに否定的な意見も多いので多くの人に遊んでもらうべくAIを使用せずに作成しています。自分でここまでいろいろ考えたり調べたりするのは久々な気もしますが、楽しいもんですね
というのは前置きで、タイトルの通りなのですが「プレイヤーにMod用の情報を持たせたい」という状況になることが多々ありますので、その方法をここにメモします。
クラスを作成する まずは汎用のデータするアタッチを登録するクラスを作成します。必須ではないですがある程度汎用的に利用できたほうが良い内容なので用意しましょう。小さなプロジェクトであればクラス化する必要はないと思います。
ModAttachment …というクラスを作成しました。
変数を用意する 下記のような変数を用意します。
public static final DeferredRegister<AttachmentType<?>> ATTACHMENT_TYPE = DeferredRegister.create( NeoForgeRegistries.ATTACHMENT_TYPES, SampleMod.MODID ); レジストリへの登録を管理するオブジェクトになります。DeferredRegister.create()の第一引数には登録対象となるレジストリ型を指定します。第二引数にはMODIDを指定します。
public static final Supplier<AttachmentType<SampleData>> SAMPLE_DATA = ATTACHMENT_TYPE.register( "sample_data", () -> AttachmentType.builder(SampleData::new).build() ); SampleDataを保持するAttachmentTypeをsample_dataというIDで登録します。 SAMPLE_DATAには、登録したAttachmentTypeを取得するためのSupplierが入ります。 Supplier<T>は、get()を呼ぶことでT型のオブジェクトを取得できる仕組みです。今回であればSAMPLE_DATA.get()でAttachmentType<SampleData>を取得できます。
アタッチされるタイミング じゃあここで登録したものはいつアタッチされるの?という話ですが、登録したAttachmentTypeのデータには
player.getData(ModAttachment.SAMPLE_DATA) でアクセス可能です。
この際、まだデータがアタッチされていなければSampleData::newが呼ばれて生成・アタッチされます。すでにアタッチされていれば、そのデータをそのまま取得します
Supplierについて 聞きなれない単語だったので念のため調べました。 Supplierでは<T>をgetすることができます。
【Redmine】セットアップして使ってみる
前回のGiteaの導入に続いて、タスクや進捗を管理するためにRedmineも導入します。
ここでは、Docker ComposeでRedmineとPostgreSQLを起動し、nginxでドメインに紐づけてHTTPS化します。ドメインのDNSレコードがサーバーを向いており、ファイアウォールでTCP 80番と443番ポートにアクセスできることを前提にしています。
導入 Docker EngineとCompose pluginがインストールされていることを確認します。未導入の場合は、前回のGiteaの記事にあるDockerの導入手順を先に実行してください。
以下のコマンドは、/optへの書き込みやDockerの操作ができるユーザーで実行します。権限がない場合は、必要に応じてsudoを付けてください。
まず、Redmine用のフォルダを作成します。
sudo mkdir -p /opt/redmine sudo chown "$USER":"$USER" /opt/redmine cd /opt/redmine .envを作成します。
nano .env 中身は次のようにします。パスワードと秘密鍵は、実際には推測されにくいランダムな値に置き換えてください。
POSTGRES_DB=redmine POSTGRES_USER=redmine POSTGRES_PASSWORD=<強固なデータベースパスワード> SECRET_KEY_BASE=<十分に長いランダムな文字列> .envには認証情報が含まれるため、他のユーザーから読めないようにします。
chmod 600 .env 次に、compose.yamlを作成します。
nano compose.yaml 中身は次のとおりです。
services: db: image: postgres:17 container_name: redmine-db restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - redmine_db:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 start_period: 30s redmine: image: redmine:7.0.1 container_name: redmine restart: unless-stopped depends_on: db: condition: service_healthy environment: REDMINE_DB_POSTGRES: db REDMINE_DB_PORT: 5432 REDMINE_DB_DATABASE: ${POSTGRES_DB} REDMINE_DB_USERNAME: ${POSTGRES_USER} REDMINE_DB_PASSWORD: ${POSTGRES_PASSWORD} SECRET_KEY_BASE: ${SECRET_KEY_BASE} ports: - "127.0.0.1:8081:3000" volumes: - redmine_files:/usr/src/redmine/files volumes: redmine_db: redmine_files: redmine:7.0.1は記事作成時点のRedmine 7.0系のバージョンです。バージョンを更新するときは、変更内容を確認してからタグを書き換えてください。PostgreSQLのデータとRedmineの添付ファイルは、それぞれ名前付きボリュームに保存されます。
【Gitea】Giteaを使ってみる。
友人と一緒にゲームを作成することになり、バージョン管理をどうしようかなと考えた際に初めに思い浮かんだのはGitLabで管理することでした。ただ、GitLabをセルフホストする場合はサーバーのRAMが8GB近くある必要があるらしく…。私が契約しているXServerは4GBしかありませんが…?
最低限の機能なら4GBでも動きはするみたいですが、ただバージョン管理したいだけなのに4GBをフルで使用されるのは困ります。Redmineとかも運用したいし。
というわけで代替品を探していたところGiteaがよさそうだったので導入します。
環境 環境は下記のとおりです。 現在はTailscaleで中継器としてしか使用していません。
OS:Ubuntu 26.04 LTS CPU:AMD EPYC Milan Processor CPUコア数:4コア(4 vCPU) メモリ:4GB(3.8GiB) Swap:2GB ストレージ:150GB 空きストレージ:約139GB アーキテクチャ:x86_64 仮想化方式:KVM 導入 導入を進めます。なぜかdockerすら入っていないのでそこからになります。
【Minecraft 26.2】Modを開発するための準備
この記事はMinecraft Version 26.2に対応しています。
MinecraftでModを開発する際の最初の手順についてのメモになります。
NeoForgeを用意 下記サイトにアクセスします。
https://neoforged.net/mod-generator/
このサイトにアクセスすると、NeoForgeのModを開発するための空のModを作成してくれます。各設定項目について確認します。
ModName
Mod名を指定します。空白使用可。
Mod ID
Generate Mod ID From Nameが有効になっている場合は設定不要です。基本的にこの設定は常に有効なので設定不要です。
Package Name
javaで使用されるパッケージ名を指定します。私の場合は
com.github.dnyr8bit.<Mod名> になります。基本的にはGitHubの自分のユーザーページのリンクを逆にしたもの + MOD名 で問題ありません。ブログ名などでも問題ないと思います。
Minecraft Version
自分が作成したいmodのマインクラフトのバージョンを指定します。私は基本的に最新で作成します。
Gradle Plugin
使用するビルドツールを指定します。基本的にデフォルトのModDevGradleを使用する形で問題ありません。
上記が完了したら、ページの下にあるDOWNLOAD MOD PROJECTからダウンロードします。ダウンロードしたものを展開し、フォルダごとエディタで開くことで開発を開始することができます。
最初にやっておくこと 最初は下記のような状態になっていると思います。
テスト投稿
これはテスト投稿です。 これはテスト投稿です。外から確認したいことがあるので公開状態にしています。
GodotEngineをVS2022で実行する
GodotEngineを使用して個人でゲームを作成しているのですが、将来的にエンジン側に変更を加える可能性があるためVisualStudio2022からデバッグ実行する必要がありました。いざ試してみるとサクッとできましたが、ここにまとめておこうと思います。
GodotEngineの入手 GodotEngineは下記のGitHubから入手しました。
https://github.com/godotengine/godot
デフォルトではmasterブランチになっていますが、Tagから指定のバージョン-stableとなっているものをダウンロードします。stableが安定版のため、非stableだと安定版に比べ不具合が発生する可能性があります。 ちなみに、私が個人的に作成しているゲームでは4.6の非stable版を使用しています…。今回stableを採用しなかったのは現在最新の安定版である4.6.3-stableにクラッシュ系のバグが多そうだったからです…。 4.6最新で直っているかは定かではないですが、直ってることを祈って…。
ソリューションファイルの生成 次に、VS2022で実行するためのソリューションファイルを出力します。SConstructという名前のファイルがある場所で下記コマンドを使用します。
scons platform=windows vsproj=yes これで.slnが生成され、VisualStudioから実行ができるようになります。 ちなみに、VS2022のC++コンパイラが必要になるので、あらかじめVS2022をインストールしておくことを推奨します。
初投稿
初めまして。dnyr(ダン)と申します。本日から日々の勉強と日記やその他諸々書きたいことを書くためにブログを作成しました。昔から文章を書くことがあまり得意ではないため、非常に読みにくい記事になる可能性があります。
気になる点などあればどうぞご気軽にご連絡ください。
このブログの目的 上にも書きましたが内容はいろいろということで、特に何か決めているわけではありません。主にプログラミングに関することやゲームに関することが多めになると思いますが、それも気分次第ということで…。
ひとまず勉強や遊んだゲームの記録だったり、とにかくアウトプットに使用できればと思っています。
自己紹介 業務では基本的にUnrealEngineを使用しており、当然ながら使用言語はC++になっています。Unityも多少触ったことはありますがあまり詳しくなく、ゲームを作る際はGodotを使用する予定です。
pythonやjavaも多少は触れますが、自信はありませんのでこのブログを通して成長を記録できると嬉しいです。