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的工具用于操纵字节码。我们留到下一部分再讲。