概述

Scala是一门基于JVM的,多范式的编程语言,它同时集成了面向对象和函数式两个特点,因此深受许多开发者喜爱。因为Scala基于JVM,所以Minecraft Mod其实也可以使用Scala写就。Forge对Scala语言提供了支持,一些知名度比较高的Mod也是由Scala编写而成的。当然,一些其他的基于JVM的语言如Kotlin等其实也可以用于编写Minecraft Mod,不过Forge本身目前还没有提供相应的支持。

本部分将带领读者使用Scala语言以类似的方式把1.1节和1.2节的部分完成一遍。当然,读者在阅读本节之前,自然要对Scala语言有一定的了解。

配置工作环境

我们只需要在配置工作环境前在build.gradle文件的前半部分加入一行代码:

apply plugin: 'scala'

就可以了。目前这个build.gradle文件的前半部分看起来应该是这个样子:

build.gradle(部分):

buildscript {
    repositories {
        jcenter()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
    }
}
apply plugin: 'scala'
apply plugin: 'net.minecraftforge.gradle.forge'

然后照着1.1节的内容构建开发环境就可以了。

新建一个主类

和Java版本不同,Gradle默认的Scala代码位于src/main/scala目录,而不是src/main/java目录下。

我们先在其中新建一个包(这里是com.github.ustc_zzzz.fmltutor),并在其中新建一个名为FMLTutor.scala的文件:

src/main/scala/com/github/ustc_zzzz/fmltutor/FMLTutor.scala:

package com.github.ustc_zzzz.fmltutor

import net.minecraftforge.fml.common._
import net.minecraftforge.fml.common.event._

/**
  * @author ustc_zzzz
  */
@Mod(
  modid = FMLTutorScala.MODID,
  name = FMLTutorScala.NAME,
  version = FMLTutorScala.VERSION,
  modLanguage = "scala",
  acceptedMinecraftVersions = "1.8.9"
)
object FMLTutorScala {
  final val MODID = "fmltutor"
  final val NAME = "FML Tutor"
  final val VERSION = "1.0.0"

  @Mod.EventHandler
  def preInit(event: FMLPreInitializationEvent): Unit = ??? // TODO

  @Mod.EventHandler
  def init(event: FMLInitializationEvent): Unit = ??? // TODO

  @Mod.EventHandler
  def postInit(event: FMLPostInitializationEvent): Unit = ??? // TODO
}

当然,这里我们和Java版本一样,仍然建议类名和你的Mod名称相同。这里只不过为了和Java版本相区分而使用了FMLTutorScala的类名。

这里读者可能不难发现和Java版本不同的两点:

  • Scala版本的Mod使用Object而不是Class来定义Mod的主类
  • Scala版本的Mod在添加@Mod注解的时候需要添加一个modLanguage = "scala"的属性

剩下的部分就和Java版本类似了。

添加代理

代理的添加方式和Java版本类似,只不过这里作者偷懒,把三个类写进了同一个文件里:

src/main/scala/com/github/ustc_zzzz/fmltutor/FMLTutor.scala(部分):

  @SidedProxy(
    clientSide = "com.github.ustc_zzzz.fmltutor.CommonProxyScala",
    serverSide = "com.github.ustc_zzzz.fmltutor.ClientProxyScala"
  )
  var proxy: CommonProxyScala = _

  @Mod.EventHandler
  def preInit(event: FMLPreInitializationEvent): Unit = proxy.preInit(event)

  @Mod.EventHandler
  def init(event: FMLInitializationEvent): Unit = proxy.init(event)

  @Mod.EventHandler
  def postInit(event: FMLPostInitializationEvent): Unit = proxy.postInit(event)

src/main/scala/com/github/ustc_zzzz/fmltutor/FMLTutor.scala(部分):

class CommonProxyScala {
  def preInit(event: FMLPreInitializationEvent) = ()

  def init(event: FMLInitializationEvent) = ()

  def postInit(event: FMLPostInitializationEvent) = ()
}

class ClientProxyScala extends CommonProxyScala {
  override def preInit(event: FMLPreInitializationEvent) = super.preInit(event)

  override def init(event: FMLInitializationEvent) = super.init(event)

  override def postInit(event: FMLPostInitializationEvent) = super.postInit(event)
}

试着运行一下,如果正常,你应该就能看到你的Mod已经加载了。

results matching ""

    No results matching ""