建立用Kotlin进行Minecraft模组开发的环境

首先本文是我在Qiita上的首次投稿。如果有任何疏漏或不完善之处,请毫不犹豫地指出。
此外,我在Windows10/Java8/IntelliJ IDEA环境下进行操作。
此篇文章是针对IntelliJ IDEA的。不支持Eclipse。
为了使用ForgeGradle,本文介绍的方法只适用于MC1.7.10以及其后版本。
尽管在MC1.10中对ForgeGradle进行了修正,但只需进行一些用于Kotlin使用的修改,并没有问题。因此,基本上可以忽略这些修正,不会有任何问题。

首先,Kotlin是什么?JetBrains社正在开发的一种基于Java虚拟机(在Java虚拟机上运行的语言)的语言,被称为JavaVM语言(Java也是JavaVM语言)。
它具有空安全特性,可以与Java完全兼容,并且支持Java和Kotlin之间的互相调用。
换句话说,使用Java编写的函数和类也可以在Kotlin中使用。
经过一段时间的使用和修改,发现Kotlin非常强大,几乎不再需要Java。

在使用Kotlin进行modding时

绝对必要的东西进行Modding所需的环境是使用一台已连接到互联网的个人电脑。

请注意首先,可以说在Kotlin中,几乎没有关于Modding的信息可言。
所以请做好准备并尝试挑战。
嗯,如果你看我的GitHub,可以看到有些代码。
另外,在开发环境之外,在实际设备环境中运行基于Kotlin的mod,需要Kotlin库。
本文将介绍如何将库一并输出到mod的Jar文件中,但是,请确保先进行许可证的确认,因为Kotlin是根据ApacheLicense2.0许可的。
另外,我们不会在这里介绍Modding环境的搭建。我们将在假设你已经能够搭建Modding环境的前提下继续讨论。

为了在Kotlin中进行Modding,搭建环境。

在IDEA中的设置

Imgur

修改 build.gradle请将 build.gradle 文件按以下方式进行修改。
在此说明,本教程适用于1.10.2版本。如果使用其他版本,请将 minecraft 组中的变量修改为相应版本的变量。

buildscript {
    repositories {
        jcenter()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.5-2'
        classpath 'org.jetbrains:annotations:13.0'
    }
}
apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: "kotlin"

tasks.withType(Jar) {
    compileJava.options.encoding = 'UTF-8'
    compileJava.options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
sourceCompatibility = targetCompatibility = "1.8"
compileJava {
    sourceCompatibility = targetCompatibility = "1.8"
}
version = "1.0"
group= "yourGroup"
archivesBaseName = "yourModName"

minecraft {
    version = "1.10.2-12.18.2.2099"
    runDir = "run"
    mappings = "snapshot_20161111"
}

configurations {
    embed
    compile.extendsFrom(embed)
}

dependencies {
    embed 'org.jetbrains.kotlin:kotlin-stdlib:0.12.613'
    compile 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.5-2'
    embed 'org.jetbrains:annotations:13.0'
}

jar {
    from configurations.embed.collect { it.isDirectory() ? it : zipTree(it) }
}

processResources
{
    // this will ensure that this task is redone when the versions change.
    inputs.property "version", project.version
    inputs.property "mcversion", project.minecraft.version

    // replace stuff in mcmod.info, nothing else
    from(sourceSets.main.resources.srcDirs) {
        include 'mcmod.info'

        // replace version and mcversion
        expand 'version':project.version, 'mcversion':project.minecraft.version
    }

    // copy everything else, thats not the mcmod.info
    from(sourceSets.main.resources.srcDirs) {
        exclude 'mcmod.info'
    }
}

我打算简要解释一下对轻微修改的问题。
对于那些觉得无关紧要的人,可以跳过,没有问题。
首先,我会先解释Kotlin相关内容。

classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.5-2'
classpath 'org.jetbrains:annotations:13.0'

这两行代码的意思是,在构建时下载这两个库。

apply plugin: "kotlin"

这意味着要在Gradle中应用Kotlin插件。
刚才的classpath也是”kotlin-gradle-plugin”。稍微跳跃一下,

dependencies {
    embed 'org.jetbrains.kotlin:kotlin-stdlib:0.12.613'
    compile 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.5-2'
    embed 'org.jetbrains:annotations:13.0'
}

這三行的意思是在建構時一起編譯它們。如果沒有這個,建構時會出現「缺少 Kotlin 的庫」的編譯錯誤。至於這段直接與 Kotlin 相關的內容就到此為止。接下來是與 Kotlin 相關程度不高的部分,但如果沒有這個,可能會對 Kotlin 的模塊化造成困擾。首先,

tasks.withType(Jar) {
    compileJava.options.encoding = 'UTF-8'
    compileJava.options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}

这意味着在编译时将字符编码设置为UTF-8,并在命令行参数中添加两个参数。对于经常进行modding的人来说,将字符编码设置为UTF-8是很常见的。如果你在注释中使用了日语,这就是必需的。下一个命令行参数则是个人喜好的问题。由于对日志中出现的警告的详细信息感兴趣,我添加了它。

sourceCompatibility = targetCompatibility = "1.8"
compileJava {
    sourceCompatibility = targetCompatibility = "1.8"
}

关于这个问题,版本为1.10.2的Gradle使用了”1.6″的内容。
原本使用了稍微不同的内容,但是统一为了ForgeGradle格式。
这意味着”在Java8中编译”。
也就是说,Minecraft的mod是使用Java6进行编译的……
开发者是白痴吗?Minecraft自带的运行环境已经变成了Java8了
根本没有Java6,是吧?
下一步我们将一起总结两件事。

configurations {
    embed
    compile.extendsFrom(embed)
}
jar {
    from configurations.embed.collect { it.isDirectory() ? it : zipTree(it) }
}

这意味着当输出jar文件时,在dependencies部分指定为embed而不是compile的库将会一起被包含在内。
换句话说,这样一来,即使在实际设备环境中也不会缺少Kotlin库。
由于这个原因,可能在将其放入jar文件时对于Kotlin的Gradle插件来说并没有问题,但如果出现故障将会非常麻烦,所以我们选择使用StandardLibrary(stdlib)。

使用KAnnotator

Imgur

如果不存在forgeSrc

Imgur

结束辛苦了。
环境配置到此结束了。
在使用Kotlin进行modding时,Java和Kotlin的语法差异等可能会成为阻碍,但我会逐步进行解释。
说实话,如果连环境配置都不能自己搜索和完成,我觉得会比较困难。
好了,最后让我写一下把之前的环境配置部分浪费了一半的事情,然后就可以结束了。
在我写这篇文章的时候,我发布了一个被称为YukariLib的基础mod,它是用Kotlin制作的。
这是一个开源的,用Kotlin编写的库,在引入它并且mod中已经指定了它的情况下,即使没有将Kotlin的STDLib放入mod中,它也能正常工作。
将其作为项目的库,并在Forge的dependencies指定中加入,这是一个非常方便的库,不需要修改Gradle。
2017年9/3附注:为了使用IntelliJ的kotlinPligin,在dependencies中使用compile而不是embed来引入Kotlin的STDLib是推荐的做法。
另外,在1.10.2〜版本中,有一个名为Forgelin的mod,它在Forge中加入了钩子,可以避免与STDLib冲突。所以,如果是为了STDLib,它更加优秀,可以将STDlib引入自己的mod,也比YukariLib的要求更好。
所以,推荐使用这个。

bannerAds