みなさん、まだ Minecraft 遊んでますか? 僕は8時間の仕事をするようになってから全く遊んでないです。
どうも、こんにちは。去年までITカレッジ沖縄で非常勤講師をしてました、「ぽんつよ(ぬこ)」です。
アドベントカレンダーもですが、僕はブログとかで何かを発信するのがニガテキライなので、何を書いていいか迷った結果、modding についてちょろっと書いていきます。
僕が知らない可能性もありますが、modding といえば基本的に Java Edition を使用します。名前の通り Java で開発されています。なので、世の中に出回っている mod も Java で開発されているものが多いです。
ただ、全てではないです。Scala で開発されていたり、Scala と Java の混合もあったりします。実は JVM 上で動くクラスファイルを生成できる言語であればどれでもいい(はず)なので、Kotlin でもイケるだろうということで調べてみました。
クラスファイルを生成できれば言語は何でもイケるであろうとはいえ、無条件ではないです。(自力で Minecraft に介入する仕組みを作るのであれば別)
今現在ではいくつか選択肢があるらしいですが、modding するのに便利な mod(前提 mod)として、Minecraft Forge があります。Forge をつかいたいので、連携するための部品が必要です。
Java で作るのであれば連携用の仕組みがもとからあるので、エントリポイントとなるクラスにちょちょっとアノテーションを付けるだけで連携が取れます。
Kotlin 用の連携する仕組みは用意されていないですが、言語の特徴として Java との相互運用性を謳われている言語なので、それっぽくアノテーションつけるとコンパイルされて、ロードされて、認識はしてくれます。
ただ、その場合は生成されたクラスファイルは、あくまでも Java で実装されたものという前提で Forge 側から呼び出されるので、Kotlin 側のみにある一部の機能がうまく動きません。
代表的なのがシングルトンオブジェクト(object キーワードで定義するクラスみたいなの)で実装すると、Forge 側によるインスタンス生成が出来ずに例外が発生したりします。
Kotlin 専用の連携クラスは用意されていないので、そこから作る必要があります。(昔の Forge では Scala もサポートしていたので用意されてました。)
クラスとして作る必要があるのですが、Forge が用意している IModLanguageProvider インタフェースを実装する必要があります。関連するクラスも含めて3,4個のクラスを用意する必要があります。
そこで、エントリポイントとなるクラスの初期化処理部分を実装することで、Kotlin の特徴を生かした連携が取れるようになります。
開発環境上で動作すれば OK であれば、もう必要なものはありません。が、実装にもよりますが、このままではせっかく作った mod を配布して使ってもらおうと思っても動かなくなります。
Kotlin が用意してくれている標準ライブラリの機能などを使用している場合、それらの jar ファイルが無いと動かなくなります。デフォルトのビルドスクリプトでは、生成される mod の jar ファイルに Kotlin の標準ライブラリは含まれていません。
含めるようにビルドスクリプトに手を加えると、配布してもすぐに使える mod として完成します。
ここまで必要なものについて色々調べましたが、こんな面倒くさいことを作る mod ごとにやってやるのは骨が折れます。
そんな方のために、こちらの mod をおすすめします。
Kottle - CurseForge
Kottle を前提 mod として使うことで、Kotlin と Forge を連携するクラスと、Kotlin の標準ライブラリ群を手軽に導入できます。
Kottle 指定のアノテーションを付けるだけで、Kotlin の機能を生かして modding が手軽にできるようになります。
ここまで調べたことをまとめてきましたが、申し訳ないことに僕自身がまだ Kotlin で modding を試せていません。(すべて脳内の IntelliJ で試しました)
仕事に慣れて落ち着いてきたら、時間を見つけてなにか作ってみようと思います。
この文章を考えている間に、Minecraft 1.15 がリリースされましたね! 早く遊んでみたい。。。
Forge も早く 1.15 に対応してほしいですね。
実のない内容ですいません