マインクラフト Fabric Modを Scalaで開発

前置き

マインクラフトとは、知らない人が居ないレベルにまで人気となったサンドボックス型のゲームです。

因みに、投稿主はVer1.2.5(Better dungeons, Twilight Forest, Greg Techが流行り出した頃)からの超古参です。

Fabricとは

マインクラフトにMod(公式で実装されていない機能)を追加する際の基盤プログラム。

その昔(Ver1.2.x時代)は、ModLoader vs Forge戦争があり、その際はForgeが勝利した。

今(Ver1.17.x時代)は、Forge vs Fabric戦争で、Fabricが優勢だったりする。

Modの前提知識

マインクラフトは、Javaという言語で書かれています。当然ですが、FabricもJavaで記述されています。

Javaは、Java Virtual Machine(以後、JVM)上で動くプログラミング言語です。JVMは、Unix系(UbuntuやmacOS), Windows NT系で動く為、一回コードを書けば、JVMが対応しているOSなら何処でも動きます。

そんな、JVM上で動く言語は、何もJavaだけではなくKotlinやScalaも動きます。このことから、Javaで書けるならScala、Kotlinでも書けるし、その逆も然り。

わざわざScalaで書くメリット

Scalaは、オブジェクト指向型と関数型の両方を兼ね備えた言語だから。あと、Javaよりも短くかける。

FabricをScalaで書くために

https://github.com/FabricMC/fabric-example-mod/

上記リンクは、Fabric公式が公開しているサンプルコード。このプロジェクトは、Gradlewで管理されている。

ダウンロード後、build.gradleをテキストエディタ等で開き、「<-追記」の指している部分を追記する。

plugins {
	id 'fabric-loom' version '0.8-SNAPSHOT'
	id 'maven-publish'
	id 'scala' <- 追記
}
....
dependencies {
	// To change the versions see the gradle.properties file
	minecraft "com.mojang:minecraft:${project.minecraft_version}"
	implementation("org.scala-lang:scala-library:2.13.6") <- 追記
	mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
	modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
.....

次に、src/main/resources/fabric.mod.jsonを同様に「<-xxxxx」の指している部分を編集する。

"name": "Fabric Scala Mod", <- Modの名前を書く
  "description": "This is an example description! ", <- Modの説明
  "authors": [
    "Me!" <- Modの作成者名を書く(本名はやめておこう)
  ],
  "contact": {
    "homepage": "https://fabricmc.net/", <- Modの公式サイトを作っているならここに
    "sources": "https://github.com/FabricMC/fabric-example-mod" <- Modのソースを公開しているなら
  },

  "license": "CC0-1.0", <- ライセンスの変更するなら変える。(大体はそのまま)
  "icon": "assets/modid/icon.png",

  "environment": "*",
  "entrypoints": {
    "main": [
      "com.hoge.FabricScalaMod" <- Modのメインメソッドとなる「パッケージ名.Class名」を書く
    ]
  },

次に、src/main/resources/modid.mixins.jsonを同様に「<-xxxxx」の指している部分を編集する。

{
  "required": true,
  "minVersion": "0.8",
  "package": "com.hoge.mixin", <- src/scala/[packageName]のpackageNameを入れる
  "compatibilityLevel": "JAVA_16",
  "mixins": [
  ],
  "client": [
    "FabricMixinScalaMod" <- src/scala/[packageName]/mixin/xxxxxx.scalaのxxxxを入れる
  ],
  "injectors": {
    "defaultRequire": 1
  }
}

後は、JDK16以上ではないと動かないので、その点に注意して開発をしよう。