2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに:なぜ私はアドオン開発に挑んだのか

今回はマイクラ統合版1.21.80のサーバーに一括破壊機能を追加したく、開発しようと思いました。

マーケットプレイスにて、様々なアドオンが公開されているが、欲しい機能は有料のものばかりで、課金が必要でした。。。

また、今回欲しいと思ったものは原木を一括破壊できるもので、その他の一括破壊が入っているアドオンはオーバースペックでした。

単純に欲しいものは原木を斧で一括破壊できるものだったので、自作することにしました。

マイクラのMODやアドオン開発はしたことがなかったが、誰かが作ったアドオンが公開されているということは作れるだろう。

Geminiのコーディングパートナーを使えば、要件を伝えるだけで行けるだろうと思いました。

この記事では自分がアドオンを作ろうとして感じたことや詰まったことを書きます。
詳しい内容はまた別記事で書こうと思います。

理想と現実:要件定義と「統合版の壁」

今回はプレイヤーが斧で原木を破壊すると隣接する原木ブロックと葉っぱブロックを破壊できるものが欲しい。

  • 斧の時のみ有効
  • 自分のY座標以上でのみ破壊される
  • 原木と葉っぱのみに有効になる
  • 一括破壊機能のオンとオフが切り替えられる

以上が今回のアドオンに求めたことでした。

アドオンで有効にするかどうかを決める方法を模索したが、
大体はスニーク時に機能が発動するように設計されているようでした。
正直マインクラフトではスニークを多用する場面があります。
これを発動のトリガーにするには苦しいと思った。(というか事故るだろって・・・)
Java版のようにホットキーを設定して、機能のオンとオフが切り替えられるようにしたいと考えました。
統合版は自由度が低いとはいえ、そのくらいの設定はできるのではと考えていました。
しかし、統合版ではアドオンでそういったことは実装できませんでした。
マルチプラットフォームだから、そもそもマイクラBEにそういったものを設定する項目がないらしい。

統合版のアドオンについて(スクリプトAPI)

  1. Switchやスマホだとキーボード操作ではないため利用できない。
  2. セキュリティ上の問題がある。キーロガーのようなアドオンを作れてしまうため、低レベルのOSへの機能へはアクセスできない設計思想になっているようだ。
  3. Java版のようにゲームの根本を書き換えるわけではなく、ゲーム内で発生するイベントをきっかけに動作するように設計されている。
    • playerBreakBlock: プレイヤーがブロックを壊した瞬間に発火するイベント。
    • itemUse:プレイヤーがアイテムを使用した瞬間に発火するイベント。
    • beforeChatSend:プレイヤーがチャットを送った時に発火するイベント

3つの理由からJava版のMODのような設計思想では追加機能を開発できないことを知りました。

自分の中で根本的に「マルチプラットフォームで遊べる」という概念が根付いていないんだなぁとシミジミ感じました。それと同時にマイクラ側でその辺がしっかり線引きされているのはコードを書く上でセキュリティ側にそこまで配慮しなくて楽なのかなと思いました。
実際にコードを書き始めてから、「特定のキーを押すことをトリガーにする」というのができないのがストレスでした。
ただ、この縛りプレイが次第に楽しくなっていきました。
書きながら、この動作はプレイ中に他の操作と一緒に事故るだろうなとか、スマホ版の人は操作しづらいかなとかとか、いろんなことを考慮しながら開発を進めるのが、実業務であまりコードを書いたことがない自分には新鮮で面白かったです。

Geminiとの二人三脚:コーディングパートナーとの上手な付き合い方

お客さんのようにこういう機能が欲しいって言い続ければ、期待する動作を保証するコードを提供してもらえるだろうと最初は楽観的に見ていました。

実際に送られてきたコードは特に問題がなさそうに見えましたし、基本的にJavascriptのコードが来て、自分が期待する動作通りの内容に見えました。(隣接するブロックを検知する仕組みだったり、機能のオンオフがチャットに表示される仕組み)
ただ、これをテスト環境で動作させてみた時が問題でした。
Geminiでは最新の情報を精査したり、そもそも参照したい記事などがおそらくスクレイピング禁止になっていて情報を取得できなかったりして欲しい情報が得られなかったりしました。

プログラマーがAIに仕事を取られる時代が来ると言われていますが、まだまだ先の話なのかもなと思いました。
正直、最初は思考停止気味にエラーをGeminiに報告して、修正版を書いてもらったりしましたが、それだけでは段々Gemini側でループするようになってきました。
また、スクレイピングができないものがあるんだってことに途中で気づけたのは良い学びでした。

ここから、Geminiを開発元として使用するのではなく、アドバイザーとして使用するようにしました。そもそも「コーディングパートナー」と言ってるのでこれが正しい在り方でしょう。

Geminiから降りてきた情報と自分がエラー内容や公式ドキュメントの情報を探してはまとめ直して、Geminiに新しくコードを書いてもらう。
そのコードを見て、一部修正したりしながら、テスト環境で動作を見る。
この繰り返しでした。
直近でマイクラBEのバージョンが上がったこともあり、開発は難航してしまいました。
当初は半日もあれば、書き終わるだろうと思っていたのが、丸2日ほどかかりました。

公式ドキュメントを読む癖と、常日頃からコーディングしていなかったツケをちゃんと回収しました。

開発のおわりに向けて

幸いなことにコーディングの経験があったことで苦戦はしたものの、回避方法を考えたり、実際にプレイしたときの事象を考えながら進めることができました。

そのおかげなのか、何回もデバッグを行い、何回もコードを修正して、何回も壁を乗り越えてエラーを減らしていけました。

マイクラBEで利用できる命令文やAPIのバージョンの指定、モーションの検知、特定のアイテム名を利用したときに機能がオンオフになるなど、複数のやれそうなことを考えては実装を試みました。

どれも動きはするけど、理想的ではなかったり、プレイ時の事故に繋がりそうだなと思ったり、気軽ではないなということで考えなおしたりの続きで何とか完成形になりました。

試行錯誤の果てに:完成した一括破壊アドオンの姿

最終的な形はこんなかんじでした。

  • cut-allに近い形
  • 斧の時のみ一括破壊可能
  • 自分のY座標よりも高い位置でのみ破壊が可能
  • 葉っぱも同様に破壊される
  • 負荷も考えて、最大ブロック数を128で指定
  • スニーク時に斧で右クリックしたときにオンオフを切り替え
  • オンとオフ切り替え時にチャット欄に表示される
  • コード側でのちに鉱石などを追加しやすいようにグローバル設定を設ける

私がJava版のcutAllと同じような機能が欲しいとずっと思っていました。

建築などはあまり得意ではなく、整地をメインコンテンツとして楽しんでいたので、こういったものが必要でした。

今回はマルチサーバーへのアドオンだったので、あまり一人で開拓が進まないように機能を限定的にしました。

まとめ

今回はGeminiを利用したマイクラBEのアドオン開発を行いました。

最初はどんな仕組みで動いているのかも理解しておらず、苦労しました。

一括破壊が欲しいけど、マーケットプレイスで売っているものは一括破壊がおまけで他のアドオンも入ってる。

そもそも課金したくないという思いの元始めました。

別記事でも書きましたが、生成AIに頼りきりなのは良くないと改めて感じます。

自分でも情報を収集し、考え、その結果をAIと共有して、答えを一緒に検討するという本当にパートナーとしてのAI利用が一番現在で正しい付き合い方なのだと思います。

コーディングなんて生成AIを用いれば誰でもできるでしょと言われたりしますが、
まだまだ人間の思考力が大事な時代だと思います。

私自身ももっと学習して、システムの仕組みなどを理解しておかないといけないなと戒めになりました。

今回作ったアドオンの中身についても別の記事でまとめようと思いますので、お待ちいただければと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?