たくさんの自由帳

Minecraft Fabric の環境構築をしてアイテムを追加してみる

投稿日 : | 0 日前

文字数(だいたい) : 11123

どうもこんにちは。
ハジラブ -Making*Lovers-(Making*Lovers フルHDリマスター付き)予約しました。月末が楽しみですね。

本題

TwitterでForgeより快適と聞いて。
しかもKotlinでModdingができる!!!

環境

なまえあたい
IDEIntellij IDEA 2021.1.2 Community Edition
Windows10 Pro (そういえば発表会があるんだっけ?いい加減設定がコンパネと散らばってんのどうにかしてほしい)
Minecraft1.17 (1.7.10と空目しないで)
Java16(後述)
言語Kotlin

Minecraft 1.17

調べた感じ、Extra UtilitiesにあったDark Glassがバニラに逆輸入?されたみたい。TTの監視で使えそう。

技術的な話をするとJava 16以上が必要です。JDKの有償化よくわからんけどAdoptOpenJDKの方なら多分大丈夫。
ついにJavaのModdingでも型推論が(使っていいのかはよくわからん)(というかRecordも使えるようになったのかええやん)(てかそもそも今回はKotlin使うから別に)

読まなくていい Java有償化の話

  • Javaは今でも無料で使える
  • JavaのJDKは色んな会社が作ってる
    • AmazonとかMicrosoftとか
    • Oracleも作ってる
  • その中でOracleの作ってるOracle JDKが商用利用するなら金払えになった。
    • Java 11から出てきた話。今までのマイクラはJava 8で利用できたので。
    • Oracle JDK
      • こいつは一部を除いて有償
    • Open JDK
      • こいつは無料。ただしサポート期間が半年
  • Oracle以外のJDKを選べばええ
    • AdoptOpenJDK
      • こいつは無料+サポート4年+商用利用可。もうこれ代替品だろ
    • Corretto
      • Amazon製JDK

多分間違ってる気がするのでチラシの裏的な感覚で

Oracle JDK 有償化の話の続き 2021/10/06 追記

どうやら、Java 17からOracle JDKが無償提供されるようになりました。再び無償化。
まーたややこしくして何がしたいんや...

というわけでJava 17以降Oracle JDK使っても大丈夫になりました。でも今の所オラクル以外のJDKでやって行けてるのでそのまま行こうと思います。

Java 16 を入れる

今回はAdoptOpenJDKを入れます。
https://adoptopenjdk.net/ を開いて、OpenJDK 16 (Latest)と、HotSpotのラジオボタンを選んでLatest releaseを押してダウンロードしましょう。

Imgur

インストールはまあ適当に進めてください。(画像ない)

一応Java 16がインストールできたか確認するために、コマンドプロンプトとかで、javac -versionを叩きます。javac 16.0.1が帰ってくればおk

javac -version
javac 16.0.1

追記:2021/07/28 JAVA_HOMEの設定

なんか久しぶりにやったらまだJava8使ってんのかよって言われたので直します。

環境変数の設定開いて、システム環境変数の中からJAVA_HOMEを選んで、AdoptOpenJDKのパスを設定します。

Imgur

IDEAを入れる

入れておいてください。Community Editionでいいです

テンプレートをクローン

IDEAのスタート画面から、Get from VCSを押して、いかのURLを指定してCloneします。

Imgur

なまえあたい
URLhttps://github.com/natanfudge/fabric-example-mod-kotlin

プロジェクトを信頼するか聞かれるのでTrust projectを押してください。

そううまく行かない

Could not merge JARs! Deleting source JARs - please re-run the command and move on.

gradle.propertiesを開いて、loom_version0.8にします

Imgur

You are using an outdated version of Java (8). Java 16 or higher is required

プロジェクトの設定

右上のFileからProject Structureを選択して、Project SDK16に、Project language level16にします。

Imgur

適用したら、このボタンを探して押します。

Imgur

ボタンが見つからない場合はIDEAの右上にある?Gradleを押して、Syncボタンを押してもいいです。

Imgur

これで終わればいいんですが、これでも同じエラーで進めないときがあります。

IDEAの設定

右上のFileからSettingsを選択して、Build,Execution,Deploymentを押し、Build Toolsを押し、Gradleへ進み、
Gradle JVM16にしてみてください。できたらさっきみたいにボタンを押します。

Imgur

うまく行けば処理が進みます。私の環境では10分ちょっとかかった。
Gradle Buildが終わったら一旦IDEAを閉じます。その後もう一度起動するとマイクラのクライアントが起動できるようになります。

Imgur

早速再生ボタンみたいなやつを押して起動してみましょう。

1.17 Fabric

(私だったら)起動直後設定へ進みBGMを0にします。うるさいし

Imgur

MOD情報の変更

gradle.propertiesを開いて、以下の内容を変えます

なまえあたい
maven_group自分の持ってるドメインを逆から。持ってないならGithub Pagesとか他とかぶらない文字列
archives_base_nameMODのID(小文字)

私ならこんな感じ?

#Fabric api
fabric_version=0.34.10+1.17

	loom_version=0.8-SNAPSHOT

	# Mod Properties
	mod_version = 1.0.0
	maven_group = io.github.takusan23
	archives_base_name = clickmanaita

また、fabric_version等は、以下のサイトから更新があるか確認できるので見てみるといいと思います。

https://fabricmc.net/versions.html

Javaのパッケージ名修正

IDEAのProject(ファイルが表示されてるところ)からnet.fabricmc.exampleを選択状態にして、Shift押しながらF6を押します
押したらRename Packageを選び、ドメイン名(逆から)+MOD名小文字 を入力します

Imgur

続いてresourcesの方も修正します。同じようにassets.modidを選択状態にして、Shift押しながらF6を押します。 そしたら先程入力したMODのIDを入力すればいいです。

なんか残ってるnet.fabricmcってのは多分消して大丈夫です。

こうなっていればおk

Imgur

ExampleMod.kt のファイル名修正

味気ないのでMOD名.ktとでもしておきましょう。名前変更は先程と同じです。

Imgur

MOD情報の修正

resourcesの中にあるfabric.mod.jsonを開きます。
開いたら、modidentrypoints.mainの部分を最低限書き換えておけばいいと思います。

  "id": "clickmanaita",

ドメイン(逆から).MODのID.ExampleMod.ktだったファイル名Kt::init

クラス名+Kt、Ktを付けないとダメっぽい。

  "entrypoints": {
    "main": [
      "io.github.takusan23.clickmanaita.ClickManaitaKt::init"
    ]
  },

あとアイコンのところのmodidもさっき変えちゃったので直しといてください。

その他は各自好きなように。以下例

{
  "schemaVersion": 1,
  "id": "clickmanaita",
  "version": "${version}",

  "name": "ClickManaita",
  "description": "CheatMod",
  "authors": [
    "takusan_23"
  ],
  "contact": {
    "homepage": "https://www.curseforge.com/minecraft/mc-mods/clickmanaita",
    "sources": "https://github.com/takusan23/ClickManaita2"
  },

  "license": "Apache-2.0 License",
  "icon": "assets/clickmanaita/icon.png",

  "environment": "*",
  "entrypoints": {
    "main": [
      "io.github.takusan23.clickmanaita.ClickManaitaKt::init"
    ]
  },
  "mixins": [
    "modid.mixins.json"
  ],
  "depends": {
    "fabricloader": ">=0.8.7",
    "fabric": "*",
    "fabric-language-kotlin": "*",
    "minecraft": "1.17.x"
  },
  "suggests": {
    "flamingo": "*"
  }
}

よくわからんけど Mixin も修正

resources内のmodid.mixins.jsonを開いて、packageの部分を直します。これなんなの?
ドメイン.MODのID.mixin

{
  "required": true,
  "package": "io.github.takusan23.clickmanaita.mixin",
  "compatibilityLevel": "JAVA_8",
  "mixins": [
  ],
  "client": [
    "ExampleMixin"
  ],
  "injectors": {
    "defaultRequire": 1
  }
}

起動してみる

これで起動するはず。多分

アイテムを追加してみる

https://fabricmc.net/wiki/tutorial:items

この通りにやってみる

まずアイテムクラス(Kotlinだしobjectでもいいわ)を作ります。

object ClickManaitaItem {

    /** 特になんの機能もないアイテム */
    val CLICKMANAITA_WOOD = Item(FabricItemSettings().group(ItemGroup.TOOLS))

}

Imgur

そしたらExampleModKtだったファイルを開いて、init関数内でアイテムを登録します。

@Suppress("unused")
fun init() {
    // This code runs as soon as Minecraft is in a mod-load-ready state.
    // However, some things (like resources) may still be uninitialized.
    // Proceed with mild caution.

    // アイテム追加。clickmanaita_woodのところはアイテムID
    Registry.register(Registry.ITEM, Identifier("clickmanaita", "clickmanaita_wood"), ClickManaitaItem.CLICKMANAITA_WOOD)

}

そしたら起動してみましょう。
画面のようにアイテムが追加できていれば成功。

Imgur

テクスチャ

画像ファイルを用意します。用意できたら、resources/assets/MODのID/textures/item/アイテムID.pngって感じで置きます。

Imgur

そしたら今度は、resources/assets/MODのID/models/item/アイテムID.jsonって感じでJSONファイルを作成します。
中身はこうです。

{
  "parent": "item/generated",
  "textures": {
    "layer0": "clickmanaita:item/clickmanaita_wood"
  }
}

modのID:item/アイテムのIDって感じですね。このテキスチャ指定まじでややこしいからやめてほしい。
というかJSONは人間が書くもんじゃないだろ。本当に

成功してました。失敗してたらまじでつらい

Imgur

おまけ クリックまな板みたいにクリックしたら増えるように

そのためにはItemクラスを継承する必要があります。のでClickManaitaBaseItemみたいなクラスを作成します。

/**
 * 右クリックしたらアイテムが増えるアイテムを追加する
 *
 * @param settings クリエタブとか
 * @param dropSize 増える数
 * */
class ClickManaitaBaseItem(settings: Settings?, private val dropSize: Int = 2) : Item(settings) {

}

そしたらuseOnBlockメソッドをオーバーライドします。多分これがブロックを右クリックしたときに呼ばれる関数です。

/**
 * ブロックを右クリックしたときに呼ばれる関数
 * */
override fun useOnBlock(context: ItemUsageContext?): ActionResult {
    val world = context?.world
    val state = world?.getBlockState(context.blockPos)
    val copyBlock = state?.block
    repeat(dropSize) {
        copyBlock?.afterBreak(world, context.player, context.blockPos, state, null, context.stack)
    }
    return ActionResult.SUCCESS
}

そしたらItem()の部分をClickManaitaBaseItem()に書き換えて実行してみると

object ClickManaitaItem {

    /** 右クリックしたらアイテムが増える */
    val CLICKMANAITA_WOOD = ClickManaitaBaseItem(settings = FabricItemSettings().group(ItemGroup.TOOLS), dropSize = 2)

}

増えます。まだチェストの中身とかは増えないのでまだまだって感じですかね。

Imgur

ソースを読めるようにする

Minecraftのソースを読めるようにします。IDEAには逆コンパイラーが搭載されているのでなくても最悪いいですが、検索機能が使えないのでソースを生成しといたほうがいいと思います。

IDEAのGradleを押して、Tasks > fabric > genSources をダブルクリックすることで生成されます。

Imgur

その後、適当にBlockクラスとかを参照した際に、上に出てくるChoose Sources...を押して、なんとか-sources.jarを選択することで生成したソースを読むことができるようになります。

Imgur

Shift+Ctrl+Fの検索機能も開放されました。

Imgur

配布可能ファイルを生成する

IDEA右上のGradleから、Tasks>buildへ進みbuildを選択することで配布可能なJarファイルを生成します。
成功すると、build/libs/に生成したファイルが有るはずです。(dev、sources、sources-dev じゃない方)
あとはこのJarファイルをCurseForgeとかで公開すればいいんじゃない?

Imgur

エンドユーザー向けの説明とか

このModはFabric導入後、modsフォルダに以下のファイルをダウンロードして放り込んでおく必要があります。

ソースコード

ソースコードです。
https://github.com/takusan23/ClickManaita2/tree/1.17-fabric

クローンしたあとブランチ名「1.17-fabric」をチェックアウトしてください。一発でビルド通らないと思う。

追記:2021/07/28 1.17.1への対応

git使ってる場合はコミットするなりブランチ作るなりして現状の環境壊れても大丈夫な状態にしてください。
使ってなければどっかにバックアップしておけばいいのでは

gradle.propertiesを、最新の情報に更新します。
最新の値は「https://fabricmc.net/versions.html」から確認することが出来ます。

以下一例 (なんかコードブロックの言語にproperties指定したらシンタックスハイライト動いててちょっと感動)

kotlin.code.style=official
org.gradle.jvmargs=-Xmx1G

# Fabric Properties
	# Check these on https://modmuss50.me/fabric.html
minecraft_version=1.17.1
yarn_mappings=1.17.1+build.31
loader_version=0.11.6

#Fabric api
fabric_version=0.37.1+1.17

	loom_version=0.8-SNAPSHOT

	# Mod Properties
	mod_version = 1.0.0
	maven_group = io.github.takusan23
	archives_base_name = clickmanaita

# Kotlin
	kotlin_version=1.5.0
	fabric_kotlin_version=1.6.0+kotlin.1.5.0

これで後はMinecraft Clientを起動するだけで1.17.1へ対応できました。
マイナーアップデートなのでクラスの変更とか無いけど大型アップデートならそううまく行かないと思う。

終わりに

いつもAndroidで書いてるKotlinでModdingできるので快適。Fabricへ移植したいから会社辞めたい。
そういえば私のマイクラ全盛期はナポアンのマイクラが最新Ver追いかけてたけどあのサイトどうなってんの?