Sponge插件开发引导(上)

Sponge是一个富有活力的、社区驱动的、开源并且全是BUG的Minecraft插件平台。其设计了一套崭新的API用于1.8以上版本的Minecraft服务端的插件开发。Sponge项目提供的SpongeAPI有两个实现:基于纯原版的SpongeVanilla,和基于MinecraftForge服务端的SpongeForge

这一篇Post的内容就是讲述开发者如何开始Sponge插件的开发的。当然为了方便(也是因为笔者懒),这里只讲述基于SpongeVanilla的1.10.2版本的Minecraft服务端的开发,不过SpongeForge,以及其他版本的Minecraft服务端,往往也是同理。

0 搭建Sponge服务端

我们首先下载原版Minecraft服务端:

https://s3.amazonaws.com/Minecraft.Download/versions/1.10.2/minecraft_server.1.10.2.jar

当然你也可以使用BMCLAPI

http://bmclapi2.bangbang93.com/version/1.10.2/server

直接放在你想要开服的文件下。

然后我们下载SpongeVanilla:

https://www.spongepowered.org/downloads/spongevanilla/stable/1.10.2

从其中找到最新的SpongeVanilla版本并下载。截至该Post撰写完成之际,最新版本的SpongeVanilla是364:

https://repo.spongepowered.org/maven/org/spongepowered/spongevanilla/1.10.2-5.1.0-BETA-364/spongevanilla-1.10.2-5.1.0-BETA-364.jar

同样直接放在你想要开服的文件下。

下面一步是可选的,就是下载LaunchWrapper:

https://libraries.minecraft.net/net/minecraft/launchwrapper/1.12/launchwrapper-1.12.jar

然后将其放置在libraries/net/minecraft/launchwrapper/1.12/文件夹下。

这是不是有点繁琐?你要新建好多个文件夹呢。所以下载LaunchWrapper这一步其实可以不用做,由SpongeVanilla自己下载完成,当然如果你的开服机器没有网络连接,那么就需要手动做这一步了。

然后运行:

java -jar spongevanilla-1.10.2-5.1.0-BETA-364.jar  

很好,等待出现Done这四个字母就行了,中途你可能需要把eula.txt中的eula=false改成eula=true

找到你的一个Minecraft 1.10.2的客户端,连接进入127.0.0.1:25565就行了。

1 搭建Sponge插件开发环境

首先你需要拥有一个Eclipse或者IntelliJIDEA,然后我们下载SpongeAPI:

https://www.spongepowered.org/downloads/spongeapi/stable/5

记得下载SpongeAPI的Shaded版本,也就是说下载下来的文件名要有shaded六个字母:

https://repo.spongepowered.org/maven/org/spongepowered/spongeapi/5.0.0/spongeapi-5.0.0-shaded.jar

将其导入Eclipse或者IntelliJIDEA中,然后你就可以开始写Sponge插件啦。关于插件主类的格式可以参见这里

然后我们可以直接使用自己的IDE导出JAR,并放入刚刚用于开服的文件夹中的mods文件夹中,再运行一遍服务端,你的插件就应该可以正常运行了。

如果你只想写一些简单的插件,那么本文到此为止也没有什么不好,但是这总是有一些弊端的:

  • 没有使用构建系统,对Continuous Integration不友好
  • Sponge建议在自己的插件JAR中添加mcmod.info文件,然而你需要手动书写这一文件
  • 使用NMS(net.minecraft.server)不方便

所以就有了本文后面的部分。

2 我不开心!我要使用构建系统

毋庸置疑,我们可以使用Gradle或Maven等构建系统开发Sponge插件,不过由于作者对Maven不够熟悉,这里使用Gradle举例。

我们先在开发目录下写一段build.gradle

apply plugin: 'java'

sourceCompatibility = '1.8'  
targetCompatibility = '1.8'

repositories {  
    mavenCentral()
    maven {
        name = 'sponge'
        url = 'http://repo.spongepowered.org/maven'
    }
}

apply plugin: 'eclipse'  
apply plugin: 'idea'

dependencies {  
    compile 'org.spongepowered:spongeapi:5.0.0'
}

这段build.gradle的意思很简单,就是包含Sponge的Maven库,并引入SpongeAPI的依赖而已。

然后运行gradle eclipse或者gradle idea就好了(如果你使用了Gradle Wrapper,请把gradle换成./gradlew)。

想要获取构建后的JAR,只需要gradle build就行了,然后在build/libs文件夹下就能看到我们的插件JAR。

3 我还是不开心!我要使用NMS

NMS就麻烦不少了,你需要反编译Minecraft,然后还有一些混淆名称的问题,不过我们把目光转移到另一个项目来:MinecraftForge。

没错!MinecraftForge有一套成熟的系统用于反编译、反混淆Minecraft等,这套系统的核心是一个Gradle插件,叫做ForgeGradle。

不过直接使用ForgeGradle自然是不大好的,因为反编译后的Minecraft源代码被打上了Forge的Patch,所以说另一个名为VanillaGradle的插件就是来解决这一问题的。我们改一改build.gradle文件:

buildscript {  
    repositories {
        mavenCentral()
        maven {
            name = 'forge'
            url = 'http://files.minecraftforge.net/maven'
        }
        maven {
            name = 'minecrell'
            url = 'http://repo.minecrell.net/releases'
        }
        dependencies {
            classpath 'net.minecrell:VanillaGradle:2.0.3_1'
            classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
        }
    }
}

apply plugin: 'net.minecrell.vanilla.server.library'

sourceCompatibility = '1.8'  
targetCompatibility = '1.8'

repositories {  
    mavenCentral()
    maven {
        name = 'sponge'
        url = 'http://repo.spongepowered.org/maven'
    }
}

minecraft {  
    version = '1.10.2'
    mappings = 'snapshot_20161111'
}

dependencies {  
    compile 'org.spongepowered:spongeapi:5.0.0'
}

reobf {  
    jar {
        mappingType = 'SEARGE'
    }
}

也就这么长。整体上和开发Forge Mod的build.gradle文件类似,不过有一点点为了开发Sponge插件的区别。

我们这次需要首先运行gradle setupDecompWorkspace,然后再运行gradle eclipse或者gradle idea。然后我们的IDE依赖中就会出现minecraft_serverBin-1.10.2.jar,也就是NMS了。

构建插件JAR的时候一样使用gradle build即可。

4 我仍然不开心!我要操纵字节码

在Sponge插件中操纵Java字节码是一个大的话题。Sponge提供了一个名为Mixin的工具用于操纵字节码。我们留到下一部分再讲。


下节内容