👕

Minecraft 1.19用のFabric ModをKotlinで開発するための環境を作る

2022/07/02に公開

はじめに

この記事ではMinecraft 1.19のFabricのModをKotlinで作るための環境を作ります。

バージョンは次のとおりです。

  • Minecraft: 1.19
  • fabric-loom: 0.12-SNAPSHOT
  • fabric-api: 0.56.0+1.19
  • gradle: 7.4.2
  • Kotlin: 1.7.0

Fabricとは

MinecraftのModの前提Modと呼ばれるものの一つです。
このFabricを前提に自分のModを開発できます。

Fabricの他にはForgeというのが有名で、Forgeは過去の資産が多くたくさんのModが遊べる、FabricのほうがForgeより新しい前提Modで新しいMinecraftのバージョンへ対応するのが早いと言われています。

KotlinによるMod開発環境

JavaでのFabricのMod開発環境はFabric公式が用意しているリポジトリをテンプレートにすれば出来上がります。
しかし、KotlinでのFabricのMod開発環境は有志が作ったもので1.18までのものしか用意されていません。

そこで今回はKotlinで1.19用に環境を整えました。

リポジトリはこちらです。

リポジトリをクローンしてIntelliJ IDEAなどで開くと開発が始められます。

以下に各ファイルの説明を軽くします。

build.gradle.kts

example-mod\src\main\kotlin\net\orito_itsuki\example_mod\ExampleMod.ktがKotlinのModのクラスです。

ExampleMod.kt
package net.orito_itsuki.example_mod;

import net.fabricmc.api.ModInitializer
import org.slf4j.Logger
import org.slf4j.LoggerFactory

@Suppress("UNUSED")
object ExampleMod: ModInitializer {
    const val MOD_ID = "example_mod"
    val LOGGER: Logger = LoggerFactory.getLogger(MOD_ID)

    override fun onInitialize() {
        LOGGER.info("Hello Fabric world!")
    }
}

とりあえずログにHello Fabric world!と表示されるようにしておきましょう。

私の保有しているドメイン名がorito-itsuki.netなので、それの逆順でsrc/kotlin/net/orito_itsukiにModのパッケージを配置しています。
ドメイン名がハイフンを含んでいる場合は、ハイフンをアンダースコアに置き換えるらしいです。

fabric.mod.json

example-mod\src\main\resources\fabric.mod.jsonがfabricのmodに必要な情報を書くファイルです。

fabric.mod.json
{
  "schemaVersion": 1,
  "id": "example_mod",
  "version": "${version}",
  "name": "example_mod",
  "description": "example mod kotlin",
  "authors": [
    "ORITO Itsuki"
  ],
  "contact": {
    "homepage": "https://example.com/",
    "issues": "https://example.com/",
    "sources": "https://example.com/"
  },
  "license": "MIT OR Apache-2.0",
  "icon": "assets/example_mod/icon.png",
  "environment": "*",
  "entrypoints": {
    "main": [
      {
        "adapter": "kotlin",
        "value": "net.orito_itsuki.example_mod.ExampleMod"
      }
    ]
  },
  "depends": {
    "fabricloader": ">=0.13.3",
    "fabric": "*",
    "fabric-language-kotlin": ">=1.7.4+kotlin.1.7.0",
    "minecraft": "1.19.x",
    "java": ">=17"
  }
}

example_modの名前はModの名前に応じて変更してください。

settings.gradle.kts

settings.gradle.ktsでプロジェクト全体の設定を書きます。

settings.gradle.kts
rootProject.name = "Example Mod Kotlin"
pluginManagement {
    repositories {
        maven("https://maven.fabricmc.net") { name = "Fabric" }
        mavenLocal()
        gradlePluginPortal()
    }
}
include("example_mod")

example_mod/build.gradle.kts

example_mod/build.gradle.ktsを使ってビルド環境を作っています。

build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

val archivesName = "example_mod"
group = "net.orito-itsuki"
version = "0.1.0"

plugins {
    kotlin("jvm") version libs.versions.kotlin
    id("fabric-loom") version libs.versions.fabric.loom
}

dependencies {
    versionCatalogs {
        minecraft(libs.minecraft)
        mappings(libs.yarn)
        modImplementation(libs.fabric)
        modImplementation(libs.fabric.loader)
        modImplementation(libs.fabric.kotlin)
    }
}

tasks {
    val javaVersion = JavaVersion.VERSION_17
    withType<JavaCompile> {
        options.encoding = "UTF-8"
        sourceCompatibility = javaVersion.toString()
        targetCompatibility = javaVersion.toString()
        options.release.set(javaVersion.toString().toInt())
    }
    withType<KotlinCompile> {
        kotlinOptions { jvmTarget = javaVersion.toString() }
    }
    jar { from("LICENSE") { rename { "${it}_${archivesName}" } } }
    processResources {
        inputs.property("version", project.version)
        filesMatching("fabric.mod.json") { expand(mutableMapOf("version" to project.version)) }
    }
    java {
        toolchain { languageVersion.set(JavaLanguageVersion.of(javaVersion.toString())) }
        sourceCompatibility = javaVersion
        targetCompatibility = javaVersion
        withSourcesJar()
    }
}

gradle/libs.versions.toml

gradle\libs.versions.tomlを使ってバージョンを設定します。
これは割と新しめのgradleに追加された機能らしいです。

libs.versions.toml
[versions]
kotlin = "1.7.0"
fabric-loom = "0.12-SNAPSHOT"

[libraries]
minecraft = "com.mojang:minecraft:1.19"
yarn = "net.fabricmc:yarn:1.19+build.4"
fabric = "net.fabricmc.fabric-api:fabric-api:0.56.0+1.19"
fabric-loader = "net.fabricmc:fabric-loader:0.12-SNAPSHOT"
fabric-kotlin = "net.fabricmc:fabric-language-kotlin:1.8.0+kotlin.1.7.0"

ビルド

ビルドするにはgradleのタスクからbuildを実行します。

example_mod/build/libs/example_mod.jarがModのjarファイルです。

単にテスト実行するだけならば、runClientを実行します。

公式クライアント以外からの立ち上げになるので認証エラーが出ますが立ち上げは完了します。

問題なくModが読み込めてログが表示されていることが確認できます。

開発にあたってはMinecraftのソースコードを生成しておくと便利なようです。
ただしそのソースコードを配布するのは違反に当たるよう。
genSourceタスクを実行するとMinecraftのソースコードが生成されます。
依存パッケージの中からminecraftのパッケージの中身を読むと、「ソースのダウンロード」という項目がIntelliJ IDEA表示されるのでクリックすると、参照を辿ったりできるようになります。

おわりに

KotlinでMinecraft 1.19のFabricのModを作る環境を整えました。

Discussion